From 28fcda2751c73882c3b0e4471f2d4d2813e7e0de Mon Sep 17 00:00:00 2001 From: pku-xht Date: Wed, 12 Aug 2026 17:07:34 +0800 Subject: [PATCH 001/103] feat(agent-presets): enable background Codex and Claude Code subagent tasks --- ...8-10-fork-children-stay-one-shot.i18n.yaml | 4 +- .../2026-08-10-fork-children-stay-one-shot.md | 4 +- ...26-08-10-fork-children-stay-one-shot.zh.md | 4 +- ...code-and-codex-subagent-backends.i18n.yaml | 4 +- ...claude-code-and-codex-subagent-backends.md | 29 ++++---- ...ude-code-and-codex-subagent-backends.zh.md | 29 ++++---- ...bagent-one-shot-background-tasks.i18n.yaml | 6 ++ ...duct-subagent-one-shot-background-tasks.md | 69 +++++++++++++++++++ ...t-subagent-one-shot-background-tasks.zh.md | 69 +++++++++++++++++++ .../agent-presets/code/agent.cordis.yml | 4 +- .../agent-presets/cordis/agent.cordis.yml | 4 +- .../editing-cordis-compositions/SKILL.md | 6 +- .../agent-presets/standard/agent.cordis.yml | 4 +- apps/cli/tests/web-agent-presets.e2e.ts | 16 +++++ examples/acp-agent/cordis.yml | 3 +- .../product-subagent-both.cordis.snapshot.yml | 4 +- .../product-subagent-both.cordis.yml | 8 +-- ...product-subagent-codex.cordis.snapshot.yml | 2 +- .../product-subagent-codex.cordis.yml | 4 +- .../subagent/subagent-claude-code/cordis.yml | 6 +- .../subagent/subagent-claude-code/driver.ts | 5 ++ .../subagent/subagent-codex/cordis.yml | 4 +- .../subagent/subagent-codex/driver.ts | 5 ++ .../tool-schemas.expected.json | 12 +++- .../tool-schemas.expected.json | 6 +- examples/headless-agent/cordis.yml | 3 +- .../subagent-claude-code/README.i18n.yaml | 4 +- .../subagent/subagent-claude-code/README.md | 20 ++++-- .../subagent-claude-code/README.zh.md | 20 ++++-- .../tests/loader-composition.e2e.ts | 7 +- .../subagent/subagent-codex/README.i18n.yaml | 4 +- packages/subagent/subagent-codex/README.md | 20 ++++-- packages/subagent/subagent-codex/README.zh.md | 20 ++++-- .../tests/loader-composition.e2e.ts | 5 +- .../tool-subagent/tests/tool-subagent.spec.ts | 6 +- 35 files changed, 318 insertions(+), 102 deletions(-) create mode 100644 .agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml create mode 100644 .agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md create mode 100644 .agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md diff --git a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml index ef424471d8..282779ce62 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md -2026-08-10-fork-children-stay-one-shot.md: 030bed3c1b516a54afd5f97b00000ed7ceaf64d8 -2026-08-10-fork-children-stay-one-shot.zh.md: 4b033a70c3674315c491e85be67a1d357aeac51b +2026-08-10-fork-children-stay-one-shot.md: f799f9f7affe7dfecbbe12d0988cf6f9b936d43e +2026-08-10-fork-children-stay-one-shot.zh.md: 5c55e96296ed6678ac82afc0e40150d443f74c96 diff --git a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md index 030bed3c1b..f799f9f7af 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md +++ b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md @@ -12,7 +12,7 @@ The child-scoped `report` return channel is now the largest such addition, and s ## Decision -Every shipped composition binds the fork delegation tool to `backgroundMode: one-shot`: [the base bundle](../../../../packages/bundle/base/cordis.patch.yml), [the ACP example](../../../../examples/acp-agent/cordis.yml), and [the headless example](../../../../examples/headless-agent/cordis.yml). The base bundle leaves `run_in_background` available, because it mounts a task service; the two examples set `enableRunInBackground: false`, because they mount none and a one-shot background start would otherwise fail at call time on a missing `tasks` service. +Every shipped composition binds the fork delegation tool to `backgroundMode: one-shot`: [the base bundle](../../../../packages/bundle/base/cordis.patch.yml), [the ACP example](../../../../examples/acp-agent/cordis.yml), and [the headless example](../../../../examples/headless-agent/cordis.yml). All three have access to the generic Task runtime: the base bundle leaves `run_in_background` available, while the two examples set `enableRunInBackground: false` as an explicit foreground-only composition choice. One-shot children — foreground and background alike — are created through `SubagentService.start()`, which never enters the continuable activation-setup registry, so neither `report` nor its prompt section is installed. A forked one-shot child's system prompt and tool schemas therefore equal its parent's, apart from the `persona` and `toolFilter` deltas a deployment opts into per delegation tool. @@ -38,7 +38,7 @@ The reintroduction condition is recorded as a `TODO(fork-continuable-prefix-reus ## Consequences -- No shipped composition creates a continuable forked child; `subagent_fork` returns a result to its caller's turn, and `send_message` addresses only spawned children. +- No shipped composition creates a continuable forked child. The base bundle may return a one-shot Task id for `subagent_fork`, while the ACP and headless examples return the result to the caller's turn; `send_message` addresses only spawned children. - A forked child's request prefix stays byte-identical to its parent's unless the deployment configures `persona` or `toolFilter` on the fork delegation tool, so the token cost of seeding buys provider-side reuse again. - The fork provider's continuable path has no production caller and no assembled-composition coverage. It keeps its package-level tests, and the seam still accepts it, so a bundle or `--patch` overlay can reintroduce it with no code change and no warning. - `subagent_fork`'s model-visible schema changes: the continuable background wording is replaced by the one-shot task wording in the base bundle, and disappears entirely from the two examples. The affected keyless snapshot tool-schema sidecars are re-recorded in the same change. diff --git a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md index 4b033a70c3..5c55e96296 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md +++ b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md @@ -12,7 +12,7 @@ fork 与 spawn 的唯一区别是 child 的 Session 会以 parent 已完成轮 ## 决策 -所有随附组合都把 fork 委派工具绑定为 `backgroundMode: one-shot`:[base 组合包](../../../../packages/bundle/base/cordis.patch.yml)、[ACP 示例](../../../../examples/acp-agent/cordis.yml)与[headless 示例](../../../../examples/headless-agent/cordis.yml)。base 组合包保留 `run_in_background`,因为它挂载了 task 服务;两个示例设置 `enableRunInBackground: false`,因为它们都不挂载 task 服务,否则一次 one-shot 后台启动会在调用时因缺少 `tasks` 服务而失败。 +所有随附组合都把 fork 委派工具绑定为 `backgroundMode: one-shot`:[base 组合包](../../../../packages/bundle/base/cordis.patch.yml)、[ACP 示例](../../../../examples/acp-agent/cordis.yml)与[headless 示例](../../../../examples/headless-agent/cordis.yml)。三者都能使用通用 Task 运行时:base 组合包保留 `run_in_background`,两个示例则把 `enableRunInBackground: false` 作为显式的仅前台组装选择。 one-shot child——前台与后台皆然——经由 `SubagentService.start()` 创建,该路径从不进入可继续的 activation setup 注册表,因此 `report` 与它的提示词 section 都不会被安装。于是一个 fork 出的 one-shot child 的系统提示词与工具 schema 与其 parent 相同,只差部署逐个委派工具主动选择的 `persona` 与 `toolFilter` 增量。 @@ -38,7 +38,7 @@ one-shot child——前台与后台皆然——经由 `SubagentService.start()` ## 后果 -- 没有任何随附组合会创建可继续的 fork child;`subagent_fork` 把结果返回给调用方的轮次,而 `send_message` 只寻址 spawn 出的 child。 +- 没有任何随附组合会创建可继续的 fork child。base 组合包中的 `subagent_fork` 可以返回 one-shot Task id,而 ACP 与 headless 示例会把结果返回给调用方的轮次;`send_message` 只寻址 spawn 出的 child。 - 除非部署在 fork 委派工具上配置了 `persona` 或 `toolFilter`,fork child 的请求前缀与其 parent 逐字节相同,因此初始内容的 token 成本重新换来了提供方侧的复用。 - fork 提供方的可继续路径没有生产调用方,也没有整体组装层面的覆盖。它保留自己的包内测试,seam 也仍然接受它,因此某个组合包或 `--patch` 覆盖层可以无需改动代码、也不会有任何警告地把它重新引入。 - `subagent_fork` 面向模型的 schema 发生变化:base 组合包中可继续的后台措辞被 one-shot 的 task 措辞取代,在两个示例中则完全消失。受影响的无密钥快照工具 schema 伴随文件在同一次改动中重新记录。 diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml index 84cb091651..278981d220 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md -2026-08-04-claude-code-and-codex-subagent-backends.md: ccc96d6c998c4ab958a7eea1e502d036d16ec90d -2026-08-04-claude-code-and-codex-subagent-backends.zh.md: 740eeb633e336d5b01cb0b84fb656612e690959d +2026-08-04-claude-code-and-codex-subagent-backends.md: 99801d6bbd9c67e6c9215d4e10c77fb70d5e7525 +2026-08-04-claude-code-and-codex-subagent-backends.zh.md: 0944f1356ff334cc284def91d5ce0924ce950b83 diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md index ccc96d6c99..99801d6bbd 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md @@ -12,24 +12,25 @@ The product integrations must not become second owners for task text, cwd, cance ## Decision -The harness publishes two sibling one-shot provider packages: `codex` and `claude-code`. This note owns their product protocols, result mapping, and process lifecycle; the [shared-profile-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md) supersedes the original opt-in composition placement. Loading either provider starts no product process, and each tool accepts only a standalone text task; product selection and background execution are not model arguments. +The harness publishes two sibling one-shot provider packages: `codex` and `claude-code`. This note owns their product protocols, result mapping, and process lifecycle; the [shared-profile-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md) owns provider placement, and the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md) owns the model-visible scheduling choice. Loading either provider starts no product process, and each tool accepts only a standalone text task; product selection remains deployment configuration. -Both providers report `inheritsParentContext: false`, advertise no optional start capabilities, and pass the parent Session cwd without copying the parent conversation. Their documented tools disable background execution and use `maxDepth: 'provider-managed'`, leaving recursion policy with the out-of-process product instead of sending a limit the provider cannot enforce. Every call creates a fresh product process and a non-resumable product conversation. The shared subagent service continues to own request resolution, lifecycle events, result settlement, and foreground collection; the shared subprocess service owns credential scrubbing, process-tree termination, and whole-tree exit observation. +Both providers report `inheritsParentContext: false`, advertise no optional start capabilities, and pass the parent Session cwd without copying the parent conversation. Their documented tools use `backgroundMode: 'one-shot'` and `maxDepth: 'provider-managed'`: the consumer keeps foreground collection as the default and may place the same run in the generic Task runtime, while recursion policy stays with the out-of-process product. Every call creates a fresh product process and a non-resumable product conversation. `ctx.subagents` owns named-request resolution and paired lifecycle events; `dsh-tool-subagent` owns model-visible scheduling and foreground-versus-Task adaptation; `ctx.tasks` and `dsh-tool-tasks` own Task ids, state, output, controls, notices, and parent-owner cancellation; each product provider owns native result mapping, while `dsh-subprocess` owns credential scrubbing, process-tree termination, and whole-tree exit observation. ```text -fixed tool → shared subagent service → product provider → official product process - ← final answer / explicit error / cancellation ← terminal product fact - → foreground disposal → shared process-tree termination → whole-tree exit +fixed tool -> dsh-tool-subagent -> ctx.subagents -> product provider -> product process + foreground <- final product outcome + background -> ctx.tasks / dsh-tool-tasks -> Task id / state / notice / controls + both -> provider disposal -> dsh-subprocess -> whole-tree exit ``` ### Ownership and lifecycle -| Phase | Shared owner | Product-specific responsibility | Observable result | +| Layer | Owner | Responsibility | Observable result | | --- | --- | --- | --- | -| Resolve | `dsh-tool-subagent` and `ctx.subagents` | Validate the product's text-only input and derive native startup parameters | Unsupported context or malformed input fails before a run is published | -| Start | `dsh-subprocess` owns every acquired process tree | Reach the smallest native point at which the product conversation and process can both be controlled | `start()` publishes one existing `SubagentRun`, or cleans up and rejects | -| Run | The product owns its native protocol facts; the holder owns their mapping | Submit exactly one task and derive an existing shared stop reason; Codex uses `max-tokens` only for explicit context exhaustion | The parent receives only a final answer or an explicit failure | -| Dispose | The foreground consumer requests release; `dsh-subprocess` proves exit | Close the native protocol and express any best-effort native cancellation | Disposal is idempotent and returns only after the whole process tree exits | +| Delegation lifecycle | `ctx.subagents` | Resolve the named provider request and pair lifecycle events around the published `SubagentRun` | Unsupported context or malformed input fails before a run is published; start and terminal events remain paired | +| Scheduling and adaptation | `dsh-tool-subagent` | Interpret `run_in_background`, choose foreground collection or one-shot Task registration, and map the shared stop reason | Foreground returns the product outcome; background returns a Task id after registration | +| Task state and control | `ctx.tasks` and `dsh-tool-tasks` | Own Task state, output, cancellation, owner cleanup, completion notices, and model-facing controls | The exact parent can collect, list, or stop background work and receives its completion notice | +| Native run and teardown | Product provider and `dsh-subprocess` | Produce one native result, close the product protocol, request best-effort native cancellation, and prove process-tree exit | Foreground return and Task settlement both wait for idempotent disposal and whole-tree exit | ## Codex provider @@ -59,7 +60,7 @@ The credentialed Claude Code e2e uses the official DeepSeek Claude Code contract ## Distribution and evidence -Each product owns branch-complete package tests, a required keyless real-product spec, a Loader composition e2e, and a credentialed DeepSeek e2e. The keyless product tier uses the exact official distribution under test, a non-empty fake product key, an isolated temporary workspace and product home, and a loopback fixed-answer model. Missing product requests, wrong authentication, altered task text, a non-exact answer, a skipped real product, or a surviving managed handle fails the required test. The Loader tier boots the README-shaped user configuration, verifies both fixed foreground-only tools in one context, and starts neither product process. The credentialed tier starts the same production provider and real product with a runtime-only key, requires a unique nonce from the fixed official DeepSeek service, and proves quiescence again; it self-skips only when a local operator supplied no key, while trusted CI preflights the secret. +Each product owns branch-complete package tests, a required keyless real-product spec, a Loader composition e2e, and a credentialed DeepSeek e2e. The keyless product tier uses the exact official distribution under test, a non-empty fake product key, an isolated temporary workspace and product home, and a loopback fixed-answer model. Missing product requests, wrong authentication, altered task text, a non-exact answer, a skipped real product, or a surviving managed handle fails the required test. The Loader tier boots the README-shaped user configuration, verifies both fixed one-shot tools expose optional background scheduling alongside generic task controls, and starts neither product process. The credentialed tier starts the same production provider and real product with a runtime-only key, requires a unique nonce from the fixed official DeepSeek service, and proves quiescence again; it self-skips only when a local operator supplied no key, while trusted CI preflights the secret. The Codex evidence pins `@openai/codex@0.147.0` and `codex-cli 0.147.0`. Its real-product spec observes the exact Bearer key, original task, byte-exact final answer, unattended command rejection with no file side effect, local cancellation, and whole-tree exit. Production still supplies `codex` on `PATH`. @@ -83,12 +84,12 @@ The project owner's distribution authorization is scoped to the official `@anthr **Plugin-managed login, product home, models, settings, or permissions.** Those choices would create another authority beside each product's native configuration and enlarge a one-shot provider into account management. The providers expose only an explicit environment overlay and teardown grace; unattended interaction fails closed. -**Continuation, progress, background collection, and shared parent context.** The delivered user result is one self-contained task and one final answer. Product sessions, resume, follow-up, intermediate messages, parent transcript transfer, structured output, and background collection need separate user contracts and are not prebuilt. +**Continuation, progress, product-native background state, and shared parent context.** The provider payload remains one final answer for one self-contained task. The generic Task layer may add its id, status, notice, collection, and cancellation results, but product sessions, resume, follow-up, intermediate messages, parent transcript transfer, structured output, and provider-specific background state need separate user contracts and are not prebuilt. ## Consequences -Users delegate through two stable foreground tools backed by the official product integrations. Their Profile placement and per-Preset exposure are owned by the [shared-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md); this note's provider lifecycle keeps native settings and behavior while shared services retain the sole ownership of task settlement and process-tree quiescence. +Users delegate through two stable one-shot tools backed by the official product integrations. Their Profile placement and per-Preset exposure are owned by the [shared-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md), and their foreground-default optional Task scheduling is owned by the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md). This note's provider lifecycle keeps native settings and behavior while shared services retain the sole ownership of task settlement and process-tree quiescence. -Every delegation pays for a fresh product process and independent model context, and only final text reaches the parent. Product-native configuration makes behavior depend on the deployment's installed product, account state, and workspace settings. Credentialed e2e runs also spend external API quota and depend on the official DeepSeek endpoint; deterministic protocol, failure, cancellation, and approval coverage remains in the keyless tier. The providers do not resume sessions, stream progress, accept new human interaction, roll back tool or file side effects, or impose a wall-clock timeout. +Every delegation pays for a fresh product process and independent model context. The product payload reaching the parent is final text only; background scheduling additionally exposes generic Task ids, status, completion notices, and collection or cancellation results. Product-native configuration makes behavior depend on the deployment's installed product, account state, and workspace settings. Credentialed e2e runs also spend external API quota and depend on the official DeepSeek endpoint; deterministic protocol, failure, cancellation, and approval coverage remains in the keyless tier. The providers do not resume sessions, stream progress, accept new human interaction, roll back tool or file side effects, or impose a wall-clock timeout. Compatibility is pinned by package-level unit coverage, keyless real-product loopback tests, credentialed DeepSeek nonce tests, public Loader composition, built-package and NodeNext consumer checks, generated documentation and notices, and the repository CI matrix. A supported product or DeepSeek endpoint/model baseline change must refresh those facts; production performs no separate runtime version probe. diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md index 740eeb633e..0944f1356f 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md @@ -12,24 +12,25 @@ Status: implemented ## 决策 -harness 交付两个同级的一次性提供方包:`codex` 与 `claude-code`。本说明负责它们的产品协议、结果映射和进程生命周期;[共享 profile 宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)取代原先由用户选择启用的组装位置。加载任一提供方都不会启动产品进程,而且每个工具只接受独立文本任务;产品选择与后台执行都不作为模型参数。 +harness 交付两个同级的一次性提供方包:`codex` 与 `claude-code`。本说明负责它们的产品协议、结果映射和进程生命周期;[共享 profile 宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)负责提供方位置,[产品一次性后台任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责模型可见的调度选择。加载任一提供方都不会启动产品进程,而且每个工具只接受独立文本任务;产品选择仍属于部署配置。 -这两个提供方都报告 `inheritsParentContext: false`,不声明任何可选的启动能力,并传递父会话 cwd,但不会复制父级对话。文档所示的工具会禁用后台执行,并使用 `maxDepth: 'provider-managed'`,将递归策略留给进程外产品,而不是发送提供方无法强制执行的限制。每次调用都会创建一个全新的产品进程和一次不可续接的产品对话。共享 subagent 服务继续负责请求解析、生命周期事件、结果结算和前台收集;共享子进程服务负责凭证清洗、进程树终止以及整棵进程树的退出观测。 +这两个提供方都报告 `inheritsParentContext: false`,不声明任何可选的启动能力,并传递父会话 cwd,但不会复制父级对话。文档所示的工具使用 `backgroundMode: 'one-shot'` 与 `maxDepth: 'provider-managed'`:消费方默认在前台收集结果,也可把同一次运行放入通用 Task 运行时,而递归策略仍由进程外产品负责。每次调用都会创建一个全新的产品进程和一次不可续接的产品对话。`ctx.subagents` 负责具名请求解析与成对生命周期事件;`dsh-tool-subagent` 负责模型可见的调度以及前台与 Task 适配;`ctx.tasks` 和 `dsh-tool-tasks` 负责 Task id、状态、输出、控制、通知与父级 owner 取消;各产品提供方负责原生结果映射,`dsh-subprocess` 则负责凭证清洗、进程树终止以及整棵进程树的退出观测。 ```text -fixed tool → shared subagent service → product provider → official product process - ← final answer / explicit error / cancellation ← terminal product fact - → foreground disposal → shared process-tree termination → whole-tree exit +fixed tool -> dsh-tool-subagent -> ctx.subagents -> product provider -> product process + foreground <- final product outcome + background -> ctx.tasks / dsh-tool-tasks -> Task id / state / notice / controls + both -> provider disposal -> dsh-subprocess -> whole-tree exit ``` ### 归属与生命周期 -| 阶段 | 共享责任方 | 产品特定职责 | 可观察结果 | +| 层级 | 责任方 | 职责 | 可观察结果 | | --- | --- | --- | --- | -| 解析 | `dsh-tool-subagent` 与 `ctx.subagents` | 验证产品的纯文本输入并推导原生启动参数 | 不受支持的上下文或格式错误的输入会在发布运行前报错 | -| 启动 | `dsh-subprocess` 负责每棵已获取的进程树 | 到达能够同时控制产品对话与进程的最小原生控制点 | `start()` 发布一个已存在的 `SubagentRun`,否则清理后拒绝调用 | -| 运行 | 产品负责其原生协议事实;持有方负责映射这些事实 | 只提交一项任务,并推导出一种现有的共享停止原因;Codex 仅在明确发生上下文耗尽时使用 `max-tokens` | 父级只会收到最终回答或明确失败 | -| dispose(资源释放) | 前台消费方请求释放;`dsh-subprocess` 证明进程已退出 | 关闭原生协议,并发出尽力而为的原生取消请求 | 释放操作具有幂等性,且仅在整棵进程树退出后才返回 | +| 委派生命周期 | `ctx.subagents` | 解析具名提供方请求,并为已发布的 `SubagentRun` 配对生命周期事件 | 不受支持的上下文或格式错误的输入会在发布运行前报错;启动与终态事件保持成对 | +| 调度与适配 | `dsh-tool-subagent` | 解释 `run_in_background`,选择前台收集或 one-shot Task 登记,并映射共享停止原因 | 前台返回产品结果;后台在登记完成后返回 Task id | +| Task 状态与控制 | `ctx.tasks` 与 `dsh-tool-tasks` | 负责 Task 状态、输出、取消、owner 清理、完成通知与面向模型的控制工具 | 准确父级可以收集、列出或停止后台工作,并收到完成通知 | +| 原生运行与清理 | 产品提供方与 `dsh-subprocess` | 产生一个原生结果、关闭产品协议、请求尽力而为的原生取消,并证明进程树退出 | 前台返回与 Task 结算都会等待幂等资源释放和整棵进程树退出 | ## Codex 提供方 @@ -59,7 +60,7 @@ Codex 0.147.0 使用 Responses 协议,而 DeepSeek 的公开 OpenAI 兼容端 ## 分发与证据 -每个产品都负责覆盖所有分支的包测试、一项必跑的无密钥真实产品测试、一项 Loader 组合 e2e 和一项带密钥 DeepSeek e2e。无密钥产品层级使用被测的确切官方发行版、非空的伪产品密钥、隔离的临时工作区与产品主目录,以及能返回固定答案的回环模型。产品请求缺失、身份验证错误、任务文本被改动、答案不完全一致、真实产品被跳过或受管句柄仍存活,都会使这项必跑测试失败。Loader 层级会启动 README 所示形态的用户配置,在同一个上下文中验证两个固定且只支持前台执行的工具,并且不会启动任何产品进程。带密钥层级会使用仅在运行时提供的密钥启动同一生产提供方与真实产品,要求从固定的 DeepSeek 官方服务取得唯一随机数,并再次证明完全停稳;仅当本地操作者未提供密钥时才会自行跳过,而受信任的 CI 会预检该 secret。 +每个产品都负责覆盖所有分支的包测试、一项必跑的无密钥真实产品测试、一项 Loader 组合 e2e 和一项带密钥 DeepSeek e2e。无密钥产品层级使用被测的确切官方发行版、非空的伪产品密钥、隔离的临时工作区与产品主目录,以及能返回固定答案的回环模型。产品请求缺失、身份验证错误、任务文本被改动、答案不完全一致、真实产品被跳过或受管句柄仍存活,都会使这项必跑测试失败。Loader 层级会启动 README 所示形态的用户配置,在同一个上下文中验证两个固定一次性工具会与通用任务控制工具一起公开可选后台调度,而且不会启动任何产品进程。带密钥层级会使用仅在运行时提供的密钥启动同一生产提供方与真实产品,要求从固定的 DeepSeek 官方服务取得唯一随机数,并再次证明完全停稳;仅当本地操作者未提供密钥时才会自行跳过,而受信任的 CI 会预检该 secret。 Codex 证据锁定 `@openai/codex@0.147.0` 与 `codex-cli 0.147.0`。其真实产品测试会观测确切的 Bearer 密钥、原始任务、逐字节完全一致的最终回答、不会产生文件副作用的无人值守命令拒绝、本地取消以及整棵进程树退出。生产环境仍提供 `codex`,并通过 `PATH` 解析。 @@ -83,12 +84,12 @@ Claude Code 证据锁定 Agent SDK 0.3.220,并使用 SDK 按平台分发的 Cl **由插件管理登录、产品主目录、模型、设置或权限。** 这些选择会在每个产品的原生配置之外建立另一套权威来源,并将一次性提供方扩张为账户管理功能。提供方只公开显式环境覆盖项和清理宽限期;无人值守交互会以默认拒绝方式失败。 -**续接、进度、后台收集和共享父级上下文。** 已交付的用户结果是一项自包含任务和一个最终回答。产品会话、恢复、后续交互、中间消息、父级 transcript(文本记录)传递、结构化输出和后台收集都需要独立的用户约定,当前实现不会预先构建这些功能。 +**续接、进度、产品原生后台状态和共享父级上下文。** 提供方载荷仍是一项自包含任务的一个最终回答。通用 Task 层可以额外提供 id、状态、通知、收集与取消结果,但产品会话、恢复、后续交互、中间消息、父级 transcript(文本记录)传递、结构化输出和提供方专属后台状态都需要独立的用户约定,当前实现不会预先构建这些功能。 ## 后果 -用户通过官方产品集成支持的两个稳定前台工具进行委派。它们在 Profile 中的归属和按 Preset 暴露方式由[共享宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)负责;本说明规定的提供方生命周期会保留原生设置与行为,而共享服务继续独占任务结算与进程树完全停稳的责任。 +用户通过官方产品集成支持的两个稳定一次性工具进行委派。它们在 Profile 中的归属和按 Preset 暴露方式由[共享宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)负责,默认前台且可选通用 Task 的调度方式由[产品一次性后台任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责。本说明规定的提供方生命周期会保留原生设置与行为,而共享服务继续独占任务结算与进程树完全停稳的责任。 -每次委派都要承担新建产品进程和独立模型上下文的开销,且只有最终文本会到达父级。产品原生配置使行为取决于部署环境中安装的产品、账户状态和工作区设置。带密钥 e2e 运行还会消耗外部 API 配额,并依赖 DeepSeek 官方端点;对协议、失败、取消与审批的确定性覆盖仍由无密钥层级承担。提供方不会恢复会话、以流式方式传送进度、接受新的人工交互、回滚工具或文件副作用,也不会施加按实际经过时间触发的超时。 +每次委派都要承担新建产品进程和独立模型上下文的开销。到达父级的产品载荷仍只有最终文本;后台调度还会额外公开通用 Task id、状态、完成通知以及收集或取消结果。产品原生配置使行为取决于部署环境中安装的产品、账户状态和工作区设置。带密钥 e2e 运行还会消耗外部 API 配额,并依赖 DeepSeek 官方端点;对协议、失败、取消与审批的确定性覆盖仍由无密钥层级承担。提供方不会恢复会话、以流式方式传送进度、接受新的人工交互、回滚工具或文件副作用,也不会施加按实际经过时间触发的超时。 兼容性由包级单元测试覆盖率、无密钥真实产品回环测试、带密钥 DeepSeek 随机数测试、公开 Loader 组合、已构建包与 NodeNext 消费方检查、生成的文档与声明以及仓库 CI 矩阵共同锁定。更改受支持的产品基线或 DeepSeek 端点/模型基线时必须刷新这些事实;生产环境不会另行执行运行时版本探测。 diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml new file mode 100644 index 0000000000..9ea93b886c --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md +2026-08-12-product-subagent-one-shot-background-tasks.md: bcc4d9b947e5e666161fd2c2b447fa2edf86bd69 +2026-08-12-product-subagent-one-shot-background-tasks.zh.md: 3aa8266788c48cd5301dde65dab2cb9d58b4145b diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md new file mode 100644 index 0000000000..bcc4d9b947 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md @@ -0,0 +1,69 @@ +# Agent Note: Product one-shot subagents use generic background Tasks + +Status: implemented + +English | [中文](2026-08-12-product-subagent-one-shot-background-tasks.zh.md) + +## Problem + +The Codex and Claude Code providers already run one self-contained task and return one final answer, while `dsh-tool-subagent` already adapts any one-shot provider to the generic background Task runtime. The shipped product-tool rows disabled that route, so an agent could only wait for the product answer even when the delegation was independent of its next action. + +Exposing background execution must not add a product session, product-specific task state, another cancellation owner, or another result protocol. The same provider run must remain responsible for one native process or query and one final answer, while the existing Task registry remains responsible for ids, collection, cancellation, owner cleanup, and completion notices. + +## Decision + +The `standard`, `code`, and `cordis` Agent Presets configure the dormant `subagent_codex` and `subagent_claude_code` rows with `backgroundMode: one-shot`. Removing a row's `disabled` field exposes the existing optional `run_in_background` argument. Omission or `false` waits in the foreground; explicit `true` returns a parent-owned Task id after synchronous Task preflight and registration, without waiting for provider startup or completion. + +The [generic one-shot background adapter](2026-07-08-background-subagent-tasks.md) owns background registration and settlement. It starts the same [`SubagentRun`](2026-06-21-subagent-capability-seam.md), uses a Task-owned cancellation signal across provider startup and execution, waits for `run.result` and `run.dispose()`, maps the terminal result into the Task, and lets `task_output`, `task_list`, `task_kill`, and the existing completion notice expose that state. The [product provider decision](2026-08-04-claude-code-and-codex-subagent-backends.md) continues to own native protocols, answer selection, local cancellation, and process-tree quiescence. + +No provider configuration, service interface, event, wire field, persistence format, or product identifier is added. Foreground and background differ only in which existing consumer waits for the same one-shot run. + +### Ownership and lifecycle + +```text +product tool call + -> omitted / false: tool call waits -> final answer or error -> run disposal + -> true: Task preflight + owner cleanup + -> starter begins provider startup under Task-owned signal + -> Task record/id published and returned (startup remains pending) + -> provider result + run disposal -> Task settlement + notice + -> task_output reads / task_kill cancels + -> parent disposal: Task owner cleanup cancels -> run disposal -> process exit +``` + +| Fact or resource | Owner | Product-tool responsibility | Observable result | +| --- | --- | --- | --- | +| Product selection and exposure | Agent Preset | Bind one fixed tool name to one fixed provider | Enabling one row exposes only that product tool | +| Foreground or background choice | `dsh-tool-subagent` | Resolve `run_in_background` under `one-shot` policy | Omission is foreground; explicit `true` returns a Task id | +| Task id, state, output, cancellation, and notice | `ctx.tasks` and `dsh-tool-tasks` | Register and present the existing one-shot run | Generic task tools collect or stop the run for the exact parent | +| Native answer and process quiescence | Product provider and `dsh-subprocess` | Produce one final result and release one process tree | Task settlement and foreground return both wait for disposal | + +## Published composition + +Full profiles keep both product providers on the host and keep both product-tool rows disabled in each full preset. The host task registry is shared across sessions, while each preset contributes the generic task controls to its own agent scope. A user copies a preset and removes `disabled` from either or both product rows; no product process starts during composition. + +A custom composition that enables one-shot background execution must provide the complete generic Task capability: `dsh-tasks-local` as the provider and `dsh-tool-tasks` as the model-facing consumer. A product tool without that runtime can still execute in the foreground, but an explicit background request fails the existing Task preflight instead of publishing an uncollectable id. + +The ACP product compositions use the same fixed product rows and generic task controls. Their keyless schema snapshots expose `description`, `prompt`, and optional `run_in_background` for each enabled product tool without invoking Codex, Claude Code, or an external model. + +## Verification + +The shipped Web composition boots four user-preset variants—neither product, Codex, Claude Code, and both—and checks that each enabled product tool exposes `run_in_background` alongside `task_output`, `task_list`, and `task_kill`. The two package-owned Loader compositions run with an empty `PATH`, inspect the same schemas and controls, and prove that loading the providers starts no product process. ACP keyless snapshots pin the assembled product schemas, while the existing `dsh-tool-subagent` and task suites pin foreground defaulting, Task registration, final-output collection, cancellation, completion notices, owner disposal, and provider disposal. + +## Alternatives considered + +**Keep the product tools foreground-only.** This preserves the smallest schema but prevents agents from scheduling independent product work even though the generic one-shot Task adapter already owns the required lifecycle. + +**Make product delegations background by default.** A one-shot Task requires later collection, unlike a continuable child with its own durable conversation id and settlement delivery. Foreground remains the compatible default, and background remains an explicit scheduling choice. + +**Use Codex or Claude Code native session state as the background owner.** That would create provider-specific ids, status, cancellation, and recovery semantics beside the generic Task registry. The providers remain one-shot result producers and keep native ids private. + +**Add product-specific output, wait, or kill tools.** Separate controls would duplicate the generic task protocol and teach a different collection workflow for each provider. The existing `task_*` tools already cover the required operations. + +**Add continuable product sessions at the same time.** Resume, follow-up, progress, and persisted product sessions require new product contracts and lifecycle ownership. This decision exposes only the already implemented one-shot background route. + +## Consequences + +Agents can continue useful work while Codex or Claude Code handles an independent one-shot task, then collect the final answer or cancel it through the same Task controls used by other background producers. Foreground callers retain their existing result and error behavior. + +Every product delegation still starts a fresh native process or query, produces final text as its only product payload, and ends with provider disposal and whole-tree exit. A background call additionally exposes the generic Task id, status, completion notice, and collection or cancellation results. Background Tasks are process-local and parent-owned: they do not survive parent disposal, do not expose intermediate product activity, and do not make a product conversation resumable. Custom compositions that expose the background argument must also keep the generic Task provider and controls available. diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md new file mode 100644 index 0000000000..3aa8266788 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md @@ -0,0 +1,69 @@ +# Agent Note: 产品 one-shot subagent 使用通用后台 Task + +Status: implemented + +[English](2026-08-12-product-subagent-one-shot-background-tasks.md) | 中文 + +## 问题 + +Codex 与 Claude Code 提供方已经能够运行一项自包含任务并返回一个最终回答,而 `dsh-tool-subagent` 也已经能够把任意 one-shot 提供方接入通用后台 Task 运行时。随附产品工具行禁用了这条路径,因此即使委托与 agent 的下一步操作彼此独立,agent 也只能等待产品回答。 + +公开后台执行不得增加产品会话、产品专属任务状态、另一取消责任方或另一结果协议。同一个提供方运行必须继续负责一个原生进程或 query 和一个最终回答,而现有任务注册表继续负责 id、收集、取消、owner 清理与完成通知。 + +## 决策 + +`standard`、`code` 与 `cordis` Agent Preset 使用 `backgroundMode: one-shot` 配置休眠的 `subagent_codex` 与 `subagent_claude_code` 行。删除某一行的 `disabled` 字段后,现有可选参数 `run_in_background` 就会公开。省略该参数或传入 `false` 时会在前台等待;显式传入 `true` 时会在同步完成 Task 预检与登记后返回由父级拥有的 Task id,而不会等待提供方启动或完成。 + +[通用 one-shot 后台适配器](2026-07-08-background-subagent-tasks.md)负责后台登记与结算。它会启动同一个 [`SubagentRun`](2026-06-21-subagent-capability-seam.md),让 Task 自有的取消信号覆盖提供方启动与执行,等待 `run.result` 和 `run.dispose()`,把终态结果映射进 Task,并由 `task_output`、`task_list`、`task_kill` 与现有完成通知公开该状态。[产品提供方决策](2026-08-04-claude-code-and-codex-subagent-backends.md)继续负责原生协议、答案选择、本地取消与进程树完全停稳。 + +本决策不新增提供方配置、服务接口、事件、协议字段、持久化格式或产品标识符。前台与后台的区别仅在于由哪个现有消费方等待同一个 one-shot 运行。 + +### 归属与生命周期 + +```text +product tool call + -> omitted / false: tool call waits -> final answer or error -> run disposal + -> true: Task preflight + owner cleanup + -> starter begins provider startup under Task-owned signal + -> Task record/id published and returned (startup remains pending) + -> provider result + run disposal -> Task settlement + notice + -> task_output reads / task_kill cancels + -> parent disposal: Task owner cleanup cancels -> run disposal -> process exit +``` + +| 事实或资源 | 责任方 | 产品工具职责 | 可观察结果 | +| --- | --- | --- | --- | +| 产品选择与公开 | Agent Preset | 把一个固定工具名绑定到一个固定提供方 | 启用一行只会公开对应产品工具 | +| 前台或后台选择 | `dsh-tool-subagent` | 按 `one-shot` 策略解析 `run_in_background` | 省略参数时在前台运行;显式传入 `true` 时返回 task id | +| task id、状态、输出、取消与通知 | `ctx.tasks` 与 `dsh-tool-tasks` | 登记并展示现有 one-shot 运行 | 通用任务工具为准确父级收集或停止运行 | +| 原生答案与进程完全停稳 | 产品提供方与 `dsh-subprocess` | 产生一个最终结果并释放一棵进程树 | Task 结算与前台返回都会等待资源释放 | + +## 发布组装 + +完整 profile 把两个产品提供方保留在宿主,并在每个完整 preset 中让两个产品工具行保持禁用。宿主任务注册表由各会话共享,而每个 preset 会把通用任务控制工具贡献到自身 agent 作用域。用户复制一个 preset,再从任一或两个产品行删除 `disabled`;组装期间不会启动产品进程。 + +自定义组装若启用 one-shot 后台执行,就必须提供完整的通用 Task 能力:由 `dsh-tasks-local` 充当提供方,由 `dsh-tool-tasks` 充当面向模型的消费方。没有该运行时的产品工具仍可在前台执行,但显式后台请求会在现有 Task 预检中失败,不会发布无法收集的 id。 + +ACP 产品组装使用相同的固定产品行与通用任务控制工具。其无密钥 schema 快照会为每个已启用产品工具公开 `description`、`prompt` 和可选的 `run_in_background`,而不会调用 Codex、Claude Code 或外部模型。 + +## 验证 + +随附 Web 组装会启动四种用户 preset 变体——不启用产品、只启用 Codex、只启用 Claude Code,以及同时启用两者——并检查每个已启用产品工具都会与 `task_output`、`task_list` 和 `task_kill` 一起公开 `run_in_background`。两个由包负责的 Loader 组装会在空 `PATH` 下运行,检查相同 schema 与控制工具,并证明加载提供方不会启动产品进程。ACP 无密钥快照会固定组装后的产品 schema,而现有 `dsh-tool-subagent` 与任务测试套件会固定前台默认值、Task 登记、最终输出收集、取消、完成通知、owner 资源释放与提供方资源释放。 + +## 曾考虑的替代方案 + +**让产品工具继续只支持前台运行。** 这种方案保留最小 schema,却会阻止 agent 调度独立产品工作,即使通用 one-shot Task 适配器已经负责所需生命周期。 + +**让产品委托默认在后台运行。** one-shot Task 需要后续收集,这不同于拥有自身持久会话 id 与结算交付的可续接子级。前台继续作为兼容默认值,后台继续作为显式调度选择。 + +**让 Codex 或 Claude Code 原生会话状态负责后台生命周期。** 这会在通用任务注册表之外建立提供方专属 id、状态、取消与恢复语义。提供方继续只产生 one-shot 结果,并把原生 id 保持为私有事实。 + +**增加产品专属 output、wait 或 kill 工具。** 独立控制工具会复制通用任务协议,并为每个提供方教授不同的收集工作流。现有 `task_*` 工具已经覆盖所需操作。 + +**同时增加可续接产品会话。** 恢复、后续交互、进度与持久化产品会话需要新的产品约定和生命周期归属。本决策只公开已经实现的 one-shot 后台路径。 + +## 后果 + +agent 可以在 Codex 或 Claude Code 处理独立 one-shot 任务时继续推进其他工作,随后通过其他后台 producer 共用的 Task 控制工具收集最终回答或取消运行。前台调用方继续获得既有结果与错误行为。 + +每次产品委托仍会启动一个全新的原生进程或 query,把最终文本作为唯一产品载荷,并以提供方资源释放和整棵进程树退出结束。后台调用还会额外公开通用 Task id、状态、完成通知以及收集或取消结果。后台 Task 仅存在于当前进程且由父级拥有:它不会在父级资源释放后继续存活,不会公开产品中间活动,也不会让产品对话变得可恢复。公开后台参数的自定义组装还必须让通用 Task 提供方与控制工具保持可用。 diff --git a/apps/cli/config/agent-presets/code/agent.cordis.yml b/apps/cli/config/agent-presets/code/agent.cordis.yml index 992b1a3eb5..5b5191cd7f 100644 --- a/apps/cli/config/agent-presets/code/agent.cordis.yml +++ b/apps/cli/config/agent-presets/code/agent.cordis.yml @@ -207,7 +207,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -216,7 +216,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: workflow-workerthread diff --git a/apps/cli/config/agent-presets/cordis/agent.cordis.yml b/apps/cli/config/agent-presets/cordis/agent.cordis.yml index d05063846f..eb05a66d11 100644 --- a/apps/cli/config/agent-presets/cordis/agent.cordis.yml +++ b/apps/cli/config/agent-presets/cordis/agent.cordis.yml @@ -194,7 +194,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -203,7 +203,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: workflow-workerthread diff --git a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md index d897cafb7a..344abba03c 100644 --- a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md +++ b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md @@ -134,7 +134,7 @@ Copy these disabled templates from a shipped full preset and remove `disabled` o config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -143,11 +143,11 @@ Copy these disabled templates from a shipped full preset and remove `disabled` o config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed ``` -The two rows are independent. Leaving both disabled preserves the copied preset, enabling one exposes only that product tool, and enabling both exposes both. The host must provide `codex` or `claude` on `PATH`; the preset does not install, authenticate, select a model for, or probe either product. +The two rows are independent. Leaving both disabled preserves the copied preset, enabling one exposes only that product tool, and enabling both exposes both. `backgroundMode: one-shot` keeps omitted or `false` calls in the foreground and lets explicit `run_in_background: true` return a generic Task id. Full presets already carry `tool-tasks`, while the host carries the task registry; retain both when making a custom composition so `task_output`, `task_list`, `task_kill`, cancellation, and completion notices stay available. The host must provide `codex` or `claude` on `PATH`; the preset does not install, authenticate, select a model for, or probe either product. ## What not to move into a preset diff --git a/apps/cli/config/agent-presets/standard/agent.cordis.yml b/apps/cli/config/agent-presets/standard/agent.cordis.yml index b57b18eef7..6ffdf6b1b1 100644 --- a/apps/cli/config/agent-presets/standard/agent.cordis.yml +++ b/apps/cli/config/agent-presets/standard/agent.cordis.yml @@ -206,7 +206,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -215,7 +215,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: workflow-workerthread diff --git a/apps/cli/tests/web-agent-presets.e2e.ts b/apps/cli/tests/web-agent-presets.e2e.ts index fcbb00d33f..ac966c3bb2 100644 --- a/apps/cli/tests/web-agent-presets.e2e.ts +++ b/apps/cli/tests/web-agent-presets.e2e.ts @@ -122,6 +122,16 @@ async function bootWeb(settingsFile: string, extra: PatchOptions[] = []): Promis const toolNames = (ctx: Context, agent?: Agent): string[] => ctx.tools.schemas(agent).map(schema => schema.name).sort() +function toolParameterNames(ctx: Context, agent: Agent, toolName: string): string[] { + const schema = ctx.tools.schemas(agent).find(tool => tool.name === toolName) + if (schema === undefined) throw new Error(`missing tool schema ${toolName}`) + const properties = schema.parameters.properties + if (typeof properties !== 'object' || properties === null || Array.isArray(properties)) { + throw new Error(`${toolName} has invalid parameter properties`) + } + return Object.keys(properties).sort() +} + function enablePresetTool(composition: string, id: string): string { const row = ` - id: ${id}\n` const start = composition.indexOf(row) @@ -475,6 +485,12 @@ describe('product subagent rows in user presets', () => { const tools = toolNames(productCtx, handle.agent) expect(tools.filter(name => name === 'subagent_codex' || name === 'subagent_claude_code')) .toEqual(productTools) + expect(tools).toEqual(expect.arrayContaining(['task_kill', 'task_list', 'task_output'])) + for (const productTool of productTools) { + expect(toolParameterNames(productCtx, handle.agent, productTool)).toEqual([ + 'description', 'prompt', 'run_in_background', + ]) + } } finally { await handle.dispose() } diff --git a/examples/acp-agent/cordis.yml b/examples/acp-agent/cordis.yml index a73d6d36e4..fd16694d5d 100644 --- a/examples/acp-agent/cordis.yml +++ b/examples/acp-agent/cordis.yml @@ -123,7 +123,8 @@ # Fork stays one-shot because a continuable child's `report` tool and prompt # section precede the inherited history a fork reuses; `run_in_background` is off -# because this example mounts no task service. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. +# as an explicit foreground-only choice even though agent-spine-demo mounts the +# generic Task runtime. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. - id: tool-subagent-fork name: '@deepseek-ai/dsh-tool-subagent' config: diff --git a/examples/acp-agent/product-subagent-both.cordis.snapshot.yml b/examples/acp-agent/product-subagent-both.cordis.snapshot.yml index 73d22eae27..0f8760cb91 100644 --- a/examples/acp-agent/product-subagent-both.cordis.snapshot.yml +++ b/examples/acp-agent/product-subagent-both.cordis.snapshot.yml @@ -27,12 +27,12 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/product-subagent-both.cordis.yml b/examples/acp-agent/product-subagent-both.cordis.yml index ce9d054058..6a75bec332 100644 --- a/examples/acp-agent/product-subagent-both.cordis.yml +++ b/examples/acp-agent/product-subagent-both.cordis.yml @@ -1,5 +1,5 @@ -# Add both native product providers and the same independent foreground tool -# rows an Agent Preset may contribute. Loading the composition starts neither +# Add both native product providers and the same independent one-shot tool rows +# an Agent Preset may contribute. Loading the composition starts neither # product; the scenario pins both model-visible schemas. - id: base name: '@deepseek-ai/cordis-plugin-include' @@ -16,12 +16,12 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml b/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml index 8b8cd8604c..69171c7dbf 100644 --- a/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml +++ b/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml @@ -25,5 +25,5 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/product-subagent-codex.cordis.yml b/examples/acp-agent/product-subagent-codex.cordis.yml index 55f9985b7d..2a95679e14 100644 --- a/examples/acp-agent/product-subagent-codex.cordis.yml +++ b/examples/acp-agent/product-subagent-codex.cordis.yml @@ -1,4 +1,4 @@ -# Add the native Codex product provider and its preset-shaped foreground tool to +# Add the native Codex product provider and its preset-shaped one-shot tool to # the real ACP composition. The model is told not to call it; the scenario pins # the assembled request schema without starting Codex. - id: base @@ -14,5 +14,5 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml index fcdc0c4fb6..45b62f880f 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml @@ -1,4 +1,4 @@ -# Test-only composition of both public opt-in providers and foreground tools. +# Test-only composition of both public opt-in providers and one-shot task tools. # The owning e2e boots this tree but never invokes a model or product process. - id: fixture name: './fixture.ts' @@ -20,7 +20,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: 'provider-managed' - id: tool-subagent-claude-code @@ -28,7 +28,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: 'provider-managed' - id: agent-spine diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts index d7540e1a2d..19b0cfc172 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts @@ -53,11 +53,16 @@ try { required: tool.parameters.required, } }) + const taskTools = ctx.tools.schemas() + .map(schema => schema.name) + .filter(name => name === 'task_kill' || name === 'task_list' || name === 'task_output') + .sort() process.stdout.write(`${JSON.stringify({ registeredProviders: ctx.subagents.list(), providers, tools, + taskTools, starts, })}\n`) } finally { diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml index e770b11c95..6afe2b888d 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml @@ -1,4 +1,4 @@ -# Test-only composition of the public opt-in provider and foreground tool. +# Test-only composition of the public opt-in provider and one-shot task tool. # The owning e2e boots this tree but never invokes the model or Codex. - id: fixture name: './fixture.ts' @@ -17,7 +17,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: 'provider-managed' - id: agent-spine diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts index 873f5e36de..59bb8eb54a 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts @@ -31,6 +31,10 @@ try { if (typeof properties !== 'object' || properties === null || Array.isArray(properties)) { throw new Error('subagent_codex tool has invalid parameter properties') } + const taskTools = ctx.tools.schemas() + .map(schema => schema.name) + .filter(name => name === 'task_kill' || name === 'task_list' || name === 'task_output') + .sort() process.stdout.write(`${JSON.stringify({ providers: ctx.subagents.list(), @@ -44,6 +48,7 @@ try { parameterNames: Object.keys(properties).sort(), required: tool.parameters.required, }, + taskTools, starts, })}\n`) } finally { diff --git a/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json index a1a46ab6b5..6855c0b127 100644 --- a/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json @@ -256,7 +256,7 @@ }, { "name": "subagent_claude_code", - "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the subagent and returns its result.", + "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a task id; collect with `task_output` and stop with `task_kill`.", "parameters": { "type": "object", "properties": { @@ -267,6 +267,10 @@ "prompt": { "type": "string", "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs." + }, + "run_in_background": { + "type": "boolean", + "description": "Whether to run as a background task and return its id. Defaults to false; collect with task_output or stop with task_kill." } }, "required": [ @@ -277,7 +281,7 @@ }, { "name": "subagent_codex", - "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the subagent and returns its result.", + "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a task id; collect with `task_output` and stop with `task_kill`.", "parameters": { "type": "object", "properties": { @@ -288,6 +292,10 @@ "prompt": { "type": "string", "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs." + }, + "run_in_background": { + "type": "boolean", + "description": "Whether to run as a background task and return its id. Defaults to false; collect with task_output or stop with task_kill." } }, "required": [ diff --git a/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json index 449f17784c..78cec432c7 100644 --- a/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json @@ -256,7 +256,7 @@ }, { "name": "subagent_codex", - "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the subagent and returns its result.", + "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a task id; collect with `task_output` and stop with `task_kill`.", "parameters": { "type": "object", "properties": { @@ -267,6 +267,10 @@ "prompt": { "type": "string", "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs." + }, + "run_in_background": { + "type": "boolean", + "description": "Whether to run as a background task and return its id. Defaults to false; collect with task_output or stop with task_kill." } }, "required": [ diff --git a/examples/headless-agent/cordis.yml b/examples/headless-agent/cordis.yml index 61a0190142..f4ccbf5ec3 100644 --- a/examples/headless-agent/cordis.yml +++ b/examples/headless-agent/cordis.yml @@ -120,7 +120,8 @@ # Fork stays one-shot because a continuable child's `report` tool and prompt # section precede the inherited history a fork reuses; `run_in_background` is off -# because this example mounts no task service. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. +# as an explicit foreground-only choice even though agent-spine-demo mounts the +# generic Task runtime. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. - id: tool-subagent-fork name: '@deepseek-ai/dsh-tool-subagent' config: diff --git a/packages/subagent/subagent-claude-code/README.i18n.yaml b/packages/subagent/subagent-claude-code/README.i18n.yaml index bbb3c9cf1a..168a921e7c 100644 --- a/packages/subagent/subagent-claude-code/README.i18n.yaml +++ b/packages/subagent/subagent-claude-code/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-claude-code/README.md -README.md: 17b14e847baea3eadda7129b5e49f5e65b668cc8 -README.zh.md: 2f59144d5bd9f26a58773e6dd53909b2b0e8da14 +README.md: 556cde7da4467659d02709c43325e60fa7de6a74 +README.zh.md: bda00d7be4467e739604eeba0020850cb1a99d50 diff --git a/packages/subagent/subagent-claude-code/README.md b/packages/subagent/subagent-claude-code/README.md index 17b14e847b..556cde7da4 100644 --- a/packages/subagent/subagent-claude-code/README.md +++ b/packages/subagent/subagent-claude-code/README.md @@ -31,7 +31,7 @@ The provider advertises no optional start-time capabilities and reports `inherit Production resolves `claude` from the subprocess execution world's credential-scrubbed `PATH`, with explicit `env` entries applied, and passes the resulting path to the SDK as `pathToClaudeCodeExecutable`. On Windows, a resolved `.cmd` or `.bat` path is carried as a quoted, per-spawn environment value that `cmd.exe /v:off` expands once, so valid path metacharacters remain data. The pinned SDK's fixed flags then occupy cmd's command tail and contain no cmd metacharacters; they are not ordinary Windows argv. Native settings and authentication remain authoritative. The plugin does not install another CLI, select a model, create a product home, log in, or probe an account. Credential-shaped ambient variables are removed before the explicit `env` overlay is applied, so an API key or token intended for the child must be supplied there. Non-credential endpoint variables such as `ANTHROPIC_BASE_URL`, along with ordinary ambient values such as `PATH` and `HOME`, remain inherited unless overridden. -Shipped profiles load this provider once on the host and start no Claude process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_claude_code` only to agents composed from the copy. A custom host composition can still use both rows directly. +Shipped profiles load this provider once on the host and start no Claude process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_claude_code` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Task id for `task_output` or `task_kill`. Shipped full profiles already provide the task registry and controls; a custom composition must load the same generic task provider and consumer when it enables this background route. ```yaml - id: subagent-claude-code @@ -40,13 +40,19 @@ Shipped profiles load this provider once on the host and start no Claude process env: ANTHROPIC_API_KEY: !!js process.env.ANTHROPIC_API_KEY +- id: tasks + name: '@deepseek-ai/dsh-tasks-local' + +- id: tool-tasks + name: '@deepseek-ai/dsh-tool-tasks' + - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed ``` @@ -72,19 +78,19 @@ The child pays for an independent Claude Code context and query. Child tokens do Independent of the parent request cache. Reuse depends only on Claude Code's own model, instructions, tools, native settings, and fresh query. -### Parent tool result, indirectly +### Parent scheduling and results, indirectly #### What the model sees -Through `dsh-tool-subagent`, the parent sees only the strict final Claude Code answer or the consumer's exact error for a non-completed result. Claude Code reasoning, tool activity, intermediate messages, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. +Through `dsh-tool-subagent`, a foreground call gives the parent the strict final Claude Code answer or the consumer's exact error for a non-completed result. A background call first returns a Task id; the generic task controls later deliver a bounded completion notice, expose the final answer and status through `task_output`, and let `task_kill` request cancellation. Claude Code reasoning, tool activity, intermediate messages, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. #### Token effect -Parent input grows only by the final answer or error retained in the tool result. This provider adds no parent tool schema by itself. +Foreground input grows by the retained final answer or error. Background input also includes the start acknowledgement, completion notice, and any `task_output`, `task_kill`, or later status results; child tokens still do not enter the parent context. This provider adds no parent tool schema by itself. #### KV Cache effect -Append-only: the new tool result follows the reusable parent request prefix. +Append-only: foreground adds one result after the reusable parent prefix, while background appends the Task acknowledgement, notice, and later control or collection results. Background scheduling can add a notice-driven turn, but none of these messages rewrites the earlier prefix. ## Known Limitations and Deferred Work @@ -93,6 +99,6 @@ Append-only: the new tool result follows the reusable parent request prefix. - **Product installation and account state remain native** — a missing or incompatible `claude`, configuration error, or authentication failure is surfaced as a startup or run error; the plugin provides no installer or login flow. - **The SDK platform CLI remains in the install closure** — production ignores it in favor of the host `claude`, but the current SDK optional dependency is still installed and supplies the keyless compatibility fixture. Removing that payload belongs to the separate product installation-closure follow-up. - **No human interaction path** — `AskUserQuestion` is disabled and other interactive callbacks are absent, so tasks requiring new approval or input fail instead of suspending. -- **Final text only** — reasoning, intermediate messages, tool traffic, usage, stderr, and workspace diffs remain product-local. +- **Product payload is final text only** — reasoning, intermediate messages, tool traffic, usage, stderr, and workspace diffs remain product-local; generic Task ids, notices, and status come from the shared task runtime. - **No optional shared capabilities** — output schemas, child personas, tool filtering, and harness depth enforcement are rejected by the shared service for this provider. - **No wall-clock timeout or side-effect rollback** — the caller cancels long work, and files or external systems changed before cancellation are not restored. diff --git a/packages/subagent/subagent-claude-code/README.zh.md b/packages/subagent/subagent-claude-code/README.zh.md index 2f59144d5b..bda00d7be4 100644 --- a/packages/subagent/subagent-claude-code/README.zh.md +++ b/packages/subagent/subagent-claude-code/README.zh.md @@ -31,7 +31,7 @@ SDK 接收由文本块原样拼接成的任务。提供方会完整迭代 SDK 生产环境从子进程执行世界清除凭证后的 `PATH` 解析 `claude`,再应用显式 `env` 条目,并把所得路径作为 `pathToClaudeCodeExecutable` 交给 SDK。在 Windows 上,解析到的 `.cmd` 或 `.bat` 路径会作为带引号、仅供本次 spawn 使用的环境值交给 `cmd.exe /v:off` 展开一次,因此合法路径中的元字符仍只是数据。锁定版本的 SDK 随后把固定命令行选项放在 cmd 的命令尾部;这些选项不含 cmd 元字符,也并不是普通的 Windows argv。原生设置与身份验证继续是权威来源。本插件不安装另一份 CLI、不选择模型、不创建产品主目录、不执行登录,也不探测账户。具有凭证特征的环境变量会在显式 `env` 覆盖生效前被清除,因此供子进程使用的 API 密钥或 token 必须在该配置中显式提供。除非被覆盖,`ANTHROPIC_BASE_URL` 等非凭证端点变量以及 `PATH` 和 `HOME` 等普通环境变量仍会被继承。 -随附 profile 会在宿主上加载一次该提供方,而且在工具被调用前不会启动 Claude 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_claude_code`。自定义宿主组装仍可直接使用两条配置行。 +随附 profile 会在宿主上加载一次该提供方,而且在工具被调用前不会启动 Claude 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_claude_code`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Task ID,供 `task_output` 或 `task_kill` 使用。随附完整 profile 已提供任务注册表和控制工具;自定义组装若启用该后台路径,也必须加载同一通用任务提供方与消费方。 ```yaml - id: subagent-claude-code @@ -40,13 +40,19 @@ SDK 接收由文本块原样拼接成的任务。提供方会完整迭代 SDK env: ANTHROPIC_API_KEY: !!js process.env.ANTHROPIC_API_KEY +- id: tasks + name: '@deepseek-ai/dsh-tasks-local' + +- id: tool-tasks + name: '@deepseek-ai/dsh-tool-tasks' + - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed ``` @@ -72,19 +78,19 @@ Claude Code 子任务会在一个全新的 SDK query 中接收独立文本任务 这与父请求缓存相互独立。能否复用只取决于 Claude Code 自身的模型、指令、工具、原生设置和全新 query。 -### 父级工具结果(间接) +### 父级调度与结果(间接) #### 模型看到的内容 -通过 `dsh-tool-subagent`,父级模型只会看到符合严格成功条件的 Claude Code 最终答案,或者在结果未完成时看到消费方给出的原样错误。Claude Code 的推理、工具活动、中间消息、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 +通过 `dsh-tool-subagent`,前台调用会让父级模型看到符合严格成功条件的 Claude Code 最终答案,或者在结果未完成时看到消费方给出的原样错误。后台调用会先返回 Task id;随后通用任务控制面会送达有界完成通知,通过 `task_output` 公开最终答案与状态,并允许 `task_kill` 请求取消。Claude Code 的推理、工具活动、中间消息、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 #### 对 token 的影响 -父级输入只会增加工具结果中保留的最终答案或错误内容。本提供方自身不添加父级工具 schema。 +前台输入会增加工具结果中保留的最终答案或错误内容。后台输入还会包含启动确认、完成通知,以及 `task_output`、`task_kill` 或后续状态结果;子任务 token 仍不会进入父级上下文。本提供方自身不添加父级工具 schema。 #### 对 KV Cache 的影响 -仅追加:新的工具结果接在可复用的父请求前缀之后。 +仅追加:前台会在可复用的父请求前缀后增加一个结果,后台则会继续追加 Task 启动确认、通知以及后续控制或收集结果。后台调度可能增加一个由通知唤醒的轮次,但这些消息都不会改写更早的前缀。 ## 已知限制与后续工作 @@ -93,6 +99,6 @@ Claude Code 子任务会在一个全新的 SDK query 中接收独立文本任务 - **产品安装与账户状态仍由原生机制管理**:`claude` 缺失或不兼容、配置错误或身份验证失败都会呈现为启动错误或运行错误;本插件不提供安装程序或登录流程。 - **SDK 平台 CLI 仍在安装闭包内**:生产环境会忽略它,改用宿主提供的 `claude`,但当前 SDK 的可选依赖仍会安装,并提供无密钥兼容性 fixture。移除该载荷属于独立的产品安装闭包后续项。 - **没有人工交互路径**:`AskUserQuestion` 被禁用,其他交互回调也不存在,因此需要新审批或输入的任务会失败而不会挂起。 -- **仅返回最终文本**:推理、中间消息、工具通信、用量信息、stderr 和工作区差异仍只保留在产品内部。 +- **产品载荷仅包含最终文本**:推理、中间消息、工具通信、用量信息、stderr 和工作区差异仍只保留在产品内部;通用 Task id、通知与状态来自共享任务运行时。 - **没有可选的共享能力**:对于本提供方,共享服务会拒绝输出 schema、子任务角色设定、工具筛选和 harness 深度强制约束。 - **没有按实际经过时间触发的超时或副作用回滚**:长时间运行的工作由调用方取消,且取消前已更改的文件或外部系统不会恢复原状。 diff --git a/packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts b/packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts index 51a2ea0025..54d91a3e1f 100644 --- a/packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts +++ b/packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts @@ -15,7 +15,7 @@ const configPath = join(fixtureDir, 'cordis.yml') const repoTsconfig = fileURLToPath(new URL('../../../../tsconfig.json', import.meta.url)) describe('product-provider public Loader composition', () => { - it('loads both opt-in packages and foreground tools without starting either product', async () => { + it('loads both opt-in packages, one-shot task tools, and task controls without starting either product', async () => { const { stdout, stderr } = await runLoaderSmoke({ label: 'product-provider Loader composition', tempDirPrefix: 'dsh-product-provider-loader-', @@ -57,15 +57,16 @@ describe('product-provider public Loader composition', () => { tools: [ { name: 'subagent_codex', - parameterNames: ['description', 'prompt'], + parameterNames: ['description', 'prompt', 'run_in_background'], required: ['description', 'prompt'], }, { name: 'subagent_claude_code', - parameterNames: ['description', 'prompt'], + parameterNames: ['description', 'prompt', 'run_in_background'], required: ['description', 'prompt'], }, ], + taskTools: ['task_kill', 'task_list', 'task_output'], starts: 0, }) }, LOADER_SMOKE_TEST_TIMEOUT_MS) diff --git a/packages/subagent/subagent-codex/README.i18n.yaml b/packages/subagent/subagent-codex/README.i18n.yaml index 1cfb9645c2..9c9c7e8648 100644 --- a/packages/subagent/subagent-codex/README.i18n.yaml +++ b/packages/subagent/subagent-codex/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-codex/README.md -README.md: 3d59ca1eaf3db9dd9d9d2cd451692ebd2a956ef4 -README.zh.md: b60cb1bba9b2d7b3f61c544c1600862a0ad6ce5b +README.md: 6a882c128ebd372ee148a4315a237d4eacf6d42b +README.zh.md: beb5411f6a449efc7a45c171d217f98657805740 diff --git a/packages/subagent/subagent-codex/README.md b/packages/subagent/subagent-codex/README.md index 3d59ca1eaf..6a882c128e 100644 --- a/packages/subagent/subagent-codex/README.md +++ b/packages/subagent/subagent-codex/README.md @@ -27,7 +27,7 @@ The provider advertises no optional start-time capabilities and reports `inherit Production resolves `codex` from `PATH` and uses the host's native Codex configuration and authentication. The plugin does not install Codex, select a model, create `CODEX_HOME`, log in, or probe a version. Credential-shaped ambient variables are removed by the subprocess seam, so an API key intended for the child must be supplied explicitly in `env`; ordinary ambient values such as `PATH` and `HOME` remain available unless overridden. -Shipped profiles load this provider once on the host and start no Codex process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_codex` only to agents composed from the copy. A custom host composition can still use both rows directly. +Shipped profiles load this provider once on the host and start no Codex process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_codex` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Task id for `task_output` or `task_kill`. Shipped full profiles already provide the task registry and controls; a custom composition must load the same generic task provider and consumer when it enables this background route. ```yaml - id: subagent-codex @@ -36,13 +36,19 @@ Shipped profiles load this provider once on the host and start no Codex process env: OPENAI_API_KEY: !!js process.env.OPENAI_API_KEY +- id: tasks + name: '@deepseek-ai/dsh-tasks-local' + +- id: tool-tasks + name: '@deepseek-ai/dsh-tool-tasks' + - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed ``` @@ -66,19 +72,19 @@ The child pays for an independent Codex context and turn. Child tokens do not en Independent of the parent request cache. Reuse depends only on Codex's own provider, model, instructions, tools, and ephemeral-thread request. -### Parent tool result, indirectly +### Parent scheduling and results, indirectly #### What the model sees -Through `dsh-tool-subagent`, the parent sees only the selected final Codex answer or the consumer's exact error for a non-completed result. Codex commentary, reasoning, tool activity, stderr, workspace diffs, and product ids are not copied into the parent Session. +Through `dsh-tool-subagent`, a foreground call gives the parent the selected final Codex answer or the consumer's exact error for a non-completed result. A background call first returns a Task id; the generic task controls later deliver a bounded completion notice, expose the final answer and status through `task_output`, and let `task_kill` request cancellation. Codex commentary, reasoning, tool activity, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. #### Token effect -Parent input grows only by the final answer or error retained in the tool result. This provider adds no parent tool schema by itself. +Foreground input grows by the retained final answer or error. Background input also includes the start acknowledgement, completion notice, and any `task_output`, `task_kill`, or later status results; child tokens still do not enter the parent context. This provider adds no parent tool schema by itself. #### KV Cache effect -Append-only: the new tool result follows the reusable parent request prefix. +Append-only: foreground adds one result after the reusable parent prefix, while background appends the Task acknowledgement, notice, and later control or collection results. Background scheduling can add a notice-driven turn, but none of these messages rewrites the earlier prefix. ## Known Limitations and Deferred Work @@ -86,6 +92,6 @@ Append-only: the new tool result follows the reusable parent request prefix. - **Host-managed product installation and account state** — a missing or incompatible `codex`, configuration error, or authentication failure is surfaced as a startup or run error; the plugin provides no installer, login flow, or runtime version gate. - **Compatibility is pinned by development evidence** — upgrading from the verified 0.147.0 protocol baseline requires regenerating upstream schema evidence and rerunning handshake, answer-selection, approval, cancellation, keyless real-product, and credentialed DeepSeek nonce tests. - **No human approval path** — known unattended approval requests are denied and unknown server requests fail closed; deployments cannot configure an allow policy through this package. -- **Final text only** — reasoning, commentary, intermediate messages, tool traffic, usage, stderr, and workspace diffs remain product-local. +- **Product payload is final text only** — reasoning, commentary, intermediate messages, tool traffic, usage, stderr, and workspace diffs remain product-local; generic Task ids, notices, and status come from the shared task runtime. - **No optional shared capabilities** — output schemas, child personas, tool filtering, and harness depth enforcement are rejected by the shared service for this provider. - **No wall-clock timeout or side-effect rollback** — the caller cancels long work, and files or external systems changed before cancellation are not restored. diff --git a/packages/subagent/subagent-codex/README.zh.md b/packages/subagent/subagent-codex/README.zh.md index b60cb1bba9..beb5411f6a 100644 --- a/packages/subagent/subagent-codex/README.zh.md +++ b/packages/subagent/subagent-codex/README.zh.md @@ -27,7 +27,7 @@ 生产环境会从 `PATH` 中解析 `codex`,并使用宿主机原生的 Codex 配置与身份验证。本插件不安装 Codex、不选择模型、不创建 `CODEX_HOME`、不执行登录,也不探测版本。子进程 seam 会移除具有凭证特征的环境变量,因此供子进程使用的 API 密钥必须在 `env` 中显式提供;除非被覆盖,`PATH` 和 `HOME` 等普通环境变量值仍然可用。 -随附 profile 会在宿主上加载一次该提供方,而且在工具被调用前不会启动 Codex 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_codex`。自定义宿主组装仍可直接使用两条配置行。 +随附 profile 会在宿主上加载一次该提供方,而且在工具被调用前不会启动 Codex 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_codex`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Task ID,供 `task_output` 或 `task_kill` 使用。随附完整 profile 已提供任务注册表和控制工具;自定义组装若启用该后台路径,也必须加载同一通用任务提供方与消费方。 ```yaml - id: subagent-codex @@ -36,13 +36,19 @@ env: OPENAI_API_KEY: !!js process.env.OPENAI_API_KEY +- id: tasks + name: '@deepseek-ai/dsh-tasks-local' + +- id: tool-tasks + name: '@deepseek-ai/dsh-tool-tasks' + - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed ``` @@ -66,19 +72,19 @@ Codex 子任务会在一个全新的临时线程中,以单个轮次接收这 这与父请求缓存相互独立。能否复用只取决于 Codex 自身的提供方、模型、指令、工具和临时线程请求。 -### 父级工具结果(间接) +### 父级调度与结果(间接) #### 模型看到的内容 -通过 `dsh-tool-subagent`,父级模型只会看到选定的 Codex 最终答案,或者在结果未完成时看到消费方给出的原样错误。Codex 的过程说明、推理(reasoning)、工具活动、stderr、工作区差异和产品标识符均不会复制到父会话。 +通过 `dsh-tool-subagent`,前台调用会让父级模型看到选定的 Codex 最终答案,或者在结果未完成时看到消费方给出的原样错误。后台调用会先返回 Task id;随后通用任务控制面会送达有界完成通知,通过 `task_output` 公开最终答案与状态,并允许 `task_kill` 请求取消。Codex 的过程说明、推理(reasoning)、工具活动、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 #### 对 token 的影响 -父级输入只会增加工具结果中保留的最终答案或错误内容。本提供方自身不添加父级工具 schema。 +前台输入会增加工具结果中保留的最终答案或错误内容。后台输入还会包含启动确认、完成通知,以及 `task_output`、`task_kill` 或后续状态结果;子任务 token 仍不会进入父级上下文。本提供方自身不添加父级工具 schema。 #### 对 KV Cache 的影响 -仅追加:新的工具结果接在可复用的父请求前缀之后。 +仅追加:前台会在可复用的父请求前缀后增加一个结果,后台则会继续追加 Task 启动确认、通知以及后续控制或收集结果。后台调度可能增加一个由通知唤醒的轮次,但这些消息都不会改写更早的前缀。 ## 已知限制与后续工作 @@ -86,6 +92,6 @@ Codex 子任务会在一个全新的临时线程中,以单个轮次接收这 - **产品安装和账户状态由宿主管理**:`codex` 缺失或不兼容、配置错误或身份验证失败,都会呈现为启动错误或运行错误;本插件不提供安装程序、登录流程或运行时版本门禁。 - **兼容性由开发证据锁定**:若要从已验证的 0.147.0 协议基线升级,必须重新生成上游 schema 证据,并重新运行握手、答案选择、审批、取消、无密钥真实产品以及带密钥的 DeepSeek 随机数测试。 - **没有人工审批路径**:已知的无人值守审批请求会被拒绝,未知服务器请求会以默认拒绝方式使运行失败;部署方无法通过本包配置允许策略。 -- **仅返回最终文本**:推理、过程说明、中间消息、工具通信、用量信息、stderr 和工作区差异仍只保留在产品内部。 +- **产品载荷仅包含最终文本**:推理、过程说明、中间消息、工具通信、用量信息、stderr 和工作区差异仍只保留在产品内部;通用 Task id、通知与状态来自共享任务运行时。 - **没有可选的共享能力**:对于本提供方,共享服务会拒绝输出 schema、子任务角色设定、工具筛选和 harness 深度强制约束。 - **没有按实际经过时间触发的超时或副作用回滚**:长时间运行的工作由调用方取消,且取消前已更改的文件或外部系统不会恢复原状。 diff --git a/packages/subagent/subagent-codex/tests/loader-composition.e2e.ts b/packages/subagent/subagent-codex/tests/loader-composition.e2e.ts index 6c4019f8c8..7c765a73ac 100644 --- a/packages/subagent/subagent-codex/tests/loader-composition.e2e.ts +++ b/packages/subagent/subagent-codex/tests/loader-composition.e2e.ts @@ -15,7 +15,7 @@ const configPath = join(fixtureDir, 'cordis.yml') const repoTsconfig = fileURLToPath(new URL('../../../../tsconfig.json', import.meta.url)) describe('Codex provider public Loader composition', () => { - it('loads the opt-in package and foreground tool without starting Codex', async () => { + it('loads the opt-in package, one-shot task tool, and task controls without starting Codex', async () => { const { stdout, stderr } = await runLoaderSmoke({ label: 'subagent-codex Loader composition', tempDirPrefix: 'dsh-subagent-codex-loader-', @@ -44,9 +44,10 @@ describe('Codex provider public Loader composition', () => { }, tool: { name: 'subagent_codex', - parameterNames: ['description', 'prompt'], + parameterNames: ['description', 'prompt', 'run_in_background'], required: ['description', 'prompt'], }, + taskTools: ['task_kill', 'task_list', 'task_output'], starts: 0, }) }, LOADER_SMOKE_TEST_TIMEOUT_MS) diff --git a/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts b/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts index 7c233c1924..4a36413c7d 100644 --- a/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts +++ b/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts @@ -85,7 +85,11 @@ describe('dsh-tool-subagent', () => { it('registers a `subagent` tool that delegates to the configured provider and returns its output', async () => { const ctx = await setup({ provider: 'mock' }, { reply: 'child says hi' }) - const result = await callSubagent(ctx, { description: 'do a thing', prompt: 'go research X' }) + const result = await callSubagent(ctx, { + description: 'do a thing', + prompt: 'go research X', + run_in_background: false, + }) expect(result.isError).toBe(false) if (result.isError) throw new Error('expected subagent success') expect(result.value).toEqual({ From caf7d48f88fb9768c7c8a0a4b7f3ed2bc581b3bd Mon Sep 17 00:00:00 2001 From: pku-xht Date: Wed, 12 Aug 2026 17:38:06 +0800 Subject: [PATCH 002/103] fix(subagent): preserve startup cleanup failures --- ...8-10-fork-children-stay-one-shot.i18n.yaml | 4 +- .../2026-08-10-fork-children-stay-one-shot.md | 4 +- ...26-08-10-fork-children-stay-one-shot.zh.md | 4 +- .../subagent-claude-code/README.i18n.yaml | 4 +- .../subagent/subagent-claude-code/README.md | 2 +- .../subagent-claude-code/README.zh.md | 2 +- .../subagent/subagent-codex/README.i18n.yaml | 4 +- packages/subagent/subagent-codex/README.md | 2 +- packages/subagent/subagent-codex/README.zh.md | 2 +- packages/subagent/tool-subagent/src/index.ts | 4 +- .../tool-subagent/tests/tool-subagent.spec.ts | 42 +++++++++++++++++++ 11 files changed, 59 insertions(+), 15 deletions(-) diff --git a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml index 282779ce62..ef424471d8 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md -2026-08-10-fork-children-stay-one-shot.md: f799f9f7affe7dfecbbe12d0988cf6f9b936d43e -2026-08-10-fork-children-stay-one-shot.zh.md: 5c55e96296ed6678ac82afc0e40150d443f74c96 +2026-08-10-fork-children-stay-one-shot.md: 030bed3c1b516a54afd5f97b00000ed7ceaf64d8 +2026-08-10-fork-children-stay-one-shot.zh.md: 4b033a70c3674315c491e85be67a1d357aeac51b diff --git a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md index f799f9f7af..030bed3c1b 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md +++ b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md @@ -12,7 +12,7 @@ The child-scoped `report` return channel is now the largest such addition, and s ## Decision -Every shipped composition binds the fork delegation tool to `backgroundMode: one-shot`: [the base bundle](../../../../packages/bundle/base/cordis.patch.yml), [the ACP example](../../../../examples/acp-agent/cordis.yml), and [the headless example](../../../../examples/headless-agent/cordis.yml). All three have access to the generic Task runtime: the base bundle leaves `run_in_background` available, while the two examples set `enableRunInBackground: false` as an explicit foreground-only composition choice. +Every shipped composition binds the fork delegation tool to `backgroundMode: one-shot`: [the base bundle](../../../../packages/bundle/base/cordis.patch.yml), [the ACP example](../../../../examples/acp-agent/cordis.yml), and [the headless example](../../../../examples/headless-agent/cordis.yml). The base bundle leaves `run_in_background` available, because it mounts a task service; the two examples set `enableRunInBackground: false`, because they mount none and a one-shot background start would otherwise fail at call time on a missing `tasks` service. One-shot children — foreground and background alike — are created through `SubagentService.start()`, which never enters the continuable activation-setup registry, so neither `report` nor its prompt section is installed. A forked one-shot child's system prompt and tool schemas therefore equal its parent's, apart from the `persona` and `toolFilter` deltas a deployment opts into per delegation tool. @@ -38,7 +38,7 @@ The reintroduction condition is recorded as a `TODO(fork-continuable-prefix-reus ## Consequences -- No shipped composition creates a continuable forked child. The base bundle may return a one-shot Task id for `subagent_fork`, while the ACP and headless examples return the result to the caller's turn; `send_message` addresses only spawned children. +- No shipped composition creates a continuable forked child; `subagent_fork` returns a result to its caller's turn, and `send_message` addresses only spawned children. - A forked child's request prefix stays byte-identical to its parent's unless the deployment configures `persona` or `toolFilter` on the fork delegation tool, so the token cost of seeding buys provider-side reuse again. - The fork provider's continuable path has no production caller and no assembled-composition coverage. It keeps its package-level tests, and the seam still accepts it, so a bundle or `--patch` overlay can reintroduce it with no code change and no warning. - `subagent_fork`'s model-visible schema changes: the continuable background wording is replaced by the one-shot task wording in the base bundle, and disappears entirely from the two examples. The affected keyless snapshot tool-schema sidecars are re-recorded in the same change. diff --git a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md index 5c55e96296..4b033a70c3 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md +++ b/.agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.zh.md @@ -12,7 +12,7 @@ fork 与 spawn 的唯一区别是 child 的 Session 会以 parent 已完成轮 ## 决策 -所有随附组合都把 fork 委派工具绑定为 `backgroundMode: one-shot`:[base 组合包](../../../../packages/bundle/base/cordis.patch.yml)、[ACP 示例](../../../../examples/acp-agent/cordis.yml)与[headless 示例](../../../../examples/headless-agent/cordis.yml)。三者都能使用通用 Task 运行时:base 组合包保留 `run_in_background`,两个示例则把 `enableRunInBackground: false` 作为显式的仅前台组装选择。 +所有随附组合都把 fork 委派工具绑定为 `backgroundMode: one-shot`:[base 组合包](../../../../packages/bundle/base/cordis.patch.yml)、[ACP 示例](../../../../examples/acp-agent/cordis.yml)与[headless 示例](../../../../examples/headless-agent/cordis.yml)。base 组合包保留 `run_in_background`,因为它挂载了 task 服务;两个示例设置 `enableRunInBackground: false`,因为它们都不挂载 task 服务,否则一次 one-shot 后台启动会在调用时因缺少 `tasks` 服务而失败。 one-shot child——前台与后台皆然——经由 `SubagentService.start()` 创建,该路径从不进入可继续的 activation setup 注册表,因此 `report` 与它的提示词 section 都不会被安装。于是一个 fork 出的 one-shot child 的系统提示词与工具 schema 与其 parent 相同,只差部署逐个委派工具主动选择的 `persona` 与 `toolFilter` 增量。 @@ -38,7 +38,7 @@ one-shot child——前台与后台皆然——经由 `SubagentService.start()` ## 后果 -- 没有任何随附组合会创建可继续的 fork child。base 组合包中的 `subagent_fork` 可以返回 one-shot Task id,而 ACP 与 headless 示例会把结果返回给调用方的轮次;`send_message` 只寻址 spawn 出的 child。 +- 没有任何随附组合会创建可继续的 fork child;`subagent_fork` 把结果返回给调用方的轮次,而 `send_message` 只寻址 spawn 出的 child。 - 除非部署在 fork 委派工具上配置了 `persona` 或 `toolFilter`,fork child 的请求前缀与其 parent 逐字节相同,因此初始内容的 token 成本重新换来了提供方侧的复用。 - fork 提供方的可继续路径没有生产调用方,也没有整体组装层面的覆盖。它保留自己的包内测试,seam 也仍然接受它,因此某个组合包或 `--patch` 覆盖层可以无需改动代码、也不会有任何警告地把它重新引入。 - `subagent_fork` 面向模型的 schema 发生变化:base 组合包中可继续的后台措辞被 one-shot 的 task 措辞取代,在两个示例中则完全消失。受影响的无密钥快照工具 schema 伴随文件在同一次改动中重新记录。 diff --git a/packages/subagent/subagent-claude-code/README.i18n.yaml b/packages/subagent/subagent-claude-code/README.i18n.yaml index 168a921e7c..02dff5851d 100644 --- a/packages/subagent/subagent-claude-code/README.i18n.yaml +++ b/packages/subagent/subagent-claude-code/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-claude-code/README.md -README.md: 556cde7da4467659d02709c43325e60fa7de6a74 -README.zh.md: bda00d7be4467e739604eeba0020850cb1a99d50 +README.md: f0f6e39820920e0b266802585b74a953a068828a +README.zh.md: 52baee6c1158bb38505fd0cf454a820853e0cf89 diff --git a/packages/subagent/subagent-claude-code/README.md b/packages/subagent/subagent-claude-code/README.md index 556cde7da4..f0f6e39820 100644 --- a/packages/subagent/subagent-claude-code/README.md +++ b/packages/subagent/subagent-claude-code/README.md @@ -82,7 +82,7 @@ Independent of the parent request cache. Reuse depends only on Claude Code's own #### What the model sees -Through `dsh-tool-subagent`, a foreground call gives the parent the strict final Claude Code answer or the consumer's exact error for a non-completed result. A background call first returns a Task id; the generic task controls later deliver a bounded completion notice, expose the final answer and status through `task_output`, and let `task_kill` request cancellation. Claude Code reasoning, tool activity, intermediate messages, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. +Through `dsh-tool-subagent`, a foreground call gives the parent the strict final Claude Code answer or the consumer's exact error for a non-completed result. A background call first returns a Task id; the generic task controls later deliver a completion notice, expose the final answer and status through `task_output`, and let `task_kill` request cancellation. Claude Code reasoning, tool activity, intermediate messages, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. #### Token effect diff --git a/packages/subagent/subagent-claude-code/README.zh.md b/packages/subagent/subagent-claude-code/README.zh.md index bda00d7be4..52baee6c11 100644 --- a/packages/subagent/subagent-claude-code/README.zh.md +++ b/packages/subagent/subagent-claude-code/README.zh.md @@ -82,7 +82,7 @@ Claude Code 子任务会在一个全新的 SDK query 中接收独立文本任务 #### 模型看到的内容 -通过 `dsh-tool-subagent`,前台调用会让父级模型看到符合严格成功条件的 Claude Code 最终答案,或者在结果未完成时看到消费方给出的原样错误。后台调用会先返回 Task id;随后通用任务控制面会送达有界完成通知,通过 `task_output` 公开最终答案与状态,并允许 `task_kill` 请求取消。Claude Code 的推理、工具活动、中间消息、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 +通过 `dsh-tool-subagent`,前台调用会让父级模型看到符合严格成功条件的 Claude Code 最终答案,或者在结果未完成时看到消费方给出的原样错误。后台调用会先返回 Task id;随后通用任务控制面会送达完成通知,通过 `task_output` 公开最终答案与状态,并允许 `task_kill` 请求取消。Claude Code 的推理、工具活动、中间消息、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 #### 对 token 的影响 diff --git a/packages/subagent/subagent-codex/README.i18n.yaml b/packages/subagent/subagent-codex/README.i18n.yaml index 9c9c7e8648..5556cc7fac 100644 --- a/packages/subagent/subagent-codex/README.i18n.yaml +++ b/packages/subagent/subagent-codex/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-codex/README.md -README.md: 6a882c128ebd372ee148a4315a237d4eacf6d42b -README.zh.md: beb5411f6a449efc7a45c171d217f98657805740 +README.md: 570a2346b121a3d100600285f225a0906c38aeec +README.zh.md: 9fded2ceb35b276f0c698c937720ea13e13c6acc diff --git a/packages/subagent/subagent-codex/README.md b/packages/subagent/subagent-codex/README.md index 6a882c128e..570a2346b1 100644 --- a/packages/subagent/subagent-codex/README.md +++ b/packages/subagent/subagent-codex/README.md @@ -76,7 +76,7 @@ Independent of the parent request cache. Reuse depends only on Codex's own provi #### What the model sees -Through `dsh-tool-subagent`, a foreground call gives the parent the selected final Codex answer or the consumer's exact error for a non-completed result. A background call first returns a Task id; the generic task controls later deliver a bounded completion notice, expose the final answer and status through `task_output`, and let `task_kill` request cancellation. Codex commentary, reasoning, tool activity, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. +Through `dsh-tool-subagent`, a foreground call gives the parent the selected final Codex answer or the consumer's exact error for a non-completed result. A background call first returns a Task id; the generic task controls later deliver a completion notice, expose the final answer and status through `task_output`, and let `task_kill` request cancellation. Codex commentary, reasoning, tool activity, stderr, workspace diffs, usage, and product ids are not copied into the parent Session. #### Token effect diff --git a/packages/subagent/subagent-codex/README.zh.md b/packages/subagent/subagent-codex/README.zh.md index beb5411f6a..9fded2ceb3 100644 --- a/packages/subagent/subagent-codex/README.zh.md +++ b/packages/subagent/subagent-codex/README.zh.md @@ -76,7 +76,7 @@ Codex 子任务会在一个全新的临时线程中,以单个轮次接收这 #### 模型看到的内容 -通过 `dsh-tool-subagent`,前台调用会让父级模型看到选定的 Codex 最终答案,或者在结果未完成时看到消费方给出的原样错误。后台调用会先返回 Task id;随后通用任务控制面会送达有界完成通知,通过 `task_output` 公开最终答案与状态,并允许 `task_kill` 请求取消。Codex 的过程说明、推理(reasoning)、工具活动、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 +通过 `dsh-tool-subagent`,前台调用会让父级模型看到选定的 Codex 最终答案,或者在结果未完成时看到消费方给出的原样错误。后台调用会先返回 Task id;随后通用任务控制面会送达完成通知,通过 `task_output` 公开最终答案与状态,并允许 `task_kill` 请求取消。Codex 的过程说明、推理(reasoning)、工具活动、stderr、工作区差异、用量信息和产品标识符均不会复制到父会话。 #### 对 token 的影响 diff --git a/packages/subagent/tool-subagent/src/index.ts b/packages/subagent/tool-subagent/src/index.ts index 1e118908c0..c8918d4e7a 100644 --- a/packages/subagent/tool-subagent/src/index.ts +++ b/packages/subagent/tool-subagent/src/index.ts @@ -113,7 +113,9 @@ async function settleStart(start: Promise, signal: AbortSignal): Pr try { return await settleRun(await start) } catch (error: unknown) { - return signal.aborted + // Product providers aggregate startup and rollback failures. Cancellation + // must not turn a failed cleanup into a cleanly killed Task. + return signal.aborted && !(error instanceof AggregateError) ? { status: 'killed' } : { status: 'failed', detail: String(error) } } diff --git a/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts b/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts index 4a36413c7d..21dc48f853 100644 --- a/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts +++ b/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts @@ -939,6 +939,48 @@ describe('dsh-tool-subagent background mode', () => { expect(text(output)).toBe('(no new output)\n[status: killed]') }) + it('reports startup rollback failure after cancellation as a failed task', async () => { + const ctx = await backgroundSetup({ provider: 'mock' }) + const parent = ownerAgent(ctx, 'sess-parent') + ctx.subagents.registerProvider({ + name: 'broken-start-rollback', + capabilities: { outputSchema: false, depthLimit: false, toolFilter: false, persona: false }, + inheritsParentContext: false, + start: request => new Promise((_resolve, reject) => { + request.signal.addEventListener('abort', () => { + reject(new AggregateError( + [new Error('startup aborted'), new Error('cleanup failed')], + 'startup failed and cleanup also failed', + )) + }, { once: true }) + }), + }) + tool.apply(ctx, { provider: 'broken-start-rollback', toolName: 'subagent_broken_rollback' }) + + await ctx.tools.execute({ + signal: testToolSignal, + callId: CallId('broken-rollback-start'), + name: 'subagent_broken_rollback', + arguments: { description: 'broken rollback', prompt: 'p', run_in_background: true }, + agent: parent, + }) + await ctx.tools.execute({ + signal: testToolSignal, + callId: CallId('broken-rollback-kill'), + name: 'task_kill', + arguments: { task_id: 'subagent-1' }, + agent: parent, + }) + const output = await ctx.tools.execute({ + signal: testToolSignal, + callId: CallId('broken-rollback-output'), + name: 'task_output', + arguments: { task_id: 'subagent-1', wait: true }, + agent: parent, + }) + expect(text(output)).toContain('[status: failed, AggregateError: startup failed and cleanup also failed]') + }) + it('forwards task_kill reasons through the run signal (and defaults one when absent)', async () => { // Use a provider that remains live until its signal is aborted. const ctx = await backgroundSetup({ provider: 'mock', agentOptions: { model: 'child-model' } }) From 7c4c118456a3113456e87c666c16a874310258fd Mon Sep 17 00:00:00 2001 From: _Kerman Date: Wed, 12 Aug 2026 22:54:27 +0800 Subject: [PATCH 003/103] fix(web): reclaim overlay scrollbar gutter --- ...-composer-tab-gutter-reservation.i18n.yaml | 4 +- ...6-08-04-composer-tab-gutter-reservation.md | 2 + ...8-04-composer-tab-gutter-reservation.zh.md | 2 + ...-overlay-seat-width-compensation.i18n.yaml | 6 ++ ...omposer-overlay-seat-width-compensation.md | 36 +++++++++ ...oser-overlay-seat-width-compensation.zh.md | 36 +++++++++ apps/web/tests/composer-tab-geometry.e2e.ts | 76 ++++++++++--------- .../geometry.expected.md | 14 ++-- .../skeleton/ConversationRoot.module.css | 21 +++-- .../client/ui-theme/src/styles/scrollbar.css | 5 ++ 10 files changed, 153 insertions(+), 49 deletions(-) create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml index 8a9b6236ae..0082a6f991 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md -2026-08-04-composer-tab-gutter-reservation.md: 3b28c35c1f11676e41cabde76d1b0d16c688f034 -2026-08-04-composer-tab-gutter-reservation.zh.md: c357dd06c52a834c18d2e8a25246d4ad003db548 +2026-08-04-composer-tab-gutter-reservation.md: 2c2813371af073eee4bd80ce7813e77af3c0c319 +2026-08-04-composer-tab-gutter-reservation.zh.md: e450def2482218028875a48fce8842c88b5ba82e diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md index 3b28c35c1f..2c2813371a 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md @@ -2,6 +2,8 @@ Status: implemented +> Superseded for overlay views by [the seat-width compensation](2026-08-12-composer-overlay-seat-width-compensation.md): the overlay branch no longer reserves a gutter, and the seat compensates for the bar instead. Chat keeps the reservation described here. + English | [中文](2026-08-04-composer-tab-gutter-reservation.zh.md) ## Problem diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md index c357dd06c5..e450def248 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md @@ -2,6 +2,8 @@ Status: implemented +> 对覆盖视图已被 [座位宽度补偿](2026-08-12-composer-overlay-seat-width-compensation.md) 取代:覆盖分支不再预留滚动条槽,座位改为补偿滚动条宽度。Chat 仍保留本文所述的预留。 + [English](2026-08-04-composer-tab-gutter-reservation.md) | 中文 ## 问题 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml new file mode 100644 index 0000000000..fd88ecbc93 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md +2026-08-12-composer-overlay-seat-width-compensation.md: 85281ed4301046672ff4c02320b196a397e6d163 +2026-08-12-composer-overlay-seat-width-compensation.zh.md: 7bcf060e651a828068ef207caaebd01fa2ffd7ae diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md new file mode 100644 index 0000000000..85281ed430 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md @@ -0,0 +1,36 @@ +# Agent Note: The overlay composer seat compensates for the bar instead of reserving a gutter + +Status: implemented + +English | [中文](2026-08-12-composer-overlay-seat-width-compensation.zh.md) + +## Problem + +The [composer-tab gutter reservation](2026-08-04-composer-tab-gutter-reservation.md) made the column's scroller reserve a scrollbar gutter unconditionally, so the composer seat measured the same width in Chat and in a view with a composer overlay. The cost was paid by every overlay view: the view's content column ended 8px short of the column's right edge, because the scroller reserved a gutter for a bar it never draws — the trajectory ledger owns its own scrollers and the outer box never scrolls. + +The trajectory table made that cost visible: its full-width row divider lines stopped 8px short of the pane edge, leaving a strip of whitespace at the right of every line and of the whole content column. + +## Decision + +The reservation now belongs to Chat alone. The overlay branch declares `scrollbar-gutter: auto`, so the view's content spans the full column; the overlay composer seat (absolutely positioned against the padding box) gives back the bar's width with `right: var(--dsh-scrollbar-width)`, so the input card still measures the same width as Chat's seat and does not move between tabs. + +The compensation value is not a literal: ui-theme's scrollbar.css defines `--dsh-scrollbar-width` (8px on the WebKit path) beside the `::-webkit-scrollbar` rule it mirrors, and the seat reads that variable. A change to the sheet's bar width reaches the compensation in the same reviewable diff as the bar itself. + +## Alternatives considered + +**Keep the unconditional reservation and shrink every overlay view.** The pre-fix behavior. It keeps one declaration for both tabs but taxes every overlay view with an 8px content column, which the trajectory ledger surfaced as visible whitespace. Rejected because the overlay views own their scrolling; they should not pay for Chat's bar. + +**Reserve on the overlay branch too and let the view bleed into the gutter.** More moving parts for the same result: the gutter would still exist on a box that never scrolls, and the view would have to break out of the content box to reclaim its width. + +**Accept the 4px card shift.** Dropping the reservation without compensating the seat would move the input card on every tab switch, which is exactly the symptom the earlier note fixed. Rejected: the card position is a deliberate cross-tab invariant. + +## Consequences + +- Chat keeps its reserved gutter and its stable card position; nothing changes on that tab. +- Overlay views (trajectory) span the full column; the trajectory ledger's divider lines reach the pane edge. +- The input card still holds one horizontal position across the Chat and Trajectory tabs, now by two mechanisms instead of one: Chat reserves, the overlay seat compensates. +- `--dsh-scrollbar-width` becomes a public ui-theme variable read outside ui-theme; the scrollbar-styles spec's indirection checks only scan `--dsh-scrollbar-thumb{,-hover}` rebinds, so the width variable is not covered by the pair gate. + +## Testing + +`apps/web/tests/composer-tab-geometry.e2e.ts` still asserts the card holds its position across tabs and now also asserts the split: Chat's scroller keeps `scrollbar-gutter: stable` and a nonzero band, while the overlay branch resolves `auto` with a zero band. The control cascade changed with the mechanism: it now drops the seat's `right` compensation (instead of dropping a gutter Chat never had on that branch) and measures the same 4px shift, proving the equal rectangles are not a tab switch that never reached layout. The committed golden records both states. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md new file mode 100644 index 0000000000..7bcf060e65 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md @@ -0,0 +1,36 @@ +# Agent Note: 覆盖视图的 composer 座位改为补偿滚动条宽度,不再预留滚动条槽 + +Status: implemented + +[English](2026-08-12-composer-overlay-seat-width-compensation.md) | 中文 + +## 问题 + +[composer 标签页滚动条槽预留](2026-08-04-composer-tab-gutter-reservation.md) 让会话列滚动容器无条件预留一条滚动条槽,使 composer 座位在 Chat 与带 composer 覆盖的视图中测得相同宽度。代价由每个覆盖视图承担:视图内容列比列右边缘窄 8px,因为滚动容器为一条它从不绘制的滚动条预留了槽——trajectory 台账由视图内部自己的滚动容器滚动,外层盒子从不滚动。 + +trajectory 表格让这个代价显形:整行分隔线在面板右边缘前 8px 处停止,每条线右侧以及整个内容列右侧都留下一条空白带。 + +## 决策 + +预留现在只属于 Chat。覆盖分支声明 `scrollbar-gutter: auto`,视图内容占满整列;覆盖分支的 composer 座位(相对 padding box 绝对定位)用 `right: var(--dsh-scrollbar-width)` 让出滚动条宽度,使输入卡仍与 Chat 座位测得相同宽度,切换标签页时不移动。 + +补偿值不是字面量:ui-theme 的 scrollbar.css 在它镜像的 `::-webkit-scrollbar` 规则旁定义 `--dsh-scrollbar-width`(WebKit 路径 8px),座位读取该变量。样式表滚动条宽度一变,补偿就会与滚动条本身出现在同一次可审阅的 diff 中。 + +## 备选方案 + +**保留无条件预留,压缩每个覆盖视图。** 修复前行为。两个标签页一条声明,但每个覆盖视图都要付出 8px 内容列,trajectory 台账将其显现为可见空白。已拒绝:覆盖视图自己滚动,不应为 Chat 的滚动条买单。 + +**覆盖分支也预留,并让视图渗入滚动条槽。** 同样结果下更多活动部件:从不滚动的盒子上仍存在滚动条槽,视图还得突破内容盒才能取回宽度。 + +**接受 4px 卡片位移。** 去掉预留却不补偿座位,会在每次切换标签页时移动输入卡——正是前一份 note 修复的症状。已拒绝:卡片位置是刻意保持的跨标签页不变量。 + +## 后果 + +- Chat 保留滚动条槽与稳定的卡片位置;该标签页无任何变化。 +- 覆盖视图(trajectory)占满整列;trajectory 台账的分隔线到达面板右边缘。 +- 输入卡在 Chat 与 Trajectory 标签页间仍保持同一水平位置,现在由两种机制而非一种达成:Chat 预留,覆盖座位补偿。 +- `--dsh-scrollbar-width` 成为 ui-theme 对外、且被 ui-theme 之外读取的变量;scrollbar-styles 规格的间接层检查只扫描 `--dsh-scrollbar-thumb{,-hover}` 重绑,宽度变量不受成对门禁覆盖。 + +## 测试 + +`apps/web/tests/composer-tab-geometry.e2e.ts` 仍断言输入卡在标签页间保持位置,并新增断言拆分:Chat 滚动容器保持 `scrollbar-gutter: stable` 与非零槽宽,覆盖分支解析为 `auto` 且槽宽为零。控制级联随机制改变:现在移除座位的 `right` 补偿(而非移除该分支上 Chat 从未有过的槽),测得同样的 4px 位移,证明相等的矩形并非从未到达布局的标签页切换。提交的 golden 记录两种状态。 diff --git a/apps/web/tests/composer-tab-geometry.e2e.ts b/apps/web/tests/composer-tab-geometry.e2e.ts index bb43e20406..b491b1257c 100644 --- a/apps/web/tests/composer-tab-geometry.e2e.ts +++ b/apps/web/tests/composer-tab-geometry.e2e.ts @@ -11,12 +11,13 @@ // gets an absolutely positioned seat instead, laid out against the padding box, // which the scrollbar never reduces. // -// Without a shared reservation the two tabs disagree by exactly the bar's -// width for as long as the transcript overflows: the card jumps sideways on -// every tab switch, and inside Chat alone at the moment a growing transcript -// starts to scroll. The column reserves the gutter unconditionally -// (`scrollbar-gutter: stable`) and states the overlay branch as a scroll -// container on the same axes, so both edges are the same edge. +// The column handles the two edges without reserving the gutter on both: Chat +// keeps `scrollbar-gutter: stable` so its seat's content box never jumps as the +// transcript starts to scroll; the overlay branch does NOT reserve (the view +// owns its own scrollers, so a reserved gutter would only narrow the view's +// content by the bar's width), and the overlay seat instead gives back the +// bar's width (`right: var(--dsh-scrollbar-width)`) so both seats measure the +// same width and the card does not move. // // Only a real engine can show this. The seat's geometry is layout: jsdom gives // every element a zero-sized box and reports no scrollbar at all, so a unit spec @@ -33,12 +34,11 @@ // configuration: ui-theme's scrollbar.css gives `::-webkit-scrollbar` a width, // and a bar that occupies layout space is what the product actually draws. // -// The scenario runs that unreserved cascade in the page — `scrollbar-gutter: auto` -// on the scroller, `overflow: hidden` on the overlay branch — and measures the -// same two tabs through it, which is what keeps the equal rectangles above from -// being explained by a tab switch that never reached the layout. It is the -// reported symptom as a number: the card moves 4px, half the 8px band, on each -// edge. +// The scenario runs that unreserved cascade in the page — the overlay seat's +// `right` compensation dropped to 0 — and measures the same two tabs through +// it, which is what keeps the equal rectangles above from being explained by a +// tab switch that never reached the layout. It is the reported symptom as a +// number: the card moves 4px, half the 8px band, on each edge. // // Zero model calls: a seeded cold session renders from its log, and switching // tabs asks the host for nothing. A stray stream would fail loud with NO_ADAPTER. @@ -62,9 +62,9 @@ const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/composer-tab-geometry', * Absolute coordinates are deliberately absent: they depend on the sidebar's * laid-out width and on font metrics, so committing them would produce a fixture * that has to be re-recorded per platform. What is recorded is the distance - * between the two tabs' rectangles, which is zero when the reservation holds and + * between the two tabs' rectangles, which is zero when the compensation holds and * the bar's width when it does not — including under the control, so the golden - * carries the shift the unreserved cascade produces rather than only its absence. + * carries the shift the uncompensated cascade produces rather than only its absence. */ const GEOMETRY_EXPECTED = join(SNAPSHOT_DIR, 'geometry.expected.md') const MODE = webSnapshotMode() @@ -114,15 +114,15 @@ async function setMeasuredViewport( } /** - * The unreserved cascade, injected into the page: the reservation dropped and - * the overlay branch forced to a hidden box. `!important` beats the module + * The uncompensated cascade, injected into the page: the overlay seat's `right` + * compensation dropped to 0, so it measures the full padding box while Chat's + * seat still rides the reserved content box. `!important` beats the module * rules without a rebuild, and the id lets the control be lifted again in the * same session. */ const CONTROL_STYLE_ID = 'composer-tab-geometry-control' const CONTROL_CSS = ` -[data-conversation-scroll] { scrollbar-gutter: auto !important; } -[data-conversation-scroll]:has([data-conversation-composer-overlay]) { overflow: hidden !important; } +[data-conversation-scroll]:has([data-conversation-composer-overlay]) > [data-composer-seat] { right: 0 !important; } ` /** The column scroller and the input card as the browser lays them out, in one tab. */ @@ -221,9 +221,11 @@ async function compareTabs(page: Page): Promise { } /** - * Run the unreserved cascade in the page for one measurement, then lift it. + * Run the uncompensated cascade in the page for one measurement, then lift it: + * the overlay seat's `right` compensation dropped to 0, so it measures the + * full padding box while Chat's seat still rides the reserved content box. * @param page - the page under test. - * @returns the comparison as the column lays out without the reservation. + * @returns the comparison as the column lays out without the compensation. */ async function compareTabsWithoutReservation(page: Page): Promise { await page.evaluate(({ id, css }) => { @@ -268,7 +270,7 @@ async function openSeededSession(page: Page): Promise { * Render the golden body. * @param wide - comparison at the viewport where the card sits at its width cap. * @param narrow - comparison at the viewport where the card shrinks with the column. - * @param control - comparison at the wide viewport with the reservation removed. + * @param control - comparison at the wide viewport with the compensation removed. * @returns the golden body, without a trailing newline. */ function renderGeometry(wide: TabComparison, narrow: TabComparison, control: TabComparison): string { @@ -291,7 +293,7 @@ function renderGeometry(wide: TabComparison, narrow: TabComparison, control: Tab '', ...section(`Wide viewport (${String(WIDE_VIEWPORT.width)}px, card at its cap)`, wide), ...section(`Narrow viewport (${String(NARROW_VIEWPORT.width)}px, card shrinking with the column)`, narrow), - ...section('Wide viewport, reservation removed in the page (control)', control), + ...section('Wide viewport, seat compensation removed in the page (control)', control), ].join('\n').trimEnd() } @@ -322,22 +324,25 @@ describe('web e2e: input card position across view tabs', () => { await scaffold?.close() }) - it('reserves the same gutter in both tabs while the transcript scrolls', async () => { + it('reserves the gutter in Chat and lets Trajectory own its width', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-tab-geometry-band')) await setMeasuredViewport(page, WIDE_VIEWPORT, false) // Vacuity guard, in two parts. A transcript that does not overflow gives // Chat no scrollbar, and a hidden or overlaid bar gives it no width; either - // would make the tabs agree without the reservation doing anything. + // would make the tabs agree without the compensation doing anything. await expect.poll(async () => (await measureTab(page)).scrolls, { timeout: 10_000 }).toBe(true) const comparison = await compareTabs(page) expect(comparison.chat.band).toBeGreaterThan(0) - // The reservation reaches both states, which is the whole point: the same - // band, on a box that scrolls and on one that only holds a view. + // Chat keeps the unconditional reservation so its seat's content box never + // jumps as the transcript starts to scroll. expect(comparison.chat.gutter).toBe('stable') - expect(comparison.trajectory.gutter).toBe('stable') - expect(comparison.trajectory.band).toBe(comparison.chat.band) + // The overlay branch does NOT reserve: the view owns its own scrollers, so + // a reserved gutter would only narrow the view's content by the bar's + // width. The seat compensates instead, which the next test asserts. + expect(comparison.trajectory.gutter).toBe('auto') + expect(comparison.trajectory.band).toBe(0) // Declared as a scroll container on both axes rather than left to compute: - // `overflow: hidden` would drop the reservation in WebKit, and a `visible` + // `overflow: hidden` would drop any reservation in WebKit, and a `visible` // horizontal axis computes to `auto` beside a scrolling one. expect(comparison.trajectory.overflowY).toBe('auto') expect(comparison.trajectory.overflowX).toBe('hidden') @@ -378,20 +383,21 @@ describe('web e2e: input card position across view tabs', () => { expect(tripwire.pageErrors).toEqual([]) }, 60_000) - it('moves the card again once the reservation is removed in the page', async () => { + it('moves the card again once the seat compensation is removed in the page', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-tab-geometry-control')) await setMeasuredViewport(page, WIDE_VIEWPORT, false) // The control: without it, equal rectangles could also mean the tab switch - // never reached the layout. Under the unreserved cascade the Chat scroller - // keeps its bar and the Trajectory branch becomes a hidden box with none, - // and the card moves by half the band on each edge. + // never reached the layout. Under the unreserved cascade the overlay seat + // loses its `right` compensation and measures the full padding box, so the + // card moves by half the band on each edge. Chat's own reservation is + // untouched — that is the side that must not change. const comparison = await compareTabsWithoutReservation(page) - expect(comparison.chat.gutter).toBe('auto') + expect(comparison.chat.gutter).toBe('stable') expect(comparison.chat.band).toBeGreaterThan(0) expect(comparison.trajectory.band).toBe(0) expect(comparison.leftShift).toBe(comparison.chat.band / 2) expect(comparison.rightShift).toBe(comparison.chat.band / 2) - // Restoring the sheet restores the reservation, so the control cannot leak + // Restoring the sheet restores the compensation, so the control cannot leak // into the remaining measurements. const restored = await compareTabs(page) expect(restored.leftShift).toBe(0) diff --git a/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md b/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md index 9735019508..e95adaaa6f 100644 --- a/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md +++ b/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md @@ -5,9 +5,9 @@ - Chat: scrollbar-gutter stable, overflow hidden/auto - Chat scroller scrolls: true - Chat reserved band: 8px -- Trajectory: scrollbar-gutter stable, overflow hidden/auto +- Trajectory: scrollbar-gutter auto, overflow hidden/auto - Trajectory scroller scrolls: false -- Trajectory reserved band: 8px +- Trajectory reserved band: 0px - input card left edge moves between tabs: 0px - input card right edge moves between tabs: 0px - input card width changes between tabs: 0px @@ -17,19 +17,19 @@ - Chat: scrollbar-gutter stable, overflow hidden/auto - Chat scroller scrolls: true - Chat reserved band: 8px -- Trajectory: scrollbar-gutter stable, overflow hidden/auto +- Trajectory: scrollbar-gutter auto, overflow hidden/auto - Trajectory scroller scrolls: false -- Trajectory reserved band: 8px +- Trajectory reserved band: 0px - input card left edge moves between tabs: 0px - input card right edge moves between tabs: 0px - input card width changes between tabs: 0px -## Wide viewport, reservation removed in the page (control) +## Wide viewport, seat compensation removed in the page (control) -- Chat: scrollbar-gutter auto, overflow hidden/auto +- Chat: scrollbar-gutter stable, overflow hidden/auto - Chat scroller scrolls: true - Chat reserved band: 8px -- Trajectory: scrollbar-gutter auto, overflow hidden/hidden +- Trajectory: scrollbar-gutter auto, overflow hidden/auto - Trajectory scroller scrolls: false - Trajectory reserved band: 0px - input card left edge moves between tabs: 4px diff --git a/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css b/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css index 1b72470feb..c6618fc624 100644 --- a/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css +++ b/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css @@ -272,12 +272,17 @@ .scrollBody:has([data-conversation-composer-overlay]) { position: relative; /* A clipping box nothing scrolls out of, stated as a scroll container on both - axes rather than `overflow: hidden`: WebKit honours the reservation above - only in the `overflow-y: auto` form, and a single-axis scroller computes - the other axis to `auto` - ([decision](../../../../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md)). */ + axes rather than `overflow: hidden`: a single-axis scroller computes the + other axis to `auto`, and the seat's absolute positioning below needs the + box to stay a containing block in every engine. */ overflow-x: hidden; overflow-y: auto; + /* The view owns its own scrollers (the trajectory ledger scrolls inside the + view), so this box never scrolls here; reserving a gutter would only + narrow the view's content by the bar's width. Chat keeps the reservation + on the same element, so the seat below compensates with the bar's width + ([decision](../../../../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md)). */ + scrollbar-gutter: auto; } .scrollBody:has([data-conversation-composer-overlay]) > .viewArea { @@ -288,7 +293,13 @@ .scrollBody:has([data-conversation-composer-overlay]) > .composerSeat { position: absolute; - right: 0; + /* Chat's seat rides this box's content box, which its own scrolling shortens + by the bar's width; the overlay seat is against the padding box, so it + must give back the same width to keep the input card in place across + tabs. Reads ui-theme's --dsh-scrollbar-width, which mirrors the WebKit + bar's layout width; Firefox's thin bar resolves to the same 8px on the + platforms this app targets, so the compensation holds there too. */ + right: var(--dsh-scrollbar-width); bottom: 0; left: 0; } diff --git a/packages/client/ui-theme/src/styles/scrollbar.css b/packages/client/ui-theme/src/styles/scrollbar.css index 31b5a8aabe..71f67d4f57 100644 --- a/packages/client/ui-theme/src/styles/scrollbar.css +++ b/packages/client/ui-theme/src/styles/scrollbar.css @@ -17,6 +17,11 @@ body { --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l1); --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l1); + /* The WebKit bar's layout width, mirrored by the ::-webkit-scrollbar rule + below. A surface that must align itself beside a space-consuming bar + (ConversationRoot's overlay composer seat) reads this instead of + hardcoding the number. */ + --dsh-scrollbar-width: 8px; } /* The two paths are mutually exclusive, and the gate is load-bearing rather From de97ea0ba8d40b1c81b81e15a1f6f8a691edb8b3 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Wed, 12 Aug 2026 22:54:38 +0800 Subject: [PATCH 004/103] fix(sidebar): synchronize collapsed rail motion --- ...psed-sidebar-shared-entry-motion.i18n.yaml | 6 ++++ ...2-collapsed-sidebar-shared-entry-motion.md | 33 +++++++++++++++++ ...ollapsed-sidebar-shared-entry-motion.zh.md | 33 +++++++++++++++++ .agents/notes/archived/manifest.json | 3 ++ packages/client/ui-sidebar/README.i18n.yaml | 4 +-- packages/client/ui-sidebar/README.md | 2 ++ packages/client/ui-sidebar/README.zh.md | 2 ++ .../src/client/SidebarRoot.module.css | 35 +++++++++++++------ .../ui-sidebar/src/client/SidebarRoot.tsx | 13 +++---- .../tests/sidebar-styles.client.spec.ts | 28 +++++++++++++-- packages/client/ui-workspace/README.i18n.yaml | 4 +-- packages/client/ui-workspace/README.md | 2 +- packages/client/ui-workspace/README.zh.md | 2 +- .../src/client/WorkspaceBrowser.module.css | 4 ++- .../src/client/WorkspaceBrowser.tsx | 10 +++--- .../tests/browser-styles.client.spec.ts | 6 ++++ 16 files changed, 157 insertions(+), 30 deletions(-) create mode 100644 .agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml create mode 100644 .agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md create mode 100644 .agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md diff --git a/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml new file mode 100644 index 0000000000..971bc98a0c --- /dev/null +++ b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md +2026-08-12-collapsed-sidebar-shared-entry-motion.md: c5bc18973db693cf9ba60800fbcf7720593dbad5 +2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md: b87ef6322d548061cc2e29c0e8f9896098c09041 diff --git a/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md new file mode 100644 index 0000000000..c5bc18973d --- /dev/null +++ b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md @@ -0,0 +1,33 @@ +# Agent Note: Collapsed sidebar upper controls share one entry motion + +Status: implemented +Archived: 2026-08-12 + +English | [中文](2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md) + +## Problem + +The collapsed sidebar rail renders four upper controls owned by two packages: the shell owns the toggle and New Session, while the workspace region owns add and search. Their opacity timing matched, but their geometry did not. Right-aligned controls moved with the narrowing column while left-aligned controls stayed fixed, so add appeared slower than search even under the same fade. + +The bottom settings control has a different role. It is pinned to the rail foot and must not join the upper controls' horizontal entry. + +## Decision + +At the rail settle point, the four upper 36px controls start from one left-anchored layout and share one `150ms` animation from `translateX(49px)` to their final 10px inset. The shell applies the translation to its toggle and New Session seats and once to the workspace region, so add and search inherit the same path without nested transforms. Opacity uses the same animation timeline. + +The settings seat uses a separate opacity-only keyframe with the same duration and easing. A page that starts collapsed renders the rail without an entry animation, and reduced-motion mode disables both keyframes. + +## Alternatives considered + +**Keep every rail control fixed at its final inset.** This removes the mismatch, but it also removes the requested horizontal entry from the four upper controls. + +**Animate each workspace button independently.** This would duplicate shell timing inside `ui-workspace` and could apply both a region and child transform. Translating the registered region once keeps animation ownership in the sidebar shell. + +**Translate the settings control with the upper controls.** Rejected because settings is a bottom-pinned foot action, not part of the upper control sequence. + +## Consequences + +- Toggle, New Session, add, and search follow the same horizontal coordinates throughout collapse. +- Settings fades at its final horizontal coordinate. +- Static collapsed renders retain their final geometry without startup motion. +- Style tests pin the shared animation assignments, translation distance, base anchors, and settings exception. diff --git a/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md new file mode 100644 index 0000000000..b87ef6322d --- /dev/null +++ b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md @@ -0,0 +1,33 @@ +# Agent Note: 收起侧栏的上方控件共用同一进入动画 + +Status: implemented +Archived: 2026-08-12 + +[English](2026-08-12-collapsed-sidebar-shared-entry-motion.md) | 中文 + +## Problem + +收起侧栏轨道的四个上方控件由两个包渲染:外壳持有侧栏切换与新建会话,Workspace 区域持有添加和搜索。它们的透明度时序相同,但几何行为不同。右对齐控件会随栏变窄而移动,左对齐控件则保持不动,因此添加即使使用相同淡入,视觉上仍比搜索慢。 + +底部设置控件承担不同角色。它固定在轨道页脚,不能参与上方控件的横向进入。 + +## Decision + +轨道落位时,四个 36px 上方控件从同一个左对齐布局开始,共用一段 `150ms` 动画,从 `translateX(49px)` 移动到最终 10px 内边距。外壳把位移分别应用于侧栏切换、新建会话,并只对 Workspace 区域应用一次,因此添加与搜索会继承同一路径,不产生嵌套变换。透明度使用同一条动画时间线。 + +设置控件使用时长与缓动相同、但只改变透明度的独立关键帧。页面初始即为收起状态时不会播放进入动画;减少动态效果模式会禁用两段关键帧。 + +## Alternatives considered + +**把每个轨道控件固定在最终内边距。** 这能消除不一致,但也会移除四个上方控件所需的横向进入效果。 + +**分别为每个 Workspace 按钮添加动画。** 这会在 `ui-workspace` 中重复外壳时序,还可能同时应用区域与子控件变换。只移动一次已注册区域,可以让动画继续由侧栏外壳持有。 + +**让设置控件随上方控件一起移动。** 不予采纳,因为设置是固定在底部的页脚操作,不属于上方控件序列。 + +## Consequences + +- 侧栏切换、新建会话、添加与搜索在整个收起过程中使用相同横坐标。 +- 设置在最终横坐标上淡入。 +- 静态收起渲染保持最终几何,不播放启动动画。 +- 样式测试固定共用动画分配、位移距离、基础锚点与设置例外。 diff --git a/.agents/notes/archived/manifest.json b/.agents/notes/archived/manifest.json index a8377c346f..f8786470c7 100644 --- a/.agents/notes/archived/manifest.json +++ b/.agents/notes/archived/manifest.json @@ -97,6 +97,9 @@ "bug-fix/2026-08-10-web-favicon-dark-mode.i18n.yaml": "sha256:859c4399f9a017a68ba89552fdafa05e73c0599d94cee9551c84ea5b749a14f3", "bug-fix/2026-08-10-web-favicon-dark-mode.md": "sha256:4d17e247abd76ae3aed5fb4e075fd66a2838292f89f7021c82a79fe37ed905e6", "bug-fix/2026-08-10-web-favicon-dark-mode.zh.md": "sha256:7bbff8a3b7061c127afcc75cd2a8043b02a999b78c0180edd8f7e4807fcfe71d", + "bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml": "sha256:3ce4f6e39e173fc304bf64deca9c95bcddc1dbb492e065ca8c267a7a40788588", + "bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md": "sha256:7b169aa4543edfc965de5a8b7b9e60aa9d9d5218693cd0b57908e2d482280723", + "bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md": "sha256:88db36c698800bf55c3c7531d6f92665576d978c29c15ff7d74215fb93376cb1", "feature/2026-06-14-acp-agent-client-protocol.i18n.yaml": "sha256:006795baa43ae962a8d125cc0f1e9f134bc2ee9fb758b6e7669e3fa0126e1918", "feature/2026-06-14-acp-agent-client-protocol.md": "sha256:6828c0af74bb3fb96206ca6b21c0e56a000b50e4744aad4bc2c05092f3a5a31b", "feature/2026-06-14-acp-agent-client-protocol.zh.md": "sha256:ba104e841a1fb84edbd3b6c8119d50445b7785255a7a8d13bb9ac8a2cb4d2e69", diff --git a/packages/client/ui-sidebar/README.i18n.yaml b/packages/client/ui-sidebar/README.i18n.yaml index 562396d88f..ac3531b205 100644 --- a/packages/client/ui-sidebar/README.i18n.yaml +++ b/packages/client/ui-sidebar/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-sidebar/README.md -README.md: 9974118f69901de985e012e1b62f95a0bcee64c2 -README.zh.md: 11b0aa142cf62626ab6105e2c405d506e35349b0 +README.md: 7cc4fe0a722fe5f8cf0e983a0e3fdb30cd31bb64 +README.zh.md: 96b6f60f871758c126e6c387c6ce3f0993039af0 diff --git a/packages/client/ui-sidebar/README.md b/packages/client/ui-sidebar/README.md index 9974118f69..7cc4fe0a72 100644 --- a/packages/client/ui-sidebar/README.md +++ b/packages/client/ui-sidebar/README.md @@ -8,6 +8,8 @@ New Session starts the runtime's page-local frontend Session Intent. The runtime `SidebarRootComponentProps` composes the layout owner share, the global `useSessions` and `useWorkspaces` hooks, the declared `sidebar.workspaces` and `sidebar.settings` child slots, and injected `startSession` plus sidebar-toggle callbacks. There is no plugin store. +During a live collapse, the shell holds the expanded content at its current width while it fades out for 150ms. The four upper controls—the shell toggle and New Session plus add and search rendered through `sidebar.workspaces`—then share one 150ms fade and 49px leftward translation into the 56px rail, ending with the layout's 300ms column slide; every 36px control box follows the same path to the rail's 10px left inset. The bottom-pinned `sidebar.settings` control shares the fade timing but has no horizontal translation. A page that starts collapsed renders the rail statically, and reduced-motion mode disables both transitions. + Scrollbars in the column are a pointer affordance: the shell rebinds ui-theme's [scrollbar indirection](../ui-theme/README.md) to `transparent` whenever the pointer is outside it, and keeps the thumb drawn for 2s after the pointer leaves, so a list nobody is pointing at carries no bar. The reservation that keeps rows from moving belongs to the scrolling region ([ui-workspace](../ui-workspace/README.md)), so revealing a thumb never reflows. The foot is the `sidebar.settings` seat: the sidebar renders only the bottom-pinned layout slot and shares its column state (`wide`); ui-settings registers the trigger row and settings panel there. diff --git a/packages/client/ui-sidebar/README.zh.md b/packages/client/ui-sidebar/README.zh.md index 11b0aa142c..96b6f60f87 100644 --- a/packages/client/ui-sidebar/README.zh.md +++ b/packages/client/ui-sidebar/README.zh.md @@ -8,6 +8,8 @@ New Session 会启动运行时的页面局部前端 Session Intent。运行时 `SidebarRootComponentProps` 组合布局 owner share、全局 `useSessions` 和 `useWorkspaces` 钩子、已声明的 `sidebar.workspaces` 与 `sidebar.settings` 子 slot,以及注入的 `startSession` 与侧边栏切换回调。这里没有插件 store。 +实时收起时,外壳会把展开内容固定在当前宽度,并用 150ms 将其淡出。随后,上方四个控件——外壳的侧栏切换与新建会话,以及通过 `sidebar.workspaces` 渲染的添加和搜索——共用一次 150ms 的淡入和 49px 左移,在布局的 300ms 栏滑动结束时一起进入 56px 轨道;每个 36px 控件盒都会沿同一条路径到达轨道左侧 10px 的内边距。固定在底部的 `sidebar.settings` 控件只共用淡入时序,不发生横向位移。页面初始即为收起状态时会静态渲染轨道;减少动态效果模式会禁用两段过渡。 + 栏内的滚动条是一种指针可供性:只要指针不在栏内,外壳就把 ui-theme 的[滚动条间接层](../ui-theme/README.md)重新绑定为 `transparent`;指针离开后滑块再保留 2 秒,因此没人指向的列表不会带着滚动条。避免行位移的空间预留属于滚动区域本身([ui-workspace](../ui-workspace/README.md)),所以显示滑块不会引起重排。 页脚承载 `sidebar.settings`:侧边栏只渲染固定在底部的布局 slot,并共享其栏状态(`wide`);ui-settings 在此注册触发行和设置面板。 diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css index 17333b5ccc..a0740d50fa 100644 --- a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css +++ b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css @@ -58,24 +58,35 @@ from { opacity: 0; } } -/* Rail controls hold hidden while the column slides shut, then fade in over - the slide's tail: .railIn applies at settle (150ms into the 0.3s AppFrame - track transition), so a 100ms delay + 150ms fade starts just before the - slide ends (250ms) and finishes at 400ms; `backwards` keeps them at - opacity 0 through the delay. Only a live collapse gets .railIn — a - refresh straight into the collapsed state renders statically. */ +/* At the 150ms rail settle, the four upper controls enter from the former + rail right edge over the remaining 150ms of the AppFrame track transition. + The bottom-pinned settings seat shares their opacity timeline but stays + horizontally fixed. Only a live collapse gets .railIn; a cold collapsed + render stays static. */ .railIn .iconButton, .railIn .newSession, +.railIn .regionArea { + animation: rail-in 150ms var(--ds-ease-in-out) backwards; +} + .railIn .footArea { - animation: rail-in 150ms var(--ds-ease-in-out) 100ms backwards; + animation: rail-fade-in 150ms var(--ds-ease-in-out) backwards; } @keyframes rail-in { + from { + opacity: 0; + transform: translateX(49px); + } +} + +@keyframes rail-fade-in { from { opacity: 0; } } -/* Logo row (figma pad (4,8,4,8)): brand left, panel toggle right-anchored — - the toggle is the rail's expand control and slides in with the right edge. */ +/* Logo row (figma pad (4,8,4,8)): expanded keeps the panel toggle at the + right edge; the rail gives every control the same base left anchor before + the shared entry translation is applied. */ .logoRow { flex: none; display: flex; @@ -93,6 +104,7 @@ height: 36px; padding: 0; margin-bottom: 12px; + justify-content: flex-start; } /* Brand group (figma I133:7632): the full wordmark rides the text ink @@ -185,6 +197,8 @@ } .collapsed .newSession { + align-self: flex-start; + width: 36px; height: 36px; padding: 0; margin: 0 0 12px; @@ -239,7 +253,8 @@ .fading > *, .railIn .iconButton, .railIn .newSession, - .railIn .footArea { + .railIn .footArea, + .railIn .regionArea { transition: none; animation: none; } diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx index f464066f56..5f392f93b3 100644 --- a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx +++ b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx @@ -2,12 +2,13 @@ * Sidebar shell: column geometry only. Collapse is a slide plus crossfade: * content freezes at its expanded width (inline style) and fades out in place * while the sliding column (AppFrame grid tracks) clips it — nothing reflows - * mid-slide. At settle the wide-only content unmounts and the control rows - * snap to the 56px rail (one icon each, same top-down order) fading in as the - * slide ends. The workspace/session browsing region between the New Session - * button and the foot is the `sidebar.workspaces` registrant's, and the foot - * is the `sidebar.settings` registrant's; the shell hands them the wide flag - * (plus an expand request callback for the browser). + * mid-slide. At settle the wide-only content unmounts and the four upper + * controls enter the 56px rail from the same horizontal offset (one icon each, + * same top-down order) on one fade that ends with the slide. The bottom-pinned + * settings control only fades. The workspace/session browsing region between + * the New Session button and the foot is the `sidebar.workspaces` registrant's, + * and the foot is the `sidebar.settings` registrant's; the shell hands them the + * wide flag (plus an expand request callback for the browser). * * The column also owns whether the scroll regions nested in it draw a * scrollbar at all: the shell tracks the pointer and rebinds ui-theme's diff --git a/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts b/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts index c4abce1911..19e7a54380 100644 --- a/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts +++ b/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts @@ -1,4 +1,4 @@ -/** Sidebar shell inset contract shared with the nested workspace browser. */ +/** Sidebar shell style contracts shared with its slot-owned controls. */ import { readFileSync } from 'node:fs' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' @@ -25,7 +25,7 @@ function declarations(selector: string): Map | undefined { return undefined } -describe('SidebarRoot.module.css inset', () => { +describe('SidebarRoot.module.css', () => { it('shares and cancels the wide shell trailing padding structurally', () => { const root = declarations('.root') expect(root?.get('--dsh-sidebar-inline-padding')).toBe('12px') @@ -39,4 +39,28 @@ describe('SidebarRoot.module.css inset', () => { expect(declarations('.collapsed .regionArea')?.get('padding-left')).toBe('0') expect(declarations('.collapsed .regionArea')?.get('margin-right')).toBe('0') }) + + it('moves the four upper controls while the settings seat only fades', () => { + const animation = 'rail-in 150ms var(--ds-ease-in-out) backwards' + for (const selector of [ + '.railIn .iconButton', + '.railIn .newSession', + '.railIn .regionArea', + ]) { + expect(declarations(selector)?.get('animation')).toBe(animation) + } + expect(declarations('.railIn .footArea')?.get('animation')).toBe( + 'rail-fade-in 150ms var(--ds-ease-in-out) backwards', + ) + expect(css).toMatch( + /@keyframes rail-in\s*\{\s*from\s*\{\s*opacity: 0;\s*transform: translateX\(49px\);\s*}\s*}/, + ) + expect(css).toMatch(/@keyframes rail-fade-in\s*\{\s*from\s*\{\s*opacity: 0;\s*}\s*}/) + }) + + it('gives shell rail controls the same base anchor for their shared translation', () => { + expect(declarations('.collapsed .logoRow')?.get('justify-content')).toBe('flex-start') + expect(declarations('.collapsed .newSession')?.get('align-self')).toBe('flex-start') + expect(declarations('.collapsed .newSession')?.get('width')).toBe('36px') + }) }) diff --git a/packages/client/ui-workspace/README.i18n.yaml b/packages/client/ui-workspace/README.i18n.yaml index 7a50937c41..6d5eff023b 100644 --- a/packages/client/ui-workspace/README.i18n.yaml +++ b/packages/client/ui-workspace/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-workspace/README.md -README.md: 9d7d4d77cc064146f1fdaed615509215c64308fc -README.zh.md: ca35d7cd2e7ff176f4ea40d1e9a3a6d1a7457462 +README.md: 8878aa49dcccd60ddcde5f0a9563bbfbd969c9c0 +README.zh.md: c83f1c53d5471dd8d52b933163a573eb98a70c2e diff --git a/packages/client/ui-workspace/README.md b/packages/client/ui-workspace/README.md index 9d7d4d77cc..8878aa49dc 100644 --- a/packages/client/ui-workspace/README.md +++ b/packages/client/ui-workspace/README.md @@ -6,7 +6,7 @@ Shared Workspace browser and picker plugin. `WorkspaceBrowser` fills the sidebar The browser renders grouped or flat Session rows from the global runtime hooks and owns Workspace add/rename/reorder plus Session reorder. A Workspace remembers whether it is closed or showing Sessions; an open Workspace shows five Sessions by default, offers a transient **Show more** control for the remainder, and returns to five after the whole Workspace is closed and reopened. Creating a Session from a Workspace row first opens that group so the new row remains visible when the Session state arrives. Once the Workspace list baseline is ready, browser-persisted expansion and Session-order records retain only current Workspace ids plus Ungrouped and the flat-list account. View options combine grouping with one browser-persisted Session order per account: real Workspaces initialize from `WorkspaceView.sessionIds`, while Ungrouped and the cross-Workspace flat list initialize from recency. **Manual** and **Last updated** apply in either presentation. Entering Last updated performs a complete recency sort and later user prompts or steers promote their Session once, while entering Manual preserves every current position and disables later promotion. Dragging edits the current order in either mode; Manual-mode drags for real Workspaces also update the Host Session account, while Ungrouped and flat-list orders remain browser-local because neither has one Workspace account. Flat rows omit the empty leading status slot because they have no parent hierarchy, but retain it when a Session status is visible. Workspace drag order is Host-durable in either Session order mode. -Collapsed search is one header action beside the view and add actions. Activating it expands the field across the header; an outside click collapses only a query that is empty after trimming, while the clear control always resets and collapses it. A non-blank search query replaces either browsing mode with one flat result list: case-insensitive title and Workspace substring matches appear immediately, while a 250 ms debounced Host request adds ranked current-conversation content matches and snippets. The English search input and its defensive request path remove NUL, cap the query at the wire schema's 500 UTF-16 code units without splitting a surrogate pair, and preserve the existing debounce and cancellation behavior. Each new query aborts the preceding request; a failed content search leaves metadata matches visible with a warning. The list is capped at 20, asks the user to narrow broader queries, and opens the selected Session without clearing the query or jumping to a specific event. +Collapsed search is one header action beside the view and add actions. In the rail, add and search render as 36px controls on the shell's shared horizontal entry path. Activating search expands the field across the header; an outside click collapses only a query that is empty after trimming, while the clear control always resets and collapses it. A non-blank search query replaces either browsing mode with one flat result list: case-insensitive title and Workspace substring matches appear immediately, while a 250 ms debounced Host request adds ranked current-conversation content matches and snippets. The English search input and its defensive request path remove NUL, cap the query at the wire schema's 500 UTF-16 code units without splitting a surrogate pair, and preserve the existing debounce and cancellation behavior. Each new query aborts the preceding request; a failed content search leaves metadata matches visible with a warning. The list is capped at 20, asks the user to narrow broader queries, and opens the selected Session without clearing the query or jumping to a specific event. The picker lists real Host Workspace entities through the global `useWorkspaces` hook. Selecting a Workspace invokes the slot owner's `onPick` callback to retarget the frontend Session object. Distinct canonical paths remain separate id-keyed Workspaces when their basenames and display titles match; the sidebar hover detail exposes the full path. Each registration declares a **directory-flow child hole** (`single` kind: `conversation.hero.workspace.directoryFlow` / `sidebar.workspaces.directoryFlow`) that the composed picker package's client half fills with its picking interaction — the [`-native`](../../host/directory-picker-native/README.md) backend's renderless OS-chooser driver today, an in-app browsing dialog under a `-browse` composition. The flat **Add workspace...** action renders only while the surface's hole is occupied (occupancy read per menu render; an empty hole means the composition has no picking affordance — the seam's documented no-flow default, under which the sidebar header drops its add button rather than offering a dead one). This package owns the trigger and the adoption: the occupant reports one picked path per open through the hole's owner conversation (`open`/`busy`/`onPicked`/`onCancel`/`onError`), and the owner adopts it through the object layer, selecting the committed Workspace only after its list projection has refreshed; cancellation is silent, and errors land in the retryable folder dialog whose **Choose again** reopens the flow. Adding has exactly one route: the occupant's own create-folder affordance already covers a brand-new directory, so no separate create-by-name dialog exists. A menu only appears where there is something to choose between — with no Workspace listed, the anchor gesture raises the flow directly instead of a one-row popover, and it waits for the list baseline before treating an empty list as final. The runtime Session and Workspace services own materialization. The Workspace row's Delete action opens a confirmation that states the retention boundary, blocks duplicate submission, and keeps failures open; success removes the group while its Sessions remain under Ungrouped. The Session row's Rename action opens the same browser-owned dialog pattern prefilled with the row's display title: no client-side conflict rule exists (the host normalizes and may reject with `title-invalid`, rendered in the dialog alert), and confirming an unchanged title is deliberately allowed — it pins the current automatic title against regeneration. The Session row's Archive action commits without a confirmation dialog (non-destructive: the log and the workspace accounting slot remain) through `ctx.workspaces.archiveSession`; the row disappears from every grouping surface — workspace groups, Ungrouped, content search, and the flat list — when the archive-set echo lands, and failures are console diagnostics that leave the tree unchanged. A blank New Session row is a pure placeholder: it renders no row menu and no time label (nothing has happened in it yet), so rename, fork, and archive first apply once the first prompt lands. diff --git a/packages/client/ui-workspace/README.zh.md b/packages/client/ui-workspace/README.zh.md index ca35d7cd2e..c83f1c53d5 100644 --- a/packages/client/ui-workspace/README.zh.md +++ b/packages/client/ui-workspace/README.zh.md @@ -6,7 +6,7 @@ 该浏览器通过全局运行时钩子将 Session 行渲染为分组或扁平形式,并负责 Workspace 添加/重命名/重排序以及 Session 重排序。每个 Workspace 会记住自身是关闭还是显示 Session;打开后默认显示五条 Session,其余条目通过临时的**展开其余**控件显示,而关闭并重新打开整个 Workspace 后会恢复为五条。从 Workspace 行创建 Session 时会先打开该分组,使 Session 状态到达后新行保持可见。Workspace 列表基线就绪后,浏览器持久化的展开状态与 Session 顺序记录只保留当前 Workspace id、Ungrouped 和单列表记账。视图选项把分组方式和每个记账各自的一份浏览器持久化 Session 顺序放在一起:真实 Workspace 从 `WorkspaceView.sessionIds` 初始化,Ungrouped 和跨 Workspace 的单列表则从最近更新时间顺序初始化。**手动排序**和**最近更新**在两种呈现方式下都可用。进入最近更新时会执行一次完整的时间排序,后续 user prompt 或 steer 会将对应 Session 置顶一次;进入手动排序则保留所有当前位置并停用后续置顶。两种模式下的拖拽都会编辑当前顺序;真实 Workspace 在手动模式下的拖拽还会更新 Host Session 记账,而 Ungrouped 和单列表因没有单一 Workspace 记账,其顺序始终只保存在浏览器本地。单列表没有父级层次,因此不显示空的左侧状态槽;Session 存在可见状态时仍保留该槽。无论采用哪种 Session 顺序,Workspace 拖拽顺序都由 Host 持久化。 -折叠搜索是视图和添加操作旁的一枚区头按钮。激活后,输入框会扩展并占据区头;点击外部只会收起经清除首尾空白后为空的查询,而清除控件总会重置并收起搜索。非空白查询会以单一扁平结果列表替代任一浏览模式:不区分大小写的标题和 Workspace 子串匹配项会立即显示,经 250 ms 防抖的 Host 请求则会加入经过排序的当前对话内容匹配项及其摘要片段。英文搜索输入框及其防御性请求路径会移除 NUL,将查询限制在传输 schema 规定的 500 个 UTF-16 代码单元内且不会拆分代理项对,并保留现有的防抖与取消行为。每次新查询都会中止前一个请求;内容搜索失败时,元数据匹配项仍会显示,同时给出警告。列表最多显示 20 条结果,并会在查询过宽时提示用户缩小范围;打开所选 Session 时既不会清除查询,也不会跳转至特定事件。 +折叠搜索是视图和添加操作旁的一枚区头按钮。在轨道中,添加和搜索会渲染为沿外壳共用横向进入路径移动的 36px 控件。激活搜索后,输入框会扩展并占据区头;点击外部只会收起经清除首尾空白后为空的查询,而清除控件总会重置并收起搜索。非空白查询会以单一扁平结果列表替代任一浏览模式:不区分大小写的标题和 Workspace 子串匹配项会立即显示,经 250 ms 防抖的 Host 请求则会加入经过排序的当前对话内容匹配项及其摘要片段。英文搜索输入框及其防御性请求路径会移除 NUL,将查询限制在传输 schema 规定的 500 个 UTF-16 代码单元内且不会拆分代理项对,并保留现有的防抖与取消行为。每次新查询都会中止前一个请求;内容搜索失败时,元数据匹配项仍会显示,同时给出警告。列表最多显示 20 条结果,并会在查询过宽时提示用户缩小范围;打开所选 Session 时既不会清除查询,也不会跳转至特定事件。 该选择器通过全局 `useWorkspaces` hook 列出真实的 Host Workspace 实体。选择 Workspace 会调用 slot owner 的 `onPick` 回调,重新定位前端 Session 对象。不同的规范化路径即使 basename 和显示标题相同,仍会作为由 id 区分的独立 Workspace;侧边栏的悬停详情会显示完整路径。每个注册各自声明一个**目录流子 slot**(`single` kind:`conversation.hero.workspace.directoryFlow`/`sidebar.workspaces.directoryFlow`),由组合的选择器包 client half 填入其选取交互——今天是 [`-native`](../../host/directory-picker-native/README.md) 后端的无渲染 OS 选择器驱动,`-browse` 组合下则是应用内浏览对话框。平铺显示的 **添加工作区…** 操作仅在当前界面的 slot 被占用时渲染(每次菜单渲染读取占用状态;slot 为空意味着该组合没有目录选择能力——seam 文档化的无流程默认行为,此时侧边栏区头直接不渲染添加按钮,而非留下一个点了没反应的按钮)。本包持有触发与接纳:占用方通过 slot 的属主交互约定(`open`/`busy`/`onPicked`/`onCancel`/`onError`)每次打开上报一个所选路径,owner 通过对象层接纳它,并等待 Workspace 列表投影刷新后才选中已提交的 Workspace;取消操作不会显示提示,错误落入可重试的文件夹对话框,其 **重新选择** 会重新打开流程。添加只有一条路径:占用者自带的新建文件夹能力已经覆盖了全新目录,因此不再单设按名称创建的对话框。菜单只在确有多个目标可选时出现——没有 Workspace 可列时,锚点手势直接拉起流程,而不是弹出只有一行的浮层;在列表基线落地前,空列表不算最终结果。运行时 Session 与 Workspace 服务负责物化。Workspace 行内的 Delete 操作会打开确认框,说明保留边界、阻止重复提交,并在失败时保持打开;成功后,该分组会被移除,其 Session 则留在 Ungrouped 下。Session 行内的 Rename 操作打开同款浏览器持有的对话框,并以该行的显示标题预填:客户端不设名称冲突规则(host 负责规范化,可能以 `title-invalid` 拒绝,错误渲染在对话框告警区);确认未修改的标题是有意允许的——这正是把当前自动标题钉住、不再被重新生成覆盖的手势。Session 行内的 Archive 操作不经确认对话框直接提交(非破坏性:日志和 workspace 记账席位保持不变),通过 `ctx.workspaces.archiveSession` 归档;归档集合回声落地后,该行从所有分组视图——workspace 分组、Ungrouped、内容搜索和平铺列表——中消失,失败只作为控制台诊断输出,树保持不变。空白的「新会话」行只是占位符:不渲染行菜单和时间标签(其中还没有发生任何事),重命名、fork 和归档都从首条提示词落地后才可用。 diff --git a/packages/client/ui-workspace/src/client/WorkspaceBrowser.module.css b/packages/client/ui-workspace/src/client/WorkspaceBrowser.module.css index a160f2ffd7..4d19163322 100644 --- a/packages/client/ui-workspace/src/client/WorkspaceBrowser.module.css +++ b/packages/client/ui-workspace/src/client/WorkspaceBrowser.module.css @@ -240,11 +240,13 @@ /* Rail variant (own .rail class from the wide owner prop — the region never reads the shell's class names): the two icon controls stack as 36x36 - circles matching the shell's rail rhythm. */ + circles matching the shell's rail rhythm. Both use the rail's shared base + left anchor so the outer shell can translate the whole region uniformly. */ .rail .sectionHeader { gap: 0; padding-left: 0; margin-bottom: 12px; + justify-content: flex-start; } .rail .headerActions { diff --git a/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx b/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx index e9d6ed192f..ebd0e11a33 100644 --- a/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx +++ b/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx @@ -3,11 +3,11 @@ * `sidebar.workspaces` hole: section header (title + view options + add * workspace), search, the grouped tree or flat list, and the workspace * dialogs. Wide state renders the full browser; rail state renders the two - * region icons (search / add workspace), each requesting shell expansion - * through the owner share. Adding is the header button's one action, so it - * raises the directory flow with no menu in between; the flow and its error - * dialog live in WorkspacePicker (same package — direct composition, no slot - * between them). + * region icons (search / add workspace) as 36px controls on the shell's shared + * rail entry path, each requesting expansion through the owner share. Adding is the header + * button's one action, so it raises the directory flow with no menu in + * between; the flow and its error dialog live in WorkspacePicker (same + * package — direct composition, no slot between them). */ import { useEffect, useMemo, useRef, useState } from 'react' import clsx from 'clsx' diff --git a/packages/client/ui-workspace/tests/browser-styles.client.spec.ts b/packages/client/ui-workspace/tests/browser-styles.client.spec.ts index d66baef917..5554c977bb 100644 --- a/packages/client/ui-workspace/tests/browser-styles.client.spec.ts +++ b/packages/client/ui-workspace/tests/browser-styles.client.spec.ts @@ -107,4 +107,10 @@ describe('WorkspaceBrowser.module.css list', () => { expect(rowDeclarations('.sessionRow.selected')?.get('background')) .toBe('var(--dsw-alias-interactive-bg-hover)') }) + + it('pins both rail controls to the shared left anchor during the column slide', () => { + expect(declarations('.rail .sectionHeader')?.get('justify-content')).toBe('flex-start') + expect(declarations('.rail .iconButton')?.get('width')).toBe('36px') + expect(declarations('.rail .search')?.get('width')).toBe('36px') + }) }) From 3ef05f8a8524dc1dc754f4d0bd7d343f520c2d27 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Wed, 12 Aug 2026 23:51:46 +0800 Subject: [PATCH 005/103] review: address ds-review-bot findings on composer geometry - Rewrite the 08-04 gutter-reservation note in place: the reservation is Chat's alone and the overlay branch points to the seat-width compensation note; the Testing section now describes the uncompensated control. - Cross-reference the earlier rejection of the seat inset in the 08-12 note and record the engine-resolved-vs-fixed-8px drift as accepted residual cost instead of asserting Firefox resolves 8px. - Pair --dsh-scrollbar-width with the mirrored ::-webkit-scrollbar rule and the compensation consumer in the scrollbar-styles gate; document the variable in the ui-theme README. - Rename the e2e control to compareTabsWithoutCompensation and correct the vacuity-guard comment; rewrap the WorkspaceBrowser doc comment. --- ...-composer-tab-gutter-reservation.i18n.yaml | 4 +- ...6-08-04-composer-tab-gutter-reservation.md | 16 ++--- ...8-04-composer-tab-gutter-reservation.zh.md | 16 ++--- ...-overlay-seat-width-compensation.i18n.yaml | 4 +- ...omposer-overlay-seat-width-compensation.md | 7 +- ...oser-overlay-seat-width-compensation.zh.md | 7 +- apps/web/tests/composer-tab-geometry.e2e.ts | 28 ++++---- .../skeleton/ConversationRoot.module.css | 6 +- packages/client/ui-theme/README.i18n.yaml | 4 +- packages/client/ui-theme/README.md | 2 +- packages/client/ui-theme/README.zh.md | 2 +- .../tests/scrollbar-styles.client.spec.ts | 70 +++++++++++++++++-- .../src/client/WorkspaceBrowser.tsx | 8 +-- 13 files changed, 120 insertions(+), 54 deletions(-) diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml index 0082a6f991..ccae7043a7 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md -2026-08-04-composer-tab-gutter-reservation.md: 2c2813371af073eee4bd80ce7813e77af3c0c319 -2026-08-04-composer-tab-gutter-reservation.zh.md: e450def2482218028875a48fce8842c88b5ba82e +2026-08-04-composer-tab-gutter-reservation.md: 8bd9fb2d86982d82b44a82c55b7303fcd9a5bf4d +2026-08-04-composer-tab-gutter-reservation.zh.md: 4b70aeb1d3777384907c345968971fcf75b3e74d diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md index 2c2813371a..8bd9fb2d86 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md @@ -2,8 +2,6 @@ Status: implemented -> Superseded for overlay views by [the seat-width compensation](2026-08-12-composer-overlay-seat-width-compensation.md): the overlay branch no longer reserves a gutter, and the seat compensates for the bar instead. Chat keeps the reservation described here. - English | [中文](2026-08-04-composer-tab-gutter-reservation.zh.md) ## Problem @@ -16,13 +14,11 @@ So for as long as the transcript overflowed — the ordinary state of any sessio ## Decision -`.scrollBody` declares `scrollbar-gutter: stable` unconditionally, and the overlay branch declares the same box a scroll container on both axes — `overflow-x: hidden; overflow-y: auto` — instead of `overflow: hidden`. +`.scrollBody` declares `scrollbar-gutter: stable` for the Chat state, and the overlay branch overrides it with `scrollbar-gutter: auto` while staying a scroll container on both axes — `overflow-x: hidden; overflow-y: auto`. The reservation is Chat's alone: it holds the seat's content box at the same width whether or not the transcript overflows, so the card never jumps as a growing transcript starts to scroll, nor between the hero phase and the first scrolling turn. The overlay branch reserves nothing — the view owns its own scrollers, so a gutter there would only narrow the view's content — and its seat compensates for the bar instead ([the seat-width compensation](2026-08-12-composer-overlay-seat-width-compensation.md)). -The two halves are one change. The reservation is what makes both states measure against the same width; declaring the overlay branch a scroll container is what makes the reservation reach it. `stable` rather than `auto` because `auto` reserves only while the box actually overflows, and the difference between overflowing and not is precisely the difference between the two tabs — an `auto` gutter would state the bug rather than fix it. +`stable` rather than `auto` because `auto` reserves only while the box actually overflows, and the difference between overflowing and not is precisely the difference between Chat's two phases — an `auto` gutter would state the bug rather than fix it. -The overlay state is a scroll container that nothing scrolls: the view fills it (`flex: 1 1 0` with its own clip) and the seat is out of flow, so no gesture and no clipping behavior changes. What changes is which declarations the engine honours. WebKit applies `scrollbar-gutter` to an `overflow-y: auto` box and ignores it on a hidden one — measured on this app's own composer layers and recorded in [the composer scrollport note](2026-07-31-composer-text-layers-share-one-scrollport.md) — so a reservation left on a hidden box would hold in Chromium and silently not in Safari. - -The horizontal axis is declared rather than left to compute: a box that scrolls on one axis computes `visible` on the other to `auto`, and would grow a horizontal scrollbar of its own the first time a view's content reached past the column. +The reservation lives on an `overflow-y: auto` box, and that form is load-bearing: WebKit applies `scrollbar-gutter` to an `overflow-y: auto` box and ignores it on a hidden one — measured on this app's own composer layers and recorded in [the composer scrollport note](2026-07-31-composer-text-layers-share-one-scrollport.md) — so a reservation on a hidden box would hold in Chromium and silently not in Safari. The overlay branch keeps its `overflow-y: auto` form too, as a clipping box nothing scrolls out of: a single-axis scroller computes the other axis to `auto`, so the horizontal axis is declared `hidden` rather than left to compute, and would otherwise grow a horizontal scrollbar of its own the first time a view's content reached past the column. The reservation is worth what it costs only because the bar takes layout space here at all, which is not the browser's default behavior but this client's: `::-webkit-scrollbar` carries a width in ui-theme's sheet ([themed scrollbars](2026-07-28-themed-scrollbars-and-reserved-gutter.md)), and the sidebar's session list already reserves its own gutter for the same reason. @@ -39,7 +35,7 @@ The reservation is worth what it costs only because the bar takes layout space h ## Consequences - Chat's content column is permanently 8px narrower — in the hero phase and while the transcript is short as well, where no bar is drawn. That is the trade: one card position at every content height, instead of the widest possible column. -- The fix covers three transitions with one declaration, because all three are the same difference: Chat ↔ Trajectory, short ↔ scrolling transcript within Chat, and hero ↔ first scrolling turn. +- The card holds one position across three transitions, by two mechanisms: the reservation keeps Chat's seat at one width across its own phases (short ↔ scrolling transcript, hero ↔ first scrolling turn), and the overlay seat's compensation matches it on the Chat ↔ Trajectory transition ([the seat-width compensation](2026-08-12-composer-overlay-seat-width-compensation.md)). - The overlay state is now a scroll container. Nothing in it can overflow today; a future view that let its content exceed the column would scroll this box instead of clipping, and would need its own clip the way the Trajectory view already has one. - The committed golden records the reserved band, so a change to the sheet's `::-webkit-scrollbar` width — the value that decides how wide the reservation is — arrives as a reviewable diff in this scenario as well as in the sidebar's. @@ -47,6 +43,6 @@ The reservation is worth what it costs only because the bar takes layout space h `apps/web/tests/composer-tab-geometry.e2e.ts` measures the input card's rectangle in both tabs, at a viewport where the card sits at its width cap and one where it shrinks with the column, and asserts the two rectangles are the same rectangle. Only a real engine reports this: jsdom gives every element a zero-sized box and no scrollbar, so a unit spec could assert the declarations exist but not that the two states land in the same place. For the same reason no CSS-text spec accompanies it — it would restate the declarations without adding a fact the browser lane does not already establish. -The scenario launches chromium without Playwright's default `--hide-scrollbars`, which is load-bearing: under that argument a bar consumes no layout width, both tabs agree before this change as much as after it, and every comparison in the file holds vacuously. Measured, the pre-fix cascade leaves both bands at 0 under the argument, and at 8 and 0 with it dropped. +The scenario launches chromium without Playwright's default `--hide-scrollbars`, which is load-bearing: under that argument a bar consumes no layout width, so the tabs agree with and without the compensation and every comparison in the file holds vacuously. Measured, both bands sit at 0 under the argument and at 8 and 0 with it dropped. -The pre-fix cascade is then applied in the page — `scrollbar-gutter: auto` on the scroller, `overflow: hidden` on the overlay branch — and the same two tabs measured through it, which is what separates a card that does not move from a tab switch that never reached the layout. It reproduces the reported symptom as a number: 4px on each edge, half the 8px band. The golden records that control beside the fixed state, so the fixture carries the difference the change removes rather than only its absence. +The uncompensated cascade is then applied in the page — the overlay seat's `right` compensation dropped to 0 via `!important`, Chat's reservation untouched — and the same two tabs measured through it, which is what separates a card that does not move from a tab switch that never reached the layout. It reproduces the reported symptom as a number: 4px on each edge, half the 8px band. The golden records that control beside the fixed state, so the fixture carries the difference the change removes rather than only its absence. diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md index e450def248..4b70aeb1d3 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md @@ -2,8 +2,6 @@ Status: implemented -> 对覆盖视图已被 [座位宽度补偿](2026-08-12-composer-overlay-seat-width-compensation.md) 取代:覆盖分支不再预留滚动条槽,座位改为补偿滚动条宽度。Chat 仍保留本文所述的预留。 - [English](2026-08-04-composer-tab-gutter-reservation.md) | 中文 ## 问题 @@ -16,13 +14,11 @@ composer 座位在组件树中只有一个节点、一个位置,但它究竟 ## 决策 -`.scrollBody` 无条件声明 `scrollbar-gutter: stable`,overlay 分支则把同一个盒子在两个轴向上都声明为滚动容器——`overflow-x: hidden; overflow-y: auto`——而不再是 `overflow: hidden`。 +`.scrollBody` 为 Chat 状态声明 `scrollbar-gutter: stable`,覆盖分支则将其覆盖为 `scrollbar-gutter: auto`,同时保持为双轴滚动容器——`overflow-x: hidden; overflow-y: auto`。这条预留只属于 Chat:它让座位的内容盒在 transcript 是否溢出时都保持同一宽度,因此卡片不会在 transcript 增长到开始滚动的那一刻跳动,也不会在 hero 态与第一个可滚动轮次之间跳动。覆盖分支不预留任何槽位——视图自己滚动,槽位只会白白收窄视图内容——它的座位改为补偿滚动条宽度([座位宽度补偿](2026-08-12-composer-overlay-seat-width-compensation.md))。 -这两半是同一处改动。预留使两种状态依附于同一个宽度;把 overlay 分支声明为滚动容器,才使这条预留真正抵达它。选 `stable` 而非 `auto`,是因为 `auto` 只在盒子确实溢出时才预留,而「溢出与否」恰恰就是两个标签页之间的那点差别——`auto` 的写法只是把缺陷重述一遍,并不能修掉它。 +选 `stable` 而非 `auto`,是因为 `auto` 只在盒子确实溢出时才预留,而「溢出与否」恰恰就是 Chat 两种相位之间的那点差别——`auto` 的写法只是把缺陷重述一遍,并不能修掉它。 -overlay 状态是一个没有任何东西会去滚动它的滚动容器:视图把它填满(`flex: 1 1 0`,且自带裁剪),座位不在常规流中,因此没有任何手势与裁剪行为发生变化。变化的是引擎会认哪些声明。WebKit 对 `overflow-y: auto` 的盒子应用 `scrollbar-gutter`,对 hidden 的盒子则忽略它——这是在本应用 composer 自身的图层上实测所得,并记录于 [composer 滚动视口记录](2026-07-31-composer-text-layers-share-one-scrollport.md)——所以把预留留在一个 hidden 盒子上,会在 Chromium 上成立,在 Safari 上悄无声息地不成立。 - -横向轴是显式声明的,而不是交给推导:单轴滚动的盒子会把另一轴的 `visible` 计算为 `auto`,于是只要某个视图的内容第一次伸出列外,它就会长出自己的横向滚动条。 +这条预留位于 `overflow-y: auto` 的盒子上,而这个形式是承重的:WebKit 对 `overflow-y: auto` 的盒子应用 `scrollbar-gutter`,对 hidden 的盒子则忽略它——这是在本应用 composer 自身的图层上实测所得,并记录于 [composer 滚动视口记录](2026-07-31-composer-text-layers-share-one-scrollport.md)——所以把预留放在 hidden 盒子上,会在 Chromium 上成立,在 Safari 上悄无声息地不成立。覆盖分支同样保留 `overflow-y: auto` 的形式,作为没有任何内容会滚出去的裁剪盒:单轴滚动的盒子会把另一轴的 `visible` 计算为 `auto`,因此横向轴显式声明为 `hidden` 而不是交给推导,否则某个视图的内容第一次伸出列外时,它就会长出自己的横向滚动条。 这条预留之所以值回它的代价,前提是滚动条在这里确实占布局空间——这并非浏览器的默认行为,而是本客户端的选择:ui-theme 的样式表给 `::-webkit-scrollbar` 声明了宽度([滚动条主题化](2026-07-28-themed-scrollbars-and-reserved-gutter.md)),侧边栏的会话列表也正是出于同一原因预留了自己的滚动条槽。 @@ -39,7 +35,7 @@ overlay 状态是一个没有任何东西会去滚动它的滚动容器:视图 ## 后果 - Chat 的内容列永久变窄 8px——hero 态与 transcript 尚短、根本不绘制滚动条时同样如此。这就是这笔交易:以最宽的列换取卡片在任何内容高度下都只有一个位置。 -- 一条声明覆盖三种切换,因为这三者本就是同一个差异:Chat ↔ Trajectory、Chat 内部 transcript 较短 ↔ transcript 可滚动,以及 hero ↔ 第一个可滚动轮次。 +- 卡片在三种切换下保持同一位置,由两种机制达成:预留让 Chat 的座位在自身各相位间保持同一宽度(transcript 较短 ↔ 可滚动、hero ↔ 第一个可滚动轮次),Chat ↔ Trajectory 的切换则由覆盖座位的补偿来对齐([座位宽度补偿](2026-08-12-composer-overlay-seat-width-compensation.md))。 - overlay 状态现在是一个滚动容器。今天其中没有任何内容会溢出;将来若有视图允许自身内容超出会话列,这个盒子会滚动而不是裁剪,那个视图就需要像 Trajectory 视图那样自带裁剪。 - 提交的 golden 记录了预留条带,因此样式表中 `::-webkit-scrollbar` 宽度的变化——决定这条预留有多宽的那个值——会在本场景中与在侧边栏场景中一样,以可评审的 diff 形式出现。 @@ -47,6 +43,6 @@ overlay 状态是一个没有任何东西会去滚动它的滚动容器:视图 `apps/web/tests/composer-tab-geometry.e2e.ts` 在两个标签页下测量输入卡片的矩形,分别取卡片处于宽度上限的视口与卡片随列收缩的视口,并断言这两个矩形是同一个矩形。只有真实引擎能报告这件事:jsdom 给每个元素的盒子尺寸都是零,也没有滚动条,因此单元测试只能断言那些声明存在,无法断言两种状态落在同一位置。出于同一原因,本次没有附带读取 CSS 文本的单元测试——它只会把声明复述一遍,并不会补上浏览器车道尚未确立的事实。 -该场景启动 chromium 时去掉了 Playwright 默认的 `--hide-scrollbars`,这一点是承重的:带上该参数时滚动条不占任何布局宽度,两个标签页在改动前后同样一致,文件中的每一处比较都会空洞地通过。实测:带上该参数时,改动前的层叠让两条预留带的宽度都是 0;去掉它则分别是 8 与 0。 +该场景启动 chromium 时去掉了 Playwright 默认的 `--hide-scrollbars`,这一点是承重的:带上该参数时滚动条不占任何布局宽度,因此两个标签页在有补偿与无补偿时同样一致,文件中的每一处比较都会空洞地通过。实测:带上该参数时两条预留带的宽度都是 0;去掉它则分别是 8 与 0。 -随后,改动前的层叠会被注入页面——滚动容器上 `scrollbar-gutter: auto`,overlay 分支上 `overflow: hidden`——并在其下测量同样的两个标签页,这正是把「卡片确实没动」与「标签页切换根本没到达布局」区分开的那一步。它把上报的症状复现为一个数字:每条边 4px,恰是 8px 带宽的一半。golden 把这份对照与修复后的状态并排记录,因此 fixture(测试前置数据)承载的是这次改动所消除的那个差值,而不仅仅是它的缺席。 +随后,未补偿的级联会被注入页面——通过 `!important` 把覆盖座位的 `right` 补偿降为 0,Chat 的预留保持不变——并在其下测量同样的两个标签页,这正是把「卡片确实没动」与「标签页切换根本没到达布局」区分开的那一步。它把上报的症状复现为一个数字:每条边 4px,恰是 8px 带宽的一半。golden 把这份对照与修复后的状态并排记录,因此 fixture(测试前置数据)承载的是这次改动所消除的那个差值,而不仅仅是它的缺席。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml index fd88ecbc93..a1904a4b03 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md -2026-08-12-composer-overlay-seat-width-compensation.md: 85281ed4301046672ff4c02320b196a397e6d163 -2026-08-12-composer-overlay-seat-width-compensation.zh.md: 7bcf060e651a828068ef207caaebd01fa2ffd7ae +2026-08-12-composer-overlay-seat-width-compensation.md: 0ec4d1272ac1adab5b724dccf44f567e15cc3368 +2026-08-12-composer-overlay-seat-width-compensation.zh.md: 2f66771240fe62e15c481342d55a82dd09cfb864 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md index 85281ed430..0ec4d1272a 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md @@ -14,7 +14,7 @@ The trajectory table made that cost visible: its full-width row divider lines st The reservation now belongs to Chat alone. The overlay branch declares `scrollbar-gutter: auto`, so the view's content spans the full column; the overlay composer seat (absolutely positioned against the padding box) gives back the bar's width with `right: var(--dsh-scrollbar-width)`, so the input card still measures the same width as Chat's seat and does not move between tabs. -The compensation value is not a literal: ui-theme's scrollbar.css defines `--dsh-scrollbar-width` (8px on the WebKit path) beside the `::-webkit-scrollbar` rule it mirrors, and the seat reads that variable. A change to the sheet's bar width reaches the compensation in the same reviewable diff as the bar itself. +The compensation value is not a literal: ui-theme's scrollbar.css defines `--dsh-scrollbar-width` (8px on the WebKit path) beside the `::-webkit-scrollbar` rule it mirrors, and the seat reads that variable. The scrollbar-styles spec pairs the variable with the mirrored rule and with the compensation consumer, so a change to the sheet's bar width without the variable — or to the variable without the consumer — fails the gate, not just review. ## Alternatives considered @@ -24,12 +24,15 @@ The compensation value is not a literal: ui-theme's scrollbar.css defines `--dsh **Accept the 4px card shift.** Dropping the reservation without compensating the seat would move the input card on every tab switch, which is exactly the symptom the earlier note fixed. Rejected: the card position is a deliberate cross-tab invariant. +**Inset the overlay seat by the bar's width.** The [gutter-reservation note](2026-08-04-composer-tab-gutter-reservation.md) rejected exactly this, and this note adopts it; what changed is the rejection's premise. The number was the engine's, not ours — the WebKit path draws the sheet's 8px bar while the Firefox path draws whatever `scrollbar-width: thin` resolves to — so a hardcoded inset would line the two states up in Chromium and drift elsewhere. The overlay branch reserved an engine-resolved gutter of its own back then, so an inset had to match that width exactly. Today the overlay branch reserves nothing, so the compensation is the overlay side's only mechanism, and the literal half of the rejection is answered by making the 8px a variable that mirrors the `::-webkit-scrollbar` rule in the same diff. The Firefox half remains: Chat reserves the engine-resolved width while the compensation stays fixed, and the residual drift where the two differ is recorded as an accepted cost in Consequences. + ## Consequences - Chat keeps its reserved gutter and its stable card position; nothing changes on that tab. - Overlay views (trajectory) span the full column; the trajectory ledger's divider lines reach the pane edge. - The input card still holds one horizontal position across the Chat and Trajectory tabs, now by two mechanisms instead of one: Chat reserves, the overlay seat compensates. -- `--dsh-scrollbar-width` becomes a public ui-theme variable read outside ui-theme; the scrollbar-styles spec's indirection checks only scan `--dsh-scrollbar-thumb{,-hover}` rebinds, so the width variable is not covered by the pair gate. +- Chat reserves the engine-resolved width while the overlay seat compensates a fixed 8px. Where the two differ — the Firefox path resolves `scrollbar-width: thin` per platform, and the e2e runs only on Chromium — the card drifts by half the difference on tab switch. Accepted residual cost, recorded here rather than asserted away: no measurement of the Firefox thin width on the target platforms exists in this change. +- `--dsh-scrollbar-width` becomes a public ui-theme variable read outside ui-theme; the scrollbar-styles spec pairs it with the mirrored `::-webkit-scrollbar` width rule and with the compensation consumer, closing the indirection-gate gap the variable would otherwise leave. ## Testing diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md index 7bcf060e65..2f66771240 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md @@ -14,7 +14,7 @@ trajectory 表格让这个代价显形:整行分隔线在面板右边缘前 8p 预留现在只属于 Chat。覆盖分支声明 `scrollbar-gutter: auto`,视图内容占满整列;覆盖分支的 composer 座位(相对 padding box 绝对定位)用 `right: var(--dsh-scrollbar-width)` 让出滚动条宽度,使输入卡仍与 Chat 座位测得相同宽度,切换标签页时不移动。 -补偿值不是字面量:ui-theme 的 scrollbar.css 在它镜像的 `::-webkit-scrollbar` 规则旁定义 `--dsh-scrollbar-width`(WebKit 路径 8px),座位读取该变量。样式表滚动条宽度一变,补偿就会与滚动条本身出现在同一次可审阅的 diff 中。 +补偿值不是字面量:ui-theme 的 scrollbar.css 在它镜像的 `::-webkit-scrollbar` 规则旁定义 `--dsh-scrollbar-width`(WebKit 路径 8px),座位读取该变量。scrollbar-styles 规格把该变量与其镜像规则、以及补偿消费者配对检查,因此样式表滚动条宽度一变却不同步变量——或变量一变却不同步消费者——都会让门禁失败,而不只是评审时发现。 ## 备选方案 @@ -24,12 +24,15 @@ trajectory 表格让这个代价显形:整行分隔线在面板右边缘前 8p **接受 4px 卡片位移。** 去掉预留却不补偿座位,会在每次切换标签页时移动输入卡——正是前一份 note 修复的症状。已拒绝:卡片位置是刻意保持的跨标签页不变量。 +**把 overlay 座位按滚动条宽度内缩。** [滚动条槽预留 note](2026-08-04-composer-tab-gutter-reservation.md) 当初否决的正是这个方案,本 note 采纳了它;变的是否决的前提。这个数字属于引擎而不属于我们——WebKit 路径绘制样式表里的 8px 滚动条,Firefox 路径绘制 `scrollbar-width: thin` 解析出的宽度——因此硬编码的内缩会让两种状态在 Chromium 上对齐、在别处继续漂移。当初 overlay 分支自己预留的是引擎解析出的槽宽,内缩必须精确匹配那个宽度。如今 overlay 分支不预留任何槽位,补偿成为覆盖侧唯一的机制;否决的字面量那一半,通过把 8px 变成与 `::-webkit-scrollbar` 规则同处一个 diff 的变量来回应。Firefox 那一半仍然存在:Chat 预留引擎解析宽度,补偿保持固定 8px,两者不等之处的残余漂移作为接受的代价记录在后果中。 + ## 后果 - Chat 保留滚动条槽与稳定的卡片位置;该标签页无任何变化。 - 覆盖视图(trajectory)占满整列;trajectory 台账的分隔线到达面板右边缘。 - 输入卡在 Chat 与 Trajectory 标签页间仍保持同一水平位置,现在由两种机制而非一种达成:Chat 预留,覆盖座位补偿。 -- `--dsh-scrollbar-width` 成为 ui-theme 对外、且被 ui-theme 之外读取的变量;scrollbar-styles 规格的间接层检查只扫描 `--dsh-scrollbar-thumb{,-hover}` 重绑,宽度变量不受成对门禁覆盖。 +- Chat 预留引擎解析宽度,覆盖座位补偿固定的 8px。两者不等之处——Firefox 路径按平台解析 `scrollbar-width: thin`,而 e2e 只在 Chromium 上运行——卡片在切换标签页时会漂移半个差值。这是接受的残余代价,如实记录于此而不断言消除:本次改动并未提供目标平台 Firefox thin 宽度的实测。 +- `--dsh-scrollbar-width` 成为 ui-theme 对外、且被 ui-theme 之外读取的变量;scrollbar-styles 规格把它与镜像的 `::-webkit-scrollbar` 宽度规则、以及补偿消费者配对检查,补上了该变量本会留下的间接层门禁缺口。 ## 测试 diff --git a/apps/web/tests/composer-tab-geometry.e2e.ts b/apps/web/tests/composer-tab-geometry.e2e.ts index b491b1257c..0f7b01c7ff 100644 --- a/apps/web/tests/composer-tab-geometry.e2e.ts +++ b/apps/web/tests/composer-tab-geometry.e2e.ts @@ -28,13 +28,13 @@ // The browser is launched WITHOUT Playwright's default `--hide-scrollbars`, // which is load-bearing rather than incidental. Under that argument a scroll // container's bar consumes no layout width at all, so the two tabs agree with -// and without the reservation and every comparison below holds vacuously — -// measured: the unreserved cascade leaves both tabs' bands at 0 there, against -// 8 and 0 with the argument dropped. Dropping it is also the faithful +// and without the compensation and every comparison below holds vacuously — +// measured: the uncompensated cascade leaves both tabs' bands at 0 there, +// against 8 and 0 with the argument dropped. Dropping it is also the faithful // configuration: ui-theme's scrollbar.css gives `::-webkit-scrollbar` a width, // and a bar that occupies layout space is what the product actually draws. // -// The scenario runs that unreserved cascade in the page — the overlay seat's +// The scenario runs that uncompensated cascade in the page — the overlay seat's // `right` compensation dropped to 0 — and measures the same two tabs through // it, which is what keeps the equal rectangles above from being explained by a // tab switch that never reached the layout. It is the reported symptom as a @@ -227,7 +227,7 @@ async function compareTabs(page: Page): Promise { * @param page - the page under test. * @returns the comparison as the column lays out without the compensation. */ -async function compareTabsWithoutReservation(page: Page): Promise { +async function compareTabsWithoutCompensation(page: Page): Promise { await page.evaluate(({ id, css }) => { const style = document.createElement('style') style.id = id @@ -327,9 +327,13 @@ describe('web e2e: input card position across view tabs', () => { it('reserves the gutter in Chat and lets Trajectory own its width', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-tab-geometry-band')) await setMeasuredViewport(page, WIDE_VIEWPORT, false) - // Vacuity guard, in two parts. A transcript that does not overflow gives - // Chat no scrollbar, and a hidden or overlaid bar gives it no width; either - // would make the tabs agree without the compensation doing anything. + // Vacuity guard. The scenario must be able to fail: on an engine that + // does not implement `scrollbar-gutter`, Chat reserves nothing and the + // overlay seat's fixed compensation stands alone, manufacturing an 8px + // deviation the equal-rectangle assertions would catch. `stable` reserves + // even without overflow, so a short transcript is not a vacuous case; the + // poll still pins the measurement to the overflowing state the product + // ships. await expect.poll(async () => (await measureTab(page)).scrolls, { timeout: 10_000 }).toBe(true) const comparison = await compareTabs(page) expect(comparison.chat.band).toBeGreaterThan(0) @@ -356,7 +360,7 @@ describe('web e2e: input card position across view tabs', () => { await setMeasuredViewport(page, WIDE_VIEWPORT, false) const comparison = await compareTabs(page) // The reported symptom as a number. At this viewport the card sits at its - // width cap, so the unreserved cascade's shift shows up as a centring + // width cap, so the uncompensated cascade's shift shows up as a centring // difference — half the band on each edge — rather than as a width change. expect(comparison.leftShift).toBe(0) expect(comparison.rightShift).toBe(0) @@ -387,11 +391,11 @@ describe('web e2e: input card position across view tabs', () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-tab-geometry-control')) await setMeasuredViewport(page, WIDE_VIEWPORT, false) // The control: without it, equal rectangles could also mean the tab switch - // never reached the layout. Under the unreserved cascade the overlay seat + // never reached the layout. Under the uncompensated cascade the overlay seat // loses its `right` compensation and measures the full padding box, so the // card moves by half the band on each edge. Chat's own reservation is // untouched — that is the side that must not change. - const comparison = await compareTabsWithoutReservation(page) + const comparison = await compareTabsWithoutCompensation(page) expect(comparison.chat.gutter).toBe('stable') expect(comparison.chat.band).toBeGreaterThan(0) expect(comparison.trajectory.band).toBe(0) @@ -411,7 +415,7 @@ describe('web e2e: input card position across view tabs', () => { await setMeasuredViewport(page, NARROW_VIEWPORT, true) const narrow = await compareTabs(page) await setMeasuredViewport(page, WIDE_VIEWPORT, false) - const control = await compareTabsWithoutReservation(page) + const control = await compareTabsWithoutCompensation(page) await compareOrRefreshGolden(GEOMETRY_EXPECTED, renderGeometry(wide, narrow, control), MODE) expect(tripwire.pageErrors).toEqual([]) }, 60_000) diff --git a/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css b/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css index c6618fc624..20ade47c8a 100644 --- a/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css +++ b/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css @@ -297,8 +297,10 @@ by the bar's width; the overlay seat is against the padding box, so it must give back the same width to keep the input card in place across tabs. Reads ui-theme's --dsh-scrollbar-width, which mirrors the WebKit - bar's layout width; Firefox's thin bar resolves to the same 8px on the - platforms this app targets, so the compensation holds there too. */ + bar's layout width. Chat reserves the engine-resolved width, so on an + engine where the resolved width differs from this fixed 8px the card + drifts by half the difference — accepted residual risk, recorded in + ([decision](../../../../../../.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md)). */ right: var(--dsh-scrollbar-width); bottom: 0; left: 0; diff --git a/packages/client/ui-theme/README.i18n.yaml b/packages/client/ui-theme/README.i18n.yaml index e2bdc28ecb..00c049e8df 100644 --- a/packages/client/ui-theme/README.i18n.yaml +++ b/packages/client/ui-theme/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-theme/README.md -README.md: df4d5e0370962bf6f2a8ac0a7b88d669225dc5c5 -README.zh.md: fb8e937979a5168803be78a49e1bc1e7eacd7a47 +README.md: c24f2ae5692fdd05134ce780d21569b87570d1c7 +README.zh.md: 518b8930027c88bd85139a8a7325cea1fd40b40c diff --git a/packages/client/ui-theme/README.md b/packages/client/ui-theme/README.md index df4d5e0370..c24f2ae569 100644 --- a/packages/client/ui-theme/README.md +++ b/packages/client/ui-theme/README.md @@ -8,7 +8,7 @@ When the host composition includes an HTTP server, the host half injects a synch `src/styles/` holds five sheets, all imported by the web shell's `base.css`: `base.css`, `design-platform.css`, `scrollbar.css`, `gradient-shadow-text.css`, and `shiki.css`. `scrollbar.css` is the sole consumer of the `--dsw-alias-scrollbar-*` tokens and must follow `design-platform.css`, which declares them. -Scrollbar rebinding contract: `scrollbar.css` binds `--dsh-scrollbar-thumb` and `--dsh-scrollbar-thumb-hover` on `body` to the l1 (base-surface) tokens, and both rendering paths read that pair. An elevated surface (menu, popover, dialog) sets `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` and `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)` on its own container; one rebind retints whichever path the engine took. The pair's other legal target is `transparent`, which draws no thumb at all — [ui-sidebar](../ui-sidebar/README.md) rebinds its column that way while the pointer is elsewhere. A rebind to the l1 pair is not a rebind; it restates the base-surface default. +Scrollbar rebinding contract: `scrollbar.css` binds `--dsh-scrollbar-thumb` and `--dsh-scrollbar-thumb-hover` on `body` to the l1 (base-surface) tokens, and both rendering paths read that pair. An elevated surface (menu, popover, dialog) sets `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` and `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)` on its own container; one rebind retints whichever path the engine took. The pair's other legal target is `transparent`, which draws no thumb at all — [ui-sidebar](../ui-sidebar/README.md) rebinds its column that way while the pointer is elsewhere. A rebind to the l1 pair is not a rebind; it restates the base-surface default. `--dsh-scrollbar-width` mirrors the WebKit bar's layout width for surfaces that align themselves beside a space-consuming bar — [ui-conversation](../ui-conversation/README.md) reads it for the overlay composer seat's `right` offset — and the scrollbar-styles spec pairs it with the mirrored rule and the consumer. The two paths are mutually exclusive by construction. `scrollbar-width`/`scrollbar-color` sit inside `@supports not selector(::-webkit-scrollbar)` because a non-`auto` value of either makes Chromium and Safari discard every `::-webkit-scrollbar*` rule for that element, `::-webkit-scrollbar-thumb:hover` included — declaring both unconditionally leaves `--dsh-scrollbar-thumb-hover` with no rendering anywhere. Firefox therefore takes the standard properties and WebKit-based engines take the pseudo-elements, so the hover token only ever renders through the pseudo-element path. Reasoning and the measured computed values: [the scrollbar Agent Note](../../../.agents/notes/implemented/bug-fix/2026-07-28-themed-scrollbars-and-reserved-gutter.md). diff --git a/packages/client/ui-theme/README.zh.md b/packages/client/ui-theme/README.zh.md index fb8e937979..518b893002 100644 --- a/packages/client/ui-theme/README.zh.md +++ b/packages/client/ui-theme/README.zh.md @@ -8,7 +8,7 @@ `src/styles/` 下有五张样式表,全部由 web 壳的 `base.css` 导入:`base.css`、`design-platform.css`、`scrollbar.css`、`gradient-shadow-text.css` 与 `shiki.css`。`scrollbar.css` 是 `--dsw-alias-scrollbar-*` token 的唯一消费方,必须排在声明这些 token 的 `design-platform.css` 之后。 -滚动条重新绑定约定:`scrollbar.css` 在 `body` 上把 `--dsh-scrollbar-thumb` 与 `--dsh-scrollbar-thumb-hover` 绑定到 l1(基础表面)token,两条渲染路径都读取这一组变量。高层级表面(菜单、浮层、对话框)在自己的容器上设置 `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` 与 `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)`;一次重新绑定即可为引擎实际走的那条路径换色。这组变量的另一个合法目标是 `transparent`,即完全不绘制滑块——[ui-sidebar](../ui-sidebar/README.md) 在指针不在栏内时就这样重新绑定自己的列。绑回 l1 那组不算重新绑定,它只是重述基础表面的默认值。 +滚动条重新绑定约定:`scrollbar.css` 在 `body` 上把 `--dsh-scrollbar-thumb` 与 `--dsh-scrollbar-thumb-hover` 绑定到 l1(基础表面)token,两条渲染路径都读取这一组变量。高层级表面(菜单、浮层、对话框)在自己的容器上设置 `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` 与 `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)`;一次重新绑定即可为引擎实际走的那条路径换色。这组变量的另一个合法目标是 `transparent`,即完全不绘制滑块——[ui-sidebar](../ui-sidebar/README.md) 在指针不在栏内时就这样重新绑定自己的列。绑回 l1 那组不算重新绑定,它只是重述基础表面的默认值。`--dsh-scrollbar-width` 镜像 WebKit 滚动条的布局宽度,供需要与占布局宽度的滚动条对齐的表面使用——[ui-conversation](../ui-conversation/README.md) 用它作为覆盖 composer 座位 `right` 偏移——scrollbar-styles 规格把它与镜像规则及消费者配对检查。 两条路径在构造上互斥。`scrollbar-width`/`scrollbar-color` 写在 `@supports not selector(::-webkit-scrollbar)` 之内,因为这两个属性中的任一个只要取非 `auto` 值,Chromium 与 Safari 就会丢弃该元素上的全部 `::-webkit-scrollbar*` 规则,`::-webkit-scrollbar-thumb:hover` 也在其中——若无条件地同时声明,`--dsh-scrollbar-thumb-hover` 在任何引擎上都不会被渲染。因此 Firefox 走标准属性,WebKit 系引擎走伪元素,hover token 只经由伪元素这条路径渲染。相关原理与实测计算值见[滚动条 Agent Note](../../../.agents/notes/implemented/bug-fix/2026-07-28-themed-scrollbars-and-reserved-gutter.md)。 diff --git a/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts b/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts index b6ed3f0c90..e9234846eb 100644 --- a/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts +++ b/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts @@ -2,10 +2,11 @@ * Scrollbar stylesheet contract, asserted against the CSS text on disk: every * --dsw-alias-scrollbar-* token design-platform.css defines has a consumer, * scrollbar.css binds the base-surface pair through the rebindable - * indirection, and elevated surfaces rebind that indirection in complete - * pairs. The expected token set is scanned out of design-platform.css, so - * adding, renaming, or dropping a scrollbar token moves these assertions with - * it. + * indirection, the width variable mirrors the ::-webkit-scrollbar rule for + * consumers that align beside the bar, and elevated surfaces rebind that + * indirection in complete pairs. The expected token set is scanned out of + * design-platform.css, so adding, renaming, or dropping a scrollbar token + * moves these assertions with it. */ import { readdirSync, readFileSync } from 'node:fs' import { join } from 'node:path' @@ -341,6 +342,67 @@ describe('scrollbar.css base-surface binding', () => { }) }) +describe('scrollbar.css width variable', () => { + const WIDTH_VARIABLE = `${INDIRECTION_PREFIX}width` + + it('defines the width variable on body as a static length', () => { + // The overlay seat compensation reads a fixed number, not a second + // indirection: the mirror check below compares the WebKit rule against + // this value, so a var()-to-var() chain would compare one indirection to + // another instead of pinning the number. + const value = scrollbarRules + .filter(rule => rule.selectors.includes('body')) + .flatMap(rule => rule.declarations) + .findLast(([property]) => property === WIDTH_VARIABLE)?.[1] + expect(value, WIDTH_VARIABLE).toBeDefined() + expect(value, WIDTH_VARIABLE).toMatch(/^\d+(?:\.\d+)?px$/) + }) + + it('mirrors the ::-webkit-scrollbar width rule with the variable value', () => { + // The compensation stays aligned with the WebKit bar only while both read + // the same number. A change to one side without the other puts the overlay + // seat a band off from Chat on WebKit engines. + const variableValue = scrollbarRules + .filter(rule => rule.selectors.includes('body')) + .flatMap(rule => rule.declarations) + .findLast(([property]) => property === WIDTH_VARIABLE)?.[1] + const webkitWidth = scrollbarRules + .filter(rule => rule.selectors.includes('::-webkit-scrollbar')) + .flatMap(rule => rule.declarations) + .findLast(([property]) => property === 'width')?.[1] + expect(webkitWidth, '::-webkit-scrollbar width').toBeDefined() + expect(webkitWidth).toBe(variableValue) + }) + + it('every reader of the width variable outside ui-theme references a defined variable', () => { + // The consumer is ConversationRoot's overlay composer seat + // (`right: var(--dsh-scrollbar-width)`); a rename in scrollbar.css without + // the consumer, or a typo in the consumer, leaves the value + // guaranteed-invalid and the seat loses the band. The equal-rectangle e2e + // would catch it only on an engine that draws the bar, so the sheet + // contract states it here. + const defined = new Set( + scrollbarRules + .flatMap(rule => rule.declarations) + .filter(([property]) => property.startsWith(INDIRECTION_PREFIX)) + .map(([property]) => property), + ) + expect(defined).toContain(WIDTH_VARIABLE) + const readers: string[] = [] + for (const file of packageStylesheets()) { + if (file === fileURLToPath(new URL('scrollbar.css', STYLES))) continue + for (const rule of parseRules(readFileSync(file, 'utf8'))) { + for (const [property, value] of rule.declarations) { + for (const name of varReferences(value)) { + if (name === WIDTH_VARIABLE) readers.push(`${file} ${rule.selectors.join(', ')}: ${property}`) + } + } + } + } + expect(readers.length, 'compensation consumer').toBeGreaterThan(0) + }) +}) + describe('scrollbar.css selectors', () => { const scrollbarColorSelectors = scrollbarRules .filter(rule => rule.declarations.some(([property]) => property === 'scrollbar-color')) diff --git a/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx b/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx index ebd0e11a33..f98950ed70 100644 --- a/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx +++ b/packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx @@ -4,10 +4,10 @@ * workspace), search, the grouped tree or flat list, and the workspace * dialogs. Wide state renders the full browser; rail state renders the two * region icons (search / add workspace) as 36px controls on the shell's shared - * rail entry path, each requesting expansion through the owner share. Adding is the header - * button's one action, so it raises the directory flow with no menu in - * between; the flow and its error dialog live in WorkspacePicker (same - * package — direct composition, no slot between them). + * rail entry path, each requesting expansion through the owner share. Adding + * is the header button's one action, so it raises the directory flow with no + * menu in between; the flow and its error dialog live in WorkspacePicker + * (same package — direct composition, no slot between them). */ import { useEffect, useMemo, useRef, useState } from 'react' import clsx from 'clsx' From 7e4b8b1676588e4415e4490a44cab03cc76e501a Mon Sep 17 00:00:00 2001 From: j-xiang Date: Thu, 13 Aug 2026 00:12:44 +0800 Subject: [PATCH 006/103] docs(i18n): human-polish key Chinese READMEs --- README.i18n.yaml | 2 +- README.zh.md | 3 +- apps/cli/README.i18n.yaml | 2 +- apps/cli/README.zh.md | 24 ++++++------ apps/cli/reference/README.i18n.yaml | 2 +- apps/cli/reference/README.zh.md | 25 ++++++------ packages/core/tools/README.i18n.yaml | 2 +- packages/core/tools/README.zh.md | 38 +++++++++---------- python/sdk/README.i18n.yaml | 2 +- python/sdk/README.zh.md | 16 ++++---- .../request-response.expected.json | 2 +- 11 files changed, 58 insertions(+), 60 deletions(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index 816b9ec26c..6a566a9abb 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md README.md: 05eee108fe57f75671a74cec5f3858b1abdfcef2 -README.zh.md: 1a25075e63f13a1f92c678b88b45e2ecca4c4c77 +README.zh.md: a27d995c2c68525c10d287fb74474bbef17a3f57 diff --git a/README.zh.md b/README.zh.md index 1a25075e63..a27d995c2c 100644 --- a/README.zh.md +++ b/README.zh.md @@ -10,8 +10,7 @@ DeepSeek Harness(`dsh`)是一款基于 DeepSeek Harness SDK 构建的开源 DeepSeek Harness 正处于内部测试阶段,功能和接口可能发生变化。 -Session Log 默认留在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 可仅在提交反馈时共享 Session Log,设置 `DSH_TELEMETRY_MODE=FULL` 可持续上传;`FULL` 同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。请通过内部企业微信群反馈问题和建议。 - +会话日志默认保存在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 后,仅在提交反馈时共享对应的会话日志;设置 `DSH_TELEMETRY_MODE=FULL` 后,会持续上传会话日志。`FULL` 还会启用 dsh-sdk 命令遥测,上报匿名 ID、命令执行结果和脱敏后的项目配置。请通过内部企业微信群反馈问题和建议。 ## 运行 diff --git a/apps/cli/README.i18n.yaml b/apps/cli/README.i18n.yaml index fa2fcf2bd4..ac025294ca 100644 --- a/apps/cli/README.i18n.yaml +++ b/apps/cli/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/README.md README.md: d36183c545475020207bbf23e58d3c98b07ac6a6 -README.zh.md: 4693339e836d81c0b069704fb43451fb22accfdb +README.zh.md: 9e5507ad767640b413d00cf16f1becc0f540be2b diff --git a/apps/cli/README.zh.md b/apps/cli/README.zh.md index 4693339e83..9e5507ad76 100644 --- a/apps/cli/README.zh.md +++ b/apps/cli/README.zh.md @@ -2,22 +2,22 @@ [English](README.md) | 中文 -`dsh` 命令是 profile 的产品启动器:profile 是按序叠放的插件组合包 patch 层,之上再叠加用户自己的覆盖层。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) 只加载选中的运行器。无效命令、来自其他模式的选项、配置错误和启动失败都会以非零状态退出。 +`dsh` 是 DeepSeek Harness 中用于启动 profile 的命令;profile 由多个插件组合包 patch 层按顺序叠加而成,其上再应用用户自己的覆盖配置。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) 只加载选中的运行器。无效命令、来自其他模式的选项、配置错误和启动失败都会以非零状态退出。 ## 入口模式 | 命令 | 用途 | |---|---| | `dsh --profile ` | 启动位于 `$DSH_HOME/profiles/` 的指定 profile。 | -| `dsh --profile headless "task"` | 运行一个新的持久化会话,打印最终答案并退出。 | +| `dsh --profile headless "task"` | 运行一个全新的持久化会话,打印最终答案并退出。 | | `dsh web` | `--profile web` 的别名。 | | `dsh plugin --profile ` | 通过在 profile 目录中转发给 pnpm 来管理该 profile 的插件。 | -调用目录是默认 workspace 根目录。`web` 和 `headless` profile 在首次使用时会从随附模板自动初始化;其他任何 profile 都必须通过 `dsh plugin` 创建。 +运行命令时所在的目录将作为默认 workspace 根目录。`web` 和 `headless` profile 在首次使用时会从随附模板自动初始化;其他任何 profile 都必须通过 `dsh plugin` 创建。 ## 应用参数 -启动器只解析属于自己的 flag,并把其后的一切交给启动起来的 profile,任何注入它的应用插件都可以解析这份共享的不可变快照([`dsh-cmdline`](../../packages/boot/cmdline/README.md))。因此启动器的 flag 必须写在前面,而启动器不认识的第一个 token 就是应用参数的起点: +启动器只解析自身的 flag,并将其后的所有内容交给已启动的 profile;注入该 profile 的任意应用插件都可以解析这份共享的不可变快照([`dsh-cmdline`](../../packages/boot/cmdline/README.md))。因此,启动器的 flag 必须写在最前面;启动器无法识别的第一个 token 标志着应用参数的开始: ```sh dsh --profile web --port 8080 # --port belongs to the web app @@ -29,19 +29,19 @@ dsh --help # the launcher's own help ## Profile -profile 目录包含一个 `package.json`(树外插件依赖,加上 profile manifest(元数据清单)`dsh.profile` 及其有序的 `bundles` 列表)和一个 `cordis.patch.yml`(用户自己的 patch 层)。 +profile 目录包含一个 `package.json`,其中记录另行安装的插件依赖,以及 profile manifest(元数据清单)`dsh.profile` 和其中按顺序排列的 `bundles` 列表;还包含一个 `cordis.patch.yml`,其中保存用户自己的 patch 层。 -配置树在空根之上组合: -- 先按 `dsh.profile.bundles` 顺序应用各组合包的 patch -- 然后是 profile 的 `cordis.patch.yml`,然后是 home 级的 `$DSH_HOME/cordis.patch.yml` -- 最后是 `--patch` overlay +配置树以空根为起点,依次叠加以下配置层: +- `dsh.profile.bundles` 中各组合包的 patch +- profile 自身的 `cordis.patch.yml`,然后是 home 级的 `$DSH_HOME/cordis.patch.yml` +- `--patch` 指定的覆盖层 -`dsh.profile.bundles` 中列出的组合包先从 dsh 安装目录解析(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`),再从 profile 自己的 `node_modules` 解析;pnpm 把树外插件安装在后者。 +`dsh.profile.bundles` 中列出的组合包先从 dsh 安装目录解析(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`),再从 profile 自身的 `node_modules` 解析;pnpm 会将另行安装的插件放入该目录。 使用 `--dump-default-config` 和 `--dump-config` 可在不启动的情况下检查组合后的配置树。 -[CLI(命令行界面)行为参考](reference/README.md)负责确切的层优先级、flag、关闭行为、部署默认值和源码执行。 +层的确切优先级、flag、关闭行为、部署默认值和源码执行方式,以 [CLI(命令行界面)行为参考](reference/README.md)为准。 ## 开发 -生产运行需要已构建的包与前端产物。请在仓库根目录单独运行 `pnpm run build`,然后使用 `pnpm dsh ` 运行 TypeScript 入口并转发所有参数;模块解析约定由[源码执行参考](reference/README.md#source-execution)负责。 +生产运行需要已构建的包与前端产物。请在仓库根目录单独运行 `pnpm run build`,然后使用 `pnpm dsh ` 运行 TypeScript 入口并转发所有参数;模块解析约定以[源码执行参考](reference/README.md#source-execution)为准。 diff --git a/apps/cli/reference/README.i18n.yaml b/apps/cli/reference/README.i18n.yaml index c23be209db..ebbede237a 100644 --- a/apps/cli/reference/README.i18n.yaml +++ b/apps/cli/reference/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/reference/README.md README.md: 17d63fe73ea2b3bda74e9c4da91555b34c21f4ab -README.zh.md: 452d024c1411c4c239b5fc54ec2586e1891e74f3 +README.zh.md: 83945a09073057b8c220da9fc1a6b2b84b98f599 diff --git a/apps/cli/reference/README.zh.md b/apps/cli/reference/README.zh.md index 452d024c14..83945a0907 100644 --- a/apps/cli/reference/README.zh.md +++ b/apps/cli/reference/README.zh.md @@ -2,25 +2,25 @@ [English](README.md) | 中文 -本参考定义 profile、web 别名、插件管理和配置 dump 命令模式。参数由 [`src/args.ts`](../src/args.ts) 统一解析,[`src/bin.ts`](../src/bin.ts) 只动态导入选中的运行器。 +本参考定义 profile 启动、web 别名、插件管理和配置 dump 等命令模式。argv 由 [`src/args.ts`](../src/args.ts) 统一解析一次,[`src/bin.ts`](../src/bin.ts) 只会动态导入选中的运行器。 ## Profile 启动 -`dsh --profile ` 启动位于 `$DSH_HOME/profiles/` 的 profile。生效配置树在空根节点之上按以下顺序逐层组合:profile manifest(元数据清单)的 `dsh.profile.bundles` 列表所列的各个组合包 patch、profile 自身的 `cordis.patch.yml`、home 级的 `$DSH_HOME/cordis.patch.yml`(各 profile 共享的机器本地偏好,因此优先级高于逐 profile 的层)、以及按 argv 顺序的各个 `--patch ` overlay。后应用的层按行胜出;patch 替换目标行完整的 `config` 值,而不是深度合并各键,并且可以插入新行。配置解析、schema 校验、模块解析或插件启动失败会得到报告并以非零状态退出。收到 SIGINT 或 SIGTERM 时,挂载的根节点会先 dispose(资源释放)再退出。 +`dsh --profile ` 启动位于 `$DSH_HOME/profiles/` 的 profile。生效配置树以空根节点为起点,依次叠加 profile manifest(元数据清单)的 `dsh.profile.bundles` 列表中指定的各组合包 patch、profile 自身的 `cordis.patch.yml`、home 级的 `$DSH_HOME/cordis.patch.yml`(这是各 profile 共享的机器本地偏好,因此优先于逐 profile 配置层),以及按 argv 顺序指定的各个 `--patch ` 覆盖层。对同一配置行,后应用的层优先。patch 会替换目标行的整个 `config` 值,而不是深度合并其中的键;patch 也可以插入新行。配置解析、schema 校验、模块解析或插件启动失败时,系统会报告错误并以非零状态退出。收到 SIGINT 或 SIGTERM 时,挂载的根节点会先 dispose(资源释放)再退出。 -组合包名称先从 dsh 安装解析,再从 profile 目录解析。因此内置组合包(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`)总是来自与正在运行的 `dsh` 相同的安装;树外组合包来自 profile 由 pnpm 管理的 `node_modules`。任何 patch 行中的裸插件 `name` 通过 profile 目录的 Node 父目录逐级查找解析,该查找可达到持续维护的安装后备目录 `$DSH_HOME/profiles/node_modules`(安装的应用和组合包所依赖的每个包对应一个符号链接,每次启动时修复)。 +组合包名称先从 dsh 安装目录解析,再从 profile 目录解析。因此,内置组合包(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`)始终来自当前运行的 `dsh` 所属的安装;另行安装的组合包则来自 profile 中由 pnpm 管理的 `node_modules`。patch 行中的裸插件 `name` 会从 profile 目录开始,按照 Node 的模块解析规则逐级向父目录查找,直至由 dsh 维护的安装后备目录 `$DSH_HOME/profiles/node_modules`。该目录为 dsh 安装中的应用和组合包所依赖的每个包各维护一个符号链接,并在每次启动时修复这些链接。 `web` 和 `headless` profile 首次使用时会从随附模板自动初始化(`web`:base + web-app;`headless`:base + headless)。其他缺失的 profile 会显式报错,并提示运行 `dsh plugin --profile add `。 ### 应用参数 -启动器自己的 flag 写在最前面,并在它不认识的第一个 token 处结束;从那里开始的一切都通过 `ctx.cmdlineArgs` 原样交给启动起来的 profile,任何注入它的应用插件都可以解析([`dsh-cmdline`](../../../packages/boot/cmdline/README.md))。因此 `dsh --profile web --port 8080` 到达的是 web 应用的 `--port`,`dsh --profile web --help` 打印的是该应用的 help 且什么也不启动,而 `dsh --help`(没有可以交付的 profile)打印的是启动器自己的 help。`-V`/`--version` 写在应用参数边界之前时会打印启动器的版本。 +启动器自身的 flag 必须写在最前面,并在遇到第一个无法识别的 token 时结束;从该 token 开始的所有内容都会通过 `ctx.cmdlineArgs` 原样交给已启动的 profile,注入该 profile 的任意应用插件都可以解析这些内容([`dsh-cmdline`](../../../packages/boot/cmdline/README.md))。因此,`dsh --profile web --port 8080` 会将 `--port` 交给 web 应用;`dsh --profile web --help` 只打印该应用的帮助信息,不启动应用;`dsh --help` 没有可供交付参数的 profile,因此会打印启动器自身的帮助信息。`-V`/`--version` 位于应用参数边界之前时,会打印启动器的版本。 -一套组合只挂载一次。普通插件注入 `cmdlineArgs`、解析本应用参数,并把结果作为服务提供出去;由 flag 配置的每一行都会注入该服务,Loader 会等服务激活后再求值该行配置(`port: !!js ctx.webStartup.port ?? 3080`),因此 flag 胜过写在它旁边的值。该优先级要求配置行保留这一表达式;若用户 patch 用字面量替换整份 `config`,运行时读取也会随之消失。help 和被拒绝的参数会请求退出——拒绝时以非零状态,help 时以 0——且不会激活依赖提供方服务的行。在线编辑 `cordis.patch.yml` 会针对仍然在线的服务重新求值表达式,因此不会重置已在服务的端口。 +每套组合只会挂载一次。普通插件注入 `cmdlineArgs`,解析所属应用的参数,并将解析结果作为服务提供。每个从 flag 取值的配置行都会注入该服务;Loader 会等到服务激活后,再对该行的配置求值(`port: !!js ctx.webStartup.port ?? 3080`),因此 flag 的优先级高于配置行中写明的值。要维持这一优先级,配置行必须保留该表达式;如果用户 patch 用字面量替换整个 `config`,也会随之移除运行时读取。帮助参数和被拒绝的参数都会请求退出:参数被拒绝时以非零状态退出,显示帮助时以 0 退出;依赖该提供方服务的配置行不会激活。在线编辑 `cordis.patch.yml` 时,系统会根据仍在运行的服务重新计算表达式,因此不会重置当前正在使用的端口。 启动器的 flag 必须写在应用参数之前,且启动器的解析器会消耗掉一个 `--`:必须以字面量 `--` 送达应用的参数需要写成 `-- --`。如果应用的第一个参数恰好等于 `web` 或 `plugin`,会选择对应的子命令。`ctx.cmdlineArgs.get()` 是共享的不可变读取:多个插件可以解析同一份快照,没有读取方的 profile 则会忽略自己的应用参数。 -随附的各应用持有这些命令行: +随附的应用接受以下命令行参数: | Profile | 参数 | |---|---| @@ -36,11 +36,11 @@ dsh --profile web --dump-default-config dsh --profile web --patch ./extra.yml --dump-config ``` -`--dump-default-config` 只打印组合包各层;`--dump-config` 额外加上 profile 的 `cordis.patch.yml`、home 级的 `$DSH_HOME/cordis.patch.yml` 和 `--patch` overlay。两者都会打印注释,标明每行由哪个文件提供,以及哪些 overlay 修改过它;`!!js` 表达式保持未求值,找不到目标的 patch 会报告到 stderr。dump 从不运行应用命令行提供方,因此它展示的是任何应用参数被解析之前的组合配置树,并拒绝携带应用参数的调用。 +`--dump-default-config` 只打印组合包各层;`--dump-config` 额外加上 profile 的 `cordis.patch.yml`、home 级的 `$DSH_HOME/cordis.patch.yml` 和 `--patch` overlay。两者都会打印注释,标明每行由哪个文件提供,以及哪些 overlay 修改过它;`!!js` 表达式保持未求值,找不到目标的 patch 会报告到 stderr。dump 操作不会运行应用的命令行参数提供方,因此展示的是解析任何应用参数之前的组合配置树;如果调用中包含应用参数,dump 会拒绝该调用。 ## 插件管理 -`dsh plugin --profile ` 在 profile 缺失时先初始化它(有随附模板的用模板,其他名称只装 `@deepseek-ai/dsh-base`),然后以 profile 目录为工作目录,把 `` 转发给 `pnpm`:`add`、`remove`、`why`、`update` 及其他所有 pnpm 子命令都照常可用;pnpm 必须在 PATH 上。相对路径 spec(`.`、`../plugin` 及其 `file:`/`link:` 形式)会先锚定到调用目录,因此在插件 checkout 中执行 `add .` 安装的是该 checkout,而不是 profile。每次成功运行后,`dsh.profile.bundles` 都会与已安装状态对齐:每个解析到 manifest 中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }` 的包的依赖加入层栈(因此让包获得该声明的 `update` 会将其激活),没有组合包声明的依赖保持为普通依赖并给出一次性警告,已移除的依赖则退出层栈。 +`dsh plugin --profile ` 在 profile 缺失时先初始化它(有随附模板的用模板,其他名称只装 `@deepseek-ai/dsh-base`),然后以 profile 目录为工作目录,把 `` 转发给 `pnpm`:`add`、`remove`、`why`、`update` 及其他所有 pnpm 子命令都照常可用;pnpm 必须在 PATH 上。相对路径 spec(`.`、`../plugin` 及其 `file:`/`link:` 形式)会先锚定到调用目录,因此在插件 checkout 中执行 `add .` 安装的是该 checkout,而不是 profile。每次成功运行后,系统都会根据当前安装状态更新 `dsh.profile.bundles`:如果某项依赖解析到的包在 manifest(元数据清单)中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }`,该依赖就会加入配置层栈;如果某项依赖在 `update` 后获得该声明,也会随即激活。没有组合包声明的依赖仍作为普通依赖保留,并显示一次性警告;已移除的依赖则从配置层栈中删除。 ```sh dsh plugin --profile tui add github:deepseek-harness/turtle-ui @@ -48,7 +48,7 @@ dsh plugin --profile tui remove turtle-ui dsh --profile tui ``` -Git 托管、随附源码的插件在安装期间通过其 `prepare` 脚本构建,而 pnpm ≥10 在消费方允许之前会阻止该脚本:首次 `add` 会失败并给出 pnpm 的 `allowBuilds` 提示(以及 dsh 指向该 profile 的 `pnpm-workspace.yaml` 的指引);把打印出的键复制到那里并重新运行即可。安装已构建的 tarball 或本地 checkout 不需要任何允许。 +随源码发布的 Git 托管插件会在安装期间通过 `prepare` 脚本构建,而 pnpm ≥10 默认会阻止该脚本,直到使用方明确允许。首次运行 `add` 会失败,并显示 pnpm 的 `allowBuilds` 提示;dsh 还会提示应修改该 profile 的 `pnpm-workspace.yaml`。将输出的键复制到该文件后,重新运行命令即可。安装已经构建好的 tarball 或本地 checkout 时,无需加入 `allowBuilds`。 ## Web 别名 @@ -63,9 +63,9 @@ dsh web --help 生产 Web 运行器需要已构建的包和前端产物(`pnpm run build`)。默认服务地址是 `http://127.0.0.1:3080`。绑定所有网络接口时,还会信任机器自动发现的 LAN IP 字面量;`--trusted-host` 可添加 `/api` 浏览器信任围栏接受的具名 authority。 -进程关闭时会给插件树最多 5 秒完成 dispose。第一次 `SIGINT`/`SIGTERM` 启动该优雅排空——`SIGTERM` 是监督进程的普通停止请求,在所有 surface 上以 0 退出,`SIGINT` 报告 130;第二次信号强制立即退出。如果一次性运行正常结束时已经卡在 dispose 中,第一次 `Ctrl+C` 就会升格并立即退出,而不会被吞掉。 +进程关闭时,插件树最多有 5 秒完成 dispose。首次收到 `SIGINT` 或 `SIGTERM` 时会开始优雅排空:`SIGTERM` 是监督进程发出的常规停止请求,在所有运行模式下都以 0 退出;`SIGINT` 则报告 130。第二次收到信号时会立即强制退出。如果一次性运行在正常结束时已经卡在 dispose 阶段,第一次按下 `Ctrl+C` 就会直接升级为强制退出,而不会被忽略。 -所有模式都将调用目录作为默认 workspace 根目录,以 65,536 字节渲染预算加载适用的 `AGENTS.md` 或 `CLAUDE.md` 指令,并使用内存 SQLite 会话内容索引。每次 profile 启动都监视两个 `cordis.patch.yml` 层(profile 与 home)的有效编辑并以事务方式重新应用;一次性 surface 经由有界关闭退出,关闭会先 dispose 监视器。 +所有模式都将运行命令时所在的目录作为默认 workspace 根目录,以 65,536 字节渲染预算加载适用的 `AGENTS.md` 或 `CLAUDE.md` 指令,并使用内存 SQLite 会话内容索引。每次启动 profile 时,系统都会监视 profile 与 home 两个 `cordis.patch.yml` 配置层的有效变更,并以事务方式重新应用;一次性运行模式通过有界关闭流程退出,该流程会先 dispose 监视器。 新会话默认使用 `workspace-write` 权限预设。Bash 和文件系统修改仅限于会话 workspace 与平台临时根目录;读取、网络访问和进程可见性不受限制。`DSH_PERMISSION_MODE` 更改进程后备值。General settings 中存储的权限影响后续 Web 会话,不改变已打开的会话。 @@ -75,8 +75,7 @@ dsh web --help 基础组合包挂载原生 DeepSeek 适配器、settings 与凭据提供方、稳定的 `web_search` 和已禁用的会话遥测。提供方凭据依次从继承环境、`$DSH_HOME/.credentials.yaml`、调用目录的 `.env` 和 `$DSH_HOME/.env` 解析;受管文档从不物化进 `process.env`,而两个 `.env` 文件都是普通启动环境层。搜索使用 `DEEPSEEK_API_KEY` 并接受 `DEEPSEEK_SEARCH_BASE_URL`;只有 patch 层插入提供方并启用 `web_fetch` 后,该工具才可用。 -会话遥测默认留在本地。`DSH_TELEMETRY_MODE=FULL` 将每条已投影会话事件作为 OTLP/HTTP 日志流式发送,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 则仅在记录反馈时上传会话日志后缀。`DSH_TELEMETRY_OTLP_URL` 选择其他 collector,任何非空 `DSH_TELEMETRY_DISABLED` 仍是具有最高优先级的硬性退出开关。随附基础配置没有遥测脱敏规则,因此显式启用的导出可能包含消息文本、工具参数与结果以及 workspace 路径;该部署决策由[默认关闭 Agent Note](../../../.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md)负责。 - +会话遥测默认留在本地。`DSH_TELEMETRY_MODE=FULL` 将每条已投影会话事件作为 OTLP/HTTP 日志流式发送,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 则仅在记录反馈时上传会话日志后缀。`DSH_TELEMETRY_OTLP_URL` 选择其他 collector。任何非空的 `DSH_TELEMETRY_DISABLED` 都是具有最终效力的遥测强制关闭开关。随附基础配置没有遥测脱敏规则,因此显式启用的导出可能包含消息文本、工具参数和结果,以及 workspace 路径;相关部署决策见[默认关闭 Agent Note](../../../.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md)。 通过 `dsh plugin --profile add ` 安装外部插件组合包。安装的包拥有其依赖,并贡献其声明的 `cordis.patch.yml` 层。CLI 还随附 `@deepseek-ai/dsh-mcp-client` 作为供 patch 层使用的依赖,但默认不启用 MCP 服务器,因为每条服务器命令都是 agent(智能体)沙箱之外的受信任可执行代码。 diff --git a/packages/core/tools/README.i18n.yaml b/packages/core/tools/README.i18n.yaml index 7011884239..9cda431253 100644 --- a/packages/core/tools/README.i18n.yaml +++ b/packages/core/tools/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/core/tools/README.md README.md: 44eb25b79436a75f08406102fc1e3734e59b1001 -README.zh.md: a47e7c54b0cd3fc3c5146a9a8be4d1406f9ef8aa +README.zh.md: d77b4ee5248b19418c27674faf7afd52957c6382 diff --git a/packages/core/tools/README.zh.md b/packages/core/tools/README.zh.md index a47e7c54b0..d77b4ee524 100644 --- a/packages/core/tools/README.zh.md +++ b/packages/core/tools/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -工具注册表与执行流水线。工具插件注册各自的 schema 和执行器;agent loop(智能体循环)依次让每次调用经过 `tools/pre-execute`(可扩展的允许/拒绝门禁)→ 已注册的单调守卫 → `tools/execute`(供超时/重试/指标插件使用的环绕分发包装层)→ `tools/post-execute`(检查/替换结果、附加上下文)→ 定义自身的 `finalizeContent` 终结步骤 → 仅观测的 `tools/result` 通知。注册表还负责决定如何向模型呈现其工具:`mode` 配置可以选择原生 Function Calling(函数调用)、[Code Mode](#code-mode),或同时选择两者;单个 agent 可用 `presentAs` 为自己遮蔽该默认值。 +工具注册表与执行流水线。工具插件注册各自的 schema 和执行器;agent loop(智能体循环)依次让每次调用经过 `tools/pre-execute`(可扩展的允许/拒绝门禁)→ 已注册的单调守卫 → `tools/execute`(供超时/重试/指标插件使用的环绕分发包装层)→ `tools/post-execute`(检查/替换结果、附加上下文)→ 由工具定义持有的 `finalizeContent` 边界 → 仅观测的 `tools/result` 通知。注册表还决定以何种方式向模型呈现工具:`mode` 配置可以选择原生 Function Calling(函数调用)、[Code Mode](#code-mode),或同时选择两者;单个 agent 可用 `presentAs` 为自己遮蔽该默认值。 ## 服务:`ToolRegistry`(ctx 键:`tools`) @@ -13,17 +13,17 @@ tools: mode: native # native (default) | code | both ``` -`native` 以函数定义的形式贡献可见工具。`code` 贡献保留的 `run_code` 传输、生成的 `tools:sdk` 段,以及声明「只有 `run_code` 可被直接调用」的 `tools:code-only` 规则——执行器随后强制该规则,模型直呼其他任何工具名都会在策略运行之前解析为 `UNKNOWN_TOOL`;`both` 同时贡献两种形式,且不声明该规则,因为它的原生调用确实会执行。这是「未作声明的 agent」的默认值——agent preset 用 [`dsh-agent-tool-mode`](../agent-tool-mode/README.md) 为自己选择。不能注册、遮蔽、限制或移除该保留传输,且无论配置何种模式,该名称都是保留的,因为任何 agent 都可能选择 code 模式。非原生模式要求所加载 `ctx.codeRuntime` 的 `language` 有已注册的 SDK 渲染器——TypeScript 经 [`dsh-code-runtime-worker`](../../code-runtime/code-runtime-worker/README.md) 交付;Python 渲染器内置,驱动任何报告 `language: 'python'` 的运行时(第一方 `dsh-code-runtime-python` 后端另行交付)。没有渲染器的运行时语言会导致提示词组装明确失败;如果 `systemPrompt.toolOrder` 条目指向当前模式未贡献的工具,系统会拒绝组装提示词。`system-prompt/assemble` 监听器可以替换注册表贡献;它返回的组装结果具有权威性,因此该监听器负责保留可用的 Code Mode 协议。 +`native` 以函数定义的形式贡献可见工具。`code` 会提供预留的 `run_code` 传输、生成的 `tools:sdk` 段,以及声明「只有 `run_code` 可被直接调用」的 `tools:code-only` 规则。执行器随后强制执行该规则:模型直接调用其他任何工具时,会在策略运行前将该调用解析为 `UNKNOWN_TOOL`;`both` 同时提供两种形式,且不声明该规则,因为其中的原生调用确实可以执行。没有单独声明呈现模式的 agent 默认采用此配置;agent preset 可通过 [`dsh-agent-tool-mode`](../agent-tool-mode/README.md) 自行选择呈现模式。不能注册、遮蔽、限制或移除该保留传输,且无论配置何种模式,该名称都是保留的,因为任何 agent 都可能选择 code 模式。非原生模式要求所加载 `ctx.codeRuntime` 的 `language` 有已注册的 SDK 渲染器——TypeScript 经 [`dsh-code-runtime-worker`](../../code-runtime/code-runtime-worker/README.md) 交付;Python 渲染器内置,驱动任何报告 `language: 'python'` 的运行时(第一方 `dsh-code-runtime-python` 后端另行交付)。没有渲染器的运行时语言会导致提示词组装明确失败;如果 `systemPrompt.toolOrder` 条目指向当前模式未贡献的工具,系统会拒绝组装提示词。`system-prompt/assemble` 监听器可以替换注册表贡献;它返回的组装结果具有权威性,因此该监听器负责保留可用的 Code Mode 协议。 ### 公开 API -- `ctx.tools.register(definition: ToolDefinition): () => void`:注册一个受信任、带类型的同进程定义,其中必须包含规范的 `output` 声明。所在层由调用上下文的作用域决定:普通插件上下文会全局注册;agent 的 `agent.ctx` 只为该 agent 注册,并在此处遮蔽同名全局工具。同一层内名称重复会抛出;非原生模式还会拒绝保留的 `run_code` 传输名称。缺失或不受支持的输出声明,以及非正数或非有限的 `timeoutMs`,都会使注册失败。可选的同步 `finalizeContent` 回调会在调用开始时创建快照;在所有流水线结果(包括实体化其他结果字段时发现的错误)规范化之后,它只能替换最终面向模型的内容。随调用 fiber dispose(资源释放)。 -- `ctx.tools.presentAs(mode: ToolPresentationMode): () => void`:为本 agent 选择面向模型的呈现方式,仅对该 agent 遮蔽 `mode` 配置;从普通上下文调用会抛出(进程级呈现方式是那个配置字段),同一 scope 内第二次声明也会抛出。code 类模式还会为该 agent 注册它自己的 `tools:sdk` 段。清单本身不变——`schemas(agent)` 报告的仍是该 agent 的能力,仅组装结果中的工具会被折叠。随调用方 fiber dispose。 +- `ctx.tools.register(definition: ToolDefinition): () => void`:注册一个受信任、带类型的同进程定义,其中必须包含规范的 `output` 声明。所在层由调用上下文的作用域决定:普通插件上下文会全局注册;agent 的 `agent.ctx` 只为该 agent 注册,并在此处遮蔽同名全局工具。同一层内名称重复会抛出;非原生模式还会拒绝保留的 `run_code` 传输名称。缺失或不受支持的输出声明,以及非正数或非有限的 `timeoutMs`,都会使注册失败。可选的同步 `finalizeContent` 回调会在调用开始时纳入快照;在所有流水线结果(包括实体化其他结果字段时发现的错误)规范化之后,它只能替换最终面向模型的内容。该注册会随调用方 fiber 一同 dispose(资源释放)。 +- `ctx.tools.presentAs(mode: ToolPresentationMode): () => void`:为本 agent 选择面向模型的呈现方式,仅对该 agent 遮蔽 `mode` 配置;从普通上下文调用会抛出(进程级呈现方式是那个配置字段),同一 scope 内第二次声明也会抛出。code 类模式还会为该 agent 注册它自己的 `tools:sdk` 段。工具目录保持不变:`schemas(agent)` 仍会报告该 agent 的能力;只有组装结果中的工具列表会按所选呈现方式收束。随调用方 fiber dispose。 - `ctx.tools.restrict(filter)`:对全局工具应用 agent 作用域的允许/拒绝掩码;从普通上下文调用会抛出。筛选器在注册时创建快照;多个掩码取交集,随后再合并作用域本地工具。拒绝掩码会接纳后来出现且未点名的全局工具,而允许掩码会排除后来出现的名称。未知、本地或保留名称以及空筛选器都会被拒绝。这是实时可见性组合,不是权限边界;参见[作用域安全非目标](../../../.agents/notes/implemented/architecture/2026-07-08-agent-scope-contexts.md#security-and-authority-are-non-goals)。 -- `ctx.tools.get(name: string, scope?: ScopeKey): ToolDefinition | undefined`:按某个作用域所见的结果解析(应用遮蔽;被限制掉的全局工具视为不存在)。呈现器会传入发起调用的 agent,使卡片与实际执行内容一致。 +- `ctx.tools.get(name: string, scope?: ScopeKey): ToolDefinition | undefined`:返回指定作用域可见的解析结果,其中已应用名称遮蔽;被作用域限制排除的全局工具会被视为不存在。呈现器会传入发起调用的 agent,使卡片与实际执行内容一致。 - `ctx.tools.schemas(scope?: ScopeKey): ToolSchema[]`:返回该作用域可见的所有 schema(不含 `execute` 函数)。已交付工具的 schema 收录在 [docs/tool-catalog.md](../../../docs/tool-catalog.md) 中;该目录通过启动每个工具插件并采集此方法的结果生成(参见[工具 schema 目录 Agent Note](../../../.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md))。 - `ctx.tools.guard(guard: ToolGuard): () => void`:在 `tools/pre-execute` 之后注册单调同步执行守卫:返回理由会拒绝调用,返回 `undefined` 则保持原决定。普通上下文守卫全局生效;`agent.ctx` 守卫只对该 agent 生效。后续 waterfall(瀑布式事件)监听器无法将守卫的拒绝重新变为允许。随调用 fiber dispose。 -- `ctx.tools.execute(exec)`:以无损方式快照并冻结参数,分配不透明 token,运行完整的策略/分发/结果流水线,然后在最终观测前独立快照权威结果。无效参数会进入同一结果路径,但不会到达策略或工具主体。环绕包装层只能替换 `signal`;注册表会在调用主体前立即重新融合调用方的原始信号。 +- `ctx.tools.execute(exec)`:以无损方式快照并冻结参数,分配不透明 token,运行完整的策略/分发/结果流水线,然后在最终观测前独立快照权威结果。无效参数会进入同一结果路径,但不会到达策略或工具主体。环绕包装层只能替换 `signal`;注册表会在进入工具主体之前,立即将调用方的原始信号重新合并到当前信号中。 - `ctx.tools.executionMode(exec)`:返回 `parallel` 的唯一条件是可见定义的 `isConcurrencySafe(exec.arguments)` 分类器恰好返回 `true`;未知、隐藏、未声明、无效或抛出异常的分类结果均为独占。 ### 注入的服务 @@ -32,11 +32,11 @@ tools: ### 取消 -取消采用协作方式,并等待完全停稳。每次类型化调用都提供由调用方拥有的 `AbortSignal`;工具主体通过必填的只读 `exec.signal` 接收它,只有 `tools/execute` 包装层可以临时替换这个必填信号。注册表会在替换期间保留调用方取消,并且绝不会在已启动的同进程 Promise 尚未结算时提前返回。工具主体调用前发生的取消为 `ABORTED_BEFORE_DISPATCH`;调用主体后的取消只能把成功结果替换为 `ABORTED`。拒绝、包装层失败、工具失败、后置策略失败或由超时机制产生的 `TOOL_TIMEOUT` 仍保留更具体的结果。入口处已中止的调用会实体化并冻结参数,随后跳过所有策略和分发阶段,只发布一个结果。每个异步工具都必须观测或转发该信号,并且只能在自身拥有的工作停止后结算。[工具取消 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-19-cooperative-tool-cancellation.md) 规定完整约定和强制终止边界。 +取消采用协作方式,并等待完全停稳。每次类型化调用都提供由调用方拥有的 `AbortSignal`;工具主体通过必填的只读 `exec.signal` 接收它,只有 `tools/execute` 包装层可以临时替换这个必填信号。注册表会在替换期间保留调用方取消,并且绝不会在已启动的同进程 Promise 尚未结算时提前返回。工具主体调用前发生的取消为 `ABORTED_BEFORE_DISPATCH`;工具主体被调用后发生的取消,只能将成功结果替换为 `ABORTED`。拒绝、包装层失败、工具失败、后置策略失败或由超时机制产生的 `TOOL_TIMEOUT` 仍保留更具体的结果。入口处已中止的调用会实体化并冻结参数,随后跳过所有策略和分发阶段,只发布一个结果。每个异步工具都必须观测或转发该信号,并且只能在其负责的工作停止后结算。[工具取消 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-19-cooperative-tool-cancellation.md) 规定完整约定和强制终止边界。 ### 实时事件 -实时注册表流水线先经过 3 个可变换的 waterfall,再经过由定义拥有的内容终结器,最后发布仅供观测的 `tools/result` 事件;注册表变更有意作为不过滤的共享状态通知。确切签名、分发 mode、作用域筛选和失败隔离约定位于 [tools.md](../../../docs/subsystems/tools.md#cordis-surface) 的生成区块,完整顺序则在生成的[工具执行流水线](../../../docs/tool-execution-pipeline.md)中可视化。`tools/result` 是实时事件;名称相近的 `tool/result` 是 agent loop 随后追加的持久会话事件。 +实时注册表流水线先经过 3 道可转换的 waterfall,再经过由工具定义持有的内容终结器,最后发布仅供观测的 `tools/result` 事件;注册表变更通知有意不作过滤,并作为共享状态通知发布。确切签名、分发 mode、作用域筛选和失败隔离约定位于 [tools.md](../../../docs/subsystems/tools.md#cordis-surface) 的生成区块,完整顺序则在生成的[工具执行流水线](../../../docs/tool-execution-pipeline.md)中可视化。`tools/result` 是实时事件;名称相近的 `tool/result` 是 agent loop 随后追加的持久会话事件。 ### 关键类型 @@ -102,16 +102,16 @@ ctx.tools.register(defineTool({ ### 强制执行的原始 JSON Schema 子集 -`JsonSchemaNode` 是工具输出、Code Mode 生成、subagent 和工作流共享的原始对应类型。它允许任意 JSON 根、一个仅含 annotation 的无约束 JSON 节点,以及恰好匹配一个分支的 `oneOf`;annotation 必须保持为无损 JSON。`assertSupportedJsonSchema()` 拒绝不受支持的构造,而 `validateJsonSchemaValue()` 返回带路径的违规信息。subagent 和工作流通过 `assertObjectJsonSchema()` 与 `ObjectJsonSchema` 保留调用方定义的对象根要求,而不是依赖共享词汇的限制。 +`JsonSchemaNode` 是工具输出、Code Mode 生成、subagent 和工作流共享的原始 JSON Schema 对应类型。它允许任意 JSON 根、仅含注解且不施加约束的 JSON 节点,以及恰好匹配一个分支的 `oneOf`;注解必须保持为无损 JSON。`assertSupportedJsonSchema()` 拒绝不受支持的构造,而 `validateJsonSchemaValue()` 返回带路径的违规信息。subagent 和工作流通过 `assertObjectJsonSchema()` 与 `ObjectJsonSchema` 保留调用方定义的对象根要求,而不是依赖共享词汇的限制。 -### 工具拥有的 UI 呈现 +### 由工具定义的 UI 呈现 -工具可以选择拥有纯 `presentCall()` 和 `presentResult()` 呈现意图,使 UI 无需特殊处理工具名称: +工具可以选择通过纯函数 `presentCall()` 和 `presentResult()` 定义呈现意图,使 UI 无需针对工具名称编写特殊逻辑: - 调用视图为 `{ card: 'generic', title, kind?, rawInput?, content?, locations? }`、`{ card: 'terminal', title, description?, cwd? }` 或 `{ card: 'diff', title, diffs, locations? }`。 -- 结果视图为 `{ card: 'generic', title?, content? }`、`{ card: 'terminal', title?, output?, exitCode?, signal? }`、`{ card: 'diff', title?, diffs }`、`{ card: 'search', shape, title?, truncated, total, … }`(已完成的发现型搜索——`shape: 'matches'`(grep)为按文件分组的匹配,`shape: 'paths'`(glob)为扁平路径列表,配 `truncated`/`total` 使 UI 永不把被截断的结果当作完整结果呈现;该视图不携带结果文本,且搜索没有 `card: 'search'` 的调用时对应视图)、`{ card: 'read', title?, path, offset, lines, totalLines, lang?, content? }`(已完成的文件读取→带行号、可选语法高亮的代码视图;`offset` 是窗口请求的 1-based 起始行,即使 `lines` 为空也保留;`lines` 是 `{ number, text }[]`,保留每一行的文件行号,`content` 是无读取能力的 UI 回退时使用的去信封文本)或 `{ card: 'web', kind: 'search' | 'fetch', title?, … }`(已完成的 web 检索;`kind` 各分支携带结构化的搜索来源或抓取摘要,不具备 `web` 能力的 UI 回退到原始结果内容)。 +- 结果视图为 `{ card: 'generic', title?, content? }`、`{ card: 'terminal', title?, output?, exitCode?, signal? }`、`{ card: 'diff', title?, diffs }`、`{ card: 'search', shape, title?, truncated, total, … }`(已完成的发现型搜索——`shape: 'matches'`(grep)为按文件分组的匹配,`shape: 'paths'`(glob)为扁平路径列表,配 `truncated`/`total` 使 UI 永不把被截断的结果当作完整结果呈现;该视图不携带结果文本,且搜索没有 `card: 'search'` 的调用时对应视图)、`{ card: 'read', title?, path, offset, lines, totalLines, lang?, content? }`(已完成的文件读取→带行号、可选语法高亮的代码视图;`offset` 是窗口请求的 1-based 起始行,即使 `lines` 为空也保留;`lines` 是 `{ number, text }[]`,保留每一行的文件行号,`content` 是去除读取结果外层封装后的正文,供不支持读取视图的 UI 回退显示)或 `{ card: 'web', kind: 'search' | 'fetch', title?, … }`(已完成的 web 检索;`kind` 各分支携带结构化的搜索来源或抓取摘要,不具备 `web` 能力的 UI 回退到原始结果内容)。 -返回 `undefined` 会选择通用回退。呈现器只依赖其参数和持久结果,因为 UI 会在实时流式输出和日志回放期间调用它们。`output.presentationMeta(args, value)` 为直接接口调用派生 JSON 元数据;该元数据随 `tool/result` 持久化并传回 `presentResult`,而规范值本身仍只存在于执行局部,绝不会回放。嵌套 Code 分发不会计算元数据。`defineTool` 会软验证较旧的日志参数并回退,而不会使回放崩溃。`dsh-tool-bash` 与 `dsh-tool-fs` 是参考实现;[规范输出 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-20-canonical-tool-output-contract.md) 规定值/呈现拆分,[呈现意图 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-02-tool-render-intent-union.md) 规定卡片词汇。 +返回 `undefined` 会选择通用回退。呈现器只依赖其参数和持久结果,因为 UI 会在实时流式输出和日志回放期间调用它们。`output.presentationMeta(args, value)` 为直接的顶层调用派生 JSON 元数据;该元数据随 `tool/result` 持久化并传回 `presentResult`,而规范值本身仍只存在于执行局部,绝不会回放。嵌套 Code 分发不会计算元数据。`defineTool` 会软验证较旧的日志参数并回退,而不会使回放崩溃。`dsh-tool-bash` 与 `dsh-tool-fs` 是参考实现;[规范输出 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-20-canonical-tool-output-contract.md) 规定值/呈现拆分,[呈现意图 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-02-tool-render-intent-union.md) 规定卡片词汇。 ### Code Mode @@ -119,10 +119,10 @@ ctx.tools.register(defineTool({ 在 `code`(而非 `both`)下,该传输同时也是模型唯一可用的入口:模型直呼其他任何可见工具名,都会在创建执行时、早于 `tools/pre-execute`、审批 `ask` 和 guards 解析为 `UNKNOWN_TOOL`,因此没有任何一方会观察或批准一个注定失败的调用。拒绝信息会给出正确路径(`only \`run_code\` is callable directly — call \`\` from inside a \`run_code\` program instead`),因为同一份提示词刚刚声明过那个工具,只说 `unknown tool` 会被读成部署损坏。SDK 子分发携带外层执行的 `parent` token,不受此限制,因此程序保留 SDK 声明的全部绑定。参见[执行器塌缩 note](../../../.agents/notes/implemented/bug-fix/2026-08-07-code-mode-executor-collapse.md)、[Code Mode 基础](../../../.agents/notes/implemented/feature/2026-06-15-code-mode.md)、[类型化返回约定](../../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md)和[代码运行时 seam](../../code-runtime/README.md)。可以运行 `pnpm run demo:code-mode` 试用。 -- **SDK 段**(`tools:sdk`,顺序 150):一个惰性提示词段,每次组装时都会重新生成与所加载运行时语言相符的 SDK 文本。TypeScript 形态发出 `JsonValue`、精确的 `ToolArgsMap` / `ToolOutputMap`、`ToolName`、`ToolCallError` 声明、面向调用作用域可见最终能力的映射 `tools` 命名空间(特殊名称使用带引号的键),以及固定用法说明;Python 形态(`ctx.codeRuntime.language === 'python'`)发出等价的具名 `TypedDict` 与一个带相同用法说明的 `tools` 对象。其输出具有确定性:工具按字典序排列;工具集合不变时,文本逐字节相同(有利于前缀 cache)。两个代码生成器都已导出,且绝不会在提示词组装期间抛出:`jsonSchemaToTs` 处理统一 schema 的每种构造并将不受支持的原始构造降级为 `unknown`;`jsonSchemaToPy` 同理,降级为 `Any`(当某字段名不是合法的 `TypedDict` 属性时,或在 SDK 渲染之外被调用时——`TypedDict` 声明所需的命名上下文由该渲染提供——整个对象降级为 `dict[str, Any]`)。 -- **分发桥接层**(`run_code` 的 execute):每个绑定调用都会在分发前快照为无损 JSON(`undefined`、`BigInt`、循环、稀疏数组、`-0` 和特殊对象会使该次调用被拒绝),经由每次运行独有、复用原生并发约定的池调度——调用严格按提交顺序启动,连续的 `isConcurrencySafe` 调用最多可重叠经校验的 `maxParallelSubCalls` 配置个(默认 10;设为 `1` 即恢复串行分发),被分类为独占的调用先排空池、单独运行并阻挡其后的调用——以外层执行的不透明 token 作为 `parent`,并经过完整的 pre-execute → guards → execute → post-execute → result 流水线。成功会返回策略处理后的最终规范值;失败以一条消息到达 worker,并成为 `ToolCallError(toolName, message)`。每个已启动的子调用在进入流水线时记录一条 `tool/code-dispatch-start` 事件(确定性 id `:code:`,按提交顺序编号),并以一条携带完整模型可见 `content`/`isError` 结果的 `tool/code-dispatch` 事件完结(采用 `tool/result` 词汇,因此 UI 会沿原生路径呈现子调用——这对事件的 `time` 字段承载每个子调用的计时);因 run 结算而被放弃的排队调用两者都不记录。`deriveMessages()` 既不公开这两个事件,也不持久化规范值。token 关联让以提交为语义的观察器能够把内部成功延迟到最终 `run_code` 结果,而无需公开实时外层执行;普通工具副作用不会回滚。每个子调用的 `additionalContexts` 条目都会按分发顺序通过外层 `ToolRunContext` 延迟;循环只在父级 `run_code` 结果之后追加这些上下文,从而保持相邻关系,并且即使程序后来失败,也会保留各自的来源/元数据。 +- **SDK 段**(`tools:sdk`,顺序 150):一个在组装时求值的提示词段,每次组装都会重新生成与所加载运行时语言相符的 SDK 文本。TypeScript 形态会生成 `JsonValue`、精确的 `ToolArgsMap` / `ToolOutputMap`、`ToolName`、`ToolCallError` 声明,以及映射调用作用域最终可见工具的 `tools` 命名空间(特殊名称使用带引号的键),并附带固定的使用说明;Python 形态(`ctx.codeRuntime.language === 'python'`)发出等价的具名 `TypedDict` 与一个带相同用法说明的 `tools` 对象。其输出具有确定性:工具按字典序排列;工具集合不变时,文本逐字节相同(有利于前缀 cache)。两个代码生成器都已导出,且绝不会在提示词组装期间抛出:`jsonSchemaToTs` 处理统一 schema 的每种构造并将不受支持的原始构造降级为 `unknown`;`jsonSchemaToPy` 同理,降级为 `Any`(当某字段名不是合法的 `TypedDict` 属性时,或在 SDK 渲染之外被调用时——`TypedDict` 声明所需的命名上下文由该渲染提供——整个对象降级为 `dict[str, Any]`)。 +- **分发桥接层**(`run_code` 的 execute):每个绑定调用都会在分发前快照为无损 JSON(`undefined`、`BigInt`、循环、稀疏数组、`-0` 和特殊对象会使该次调用被拒绝),经由每次运行独有、复用原生并发约定的池调度——调用严格按提交顺序启动,连续的 `isConcurrencySafe` 调用最多可重叠经校验的 `maxParallelSubCalls` 配置个(默认 10;设为 `1` 即恢复串行分发),被分类为独占的调用先排空池、单独运行并阻挡其后的调用——以外层执行的不透明 token 作为 `parent`,并经过完整的 pre-execute → guards → execute → post-execute → result 流水线。成功会返回策略处理后的最终规范值;失败以一条消息到达 worker,并成为 `ToolCallError(toolName, message)`。每个已启动的子调用在进入流水线时记录一条 `tool/code-dispatch-start` 事件(确定性 id `:code:`,按提交顺序编号),并以一条携带完整模型可见 `content`/`isError` 结果的 `tool/code-dispatch` 事件完结(采用 `tool/result` 词汇,因此 UI 会沿原生路径呈现子调用——这对事件的 `time` 字段承载每个子调用的计时);因 run 结算而被放弃的排队调用两者都不记录。`deriveMessages()` 既不公开这两个事件,也不持久化规范值。token 关联使按提交语义工作的观察器可以延后提交内部调用的成功结果,直到最终 `run_code` 结果确定,而无需接收实时可变的外层执行对象;普通工具副作用不会回滚。每个子调用的 `additionalContexts` 条目都会按分发顺序通过外层 `ToolRunContext` 延迟;循环只在父级 `run_code` 结果之后追加这些上下文,从而保持相邻关系,并且即使程序后来失败,也会保留各自的来源/元数据。 - **结算纪律**:桥接层拥有一个运行作用域的中止机制;该中止会跟随传入的外层信号,并在运行因任何原因结算时触发,因此预算耗尽会中止正在运行的子工具,而不会将其遗留。桥接层随后会在返回之前排空队列,使每个 `tool/code-dispatch` 都落在仍打开的轮次内。失败的运行会抛出 `CodeRunFailedError`(`code: 'CODE_RUN_FAILED'`,message = 失败类型 + 已捕获日志),流水线会将其转换为模型可据以自我修正的结构化 `isError`。 -- **结果大小**:中间绑定值会完整传入 worker 进程,且没有逐绑定字节上限。`run_code` 返回规范的 `{ logs: string[], result?: JsonValue }`;字符串原样呈现,其他所有存在的 JSON 根都通过栈安全的美化 JSON 遍历呈现,总缩进最多为 10 个字符(更深的子树保持紧凑),`null` 保持显式,而缺少 `result` 表示程序返回 `undefined`。worker 可配置的 `maxOutputBytes`(默认 64 MiB)只应用于组合序列化后的外层日志数组、完成值或失败消息载荷;固定的结果 envelope 语法和呈现空白不计入该上限。无效和超限的完成会明确失败,只有此外层结果可以使用普通 spill。 +- **结果大小**:中间绑定值会完整传入 worker 进程,且没有逐绑定字节上限。`run_code` 返回规范的 `{ logs: string[], result?: JsonValue }`;字符串原样呈现,其他所有存在的 JSON 根都通过栈安全的美化 JSON 遍历呈现,总缩进最多为 10 个字符(更深的子树保持紧凑),`null` 保持显式,而缺少 `result` 表示程序返回 `undefined`。worker 可配置的 `maxOutputBytes`(默认 64 MiB)只应用于组合序列化后的外层日志数组、完成值或失败消息载荷;固定的结果封装语法和呈现空白不计入该上限。无效和超限的完成会明确失败,只有这个外层结果可以按常规 spill 机制处理。 ### 并行执行 @@ -177,7 +177,7 @@ The available tools: #### 模型看到的内容 -循环会保留模型发出的参数和注册表的最终内容。任何抛出或被拒绝的调用都会恰好变为 `Error: `。Code Mode 只返回外层程序打印的行和呈现后的返回值;两者都为空时返回 `(run_code completed with no output)`;失败时返回 `Error: code run failed (): `,并根据是否存在已捕获内容,在其后附加 `Captured output:` 与捕获的行。内部分发事件只保留在日志中;后置执行监听器可以在结果之后追加带来源归属的上下文。 +循环会保留模型发出的参数和注册表的最终内容。任何抛出异常或遭到拒绝的调用,都会转换为确切的 `Error: `。Code Mode 只返回外层程序打印的行和呈现后的返回值;两者都为空时返回 `(run_code completed with no output)`;失败时返回 `Error: code run failed (): `,并根据是否存在已捕获内容,在其后附加 `Captured output:` 与捕获的行。内部分发事件只保留在日志中;后置执行监听器可以在结果之后追加带来源归属的上下文。 #### Token 影响 @@ -192,7 +192,7 @@ The available tools: - **并发策略不是事件门禁**:`executionMode()` 直接读取已解析的工具定义;插件只能在自身拥有的定义上声明分类器。 - **`tools/pre-execute` 有意不允许改写 `exec.arguments`**:否则日志记录和呈现的参数会与实际运行内容失去同步;改写设计记录在[拟议的 Agent Note](../../../.agents/notes/proposed/feature/2026-06-30-pre-tool-input-rewrite.md)中。 - **调用方定义的 subagent 与工作流结构化输出仍要求对象根**:这是消费方层面的守卫;共享 schema 词汇和工具输出支持任意 JSON 根。 -- **定义上的 `timeoutMs` 仅为声明**:注册表绝不会强制执行截止时间;要强制执行,必须使用 `@deepseek-ai/dsh-timeout-policy` 包装层。 -- **Code Mode 的 SDK 语言跟随已加载的那个运行时,且呈现方式按 agent 而非按工具**:`mode: code`/`both` 会拒绝组装提示词,除非 `ctx.codeRuntime.language` 有已注册的 SDK 渲染器(TypeScript 或 Python);作用域限制/遮蔽与 `presentAs` 会选择每个 agent 的可见绑定及其形态,但在同一个 agent 内不能让一个工具仅使用 Native,而另一个仅使用 Code。 +- **定义中的 `timeoutMs` 仅作声明之用**:注册表绝不会强制执行截止时间;要强制执行,必须使用 `@deepseek-ai/dsh-timeout-policy` 包装层。 +- **Code Mode 的 SDK 语言由当前加载的运行时决定,且呈现方式按 agent 而非按工具**:`mode: code`/`both` 会拒绝组装提示词,除非 `ctx.codeRuntime.language` 有已注册的 SDK 渲染器(TypeScript 或 Python);作用域限制/遮蔽与 `presentAs` 会选择每个 agent 的可见绑定及其形态,但在同一个 agent 内不能让一个工具仅使用 Native,而另一个仅使用 Code。 - **Code Mode 中间值只存在于执行局部,且没有字节上限**:这些规范的类型化值无法从会话回放重建,并可能耗尽进程或 worker 内存;只有外层 `run_code` 输出受 worker 可配置的硬上限约束。每个子调用的持久日志副本则确实有上限:`tools/code-dispatch-log` waterfall 允许 spill 策略把过大的 `tool/code-dispatch` 内容替换为预览加定位符([原理](../../../.agents/notes/implemented/feature/2026-07-26-code-dispatch-log-spill.md))。 - **每次运行都会获得全新的 `run_code` 状态**:MVP 不采用持久 REPL 风格内核(跨调用状态不会出现在日志中);参见 [Code Mode Agent Note](../../../.agents/notes/implemented/feature/2026-06-15-code-mode.md)。 diff --git a/python/sdk/README.i18n.yaml b/python/sdk/README.i18n.yaml index 42aa01ec6e..fa73fe380f 100644 --- a/python/sdk/README.i18n.yaml +++ b/python/sdk/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write python/sdk/README.md README.md: 70b9d6391644d10ee7d5c29ce122632786e3bbcc -README.zh.md: 1d1a23576cc8029dacbb2df0e3d1d9fc2ce27426 +README.zh.md: 63824ed2a4427835cbbd5ef3491bc7cb0fb94f21 diff --git a/python/sdk/README.zh.md b/python/sdk/README.zh.md index 1d1a23576c..63824ed2a4 100644 --- a/python/sdk/README.zh.md +++ b/python/sdk/README.zh.md @@ -19,9 +19,9 @@ with DeepSeekHarness() as harness: result = harness.run("Say hi.") ``` -`DeepSeekHarness` 会保留延迟启动的运行时子进程,以供多次调用复用。请像上例一样将其用作上下文管理器,或在用完后显式调用 `close()`。 +`DeepSeekHarness` 会保留其按需启动的运行时子进程,以便在多次调用之间复用。请像上例一样将其用作上下文管理器,或在使用完毕后显式调用 `close()`。 -默认情况下,SDK 启动 `deepseek-harness-runtime-bin` 包内置的单文件 `dsh-jsonrpc-agent` 可执行程序,并通过 `DSH_CORDIS_CONFIG` 注入该包的默认配置(stdio JSON-RPC 服务器、`agent-core`、预载的 DeepSeek 适配器、配有显式组合语义检查点策略的 JSONL 会话持久化、本地 bash)。要运行自己的插件组合,请在配置里保留 `@deepseek-ai/dsh-jsonrpc` 条目,并传入 Cordis 配置路径。 +默认情况下,SDK 会启动 `deepseek-harness-runtime-bin` 包内置的单文件可执行程序 `dsh-jsonrpc-agent`,并通过 `DSH_CORDIS_CONFIG` 注入该包的默认配置,其中包括 stdio JSON-RPC 服务器、agent core(智能体核心)、预载的 DeepSeek 适配器、采用显式组合语义检查点策略的 JSONL 会话持久化,以及本地 bash。要运行自己的插件组合,请在配置中保留 `@deepseek-ai/dsh-jsonrpc` 配置项,并传入 Cordis 配置文件路径。 ```py from deepseek_harness import DeepSeekHarness @@ -35,14 +35,14 @@ with DeepSeekHarness( result = harness.run("Make the requested code change.") ``` -`provider` 用于选择当前 Cordis 组合已注册的提供方路由;`model` 是该适配器解析的模型 ID。`max_tokens` 是可选的正整数,用于限制根 agent(智能体)及其进程内后代每次请求的输出 token;省略时由提供方默认值控制。压缩摘要继续使用压缩插件单独配置的上限。内置默认组合注册 `deepseek-official`。自定义组合可以挂载 `llm-pi-ai`,在其中配置各提供方的凭据与端点,再选择 pi-ai 已安装目录中的任意提供方/模型组合。 +`provider` 选择指定 Cordis 组合所注册的提供方路由;`model` 是该适配器解析出的模型 ID。`max_tokens` 是一个可选的正值,用于限制根 agent(智能体)及其进程内后代在每次请求中输出的 token 数量;省略该参数时,由提供方的默认行为决定输出上限。压缩摘要继续使用压缩插件单独配置的上限。内置默认组合注册 `deepseek-official`。自定义组合可以挂载 `llm-pi-ai`,在其中配置各提供方专属的凭据和端点,并选择 pi-ai 已安装 catalog 中存在的任意提供方/模型组合。 -[Python SDK 教程](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/guide/python-sdk.md)提供不使用 Web UI 的顺序安装与首次运行路径。[`jsonrpc-agent` 示例](https://github.com/deepseek-ai/deepseek-harness/blob/master/examples/jsonrpc-agent/README.md)归属该教程使用的完整独立 Cordis 文件。 +[Python SDK 教程](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/guide/python-sdk.md)提供一套无需使用 Web UI、按步骤完成安装和首次运行的流程。该教程所用的完整独立 Cordis 配置文件位于 [`jsonrpc-agent` 示例](https://github.com/deepseek-ai/deepseek-harness/blob/master/examples/jsonrpc-agent/README.md)中。 -`Session.run()` 拥有一个从提示词进入持久 inbox 时开始、到整个 agent 下一次进入空闲状态为止的活动区间,并返回 `RunResult(session_id, final_response, finish_reason, events, notifications, session_root)`。`final_response` 是该区间内根会话最后提交的助手文本。`finish_reason` 是该区间内根会话最后一个 `turn/end` 的 `kind`,例如 `completed`、`max-tokens` 或 `error`;没有轮次结束时为 `None`。缺少字符串 `data.reason.kind` 的 `turn/end` 违反运行时协议,并会抛出 `SdkProtocolError`。两个结果字段描述的都是自有活动区间,而不是因果上归属于该提示词的输出或结束原因。steering(中途引导)、注入的上下文和其他排队工作都可能在进入空闲状态前参与其中。 +`Session.run()` 的活动区间从其提示词被持久 inbox 接收时开始,到整个 agent 下一次进入空闲状态时结束,并返回 `RunResult(session_id, final_response, finish_reason, events, notifications, session_root)`。`final_response` 是该区间内根会话最后提交的助手文本。`finish_reason` 是该区间内根会话最后一个 `turn/end` 的 `kind`,例如 `completed`、`max-tokens` 或 `error`;没有轮次结束时为 `None`。缺少字符串 `data.reason.kind` 的 `turn/end` 违反运行时协议,并会抛出 `SdkProtocolError`。这两个结果字段描述的是 `Session.run()` 所界定的活动区间,并不表示某项输出或结束原因在因果上归属于该提示词。steering(中途引导)、注入的上下文和其他排队工作,也可能在 agent 进入空闲状态前参与这段活动。 -`HarnessClient` 会在运行时进程的生命周期内保留已发现的 subagent(子 agent)祖先关系。每次执行 `Session.run()` 时,`RunResult.notifications` 与 `on_notification` 会按协议传输顺序收到根会话及所有已知后代的通知,其中包括嵌套 subagent 的生命周期事件与会话事件。`RunResult.events` 只包含根会话事件,因此后代消息不会覆盖根会话回复。底层 `session_prompt()` 会立即返回已排队消息的 `MessageId`;绕过 `Session.run()` 的调用方必须自行负责后续的活动边界。 +`HarnessClient` 会在运行时进程的整个生命周期内保留已发现的 subagent 谱系。每次执行 `Session.run()` 时,`RunResult.notifications` 与 `on_notification` 会按协议传输顺序收到根会话及所有已知后代的通知,其中包括嵌套 subagent 的生命周期事件与会话事件。`RunResult.events` 只包含根会话事件,因此后代消息不会覆盖根会话回复。底层 `session_prompt()` 会立即返回已排队消息的 `MessageId`;绕过 `Session.run()` 的调用方必须自行负责后续的活动边界。 -同样的行为也可以通过 `DSH_CORDIS_CONFIG` 为运行时子进程选定。注入逻辑位于 `HarnessClient.start()`,因此底层客户端的默认启动也具有此行为:当启动解析到内置运行时,且 `cordis` 与非空的 `DSH_CORDIS_CONFIG` 均未设置时(运行时把空值视为缺省,注入检查与之一致),使用内置的默认配置;显式给出 `runtime_bin`、`bridge_bin` 或 `launch_args_override` 则完全禁用注入。运行时载体(生产用 exe 与仅限开发的 `node` 闭包)及其获取方式见 [sdk-runtime README](https://github.com/deepseek-ai/deepseek-harness/blob/master/python/sdk-runtime/README.md)。 +也可以通过 `DSH_CORDIS_CONFIG` 为运行时子进程指定配置。注入逻辑位于 `HarnessClient.start()`,因此底层客户端按默认方式启动时也具有该行为:如果启动方式最终解析为内置运行时,且既没有设置 `cordis`,也没有设置非空的 `DSH_CORDIS_CONFIG`(运行时将空值视为未设置,注入检查也是如此),系统就会使用内置默认配置;显式指定 `runtime_bin`、`bridge_bin` 或 `launch_args_override` 时,则会完全禁用该注入。运行时载体(生产用 exe 与仅限开发的 `node` 闭包)及其获取方式见 [sdk-runtime README](https://github.com/deepseek-ai/deepseek-harness/blob/master/python/sdk-runtime/README.md)。 -`cwd` 与 `runtime_cwd` 会在启动子进程、注入环境变量和协议握手前解析为绝对路径。公开 API 只暴露真正生效的选项:部署的角色设定与持久化配置归 `cordis.yml` 管理,而 `session_root` 继续作为设置 `DSH_SESSION_ROOT` 的高层便捷选项。 +`cwd` 与 `runtime_cwd` 会在启动子进程、注入环境变量和协议握手前解析为绝对路径。公开 API 只暴露由 SDK 直接应用的选项:部署 persona 和持久化配置应在 `cordis.yml` 中定义;`session_root` 则保留为设置 `DSH_SESSION_ROOT` 的高层便捷参数。 diff --git a/scripts/snapshots/translation-prompt-v4/request-response.expected.json b/scripts/snapshots/translation-prompt-v4/request-response.expected.json index 5027739b50..497fd95a86 100644 --- a/scripts/snapshots/translation-prompt-v4/request-response.expected.json +++ b/scripts/snapshots/translation-prompt-v4/request-response.expected.json @@ -12,7 +12,7 @@ }, { "role": "assistant", - "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是一款基于 DeepSeek Harness SDK 构建的开源 coding agent(编程智能体)。\n\n它采用了**一切皆插件**的架构。\n\n## 内测说明\n\nDeepSeek Harness 正处于内部测试阶段,功能和接口可能发生变化。\n\nSession Log 默认留在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 可仅在提交反馈时共享 Session Log,设置 `DSH_TELEMETRY_MODE=FULL` 可持续上传;`FULL` 同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。请通过内部企业微信群反馈问题和建议。\n\n\n## 运行\n\n请先安装 Node.js(版本要求:`^22.19` 或 `>=24`)和 pnpm 11,然后运行已发布的包:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会初始化 Web profile 并打印 Web UI 地址,默认地址为 `http://127.0.0.1:3080`。打开该地址,在**设置 → 模型**中添加 DeepSeek API 密钥,然后启动一个会话。运行命令时所在的目录将作为默认工作区;你可以尝试输入 `Summarize this repository and identify its main packages.`。\n\n下一步请阅读 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n`pnpm run build` 会准备仓库产物。`pnpm dsh web` 不会重新构建,而是直接启动同一个 Web UI。\n\n## Profile 与插件\n\nprofile 由一组按顺序排列的插件组合包构成。随附的 `web` profile 用于运行 `dsh web`。使用 `dsh plugin --profile ` 管理 profile;该命令会在对应 profile 目录中将剩余参数转发给 pnpm:\n\n```sh\nnpx -p @deepseek-ai/dsh dsh plugin --profile web add \nnpx -p @deepseek-ai/dsh dsh plugin --profile web remove \n```\n\n`add`、`remove`、`update`、`why` 等 pnpm 命令均可直接使用。该命令会先初始化不存在的 profile,再修改其中的包,并根据声明了 `dsh.bundle` 的已安装包更新 bundle 列表。具体行为见 [CLI 参考](apps/cli/reference/README.md#plugin-management)。\n\n[CLI(命令行界面)参考](apps/cli/README.md)介绍 headless 执行与自定义 profile。[Python SDK](python/README.md) 和[示例](examples/README.md)介绍程序化组合与自定义组合。\n\n## 社区\n\n扫描二维码,或打开 DeepSeek Harness 微信社区申请页面 申请加入。\n\n

\n \"DeepSeek\n

\n\n## 开发\n\n请先阅读[开发指南](docs/development.md);修改包之前,请阅读[架构文档](docs/architecture.md)。\n\n面向 agent:遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[BSD 3-Clause](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n\n## 参与贡献\n\n向本仓库贡献前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。\n" + "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是一款基于 DeepSeek Harness SDK 构建的开源 coding agent(编程智能体)。\n\n它采用了**一切皆插件**的架构。\n\n## 内测说明\n\nDeepSeek Harness 正处于内部测试阶段,功能和接口可能发生变化。\n\n会话日志默认保存在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 后,仅在提交反馈时共享对应的会话日志;设置 `DSH_TELEMETRY_MODE=FULL` 后,会持续上传会话日志。`FULL` 还会启用 dsh-sdk 命令遥测,上报匿名 ID、命令执行结果和脱敏后的项目配置。请通过内部企业微信群反馈问题和建议。\n\n## 运行\n\n请先安装 Node.js(版本要求:`^22.19` 或 `>=24`)和 pnpm 11,然后运行已发布的包:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会初始化 Web profile 并打印 Web UI 地址,默认地址为 `http://127.0.0.1:3080`。打开该地址,在**设置 → 模型**中添加 DeepSeek API 密钥,然后启动一个会话。运行命令时所在的目录将作为默认工作区;你可以尝试输入 `Summarize this repository and identify its main packages.`。\n\n下一步请阅读 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n`pnpm run build` 会准备仓库产物。`pnpm dsh web` 不会重新构建,而是直接启动同一个 Web UI。\n\n## Profile 与插件\n\nprofile 由一组按顺序排列的插件组合包构成。随附的 `web` profile 用于运行 `dsh web`。使用 `dsh plugin --profile ` 管理 profile;该命令会在对应 profile 目录中将剩余参数转发给 pnpm:\n\n```sh\nnpx -p @deepseek-ai/dsh dsh plugin --profile web add \nnpx -p @deepseek-ai/dsh dsh plugin --profile web remove \n```\n\n`add`、`remove`、`update`、`why` 等 pnpm 命令均可直接使用。该命令会先初始化不存在的 profile,再修改其中的包,并根据声明了 `dsh.bundle` 的已安装包更新 bundle 列表。具体行为见 [CLI 参考](apps/cli/reference/README.md#plugin-management)。\n\n[CLI(命令行界面)参考](apps/cli/README.md)介绍 headless 执行与自定义 profile。[Python SDK](python/README.md) 和[示例](examples/README.md)介绍程序化组合与自定义组合。\n\n## 社区\n\n扫描二维码,或打开 DeepSeek Harness 微信社区申请页面 申请加入。\n\n

\n \"DeepSeek\n

\n\n## 开发\n\n请先阅读[开发指南](docs/development.md);修改包之前,请阅读[架构文档](docs/architecture.md)。\n\n面向 agent:遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[BSD 3-Clause](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n\n## 参与贡献\n\n向本仓库贡献前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。\n" }, { "role": "user", From 486c87238130e87cb1e0cc5905ed02268eef50e3 Mon Sep 17 00:00:00 2001 From: j-xiang Date: Thu, 13 Aug 2026 00:42:11 +0800 Subject: [PATCH 007/103] docs(i18n): address focused README review --- apps/cli/README.i18n.yaml | 2 +- apps/cli/README.zh.md | 4 ++-- apps/cli/reference/README.i18n.yaml | 2 +- apps/cli/reference/README.zh.md | 4 ++-- packages/core/tools/README.i18n.yaml | 2 +- packages/core/tools/README.zh.md | 4 ++-- python/sdk/README.i18n.yaml | 2 +- python/sdk/README.zh.md | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/cli/README.i18n.yaml b/apps/cli/README.i18n.yaml index ac025294ca..269cfe0c8c 100644 --- a/apps/cli/README.i18n.yaml +++ b/apps/cli/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/README.md README.md: d36183c545475020207bbf23e58d3c98b07ac6a6 -README.zh.md: 9e5507ad767640b413d00cf16f1becc0f540be2b +README.zh.md: 3a87f6750ee4c1a3c94e1438b29911adef615d2c diff --git a/apps/cli/README.zh.md b/apps/cli/README.zh.md index 9e5507ad76..3a87f6750e 100644 --- a/apps/cli/README.zh.md +++ b/apps/cli/README.zh.md @@ -29,14 +29,14 @@ dsh --help # the launcher's own help ## Profile -profile 目录包含一个 `package.json`,其中记录另行安装的插件依赖,以及 profile manifest(元数据清单)`dsh.profile` 和其中按顺序排列的 `bundles` 列表;还包含一个 `cordis.patch.yml`,其中保存用户自己的 patch 层。 +profile 目录包含一个 `package.json`,其中记录树外插件依赖,以及 profile manifest(元数据清单)`dsh.profile` 和其中按顺序排列的 `bundles` 列表;还包含一个 `cordis.patch.yml`,其中保存用户自己的 patch 层。 配置树以空根为起点,依次叠加以下配置层: - `dsh.profile.bundles` 中各组合包的 patch - profile 自身的 `cordis.patch.yml`,然后是 home 级的 `$DSH_HOME/cordis.patch.yml` - `--patch` 指定的覆盖层 -`dsh.profile.bundles` 中列出的组合包先从 dsh 安装目录解析(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`),再从 profile 自身的 `node_modules` 解析;pnpm 会将另行安装的插件放入该目录。 +`dsh.profile.bundles` 中列出的组合包先从 dsh 安装目录解析(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`),再从 profile 自身的 `node_modules` 解析;pnpm 会将树外插件安装到该目录。 使用 `--dump-default-config` 和 `--dump-config` 可在不启动的情况下检查组合后的配置树。 diff --git a/apps/cli/reference/README.i18n.yaml b/apps/cli/reference/README.i18n.yaml index ebbede237a..cbc7fe54f9 100644 --- a/apps/cli/reference/README.i18n.yaml +++ b/apps/cli/reference/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/reference/README.md README.md: 17d63fe73ea2b3bda74e9c4da91555b34c21f4ab -README.zh.md: 83945a09073057b8c220da9fc1a6b2b84b98f599 +README.zh.md: 31e0143a0ab9007cedcb0c49788c26cc61caa8a3 diff --git a/apps/cli/reference/README.zh.md b/apps/cli/reference/README.zh.md index 83945a0907..31e0143a0a 100644 --- a/apps/cli/reference/README.zh.md +++ b/apps/cli/reference/README.zh.md @@ -8,7 +8,7 @@ `dsh --profile ` 启动位于 `$DSH_HOME/profiles/` 的 profile。生效配置树以空根节点为起点,依次叠加 profile manifest(元数据清单)的 `dsh.profile.bundles` 列表中指定的各组合包 patch、profile 自身的 `cordis.patch.yml`、home 级的 `$DSH_HOME/cordis.patch.yml`(这是各 profile 共享的机器本地偏好,因此优先于逐 profile 配置层),以及按 argv 顺序指定的各个 `--patch ` 覆盖层。对同一配置行,后应用的层优先。patch 会替换目标行的整个 `config` 值,而不是深度合并其中的键;patch 也可以插入新行。配置解析、schema 校验、模块解析或插件启动失败时,系统会报告错误并以非零状态退出。收到 SIGINT 或 SIGTERM 时,挂载的根节点会先 dispose(资源释放)再退出。 -组合包名称先从 dsh 安装目录解析,再从 profile 目录解析。因此,内置组合包(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`)始终来自当前运行的 `dsh` 所属的安装;另行安装的组合包则来自 profile 中由 pnpm 管理的 `node_modules`。patch 行中的裸插件 `name` 会从 profile 目录开始,按照 Node 的模块解析规则逐级向父目录查找,直至由 dsh 维护的安装后备目录 `$DSH_HOME/profiles/node_modules`。该目录为 dsh 安装中的应用和组合包所依赖的每个包各维护一个符号链接,并在每次启动时修复这些链接。 +组合包名称先从 dsh 安装目录解析,再从 profile 目录解析。因此,内置组合包(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`)始终来自当前运行的 `dsh` 所属的安装;树外组合包则来自 profile 中由 pnpm 管理的 `node_modules`。patch 行中的裸插件 `name` 会从 profile 目录开始,按照 Node 的模块解析规则逐级向父目录查找,直至由 dsh 维护的安装后备目录 `$DSH_HOME/profiles/node_modules`。该目录为 dsh 安装中的应用和组合包所依赖的每个包各维护一个符号链接,并在每次启动时修复这些链接。 `web` 和 `headless` profile 首次使用时会从随附模板自动初始化(`web`:base + web-app;`headless`:base + headless)。其他缺失的 profile 会显式报错,并提示运行 `dsh plugin --profile add `。 @@ -40,7 +40,7 @@ dsh --profile web --patch ./extra.yml --dump-config ## 插件管理 -`dsh plugin --profile ` 在 profile 缺失时先初始化它(有随附模板的用模板,其他名称只装 `@deepseek-ai/dsh-base`),然后以 profile 目录为工作目录,把 `` 转发给 `pnpm`:`add`、`remove`、`why`、`update` 及其他所有 pnpm 子命令都照常可用;pnpm 必须在 PATH 上。相对路径 spec(`.`、`../plugin` 及其 `file:`/`link:` 形式)会先锚定到调用目录,因此在插件 checkout 中执行 `add .` 安装的是该 checkout,而不是 profile。每次成功运行后,系统都会根据当前安装状态更新 `dsh.profile.bundles`:如果某项依赖解析到的包在 manifest(元数据清单)中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }`,该依赖就会加入配置层栈;如果某项依赖在 `update` 后获得该声明,也会随即激活。没有组合包声明的依赖仍作为普通依赖保留,并显示一次性警告;已移除的依赖则从配置层栈中删除。 +`dsh plugin --profile ` 在 profile 缺失时先初始化它(有随附模板的用模板,其他名称只装 `@deepseek-ai/dsh-base`),然后以 profile 目录为工作目录,把 `` 转发给 `pnpm`:`add`、`remove`、`why`、`update` 及其他所有 pnpm 子命令都照常可用;pnpm 必须在 PATH 上。相对路径 spec(`.`、`../plugin` 及其 `file:`/`link:` 形式)会先锚定到调用目录,因此在插件 checkout 中执行 `add .` 安装的是该 checkout,而不是 profile。每次成功运行后,系统都会根据当前安装状态更新 `dsh.profile.bundles`:如果某项依赖解析到的包在 manifest 中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }`,该依赖就会加入配置层栈;如果某项依赖在 `update` 后获得该声明,也会随即激活。没有组合包声明的依赖仍作为普通依赖保留,并显示一次性警告;已移除的依赖则从配置层栈中删除。 ```sh dsh plugin --profile tui add github:deepseek-harness/turtle-ui diff --git a/packages/core/tools/README.i18n.yaml b/packages/core/tools/README.i18n.yaml index 9cda431253..3e3802d74d 100644 --- a/packages/core/tools/README.i18n.yaml +++ b/packages/core/tools/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/core/tools/README.md README.md: 44eb25b79436a75f08406102fc1e3734e59b1001 -README.zh.md: d77b4ee5248b19418c27674faf7afd52957c6382 +README.zh.md: a395f453bab5ade3530219f4883575b55c1068ff diff --git a/packages/core/tools/README.zh.md b/packages/core/tools/README.zh.md index d77b4ee524..a395f453ba 100644 --- a/packages/core/tools/README.zh.md +++ b/packages/core/tools/README.zh.md @@ -13,7 +13,7 @@ tools: mode: native # native (default) | code | both ``` -`native` 以函数定义的形式贡献可见工具。`code` 会提供预留的 `run_code` 传输、生成的 `tools:sdk` 段,以及声明「只有 `run_code` 可被直接调用」的 `tools:code-only` 规则。执行器随后强制执行该规则:模型直接调用其他任何工具时,会在策略运行前将该调用解析为 `UNKNOWN_TOOL`;`both` 同时提供两种形式,且不声明该规则,因为其中的原生调用确实可以执行。没有单独声明呈现模式的 agent 默认采用此配置;agent preset 可通过 [`dsh-agent-tool-mode`](../agent-tool-mode/README.md) 自行选择呈现模式。不能注册、遮蔽、限制或移除该保留传输,且无论配置何种模式,该名称都是保留的,因为任何 agent 都可能选择 code 模式。非原生模式要求所加载 `ctx.codeRuntime` 的 `language` 有已注册的 SDK 渲染器——TypeScript 经 [`dsh-code-runtime-worker`](../../code-runtime/code-runtime-worker/README.md) 交付;Python 渲染器内置,驱动任何报告 `language: 'python'` 的运行时(第一方 `dsh-code-runtime-python` 后端另行交付)。没有渲染器的运行时语言会导致提示词组装明确失败;如果 `systemPrompt.toolOrder` 条目指向当前模式未贡献的工具,系统会拒绝组装提示词。`system-prompt/assemble` 监听器可以替换注册表贡献;它返回的组装结果具有权威性,因此该监听器负责保留可用的 Code Mode 协议。 +`native` 以函数定义的形式贡献可见工具。`code` 会提供保留的 `run_code` 传输、生成的 `tools:sdk` 段,以及声明「只有 `run_code` 可被直接调用」的 `tools:code-only` 规则。执行器随后强制执行该规则:模型直接调用其他任何工具时,会在策略运行前将该调用解析为 `UNKNOWN_TOOL`;`both` 同时提供两种形式,且不声明该规则,因为其中的原生调用确实可以执行。没有单独声明呈现模式的 agent 默认采用此配置;agent preset 可通过 [`dsh-agent-tool-mode`](../agent-tool-mode/README.md) 自行选择呈现模式。不能注册、遮蔽、限制或移除该保留传输,且无论配置何种模式,该名称都是保留的,因为任何 agent 都可能选择 code 模式。非原生模式要求所加载 `ctx.codeRuntime` 的 `language` 有已注册的 SDK 渲染器——TypeScript 经 [`dsh-code-runtime-worker`](../../code-runtime/code-runtime-worker/README.md) 交付;Python 渲染器内置,驱动任何报告 `language: 'python'` 的运行时(第一方 `dsh-code-runtime-python` 后端另行交付)。没有渲染器的运行时语言会导致提示词组装明确失败;如果 `systemPrompt.toolOrder` 条目指向当前模式未贡献的工具,系统会拒绝组装提示词。`system-prompt/assemble` 监听器可以替换注册表贡献;它返回的组装结果具有权威性,因此该监听器负责保留可用的 Code Mode 协议。 ### 公开 API @@ -120,7 +120,7 @@ ctx.tools.register(defineTool({ 在 `code`(而非 `both`)下,该传输同时也是模型唯一可用的入口:模型直呼其他任何可见工具名,都会在创建执行时、早于 `tools/pre-execute`、审批 `ask` 和 guards 解析为 `UNKNOWN_TOOL`,因此没有任何一方会观察或批准一个注定失败的调用。拒绝信息会给出正确路径(`only \`run_code\` is callable directly — call \`\` from inside a \`run_code\` program instead`),因为同一份提示词刚刚声明过那个工具,只说 `unknown tool` 会被读成部署损坏。SDK 子分发携带外层执行的 `parent` token,不受此限制,因此程序保留 SDK 声明的全部绑定。参见[执行器塌缩 note](../../../.agents/notes/implemented/bug-fix/2026-08-07-code-mode-executor-collapse.md)、[Code Mode 基础](../../../.agents/notes/implemented/feature/2026-06-15-code-mode.md)、[类型化返回约定](../../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md)和[代码运行时 seam](../../code-runtime/README.md)。可以运行 `pnpm run demo:code-mode` 试用。 - **SDK 段**(`tools:sdk`,顺序 150):一个在组装时求值的提示词段,每次组装都会重新生成与所加载运行时语言相符的 SDK 文本。TypeScript 形态会生成 `JsonValue`、精确的 `ToolArgsMap` / `ToolOutputMap`、`ToolName`、`ToolCallError` 声明,以及映射调用作用域最终可见工具的 `tools` 命名空间(特殊名称使用带引号的键),并附带固定的使用说明;Python 形态(`ctx.codeRuntime.language === 'python'`)发出等价的具名 `TypedDict` 与一个带相同用法说明的 `tools` 对象。其输出具有确定性:工具按字典序排列;工具集合不变时,文本逐字节相同(有利于前缀 cache)。两个代码生成器都已导出,且绝不会在提示词组装期间抛出:`jsonSchemaToTs` 处理统一 schema 的每种构造并将不受支持的原始构造降级为 `unknown`;`jsonSchemaToPy` 同理,降级为 `Any`(当某字段名不是合法的 `TypedDict` 属性时,或在 SDK 渲染之外被调用时——`TypedDict` 声明所需的命名上下文由该渲染提供——整个对象降级为 `dict[str, Any]`)。 -- **分发桥接层**(`run_code` 的 execute):每个绑定调用都会在分发前快照为无损 JSON(`undefined`、`BigInt`、循环、稀疏数组、`-0` 和特殊对象会使该次调用被拒绝),经由每次运行独有、复用原生并发约定的池调度——调用严格按提交顺序启动,连续的 `isConcurrencySafe` 调用最多可重叠经校验的 `maxParallelSubCalls` 配置个(默认 10;设为 `1` 即恢复串行分发),被分类为独占的调用先排空池、单独运行并阻挡其后的调用——以外层执行的不透明 token 作为 `parent`,并经过完整的 pre-execute → guards → execute → post-execute → result 流水线。成功会返回策略处理后的最终规范值;失败以一条消息到达 worker,并成为 `ToolCallError(toolName, message)`。每个已启动的子调用在进入流水线时记录一条 `tool/code-dispatch-start` 事件(确定性 id `:code:`,按提交顺序编号),并以一条携带完整模型可见 `content`/`isError` 结果的 `tool/code-dispatch` 事件完结(采用 `tool/result` 词汇,因此 UI 会沿原生路径呈现子调用——这对事件的 `time` 字段承载每个子调用的计时);因 run 结算而被放弃的排队调用两者都不记录。`deriveMessages()` 既不公开这两个事件,也不持久化规范值。token 关联使按提交语义工作的观察器可以延后提交内部调用的成功结果,直到最终 `run_code` 结果确定,而无需接收实时可变的外层执行对象;普通工具副作用不会回滚。每个子调用的 `additionalContexts` 条目都会按分发顺序通过外层 `ToolRunContext` 延迟;循环只在父级 `run_code` 结果之后追加这些上下文,从而保持相邻关系,并且即使程序后来失败,也会保留各自的来源/元数据。 +- **分发桥接层**(`run_code` 的 execute):每个绑定调用都会在分发前快照为无损 JSON(`undefined`、`BigInt`、循环、稀疏数组、`-0` 和特殊对象会使该次调用被拒绝),经由每次运行独有、复用原生并发约定的池调度——调用严格按提交顺序启动,连续的 `isConcurrencySafe` 调用最多可重叠经校验的 `maxParallelSubCalls` 配置个(默认 10;设为 `1` 即恢复串行分发),被分类为独占的调用先排空池、单独运行并阻挡其后的调用——以外层执行的不透明 token 作为 `parent`,并经过完整的 pre-execute → guards → execute → post-execute → result 流水线。成功会返回策略处理后的最终规范值;失败以一条消息到达 worker,并成为 `ToolCallError(toolName, message)`。每个已启动的子调用在进入流水线时记录一条 `tool/code-dispatch-start` 事件(确定性 id `:code:`,按提交顺序编号),并以一条携带完整模型可见 `content`/`isError` 结果的 `tool/code-dispatch` 事件完结(采用 `tool/result` 词汇,因此 UI 会沿原生路径呈现子调用——这对事件的 `time` 字段承载每个子调用的计时);因 run 结算而被放弃的排队调用两者都不记录。`deriveMessages()` 既不公开这两个事件,也不持久化规范值。token 关联使按提交语义工作的观察器可以延后提交内部调用的成功结果,直到最终 `run_code` 结果确定,而无需暴露进行中的外层执行;普通工具副作用不会回滚。每个子调用的 `additionalContexts` 条目都会按分发顺序通过外层 `ToolRunContext` 延迟;循环只在父级 `run_code` 结果之后追加这些上下文,从而保持相邻关系,并且即使程序后来失败,也会保留各自的来源/元数据。 - **结算纪律**:桥接层拥有一个运行作用域的中止机制;该中止会跟随传入的外层信号,并在运行因任何原因结算时触发,因此预算耗尽会中止正在运行的子工具,而不会将其遗留。桥接层随后会在返回之前排空队列,使每个 `tool/code-dispatch` 都落在仍打开的轮次内。失败的运行会抛出 `CodeRunFailedError`(`code: 'CODE_RUN_FAILED'`,message = 失败类型 + 已捕获日志),流水线会将其转换为模型可据以自我修正的结构化 `isError`。 - **结果大小**:中间绑定值会完整传入 worker 进程,且没有逐绑定字节上限。`run_code` 返回规范的 `{ logs: string[], result?: JsonValue }`;字符串原样呈现,其他所有存在的 JSON 根都通过栈安全的美化 JSON 遍历呈现,总缩进最多为 10 个字符(更深的子树保持紧凑),`null` 保持显式,而缺少 `result` 表示程序返回 `undefined`。worker 可配置的 `maxOutputBytes`(默认 64 MiB)只应用于组合序列化后的外层日志数组、完成值或失败消息载荷;固定的结果封装语法和呈现空白不计入该上限。无效和超限的完成会明确失败,只有这个外层结果可以按常规 spill 机制处理。 diff --git a/python/sdk/README.i18n.yaml b/python/sdk/README.i18n.yaml index fa73fe380f..50e4ae9591 100644 --- a/python/sdk/README.i18n.yaml +++ b/python/sdk/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write python/sdk/README.md README.md: 70b9d6391644d10ee7d5c29ce122632786e3bbcc -README.zh.md: 63824ed2a4427835cbbd5ef3491bc7cb0fb94f21 +README.zh.md: 02217d62b8f24dc6806356c93f63574f2fb9f129 diff --git a/python/sdk/README.zh.md b/python/sdk/README.zh.md index 63824ed2a4..02217d62b8 100644 --- a/python/sdk/README.zh.md +++ b/python/sdk/README.zh.md @@ -35,7 +35,7 @@ with DeepSeekHarness( result = harness.run("Make the requested code change.") ``` -`provider` 选择指定 Cordis 组合所注册的提供方路由;`model` 是该适配器解析出的模型 ID。`max_tokens` 是一个可选的正值,用于限制根 agent(智能体)及其进程内后代在每次请求中输出的 token 数量;省略该参数时,由提供方的默认行为决定输出上限。压缩摘要继续使用压缩插件单独配置的上限。内置默认组合注册 `deepseek-official`。自定义组合可以挂载 `llm-pi-ai`,在其中配置各提供方专属的凭据和端点,并选择 pi-ai 已安装 catalog 中存在的任意提供方/模型组合。 +`provider` 选择指定 Cordis 组合所注册的提供方路由;`model` 是该适配器解析出的模型 ID。`max_tokens` 是一个可选的正整数,用于限制根 agent 及其进程内后代在每次请求中输出的 token 数量;省略该参数时,由提供方的默认行为决定输出上限。压缩摘要继续使用压缩插件单独配置的上限。内置默认组合注册 `deepseek-official`。自定义组合可以挂载 `llm-pi-ai`,在其中配置各提供方专属的凭据和端点,并选择 pi-ai 已安装 catalog 中存在的任意提供方/模型组合。 [Python SDK 教程](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/guide/python-sdk.md)提供一套无需使用 Web UI、按步骤完成安装和首次运行的流程。该教程所用的完整独立 Cordis 配置文件位于 [`jsonrpc-agent` 示例](https://github.com/deepseek-ai/deepseek-harness/blob/master/examples/jsonrpc-agent/README.md)中。 From 0233b8b26b99285e03ea2bb8f0b47ca7dd965f3d Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 01:38:38 +0800 Subject: [PATCH 008/103] docs: mark repository naming contract implemented --- ...6-07-07-tool-call-timeout-policy.i18n.yaml | 4 +- .../2026-07-07-tool-call-timeout-policy.md | 2 +- .../2026-07-07-tool-call-timeout-policy.zh.md | 2 +- .../2026-07-29-package-regrouping.i18n.yaml | 4 +- .../2026-07-29-package-regrouping.md | 4 +- .../2026-07-29-package-regrouping.zh.md | 4 +- ...aming-contract-and-rename-ledger.i18n.yaml | 6 ++ ...itory-naming-contract-and-rename-ledger.md | 86 +++++++++--------- ...ry-naming-contract-and-rename-ledger.zh.md | 88 +++++++++---------- ...26-06-11-vendor-cordis-as-source.i18n.yaml | 4 +- .../2026-06-11-vendor-cordis-as-source.md | 2 +- .../2026-06-11-vendor-cordis-as-source.zh.md | 2 +- ...-11-remove-sdk-project-toolchain.i18n.yaml | 4 +- ...2026-08-11-remove-sdk-project-toolchain.md | 2 +- ...6-08-11-remove-sdk-project-toolchain.zh.md | 2 +- ...aming-contract-and-rename-ledger.i18n.yaml | 6 -- 16 files changed, 107 insertions(+), 115 deletions(-) create mode 100644 .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml rename .agents/notes/{proposed => implemented}/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md (87%) rename .agents/notes/{proposed => implemented}/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md (87%) delete mode 100644 .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml diff --git a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml index 384a870dd0..aad3aa26f0 100644 --- a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md -2026-07-07-tool-call-timeout-policy.md: 20ca57cee4cd3ae51e7bfb8af1d2a1f8c7edd743 -2026-07-07-tool-call-timeout-policy.zh.md: 5b91c29f5492a36bbd023a892f0f2f8dd857ae53 +2026-07-07-tool-call-timeout-policy.md: ce414e541f8e374dd48e46d68cb00121e0004247 +2026-07-07-tool-call-timeout-policy.zh.md: 6fe3c979a3c4e7b7a6ed803a47af45ad32d52cce diff --git a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md index 20ca57cee4..ce414e541f 100644 --- a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md +++ b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md @@ -16,7 +16,7 @@ Tool-call timeout is a policy that applies only to model-facing tool execution, - `@deepseek-ai/dsh-timeout` remains the shared library that owns `deadline()` and `timeoutOf()`. - `@deepseek-ai/dsh-tools` has an around-dispatch waterfall, `tools/execute`, between `tools/pre-execute` and `tools/post-execute`. -- The [repository naming contract](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) names `@deepseek-ai/dsh-tool-call-timeout-policy` for the exact operation it limits. The plugin reads each tool's declared `timeoutMs` from the runtime and wraps a call that has one by deriving a new `exec.signal`. +- The [repository naming contract](2026-08-11-repository-naming-contract-and-rename-ledger.md) names `@deepseek-ai/dsh-tool-call-timeout-policy` for the exact operation it limits. The plugin reads each tool's declared `timeoutMs` from the runtime and wraps a call that has one by deriving a new `exec.signal`. The execution pipeline is: diff --git a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md index 5b91c29f54..6fe3c979a3 100644 --- a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md @@ -16,7 +16,7 @@ Status: implemented - `@deepseek-ai/dsh-timeout` 仍是拥有 `deadline()` 和 `timeoutOf()` 的共享库。 - `@deepseek-ai/dsh-tools` 在 `tools/pre-execute` 和 `tools/post-execute` 之间有一个环绕分发的 waterfall(瀑布式事件)`tools/execute`。 -- [仓库命名约定](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)使用 `@deepseek-ai/dsh-tool-call-timeout-policy`,准确说明该策略所限制的操作。插件从 runtime 读取每个工具声明的 `timeoutMs`,并通过派生新的 `exec.signal` 来包装有此声明的调用。 +- [仓库命名约定](2026-08-11-repository-naming-contract-and-rename-ledger.md)使用 `@deepseek-ai/dsh-tool-call-timeout-policy`,准确说明该策略所限制的操作。插件从 runtime 读取每个工具声明的 `timeoutMs`,并通过派生新的 `exec.signal` 来包装有此声明的调用。 执行流水线如下: diff --git a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml index 69bcf2af17..77bca2bb85 100644 --- a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-29-package-regrouping.md -2026-07-29-package-regrouping.md: 35042086503167d01edc1b3bfafdef92ba4781c5 -2026-07-29-package-regrouping.zh.md: 2dfd7ba85484008138f799ff60c406807a9ecf7f +2026-07-29-package-regrouping.md: 52a1fa28e4826daa7b0bb84a37be3c094fddb68c +2026-07-29-package-regrouping.zh.md: bef55544664f6e6daf391b33ef7224c00507a908 diff --git a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md index 3504208650..52a1fa28e4 100644 --- a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md +++ b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md @@ -17,7 +17,7 @@ The north star for the regrouping: **closely clustered packages share a group.** ## Decision -Five regrouping decisions remain current; every other group keeps its prior boundary and contents (the dependency analysis confirmed the capability families — `shell/`, `terminal/`, `code-runtime/`, `sandbox/`, `subprocess/`, `fs/`, `lsp/`, `web/`, `skill/`, and the rest — were already drawn correctly). The original sixth decision collected the SDK project initializer, launcher tooling, and runtime JSON-RPC packages under `scaffold/`; [removing that unreleased toolchain](../simplification/2026-08-11-remove-sdk-project-toolchain.md) deleted the project tooling and moved the surviving runtime trio to `sdk/`. The later [repository naming contract](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) owns the `shell/`, `terminal/`, and `extensions/` group names and the two package names that this decision deferred. +Five regrouping decisions remain current; every other group keeps its prior boundary and contents (the dependency analysis confirmed the capability families — `shell/`, `terminal/`, `code-runtime/`, `sandbox/`, `subprocess/`, `fs/`, `lsp/`, `web/`, `skill/`, and the rest — were already drawn correctly). The original sixth decision collected the SDK project initializer, launcher tooling, and runtime JSON-RPC packages under `scaffold/`; [removing that unreleased toolchain](../simplification/2026-08-11-remove-sdk-project-toolchain.md) deleted the project tooling and moved the surviving runtime trio to `sdk/`. The later [repository naming contract](2026-08-11-repository-naming-contract-and-rename-ledger.md) owns the `shell/`, `terminal/`, and `extensions/` group names and the two package names that this decision deferred. | Group | Members (folder names) | From | |---|---|---| @@ -37,7 +37,7 @@ Five regrouping decisions remain current; every other group keeps its prior boun ## Later naming decisions -The [repository naming contract](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) resolves the two names that this move deliberately deferred. `@deepseek-ai/dsh-sdk-jsonrpc-server` names the JSON-RPC server half of the runtime SDK protocol. `@deepseek-ai/dsh-tool-call-timeout-policy` names the exact operation limited by the policy while keeping its `guard/timeout-policy/` home. Their release-blocking `FIXME` markers are removed with those renames. +The [repository naming contract](2026-08-11-repository-naming-contract-and-rename-ledger.md) resolves the two names that this move deliberately deferred. `@deepseek-ai/dsh-sdk-jsonrpc-server` names the JSON-RPC server half of the runtime SDK protocol. `@deepseek-ai/dsh-tool-call-timeout-policy` names the exact operation limited by the policy while keeping its `guard/timeout-policy/` home. Their release-blocking `FIXME` markers are removed with those renames. ## What the move touched diff --git a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md index 2dfd7ba854..bef5554466 100644 --- a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md @@ -17,7 +17,7 @@ Status: implemented ## 决策 -五项重组决策仍然有效;其余每个组都保持先前的边界与内容不变(依赖分析确认各能力家族——`shell/`、`terminal/`、`code-runtime/`、`sandbox/`、`subprocess/`、`fs/`、`lsp/`、`web/`、`skill/` 及其余——本来就划得正确)。原本的第六项决策把 SDK 项目初始化器、启动器工具与运行时 JSON-RPC 包汇集到 `scaffold/`;[移除这套未发布工具链](../simplification/2026-08-11-remove-sdk-project-toolchain.md)的决策删除了项目工具,并将存留的运行时三包移到 `sdk/`。后续的[仓库命名约定](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)负责 `shell/`、`terminal/` 与 `extensions/` 组名,以及本决策曾推迟的两个包名。 +五项重组决策仍然有效;其余每个组都保持先前的边界与内容不变(依赖分析确认各能力家族——`shell/`、`terminal/`、`code-runtime/`、`sandbox/`、`subprocess/`、`fs/`、`lsp/`、`web/`、`skill/` 及其余——本来就划得正确)。原本的第六项决策把 SDK 项目初始化器、启动器工具与运行时 JSON-RPC 包汇集到 `scaffold/`;[移除这套未发布工具链](../simplification/2026-08-11-remove-sdk-project-toolchain.md)的决策删除了项目工具,并将存留的运行时三包移到 `sdk/`。后续的[仓库命名约定](2026-08-11-repository-naming-contract-and-rename-ledger.md)负责 `shell/`、`terminal/` 与 `extensions/` 组名,以及本决策曾推迟的两个包名。 | 组 | 成员(目录名) | 来源 | |---|---|---| @@ -37,7 +37,7 @@ Status: implemented ## 后续命名决策 -[仓库命名约定](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)解决了本次移动有意推迟的两个名称。`@deepseek-ai/dsh-sdk-jsonrpc-server` 表示运行时 SDK 协议的 JSON-RPC 服务器一侧。`@deepseek-ai/dsh-tool-call-timeout-policy` 准确表示策略所限制的操作,同时保留其 `guard/timeout-policy/` 归属。这些重命名会一并移除阻塞发布的 `FIXME` 标记。 +[仓库命名约定](2026-08-11-repository-naming-contract-and-rename-ledger.md)解决了本次移动有意推迟的两个名称。`@deepseek-ai/dsh-sdk-jsonrpc-server` 表示运行时 SDK 协议的 JSON-RPC 服务器一侧。`@deepseek-ai/dsh-tool-call-timeout-policy` 准确表示策略所限制的操作,同时保留其 `guard/timeout-policy/` 归属。这些重命名会一并移除阻塞发布的 `FIXME` 标记。 ## 移动触及了什么 diff --git a/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml new file mode 100644 index 0000000000..3f854180a7 --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md +2026-08-11-repository-naming-contract-and-rename-ledger.md: 9484a65096ab6b566f12239e45b914ac71ac27fe +2026-08-11-repository-naming-contract-and-rename-ledger.zh.md: 8d4df0cea9cef42282eba7a504479ea7bcff4c90 diff --git a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md similarity index 87% rename from .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md rename to .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md index 440ab360e0..9484a65096 100644 --- a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md +++ b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md @@ -1,34 +1,34 @@ # Agent Note: Repository naming contract and pre-release rename ledger -Status: proposed +Status: implemented English | [中文](2026-08-11-repository-naming-contract-and-rename-ledger.zh.md) ## Problem -The repository has grown faster than some names. Several package names still describe the first implementation instead of the capability. Several classes use `Service` even when they are registries, runtimes, engines, controllers, or resolvers. Some `ctx` keys are singular for registries and plural for one engine. Some provider names say `local` when they use replaceable filesystem or subprocess services and can run in another execution world. +The repository had grown faster than some names. Several package names described the first implementation instead of the capability. Several classes used `Service` even when they were registries, runtimes, engines, controllers, or resolvers. Some `ctx` keys were singular for registries and plural for one engine. Some provider names said `local` even though they used replaceable filesystem or subprocess services and could run in another execution world. These names are not harmless. A name tells a contributor where a responsibility starts and stops. `Store` suggests data access. `Registry` suggests registrations and lookup. `Runtime` suggests live execution and lifecycle. When one word is used for all three, callers cannot tell which object owns policy, work, or state without reading the implementation. -The repository also uses `SDK` in two meanings. The supported Python and TypeScript clients use the JSON-RPC SDK protocol. The project as a whole is DeepSeek Harness, not an SDK project. The removed SDK project toolchain made the broad meaning obsolete, but current prose and names still preserve parts of it. +The repository also used `SDK` in two meanings. The supported Python and TypeScript clients use the JSON-RPC SDK protocol. The project as a whole is DeepSeek Harness, not an SDK project. The removed SDK project toolchain made the broad meaning obsolete, but prose and names preserved parts of it. -This is the last pre-release point at which repository-wide renames are cheap. Keeping weak names would turn accidental vocabulary into a compatibility contract. +The last pre-release window made repository-wide renames cheap. Keeping weak names would have turned accidental vocabulary into a compatibility contract. -## Proposal +## Decision -Apply the rename ledger in this note before the first tagged release. Change names only. Do not change package responsibilities, service boundaries, behavior, defaults, or data models in a rename change. If a name exposes a bad boundary, write a separate proposed Agent Note for that boundary change. +The repository uses every current name in this ledger. This decision changes names only; package responsibilities, service boundaries, behavior, defaults, and data models stay the same. A name that exposes a bad boundary requires a separate proposed Agent Note for that boundary change. -Each accepted family rename is atomic. Update its directory, npm package name, imports, Cordis plugin name, `ctx` key, public types, directly coupled event or tool identifiers, configuration, tests, fixtures, examples, generated references, and current documentation where the ledger names those surfaces. Do not leave an alias, compatibility package, duplicate service key, dual event name, or fallback parser. The repository is pre-release and rejects the old name. +Each renamed family has one vocabulary. Its directory, npm package name, imports, Cordis plugin name, `ctx` key, public types, directly coupled event or tool identifiers, configuration, tests, fixtures, examples, generated references, and current documentation use the current name where the ledger names those interfaces. No alias, compatibility package, duplicate service key, dual event name, or fallback parser remains. The repository rejects the old name. -Implementation can use more than one PR to keep review practical. One PR must not leave one family with two public vocabularies. The final state must satisfy the complete ledger. +No family exposes two public vocabularies. ### Use `SDK` for one thing -`SDK` means the JSON-RPC-based client/server protocol used by the supported Python and TypeScript SDKs. Keep `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and the wire identity `deepseek-harness-sdk-runtime`. Rename the JSON-RPC server into that family. Do not call DeepSeek Harness itself an SDK, and do not restore the removed project generator, launcher, helper, or launcher telemetry packages. +`SDK` means the JSON-RPC-based client/server protocol used by the supported Python and TypeScript SDKs. The repository keeps `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and the wire identity `deepseek-harness-sdk-runtime`; the JSON-RPC server belongs to the same family. DeepSeek Harness itself is not an SDK, and the removed project generator, launcher, helper, and launcher telemetry packages stay absent. -If accepted, this proposal will partially supersede three active decisions. It replaces the retained `bash/`, `pty/`, and `self-modification/` group names and both deferred package targets in the [package-regrouping decision](../../implemented/architecture/2026-07-29-package-regrouping.md). It replaces only the repository-wide SDK claim in the [SDK project toolchain removal](../../implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md), which remains the owner of the deletion and the surviving runtime SDK. It replaces only the package-name rationale in the [tool-call timeout policy](../../implemented/architecture/2026-07-07-tool-call-timeout-policy.md); the timeout mechanism and its `guard/timeout-policy/` home remain unchanged. +This decision partially supersedes three active decisions. It replaces the retained `bash/`, `pty/`, and `self-modification/` group names and both deferred package targets in the [package-regrouping decision](2026-07-29-package-regrouping.md). It replaces only the repository-wide SDK claim in the [SDK project toolchain removal](../simplification/2026-08-11-remove-sdk-project-toolchain.md), which remains the owner of the deletion and the surviving runtime SDK. It replaces only the package-name rationale in the [tool-call timeout policy](2026-07-07-tool-call-timeout-policy.md); the timeout mechanism and its `guard/timeout-policy/` home remain unchanged. -Other implemented notes that use a renamed package, path, or type are not superseded when their boundary and rationale remain intact. The implementation updates those factual names. It adds reciprocal links only where this proposal changes a decision; a proposal does not make current implemented notes describe unshipped names. +Other implemented notes that use a renamed package, path, or type are not superseded when their boundary and rationale remain intact. They carry the current factual names. The three partially superseded decisions link back to this decision. ### Name the role that exists @@ -68,7 +68,7 @@ The practical tests are direct. If callers mainly call `register()` and receive Keep a protocol or dialect name when it distinguishes implementations. Keep `Bash`, `Pwsh`, `JSON-RPC`, `SQLite`, `JSONL`, `OpenTelemetry`, `Claude Code`, and `E2B` where the implementation depends on that mechanism. Do not put `LLM` into a compaction backend name when every current backend already uses the LLM seam; `basic` is the honest neutral name until a more specific algorithm name exists. -Do not invent a `process sandbox` concept. The current `sandbox` family already names its product responsibility, and the accepted sweep does not change that boundary. +Do not invent a `process sandbox` concept. The current `sandbox` family already names its product responsibility. This decision does not change that responsibility. Use title case for initialisms inside PascalCase identifiers: `Ui`, `Llm`, `JsonRpc`, and `ApiProxy`. Use the conventional uppercase form in prose and package names where applicable: UI, LLM, JSON-RPC, and API. `Typert` is the exact product spelling in identifiers and prose; do not write `TypeRT`, `TypeRt`, or `Typert` with another internal split. @@ -76,15 +76,15 @@ Do not remove an intentional vendor qualifier to avoid repetition. `dsh-subagent ### Put the rule in project documentation -When the rename implementation lands, add the full role-word contract to the paired package-creation guide at `docs/cookbook/adding-a-package.md`. Add a short linked rule to `packages/AGENTS.md`. Update the terminology table and the root project description so `SDK` and `Typert` have one meaning. The Agent Note owns the rationale and rejected alternatives; the guide owns the rule contributors follow. +The paired package-creation guide at `docs/cookbook/adding-a-package.md` contains the full role-word contract, and `packages/AGENTS.md` links to it. The terminology table and root project description give `SDK` and `Typert` one meaning. This Agent Note owns the rationale and rejected alternatives; the guide owns the rule contributors follow. ## Rename ledger -The tables list public and repository-wide names. Private local variables follow the new vocabulary when they refer to the same role. A retained low-level or product-visible name is stated where a broad replacement would be wrong. +The tables record public and repository-wide renames. The `Current` column holds the current name. Private local variables use the same vocabulary when they refer to the same role. A retained low-level or product-visible name is stated where a broad replacement would be wrong. ### Runtime SDK -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-jsonrpc` | `@deepseek-ai/dsh-sdk-jsonrpc-server` | It is the server half of the SDK protocol. `jsonrpc` alone names an encoding; `sdk-jsonrpc-server` gives the family, mechanism, and role. | | `HarnessSdkServer` | `HarnessSdkJsonRpcServer` | The class is one JSON-RPC server implementation, not every possible SDK server. | @@ -93,7 +93,7 @@ Keep `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and `deepse ### Shell and terminal -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `packages/bash/` | `packages/shell/` | The group contains the dialect-neutral executor seam, Bash and PowerShell implementations, environment support, and shell tools. | | `@deepseek-ai/dsh-bash`, `ctx.bash` | `@deepseek-ai/dsh-shell`, `ctx.shell` | PowerShell already implements this seam. The capability is shell execution, not Bash. | @@ -113,7 +113,7 @@ Keep the Bash- and PowerShell-specific leaf packages, plugin ids, types, and too ### Language server and jobs -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-lsp-local` | `@deepseek-ai/dsh-lsp-stdio` | The provider speaks LSP over stdio through replaceable filesystem and subprocess services. It is not necessarily local. | | `packages/tasks/` | `packages/jobs/` | The family owns detached tool jobs. `jobs` is short and avoids collision with user task or todo concepts. | @@ -131,7 +131,7 @@ Keep the base LSP package, `ctx.lsp`, LSP protocol types, and the LSP tool. The ### Input triggers, tool presentation, permission presets, and user questions -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-client-ui-slash`, `ui-slash/` | `@deepseek-ai/dsh-client-ui-input-trigger`, `ui-input-trigger/` | The client handles `/`, `@`, keyboard arbitration, candidate menus, and programmatic launch. It is not only slash commands. | | `ctx.slash`, `SlashService`, `SlashController`, `SlashSource` | `ctx.inputTriggers`, `InputTriggerService`, `InputTriggerController`, `InputTriggerSource` | The names cover every supported trigger and keep the existing service, controller, and source roles. Coupled locale and public type names follow `InputTrigger`. | @@ -144,11 +144,11 @@ Keep the base LSP package, `ctx.lsp`, LSP protocol types, and the LSP tool. The | `ctx.userInteraction`, `UserInteractionService`, `UserInteractionProvider`, `UserInteractionError` | `ctx.userQuestions`, `UserQuestionService`, `UserQuestionProvider`, `UserQuestionError` | These names state the one supported interaction form. Keep `AskUserQuestion*`, the `ask_user_question` tool, and `@deepseek-ai/dsh-tool-ask-user`. | | `docs/subsystems/user-interaction.md` | `docs/subsystems/user-questions.md` | The page documents questions and answers only. | -Keep `/permission`, the `permissions` projection, the `permission` settings namespace, and `permission/preset`; they are accurate product or durable vocabulary. Keep the full `PermissionPresetSettingsController` name. Dropping `Preset` would remove the word that limits its authority. Plan a separate proposal to remove the `both` tool-presentation mode; this rename does not remove behavior. +Keep `/permission`, the `permissions` projection, the `permission` settings namespace, and `permission/preset`; they are accurate product or durable vocabulary. Keep the full `PermissionPresetSettingsController` name. Dropping `Preset` would remove the word that limits its authority. Removal of the `both` tool-presentation mode remains deferred to a separate proposal; this rename does not remove behavior. ### Typert, API gateway, and tools -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `packages/typert/type-meta/`, `@deepseek-ai/dsh-type-meta` | `typert/protocol/`, `@deepseek-ai/dsh-typert-protocol` | The package owns the Typert Remote protocol, decorators, bindings, codecs, lookups, and context contracts. It is not generic type metadata. | | `GatewayService` in the protocol package | `TypertRemoteService` | The base class marks a same-process service for Remote export. It is not the API gateway. | @@ -162,7 +162,7 @@ Keep `@deepseek-ai/dsh-tools` and `ctx.tools`. Keep `@deepseek-ai/dsh-api-gatewa ### Workspace instructions, telemetry, identity, and launch environment -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | Host `ctx.workspace` | Host `ctx.workspaceRegistry` | `WorkspaceRegistry` owns multiple workspaces, but Client `ctx.workspaces` already has an incompatible type. Both declarations merge into the same Cordis `Context` interface at compile time even though their runtime contexts are separate. The role suffix states the host service and avoids that collision. Keep `@deepseek-ai/dsh-workspace`, `WorkspaceRegistry`, `Workspace`, and `workspace.*` wire names. | | `@deepseek-ai/dsh-workspace-context`, `context/workspace-context/` | `@deepseek-ai/dsh-agent-instructions`, `context/agent-instructions/` | The package loads hierarchical `AGENTS.md` and `CLAUDE.md` files for the agent. It is not general workspace context. | @@ -181,7 +181,7 @@ Keep `@deepseek-ai/dsh-tools` and `ctx.tools`. Keep `@deepseek-ai/dsh-api-gatewa ### Schedule, workflow, goals, and compaction -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-tool-schedule`, `schedule/tool-schedule/`, plugin `tool-schedule` | `@deepseek-ai/dsh-schedule`, `schedule/schedule/`, plugin `schedule` | The package owns the durable Schedule domain, persistence barriers, management tools, timers, follow-ups, and runtime lifecycle. `tool-` describes only one part. | | `ScheduleOwner` | `ScheduleRuntime` | The per-agent object runs live timers, durable projection, dispatch, idle waits, and disposal. `Owner` does not state that execution role. Coupled private `owner*` names follow `runtime*`. | @@ -194,11 +194,11 @@ Keep `@deepseek-ai/dsh-tools` and `ctx.tools`. Keep `@deepseek-ai/dsh-api-gatewa | `@deepseek-ai/dsh-compact-basic`, `BasicCompactService`, public `BasicCompact*` | `@deepseek-ai/dsh-compaction-basic`, `BasicCompactionEngine`, corresponding `BasicCompaction*` | `basic` is plain but honest. `compaction-llm` adds no information because LLM use is already part of the current implementation family. | | `@deepseek-ai/dsh-compact-tool-result-prune`, `ToolResultPruneService`, `ctx.toolResultPrune` | `@deepseek-ai/dsh-compaction-tool-result-pruner`, `ToolResultPruner`, `ctx.toolResultPruner` | The plugin is an actor that prunes tool results. The noun `pruner` names that role. | -Keep `/compact`, the command package, and the rejected decision to preserve separate compaction definition and provider packages. The rename changes vocabulary, not that package boundary. +Keep `/compact`, the command package, and the separate compaction definition and provider packages. Merging those packages remains rejected. The rename changes vocabulary, not that package boundary. ### Settings, credentials, client modules, and small core roles -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | Abstract `Settings` | `SettingsProvider` | The class supplies settings through a replaceable capability. Keep the package, key, and events. | | `@deepseek-ai/dsh-settings-local`, `SettingsLocal` | `@deepseek-ai/dsh-settings-file`, `FileSettingsProvider` | The implementation is file-backed through the filesystem seam. `file` states the mechanism; `local` does not. | @@ -216,7 +216,7 @@ Keep `/compact`, the command package, and the rejected decision to preserve sepa ### Host web server, session data, and code execution -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `HttpServerService`, `ctx.httpServer` | `WebServer`, `ctx.webServer` | The server owns HTTP routes and WebSocket upgrade routes. `Web` leaves room for both; `Http` is too narrow here. Keep `packages/host/webserver`, `@deepseek-ai/dsh-host-webserver`, `WebRoute`, and `WebUpgradeRoute`. | | Documentation subsystem label `http-server` | `web-server` | The subsystem must use the same scope as the service. | @@ -233,7 +233,7 @@ Keep the complete session projection family and `SessionProjection*` vocabulary. ### Filesystem, skill, subagent, and web providers -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-fs-policy` | `@deepseek-ai/dsh-fs-observation-policy` | The package defines which filesystem observations authorize later effects. It is not the complete filesystem or sandbox policy. | | `FsPolicyExec` | `FsObservationActor` | The value names the actor whose observations and effects the policy relates. It does not execute the policy itself. | @@ -251,7 +251,7 @@ Keep `@deepseek-ai/dsh-subagent-dsh-sdk`, its provider id `dsh-sdk`, external AC ### Hooks, guards, plan mode, extensions, and diagnostics -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-hooks-claude`, `ClaudeHookConfig`, `parseClaudeConfig`, dialect `claude` | `@deepseek-ai/dsh-hooks-claude-code`, `ClaudeCodeHookConfig`, `parseClaudeCodeConfig`, dialect `claude-code` | The hook bridge targets Claude Code, not every Anthropic or Claude product. | | `@deepseek-ai/dsh-repeat-tool-guard`, plugin/source `repeat-tool-guard` | `@deepseek-ai/dsh-repeat-tool-reminder`, plugin/source `repeat-tool-reminder` | The plugin adds a model reminder. It does not block or enforce a guard decision. | @@ -263,11 +263,11 @@ Keep `@deepseek-ai/dsh-subagent-dsh-sdk`, its provider id `dsh-sdk`, external AC | `InvariantService` | `InvariantRegistry` | The object owns registered invariant checks. Keep `@deepseek-ai/dsh-invariants` and `ctx.invariants`. | | `packages/client/test-runtime/` | `packages/test-support/client-runtime/` | The package is client test infrastructure. Keep its npm name if it already states that contract. | -Keep MCP, Todo, and the Plan Mode package, key, events, and tool names. The accepted change concerns the controller class, not the product feature. +Keep MCP, Todo, and the Plan Mode package, key, events, and tool names. This decision renames the controller class, not the product feature. ### Utilities, E2B, host, bundles, examples, and applications -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `util/paths/`, `@deepseek-ai/dsh-paths` | `util/home-paths/`, `@deepseek-ai/dsh-home-paths` | The helpers resolve paths under the Harness home. They are not a general path library. Keep the individual function names when they already state the returned path. | | `util/retention/`, `@deepseek-ai/dsh-retention` | `util/output-retention/`, `@deepseek-ai/dsh-output-retention` | The policy retains command and tool output. It is not a general data-retention framework. | @@ -281,7 +281,7 @@ Keep atomic-write, brand, native-command, timeout utility, directory-picker, `ds ### Client runtime and UI -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `SlotsService` | `SlotRegistry` | The object owns named slot declarations and registrations. | | `SessionsService` | `SessionRuntime` | The object owns live client session coordination, not a passive session list. | @@ -365,26 +365,22 @@ The following debated names stay unchanged because the current scope is accurate **Keep aliases for old names.** Rejected. No released consumer needs them. Aliases would preserve two vocabularies and make the first release carry a migration that never had a user. -## Acceptance criteria +## Verification -- Every mapping in the ledger is applied, or this proposal is amended before implementation to explain a changed decision. -- Each family has one public vocabulary. No compatibility package, re-export alias, duplicate `ctx` key within one Cordis context, dual plugin id, dual event id, old tool alias, or fallback parser remains. -- The change is rename-only. Runtime behavior, package boundaries, defaults, policy, durable semantics, and model behavior stay equivalent except where an identifier is itself visible. -- Package directories, npm names, imports, manifests, TypeScript references and paths, Cordis config, plugin ids, service keys, events, tools, RPC names, persisted names named by the ledger, fixtures, snapshots, examples, generated catalogs, and current prose agree with the new vocabulary. -- Current implemented Agent Notes are updated with factual name and path changes when the implementation lands. The package-regrouping note records the new group inventory and package targets, the SDK removal note does not call the repository an SDK, and the timeout-policy note records the new package-name rationale. Notes whose architectural decision remains current are not rewritten into new decisions. +- Every mapping in the ledger appears in the repository. Each family has one public vocabulary; no compatibility package, re-export alias, duplicate `ctx` key within one Cordis context, dual plugin id, dual event id, old tool alias, or fallback parser remains. +- Runtime behavior, package boundaries, defaults, policy, durable semantics, and model behavior remain equivalent except where an identifier is itself visible. +- Package directories, npm names, imports, manifests, TypeScript references and paths, Cordis config, plugin ids, service keys, events, tools, RPC names, persisted names named by the ledger, fixtures, snapshots, examples, generated catalogs, and current prose use the current vocabulary. +- Current implemented Agent Notes carry the factual name and path changes. The package-regrouping note records the group inventory and package targets, the SDK removal note reserves `SDK` for the runtime protocol, and the timeout-policy note records the package-name rationale. - The paired package-creation guide contains the role-word contract, `packages/AGENTS.md` links to it, the terminology table records the chosen words and `Typert` spelling, and root project prose calls the product DeepSeek Harness rather than DeepSeek Harness SDK. - The removed SDK project toolchain stays absent. -- Focused tests cover each renamed family; source-plane typecheck, build, package hygiene, generated-reference gates, snapshots affected by visible identifiers, translation pairing, `doc-sync`, and lint pass on the complete implementation. -- The proposed note moves to `implemented/` only after the full ledger and documentation contract are true. Its implementation form describes the final state, not a migration checklist. +- `pnpm run check:ci` covers source-plane typecheck, build, package hygiene, generated-reference checks, affected snapshots, translation pairing, `doc-sync`, and lint. Release-shaped Python runtime smokes and required CI cover packaged-runtime and platform paths. -## Risks +## Consequences -The sweep changes many imports, paths, configuration strings, generated references, and model-visible names. A missed string can compile but fail at load or replay time. Implementation must use both type-directed edits and exact old-name searches across source, config, tests, fixtures, docs, and generated inputs. +The repository has one vocabulary for each renamed family. Old on-disk names, wire values, tool names, and configuration entries named in the ledger do not work. An owning parser that can identify stale configuration fails clearly instead of accepting both forms. -Concurrent work will conflict with moved paths and renamed symbols. This is temporary pre-release cost. Splitting the implementation by coherent family can reduce review and merge conflicts, but each family must remain atomic. +Some names are longer. The extra word is intentional when it prevents a false claim about authority or mechanism. A long name remains wrong when every word does not constrain the role. -Some names will become longer. The extra word is intentional when it prevents a false claim about authority or mechanism. Long names are still a failure when every word does not constrain the role. +Role suffixes do not replace inspection of behavior. The package guide keeps the direct tests from this decision: inspect what callers do, what lifetime the object owns, and what failure or policy it controls. -The role words can be applied mechanically if reviewers check suffixes without checking behavior. The guide must keep the direct tests in this note: inspect what callers do, what lifetime the object owns, and what failure or policy it controls. - -Old on-disk names, wire values, tool names, and configuration entries named in the ledger will stop working. This is accepted before release. The implementation must fail clearly on stale configuration where the owning parser can identify it; it must not silently accept both forms. +Branches based on the former paths and symbols require conflict repair. This is a one-time pre-release cost of removing the old vocabulary without compatibility aliases. diff --git a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md similarity index 87% rename from .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md rename to .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md index e5f8d37bde..8d4df0cea9 100644 --- a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md +++ b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md @@ -1,34 +1,34 @@ # Agent Note: 仓库命名约定与预发布重命名清单 -Status: proposed +Status: implemented [English](2026-08-11-repository-naming-contract-and-rename-ledger.md) | 中文 ## 问题 -仓库的发展速度超过了部分名称的演进速度。一些包名仍在描述最初的实现,而非所提供的能力。若干类即使实际承担注册表、运行时、引擎、控制器或解析器的职责,名称仍使用 `Service`。部分 `ctx` 键以单数命名注册表,却以复数命名单个引擎。还有一些提供方明明通过可替换的文件系统或子进程服务工作,可以在另一执行环境中运行,名称却使用 `local`。 +仓库的发展速度曾超过部分名称的演进速度。一些包名描述的是最初的实现,而非所提供的能力。若干类即使实际承担注册表、运行时、引擎、控制器或解析器的职责,名称仍使用 `Service`。部分 `ctx` 键以单数命名注册表,却以复数命名单个引擎。还有一些提供方明明通过可替换的文件系统或子进程服务工作,可以在另一执行环境中运行,名称却使用 `local`。 这些名称并非无关紧要。名称会告诉贡献者一项职责从哪里开始、到哪里结束。`Store` 表示数据访问。`Registry` 表示注册与查找。`Runtime` 表示实时执行和生命周期。如果同一个词同时表示这三者,调用方就必须阅读实现,才能判断哪个对象拥有策略、工作或状态。 -仓库还在两种含义下使用 `SDK`。受支持的 Python 和 TypeScript 客户端使用 JSON-RPC SDK 协议。项目整体是 DeepSeek Harness,而不是 SDK 项目。已移除的 SDK 项目工具链使宽泛的含义失去依据,但现有文案和名称仍保留了部分旧用法。 +仓库还曾在两种含义下使用 `SDK`。受支持的 Python 和 TypeScript 客户端使用 JSON-RPC SDK 协议。项目整体是 DeepSeek Harness,而不是 SDK 项目。已移除的 SDK 项目工具链使宽泛的含义失去依据,但文案和名称仍保留了部分旧用法。 -这是首次发布带标签版本之前,最后一个能够低成本完成仓库级重命名的时点。保留含义不清的名称,会让偶然形成的词汇变成兼容性约定。 +首次发布带标签版本之前的最后一个窗口,使仓库级重命名仍可低成本完成。若继续保留含义不清的名称,偶然形成的词汇就会变成兼容性约定。 -## 提案 +## 决策 -在首次发布带标签版本之前,应用本说明中的重命名清单。只更改名称,不得在重命名变更中改变包职责、服务边界、行为、默认值或数据模型。如果某个名称暴露出不合理的边界,应另写一份 proposed Agent Note,专门提议边界变更。 +仓库使用本清单中的全部当前名称。本决策只更改名称;包职责、服务边界、行为、默认值和数据模型保持不变。如果某个名称暴露出不合理的边界,需要另写一份 proposed Agent Note,专门提议边界变更。 -每组获准的系列重命名都必须原子完成。清单点名某一表面时,应一并更新其目录、NPM 包名、导入、Cordis 插件名称、`ctx` 键、公开类型、直接耦合的事件或工具标识符、配置、测试、fixture(测试前置数据)、示例、生成的参考资料以及当前文档。不得留下别名、兼容包、重复的服务键、双重事件名称或回退解析器。仓库尚未发布,旧名称应被拒绝。 +每个已重命名系列只有一套词汇。清单点名某一接口时,其目录、NPM 包名、导入、Cordis 插件名称、`ctx` 键、公开类型、直接耦合的事件或工具标识符、配置、测试、fixture(测试前置数据)、示例、生成的参考资料以及当前文档都使用当前名称。仓库不保留别名、兼容包、重复的服务键、双重事件名称或回退解析器,并拒绝旧名称。 -实现可以拆分为多个 PR(Pull Request),以保持评审可行。任何一个 PR 都不得让同一系列同时存在两套公开词汇。最终状态必须满足完整清单。 +同一系列不会公开两套词汇。 ### `SDK` 只表示一件事 -`SDK` 表示受支持的 Python 和 TypeScript SDK 所使用、基于 JSON-RPC 的客户端/服务器协议。保留 `@deepseek-ai/dsh-sdk-client`、`@deepseek-ai/dsh-sdk-protocol` 和协议身份 `deepseek-harness-sdk-runtime`。将 JSON-RPC 服务器重命名并纳入该系列。不得将 DeepSeek Harness 本身称为 SDK,也不得恢复已移除的项目生成器、启动器、辅助工具或启动器遥测包。 +`SDK` 表示受支持的 Python 和 TypeScript SDK 所使用、基于 JSON-RPC 的客户端/服务器协议。仓库保留 `@deepseek-ai/dsh-sdk-client`、`@deepseek-ai/dsh-sdk-protocol` 和协议身份 `deepseek-harness-sdk-runtime`;JSON-RPC 服务器属于同一系列。DeepSeek Harness 本身不是 SDK,已移除的项目生成器、启动器、辅助工具和启动器遥测包继续保持不存在。 -如果本提案获准,它将部分取代三项现行决策。它会替换[包重新分组决策](../../implemented/architecture/2026-07-29-package-regrouping.md)中保留的 `bash/`、`pty/` 和 `self-modification/` 组名,以及两项暂定包名。它只替换[移除 SDK 项目工具链](../../implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md)中将整个仓库称为 SDK 的说法;后者仍负责说明删除范围和保留的运行时 SDK。它只替换[工具调用超时策略](../../implemented/architecture/2026-07-07-tool-call-timeout-policy.md)中的包名理由;超时机制及其 `guard/timeout-policy/` 归属保持不变。 +本决策部分取代三项现行决策。它替换[包重新分组决策](2026-07-29-package-regrouping.md)中保留的 `bash/`、`pty/` 和 `self-modification/` 组名,以及两项暂定包名。它只替换[移除 SDK 项目工具链](../simplification/2026-08-11-remove-sdk-project-toolchain.md)中将整个仓库称为 SDK 的说法;后者仍负责说明删除范围和保留的运行时 SDK。它只替换[工具调用超时策略](2026-07-07-tool-call-timeout-policy.md)中的包名理由;超时机制及其 `guard/timeout-policy/` 归属保持不变。 -如果其他已实现说明中的包、路径或类型被重命名,而其边界和理由保持不变,则本提案不会取代这些说明。实现阶段只更新其中的事实名称。只有本提案改变既有决策时才添加双向链接;尚未获准的提案不会让现行的已实现说明提前描述未交付名称。 +如果其他已实现说明中的包、路径或类型被重命名,而其边界和理由保持不变,则本决策不会取代这些说明。这些说明使用已实现的事实名称。三项被部分取代的决策都链接回本决策。 ### 按实际职责命名 @@ -68,7 +68,7 @@ Status: proposed 如果协议或方言名称能够区分实现,就应保留。实现依赖相应机制时,保留 `Bash`、`Pwsh`、`JSON-RPC`、`SQLite`、`JSONL`、`OpenTelemetry`、`Claude Code` 和 `E2B`。每个当前后端都已使用 LLM(大语言模型)seam 时,不要在压缩后端名称中加入 `LLM`;在出现更具体的算法名称之前,`basic` 才是如实且中性的名称。 -不得虚构 `process sandbox` 概念。当前 `sandbox` 系列已经准确命名其产品职责,获准的整体重命名不会改变该边界。 +不得虚构 `process sandbox` 概念。当前 `sandbox` 系列已经准确命名其产品职责。本决策不改变该职责。 PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui`、`Llm`、`JsonRpc` 和 `ApiProxy`。在文案和适用的包名中使用惯例规定的全大写形式:UI、LLM、JSON-RPC 和 API。`Typert` 是标识符和文案中的唯一准确产品拼写;不得写成 `TypeRT`、`TypeRt`,也不得对 `Typert` 作其他内部拆分。 @@ -76,15 +76,15 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 将规则写入项目文档 -重命名实现合入时,应将完整的职责词约定加入配对的包创建指南 `docs/cookbook/adding-a-package.md`。在 `packages/AGENTS.md` 中添加一条简短规则并链接到该指南。更新术语表和根项目说明,使 `SDK` 和 `Typert` 各自只有一种含义。Agent Note 负责记录理由和被否决的替代方案;指南负责记录贡献者应遵循的规则。 +配对的包创建指南 `docs/cookbook/adding-a-package.md` 包含完整的职责词约定,`packages/AGENTS.md` 链接到该约定。术语表和根项目说明使 `SDK` 和 `Typert` 各自只有一种含义。本 Agent Note 负责记录理由和被否决的替代方案;指南负责记录贡献者应遵循的规则。 ## 重命名清单 -以下表格列出公开名称和仓库级名称。引用相同职责的私有局部变量也应采用新词汇。若宽泛替换并不正确,清单会明确指出保留的底层名称或产品可见名称。 +以下表格记录公开名称和仓库级名称的变更。`当前名称` 栏记录当前名称。引用相同职责的私有局部变量也使用相同词汇。若宽泛替换并不正确,清单会明确指出保留的底层名称或产品可见名称。 ### 运行时 SDK -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `@deepseek-ai/dsh-jsonrpc` | `@deepseek-ai/dsh-sdk-jsonrpc-server` | 它是 SDK 协议的服务器端。单独使用 `jsonrpc` 只说明编码;`sdk-jsonrpc-server` 则同时说明所属系列、机制和职责。 | | `HarnessSdkServer` | `HarnessSdkJsonRpcServer` | 该类是 JSON-RPC 服务器的一种实现,并不代表所有可能的 SDK 服务器。 | @@ -93,7 +93,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### Shell 与终端 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `packages/bash/` | `packages/shell/` | 该组包含方言无关的执行器 seam、Bash 和 PowerShell 实现、环境支持以及 shell 工具。 | | `@deepseek-ai/dsh-bash`, `ctx.bash` | `@deepseek-ai/dsh-shell`, `ctx.shell` | PowerShell 已经实现该 seam。此项能力是 shell 执行,而不是 Bash。 | @@ -113,7 +113,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 语言服务器与作业 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `@deepseek-ai/dsh-lsp-local` | `@deepseek-ai/dsh-lsp-stdio` | 该提供方通过可替换的文件系统和子进程服务,以 stdio 传输 LSP。它不一定在本地运行。 | | `packages/tasks/` | `packages/jobs/` | 该系列负责脱离前台运行的工具作业。`jobs` 简短,并可避免与用户任务或 todo 概念冲突。 | @@ -131,7 +131,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 输入触发器、工具呈现、权限预设和用户问题 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `@deepseek-ai/dsh-client-ui-slash`, `ui-slash/` | `@deepseek-ai/dsh-client-ui-input-trigger`, `ui-input-trigger/` | 客户端处理 `/`、`@`、键盘仲裁、候选菜单和程序化启动,并非只处理斜杠命令。 | | `ctx.slash`、`SlashService`、`SlashController`、`SlashSource` | `ctx.inputTriggers`、`InputTriggerService`、`InputTriggerController`、`InputTriggerSource` | 这些名称覆盖所有受支持的触发器,并保留现有的服务、控制器和来源职责。耦合的区域设置和公开类型名称也改用 `InputTrigger`。 | @@ -144,11 +144,11 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` | `ctx.userInteraction`, `UserInteractionService`, `UserInteractionProvider`, `UserInteractionError` | `ctx.userQuestions`, `UserQuestionService`, `UserQuestionProvider`, `UserQuestionError` | 这些名称说明唯一受支持的交互形式。保留 `AskUserQuestion*`、`ask_user_question` 工具和 `@deepseek-ai/dsh-tool-ask-user`。 | | `docs/subsystems/user-interaction.md` | `docs/subsystems/user-questions.md` | 该页面只记录问题和答案。 | -保留 `/permission`、`permissions` 投影、`permission` 设置命名空间和 `permission/preset`;它们都是准确的产品词汇或持久化词汇。保留完整名称 `PermissionPresetSettingsController`。删除 `Preset` 会去掉限定其权限的词。另行制定提案以移除 `both` 工具呈现模式;本次重命名不移除行为。 +保留 `/permission`、`permissions` 投影、`permission` 设置命名空间和 `permission/preset`;它们都是准确的产品词汇或持久化词汇。保留完整名称 `PermissionPresetSettingsController`。删除 `Preset` 会去掉限定其权限的词。移除 `both` 工具呈现模式的工作仍推迟到另一份提案;本次重命名不移除行为。 ### Typert、API 网关与工具 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `packages/typert/type-meta/`, `@deepseek-ai/dsh-type-meta` | `typert/protocol/`, `@deepseek-ai/dsh-typert-protocol` | 该包拥有 Typert Remote 协议、装饰器、绑定、编解码器、查找逻辑和上下文约定。它不是通用类型元数据。 | | 协议包中的 `GatewayService` | `TypertRemoteService` | 该基类标记要导出为 Remote 的同进程服务。它不是 API 网关。 | @@ -162,7 +162,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 工作区指令、遥测、身份和启动环境 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | Host `ctx.workspace` | Host `ctx.workspaceRegistry` | `WorkspaceRegistry` 拥有多个工作区,但 Client `ctx.workspaces` 已经使用不兼容的类型。即使二者运行时上下文独立,两份声明仍会在编译时合并进同一个 Cordis `Context` 接口。职责后缀明确指出 host 服务,并避免该冲突。保留 `@deepseek-ai/dsh-workspace`、`WorkspaceRegistry`、`Workspace` 和 `workspace.*` 协议名称。 | | `@deepseek-ai/dsh-workspace-context`, `context/workspace-context/` | `@deepseek-ai/dsh-agent-instructions`, `context/agent-instructions/` | 该包为 agent(智能体)加载分层的 `AGENTS.md` 和 `CLAUDE.md` 文件。它并非通用工作区上下文。 | @@ -181,7 +181,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 日程、工作流、目标与压缩 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `@deepseek-ai/dsh-tool-schedule`、`schedule/tool-schedule/`、插件 `tool-schedule` | `@deepseek-ai/dsh-schedule`、`schedule/schedule/`、插件 `schedule` | 该包拥有持久 Schedule 领域、持久化屏障、管理工具、定时器、后续轮次和运行时生命周期。`tool-` 只描述其中一部分。 | | `ScheduleOwner` | `ScheduleRuntime` | 该逐 agent 对象运行实时定时器、持久化投影、分派、空闲等待和资源释放。`Owner` 没有说明这一执行职责。耦合的私有 `owner*` 名称也改用 `runtime*`。 | @@ -194,11 +194,11 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` | `@deepseek-ai/dsh-compact-basic`、`BasicCompactService`、公开的 `BasicCompact*` | `@deepseek-ai/dsh-compaction-basic`、`BasicCompactionEngine`、对应的 `BasicCompaction*` | `basic` 朴素但准确。`compaction-llm` 没有增加信息,因为当前实现系列已使用 LLM。 | | `@deepseek-ai/dsh-compact-tool-result-prune`, `ToolResultPruneService`, `ctx.toolResultPrune` | `@deepseek-ai/dsh-compaction-tool-result-pruner`, `ToolResultPruner`, `ctx.toolResultPruner` | 该插件是剪除工具结果的执行主体。名词 `pruner` 说明了这一职责。 | -保留 `/compact`、命令包,以及维持压缩定义包与提供方包分离的既有决策。本次重命名只改变词汇,不改变该包边界。 +保留 `/compact`、命令包,以及相互独立的压缩定义包和提供方包。合并这些包的提议仍被否决。本次重命名只改变词汇,不改变该包边界。 ### 设置、凭据、客户端模块和较小的核心职责 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | 抽象类 `Settings` | `SettingsProvider` | 该类通过可替换能力提供设置。保留包、键和事件。 | | `@deepseek-ai/dsh-settings-local`, `SettingsLocal` | `@deepseek-ai/dsh-settings-file`, `FileSettingsProvider` | 该实现通过文件系统 seam 以文件为后端。`file` 说明机制,`local` 则不能。 | @@ -216,7 +216,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### Host Web 服务器、会话数据与代码执行 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `HttpServerService`, `ctx.httpServer` | `WebServer`, `ctx.webServer` | 该服务器拥有 HTTP 路由和 WebSocket 升级路由。`Web` 可以同时涵盖两者;此处的 `Http` 作用域过窄。保留 `packages/host/webserver`、`@deepseek-ai/dsh-host-webserver`、`WebRoute` 和 `WebUpgradeRoute`。 | | 文档子系统标签 `http-server` | `web-server` | 子系统标签必须与服务采用相同作用域。 | @@ -233,7 +233,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 文件系统、skill、subagent 和 Web 提供方 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `@deepseek-ai/dsh-fs-policy` | `@deepseek-ai/dsh-fs-observation-policy` | 该包定义哪些文件系统观察可以授权后续操作。它不是完整的文件系统策略或沙箱策略。 | | `FsPolicyExec` | `FsObservationActor` | 该值表示策略所关联的观察与操作的执行主体。它本身不执行策略。 | @@ -251,7 +251,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 钩子、防护、Plan Mode、扩展与诊断 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `@deepseek-ai/dsh-hooks-claude`、`ClaudeHookConfig`、`parseClaudeConfig`,方言 `claude` | `@deepseek-ai/dsh-hooks-claude-code`、`ClaudeCodeHookConfig`、`parseClaudeCodeConfig`,方言 `claude-code` | 该钩子桥接面向 Claude Code,而非所有 Anthropic 或 Claude 产品。 | | `@deepseek-ai/dsh-repeat-tool-guard`,插件/来源 `repeat-tool-guard` | `@deepseek-ai/dsh-repeat-tool-reminder`,插件/来源 `repeat-tool-reminder` | 该插件向模型添加提醒,并不阻止工具调用,也不执行防护决策。 | @@ -263,11 +263,11 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` | `InvariantService` | `InvariantRegistry` | 该对象拥有已注册的不变量检查。保留 `@deepseek-ai/dsh-invariants` 和 `ctx.invariants`。 | | `packages/client/test-runtime/` | `packages/test-support/client-runtime/` | 该包是客户端测试基础设施。如果现有 NPM 名称已经说明这一约定,则予以保留。 | -保留 MCP、Todo、Plan Mode 包、键、事件和工具名称。获准的变更针对控制器类,而不是产品功能。 +保留 MCP、Todo、Plan Mode 包、键、事件和工具名称。本决策重命名控制器类,而不是产品功能。 ### 实用工具、E2B、Host、组合包、示例与应用 -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `util/paths/`, `@deepseek-ai/dsh-paths` | `util/home-paths/`, `@deepseek-ai/dsh-home-paths` | 这些辅助函数解析 Harness 主目录下的路径,并非通用路径库。已准确说明返回路径的函数名保持不变。 | | `util/retention/`, `@deepseek-ai/dsh-retention` | `util/output-retention/`, `@deepseek-ai/dsh-output-retention` | 该策略保留命令和工具输出,而不是通用数据保留框架。 | @@ -281,7 +281,7 @@ PascalCase 标识符中的首字母缩略词使用首字母大写格式:`Ui` ### 客户端运行时与 UI -| 当前名称 | 提议名称 | 理由 | +| 旧名称 | 当前名称 | 理由 | |---|---|---| | `SlotsService` | `SlotRegistry` | 该对象拥有具名 slot 声明和注册项。 | | `SessionsService` | `SessionRuntime` | 该对象拥有实时客户端会话协调职责,而不是被动的会话列表。 | @@ -365,26 +365,22 @@ PascalCase 标识符内部使用 `Ui`,不要使用 `UI`。除非清单明确 **为旧名称保留别名。**不予采纳。没有已发布的消费方需要这些别名。别名会保留两套词汇,使首次发布携带一项从未有用户需要的迁移。 -## 验收标准 +## 验证 -- 应用清单中的每项映射;如果决策发生变化,则必须在实施前修订本提案并说明原因。 -- 每个系列只有一套公开词汇。同一个 Cordis 上下文中不得留下兼容包、重新导出别名、重复的 `ctx` 键、双重插件 id、双重事件 id、旧工具别名或回退解析器。 -- 变更只能重命名。运行时行为、包边界、默认值、策略、持久化语义和模型行为必须保持等价,只有标识符本身可见时除外。 -- 包目录、NPM 名称、导入、manifest(元数据清单)、TypeScript 引用和路径、Cordis 配置、插件 id、服务键、事件、工具、RPC 名称、清单点名的持久化名称、fixture、快照、示例、生成的目录和当前文案都采用新词汇。 -- 实现合入时,以事实性名称和路径变更更新当前处于 implemented 状态的 Agent Note。包重新分组说明应记录新的分组清单和包名目标,SDK 移除说明不得再将仓库称为 SDK,超时策略说明应记录新的包名理由。架构决策仍然有效的说明,不得被重写为新的决策。 -- 配对的包创建指南应包含职责词约定,`packages/AGENTS.md` 应链接到该约定,术语表应记录选定用词和 `Typert` 拼写,根项目文案应将产品称为 DeepSeek Harness,而不是 DeepSeek Harness SDK。 +- 清单中的每项映射都出现在仓库中。每个系列只有一套公开词汇;同一个 Cordis 上下文中没有兼容包、重新导出别名、重复的 `ctx` 键、双重插件 id、双重事件 id、旧工具别名或回退解析器。 +- 运行时行为、包边界、默认值、策略、持久化语义和模型行为保持等价,只有标识符本身可见时除外。 +- 包目录、NPM 名称、导入、manifest(元数据清单)、TypeScript 引用和路径、Cordis 配置、插件 id、服务键、事件、工具、RPC 名称、清单点名的持久化名称、fixture、快照、示例、生成的目录和当前文案都使用已实现词汇。 +- 当前处于 implemented 状态的 Agent Note 使用事实名称和路径。包重新分组说明记录分组清单和包名目标,SDK 移除说明将 `SDK` 限定为运行时协议,超时策略说明记录包名理由。 +- 配对的包创建指南包含职责词约定,`packages/AGENTS.md` 链接到该约定,术语表记录选定用词和 `Typert` 拼写,根项目文案将产品称为 DeepSeek Harness,而不是 DeepSeek Harness SDK。 - 已移除的 SDK 项目工具链继续保持不存在。 -- 聚焦测试覆盖每个重命名系列;在完整实现上,源代码平面的类型检查、构建、包卫生检查、生成参考资料门禁、受可见标识符影响的快照、翻译配对、`doc-sync` 和 lint 均应通过。 -- 只有完整清单和文档约定全部成为事实后,才能将该 proposed 说明移入 `implemented/`。其实现版应描述最终状态,而不是迁移检查清单。 +- `pnpm run check:ci` 覆盖源代码平面的类型检查、构建、包卫生检查、生成参考资料检查、受影响的快照、翻译配对、`doc-sync` 和 lint。发布形态的 Python 运行时冒烟测试和必需 CI 覆盖打包运行时与平台路径。 -## 风险 +## 后果 -这轮整体重命名会更改大量导入、路径、配置字符串、生成的参考资料和模型可见名称。遗漏的字符串可能通过编译,却在加载或回放时失败。实现时必须结合类型驱动的修改,并在源代码、配置、测试、fixture、文档和生成输入中精确搜索旧名称。 +仓库为每个重命名系列保留一套词汇。清单点名的旧磁盘名称、协议值、工具名称和配置项不再工作。能够识别陈旧配置的所属解析器会明确报错,而不是同时接受两种形式。 -并行工作会与路径移动和符号重命名产生冲突。这是发布前的临时成本。按职责一致的系列拆分实现,可以降低评审成本和合并冲突,但每个系列都必须保持原子性。 +一些名称更长。额外增加的词只有在防止误述权限或机制时才有意义。如果名称中的词不能全部限定职责,长名称仍然错误。 -一些名称会变得更长。额外增加的词只有在防止误述权限或机制时才有意义。如果名称中的词不能全部限定职责,长名称仍然是失败的命名。 +职责后缀不能替代对行为的检查。包创建指南保留本决策中的直接判断方式:检查调用方执行什么操作、对象拥有什么生命周期,以及对象控制什么失败或策略。 -如果评审人只检查后缀而不检查行为,职责词就会被机械套用。指南必须保留本说明中的直接判断方式:检查调用方执行什么操作、对象拥有什么生命周期,以及对象控制什么失败或策略。 - -清单点名的旧磁盘名称、协议值、工具名称和配置项将停止工作。发布前接受这一后果。如果负责解析的解析器能够识别陈旧配置,实现必须明确报错;不得静默接受两种形式。 +基于旧路径和旧符号的分支需要解决冲突。这是发布前移除旧词汇且不保留兼容别名的一次性成本。 diff --git a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml index b75b7f8ac5..9dd1c72ec5 100644 --- a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml +++ b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md -2026-06-11-vendor-cordis-as-source.md: ccc1289c8a0feadc08d80a3b6e8dc674c1b87bc4 -2026-06-11-vendor-cordis-as-source.zh.md: 4b30ba7684c75bf5eadc0d7c58990ced5355e8f0 +2026-06-11-vendor-cordis-as-source.md: 265966ad0a28900f511efb3091889081d56db2b4 +2026-06-11-vendor-cordis-as-source.zh.md: af8c640e2164c2f14183b29f371e234e59035180 diff --git a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md index ccc1289c8a..265966ad0a 100644 --- a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md +++ b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md @@ -6,7 +6,7 @@ English | [中文](2026-06-11-vendor-cordis-as-source.zh.md) ## Problem -DeepSeek Harness SDK is built on the Cordis framework. Cordis core was at 4.0.0-rc.6 (a release candidate) when this repo started; the harness depends on framework internals (fiber lifecycle, effect disposal, waterfall dispatch) whose exact behavior matters to the agent loop's correctness guarantees. +DeepSeek Harness is built on the Cordis framework. Cordis core was at 4.0.0-rc.6 (a release candidate) when this repo started; the harness depends on framework internals (fiber lifecycle, effect disposal, waterfall dispatch) whose exact behavior matters to the agent loop's correctness guarantees. ## Decision diff --git a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md index 4b30ba7684..af8c640e21 100644 --- a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md +++ b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md @@ -6,7 +6,7 @@ Status: implemented ## 问题 -DeepSeek Harness SDK 构建于 Cordis 框架之上。本仓库启动时,Cordis core 处于 4.0.0-rc.6(一个候选发布版本);harness 依赖框架内部实现(fiber 生命周期、dispose(资源释放)、waterfall(瀑布式事件)分发),其确切行为直接关系到 agent loop(智能体循环)的正确性保证。 +DeepSeek Harness 构建于 Cordis 框架之上。本仓库启动时,Cordis core 处于 4.0.0-rc.6(一个候选发布版本);harness 依赖框架内部实现(fiber 生命周期、dispose(资源释放)、waterfall(瀑布式事件)分发),其确切行为直接关系到 agent loop(智能体循环)的正确性保证。 ## 决策 diff --git a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml index c24200f8be..29dd78cab1 100644 --- a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml +++ b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md -2026-08-11-remove-sdk-project-toolchain.md: cfaf0df46e34d419f5d0b2d5a2a25580675fdc31 -2026-08-11-remove-sdk-project-toolchain.zh.md: 3b563007bf92f94adab6c68eeaa9c6c1522815e4 +2026-08-11-remove-sdk-project-toolchain.md: fc896c2823a1ccddf06c8dce788c4ffe72a9367a +2026-08-11-remove-sdk-project-toolchain.zh.md: a258ca39bc824fbf9f1717c10e6b123d52689af5 diff --git a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md index cfaf0df46e..fc896c2823 100644 --- a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md +++ b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md @@ -16,7 +16,7 @@ The same `scaffold/` group also contained the independently used SDK protocol, T The SDK project toolchain is deleted. The `@deepseek-ai/create-sdk`, `@deepseek-ai/dsh-scripts`, `@deepseek-ai/dsh-helper`, and `@deepseek-ai/dsh-telemetry` packages, their binaries, tests, templates, feature catalog, project-editing model, package-manager support, launcher telemetry, and repository creation skill have no replacement or compatibility layer. Their workspace, build, test, packaging, documentation-generator, vendoring-rescope, and dependency records are removed with them. -The runtime SDK remains. `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and `@deepseek-ai/dsh-sdk-jsonrpc-server` move unchanged from `packages/scaffold/` to `packages/sdk/`; their npm names and wire behavior do not change. Consumers continue to provide an executable plus an external `cordis.yml`, and the JSON-RPC server remains an ordinary plugin selected by that configuration. +The runtime SDK remains. `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and `@deepseek-ai/dsh-sdk-jsonrpc-server` move unchanged from `packages/scaffold/` to `packages/sdk/`; their npm names and wire behavior do not change. Consumers continue to provide an executable plus an external `cordis.yml`, and the JSON-RPC server remains an ordinary plugin selected by that configuration. The [repository naming contract](../architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) owns this one repository meaning of `SDK` and the surviving package names; this note owns the deleted toolchain. The canceled developer-project, project-editing, and follow-up-capabilities proposals are deleted rather than retained as active or rejected records. This note preserves the motivation they shared, the decision not to ship that product, the capability given up, and the condition for reconsideration. Frozen archived Agent Notes remain historical snapshots and are not edited. diff --git a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md index 3b563007bf..a258ca39bc 100644 --- a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md +++ b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md @@ -16,7 +16,7 @@ Status: implemented 删除 SDK 项目工具链。`@deepseek-ai/create-sdk`、`@deepseek-ai/dsh-scripts`、`@deepseek-ai/dsh-helper` 和 `@deepseek-ai/dsh-telemetry` 包及其二进制文件、测试、模板、功能目录、项目编辑模型、包管理器支持、启动器遥测和仓库项目创建 skill 均不提供替代实现或兼容层。与其对应的 workspace、构建、测试、打包、文档生成器、vendor scope 重写和依赖记录也一并移除。 -保留运行时 SDK。`@deepseek-ai/dsh-sdk-client`、`@deepseek-ai/dsh-sdk-protocol` 和 `@deepseek-ai/dsh-sdk-jsonrpc-server` 保持原样,从 `packages/scaffold/` 移至 `packages/sdk/`;其 npm 名称和协议交互行为保持不变。消费方继续提供一个可执行文件和一份外置 `cordis.yml`,JSON-RPC 服务器仍是由该配置选择的普通插件。 +保留运行时 SDK。`@deepseek-ai/dsh-sdk-client`、`@deepseek-ai/dsh-sdk-protocol` 和 `@deepseek-ai/dsh-sdk-jsonrpc-server` 保持原样,从 `packages/scaffold/` 移至 `packages/sdk/`;其 npm 名称和协议交互行为保持不变。消费方继续提供一个可执行文件和一份外置 `cordis.yml`,JSON-RPC 服务器仍是由该配置选择的普通插件。[仓库命名约定](../architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)负责规定 `SDK` 在仓库中的唯一含义和保留的包名;本说明负责记录已删除的工具链。 被取消的开发者项目、项目编辑和后续能力提案予以删除,而不是保留为活跃或已否决记录。本 Agent Note 保留这些提案共有的动机、不交付该产品的决策、放弃的能力,以及重新考虑这一决定的条件。已冻结的归档 Agent Note 仍是历史快照,不作修改。 diff --git a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml b/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml deleted file mode 100644 index 4d0d08fa33..0000000000 --- a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each -# side as of the last confirmed-consistent state. Both languages carry equal authority; -# after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md -2026-08-11-repository-naming-contract-and-rename-ledger.md: 440ab360e0bd34071de244120aca75116a56ff30 -2026-08-11-repository-naming-contract-and-rename-ledger.zh.md: e5f8d37bdee790b374ecf18be41c04ad8588da46 From b6b6a72df7d46351cae83e503b41669192014fc6 Mon Sep 17 00:00:00 2001 From: Hypatia May Date: Thu, 13 Aug 2026 11:38:38 +0800 Subject: [PATCH 009/103] feat(session-query): ship full-text session search opt-in via openAt never MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shipped bundles keep ctx.sessionQuery mounted but set the new session-query-sqlite `openAt: never` phase: searchSessions/searchEvents fail with the typed SESSION_QUERY_SEARCH_DISABLED code before any request normalization, node:sqlite is never imported or opened, and no source observation or reconciliation runs. Every inherited exact read, filter, and trace — session export descendants, subagent-fork Workspace inheritance, title reads — keeps working, and the Web sidebar search degrades to its designed local title/workspace matching. Enabling content search is a one-line openAt override in a later patch layer; the web e2e scaffold keeps it enabled as the assembled opt-in coverage. --- ...13-session-content-search-opt-in.i18n.yaml | 6 ++++ ...026-08-13-session-content-search-opt-in.md | 32 +++++++++++++++++++ ...-08-13-session-content-search-opt-in.zh.md | 32 +++++++++++++++++++ ...ssion-search-not-shipped-default.i18n.yaml | 4 +-- ...8-02-session-search-not-shipped-default.md | 2 +- ...2-session-search-not-shipped-default.zh.md | 2 +- .../tests/lazy-search-startup.compat.spec.ts | 27 ++++++++++++---- apps/web/tests/scaffold.ts | 4 +++ docs/config-catalog.i18n.yaml | 4 +-- docs/config-catalog.md | 12 +++++-- docs/config-catalog.zh.md | 12 +++++-- docs/subsystems/session-query.i18n.yaml | 4 +-- docs/subsystems/session-query.md | 3 +- docs/subsystems/session-query.zh.md | 3 +- packages/bundle/base/cordis.patch.yml | 12 +++++-- packages/bundle/web-app/cordis.patch.yml | 11 ++++--- .../session-query-sqlite/README.i18n.yaml | 4 +-- .../session-query-sqlite/README.md | 4 +-- .../session-query-sqlite/README.zh.md | 4 +-- .../session-query-sqlite/src/index.ts | 31 +++++++++++++++--- .../session-query-sqlite/tests/sqlite.spec.ts | 30 +++++++++++++++++ .../session-query/session-query/src/config.ts | 1 + .../src/service-boundary.ts | 4 +++ 23 files changed, 207 insertions(+), 41 deletions(-) create mode 100644 .agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml create mode 100644 .agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md create mode 100644 .agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md diff --git a/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml new file mode 100644 index 0000000000..270d93300e --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md +2026-08-13-session-content-search-opt-in.md: 2d14b2def00186c2957dc03ae712fbcb63d2c820 +2026-08-13-session-content-search-opt-in.zh.md: dbde561c82cebdbf51ad31b1cd22c908c8d0f327 diff --git a/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md new file mode 100644 index 0000000000..2d14b2def0 --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md @@ -0,0 +1,32 @@ +# Agent Note: Session content search ships opt-in through openAt never + +Status: implemented + +English | [中文](2026-08-13-session-content-search-opt-in.zh.md) + +## Problem + +The shipped bundles mounted the SQLite session-query provider with the full-text index live (`openAt: first-search`), so every default deployment carried a derived FTS index and the Web sidebar offered content search. Whether a deployment wants that index — its node:sqlite import, per-search source reconciliation, and derived storage — is a deployment choice, and the product default is to ship without it; the model-facing search tools were already opt-in and unmounted (the [not-shipped-default decision](../feature/2026-08-02-session-search-not-shipped-default.md)). + +Turning the capability off by unmounting the plugin row is not viable. `ApiProxyService` declares `sessionQuery` as a required injection, so without the provider the whole host API gateway stays unloaded and the Web GUI never boots. Session-log export traces subagent descendants through `ctx.sessionQuery.traceSession`, and a subagent fork resolves its Workspace through the same lineage trace — both would need optional-service guards plus a replacement lineage source, roughly tripling the change surface while losing exact reads everywhere. + +## Decision + +Content search is enforced off at the provider. `openAt: 'never'` is a third opening phase on `@deepseek-ai/dsh-session-query-sqlite`: `searchSessions` and `searchEvents` fail with the typed `SESSION_QUERY_SEARCH_DISABLED` code before any request normalization, node:sqlite is never imported or opened, and no source observation or reconciliation runs. Every inherited `ctx.sessionQuery` exact read, filter, and trace keeps working, so session export, fork Workspace inheritance, and title reads are unaffected. + +`SESSION_QUERY_SEARCH_DISABLED` joins the closed `SessionQueryErrorCode` taxonomy, and the `tool-session-query` service boundary maps it to the model-safe message `session search is disabled in this deployment`. + +The base bundle sets `openAt: never` on the `session-query-sqlite` row and the web bundle's restatement keeps it; enabling content search is a one-line `openAt` override (`first-search` or `startup`) in a later patch layer, typically with a durable `path`. The host `session.search` endpoint reports the provider failure through its existing error path, and the Web sidebar keeps its designed degradation: local title/workspace matching plus the content-search-unavailable notice. The CLI compat spec pins the shipped `openAt: never` rows, while the web e2e scaffold keeps content search enabled — its seeded-session scenarios navigate by content search, and those runs are the assembled coverage for the opt-in path. + +## Alternatives considered + +- **Unmount the plugin row** (`disabled: true` in the base patch): rejected — the api-gateway's required `sessionQuery` injection keeps the whole host API unloaded, and making that injection optional forces guards plus a header-walk lineage fallback in session export and fork resolution. +- **Disable at the consumers** (the host `session.search` endpoint or the sidebar): rejected — enforcement belongs to the operation that makes the decision; opt-in model tools or any other consumer would still reach the index. +- **A separate boolean beside `openAt`**: rejected — the opening phase already owns when SQLite starts; `never` extends the same axis instead of adding a second knob that can contradict it. + +## Consequences + +- Default deployments run no derived index: no node:sqlite import or experimental-SQLite startup warning, no reconciliation work, no derived database on disk. Sidebar search matches session titles and workspace names only. +- Search failures under the default are typed and stable rather than incidental, so callers distinguish a deployment choice from an index fault (`SESSION_QUERY_INDEX_FAILED`). +- Re-enabling content search is per-deployment configuration, not a code change, and restores the full FTS behavior unchanged. +- Compositions that mount the search tools without overriding `openAt` get the model-safe disabled message on every search call; enabling the tools implies enabling the index. diff --git a/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md new file mode 100644 index 0000000000..dbde561c82 --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md @@ -0,0 +1,32 @@ +# Agent Note: 会话内容搜索通过 openAt never 以 opt-in 方式交付 + +Status: implemented + +[English](2026-08-13-session-content-search-opt-in.md) | 中文 + +## 问题 + +交付的 bundle 之前以启用状态挂载 SQLite 会话查询提供方的全文索引(`openAt: first-search`),因此每个默认部署都携带一个派生 FTS 索引,Web 侧边栏提供内容搜索。一个部署是否需要该索引——它的 node:sqlite 导入、每次搜索的来源对账和派生存储——是部署自身的选择,产品默认不携带它交付;面向模型的搜索工具此前已经是 opt-in 且未挂载(见[非默认交付决策](../feature/2026-08-02-session-search-not-shipped-default.md))。 + +通过卸载插件行来关闭该能力不可行。`ApiProxyService` 将 `sessionQuery` 声明为必需注入,没有该提供方时整个宿主 API 网关保持未加载,Web GUI 无法启动。会话日志导出通过 `ctx.sessionQuery.traceSession` 追踪子代理后代,子代理分叉也通过同一血缘追踪解析其 Workspace——两者都需要可选服务守卫加一个替代血缘来源,改动面大约扩大三倍,同时使精确读取在所有地方消失。 + +## 决策 + +内容搜索在提供方处强制关闭。`openAt: 'never'` 是 `@deepseek-ai/dsh-session-query-sqlite` 的第三个打开阶段:`searchSessions` 和 `searchEvents` 在任何请求规范化之前就以类型化的 `SESSION_QUERY_SEARCH_DISABLED` 代码失败,node:sqlite 绝不会被导入或打开,也不运行任何来源观察或对账。`ctx.sessionQuery` 上继承的全部精确读取、过滤和跟踪保持可用,因此会话导出、分叉的 Workspace 继承和标题读取不受影响。 + +`SESSION_QUERY_SEARCH_DISABLED` 加入封闭的 `SessionQueryErrorCode` 分类,`tool-session-query` 的服务边界将它映射为模型安全消息 `session search is disabled in this deployment`。 + +base bundle 在 `session-query-sqlite` 行上设置 `openAt: never`,web bundle 的重述保持该值;启用内容搜索只需在后续 patch 层用一行覆盖 `openAt`(`first-search` 或 `startup`),通常同时配一个持久 `path`。宿主 `session.search` 端点沿现有错误路径报告提供方失败,Web 侧边栏保持其既有降级:本地标题/工作区匹配加内容搜索不可用提示。CLI 兼容性测试固定交付的 `openAt: never` 行,而 Web e2e 脚手架保持内容搜索启用——其种子会话场景通过内容搜索导航,这些运行也是 opt-in 路径的装配级覆盖。 + +## 曾考虑的替代方案 + +- **卸载插件行**(在 base patch 中 `disabled: true`)——否决:api-gateway 的必需 `sessionQuery` 注入会使整个宿主 API 保持未加载,而把该注入改为可选需要守卫加上会话导出与分叉解析中的 header 遍历血缘回退。 +- **在消费方处关闭**(宿主 `session.search` 端点或侧边栏)——否决:强制应由做出决定的操作执行;opt-in 的模型工具或任何其他消费方仍会触达索引。 +- **在 `openAt` 旁增加独立布尔开关**——否决:打开阶段已经拥有"SQLite 何时启动"这一轴;`never` 延伸同一根轴,而不是增加一个可能与之矛盾的第二个旋钮。 + +## 结果 + +- 默认部署不运行任何派生索引:没有 node:sqlite 导入或实验性 SQLite 启动警告,没有对账工作,磁盘上没有派生数据库。侧边栏搜索只匹配会话标题和工作区名称。 +- 默认状态下的搜索失败是类型化且稳定的,调用方可以把部署选择与索引故障(`SESSION_QUERY_INDEX_FAILED`)区分开。 +- 重新启用内容搜索是逐部署配置而非代码改动,并原样恢复完整的 FTS 行为。 +- 挂载搜索工具但未覆盖 `openAt` 的组合,每次搜索调用都会得到模型安全的已禁用消息;启用工具意味着同时启用索引。 diff --git a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml index 1a4d923540..b9a8b2e9c8 100644 --- a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md -2026-08-02-session-search-not-shipped-default.md: c1bfd7f8e354a4480c5635619514fe782ea71d2c -2026-08-02-session-search-not-shipped-default.zh.md: 9b80c549425c26055700480dd57f1a0a7d01e4a8 +2026-08-02-session-search-not-shipped-default.md: 60d1f424d5a9029a00b3f195d1f6e6baf2790d1e +2026-08-02-session-search-not-shipped-default.zh.md: 221613ae1aef93cd72734e4c328d822a88b64227 diff --git a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md index c1bfd7f8e3..60d1f424d5 100644 --- a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md +++ b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md @@ -12,7 +12,7 @@ The [shipped-roster decision](2026-07-31-even-out-shipped-tool-rosters.md) made The shipped TUI, Web, and headless surfaces do not mount `@deepseek-ai/dsh-tool-session-query`, and no shipped agent preset carries it. The consumer stays opt-in exactly as the model-facing-session-query-tools note describes: the ACP example's [`session-query.cordis.yml`](../../../../examples/acp-agent/session-query.cordis.yml) and its snapshot counterpart remain the mounted reference, and a custom composition can mount the package with the timeout and spill policies. -The `ctx.sessionQuery` service itself stays mounted. `session-query-sqlite` remains a base row — the TUI's `session-reference` consumes it for `/resume` — and the Web overlay keeps patching it to an in-memory index for the browser content search. Only the model-facing consumer is removed. +The `ctx.sessionQuery` service itself stays mounted. `session-query-sqlite` remains a base row — the TUI's `session-reference` consumes it for `/resume` — with its full-text index off by default (`openAt: never`; the [content-search opt-in decision](../architecture/2026-08-13-session-content-search-opt-in.md)), and the Web overlay keeps its in-memory values for deployments that enable content search. Only the model-facing consumer is removed. ## Alternatives considered diff --git a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md index 9b80c54942..221613ae1a 100644 --- a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md +++ b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md @@ -12,7 +12,7 @@ Status: implemented 交付的 TUI、Web 与无头 surface 均不挂载 `@deepseek-ai/dsh-tool-session-query`,交付的 agent preset 也都不包含它。该消费方仍保持 opt-in,与面向模型的会话查询工具决策所述完全一致:ACP(Agent Client Protocol)示例的 [`session-query.cordis.yml`](../../../../examples/acp-agent/session-query.cordis.yml) 及其快照对侧文件仍是挂载参考,自定义组合也可以连同超时与 spill 策略一起挂载该包。 -`ctx.sessionQuery` 服务本身保持挂载。`session-query-sqlite` 仍是 base 的一行,TUI 的 `session-reference` 消费它来实现 `/resume`,Web overlay 也继续把它 patch 成内存索引,供浏览器内容搜索使用。被移除的只有面向模型的消费方。 +`ctx.sessionQuery` 服务本身保持挂载。`session-query-sqlite` 仍是 base 的一行,TUI 的 `session-reference` 消费它来实现 `/resume`;其全文索引默认关闭(`openAt: never`,见[内容搜索 opt-in 决策](../architecture/2026-08-13-session-content-search-opt-in.md)),Web overlay 保留内存索引取值,供启用内容搜索的部署使用。被移除的只有面向模型的消费方。 ## 曾考虑的替代方案 diff --git a/apps/cli/tests/lazy-search-startup.compat.spec.ts b/apps/cli/tests/lazy-search-startup.compat.spec.ts index b1477a63d0..c563c850e6 100644 --- a/apps/cli/tests/lazy-search-startup.compat.spec.ts +++ b/apps/cli/tests/lazy-search-startup.compat.spec.ts @@ -21,15 +21,22 @@ import { describe, expect, it } from 'vitest' const repoRoot = fileURLToPath(new URL('../../../', import.meta.url)) const builtBin = join(repoRoot, 'apps/cli/lib/bin.js') const webDist = join(repoRoot, 'apps/web/dist/index.html') -// The web bundle's patch owns the session-query-sqlite lazy-open row. -const configPath = join(repoRoot, 'packages/bundle/web-app/cordis.patch.yml') +// Full-text session search ships off (`openAt: never` on both layers): the +// base patch carries the default, and the web restatement must not re-enable it. +const baseConfigPath = join(repoRoot, 'packages/bundle/base/cordis.patch.yml') +const webConfigPath = join(repoRoot, 'packages/bundle/web-app/cordis.patch.yml') const requireBuiltArtifacts = process.env.DSH_REQUIRE_BUILT_CLI_SMOKE === '1' interface ConfigRow { id?: string + disabled?: unknown config?: { openAt?: unknown } } +interface PatchEntry extends ConfigRow { + insert?: ConfigRow[] +} + const jsExprType = new yaml.Type('tag:yaml.org,2002:js', { kind: 'scalar', construct: value => String(value), @@ -92,12 +99,20 @@ function runBuiltWeb(cwd: string): Promise<{ stdout: string; stderr: string; cod } describe.skipIf(!requireBuiltArtifacts)('built CLI lazy-search startup', () => { - it('boots and disposes the shipped composition without a SQLite startup warning', async () => { + it('boots and disposes the shipped composition with full-text search off by default', async () => { expect(existsSync(builtBin), `missing built CLI ${resolve(builtBin)}; run pnpm build`).toBe(true) expect(existsSync(webDist), `missing Web dist ${resolve(webDist)}; run pnpm run build:web`).toBe(true) - const rows = yaml.load(await readFile(configPath, 'utf8'), { schema: configSchema }) as ConfigRow[] - const searchRow = rows.find(row => row.id === 'session-query-sqlite') - expect(searchRow?.config?.openAt).toBe('first-search') + const baseRows = (yaml.load(await readFile(baseConfigPath, 'utf8'), { schema: configSchema }) as PatchEntry[]) + .flatMap(entry => entry.insert ?? [entry]) + const webRows = (yaml.load(await readFile(webConfigPath, 'utf8'), { schema: configSchema }) as PatchEntry[]) + .flatMap(entry => entry.insert ?? [entry]) + const baseRow = baseRows.find(row => row.id === 'session-query-sqlite') + const webRow = webRows.find(row => row.id === 'session-query-sqlite') + expect(baseRow?.config?.openAt).toBe('never') + expect(baseRow?.disabled).toBeUndefined() + // The web restatement keeps the shipped default; opting in is a later layer's override. + expect(webRow?.config?.openAt).toBe('never') + expect(webRow?.disabled).toBeUndefined() const cwd = await mkdtemp(join(tmpdir(), 'dsh-cli-lazy-search-')) try { diff --git a/apps/web/tests/scaffold.ts b/apps/web/tests/scaffold.ts index 1c3fb67e85..970ff7b139 100644 --- a/apps/web/tests/scaffold.ts +++ b/apps/web/tests/scaffold.ts @@ -391,6 +391,10 @@ export async function launchWebScaffold(options: LaunchOptions = {}): Promise = z.object({ path: z.string().required(), - openAt: z.union(['startup', 'first-search'] as const).default('startup'), + openAt: z.union(['startup', 'first-search', 'never'] as const).default('startup'), journalMode: z.union(['wal', 'delete', 'truncate', 'persist'] as const).default('wal'), defaultLimit: z.number().step(1).min(1).max(SQLITE_MAX_PAGE_LIMIT).default(SESSION_QUERY_SQLITE_DEFAULT_LIMIT), maxLimit: z.number().step(1).min(1).max(SQLITE_MAX_PAGE_LIMIT).default(SESSION_QUERY_SQLITE_MAX_LIMIT), @@ -251,6 +257,7 @@ export class SqliteSessionQueryEngine extends SessionQueryEngine { request: SessionSearchRequest, exec?: SessionSearchExecContext, ): Promise> { + this._assertSearchEnabled() const normalized = normalizeSessionRequest(request, this.config) const signal = exec?.signal return this._serialized(signal, async () => { @@ -278,6 +285,7 @@ export class SqliteSessionQueryEngine extends SessionQueryEngine { request: SessionEventSearchRequest, exec?: SessionSearchExecContext, ): Promise { + this._assertSearchEnabled() const normalized = normalizeEventRequest(request, this.config) const signal = exec?.signal return this._serialized(signal, async () => { @@ -310,6 +318,19 @@ export class SqliteSessionQueryEngine extends SessionQueryEngine { return this._closePromise } + /** + * Refuse full-text calls under `openAt: 'never'` before any request + * normalization or SQLite work, so a disabled deployment never imports + * node:sqlite, opens the index, or observes sources. + */ + private _assertSearchEnabled(): void { + if (this.config.openAt !== 'never') return + throw new SessionQueryError( + 'session search is disabled: this deployment configures the session-query index with openAt "never"', + 'SESSION_QUERY_SEARCH_DISABLED', + ) + } + private async _close(): Promise { this._closed = true await this._tail @@ -991,7 +1012,7 @@ function resolveConfig(config: Config): ResolvedConfig { if (typeof resolved.path !== 'string' || resolved.path.trim().length === 0) { throw invalidConfig('path must not be blank') } - const openPhases: readonly string[] = ['startup', 'first-search'] + const openPhases: readonly string[] = ['startup', 'first-search', 'never'] if (!openPhases.includes(resolved.openAt)) throw invalidConfig('openAt is not supported') assertPageLimit('defaultLimit', resolved.defaultLimit) assertPageLimit('maxLimit', resolved.maxLimit) diff --git a/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts b/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts index dc791758f0..0a565fe021 100644 --- a/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts +++ b/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts @@ -231,6 +231,36 @@ describe('SQLite session search', () => { await expect(stat(path)).rejects.toMatchObject({ code: 'ENOENT' }) }) + it('refuses search in never mode while inherited reads and traces keep working', async () => { + const path = await temporaryPath('never-mode.db') + const ctx = new Context() + await ctx.plugin(SessionStore) + const search = await ctx.plugin(SqliteSessionQueryEngine, { path, openAt: 'never' }) + const service = ctx.sessionQuery as SqliteSessionQueryEngine + expect(service.config.openAt).toBe('never') + + const parent = SessionId('never-parent') + const child = SessionId('never-child') + ctx.sessions.create(parent, { seed: messageEvents('never opened needle'), meta: { createdAt: 10 } }) + ctx.sessions.create(child, { meta: { parentSession: parent, createdAt: 20 } }) + + await expect(service.searchSessions({ query: 'needle' })) + .rejects.toThrow(expectCode('SESSION_QUERY_SEARCH_DISABLED')) + await expect(service.searchEvents({ sessionId: parent, query: 'needle' })) + .rejects.toThrow(expectCode('SESSION_QUERY_SEARCH_DISABLED')) + + expect((await service.listSessions()).map(record => record.header.id).sort()) + .toEqual([child, parent]) + const lineage = await service.traceSession(parent) + expect(lineage.complete).toBe(true) + expect(lineage.descendants.map(node => node.session.header.id)).toEqual([child]) + + // The disabled index never touches the filesystem, in mount, use, or disposal. + await expect(stat(path)).rejects.toMatchObject({ code: 'ENOENT' }) + await search.dispose() + await expect(stat(path)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + it('opens once on the first search and reuses readiness for later searches', async () => { const ctx = new Context() await ctx.plugin(SessionStore) diff --git a/packages/session-query/session-query/src/config.ts b/packages/session-query/session-query/src/config.ts index a449799193..99039bcbfa 100644 --- a/packages/session-query/session-query/src/config.ts +++ b/packages/session-query/session-query/src/config.ts @@ -31,6 +31,7 @@ export type SessionQueryErrorCode = | 'SESSION_QUERY_INVALID_SURFACE' | 'SESSION_QUERY_INVALID_WINDOW' | 'SESSION_QUERY_PERSISTENCE_FAILED' + | 'SESSION_QUERY_SEARCH_DISABLED' | 'SESSION_QUERY_SESSION_NOT_FOUND' | 'SESSION_QUERY_STALE_CURSOR' | 'SESSION_QUERY_SOURCE_CONFLICT' diff --git a/packages/session-query/tool-session-query/src/service-boundary.ts b/packages/session-query/tool-session-query/src/service-boundary.ts index 9fbfc0c55c..98bc8e8dc9 100644 --- a/packages/session-query/tool-session-query/src/service-boundary.ts +++ b/packages/session-query/tool-session-query/src/service-boundary.ts @@ -71,6 +71,10 @@ const SAFE_SESSION_QUERY_FAILURES = { code: 'SESSION_QUERY_PERSISTENCE_FAILED', message: 'session history storage is unavailable', }, + SESSION_QUERY_SEARCH_DISABLED: { + code: 'SESSION_QUERY_SEARCH_DISABLED', + message: 'session search is disabled in this deployment', + }, SESSION_QUERY_SESSION_NOT_FOUND: { code: 'SESSION_QUERY_SESSION_NOT_FOUND', message: 'session was not found', From f0afc4536d545ffe8f4981e7d61d03a624097bf1 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Thu, 13 Aug 2026 11:59:05 +0800 Subject: [PATCH 010/103] docs(website): link guide sidebar modules --- website/.vitepress/config.ts | 39 +++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index e451ecb68c..ca55e05828 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -31,6 +31,39 @@ function sidebar(locale: DocsLocale, collection: NonNullable, 'zh-guide' | 'en-guide'>, +): DefaultTheme.SidebarItem[] { + const labels = locale === 'root' + ? { develop: '开发', reference: '参考' } + : { develop: 'Development', reference: 'Reference' } + const developCollection = locale === 'root' ? 'zh-develop' : 'en-develop' + const referenceCollection = locale === 'root' ? 'zh-reference' : 'en-reference' + return [ + ...sidebar(locale, collection), + { + text: labels.develop, + link: landingLink(locale, developCollection), + collapsed: true, + items: sidebar(locale, developCollection), + }, + { + text: labels.reference, + link: landingLink(locale, referenceCollection), + collapsed: true, + items: sidebar(locale, referenceCollection), + }, + ] +} + function watchCanonicalDocs(server: ViteDevServer): void { const sources = docsSourceFiles() server.watcher.add(sources) @@ -201,7 +234,7 @@ export default withMermaid({ { text: '参考', link: landingLink('root', 'zh-reference'), activeMatch: '^/reference/' }, ], sidebar: { - '/guide/': sidebar('root', 'zh-guide'), + '/guide/': guideSidebar('root', 'zh-guide'), '/develop/': sidebar('root', 'zh-develop'), '/reference/': sidebar('root', 'zh-reference'), }, @@ -224,11 +257,11 @@ export default withMermaid({ siteTitle: siteTitle('Preview'), nav: [ { text: 'Guide', link: landingLink('en', 'en-guide'), activeMatch: '^/en/guide/' }, - { text: 'Develop', link: landingLink('en', 'en-develop'), activeMatch: '^/en/develop/' }, + { text: 'Development', link: landingLink('en', 'en-develop'), activeMatch: '^/en/develop/' }, { text: 'Reference', link: landingLink('en', 'en-reference'), activeMatch: '^/en/reference/' }, ], sidebar: { - '/en/guide/': sidebar('en', 'en-guide'), + '/en/guide/': guideSidebar('en', 'en-guide'), '/en/develop/': sidebar('en', 'en-develop'), '/en/reference/': sidebar('en', 'en-reference'), }, From 00933877f0d4f891b4b49ce00859e0729ea1ea86 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Thu, 13 Aug 2026 12:07:30 +0800 Subject: [PATCH 011/103] docs(website): make module rows direct links --- website/.vitepress/config.ts | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index ca55e05828..ef7261b12a 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -36,7 +36,7 @@ function sidebar(locale: DocsLocale, collection: NonNullable Date: Thu, 13 Aug 2026 12:19:22 +0800 Subject: [PATCH 012/103] docs(website): read guide module facts from one per-locale record --- website/.vitepress/config.ts | 90 +++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index ef7261b12a..86e22c7706 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -5,7 +5,7 @@ import { resolve } from 'node:path' import type { DefaultTheme, PageData } from 'vitepress' import type { ViteDevServer } from 'vite' import { withMermaid } from 'vitepress-plugin-mermaid' -import { landingLink, orderedPages, routeLink, sectionSpec, type DocsLocale, type DocsPage } from '../docs.ts' +import { landingLink, orderedPages, routeLink, sectionSpec, type DocsLocale, type DocsPage, type DocsSidebar } from '../docs.ts' import { docsSourceFiles, projectDocs } from '../../scripts/project-doc-site.ts' projectDocs() @@ -31,26 +31,74 @@ function sidebar(locale: DocsLocale, collection: NonNullable + /** * Guide sidebar with direct links into the first development and reference pages. * * @param locale - Route tree whose guide sidebar is being built. - * @param collection - Guide collection for the locale. * @returns Guide groups followed by top-level links to the other documentation modules. */ -function guideSidebar( - locale: DocsLocale, - collection: Extract, 'zh-guide' | 'en-guide'>, -): DefaultTheme.SidebarItem[] { - const labels = locale === 'root' - ? { develop: '开发', reference: '参考' } - : { develop: 'Development', reference: 'Reference' } - const developCollection = locale === 'root' ? 'zh-develop' : 'en-develop' - const referenceCollection = locale === 'root' ? 'zh-reference' : 'en-reference' +function guideSidebar(locale: DocsLocale): DefaultTheme.SidebarItem[] { + const { guide, develop, reference } = guideModules[locale] return [ - ...sidebar(locale, collection), - { text: labels.develop, link: landingLink(locale, developCollection) }, - { text: labels.reference, link: landingLink(locale, referenceCollection) }, + ...sidebar(locale, guide), + ...[develop, reference].map(({ label, collection }) => ({ + text: label, + link: landingLink(locale, collection), + })), + ] +} + +/** + * Navigation-bar items for the modules the guide sidebar links into, reading + * their labels and collections from the shared per-locale record. + * + * @param locale - Route tree the navigation items belong to. + * @returns The module items for the locale's navigation bar. + */ +function moduleNav(locale: DocsLocale): DefaultTheme.NavItem[] { + const { develop, reference } = guideModules[locale] + const routePrefix = locale === 'root' ? '' : '/en' + return [ + { text: develop.label, link: landingLink(locale, develop.collection), activeMatch: `^${routePrefix}/develop/` }, + { text: reference.label, link: landingLink(locale, reference.collection), activeMatch: `^${routePrefix}/reference/` }, ] } @@ -219,12 +267,11 @@ export default withMermaid({ themeConfig: { siteTitle: siteTitle('技术预览'), nav: [ - { text: '入门', link: landingLink('root', 'zh-guide'), activeMatch: '^/guide/' }, - { text: '开发', link: landingLink('root', 'zh-develop'), activeMatch: '^/develop/' }, - { text: '参考', link: landingLink('root', 'zh-reference'), activeMatch: '^/reference/' }, + { text: '入门', link: landingLink('root', guideModules.root.guide), activeMatch: '^/guide/' }, + ...moduleNav('root'), ], sidebar: { - '/guide/': guideSidebar('root', 'zh-guide'), + '/guide/': guideSidebar('root'), '/develop/': sidebar('root', 'zh-develop'), '/reference/': sidebar('root', 'zh-reference'), }, @@ -246,12 +293,11 @@ export default withMermaid({ themeConfig: { siteTitle: siteTitle('Preview'), nav: [ - { text: 'Guide', link: landingLink('en', 'en-guide'), activeMatch: '^/en/guide/' }, - { text: 'Development', link: landingLink('en', 'en-develop'), activeMatch: '^/en/develop/' }, - { text: 'Reference', link: landingLink('en', 'en-reference'), activeMatch: '^/en/reference/' }, + { text: 'Guide', link: landingLink('en', guideModules.en.guide), activeMatch: '^/en/guide/' }, + ...moduleNav('en'), ], sidebar: { - '/en/guide/': guideSidebar('en', 'en-guide'), + '/en/guide/': guideSidebar('en'), '/en/develop/': sidebar('en', 'en-develop'), '/en/reference/': sidebar('en', 'en-reference'), }, From a2de7703d7519d40a503b1f9275cb9e7d5347d19 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:02:48 +0800 Subject: [PATCH 013/103] docs: refresh root README and sync Chinese counterpart Finalize the English root README (developer-preview notice, npm run path, community sections) and re-translate README.zh.md to match, updating the pairing record. Fix the README.md#run anchors in the Web UI guide and model providers docs after the Run section was renamed. --- README.i18n.yaml | 4 +-- README.md | 45 ++++++++++---------------- README.zh.md | 49 ++++++++++------------------- docs/user/guide/index.i18n.yaml | 4 +-- docs/user/guide/index.md | 2 +- docs/user/guide/index.zh.md | 2 +- docs/user/guide/providers.i18n.yaml | 4 +-- docs/user/guide/providers.md | 2 +- docs/user/guide/providers.zh.md | 2 +- 9 files changed, 42 insertions(+), 72 deletions(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index a22d693fb4..cc6e5044ec 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 891098974433535fa65863c80c512d3818e75955 -README.zh.md: d4b176737fffe60fe6393c796fe1d3e8cb9d72da +README.md: 2218f59aede73dc692a3ddf6f80be9e6d9c31500 +README.zh.md: 42785fafa1bce7272eb1f0db2a9a6c46caaa92cd diff --git a/README.md b/README.md index 8910989744..2218f59aed 100644 --- a/README.md +++ b/README.md @@ -2,31 +2,27 @@ English | [中文](README.zh.md) -DeepSeek Harness (`dsh`) is an open-source coding agent and plugin-based agent harness. +DeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com). -It uses an architecture where **everything is a plugin**. +It is powered by [Cordis](https://github.com/cordiverse/cordis) and uses an architecture where **everything is a plugin**. -## Internal testing notice +## Developer preview -DeepSeek Harness is under internal testing. Features and interfaces may change. +DeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.** -Session Logs stay local by default. Set `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` to share a Session Log only when submitting feedback, or `DSH_TELEMETRY_MODE=FULL` to upload continuously; `FULL` also enables dsh-sdk command telemetry reporting an anonymous ID, the command result, and redacted project configuration. Send feedback through the internal WeChat group. +## Run from `npm` -## Run - -Install Node.js ^22.19 or >= 24 and pnpm 11, then run the published package: +Install `Node.js`, then run the published package: ```sh npx @deepseek-ai/dsh web ``` -The command initializes the Web profile and prints the Web UI URL, which is `http://127.0.0.1:3080` by default. Open it, add a DeepSeek API key under **Settings → Models**, then start a session. The invoking directory is the default workspace; try `Summarize this repository and identify its main packages.` - -Continue with the [Web UI guide](docs/user/guide/index.md). +The command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md). ### Run from source -To run a repository checkout instead: +To run from a repository checkout: ```sh git clone https://github.com/deepseek-ai/deepseek-harness.git @@ -36,28 +32,23 @@ pnpm run build pnpm dsh web ``` -`pnpm run build` prepares the repository artifacts. `pnpm dsh web` starts the Web UI without rebuilding and opens the same path. +## Community and support -## Profiles and plugins +### Report bugs and suggest improvements -A profile is an ordered list of plugin bundles. The shipped `web` profile powers `dsh web`. Manage a profile with `dsh plugin --profile `, which forwards the remaining arguments to pnpm in that profile's directory: +- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions). -```sh -npx -p @deepseek-ai/dsh dsh plugin --profile web add -npx -p @deepseek-ai/dsh dsh plugin --profile web remove -``` +### Share a plugin -`add`, `remove`, `update`, `why`, and other pnpm commands work unchanged. The command initializes a missing profile before changing its packages and updates its bundle list from installed packages that declare `dsh.bundle`. See the [CLI reference](apps/cli/reference/README.md#plugin-management) for the exact behavior. +- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability. -The [CLI reference](apps/cli/README.md) covers headless execution and custom profiles. The [Python SDK](python/README.md) and [examples](examples/README.md) cover programmatic and custom compositions. +## Contributing -## Community - -Follow DeepSeek Harness on Twitter for project updates. +See [CONTRIBUTING.md](CONTRIBUTING.md). ## Development -Start with the [development guide](docs/development.md) and read the [architecture](docs/architecture.md) before changing packages. +Start with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md). For agents, follow [AGENTS.md](AGENTS.md). @@ -66,7 +57,3 @@ For agents, follow [AGENTS.md](AGENTS.md). [BSD 3-Clause](LICENSE) Third-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). - -## Contributing - -Read [CONTRIBUTING.md](CONTRIBUTING.md) before contributing to this repository. diff --git a/README.zh.md b/README.zh.md index d4b176737f..42785fafa1 100644 --- a/README.zh.md +++ b/README.zh.md @@ -2,27 +2,23 @@ [English](README.md) | 中文 -DeepSeek Harness(`dsh`)是一款开源 coding agent(编程智能体),也是一个基于插件的 agent harness(智能体框架)。 +DeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。 -它采用了**一切皆插件**的架构。 +它基于 [Cordis](https://github.com/cordiverse/cordis) 构建,采用**一切皆插件**的架构。 -## 内测说明 +## 开发者预览 -DeepSeek Harness 正处于内部测试阶段,功能和接口可能发生变化。 +DeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。** -会话日志默认保存在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 后,仅在提交反馈时共享对应的会话日志;设置 `DSH_TELEMETRY_MODE=FULL` 后,会持续上传会话日志。`FULL` 还会启用 dsh-sdk 命令遥测,上报匿名 ID、命令执行结果和脱敏后的项目配置。请通过内部企业微信群反馈问题和建议。 +## 通过 `npm` 运行 -## 运行 - -请先安装 Node.js(版本要求:`^22.19` 或 `>=24`)和 pnpm 11,然后运行已发布的包: +安装 `Node.js`,然后运行已发布的包: ```sh npx @deepseek-ai/dsh web ``` -该命令会初始化 Web profile 并打印 Web UI 地址,默认地址为 `http://127.0.0.1:3080`。打开该地址,在**设置 → 模型**中添加 DeepSeek API 密钥,然后启动一个会话。运行命令时所在的目录将作为默认工作区;你可以尝试输入 `Summarize this repository and identify its main packages.`。 - -下一步请阅读 [Web UI 指南](docs/user/guide/index.md)。 +该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。 ### 从源码运行 @@ -36,41 +32,28 @@ pnpm run build pnpm dsh web ``` -`pnpm run build` 会准备仓库产物。`pnpm dsh web` 不会重新构建,而是直接启动同一个 Web UI。 +## 社区与支持 -## Profile 与插件 +### 反馈问题与提出改进建议 -profile 由一组按顺序排列的插件组合包构成。随附的 `web` profile 用于运行 `dsh web`。使用 `dsh plugin --profile ` 管理 profile;该命令会在对应 profile 目录中将剩余参数转发给 pnpm: +- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。 -```sh -npx -p @deepseek-ai/dsh dsh plugin --profile web add -npx -p @deepseek-ai/dsh dsh plugin --profile web remove -``` +### 分享插件 -`add`、`remove`、`update`、`why` 等 pnpm 命令均可直接使用。该命令会先初始化不存在的 profile,再修改其中的包,并根据声明了 `dsh.bundle` 的已安装包更新 bundle 列表。具体行为见 [CLI 参考](apps/cli/reference/README.md#plugin-management)。 +- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。 -[CLI(命令行界面)参考](apps/cli/README.md)介绍 headless 执行与自定义 profile。[Python SDK](python/README.md) 和[示例](examples/README.md)介绍程序化组合与自定义组合。 +## 参与贡献 -## 社区 - -扫描二维码,或打开 DeepSeek Harness 微信社区申请页面 申请加入。 - -

- DeepSeek Harness 微信社区二维码 -

+参见 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 开发 -请先阅读[开发指南](docs/development.md);修改包之前,请阅读[架构文档](docs/architecture.md)。 +请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。 -面向 agent:遵循 [AGENTS.md](AGENTS.md)。 +面向 agent:请遵循 [AGENTS.md](AGENTS.md)。 ## 许可证 [BSD 3-Clause](LICENSE) 第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。 - -## 参与贡献 - -向本仓库贡献前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。 diff --git a/docs/user/guide/index.i18n.yaml b/docs/user/guide/index.i18n.yaml index 51f8a8802d..c304bfee35 100644 --- a/docs/user/guide/index.i18n.yaml +++ b/docs/user/guide/index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/guide/index.md -index.md: 80d288b1aba37e7f0863fe5fc8237cbd2a6ab9b5 -index.zh.md: addfbc94ff93ed015e52f509a23a3f981e36770b +index.md: fcf414baf0ee0b959d9cd2dfa128ccd138cfeb62 +index.zh.md: b4e80202c1555cfbff134a9db03ee92b1239f2ab diff --git a/docs/user/guide/index.md b/docs/user/guide/index.md index 80d288b1ab..fcf414baf0 100644 --- a/docs/user/guide/index.md +++ b/docs/user/guide/index.md @@ -2,7 +2,7 @@ English | [中文](index.zh.md) -Start the Web UI through the [root README](../../../README.md#run); the command prints its URL. This guide begins after that server is running. +Start the Web UI through the [root README](../../../README.md#run-from-npm); the command prints its URL. This guide begins after that server is running. The invoking directory is the default workspace, so the agent can inspect and modify the project where you started `dsh`. diff --git a/docs/user/guide/index.zh.md b/docs/user/guide/index.zh.md index addfbc94ff..b4e80202c1 100644 --- a/docs/user/guide/index.zh.md +++ b/docs/user/guide/index.zh.md @@ -2,7 +2,7 @@ [English](index.md) | 中文 -先按照[根 README](../../../README.md#run)启动 Web UI;命令会打印其访问地址。本指南从服务器已经运行的状态开始。 +先按照[根 README](../../../README.md#run-from-npm)启动 Web UI;命令会打印其访问地址。本指南从服务器已经运行的状态开始。 调用目录是默认工作区,因此 agent(智能体)可以检查并修改启动 `dsh` 时所在的项目。 diff --git a/docs/user/guide/providers.i18n.yaml b/docs/user/guide/providers.i18n.yaml index faff9bb2ee..610e4577c5 100644 --- a/docs/user/guide/providers.i18n.yaml +++ b/docs/user/guide/providers.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/guide/providers.md -providers.md: 099f434ec4602aa402239e83c708d81fcadd7732 -providers.zh.md: 367c90b525ad628b3cd86b2d22045c25064e88a1 +providers.md: 191c5d441bd65d87832578d6c0a7b3771c3fec9f +providers.zh.md: 5ff5ae88744eda1942b4b605bb6220d3b833987b diff --git a/docs/user/guide/providers.md b/docs/user/guide/providers.md index 099f434ec4..191c5d441b 100644 --- a/docs/user/guide/providers.md +++ b/docs/user/guide/providers.md @@ -2,7 +2,7 @@ English | [中文](providers.zh.md) -This guide assumes you started the Web UI through the [root README](../../../README.md#run). Model changes take effect on the next request without restarting the server. +This guide assumes you started the Web UI through the [root README](../../../README.md#run-from-npm). Model changes take effect on the next request without restarting the server. ## Configure DeepSeek diff --git a/docs/user/guide/providers.zh.md b/docs/user/guide/providers.zh.md index 367c90b525..5ff5ae8874 100644 --- a/docs/user/guide/providers.zh.md +++ b/docs/user/guide/providers.zh.md @@ -2,7 +2,7 @@ [English](providers.md) | 中文 -本指南假定你已按照[根 README](../../../README.md#run)启动 Web UI。模型变更会在下一次请求时生效,不需要重启服务器。 +本指南假定你已按照[根 README](../../../README.md#run-from-npm)启动 Web UI。模型变更会在下一次请求时生效,不需要重启服务器。 ## 配置 DeepSeek From 2af84c9a2c85f26ff4bbe6bd8d8f931b27943a78 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:12:13 +0800 Subject: [PATCH 014/103] docs: follow-up README wording and community section flattening Reorder the Cordis attribution clause, shorten the install lead-in, and flatten the community section into a single list; sync README.zh.md and the pairing record. --- README.i18n.yaml | 4 ++-- README.md | 9 ++------- README.zh.md | 9 ++------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index cc6e5044ec..7c5df076e1 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 2218f59aede73dc692a3ddf6f80be9e6d9c31500 -README.zh.md: 42785fafa1bce7272eb1f0db2a9a6c46caaa92cd +README.md: 8564a84eef1e72dc71919df0b22dbac31f8e2acc +README.zh.md: 6d710828fd9d744aa1b3f0d786e58b346c7ed17b diff --git a/README.md b/README.md index 2218f59aed..8564a84eef 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ English | [中文](README.zh.md) DeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com). -It is powered by [Cordis](https://github.com/cordiverse/cordis) and uses an architecture where **everything is a plugin**. +It uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis). ## Developer preview @@ -12,7 +12,7 @@ DeepSeek Harness is currently in _developer preview_ and is iterating rapidly. * ## Run from `npm` -Install `Node.js`, then run the published package: +Install `Node.js`, then run: ```sh npx @deepseek-ai/dsh web @@ -34,12 +34,7 @@ pnpm dsh web ## Community and support -### Report bugs and suggest improvements - - Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions). - -### Share a plugin - - Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability. ## Contributing diff --git a/README.zh.md b/README.zh.md index 42785fafa1..6d710828fd 100644 --- a/README.zh.md +++ b/README.zh.md @@ -4,7 +4,7 @@ DeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。 -它基于 [Cordis](https://github.com/cordiverse/cordis) 构建,采用**一切皆插件**的架构。 +它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。 ## 开发者预览 @@ -12,7 +12,7 @@ DeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。** ## 通过 `npm` 运行 -安装 `Node.js`,然后运行已发布的包: +安装 `Node.js`,然后运行: ```sh npx @deepseek-ai/dsh web @@ -34,12 +34,7 @@ pnpm dsh web ## 社区与支持 -### 反馈问题与提出改进建议 - - 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。 - -### 分享插件 - - 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。 ## 参与贡献 From 797ea7c574d12be01e8042b003e2e24154f00ec9 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:16:31 +0800 Subject: [PATCH 015/103] docs: restore the Run section heading and retarget guide links Split the quickstart into a Run section with a Run from npm subsection, mirror it in the Chinese pair, and point the Web UI guide and providers docs back at the #run anchor. --- README.i18n.yaml | 4 ++-- README.md | 4 +++- README.zh.md | 4 +++- docs/user/guide/index.i18n.yaml | 4 ++-- docs/user/guide/index.md | 2 +- docs/user/guide/index.zh.md | 2 +- docs/user/guide/providers.i18n.yaml | 4 ++-- docs/user/guide/providers.md | 2 +- docs/user/guide/providers.zh.md | 2 +- 9 files changed, 16 insertions(+), 12 deletions(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index 7c5df076e1..f3bc48f20e 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 8564a84eef1e72dc71919df0b22dbac31f8e2acc -README.zh.md: 6d710828fd9d744aa1b3f0d786e58b346c7ed17b +README.md: 95c7e89da3ff4d88b10bc9acbc1ded2ed065950f +README.zh.md: 775e2b32e9af226272b87ee71ebdd3fc553aab4d diff --git a/README.md b/README.md index 8564a84eef..95c7e89da3 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ It uses an architecture where **everything is a plugin**, and is powered by [Cor DeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.** -## Run from `npm` +## Run + +### Run from `npm` Install `Node.js`, then run: diff --git a/README.zh.md b/README.zh.md index 6d710828fd..775e2b32e9 100644 --- a/README.zh.md +++ b/README.zh.md @@ -10,7 +10,9 @@ DeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的 DeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。** -## 通过 `npm` 运行 +## 运行 + +### 通过 `npm` 运行 安装 `Node.js`,然后运行: diff --git a/docs/user/guide/index.i18n.yaml b/docs/user/guide/index.i18n.yaml index c304bfee35..51f8a8802d 100644 --- a/docs/user/guide/index.i18n.yaml +++ b/docs/user/guide/index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/guide/index.md -index.md: fcf414baf0ee0b959d9cd2dfa128ccd138cfeb62 -index.zh.md: b4e80202c1555cfbff134a9db03ee92b1239f2ab +index.md: 80d288b1aba37e7f0863fe5fc8237cbd2a6ab9b5 +index.zh.md: addfbc94ff93ed015e52f509a23a3f981e36770b diff --git a/docs/user/guide/index.md b/docs/user/guide/index.md index fcf414baf0..80d288b1ab 100644 --- a/docs/user/guide/index.md +++ b/docs/user/guide/index.md @@ -2,7 +2,7 @@ English | [中文](index.zh.md) -Start the Web UI through the [root README](../../../README.md#run-from-npm); the command prints its URL. This guide begins after that server is running. +Start the Web UI through the [root README](../../../README.md#run); the command prints its URL. This guide begins after that server is running. The invoking directory is the default workspace, so the agent can inspect and modify the project where you started `dsh`. diff --git a/docs/user/guide/index.zh.md b/docs/user/guide/index.zh.md index b4e80202c1..addfbc94ff 100644 --- a/docs/user/guide/index.zh.md +++ b/docs/user/guide/index.zh.md @@ -2,7 +2,7 @@ [English](index.md) | 中文 -先按照[根 README](../../../README.md#run-from-npm)启动 Web UI;命令会打印其访问地址。本指南从服务器已经运行的状态开始。 +先按照[根 README](../../../README.md#run)启动 Web UI;命令会打印其访问地址。本指南从服务器已经运行的状态开始。 调用目录是默认工作区,因此 agent(智能体)可以检查并修改启动 `dsh` 时所在的项目。 diff --git a/docs/user/guide/providers.i18n.yaml b/docs/user/guide/providers.i18n.yaml index 610e4577c5..faff9bb2ee 100644 --- a/docs/user/guide/providers.i18n.yaml +++ b/docs/user/guide/providers.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/guide/providers.md -providers.md: 191c5d441bd65d87832578d6c0a7b3771c3fec9f -providers.zh.md: 5ff5ae88744eda1942b4b605bb6220d3b833987b +providers.md: 099f434ec4602aa402239e83c708d81fcadd7732 +providers.zh.md: 367c90b525ad628b3cd86b2d22045c25064e88a1 diff --git a/docs/user/guide/providers.md b/docs/user/guide/providers.md index 191c5d441b..099f434ec4 100644 --- a/docs/user/guide/providers.md +++ b/docs/user/guide/providers.md @@ -2,7 +2,7 @@ English | [中文](providers.zh.md) -This guide assumes you started the Web UI through the [root README](../../../README.md#run-from-npm). Model changes take effect on the next request without restarting the server. +This guide assumes you started the Web UI through the [root README](../../../README.md#run). Model changes take effect on the next request without restarting the server. ## Configure DeepSeek diff --git a/docs/user/guide/providers.zh.md b/docs/user/guide/providers.zh.md index 5ff5ae8874..367c90b525 100644 --- a/docs/user/guide/providers.zh.md +++ b/docs/user/guide/providers.zh.md @@ -2,7 +2,7 @@ [English](providers.md) | 中文 -本指南假定你已按照[根 README](../../../README.md#run-from-npm)启动 Web UI。模型变更会在下一次请求时生效,不需要重启服务器。 +本指南假定你已按照[根 README](../../../README.md#run)启动 Web UI。模型变更会在下一次请求时生效,不需要重启服务器。 ## 配置 DeepSeek From d3f69e20adc14ae0f21a4c8105fafad14181911b Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:50:52 +0800 Subject: [PATCH 016/103] test: refresh translation prompt snapshot for the new root README The snapshot embeds the root README pair as a reviewed example; regenerate it so the example reflects the finalized English README and its Chinese counterpart. --- .../translation-prompt-v4/request-response.expected.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/snapshots/translation-prompt-v4/request-response.expected.json b/scripts/snapshots/translation-prompt-v4/request-response.expected.json index 3b40ec7d34..2d874452ae 100644 --- a/scripts/snapshots/translation-prompt-v4/request-response.expected.json +++ b/scripts/snapshots/translation-prompt-v4/request-response.expected.json @@ -8,11 +8,11 @@ }, { "role": "user", - "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source coding agent and plugin-based agent harness.\n\nIt uses an architecture where **everything is a plugin**.\n\n## Internal testing notice\n\nDeepSeek Harness is under internal testing. Features and interfaces may change.\n\nSession Logs stay local by default. Set `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` to share a Session Log only when submitting feedback, or `DSH_TELEMETRY_MODE=FULL` to upload continuously; `FULL` also enables dsh-sdk command telemetry reporting an anonymous ID, the command result, and redacted project configuration. Send feedback through the internal WeChat group.\n\n## Run\n\nInstall Node.js ^22.19 or >= 24 and pnpm 11, then run the published package:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command initializes the Web profile and prints the Web UI URL, which is `http://127.0.0.1:3080` by default. Open it, add a DeepSeek API key under **Settings → Models**, then start a session. The invoking directory is the default workspace; try `Summarize this repository and identify its main packages.`\n\nContinue with the [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run a repository checkout instead:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n`pnpm run build` prepares the repository artifacts. `pnpm dsh web` starts the Web UI without rebuilding and opens the same path.\n\n## Profiles and plugins\n\nA profile is an ordered list of plugin bundles. The shipped `web` profile powers `dsh web`. Manage a profile with `dsh plugin --profile `, which forwards the remaining arguments to pnpm in that profile's directory:\n\n```sh\nnpx -p @deepseek-ai/dsh dsh plugin --profile web add \nnpx -p @deepseek-ai/dsh dsh plugin --profile web remove \n```\n\n`add`, `remove`, `update`, `why`, and other pnpm commands work unchanged. The command initializes a missing profile before changing its packages and updates its bundle list from installed packages that declare `dsh.bundle`. See the [CLI reference](apps/cli/reference/README.md#plugin-management) for the exact behavior.\n\nThe [CLI reference](apps/cli/README.md) covers headless execution and custom profiles. The [Python SDK](python/README.md) and [examples](examples/README.md) cover programmatic and custom compositions.\n\n## Community\n\nFollow DeepSeek Harness on Twitter for project updates.\n\n## Development\n\nStart with the [development guide](docs/development.md) and read the [architecture](docs/architecture.md) before changing packages.\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[BSD 3-Clause](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n\n## Contributing\n\nRead [CONTRIBUTING.md](CONTRIBUTING.md) before contributing to this repository.\n" + "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[BSD 3-Clause](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" }, { "role": "assistant", - "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是一款开源 coding agent(编程智能体),也是一个基于插件的 agent harness(智能体框架)。\n\n它采用了**一切皆插件**的架构。\n\n## 内测说明\n\nDeepSeek Harness 正处于内部测试阶段,功能和接口可能发生变化。\n\n会话日志默认保存在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 后,仅在提交反馈时共享对应的会话日志;设置 `DSH_TELEMETRY_MODE=FULL` 后,会持续上传会话日志。`FULL` 还会启用 dsh-sdk 命令遥测,上报匿名 ID、命令执行结果和脱敏后的项目配置。请通过内部企业微信群反馈问题和建议。\n\n## 运行\n\n请先安装 Node.js(版本要求:`^22.19` 或 `>=24`)和 pnpm 11,然后运行已发布的包:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会初始化 Web profile 并打印 Web UI 地址,默认地址为 `http://127.0.0.1:3080`。打开该地址,在**设置 → 模型**中添加 DeepSeek API 密钥,然后启动一个会话。运行命令时所在的目录将作为默认工作区;你可以尝试输入 `Summarize this repository and identify its main packages.`。\n\n下一步请阅读 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n`pnpm run build` 会准备仓库产物。`pnpm dsh web` 不会重新构建,而是直接启动同一个 Web UI。\n\n## Profile 与插件\n\nprofile 由一组按顺序排列的插件组合包构成。随附的 `web` profile 用于运行 `dsh web`。使用 `dsh plugin --profile ` 管理 profile;该命令会在对应 profile 目录中将剩余参数转发给 pnpm:\n\n```sh\nnpx -p @deepseek-ai/dsh dsh plugin --profile web add \nnpx -p @deepseek-ai/dsh dsh plugin --profile web remove \n```\n\n`add`、`remove`、`update`、`why` 等 pnpm 命令均可直接使用。该命令会先初始化不存在的 profile,再修改其中的包,并根据声明了 `dsh.bundle` 的已安装包更新 bundle 列表。具体行为见 [CLI 参考](apps/cli/reference/README.md#plugin-management)。\n\n[CLI(命令行界面)参考](apps/cli/README.md)介绍 headless 执行与自定义 profile。[Python SDK](python/README.md) 和[示例](examples/README.md)介绍程序化组合与自定义组合。\n\n## 社区\n\n扫描二维码,或打开 DeepSeek Harness 微信社区申请页面 申请加入。\n\n

\n \"DeepSeek\n

\n\n## 开发\n\n请先阅读[开发指南](docs/development.md);修改包之前,请阅读[架构文档](docs/architecture.md)。\n\n面向 agent:遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[BSD 3-Clause](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n\n## 参与贡献\n\n向本仓库贡献前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。\n" + "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[BSD 3-Clause](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" }, { "role": "user", From c905c4694e317eff1f529f0fed047c2ce202d11a Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 01:46:57 +0800 Subject: [PATCH 017/103] Adopt MIT for DSH packages --- LICENSE | 41 ++++----- README.i18n.yaml | 4 +- README.md | 2 +- README.zh.md | 2 +- THIRD_PARTY_NOTICES.md | 2 +- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package.json | 4 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- .../attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- .../ui-directory-picker-browse/package.json | 2 +- .../ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- .../client/ui-message-feedback/package.json | 2 +- .../client/ui-model-selection/package.json | 2 +- .../client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- .../client/ui-settings-general/package.json | 2 +- .../client/ui-settings-models/package.json | 2 +- .../ui-settings-plugin-inventory/package.json | 2 +- .../client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- .../client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- .../code-runtime-worker-thread/package.json | 2 +- .../code-runtime/code-runtime/package.json | 2 +- .../compaction/command-compact/package.json | 2 +- .../compaction/compaction-basic/package.json | 2 +- .../package.json | 2 +- packages/compaction/compaction/package.json | 2 +- .../context/agent-instructions/package.json | 2 +- .../context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- .../core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- .../core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- .../credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- .../examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- .../cordis-client-runner/package.json | 2 +- .../cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- .../feedback/command-feedback/package.json | 2 +- .../feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- .../fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- .../fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- .../guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- .../host/directory-picker-auto/package.json | 2 +- .../host/directory-picker-browse/package.json | 2 +- .../host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- .../identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- .../permission-presets/package.json | 2 +- .../interaction/tool-ask-user/package.json | 2 +- .../interaction/user-approval/package.json | 2 +- .../interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- .../invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- .../sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- .../session-log-export/package.json | 2 +- .../session-query-sqlite/package.json | 2 +- .../session-query/session-query/package.json | 2 +- .../tool-session-query/package.json | 2 +- .../session-checkpoint-policy/package.json | 2 +- .../session-persistence-jsonl/package.json | 2 +- .../session-persistence-sqlite/package.json | 2 +- .../session/session-persistence/package.json | 2 +- .../session-projection-cache/package.json | 2 +- .../session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- .../session-telemetry-otel/package.json | 2 +- .../session/session-telemetry/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- .../shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- .../subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- .../subagent/subagent-dsh-sdk/package.json | 2 +- .../subagent-fork-in-process/package.json | 2 +- .../subagent-in-process-driver/package.json | 2 +- .../subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- .../tool-subagent-control/package.json | 2 +- .../tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- .../subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- .../test-support/acp-snapshot/package.json | 2 +- .../agent-loop-testkit/package.json | 2 +- .../test-support/client-runtime/package.json | 2 +- .../test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- .../test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- .../web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- .../workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- python/sdk-runtime/pyproject.toml | 2 +- python/sdk/pyproject.toml | 2 +- python/sdk/tests/test_release_version.py | 2 + scripts/build-python-release.py | 4 +- scripts/gen-third-party-notices.ts | 2 +- scripts/run-gates.spec.ts | 9 ++ scripts/run-gates.ts | 2 + .../request-response.expected.json | 4 +- scripts/verify-dsh-package-licenses.spec.ts | 59 ++++++++++++ scripts/verify-dsh-package-licenses.ts | 89 +++++++++++++++++++ 237 files changed, 414 insertions(+), 258 deletions(-) create mode 100644 scripts/verify-dsh-package-licenses.spec.ts create mode 100644 scripts/verify-dsh-package-licenses.ts diff --git a/LICENSE b/LICENSE index d03c77437e..c1f7a78e89 100644 --- a/LICENSE +++ b/LICENSE @@ -1,28 +1,21 @@ -BSD 3-Clause License +MIT License -Copyright (c) 2026, DeepSeek +Copyright (c) 2026 DeepSeek -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.i18n.yaml b/README.i18n.yaml index f3bc48f20e..573a3ffedb 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 95c7e89da3ff4d88b10bc9acbc1ded2ed065950f -README.zh.md: 775e2b32e9af226272b87ee71ebdd3fc553aab4d +README.md: 646262f0b8317a48cab9aa84bab87b7a2b8e85ec +README.zh.md: 892da6f48cd8b60dd61332ec412f604a8062b27d diff --git a/README.md b/README.md index 95c7e89da3..646262f0b8 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,6 @@ For agents, follow [AGENTS.md](AGENTS.md). ## License -[BSD 3-Clause](LICENSE) +[MIT](LICENSE) Third-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). diff --git a/README.zh.md b/README.zh.md index 775e2b32e9..892da6f48c 100644 --- a/README.zh.md +++ b/README.zh.md @@ -51,6 +51,6 @@ pnpm dsh web ## 许可证 -[BSD 3-Clause](LICENSE) +[MIT](LICENSE) 第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。 diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 49d5e15b47..92b218ff33 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -3,7 +3,7 @@ # Third-Party Notices -DeepSeek Harness is licensed under [BSD 3-Clause](LICENSE). It depends on the third-party software listed below. Each project remains under its own license; nothing in this file changes those terms. +DeepSeek Harness is licensed under [MIT](LICENSE). It depends on the third-party software listed below. Each project remains under its own license; nothing in this file changes those terms. This file lists **direct** dependencies declared by the workspace and the explicitly disclosed official Claude platform payload closure. It is generated from the workspace manifests by `scripts/gen-third-party-notices.ts`: a pre-commit hook regenerates it whenever a staged file changes one of its inputs, and `scripts/gen-third-party-notices.spec.ts` asserts in the test lane that the committed bytes match. Deleting a manifest runs no hook, so that case is caught by the assertion instead. Run `pnpm run verify-third-party-notices` for the standalone check. diff --git a/apps/cli/package.json b/apps/cli/package.json index 50251dbc9a..ff7cc07407 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -18,7 +18,7 @@ "lib/*.js", "config" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/cordis-plugin-hmr": "workspace:^", "@deepseek-ai/cordis-plugin-include": "workspace:^", diff --git a/apps/web/package.json b/apps/web/package.json index f6dd190d91..32d6c06d78 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -24,7 +24,7 @@ "dev": "vite", "watch": "vite build --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-client-web": "workspace:^", "react": "^18.2.0", diff --git a/package.json b/package.json index edfec2bae8..cf0f8b917f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "@deepseek-ai/dsh-root", "version": "0.0.1-rc.5", + "license": "MIT", "private": true, "type": "module", "packageManager": "pnpm@11.7.0", @@ -68,6 +69,7 @@ "verify-public-repository-links": "tsx scripts/verify-public-repository-links.ts", "verify-doc-refs": "tsx scripts/verify-doc-refs.ts", "verify-package-paths": "tsx scripts/verify-package-paths.ts", + "verify-dsh-package-licenses": "tsx scripts/verify-dsh-package-licenses.ts", "verify-config-source-ownership": "tsx scripts/verify-config-source-ownership.ts", "verify-package-invariants": "tsx scripts/verify-package-invariants.ts", "verify-built-package-invariants": "node scripts/verify-built-package-invariants.mjs", @@ -122,7 +124,7 @@ "verify-module-graph": "tsx scripts/gen-module-graph.ts --check", "constraints": "tsx scripts/check-workspace-constraints.ts", "doc-sync": "tsx scripts/run-gates.ts doc-sync", - "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", + "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", "publish:npm-baseline": "tsx scripts/publish-npm-baseline.ts", "release:dsh": "tsx scripts/release/bump.ts --family dsh", "release:vendor": "tsx scripts/release/bump.ts --family vendor", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index 5aedb8fd5b..2c8b3cc826 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@agentclientprotocol/sdk": "0.25.1", "@deepseek-ai/schemastery": "workspace:^" diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index 66c34a9b1f..722d052fc1 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -54,7 +54,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-typert-protocol": "workspace:^" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index ae2f56dd0c..7f8182fedb 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "files": [ "lib/index.js", "lib/invariant.js", diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index bc350a8106..2caa098326 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -20,7 +20,7 @@ "./package.json": "./package.json" }, "files": ["lib/index.js", "lib/invariant.js", "lib/types/**/*.d.ts"], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index 4819bd7674..43a36a1d84 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -20,7 +20,7 @@ "./package.json": "./package.json" }, "files": ["lib/index.js", "lib/invariant.js", "lib/types/**/*.d.ts"], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index cafa235de1..368cd8ce22 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "js-yaml": "^4.2.0" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index a679d4e3fe..ddbfd025fd 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 392a6f63d5..164380c7ed 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -32,7 +32,7 @@ "cordis.patch.yml", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dsh": { "bundle": { "patch": "./cordis.patch.yml" diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 652c5802da..9f8ebca111 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -37,7 +37,7 @@ "cordis.patch.yml", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dsh": { "bundle": { "patch": "./cordis.patch.yml" diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 227f0b5dfb..0c8193088f 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -37,7 +37,7 @@ "cordis.patch.yml", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dsh": { "bundle": { "patch": "./cordis.patch.yml" diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 537e3817cd..8d954c28d1 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -36,7 +36,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-host-apiproxy": "workspace:^", diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index 4190458443..994634005c 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -36,7 +36,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 4aa1561131..30f82a4828 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -41,7 +41,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index a18247368f..d7b3a155ac 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -40,7 +40,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "devDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", "@deepseek-ai/dsh-host-webserver": "workspace:^", diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 36aeaa4bf2..1855f2c7f7 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -40,7 +40,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-attachment": "workspace:^", diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index fca815aae0..a6fd68893b 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index 418e6642e7..8b6788513d 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 837353dc5b..007c4092e1 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index 9b55563f85..2739b05cee 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 608817a1e8..2cab53f03e 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", "clsx": "^2.0.0", diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index ecac18c55f..d21883da32 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "react": "^18.2.0" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index a63fe3038a..105b64dc2d 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 73e8646f14..acc587e532 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index acea46c02c..bdad883101 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index f9b10d5975..2a41e5fe58 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index 92be42fbce..c4608b04b2 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -36,7 +36,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index d600913ce9..e89aa6deba 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index f59a70fe1d..f498ba9213 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 1e85054714..03bfbb163f 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 89b3de4ca2..9e5702a29e 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index c06c45ca13..41c106a391 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index 0000405054..28685575b4 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@shikijs/langs": "^4.3.1", "@types/mdast": "^4.0.4", diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 3da8aff119..df051694a5 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", "@deepseek-ai/schemastery": "workspace:^", diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 71dbde5bd4..c69fc62153 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 9b24c3e6af..02fb7fc18d 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index a5464633ab..b9573329c4 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index 96114115e7..fcdc871cc0 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index fa43d4ac8f..ba67acf035 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index bfea498ad0..9725afb999 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index 99db753250..d7d24d41cc 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "devDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 20cc8ef3ba..695eb44242 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "react": "^18.2.0" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 85bc5eada4..af0d9c4d72 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -43,7 +43,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 42acc17b65..77126b3acd 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 0c3da436e6..64cc7bf3a8 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@tanstack/react-virtual": "^3.14.9", "diff": "^9.0.0" diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index 6def4e4c11..df45a9d006 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-client-connection": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index 8562df8962..c405348651 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -49,7 +49,7 @@ "lib/client.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "react": "^18.2.0" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index 70c178a823..4665c00faa 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index 3389c736cc..0fcc91e373 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "react": "^18.2.0", diff --git a/packages/client/web/package.json b/packages/client/web/package.json index 117e8e0ffc..fe900dd289 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-client-modules": "workspace:^", "@deepseek-ai/dsh-client-schema-form": "workspace:^", diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index 6be610002a..dbb8ef3911 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -34,7 +34,7 @@ "lib/worker.cjs", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-code-runtime": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index 37764117ae..d1e878347f 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index d7bf62247c..7c7c7405d9 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-compaction": "workspace:^", diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 6530c7d88f..65093551f7 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-compaction": "workspace:^", diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index de0cc00887..9a3260bc2c 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-compaction": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index 58c648bac1..981e78fbf9 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index af88f2bb1a..1bd5d1b78c 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-fs": "workspace:^", diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index d065069409..4a4de322b6 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 6b8d4ca862..31eedc1e3e 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 2d5bedfdd3..2ff4123d59 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index a521524d6d..657738564c 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index 1851b5e5d8..5b5decf6dc 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -29,7 +29,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index d547b4e158..b73d7e5906 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index b5c31c43ec..2aadce0f3a 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index 02f01cc8b1..0a905db770 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/core/session/package.json b/packages/core/session/package.json index 2d9cbaf17b..2c71fd5914 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index 2bc2ec5328..3d5fecb898 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index aa1fe55317..b472b72eae 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-code-runtime": "workspace:^", diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index 9ce945ec19..3e6336abf9 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-atomic-write": "workspace:^", "@deepseek-ai/dsh-credentials": "workspace:^", diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index d513b026d2..c4e9b22fc2 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index da84d0f370..50619aab9b 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index f85fa57e80..e4cad4d1dd 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-e2b": "workspace:^", "@deepseek-ai/dsh-fs": "workspace:^", diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index 24e72d4811..9d939df557 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-e2b": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index 73a7b09a99..a3791b086a 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -38,7 +38,7 @@ "lib/bin.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-include": "workspace:^", "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index a7d181afb5..5a7b1e3cb6 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-timer": "workspace:^", "@deepseek-ai/dsh-agent": "workspace:^", diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index 7eaa061bbc..f756389787 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -43,7 +43,7 @@ "lib/packaged-bin.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-app-boot": "workspace:^" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index e6b3d128db..fe183445d0 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 33307e816e..263a673466 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -47,7 +47,7 @@ "lib/typert.remote-client.js", "lib/typert.remote-client.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^", "zod": "^4.4.3" diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index b1a290b307..d1badb3d1f 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-cordis-host-runner": "workspace:^", diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 9140540481..9e16d3a4a5 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -48,7 +48,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index cebf4c9514..62a0b6e6fc 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index d437ad6fa6..92fd1b69e1 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -47,7 +47,7 @@ "lib/typert.remote-client.js", "lib/typert.remote-client.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index c91bd7fc60..e1a08d5b26 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-fs": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index 0fe92162d5..a58f7dffa1 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-fs": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 21d36276ad..14bb7688ad 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-fs": "workspace:^", "@deepseek-ai/dsh-fs-local": "workspace:^", diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index 7e9576d2ab..0b7fa7de95 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index 98aba6c9b8..fb605640e2 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@vscode/ripgrep": "^1.18.0", "@deepseek-ai/schemastery": "workspace:^" diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index d4be8e7409..52afc01c71 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "diff": "^9.0.0", "@deepseek-ai/schemastery": "workspace:^" diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index 88d36dc1e8..0ba3199de1 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -29,7 +29,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-fs": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index cb099cf4a7..37856f82c1 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-goal": "workspace:^", diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index 577fd6c523..04039bccf5 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-goal": "workspace:^", diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index 89962d272f..7a70042efd 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -51,7 +51,7 @@ "lib/typert.remote-client.js", "lib/typert.remote-client.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-session-projection": "workspace:^", diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index 8a5f5f9c07..a55b4aecc2 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-goal": "workspace:^", diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 923a00bb16..3ce74bf325 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index 4c4ad88b31..1f79e44170 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index d3152ab035..9f10386e1c 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index 82798ab10c..a3bd642b42 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 2f7866eef5..340c2ceb22 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index 298d53ac47..307581a3f3 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -43,7 +43,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-agent": "workspace:^", diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index 1afeac29fb..d79af2594e 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index 169bb3dc59..5749e795fa 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-host-directory-picker": "workspace:^", "@deepseek-ai/schemastery": "workspace:^" diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index f7627d179e..62c375f5fa 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -35,7 +35,7 @@ "lib/worker.cjs", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-host-directory-picker": "workspace:^", "@deepseek-ai/dsh-native-command": "workspace:^", diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index a62321267a..f197d31250 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 9f0efc8e71..5cbd0d8628 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-host-webserver": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 1267665bc1..99833b8ea9 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -47,7 +47,7 @@ "lib/typert.remote-client.js", "lib/typert.remote-client.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "zod": "^4.4.3" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index 340ce1208b..891fa49b23 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^" diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index d470813313..604b308f15 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 3e4fb3108a..c08b1294a4 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -51,7 +51,7 @@ "lib/typert.remote-client.js", "lib/typert.remote-client.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index 3f9265e76c..3b3160baae 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index 6fc2702b34..af45d56ab1 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index eb22896e4a..aa1e6a5ee7 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 71e35da0bf..04b7355dd1 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 5a536915ca..4b1120a92d 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index fcac4eae3d..83235ec22b 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index 776afa4081..73ddb5f657 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index d27bec0b66..9c86b3c98e 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-credentials": "workspace:^", "@deepseek-ai/dsh-launch-environment": "workspace:^", diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 5d386cac67..5c2845394e 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-credentials": "workspace:^", diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index 5455065f37..e6c3013da1 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -34,7 +34,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-agent": "workspace:^", diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index 7c171595e3..c6018de902 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -43,7 +43,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index 3c917e7d8e..efaf61ef86 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-compaction": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index a57a6bcff1..04088296fb 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-fs": "workspace:^", diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index 8e06c85d1b..4f16df5a2f 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index b9bd0e083b..bd4bda1388 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index 858be7d289..d42b425730 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index 5d6e8eaace..d13c7606b1 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index 929ed4ed62..241cf74ce7 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-include": "workspace:^", "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index cd6181a87c..24fb8660a1 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-system-prompt": "workspace:^", diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index e836e829eb..41d8c631e1 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index c363453692..57918c351b 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index f5efe42255..06ea90d1cf 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index 031d08bf63..7faad86ea0 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -36,7 +36,7 @@ "lib/types-*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index ac5ea6c542..00ebcfd612 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index 78acd49f8c..f7e2fd6406 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index 938de7f9f7..6e8d4d5dd9 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -29,7 +29,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index f7f8fed39a..966d35d538 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -29,7 +29,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index a2b1b5731a..aad971d714 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index 080e1fd559..b020ce301b 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -20,7 +20,7 @@ }, "files": ["lib/index.js", "lib/invariant.js", "lib/client.js", "lib/types/**/*.d.ts"], "scripts": { "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index 42be5f5ef2..1644203ecd 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-session": "workspace:^", diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index 2616a0f9b8..ce88a9665b 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index 0a8d06177f..58bd6ee7ef 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index 9db44dff5b..a2b275ed29 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index 75f22345f7..cd48bbae0b 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-session": "workspace:^", diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index 5b42515f05..f824b9b3a8 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-session": "workspace:^", diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index 4c65040655..f42b496e6d 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index 013280a282..1697967808 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^", "zod": "^4.4.3" diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index 29b6c49afc..cdf61ac3a3 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "zod": "^4.4.3" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index 7e76fa403c..c7006a5061 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 85a7cba650..37b5893cce 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.1", "@opentelemetry/api-logs": "^0.220.0", diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index a66d459edd..132545f502 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 77d566e143..c165327beb 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -25,7 +25,7 @@ "./package.json": "./package.json" }, "files": ["lib/index.js", "lib/invariant.js", "lib/types/**/*.d.ts"], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index e1e02f1319..0e53d07e7f 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -25,7 +25,7 @@ "./package.json": "./package.json" }, "files": ["lib/index.js", "lib/invariant.js", "lib/types/**/*.d.ts"], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index e4450f893f..10d63c1d89 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index 38251d295e..8a014863fe 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -39,7 +39,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index b1f7ee6c48..0cdbdbef35 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-atomic-write": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 838f1795cf..4208b479d4 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index db37056045..db1c919311 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index dcc81057e4..ac0c510be3 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-bash-local": "workspace:^", diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index 48deb6f5c0..f6882f5c3e 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index 35ca00e95d..74f1c5b3c1 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index f1c0f493d0..f5ef9d869a 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-shell": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index 77cc920f9b..ab8a31dd7d 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-subprocess": "workspace:^", diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index 0f66e0f6a3..14648a2231 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -29,7 +29,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index 8442431acf..e762320465 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-shell": "workspace:^", diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index 6b8fd62535..195940e82b 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-shell": "workspace:^", diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index efa5bc89cd..d012804e96 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -30,7 +30,7 @@ "assets", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-skill": "workspace:^", diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 75d33ee2c0..954a843c2b 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-fs": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index b75f15d76f..4688a93064 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index fd6474dbc1..19b10f8bb6 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index 73442355de..07c2134591 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-spill": "workspace:^", diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index f945700067..f74a5c4135 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index e056612939..3d0f444b1d 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index 53c445f24f..aa8983a712 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-storage": "workspace:^", diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index efeff3d0a2..5c04e79096 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-storage": "workspace:^", diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index d645336b65..88d5958419 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-storage": "workspace:^", diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index 39be8894fe..f4f39039b0 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index 2bab91c006..72f725f040 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index 90a6d1734b..ec5da9e8ac 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 450fd0319e..269bf2e996 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 64d76226b8..f7eac52a8e 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index a4f5070728..5ccbe0e465 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index 47fa41e924..f3398a76e7 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index 45ae2cbb68..8c2c71c9c9 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-subagent": "workspace:^", diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 1c0d5175cc..87ec069782 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "zod": "^4.4.3" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index e46cd25dce..6be2ae1d26 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index 81db20b020..b3c8083f8c 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index a9443b4340..b1a73d0e8c 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index a45c23b3a2..7581f54183 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -34,7 +34,7 @@ "scripts": { "postinstall": "node scripts/ensure-spawn-helper.mjs" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-subprocess": "workspace:^", diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 31060039ac..5d2d4fa09d 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index 3ffe485d63..cad0c60fba 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index 8feb02e555..f0dc5e84c7 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index 77a719a6c7..6eebf5d33e 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index d8527bec98..a0a3697896 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@agentclientprotocol/sdk": "0.25.1", "@deepseek-ai/dsh-loader-smoke": "workspace:*", diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index b672a5e141..4e0bb8aa9c 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index fc8a15c12d..9a6fb3a7a0 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index a833b1bc75..2555c27275 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 0980ff39a6..3d5d70010b 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-compaction": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index a7d74c3d87..20e6c1a6d8 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "execa": "^10.0.0", "tsx": "^4.22.4" diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index 7ba38ec00d..c14ac4358b 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^", "zod": "^4.4.3" diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index 798280a11c..39136c2877 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.13", "typescript": "^6.0.3" diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index 59b0e64dfb..20a7172175 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index a125e47088..7b5c6b4d91 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index 707020b148..7c34532970 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -51,7 +51,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-typert-protocol": "workspace:^", "zod": "^4.4.3" diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index f0cfaddd82..964fcba265 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index cd1de2a0e9..63a9bd0ac8 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index 1480cdad81..3bd0db8091 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index 5c6c392673..eeea9a70ee 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index 5dcf7c7627..36547ffee9 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index ee603c1c0f..cdd47c905c 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index e447103f62..cbe16cfcaf 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^" diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index b2d5b3449f..ecc7717b2b 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index ed50476aed..0089033964 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-timeout": "workspace:^", diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index 82326a7900..55bd7ecdf2 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-credentials": "workspace:^", diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 4beac7501a..ae0aa563cf 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-launch-environment": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 922da3a951..7f4aa73079 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-launch-environment": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 4bf230b7a4..16db0b092c 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index 081bfae0ed..ca7b5f4889 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index f40b8d25bb..6abde88c22 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index 6c54083821..4f32c42493 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -35,7 +35,7 @@ "lib/worker.cjs", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index e0e5f77e7e..1b689da55a 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-brand": "workspace:^", diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index ef456e859d..abcd7bc903 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -35,7 +35,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-storage-domain": "workspace:^", diff --git a/python/sdk-runtime/pyproject.toml b/python/sdk-runtime/pyproject.toml index 9481d33889..090efc6139 100644 --- a/python/sdk-runtime/pyproject.toml +++ b/python/sdk-runtime/pyproject.toml @@ -8,7 +8,7 @@ version = "0.0.0.dev0" description = "Pinned DeepSeek Harness runtime for the Python SDK" readme = "README.md" requires-python = ">=3.10" -license = "BSD-3-Clause" +license = "MIT" authors = [{ name = "DeepSeek" }] [project.urls] diff --git a/python/sdk/pyproject.toml b/python/sdk/pyproject.toml index 246e44ee26..5e91546e73 100644 --- a/python/sdk/pyproject.toml +++ b/python/sdk/pyproject.toml @@ -8,7 +8,7 @@ version = "0.0.0.dev0" description = "Python SDK for DeepSeek Harness" readme = "README.md" requires-python = ">=3.10" -license = "BSD-3-Clause" +license = "MIT" authors = [{ name = "DeepSeek" }] dependencies = [ "pydantic>=2.12,<3", diff --git a/python/sdk/tests/test_release_version.py b/python/sdk/tests/test_release_version.py index 3bff2df3f9..7ff9b15d59 100644 --- a/python/sdk/tests/test_release_version.py +++ b/python/sdk/tests/test_release_version.py @@ -77,6 +77,7 @@ def test_stage_sdk_keeps_distribution_module_and_runtime_pin_distinct(tmp_path: pyproject = (destination / "pyproject.toml").read_text() assert 'name = "deepseek-harness-sdk"' in pyproject assert 'version = "1.2.3"' in pyproject + assert 'license = "MIT"' in pyproject assert '"deepseek-harness-runtime-bin==1.2.3"' in pyproject assert 'license-files = ["LICENSE"]' in pyproject assert (destination / "LICENSE").read_bytes() == (ROOT / "LICENSE").read_bytes() @@ -103,6 +104,7 @@ def test_stage_runtime_copies_platform_payload( runtime_dir = destination / "src" / "deepseek_harness_runtime" / "runtime" assert {path.name: path.read_bytes() for path in runtime_dir.glob("dsh-jsonrpc-agent-pkg-*")} == expected pyproject = (destination / "pyproject.toml").read_text() + assert 'license = "MIT"' in pyproject assert 'license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md"]' in pyproject assert (destination / "platforms.json").read_bytes() == ( ROOT / "python" / "sdk-runtime" / "platforms.json" diff --git a/scripts/build-python-release.py b/scripts/build-python-release.py index 755dc46c44..18660b3411 100644 --- a/scripts/build-python-release.py +++ b/scripts/build-python-release.py @@ -234,9 +234,9 @@ def verify_wheel( raise RuntimeError( f"{wheel} has distribution name {metadata.get('Name')}, expected {expected_distribution}" ) - if metadata.get("License-Expression") != "BSD-3-Clause": + if metadata.get("License-Expression") != "MIT": raise RuntimeError( - f"{wheel} has license expression {metadata.get('License-Expression')}, expected BSD-3-Clause" + f"{wheel} has license expression {metadata.get('License-Expression')}, expected MIT" ) expected_license_files = ["LICENSE"] if package == "sdk" else ["LICENSE", "THIRD_PARTY_NOTICES.md"] license_files = [Path(name).name for name in metadata.get_all("License-File") or []] diff --git a/scripts/gen-third-party-notices.ts b/scripts/gen-third-party-notices.ts index 613fc6ce85..f2411f5eff 100644 --- a/scripts/gen-third-party-notices.ts +++ b/scripts/gen-third-party-notices.ts @@ -691,7 +691,7 @@ export function render(): string { # Third-Party Notices -DeepSeek Harness is licensed under [BSD 3-Clause](LICENSE). It depends on the third-party software listed below. Each project remains under its own license; nothing in this file changes those terms. +DeepSeek Harness is licensed under [MIT](LICENSE). It depends on the third-party software listed below. Each project remains under its own license; nothing in this file changes those terms. This file lists **direct** dependencies declared by the workspace and the explicitly disclosed official Claude platform payload closure. It is generated from the workspace manifests by \`scripts/gen-third-party-notices.ts\`: a pre-commit hook regenerates it whenever a staged file changes one of its inputs, and \`scripts/gen-third-party-notices.spec.ts\` asserts in the test lane that the committed bytes match. Deleting a manifest runs no hook, so that case is caught by the assertion instead. Run \`pnpm run verify-third-party-notices\` for the standalone check. diff --git a/scripts/run-gates.spec.ts b/scripts/run-gates.spec.ts index d07385b744..f2218ad210 100644 --- a/scripts/run-gates.spec.ts +++ b/scripts/run-gates.spec.ts @@ -83,6 +83,15 @@ describe('gate graph validation', () => { expect(ids).toContain('public-repository-links') }) + it.each(['ci-primary', 'ci-static', 'check-all'] as const)( + 'keeps the DSH package license policy in %s', + (mode) => { + const ids = withPnpmEntrypoint(() => gatesForMode(mode).map(subject => subject.id)) + + expect(ids).toContain('dsh-package-licenses') + }, + ) + it('keeps native Windows coverage blocking while portability inventory remains observational', () => { const gates = withPnpmEntrypoint(() => gatesForMode('ci-windows-complete')) const byId = new Map(gates.map(subject => [subject.id, subject])) diff --git a/scripts/run-gates.ts b/scripts/run-gates.ts index 4290b5a428..e0b07041c0 100644 --- a/scripts/run-gates.ts +++ b/scripts/run-gates.ts @@ -246,6 +246,7 @@ function ciSharedStaticGates(): Gate[] { return [ pnpmScript('runtime-closure', 'verify-runtime-closure', { label: 'runtime closure' }), pnpmScript('constraints', 'constraints'), + pnpmScript('dsh-package-licenses', 'verify-dsh-package-licenses', { label: 'DSH package licenses' }), pnpmScript('package-invariants', 'verify-package-invariants', { label: 'package invariants' }), pnpmScript('cordis-config', 'verify-cordis-config', { label: 'Cordis config' }), pnpmScript('issue-management', 'test:issue-management', { label: 'Issue management policy' }), @@ -557,6 +558,7 @@ function hygieneLeafGates(options: { artifactNeeds?: string[] } = {}): Gate[] { pnpmScript('knip', 'knip'), pnpmScript('publint', 'publint', artifactOptions), pnpmScript('constraints', 'constraints'), + pnpmScript('dsh-package-licenses', 'verify-dsh-package-licenses', { label: 'DSH package licenses' }), pnpmScript('package-invariants', 'verify-package-invariants', { label: 'package invariants' }), builtPackageInvariantsGate(options.artifactNeeds), pnpmScript('node-next-types', 'verify-node-next-types', { diff --git a/scripts/snapshots/translation-prompt-v4/request-response.expected.json b/scripts/snapshots/translation-prompt-v4/request-response.expected.json index 2d874452ae..586d082204 100644 --- a/scripts/snapshots/translation-prompt-v4/request-response.expected.json +++ b/scripts/snapshots/translation-prompt-v4/request-response.expected.json @@ -8,11 +8,11 @@ }, { "role": "user", - "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[BSD 3-Clause](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" + "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[MIT](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" }, { "role": "assistant", - "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[BSD 3-Clause](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" + "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[MIT](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" }, { "role": "user", diff --git a/scripts/verify-dsh-package-licenses.spec.ts b/scripts/verify-dsh-package-licenses.spec.ts new file mode 100644 index 0000000000..d7520ee2e5 --- /dev/null +++ b/scripts/verify-dsh-package-licenses.spec.ts @@ -0,0 +1,59 @@ +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { inspectDshPackageLicenses } from './verify-dsh-package-licenses.ts' + +const roots: string[] = [] + +afterEach(() => { + for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true }) +}) + +function writeManifest(root: string, file: string, manifest: Record): void { + const path = join(root, file) + mkdirSync(dirname(path), { recursive: true }) + writeFileSync(path, `${JSON.stringify(manifest, null, 2)}\n`) +} + +function createWorkspace(): string { + const root = mkdtempSync(join(tmpdir(), 'dsh-package-licenses-')) + roots.push(root) + writeManifest(root, 'package.json', { + name: '@deepseek-ai/dsh-root', + license: 'MIT', + workspaces: ['apps/*', 'packages/*/*', 'vendor/*'], + }) + return root +} + +describe('DSH package license gate', () => { + it('checks root, unhyphenated CLI, and dsh-prefixed package names while ignoring other families', () => { + const root = createWorkspace() + writeManifest(root, 'apps/cli/package.json', { name: '@deepseek-ai/dsh', license: 'MIT' }) + writeManifest(root, 'packages/core/agent/package.json', { + name: '@deepseek-ai/dsh-agent', + license: 'BSD-3-Clause', + }) + writeManifest(root, 'vendor/cordis/package.json', { + name: '@deepseek-ai/cordis', + license: 'BSD-3-Clause', + }) + + expect(inspectDshPackageLicenses(root)).toEqual({ + packageCount: 3, + failures: [ + 'packages/core/agent/package.json: @deepseek-ai/dsh-agent must declare "license": "MIT"; found "BSD-3-Clause".', + ], + }) + }) + + it('rejects a missing license declaration', () => { + const root = createWorkspace() + writeManifest(root, 'packages/core/agent/package.json', { name: '@deepseek-ai/dsh-agent' }) + + expect(inspectDshPackageLicenses(root).failures).toEqual([ + 'packages/core/agent/package.json: @deepseek-ai/dsh-agent must declare "license": "MIT"; found undefined.', + ]) + }) +}) diff --git a/scripts/verify-dsh-package-licenses.ts b/scripts/verify-dsh-package-licenses.ts new file mode 100644 index 0000000000..e4206c30db --- /dev/null +++ b/scripts/verify-dsh-package-licenses.ts @@ -0,0 +1,89 @@ +/** + * Enforce the MIT license declaration for repository-owned DSH npm packages. + * @module scripts/verify-dsh-package-licenses + */ + +import { globSync, readFileSync } from 'node:fs' +import { resolve, sep } from 'node:path' + +const ROOT = resolve(import.meta.dirname, '..') +const DSH_PACKAGE_NAME = /^@deepseek-ai\/dsh(?:-|$)/ + +/** Result of checking every DSH package reachable through the root workspace list. */ +export interface DshPackageLicenseReport { + /** Number of DSH package manifests checked. */ + packageCount: number + /** Repository-relative diagnostics for non-MIT declarations. */ + failures: string[] +} + +function readManifest(root: string, file: string): Record { + const parsed: unknown = JSON.parse(readFileSync(resolve(root, file), 'utf8')) + if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) { + throw new Error(`verify-dsh-package-licenses: ${file} must contain a JSON object.`) + } + return parsed as Record +} + +function isStringArray(value: unknown): value is string[] { + return Array.isArray(value) && value.every((entry: unknown) => typeof entry === 'string') +} + +function workspaceManifestPaths(root: string): string[] { + const rootManifest = readManifest(root, 'package.json') + const workspaces = rootManifest.workspaces + if (!isStringArray(workspaces)) { + throw new Error('verify-dsh-package-licenses: package.json workspaces must be a string array.') + } + + const files = new Set(['package.json']) + for (const pattern of workspaces) { + for (const file of globSync(`${pattern}/package.json`, { cwd: root })) { + files.add(file) + } + } + return [...files].sort() +} + +function printable(value: unknown): string { + return value === undefined ? 'undefined' : JSON.stringify(value) +} + +/** + * Check every DSH npm package declared by the repository workspace. + * @param root - absolute repository root containing the workspace package.json. + * @returns the checked package count and every non-MIT declaration. + */ +export function inspectDshPackageLicenses(root: string): DshPackageLicenseReport { + let packageCount = 0 + const failures: string[] = [] + + for (const file of workspaceManifestPaths(root)) { + const manifest = readManifest(root, file) + const name = manifest.name + if (typeof name !== 'string' || !DSH_PACKAGE_NAME.test(name)) continue + + packageCount++ + if (manifest.license !== 'MIT') { + const normalizedFile = file.split(sep).join('/') + failures.push( + `${normalizedFile}: ${name} must declare "license": "MIT"; found ${printable(manifest.license)}.`, + ) + } + } + + return { packageCount, failures } +} + +if (process.argv[1] && import.meta.filename === resolve(process.argv[1])) { + const report = inspectDshPackageLicenses(ROOT) + if (report.failures.length > 0) { + process.stderr.write('verify-dsh-package-licenses: non-MIT DSH package declarations found:\n') + for (const failure of report.failures) process.stderr.write(` ${failure}\n`) + process.exitCode = 1 + } else { + process.stdout.write( + `verify-dsh-package-licenses: ${String(report.packageCount)} DSH package(s) checked; all declare MIT.\n`, + ) + } +} From a5a83bd1d92159094faa82adc7ceeba444f32e9a Mon Sep 17 00:00:00 2001 From: Yichen Jiang Date: Thu, 13 Aug 2026 13:15:47 +0800 Subject: [PATCH 018/103] fix(llm-pi-ai): withhold OAuth-only providers from the configurable directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pi-ai resolves an OAuth provider from a stored OAuth credential alone, and this adapter builds its Models collection with no credential store and runs no login flow. `openai-codex` — the one installed provider declaring `auth.oauth` with no `auth.apiKey` — was therefore offered on the Models page with the keyless placeholder every pi-ai route carries, and every request on it failed `Provider is not configured` before going out. `catalogProviderTakesApiKey()` answers whether pi-ai's installed provider for a route declares the one method this adapter can supply, and the directory skips the catalog routes that fail it. Catalog membership is unchanged, so `declared` still answers what pi-ai ships; the profile half of the union stays unconditional, so a route a settings document already names keeps its entry and can be edited or deleted. Resolution is untouched: a profile naming `apiKeyEnv` on such a route still builds a working provider. --- ...13-oauth-only-providers-withheld.i18n.yaml | 6 +++ ...026-08-13-oauth-only-providers-withheld.md | 43 +++++++++++++++++++ ...-08-13-oauth-only-providers-withheld.zh.md | 43 +++++++++++++++++++ .../models-settings/empty.expected.md | 1 - .../dismissed.expected.md | 1 - packages/llm/llm-pi-ai/README.i18n.yaml | 4 +- packages/llm/llm-pi-ai/README.md | 2 + packages/llm/llm-pi-ai/README.zh.md | 2 + packages/llm/llm-pi-ai/src/catalog.ts | 20 +++++++++ packages/llm/llm-pi-ai/src/index.ts | 24 ++++++++--- packages/llm/llm-pi-ai/tests/catalog.spec.ts | 35 +++++++++++++++ 11 files changed, 171 insertions(+), 10 deletions(-) create mode 100644 .agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml create mode 100644 .agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md create mode 100644 .agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml new file mode 100644 index 0000000000..f5765160ac --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md +2026-08-13-oauth-only-providers-withheld.md: 8c85c2900fd0af7c97a3ac8f04d3c6a2f469f8b0 +2026-08-13-oauth-only-providers-withheld.zh.md: 8f05d096a5d474407585bcbd84bd47da8a1abb2e diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md new file mode 100644 index 0000000000..8c85c2900f --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md @@ -0,0 +1,43 @@ +# Agent Note: The configurable-provider directory withholds OAuth-only providers + +Status: implemented + +English | [中文](2026-08-13-oauth-only-providers-withheld.zh.md) + +## Problem + +The Models page offered `openai-codex` like any other pi-ai route, with the placeholder every pi-ai provider carries: enter a key, or leave it blank to authenticate from the environment. Configuring it that way and sending a message failed the turn with `Provider is not configured: openai-codex`, reported as the adapter's catch-all `PI_AI_ERROR`. + +The posture the placeholder invited could not work on that route. pi-ai's `resolveProviderAuth` reaches an OAuth provider through one path — a credential already in the collection's `CredentialStore` — and has no ambient fallback for it, while `openai-codex` is the one installed provider declaring `auth.oauth` with no `auth.apiKey` beside it. `PiAiAdapter.current()` constructs its collection with `createModels()` and no options, so the store is pi-ai's default `InMemoryCredentialStore`: empty at every boot, and rebuilt from scratch each time a configuration change produces a new snapshot. No code here runs `Models.login()`, and pi-ai's library half does not read Codex's own `~/.codex/auth.json` either — its OAuth module is a PKCE login flow whose credential the *host* application persists, which is what the pi CLI supplies and this adapter does not. + +So the page advertised, with the keyless posture its own placeholder describes, a provider that has no keyless posture — and the failure named the configuration key rather than the missing capability. The one thing that does authenticate the route is a ChatGPT OAuth token pasted into the key field, which is not what the offer describes and expires with nothing here to refresh it. + +## Decision + +The directory offers only what this adapter can authenticate. `catalogProviderTakesApiKey(provider)` answers whether pi-ai's installed provider for a route declares an api-key method — the one method the harness can feed, since it resolves a key through its own credential seam and hands it over as the request's `apiKey` override — and `directoryEntries()` skips the catalog routes that fail it. + +OAuth support is not attempted. It needs a persistent credential store, a login flow, and a surface to run it from; none of those is a release-blocking fix, and shipping the offer without them is what produced the report. + +Two boundaries keep the withholding narrow: + +- **Catalog membership is unchanged.** `catalogProviderIds()` still answers what pi-ai ships, so the `declared` flag on a directory entry keeps meaning "no installed provider answers for this route" rather than "this route is not offered". +- **The profile half of the union is unconditional.** A route a settings document already names keeps its entry, so a stored `openai-codex` profile stays visible, editable, and deletable instead of being stranded in the document with nothing on the page to remove it. + +Resolution is untouched. A profile naming `apiKeyEnv` on an OAuth-only route still builds a working provider — `routeAuth` adds the harness api-key method beside the catalog's OAuth, and pi-ai's Codex API derives the account id from the token itself — so a deployment that writes one into `settings.yaml` or `cordis.yml` keeps that path. Enforcing the withholding in `resolveProfiles` instead would have refused such a profile at registration, and because `validate` runs at boot as well as at write time, a document already naming a keyless OAuth route would fail the whole namespace's registration rather than one provider. + +## Alternatives considered + +- **Rejecting a keyless OAuth-only route in `resolveProfiles`.** This is where the repo normally enforces a decision, and the directory filter is a surface that a `cordis.yml` entry bypasses. It was refused for the boot behavior above: an existing stored profile would take down every other route in the namespace with it, which for a release trades a one-provider defect for a total one. The gap is that the offer, not the capability, is what got fixed — a deployment can still hand-write the route it can no longer add from the page. +- **Keeping the offer and correcting only the placeholder text.** The field would then have to say the provider needs a login this build cannot run, which is a card whose only honest content is that it does not work. +- **Mapping `Provider is not configured` to a named `LlmError`.** Worth doing, and reachable for reasons this change does not remove — any api-key route left blank whose provider finds nothing in the process environment produces the same message. Deferred as a separate change: it improves a diagnostic rather than removing a broken offer. +- **Reading `~/.codex/auth.json` into a pi-ai `CredentialStore`.** It makes Codex work without a login flow, and pi-ai owns the refresh. It also binds the harness to another tool's private file format for one provider, which is a decision for the OAuth work rather than a release fix. + +## Consequences + +`openai-codex` disappears from the provider picker and from the directory the Models page joins; every other installed provider is unaffected, including the six that offer OAuth *beside* an api-key method (`anthropic`, `github-copilot`, `kimi-coding`, `openrouter`, `radius`, `xai`), which keep their entries and their key path. A future provider that ships OAuth alone is withheld automatically rather than by name. + +Two adjacent gaps remain and are recorded in the package README: a route naming no credential still resolves through the catalog provider's own discovery, which reads process environment variables only — not `~/.aws/credentials`, and not the harness credential seam — and the resulting failure is still the catch-all `PI_AI_ERROR`. + +## Testing + +Package tests pin both halves of the union: the withheld route is absent from `listConfigurableProviders()` while `anthropic` and `openai` stay, and a stored `openai-codex` profile still produces a full entry with `declared: false`. The existing resolution tests are unchanged and still pass, which is what shows the withholding did not narrow what a hand-written profile can serve. The `models-settings` and `onboarding-usable-provider` web e2e goldens lost exactly the `openai-codex` option line, recorded against the real assembled application. diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md new file mode 100644 index 0000000000..8f05d096a5 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md @@ -0,0 +1,43 @@ +# Agent Note:可配置提供方目录不再提供仅以 OAuth 认证的提供方 + +Status: implemented + +[English](2026-08-13-oauth-only-providers-withheld.md) | 中文 + +## 问题 + +模型设置页把 `openai-codex` 当作普通 pi-ai 路由提供出来,配的还是每个 pi-ai 提供方共用的那句占位文案:填入 API 密钥,或留空使用环境认证。照此配置后发送消息,本轮以 `Provider is not configured: openai-codex` 失败,并被适配器归入兜底的 `PI_AI_ERROR`。 + +占位文案所邀请的那种配置姿态在这条路由上不可能工作。pi-ai 的 `resolveProviderAuth` 抵达 OAuth 提供方只有一条路径——集合的 `CredentialStore` 里已经存着的凭据——对它没有任何 ambient 回退;而 `openai-codex` 正是已安装 catalog 中唯一只声明 `auth.oauth`、没有 `auth.apiKey` 的提供方。`PiAiAdapter.current()` 以不带参数的 `createModels()` 构造集合,于是用的是 pi-ai 默认的 `InMemoryCredentialStore`:每次启动都是空的,每次配置变更产生新快照时又重建一份。本仓库没有任何位置调用 `Models.login()`;pi-ai 库这一半也不会去读 Codex 自己的 `~/.codex/auth.json`——它的 OAuth 模块是一套 PKCE 登录流程,凭据由*宿主*应用持久化,这正是 pi CLI 提供、而本适配器没有提供的东西。 + +于是页面用自己占位文案所描述的「留空」姿态,提供了一个根本没有「留空」姿态的提供方——而失败信息指向的是配置键,不是缺失的能力。唯一能让这条路由完成认证的,是把一个 ChatGPT OAuth token 粘进密钥框,那既不是这个提供所描述的用法,也会过期且这里没有任何环节会去刷新它。 + +## 决策 + +目录只提供本适配器认得的东西。`catalogProviderTakesApiKey(provider)` 回答 pi-ai 为某路由安装的提供方是否声明了 api-key 方法——这是 harness 唯一能供给的方法,因为它通过自己的凭据 seam 解析密钥,再作为请求的 `apiKey` 覆盖交给 pi-ai——`directoryEntries()` 跳过不满足它的 catalog 路由。 + +不尝试实现 OAuth。它需要持久化凭据存储、登录流程,以及运行登录的界面;这三样都不是发布阻塞项的修复,而在它们缺席时仍把提供方摆出来,正是这次报告的成因。 + +两条边界把「不提供」的范围收窄: + +- **catalog 成员身份不变。** `catalogProviderIds()` 仍回答 pi-ai 装了什么,因此目录条目上的 `declared` 标记仍然表示「没有已安装提供方对应这条路由」,而不是「这条路由不被提供」。 +- **联合的 profile 那一半无条件保留。** settings 文档已经写过的路由保留条目,因此已存储的 `openai-codex` profile 仍然可见、可编辑、可删除,而不会滞留在文档里、页面上却没有任何入口能移除它。 + +resolution 未被触动。在仅 OAuth 的路由上指定 `apiKeyEnv` 的 profile 仍会构造出可用的提供方——`routeAuth` 会在 catalog 的 OAuth 旁边补上 harness 的 api-key 方法,而 pi-ai 的 Codex API 从 token 本身推导 account id——因此把它写进 `settings.yaml` 或 `cordis.yml` 的部署保留这条路径。改为在 `resolveProfiles` 里强制拒绝会在注册时就否掉这类 profile;又因为 `validate` 在启动时与写入时同样运行,一份已经写有无密钥 OAuth 路由的文档会让整个 namespace 注册失败,而不只是一个提供方失败。 + +## 备选方案 + +- **在 `resolveProfiles` 里拒绝无密钥的仅 OAuth 路由。** 这才是本仓库通常强制决策的位置,而目录过滤是一层 `cordis.yml` entry 可以绕过的表面。因上述启动行为被否决:已存储的 profile 会连带拖垮该 namespace 中其他所有路由,对一次发布而言,这是拿一个提供方的缺陷换取全体的缺陷。留下的缺口是:被修的是「提供」而不是「能力」——部署仍可手写一条页面上已经无法添加的路由。 +- **保留提供,只修正占位文案。** 那么该输入框只能写「此提供方需要本构建无法运行的登录」,等于一张唯一诚实内容就是「它不能用」的卡片。 +- **把 `Provider is not configured` 映射成具名 `LlmError`。** 值得做,而且触发原因本次改动并未消除——任何留空密钥、其提供方又在进程环境里找不到东西的 api-key 路由,都会产生同一句话。作为独立改动暂缓:它改进的是诊断,而不是移除一个坏掉的提供。 +- **把 `~/.codex/auth.json` 读进 pi-ai 的 `CredentialStore`。** 这能让 Codex 在没有登录流程的情况下可用,刷新也由 pi-ai 负责。但它为一个提供方把 harness 绑定到另一个工具的私有文件格式上,这属于 OAuth 那项工作的决策,而不是发布期的修复。 + +## 影响 + +`openai-codex` 从提供方选择器、以及模型设置页所 join 的目录中消失;其余已安装提供方一概不受影响,包括在 api-key 方法*之外*另提供 OAuth 的那六个(`anthropic`、`github-copilot`、`kimi-coding`、`openrouter`、`radius`、`xai`),它们保留条目也保留密钥路径。将来若出现只带 OAuth 的提供方,会被自动排除,而不是靠列名。 + +两处相邻缺口仍在,并记录在包 README 中:不指定凭据的路由仍走 catalog 提供方自带的发现,而它只读进程环境变量——不读 `~/.aws/credentials`,也不读 harness 凭据 seam——且由此产生的失败仍是兜底的 `PI_AI_ERROR`。 + +## 测试 + +包测试钉住联合的两半:不予提供的路由不出现在 `listConfigurableProviders()` 中,而 `anthropic` 与 `openai` 仍在;已存储的 `openai-codex` profile 仍产出完整条目且 `declared: false`。既有的 resolution 测试未改动且依然通过,这正是「不提供」没有收窄手写 profile 可服务范围的证据。`models-settings` 与 `onboarding-usable-provider` 两条 web e2e golden 恰好各少了 `openai-codex` 这一行选项,录自真实装配的应用。 diff --git a/apps/web/tests/snapshots/models-settings/empty.expected.md b/apps/web/tests/snapshots/models-settings/empty.expected.md index cea14113ac..2c928e2f0d 100644 --- a/apps/web/tests/snapshots/models-settings/empty.expected.md +++ b/apps/web/tests/snapshots/models-settings/empty.expected.md @@ -44,7 +44,6 @@ - option "moonshotai-cn" - option "nvidia" - option "openai" - - option "openai-codex" - option "opencode" - option "opencode-go" - option "openrouter" diff --git a/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md b/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md index 84c7358b54..809e7880ff 100644 --- a/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md +++ b/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md @@ -48,7 +48,6 @@ - option "moonshotai-cn" - option "nvidia" - option "openai" - - option "openai-codex" - option "opencode" - option "opencode-go" - option "openrouter" diff --git a/packages/llm/llm-pi-ai/README.i18n.yaml b/packages/llm/llm-pi-ai/README.i18n.yaml index cf879dc6be..31e6ac3b8a 100644 --- a/packages/llm/llm-pi-ai/README.i18n.yaml +++ b/packages/llm/llm-pi-ai/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/llm/llm-pi-ai/README.md -README.md: e6d04133f3dfa4eb4cd9aa997ad1f9bb93fa50a0 -README.zh.md: e33bcac7081006573f5c6a8a8a3221fa57839c4f +README.md: 6120f8d982c6d475cd508e6cf9e41cabfc9ba159 +README.zh.md: 4b47976c6c6c67968b5b93edbdfd5dfa9530eb1d diff --git a/packages/llm/llm-pi-ai/README.md b/packages/llm/llm-pi-ai/README.md index e6d04133f3..6120f8d982 100644 --- a/packages/llm/llm-pi-ai/README.md +++ b/packages/llm/llm-pi-ai/README.md @@ -189,6 +189,8 @@ Recorded response content appends to the next request and does not invalidate it ## Known Limitations and Deferred Work +- **A provider that authenticates through OAuth alone is not offered** — pi-ai resolves OAuth from a *stored* OAuth credential, and this adapter builds its `Models` collection with no credential store and runs no login flow, so every request on such a route fails `Provider is not configured` before it goes out. The configurable-provider directory withholds them; `openai-codex` is the only one the installed catalog ships. A route a settings document already names keeps its entry so a configuration surface can edit or delete it, and `apiKeyEnv` still authenticates it with that key — which for Codex is a token that expires with nothing here to refresh it. +- **Provider-native discovery reads the process environment only** — a route naming no credential defers to the catalog provider's own resolution, which interrogates environment variables (`AZURE_OPENAI_API_KEY`, `AWS_PROFILE`, `AWS_ACCESS_KEY_ID`, and each provider's own set). It reads no local credential directory, so `~/.aws/credentials` without an exported `AWS_PROFILE` resolves as unconfigured, and a value held by the harness credential seam is invisible to it unless the process environment carries it too. - **Settings can add or override routes, not remove composition routes** — the user layer merges over the composition `base`, so deleting a `cordis.yml`-provided provider is a composition change; `replace` on the namespace only resets the user layer. - **The layered merge has no delete for dict keys** — the settings seam merges the composition `base` and the user layer per key, recursively, so a `reasoningEfforts` level, `modelOverrides` entry, or `compat` field the base declares cannot be removed by the user layer, only overridden — and for `reasoningEfforts` absence *is* the meaning ("not offered"), so a base-declared level stays offered. This only triggers when a `cordis.yml` entry config declares per-model reasoning fields for the same model the user layer edits; the supported posture is to leave those to the settings document (the shipped composition mounts the adapter dormant), and a `models` list is an array replacing wholesale, which is the in-band escape. - **`headers` can carry a credential the redactor never sees** — the profile's `headers` dict is plain strings, so `Authorization` or `api-key` set there is returned verbatim by a redacted `describe()` and rendered by any configuration UI. Store credentials as `apiKeyEnv` references; making the dict write-only is deferred with the rest of the [wire-boundary work](../llm/README.md#known-limitations-and-deferred-work). diff --git a/packages/llm/llm-pi-ai/README.zh.md b/packages/llm/llm-pi-ai/README.zh.md index e33bcac708..4b47976c6c 100644 --- a/packages/llm/llm-pi-ai/README.zh.md +++ b/packages/llm/llm-pi-ai/README.zh.md @@ -190,6 +190,8 @@ pi-ai 事件会变为 harness 推理、文本、工具调用、usage 与 finish ## 已知限制与暂缓事项 +- **仅以 OAuth 认证的提供方不予提供**:pi-ai 的 OAuth 只从*已存储*的 OAuth 凭据解析,而本适配器构造 `Models` 集合时不注入凭据存储、也不运行登录流程,因此这类路由的每个请求都会在发出之前以 `Provider is not configured` 失败。可配置提供方目录因此不列出它们;已安装 catalog 中只有 `openai-codex` 属于此类。settings 文档已经写过的路由仍保留目录条目,配置界面据此可以编辑或删除;`apiKeyEnv` 也仍能用该密钥完成认证——对 Codex 而言那是一个会过期、且这里没有任何环节会去刷新的 token。 +- **提供方自带的凭据发现只读进程环境**:不指定凭据的路由交由 catalog 提供方自行解析,而它探测的是环境变量(`AZURE_OPENAI_API_KEY`、`AWS_PROFILE`、`AWS_ACCESS_KEY_ID` 以及各提供方自己的那一组)。它不读任何本地凭据目录,因此只有 `~/.aws/credentials` 而未导出 `AWS_PROFILE` 会被解析为未配置;由 harness 凭据 seam 保管的值,除非进程环境里也有,否则对它不可见。 - **settings 能新增或覆盖路由,但不能移除组合路由**:用户层合并在组合 `base` 之上,因此删除 `cordis.yml` 提供的提供方属于组合变更;对该 namespace 执行 `replace` 只会重置用户层。 - **分层合并对字典键没有删除语义**:settings seam 把组合 `base` 与用户层按键递归合并,因此 base 声明的某个 `reasoningEfforts` 档位、`modelOverrides` 条目或 `compat` 字段,用户层只能覆盖、无法移除——而 `reasoningEfforts` 里缺席本身*就是*语义(「不提供」),于是 base 声明过的档位会一直被提供。只有 `cordis.yml` entry config 为用户层正在编辑的同一模型声明了按模型推理字段才会触发;受支持的姿态是把这些字段留给 settings 文档(shipped 组合以 dormant 方式挂载该适配器),且 `models` 列表是数组、整体替换,这是带内的解决办法。 - **`headers` 可能承载一条脱敏器看不见的凭据**:profile 的 `headers` 是纯字符串字典,因此设在其中的 `Authorization` 或 `api-key` 会被脱敏后的 `describe()` 原样返回,并被任何配置 UI 渲染出来。请把凭据存为 `apiKeyEnv` 引用;把该字典整体改为只写与其余[协议边界工作](../llm/README.md#known-limitations-and-deferred-work)一并暂缓。 diff --git a/packages/llm/llm-pi-ai/src/catalog.ts b/packages/llm/llm-pi-ai/src/catalog.ts index 2cc2debafc..7a4ff7e8a2 100644 --- a/packages/llm/llm-pi-ai/src/catalog.ts +++ b/packages/llm/llm-pi-ai/src/catalog.ts @@ -141,6 +141,26 @@ export function catalogProviderIds(): readonly string[] { return getBuiltinProviders() } +/** + * Whether the installed catalog provider for one route declares an api-key + * method — the only authentication this adapter obtains on its own. + * + * A key is what the harness resolves through its own credential seam and hands + * pi-ai per request. pi-ai's other method, OAuth, resolves from a *stored* + * OAuth credential alone: `resolveProviderAuth` has no ambient path for it, + * this adapter builds its `Models` collection with no credential store, and + * nothing here runs a login flow. So a provider offering OAuth by itself + * leaves nothing for this adapter to authenticate with, and the posture such a + * provider invites — no key configured, credentials discovered by the provider + * — fails every request with `Provider is not configured`. + * @param provider - provider route key. + * @returns whether the catalog provider takes an api key; false for a route + * pi-ai does not ship, which the caller answers for separately. + */ +export function catalogProviderTakesApiKey(provider: string): boolean { + return catalogProvider(provider)?.auth.apiKey !== undefined +} + /** * The installed catalog models for one route, indexed by model id. * @param provider - provider route key. diff --git a/packages/llm/llm-pi-ai/src/index.ts b/packages/llm/llm-pi-ai/src/index.ts index df1e3a2936..2e550771fc 100644 --- a/packages/llm/llm-pi-ai/src/index.ts +++ b/packages/llm/llm-pi-ai/src/index.ts @@ -61,7 +61,7 @@ import { assertUsableApiKey, LlmError } from '@deepseek-ai/dsh-llm' import type { AdapterRegistrationHandle, DirectoryRegistrationHandle, LlmConfigurableProvider } from '@deepseek-ai/dsh-llm' import { deepEqualJson, installSettingsSection, settingsNamespace } from '@deepseek-ai/dsh-settings' import { PiAiAdapter } from './adapter.ts' -import { catalogProviderIds } from './catalog.ts' +import { catalogProviderIds, catalogProviderTakesApiKey } from './catalog.ts' import { assertServiceable, Config, resolveProfiles } from './config.ts' import type { ResolvedPiAiProviderProfile } from './config.ts' import { discoverModels } from './discovery.ts' @@ -105,10 +105,15 @@ function registrationFacts(profiles: ReadonlyMap { await ctx.settings.replace(settingsNamespace('llm-pi-ai'), {}) expect(ctx.llm.listConfigurableProviders()).toHaveLength(catalogOnly) }) + + it('withholds a catalog route this adapter cannot authenticate', async () => { + const ctx = await harness({}) + const offered = ctx.llm.listConfigurableProviders().map(entry => entry.provider) + + // `openai-codex` is the one installed provider that authenticates through + // OAuth alone. pi-ai resolves OAuth only from a *stored* credential, this + // adapter constructs its collection with no credential store, and nothing + // here runs a login flow — so every request on such a route fails with + // `Provider is not configured` before it goes out. Offering it would put a + // provider on the settings page that no amount of configuration can make + // work. + expect(offered).not.toContain('openai-codex') + // A provider that offers OAuth *beside* an api-key method keeps its entry: + // the key is a path this adapter can serve. + expect(offered).toContain('anthropic') + expect(offered).toContain('openai') + }) + + it('still lists a withheld route a stored profile names, as a catalog route', async () => { + // Withholding the offer must not strand a profile someone already stored: + // the route keeps its entry so a configuration surface can edit or delete + // it, and `declared` still answers catalog membership rather than the + // offer, so the page does not mislabel it as a route this deployment + // invented. + const ctx = await harness({ providers: { 'openai-codex': { apiKeyEnv: KEY_ENV } } }) + + expect(ctx.llm.listConfigurableProviders()).toContainEqual({ + provider: 'openai-codex', + displayName: 'openai-codex', + settingsNs: 'llm-pi-ai', + settingsPath: ['providers', 'openai-codex'], + declared: false, + }) + }) }) From 1540e76598f8365f64ccdcb200f7f9fb6ac50591 Mon Sep 17 00:00:00 2001 From: Turtle Date: Thu, 13 Aug 2026 11:55:38 +0800 Subject: [PATCH 019/103] docs: capitalize Service Provider across repository --- .../2026-06-13-capability-seams.i18n.yaml | 4 ++-- .../2026-06-13-capability-seams.md | 14 ++++++++------ .../2026-06-13-capability-seams.zh.md | 18 ++++++++++-------- ...-06-17-filesystem-capability-seam.i18n.yaml | 4 ++-- .../2026-06-17-filesystem-capability-seam.md | 4 ++-- ...2026-06-17-filesystem-capability-seam.zh.md | 4 ++-- ...lifecycle-and-ownership-contracts.i18n.yaml | 4 ++-- ...-agent-lifecycle-and-ownership-contracts.md | 2 +- ...ent-lifecycle-and-ownership-contracts.zh.md | 2 +- .../2026-06-20-branded-ids.i18n.yaml | 4 ++-- .../architecture/2026-06-20-branded-ids.md | 4 ++-- .../architecture/2026-06-20-branded-ids.zh.md | 4 ++-- ...generic-long-running-tool-runtime.i18n.yaml | 2 +- ...-20-generic-long-running-tool-runtime.zh.md | 6 +++--- .../2026-06-24-web-capability-seam.i18n.yaml | 4 ++-- .../2026-06-24-web-capability-seam.md | 2 +- .../2026-06-24-web-capability-seam.zh.md | 2 +- .../2026-07-26-job-registry-seam.i18n.yaml | 4 ++-- .../2026-07-26-job-registry-seam.md | 12 ++++++------ .../2026-07-26-job-registry-seam.zh.md | 16 ++++++++-------- .../2026-07-26-subprocess-seam.i18n.yaml | 4 ++-- .../architecture/2026-07-26-subprocess-seam.md | 2 +- .../2026-07-26-subprocess-seam.zh.md | 2 +- ...-07-27-dispose-ladder-to-consumer.i18n.yaml | 4 ++-- .../2026-07-27-dispose-ladder-to-consumer.md | 4 ++-- ...2026-07-27-dispose-ladder-to-consumer.zh.md | 4 ++-- ...-runtime-portable-identifier-seam.i18n.yaml | 4 ++-- ...31-code-runtime-portable-identifier-seam.md | 8 ++++---- ...code-runtime-portable-identifier-seam.zh.md | 8 ++++---- ...-bounded-background-job-admission.i18n.yaml | 2 +- ...8-11-bounded-background-job-admission.zh.md | 4 ++-- .../feature/2026-06-15-code-mode.i18n.yaml | 4 ++-- .../feature/2026-06-15-code-mode.md | 2 +- .../feature/2026-06-15-code-mode.zh.md | 2 +- ...-06-18-compaction-capability-seam.i18n.yaml | 4 ++-- .../2026-06-18-compaction-capability-seam.md | 2 +- ...2026-06-18-compaction-capability-seam.zh.md | 2 +- ...26-06-21-subagent-capability-seam.i18n.yaml | 4 ++-- .../2026-06-21-subagent-capability-seam.md | 2 +- .../2026-06-21-subagent-capability-seam.zh.md | 2 +- .../2026-07-05-dynamic-workflows.i18n.yaml | 4 ++-- .../feature/2026-07-05-dynamic-workflows.md | 2 +- .../feature/2026-07-05-dynamic-workflows.zh.md | 2 +- .../feature/2026-07-06-approval-seam.i18n.yaml | 4 ++-- .../feature/2026-07-06-approval-seam.md | 2 +- .../feature/2026-07-06-approval-seam.zh.md | 2 +- .../feature/2026-07-06-sandbox.i18n.yaml | 4 ++-- .../implemented/feature/2026-07-06-sandbox.md | 4 ++-- .../feature/2026-07-06-sandbox.zh.md | 4 ++-- ...ript-sdk-and-sdk-subagent-backend.i18n.yaml | 4 ++-- ...-typescript-sdk-and-sdk-subagent-backend.md | 4 ++-- ...pescript-sdk-and-sdk-subagent-backend.zh.md | 4 ++-- .../2026-07-02-tool-schema-catalog.i18n.yaml | 4 ++-- .../process/2026-07-02-tool-schema-catalog.md | 2 +- .../2026-07-02-tool-schema-catalog.zh.md | 2 +- .../2026-06-26-fsspec-style-fs-seam.i18n.yaml | 4 ++-- .../2026-06-26-fsspec-style-fs-seam.md | 2 +- .../2026-06-26-fsspec-style-fs-seam.zh.md | 2 +- ...ion-through-tool-capability-seams.i18n.yaml | 4 ++-- ...ncellation-through-tool-capability-seams.md | 2 +- ...llation-through-tool-capability-seams.zh.md | 2 +- AGENTS.md | 2 +- docs/architecture.i18n.yaml | 4 ++-- docs/architecture.md | 2 +- docs/architecture.zh.md | 2 +- docs/cookbook/adding-a-package.i18n.yaml | 4 ++-- docs/cookbook/adding-a-package.md | 2 +- docs/cookbook/adding-a-package.zh.md | 2 +- docs/glossary.i18n.yaml | 4 ++-- docs/glossary.md | 2 +- docs/glossary.zh.md | 2 +- docs/i18n/terminology.md | 5 +++-- docs/subsystems/code-runtime.i18n.yaml | 4 ++-- docs/subsystems/code-runtime.md | 2 +- docs/subsystems/code-runtime.zh.md | 2 +- docs/subsystems/compaction.i18n.yaml | 4 ++-- docs/subsystems/compaction.md | 2 +- docs/subsystems/compaction.zh.md | 2 +- docs/subsystems/jobs.i18n.yaml | 4 ++-- docs/subsystems/jobs.md | 2 +- docs/subsystems/jobs.zh.md | 2 +- docs/subsystems/lsp.i18n.yaml | 4 ++-- docs/subsystems/lsp.md | 2 +- docs/subsystems/lsp.zh.md | 2 +- docs/subsystems/session-telemetry.i18n.yaml | 4 ++-- docs/subsystems/session-telemetry.md | 2 +- docs/subsystems/session-telemetry.zh.md | 2 +- docs/subsystems/shell.i18n.yaml | 4 ++-- docs/subsystems/shell.md | 2 +- docs/subsystems/shell.zh.md | 2 +- docs/subsystems/skills.i18n.yaml | 4 ++-- docs/subsystems/skills.md | 2 +- docs/subsystems/skills.zh.md | 2 +- docs/subsystems/spill.i18n.yaml | 4 ++-- docs/subsystems/spill.md | 2 +- docs/subsystems/spill.zh.md | 2 +- docs/subsystems/storage.i18n.yaml | 4 ++-- docs/subsystems/storage.md | 2 +- docs/subsystems/storage.zh.md | 2 +- docs/subsystems/subagent.i18n.yaml | 4 ++-- docs/subsystems/subagent.md | 2 +- docs/subsystems/subagent.zh.md | 2 +- docs/subsystems/subprocess.i18n.yaml | 4 ++-- docs/subsystems/subprocess.md | 2 +- docs/subsystems/subprocess.zh.md | 2 +- docs/subsystems/web.i18n.yaml | 4 ++-- docs/subsystems/web.md | 2 +- docs/subsystems/web.zh.md | 2 +- docs/subsystems/workflow.i18n.yaml | 4 ++-- docs/subsystems/workflow.md | 2 +- docs/subsystems/workflow.zh.md | 2 +- docs/user/develop/basic/tool.i18n.yaml | 4 ++-- docs/user/develop/basic/tool.md | 2 +- docs/user/develop/basic/tool.zh.md | 2 +- docs/user/develop/practice/index.i18n.yaml | 4 ++-- docs/user/develop/practice/index.md | 14 +++++++------- docs/user/develop/practice/index.zh.md | 14 +++++++------- packages/README.i18n.yaml | 4 ++-- packages/README.md | 2 +- packages/README.zh.md | 2 +- packages/boot/app-boot/src/profile.ts | 2 +- .../compaction-basic/README.i18n.yaml | 4 ++-- packages/compaction/compaction-basic/README.md | 2 +- .../compaction/compaction-basic/README.zh.md | 2 +- .../compaction/compaction/README.i18n.yaml | 4 ++-- packages/compaction/compaction/README.md | 2 +- packages/compaction/compaction/README.zh.md | 2 +- packages/core/tools/tests/code-mode.spec.ts | 2 +- packages/e2b/subprocess-e2b/src/index.ts | 2 +- .../examples/agent-spine-demo/README.i18n.yaml | 4 ++-- packages/examples/agent-spine-demo/README.md | 2 +- .../examples/agent-spine-demo/README.zh.md | 4 ++-- .../user-questions/README.i18n.yaml | 4 ++-- packages/interaction/user-questions/README.md | 2 +- .../interaction/user-questions/README.zh.md | 2 +- packages/jobs/jobs/README.i18n.yaml | 2 +- packages/jobs/jobs/README.zh.md | 2 +- packages/lsp/lsp-stdio/src/connection.ts | 2 +- packages/lsp/lsp/README.i18n.yaml | 4 ++-- packages/lsp/lsp/README.md | 2 +- packages/lsp/lsp/README.zh.md | 2 +- packages/sandbox/sandbox/README.i18n.yaml | 4 ++-- packages/sandbox/sandbox/README.md | 2 +- packages/sandbox/sandbox/README.zh.md | 2 +- .../session-persistence/README.i18n.yaml | 4 ++-- packages/session/session-persistence/README.md | 2 +- .../session/session-persistence/README.zh.md | 2 +- .../session-telemetry-otel/src/index.ts | 2 +- .../session-title/tests/provider.spec.ts | 2 +- .../tests/service-contracts.spec.ts | 2 +- packages/shell/README.i18n.yaml | 4 ++-- packages/shell/README.md | 2 +- packages/shell/README.zh.md | 2 +- packages/shell/bash-local/README.i18n.yaml | 4 ++-- packages/shell/bash-local/README.md | 2 +- packages/shell/bash-local/README.zh.md | 2 +- packages/shell/bash-local/src/index.ts | 2 +- packages/shell/bash-sandbox/README.i18n.yaml | 4 ++-- packages/shell/bash-sandbox/README.md | 2 +- packages/shell/bash-sandbox/README.zh.md | 2 +- packages/shell/pwsh-local/README.i18n.yaml | 4 ++-- packages/shell/pwsh-local/README.md | 2 +- packages/shell/pwsh-local/README.zh.md | 2 +- packages/shell/pwsh-local/src/index.ts | 2 +- packages/shell/shell/README.i18n.yaml | 4 ++-- packages/shell/shell/README.md | 4 ++-- packages/shell/shell/README.zh.md | 4 ++-- packages/shell/tool-bash/README.i18n.yaml | 4 ++-- packages/shell/tool-bash/README.md | 2 +- packages/shell/tool-bash/README.zh.md | 2 +- packages/spill/spill/README.i18n.yaml | 4 ++-- packages/spill/spill/README.md | 2 +- packages/spill/spill/README.zh.md | 2 +- packages/subagent/subagent/README.i18n.yaml | 4 ++-- packages/subagent/subagent/README.md | 2 +- packages/subagent/subagent/README.zh.md | 2 +- packages/subagent/subagent/src/index.ts | 2 +- packages/subprocess/README.i18n.yaml | 4 ++-- packages/subprocess/README.md | 2 +- packages/subprocess/README.zh.md | 2 +- .../subprocess-local/README.i18n.yaml | 4 ++-- packages/subprocess/subprocess-local/README.md | 2 +- .../subprocess/subprocess-local/README.zh.md | 2 +- .../subprocess/subprocess-local/src/index.ts | 2 +- .../subprocess/subprocess/src/invariant.ts | 2 +- packages/workflow/workflow/src/index.ts | 2 +- .../request-response.expected.json | 2 +- 187 files changed, 306 insertions(+), 301 deletions(-) diff --git a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml index f07afccac7..106164a71c 100644 --- a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-13-capability-seams.md -2026-06-13-capability-seams.md: efb000631c6dfe91ab648b102a14a27c30d790b4 -2026-06-13-capability-seams.zh.md: bf6571dfa5c3a90f856480bc22c6560ed65b3e77 +2026-06-13-capability-seams.md: 2a166278ea454895177fa12b58f5493276f19cd1 +2026-06-13-capability-seams.zh.md: 0874af5826960ab9e718eb07b00c12b446edfd78 diff --git a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md index efb000631c..2a166278ea 100644 --- a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md +++ b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md @@ -1,4 +1,4 @@ -# Agent Note: Capability seams — Service Definition / Service provider / Consumer roles +# Agent Note: Capability seams — Service Definition / Service Provider / Consumer roles Status: implemented @@ -15,16 +15,18 @@ This is distinct from "who provides vs. needs a capability at runtime", which Co A swappable capability has **three roles**: 1. **Service Definition** — the Cordis `Service` and vocabulary types owning `ctx.` and depending only on the vocabulary the contract needs (e.g. `dsh-shell`: `ShellExecutor`, `ShellRunResult`, `ShellProcess`). A definition may be an abstract class or a concrete registry service; it is never a TypeScript `interface`. -2. **Service provider** — a plugin that supplies or registers an implementation (e.g. `dsh-bash-local`: subprocesses, process-group kills, spill-file truncation). Sandboxed and remote providers are sibling packages implementing or registering against the same Service Definition. +2. **Service Provider** — a plugin that supplies or registers an implementation (e.g. `dsh-bash-local`: subprocesses, process-group kills, spill-file truncation). Sandboxed and remote providers are sibling packages implementing or registering against the same Service Definition. 3. **Consumer** — what the model and plugins program against (e.g. `dsh-tool-bash`: the `bash` schema, with background handles registered into the generic job runtime). Consumers inject the service key and never import provider-specific types. -Service providers and Consumers then evolve independently: a sandboxed executor replaces `dsh-bash-local` without touching a tool schema. +The role names use title case: **Service Definition**, **Service Provider**, and **Consumer**. Generic uses of `provider` and `consumer` remain lowercase. -Roles normally use separate packages when they evolve independently, but the split is not mandatory when the roles are genuinely one concern: the LLM seam folds Service Definition and Consumer into `dsh-llm` (the Consumer is the loop itself, not a swappable schema surface) with adapters as Service provider packages. Don't split preemptively — a capability with one conceivable provider and one Consumer stays one package until a second appears. +Service Providers and Consumers then evolve independently: a sandboxed executor replaces `dsh-bash-local` without touching a tool schema. + +Roles normally use separate packages when they evolve independently, but the split is not mandatory when the roles are genuinely one concern: the LLM seam folds Service Definition and Consumer into `dsh-llm` (the Consumer is the loop itself, not a swappable schema surface) with adapters as Service Provider packages. Don't split preemptively — a capability with one conceivable provider and one Consumer stays one package until a second appears. ## Terminology: "seam" names the trio, not the interface -A **seam** is the whole capability — the three roles together: a **Service Definition** (the Cordis `Service` that owns `ctx.` and the vocabulary), one or more **Service providers**, and one or more **Consumers**. `packages/shell` is the canonical example — `dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`. A package may own multiple roles, but one role alone is not the seam. The term "seam" is reserved for this complete capability; name a constituent by its role, class, service, contract, or extension point. The [glossary](../../../../docs/glossary.md#capability-seam) is the canonical entry. +A **seam** is the whole capability — the three roles together: a **Service Definition** (the Cordis `Service` that owns `ctx.` and the vocabulary), one or more **Service Providers**, and one or more **Consumers**. `packages/shell` is the canonical example — `dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`. A package may own multiple roles, but one role alone is not the seam. The term "seam" is reserved for this complete capability; name a constituent by its role, class, service, contract, or extension point. The [glossary](../../../../docs/glossary.md#capability-seam) is the canonical entry. ## Alternatives considered @@ -33,4 +35,4 @@ A **seam** is the whole capability — the three roles together: a **Service Def ## Consequences -Separating roles adds packages and boilerplate (`package.json`, `tsconfig`, README, and injection wiring). In return, Service providers and Consumers ship and version independently, and a new backend never risks the model-facing contract. [AGENTS.md](../../../../AGENTS.md) and [architecture.md](../../../../docs/architecture.md) carry the rule; the bash trio is the reference template. This Agent Note records why independently changing roles normally split while genuinely shared concerns may remain folded. +Separating roles adds packages and boilerplate (`package.json`, `tsconfig`, README, and injection wiring). In return, Service Providers and Consumers ship and version independently, and a new backend never risks the model-facing contract. [AGENTS.md](../../../../AGENTS.md) and [architecture.md](../../../../docs/architecture.md) carry the rule; the bash trio is the reference template. This Agent Note records why independently changing roles normally split while genuinely shared concerns may remain folded. diff --git a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md index bf6571dfa5..0874af5826 100644 --- a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md @@ -1,4 +1,4 @@ -# Agent Note: 能力 seam——Service Definition / Service provider / Consumer 角色 +# Agent Note: 能力 seam——Service Definition / Service Provider / Consumer 角色 Status: implemented @@ -15,22 +15,24 @@ harness 具有可替换的能力:当前是 bash 执行,未来会有沙箱化 一项可替换的能力包含**三个角色**: 1. **Service Definition**——拥有 `ctx.` 的 Cordis `Service` 和词汇类型,仅依赖约定所需的词汇(例如 `dsh-shell`:`ShellExecutor`、`ShellRunResult`、`ShellProcess`)。Service Definition 可以是抽象类,也可以是具体的注册表服务;绝不是 TypeScript `interface`。 -2. **Service provider**——提供或注册实现的插件(例如 `dsh-bash-local`:子进程、进程组 kill、spill 文件截断)。沙箱化和远程 Service provider 是依据同一 Service Definition 实现或注册的兄弟包。 -3. **Consumer**——模型和插件编程所面向的内容(例如 `dsh-tool-bash`:`bash` schema,后台句柄注册到通用任务运行时)。Consumer 注入服务键,从不导入 Service provider 特有的类型。 +2. **Service Provider**——提供或注册实现的插件(例如 `dsh-bash-local`:子进程、进程组 kill、spill 文件截断)。沙箱化和远程 Service Provider 是依据同一 Service Definition 实现或注册的兄弟包。 +3. **Consumer**——模型和插件编程所面向的内容(例如 `dsh-tool-bash`:`bash` schema,后台句柄注册到通用任务运行时)。Consumer 注入服务键,从不导入 Service Provider 特有的类型。 -Service provider 与 Consumer 由此独立演进:沙箱化执行器替换 `dsh-bash-local` 时无需触碰任何工具 schema。 +角色名使用标题式大小写:**Service Definition**、**Service Provider** 和 **Consumer**。泛指的 `provider` 和 `consumer` 仍使用小写。 -当角色独立演进时,通常使用不同的包;但当各角色确实属于同一个关注点时,并非必须拆分:LLM(大语言模型) seam 将 Service Definition 和 Consumer 合并为 `dsh-llm`(Consumer 是 agent loop(智能体循环)本身,而非可替换的 schema 接口),适配器作为 Service provider 包。不要预防性地拆分——如果一项能力只有一种可设想的 Service provider 和一个 Consumer,就保持为一个包,直到出现第二个。 +Service Provider 与 Consumer 由此独立演进:沙箱化执行器替换 `dsh-bash-local` 时无需触碰任何工具 schema。 + +当角色独立演进时,通常使用不同的包;但当各角色确实属于同一个关注点时,并非必须拆分:LLM(大语言模型) seam 将 Service Definition 和 Consumer 合并为 `dsh-llm`(Consumer 是 agent loop(智能体循环)本身,而非可替换的 schema 接口),适配器作为 Service Provider 包。不要预防性地拆分——如果一项能力只有一种可设想的 Service Provider 和一个 Consumer,就保持为一个包,直到出现第二个。 ## 术语:seam 指三者组合,而非接口 -一个 **seam** 是完整的能力——三个角色合在一起:**Service Definition**(拥有 `ctx.` 和词汇的 Cordis `Service`)、一个或多个 **Service provider**,以及一个或多个 **Consumer**。`packages/shell` 是规范范例——`dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`。一个包可以承担多个角色,但单个角色本身不是 seam。「seam」一词严格保留给这种完整能力;命名其中一个组成部分时,应使用其角色、类、服务、约定或扩展点。[术语表](../../../../docs/glossary.md#capability-seam)是规范条目。 +一个 **seam** 是完整的能力——三个角色合在一起:**Service Definition**(拥有 `ctx.` 和词汇的 Cordis `Service`)、一个或多个 **Service Provider**,以及一个或多个 **Consumer**。`packages/shell` 是规范范例——`dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`。一个包可以承担多个角色,但单个角色本身不是 seam。「seam」一词严格保留给这种完整能力;命名其中一个组成部分时,应使用其角色、类、服务、约定或扩展点。[术语表](../../../../docs/glossary.md#capability-seam)是规范条目。 ## 曾考虑的替代方案 -- **始终合并各角色**:否决。因为它会重新耦合独立变化的 Service Definition、Service provider 和 Consumer。 +- **始终合并各角色**:否决。因为它会重新耦合独立变化的 Service Definition、Service Provider 和 Consumer。 - **`@cordisjs/plugin-capability`**:这是完全不同的维度。它是一个权限/能力*安全*服务(具名权限加继承,通过 `ctx.capability.test` 针对会话检测这些权限),是延后的权限/沙箱工作(`tools/pre-execute` deny/ask 门)的候选方案,不是替换实现的机制。混淆这两个「能力」概念正是本 Agent Note 所指出的陷阱。 ## 后果 -分离角色会增加包和样板代码(`package.json`、`tsconfig`、README 和注入接线)。换来的是:Service provider 与 Consumer 独立发布和版本管理,新后端永远不会波及面向模型的约定。[AGENTS.md](../../../../AGENTS.md) 和 [architecture.md](../../../../docs/architecture.md) 载有这项规则;bash 三件套是参考模板。本 Agent Note 记录为什么独立变化的角色通常需要拆分,而确实共享的关注点可以保持合并。 +分离角色会增加包和样板代码(`package.json`、`tsconfig`、README 和注入接线)。换来的是:Service Provider 与 Consumer 独立发布和版本管理,新后端永远不会波及面向模型的约定。[AGENTS.md](../../../../AGENTS.md) 和 [architecture.md](../../../../docs/architecture.md) 载有这项规则;bash 三件套是参考模板。本 Agent Note 记录为什么独立变化的角色通常需要拆分,而确实共享的关注点可以保持合并。 diff --git a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml index fc070d7c3a..9898684b9e 100644 --- a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md -2026-06-17-filesystem-capability-seam.md: 953ef0eaafe8f654bf55c3e5c4208560243c3d0b -2026-06-17-filesystem-capability-seam.zh.md: 1073226594acbe8c1c596bb4b2dcc959b20c0769 +2026-06-17-filesystem-capability-seam.md: 6265aebf5e7ffdd4ec4dc0083aa55adb34ee78a1 +2026-06-17-filesystem-capability-seam.zh.md: 024421ed59fa1e6c29bcc12ab51f69ac19a0c231 diff --git a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md index 953ef0eaaf..6265aebf5e 100644 --- a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md +++ b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md @@ -53,7 +53,7 @@ The filesystem seam uses the same dependency direction as the bash trio: `@deepseek-ai/dsh-tool-fs` depends on `@deepseek-ai/dsh-fs`, `@deepseek-ai/dsh-tools`, `@deepseek-ai/dsh-system-prompt`, and `cordis`. It registers model-facing tools and prompt sections. It must not import `node:fs`, `node:path`, or `@deepseek-ai/dsh-fs-local`; filesystem execution always goes through `ctx.fs`. If the implementation needs concrete agent or session helper types, those dependencies belong in `tool-fs`; they must not leak back into `dsh-fs`. -The root `tool-fs` plugin registers the full filesystem tool suite (`read`, `write`, and `edit`) by composing the per-tool registration helpers. It injects `fs` and never imports a Service provider package. +The root `tool-fs` plugin registers the full filesystem tool suite (`read`, `write`, and `edit`) by composing the per-tool registration helpers. It injects `fs` and never imports a Service Provider package. ## `ctx.fs` contract @@ -139,7 +139,7 @@ The defensive-pattern classes this repo has been bitten by are pinned directly: ## Alternatives considered - **Model-facing tools directly over `node:fs`** — the tool package would own execution policy, path resolution, atomic writes, text decoding, and edit semantics at once, coupling the three independently-changing concerns the Problem names and churning schemas on any backend swap. -- **One combined `dsh-fs-tools` package** — the pre-seam shape; rejected for the same Service Definition / Service provider / Consumer split as bash, and the combined name never became public API. +- **One combined `dsh-fs-tools` package** — the pre-seam shape; rejected for the same Service Definition / Service Provider / Consumer split as bash, and the combined name never became public API. - **Observed-state on `ctx.fs`** — the shape this Agent Note first landed; superseded by [the split-fs-seam Agent Note](../simplification/2026-06-26-fsspec-style-fs-seam.md) and [the event-gate Agent Note](2026-06-26-file-context-as-event-gate.md): a sandboxed/remote backend must not inherit model-facing observation policy, so the provider keeps only the version token and the optional version-guarded mutation. ## Consequences diff --git a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md index 1073226594..024421ed59 100644 --- a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md @@ -53,7 +53,7 @@ Consumer 包仅依赖 Service Definition 包,从不依赖 `dsh-fs-local`。需 `@deepseek-ai/dsh-tool-fs` 依赖 `@deepseek-ai/dsh-fs`、`@deepseek-ai/dsh-tools`、`@deepseek-ai/dsh-system-prompt` 和 `cordis`。它注册面向模型的工具和提示词段落。它禁止导入 `node:fs`、`node:path` 或 `@deepseek-ai/dsh-fs-local`;文件系统执行始终通过 `ctx.fs`。如果实现需要具体的 agent(智能体)或会话辅助类型,这些依赖属于 `tool-fs`;它们禁止回漏到 `dsh-fs` 中。 -根 `tool-fs` 插件通过组合各工具的注册辅助函数来注册完整的文件系统工具套件(`read`、`write` 和 `edit`)。它注入 `fs`,从不导入 Service provider 包。 +根 `tool-fs` 插件通过组合各工具的注册辅助函数来注册完整的文件系统工具套件(`read`、`write` 和 `edit`)。它注入 `fs`,从不导入 Service Provider 包。 ## `ctx.fs` 约定 @@ -139,7 +139,7 @@ Consumer 包仅依赖 Service Definition 包,从不依赖 `dsh-fs-local`。需 ## 曾考虑的替代方案 - **面向模型的工具直接基于 `node:fs`**:工具包将同时承担执行策略、路径解析、原子写入、文本解码和编辑语义,耦合问题部分所列的三个独立变化的关注点,且任何后端替换都会搅动 schema。 -- **单一合并包 `dsh-fs-tools`**:seam 之前的形态;以与 bash 相同的 Service Definition / Service provider / Consumer 拆分理由否决,且合并名称从未成为公开 API。 +- **单一合并包 `dsh-fs-tools`**:seam 之前的形态;以与 bash 相同的 Service Definition / Service Provider / Consumer 拆分理由否决,且合并名称从未成为公开 API。 - **观测状态放在 `ctx.fs` 上**:本 Agent Note 最初落地的形态;被 [拆分文件系统 seam Agent Note](../simplification/2026-06-26-fsspec-style-fs-seam.md) 和 [事件门控 Agent Note](2026-06-26-file-context-as-event-gate.md) 取代:沙箱/远程后端不应继承面向模型的观测策略,因此提供方只保留版本令牌和可选的版本守护变更。 ## 后果 diff --git a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml index d3c3a774bd..0ecda2484f 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md -2026-06-18-agent-lifecycle-and-ownership-contracts.md: f0f9f90b15dee9155cfb1e8c772503642ff34be3 -2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md: a5f6ca10dbe7c71281cccdaf83fff95139ad2d79 +2026-06-18-agent-lifecycle-and-ownership-contracts.md: 9bc558bfce75892b0ebdb80e9f8735d440cabaf4 +2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md: 65e0018c3f2ba56043898050c8e0b49929f8e7e7 diff --git a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md index f0f9f90b15..9bc558bfce 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md +++ b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md @@ -37,7 +37,7 @@ These invariants hold and are pinned by tests: ## Session owner tokens are unique among live agents -The bash owner-token comparison relies on the shared `Agent.id`/`SessionId` being unique among live agents. Concurrent same-ID operations may both prepare privately, but publication enters the session and agent in order; `SessionStore.enter()` rejects a duplicate live session id, and every losing transaction rolls its private state back. A programmatic caller therefore cannot publish two live agents with one session token. The access *policy* (token comparison) stays in `tool-bash` (the Consumer); the bash capability keeps `owner` opaque and never interprets it — the correct Service Definition / Service provider / Consumer split. +The bash owner-token comparison relies on the shared `Agent.id`/`SessionId` being unique among live agents. Concurrent same-ID operations may both prepare privately, but publication enters the session and agent in order; `SessionStore.enter()` rejects a duplicate live session id, and every losing transaction rolls its private state back. A programmatic caller therefore cannot publish two live agents with one session token. The access *policy* (token comparison) stays in `tool-bash` (the Consumer); the bash capability keeps `owner` opaque and never interprets it — the correct Service Definition / Service Provider / Consumer split. ## Alternatives considered diff --git a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md index a5f6ca10db..65e0018c3f 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md @@ -37,7 +37,7 @@ ACP(Agent Client Protocol)与 tool-bash 的若干限制是同一个所有权 ## 会话所有者令牌在存活 agent 中唯一 -bash 所有者 token 比较依赖共享的 `Agent.id`/`SessionId` 在存活 agent 中唯一。并发的同 ID 操作可以都私下准备,但发布时会依次登记会话和 agent;`SessionStore.enter()` 拒绝重复的存活会话 id,每个失败事务都回滚自己的私有状态。因此程序化调用方无法发布两个共享同一会话 token 的存活 agent。访问*策略*(token 比较)留在 Consumer `tool-bash`;bash 能力只存储不透明的 `owner` 字符串且从不解释它——这是正确的 Service Definition / Service provider / Consumer 拆分。 +bash 所有者 token 比较依赖共享的 `Agent.id`/`SessionId` 在存活 agent 中唯一。并发的同 ID 操作可以都私下准备,但发布时会依次登记会话和 agent;`SessionStore.enter()` 拒绝重复的存活会话 id,每个失败事务都回滚自己的私有状态。因此程序化调用方无法发布两个共享同一会话 token 的存活 agent。访问*策略*(token 比较)留在 Consumer `tool-bash`;bash 能力只存储不透明的 `owner` 字符串且从不解释它——这是正确的 Service Definition / Service Provider / Consumer 拆分。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml index 877a53e0ac..b7e2678928 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-20-branded-ids.md -2026-06-20-branded-ids.md: 6bf68c9b6b6dea8317992bcb6f694a8ee141f048 -2026-06-20-branded-ids.zh.md: 11a78df609888fdf917246940c12463373ff2de3 +2026-06-20-branded-ids.md: 29b258b21240c92e74051339f0939a8e70933099 +2026-06-20-branded-ids.zh.md: 288125764d4b279c79b7469080bb0c9f2efdc709 diff --git a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md index 6bf68c9b6b..29b258b212 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md +++ b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md @@ -46,7 +46,7 @@ export function OwnerToken(id: string): OwnerToken { ### Why not typing `owner` as `SessionId`? -The obvious shortcut is to type `owner` as `SessionId` directly — it always *is* one. We reject that. The bash executor seam is a capability seam (Service Definition `dsh-shell`, Service provider `dsh-bash-local`, Consumer `dsh-tool-bash`) and its owner token is *documented as deliberately opaque*: the executor "never interprets it (no access policy lives in the seam — that is the consumer's job)" (`packages/shell/shell/src/types.ts`). Typing the Service Definition's field as `SessionId` would import `dsh-session`'s vocabulary into a package that must not know what an owner token *means* — it would couple a generic execution backend to the session model and contradict the opaque-token design. A sandboxed or remote executor that replaces `dsh-bash-local` should not inherit a session dependency. The distinct `OwnerToken` brand keeps the seam decoupled: `dsh-shell` knows only "an owner is some opaque branded token," and the `dsh-tool-bash` consumer — which already decides the access policy — is the single boundary that casts its `SessionId` into an `OwnerToken`. The brand still delivers the safety win (you cannot pass a `BashTaskId` or a raw string where an owner is expected) without the coupling. +The obvious shortcut is to type `owner` as `SessionId` directly — it always *is* one. We reject that. The bash executor seam is a capability seam (Service Definition `dsh-shell`, Service Provider `dsh-bash-local`, Consumer `dsh-tool-bash`) and its owner token is *documented as deliberately opaque*: the executor "never interprets it (no access policy lives in the seam — that is the consumer's job)" (`packages/shell/shell/src/types.ts`). Typing the Service Definition's field as `SessionId` would import `dsh-session`'s vocabulary into a package that must not know what an owner token *means* — it would couple a generic execution backend to the session model and contradict the opaque-token design. A sandboxed or remote executor that replaces `dsh-bash-local` should not inherit a session dependency. The distinct `OwnerToken` brand keeps the seam decoupled: `dsh-shell` knows only "an owner is some opaque branded token," and the `dsh-tool-bash` consumer — which already decides the access policy — is the single boundary that casts its `SessionId` into an `OwnerToken`. The brand still delivers the safety win (you cannot pass a `BashTaskId` or a raw string where an owner is expected) without the coupling. ## Out of scope / possible extensions @@ -64,6 +64,6 @@ The landed invariants: `BashTaskId` and `OwnerToken` are defined in `dsh-shell` ## Consequences -- **Mechanical churn across two surfaces.** Propagating brands touches the bash seam (Service Definition + Service provider + Consumer) and the ACP session-id surface plus the persistence coordinator. The churn is broad but low-severity: a missed site is a compile error, not a silent bug. The change is observably type-only — no snapshot or e2e behavioral diff. It sits next to the [unified agent/session identity decision](../simplification/2026-06-20-unify-agent-and-session-id.md) because both touch the session-id / owner-token boundary; `OwnerToken` stays distinct from the unified id for the decoupling reason above. +- **Mechanical churn across two surfaces.** Propagating brands touches the bash seam (Service Definition + Service Provider + Consumer) and the ACP session-id surface plus the persistence coordinator. The churn is broad but low-severity: a missed site is a compile error, not a silent bug. The change is observably type-only — no snapshot or e2e behavioral diff. It sits next to the [unified agent/session identity decision](../simplification/2026-06-20-unify-agent-and-session-id.md) because both touch the session-id / owner-token boundary; `OwnerToken` stays distinct from the unified id for the decoupling reason above. - **Brands do not validate.** A brand is a confusability guard, not a correctness proof: a *wrong* session id that is still a well-formed string passes the type checker exactly as before. This decision does not close that gap (see Out of scope) — it only stops the *category* error of passing the wrong *kind* of id. - **The "where to stop" line stays a judgment call.** Branding `BashTaskId` but not `ToolName`, `OwnerToken` but not `ModelId`, is a taste call about which strings "could plausibly be confused." Reasonable reviewers may want more or fewer; the policy in `brand.ts` is the tie-breaker, and this decision errs toward the ids that are model-facing or used for access control. diff --git a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md index 11a78df609..288125764d 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md @@ -46,7 +46,7 @@ export function OwnerToken(id: string): OwnerToken { ### 为什么不把 `owner` 类型标注为 `SessionId`? -显而易见的捷径是直接把 `owner` 类型标注为 `SessionId`——它确实*总是*一个会话 id。我们否决这个方案。bash 执行器 seam 是能力 seam(Service Definition `dsh-shell`、Service provider `dsh-bash-local`、Consumer `dsh-tool-bash`),其 owner token 被*明确记录为刻意不透明*:执行器「从不解释它(seam 中没有访问策略——那是消费方的职责)」(`packages/shell/shell/src/types.ts`)。把 Service Definition 的字段类型标注为 `SessionId`,会把 `dsh-session` 的词汇引入一个不应知道 owner token *含义*的包——这会让通用执行后端耦合会话模型,并违背不透明 token 的设计。取代 `dsh-bash-local` 的沙箱化执行器或远程执行器不应继承会话依赖。独立的 `OwnerToken` brand 使 seam 保持解耦:`dsh-shell` 只知道「owner 是某种带 brand 的不透明 token」,而已经决定访问策略的 `dsh-tool-bash` 消费方,是把其 `SessionId` cast 为 `OwnerToken` 的唯一边界。该 brand 仍带来安全收益(不能把 `BashTaskId` 或裸 string 传到 owner 位置),且不引入耦合。 +显而易见的捷径是直接把 `owner` 类型标注为 `SessionId`——它确实*总是*一个会话 id。我们否决这个方案。bash 执行器 seam 是能力 seam(Service Definition `dsh-shell`、Service Provider `dsh-bash-local`、Consumer `dsh-tool-bash`),其 owner token 被*明确记录为刻意不透明*:执行器「从不解释它(seam 中没有访问策略——那是消费方的职责)」(`packages/shell/shell/src/types.ts`)。把 Service Definition 的字段类型标注为 `SessionId`,会把 `dsh-session` 的词汇引入一个不应知道 owner token *含义*的包——这会让通用执行后端耦合会话模型,并违背不透明 token 的设计。取代 `dsh-bash-local` 的沙箱化执行器或远程执行器不应继承会话依赖。独立的 `OwnerToken` brand 使 seam 保持解耦:`dsh-shell` 只知道「owner 是某种带 brand 的不透明 token」,而已经决定访问策略的 `dsh-tool-bash` 消费方,是把其 `SessionId` cast 为 `OwnerToken` 的唯一边界。该 brand 仍带来安全收益(不能把 `BashTaskId` 或裸 string 传到 owner 位置),且不引入耦合。 ## 不在范围内 / 可能的扩展 @@ -64,6 +64,6 @@ export function OwnerToken(id: string): OwnerToken { ## 后果 -- **两个接口面的机械性改动。** 传播 brand 涉及 bash seam(Service Definition + Service provider + Consumer)以及 ACP 会话 id 接口和持久化协调器。改动面广但严重度低:遗漏的位置是编译错误而非静默 bug。从可观察行为看,这是一项纯类型变更——无快照或 e2e 行为差异。它与[统一 agent/会话标识决策](../simplification/2026-06-20-unify-agent-and-session-id.md)相邻,因为二者都触及会话 id / owner-token 边界;`OwnerToken` 出于上述解耦理由仍与统一后的 id 保持独立。 +- **两个接口面的机械性改动。** 传播 brand 涉及 bash seam(Service Definition + Service Provider + Consumer)以及 ACP 会话 id 接口和持久化协调器。改动面广但严重度低:遗漏的位置是编译错误而非静默 bug。从可观察行为看,这是一项纯类型变更——无快照或 e2e 行为差异。它与[统一 agent/会话标识决策](../simplification/2026-06-20-unify-agent-and-session-id.md)相邻,因为二者都触及会话 id / owner-token 边界;`OwnerToken` 出于上述解耦理由仍与统一后的 id 保持独立。 - **Brand 不做校验。** Brand 是混淆防护,不是正确性证明:一个*错误的*会话 id 只要仍是格式正确的 string,就和以前一样能通过类型检查器。本决策不关闭这个缺口(见「不在范围内」)——它只阻止这类*类别*错误:传入错误*种类*的 id。 - **「在哪里停下」仍是判断题。** 为 `BashTaskId` 加 brand 但不为 `ToolName` 加,为 `OwnerToken` 加但不为 `ModelId` 加,是对哪些 string「可能被混淆」的品味判断。合理的评审者可能想要更多或更少;`brand.ts` 中的策略是裁决依据,本决策倾向于面向模型或用于访问控制的 id。 diff --git a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml index 3480f0b231..477c6df3ae 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.md 2026-06-20-generic-long-running-tool-runtime.md: 7db43323dd83f8e99698a7163412c9b33a607dfb -2026-06-20-generic-long-running-tool-runtime.zh.md: fe12ef264d294224fcfaf503ba958fa90c782347 +2026-06-20-generic-long-running-tool-runtime.zh.md: efd306cc8d3b82749635dde302af45235c27b431 diff --git a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md index fe12ef264d..efd306cc8d 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md @@ -19,13 +19,13 @@ Status: implemented 长时间运行工具是生产方。`dsh-tool-bash` 将 `ShellProcess` 适配为增量输出与进程取消;`dsh-tool-subagent` 将子运行适配为最终输出与子运行释放。bash 与 subagent 能力 seam 保持独立,不依赖会话或任务注册表。 -`JobRegistry` 是 `@deepseek-ai/dsh-jobs` 中的 Service Definition;进程内 Service provider 是 `@deepseek-ai/dsh-jobs-local` 中的 `LocalJobRegistry`(该拆分记录在[任务注册表约定 Agent Note](2026-07-26-job-registry-seam.md)中)。 +`JobRegistry` 是 `@deepseek-ai/dsh-jobs` 中的 Service Definition;进程内 Service Provider 是 `@deepseek-ai/dsh-jobs-local` 中的 `LocalJobRegistry`(该拆分记录在[任务注册表约定 Agent Note](2026-07-26-job-registry-seam.md)中)。 ## 运行时约定 字面类型见[任务子系统页面](../../../../docs/subsystems/jobs.md)。生产方调用 `ctx.jobs.start()`,传入 kind、label、可选的所属 `Agent`、可选的正数 `outputLimitBytes` 与一个 `run()` 函数。运行时会在调用 `run()` 前完成所有可能失败的预检工作,并且只调用一次。`run()` 返回钩子后,注册过程不会再执行可能失败的步骤而直接提交;生产方无法启动没有可收集 job id 的工作。 -进程内 Service provider 还拥有有界准入,其理由记录在[有界后台任务准入决策](../bug-fix/2026-08-11-bounded-background-job-admission.md)中。它的 `maxConcurrentJobsPerOwner` 配置必须是正的安全整数,默认值为 `10`;`start()` 从 `running` 与 `stopping` 记录派生每个确切 `Agent` 对象的活动数量,而全部无 owner 任务共享一个服务级桶。容量拒绝发生在 `run()` 与 id 分配之前,处于 stopping 的任务只有在生产方 `done` 结算时才释放名额。Service provider 不排队或抢占任务,也不保留第二份可变计数。 +进程内 Service Provider 还拥有有界准入,其理由记录在[有界后台任务准入决策](../bug-fix/2026-08-11-bounded-background-job-admission.md)中。它的 `maxConcurrentJobsPerOwner` 配置必须是正的安全整数,默认值为 `10`;`start()` 从 `running` 与 `stopping` 记录派生每个确切 `Agent` 对象的活动数量,而全部无 owner 任务共享一个服务级桶。容量拒绝发生在 `run()` 与 id 分配之前,处于 stopping 的任务只有在生产方 `done` 结算时才释放名额。Service Provider 不排队或抢占任务,也不保留第二份可变计数。 `outputLimitBytes` 是生产方拥有的呈现策略,而非注册表缓冲区。注册表校验该值,并将其原样投影到 `JobSnapshot`;通用任务控制器添加自身的状态或通知元数据后,再将该上限应用于完整的面向模型输出。省略该值时保持现有控制器行为,因此运行时不会向无关的生产方类别施加隐式默认值。 @@ -57,7 +57,7 @@ job id 在运行时全局可见且可预测,因此注册表会授权每次访 `JobRegistry` 提供: -- `start(spec)`:经过预检与 Service provider 准入的原子注册。 +- `start(spec)`:经过预检与 Service Provider 准入的原子注册。 - `get(id, caller?)` 和 `list(caller?)`:非消费式快照。 - `read(id, caller?)`:消费式流增量或幂等的最终结果。 - `kill(id, caller?, reason?)`:取消。 diff --git a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml index 03dd8d5694..bc92549f44 100644 --- a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md -2026-06-24-web-capability-seam.md: 6e81650e2d7286fc3c9df1e740ba9ccbf30118df -2026-06-24-web-capability-seam.zh.md: b91a4470999fd66ec7178326fcfb5247ff83a2e0 +2026-06-24-web-capability-seam.md: 7e7b09f19864bd2ad8ad9d69579c1d5c79600cde +2026-06-24-web-capability-seam.zh.md: d6051eec498edb640773ba367038581cebd1f654 diff --git a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md index 6e81650e2d..7e7b09f198 100644 --- a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md +++ b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md @@ -38,7 +38,7 @@ The seam deliberately exposes no observation surface — no registry-change even ## Package topology -The three-package Service Definition / Service provider / Consumer split follows bash and filesystem, but the *interface* package is closer to the LLM seam. `LlmRuntime` (`packages/llm/llm/src/index.ts`) is a name-keyed provider registry: `registerAdapter(models, adapter)` stores adapters in a `Map`, returns a disposer, throws `DUPLICATE_ADAPTER` on duplicate keys, and throws `NO_ADAPTER` at resolution time. `ctx.web` follows that registry shape, but has two capability kinds and a richer selection policy (a configured provider id, or auto-select when exactly one usable provider is registered), so the `WebError` an execution throws can explain why a search or fetch capability cannot run. +The three-package Service Definition / Service Provider / Consumer split follows bash and filesystem, but the *interface* package is closer to the LLM seam. `LlmRuntime` (`packages/llm/llm/src/index.ts`) is a name-keyed provider registry: `registerAdapter(models, adapter)` stores adapters in a `Map`, returns a disposer, throws `DUPLICATE_ADAPTER` on duplicate keys, and throws `NO_ADAPTER` at resolution time. `ctx.web` follows that registry shape, but has two capability kinds and a richer selection policy (a configured provider id, or auto-select when exactly one usable provider is registered), so the `WebError` an execution throws can explain why a search or fetch capability cannot run. The dependency direction mirrors bash and filesystem: diff --git a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md index b91a447099..d6051eec49 100644 --- a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md @@ -38,7 +38,7 @@ Web 访问是一个一等能力 seam,遵循[能力 seam Agent Note](2026-06-13 ## 包拓扑 -由三个包构成的 Service Definition / Service provider / Consumer 拆分沿用 bash 和 filesystem 的模式,但*接口*包更接近 LLM(大语言模型) seam。`LlmRuntime`(`packages/llm/llm/src/index.ts`)是一个按名称键控的提供方注册表:`registerAdapter(models, adapter)` 将适配器存入 `Map`、返回 disposer、对重复键抛出 `DUPLICATE_ADAPTER`、在解析时抛出 `NO_ADAPTER`。`ctx.web` 沿用该注册表形状,但有两种能力类别和更丰富的选择策略(配置的提供方 id,或在恰好只有一个可用提供方注册时自动选择),因此执行时抛出的 `WebError` 能解释搜索或 fetch 能力为何无法运行。 +由三个包构成的 Service Definition / Service Provider / Consumer 拆分沿用 bash 和 filesystem 的模式,但*接口*包更接近 LLM(大语言模型) seam。`LlmRuntime`(`packages/llm/llm/src/index.ts`)是一个按名称键控的提供方注册表:`registerAdapter(models, adapter)` 将适配器存入 `Map`、返回 disposer、对重复键抛出 `DUPLICATE_ADAPTER`、在解析时抛出 `NO_ADAPTER`。`ctx.web` 沿用该注册表形状,但有两种能力类别和更丰富的选择策略(配置的提供方 id,或在恰好只有一个可用提供方注册时自动选择),因此执行时抛出的 `WebError` 能解释搜索或 fetch 能力为何无法运行。 依赖方向与 bash 和 filesystem 一致: diff --git a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml index dfc3a79832..5d60dee0d3 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md -2026-07-26-job-registry-seam.md: 5a77e8e8098a135dd25abeb11c68127fd9f1b4e9 -2026-07-26-job-registry-seam.zh.md: fdc0912eca0b7ba01241137020e8e028c5480e2f +2026-07-26-job-registry-seam.md: b4a8a66ef63f1a4955e2497cad2d0d0b1ef138ec +2026-07-26-job-registry-seam.zh.md: ebab92029ddb9edd4c7085eef0d8cc83e9289bd9 diff --git a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md index 5a77e8e809..b4a8a66ef6 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md +++ b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md @@ -6,17 +6,17 @@ English | [中文](2026-07-26-job-registry-seam.zh.md) ## Problem -The [background-job runtime](2026-06-20-generic-long-running-tool-runtime.md) shipped `JobRegistry` as one concrete package: `@deepseek-ai/dsh-jobs` owned both the `ctx.jobs` contract every producer and controller programs against and the process-local provider (the in-memory store, settlement bookkeeping, owner-cleanup effects, teardown). That bundling recouples the two rates of change the repository's [capability-seam rule](2026-06-13-capability-seams.md) separates: swapping the registry's storage or lifecycle backend would churn the same package whose types and `ctx.jobs` API producers (`dsh-tool-bash`, `dsh-tool-terminal`, `dsh-tool-subagent`), the controller (`dsh-tool-jobs`), and `JobKindMap` extenders import. Every other swappable capability in the harness — bash, pty, fs, skill, subagent, web, session persistence — already carries the Service Definition / Service provider / Consumer split; the job registry was the remaining `core`-mode exception, guarded only by a `TODO(job-service-backend)` comment. +The [background-job runtime](2026-06-20-generic-long-running-tool-runtime.md) shipped `JobRegistry` as one concrete package: `@deepseek-ai/dsh-jobs` owned both the `ctx.jobs` contract every producer and controller programs against and the process-local provider (the in-memory store, settlement bookkeeping, owner-cleanup effects, teardown). That bundling recouples the two rates of change the repository's [capability-seam rule](2026-06-13-capability-seams.md) separates: swapping the registry's storage or lifecycle backend would churn the same package whose types and `ctx.jobs` API producers (`dsh-tool-bash`, `dsh-tool-terminal`, `dsh-tool-subagent`), the controller (`dsh-tool-jobs`), and `JobKindMap` extenders import. Every other swappable capability in the harness — bash, pty, fs, skill, subagent, web, session persistence — already carries the Service Definition / Service Provider / Consumer split; the job registry was the remaining `core`-mode exception, guarded only by a `TODO(job-service-backend)` comment. ## Decision `jobs/` is now a three-package capability family in the bash-trio shape: -- **`@deepseek-ai/dsh-jobs` (Service Definition)** — the abstract `JobRegistry extends Service` owning `ctx.jobs`, the nine-method contract (`start`, `list`, `get`, `read`, `kill`, `wait`, `onJobDone`, `onJobsChanged`, `attachController`), all vocabulary types (`JobId`, `JobKindMap`, `JobStart`, `JobHooks`, `JobOutcome`, `JobSnapshot`, `JobRead`, `JobDoneListener`), and the snapshot invariant companion. The class-level JSDoc states the semantics every Service provider owes: registrations outlive producer and controller fibers, owned access is session-fenced, settlement is first-wins with contained listeners, and `start` refuses work while no attached job controller serves the spec's owner (controllers and listeners are scope-layered, so one process-wide registry answers both questions per owner). -- **`@deepseek-ai/dsh-jobs-local` (Service provider)** — `LocalJobRegistry`, the process-local registry: the in-memory store, per-kind id counters, waiter bookkeeping, `TASK_WAIT_TIMEOUT` deadline code, owner-cleanup effects, force-fail teardown, and the default-10 configurable admission policy. Admission derives `running` plus `stopping` capacity from the same records per exact owner, with one unowned bucket; it adds no public count or second state owner. The `dsh-timeout` dependency and Schemastery-owned provider config live here; the Service Definition package has no provider dependencies. +- **`@deepseek-ai/dsh-jobs` (Service Definition)** — the abstract `JobRegistry extends Service` owning `ctx.jobs`, the nine-method contract (`start`, `list`, `get`, `read`, `kill`, `wait`, `onJobDone`, `onJobsChanged`, `attachController`), all vocabulary types (`JobId`, `JobKindMap`, `JobStart`, `JobHooks`, `JobOutcome`, `JobSnapshot`, `JobRead`, `JobDoneListener`), and the snapshot invariant companion. The class-level JSDoc states the semantics every Service Provider owes: registrations outlive producer and controller fibers, owned access is session-fenced, settlement is first-wins with contained listeners, and `start` refuses work while no attached job controller serves the spec's owner (controllers and listeners are scope-layered, so one process-wide registry answers both questions per owner). +- **`@deepseek-ai/dsh-jobs-local` (Service Provider)** — `LocalJobRegistry`, the process-local registry: the in-memory store, per-kind id counters, waiter bookkeeping, `TASK_WAIT_TIMEOUT` deadline code, owner-cleanup effects, force-fail teardown, and the default-10 configurable admission policy. Admission derives `running` plus `stopping` capacity from the same records per exact owner, with one unowned bucket; it adds no public count or second state owner. The `dsh-timeout` dependency and Schemastery-owned provider config live here; the Service Definition package has no provider dependencies. - **`@deepseek-ai/dsh-tool-jobs` (Consumer)** — unchanged; it injects `'jobs'` and never imports provider types. -Compositions load `dsh-jobs-local` where they previously loaded `dsh-jobs` (the CLI cordis.yml row, `agent-spine-demo`, test harnesses, the tool-catalog generator boot). Producer misconfiguration diagnostics ("background jobs unavailable: load …") name `dsh-jobs` — the Service Definition package that declares the absent `ctx.jobs` service — and the Service Definition package's own APIs (its README and the direct-mount fence) point at Service providers, so the producer message stays correct when another backend becomes the recommended default. Producers, `JobKindMap` declaration merges, and the controller keep importing `@deepseek-ai/dsh-jobs` only. +Compositions load `dsh-jobs-local` where they previously loaded `dsh-jobs` (the CLI cordis.yml row, `agent-spine-demo`, test harnesses, the tool-catalog generator boot). Producer misconfiguration diagnostics ("background jobs unavailable: load …") name `dsh-jobs` — the Service Definition package that declares the absent `ctx.jobs` service — and the Service Definition package's own APIs (its README and the direct-mount fence) point at Service Providers, so the producer message stays correct when another backend becomes the recommended default. Producers, `JobKindMap` declaration merges, and the controller keep importing `@deepseek-ai/dsh-jobs` only. The seam keeps the in-process contract semantics unchanged: `JobStart.run()` still passes callbacks and exact `Agent` objects, so a durable or cross-process backend still has design work to do before it can satisfy this Service Definition (identity, restart, ownership, observation). The split moves that future work out of every Consumer's dependency graph; it does not pre-design the backend. @@ -30,6 +30,6 @@ The seam keeps the in-process contract semantics unchanged: `JobStart.run()` sti ## Consequences -Bought: the job registry now matches the repository-wide seam shape; a durable, remote, or instrumented registry is a sibling Service provider implementing nine abstract methods, and no producer, controller, or `JobKindMap` extender changes when one lands. The Service Definition README states the contract; the provider README owns the lifecycle bookkeeping facts. The registry behavior suite (owner cleanup, settlement, waits, teardown) lives with `dsh-jobs-local`; the Service Definition package keeps a stub-subclass test pinning registration under `ctx.jobs` and single-service duplication behavior, plus the probe-based invariant suite. +Bought: the job registry now matches the repository-wide seam shape; a durable, remote, or instrumented registry is a sibling Service Provider implementing nine abstract methods, and no producer, controller, or `JobKindMap` extender changes when one lands. The Service Definition README states the contract; the provider README owns the lifecycle bookkeeping facts. The registry behavior suite (owner cleanup, settlement, waits, teardown) lives with `dsh-jobs-local`; the Service Definition package keeps a stub-subclass test pinning registration under `ctx.jobs` and single-service duplication behavior, plus the probe-based invariant suite. -Cost: one more package (manifest, tsconfig, README, invariant companion), and compositions must name the Service provider package. `abstract` erases at runtime and this package name used to be the mountable registry, so the Service Definition constructor fails loudly when mounted directly — a stale composition row gets "load a Service provider such as @deepseek-ai/dsh-jobs-local" at load time instead of a half-registered `ctx.jobs` failing far from the misconfiguration. +Cost: one more package (manifest, tsconfig, README, invariant companion), and compositions must name the Service Provider package. `abstract` erases at runtime and this package name used to be the mountable registry, so the Service Definition constructor fails loudly when mounted directly — a stale composition row gets "load a Service Provider such as @deepseek-ai/dsh-jobs-local" at load time instead of a half-registered `ctx.jobs` failing far from the misconfiguration. diff --git a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md index fdc0912eca..ebab92029d 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md @@ -6,30 +6,30 @@ Status: implemented ## 问题 -[后台任务运行时](2026-06-20-generic-long-running-tool-runtime.md)交付时把 `JobRegistry` 做成了单个具体包:`@deepseek-ai/dsh-jobs` 既拥有每个生产方和控制器面向编程的 `ctx.jobs` 约定,也拥有进程内 Service provider(内存存储、结算簿记、所有者清理 effect、拆除)。这种捆绑重新耦合了仓库[能力 seam 规则](2026-06-13-capability-seams.md)本要分离的两种变化速率:一旦替换注册表的存储或生命周期后端,被搅动的就是同一个包,而生产方(`dsh-tool-bash`、`dsh-tool-terminal`、`dsh-tool-subagent`)、控制器(`dsh-tool-jobs`)和 `JobKindMap` 扩展方正是从这个包导入类型与 `ctx.jobs` API。harness 中其余每项可替换能力——bash、pty、fs、skill(技能)、subagent、web、会话持久化——都已具备 Service Definition / Service provider / Consumer 三分;任务注册表曾是仅剩的 `core` 模式例外,仅由一条 `TODO(job-service-backend)` 注释把守。 +[后台任务运行时](2026-06-20-generic-long-running-tool-runtime.md)交付时把 `JobRegistry` 做成了单个具体包:`@deepseek-ai/dsh-jobs` 既拥有每个生产方和控制器面向编程的 `ctx.jobs` 约定,也拥有进程内 Service Provider(内存存储、结算簿记、所有者清理 effect、拆除)。这种捆绑重新耦合了仓库[能力 seam 规则](2026-06-13-capability-seams.md)本要分离的两种变化速率:一旦替换注册表的存储或生命周期后端,被搅动的就是同一个包,而生产方(`dsh-tool-bash`、`dsh-tool-terminal`、`dsh-tool-subagent`)、控制器(`dsh-tool-jobs`)和 `JobKindMap` 扩展方正是从这个包导入类型与 `ctx.jobs` API。harness 中其余每项可替换能力——bash、pty、fs、skill(技能)、subagent、web、会话持久化——都已具备 Service Definition / Service Provider / Consumer 三分;任务注册表曾是仅剩的 `core` 模式例外,仅由一条 `TODO(job-service-backend)` 注释把守。 ## 决策 `jobs/` 如今是一个 bash 三件套形态的三包能力家族: -- **`@deepseek-ai/dsh-jobs`(Service Definition)**——抽象的 `JobRegistry extends Service`,拥有 `ctx.jobs`、九个方法的约定(`start`、`list`、`get`、`read`、`kill`、`wait`、`onJobDone`、`onJobsChanged`、`attachController`)、全部词汇类型(`JobId`、`JobKindMap`、`JobStart`、`JobHooks`、`JobOutcome`、`JobSnapshot`、`JobRead`、`JobDoneListener`),以及快照不变式配套插件。类级 JSDoc 陈述了每个 Service provider 都必须兑现的语义:注册的存续期长于生产方与控制器的 fiber,有所有者的访问以会话为界,结算遵循首次结果优先且监听器错误被隔离,并且当没有任何已附加的任务控制器服务于 spec 的所有者时 `start` 拒绝启动工作(控制器与监听器按 scope 分层,因此一个进程级注册表能逐所有者地回答这两个问题)。 -- **`@deepseek-ai/dsh-jobs-local`(Service provider)**——`LocalJobRegistry`,即进程内注册表:内存存储、按 kind 划分的 id 计数器、等待方簿记、`TASK_WAIT_TIMEOUT` deadline 代码、所有者清理 effect、强制失败的拆除,以及默认值为 10 且可配置的准入策略。准入从同一组记录中按确切 owner 派生 `running` 加 `stopping` 容量,并为无 owner 任务使用一个共享桶;它不新增公开计数或第二个状态 owner。`dsh-timeout` 依赖与由 Schemastery 管理的 Service provider 配置都位于此包;Service Definition 包不含任何提供方依赖。 +- **`@deepseek-ai/dsh-jobs`(Service Definition)**——抽象的 `JobRegistry extends Service`,拥有 `ctx.jobs`、九个方法的约定(`start`、`list`、`get`、`read`、`kill`、`wait`、`onJobDone`、`onJobsChanged`、`attachController`)、全部词汇类型(`JobId`、`JobKindMap`、`JobStart`、`JobHooks`、`JobOutcome`、`JobSnapshot`、`JobRead`、`JobDoneListener`),以及快照不变式配套插件。类级 JSDoc 陈述了每个 Service Provider 都必须兑现的语义:注册的存续期长于生产方与控制器的 fiber,有所有者的访问以会话为界,结算遵循首次结果优先且监听器错误被隔离,并且当没有任何已附加的任务控制器服务于 spec 的所有者时 `start` 拒绝启动工作(控制器与监听器按 scope 分层,因此一个进程级注册表能逐所有者地回答这两个问题)。 +- **`@deepseek-ai/dsh-jobs-local`(Service Provider)**——`LocalJobRegistry`,即进程内注册表:内存存储、按 kind 划分的 id 计数器、等待方簿记、`TASK_WAIT_TIMEOUT` deadline 代码、所有者清理 effect、强制失败的拆除,以及默认值为 10 且可配置的准入策略。准入从同一组记录中按确切 owner 派生 `running` 加 `stopping` 容量,并为无 owner 任务使用一个共享桶;它不新增公开计数或第二个状态 owner。`dsh-timeout` 依赖与由 Schemastery 管理的 Service Provider 配置都位于此包;Service Definition 包不含任何提供方依赖。 - **`@deepseek-ai/dsh-tool-jobs`(Consumer)**——保持不变;它注入 `'jobs'`,从不导入提供方类型。 -各组合在原先加载 `dsh-jobs` 的位置改为加载 `dsh-jobs-local`:CLI(命令行界面)的 cordis.yml 配置项、`agent-spine-demo`、各测试 harness,以及工具目录生成器的启动流程。生产方的配置错误诊断信息(「background jobs unavailable: load …」)点名 `dsh-jobs`——即声明缺失的 `ctx.jobs` 服务的 Service Definition 包;Service Definition 包自身的 API(其 README 与直接挂载防线)会指向各 Service provider,因此当另一个后端日后成为推荐默认时,生产方的消息依旧正确。生产方、`JobKindMap` 声明合并和控制器仍然只导入 `@deepseek-ai/dsh-jobs`。 +各组合在原先加载 `dsh-jobs` 的位置改为加载 `dsh-jobs-local`:CLI(命令行界面)的 cordis.yml 配置项、`agent-spine-demo`、各测试 harness,以及工具目录生成器的启动流程。生产方的配置错误诊断信息(「background jobs unavailable: load …」)点名 `dsh-jobs`——即声明缺失的 `ctx.jobs` 服务的 Service Definition 包;Service Definition 包自身的 API(其 README 与直接挂载防线)会指向各 Service Provider,因此当另一个后端日后成为推荐默认时,生产方的消息依旧正确。生产方、`JobKindMap` 声明合并和控制器仍然只导入 `@deepseek-ai/dsh-jobs`。 该 seam 保持进程内约定语义不变:`JobStart.run()` 仍然传入回调和确切的 `Agent` 对象,因此持久化或跨进程后端在能满足此 Service Definition 之前仍有设计工作要做(身份、重启、所有权、观察)。这次拆分把该项未来工作移出了每个 Consumer 的依赖图;它并不预先设计后端。 ## 曾考虑的替代方案 -**在第二个后端出现之前保持具体服务(维持现状)。**这正是运行时 Agent Note 当初的立场:在第二个 Service provider 出现前抽取 Service Definition,可能固化错误的边界。该方案落选,因为这条边界已不再是臆测:九个服务方法及其语义自引入以来在每一次生产方集成中都保持稳定,它们正是 `dsh-tool-jobs` 与各生产方已经面向编程的那套接口,而且仓库约定默认将可替换能力拆成三个包。剩余风险(持久化后端可能需要变更约定)不因这次拆分而改变:无论拆分与否,这类变更都会落在 Service Definition 包里;而若维持现状,它们今天还会连带搅动每个 Consumer 的提供方依赖。 +**在第二个后端出现之前保持具体服务(维持现状)。**这正是运行时 Agent Note 当初的立场:在第二个 Service Provider 出现前抽取 Service Definition,可能固化错误的边界。该方案落选,因为这条边界已不再是臆测:九个服务方法及其语义自引入以来在每一次生产方集成中都保持稳定,它们正是 `dsh-tool-jobs` 与各生产方已经面向编程的那套接口,而且仓库约定默认将可替换能力拆成三个包。剩余风险(持久化后端可能需要变更约定)不因这次拆分而改变:无论拆分与否,这类变更都会落在 Service Definition 包里;而若维持现状,它们今天还会连带搅动每个 Consumer 的提供方依赖。 -**在单个包内仅抽取 Service Definition(在具体类旁导出一个抽象类)。**否决,因为它在运作层面并未分离任何东西:Consumer 依然依赖携带 Service provider 及其依赖项的那个包,而替换后端若不把本地 Service provider 纳入自身依赖图,就仍然无法发布。在这里,包边界才是独立演进的单位。 +**在单个包内仅抽取 Service Definition(在具体类旁导出一个抽象类)。**否决,因为它在运作层面并未分离任何东西:Consumer 依然依赖携带 Service Provider 及其依赖项的那个包,而替换后端若不把本地 Service Provider 纳入自身依赖图,就仍然无法发布。在这里,包边界才是独立演进的单位。 **拆出 `types.ts` 但让服务保持具体。**基于同样的理由否决:类型并不是完整能力,`ctx.jobs` Service Definition 及其方法约定才是。生产方需要的是服务键和语义,而不只是类型形状。 ## 后果 -换来的是:任务注册表如今与全仓库通行的 seam 形态一致;持久化、远程或带插桩的注册表将是一个实现九个抽象方法的同级 Service provider,这样的注册表落地时,任何生产方、控制器或 `JobKindMap` 扩展方都无需改动。Service Definition 的 README 陈述约定;生命周期簿记方面的事实归 Service provider 的 README 所有。注册表行为测试套件(所有者清理、结算、等待、拆除)随 `dsh-jobs-local` 存放;Service Definition 包保留一个桩子类(stub subclass)测试,固定 `ctx.jobs` 下的注册行为与单一服务的重复注册行为,外加基于探针的不变式测试套件。 +换来的是:任务注册表如今与全仓库通行的 seam 形态一致;持久化、远程或带插桩的注册表将是一个实现九个抽象方法的同级 Service Provider,这样的注册表落地时,任何生产方、控制器或 `JobKindMap` 扩展方都无需改动。Service Definition 的 README 陈述约定;生命周期簿记方面的事实归 Service Provider 的 README 所有。注册表行为测试套件(所有者清理、结算、等待、拆除)随 `dsh-jobs-local` 存放;Service Definition 包保留一个桩子类(stub subclass)测试,固定 `ctx.jobs` 下的注册行为与单一服务的重复注册行为,外加基于探针的不变式测试套件。 -代价是:多出一个包,即多一份 manifest(元数据清单)、tsconfig、README 与不变式配套插件;同时各组合必须点名 Service provider 包。`abstract` 在运行时会被擦除,而这个包名过去正是可挂载的具体注册表,因此直接挂载 Service Definition 时,其构造函数会明确报错——一条陈旧的组合配置行会在加载时得到「load a Service provider such as @deepseek-ai/dsh-jobs-local」,而不是一个未完整注册的 `ctx.jobs` 在远离错误配置处才失败。 +代价是:多出一个包,即多一份 manifest(元数据清单)、tsconfig、README 与不变式配套插件;同时各组合必须点名 Service Provider 包。`abstract` 在运行时会被擦除,而这个包名过去正是可挂载的具体注册表,因此直接挂载 Service Definition 时,其构造函数会明确报错——一条陈旧的组合配置行会在加载时得到「load a Service Provider such as @deepseek-ai/dsh-jobs-local」,而不是一个未完整注册的 `ctx.jobs` 在远离错误配置处才失败。 diff --git a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml index 03c1e1092e..8422759a46 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md -2026-07-26-subprocess-seam.md: f738c5be517d7f915cf5cb0f42506339259c62a2 -2026-07-26-subprocess-seam.zh.md: 078648d1d676f2d5889df4ec5793de687713cbb9 +2026-07-26-subprocess-seam.md: aa7a989a0321760c9bc278df8356a57f4dd0d459 +2026-07-26-subprocess-seam.zh.md: 22de6774b866b9b7a0248dc7b06587f7f3235fdc diff --git a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md index f738c5be51..aa7a989a03 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md +++ b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md @@ -13,7 +13,7 @@ English | [中文](2026-07-26-subprocess-seam.zh.md) A new `subprocess/` capability family owns "run and manage a process"; the bash family keeps "run a bash command" and consumes it: - **`@deepseek-ai/dsh-subprocess` (Service Definition)** — the abstract `SubprocessRuntime` owning `ctx.subprocess`: executable lookup, fully explicit ordinary spawns, and the terminal primitive added by the [portable execution-world decision](2026-07-28-portable-execution-world-consumers.md). Each stdio stream independently selects `'pipe'`, `'inherit'`, or bounded collection `{ maxBytes, spill? }`; stdin selects `'ignore'`, `'pipe'`, or `{ data }`. `SubprocessOutcome` carries exit facts with deliberately no timeout/cancel classification, while collected output remains on the handle after settlement. The Service Definition also owns process and terminal handles, the shared scrub, and `DSH_ENV_PREFIX`/`DshEnvironment`/`CollectedOutput`; `argv` is never shell-interpreted. -- **`@deepseek-ai/dsh-subprocess-local` (Service provider)** — `LocalSubprocessRuntime` over the former `run.ts` plumbing (`spawn.ts`) plus `node-pty`: detached groups, bounded collection and private spill files, executable lookup, foreground/session inspection, and disposal that terminates and joins every managed process. `terminate()` owns TERM→grace→KILL for the tree, `waitForExit()` observes tree liveness, and injected `taskkill /T` covers Windows. Ordinary and terminal spawns apply the Service Definition's case-insensitive `KEY`/`PASSWORD`/`SECRET`/`TOKEN` scrub before explicit env. The provider has no config; every limit arrives on the spec, while Bash and PTY presentation environment overrides stay in their Consumers. +- **`@deepseek-ai/dsh-subprocess-local` (Service Provider)** — `LocalSubprocessRuntime` over the former `run.ts` plumbing (`spawn.ts`) plus `node-pty`: detached groups, bounded collection and private spill files, executable lookup, foreground/session inspection, and disposal that terminates and joins every managed process. `terminate()` owns TERM→grace→KILL for the tree, `waitForExit()` observes tree liveness, and injected `taskkill /T` covers Windows. Ordinary and terminal spawns apply the Service Definition's case-insensitive `KEY`/`PASSWORD`/`SECRET`/`TOKEN` scrub before explicit env. The provider has no config; every limit arrives on the spec, while Bash and PTY presentation environment overrides stay in their Consumers. - **`dsh-bash-local` (Consumer)** — `inject: ['subprocess']`; maps each resolved `ShellExecSpec` onto a `SubprocessSpawnSpec` (`['bash', '-c', command]`), keeps its config, `resolve()` defaulting, fused-deadline `timedOut`/`aborted` classification, the `[stderr]`-marked background read merge with its consuming cursor, and the `onProcessDone` subclass hook. `dsh-bash-sandbox` is unchanged apart from redeclaring the inherited inject; it still wraps at the command-string level and re-enters the inherited spawn path. - **`dsh-shell` (Service Definition)** — re-exports the moved vocabulary from `dsh-subprocess`, so no bash Consumer changes an import; `ShellExecRequest`/`ShellExecSpec`/`ShellProcess` and the sandbox facts remain bash-owned. diff --git a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md index 078648d1d6..22de6774b8 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md @@ -13,7 +13,7 @@ Status: implemented 新的 `subprocess/` 能力家族拥有「运行并管理一个进程」;bash 家族保留「运行一条 bash 命令」,并成为前者的消费方: - **`@deepseek-ai/dsh-subprocess`(Service Definition)**——拥有 `ctx.subprocess` 的抽象 `SubprocessRuntime`:可执行文件查找、完全显式的普通 spawn,以及[可移植执行环境决策](2026-07-28-portable-execution-world-consumers.md)新增的终端原语。每条 stdio 流独立选择 `'pipe'`、`'inherit'` 或有界收集 `{ maxBytes, spill? }`;stdin 选择 `'ignore'`、`'pipe'` 或 `{ data }`。`SubprocessOutcome` 只承载刻意不含超时/取消分类的退出事实,收集输出在结算后仍留在句柄上。该 Service Definition 还拥有进程与终端句柄、共享凭据清除,以及 `DSH_ENV_PREFIX`/`DshEnvironment`/`CollectedOutput`;`argv` 绝不经过 shell 解释。 -- **`@deepseek-ai/dsh-subprocess-local`(Service provider)**——`LocalSubprocessRuntime` 构建在原 `run.ts` 管道(现为 `spawn.ts`)与 `node-pty` 之上:detached 进程组、有界收集与私有 spill 文件、可执行文件查找、前台/会话检查,以及终止每个受管进程并等待其退出的 dispose。`terminate()` 拥有面向进程树的 TERM→宽限→KILL,`waitForExit()` 观察进程树存活性,可注入的 `taskkill /T` 覆盖 Windows。普通与终端 spawn 都先应用 Service Definition 对 `KEY`/`PASSWORD`/`SECRET`/`TOKEN` 不区分大小写的清除,再合并显式 env。该 Service provider 没有配置;每项限制都随 spec 到达,Bash 与 PTY 的呈现环境覆盖仍归各自 Consumer 所有。 +- **`@deepseek-ai/dsh-subprocess-local`(Service Provider)**——`LocalSubprocessRuntime` 构建在原 `run.ts` 管道(现为 `spawn.ts`)与 `node-pty` 之上:detached 进程组、有界收集与私有 spill 文件、可执行文件查找、前台/会话检查,以及终止每个受管进程并等待其退出的 dispose。`terminate()` 拥有面向进程树的 TERM→宽限→KILL,`waitForExit()` 观察进程树存活性,可注入的 `taskkill /T` 覆盖 Windows。普通与终端 spawn 都先应用 Service Definition 对 `KEY`/`PASSWORD`/`SECRET`/`TOKEN` 不区分大小写的清除,再合并显式 env。该 Service Provider 没有配置;每项限制都随 spec 到达,Bash 与 PTY 的呈现环境覆盖仍归各自 Consumer 所有。 - **`dsh-bash-local`(Consumer)**——`inject: ['subprocess']`;把每个解析后的 `ShellExecSpec` 映射为一个 `SubprocessSpawnSpec`(`['bash', '-c', command]`),并保留自身配置、`resolve()` 默认值补全、基于融合 deadline 的 `timedOut`/`aborted` 分类、带 `[stderr]` 标记的后台读取合并及其消费游标,以及 `onProcessDone` 子类钩子。`dsh-bash-sandbox` 除了重新声明继承来的 inject 之外没有变化;它仍在命令字符串层面做包装,并重新进入继承的 spawn 路径。 - **`dsh-shell`(Service Definition)**——把迁走的词汇从 `dsh-subprocess` 重导出,因此没有任何 bash Consumer 需要改动导入;`ShellExecRequest`/`ShellExecSpec`/`ShellProcess` 与沙箱事实仍归 bash 所有。 diff --git a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml index 10e1fbef20..a81c4706e7 100644 --- a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md -2026-07-27-dispose-ladder-to-consumer.md: ab2afd313448438752e15e0f89230124cb95232f -2026-07-27-dispose-ladder-to-consumer.zh.md: b181b2c3286c42d85eb91ca9ac5acf624e5c7a28 +2026-07-27-dispose-ladder-to-consumer.md: 58d835864d2f6544152fdf09cf6e93380793a2ae +2026-07-27-dispose-ladder-to-consumer.zh.md: dc7413e85fa6e52de14f51fd175c7b37b43029a4 diff --git a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md index ab2afd3134..58d835864d 100644 --- a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md +++ b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md @@ -14,10 +14,10 @@ The ladder moves to its one consumer. `dsh-subagent-acp` owns `disposeAcpChild(c ## Alternatives considered -**Keep the ladder on the handle as a convenience.** Rejected: a Service Definition method every Service provider must implement is not a convenience, it is contract surface — and this one encodes one consumer's cooperation shape (stdin-EOF-first) as if it were process vocabulary. The seam's own README already had to caveat that children quiescing on other signals need "their own tier-1", which is the admission that the ladder is policy. +**Keep the ladder on the handle as a convenience.** Rejected: a Service Definition method every Service Provider must implement is not a convenience, it is contract surface — and this one encodes one consumer's cooperation shape (stdin-EOF-first) as if it were process vocabulary. The seam's own README already had to caveat that children quiescing on other signals need "their own tier-1", which is the admission that the ladder is policy. **Move the ladder to a shared helper package.** Rejected: one consumer. A second out-of-process backend with the same stdin-EOF cooperation shape can lift `disposeAcpChild` to shared code when it exists; extracting now would recreate `dsh-subagent-subprocess`, the single-purpose library this change deleted. ## Consequences -Bought: the Service Definition is one method and one type smaller; Service providers owe four verbs and no teardown policy; the cooperative EOF window lives beside the ACP config field that tunes it, while the subprocess owner alone owns the termination window and final join. Cost: a future backend wanting EOF-first teardown writes ~20 lines against the verbs (or lifts the ACP helper); the ladder's tier tests live in the ACP suite, and the Service Definition suite pins the verbs the ladder composes (bounded `waitForExit` false before escalation and an unbounded whole-tree join after it) instead of the composed policy. +Bought: the Service Definition is one method and one type smaller; Service Providers owe four verbs and no teardown policy; the cooperative EOF window lives beside the ACP config field that tunes it, while the subprocess owner alone owns the termination window and final join. Cost: a future backend wanting EOF-first teardown writes ~20 lines against the verbs (or lifts the ACP helper); the ladder's tier tests live in the ACP suite, and the Service Definition suite pins the verbs the ladder composes (bounded `waitForExit` false before escalation and an unbounded whole-tree join after it) instead of the composed policy. diff --git a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md index b181b2c328..dc7413e85f 100644 --- a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md @@ -14,10 +14,10 @@ Status: implemented ## 曾考虑的替代方案 -**把阶梯作为便利方法留在句柄上。**否决:一个每个 Service provider 都必须实现的 Service Definition 方法不是便利,而是约定的一部分——而这一个把某一消费方的协作模式(stdin EOF 打头)当作进程词汇来编码。seam 自己的 README 早已不得不加注「依赖其他信号才能完全停稳的子进程需要自己的第一阶」,这本身就是承认该阶梯是策略。 +**把阶梯作为便利方法留在句柄上。**否决:一个每个 Service Provider 都必须实现的 Service Definition 方法不是便利,而是约定的一部分——而这一个把某一消费方的协作模式(stdin EOF 打头)当作进程词汇来编码。seam 自己的 README 早已不得不加注「依赖其他信号才能完全停稳的子进程需要自己的第一阶」,这本身就是承认该阶梯是策略。 **把阶梯移到共享辅助包。**否决:只有一个消费方。当第二个具有相同 stdin EOF 协作模式的进程外后端出现时,可以再把 `disposeAcpChild` 提升为共享代码;现在抽取只会重造 `dsh-subagent-subprocess`——本次变更删掉的那个单一用途库。 ## 后果 -买到的:Service Definition 少了一个方法和一个类型;Service provider 只欠四个动词,不欠拆卸策略;协作式 EOF 时间窗与调节它的 ACP 配置字段住在一起,而终止时间窗与最终的整树退出等待仅由子进程责任方拥有。代价:未来想要 EOF 打头拆卸的后端需针对这些动词写约 20 行(或直接搬 ACP 的辅助函数);阶梯的层级测试位于 ACP 套件,Service Definition 套件转而钉住阶梯所组合的动词(升级前有界 `waitForExit` 返回假,升级后无界等待整棵进程树退出),而非组合后的策略。 +买到的:Service Definition 少了一个方法和一个类型;Service Provider 只欠四个动词,不欠拆卸策略;协作式 EOF 时间窗与调节它的 ACP 配置字段住在一起,而终止时间窗与最终的整树退出等待仅由子进程责任方拥有。代价:未来想要 EOF 打头拆卸的后端需针对这些动词写约 20 行(或直接搬 ACP 的辅助函数);阶梯的层级测试位于 ACP 套件,Service Definition 套件转而钉住阶梯所组合的动词(升级前有界 `waitForExit` 返回假,升级后无界等待整棵进程树退出),而非组合后的策略。 diff --git a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml index 32746bd58f..bcb20fd6c8 100644 --- a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md -2026-07-31-code-runtime-portable-identifier-seam.md: 7692660c5577a9d647e8c55c8e808c1293d03e4f -2026-07-31-code-runtime-portable-identifier-seam.zh.md: 668fb46a80737d0cbf0ea79e820f1baeb17c4a5c +2026-07-31-code-runtime-portable-identifier-seam.md: 6d75f0b0872a5d4b92403f597f5551276e2d7c9f +2026-07-31-code-runtime-portable-identifier-seam.zh.md: 68515d7a4d9d26d6c510654255d36b615afc2b7d diff --git a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md index 7692660c55..6d75f0b087 100644 --- a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md +++ b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md @@ -8,11 +8,11 @@ English | [中文](2026-07-31-code-runtime-portable-identifier-seam.zh.md) The code-runtime seam promises that a binding-namespace list valid on one backend is valid on every backend, so a Code Mode consumer can hand the same bindings to any registered runtime without knowing its language. The first backend, `dsh-code-runtime-worker-thread`, privately owned the identifier rules that enforce part of that promise: an `IDENTIFIER` regex that allowed the JS-only `$`, a `RESERVED_WORDS` set holding only ECMAScript keywords, and a `RESERVED_ERROR_PROPERTIES` set of three JS `Error` slots. Those rules described the worker's own language, not the seam's portability contract. -A second backend written against a different language (CPython) would either re-declare its own rules — letting `lambda` pass the worker and fail Python, or `$tools` pass the worker and fail every non-JS backend — or import the worker's, inverting the dependency so a Service provider reached into a sibling Service provider. Neither keeps the portability promise real: it would hold only for the backend a caller happened to test against. +A second backend written against a different language (CPython) would either re-declare its own rules — letting `lambda` pass the worker and fail Python, or `$tools` pass the worker and fail every non-JS backend — or import the worker's, inverting the dependency so a Service Provider reached into a sibling Service Provider. Neither keeps the portability promise real: it would hold only for the backend a caller happened to test against. ## Decision -The Service Definition package (`@deepseek-ai/dsh-code-runtime`) exports the portable-identifier exclusion contract as four named constants, and every Service provider imports them rather than re-declaring: +The Service Definition package (`@deepseek-ai/dsh-code-runtime`) exports the portable-identifier exclusion contract as four named constants, and every Service Provider imports them rather than re-declaring: - `PORTABLE_RESERVED_WORDS` — the union of ECMAScript and Python reserved words. A namespace global or error-class name matching any is refused on all backends, so `lambda` is refused even though it is a legal JS parameter name. Adding a language widens this union, which is a deliberate breaking review of existing binding names. - `RESERVED_BINDING_GLOBALS` — globals some backend owns in the program's namespace: `console` (the worker's log capture), `__dsh_main__`/`__builtins__`/`__name__` (the Python bootstrap's wrapper and seeded module globals), and `__debug__` (not a seeded slot but a CPython compile-time constant that rejects assignment, so an injected global under that name is unreachable — the same portability split by a different mechanism). Refused everywhere so a namespace list cannot pick a name that works on one backend and collides on another. @@ -21,7 +21,7 @@ The Service Definition package (`@deepseek-ai/dsh-code-runtime`) exports the por The Service Definition also narrows the portable identifier subset to `[A-Za-z_][A-Za-z0-9_]*` (documented on `CodeBindingNamespace.global` and `CodeBindingErrorClass`), dropping the JS-only `$`. The worker consumes the shared constants directly under their exported names — `PORTABLE_RESERVED_WORDS` for both binding-global and error-class names, `RESERVED_BINDING_GLOBALS` for backend-owned slots, `RESERVED_ERROR_MEMBERS` plus `DUNDER_MEMBER` for error members — with no local re-alias; its `IDENTIFIER` regex loses `$`. -The constants live in the Service Definition even though the worker is the only shipped backend: the whole point is that the contract is language-agnostic and owned above any single language. A Service provider that violated it would be the bug, and the shared set is where a reviewer looks to see what "portable" means. +The constants live in the Service Definition even though the worker is the only shipped backend: the whole point is that the contract is language-agnostic and owned above any single language. A Service Provider that violated it would be the bug, and the shared set is where a reviewer looks to see what "portable" means. ## Scope @@ -33,7 +33,7 @@ This decision delivers only the Service Definition extension and the worker's ad **Each backend declares its own exclusions.** Rejected: it makes the portability promise per-backend. A binding list the caller tested on the worker could be refused by Python, which is exactly the split the seam exists to prevent. -**The Python backend imports the worker's constants.** Rejected: it inverts the dependency — the seam's Service providers would reach into a sibling implementation for a contract neither owns. The contract belongs above both, at the seam. +**The Python backend imports the worker's constants.** Rejected: it inverts the dependency — the seam's Service Providers would reach into a sibling implementation for a contract neither owns. The contract belongs above both, at the seam. **Keep `$` in the portable identifier subset.** Rejected: `$` is JS-only spelling. Allowing it would let `$tools` pass the worker and fail every non-JS backend, breaking portability for a purely cosmetic gain. diff --git a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md index 668fb46a80..68515d7a4d 100644 --- a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md @@ -8,11 +8,11 @@ Status: implemented code-runtime seam 承诺:在一个后端上有效的绑定命名空间列表,在每个后端上都有效,因此 Code Mode 消费方可以把同一组绑定交给任何已注册的运行时,而不必知道它的语言。首个后端 `dsh-code-runtime-worker-thread` 私自拥有了执行这项承诺一部分的标识符规则:一个允许 JS 专有 `$` 的 `IDENTIFIER` 正则、一个只含 ECMAScript 关键字的 `RESERVED_WORDS` 集合,以及一个含三个 JS `Error` 槽位的 `RESERVED_ERROR_PROPERTIES` 集合。这些规则描述的是 worker 自身的语言,而非 seam 的可移植性约定。 -一个针对不同语言(CPython)编写的第二后端,要么重新声明自己的规则——让 `lambda` 通过 worker 却在 Python 上失败,或让 `$tools` 通过 worker 却在每个非 JS 后端上失败——要么导入 worker 的规则,从而反转依赖,使一个 Service provider 伸手进入另一个兄弟 Service provider。二者都无法让可移植承诺成真:它只对调用方恰好测试过的那个后端成立。 +一个针对不同语言(CPython)编写的第二后端,要么重新声明自己的规则——让 `lambda` 通过 worker 却在 Python 上失败,或让 `$tools` 通过 worker 却在每个非 JS 后端上失败——要么导入 worker 的规则,从而反转依赖,使一个 Service Provider 伸手进入另一个兄弟 Service Provider。二者都无法让可移植承诺成真:它只对调用方恰好测试过的那个后端成立。 ## Decision -Service Definition 包(`@deepseek-ai/dsh-code-runtime`)以四个具名常量导出可移植标识符排除约定,每个 Service provider 导入它们而非重新声明: +Service Definition 包(`@deepseek-ai/dsh-code-runtime`)以四个具名常量导出可移植标识符排除约定,每个 Service Provider 导入它们而非重新声明: - `PORTABLE_RESERVED_WORDS`——ECMAScript 与 Python 保留字的联集。任何命名空间 global 或 error-class 名称匹配其中之一,都在所有后端上被拒绝,因此 `lambda` 即便是合法的 JS 参数名也被拒绝。新增一门语言即扩宽此联集,这是对现有绑定名称的一次有意的破坏性复审。 - `RESERVED_BINDING_GLOBALS`——某个后端在程序命名空间中拥有的 global:`console`(worker 的日志捕获)、`__dsh_main__`/`__builtins__`/`__name__`(Python bootstrap 的包装器与预置模块 global),以及 `__debug__`(不是 seed 的槽位,而是 CPython 编译期常量,赋值会被拒,故以该名注入的 global 不可达——同一种可移植性分裂,只是机制不同)。在所有后端上被拒绝,使命名空间列表无法选到一个在某后端能用、在另一后端冲突的名称。 @@ -21,7 +21,7 @@ Service Definition 包(`@deepseek-ai/dsh-code-runtime`)以四个具名常量 Service Definition 同时把可移植标识符子集收窄为 `[A-Za-z_][A-Za-z0-9_]*`(记录在 `CodeBindingNamespace.global` 与 `CodeBindingErrorClass` 上),去掉 JS 专有的 `$`。worker 直接以这些常量的导出名称消费它们——binding-global 与 error-class 名称用 `PORTABLE_RESERVED_WORDS`、后端拥有槽位用 `RESERVED_BINDING_GLOBALS`、error member 用 `RESERVED_ERROR_MEMBERS` 加 `DUNDER_MEMBER`——不再本地起别名;其 `IDENTIFIER` 正则去掉 `$`。 -尽管 worker 是唯一已交付的后端,这些常量仍置于 Service Definition:要点正是该约定与语言无关,且由高于任何单一语言的层级拥有。违反它的 Service provider 才是 bug,而共享集合正是复审者查看「可移植」含义的地方。 +尽管 worker 是唯一已交付的后端,这些常量仍置于 Service Definition:要点正是该约定与语言无关,且由高于任何单一语言的层级拥有。违反它的 Service Provider 才是 bug,而共享集合正是复审者查看「可移植」含义的地方。 ## Scope @@ -33,7 +33,7 @@ Service Definition 同时把可移植标识符子集收窄为 `[A-Za-z_][A-Za-z0 **每个后端声明自己的排除集。** 拒绝:这让可移植承诺变成逐后端成立。调用方在 worker 上测过的绑定列表可能被 Python 拒绝,而这正是 seam 存在要防止的分裂。 -**Python 后端导入 worker 的常量。** 拒绝:这反转依赖——seam 的 Service provider 会为一个二者都不拥有的约定伸手进入兄弟实现。约定属于二者之上,即 seam。 +**Python 后端导入 worker 的常量。** 拒绝:这反转依赖——seam 的 Service Provider 会为一个二者都不拥有的约定伸手进入兄弟实现。约定属于二者之上,即 seam。 **在可移植标识符子集中保留 `$`。** 拒绝:`$` 是 JS 专有拼写。允许它会让 `$tools` 通过 worker 却在每个非 JS 后端上失败,为纯粹表面的好处破坏可移植性。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml index 61be0dddfb..290ede1714 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.md 2026-08-11-bounded-background-job-admission.md: 8fa5bec07647947b730c436284da71b83deedb48 -2026-08-11-bounded-background-job-admission.zh.md: d827e07aacc7bc933474577214d94bab9fe5f5c3 +2026-08-11-bounded-background-job-admission.zh.md: 79e759041cbf9d6e12b444f47e9d9ef0aa218532 diff --git a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md index d827e07aac..79e759041c 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md @@ -12,7 +12,7 @@ Status: implemented ## 决策 -`LocalJobRegistry` 拥有 `maxConcurrentJobsPerOwner` 配置字段。它只接受正的安全整数,默认值为 `10`,并通过 Service provider 的 Cordis schema、typed `agent-spine-demo` 组合包与 ACP 应用配置提供。组合包只传输该值;其含义归进程内 Service provider 所有。 +`LocalJobRegistry` 拥有 `maxConcurrentJobsPerOwner` 配置字段。它只接受正的安全整数,默认值为 `10`,并通过 Service Provider 的 Cordis schema、typed `agent-spine-demo` 组合包与 ACP 应用配置提供。组合包只传输该值;其含义归进程内 Service Provider 所有。 [通用任务运行时决策](../architecture/2026-06-20-generic-long-running-tool-runtime.md)拥有共享 Task 生命周期与控制 API;本记录只拥有进程内准入策略。 @@ -34,7 +34,7 @@ owner 与服务释放保留现有顺序:请求取消,在生产方释放资 ## 验证 -任务 Service provider 测试覆盖默认与显式上限、生产方执行前拒绝、id 计数器不变、`stopping` 占位、每种终态释放、确切 owner 隔离、同会话替代对象、共享无 owner 桶、非法配置、owner 清理和服务拆除。spine 与 ACP 组合测试固定 typed 转发。一条 keyless ACP 回放以 1 为上限启动真实 Loader 组合,启动一个真实后台 Bash 进程,观察第二次启动返回可操作错误,按返回的 job id 停止第一个任务,并验证被拒绝生产方的标记文件从未生成。 +任务 Service Provider 测试覆盖默认与显式上限、生产方执行前拒绝、id 计数器不变、`stopping` 占位、每种终态释放、确切 owner 隔离、同会话替代对象、共享无 owner 桶、非法配置、owner 清理和服务拆除。spine 与 ACP 组合测试固定 typed 转发。一条 keyless ACP 回放以 1 为上限启动真实 Loader 组合,启动一个真实后台 Bash 进程,观察第二次启动返回可操作错误,按返回的 job id 停止第一个任务,并验证被拒绝生产方的标记文件从未生成。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml b/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml index da4b80d9d5..7b213dc96f 100644 --- a/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-06-15-code-mode.md -2026-06-15-code-mode.md: adabf80ab03bdae57bba84957cdacf648c16c2f6 -2026-06-15-code-mode.zh.md: 24d83b9f896a73b449852d28c3e0a376fb6ace5a +2026-06-15-code-mode.md: dbf77557c9f1aa59deed443b74ca3ef83137d773 +2026-06-15-code-mode.zh.md: 6f263d946cf7632a0747dcb61f3dd22105e21e0c diff --git a/.agents/notes/implemented/feature/2026-06-15-code-mode.md b/.agents/notes/implemented/feature/2026-06-15-code-mode.md index adabf80ab0..dbf77557c9 100644 --- a/.agents/notes/implemented/feature/2026-06-15-code-mode.md +++ b/.agents/notes/implemented/feature/2026-06-15-code-mode.md @@ -19,7 +19,7 @@ Tool presentation belongs to the registry that owns tool visibility: implementin Three decisions, each elaborated in its own section below: 1. **Code Mode is a first-class presentation mode of `ToolRuntime`** (`dsh-tools`), selected by a validated `mode` config: `'native'` (the default, contributing the visible capability schemas), `'code'` (the registry contributes only its reserved `run_code` transport plus a generated SDK `.d.ts` in the system prompt), or `'both'` (native schemas and the transport + SDK). The registry constructs its canonical contribution at the source; the cooperative prompt-assembly result remains authoritative, and the logged request header records exactly that returned presentation. -2. **Code execution is a capability seam** — `packages/code-runtime/` contains the Service Definition package `@deepseek-ai/dsh-code-runtime`, which owns `ctx.codeRuntime` ([capability seams](../architecture/2026-06-13-capability-seams.md); Consumer = `dsh-tools`, with core-consumes-a-seam precedent in `agent-loop` → `dsh-llm`). The runtime knows nothing about tools: it is handed a program and named async bindings, runs the program, and reports `{ value, logs, error? }`. Language and substrate are backend properties, so a future Python or container backend is another Service provider package, not a redesign. +2. **Code execution is a capability seam** — `packages/code-runtime/` contains the Service Definition package `@deepseek-ai/dsh-code-runtime`, which owns `ctx.codeRuntime` ([capability seams](../architecture/2026-06-13-capability-seams.md); Consumer = `dsh-tools`, with core-consumes-a-seam precedent in `agent-loop` → `dsh-llm`). The runtime knows nothing about tools: it is handed a program and named async bindings, runs the program, and reports `{ value, logs, error? }`. Language and substrate are backend properties, so a future Python or container backend is another Service Provider package, not a redesign. 3. **The shipped implementation is `@deepseek-ai/dsh-code-runtime-worker-thread`**: one fresh Node worker thread per run, executing the model's TypeScript after type-strip, with bindings bridged over the message port, an empty environment, configurable heap/output/time caps, and hard termination. Its trust posture is bash-equivalent by design — no unsafe-acknowledgement flags — because the harness already ships `dsh-bash-local`, which executes arbitrary model-written shell commands with strictly *more* ambient authority. This note owns Code Mode's presentation, composition, isolation, and settlement foundation. The later [typed tool-return Agent Note](2026-07-20-code-mode-typed-tool-returns.md) owns the generated output map, canonical binding values, `ToolCallError`, and the lossless outer-output boundary. diff --git a/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md b/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md index 24d83b9f89..6f263d946c 100644 --- a/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md +++ b/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md @@ -19,7 +19,7 @@ Cloudflare 的 [Code Mode](https://blog.cloudflare.com/code-mode/) 提出了一 三项决策,各自在下方独立小节中展开: 1. **Code Mode 是 `ToolRuntime`(`dsh-tools`)的一等呈现模式**,通过经校验的 `mode` 配置选择:`'native'`(默认,贡献可见能力 schema)、`'code'`(注册表仅贡献其保留的 `run_code` 传输通道加一份生成的 SDK `.d.ts` 到系统提示词中)或 `'both'`(原生 schema 加传输通道 + SDK)。注册表在源头构建其规范贡献;协作式提示词组装的结果仍具权威性,记录在日志中的请求头精确反映该返回的呈现。 -2. **代码执行是一个能力 seam**——`packages/code-runtime/` 包含 Service Definition 包 `@deepseek-ai/dsh-code-runtime`,拥有 `ctx.codeRuntime`([能力 seam](../architecture/2026-06-13-capability-seams.md);消费方 = `dsh-tools`,core 消费 seam 的先例见 `agent-loop` → `dsh-llm`)。运行时对工具一无所知:它接收一段程序和命名的异步绑定,执行程序,报告 `{ value, logs, error? }`。语言和基底是后端属性,因此未来的 Python 或容器后端只是另一个 Service 提供方包,而非重新设计。 +2. **代码执行是一个能力 seam**——`packages/code-runtime/` 包含 Service Definition 包 `@deepseek-ai/dsh-code-runtime`,拥有 `ctx.codeRuntime`([能力 seam](../architecture/2026-06-13-capability-seams.md);消费方 = `dsh-tools`,core 消费 seam 的先例见 `agent-loop` → `dsh-llm`)。运行时对工具一无所知:它接收一段程序和命名的异步绑定,执行程序,报告 `{ value, logs, error? }`。语言和基底是后端属性,因此未来的 Python 或容器后端只是另一个 Service Provider 包,而非重新设计。 3. **交付的实现是 `@deepseek-ai/dsh-code-runtime-worker-thread`**:每次运行 spawn 一个全新的 Node worker 线程,对模型的 TypeScript 进行 type-strip 后执行,绑定通过消息端口桥接,环境为空,堆/输出/时间上限可配置,并支持硬终止。其信任姿态在设计上等同于 bash——无需 unsafe-acknowledgement flag——因为 harness 已经交付了 `dsh-bash-local`,后者以严格*更高*的环境权限执行模型编写的任意 shell 命令。 本说明负责定义 Code Mode 的呈现、组合、隔离与结算基础。后续的[类型化工具返回值 Agent Note](2026-07-20-code-mode-typed-tool-returns.md)负责定义生成的输出映射、规范绑定值、`ToolCallError` 和无损外层输出边界。 diff --git a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml index dcb4d5e33a..1870906b95 100644 --- a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md -2026-06-18-compaction-capability-seam.md: 77ccd615a20524fad2a1ee47130ba2837d83c663 -2026-06-18-compaction-capability-seam.zh.md: a18e7593a5b654685a2e033dd2f0a721da74502e +2026-06-18-compaction-capability-seam.md: 71ea7144cd843364fd77db0dd2c8a0d1e8bab1ac +2026-06-18-compaction-capability-seam.zh.md: bd7ab06b3a012d83d3f918a3ebd5a553624780e9 diff --git a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md index 77ccd615a2..71ea7144cd 100644 --- a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md +++ b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md @@ -14,7 +14,7 @@ Two forces shape the design. First, compaction policy and reusable token measure ## Decision -### Compaction is a capability seam with separate Service Definition and Service provider roles +### Compaction is a capability seam with separate Service Definition and Service Provider roles Per the [capability-seams Agent Note](../architecture/2026-06-13-capability-seams.md), compaction ships as separate packages so the contract, the algorithm, and (later) the consumer API evolve independently: diff --git a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md index a18e7593a5..bd7ab06b3a 100644 --- a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md +++ b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md @@ -14,7 +14,7 @@ Status: implemented ## 决策 -### 压缩是一个能力 seam,Service Definition 与 Service 提供方角色分离 +### 压缩是一个能力 seam,Service Definition 与 Service Provider 角色分离 遵循[能力 seam Agent Note](../architecture/2026-06-13-capability-seams.md),压缩以独立包发布,使约定、算法和(后续的)消费方 API 各自独立演进: diff --git a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml index 431665bbb7..e8ece4d624 100644 --- a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md -2026-06-21-subagent-capability-seam.md: 337e1f8aaf8db8b9d41bbf0ad02f7f8a9468e4fb -2026-06-21-subagent-capability-seam.zh.md: f88ad5cfba5b7f364064ad6b82fc918bdf5d7ef3 +2026-06-21-subagent-capability-seam.md: fa3b4f570bfccdc849a38b3eda16c1c8dd7b1827 +2026-06-21-subagent-capability-seam.zh.md: b25fe64377f98af92dbccb87f755627926975ef2 diff --git a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md index 337e1f8aaf..fa3b4f570b 100644 --- a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md +++ b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md @@ -21,7 +21,7 @@ The harness has a long-deferred seam for **subagents** — an agent delegating w ### Why not the bash seam shape -The bash seam ([capability seams](../architecture/2026-06-13-capability-seams.md)) registers exactly one `ShellExecutor` per context; loading a second throws. That is correct for bash (one machine, one way to run a command) but wrong here: coexistence is the requirement. So the subagent service is a **named-provider registry** — each implementation registers under a unique name and a caller picks one by name — mirroring the **LLM adapter registry** (`LlmRuntime.registerAdapter`), not the single-service bash executor. The seam is still three-package (Service Definition / Service provider / Consumer); only the "one vs. many implementations" axis differs. +The bash seam ([capability seams](../architecture/2026-06-13-capability-seams.md)) registers exactly one `ShellExecutor` per context; loading a second throws. That is correct for bash (one machine, one way to run a command) but wrong here: coexistence is the requirement. So the subagent service is a **named-provider registry** — each implementation registers under a unique name and a caller picks one by name — mirroring the **LLM adapter registry** (`LlmRuntime.registerAdapter`), not the single-service bash executor. The seam is still three-package (Service Definition / Service Provider / Consumer); only the "one vs. many implementations" axis differs. ## Decision diff --git a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md index f88ad5cfba..b25fe64377 100644 --- a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md +++ b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md @@ -21,7 +21,7 @@ harness 有一个长期搁置的 seam 用于 **subagent**:一个 agent 将工 ### 为何不采用 bash seam 的形状 -bash seam([能力 seam](../architecture/2026-06-13-capability-seams.md))在每个上下文中只注册恰好一个 `ShellExecutor`;加载第二个会抛异常。这对 bash 是正确的(一台机器、一种执行命令的方式),但对这里是错误的:共存才是需求。因此 subagent 服务是一个**命名提供方注册表**——每个实现以唯一名称注册,调用方按名称选择——镜像 **LLM(大语言模型)适配器注册表**(`LlmRuntime.registerAdapter`),而非单服务的 bash 执行器。seam 仍然是由三类包构成的结构(Service Definition / Service provider / Consumer);只是「一个 vs. 多个实现」这个维度不同。 +bash seam([能力 seam](../architecture/2026-06-13-capability-seams.md))在每个上下文中只注册恰好一个 `ShellExecutor`;加载第二个会抛异常。这对 bash 是正确的(一台机器、一种执行命令的方式),但对这里是错误的:共存才是需求。因此 subagent 服务是一个**命名提供方注册表**——每个实现以唯一名称注册,调用方按名称选择——镜像 **LLM(大语言模型)适配器注册表**(`LlmRuntime.registerAdapter`),而非单服务的 bash 执行器。seam 仍然是由三类包构成的结构(Service Definition / Service Provider / Consumer);只是「一个 vs. 多个实现」这个维度不同。 ## 决策 diff --git a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml index 948301ca44..d066d73db4 100644 --- a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md -2026-07-05-dynamic-workflows.md: bf7b98891d19c31be7e1ca2763f98bb3668ab659 -2026-07-05-dynamic-workflows.zh.md: f3c06ae17e7cf185865d03e261e4e6bbabcabd1f +2026-07-05-dynamic-workflows.md: eff37365534cd41e46c98e20a5e763a233330647 +2026-07-05-dynamic-workflows.zh.md: 15aa8326958faebb53d33153b1c1537af199a4c5 diff --git a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md index bf7b98891d..eff3736553 100644 --- a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md +++ b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md @@ -10,7 +10,7 @@ The harness can delegate ONE task to ONE child (`dsh-tool-subagent`), but work t ## Decision -A workflow capability family at `packages/workflow/` in the bash seam shape (Service Definition / Service provider / Consumer), plus the structured-output foundation it needs on the subagent seam. +A workflow capability family at `packages/workflow/` in the bash seam shape (Service Definition / Service Provider / Consumer), plus the structured-output foundation it needs on the subagent seam. ### The script contract (Claude Code-compatible) diff --git a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md index f3c06ae17e..15aa832695 100644 --- a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md +++ b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md @@ -10,7 +10,7 @@ harness 可以通过 `dsh-tool-subagent` 将一个任务委派给一个子 agent ## 决策 -在 `packages/workflow/` 下以 bash seam 的形态(Service Definition/Service provider/Consumer)提供一组工作流能力,以及它在 subagent seam 上所需的结构化输出基础。 +在 `packages/workflow/` 下以 bash seam 的形态(Service Definition/Service Provider/Consumer)提供一组工作流能力,以及它在 subagent seam 上所需的结构化输出基础。 ### 脚本约定(兼容 Claude Code) diff --git a/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml b/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml index 1033d13843..b04c952748 100644 --- a/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-06-approval-seam.md -2026-07-06-approval-seam.md: 5c62a175b0a96ecc8dd3f5b09b618b8e4d5e7612 -2026-07-06-approval-seam.zh.md: 091db8347e0a5bd5ee475809dde6b90d183d3112 +2026-07-06-approval-seam.md: ace41ebbb94cc24c2fdd3e7ae2d3a69b28b169af +2026-07-06-approval-seam.zh.md: 3e06c3ba26dd6d85555727dc0c62cbffe0a2a1da diff --git a/.agents/notes/implemented/feature/2026-07-06-approval-seam.md b/.agents/notes/implemented/feature/2026-07-06-approval-seam.md index 5c62a175b0..ace41ebbb9 100644 --- a/.agents/notes/implemented/feature/2026-07-06-approval-seam.md +++ b/.agents/notes/implemented/feature/2026-07-06-approval-seam.md @@ -97,7 +97,7 @@ Snapshots record allowed and rejected sandbox escalation through `session/reques - **An inline `tools/pre-execute` permission gate in the ACP bridge** — rejected: prompting for every bridge-owned call hardwires the asking policy into the transport, cannot serve a second asker (sandbox escalation happens after execution starts, with no pre-execute moment), and leaves hook-produced `ask` decisions without a shared mechanism. - **The generic user-questions seam (`ctx.userQuestions`)** — rejected as the approval mechanism: the two share a skeleton (route by agent, block for a human, handle absence), but approval's contract is narrower in every dimension that matters: a closed outcome vocabulary instead of free text, a protocol-native prompt attached to a tool call instead of a generic form, mandatory fail-closed absence, and audit events. Approval therefore does not ride the shipped `packages/interaction/user-questions` / `ask_user_question` elicitation path — an elicitation form is not a permission prompt, and a free-text answer is not a closed outcome; sharing provider plumbing stays open if the two ever converge. - **Static optional injection in `dsh-tools`** — rejected: the vendored cordis `Inject` type has no optional flag — the object form maps service names to intercept config, and a declared inject gates the fiber. `ctx.get('approval')` is the documented opportunistic-consumption pattern (the `tool-bash` owner-token lookup, the loop's persistence probe), reads presence per call, and degrades correctly across HMR without extra machinery. -- **The capability-seam three-package split** — rejected: Service Definition / Service provider / Consumer fits a seam whose Service provider is swappable (bash-local vs bash-sandbox). Here the service body is fixed mechanism and the variable part is listeners that live with their owners — splitting would manufacture a Service provider package with nothing in it ("don't split preemptively"). +- **The capability-seam three-package split** — rejected: Service Definition / Service Provider / Consumer fits a seam whose Service Provider is swappable (bash-local vs bash-sandbox). Here the service body is fixed mechanism and the variable part is listeners that live with their owners — splitting would manufacture a Service Provider package with nothing in it ("don't split preemptively"). - **Offering `allow_always` now** — rejected: the protocol can express it, but honoring it means designing grant storage, scope identity, and revocation (§ Deferred). Advertising an option the harness cannot honor manufactures doomed grants. ## Consequences diff --git a/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md b/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md index 091db8347e..3e06c3ba26 100644 --- a/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md +++ b/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md @@ -97,7 +97,7 @@ ACP 桥只应答其会话映射所拥有的精确 agent 对象。它携带既有 - **在 ACP 桥中内联 `tools/pre-execute` 权限门禁**:否决。对桥拥有的每次调用都弹出提示,会将请求策略硬编码进传输层,无法服务第二个发起方(沙箱升级发生在执行开始之后,没有 pre-execute 时刻),且钩子产生的 `ask` 决策没有共享机制。 - **通用用户交互 seam(`ctx.userQuestions`)**:否决作为审批机制。二者骨架相似(按 agent 路由、阻塞等待人类、处理缺失),但审批的约定在每个关键维度上都更窄:封闭的结果词汇而非自由文本、附着在工具调用上的协议原生提示而非通用表单、强制的缺失时失败关闭、以及审计事件。因此审批不走已交付的 `packages/interaction/user-questions` / `ask_user_question` 信息征集路径——信息征集表单不是权限提示,自由文本应答不是封闭结果;如果二者将来趋同,共享提供方管道仍然开放。 - **`dsh-tools` 中的静态可选注入**:否决。vendor 的 Cordis `Inject` 类型没有 optional 标志——对象形式将服务名映射到拦截配置,声明的 inject 会阻塞 fiber。`ctx.get('approval')` 是文档化的机会性消费模式(`tool-bash` 的 owner-token 查找、loop 的持久化探测),按调用读取存在性,跨 HMR 正确降级,无需额外机制。 -- **能力 seam 的三包拆分**:否决。Service Definition/Service provider/Consumer 适合 Service provider 可替换的 seam(bash-local vs bash-sandbox)。此处服务体是固定机制,可变部分是留在各自通道拥有者插件中的监听器——拆分只会制造一个空的 Service provider 包(「不要预防性拆分」)。 +- **能力 seam 的三包拆分**:否决。Service Definition/Service Provider/Consumer 适合 Service Provider 可替换的 seam(bash-local vs bash-sandbox)。此处服务体是固定机制,可变部分是留在各自通道拥有者插件中的监听器——拆分只会制造一个空的 Service Provider 包(「不要预防性拆分」)。 - **现在就提供 `allow_always`**:否决。协议能表达它,但兑现它意味着设计授权存储、作用域标识和撤销(§ 延后)。展示 harness 无法兑现的选项只会制造注定失败的授权。 ## 后果 diff --git a/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml b/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml index b3cba4dcb8..3cf7133534 100644 --- a/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-06-sandbox.md -2026-07-06-sandbox.md: 76733c619e3e34a6ee49c80aaf5c3bd4d48d82f7 -2026-07-06-sandbox.zh.md: 36ecbadd0589b4859389961aa52181de3f034dcc +2026-07-06-sandbox.md: 62c46c99a2283b03cf75d8823783367dd6b3473a +2026-07-06-sandbox.zh.md: 82c2e7962800c007a207f0204bf47cef01f79a36 diff --git a/.agents/notes/implemented/feature/2026-07-06-sandbox.md b/.agents/notes/implemented/feature/2026-07-06-sandbox.md index 76733c619e..62c46c99a2 100644 --- a/.agents/notes/implemented/feature/2026-07-06-sandbox.md +++ b/.agents/notes/implemented/feature/2026-07-06-sandbox.md @@ -54,7 +54,7 @@ OS subprocess confinement applies to the bash executor, including hook commands, Policy rides each CALL, not the provider: two consumers may confine under different policies at the same instant (bash under `read-only` while a confined child agent keeps its state directory writable), and an approved escalated retry is a new call with a wider policy — inexpressible under a config-fixed provider mode. -The seam confines SAME-WORLD subprocesses only: a backend shares the host's filesystem and kernel. Containers, microVMs, and remote executors are NOT backends of this seam — they replace the Service providers for whole capability seams (`ctx.shell`, `ctx.fs`) as environment-coherent groups, because an agent whose bash runs in a container while its fs tools write the host lives in two split worlds. +The seam confines SAME-WORLD subprocesses only: a backend shares the host's filesystem and kernel. Containers, microVMs, and remote executors are NOT backends of this seam — they replace the Service Providers for whole capability seams (`ctx.shell`, `ctx.fs`) as environment-coherent groups, because an agent whose bash runs in a container while its fs tools write the host lives in two split worlds. Left open, for the phase that needs them: whether network restriction arrives as a separate `network_mode` or merges into `sandbox_mode` once a runner enforces both, and whether `SandboxPolicy` grows extra writable-root grants now (the launcher already speaks `--rw `) or only when escalation needs them. @@ -199,7 +199,7 @@ Costs and accepted limits: In-repo precedents this design copies or contrasts with: -- [The capability-seams Agent Note](../architecture/2026-06-13-capability-seams.md) — the Service Definition / Service provider / Consumer split and the "don't split preemptively" timing rule the second consumer satisfied. +- [The capability-seams Agent Note](../architecture/2026-06-13-capability-seams.md) — the Service Definition / Service Provider / Consumer split and the "don't split preemptively" timing rule the second consumer satisfied. - The `dsh-shell` request/spec split ([the bash vocabulary catalog](../../../../docs/subsystems/shell.md)) — the complete `sandboxPolicy` rides its per-call carrier, and the explicit-`resolve()` defaulting convention. - [The approval seam Agent Note](2026-07-06-approval-seam.md) — the channel escalation asks through; its answerer waterfall, audit pair, and one-package rationale are recorded there. - [Event-sourced sessions](../architecture/2026-06-11-event-sourced-sessions.md) and [standalone log-only events](../simplification/2026-07-28-remove-synthetic-log-only-turns.md) — the log-as-store foundation the per-session modes fold over, and the explicit durability boundary the anchoring design obeys. diff --git a/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md b/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md index 36ecbadd05..82c2e79628 100644 --- a/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md +++ b/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md @@ -54,7 +54,7 @@ OS 子进程约束适用于 bash 执行器(包括钩子命令),后续还 策略随每次调用而非提供方携带:两个消费方可以在同一时刻以不同策略约束(bash 在 `read-only` 下运行,而一个受约束的子 agent 保持其状态目录可写),且经批准的升级重试是一次带有更宽策略的新调用——在配置固定的提供方模式下无法表达。 -该 seam 仅约束与宿主共享文件系统和内核的子进程。容器、microVM 和远程执行器不是此 seam 的后端——它们以环境一致的组替换整个能力 seam(`ctx.shell`、`ctx.fs`)的 Service provider,因为一个 bash 在容器中运行而 fs 工具写主机的 agent 生活在两个割裂的世界中。 +该 seam 仅约束与宿主共享文件系统和内核的子进程。容器、microVM 和远程执行器不是此 seam 的后端——它们以环境一致的组替换整个能力 seam(`ctx.shell`、`ctx.fs`)的 Service Provider,因为一个 bash 在容器中运行而 fs 工具写主机的 agent 生活在两个割裂的世界中。 留待需要时再决定:网络限制是作为独立的 `network_mode` 到来,还是在某个 runner 同时强制两者后合并进 `sandbox_mode`;以及 `SandboxPolicy` 是现在就增加额外的可写根授权(launcher 已支持 `--rw `),还是等到升级机制需要时再加。 @@ -199,7 +199,7 @@ fs/web/todo 在进程内执行,因此它们的沙箱语义是各自能力边 本设计复制或对比的仓库内先例: -- [能力 seam Agent Note](../architecture/2026-06-13-capability-seams.md)——Service Definition/Service provider/Consumer 拆分与「不要过早拆分」的时机规则(第二个消费方满足了该规则)。 +- [能力 seam Agent Note](../architecture/2026-06-13-capability-seams.md)——Service Definition/Service Provider/Consumer 拆分与「不要过早拆分」的时机规则(第二个消费方满足了该规则)。 - `dsh-shell` 的 request/spec 拆分([bash 词汇目录](../../../../docs/subsystems/shell.md))——完整的 `sandboxPolicy` 搭载其按调用载体,以及显式 `resolve()` 默认约定。 - [批准 seam Agent Note](2026-07-06-approval-seam.md)——升级请求通过的通道;其应答器 waterfall(瀑布式事件)、审计对和单包理由记录在那里。 - [事件溯源会话](../architecture/2026-06-11-event-sourced-sessions.md)与[独立纯日志事件](../simplification/2026-07-28-remove-synthetic-log-only-turns.md)——按会话模式 fold 所依赖的日志即存储基础,以及锚定设计遵守的显式持久性边界。 diff --git a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml index 354bc66050..7357dd353d 100644 --- a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md -2026-07-27-typescript-sdk-and-sdk-subagent-backend.md: 8b17603e5c90941778835befd84d114a3f3cd78b -2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md: fe5026871778bfcdcb85b71704d79e6fa678188d +2026-07-27-typescript-sdk-and-sdk-subagent-backend.md: 84314eaf5827464767666b1b9c65e105ea4e869a +2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md: 48f292514844d59d2084731b30bcb5ba7fb563d5 diff --git a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md index 8b17603e5c..84314eaf58 100644 --- a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md +++ b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md @@ -10,7 +10,7 @@ The stdio JSON-RPC serving surface (`@deepseek-ai/dsh-sdk-jsonrpc-server`, the [ ## Decision -Three packages, layered exactly like the existing Python stack, plus one Service provider registration: +Three packages, layered exactly like the existing Python stack, plus one Service Provider registration: - **`@deepseek-ai/dsh-sdk-protocol`** (`packages/sdk/protocol/`) — the wire made shared and nominal. `JsonRpcLineTransport` moves here verbatim from `dsh-sdk-jsonrpc-server` (which now imports it), and `types.ts` names every payload the server speaks: `InitializeParams/Result`, `SessionPromptParams/Result`, the four notification payloads, and the `HarnessSdkRequestMap`/`HarnessSdkNotificationMap` indexes. The package root explicitly exports that complete interface and provides no source-module deep imports. The server's `notify()` call sites are typed against these named payloads, so server drift breaks compilation, not clients. One behavioral change: an error response now rejects with `JsonRpcResponseError` carrying the wire `code`/`data` (the Python client already preserved these; the old transport threw a bare `Error` with only the message). - **`@deepseek-ai/dsh-sdk-client`** (`packages/sdk/client/`) — the TypeScript twin of `python/sdk`: `HarnessClient` (spawn, frame, fan out notifications, typed error surfaces, close-to-quiescence via the shared dispose ladder) under `DeepSeekHarness`/`HarnessSession` (lazy start, memoized `initialize`, `run()` pairing one `session/prompt` with its `session.finished`). Its package-root consumer interface explicitly exports both client layers, caller-facing types, and the protocol-owned `JsonRpcResponseError`; source modules, normalization helpers, and the notification producer stay internal. `TurnResult.events` contains only the root session's typed events, while `notifications` retains session ids across the root and descendants discovered from `subagent.started`; session-tree scoping is client-side, mirroring `client.py`. Deliberate asymmetries with Python: the launch spec is explicit `command`/`args` (no bundled-runtime resolution — that is a distribution concern with no TS consumer yet); `env` replaces rather than merges (callers own credential policy; `scrubbedParentEnv` from the subprocess seam is one import away); `TurnResult` carries the structured `reason` (Python exposes only `status`); teardown walks a private stdin-EOF → SIGTERM → SIGKILL ladder to actual exit (the client runs outside any harness context, so it cannot ride `ctx.subprocess`). @@ -30,7 +30,7 @@ Four tiers, per [testing policy](../../../../docs/testing.md): ## Alternatives considered -**Import wire types from `dsh-sdk-jsonrpc-server` instead of extracting a protocol package.** Makes every SDK consumer (including `subagent-dsh-sdk`, which must not serve JSON-RPC) depend on the server plugin and its `dsh-agent`/`dsh-llm-deepseek` peer set, and leaves the notification payloads anonymous. The capability-seam rule (Service Definition / Service provider / Consumer as separate packages) already names this shape; the transport is genuinely two-sided. +**Import wire types from `dsh-sdk-jsonrpc-server` instead of extracting a protocol package.** Makes every SDK consumer (including `subagent-dsh-sdk`, which must not serve JSON-RPC) depend on the server plugin and its `dsh-agent`/`dsh-llm-deepseek` peer set, and leaves the notification payloads anonymous. The capability-seam rule (Service Definition / Service Provider / Consumer as separate packages) already names this shape; the transport is genuinely two-sided. **Have `subagent-dsh-sdk` speak raw JSON-RPC without the client SDK.** Duplicates the request/notification pairing, subscription fan-out, timeout, and teardown logic the SDK exists to own; the user's ask was explicitly a backend that *uses* the SDK, and the layering earns its keep by making the backend ~200 lines of policy over a reusable client. diff --git a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md index fe50268717..48f2925148 100644 --- a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md +++ b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md @@ -10,7 +10,7 @@ stdio JSON-RPC 对外服务接口(`@deepseek-ai/dsh-sdk-jsonrpc-server`,见[ ## 决策 -三个包,分层与既有 Python 栈完全一致,外加一个 Service provider 注册: +三个包,分层与既有 Python 栈完全一致,外加一个 Service Provider 注册: - **`@deepseek-ai/dsh-sdk-protocol`**(`packages/sdk/protocol/`)—— 把线协议做成共享且具名。`JsonRpcLineTransport` 从 `dsh-sdk-jsonrpc-server` 原样移入(后者现在导入它),`types.ts` 为服务器所说的每个载荷命名:`InitializeParams/Result`、`SessionPromptParams/Result`、四个通知载荷,以及 `HarnessSdkRequestMap`/`HarnessSdkNotificationMap` 索引。该包根显式导出这一完整接口,且不提供指向源模块的深层导入。服务器的 `notify()` 调用点以这些具名载荷标注类型,服务器漂移会先破坏编译而不是破坏客户端。一处行为变化:错误响应现在以携带线上 `code`/`data` 的 `JsonRpcResponseError` 拒绝(Python 客户端本就保留这些;旧传输只抛携带消息的裸 `Error`)。 - **`@deepseek-ai/dsh-sdk-client`**(`packages/sdk/client/`)—— `python/sdk` 的 TypeScript 孪生:`HarnessClient`(spawn、分帧、通知扇出、有类型的错误表面、经共享 dispose(资源释放)阶梯关闭至完全停稳)之上是 `DeepSeekHarness`/`HarnessSession`(惰性启动、记忆化 `initialize`、`run()` 把一个 `session/prompt` 与其 `session.finished` 配对)。其包根消费方接口显式导出两层客户端、面向调用方的类型,以及协议包所拥有的 `JsonRpcResponseError`;源模块、规范化辅助函数和通知投递端都保留为内部实现。`TurnResult.events` 只包含根会话的类型化事件,而 `notifications` 则保留根会话及从 `subagent.started` 发现的后代各自的会话 id;基于 `subagent.started` 血缘边的会话树范围限定在客户端完成,镜像 `client.py`。与 Python 的刻意不对称:启动规格是显式 `command`/`args`(无捆绑运行时解析——那是尚无 TS 消费方的发行问题);`env` 整体替换而非合并(凭据策略归调用方;subprocess seam 的 `scrubbedParentEnv` 一个 import 即得);`TurnResult` 携带结构化 `reason`(Python 只暴露 `status`);拆除走私有的 stdin-EOF → SIGTERM → SIGKILL 阶梯直到真正退出(客户端运行在任何 harness 上下文之外,无法搭乘 `ctx.subprocess`)。 @@ -30,7 +30,7 @@ stdio JSON-RPC 对外服务接口(`@deepseek-ai/dsh-sdk-jsonrpc-server`,见[ ## 考虑过的替代方案 -**从 `dsh-sdk-jsonrpc-server` 导入协议类型而不是提取协议包。** 会让每个 SDK 消费方(包括绝不能提供 JSON-RPC 服务的 `subagent-dsh-sdk`)依赖服务器插件及其 `dsh-agent`/`dsh-llm-deepseek` peer 集合,且通知载荷仍然匿名。能力 seam 规则(Service Definition/Service provider/Consumer 三个包分立)已经点名了这种形态;这个传输是货真价实的双边物。 +**从 `dsh-sdk-jsonrpc-server` 导入协议类型而不是提取协议包。** 会让每个 SDK 消费方(包括绝不能提供 JSON-RPC 服务的 `subagent-dsh-sdk`)依赖服务器插件及其 `dsh-agent`/`dsh-llm-deepseek` peer 集合,且通知载荷仍然匿名。能力 seam 规则(Service Definition/Service Provider/Consumer 三个包分立)已经点名了这种形态;这个传输是货真价实的双边物。 **让 `subagent-dsh-sdk` 直说裸 JSON-RPC、绕开客户端 SDK。** 会复制 SDK 存在意义所在的请求/通知配对、订阅扇出、超时与拆除逻辑;用户的要求明确是一个*使用* SDK 的后端,分层的回报是后端成为可复用客户端之上约 200 行的纯策略。 diff --git a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml index df27661306..8d2b2035b0 100644 --- a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md -2026-07-02-tool-schema-catalog.md: 5ae396d0942379f625b6e0ccb89030d8a34c2283 -2026-07-02-tool-schema-catalog.zh.md: 278a9e17dc9f8462ea70694f67ae7944a43765aa +2026-07-02-tool-schema-catalog.md: 21192b8caff386058008eed1417ef78c678190f7 +2026-07-02-tool-schema-catalog.zh.md: 66c01a5ea9f233cf22ef7ebc467c031692bde002 diff --git a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md index 5ae396d094..21192b8caf 100644 --- a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md +++ b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md @@ -29,7 +29,7 @@ Booting has a cost the AST pass did not: there is no source declaration set to e ### A hand-maintained boot manifest is the irreducible policy -The filesystem discovers the tool-package inventory and the completeness guard rejects omissions. `TOOL_PACKAGES` still owns an explicit boot recipe for each package because required Service providers and config are policy, not facts that can be inferred safely from layout or injection names. +The filesystem discovers the tool-package inventory and the completeness guard rejects omissions. `TOOL_PACKAGES` still owns an explicit boot recipe for each package because required Service Providers and config are policy, not facts that can be inferred safely from layout or injection names. ### Scope diff --git a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md index 278a9e17dc..66c01a5ea9 100644 --- a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md +++ b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md @@ -29,7 +29,7 @@ Cordis 目录是纯 TypeScript AST 遍历,因为每个事件/服务名都是 ### 手动维护的启动 manifest 是无法省去的策略 -文件系统负责发现工具包清单,完整性守卫负责拒绝遗漏。`TOOL_PACKAGES` 仍然为每个包持有一份显式的启动配方,因为所需的服务提供方和配置属于策略,不是能从目录布局或注入名称安全推断的事实。 +文件系统负责发现工具包清单,完整性守卫负责拒绝遗漏。`TOOL_PACKAGES` 仍然为每个包持有一份显式的启动配方,因为所需的 Service Provider 和配置属于策略,不是能从目录布局或注入名称安全推断的事实。 ### 范围 diff --git a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml index e2ff001696..9c09464d87 100644 --- a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml +++ b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md -2026-06-26-fsspec-style-fs-seam.md: ec3ee9bd0781b64b804f58c32cb59afc7f05e0d4 -2026-06-26-fsspec-style-fs-seam.zh.md: a4e50c401e56854933bcaebd24cf9955949b3c31 +2026-06-26-fsspec-style-fs-seam.md: 927220a4042a47aa1a76926161427613f3a2b809 +2026-06-26-fsspec-style-fs-seam.zh.md: 52c55f82f77d4101f1e659d4642689e5aa3a804f diff --git a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md index ec3ee9bd07..927220a404 100644 --- a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md +++ b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md @@ -105,7 +105,7 @@ This Agent Note reverses two decisions from [filesystem-capability-seam](../arch - Text reads no longer return backend-numbered line records or `full`/`partial` views; authorization is based on version freshness, so a windowed read can authorize edit when the file is unchanged. - Literal edit no longer sits behind the old `applyEdit` API that mixed backend mutation with seam-owned observation policy. It remains a provider primitive as `editText`, because version guard + literal match + atomic rewrite must stay inside the provider's mutation critical section. -It keeps the Service Definition / Service provider / Consumer discipline, consumer-never-imports-backend rule, backend-defined target/version/display metadata, atomic local writes, and the shared `FsError` taxonomy. +It keeps the Service Definition / Service Provider / Consumer discipline, consumer-never-imports-backend rule, backend-defined target/version/display metadata, atomic local writes, and the shared `FsError` taxonomy. ## Verification diff --git a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md index a4e50c401e..52c55f82f7 100644 --- a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md +++ b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md @@ -105,7 +105,7 @@ type FsWriteIntent = - 文本读取不再返回后端编号的行记录或 `full`/`partial` 视图;授权基于版本新鲜度,因此窗口化读取在文件未变时即可授权编辑。 - 字面编辑不再位于旧的 `applyEdit` API 之后(该 API 混合了后端变更与 seam 拥有的观测策略)。它作为 `editText` 保留为提供方原语,因为版本守卫 + 字面匹配 + 原子重写必须留在提供方的变更临界区内。 -保留的内容:Service Definition / Service provider / Consumer 纪律、消费方不导入后端规则、后端定义的 target/version/display 元数据、原子本地写入,以及共享的 `FsError` 分类体系。 +保留的内容:Service Definition / Service Provider / Consumer 纪律、消费方不导入后端规则、后端定义的 target/version/display 元数据、原子本地写入,以及共享的 `FsError` 分类体系。 ## 验证 diff --git a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml index 75270e6a39..56bc51e639 100644 --- a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml +++ b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md -2026-07-19-required-cancellation-through-tool-capability-seams.md: 380204200711158fcda640fe25551293515fc49a -2026-07-19-required-cancellation-through-tool-capability-seams.zh.md: 631abfaa1cd21578437458cc194e277dc7883792 +2026-07-19-required-cancellation-through-tool-capability-seams.md: 478cd887d84ceae8a5a0cd455fb7cf4b4d562950 +2026-07-19-required-cancellation-through-tool-capability-seams.zh.md: f3afdc953b50751798b412d24ecd7a9efd7d9af2 diff --git a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md index 3802042007..478cd887d8 100644 --- a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md +++ b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md @@ -18,7 +18,7 @@ Require an `AbortSignal` on every asynchronous same-process capability operation Each direct caller supplies a signal it owns or propagates from its own required operation context. Implementations may derive a child deadline or cancellation scope, but the derived signal remains linked to the upstream signal for the delegated lifetime. Capability implementations do not synthesize never-abort signals, use ambient async-local cancellation, or validate `AbortSignal` at runtime solely to repeat the typed same-process contract. -The migration begins with an inventory from every first-party `ToolDefinition.execute()` through the capability calls it awaits. It then changes each coherent Service Definition / Service provider / Consumer seam together, including tests and generated API documentation. Separate PRs may migrate filesystem, shell/task, web/provider, workflow/subagent, code-runtime, and similar families so each change remains reviewable, but no migrated interface keeps an optional compatibility overload under the repository's pre-release policy. +The migration begins with an inventory from every first-party `ToolDefinition.execute()` through the capability calls it awaits. It then changes each coherent Service Definition / Service Provider / Consumer seam together, including tests and generated API documentation. Separate PRs may migrate filesystem, shell/task, web/provider, workflow/subagent, code-runtime, and similar families so each change remains reviewable, but no migrated interface keeps an optional compatibility overload under the repository's pre-release policy. ### Scope boundary diff --git a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md index 631abfaa1c..f3afdc953b 100644 --- a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md +++ b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md @@ -18,7 +18,7 @@ Status: proposed 每个直接调用方提供自己持有的信号,或从自身必填的操作上下文继续传递信号。实现可以派生子截止时间或取消作用域,但派生信号在委托期间仍须与上游信号关联。能力实现不得生成永不中止信号、使用环境式异步本地取消,也不得仅为重复类型化同进程约定而在运行时校验 `AbortSignal`。 -迁移首先从每个第一方 `ToolDefinition.execute()` 出发,沿其等待的能力调用进行清点;随后按内聚的 Service Definition/Service provider/Consumer seam,将测试与生成的 API 文档一并修改。文件系统、Bash 与任务、Web 与提供方、工作流与 subagent、代码运行时等能力族可以通过独立 PR(Pull Request)迁移,以保持每项变更可审查;但根据仓库的预发布原则,已经迁移的接口不得保留可选兼容重载。 +迁移首先从每个第一方 `ToolDefinition.execute()` 出发,沿其等待的能力调用进行清点;随后按内聚的 Service Definition/Service Provider/Consumer seam,将测试与生成的 API 文档一并修改。文件系统、Bash 与任务、Web 与提供方、工作流与 subagent、代码运行时等能力族可以通过独立 PR(Pull Request)迁移,以保持每项变更可审查;但根据仓库的预发布原则,已经迁移的接口不得保留可选兼容重载。 ### 范围边界 diff --git a/AGENTS.md b/AGENTS.md index 3fe315e212..2bef9661d5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -106,7 +106,7 @@ Real-API tests and demos read `DEEPSEEK_API_KEY`, optional `DEEPSEEK_BASE_URL`, - **Waterfall listeners MUST call `next()`** to delegate; returning without it short-circuits the chain ([semantics](docs/cordis-primer.md#cordis-waterfall-semantics)). - **Model-visible ⟺ logged**: anything that reaches a model request must be reconstructable from the session log; a new model-visible input requires a session event. - **Plugins, not loop changes**: new behavior goes on documented extension points; changing `agent-loop` requires updating docs/architecture.md. -- **A capability seam comprises Service Definition / Service provider / Consumer roles.** It is complete, never one role; split only when roles evolve independently ([glossary](docs/glossary.md#capability-seam)). +- **A capability seam comprises Service Definition / Service Provider / Consumer roles.** It is complete, never one role; split only when roles evolve independently ([glossary](docs/glossary.md#capability-seam)). - **Prefer maintained dependencies over hand-rolling** when they genuinely delete owned code and tests ([policy](.agents/notes/implemented/process/2026-07-26-dependencies-over-hand-rolling.md)). - **Explicit > implicit at package boundaries**: defaulting is an explicit `resolve(request): Spec` step in the owning implementation, never a hidden `?? default` inside `run()` (the `dsh-shell` request/spec split is the template). - **No hardcoded tunables in plugins**: deployment-varying choices are validated `Config` fields changeable from cordis.yml; a `DEFAULT_*` constant or test hook is not configurability. Protocol constants, external specs, and security invariants stay fixed. diff --git a/docs/architecture.i18n.yaml b/docs/architecture.i18n.yaml index 482e683aa9..f077b66226 100644 --- a/docs/architecture.i18n.yaml +++ b/docs/architecture.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/architecture.md -architecture.md: ad5b9072d2731b0b68c5f6035dafe37bc6229de8 -architecture.zh.md: 24ccd3bfbbd86213134201e49c8e768037eecd38 +architecture.md: 77000ce9d4608d440e1d903eb80a42f2ed6435ef +architecture.zh.md: 268724d52c82e31c4fc2b51db59823f3720f9b91 diff --git a/docs/architecture.md b/docs/architecture.md index ad5b9072d2..77000ce9d4 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -97,7 +97,7 @@ The session log is the source of the context the model sees. `deriveMessages()` ## Capability seams -A **seam** is a swappable capability with three roles: a **Service Definition** declaring the interface, a **Service provider** implementing it, and a **Consumer** using it, commonly a model-facing tool. A package may combine roles, but one role alone is not a seam; adding a capability means designing all three ([capability graph](capability-seams.md)). +A **seam** is a swappable capability with three roles: a **Service Definition** declaring the interface, a **Service Provider** implementing it, and a **Consumer** using it, commonly a model-facing tool. A package may combine roles, but one role alone is not a seam; adding a capability means designing all three ([capability graph](capability-seams.md)). Seams are why one provider swap changes the whole product. Filesystem and subprocess providers share one execution world, so pointing them at a remote sandbox moves Bash, PTY, and LSP with them, with no provider forks. [Subagent providers](subsystems/subagent.md) vary just as widely behind one interface, from a fresh child agent to a delegated turn in another product. diff --git a/docs/architecture.zh.md b/docs/architecture.zh.md index 24ccd3bfbb..268724d52c 100644 --- a/docs/architecture.zh.md +++ b/docs/architecture.zh.md @@ -97,7 +97,7 @@ turn/end ## 能力 seam -一个 **seam** 是一项可替换能力,包含三种角色:声明接口的 **Service Definition**、实现它的 **Service provider**,以及使用它的 **Consumer**(通常是面向模型的工具)。一个包可以合并承担多个角色,但单一角色本身不是 seam;添加一项能力意味着把三者一并设计([能力图](capability-seams.md))。 +一个 **seam** 是一项可替换能力,包含三种角色:声明接口的 **Service Definition**、实现它的 **Service Provider**,以及使用它的 **Consumer**(通常是面向模型的工具)。一个包可以合并承担多个角色,但单一角色本身不是 seam;添加一项能力意味着把三者一并设计([能力图](capability-seams.md))。 seam 正是替换一个提供方就能改变整个产品的原因。文件系统与进程提供方共享同一个执行世界,因此把它们指向远程沙箱,也就把 Bash、PTY 和 LSP 一并搬了过去,无需提供方专用 fork。[subagent 提供方](subsystems/subagent.md)在同一个接口之后同样千差万别,从新建一个子 agent,到把一个轮次委派给另一个产品。 diff --git a/docs/cookbook/adding-a-package.i18n.yaml b/docs/cookbook/adding-a-package.i18n.yaml index d9cf8eb3a4..5cdb1404f8 100644 --- a/docs/cookbook/adding-a-package.i18n.yaml +++ b/docs/cookbook/adding-a-package.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cookbook/adding-a-package.md -adding-a-package.md: 26a380fd3ec6b8b0447ad27d7ef79d3e58433cbe -adding-a-package.zh.md: 49a9fba820698d0c82c9700c31a28039fbc030c8 +adding-a-package.md: a78695735957395c5c900c3294b6778904557f85 +adding-a-package.zh.md: b7a749220fdc1581875851e2e4a7189ba7642b2d diff --git a/docs/cookbook/adding-a-package.md b/docs/cookbook/adding-a-package.md index 26a380fd3e..a786957359 100644 --- a/docs/cookbook/adding-a-package.md +++ b/docs/cookbook/adding-a-package.md @@ -40,7 +40,7 @@ Covered automatically by globs or package-manifest discovery — no edits needed ## 3. Decide the package topology -For a swappable capability, separate Service Definition / Service provider / Consumer roles into packages when they evolve independently (see docs/architecture.md § "Capability seams" — the shell trio is the template). A single-purpose plugin stays one package. +For a swappable capability, separate Service Definition / Service Provider / Consumer roles into packages when they evolve independently (see docs/architecture.md § "Capability seams" — the shell trio is the template). A single-purpose plugin stays one package. ### Name the role that exists diff --git a/docs/cookbook/adding-a-package.zh.md b/docs/cookbook/adding-a-package.zh.md index 49a9fba820..b7a749220f 100644 --- a/docs/cookbook/adding-a-package.zh.md +++ b/docs/cookbook/adding-a-package.zh.md @@ -40,7 +40,7 @@ package.json 不变式(由 `pnpm run constraints` / `scripts/check-workspace-c ## 3. 确定包拓扑 -对于可替换的能力,当 Service Definition/Service provider/Consumer 角色需要独立演进时,将它们拆分到不同包中(见 docs/architecture.md § "Capability seams"——shell 三组件是模板)。单一用途的插件保持为一个包。 +对于可替换的能力,当 Service Definition/Service Provider/Consumer 角色需要独立演进时,将它们拆分到不同包中(见 docs/architecture.md § "Capability seams"——shell 三组件是模板)。单一用途的插件保持为一个包。 ### 使用符合实际的角色名称 diff --git a/docs/glossary.i18n.yaml b/docs/glossary.i18n.yaml index ddedb8d9c7..f462345f43 100644 --- a/docs/glossary.i18n.yaml +++ b/docs/glossary.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/glossary.md -glossary.md: 1c8bbc86544092b1e8c752e53eed0a1217baa329 -glossary.zh.md: 510853d3d6a6f579c8e4cd609d714fe891e9cf10 +glossary.md: 9bff818d5a9f7688e8d2a2425b6e6a9555be3847 +glossary.zh.md: 98bbbefb8bfd152324b23e9791eb938398c12602 diff --git a/docs/glossary.md b/docs/glossary.md index 1c8bbc8654..9bff818d5a 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -6,7 +6,7 @@ Domain vocabulary for DeepSeek Harness uses one canonical term per concept. Term ## capability-seam -- **seam** — a *swappable capability* with three roles: a **Service Definition** (the Cordis `Service` that owns its `ctx.` and vocabulary types — an abstract class such as `ShellExecutor`, or a concrete registry such as `WebRuntime`, never a TypeScript `interface`), one or more **Service providers**, and one or more **Consumers** that inject the service. `packages/shell` is the canonical example: `dsh-shell` (Service Definition), `dsh-bash-local` / `dsh-bash-sandbox` (providers), and `dsh-tool-bash` (Consumer). Roles normally occupy separate packages when they evolve independently, but a package may own multiple roles when they are one concern (`dsh-llm` owns its Service Definition and Consumer). The seam is the complete capability, never one role; reserve the term for that meaning and name a constituent by its role, class, service, contract, or extension point. +- **seam** — a *swappable capability* with three roles: a **Service Definition** (the Cordis `Service` that owns its `ctx.` and vocabulary types — an abstract class such as `ShellExecutor`, or a concrete registry such as `WebRuntime`, never a TypeScript `interface`), one or more **Service Providers**, and one or more **Consumers** that inject the service. `packages/shell` is the canonical example: `dsh-shell` (Service Definition), `dsh-bash-local` / `dsh-bash-sandbox` (providers), and `dsh-tool-bash` (Consumer). Roles normally occupy separate packages when they evolve independently, but a package may own multiple roles when they are one concern (`dsh-llm` owns its Service Definition and Consumer). The seam is the complete capability, never one role; reserve the term for that meaning and name a constituent by its role, class, service, contract, or extension point. ## agent-scope diff --git a/docs/glossary.zh.md b/docs/glossary.zh.md index 510853d3d6..98bbbefb8b 100644 --- a/docs/glossary.zh.md +++ b/docs/glossary.zh.md @@ -6,7 +6,7 @@ DeepSeek Harness 的领域词汇为每个概念规定一个规范术语。各术 ## capability-seam -- **seam**:一种包含三种角色的*可替换能力*:**Service Definition**(拥有自身 `ctx.` 和词汇类型的 Cordis `Service`——可以是 `ShellExecutor` 这样的抽象类,也可以是 `WebRuntime` 这样的具体注册表,绝不是 TypeScript `interface`)、一个或多个 **Service provider**,以及一个或多个注入该服务的 **Consumer**。`packages/shell` 是规范范例:`dsh-shell`(Service Definition)、`dsh-bash-local` / `dsh-bash-sandbox`(提供方),以及 `dsh-tool-bash`(Consumer)。角色需要独立演进时通常位于不同包,但属于同一关注点时,一个包也可以承担多个角色(`dsh-llm` 同时承担 Service Definition 和 Consumer)。seam 是完整能力,绝不是其中一个角色;该术语仅保留此义,能力成员应按其角色、类、服务、约定或扩展点命名。 +- **seam**:一种包含三种角色的*可替换能力*:**Service Definition**(拥有自身 `ctx.` 和词汇类型的 Cordis `Service`——可以是 `ShellExecutor` 这样的抽象类,也可以是 `WebRuntime` 这样的具体注册表,绝不是 TypeScript `interface`)、一个或多个 **Service Provider**,以及一个或多个注入该服务的 **Consumer**。`packages/shell` 是规范范例:`dsh-shell`(Service Definition)、`dsh-bash-local` / `dsh-bash-sandbox`(提供方),以及 `dsh-tool-bash`(Consumer)。角色需要独立演进时通常位于不同包,但属于同一关注点时,一个包也可以承担多个角色(`dsh-llm` 同时承担 Service Definition 和 Consumer)。seam 是完整能力,绝不是其中一个角色;该术语仅保留此义,能力成员应按其角色、类、服务、约定或扩展点命名。 ## agent-scope diff --git a/docs/i18n/terminology.md b/docs/i18n/terminology.md index d1e58a99b4..feb1c96792 100644 --- a/docs/i18n/terminology.md +++ b/docs/i18n/terminology.md @@ -56,7 +56,8 @@ | Round | Round | | 回合、目标回合、Ralph 回合 | 外层策略使用 Round 时,领域层级为 Session > Round > Turn(轮次) > Step(步骤);Round 是可选的外层策略迭代,并非每个会话轮次都具有的通用层级。Goal Round 与 Ralph Round 均保留英文。一个 Round 承载一个轮次,步骤隶属于该轮次;明确的零步骤轮次仍保持原义。 | | schema | schema | | | | | schema DSL | schema DSL | | | | -| seam | seam | | 接缝 | 一个可替换能力的整体,包含 Service Definition / Service provider / Consumer 三种角色;角色需要独立演化时才拆包,也可由同一包承担多个角色。以 `packages/shell` 为范例;Service Definition 是 Cordis `Service`(抽象类或具体 registry 服务),不是 TypeScript interface。任何单一角色、普通边界或扩展点都不能称为 seam。本仓库正文保留英文;与 `extension point` 是不同概念 | +| seam | seam | | 接缝 | 一个可替换能力的整体,包含 Service Definition / Service Provider / Consumer 三种角色;角色需要独立演化时才拆包,也可由同一包承担多个角色。以 `packages/shell` 为范例;Service Definition 是 Cordis `Service`(抽象类或具体 registry 服务),不是 TypeScript interface。任何单一角色、普通边界或扩展点都不能称为 seam。本仓库正文保留英文;与 `extension point` 是不同概念 | +| Service Provider | Service Provider | | Service provider | 能力 seam 的命名角色;单数固定写作 Service Provider,复数写作 Service Providers。泛指提供服务的 provider 不适用本词条 | | skill | skill | skill(技能) | | | | slot | slot | | 坑位、孔位 | 客户端架构中的具名可注册位置,保留英文 | | spill | spill | | | 工具输出超限落盘机制;组合词写 `spill 文件`、`spill 路径` | @@ -97,7 +98,7 @@ | cancel | 取消 | | | | | canary test | canary 测试 | | 金丝雀测试 | 本仓库保留 `canary` | | capability | 能力 | | | 必须与 `feature` → `功能` 区分 | -| capability seam | 能力 seam | | 功能 seam、能力接缝 | 本仓库 Service Definition、Service provider 与 Consumer 三种角色组成完整可替换能力的命名架构概念;普通 `seam` 仍按其词条处理 | +| capability seam | 能力 seam | | 功能 seam、能力接缝 | 本仓库 Service Definition、Service Provider 与 Consumer 三种角色组成完整可替换能力的命名架构概念;普通 `seam` 仍按其词条处理 | | feature | 功能 | | 能力 | SDK 产品与工程模型中的可管理产品单元 | | feature option | 功能选项 | | variant | 一项 SDK 功能内有限、可选择的实现或配置 | | checkpoint | 检查点 | | | | diff --git a/docs/subsystems/code-runtime.i18n.yaml b/docs/subsystems/code-runtime.i18n.yaml index cf1e004c03..6c5d91599c 100644 --- a/docs/subsystems/code-runtime.i18n.yaml +++ b/docs/subsystems/code-runtime.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/code-runtime.md -code-runtime.md: e677bcaef26f7999181825934b880514e425f615 -code-runtime.zh.md: e94dd77b1e430e7bd15633881d65521409819574 +code-runtime.md: 09036819d4fb6a4e2f83cf7923584780ca2211f8 +code-runtime.zh.md: 2e717f17313ce23cb37616199bd83776c0a40756 diff --git a/docs/subsystems/code-runtime.md b/docs/subsystems/code-runtime.md index e677bcaef2..09036819d4 100644 --- a/docs/subsystems/code-runtime.md +++ b/docs/subsystems/code-runtime.md @@ -2,7 +2,7 @@ English | [中文](code-runtime.zh.md) -The code-execution seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) whose Service Definition ([dsh-code-runtime](../../packages/code-runtime/code-runtime), `ctx.codeRuntime`) runs one model-written program against host-provided async bindings and reports what it printed and returned. Code execution is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Backends differ by execution substrate and source language, both readonly descriptors on the service; the worker-thread Service provider and tool-registry Consumer are specified by the [Code Mode foundation](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) and [typed-return contract](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md). +The code-execution seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) whose Service Definition ([dsh-code-runtime](../../packages/code-runtime/code-runtime), `ctx.codeRuntime`) runs one model-written program against host-provided async bindings and reports what it printed and returned. Code execution is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Backends differ by execution substrate and source language, both readonly descriptors on the service; the worker-thread Service Provider and tool-registry Consumer are specified by the [Code Mode foundation](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) and [typed-return contract](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md). Source: [`packages/code-runtime/code-runtime/src/types.ts`](../../packages/code-runtime/code-runtime/src/types.ts) diff --git a/docs/subsystems/code-runtime.zh.md b/docs/subsystems/code-runtime.zh.md index e94dd77b1e..2e717f1731 100644 --- a/docs/subsystems/code-runtime.zh.md +++ b/docs/subsystems/code-runtime.zh.md @@ -2,7 +2,7 @@ [English](code-runtime.md) | 中文 -代码执行 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):其 Service Definition([dsh-code-runtime](../../packages/code-runtime/code-runtime),`ctx.codeRuntime`)使用宿主提供的异步绑定运行一段模型编写的程序,并报告其打印内容与返回值。代码执行是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。各后端的执行基底与源语言不同,这两项均为服务上的只读描述符;worker-thread Service provider 与工具注册表 Consumer 的约定见 [Code Mode 基础设计](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) 和[类型化返回约定](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md)。 +代码执行 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):其 Service Definition([dsh-code-runtime](../../packages/code-runtime/code-runtime),`ctx.codeRuntime`)使用宿主提供的异步绑定运行一段模型编写的程序,并报告其打印内容与返回值。代码执行是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。各后端的执行基底与源语言不同,这两项均为服务上的只读描述符;worker-thread Service Provider 与工具注册表 Consumer 的约定见 [Code Mode 基础设计](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) 和[类型化返回约定](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md)。 源码:[`packages/code-runtime/code-runtime/src/types.ts`](../../packages/code-runtime/code-runtime/src/types.ts) diff --git a/docs/subsystems/compaction.i18n.yaml b/docs/subsystems/compaction.i18n.yaml index b3c2ffad64..33e1c12cd8 100644 --- a/docs/subsystems/compaction.i18n.yaml +++ b/docs/subsystems/compaction.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/compaction.md -compaction.md: 1e14c60161ef945069d9e6f72767dabdfa42e702 -compaction.zh.md: 60f5afb8c673c94c9c6f5802fb4f12e224e04203 +compaction.md: 95a3d4b844c6126a09d4fdaafdedcf987b21d1c6 +compaction.zh.md: 3b72bb4f81675119d869fb2f7439f4640e6a5a86 diff --git a/docs/subsystems/compaction.md b/docs/subsystems/compaction.md index 1e14c60161..95a3d4b844 100644 --- a/docs/subsystems/compaction.md +++ b/docs/subsystems/compaction.md @@ -2,7 +2,7 @@ English | [中文](compaction.zh.md) -The compaction seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) split like bash: Service Definition ([dsh-compaction](../../packages/compaction/compaction), `ctx.compaction`), Service provider (a backend such as [dsh-compaction-basic](../../packages/compaction/compaction-basic)), and human Consumer ([dsh-command-compact](../../packages/compaction/command-compact)). Compaction is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A tokenizer- or template-based backend is a sibling package implementing the same interface. Unlike bash, the interface necessarily depends on `dsh-session` and `dsh-llm`: its verbs act on an agent-owned `Session`, and its durable summary event uses the `ContentBlock` vocabulary (see the [compaction capability-seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)). +The compaction seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) split like bash: Service Definition ([dsh-compaction](../../packages/compaction/compaction), `ctx.compaction`), Service Provider (a backend such as [dsh-compaction-basic](../../packages/compaction/compaction-basic)), and human Consumer ([dsh-command-compact](../../packages/compaction/command-compact)). Compaction is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A tokenizer- or template-based backend is a sibling package implementing the same interface. Unlike bash, the interface necessarily depends on `dsh-session` and `dsh-llm`: its verbs act on an agent-owned `Session`, and its durable summary event uses the `ContentBlock` vocabulary (see the [compaction capability-seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)). Source: [`packages/compaction/compaction/src/types.ts`](../../packages/compaction/compaction/src/types.ts) diff --git a/docs/subsystems/compaction.zh.md b/docs/subsystems/compaction.zh.md index 60f5afb8c6..3b72bb4f81 100644 --- a/docs/subsystems/compaction.zh.md +++ b/docs/subsystems/compaction.zh.md @@ -2,7 +2,7 @@ [English](compaction.md) | 中文 -压缩 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md),与 bash 一样分为 Service Definition([dsh-compaction](../../packages/compaction/compaction),`ctx.compaction`)、Service provider(例如 [dsh-compaction-basic](../../packages/compaction/compaction-basic) 后端)和面向用户的 Consumer([dsh-command-compact](../../packages/compaction/command-compact))。压缩是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。基于 tokenizer 或模板的后端是实现同一接口的兄弟包。与 bash 不同,该接口必然依赖 `dsh-session` 和 `dsh-llm`:其动词作用于 agent 所有的 `Session`,而其持久摘要事件使用 `ContentBlock` 词汇(见[压缩能力 seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md))。 +压缩 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md),与 bash 一样分为 Service Definition([dsh-compaction](../../packages/compaction/compaction),`ctx.compaction`)、Service Provider(例如 [dsh-compaction-basic](../../packages/compaction/compaction-basic) 后端)和面向用户的 Consumer([dsh-command-compact](../../packages/compaction/command-compact))。压缩是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。基于 tokenizer 或模板的后端是实现同一接口的兄弟包。与 bash 不同,该接口必然依赖 `dsh-session` 和 `dsh-llm`:其动词作用于 agent 所有的 `Session`,而其持久摘要事件使用 `ContentBlock` 词汇(见[压缩能力 seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md))。 源码:[`packages/compaction/compaction/src/types.ts`](../../packages/compaction/compaction/src/types.ts) diff --git a/docs/subsystems/jobs.i18n.yaml b/docs/subsystems/jobs.i18n.yaml index 83199a1ad8..747741008d 100644 --- a/docs/subsystems/jobs.i18n.yaml +++ b/docs/subsystems/jobs.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/jobs.md -jobs.md: 67998599f8bc8c9b50278e9eaab8b6a5c70a33bc -jobs.zh.md: 41f60e450dcb85ee867a6c44f1e0053950f3ec71 +jobs.md: b11dc7fbe869dcaa9e71e6956a76559476391775 +jobs.zh.md: 03c3ceee8953c8c4c70f060b7e9d88371c1ebd7b diff --git a/docs/subsystems/jobs.md b/docs/subsystems/jobs.md index 67998599f8..b11dc7fbe8 100644 --- a/docs/subsystems/jobs.md +++ b/docs/subsystems/jobs.md @@ -154,7 +154,7 @@ interface JobRead { ## Service behavior -The abstract [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition specifies atomic `start`, caller-scoped `get` and `list`, `read`, `kill`, bounded `wait`, failure-isolated `onJobDone` and `onJobsChanged` listeners, and when `attachController` becomes available; [`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) is the process-local Service provider. Authorization compares owner sessions; owner cleanup and admission use the exact registered `Agent` instance. The local provider's positive-safe-integer `maxConcurrentJobsPerOwner` config defaults to `10` and counts `running` plus `stopping` records per exact owner, with one shared bucket for unowned jobs; terminal producer settlement releases capacity. See [`dsh-jobs`](../../packages/jobs/jobs/README.md) for the Service Definition contract, [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md) for the registry lifecycle and admission policy, and [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md) for the model-facing Consumer. +The abstract [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition specifies atomic `start`, caller-scoped `get` and `list`, `read`, `kill`, bounded `wait`, failure-isolated `onJobDone` and `onJobsChanged` listeners, and when `attachController` becomes available; [`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) is the process-local Service Provider. Authorization compares owner sessions; owner cleanup and admission use the exact registered `Agent` instance. The local provider's positive-safe-integer `maxConcurrentJobsPerOwner` config defaults to `10` and counts `running` plus `stopping` records per exact owner, with one shared bucket for unowned jobs; terminal producer settlement releases capacity. See [`dsh-jobs`](../../packages/jobs/jobs/README.md) for the Service Definition contract, [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md) for the registry lifecycle and admission policy, and [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md) for the model-facing Consumer. diff --git a/docs/subsystems/jobs.zh.md b/docs/subsystems/jobs.zh.md index 41f60e450d..03c3ceee89 100644 --- a/docs/subsystems/jobs.zh.md +++ b/docs/subsystems/jobs.zh.md @@ -154,7 +154,7 @@ interface JobRead { ## 服务行为 -抽象的 [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition 规定原子 `start`、限定调用方作用域的 `get` 和 `list`、`read`、`kill`、有界 `wait`、故障隔离的 `onJobDone` 与 `onJobsChanged` 监听器,以及 `attachController` 何时可用;[`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) 是其进程局部 Service provider。授权会比较拥有者会话;拥有者清理与准入会使用确切的已注册 `Agent` 实例。本地 Service provider 的 `maxConcurrentJobsPerOwner` 配置必须是正的安全整数,默认值为 `10`;它按确切 owner 统计 `running` 与 `stopping` 记录,所有无 owner 任务共享一个服务级桶,并在生产方终止结算后释放容量。Service Definition 约定见 [`dsh-jobs`](../../packages/jobs/jobs/README.md),注册表生命周期与准入策略见 [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md),面向模型的 Consumer 见 [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md)。 +抽象的 [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition 规定原子 `start`、限定调用方作用域的 `get` 和 `list`、`read`、`kill`、有界 `wait`、故障隔离的 `onJobDone` 与 `onJobsChanged` 监听器,以及 `attachController` 何时可用;[`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) 是其进程局部 Service Provider。授权会比较拥有者会话;拥有者清理与准入会使用确切的已注册 `Agent` 实例。本地 Service Provider 的 `maxConcurrentJobsPerOwner` 配置必须是正的安全整数,默认值为 `10`;它按确切 owner 统计 `running` 与 `stopping` 记录,所有无 owner 任务共享一个服务级桶,并在生产方终止结算后释放容量。Service Definition 约定见 [`dsh-jobs`](../../packages/jobs/jobs/README.md),注册表生命周期与准入策略见 [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md),面向模型的 Consumer 见 [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md)。 diff --git a/docs/subsystems/lsp.i18n.yaml b/docs/subsystems/lsp.i18n.yaml index d001f5c6d6..4de29d66b7 100644 --- a/docs/subsystems/lsp.i18n.yaml +++ b/docs/subsystems/lsp.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/lsp.md -lsp.md: 66317acc25860cfeaa3d8fb35daf2947e811e18c -lsp.zh.md: 8d975e30cb5065fd89645166c657050233eb81da +lsp.md: 18ed0e178c73702534a9964557a3dabf7bb9dd11 +lsp.zh.md: 8b154143057f05d74bf28b715a385a2ec65fbbff diff --git a/docs/subsystems/lsp.md b/docs/subsystems/lsp.md index 66317acc25..18ed0e178c 100644 --- a/docs/subsystems/lsp.md +++ b/docs/subsystems/lsp.md @@ -2,7 +2,7 @@ English | [中文](lsp.zh.md) -The LSP seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md) exposing semantic code navigation on one `ctx.lsp` service, split across packages: Service Definition ([dsh-lsp](../../packages/lsp/lsp), `ctx.lsp` + the provider registry), a generic Service provider ([dsh-lsp-stdio](../../packages/lsp/lsp-stdio), a configured stdio language-server host), and Consumer ([dsh-tool-lsp](../../packages/lsp/tool-lsp), the `lsp` tool schema). LSP is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A provider swap does not change how the model asks for navigation. +The LSP seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md) exposing semantic code navigation on one `ctx.lsp` service, split across packages: Service Definition ([dsh-lsp](../../packages/lsp/lsp), `ctx.lsp` + the provider registry), a generic Service Provider ([dsh-lsp-stdio](../../packages/lsp/lsp-stdio), a configured stdio language-server host), and Consumer ([dsh-tool-lsp](../../packages/lsp/tool-lsp), the `lsp` tool schema). LSP is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A provider swap does not change how the model asks for navigation. Source: [`packages/lsp/lsp/src/types.ts`](../../packages/lsp/lsp/src/types.ts) diff --git a/docs/subsystems/lsp.zh.md b/docs/subsystems/lsp.zh.md index 8d975e30cb..8b15414305 100644 --- a/docs/subsystems/lsp.zh.md +++ b/docs/subsystems/lsp.zh.md @@ -2,7 +2,7 @@ [English](lsp.md) | 中文 -LSP seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md):它在单一 `ctx.lsp` 服务上公开语义代码导航,并拆分到多个包:Service Definition([dsh-lsp](../../packages/lsp/lsp),`ctx.lsp` + 提供方注册表)、通用 Service provider([dsh-lsp-stdio](../../packages/lsp/lsp-stdio),经过配置的 stdio 语言服务器宿主)和 Consumer([dsh-tool-lsp](../../packages/lsp/tool-lsp),即 `lsp` 工具 schema)。LSP 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。更换提供方不会改变模型请求导航的方式。 +LSP seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md):它在单一 `ctx.lsp` 服务上公开语义代码导航,并拆分到多个包:Service Definition([dsh-lsp](../../packages/lsp/lsp),`ctx.lsp` + 提供方注册表)、通用 Service Provider([dsh-lsp-stdio](../../packages/lsp/lsp-stdio),经过配置的 stdio 语言服务器宿主)和 Consumer([dsh-tool-lsp](../../packages/lsp/tool-lsp),即 `lsp` 工具 schema)。LSP 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。更换提供方不会改变模型请求导航的方式。 源文件:[`packages/lsp/lsp/src/types.ts`](../../packages/lsp/lsp/src/types.ts) diff --git a/docs/subsystems/session-telemetry.i18n.yaml b/docs/subsystems/session-telemetry.i18n.yaml index 31bcdef024..49f5b9c328 100644 --- a/docs/subsystems/session-telemetry.i18n.yaml +++ b/docs/subsystems/session-telemetry.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/session-telemetry.md -session-telemetry.md: f6a51dbd1de43525e0a1b062f11a140317a1cdd9 -session-telemetry.zh.md: 8cfd04121f9ab9741fd4a968c3f73eb6983992b7 +session-telemetry.md: dd00e428c3ecb1e0158be09cce83d1a262ab0c62 +session-telemetry.zh.md: 835fc0ff2f2daa1f4ac90fe615a62aa36f7fe41d diff --git a/docs/subsystems/session-telemetry.md b/docs/subsystems/session-telemetry.md index f6a51dbd1d..dd00e428c3 100644 --- a/docs/subsystems/session-telemetry.md +++ b/docs/subsystems/session-telemetry.md @@ -2,7 +2,7 @@ English | [中文](session-telemetry.zh.md) -Outbound session reporting is split as a [capability seam](../capability-seams.md): the Service Definition and capture coordinator ([dsh-session-telemetry](../../packages/session/session-telemetry), `ctx.sessionTelemetry`) own the capture points, fixed chunk projection, `session-telemetry/record` redaction waterfall, handoff cursor, and minimal backend contract; the Service provider a deployment loads ([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel)) is the OpenTelemetry JS SDK's log pipeline configured verbatim. It is one optional capability, not part of the agent-loop spine, and nothing here reaches a model request. The boundary axiom — the harness's aspect ends at `emit()`; batching, retry, queueing, and loss policy belong to the reporting SDK — and the rejected alternatives are pinned in the [revival Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md); the capture points, cursor, and projection contracts live in the [Service Definition README](../../packages/session/session-telemetry/README.md). +Outbound session reporting is split as a [capability seam](../capability-seams.md): the Service Definition and capture coordinator ([dsh-session-telemetry](../../packages/session/session-telemetry), `ctx.sessionTelemetry`) own the capture points, fixed chunk projection, `session-telemetry/record` redaction waterfall, handoff cursor, and minimal backend contract; the Service Provider a deployment loads ([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel)) is the OpenTelemetry JS SDK's log pipeline configured verbatim. It is one optional capability, not part of the agent-loop spine, and nothing here reaches a model request. The boundary axiom — the harness's aspect ends at `emit()`; batching, retry, queueing, and loss policy belong to the reporting SDK — and the rejected alternatives are pinned in the [revival Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md); the capture points, cursor, and projection contracts live in the [Service Definition README](../../packages/session/session-telemetry/README.md). Source: [`packages/session/session-telemetry/src/index.ts`](../../packages/session/session-telemetry/src/index.ts) diff --git a/docs/subsystems/session-telemetry.zh.md b/docs/subsystems/session-telemetry.zh.md index 8cfd04121f..835fc0ff2f 100644 --- a/docs/subsystems/session-telemetry.zh.md +++ b/docs/subsystems/session-telemetry.zh.md @@ -2,7 +2,7 @@ [English](session-telemetry.md) | 中文 -对外的会话上报拆分为一项[能力 seam](../capability-seams.md):Service Definition 与捕获协调器([dsh-session-telemetry](../../packages/session/session-telemetry),`ctx.sessionTelemetry`)拥有捕获点、固定分片投影、`session-telemetry/record` 脱敏 waterfall(瀑布式事件)、handoff 游标与最小后端约定;部署方加载的 Service provider([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel))则是原样配置的 OpenTelemetry JS SDK 日志流水线。它是一项可选能力,不属于 agent loop(智能体循环)主干,这里也没有任何内容会进入模型请求。边界公理(harness 的职责止于 `emit()`;批处理、重试、排队与丢失策略都属于上报 SDK)连同被否决的替代方案,均已在[复活 Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md)中定案;捕获点、游标与投影的约定见 [Service Definition README](../../packages/session/session-telemetry/README.md)。 +对外的会话上报拆分为一项[能力 seam](../capability-seams.md):Service Definition 与捕获协调器([dsh-session-telemetry](../../packages/session/session-telemetry),`ctx.sessionTelemetry`)拥有捕获点、固定分片投影、`session-telemetry/record` 脱敏 waterfall(瀑布式事件)、handoff 游标与最小后端约定;部署方加载的 Service Provider([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel))则是原样配置的 OpenTelemetry JS SDK 日志流水线。它是一项可选能力,不属于 agent loop(智能体循环)主干,这里也没有任何内容会进入模型请求。边界公理(harness 的职责止于 `emit()`;批处理、重试、排队与丢失策略都属于上报 SDK)连同被否决的替代方案,均已在[复活 Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md)中定案;捕获点、游标与投影的约定见 [Service Definition README](../../packages/session/session-telemetry/README.md)。 源码:[`packages/session/session-telemetry/src/index.ts`](../../packages/session/session-telemetry/src/index.ts) diff --git a/docs/subsystems/shell.i18n.yaml b/docs/subsystems/shell.i18n.yaml index 822ce1fb60..a7b6bf45fc 100644 --- a/docs/subsystems/shell.i18n.yaml +++ b/docs/subsystems/shell.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/shell.md -shell.md: 10f96936390a2b77f961ca6222d1e8c4019bbd9c -shell.zh.md: af0bc72b620c747ce107acdfeade699967e38568 +shell.md: b9f8e3aebb69348ea241be93d6fd5559068c4029 +shell.zh.md: 1ea086819f3badc92376d39cb13e584da772572b diff --git a/docs/subsystems/shell.md b/docs/subsystems/shell.md index 10f9693639..b9f8e3aebb 100644 --- a/docs/subsystems/shell.md +++ b/docs/subsystems/shell.md @@ -2,7 +2,7 @@ English | [中文](shell.zh.md) -The bash execution seam is split across a Service Definition ([dsh-shell](../../packages/shell/shell), `ctx.shell`), Service providers ([dsh-bash-local](../../packages/shell/bash-local) and [dsh-bash-sandbox](../../packages/shell/bash-sandbox)), and Consumer ([dsh-tool-bash](../../packages/shell/tool-bash), the `bash` schema). Generic background-job ids, ownership, and controls live in [jobs.md](jobs.md); this seam returns a task-free process handle. Raw process-group mechanics live behind the [subprocess seam](subprocess.md). +The bash execution seam is split across a Service Definition ([dsh-shell](../../packages/shell/shell), `ctx.shell`), Service Providers ([dsh-bash-local](../../packages/shell/bash-local) and [dsh-bash-sandbox](../../packages/shell/bash-sandbox)), and Consumer ([dsh-tool-bash](../../packages/shell/tool-bash), the `bash` schema). Generic background-job ids, ownership, and controls live in [jobs.md](jobs.md); this seam returns a task-free process handle. Raw process-group mechanics live behind the [subprocess seam](subprocess.md). Source: [`packages/shell/shell/src/types.ts`](../../packages/shell/shell/src/types.ts) diff --git a/docs/subsystems/shell.zh.md b/docs/subsystems/shell.zh.md index af0bc72b62..1ea086819f 100644 --- a/docs/subsystems/shell.zh.md +++ b/docs/subsystems/shell.zh.md @@ -2,7 +2,7 @@ [English](shell.md) | 中文 -bash 执行 seam 分为 Service Definition([dsh-shell](../../packages/shell/shell),`ctx.shell`)、Service provider([dsh-bash-local](../../packages/shell/bash-local) 与 [dsh-bash-sandbox](../../packages/shell/bash-sandbox))和 Consumer([dsh-tool-bash](../../packages/shell/tool-bash),即 `bash` schema)。通用后台任务的 job id、所有权与控制位于 [jobs.md](jobs.md);本 seam 返回一个不含任务概念的进程句柄。原始进程组机制封装在[子进程 seam](subprocess.md)之后。 +bash 执行 seam 分为 Service Definition([dsh-shell](../../packages/shell/shell),`ctx.shell`)、Service Provider([dsh-bash-local](../../packages/shell/bash-local) 与 [dsh-bash-sandbox](../../packages/shell/bash-sandbox))和 Consumer([dsh-tool-bash](../../packages/shell/tool-bash),即 `bash` schema)。通用后台任务的 job id、所有权与控制位于 [jobs.md](jobs.md);本 seam 返回一个不含任务概念的进程句柄。原始进程组机制封装在[子进程 seam](subprocess.md)之后。 源码:[`packages/shell/shell/src/types.ts`](../../packages/shell/shell/src/types.ts) diff --git a/docs/subsystems/skills.i18n.yaml b/docs/subsystems/skills.i18n.yaml index 97746ffff7..922f1eb95e 100644 --- a/docs/subsystems/skills.i18n.yaml +++ b/docs/subsystems/skills.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/skills.md -skills.md: 98d5efea0b534e8232aeae03eda3de10259756e3 -skills.zh.md: 8a2b03da4b7bab0a3142eab3cc07f66f379dfd28 +skills.md: cd935692c00f89544dc324b33e847d8d588b78a8 +skills.zh.md: f574db048e1850ee425309fe015cd21a075eefc6 diff --git a/docs/subsystems/skills.md b/docs/subsystems/skills.md index 98d5efea0b..cd935692c0 100644 --- a/docs/subsystems/skills.md +++ b/docs/subsystems/skills.md @@ -2,7 +2,7 @@ English | [中文](skills.zh.md) -The [skill capability family](../../packages/skill) includes the Service Definition ([dsh-skill](../../packages/skill/skill), `ctx.skills`), the local Service provider ([dsh-skill-filesystem](../../packages/skill/skill-filesystem)), the optional packaged badge provider ([dsh-skill-badge](../../packages/skill/skill-badge)), and the Consumer ([dsh-tool-skill](../../packages/skill/tool-skill)). The registry merges provider catalogs across its host and per-scope layers; providers contribute local or packaged skills; the Consumer owns the initial and replacement catalogs plus the model-facing `skill` tool. Skills are optional instructions, not session events, so their vocabulary lives here rather than in [core.md](core.md). +The [skill capability family](../../packages/skill) includes the Service Definition ([dsh-skill](../../packages/skill/skill), `ctx.skills`), the local Service Provider ([dsh-skill-filesystem](../../packages/skill/skill-filesystem)), the optional packaged badge provider ([dsh-skill-badge](../../packages/skill/skill-badge)), and the Consumer ([dsh-tool-skill](../../packages/skill/tool-skill)). The registry merges provider catalogs across its host and per-scope layers; providers contribute local or packaged skills; the Consumer owns the initial and replacement catalogs plus the model-facing `skill` tool. Skills are optional instructions, not session events, so their vocabulary lives here rather than in [core.md](core.md). Source: [`packages/skill/skill/src/index.ts`](../../packages/skill/skill/src/index.ts), [`packages/skill/skill-filesystem/src/index.ts`](../../packages/skill/skill-filesystem/src/index.ts), [`packages/skill/skill-badge/src/index.ts`](../../packages/skill/skill-badge/src/index.ts), and [`packages/skill/tool-skill/src/index.ts`](../../packages/skill/tool-skill/src/index.ts). diff --git a/docs/subsystems/skills.zh.md b/docs/subsystems/skills.zh.md index 8a2b03da4b..f574db048e 100644 --- a/docs/subsystems/skills.zh.md +++ b/docs/subsystems/skills.zh.md @@ -2,7 +2,7 @@ [English](skills.md) | 中文 -[skill(技能)能力族](../../packages/skill) 包含 Service Definition([dsh-skill](../../packages/skill/skill),`ctx.skills`)、本地 Service provider([dsh-skill-filesystem](../../packages/skill/skill-filesystem))、可选的随包徽章提供方([dsh-skill-badge](../../packages/skill/skill-badge))和 Consumer([dsh-tool-skill](../../packages/skill/tool-skill))。注册表在其宿主层与各 scope 层之间合并各提供方的目录;提供方贡献本地或随包 skill;Consumer 拥有初始目录和替换目录,以及面向模型的 `skill` 工具。skill 是可选的指令而非会话事件,因此其词汇定义在此处而非 [core.md](core.md)。 +[skill(技能)能力族](../../packages/skill) 包含 Service Definition([dsh-skill](../../packages/skill/skill),`ctx.skills`)、本地 Service Provider([dsh-skill-filesystem](../../packages/skill/skill-filesystem))、可选的随包徽章提供方([dsh-skill-badge](../../packages/skill/skill-badge))和 Consumer([dsh-tool-skill](../../packages/skill/tool-skill))。注册表在其宿主层与各 scope 层之间合并各提供方的目录;提供方贡献本地或随包 skill;Consumer 拥有初始目录和替换目录,以及面向模型的 `skill` 工具。skill 是可选的指令而非会话事件,因此其词汇定义在此处而非 [core.md](core.md)。 源码:[`packages/skill/skill/src/index.ts`](../../packages/skill/skill/src/index.ts)、[`packages/skill/skill-filesystem/src/index.ts`](../../packages/skill/skill-filesystem/src/index.ts)、[`packages/skill/skill-badge/src/index.ts`](../../packages/skill/skill-badge/src/index.ts) 与 [`packages/skill/tool-skill/src/index.ts`](../../packages/skill/tool-skill/src/index.ts)。 diff --git a/docs/subsystems/spill.i18n.yaml b/docs/subsystems/spill.i18n.yaml index 100914ab62..61283ed82a 100644 --- a/docs/subsystems/spill.i18n.yaml +++ b/docs/subsystems/spill.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/spill.md -spill.md: 97d18ca2cf06c2062655eb6b22547280e4ee93e7 -spill.zh.md: 32783c748d6097359a7b71950f14ad97ebc924f5 +spill.md: ad59e88b1f059d0127bdf48155450890b1bf7c9a +spill.zh.md: 015ff6fc378c21e30f1cd84c985843f8c06cd44a diff --git a/docs/subsystems/spill.md b/docs/subsystems/spill.md index 97d18ca2cf..ad59e88b1f 100644 --- a/docs/subsystems/spill.md +++ b/docs/subsystems/spill.md @@ -2,7 +2,7 @@ English | [中文](spill.zh.md) -The spill storage seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md) that persists a tool's oversized text and returns a model-facing locator plus retrieval guidance, split across packages: Service Definition ([dsh-spill](../../packages/spill/spill), `ctx.spillStore`), Service provider ([dsh-spill-local](../../packages/spill/spill-local), private session-scoped files on the host filesystem), and Consumer ([dsh-spill-policy](../../packages/spill/spill-policy), the `tools/post-execute` policy). Spill is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Preview mechanics stay in [dsh-output-retention](../../packages/util/output-retention); this seam only saves the final text the policy hands it. +The spill storage seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md) that persists a tool's oversized text and returns a model-facing locator plus retrieval guidance, split across packages: Service Definition ([dsh-spill](../../packages/spill/spill), `ctx.spillStore`), Service Provider ([dsh-spill-local](../../packages/spill/spill-local), private session-scoped files on the host filesystem), and Consumer ([dsh-spill-policy](../../packages/spill/spill-policy), the `tools/post-execute` policy). Spill is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Preview mechanics stay in [dsh-output-retention](../../packages/util/output-retention); this seam only saves the final text the policy hands it. Source: [`packages/spill/spill/src/types.ts`](../../packages/spill/spill/src/types.ts) diff --git a/docs/subsystems/spill.zh.md b/docs/subsystems/spill.zh.md index 32783c748d..015ff6fc37 100644 --- a/docs/subsystems/spill.zh.md +++ b/docs/subsystems/spill.zh.md @@ -2,7 +2,7 @@ [English](spill.md) | 中文 -spill 存储 seam 是一项[能力 seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md),它持久保存工具的超大文本,并返回面向模型的定位符与检索指引;该能力拆分到三个包:Service Definition([dsh-spill](../../packages/spill/spill),`ctx.spillStore`)、Service provider([dsh-spill-local](../../packages/spill/spill-local),宿主文件系统中会话作用域的私有文件)和 Consumer([dsh-spill-policy](../../packages/spill/spill-policy),`tools/post-execute` 策略)。spill 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇记录在此处,而不在 [core.md](core.md) 中。预览机制仍归 [dsh-output-retention](../../packages/util/output-retention) 所有;该 seam 只保存策略交给它的最终文本。 +spill 存储 seam 是一项[能力 seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md),它持久保存工具的超大文本,并返回面向模型的定位符与检索指引;该能力拆分到三个包:Service Definition([dsh-spill](../../packages/spill/spill),`ctx.spillStore`)、Service Provider([dsh-spill-local](../../packages/spill/spill-local),宿主文件系统中会话作用域的私有文件)和 Consumer([dsh-spill-policy](../../packages/spill/spill-policy),`tools/post-execute` 策略)。spill 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇记录在此处,而不在 [core.md](core.md) 中。预览机制仍归 [dsh-output-retention](../../packages/util/output-retention) 所有;该 seam 只保存策略交给它的最终文本。 源码:[`packages/spill/spill/src/types.ts`](../../packages/spill/spill/src/types.ts) diff --git a/docs/subsystems/storage.i18n.yaml b/docs/subsystems/storage.i18n.yaml index fa120bc1fa..68128fdb1b 100644 --- a/docs/subsystems/storage.i18n.yaml +++ b/docs/subsystems/storage.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/storage.md -storage.md: 33933f70176e1f4960eb423f9a1067f50b6762e4 -storage.zh.md: 2ab3473a83b7588f186ce8f3b83819b29985ae88 +storage.md: 7e7f8d2b5a98b20308ae8115484a25066c045d52 +storage.zh.md: 41d2d1520a846d988c6c7a0b08a7576cee44ff7a diff --git a/docs/subsystems/storage.md b/docs/subsystems/storage.md index 33933f7017..7e7f8d2b5a 100644 --- a/docs/subsystems/storage.md +++ b/docs/subsystems/storage.md @@ -2,7 +2,7 @@ English | [中文](storage.zh.md) -The storage subsystem persists everything that is not a session event log (session logs have their own seam — [persistence.md](persistence.md)). It is one optional capability, not part of the agent-loop spine, split as a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md): the hub and Service Definition ([dsh-storage](../../packages/storage/storage), `ctx.storage`), the Service providers ([dsh-storage-json](../../packages/storage/storage-json), registered as `json`, and [dsh-storage-sqlite](../../packages/storage/storage-sqlite), registered as `sqlite`), and the Consumer data form ([dsh-storage-domain](../../packages/storage/storage-domain), `ctx.storageDomain`, also reachable as `ctx.storage.domain`) — the backend contract's only Consumer and the typed API everything else uses. The hub performs no IO itself: backends own media, data forms own semantics, and product packages never touch backends directly. Design record: [domain KV storage Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md). +The storage subsystem persists everything that is not a session event log (session logs have their own seam — [persistence.md](persistence.md)). It is one optional capability, not part of the agent-loop spine, split as a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md): the hub and Service Definition ([dsh-storage](../../packages/storage/storage), `ctx.storage`), the Service Providers ([dsh-storage-json](../../packages/storage/storage-json), registered as `json`, and [dsh-storage-sqlite](../../packages/storage/storage-sqlite), registered as `sqlite`), and the Consumer data form ([dsh-storage-domain](../../packages/storage/storage-domain), `ctx.storageDomain`, also reachable as `ctx.storage.domain`) — the backend contract's only Consumer and the typed API everything else uses. The hub performs no IO itself: backends own media, data forms own semantics, and product packages never touch backends directly. Design record: [domain KV storage Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md). Source: [`packages/storage/storage/src/backend.ts`](../../packages/storage/storage/src/backend.ts) · [`packages/storage/storage-domain/src/spec.ts`](../../packages/storage/storage-domain/src/spec.ts) · [`packages/storage/storage-domain/src/events.ts`](../../packages/storage/storage-domain/src/events.ts) diff --git a/docs/subsystems/storage.zh.md b/docs/subsystems/storage.zh.md index 2ab3473a83..41d2d1520a 100644 --- a/docs/subsystems/storage.zh.md +++ b/docs/subsystems/storage.zh.md @@ -2,7 +2,7 @@ [English](storage.md) | 中文 -存储子系统持久保存一切不属于会话事件日志的数据(会话日志有自己的 seam——见 [persistence.md](persistence.md))。它是一项可选能力,不属于 agent loop(智能体循环)主干,并按[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) 拆分:枢纽(hub)与 Service Definition([dsh-storage](../../packages/storage/storage),`ctx.storage`)、Service provider(注册为 `json` 的 [dsh-storage-json](../../packages/storage/storage-json) 与注册为 `sqlite` 的 [dsh-storage-sqlite](../../packages/storage/storage-sqlite)),以及 Consumer 数据形式([dsh-storage-domain](../../packages/storage/storage-domain),`ctx.storageDomain`,也可经 `ctx.storage.domain` 访问)——它是后端约定的唯一 Consumer,也是其他一切所使用的类型化 API。枢纽自身不做任何 IO:后端拥有介质,数据形式拥有语义,产品包绝不直接触碰后端。设计记录:[领域 KV 存储 Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md)。 +存储子系统持久保存一切不属于会话事件日志的数据(会话日志有自己的 seam——见 [persistence.md](persistence.md))。它是一项可选能力,不属于 agent loop(智能体循环)主干,并按[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) 拆分:枢纽(hub)与 Service Definition([dsh-storage](../../packages/storage/storage),`ctx.storage`)、Service Provider(注册为 `json` 的 [dsh-storage-json](../../packages/storage/storage-json) 与注册为 `sqlite` 的 [dsh-storage-sqlite](../../packages/storage/storage-sqlite)),以及 Consumer 数据形式([dsh-storage-domain](../../packages/storage/storage-domain),`ctx.storageDomain`,也可经 `ctx.storage.domain` 访问)——它是后端约定的唯一 Consumer,也是其他一切所使用的类型化 API。枢纽自身不做任何 IO:后端拥有介质,数据形式拥有语义,产品包绝不直接触碰后端。设计记录:[领域 KV 存储 Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md)。 源码:[`packages/storage/storage/src/backend.ts`](../../packages/storage/storage/src/backend.ts) · [`packages/storage/storage-domain/src/spec.ts`](../../packages/storage/storage-domain/src/spec.ts) · [`packages/storage/storage-domain/src/events.ts`](../../packages/storage/storage-domain/src/events.ts) diff --git a/docs/subsystems/subagent.i18n.yaml b/docs/subsystems/subagent.i18n.yaml index d0a1715e39..a86dc8de4a 100644 --- a/docs/subsystems/subagent.i18n.yaml +++ b/docs/subsystems/subagent.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/subagent.md -subagent.md: 4d02c177533e8dbc192d5460b65bb4348f565c41 -subagent.zh.md: 483446187dcd2386f0f3d7d50d3fa7b97d09e02c +subagent.md: a683a679e6017351540ee4b73adc74375ef0a1d6 +subagent.zh.md: 61391cd297c0eb14f4c0d8eac4539b551cb60bda diff --git a/docs/subsystems/subagent.md b/docs/subsystems/subagent.md index 4d02c17753..a683a679e6 100644 --- a/docs/subsystems/subagent.md +++ b/docs/subsystems/subagent.md @@ -4,7 +4,7 @@ English | [中文](subagent.zh.md) The subagent seam lets an agent delegate work to a child agent. Like [bash](shell.md), it is **one optional capability**, not part of the agent loop, so its types live here rather than in [core.md](core.md). It differs from the other capability seams because **multiple provider implementations coexist** in one context, registered by name (`ctx.subagents`), while bash allows only one executor. Its registry follows the [LLM adapter registry](llm-streaming.md), not the single-service bash executor. -Service Definition: [dsh-subagent](../../packages/subagent/subagent) (`ctx.subagents` + the vocabulary below). Service providers are sibling packages (`dsh-subagent-spawn-in-process`, `-fork`, `-acp`, `-codex`, `-claude-code`, `-dsh-sdk`); the model-facing Consumers are [dsh-tool-subagent](../../packages/subagent/tool-subagent) (per-provider delegation), [dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control) (the optional global `send_message`, `interrupt_agent`, and `list_agents` controls), and [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report) (the optional child-scoped `report` return channel). The same `ctx.subagents` service owns continuable-child orchestration through an internal activation manager and read-only child and descendant discovery straight from the session store and optional session persistence. Product-provider rationale lives in [the Codex and Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md); common-seam rationale lives in [the subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md), [the continuable subagents Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md), [the report-tool Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md), [the durable catalog Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md), [the list-identity-projection Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md), and [the merged-service Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md). +Service Definition: [dsh-subagent](../../packages/subagent/subagent) (`ctx.subagents` + the vocabulary below). Service Providers are sibling packages (`dsh-subagent-spawn-in-process`, `-fork`, `-acp`, `-codex`, `-claude-code`, `-dsh-sdk`); the model-facing Consumers are [dsh-tool-subagent](../../packages/subagent/tool-subagent) (per-provider delegation), [dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control) (the optional global `send_message`, `interrupt_agent`, and `list_agents` controls), and [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report) (the optional child-scoped `report` return channel). The same `ctx.subagents` service owns continuable-child orchestration through an internal activation manager and read-only child and descendant discovery straight from the session store and optional session persistence. Product-provider rationale lives in [the Codex and Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md); common-seam rationale lives in [the subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md), [the continuable subagents Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md), [the report-tool Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md), [the durable catalog Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md), [the list-identity-projection Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md), and [the merged-service Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md). Sources: [`packages/subagent/subagent/src/types.ts`](../../packages/subagent/subagent/src/types.ts), [`packages/subagent/subagent/src/index.ts`](../../packages/subagent/subagent/src/index.ts), and [`packages/subagent/subagent/src/continuation.ts`](../../packages/subagent/subagent/src/continuation.ts) diff --git a/docs/subsystems/subagent.zh.md b/docs/subsystems/subagent.zh.md index 483446187d..61391cd297 100644 --- a/docs/subsystems/subagent.zh.md +++ b/docs/subsystems/subagent.zh.md @@ -4,7 +4,7 @@ subagent seam 让一个 agent(智能体)将工作委派给子 agent。与 [bash](shell.md) 一样,它是**一项可选能力**,不属于 agent loop(智能体循环),因此其类型定义在此而非 [core.md](core.md) 中。它不同于其他能力 seam,因为**同一上下文中可共存多个提供方实现**,并按名称注册(`ctx.subagents`),而 bash 只允许一个执行器。该注册表遵循 [LLM(大语言模型)适配器注册表](llm-streaming.md),而非单服务的 bash 执行器。 -Service Definition:[dsh-subagent](../../packages/subagent/subagent)(`ctx.subagents` + 下文词汇)。Service provider 是六个兄弟包:`dsh-subagent-spawn-in-process`、`-fork`、`-acp`、`-codex`、`-claude-code`、`-dsh-sdk`;面向模型的 Consumer 包括 [dsh-tool-subagent](../../packages/subagent/tool-subagent)(按提供方委派)、[dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control)(可选的全局 `send_message`、`interrupt_agent` 与 `list_agents` 控制工具)和 [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report)(可选的 child 作用域 `report` 返回通道)。同一个 `ctx.subagents` 服务通过内部激活管理器负责可继续子 agent 编排,并直接基于会话存储和可选的会话持久化提供只读的 child 与后代发现。产品提供方设计理由见 [Codex 与 Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md);通用 seam 的设计理由见 [subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md)、[可继续 subagent Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md)、[report 工具 Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md)、[持久化目录 Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md)、[列表身份投影 Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md)和[服务合并 Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md)。 +Service Definition:[dsh-subagent](../../packages/subagent/subagent)(`ctx.subagents` + 下文词汇)。Service Provider 是六个兄弟包:`dsh-subagent-spawn-in-process`、`-fork`、`-acp`、`-codex`、`-claude-code`、`-dsh-sdk`;面向模型的 Consumer 包括 [dsh-tool-subagent](../../packages/subagent/tool-subagent)(按提供方委派)、[dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control)(可选的全局 `send_message`、`interrupt_agent` 与 `list_agents` 控制工具)和 [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report)(可选的 child 作用域 `report` 返回通道)。同一个 `ctx.subagents` 服务通过内部激活管理器负责可继续子 agent 编排,并直接基于会话存储和可选的会话持久化提供只读的 child 与后代发现。产品提供方设计理由见 [Codex 与 Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md);通用 seam 的设计理由见 [subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md)、[可继续 subagent Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md)、[report 工具 Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md)、[持久化目录 Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md)、[列表身份投影 Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md)和[服务合并 Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md)。 源码:[`packages/subagent/subagent/src/types.ts`](../../packages/subagent/subagent/src/types.ts)、[`packages/subagent/subagent/src/index.ts`](../../packages/subagent/subagent/src/index.ts)和 [`packages/subagent/subagent/src/continuation.ts`](../../packages/subagent/subagent/src/continuation.ts) diff --git a/docs/subsystems/subprocess.i18n.yaml b/docs/subsystems/subprocess.i18n.yaml index 191ea52af5..d063134567 100644 --- a/docs/subsystems/subprocess.i18n.yaml +++ b/docs/subsystems/subprocess.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/subprocess.md -subprocess.md: 3cc6e33ce2befc6bc65e258507881df542b7c149 -subprocess.zh.md: 1189ceb0526418ee92e0da280e118c10991508d5 +subprocess.md: af6770e8c04f79ab1981967d5a3bca5a39b954be +subprocess.zh.md: 19f20e7fcd675d87cf768258d1ab9c37bf80a836 diff --git a/docs/subsystems/subprocess.md b/docs/subsystems/subprocess.md index 3cc6e33ce2..af6770e8c0 100644 --- a/docs/subsystems/subprocess.md +++ b/docs/subsystems/subprocess.md @@ -2,7 +2,7 @@ English | [中文](subprocess.zh.md) -The subprocess seam is split across a Service Definition ([dsh-subprocess](../../packages/subprocess/subprocess), `ctx.subprocess`) and Service provider ([dsh-subprocess-local](../../packages/subprocess/subprocess-local)); its Consumers are other capability seams and out-of-process backends: the [bash executor family](shell.md) uses collected batch output, LSP uses raw protocol pipes, the PTY backend uses the terminal primitive, and the ACP subagent backend uses piped ndjson plus inherited stderr. This seam owns the managed `DSH_*` environment namespace, the shared credential scrub (`scrubbedParentEnv`), and the `CollectedOutput` shape; [dsh-shell](../../packages/shell/shell) re-exports the vocabulary so bash consumers keep one import root. +The subprocess seam is split across a Service Definition ([dsh-subprocess](../../packages/subprocess/subprocess), `ctx.subprocess`) and Service Provider ([dsh-subprocess-local](../../packages/subprocess/subprocess-local)); its Consumers are other capability seams and out-of-process backends: the [bash executor family](shell.md) uses collected batch output, LSP uses raw protocol pipes, the PTY backend uses the terminal primitive, and the ACP subagent backend uses piped ndjson plus inherited stderr. This seam owns the managed `DSH_*` environment namespace, the shared credential scrub (`scrubbedParentEnv`), and the `CollectedOutput` shape; [dsh-shell](../../packages/shell/shell) re-exports the vocabulary so bash consumers keep one import root. Source: [`packages/subprocess/subprocess/src/types.ts`](../../packages/subprocess/subprocess/src/types.ts) and [`packages/subprocess/subprocess/src/index.ts`](../../packages/subprocess/subprocess/src/index.ts) diff --git a/docs/subsystems/subprocess.zh.md b/docs/subsystems/subprocess.zh.md index 1189ceb052..19f20e7fcd 100644 --- a/docs/subsystems/subprocess.zh.md +++ b/docs/subsystems/subprocess.zh.md @@ -2,7 +2,7 @@ [English](subprocess.md) | 中文 -子进程 seam 分为 Service Definition([dsh-subprocess](../../packages/subprocess/subprocess),`ctx.subprocess`)与 Service provider([dsh-subprocess-local](../../packages/subprocess/subprocess-local));它的 Consumer 是其他能力 seam 与进程外后端:[bash 执行器家族](shell.md)使用收集模式的批量输出,LSP 使用原始协议管道,PTY 后端使用终端原语,ACP(Agent Client Protocol)subagent 后端则使用通过管道传输的 ndjson,并让 stderr 采用 inherit。该 seam 拥有受管的 `DSH_*` 环境命名空间、共享的凭据清除(`scrubbedParentEnv`)与 `CollectedOutput` 形状;[dsh-shell](../../packages/shell/shell) 重导出这套词汇,使 bash 消费方保持单一导入入口。 +子进程 seam 分为 Service Definition([dsh-subprocess](../../packages/subprocess/subprocess),`ctx.subprocess`)与 Service Provider([dsh-subprocess-local](../../packages/subprocess/subprocess-local));它的 Consumer 是其他能力 seam 与进程外后端:[bash 执行器家族](shell.md)使用收集模式的批量输出,LSP 使用原始协议管道,PTY 后端使用终端原语,ACP(Agent Client Protocol)subagent 后端则使用通过管道传输的 ndjson,并让 stderr 采用 inherit。该 seam 拥有受管的 `DSH_*` 环境命名空间、共享的凭据清除(`scrubbedParentEnv`)与 `CollectedOutput` 形状;[dsh-shell](../../packages/shell/shell) 重导出这套词汇,使 bash 消费方保持单一导入入口。 源码:[`packages/subprocess/subprocess/src/types.ts`](../../packages/subprocess/subprocess/src/types.ts) 与 [`packages/subprocess/subprocess/src/index.ts`](../../packages/subprocess/subprocess/src/index.ts) diff --git a/docs/subsystems/web.i18n.yaml b/docs/subsystems/web.i18n.yaml index 3dfe626acd..840865ef35 100644 --- a/docs/subsystems/web.i18n.yaml +++ b/docs/subsystems/web.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/web.md -web.md: 741df8d92c20817cb3115dafffba7c7be9205aec -web.zh.md: 0cce8500834896c156ff85d935b9e80853a3196c +web.md: 3bcd3ac24927c8c51baeabd770e2bd91c5ad1b77 +web.zh.md: 3348be2b808dc286364f5a795b236cb299acd6a6 diff --git a/docs/subsystems/web.md b/docs/subsystems/web.md index 741df8d92c..3bcd3ac249 100644 --- a/docs/subsystems/web.md +++ b/docs/subsystems/web.md @@ -2,7 +2,7 @@ English | [中文](web.zh.md) -The web access seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md) that spans **two operations** (search and fetch) on one `ctx.web` service, split across packages: Service Definition ([dsh-web](../../packages/web/web), `ctx.web` + the provider registries), Service providers ([dsh-web-search-exa](../../packages/web/web-search-exa), [dsh-web-search-perplexity](../../packages/web/web-search-perplexity), [dsh-web-search-deepseek](../../packages/web/web-search-deepseek), [dsh-web-fetch-http](../../packages/web/web-fetch-http)), and Consumer ([dsh-tool-web](../../packages/web/tool-web), the `web_search`/`web_fetch` tool schemas). Web is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A search-provider swap does not change how the model asks for a query, and a fetch-provider swap does not change how the model asks for a URL. +The web access seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md) that spans **two operations** (search and fetch) on one `ctx.web` service, split across packages: Service Definition ([dsh-web](../../packages/web/web), `ctx.web` + the provider registries), Service Providers ([dsh-web-search-exa](../../packages/web/web-search-exa), [dsh-web-search-perplexity](../../packages/web/web-search-perplexity), [dsh-web-search-deepseek](../../packages/web/web-search-deepseek), [dsh-web-fetch-http](../../packages/web/web-fetch-http)), and Consumer ([dsh-tool-web](../../packages/web/tool-web), the `web_search`/`web_fetch` tool schemas). Web is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A search-provider swap does not change how the model asks for a query, and a fetch-provider swap does not change how the model asks for a URL. Source: [`packages/web/web/src/types.ts`](../../packages/web/web/src/types.ts) diff --git a/docs/subsystems/web.zh.md b/docs/subsystems/web.zh.md index 0cce850083..3348be2b80 100644 --- a/docs/subsystems/web.zh.md +++ b/docs/subsystems/web.zh.md @@ -2,7 +2,7 @@ [English](web.md) | 中文 -Web 访问 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md),在同一个 `ctx.web` 服务上横跨**两项操作**(search 与 fetch),并拆分到多个包:Service Definition([dsh-web](../../packages/web/web),`ctx.web` + 提供方注册表)、Service provider([dsh-web-search-exa](../../packages/web/web-search-exa)、[dsh-web-search-perplexity](../../packages/web/web-search-perplexity)、[dsh-web-search-deepseek](../../packages/web/web-search-deepseek)、[dsh-web-fetch-http](../../packages/web/web-fetch-http))与 Consumer([dsh-tool-web](../../packages/web/tool-web),即 `web_search`/`web_fetch` 工具 schema)。Web 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。更换 search 提供方不会改变模型提交查询的方式,更换 fetch 提供方也不会改变模型请求 URL 的方式。 +Web 访问 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md),在同一个 `ctx.web` 服务上横跨**两项操作**(search 与 fetch),并拆分到多个包:Service Definition([dsh-web](../../packages/web/web),`ctx.web` + 提供方注册表)、Service Provider([dsh-web-search-exa](../../packages/web/web-search-exa)、[dsh-web-search-perplexity](../../packages/web/web-search-perplexity)、[dsh-web-search-deepseek](../../packages/web/web-search-deepseek)、[dsh-web-fetch-http](../../packages/web/web-fetch-http))与 Consumer([dsh-tool-web](../../packages/web/tool-web),即 `web_search`/`web_fetch` 工具 schema)。Web 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](core.md) 中。更换 search 提供方不会改变模型提交查询的方式,更换 fetch 提供方也不会改变模型请求 URL 的方式。 源码:[`packages/web/web/src/types.ts`](../../packages/web/web/src/types.ts) diff --git a/docs/subsystems/workflow.i18n.yaml b/docs/subsystems/workflow.i18n.yaml index 8f9d56e57e..2237e355a1 100644 --- a/docs/subsystems/workflow.i18n.yaml +++ b/docs/subsystems/workflow.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/workflow.md -workflow.md: bf11ec3a40f9c964fbc535a0368b30e422b5452e -workflow.zh.md: b87bffd4780d167b4106276bfbca53e48ef6d833 +workflow.md: f2c987fbc2ca3a334c55bf0b299764e2b3e6bb06 +workflow.zh.md: b4e6e6afe73b20f1da39c1548c072cf7aeb1f441 diff --git a/docs/subsystems/workflow.md b/docs/subsystems/workflow.md index bf11ec3a40..f2c987fbc2 100644 --- a/docs/subsystems/workflow.md +++ b/docs/subsystems/workflow.md @@ -4,7 +4,7 @@ English | [中文](workflow.zh.md) The workflow seam lets an agent run a model-written orchestration SCRIPT that starts subagents. Like [subagent](subagent.md) it is **one optional capability**, not part of the agent loop, so its types and operations live here rather than in [core.md](core.md). Like bash, it permits ONE engine implementation per context to provide `ctx.workflowEngine`; there is no named-provider registry (a second engine replaces the first through plugin configuration rather than running beside it). -Service Definition: [dsh-workflow](../../packages/workflow/workflow) (`ctx.workflowEngine` + the vocabulary below). The Service provider is [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread) (a `node:worker_threads` engine — one worker per run, the script's vm context inside it); the model-facing Consumer is [dsh-tool-workflow](../../packages/workflow/tool-workflow). The proposal and rationale: [the dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md). +Service Definition: [dsh-workflow](../../packages/workflow/workflow) (`ctx.workflowEngine` + the vocabulary below). The Service Provider is [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread) (a `node:worker_threads` engine — one worker per run, the script's vm context inside it); the model-facing Consumer is [dsh-tool-workflow](../../packages/workflow/tool-workflow). The proposal and rationale: [the dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md). Sources: browser-safe vocabulary in [`packages/workflow/workflow/src/types.ts`](../../packages/workflow/workflow/src/types.ts), Host request and live-run handles in [`runtime-types.ts`](../../packages/workflow/workflow/src/runtime-types.ts). diff --git a/docs/subsystems/workflow.zh.md b/docs/subsystems/workflow.zh.md index b87bffd478..b4e6e6afe7 100644 --- a/docs/subsystems/workflow.zh.md +++ b/docs/subsystems/workflow.zh.md @@ -4,7 +4,7 @@ 工作流 seam 允许 agent(智能体)运行由模型编写、会启动 subagent 的编排脚本。与 [subagent](subagent.md) 一样,它是**一项可选能力**,不属于 agent loop,因此其类型和操作记录在此处,而非 [core.md](core.md)。与 bash 一样,每个上下文只允许一个引擎实现提供 `ctx.workflowEngine`;没有命名提供方注册表(第二个引擎通过插件配置替换第一个,而不与它同时运行)。 -Service Definition:[dsh-workflow](../../packages/workflow/workflow)(`ctx.workflowEngine` + 下文词汇)。Service provider 是 [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread)(一个 `node:worker_threads` 引擎——每个 run 一个 worker,脚本的 vm 上下文位于其中);面向模型的 Consumer 是 [dsh-tool-workflow](../../packages/workflow/tool-workflow)。提案与设计理由见 [dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。 +Service Definition:[dsh-workflow](../../packages/workflow/workflow)(`ctx.workflowEngine` + 下文词汇)。Service Provider 是 [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread)(一个 `node:worker_threads` 引擎——每个 run 一个 worker,脚本的 vm 上下文位于其中);面向模型的 Consumer 是 [dsh-tool-workflow](../../packages/workflow/tool-workflow)。提案与设计理由见 [dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。 源码:浏览器安全词汇位于 [`packages/workflow/workflow/src/types.ts`](../../packages/workflow/workflow/src/types.ts),Host 请求与活跃运行句柄位于 [`runtime-types.ts`](../../packages/workflow/workflow/src/runtime-types.ts)。 diff --git a/docs/user/develop/basic/tool.i18n.yaml b/docs/user/develop/basic/tool.i18n.yaml index 8044c4adaa..1b5cac6c87 100644 --- a/docs/user/develop/basic/tool.i18n.yaml +++ b/docs/user/develop/basic/tool.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/basic/tool.md -tool.md: a149f6876c573c9ece4b066ef6c211f69b0b03a8 -tool.zh.md: bcce5001497908cefa643749caee8da0e9859cf7 +tool.md: eb262d131a7f2b540827e86e56f8c0a28cb5f904 +tool.zh.md: d33d9946a73881df2cd44ebf3695819d02d013ab diff --git a/docs/user/develop/basic/tool.md b/docs/user/develop/basic/tool.md index a149f6876c..eb262d131a 100644 --- a/docs/user/develop/basic/tool.md +++ b/docs/user/develop/basic/tool.md @@ -49,4 +49,4 @@ Open `http://127.0.0.1:3080` and ask: `Use the greet tool to greet Ada.` The mod - [Plugin configuration](./config.md) — make the greeting configurable. - [Tool authoring reference](../../../cookbook/adding-a-tool.md) — look up nested schemas, canonical values, background work, policy hooks, Code Mode, and UI cards. -- [Capability layering](../practice/) — split a replaceable capability into Service Definition, Service provider, and Consumer packages. +- [Capability layering](../practice/) — split a replaceable capability into Service Definition, Service Provider, and Consumer packages. diff --git a/docs/user/develop/basic/tool.zh.md b/docs/user/develop/basic/tool.zh.md index bcce500149..d33d9946a7 100644 --- a/docs/user/develop/basic/tool.zh.md +++ b/docs/user/develop/basic/tool.zh.md @@ -49,4 +49,4 @@ pnpm dsh web --patch ./scratch-plugin/cordis.yml - [插件配置](./config.md) — 让问候语可配置。 - [工具编写参考](../../../cookbook/adding-a-tool.md) — 查阅嵌套 schema、规范值、后台工作、策略钩子、Code Mode 和 UI 卡片。 -- [能力分层](../practice/) — 将可替换能力拆分为 Service Definition、Service provider 和 Consumer 三类包。 +- [能力分层](../practice/) — 将可替换能力拆分为 Service Definition、Service Provider 和 Consumer 三类包。 diff --git a/docs/user/develop/practice/index.i18n.yaml b/docs/user/develop/practice/index.i18n.yaml index dd582b0886..166269706c 100644 --- a/docs/user/develop/practice/index.i18n.yaml +++ b/docs/user/develop/practice/index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/practice/index.md -index.md: 3619a39f4a39b42cf4269d3778f233ecc1731933 -index.zh.md: 8bd378af5eaf2741c34d76a152fa8a62a947bf41 +index.md: 56ca7249b8b156ceb78327b547413dbf65726dcc +index.zh.md: aec5980ea45cfd5f8f7408877743920e68e15cbd diff --git a/docs/user/develop/practice/index.md b/docs/user/develop/practice/index.md index 3619a39f4a..56ca7249b8 100644 --- a/docs/user/develop/practice/index.md +++ b/docs/user/develop/practice/index.md @@ -6,14 +6,14 @@ This page has two parts: a concept reference for the three-role capability patte ## Concept reference -When a capability is general enough to need replaceable providers, such as Bash execution, Harness separates three roles: a **Service Definition**, a **Service provider**, and a **Consumer**. Put the roles in separate packages when they need to evolve or be replaced independently; a package may otherwise own more than one role. The complete capability is its seam. No individual role is a seam. +When a capability is general enough to need replaceable providers, such as Bash execution, Harness separates three roles: a **Service Definition**, a **Service Provider**, and a **Consumer**. Put the roles in separate packages when they need to evolve or be replaced independently; a package may otherwise own more than one role. The complete capability is its seam. No individual role is a seam. ## Bash example The Bash execution capability consists of: - **Service Definition** (`dsh-shell`) — defines the Cordis service and Bash request and result types -- **Service provider** (`dsh-bash-local`) — executes commands on the local machine +- **Service Provider** (`dsh-bash-local`) — executes commands on the local machine - **Consumer** (`dsh-tool-bash`) — exposes the capability as a model-callable tool ``` @@ -44,14 +44,14 @@ The Service Definition and tool remain unchanged while the provider changes. ### Evolve independently - The Service Definition changes rarely after callers depend on its contract. -- Service providers can improve performance and security independently. +- Service Providers can improve performance and security independently. - Consumers can change how they present the capability to the model. ### Decouple dependencies -- The Service provider depends on the Service Definition. +- The Service Provider depends on the Service Definition. - The Consumer depends on the Service Definition. -- The Service provider and Consumer **do not depend on each other**. +- The Service Provider and Consumer **do not depend on each other**. The [capability-seam reference](../../../capability-seams.md) owns the current built-in families and package links. @@ -87,7 +87,7 @@ export interface MyCapResult { } ``` -### Step 2: write a Service provider +### Step 2: write a Service Provider ```ts ignore-check // packages/my-cap/my-cap-local/src/index.ts @@ -147,7 +147,7 @@ export function apply(ctx: Context) { ## Design points - **Do not split preemptively** — use separate packages only when the roles need to evolve independently. A simple tool plugin does not. -- **The Service Definition owns Request/Result types** — Service providers and Consumers depend only on the Service Definition package. +- **The Service Definition owns Request/Result types** — Service Providers and Consumers depend only on the Service Definition package. - **Explicit > implicit** — resolve defaults in an explicit `resolve(request): Spec` step rather than hiding `?? default` expressions inside `run()`. ## Next steps diff --git a/docs/user/develop/practice/index.zh.md b/docs/user/develop/practice/index.zh.md index 8bd378af5e..aec5980ea4 100644 --- a/docs/user/develop/practice/index.zh.md +++ b/docs/user/develop/practice/index.zh.md @@ -6,14 +6,14 @@ ## 概念参考 -当一项能力足够通用,需要支持可替换的提供方时(例如 Bash 执行),harness 会区分三种角色:**Service Definition**、**Service provider** 和 **Consumer**。角色需要独立演进或替换时,将它们放入不同包;否则一个包可以承担多个角色。完整能力构成其 seam。任何单一角色都不是 seam。 +当一项能力足够通用,需要支持可替换的提供方时(例如 Bash 执行),harness 会区分三种角色:**Service Definition**、**Service Provider** 和 **Consumer**。角色需要独立演进或替换时,将它们放入不同包;否则一个包可以承担多个角色。完整能力构成其 seam。任何单一角色都不是 seam。 ## 以 Bash 为例 以 Bash 执行能力为例: - **Service Definition** (`dsh-shell`):定义 Cordis 服务以及 Bash 请求和结果类型 -- **Service provider** (`dsh-bash-local`):在本地计算机上执行命令 +- **Service Provider** (`dsh-bash-local`):在本地计算机上执行命令 - **Consumer** (`dsh-tool-bash`):将该能力公开为模型可调用的工具 ``` @@ -44,14 +44,14 @@ ### 独立演进 - 调用方开始依赖 Service Definition 的约定后,Service Definition 很少改动。 -- Service provider 可以独立优化性能和安全性。 +- Service Provider 可以独立优化性能和安全性。 - Consumer 可以调整能力向模型呈现的方式。 ### 依赖解耦 -- Service provider 依赖 Service Definition。 +- Service Provider 依赖 Service Definition。 - Consumer 依赖 Service Definition。 -- Service provider 和 Consumer **互不依赖**。 +- Service Provider 和 Consumer **互不依赖**。 当前内置系列及其包链接由[能力 seam 参考](../../../capability-seams.md)负责。 @@ -87,7 +87,7 @@ export interface MyCapResult { } ``` -### 第二步:编写 Service provider +### 第二步:编写 Service Provider ```ts ignore-check // packages/my-cap/my-cap-local/src/index.ts @@ -147,7 +147,7 @@ export function apply(ctx: Context) { ## 设计要点 - **不要预防性拆分**:只有角色需要独立演进时,才使用不同包。简单的工具插件无需拆分。 -- **Service Definition 拥有 Request/Result 类型**:Service provider 和 Consumer 只依赖 Service Definition 包。 +- **Service Definition 拥有 Request/Result 类型**:Service Provider 和 Consumer 只依赖 Service Definition 包。 - **显式优于隐式**:实现应通过显式的 `resolve(request): Spec` 步骤处理默认值,而不是在 `run()` 中隐藏 `?? default`。 ## 下一步 diff --git a/packages/README.i18n.yaml b/packages/README.i18n.yaml index 856b455103..19feb5b2c3 100644 --- a/packages/README.i18n.yaml +++ b/packages/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/README.md -README.md: 2e28b190378ed8ca25102d6311bd8a2c8d5e1c58 -README.zh.md: e0e1973d146c241d4846c4c237ed0e5f6a0d7b8a +README.md: 7904ec1fea8dbab361fcd90b2b32f1c743ce5537 +README.zh.md: bac14113b656990cfda18a448034bfa25482c4fc diff --git a/packages/README.md b/packages/README.md index 2e28b19037..7904ec1fea 100644 --- a/packages/README.md +++ b/packages/README.md @@ -64,6 +64,6 @@ New packages join existing groups; new groups update their README and this table The dependency graph is generated: [docs/module-graph.md](../docs/module-graph.md) (`pnpm run gen-module-graph`, freshness-gated in CI). -**Extension plugins depend on Service Definitions, never concrete providers.** `dsh-agent-loop` is swappable; UI, hook, and tool plugins use `dsh-agent`. Composition bundles, including `dsh-agent-spine-demo`, may depend on spine plugins. Capabilities separate Service Definition / Service provider / Consumer roles when they evolve independently; see [capability seams](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md). +**Extension plugins depend on Service Definitions, never concrete providers.** `dsh-agent-loop` is swappable; UI, hook, and tool plugins use `dsh-agent`. Composition bundles, including `dsh-agent-spine-demo`, may depend on spine plugins. Capabilities separate Service Definition / Service Provider / Consumer roles when they evolve independently; see [capability seams](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md). Package READMEs cover purpose, APIs, extension points, and [Model Experience](../docs/cookbook/adding-a-package.md#4-write-the-package-readme) unless on the model-agnostic [omission allowlist](../scripts/verify-package-readme-model-experience.ts). They also carry `## Known Limitations and Deferred Work` or use its [allowlist](../scripts/verify-package-readme-limitations.ts). diff --git a/packages/README.zh.md b/packages/README.zh.md index e0e1973d14..bac14113b6 100644 --- a/packages/README.zh.md +++ b/packages/README.zh.md @@ -64,6 +64,6 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` 子类和函数插件通 依赖图由工具生成:[docs/module-graph.md](../docs/module-graph.md)(`pnpm run gen-module-graph`,CI 中有新鲜度门禁)。 -**扩展插件依赖 Service Definition,绝不依赖具体提供方。** `dsh-agent-loop` 可替换;UI、钩子和工具插件使用 `dsh-agent`。包括 `dsh-agent-spine-demo` 在内的组合包可以依赖主干插件。能力在 Service Definition/Service provider/Consumer 角色需要独立演进时将其分离;详见[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)。 +**扩展插件依赖 Service Definition,绝不依赖具体提供方。** `dsh-agent-loop` 可替换;UI、钩子和工具插件使用 `dsh-agent`。包括 `dsh-agent-spine-demo` 在内的组合包可以依赖主干插件。能力在 Service Definition/Service Provider/Consumer 角色需要独立演进时将其分离;详见[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)。 包 README 覆盖用途、API、扩展点和[模型体验](../docs/cookbook/adding-a-package.md#4-write-the-package-readme);列入模型无关[省略允许清单](../scripts/verify-package-readme-model-experience.ts)的包除外。它们还要包含 `## Known Limitations and Deferred Work`,或列入其[允许清单](../scripts/verify-package-readme-limitations.ts)。 diff --git a/packages/boot/app-boot/src/profile.ts b/packages/boot/app-boot/src/profile.ts index 59dac77d69..24ba7b66ee 100644 --- a/packages/boot/app-boot/src/profile.ts +++ b/packages/boot/app-boot/src/profile.ts @@ -209,7 +209,7 @@ function ensureSymlink(link: string, target: string): void { * installation" contract. The closure (not just direct dependencies) is * required for out-of-tree plugins: their peer dependencies name Service * Definition packages (`dsh-compaction`, `dsh-invariants`, ...) that the app - * reaches only through its Service provider packages. Symlinked packages + * reaches only through its Service Provider packages. Symlinked packages * resolve their own dependencies from their real directories (Node's default * symlink-following), so each package needs only its one flat link. * Idempotent: correct links are kept and moved installations are diff --git a/packages/compaction/compaction-basic/README.i18n.yaml b/packages/compaction/compaction-basic/README.i18n.yaml index 397ab1054e..e7ea072e85 100644 --- a/packages/compaction/compaction-basic/README.i18n.yaml +++ b/packages/compaction/compaction-basic/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/compaction/compaction-basic/README.md -README.md: 227bc64ff9e8ff27b757ca3900aba743bf11776d -README.zh.md: 93a17a29be256ac4d907790ad6f974aa7554ae48 +README.md: 82df7b7e399cef80d92611819e9e58f13babf175 +README.zh.md: c405c7a253518b0bd4860b8385634c589cf3791e diff --git a/packages/compaction/compaction-basic/README.md b/packages/compaction/compaction-basic/README.md index 227bc64ff9..82df7b7e39 100644 --- a/packages/compaction/compaction-basic/README.md +++ b/packages/compaction/compaction-basic/README.md @@ -4,7 +4,7 @@ English | [中文](README.zh.md) The **basic compaction backend**: a `BasicCompactionEngine` implementing the `@deepseek-ai/dsh-compaction` Service Definition with reusable `ctx.tokenMeter` pressure, token-budget retention, and summarization as a direct one-shot `ctx.llm.stream()` call that replays the conversation prefix to reuse the provider's KV cache (interceptable at `llm/stream`). -This package owns the Service provider role of the compaction capability — see the [Service Definition package](../compaction/README.md) for its contract and the [capability-seam Agent Note](../../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md) for the design. +This package owns the Service Provider role of the compaction capability — see the [Service Definition package](../compaction/README.md) for its contract and the [capability-seam Agent Note](../../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md) for the design. ## What it owns diff --git a/packages/compaction/compaction-basic/README.zh.md b/packages/compaction/compaction-basic/README.zh.md index 93a17a29be..c405c7a253 100644 --- a/packages/compaction/compaction-basic/README.zh.md +++ b/packages/compaction/compaction-basic/README.zh.md @@ -4,7 +4,7 @@ **基础压缩(compaction)后端**:`BasicCompactionEngine` 实现 `@deepseek-ai/dsh-compaction` Service Definition,使用可复用的 `ctx.tokenMeter` 压力、token 预算保留与摘要。摘要是直接的一次性 `ctx.llm.stream()` 调用,它会回放会话前缀以复用提供方的 KV Cache(可在 `llm/stream` 处拦截)。 -本包承担压缩能力的 Service provider 角色;其约定见 [Service Definition 包](../compaction/README.md),设计见 [能力 seam Agent Note](../../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)。 +本包承担压缩能力的 Service Provider 角色;其约定见 [Service Definition 包](../compaction/README.md),设计见 [能力 seam Agent Note](../../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)。 ## 拥有的职责 diff --git a/packages/compaction/compaction/README.i18n.yaml b/packages/compaction/compaction/README.i18n.yaml index 19af2732b0..68587d1ff2 100644 --- a/packages/compaction/compaction/README.i18n.yaml +++ b/packages/compaction/compaction/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/compaction/compaction/README.md -README.md: 5c2d9df07a24380ab93bd6b34dfa771b85211866 -README.zh.md: b5a13cf47015867eb72981a64fc893a2605e5cd8 +README.md: 89788990b3f3894954f4dfc24bb3230300ae8786 +README.zh.md: 761bac804bd761fff7d3fe7bff9136da631ef78d diff --git a/packages/compaction/compaction/README.md b/packages/compaction/compaction/README.md index 5c2d9df07a..89788990b3 100644 --- a/packages/compaction/compaction/README.md +++ b/packages/compaction/compaction/README.md @@ -9,7 +9,7 @@ This package owns the Service Definition role of the compaction capability, spli | Package | Role | |---|---| | `@deepseek-ai/dsh-compaction` (this) | Service Definition: abstract service + `compaction/*` events + `CompactionResult` + correlated checkpoint-source constructor + tool-pairing boundary helpers | -| `@deepseek-ai/dsh-compaction-basic` | Service provider: `ctx.tokenMeter` pressure + token-budget retention + `llm.stream()` summarization | +| `@deepseek-ai/dsh-compaction-basic` | Service Provider: `ctx.tokenMeter` pressure + token-budget retention + `llm.stream()` summarization | | `@deepseek-ai/dsh-command-compact` | Consumer: the human `/compact` command over `ctx.compaction.compactNow()` | Unlike the bash seam, this Service Definition depends on `@deepseek-ai/dsh-session` and `@deepseek-ai/dsh-llm` — the contract's verbs are defined over a `Session` and its output is the `ContentBlock` vocabulary, so they cannot be expressed without naming those packages. That deviation from the "Service Definition depends only on cordis" guidance is intentional and recorded in the [compaction capability-seam Agent Note](../../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md). diff --git a/packages/compaction/compaction/README.zh.md b/packages/compaction/compaction/README.zh.md index b5a13cf470..761bac804b 100644 --- a/packages/compaction/compaction/README.zh.md +++ b/packages/compaction/compaction/README.zh.md @@ -9,7 +9,7 @@ | 包 | 职责 | |---|---| | `@deepseek-ai/dsh-compaction`(本包) | Service Definition:抽象服务 + `compaction/*` 事件 + `CompactionResult` + 关联检查点源构造函数 + 工具配对边界 helper | -| `@deepseek-ai/dsh-compaction-basic` | Service provider:`ctx.tokenMeter` 压力 + token 预算保留 + `llm.stream()` 摘要 | +| `@deepseek-ai/dsh-compaction-basic` | Service Provider:`ctx.tokenMeter` 压力 + token 预算保留 + `llm.stream()` 摘要 | | `@deepseek-ai/dsh-command-compact` | Consumer:面向人类的 `/compact` 命令,基于 `ctx.compaction.compactNow()` 实现 | 与 bash seam 不同,该 Service Definition 依赖 `@deepseek-ai/dsh-session` 和 `@deepseek-ai/dsh-llm`。约定的动词基于 `Session` 定义,其输出使用 `ContentBlock` 词汇,因此无法在不指名这些包的情况下表达。这项对「Service Definition 只依赖 cordis」指引的偏离是有意的,并记录在 [压缩能力 seam Agent Note](../../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md) 中。 diff --git a/packages/core/tools/tests/code-mode.spec.ts b/packages/core/tools/tests/code-mode.spec.ts index 58c190dd26..59c6df4c3f 100644 --- a/packages/core/tools/tests/code-mode.spec.ts +++ b/packages/core/tools/tests/code-mode.spec.ts @@ -19,7 +19,7 @@ const testToolSignal = new AbortController().signal * misconfiguration rejections, the run_code dispatch bridge (serialization, * abort, JSON normalization, error mapping, events, quiescence), and HMR * safety — all against an in-repo fake runtime, exactly the - * Service Definition / Service provider / Consumer roles the seam promises. + * Service Definition / Service Provider / Consumer roles the seam promises. */ /** A scriptable in-repo CodeRuntime: each test sets `behavior` to drive the bindings however it needs. */ diff --git a/packages/e2b/subprocess-e2b/src/index.ts b/packages/e2b/subprocess-e2b/src/index.ts index 7d45d763b5..bf2bd33c54 100644 --- a/packages/e2b/subprocess-e2b/src/index.ts +++ b/packages/e2b/subprocess-e2b/src/index.ts @@ -1,5 +1,5 @@ /** - * E2B Service provider for the subprocess capability seam. Each handle starts through the + * E2B Service Provider for the subprocess capability seam. Each handle starts through the * shared sandbox and retains command output/status paths in that remote world. * @module @deepseek-ai/dsh-subprocess-e2b */ diff --git a/packages/examples/agent-spine-demo/README.i18n.yaml b/packages/examples/agent-spine-demo/README.i18n.yaml index ac85098e2d..88512542e9 100644 --- a/packages/examples/agent-spine-demo/README.i18n.yaml +++ b/packages/examples/agent-spine-demo/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/examples/agent-spine-demo/README.md -README.md: e4e92d398d5f48609bc5af23ece2b5fe3e607b21 -README.zh.md: c5f78d53a59f3bd3e377afc2c471d187b73da32e +README.md: 509e4e6d6b5885fb0c685e4ee34fe8078944415b +README.zh.md: a5e6c9876ce8522d9d178ee963632654fb180351 diff --git a/packages/examples/agent-spine-demo/README.md b/packages/examples/agent-spine-demo/README.md index e4e92d398d..509e4e6d6b 100644 --- a/packages/examples/agent-spine-demo/README.md +++ b/packages/examples/agent-spine-demo/README.md @@ -49,7 +49,7 @@ The spine is everything COMMON to every entry point. The swappable and entry-poi - **non-local skill providers** — the bundle ships the skill registry, the local filesystem provider, and the `skill` tool; deployments can add other providers such as embedded or remote catalogs as siblings. - **entry point + per-app infrastructure** — headless, ACP, and JSON-RPC app packages own transport, stdout, and reload choices. `timer` stays in the spine because it is common and stdout-silent. -This applies the [Service Definition / Service provider / Consumer separation](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) at the composition level: the bundle owns the shared spine, the leaf owns the backends, the app package owns the entry point. +This applies the [Service Definition / Service Provider / Consumer separation](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) at the composition level: the bundle owns the shared spine, the leaf owns the backends, the app package owns the entry point. ## Config diff --git a/packages/examples/agent-spine-demo/README.zh.md b/packages/examples/agent-spine-demo/README.zh.md index c5f78d53a5..a5e6c9876c 100644 --- a/packages/examples/agent-spine-demo/README.zh.md +++ b/packages/examples/agent-spine-demo/README.zh.md @@ -49,7 +49,7 @@ - **非本地 skill 提供方**:组合包交付 skill 注册表、本地文件系统提供方和 `skill` 工具;部署可以把嵌入式目录或远程目录等其他提供方作为同级插件添加。 - **入口与各应用基础设施**:无头、ACP(Agent Client Protocol)和 JSON-RPC 应用包负责传输、stdout 与重新加载选择。`timer` 保留在主干中,因为它是共有组件且不写 stdout。 -这里在组合层应用 [Service Definition/Service provider/Consumer 的职责分离](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):组合包拥有共享主干,叶节点拥有后端,应用包拥有入口。 +这里在组合层应用 [Service Definition/Service Provider/Consumer 的职责分离](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):组合包拥有共享主干,叶节点拥有后端,应用包拥有入口。 ## 配置 @@ -59,7 +59,7 @@ import type { Config } from '@deepseek-ai/dsh-agent-spine-demo' // workspaceContext requires { maxBytes } or false; the other owner schemas supply defaults. ``` -组合包将每个字段转发给拥有它的子节点。应用包提供预创建的 agent:无头和 JSON-RPC 组合会创建 `main`,ACP 应用则在 `session/new` 按需创建 agent。`includeRuntimeContext: false` 会转发给 `dsh-system-prompt`,为新建会话抑制所有动态上下文快照,但不禁用其策略服务。提示词、工具、标题、skill、工作区上下文、不变式、目标和任务设置沿用其所属包记录的 schema 与默认值;`jobs.maxConcurrentJobsPerOwner` 配置本地 Service provider,并与面向模型的 `toolJobs` 控制工具相互独立。`pickSpineConfig()` 只复制该组合包拥有的字段,`dshHome` 值冲突会在组合时失败。 +组合包将每个字段转发给拥有它的子节点。应用包提供预创建的 agent:无头和 JSON-RPC 组合会创建 `main`,ACP 应用则在 `session/new` 按需创建 agent。`includeRuntimeContext: false` 会转发给 `dsh-system-prompt`,为新建会话抑制所有动态上下文快照,但不禁用其策略服务。提示词、工具、标题、skill、工作区上下文、不变式、目标和任务设置沿用其所属包记录的 schema 与默认值;`jobs.maxConcurrentJobsPerOwner` 配置本地 Service Provider,并与面向模型的 `toolJobs` 控制工具相互独立。`pickSpineConfig()` 只复制该组合包拥有的字段,`dshHome` 值冲突会在组合时失败。 例如,`{ invariants: { enabled: true, package_allowlist: ['^@deepseek-ai/dsh-'], package_blocklist: ['agent-loop$'] } }` 会让包拥有的配套插件保持挂载,但抑制被阻止的拥有者。Blocklist 匹配优先于 allowlist 匹配;正则表达式与生命周期规则见 [`dsh-invariants`](../../runtime-diagnostics/invariants/README.md)。 diff --git a/packages/interaction/user-questions/README.i18n.yaml b/packages/interaction/user-questions/README.i18n.yaml index 86c5f1cf2c..bdcbeee898 100644 --- a/packages/interaction/user-questions/README.i18n.yaml +++ b/packages/interaction/user-questions/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/interaction/user-questions/README.md -README.md: 4a8f0d5bd409872c7849adf0a35b836fb884fb25 -README.zh.md: dcba617f042be84f516e14dbfa6db125dd0aca5b +README.md: 53459c39c75d5d3907b002239c83db5f82e024f5 +README.zh.md: 3a1f016aef6efa0a2167523fd4e1a938fa53eb71 diff --git a/packages/interaction/user-questions/README.md b/packages/interaction/user-questions/README.md index 4a8f0d5bd4..53459c39c7 100644 --- a/packages/interaction/user-questions/README.md +++ b/packages/interaction/user-questions/README.md @@ -30,7 +30,7 @@ When a request carries an agent, `ask()` authenticates its exact identity throug ## Role -This is the Service Definition package. Consumers such as `@deepseek-ai/dsh-tool-ask-user` depend on this service; the Web host runtime supplies the shipped Service provider. The loop stays unchanged: a tool call awaits a promise, and the tool result resumes the normal agent loop. +This is the Service Definition package. Consumers such as `@deepseek-ai/dsh-tool-ask-user` depend on this service; the Web host runtime supplies the shipped Service Provider. The loop stays unchanged: a tool call awaits a promise, and the tool result resumes the normal agent loop. ## Model Experience diff --git a/packages/interaction/user-questions/README.zh.md b/packages/interaction/user-questions/README.zh.md index dcba617f04..3a1f016aef 100644 --- a/packages/interaction/user-questions/README.zh.md +++ b/packages/interaction/user-questions/README.zh.md @@ -30,7 +30,7 @@ ## 职责 -这是 Service Definition 包。`@deepseek-ai/dsh-tool-ask-user` 等 Consumer 依赖此服务;Web 宿主运行时提供随产品交付的 Service provider。循环保持不变:工具调用等待 Promise,工具结果随后恢复正常的 agent loop(智能体循环)。 +这是 Service Definition 包。`@deepseek-ai/dsh-tool-ask-user` 等 Consumer 依赖此服务;Web 宿主运行时提供随产品交付的 Service Provider。循环保持不变:工具调用等待 Promise,工具结果随后恢复正常的 agent loop(智能体循环)。 ## 模型体验 diff --git a/packages/jobs/jobs/README.i18n.yaml b/packages/jobs/jobs/README.i18n.yaml index 5e814df8bb..0473d974f8 100644 --- a/packages/jobs/jobs/README.i18n.yaml +++ b/packages/jobs/jobs/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/jobs/jobs/README.md README.md: f4469286603f687be5789bd016ab462dba26e664 -README.zh.md: 720c8b550b52716ef66d182da0acf81eae4490ca +README.zh.md: 30d8e4cb1e298bb4a3a0a3e65bb0858b2458a277 diff --git a/packages/jobs/jobs/README.zh.md b/packages/jobs/jobs/README.zh.md index 720c8b550b..30d8e4cb1e 100644 --- a/packages/jobs/jobs/README.zh.md +++ b/packages/jobs/jobs/README.zh.md @@ -6,7 +6,7 @@ ## 服务约定 -- `start(spec): JobId` 验证已附加的任务控制器、spec、确切且仍存活的 owner、可选的正数 `outputLimitBytes`,以及 Service provider 所拥有的准入策略,然后只调用生产方的 `run()` 一次。预检拒绝或启动方抛出异常时都不会生成 job id 或注册工作;成功返回会直接提交,不再执行其他可能失败的步骤。 +- `start(spec): JobId` 验证已附加的任务控制器、spec、确切且仍存活的 owner、可选的正数 `outputLimitBytes`,以及 Service Provider 所拥有的准入策略,然后只调用生产方的 `run()` 一次。预检拒绝或启动方抛出异常时都不会生成 job id 或注册工作;成功返回会直接提交,不再执行其他可能失败的步骤。 - `get(id, caller?)` 和 `list(caller?)` 返回非消费式快照。列表只包含调用方拥有及无 owner 的任务。 - `read(id, caller?)` 消费流任务的唯一游标;对于最终输出任务,则以幂等方式读取终止输出。 - `kill(id, caller?, reason?)` 在更改状态前调用生产方取消。取消抛出异常时任务保持运行;成功则把状态改为 `stopping`,并将终止交付标记为已报告。 diff --git a/packages/lsp/lsp-stdio/src/connection.ts b/packages/lsp/lsp-stdio/src/connection.ts index ac0554ae26..5cfcf10b0c 100644 --- a/packages/lsp/lsp-stdio/src/connection.ts +++ b/packages/lsp/lsp-stdio/src/connection.ts @@ -6,7 +6,7 @@ * runs commands). It caps stderr, surfaces framing/decoder failures as a * fatal close, and exposes tree-scoped termination through the handle so the * instance owns teardown; group/tree mechanics live in the subprocess - * Service provider. + * Service Provider. * @module @deepseek-ai/dsh-lsp-stdio/connection */ diff --git a/packages/lsp/lsp/README.i18n.yaml b/packages/lsp/lsp/README.i18n.yaml index f5f5cdb096..1beb022f57 100644 --- a/packages/lsp/lsp/README.i18n.yaml +++ b/packages/lsp/lsp/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/lsp/lsp/README.md -README.md: 910b7e06ac849bbf3b56d49c1b6258a3633c6bcc -README.zh.md: 519964cd543005b9db0b345d1632a76bf56d6b36 +README.md: cf32f9cc60a346def48d9720bf0695db36553b0e +README.zh.md: 6f19d1f649eb1483782b6ebb4c82f05da7a42a80 diff --git a/packages/lsp/lsp/README.md b/packages/lsp/lsp/README.md index 910b7e06ac..cf32f9cc60 100644 --- a/packages/lsp/lsp/README.md +++ b/packages/lsp/lsp/README.md @@ -9,7 +9,7 @@ This package owns the Service Definition role of the LSP capability: | Package | Role | |---|---| | `@deepseek-ai/dsh-lsp` (this) | Service Definition: the service, provider registry keyed by branded id + extension mapping, per-query selection, request/result vocabulary, the `LspError` taxonomy | -| `@deepseek-ai/dsh-lsp-stdio` | Service provider: a generic local backend that registers configured stdio language-server providers | +| `@deepseek-ai/dsh-lsp-stdio` | Service Provider: a generic local backend that registers configured stdio language-server providers | | `@deepseek-ai/dsh-tool-lsp` | Consumer: the model-facing `lsp` tool over `ctx.lsp` | The seam exposes exactly four semantic operations — `goToDefinition`, `findReferences`, `goToImplementation`, `hover` — and no generic JSON-RPC escape hatch, so no protocol payload or unreviewed command/mutation reaches a provider through `ctx.lsp`. diff --git a/packages/lsp/lsp/README.zh.md b/packages/lsp/lsp/README.zh.md index 519964cd54..6f19d1f649 100644 --- a/packages/lsp/lsp/README.zh.md +++ b/packages/lsp/lsp/README.zh.md @@ -9,7 +9,7 @@ | 包 | 职责 | |---|---| | `@deepseek-ai/dsh-lsp`(本包) | Service Definition:服务、以品牌化 id + 扩展名映射为 key 的提供方注册表、逐查询选择、请求/结果词汇、`LspError` 分类体系 | -| `@deepseek-ai/dsh-lsp-stdio` | Service provider:通用本地后端,注册已配置的 stdio 语言服务器提供方 | +| `@deepseek-ai/dsh-lsp-stdio` | Service Provider:通用本地后端,注册已配置的 stdio 语言服务器提供方 | | `@deepseek-ai/dsh-tool-lsp` | Consumer:面向模型的 `lsp` 工具,基于 `ctx.lsp` | 该 seam 恰好公开四种语义操作:`goToDefinition`、`findReferences`、`goToImplementation`、`hover`,且没有通用 JSON-RPC 逃生口,因此任何协议载荷或未经评审的命令/修改都无法通过 `ctx.lsp` 到达提供方。 diff --git a/packages/sandbox/sandbox/README.i18n.yaml b/packages/sandbox/sandbox/README.i18n.yaml index 18f760c68a..7e7ed765b2 100644 --- a/packages/sandbox/sandbox/README.i18n.yaml +++ b/packages/sandbox/sandbox/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/sandbox/sandbox/README.md -README.md: 6afa3d68f5a852af1f1b496b25238b09c055fdc2 -README.zh.md: 2310f17f5a1711901b88dc7ee1a2bf956e79b6d1 +README.md: 3ebbffd623eee51dd6fcb588eec374e6d09be2f0 +README.zh.md: bde83955a85cbe2d60c521e3677b5b305a29ecb1 diff --git a/packages/sandbox/sandbox/README.md b/packages/sandbox/sandbox/README.md index 6afa3d68f5..3ebbffd623 100644 --- a/packages/sandbox/sandbox/README.md +++ b/packages/sandbox/sandbox/README.md @@ -8,7 +8,7 @@ The contract in one line: `ctx.sandbox.confine(argv, policy)` returns the argv t Policy rides the call, not the provider: two consumers may confine under different policies at the same instant (bash under `read-only` while a confined child agent keeps its state directory writable), and an approved escalated retry is just a new call with a wider policy. -**Same-world confinement only.** A backend shares the host's filesystem and kernel (`bwrap`, Landlock, Seatbelt); `workspaceRoot` names the filesystem-canonical real host directory. Workspace identity is resolved before lexical normalization, so a valid cwd containing `symlink/..` grants the directory where `chdir` actually lands rather than an unrelated lexical parent. Containers, microVMs, and remote executors are NOT backends of this seam — they replace the Service providers for whole capability seams (`ctx.shell`, `ctx.fs`) as environment-coherent groups. The boundary and its rationale: [the sandbox Agent Note](../../../.agents/notes/implemented/feature/2026-07-06-sandbox.md). +**Same-world confinement only.** A backend shares the host's filesystem and kernel (`bwrap`, Landlock, Seatbelt); `workspaceRoot` names the filesystem-canonical real host directory. Workspace identity is resolved before lexical normalization, so a valid cwd containing `symlink/..` grants the directory where `chdir` actually lands rather than an unrelated lexical parent. Containers, microVMs, and remote executors are NOT backends of this seam — they replace the Service Providers for whole capability seams (`ctx.shell`, `ctx.fs`) as environment-coherent groups. The boundary and its rationale: [the sandbox Agent Note](../../../.agents/notes/implemented/feature/2026-07-06-sandbox.md). Implementations: [`@deepseek-ai/dsh-sandbox-local`](../sandbox-local/) (Linux: `bwrap`, else the per-platform Landlock launcher; macOS: `sandbox-exec`/Seatbelt). Consumers: [`@deepseek-ai/dsh-bash-sandbox`](../../shell/bash-sandbox/) (wraps `['bash', '-c', command]`). diff --git a/packages/sandbox/sandbox/README.zh.md b/packages/sandbox/sandbox/README.zh.md index 2310f17f5a..bde83955a8 100644 --- a/packages/sandbox/sandbox/README.zh.md +++ b/packages/sandbox/sandbox/README.zh.md @@ -8,7 +8,7 @@ 策略随调用传递,而不属于提供方:两个消费方可以同时按不同策略施加限制(bash 使用 `read-only`,而受限制的子 agent(智能体)保持其状态目录可写);获批的升权重试只是使用更宽策略发起的新调用。 -**只支持与宿主共享文件系统和内核的限制。** 后端与宿主共享文件系统和内核(`bwrap`、Landlock、Seatbelt);`workspaceRoot` 指向文件系统规范化后的真实主机目录。系统先解析工作区所指的目录,再做词法规范化,因此包含 `symlink/..` 的有效 cwd 会授权 `chdir` 实际到达的目录,而非无关的词法父目录。容器、microVM 与远程执行器都不是该 seam 的后端:它们会以环境一致的分组替换整个能力 seam 的 Service provider(`ctx.shell`、`ctx.fs`)。边界及其设计理由见[沙箱 Agent Note](../../../.agents/notes/implemented/feature/2026-07-06-sandbox.md)。 +**只支持与宿主共享文件系统和内核的限制。** 后端与宿主共享文件系统和内核(`bwrap`、Landlock、Seatbelt);`workspaceRoot` 指向文件系统规范化后的真实主机目录。系统先解析工作区所指的目录,再做词法规范化,因此包含 `symlink/..` 的有效 cwd 会授权 `chdir` 实际到达的目录,而非无关的词法父目录。容器、microVM 与远程执行器都不是该 seam 的后端:它们会以环境一致的分组替换整个能力 seam 的 Service Provider(`ctx.shell`、`ctx.fs`)。边界及其设计理由见[沙箱 Agent Note](../../../.agents/notes/implemented/feature/2026-07-06-sandbox.md)。 实现:[`@deepseek-ai/dsh-sandbox-local`](../sandbox-local/)(Linux:`bwrap`,否则使用相应平台的 Landlock launcher;macOS:`sandbox-exec`/Seatbelt)。消费方:[`@deepseek-ai/dsh-bash-sandbox`](../../shell/bash-sandbox/)(包装 `['bash', '-c', command]`)。 diff --git a/packages/session/session-persistence/README.i18n.yaml b/packages/session/session-persistence/README.i18n.yaml index 68de7c761a..74b808b05e 100644 --- a/packages/session/session-persistence/README.i18n.yaml +++ b/packages/session/session-persistence/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/session/session-persistence/README.md -README.md: 914e94a7adc83fba963ae651a81ac527cbc7b995 -README.zh.md: 75aeec3c6a31e87b27cc2df3493e3fca9f808fbf +README.md: 335f40e7439fc4a49fa49bb4541f101250468d1b +README.zh.md: 5a50f051a2c53a5f27b009df11ad46f5952a32ac diff --git a/packages/session/session-persistence/README.md b/packages/session/session-persistence/README.md index 914e94a7ad..335f40e743 100644 --- a/packages/session/session-persistence/README.md +++ b/packages/session/session-persistence/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Session persistence is a capability seam. The abstract `SessionPersistence` service (`ctx.sessionPersistence`) is its Service Definition. It requires a persistence backend to store, reload, and list sessions durably without defining the storage implementation. The seam follows the `dsh-shell` roles ([capability seams](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)): this package owns the Service Definition, a sibling package owns the Service provider, and Consumers inject the service. +Session persistence is a capability seam. The abstract `SessionPersistence` service (`ctx.sessionPersistence`) is its Service Definition. It requires a persistence backend to store, reload, and list sessions durably without defining the storage implementation. The seam follows the `dsh-shell` roles ([capability seams](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)): this package owns the Service Definition, a sibling package owns the Service Provider, and Consumers inject the service. The persisted unit IS the existing `SessionEvent` (event-sourced model — the log is the single source of truth), so there is no parallel "persisted message" type. Metadata that is NOT replayable conversation state (format version, cwd, lineage, seed boundary, origin, delegation depth) travels separately as `SessionHeader`, owned by `dsh-session` and re-exported here. diff --git a/packages/session/session-persistence/README.zh.md b/packages/session/session-persistence/README.zh.md index 75aeec3c6a..5a50f051a2 100644 --- a/packages/session/session-persistence/README.zh.md +++ b/packages/session/session-persistence/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -会话持久化是一项能力 seam。抽象的 `SessionPersistence` 服务(`ctx.sessionPersistence`)是其 Service Definition。它要求持久化后端持久存储、重新加载和列出会话,但不规定具体存储实现。该 seam 采用与 `dsh-shell` 相同的角色划分(见[能力 seam](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)):本包负责 Service Definition,同级包负责 Service provider,Consumer 注入该服务。 +会话持久化是一项能力 seam。抽象的 `SessionPersistence` 服务(`ctx.sessionPersistence`)是其 Service Definition。它要求持久化后端持久存储、重新加载和列出会话,但不规定具体存储实现。该 seam 采用与 `dsh-shell` 相同的角色划分(见[能力 seam](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)):本包负责 Service Definition,同级包负责 Service Provider,Consumer 注入该服务。 持久化单元就是现有 `SessionEvent`(事件溯源模型:日志是唯一真源),因此不存在另一套并行的「持久消息」类型。不属于可回放对话状态的元数据(格式版本、cwd、血缘、种子边界、origin、委托深度)作为 `SessionHeader` 单独传输,该类型归 `dsh-session` 所有,并在此重新导出。 diff --git a/packages/session/session-telemetry-otel/src/index.ts b/packages/session/session-telemetry-otel/src/index.ts index d33d12de23..169f4dc9de 100644 --- a/packages/session/session-telemetry-otel/src/index.ts +++ b/packages/session/session-telemetry-otel/src/index.ts @@ -1,5 +1,5 @@ /** - * OpenTelemetry Service provider for the DeepSeek Harness telemetry capability. + * OpenTelemetry Service Provider for the DeepSeek Harness telemetry capability. * * Composes the OTel JS SDK as-is — a `LoggerProvider` with a * `BatchLogRecordProcessor` and an OTLP/HTTP log exporter — and maps each diff --git a/packages/session/session-title/tests/provider.spec.ts b/packages/session/session-title/tests/provider.spec.ts index 461a608180..7843ff2c22 100644 --- a/packages/session/session-title/tests/provider.spec.ts +++ b/packages/session/session-title/tests/provider.spec.ts @@ -47,7 +47,7 @@ function appendRoute(session: ReturnType, reason: }) } -describe('SessionTitleService provider lifecycle', () => { +describe('SessionTitleService Provider lifecycle', () => { it('inherits title events across forks, skips first-prompt retitling, and lets all-messages update later', async () => { const ctx = new Context() await ctx.plugin(SessionStore) diff --git a/packages/session/session-title/tests/service-contracts.spec.ts b/packages/session/session-title/tests/service-contracts.spec.ts index a5525fc79b..521562c4ed 100644 --- a/packages/session/session-title/tests/service-contracts.spec.ts +++ b/packages/session/session-title/tests/service-contracts.spec.ts @@ -354,7 +354,7 @@ describe('SessionTitleService configuration and refresh boundaries', () => { }) }) -describe('SessionTitleService provider validation and stale scheduling', () => { +describe('SessionTitleService Provider validation and stale scheduling', () => { it('rejects malformed provider registrations before publishing them', async () => { const ctx = await setup() const generate = async (): Promise => ({ title: 'title', messageSeqs: [0] }) diff --git a/packages/shell/README.i18n.yaml b/packages/shell/README.i18n.yaml index bf3bb2ae3c..65372e643b 100644 --- a/packages/shell/README.i18n.yaml +++ b/packages/shell/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/README.md -README.md: 8adda0192a80e0b3fd65ba4a740d7835bd9cf1e4 -README.zh.md: 2e5aac94829db4cb41da0fc41fbd528225f35f1e +README.md: f075db4fbe57c6052fea89b30e35126117f75a7c +README.zh.md: 2fdd92aac8d768024b6b4a9d6bd96bb6f5dafb05 diff --git a/packages/shell/README.md b/packages/shell/README.md index 8adda0192a..f075db4fbe 100644 --- a/packages/shell/README.md +++ b/packages/shell/README.md @@ -6,7 +6,7 @@ The capability family spans the canonical executor seam, its implementations, th | Package | Role | ctx key | |---|---|---| -| [`shell/`](shell/README.md) | Defines the executor contract shared by Service providers and Consumers. | `ctx.shell` | +| [`shell/`](shell/README.md) | Defines the executor contract shared by Service Providers and Consumers. | `ctx.shell` | | [`bash-local/`](bash-local/README.md) | Executes commands through the local [`subprocess`](../subprocess/README.md) service. | (registers `ctx.shell`) | | [`bash-sandbox/`](bash-sandbox/README.md) | Applies the configured [`sandbox`](../sandbox/README.md) backend before local execution. | (registers `ctx.shell`) | | [`pwsh-local/`](pwsh-local/README.md) | Executes PowerShell commands with Windows-specific process behavior. | (registers `ctx.shell`) | diff --git a/packages/shell/README.zh.md b/packages/shell/README.zh.md index 2e5aac9482..2fdd92aac8 100644 --- a/packages/shell/README.zh.md +++ b/packages/shell/README.zh.md @@ -6,7 +6,7 @@ | 包 | 职责 | ctx key | |---|---|---| -| [`shell/`](shell/README.md) | 定义 Service provider 与 Consumer 共享的执行器约定。 | `ctx.shell` | +| [`shell/`](shell/README.md) | 定义 Service Provider 与 Consumer 共享的执行器约定。 | `ctx.shell` | | [`bash-local/`](bash-local/README.md) | 通过本地 [`subprocess`](../subprocess/README.md) 服务执行命令。 | (注册 `ctx.shell`) | | [`bash-sandbox/`](bash-sandbox/README.md) | 在本地执行前应用已配置的 [`sandbox`](../sandbox/README.md) 后端。 | (注册 `ctx.shell`) | | [`pwsh-local/`](pwsh-local/README.md) | 采用 Windows 特有的进程行为执行 PowerShell 命令。 | (注册 `ctx.shell`) | diff --git a/packages/shell/bash-local/README.i18n.yaml b/packages/shell/bash-local/README.i18n.yaml index d58d41ce87..9e8a0eaf85 100644 --- a/packages/shell/bash-local/README.i18n.yaml +++ b/packages/shell/bash-local/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/bash-local/README.md -README.md: ceece7e69de9c5e5337173c9fe3776bfe510e484 -README.zh.md: 643d74de08ae7ffcd23b97927b294e4ea0d16f81 +README.md: 5e62ea24676f3bedf32b1b48f8618d703d5fb462 +README.zh.md: 6f236f3dd78bd444eb57443ba068a0271ac5d8df diff --git a/packages/shell/bash-local/README.md b/packages/shell/bash-local/README.md index ceece7e69d..5e62ea2467 100644 --- a/packages/shell/bash-local/README.md +++ b/packages/shell/bash-local/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Local Service provider for the `@deepseek-ai/dsh-shell` executor seam over the [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) service: `LocalBashExecutor` spawns `bash -c ` per call as a managed process group through `ctx.subprocess`, and owns everything bash-shaped — command defaulting and caps, timeout/cancel classification, the model-friendly terminal environment, and the model-facing stdout/stderr merge for background reads. Group mechanics (bounded spill-backed output, credential scrub, kill escalation, disposal) are the subprocess service's. +Local Service Provider for the `@deepseek-ai/dsh-shell` executor seam over the [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) service: `LocalBashExecutor` spawns `bash -c ` per call as a managed process group through `ctx.subprocess`, and owns everything bash-shaped — command defaulting and caps, timeout/cancel classification, the model-friendly terminal environment, and the model-facing stdout/stderr merge for background reads. Group mechanics (bounded spill-backed output, credential scrub, kill escalation, disposal) are the subprocess service's. The package root exports the default and named `LocalBashExecutor` plugin plus its `Config`. diff --git a/packages/shell/bash-local/README.zh.md b/packages/shell/bash-local/README.zh.md index 643d74de08..6f236f3dd7 100644 --- a/packages/shell/bash-local/README.zh.md +++ b/packages/shell/bash-local/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -`@deepseek-ai/dsh-shell` 执行器 seam 的本地 Service provider,构建在 [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) 服务之上:`LocalBashExecutor` 每次调用都通过 `ctx.subprocess` 把 `bash -c ` 作为受管进程组 spawn,并负责所有 Bash 层职责(命令默认值补全与上限、超时与取消分类、适合模型的终端环境,以及后台读取时面向模型的 stdout/stderr 合并)。以 spill 文件兜底的有界输出、凭据清除、kill 升级和 dispose(资源释放)等进程组机制则由 subprocess 服务负责。 +`@deepseek-ai/dsh-shell` 执行器 seam 的本地 Service Provider,构建在 [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) 服务之上:`LocalBashExecutor` 每次调用都通过 `ctx.subprocess` 把 `bash -c ` 作为受管进程组 spawn,并负责所有 Bash 层职责(命令默认值补全与上限、超时与取消分类、适合模型的终端环境,以及后台读取时面向模型的 stdout/stderr 合并)。以 spill 文件兜底的有界输出、凭据清除、kill 升级和 dispose(资源释放)等进程组机制则由 subprocess 服务负责。 包根目录导出默认与具名的 `LocalBashExecutor` 插件及其 `Config`。 diff --git a/packages/shell/bash-local/src/index.ts b/packages/shell/bash-local/src/index.ts index 693eef4fd1..6c37c5b794 100644 --- a/packages/shell/bash-local/src/index.ts +++ b/packages/shell/bash-local/src/index.ts @@ -1,5 +1,5 @@ /** - * Local Service provider for the bash capability seam over the subprocess + * Local Service Provider for the bash capability seam over the subprocess * capability seam. Public commands run as `bash -c` in a managed process group spawned * through `ctx.subprocess`; subclasses may reuse the same mechanics with an * explicit argv. This executor owns command defaulting, deadlines and cause diff --git a/packages/shell/bash-sandbox/README.i18n.yaml b/packages/shell/bash-sandbox/README.i18n.yaml index 25552735a5..6792ffa955 100644 --- a/packages/shell/bash-sandbox/README.i18n.yaml +++ b/packages/shell/bash-sandbox/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/bash-sandbox/README.md -README.md: bd2e342b5dbb070360e5244fd7a93a1dacac2980 -README.zh.md: 9827ec57f1fed846031efda0123e4d40ea9d308b +README.md: fe9a0b1a891bd2b9102357f48141822c70465ddf +README.zh.md: 648264615dc476f9442b9bb9ae3a332196f4e104 diff --git a/packages/shell/bash-sandbox/README.md b/packages/shell/bash-sandbox/README.md index bd2e342b5d..fe9a0b1a89 100644 --- a/packages/shell/bash-sandbox/README.md +++ b/packages/shell/bash-sandbox/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Sandbox-consuming Service provider for the [`@deepseek-ai/dsh-shell`](../shell/) executor seam. Load it **instead of** `@deepseek-ai/dsh-bash-local`, together with a [`ctx.sandbox`](../../sandbox/sandbox/) provider (e.g. [`@deepseek-ai/dsh-sandbox-local`](../../sandbox/sandbox-local/)) and a [`ctx.sandboxPolicy`](../../sandbox/sandbox-policy/) (which owns the default mode + workspace root, shared with the sandboxed filesystem) — no alternate tool plugin is needed; `dsh-tool-bash` detects the executor's `sandboxMode` capability and adds the escalation fields. +Sandbox-consuming Service Provider for the [`@deepseek-ai/dsh-shell`](../shell/) executor seam. Load it **instead of** `@deepseek-ai/dsh-bash-local`, together with a [`ctx.sandbox`](../../sandbox/sandbox/) provider (e.g. [`@deepseek-ai/dsh-sandbox-local`](../../sandbox/sandbox-local/)) and a [`ctx.sandboxPolicy`](../../sandbox/sandbox-policy/) (which owns the default mode + workspace root, shared with the sandboxed filesystem) — no alternate tool plugin is needed; `dsh-tool-bash` detects the executor's `sandboxMode` capability and adds the escalation fields. The package root exports the default and named `SandboxBashExecutor` plugin plus its `Config`; result-classification helpers stay internal. diff --git a/packages/shell/bash-sandbox/README.zh.md b/packages/shell/bash-sandbox/README.zh.md index 9827ec57f1..648264615d 100644 --- a/packages/shell/bash-sandbox/README.zh.md +++ b/packages/shell/bash-sandbox/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -这是使用沙箱能力的 [`@deepseek-ai/dsh-shell`](../shell/) 执行器 seam 的 Service provider。加载它时,应**用它替代** `@deepseek-ai/dsh-bash-local`,并同时加载 [`ctx.sandbox`](../../sandbox/sandbox/) 提供方(例如 [`@deepseek-ai/dsh-sandbox-local`](../../sandbox/sandbox-local/))及 [`ctx.sandboxPolicy`](../../sandbox/sandbox-policy/);默认模式和工作区根目录由后者负责,并与受沙箱约束的文件系统共享这些设置。无需使用替代工具插件;`dsh-tool-bash` 会检测执行器的 `sandboxMode` 能力并添加升权字段。 +这是使用沙箱能力的 [`@deepseek-ai/dsh-shell`](../shell/) 执行器 seam 的 Service Provider。加载它时,应**用它替代** `@deepseek-ai/dsh-bash-local`,并同时加载 [`ctx.sandbox`](../../sandbox/sandbox/) 提供方(例如 [`@deepseek-ai/dsh-sandbox-local`](../../sandbox/sandbox-local/))及 [`ctx.sandboxPolicy`](../../sandbox/sandbox-policy/);默认模式和工作区根目录由后者负责,并与受沙箱约束的文件系统共享这些设置。无需使用替代工具插件;`dsh-tool-bash` 会检测执行器的 `sandboxMode` 能力并添加升权字段。 包根目录导出默认与具名的 `SandboxBashExecutor` 插件及其 `Config`;结果分类 helper 保留在内部。 diff --git a/packages/shell/pwsh-local/README.i18n.yaml b/packages/shell/pwsh-local/README.i18n.yaml index 2481c2627d..84e7bfa43e 100644 --- a/packages/shell/pwsh-local/README.i18n.yaml +++ b/packages/shell/pwsh-local/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/pwsh-local/README.md -README.md: 90b3732fde385ff07ba3b6685260172ad26c7e24 -README.zh.md: 96b19dfe7f852cbbbfc8f49f849d11f898f09097 +README.md: cfb58b569022bca11d18c196e0bce104247e4c81 +README.zh.md: 9393c5d210743d8423457f2d7df5900c1e0df182 diff --git a/packages/shell/pwsh-local/README.md b/packages/shell/pwsh-local/README.md index 90b3732fde..cfb58b5690 100644 --- a/packages/shell/pwsh-local/README.md +++ b/packages/shell/pwsh-local/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Local PowerShell Service provider for the `@deepseek-ai/dsh-shell` executor seam over the [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) service: `PwshLocalExecutor` spawns `pwsh -NoLogo -NoProfile -NonInteractive -Command ` per call as a managed process through `ctx.subprocess`, and owns everything PowerShell-shaped — executable resolution, command defaulting and caps, timeout/cancel classification, the model-friendly terminal environment, and the model-facing stdout/stderr merge for background reads. Group mechanics (bounded spill-backed output, credential scrub, kill escalation, disposal) are the subprocess service's. +Local PowerShell Service Provider for the `@deepseek-ai/dsh-shell` executor seam over the [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) service: `PwshLocalExecutor` spawns `pwsh -NoLogo -NoProfile -NonInteractive -Command ` per call as a managed process through `ctx.subprocess`, and owns everything PowerShell-shaped — executable resolution, command defaulting and caps, timeout/cancel classification, the model-friendly terminal environment, and the model-facing stdout/stderr merge for background reads. Group mechanics (bounded spill-backed output, credential scrub, kill escalation, disposal) are the subprocess service's. The command string rides as ONE argv element to `-Command`: PowerShell itself parses the text, and no intermediate shell exists, so there is no shell-quoting layer to escape (the `bash -c` string domain has no equivalent here). Native Win32 paths (`C:\...`) pass through unchanged. diff --git a/packages/shell/pwsh-local/README.zh.md b/packages/shell/pwsh-local/README.zh.md index 96b19dfe7f..9393c5d210 100644 --- a/packages/shell/pwsh-local/README.zh.md +++ b/packages/shell/pwsh-local/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -`@deepseek-ai/dsh-shell` 执行器 seam 的本地 PowerShell Service provider,基于 [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) 服务:`PwshLocalExecutor` 每次调用以受管进程的方式通过 `ctx.subprocess` spawn `pwsh -NoLogo -NoProfile -NonInteractive -Command `,并负责所有 PowerShell 相关事项——可执行文件解析、命令默认化与上限、超时/取消分类、面向模型的终端环境,以及后台读取的 stdout/stderr 合并。进程组机制(有界 spill 输出、凭据清理、终止升级、dispose(资源释放))属于 subprocess 服务。 +`@deepseek-ai/dsh-shell` 执行器 seam 的本地 PowerShell Service Provider,基于 [`@deepseek-ai/dsh-subprocess`](../../subprocess/subprocess/README.md) 服务:`PwshLocalExecutor` 每次调用以受管进程的方式通过 `ctx.subprocess` spawn `pwsh -NoLogo -NoProfile -NonInteractive -Command `,并负责所有 PowerShell 相关事项——可执行文件解析、命令默认化与上限、超时/取消分类、面向模型的终端环境,以及后台读取的 stdout/stderr 合并。进程组机制(有界 spill 输出、凭据清理、终止升级、dispose(资源释放))属于 subprocess 服务。 命令字符串作为单个 argv 元素传给 `-Command`:由 PowerShell 自己解析文本,不存在中间 shell,因此没有需要转义的 shell 引号层(这里不存在与 `bash -c` 字符串域对应的层)。原生 Win32 路径(`C:\...`)原样通过。 diff --git a/packages/shell/pwsh-local/src/index.ts b/packages/shell/pwsh-local/src/index.ts index aca9d75265..b7a2d9f915 100644 --- a/packages/shell/pwsh-local/src/index.ts +++ b/packages/shell/pwsh-local/src/index.ts @@ -1,5 +1,5 @@ /** - * Local PowerShell Service provider for the bash capability seam. Each command runs + * Local PowerShell Service Provider for the bash capability seam. Each command runs * as `pwsh -NoLogo -NoProfile -NonInteractive -Command ` in a managed * process spawned through `ctx.subprocess`; the executor owns command * defaulting, deadlines and cause classification, the model-friendly terminal diff --git a/packages/shell/shell/README.i18n.yaml b/packages/shell/shell/README.i18n.yaml index fed2182d7a..a4e67f3760 100644 --- a/packages/shell/shell/README.i18n.yaml +++ b/packages/shell/shell/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/shell/README.md -README.md: 7913b616198474e92d4df17b7c06889d96afce6e -README.zh.md: 0e01cd42230d4c5917d2a217f8fc4c77842840b1 +README.md: a15980ead797a73c18dd6d8825a4b38cf845df60 +README.zh.md: 87a7dffdfb28fcf8a58e6254bf450e513dd458f4 diff --git a/packages/shell/shell/README.md b/packages/shell/shell/README.md index 7913b61619..a15980ead7 100644 --- a/packages/shell/shell/README.md +++ b/packages/shell/shell/README.md @@ -9,8 +9,8 @@ This package owns the Service Definition role of the bash capability, split so e | Package | Role | |---|---| | `@deepseek-ai/dsh-shell` (this) | Service Definition: abstract service + vocabulary types | -| `@deepseek-ai/dsh-bash-local` | Service provider: local subprocesses | -| `@deepseek-ai/dsh-bash-sandbox` | Service provider: `dsh-bash-local`'s mechanics with every spawn confined via [`ctx.sandbox`](../../sandbox/sandbox/), denials reported as result facts | +| `@deepseek-ai/dsh-bash-local` | Service Provider: local subprocesses | +| `@deepseek-ai/dsh-bash-sandbox` | Service Provider: `dsh-bash-local`'s mechanics with every spawn confined via [`ctx.sandbox`](../../sandbox/sandbox/), denials reported as result facts | | `@deepseek-ai/dsh-tool-bash` | the model-facing tool schemas over `ctx.shell` | The split is a standard capability seam ([capability-seams Agent Note](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)): `dsh-bash-sandbox` is a sandboxing executor behind the same Service Definition — the Consumer detects its `sandboxMode` capability and adds escalation fields without importing the provider — and a containerized or remote executor slots in the same way. diff --git a/packages/shell/shell/README.zh.md b/packages/shell/shell/README.zh.md index 0e01cd4223..87a7dffdfb 100644 --- a/packages/shell/shell/README.zh.md +++ b/packages/shell/shell/README.zh.md @@ -9,8 +9,8 @@ | 包 | 职责 | |---|---| | `@deepseek-ai/dsh-shell`(本包) | Service Definition:抽象服务 + 词汇类型 | -| `@deepseek-ai/dsh-bash-local` | Service provider:本地子进程 | -| `@deepseek-ai/dsh-bash-sandbox` | Service provider:沿用 `dsh-bash-local` 的机制,但通过 [`ctx.sandbox`](../../sandbox/sandbox/) 限制每次 spawn,并将拒绝报告为结果事实 | +| `@deepseek-ai/dsh-bash-local` | Service Provider:本地子进程 | +| `@deepseek-ai/dsh-bash-sandbox` | Service Provider:沿用 `dsh-bash-local` 的机制,但通过 [`ctx.sandbox`](../../sandbox/sandbox/) 限制每次 spawn,并将拒绝报告为结果事实 | | `@deepseek-ai/dsh-tool-bash` | 基于 `ctx.shell`、面向模型的工具 schema | 该拆分是一个标准的能力 seam([capability-seams Agent Note](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)):`dsh-bash-sandbox` 是位于同一 Service Definition 之后的沙箱执行器——Consumer 检测其 `sandboxMode` 能力并添加升权字段,无需导入提供方——容器化或远程执行器也可以同样接入。 diff --git a/packages/shell/tool-bash/README.i18n.yaml b/packages/shell/tool-bash/README.i18n.yaml index 13f8a87d50..ccdd7fe9cd 100644 --- a/packages/shell/tool-bash/README.i18n.yaml +++ b/packages/shell/tool-bash/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/tool-bash/README.md -README.md: 344cf599cb9f6391bcb51488ed407fff56b330fa -README.zh.md: d10c0faee56acca23f1a8dbe27ed8f37d97c7b3a +README.md: 21749bf0a1cd3cdc46257fb2a02ba6b4ab1f5ee6 +README.zh.md: e79190ced58abbd73d85127f3a4362f4e6b292cd diff --git a/packages/shell/tool-bash/README.md b/packages/shell/tool-bash/README.md index 344cf599cb..21749bf0a1 100644 --- a/packages/shell/tool-bash/README.md +++ b/packages/shell/tool-bash/README.md @@ -4,7 +4,7 @@ English | [中文](README.zh.md) The model-facing `bash` tool registered over the `ctx.shell` executor seam. Foreground execution stays behind that seam; a background process handle is registered with the generic `ctx.jobs` runtime and controlled through `job_output`, `job_list`, and `job_kill` from `@deepseek-ai/dsh-tool-jobs`. -Requires a loaded executor Service provider (e.g. `@deepseek-ai/dsh-bash-local`) and the [`@deepseek-ai/dsh-shell-env`](../shell-env/README.md) registry; the plugin stays pending until every injected service exists (`inject: ['tools', 'bash', 'systemPrompt', 'bashEnv']`). The tool contract is bash-dialect — mount a bash-parsing executor. +Requires a loaded executor Service Provider (e.g. `@deepseek-ai/dsh-bash-local`) and the [`@deepseek-ai/dsh-shell-env`](../shell-env/README.md) registry; the plugin stays pending until every injected service exists (`inject: ['tools', 'bash', 'systemPrompt', 'bashEnv']`). The tool contract is bash-dialect — mount a bash-parsing executor. The package root exposes only the Cordis plugin contract (`name`, `inject`, `Config`, `apply`); result rendering and background-process adaptation remain package-internal. diff --git a/packages/shell/tool-bash/README.zh.md b/packages/shell/tool-bash/README.zh.md index d10c0faee5..e79190ced5 100644 --- a/packages/shell/tool-bash/README.zh.md +++ b/packages/shell/tool-bash/README.zh.md @@ -4,7 +4,7 @@ 模型侧 `bash` 工具,注册在 `ctx.shell` 执行器 seam 上。前台执行始终位于该 seam 之后;后台进程句柄会注册到通用 `ctx.jobs` 运行时,并通过 `job_output`、`job_list` 和 `job_kill` 控制;这些工具由 `@deepseek-ai/dsh-tool-jobs` 提供。 -需要加载执行器 Service provider(例如 `@deepseek-ai/dsh-bash-local`)与 [`@deepseek-ai/dsh-shell-env`](../shell-env/README.md) 注册表;在每个注入服务就绪之前,插件会保持等待状态(`inject: ['tools', 'bash', 'systemPrompt', 'bashEnv']`)。工具约定是 bash 方言——请挂载能解析 bash 的执行器。 +需要加载执行器 Service Provider(例如 `@deepseek-ai/dsh-bash-local`)与 [`@deepseek-ai/dsh-shell-env`](../shell-env/README.md) 注册表;在每个注入服务就绪之前,插件会保持等待状态(`inject: ['tools', 'bash', 'systemPrompt', 'bashEnv']`)。工具约定是 bash 方言——请挂载能解析 bash 的执行器。 包根只公开 Cordis 插件约定(`name`、`inject`、`Config`、`apply`);结果渲染和后台进程适配仍保留在包内部。 diff --git a/packages/spill/spill/README.i18n.yaml b/packages/spill/spill/README.i18n.yaml index d0025c1c56..0a84c591d5 100644 --- a/packages/spill/spill/README.i18n.yaml +++ b/packages/spill/spill/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/spill/spill/README.md -README.md: 28b646d5b0bb82d2539e78a5c623b60024e1d60a -README.zh.md: b4caafc6eb134b76c1fb4a6f7f27fd6d818e0733 +README.md: f36dccfa1e6f1f21e80c0b0aa97ee150a0f5fd45 +README.zh.md: 268e390923e30150a8d36b719b7dad75827f99fe diff --git a/packages/spill/spill/README.md b/packages/spill/spill/README.md index 28b646d5b0..f36dccfa1e 100644 --- a/packages/spill/spill/README.md +++ b/packages/spill/spill/README.md @@ -9,7 +9,7 @@ This package is one third of the spill capability, split so each concern evolves | Package | Role | |---|---| | `@deepseek-ai/dsh-spill` (this) | Service Definition: abstract service + vocabulary types | -| `@deepseek-ai/dsh-spill-local` | Service provider: private session-scoped files on the host filesystem | +| `@deepseek-ai/dsh-spill-local` | Service Provider: private session-scoped files on the host filesystem | | `@deepseek-ai/dsh-spill-policy` | Consumer: the tool-result policy that spills oversized final results | The split mirrors the shell/fs seams. A future remote or virtual backend (e.g. a `spill://…` URI, a database key, or a backend-specific retrieval tool) implements this Service Definition without touching the policy plugin. diff --git a/packages/spill/spill/README.zh.md b/packages/spill/spill/README.zh.md index b4caafc6eb..268e390923 100644 --- a/packages/spill/spill/README.zh.md +++ b/packages/spill/spill/README.zh.md @@ -9,7 +9,7 @@ | 包 | 职责 | |---|---| | `@deepseek-ai/dsh-spill`(本包) | Service Definition:抽象服务与词汇类型 | -| `@deepseek-ai/dsh-spill-local` | Service provider:位于宿主文件系统中的私有会话级文件 | +| `@deepseek-ai/dsh-spill-local` | Service Provider:位于宿主文件系统中的私有会话级文件 | | `@deepseek-ai/dsh-spill-policy` | Consumer:对过大最终结果执行 spill 的工具结果策略 | 这种拆分方式与 shell/fs seam 相同。未来的远程或虚拟后端(例如 `spill://…` URI、数据库键或后端专用取回工具)可实现此 Service Definition,无需修改策略插件。 diff --git a/packages/subagent/subagent/README.i18n.yaml b/packages/subagent/subagent/README.i18n.yaml index 77db9afc45..ace4708403 100644 --- a/packages/subagent/subagent/README.i18n.yaml +++ b/packages/subagent/subagent/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent/README.md -README.md: 3a0142ed7e72d4f276dd475e1a8e1fa5e3aab9a6 -README.zh.md: 13ec9f61a28f425bbf8c80feed2e6211b2fe7f16 +README.md: ed4a9123a2dfa5b2fa5abc67f4513547feb3d140 +README.zh.md: e117ac7a6078d5b63759560eef35381b43b00dea diff --git a/packages/subagent/subagent/README.md b/packages/subagent/subagent/README.md index 3a0142ed7e..ed4a9123a2 100644 --- a/packages/subagent/subagent/README.md +++ b/packages/subagent/subagent/README.md @@ -52,7 +52,7 @@ The Service Definition owns the versioned `subagent/descriptor` session event vo ## Delegation depth -The seam owns the depth vocabulary shared by Service providers and Consumers: the `AgentOptions.subagentDepth` declaration, `assertSubagentMaxDepth`, and `delegationDepthOf(agent)`. The persisted `SessionHeader.delegationDepth` is authoritative and monotone — runtime options may deepen the count but never lower it, so a resumed child cannot be re-counted as top-level. +The seam owns the depth vocabulary shared by Service Providers and Consumers: the `AgentOptions.subagentDepth` declaration, `assertSubagentMaxDepth`, and `delegationDepthOf(agent)`. The persisted `SessionHeader.delegationDepth` is authoritative and monotone — runtime options may deepen the count but never lower it, so a resumed child cannot be re-counted as top-level. `inheritsParentContext` is descriptive rather than enforceable. It says only whether the child sees completed parent conversation history (`fork` does; `spawn` and the out-of-process one-shot providers do not), not whether it inherits tools, services, or authority. diff --git a/packages/subagent/subagent/README.zh.md b/packages/subagent/subagent/README.zh.md index 13ec9f61a2..e117ac7a60 100644 --- a/packages/subagent/subagent/README.zh.md +++ b/packages/subagent/subagent/README.zh.md @@ -52,7 +52,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 ## 委派深度 -该 seam 拥有 Service provider 和 Consumer 共享的深度词汇:`AgentOptions.subagentDepth` 声明、`assertSubagentMaxDepth` 和 `delegationDepthOf(agent)`。持久化的 `SessionHeader.delegationDepth` 具有权威性且单调:运行时选项可以加深计数,但绝不能降低它,因此恢复后的子 agent 不会被重新计为顶层。 +该 seam 拥有 Service Provider 和 Consumer 共享的深度词汇:`AgentOptions.subagentDepth` 声明、`assertSubagentMaxDepth` 和 `delegationDepthOf(agent)`。持久化的 `SessionHeader.delegationDepth` 具有权威性且单调:运行时选项可以加深计数,但绝不能降低它,因此恢复后的子 agent 不会被重新计为顶层。 `inheritsParentContext` 只用于描述,不能强制执行。它仅说明子 agent 是否能看到父级已完成的对话历史(`fork` 可以;`spawn` 和各进程外一次性提供方不可以),不表示是否继承工具、服务或权限。 diff --git a/packages/subagent/subagent/src/index.ts b/packages/subagent/subagent/src/index.ts index b3cfe9c9d6..fe270f1b4c 100644 --- a/packages/subagent/subagent/src/index.ts +++ b/packages/subagent/subagent/src/index.ts @@ -9,7 +9,7 @@ * one by name. The shape mirrors the LLM adapter registry * (`LlmRuntime.registerAdapter`), not the single-service bash executor. * - * This package owns the Service Definition role of the capability seam. Service providers + * This package owns the Service Definition role of the capability seam. Service Providers * (`@deepseek-ai/dsh-subagent-spawn-in-process`, `-fork`, `-acp`) and the model-facing * consumer (`@deepseek-ai/dsh-tool-subagent`) are separate packages. * diff --git a/packages/subprocess/README.i18n.yaml b/packages/subprocess/README.i18n.yaml index c1b0e3723f..b294c97415 100644 --- a/packages/subprocess/README.i18n.yaml +++ b/packages/subprocess/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subprocess/README.md -README.md: b92dfe0d275f4b59e42ea1e86ad4e6482d89aeb6 -README.zh.md: 8cef3023a4d699a4b2c1d1d6a747737acb4ff199 +README.md: 72a30775f45a8140935a013c63e9427e9cbd94d6 +README.zh.md: 35c801a1f4a5e8ad161b8c4ff57ad6ffa07e699d diff --git a/packages/subprocess/README.md b/packages/subprocess/README.md index b92dfe0d27..72a30775f4 100644 --- a/packages/subprocess/README.md +++ b/packages/subprocess/README.md @@ -7,7 +7,7 @@ The shared process substrate for one execution world: executable lookup, fully-s | Package | ctx key | Role | |---|---|---| | [`subprocess`](subprocess/README.md) (`@deepseek-ai/dsh-subprocess`) | `ctx.subprocess` | Service Definition: executable lookup, ordinary managed spawns, the terminal-process primitive, handle lifecycles, and shared environment/output vocabulary | -| [`subprocess-local`](subprocess-local/README.md) (`@deepseek-ai/dsh-subprocess-local`) | — | Local Service provider: detached process trees, bounded collection/spill, `node-pty`, foreground/session inspection, tree signalling, and terminate-and-join disposal | +| [`subprocess-local`](subprocess-local/README.md) (`@deepseek-ai/dsh-subprocess-local`) | — | Local Service Provider: detached process trees, bounded collection/spill, `node-pty`, foreground/session inspection, tree signalling, and terminate-and-join disposal | The service owns process lifetime across consumer reloads; consumers own what a process means (a bash command, a future non-shell runner) and every default that shapes one. diff --git a/packages/subprocess/README.zh.md b/packages/subprocess/README.zh.md index 8cef3023a4..35c801a1f4 100644 --- a/packages/subprocess/README.zh.md +++ b/packages/subprocess/README.zh.md @@ -7,7 +7,7 @@ | 包 | ctx 键 | 角色 | |---|---|---| | [`subprocess`](subprocess/README.md)(`@deepseek-ai/dsh-subprocess`) | `ctx.subprocess` | Service Definition:可执行文件查找、普通受管 spawn、终端进程原语、句柄生命周期,以及共享的环境/输出词汇 | -| [`subprocess-local`](subprocess-local/README.md)(`@deepseek-ai/dsh-subprocess-local`) | 无 | 本地 Service provider:detached 进程树、有界收集/spill、`node-pty`、前台/会话检查、进程树信号发送,以及先终止再等待退出的 dispose(资源释放) | +| [`subprocess-local`](subprocess-local/README.md)(`@deepseek-ai/dsh-subprocess-local`) | 无 | 本地 Service Provider:detached 进程树、有界收集/spill、`node-pty`、前台/会话检查、进程树信号发送,以及先终止再等待退出的 dispose(资源释放) | 即使消费方重载,进程生命周期仍由服务负责管理;消费方负责定义进程的含义(一条 bash 命令、未来的非 shell 运行器),以及决定塑造该进程的每一项默认值。 diff --git a/packages/subprocess/subprocess-local/README.i18n.yaml b/packages/subprocess/subprocess-local/README.i18n.yaml index 874f478937..10c7c1cd62 100644 --- a/packages/subprocess/subprocess-local/README.i18n.yaml +++ b/packages/subprocess/subprocess-local/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subprocess/subprocess-local/README.md -README.md: 645f05a0daf92d64c438f8aaae3b0e115f253a64 -README.zh.md: cd8c04071f00b298b2d242624c2ad1327758e16e +README.md: a88eab6776c7259bb8ee8fdad2d6002d8f57e133 +README.zh.md: ce088557875daceb5643f13bef78d6ea9a61e12f diff --git a/packages/subprocess/subprocess-local/README.md b/packages/subprocess/subprocess-local/README.md index 645f05a0da..a88eab6776 100644 --- a/packages/subprocess/subprocess-local/README.md +++ b/packages/subprocess/subprocess-local/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Local Service provider for the [`@deepseek-ai/dsh-subprocess`](../subprocess/README.md) seam. `LocalSubprocessRuntime` resolves local executables, spawns ordinary detached process trees with explicit stdio, and implements terminal processes through `node-pty` plus platform process inspection. It has no config: every disposition, limit, terminal dimension, grace, and directory arrives from the calling capability seams ([`dsh-bash-local`](../../shell/bash-local/README.md), [`dsh-lsp-stdio`](../../lsp/lsp-stdio/README.md), and [`dsh-terminal-bash`](../../terminal/terminal-bash/README.md)). +Local Service Provider for the [`@deepseek-ai/dsh-subprocess`](../subprocess/README.md) seam. `LocalSubprocessRuntime` resolves local executables, spawns ordinary detached process trees with explicit stdio, and implements terminal processes through `node-pty` plus platform process inspection. It has no config: every disposition, limit, terminal dimension, grace, and directory arrives from the calling capability seams ([`dsh-bash-local`](../../shell/bash-local/README.md), [`dsh-lsp-stdio`](../../lsp/lsp-stdio/README.md), and [`dsh-terminal-bash`](../../terminal/terminal-bash/README.md)). ## Behavior diff --git a/packages/subprocess/subprocess-local/README.zh.md b/packages/subprocess/subprocess-local/README.zh.md index cd8c04071f..ce08855787 100644 --- a/packages/subprocess/subprocess-local/README.zh.md +++ b/packages/subprocess/subprocess-local/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -[`@deepseek-ai/dsh-subprocess`](../subprocess/README.md) seam 的本地 Service provider。`LocalSubprocessRuntime` 解析本地可执行文件,以显式 stdio spawn 普通 detached 进程树,并通过 `node-pty` 加平台进程检查实现终端进程。该实现没有任何配置:每项处置方式、限制、终端尺寸、宽限期与目录都来自调用方能力 seam([`dsh-bash-local`](../../shell/bash-local/README.md)、[`dsh-lsp-stdio`](../../lsp/lsp-stdio/README.md) 和 [`dsh-terminal-bash`](../../terminal/terminal-bash/README.md))。 +[`@deepseek-ai/dsh-subprocess`](../subprocess/README.md) seam 的本地 Service Provider。`LocalSubprocessRuntime` 解析本地可执行文件,以显式 stdio spawn 普通 detached 进程树,并通过 `node-pty` 加平台进程检查实现终端进程。该实现没有任何配置:每项处置方式、限制、终端尺寸、宽限期与目录都来自调用方能力 seam([`dsh-bash-local`](../../shell/bash-local/README.md)、[`dsh-lsp-stdio`](../../lsp/lsp-stdio/README.md) 和 [`dsh-terminal-bash`](../../terminal/terminal-bash/README.md))。 ## 行为 diff --git a/packages/subprocess/subprocess-local/src/index.ts b/packages/subprocess/subprocess-local/src/index.ts index 0f3e0d2d13..261f614fba 100644 --- a/packages/subprocess/subprocess-local/src/index.ts +++ b/packages/subprocess/subprocess-local/src/index.ts @@ -1,5 +1,5 @@ /** - * Local Service provider for the subprocess capability seam. Each spawn is a detached + * Local Service Provider for the subprocess capability seam. Each spawn is a detached * process tree with the spec's per-stream stdio dispositions. Normal disposal * terminates and joins live trees; Node's synchronous exit phase force-stops * any trees the service still owns. It has no config: every disposition and diff --git a/packages/subprocess/subprocess/src/invariant.ts b/packages/subprocess/subprocess/src/invariant.ts index c9e6ee904e..0346915f27 100644 --- a/packages/subprocess/subprocess/src/invariant.ts +++ b/packages/subprocess/subprocess/src/invariant.ts @@ -10,7 +10,7 @@ export const name = 'subprocess-invariant' /** Service required before the companion can reserve package ownership. */ export const inject = ['invariants'] -/** No runtime invariant: this stateless Service Definition owns spawn-spec/handle types, while Service providers own observations. */ +/** No runtime invariant: this stateless Service Definition owns spawn-spec/handle types, while Service Providers own observations. */ const install: InvariantInstaller = () => {} /** diff --git a/packages/workflow/workflow/src/index.ts b/packages/workflow/workflow/src/index.ts index 9baba278f9..e345ab55d4 100644 --- a/packages/workflow/workflow/src/index.ts +++ b/packages/workflow/workflow/src/index.ts @@ -1,5 +1,5 @@ /** - * Service Definition for the workflow capability seam. Service providers execute orchestration scripts; + * Service Definition for the workflow capability seam. Service Providers execute orchestration scripts; * observe-only lifecycle events never expose run control. * @module @deepseek-ai/dsh-workflow */ diff --git a/scripts/snapshots/translation-prompt-v4/request-response.expected.json b/scripts/snapshots/translation-prompt-v4/request-response.expected.json index 586d082204..627097be23 100644 --- a/scripts/snapshots/translation-prompt-v4/request-response.expected.json +++ b/scripts/snapshots/translation-prompt-v4/request-response.expected.json @@ -4,7 +4,7 @@ "messages": [ { "role": "system", - "content": "# Translation Prompt\n\nYou are a senior technical translator specializing in LLM and agent development documentation. Your task is to translate the complete source document from English to Chinese, producing natural, professional technical prose.\n\nRead each complete semantic unit, understand it, and restate it as a native technical author would write it in the target language. Do not mechanically preserve source-language syntax. Then verify the translation against the source clause by clause: preserve every proposition and add none. Fluency never justifies losing or altering meaning, and completeness never justifies unnatural word-for-word prose.\n\n## Priority\n\nApply these authorities in order:\n\n1. Preserve the source meaning and the required document structure, protected content, and formatting.\n2. Follow the injected terminology table exactly.\n3. Use the injected whole-document gold pairs to calibrate target-language voice and phrasing.\n4. Apply the general writing guidance and illustrative examples in this prompt.\n\nA lower-priority rule may refine but never override a higher-priority requirement. Gold pairs calibrate voice; they are not a translation memory. No style preference, gold-pair phrasing, or embedded example may override source meaning, required structure, protected content, or the terminology table.\n\n## Quality Requirements\n\n### Structure and Format Preservation\n- Output a complete translated document that maintains the same document frame as the source: heading hierarchy and order, list kinds and item counts, ordered-list starts, table rows and columns, link targets, and code blocks.\n- Paragraph boundaries may change within the same structural unit when the target language needs different semantic grouping. Do not merge or move content across headings, list items, table cells, or other independent structural units.\n- Keep each prose paragraph on one physical line. Use paragraph breaks, not hard-wrapped lines inside a paragraph.\n- Fenced code blocks must be byte-identical to the source, including info strings, whitespace, and ALL comments inside them. Do NOT translate or reformat any content inside code blocks. This is a hard rule with no exceptions.\n- Inline code spans must be kept verbatim. This includes commands, flags, paths, identifiers, API and event names, config keys, protocol values, version numbers, and other machine-readable tokens. Never translate or reformat them.\n- Every relative link must point to the same target as in the source. Translate link text; do not change link targets.\n- Language switcher line: when an English source contains `English | [中文](source-filename.zh.md)`, write `[English](source-filename.md) | 中文`. When a Chinese source contains `[English](source-filename.md) | 中文`, write `English | [中文](source-filename.zh.md)`. Do NOT copy the source switcher unchanged. If the source has no switcher, do not invent a filename or switcher; the pipeline inserts the canonical target switcher after parsing ``.\n- Preserve emphasis marker types and the semantic spans they cover. Do not add, remove, move, or change bold and italic markers.\n\n### Faithfulness\n- Preserve every proposition in the source and add none. Every sentence, list item, note, FIXME, warning, example, caveat, prerequisite, and guarantee must have an equivalent in the translation. Count list items on both sides.\n- Preserve actors, objects, conditions, exceptions, negation, modality, causal relationships, and distinctions between concepts.\n- Preserve the exact strength and orientation of contracts. Completion and lifecycle conditions, failure behavior, directions and data flow, normal and exceptional result channels, ownership changes, and quantitative bounds must not be weakened, strengthened, reversed, or merged.\n- Translate ideas rather than source-language idioms, but never use fluency as a reason to omit or alter meaning.\n\n### Tone and Style\n- The translation must read as if originally written in the target language by a native technical author. If an expression sounds like a word-for-word rendering from the source language, rephrase it.\n- Write in a professional, formal tone appropriate for developer documentation. Never use colloquial or casual expressions.\n- Name an actor when the target language would otherwise obscure an actor that the source states or unambiguously implies. Never invent responsibility merely to avoid a passive construction.\n- Prefer established target-language engineering terms over literal renderings. Replace metaphors with direct descriptions that preserve the source meaning.\n- Use polite imperative forms where the text instructs the reader to do something. In Chinese, address the reader as `你`, not `您`.\n- Keep the author's register: concise stays concise, detailed stays detailed.\n\n### Sentence Structure\n- Break long sentences where the target language needs a pause. Avoid run-on sentences.\n- Use active voice when it improves clarity without changing or inventing the actor. Retain passive voice when the actor is unknown, irrelevant, or intentionally omitted.\n- Restructure source-language syntax into clear target-language syntax. Preserve the logical scope of conditions, concessions, negation, coordination, and modifiers.\n- Split or combine clauses when needed for readability, provided every source relationship remains explicit.\n- Translate meaning, not words. Do not invent words or expressions that a native technical author would not use.\n\n### Word Choice\n- Prefer precise, formal vocabulary over casual or colloquial alternatives.\n- When multiple synonyms exist, choose the one most commonly used in professional technical documentation of the target language.\n- Translate ordinary prose when an established target-language expression is clear. Preserve proper nouns, canonical product names, code identifiers, APIs, paths, package names, and terms that the terminology table requires to remain in the source language.\n- Use context to resolve polysemous words. A familiar word does not have one fixed rendering in every technical domain.\n- Avoid slang, internal jargon, or overly literal translations that would not be recognized by the general developer audience.\n- Do not use the same word to translate distinct source-language concepts when their distinction matters.\n- Avoid repeating the same ordinary verb in close proximity when a natural equivalent preserves the exact meaning. Never vary a terminology-table form, defined concept, or contract verb merely for stylistic variety.\n\n#### When translating into Chinese\n- When a number modifies a noun, include a natural Chinese classifier or measure word when Chinese grammar requires one. For example: \"three-role capability seam\" → \"包含三种角色的能力 seam\", not \"三角色 seam\". Do not add classifiers to code, identifiers, versions, units, or fixed names.\n\n### Punctuation\n\n#### When translating into Chinese\n- Use full-width Chinese punctuation in Chinese prose: `,。:;?!()「」`. Keep half-width punctuation inside code spans, numbers, and complete verbatim English text.\n- Prefer colons, periods, commas, or parentheses over em dashes when they make the sentence clearer or more natural. Keep an em dash when it is the clearest natural punctuation.\n- Use enumeration commas (、) between parallel Chinese items, not regular commas.\n- Keep list-item endings consistent with their grammar. Complete sentences may end with periods or other grammatically required punctuation; do not end list items with commas.\n- Put one half-width space between Chinese text and Latin words or numerals. Do not add a space next to full-width punctuation, and do not leave a meaningless half-width space between two Chinese characters.\n- Markdown emphasis markers do not create a word boundary. Determine spacing from the rendered adjacent characters: Chinese next to Chinese takes no space, while Chinese next to a Latin word or numeral takes one half-width space.\n- Use half-width digits and Latin letters, never full-width forms.\n- For RFC 2119 keywords (MUST, MUST NOT, SHOULD, MAY), translate to the corresponding Chinese term (必须、禁止、应当、可以), preserve the SOURCE emphasis span exactly, and do not weaken its normative strength: plain source stays plain (必须), italic source stays italic (*必须*), and bold source stays bold (**必须**).\n\n#### When translating into English\n- Use half-width English punctuation and standard English spacing. Preserve full-width punctuation only in verbatim Chinese text.\n- Convert enumeration commas (、) to English commas and Chinese prose quotation marks to English double quotes.\n- Convert Chinese topic-comment sentences and omitted-subject constructions into clear English subjects when the actor is stated or unambiguously implied. Do not invent an actor.\n- Use concise professional developer prose and established English technical terms. Do not transliterate Chinese engineering idioms literally.\n- Use the terminology table's English column exactly and do not carry Chinese first-occurrence glosses into English prose.\n\n## Terminology\n\nA terminology table is provided below. Follow it strictly:\n- Render every listed term exactly as specified.\n- When the target language is Chinese, use the \"中文\" column. On the document's first prose occurrence, write the \"首次出现\" value when one is specified; on later occurrences, write only the part before the parenthetical gloss.\n- When the target language is English, use the \"English\" column without a Chinese gloss; do not copy the \"中文\" or \"首次出现\" value into English prose.\n- If a term has already been glossed as part of a compound term, do not gloss it again when it appears alone later.\n- NEVER use translations listed in the \"不要译作\" column.\n- Code spans and other protected tokens remain verbatim even when their text resembles a listed term.\n- For an unlisted technical term, use an established target-language technical term when its meaning is unambiguous in context. For a Chinese target, use an established Chinese rendering from a major Chinese-language OSS or vendor source; if you cannot reliably determine such a rendering, preserve the source term and record `[Terminology: pending]` in `` with a tentative rendering for human review. For an English target, use the established English technical term; if the source term has no unambiguous established equivalent, preserve it with the shortest English gloss needed to make it intelligible and record `[Terminology: pending]` in ``. A tentative rendering may appear in `` but must not be silently adopted in `` or ``, and you must not invent or claim a specific external precedent. This rule applies to terminology only; for general prose, freely restructure and paraphrase for natural expression.\n\n# Terminology\n\n本表约定本仓库的中英术语统一译法。\n\n**通用规则:**\n- \"中文\"列为中文译文的正文默认用词。若该列为英文,则中文译文的正文中保留英文不翻译。\n- 首次出现按\"首次出现\"列书写(带括号注释);后续出现只写括号前的部分(可能为中文,也可能为英文),不出现括号内的注释。\n- \"不要译作\"列为严格禁止的译法。\n- 如果某术语已经作为另一个术语的组成部分被括注过(如 `agent loop(智能体循环)` 中已包含 `agent` 的括注),则该术语后续单独出现时无需再次括注。\n\n## 缩写类(中英文文本中均使用缩写)\n\n| English | 中文 | 首次出现 | 不要译作 | 备注 |\n|---|---|---|---|---|\n| ACP | ACP | ACP(Agent Client Protocol) | | |\n| AI | AI | AI(人工智能) | | |\n| API | API | | | |\n| CI | CI | | | |\n| CLI | CLI | CLI(命令行界面) | | |\n| e2e | e2e | | | |\n| HMR | HMR | HMR(热模块替换) | | |\n| JSON Schema | JSON Schema | | | |\n| JSONL | JSONL | | | |\n| LLM | LLM | LLM(大语言模型) | | |\n| MCP | MCP | | | |\n| PR | PR | PR(Pull Request) | | |\n| RAG | RAG | RAG(检索增强生成) | | |\n| SDK | SDK | | | 只指受支持的 Python 与 TypeScript SDK 所使用的 JSON-RPC 客户端/服务器协议;DeepSeek Harness 项目本身不是 SDK |\n| SSE | SSE | SSE(Server-Sent Events) | | |\n\n## 英文类(中英文文本中均使用英文)\n\n| English | 中文 | 首次出现 | 不要译作 | 备注 |\n|---|---|---|---|---|\n| agent | agent | agent(智能体) | | |\n| Agent Note | Agent Note | | 智能体注记、智能体笔记 | 仓库定义的文档类型,涵盖提案、已实现决策和被否决提案;中文对侧 H1 保持固定前缀 `# Agent Note: `,标题中不加术语括注 |\n| agent harness | agent harness | agent harness(智能体框架) | | agent 组合词(agent harness/workflow/loop/skill 等)整体保留英文;未括注过 agent 时首现按对应组合词或 agent 行处理 |\n| agent loop | agent loop | agent loop(智能体循环) | | |\n| blob hash | blob hash | | | `git hash-object` 的结果 |\n| coding agent | coding agent | coding agent(编程智能体) | | agent 组合词,正文保留英文 |\n| Cordis | Cordis | | | |\n| dispose | dispose | dispose(资源释放) | | |\n| doc-sync | doc-sync | doc-sync(文档同步门禁) | | |\n| fiber | fiber | | | |\n| fixture | fixture | fixture(测试前置数据) | | |\n| fork | fork | | | |\n| Function Calling | Function Calling | Function Calling(函数调用) | | |\n| harness | harness | | | |\n| harness engineering | harness engineering | | | |\n| KV Cache | KV Cache | | | 专有技术名称,保持大小写与空格 |\n| lint | lint | | | |\n| mock | mock | | | 保留英文;指测试替身 |\n| loader | loader | | | |\n| manifest | manifest | manifest(元数据清单) | | |\n| monorepo | monorepo | | | |\n| Round | Round | | 回合、目标回合、Ralph 回合 | 外层策略使用 Round 时,领域层级为 Session > Round > Turn(轮次) > Step(步骤);Round 是可选的外层策略迭代,并非每个会话轮次都具有的通用层级。Goal Round 与 Ralph Round 均保留英文。一个 Round 承载一个轮次,步骤隶属于该轮次;明确的零步骤轮次仍保持原义。 |\n| schema | schema | | | |\n| schema DSL | schema DSL | | | |\n| seam | seam | | 接缝 | 一个可替换能力的整体,包含 Service Definition / Service provider / Consumer 三种角色;角色需要独立演化时才拆包,也可由同一包承担多个角色。以 `packages/shell` 为范例;Service Definition 是 Cordis `Service`(抽象类或具体 registry 服务),不是 TypeScript interface。任何单一角色、普通边界或扩展点都不能称为 seam。本仓库正文保留英文;与 `extension point` 是不同概念 |\n| skill | skill | skill(技能) | | |\n| slot | slot | | 坑位、孔位 | 客户端架构中的具名可注册位置,保留英文 |\n| spill | spill | | | 工具输出超限落盘机制;组合词写 `spill 文件`、`spill 路径` |\n| spawn | spawn | | | |\n| steering | steering | steering(中途引导) | | |\n| job id | job id | | 任务 id | 保留英文 |\n| subagent | subagent | | | |\n| transcript | transcript | transcript(文本记录) | | 指会话渲染给用户或编辑器的完整文本,区别于事件日志 |\n| Typert | Typert | | TypeRT、typeRT、Type RT | DeepSeek Harness 类型图、生成器、loader 与运行时 registry 的产品拼写 |\n| waterfall | waterfall | waterfall(瀑布式事件) | | |\n| wheel | wheel 包 | | | Python 打包格式 |\n| worktree | worktree | | | git 工作区概念 |\n| Zstandard | Zstandard | | | RFC 8878 compression format; `zstd` remains a code value. |\n\n## 双语类(中英文文本各自使用中英文)\n\n| English | 中文 | 首次出现 | 不要译作 | 备注 |\n|---|---|---|---|---|\n| adapter | 适配器 | | | |\n| adapter contract | 适配器约定 | 适配器约定(adapter contract) | | |\n| append-only | 仅追加 | | | |\n| artifact | 产物 | | 制品 | |\n| backend | 后端 | | | |\n| binder | 绑定器 | | | 命名角色:把已声明接口绑定到调用方 context 或生命周期 |\n| config | 配置 | | | 命名角色:一个已解析配置值或边界严格的配置记录 |\n| controller | 控制器 | | | 命名角色:接受意图并改变一项既有领域或展示状态 |\n| directory | 目录 | | | 命名角色:暴露供发现或选择的条目及元数据 |\n| engine | 引擎 | | | 命名角色:实现领域算法或有状态执行模型 |\n| gateway | 网关 | | | 命名角色:适配进程、网络、RPC 或 API 边界 |\n| handle | 句柄 | | | 命名角色:引用并控制或观察一个实时资源 |\n| policy | 策略 | | | 命名角色:决定允许、选择、限制或观察什么 |\n| presenter | 展示转换器 | | | 命名角色:把领域值纯转换为渲染意图 |\n| resolver | 解析器 | | | 命名角色:根据输入计算或定位一个答案 |\n| store | 存储 | | | 命名角色:拥有一组数据并主要提供数据操作 |\n| background job | 后台任务 | | | |\n| block | 块 | | | |\n| build target | 构建目标 | | | |\n| cancel | 取消 | | | |\n| canary test | canary 测试 | | 金丝雀测试 | 本仓库保留 `canary` |\n| capability | 能力 | | | 必须与 `feature` → `功能` 区分 |\n| capability seam | 能力 seam | | 功能 seam、能力接缝 | 本仓库 Service Definition、Service provider 与 Consumer 三种角色组成完整可替换能力的命名架构概念;普通 `seam` 仍按其词条处理 |\n| feature | 功能 | | 能力 | SDK 产品与工程模型中的可管理产品单元 |\n| feature option | 功能选项 | | variant | 一项 SDK 功能内有限、可选择的实现或配置 |\n| checkpoint | 检查点 | | | |\n| chunk | 分片 | | | |\n| compaction | 压缩 | 压缩(compaction) | | |\n| companion tool | 配套工具 | | | |\n| composition bundle | 组合包 | | | 只约束应用或插件的组合语境,不约束所有 `bundle` |\n| Cordis plugin config | Cordis 插件配置 | | | Cordis 插件公开的 `Config` 对象或配置结构 |\n| config key | 配置键 | | | Cordis 插件配置中的单个字段 |\n| consumer | 消费方 | | 消费者 | |\n| content block | 内容块 | | | |\n| Cookbook | 实操手册 | | | 文档标题用语 |\n| context | 上下文 | | | |\n| counterpart | 对侧文件 | | 对应物、配对物 | 双语配对语境;泛指\"另一侧\"时可写「另一侧」 |\n| configurable-provider directory | 可配置提供方目录 | | | llm seam 中 `registerConfigurableProviders()` 维护的目录;沿用 Service Catalog →「服务目录」先例 |\n| context compaction | 上下文压缩 | 上下文压缩(context compaction) | | |\n| contract | 约定 | | | 如:`pairing contract` →`配对约定` |\n| Cordis config entry | Cordis 配置项 | | | 指 `cordis.yml` 插件列表中的一项;插件实现本身写`Cordis 插件` |\n| Cordis plugin | Cordis 插件 | | | Cordis 加载的插件实现,不指 `cordis.yml` 中的一项配置 |\n| crash recovery | 崩溃恢复 | | | |\n| deploy root | 部署根目录 | | | |\n| dormant | 休眠 | | 睡眠、蛰伏 | 指已声明可配置但当前未注册路由的提供方 |\n| durability | 持久性 | | | |\n| feature requirement | 功能依赖 | | | 功能或功能选项通过 `requires` 声明的关系 |\n| event | 事件 | | | |\n| event log | 事件日志 | | | |\n| event stream | 事件流 | | | |\n| event-sourced | 事件溯源 | | | 沿用 DDD 社区通行译法 |\n| Executive summary | 摘要 | | | 事故复盘标题用语 |\n| executor | 执行器 | | | |\n| expected output | 预期输出 | | 金标 | 指 snapshot 比较产物;翻译语料的人工校准样例不在此列 |\n| extension | 扩展 | | | |\n| extension point | 扩展点 | | | 注意与 `seam` 区分 |\n| fail-fast | 快速失败 | | | |\n| fenced code block | 围栏代码块 | | | 沿用 MDN 中文翻译 |\n| fingerprint | 指纹 | | | 通用内容指纹;双语配对机制使用 sidecar record 记录两侧 blob hash |\n| finish reason | 结束原因 | | | |\n| fold | 折叠区 | | | 配置界面语境:默认收起的字段分区(collapsed →「收起」)|\n| foreground run | 前台运行 | | | |\n| freshness | 新鲜度 | | | 沿用 MDN 中文翻译;在本项目中指译文相对源文的同步状态 |\n| hook | 钩子 | | | |\n| implementation | 实现 | | | |\n| inference | 推理 | 推理(inference) | | 需要和 `reasoning` 区分时保留英文括注 |\n| info string | 信息字符串 | | | 沿用 CommonMark 中文翻译;指代码围栏 ``` 之后的语言标注 |\n| injection | 注入 | | | |\n| integration | 集成 | | | |\n| interface | 接口 | | | |\n| language switcher | 语言切换行 | | | i18n 配对机制用语:双语配对文件顶部的互链行 |\n| merge | 合并 | | | |\n| message | 消息 | | | |\n| mod | 模组 | | | |\n| model provider | 模型提供方 | | | |\n| model selection | 模型选择 | | 模型目标 | 面向 Agent 的提供方、模型和可选推理强度选择。 |\n| module | 模块 | | | |\n| non-escalation | 非升权 | | 非升级、不可升级 | 仅用于安全与权限语境,指主体不得获得超出既有授权的权限;普通升级不适用此行 |\n| npm dependency | NPM 依赖 | | | `package.json` 中的包关系;`dependencies`、`devDependencies` 等字段保持原样 |\n| opt-out ratio | opt-out 比例 | | 退出检查比例 | |\n| orphan | 遗留 | | 孤儿、孤立 | 指英文源已不存在的 `.zh.md`(如「遗留译文」);进程语境按 OS 惯用语译「孤儿进程」 |\n| orphan branch | 孤立分支 | | 孤儿分支 | 沿用 git 官方中文翻译 |\n| package | 包 | | | 指 npm 包(`@deepseek-ai/dsh-*`);`package.json` 等代码标识保持原样 |\n| pairing | 配对 | | | |\n| parent-subset grants | 父级子集授权 | | 父集合授权 | 指授权范围仅限于父级所持授权的子集 |\n| peer dependency | 对等依赖 | 对等依赖(peer dependency) | | |\n| permission | 权限 | | | |\n| persistence | 持久化 | | | |\n| pipeline | 流水线 | | | |\n| plugin | 插件 | | | |\n| postmortem | 事故复盘 | 事故复盘(postmortem) | 事后分析、事故记录 | 事故记录与分析文档;目录或路径中的 `postmortem` 保持代码形式 |\n| prompt | 提示词 | | | |\n| provider | 提供方 | | | |\n| provider-neutral | 提供方无关 | | 提供方中立 | |\n| quality gate | 质量门禁 | | | |\n| quiescence | 完全停稳 | | 静默、静止状态 | 指生命周期工作全部结算后的状态 |\n| reasoning | 推理 | 推理(reasoning) | | 需要和 `inference` 区分时保留英文括注 |\n| reasoning_content | 思考内容 | | | |\n| registry | 注册表 | | | |\n| replay | 回放 | | | |\n| resume | 恢复 | | | |\n| runtime | 运行时 | | | |\n| same-world subprocess | 与宿主共享文件系统和内核的子进程 | | 同世界子进程 | |\n| sandbox | 沙箱 | | | |\n| service | 服务 | | | |\n| serving interface | 对外服务接口 | | | |\n| session | 会话 | | | |\n| session event | 会话事件 | | | |\n| setup card | 设置卡片 | | | 首次运行时代替行卡直接展开的配置卡 |\n| sidecar file | 伴随文件 | | | 指与文档同目录的普通伴随文件 |\n| sidecar record | 伴随记录 | | 旁挂记录 | 指与文档同目录的伴随记录文件 |\n| smoke test | 冒烟测试 | | | |\n| snapshot | 快照 | | | |\n| source of truth | 真源 | | 事实来源、唯一来源 | |\n| spine | 主干 | | | |\n| stale | 陈旧 | | 过期 | 与 `fresh`(`新鲜`)成对;门禁输出中保留英文 `stale` 不翻译;`expired` 才译为`过期` |\n| step | 步骤 | | | |\n| stream | 流 | | | |\n| structural signature | 结构签名 | | | i18n 配对机制用语:门禁比对两侧文件时提取的有序结构序列(标题层级、代码块、列表等) |\n| Summary | 概述 | | | 事故复盘标题用语 |\n| system prompt | 系统提示词 | | | |\n| taxonomy | 分类体系 | | | |\n| token usage | token 用量 | | | |\n| tool | 工具 | | | |\n| tool call | 工具调用 | | | |\n| tool result | 工具结果 | | | |\n| tool schema | 工具 schema | | | |\n| toolkit | 工具包 | | | |\n| turn | 轮次 | | | |\n| VFS | VFS | 虚拟文件系统(VFS) | | |\n| typecheck | 类型检查 | | | |\n| vocabulary | 词汇 | | | |\n| wire format | 协议格式 | 协议格式(wire format) | | |\n| workflow | 工作流 | | | |\n| wrapper | 包装层 | | | 软件层或 SDK 包装层 |\n| wrapper script | 包装脚本 | | | 可执行脚本包装层 |\n\n\n## Output Format\n\nReturn exactly three raw XML sections in the order shown below. Do not wrap the response in a Markdown code fence and do not add analysis or text before, between, or after the sections. The fence below only displays the required format; do not reproduce the fence.\n\nThe outer section tags are framing. If Markdown inside any section body contains a line consisting only of ``, ``, ``, ``, ``, or ``, prefix that line with `\\`. If the original line already has one or more backslashes immediately before the tag, add one more. The parser removes exactly one framing escape; tags mentioned inline need no escaping.\n\n```xml\n\n(First pass: the complete translation, written as natural target-language technical prose)\n\n\n\n(Second pass: actual corrections only, one correction per line with a category tag, e.g.)\n- [Tone] \"旁挂记录\" → \"伴随记录\"(生造词)\n- [Sentence] 第 3 段补充逗号断句\n- [Punctuation] 两处破折号替换为冒号\n- [Terminology: pending] source term → tentative rendering\n- 无修正\n\n\n\n(Complete final translation after corrections)\n\n```\n\n## Self-Review Instructions\n\nAfter writing ``, verify it in two directions. First re-read it in the target language only without comparing it with the source; this makes awkward phrasing easier to notice. Then compare it against the source clause by clause for completeness and exact meaning. Resolve doubts before writing ``; do not include reasoning transcripts, checks that passed, tentative suggestions, retractions, or no-op corrections.\n\n**Structure**\n- Are the heading hierarchy and order, list kind and item count, ordered-list start, table dimensions, and code block content identical to the source?\n- Are ALL comments and info strings inside code blocks left untranslated and byte-identical to the source?\n- Are inline code spans and machine-readable tokens verbatim?\n- Is an existing language switcher correctly flipped, and is no switcher or filename invented when the source lacks one?\n- Are link targets and emphasis spans preserved?\n- Does spacing across emphasis boundaries follow the same Chinese/Latin/numeral rule as ordinary prose?\n- Are wrapper-tag lines inside section bodies escaped with one additional backslash?\n\n**Faithfulness**\n- Clause by clause, is anything added, dropped, weakened, strengthened, reversed, merged, or re-bounded? Are list item counts identical on both sides?\n- Do actors, objects, conditions, exceptions, negation, modality, causal relationships, guarantees, contract directions, result channels, ownership changes, and quantities survive exactly?\n\n**Tone & Style**\n- Does every sentence read as if originally written by a native technical author?\n- Is there any colloquial, casual, overly informal, promotional, or metaphorical phrasing?\n- Are actors explicit where the target language needs them, without inventing responsibility?\n\n**Sentence Structure**\n- Are there run-on sentences that need breaking?\n- Are there stiff passive constructions that can safely become active, or active constructions that invent an actor?\n- Are conditions, concessions, negation, coordination, and modifiers scoped clearly?\n\n**Word Choice**\n- Are there overly literal translations that sound unnatural?\n- Are ordinary prose words left untranslated despite an established target-language expression?\n- Does each polysemous word fit its local context?\n- Is the same target-language word used for distinct source concepts, or is a defined term varied merely to avoid repetition?\n- Is any slang or internal jargon present?\n\n**Terminology**\n- For a Chinese target, are first-occurrence glosses correctly applied to the true first prose occurrence, neither missing nor repeated? For an English target, are Chinese glosses absent?\n- Are any \"不要译作\" forbidden translations present?\n- Do protected tokens remain untouched even when they resemble terminology entries?\n- For an unlisted term, does a Chinese target use an established Chinese rendering or preserve the source term as pending when no reliable rendering is known, and does an English target use the established English technical term or preserve only an ambiguous source term with the shortest necessary gloss and a pending notice?\n\n**Punctuation** (when target is Chinese)\n- Are punctuation, mixed-script spacing, quotation marks, Latin letters, and digits in their required forms?\n- Are there em dashes that make the sentence less clear and should be replaced, while natural em dashes remain intact?\n- Are list-item endings grammatically consistent, with none ending in commas?\n- Do RFC 2119 keywords preserve the source emphasis span and normative strength exactly?\n\nRecord actual corrections in ``, then output the corrected complete document in ``. If no correction or pending terminology notice is needed, write exactly `- 无修正` in `` and copy `` unchanged into ``. If `` contains only pending terminology notices, copy `` unchanged into ``.\n\n## Examples\n\nBelow are representative examples of common problems and their corrections. Follow the \"Good\" versions within the rule each example illustrates; examples do not override source context or higher-priority requirements.\n\n### Colloquial verb → Professional verb\n- Source: `The repo pins pnpm@11.7.0 in package.json`\n- Bad: `仓库在 package.json 中钉住 pnpm@11.7.0`\n- Good: `该仓库在 package.json 中固定使用 pnpm@11.7.0`\n\n### Run-on sentence → Natural phrasing with pause\n- Source: `Read docs/architecture.md before changing anything under packages/.`\n- Bad: `改动 packages/ 下的任何东西之前先读 docs/architecture.md。`\n- Good: `在修改 packages/ 目录下的任何内容之前,请先阅读 docs/architecture.md。`\n\n### Stiff passive voice → Active and natural\n- Source: `a green gate means the pair was confirmed consistent at these exact contents, not that the confirmation was sound.`\n- Bad: `门禁绿意味着这对文档曾在当前内容上被确认一致,不意味着这次确认本身是对的。`\n- Good: `门禁通过意味着这组文档在当前内容上的一致性得到了确认,不代表确认本身正确可靠。`\n\n### Invented word → Natural expression\n- Source: `A sidecar record of both blob hashes makes consistency checkable`\n- Bad: `旁挂记录两侧 blob hash,使一致性可检查`\n- Good: `伴随记录保存两侧 blob hash,使一致性可检查`\n\n### Em-dash → Colon/period\n- Source: `FIXME — an issue that should block a new release. A release should not ship with an open FIXME unless reviewers explicitly agree the change can be merged anyway.`\n- Bad: `FIXME——应当阻塞新版本发布的问题。除非评审者明确同意可以照常合入,发布不应带着未解决的 FIXME 出门。`\n- Good: `FIXME:应当阻塞新版本发布的问题。除非评审者明确同意该更改可以合并,否则发布版本不应包含未解决的 FIXME。`\n\n### Overly literal → Meaningful rendering\n- Source: `awkward phrasing is easier to notice when you read the translation without comparing it with the source`\n- Bad: `不把译文和原文比较时,尴尬的措辞更容易被注意`\n- Good: `不对照原文阅读译文时,更容易察觉别扭的表达`\n\n### Terminology — do not translate what should be kept in English\n- Source: `typed service seams, and explicit extension points`\n- Bad: `类型化的服务 seam(扩展点)与显式扩展点`\n- Good: `类型化的服务 seam 与显式扩展点`\n\n### Slang/jargon → Professional phrasing\n- Source: `The committed agent workflow lives in .agents/skills/dsh-translate-docs`\n- Bad: `进仓的 agent 工作流见 .agents/skills/dsh-translate-docs`\n- Good: `仓库内置的 agent 工作流见 .agents/skills/dsh-translate-docs`\n\n### \"For humans\" — translate the intent, not the word\n- Source: `For humans, start with the development guide`\n- Bad: `对于人工读者,请先从开发指南开始`(\"人工读者\"生硬)\n- Good: `面向开发者:请先阅读开发指南`(\"开发者\"自然,且中文里冒号在此处更自然)\n\n### Code block comments — NEVER translate\n- Source code block contains: `# full-screen TUI coding agent (needs DEEPSEEK_API_KEY)`\n- Bad: `# 全屏 TUI coding agent(需要 DEEPSEEK_API_KEY)`\n- Good: `# full-screen TUI coding agent (needs DEEPSEEK_API_KEY)` (keep exactly as-is, byte-for-byte)\n\n### Language switcher — flip direction\n- Source file (English) has: `English | [中文](README.zh.md)`\n- Bad (copying source unchanged): `English | [中文](README.zh.md)`\n- Good (flipped for Chinese file): `[English](README.md) | 中文`\n\n---\n\nNow translate the following document:" + "content": "# Translation Prompt\n\nYou are a senior technical translator specializing in LLM and agent development documentation. Your task is to translate the complete source document from English to Chinese, producing natural, professional technical prose.\n\nRead each complete semantic unit, understand it, and restate it as a native technical author would write it in the target language. Do not mechanically preserve source-language syntax. Then verify the translation against the source clause by clause: preserve every proposition and add none. Fluency never justifies losing or altering meaning, and completeness never justifies unnatural word-for-word prose.\n\n## Priority\n\nApply these authorities in order:\n\n1. Preserve the source meaning and the required document structure, protected content, and formatting.\n2. Follow the injected terminology table exactly.\n3. Use the injected whole-document gold pairs to calibrate target-language voice and phrasing.\n4. Apply the general writing guidance and illustrative examples in this prompt.\n\nA lower-priority rule may refine but never override a higher-priority requirement. Gold pairs calibrate voice; they are not a translation memory. No style preference, gold-pair phrasing, or embedded example may override source meaning, required structure, protected content, or the terminology table.\n\n## Quality Requirements\n\n### Structure and Format Preservation\n- Output a complete translated document that maintains the same document frame as the source: heading hierarchy and order, list kinds and item counts, ordered-list starts, table rows and columns, link targets, and code blocks.\n- Paragraph boundaries may change within the same structural unit when the target language needs different semantic grouping. Do not merge or move content across headings, list items, table cells, or other independent structural units.\n- Keep each prose paragraph on one physical line. Use paragraph breaks, not hard-wrapped lines inside a paragraph.\n- Fenced code blocks must be byte-identical to the source, including info strings, whitespace, and ALL comments inside them. Do NOT translate or reformat any content inside code blocks. This is a hard rule with no exceptions.\n- Inline code spans must be kept verbatim. This includes commands, flags, paths, identifiers, API and event names, config keys, protocol values, version numbers, and other machine-readable tokens. Never translate or reformat them.\n- Every relative link must point to the same target as in the source. Translate link text; do not change link targets.\n- Language switcher line: when an English source contains `English | [中文](source-filename.zh.md)`, write `[English](source-filename.md) | 中文`. When a Chinese source contains `[English](source-filename.md) | 中文`, write `English | [中文](source-filename.zh.md)`. Do NOT copy the source switcher unchanged. If the source has no switcher, do not invent a filename or switcher; the pipeline inserts the canonical target switcher after parsing ``.\n- Preserve emphasis marker types and the semantic spans they cover. Do not add, remove, move, or change bold and italic markers.\n\n### Faithfulness\n- Preserve every proposition in the source and add none. Every sentence, list item, note, FIXME, warning, example, caveat, prerequisite, and guarantee must have an equivalent in the translation. Count list items on both sides.\n- Preserve actors, objects, conditions, exceptions, negation, modality, causal relationships, and distinctions between concepts.\n- Preserve the exact strength and orientation of contracts. Completion and lifecycle conditions, failure behavior, directions and data flow, normal and exceptional result channels, ownership changes, and quantitative bounds must not be weakened, strengthened, reversed, or merged.\n- Translate ideas rather than source-language idioms, but never use fluency as a reason to omit or alter meaning.\n\n### Tone and Style\n- The translation must read as if originally written in the target language by a native technical author. If an expression sounds like a word-for-word rendering from the source language, rephrase it.\n- Write in a professional, formal tone appropriate for developer documentation. Never use colloquial or casual expressions.\n- Name an actor when the target language would otherwise obscure an actor that the source states or unambiguously implies. Never invent responsibility merely to avoid a passive construction.\n- Prefer established target-language engineering terms over literal renderings. Replace metaphors with direct descriptions that preserve the source meaning.\n- Use polite imperative forms where the text instructs the reader to do something. In Chinese, address the reader as `你`, not `您`.\n- Keep the author's register: concise stays concise, detailed stays detailed.\n\n### Sentence Structure\n- Break long sentences where the target language needs a pause. Avoid run-on sentences.\n- Use active voice when it improves clarity without changing or inventing the actor. Retain passive voice when the actor is unknown, irrelevant, or intentionally omitted.\n- Restructure source-language syntax into clear target-language syntax. Preserve the logical scope of conditions, concessions, negation, coordination, and modifiers.\n- Split or combine clauses when needed for readability, provided every source relationship remains explicit.\n- Translate meaning, not words. Do not invent words or expressions that a native technical author would not use.\n\n### Word Choice\n- Prefer precise, formal vocabulary over casual or colloquial alternatives.\n- When multiple synonyms exist, choose the one most commonly used in professional technical documentation of the target language.\n- Translate ordinary prose when an established target-language expression is clear. Preserve proper nouns, canonical product names, code identifiers, APIs, paths, package names, and terms that the terminology table requires to remain in the source language.\n- Use context to resolve polysemous words. A familiar word does not have one fixed rendering in every technical domain.\n- Avoid slang, internal jargon, or overly literal translations that would not be recognized by the general developer audience.\n- Do not use the same word to translate distinct source-language concepts when their distinction matters.\n- Avoid repeating the same ordinary verb in close proximity when a natural equivalent preserves the exact meaning. Never vary a terminology-table form, defined concept, or contract verb merely for stylistic variety.\n\n#### When translating into Chinese\n- When a number modifies a noun, include a natural Chinese classifier or measure word when Chinese grammar requires one. For example: \"three-role capability seam\" → \"包含三种角色的能力 seam\", not \"三角色 seam\". Do not add classifiers to code, identifiers, versions, units, or fixed names.\n\n### Punctuation\n\n#### When translating into Chinese\n- Use full-width Chinese punctuation in Chinese prose: `,。:;?!()「」`. Keep half-width punctuation inside code spans, numbers, and complete verbatim English text.\n- Prefer colons, periods, commas, or parentheses over em dashes when they make the sentence clearer or more natural. Keep an em dash when it is the clearest natural punctuation.\n- Use enumeration commas (、) between parallel Chinese items, not regular commas.\n- Keep list-item endings consistent with their grammar. Complete sentences may end with periods or other grammatically required punctuation; do not end list items with commas.\n- Put one half-width space between Chinese text and Latin words or numerals. Do not add a space next to full-width punctuation, and do not leave a meaningless half-width space between two Chinese characters.\n- Markdown emphasis markers do not create a word boundary. Determine spacing from the rendered adjacent characters: Chinese next to Chinese takes no space, while Chinese next to a Latin word or numeral takes one half-width space.\n- Use half-width digits and Latin letters, never full-width forms.\n- For RFC 2119 keywords (MUST, MUST NOT, SHOULD, MAY), translate to the corresponding Chinese term (必须、禁止、应当、可以), preserve the SOURCE emphasis span exactly, and do not weaken its normative strength: plain source stays plain (必须), italic source stays italic (*必须*), and bold source stays bold (**必须**).\n\n#### When translating into English\n- Use half-width English punctuation and standard English spacing. Preserve full-width punctuation only in verbatim Chinese text.\n- Convert enumeration commas (、) to English commas and Chinese prose quotation marks to English double quotes.\n- Convert Chinese topic-comment sentences and omitted-subject constructions into clear English subjects when the actor is stated or unambiguously implied. Do not invent an actor.\n- Use concise professional developer prose and established English technical terms. Do not transliterate Chinese engineering idioms literally.\n- Use the terminology table's English column exactly and do not carry Chinese first-occurrence glosses into English prose.\n\n## Terminology\n\nA terminology table is provided below. Follow it strictly:\n- Render every listed term exactly as specified.\n- When the target language is Chinese, use the \"中文\" column. On the document's first prose occurrence, write the \"首次出现\" value when one is specified; on later occurrences, write only the part before the parenthetical gloss.\n- When the target language is English, use the \"English\" column without a Chinese gloss; do not copy the \"中文\" or \"首次出现\" value into English prose.\n- If a term has already been glossed as part of a compound term, do not gloss it again when it appears alone later.\n- NEVER use translations listed in the \"不要译作\" column.\n- Code spans and other protected tokens remain verbatim even when their text resembles a listed term.\n- For an unlisted technical term, use an established target-language technical term when its meaning is unambiguous in context. For a Chinese target, use an established Chinese rendering from a major Chinese-language OSS or vendor source; if you cannot reliably determine such a rendering, preserve the source term and record `[Terminology: pending]` in `` with a tentative rendering for human review. For an English target, use the established English technical term; if the source term has no unambiguous established equivalent, preserve it with the shortest English gloss needed to make it intelligible and record `[Terminology: pending]` in ``. A tentative rendering may appear in `` but must not be silently adopted in `` or ``, and you must not invent or claim a specific external precedent. This rule applies to terminology only; for general prose, freely restructure and paraphrase for natural expression.\n\n# Terminology\n\n本表约定本仓库的中英术语统一译法。\n\n**通用规则:**\n- \"中文\"列为中文译文的正文默认用词。若该列为英文,则中文译文的正文中保留英文不翻译。\n- 首次出现按\"首次出现\"列书写(带括号注释);后续出现只写括号前的部分(可能为中文,也可能为英文),不出现括号内的注释。\n- \"不要译作\"列为严格禁止的译法。\n- 如果某术语已经作为另一个术语的组成部分被括注过(如 `agent loop(智能体循环)` 中已包含 `agent` 的括注),则该术语后续单独出现时无需再次括注。\n\n## 缩写类(中英文文本中均使用缩写)\n\n| English | 中文 | 首次出现 | 不要译作 | 备注 |\n|---|---|---|---|---|\n| ACP | ACP | ACP(Agent Client Protocol) | | |\n| AI | AI | AI(人工智能) | | |\n| API | API | | | |\n| CI | CI | | | |\n| CLI | CLI | CLI(命令行界面) | | |\n| e2e | e2e | | | |\n| HMR | HMR | HMR(热模块替换) | | |\n| JSON Schema | JSON Schema | | | |\n| JSONL | JSONL | | | |\n| LLM | LLM | LLM(大语言模型) | | |\n| MCP | MCP | | | |\n| PR | PR | PR(Pull Request) | | |\n| RAG | RAG | RAG(检索增强生成) | | |\n| SDK | SDK | | | 只指受支持的 Python 与 TypeScript SDK 所使用的 JSON-RPC 客户端/服务器协议;DeepSeek Harness 项目本身不是 SDK |\n| SSE | SSE | SSE(Server-Sent Events) | | |\n\n## 英文类(中英文文本中均使用英文)\n\n| English | 中文 | 首次出现 | 不要译作 | 备注 |\n|---|---|---|---|---|\n| agent | agent | agent(智能体) | | |\n| Agent Note | Agent Note | | 智能体注记、智能体笔记 | 仓库定义的文档类型,涵盖提案、已实现决策和被否决提案;中文对侧 H1 保持固定前缀 `# Agent Note: `,标题中不加术语括注 |\n| agent harness | agent harness | agent harness(智能体框架) | | agent 组合词(agent harness/workflow/loop/skill 等)整体保留英文;未括注过 agent 时首现按对应组合词或 agent 行处理 |\n| agent loop | agent loop | agent loop(智能体循环) | | |\n| blob hash | blob hash | | | `git hash-object` 的结果 |\n| coding agent | coding agent | coding agent(编程智能体) | | agent 组合词,正文保留英文 |\n| Cordis | Cordis | | | |\n| dispose | dispose | dispose(资源释放) | | |\n| doc-sync | doc-sync | doc-sync(文档同步门禁) | | |\n| fiber | fiber | | | |\n| fixture | fixture | fixture(测试前置数据) | | |\n| fork | fork | | | |\n| Function Calling | Function Calling | Function Calling(函数调用) | | |\n| harness | harness | | | |\n| harness engineering | harness engineering | | | |\n| KV Cache | KV Cache | | | 专有技术名称,保持大小写与空格 |\n| lint | lint | | | |\n| mock | mock | | | 保留英文;指测试替身 |\n| loader | loader | | | |\n| manifest | manifest | manifest(元数据清单) | | |\n| monorepo | monorepo | | | |\n| Round | Round | | 回合、目标回合、Ralph 回合 | 外层策略使用 Round 时,领域层级为 Session > Round > Turn(轮次) > Step(步骤);Round 是可选的外层策略迭代,并非每个会话轮次都具有的通用层级。Goal Round 与 Ralph Round 均保留英文。一个 Round 承载一个轮次,步骤隶属于该轮次;明确的零步骤轮次仍保持原义。 |\n| schema | schema | | | |\n| schema DSL | schema DSL | | | |\n| seam | seam | | 接缝 | 一个可替换能力的整体,包含 Service Definition / Service Provider / Consumer 三种角色;角色需要独立演化时才拆包,也可由同一包承担多个角色。以 `packages/shell` 为范例;Service Definition 是 Cordis `Service`(抽象类或具体 registry 服务),不是 TypeScript interface。任何单一角色、普通边界或扩展点都不能称为 seam。本仓库正文保留英文;与 `extension point` 是不同概念 |\n| Service Provider | Service Provider | | Service provider | 能力 seam 的命名角色;单数固定写作 Service Provider,复数写作 Service Providers。泛指提供服务的 provider 不适用本词条 |\n| skill | skill | skill(技能) | | |\n| slot | slot | | 坑位、孔位 | 客户端架构中的具名可注册位置,保留英文 |\n| spill | spill | | | 工具输出超限落盘机制;组合词写 `spill 文件`、`spill 路径` |\n| spawn | spawn | | | |\n| steering | steering | steering(中途引导) | | |\n| job id | job id | | 任务 id | 保留英文 |\n| subagent | subagent | | | |\n| transcript | transcript | transcript(文本记录) | | 指会话渲染给用户或编辑器的完整文本,区别于事件日志 |\n| Typert | Typert | | TypeRT、typeRT、Type RT | DeepSeek Harness 类型图、生成器、loader 与运行时 registry 的产品拼写 |\n| waterfall | waterfall | waterfall(瀑布式事件) | | |\n| wheel | wheel 包 | | | Python 打包格式 |\n| worktree | worktree | | | git 工作区概念 |\n| Zstandard | Zstandard | | | RFC 8878 compression format; `zstd` remains a code value. |\n\n## 双语类(中英文文本各自使用中英文)\n\n| English | 中文 | 首次出现 | 不要译作 | 备注 |\n|---|---|---|---|---|\n| adapter | 适配器 | | | |\n| adapter contract | 适配器约定 | 适配器约定(adapter contract) | | |\n| append-only | 仅追加 | | | |\n| artifact | 产物 | | 制品 | |\n| backend | 后端 | | | |\n| binder | 绑定器 | | | 命名角色:把已声明接口绑定到调用方 context 或生命周期 |\n| config | 配置 | | | 命名角色:一个已解析配置值或边界严格的配置记录 |\n| controller | 控制器 | | | 命名角色:接受意图并改变一项既有领域或展示状态 |\n| directory | 目录 | | | 命名角色:暴露供发现或选择的条目及元数据 |\n| engine | 引擎 | | | 命名角色:实现领域算法或有状态执行模型 |\n| gateway | 网关 | | | 命名角色:适配进程、网络、RPC 或 API 边界 |\n| handle | 句柄 | | | 命名角色:引用并控制或观察一个实时资源 |\n| policy | 策略 | | | 命名角色:决定允许、选择、限制或观察什么 |\n| presenter | 展示转换器 | | | 命名角色:把领域值纯转换为渲染意图 |\n| resolver | 解析器 | | | 命名角色:根据输入计算或定位一个答案 |\n| store | 存储 | | | 命名角色:拥有一组数据并主要提供数据操作 |\n| background job | 后台任务 | | | |\n| block | 块 | | | |\n| build target | 构建目标 | | | |\n| cancel | 取消 | | | |\n| canary test | canary 测试 | | 金丝雀测试 | 本仓库保留 `canary` |\n| capability | 能力 | | | 必须与 `feature` → `功能` 区分 |\n| capability seam | 能力 seam | | 功能 seam、能力接缝 | 本仓库 Service Definition、Service Provider 与 Consumer 三种角色组成完整可替换能力的命名架构概念;普通 `seam` 仍按其词条处理 |\n| feature | 功能 | | 能力 | SDK 产品与工程模型中的可管理产品单元 |\n| feature option | 功能选项 | | variant | 一项 SDK 功能内有限、可选择的实现或配置 |\n| checkpoint | 检查点 | | | |\n| chunk | 分片 | | | |\n| compaction | 压缩 | 压缩(compaction) | | |\n| companion tool | 配套工具 | | | |\n| composition bundle | 组合包 | | | 只约束应用或插件的组合语境,不约束所有 `bundle` |\n| Cordis plugin config | Cordis 插件配置 | | | Cordis 插件公开的 `Config` 对象或配置结构 |\n| config key | 配置键 | | | Cordis 插件配置中的单个字段 |\n| consumer | 消费方 | | 消费者 | |\n| content block | 内容块 | | | |\n| Cookbook | 实操手册 | | | 文档标题用语 |\n| context | 上下文 | | | |\n| counterpart | 对侧文件 | | 对应物、配对物 | 双语配对语境;泛指\"另一侧\"时可写「另一侧」 |\n| configurable-provider directory | 可配置提供方目录 | | | llm seam 中 `registerConfigurableProviders()` 维护的目录;沿用 Service Catalog →「服务目录」先例 |\n| context compaction | 上下文压缩 | 上下文压缩(context compaction) | | |\n| contract | 约定 | | | 如:`pairing contract` →`配对约定` |\n| Cordis config entry | Cordis 配置项 | | | 指 `cordis.yml` 插件列表中的一项;插件实现本身写`Cordis 插件` |\n| Cordis plugin | Cordis 插件 | | | Cordis 加载的插件实现,不指 `cordis.yml` 中的一项配置 |\n| crash recovery | 崩溃恢复 | | | |\n| deploy root | 部署根目录 | | | |\n| dormant | 休眠 | | 睡眠、蛰伏 | 指已声明可配置但当前未注册路由的提供方 |\n| durability | 持久性 | | | |\n| feature requirement | 功能依赖 | | | 功能或功能选项通过 `requires` 声明的关系 |\n| event | 事件 | | | |\n| event log | 事件日志 | | | |\n| event stream | 事件流 | | | |\n| event-sourced | 事件溯源 | | | 沿用 DDD 社区通行译法 |\n| Executive summary | 摘要 | | | 事故复盘标题用语 |\n| executor | 执行器 | | | |\n| expected output | 预期输出 | | 金标 | 指 snapshot 比较产物;翻译语料的人工校准样例不在此列 |\n| extension | 扩展 | | | |\n| extension point | 扩展点 | | | 注意与 `seam` 区分 |\n| fail-fast | 快速失败 | | | |\n| fenced code block | 围栏代码块 | | | 沿用 MDN 中文翻译 |\n| fingerprint | 指纹 | | | 通用内容指纹;双语配对机制使用 sidecar record 记录两侧 blob hash |\n| finish reason | 结束原因 | | | |\n| fold | 折叠区 | | | 配置界面语境:默认收起的字段分区(collapsed →「收起」)|\n| foreground run | 前台运行 | | | |\n| freshness | 新鲜度 | | | 沿用 MDN 中文翻译;在本项目中指译文相对源文的同步状态 |\n| hook | 钩子 | | | |\n| implementation | 实现 | | | |\n| inference | 推理 | 推理(inference) | | 需要和 `reasoning` 区分时保留英文括注 |\n| info string | 信息字符串 | | | 沿用 CommonMark 中文翻译;指代码围栏 ``` 之后的语言标注 |\n| injection | 注入 | | | |\n| integration | 集成 | | | |\n| interface | 接口 | | | |\n| language switcher | 语言切换行 | | | i18n 配对机制用语:双语配对文件顶部的互链行 |\n| merge | 合并 | | | |\n| message | 消息 | | | |\n| mod | 模组 | | | |\n| model provider | 模型提供方 | | | |\n| model selection | 模型选择 | | 模型目标 | 面向 Agent 的提供方、模型和可选推理强度选择。 |\n| module | 模块 | | | |\n| non-escalation | 非升权 | | 非升级、不可升级 | 仅用于安全与权限语境,指主体不得获得超出既有授权的权限;普通升级不适用此行 |\n| npm dependency | NPM 依赖 | | | `package.json` 中的包关系;`dependencies`、`devDependencies` 等字段保持原样 |\n| opt-out ratio | opt-out 比例 | | 退出检查比例 | |\n| orphan | 遗留 | | 孤儿、孤立 | 指英文源已不存在的 `.zh.md`(如「遗留译文」);进程语境按 OS 惯用语译「孤儿进程」 |\n| orphan branch | 孤立分支 | | 孤儿分支 | 沿用 git 官方中文翻译 |\n| package | 包 | | | 指 npm 包(`@deepseek-ai/dsh-*`);`package.json` 等代码标识保持原样 |\n| pairing | 配对 | | | |\n| parent-subset grants | 父级子集授权 | | 父集合授权 | 指授权范围仅限于父级所持授权的子集 |\n| peer dependency | 对等依赖 | 对等依赖(peer dependency) | | |\n| permission | 权限 | | | |\n| persistence | 持久化 | | | |\n| pipeline | 流水线 | | | |\n| plugin | 插件 | | | |\n| postmortem | 事故复盘 | 事故复盘(postmortem) | 事后分析、事故记录 | 事故记录与分析文档;目录或路径中的 `postmortem` 保持代码形式 |\n| prompt | 提示词 | | | |\n| provider | 提供方 | | | |\n| provider-neutral | 提供方无关 | | 提供方中立 | |\n| quality gate | 质量门禁 | | | |\n| quiescence | 完全停稳 | | 静默、静止状态 | 指生命周期工作全部结算后的状态 |\n| reasoning | 推理 | 推理(reasoning) | | 需要和 `inference` 区分时保留英文括注 |\n| reasoning_content | 思考内容 | | | |\n| registry | 注册表 | | | |\n| replay | 回放 | | | |\n| resume | 恢复 | | | |\n| runtime | 运行时 | | | |\n| same-world subprocess | 与宿主共享文件系统和内核的子进程 | | 同世界子进程 | |\n| sandbox | 沙箱 | | | |\n| service | 服务 | | | |\n| serving interface | 对外服务接口 | | | |\n| session | 会话 | | | |\n| session event | 会话事件 | | | |\n| setup card | 设置卡片 | | | 首次运行时代替行卡直接展开的配置卡 |\n| sidecar file | 伴随文件 | | | 指与文档同目录的普通伴随文件 |\n| sidecar record | 伴随记录 | | 旁挂记录 | 指与文档同目录的伴随记录文件 |\n| smoke test | 冒烟测试 | | | |\n| snapshot | 快照 | | | |\n| source of truth | 真源 | | 事实来源、唯一来源 | |\n| spine | 主干 | | | |\n| stale | 陈旧 | | 过期 | 与 `fresh`(`新鲜`)成对;门禁输出中保留英文 `stale` 不翻译;`expired` 才译为`过期` |\n| step | 步骤 | | | |\n| stream | 流 | | | |\n| structural signature | 结构签名 | | | i18n 配对机制用语:门禁比对两侧文件时提取的有序结构序列(标题层级、代码块、列表等) |\n| Summary | 概述 | | | 事故复盘标题用语 |\n| system prompt | 系统提示词 | | | |\n| taxonomy | 分类体系 | | | |\n| token usage | token 用量 | | | |\n| tool | 工具 | | | |\n| tool call | 工具调用 | | | |\n| tool result | 工具结果 | | | |\n| tool schema | 工具 schema | | | |\n| toolkit | 工具包 | | | |\n| turn | 轮次 | | | |\n| VFS | VFS | 虚拟文件系统(VFS) | | |\n| typecheck | 类型检查 | | | |\n| vocabulary | 词汇 | | | |\n| wire format | 协议格式 | 协议格式(wire format) | | |\n| workflow | 工作流 | | | |\n| wrapper | 包装层 | | | 软件层或 SDK 包装层 |\n| wrapper script | 包装脚本 | | | 可执行脚本包装层 |\n\n\n## Output Format\n\nReturn exactly three raw XML sections in the order shown below. Do not wrap the response in a Markdown code fence and do not add analysis or text before, between, or after the sections. The fence below only displays the required format; do not reproduce the fence.\n\nThe outer section tags are framing. If Markdown inside any section body contains a line consisting only of ``, ``, ``, ``, ``, or ``, prefix that line with `\\`. If the original line already has one or more backslashes immediately before the tag, add one more. The parser removes exactly one framing escape; tags mentioned inline need no escaping.\n\n```xml\n\n(First pass: the complete translation, written as natural target-language technical prose)\n\n\n\n(Second pass: actual corrections only, one correction per line with a category tag, e.g.)\n- [Tone] \"旁挂记录\" → \"伴随记录\"(生造词)\n- [Sentence] 第 3 段补充逗号断句\n- [Punctuation] 两处破折号替换为冒号\n- [Terminology: pending] source term → tentative rendering\n- 无修正\n\n\n\n(Complete final translation after corrections)\n\n```\n\n## Self-Review Instructions\n\nAfter writing ``, verify it in two directions. First re-read it in the target language only without comparing it with the source; this makes awkward phrasing easier to notice. Then compare it against the source clause by clause for completeness and exact meaning. Resolve doubts before writing ``; do not include reasoning transcripts, checks that passed, tentative suggestions, retractions, or no-op corrections.\n\n**Structure**\n- Are the heading hierarchy and order, list kind and item count, ordered-list start, table dimensions, and code block content identical to the source?\n- Are ALL comments and info strings inside code blocks left untranslated and byte-identical to the source?\n- Are inline code spans and machine-readable tokens verbatim?\n- Is an existing language switcher correctly flipped, and is no switcher or filename invented when the source lacks one?\n- Are link targets and emphasis spans preserved?\n- Does spacing across emphasis boundaries follow the same Chinese/Latin/numeral rule as ordinary prose?\n- Are wrapper-tag lines inside section bodies escaped with one additional backslash?\n\n**Faithfulness**\n- Clause by clause, is anything added, dropped, weakened, strengthened, reversed, merged, or re-bounded? Are list item counts identical on both sides?\n- Do actors, objects, conditions, exceptions, negation, modality, causal relationships, guarantees, contract directions, result channels, ownership changes, and quantities survive exactly?\n\n**Tone & Style**\n- Does every sentence read as if originally written by a native technical author?\n- Is there any colloquial, casual, overly informal, promotional, or metaphorical phrasing?\n- Are actors explicit where the target language needs them, without inventing responsibility?\n\n**Sentence Structure**\n- Are there run-on sentences that need breaking?\n- Are there stiff passive constructions that can safely become active, or active constructions that invent an actor?\n- Are conditions, concessions, negation, coordination, and modifiers scoped clearly?\n\n**Word Choice**\n- Are there overly literal translations that sound unnatural?\n- Are ordinary prose words left untranslated despite an established target-language expression?\n- Does each polysemous word fit its local context?\n- Is the same target-language word used for distinct source concepts, or is a defined term varied merely to avoid repetition?\n- Is any slang or internal jargon present?\n\n**Terminology**\n- For a Chinese target, are first-occurrence glosses correctly applied to the true first prose occurrence, neither missing nor repeated? For an English target, are Chinese glosses absent?\n- Are any \"不要译作\" forbidden translations present?\n- Do protected tokens remain untouched even when they resemble terminology entries?\n- For an unlisted term, does a Chinese target use an established Chinese rendering or preserve the source term as pending when no reliable rendering is known, and does an English target use the established English technical term or preserve only an ambiguous source term with the shortest necessary gloss and a pending notice?\n\n**Punctuation** (when target is Chinese)\n- Are punctuation, mixed-script spacing, quotation marks, Latin letters, and digits in their required forms?\n- Are there em dashes that make the sentence less clear and should be replaced, while natural em dashes remain intact?\n- Are list-item endings grammatically consistent, with none ending in commas?\n- Do RFC 2119 keywords preserve the source emphasis span and normative strength exactly?\n\nRecord actual corrections in ``, then output the corrected complete document in ``. If no correction or pending terminology notice is needed, write exactly `- 无修正` in `` and copy `` unchanged into ``. If `` contains only pending terminology notices, copy `` unchanged into ``.\n\n## Examples\n\nBelow are representative examples of common problems and their corrections. Follow the \"Good\" versions within the rule each example illustrates; examples do not override source context or higher-priority requirements.\n\n### Colloquial verb → Professional verb\n- Source: `The repo pins pnpm@11.7.0 in package.json`\n- Bad: `仓库在 package.json 中钉住 pnpm@11.7.0`\n- Good: `该仓库在 package.json 中固定使用 pnpm@11.7.0`\n\n### Run-on sentence → Natural phrasing with pause\n- Source: `Read docs/architecture.md before changing anything under packages/.`\n- Bad: `改动 packages/ 下的任何东西之前先读 docs/architecture.md。`\n- Good: `在修改 packages/ 目录下的任何内容之前,请先阅读 docs/architecture.md。`\n\n### Stiff passive voice → Active and natural\n- Source: `a green gate means the pair was confirmed consistent at these exact contents, not that the confirmation was sound.`\n- Bad: `门禁绿意味着这对文档曾在当前内容上被确认一致,不意味着这次确认本身是对的。`\n- Good: `门禁通过意味着这组文档在当前内容上的一致性得到了确认,不代表确认本身正确可靠。`\n\n### Invented word → Natural expression\n- Source: `A sidecar record of both blob hashes makes consistency checkable`\n- Bad: `旁挂记录两侧 blob hash,使一致性可检查`\n- Good: `伴随记录保存两侧 blob hash,使一致性可检查`\n\n### Em-dash → Colon/period\n- Source: `FIXME — an issue that should block a new release. A release should not ship with an open FIXME unless reviewers explicitly agree the change can be merged anyway.`\n- Bad: `FIXME——应当阻塞新版本发布的问题。除非评审者明确同意可以照常合入,发布不应带着未解决的 FIXME 出门。`\n- Good: `FIXME:应当阻塞新版本发布的问题。除非评审者明确同意该更改可以合并,否则发布版本不应包含未解决的 FIXME。`\n\n### Overly literal → Meaningful rendering\n- Source: `awkward phrasing is easier to notice when you read the translation without comparing it with the source`\n- Bad: `不把译文和原文比较时,尴尬的措辞更容易被注意`\n- Good: `不对照原文阅读译文时,更容易察觉别扭的表达`\n\n### Terminology — do not translate what should be kept in English\n- Source: `typed service seams, and explicit extension points`\n- Bad: `类型化的服务 seam(扩展点)与显式扩展点`\n- Good: `类型化的服务 seam 与显式扩展点`\n\n### Slang/jargon → Professional phrasing\n- Source: `The committed agent workflow lives in .agents/skills/dsh-translate-docs`\n- Bad: `进仓的 agent 工作流见 .agents/skills/dsh-translate-docs`\n- Good: `仓库内置的 agent 工作流见 .agents/skills/dsh-translate-docs`\n\n### \"For humans\" — translate the intent, not the word\n- Source: `For humans, start with the development guide`\n- Bad: `对于人工读者,请先从开发指南开始`(\"人工读者\"生硬)\n- Good: `面向开发者:请先阅读开发指南`(\"开发者\"自然,且中文里冒号在此处更自然)\n\n### Code block comments — NEVER translate\n- Source code block contains: `# full-screen TUI coding agent (needs DEEPSEEK_API_KEY)`\n- Bad: `# 全屏 TUI coding agent(需要 DEEPSEEK_API_KEY)`\n- Good: `# full-screen TUI coding agent (needs DEEPSEEK_API_KEY)` (keep exactly as-is, byte-for-byte)\n\n### Language switcher — flip direction\n- Source file (English) has: `English | [中文](README.zh.md)`\n- Bad (copying source unchanged): `English | [中文](README.zh.md)`\n- Good (flipped for Chinese file): `[English](README.md) | 中文`\n\n---\n\nNow translate the following document:" }, { "role": "user", From 5061ec2ef097cc33aab286d9416e14f096824680 Mon Sep 17 00:00:00 2001 From: creatixchu Date: Thu, 13 Aug 2026 13:47:09 +0800 Subject: [PATCH 020/103] =?UTF-8?q?feat(web):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=A6=96=E5=90=AF=E5=86=85=E6=B5=8B=E5=A3=B0=E6=98=8E=EF=BC=8C?= =?UTF-8?q?=E9=81=A5=E6=B5=8B=E4=BF=9D=E6=8C=81=E9=BB=98=E8=AE=A4=E5=85=B3?= =?UTF-8?q?=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...versioned-gui-welcome-onboarding.i18n.yaml | 4 +- ...-07-30-versioned-gui-welcome-onboarding.md | 12 +- ...-30-versioned-gui-welcome-onboarding.zh.md | 12 +- ...2026-08-10-telemetry-default-off.i18n.yaml | 4 +- .../2026-08-10-telemetry-default-off.md | 2 +- .../2026-08-10-telemetry-default-off.zh.md | 2 +- ...-13-remove-first-run-beta-notice.i18n.yaml | 6 + ...2026-08-13-remove-first-run-beta-notice.md | 25 +++ ...6-08-13-remove-first-run-beta-notice.zh.md | 25 +++ apps/web/tests/README.i18n.yaml | 4 +- apps/web/tests/README.md | 5 +- apps/web/tests/README.zh.md | 4 +- apps/web/tests/goal-bar.e2e.ts | 2 +- apps/web/tests/goal-bar.overlay.yml | 6 +- .../tests/onboarding-deepseek-config.e2e.ts | 50 +---- apps/web/tests/remote-welcome.e2e.ts | 53 ----- apps/web/tests/scaffold.ts | 21 -- .../welcome.expected.md | 9 - .../ui-settings-general/README.i18n.yaml | 4 +- packages/client/ui-settings-general/README.md | 4 +- .../client/ui-settings-general/README.zh.md | 4 +- .../src/client/WelcomeNotice.module.css | 155 --------------- .../src/client/WelcomeNotice.tsx | 91 --------- .../ui-settings-general/src/client/index.ts | 42 +--- .../ui-settings-general/src/client/locales.ts | 17 +- .../src/client/welcome-store.ts | 128 ------------ .../client/ui-settings-general/src/index.ts | 14 +- .../ui-settings-general/src/invariant.ts | 2 +- .../src/onboarding-copy.ts | 35 ---- .../tests/apply.client.spec.ts | 55 +----- .../tests/host.client.spec.ts | 8 +- .../tests/shell.client.spec.ts | 4 +- .../tests/welcome-notice.client.spec.tsx | 106 ---------- .../tests/welcome-store.client.spec.ts | 184 ------------------ .../src/client/slot-catalog.ts | 1 - 35 files changed, 122 insertions(+), 978 deletions(-) create mode 100644 .agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml create mode 100644 .agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md create mode 100644 .agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md delete mode 100644 apps/web/tests/remote-welcome.e2e.ts delete mode 100644 apps/web/tests/snapshots/onboarding-deepseek-config/welcome.expected.md delete mode 100644 packages/client/ui-settings-general/src/client/WelcomeNotice.module.css delete mode 100644 packages/client/ui-settings-general/src/client/WelcomeNotice.tsx delete mode 100644 packages/client/ui-settings-general/src/client/welcome-store.ts delete mode 100644 packages/client/ui-settings-general/src/onboarding-copy.ts delete mode 100644 packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx delete mode 100644 packages/client/ui-settings-general/tests/welcome-store.client.spec.ts diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml index abe1f687fb..66b59c3509 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md -2026-07-30-versioned-gui-welcome-onboarding.md: 8897e28413df77d127a4d846f2a3e42789454490 -2026-07-30-versioned-gui-welcome-onboarding.zh.md: 9f5eb99033cd62154937808f26b0e1aa40966c9f +2026-07-30-versioned-gui-welcome-onboarding.md: 7a8c5c5b9ba1ec62ad8dd0f5bdf67c516ba0ddec +2026-07-30-versioned-gui-welcome-onboarding.zh.md: 646080b893bb6264a3a92f49400cb9207e29755b diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md index 8897e28413..7a8c5c5b9b 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md @@ -10,15 +10,13 @@ The GUI's credential onboarding begins with a DeepSeek-specific readiness check, ## Decision -**The Settings shell coordinates ordered steps.** `settings.onboarding` remains a root-scoped list, but `ui-settings` projects its entry ids and order into one coordinator and mounts only the first incomplete step. The active registrant receives `complete()` and `openSection(id)`; no later step mounts until ownership transfers. The product welcome registers at order `-100`, while `ui-settings-models` retains only the conditional DeepSeek readiness and credential-routing step at order `0`. +**The Settings shell coordinates ordered steps.** `settings.onboarding` remains a root-scoped list, but `ui-settings` projects its entry ids and order into one coordinator and mounts only the first incomplete step. The active registrant receives `complete()` and `openSection(id)`; no later step mounts until ownership transfers. `ui-settings-models` registers the conditional DeepSeek readiness and credential-routing step at order `0`, the only shipped occupant since the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md). -**Ownerless product onboarding belongs to `ui-settings-general`.** `src/onboarding-copy.ts` is the single editable source for the complete notice, the Continue label, and `WELCOME_NOTICE_VERSION`; both supported GUI locales intentionally render the same Chinese owner copy. Runtime locale dictionaries derive their welcome values from that file, and tests import the same owner instead of repeating paragraph text. The notice is browser UI only: it creates no Session event and contributes no model-visible content. The notice states that session telemetry is [disabled by default](2026-08-10-telemetry-default-off.md) and names the `FEEDBACK_ONLY` and `FULL` opt-in modes. +**The product welcome step is removed.** The versioned notice, its copy owner, and its acknowledgement store shipped from this decision until the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md), which owns the removal rationale; `ui-settings-general` seats no onboarding step. -**Loopback acknowledgement is durable per Harness profile.** The Host half registers a `ui-onboarding` section in the user-settings seam, stored under the active `$DSH_HOME/settings.yaml`. The connection plugin publishes whether the current page uses a loopback authority as `ctx.connection.isLoopback`; hostname classification remains internal to the connection package, and other client plugins consume the service state instead of importing its implementation. A loopback browser shows the notice unless `welcomeNoticeVersion` equals the owner constant exactly. Continue applies one path mutation with the current version and calls `complete()` only after the Host commits it; a failed write leaves the notice open, and closing the page or process writes nothing. Bumping the constant intentionally makes every profile acknowledge the revised copy once. A non-loopback browser must not call the loopback-only settings API. It presents the same notice, but explicit Continue completes the step only in the current browser process; reload or a new process presents it again. +**The durable `ui-onboarding` section outlives the notice.** The Host half registers it in the user-settings seam under the active `$DSH_HOME/settings.yaml`; its `welcomeNoticeVersion` field keeps stored acknowledgements valid and has no reader. The connection plugin publishes whether the current page uses a loopback authority as `ctx.connection.isLoopback`; hostname classification remains internal to the connection package, and other client plugins consume the service state instead of importing its implementation. The API proxy exposes this one product namespace through a closed allowlist beside configurable-provider namespaces, without treating its changes as model-catalog invalidations. -**Concurrent loopback views converge without stale replacement.** The acknowledgement write omits `expectedRevision` deliberately: every loopback tab writes the same version to one path, so the operation is idempotent and preserves sibling fields instead of rebuilding the section. `settings/document-updated` reaches the client as an invalidation — through `host/settings-changed` then, and forwarded verbatim now ([forwarded Remote events](../architecture/2026-08-10-remote-event-delivery.md)); an already mounted loopback tab refetches and advances when another tab or an external editor commits the current version. The API proxy exposes this one product namespace through a closed allowlist beside configurable-provider namespaces, without treating its changes as model-catalog invalidations. - -**Onboarding temporarily owns the viewport as one continuous stage.** A solid product surface replaces the complete application view through a body-level portal and marks the underlying app root inert; the exact required mask remains mounted behind that surface with `position:absolute`, zero left/right/bottom offsets, `top:80px`, `rgba(0, 0, 0, 0.24)`, and `backdrop-filter: blur(2px)`. Welcome and conditional credential setup render as successive pages in this stage instead of independent modals. Both pages reuse the Web UI's black `BrandWordmark`. The welcome page preserves the four authored paragraphs verbatim under the `内测声明` title; every paragraph uses one 16/28 body scale, and only the requested action clause inside the final paragraph receives a subtle 500 weight. A short staggered opacity/vertical entrance supplies pacing without blocking interaction and disappears under reduced motion. The title receives initial focus, Continue is the sole button, and no close, Escape, or mask-click path exists. +**Onboarding temporarily owns the viewport as one continuous stage.** A solid product surface replaces the complete application view through a body-level portal and marks the underlying app root inert; the exact required mask remains mounted behind that surface with `position:absolute`, zero left/right/bottom offsets, `top:80px`, `rgba(0, 0, 0, 0.24)`, and `backdrop-filter: blur(2px)`. Onboarding steps render as successive pages in this stage instead of independent modals, reusing the Web UI's black `BrandWordmark`; the conditional credential setup is the only shipped page. ## Alternatives considered @@ -32,4 +30,4 @@ The GUI's credential onboarding begins with a DeepSeek-specific readiness check, ## Consequences -A fresh profile always sees the welcome notice before provider-specific onboarding; an already configured credential skips only the later DeepSeek step. On loopback, reloading after Continue stays past the acknowledged version, changing the owner version presents it again, and closing before Continue leaves the next launch unchanged. On non-loopback, Continue advances the live process without a privileged settings request and reload presents the notice again. Focused store and React tests pin both persistence modes, exact-version comparison, write failure, sole-action behavior, no-dismiss paths, coordinator ordering, conditional DeepSeek transfer, and HMR cleanup. The real Chromium scenario boots the shipped Web composition with an isolated harness home, verifies the exact mask geometry and computed styles, reloads before and after acknowledgement, continues into missing-credential setup, confirms an acknowledged-version mismatch returns while the credential is configured, and checks the browser console. +A fresh profile proceeds directly to provider-specific onboarding: the conditional DeepSeek step mounts when its credential is missing, and an already configured credential shows no onboarding page at all. Focused store and React tests pin coordinator ordering, conditional DeepSeek transfer, and HMR cleanup. The real Chromium scenario boots the shipped Web composition with an isolated harness home, verifies the exact mask geometry and computed styles while the credential step owns the viewport, continues into missing-credential setup, and checks the browser console. diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md index 9f5eb99033..646080b893 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md @@ -10,15 +10,13 @@ GUI 的凭据引导从 DeepSeek 专用的就绪状态检查开始,但内部测 ## 决策 -**设置外壳协调有序步骤。** `settings.onboarding` 仍是根作用域 list,但 `ui-settings` 会把其中各条目的 id 和顺序投影到一个协调器中,并且只挂载第一个未完成的步骤。当前注册方会收到 `complete()` 和 `openSection(id)`;所有权转移前,不会挂载后续步骤。产品欢迎步骤的顺序为 `-100`,`ui-settings-models` 则只保留顺序为 `0` 的 DeepSeek 条件式就绪状态与凭据跳转步骤。 +**设置外壳协调有序步骤。** `settings.onboarding` 仍是根作用域 list,但 `ui-settings` 会把其中各条目的 id 和顺序投影到一个协调器中,并且只挂载第一个未完成的步骤。当前注册方会收到 `complete()` 和 `openSection(id)`;所有权转移前,不会挂载后续步骤。`ui-settings-models` 注册顺序为 `0` 的 DeepSeek 条件式就绪状态与凭据跳转步骤,自[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)起,它是当前唯一的注册方。 -**不属于单一功能的产品引导由 `ui-settings-general` 持有。** `src/onboarding-copy.ts` 是完整通知、「继续」按钮文案和 `WELCOME_NOTICE_VERSION` 的唯一可编辑来源;GUI 支持的两种 locale 都有意渲染同一份中文所有者文案。运行时 locale 字典从该文件派生欢迎文案,测试也导入同一个所有者,而不重复段落文本。该通知只存在于浏览器 UI:它不会创建会话事件,也不会贡献任何模型可见内容。通知说明会话遥测[默认禁用](2026-08-10-telemetry-default-off.md),并列出 `FEEDBACK_ONLY` 和 `FULL` 两种显式启用模式。 +**产品欢迎步骤已移除。** 版本化通知、其文案所有者文件和确认 store 自本决策起随产品发布,直至[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md);移除理由由该 note 持有。`ui-settings-general` 不再注册任何引导步骤。 -**loopback 确认状态按 Harness profile 持久化。** 宿主端在 user-settings seam 中注册 `ui-onboarding` 分节,并存入当前 `$DSH_HOME/settings.yaml`。connection 插件通过 `ctx.connection.isLoopback` 统一发布当前页面是否使用 loopback authority;hostname 判定留在 connection 包内,其他客户端插件只消费服务状态,而不导入其实现。除非 `welcomeNoticeVersion` 与文案所有者文件中的常量精确相等,否则 loopback 浏览器会显示通知。「继续」会以当前版本执行一次路径变更,并且仅在宿主端提交成功后调用 `complete()`;写入失败时通知保持打开,关闭页面或进程则不会写入任何内容。更新该常量会有意要求每个 profile 对修订后的文案重新确认一次。非 loopback 浏览器不能调用仅限 loopback 的 settings API;它仍显示同一通知,但显式点击「继续」只会在当前浏览器进程中完成该步骤,重新加载或新进程会再次显示通知。 +**持久化的 `ui-onboarding` 分节在通知移除后继续存在。** 宿主端在 user-settings seam 中注册它,存入当前 `$DSH_HOME/settings.yaml`;其中的 `welcomeNoticeVersion` 字段让已存储的确认记录保持有效,没有读取方。connection 插件通过 `ctx.connection.isLoopback` 统一发布当前页面是否使用 loopback authority;hostname 判定留在 connection 包内,其他客户端插件只消费服务状态,而不导入其实现。API Proxy 在可配置提供方 namespace 之外,通过封闭的允许列表暴露这一个产品 namespace,同时不会把它的变更视为模型目录失效事件。 -**并发 loopback 视图无需陈旧的整体替换即可收敛。** 确认写入有意省略 `expectedRevision`:每个 loopback 标签页都向同一路径写入相同版本,因此该操作是幂等的,并会保留同级字段,而不是重建整个分节。`settings/document-updated` 以失效通知形式到达客户端——当时经 `host/settings-changed`,现在则是原样转发([转发的 Remote 事件](../architecture/2026-08-10-remote-event-delivery.md));另一个标签页或外部编辑器提交当前版本后,已挂载的 loopback 标签页会重新拉取状态并推进。API Proxy(`@deepseek-ai/dsh-host-apiproxy`)在可配置提供方 namespace 之外,通过封闭的允许列表暴露这一个产品 namespace,同时不会把它的变更视为模型目录失效事件。 - -**引导流程会暂时接管视口,形成一个连续阶段。** 纯色产品界面通过挂载到 `body` 的 portal 取代完整的应用视图,并将底层应用根节点标记为 inert;严格符合要求的遮罩仍挂载在该界面后方,并保留 `position:absolute`、left/right/bottom 偏移量为零、`top:80px`、`rgba(0, 0, 0, 0.24)` 和 `backdrop-filter: blur(2px)`。欢迎页和按条件显示的凭据设置页在这一阶段中依次呈现,而不是各自作为独立的模态窗口。两个页面都复用 Web UI 的黑色 `BrandWordmark`。欢迎页在 `内测声明` 标题下逐字保留既定的四段文案;所有段落统一采用 16/28 的正文字号与行高,只有最后一段中指定的行动语句使用较为克制的 500 字重。短暂的错落式透明度与纵向位移动画营造出节奏感,但不会阻碍交互,并会在用户启用减少动态效果时禁用。初始焦点落在标题上,「继续」是唯一按钮,且不存在关闭、Escape 或点击遮罩的退出路径。 +**引导流程会暂时接管视口,形成一个连续阶段。** 纯色产品界面通过挂载到 `body` 的 portal 取代完整的应用视图,并将底层应用根节点标记为 inert;严格符合要求的遮罩仍挂载在该界面后方,并保留 `position:absolute`、left/right/bottom 偏移量为零、`top:80px`、`rgba(0, 0, 0, 0.24)` 和 `backdrop-filter: blur(2px)`。引导步骤在这一阶段中依次呈现,而不是各自作为独立的模态窗口,并复用 Web UI 的黑色 `BrandWordmark`;按条件显示的凭据设置页是当前唯一的页面。 ## 曾考虑的替代方案 @@ -32,4 +30,4 @@ GUI 的凭据引导从 DeepSeek 专用的就绪状态检查开始,但内部测 ## 后果 -全新 profile 始终会在提供方专用引导之前看到欢迎通知;凭据已经配置时,只会跳过后续 DeepSeek 步骤。在 loopback 上,点击「继续」后重新加载不会再次显示已确认版本,更改文案所有者文件中的版本值会让通知重新出现,而确认前关闭窗口不会改变下次启动。在非 loopback 上,「继续」会在不发起受保护 settings 请求的情况下推进当前进程,重新加载则再次显示通知。针对性的 store 与 React 测试固化了两种持久化模式、精确版本比较、写入失败、单一操作、不可关闭路径、协调器顺序、按条件移交 DeepSeek 步骤和 HMR(热模块替换)清理行为。真实 Chromium 场景会使用隔离的 harness 家目录启动随产品提供的 Web 组合,验证遮罩的精确几何尺寸和计算样式,在确认前后分别重新加载,继续进入凭据缺失设置流程,确认凭据已配置时确认版本不匹配仍会使通知重新出现,并检查浏览器控制台。 +全新 profile 直接进入提供方专用引导:DeepSeek 步骤仅在其凭据缺失时挂载,凭据已配置时不会出现任何引导页面。针对性的 store 与 React 测试固化了协调器顺序、按条件移交 DeepSeek 步骤和 HMR(热模块替换)清理行为。真实 Chromium 场景会使用隔离的 harness 家目录启动随产品提供的 Web 组合,在凭据步骤占据视口时验证遮罩的精确几何尺寸和计算样式,继续进入凭据缺失设置流程,并检查浏览器控制台。 diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml index be70f91180..7a3b82d3a6 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md -2026-08-10-telemetry-default-off.md: a4f0099565bb240cf62774fab2d5ad5f7de90e95 -2026-08-10-telemetry-default-off.zh.md: 8e2544eb7dee8b9bd6b8a4c81a28a8a03d3404d4 +2026-08-10-telemetry-default-off.md: 1979597eb81ecc7413996b7eb4fbe0e270abc629 +2026-08-10-telemetry-default-off.zh.md: 25d675c69568a30ad754b301139b30ef0e8ffe3d diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md index a4f0099565..1979597eb8 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md @@ -14,7 +14,7 @@ Both feeds use `DSH_TELEMETRY_MODE` as their positive consent setting. Unset and The dsh-sdk launcher reads the same variable without parsing `cordis.yml` or booting Cordis. `FULL` permits reporting; `FEEDBACK_ONLY`, `DISABLED`, unset, and empty values deny it. Consent is frozen from the launching environment before the command runs, because `dsh-sdk start` loads a project `.env` and project code can mutate `process.env`: resolving afterwards would let a project grant reporting of its own configuration, which the [configuration source ownership decision](../architecture/2026-08-04-configuration-source-ownership.md) denies for the whole `DSH_*` namespace. An unsupported mode denies rather than throwing at that boundary, since telemetry may never change a command's result. This rule superseded the default-on launcher consent before the launcher and its proposal were deleted by the [SDK project toolchain removal](../simplification/2026-08-11-remove-sdk-project-toolchain.md). -The versioned Web welcome notice states that Session Log upload is off by default, names `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` and `DSH_TELEMETRY_MODE=FULL` as the two opt-in choices, and discloses that `FULL` also enables dsh-sdk command telemetry. Its version changes with that material privacy statement so every profile acknowledges the current copy. +The repository README states that Session Log upload is off by default, names `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` and `DSH_TELEMETRY_MODE=FULL` as the two opt-in choices, and discloses that `FULL` also enables dsh-sdk command telemetry. The product itself presents no prompt about enabling telemetry since the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md). ## Alternatives considered diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md index 8e2544eb7d..25d675c695 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md @@ -14,7 +14,7 @@ DeepSeek Harness 有两路出站遥测数据流。在内测阶段,共享基础 dsh-sdk 启动器读取同一变量,不解析 `cordis.yml`,也不启动 Cordis。`FULL` 允许上报;`FEEDBACK_ONLY`、`DISABLED`、未设置和空值都会拒绝。授权在命令执行前从启动环境冻结:`dsh-sdk start` 会加载项目 `.env`,项目代码也能修改 `process.env`,若在执行后解析,项目便能自行授权上报其自身配置,而[配置来源所有权决策](../architecture/2026-08-04-configuration-source-ownership.md)对整个 `DSH_*` 命名空间禁止这种行为。在该边界上,不受支持的模式按拒绝处理而非抛出,因为遥测不得改变命令结果。此规则在启动器及其提案被[SDK 项目工具链移除决策](../simplification/2026-08-11-remove-sdk-project-toolchain.md)删除之前,仅取代了启动器默认允许上报的规则。 -带版本的 Web 欢迎通知说明会话日志上传默认关闭,将 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 和 `DSH_TELEMETRY_MODE=FULL` 列为两种显式启用选项,并披露 `FULL` 同时会启用 dsh-sdk 命令遥测。其版本随这项重要的隐私声明一同变更,使每个 profile 都确认当前文案。 +仓库 README 说明会话日志上传默认关闭,将 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 和 `DSH_TELEMETRY_MODE=FULL` 列为两种显式启用选项,并披露 `FULL` 同时会启用 dsh-sdk 命令遥测。自[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)起,产品本身不提供任何关于开启遥测的提示。 ## 考虑过的替代方案 diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml new file mode 100644 index 0000000000..a040b192f2 --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md +2026-08-13-remove-first-run-beta-notice.md: e0876e5e96e04fed5e47adc0f83b1c7bfa4f2519 +2026-08-13-remove-first-run-beta-notice.zh.md: 8598fc28dda1ff5404e3c06fc8e2aaadca4cd471 diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md new file mode 100644 index 0000000000..e0876e5e96 --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md @@ -0,0 +1,25 @@ +# Agent Note: Remove the first-run beta notice + +Status: implemented + +English | [中文](2026-08-13-remove-first-run-beta-notice.zh.md) + +## Problem + +Every GUI first launch opened with a full-viewport internal-test statement (内测声明): internal-beta framing plus instructions for enabling Session Log upload through `DSH_TELEMETRY_MODE`. Session telemetry already resolves to `DISABLED` when its mode is unset ([telemetry default-off](../feature/2026-08-10-telemetry-default-off.md)), so the only onboarding content about telemetry was a prompt explaining how to turn it on, and the internal-test framing itself must not ship in a release build. + +## Decision + +The first-run notice is removed from the assembled product rather than reworded. `ui-settings-general` seats no `settings.onboarding` step; the notice component, its durable acknowledgement store, its copy owner, and its locale keys are deleted. The `settings.onboarding` coordinator and its takeover stage stay ([ordered onboarding](../feature/2026-07-30-versioned-gui-welcome-onboarding.md)), and the conditional DeepSeek credential step is the only shipped occupant. The Host half still registers the `ui-onboarding` settings namespace: its `welcomeNoticeVersion` field keeps acknowledgements already stored in `$DSH_HOME/settings.yaml` valid, and nothing reads or writes it. Telemetry opt-in remains an explicit deployment environment choice documented in the repository README; the product presents no prompt about enabling it. + +## Alternatives considered + +**Keep the notice and only drop its telemetry paragraph.** Rejected: the internal-test framing is what a release must not present, and a mandatory first-run interstitial with no material statement left is pure friction. + +**Ask for upload consent instead (a versioned consent step).** Rejected for this release: a first-run question about enabling upload is still a telemetry prompt. A future consent flow can register through the unchanged `settings.onboarding` seam and use a fresh versioned field for re-acknowledgement. + +**Deregister the `ui-onboarding` namespace as well.** Rejected: existing settings documents already carry the section, and the settings seam validates stored documents against registered namespaces; keeping the registration keeps those documents valid at no cost. + +## Consequences + +A fresh profile boots into the credential step when the DeepSeek credential is missing and directly into the product otherwise; no full-viewport notice precedes either. The assembled onboarding scenario starts at the credential step, the remote-notice scenario is deleted with the feature, and the goal-bar fixture keeps the settings shell disabled because the fixture API client rejects settings traffic. Restoring a first-run notice requires a new onboarding registration and a new versioned field; the retained namespace does not resurrect the old acknowledgement semantics. diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md new file mode 100644 index 0000000000..8598fc28dd --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md @@ -0,0 +1,25 @@ +# Agent Note: 移除首次启动内测声明 + +Status: implemented + +[English](2026-08-13-remove-first-run-beta-notice.md) | 中文 + +## 问题 + +GUI 每次首启都会先显示占满视口的内测声明:内部测试的定位表述,加上通过 `DSH_TELEMETRY_MODE` 开启 Session Log 上传的说明。会话遥测在 mode 未设置时已解析为 `DISABLED`([遥测默认关闭](../feature/2026-08-10-telemetry-default-off.md)),因此引导流程中关于遥测的全部内容就是一段教用户如何开启的提示,而内部测试的定位表述本身也不应出现在发布版本里。 + +## 决策 + +首启声明从组装后的产品中整体移除,而不是改写。`ui-settings-general` 不再注册任何 `settings.onboarding` 步骤;声明组件、其持久化确认 store、文案所有者文件和 locale 键全部删除。`settings.onboarding` 协调器及其接管式展示阶段保留([有序引导](../feature/2026-07-30-versioned-gui-welcome-onboarding.md)),按条件显示的 DeepSeek 凭据步骤是当前唯一的注册方。宿主端仍注册 `ui-onboarding` 设置 namespace:其中的 `welcomeNoticeVersion` 字段让 `$DSH_HOME/settings.yaml` 中已写入的确认记录保持有效,没有任何代码读取或写入它。遥测的开启仍是显式的部署环境变量选择,记录在仓库 README 中;产品界面不出现任何关于开启遥测的提示。 + +## 曾考虑的替代方案 + +**保留声明,只删除其中的遥测段落。** 不予采用:发布版本不应呈现的正是内部测试的定位表述本身,而一个没有实质内容的强制首启插页只剩下打扰。 + +**改为询问上传同意(版本化的同意步骤)。** 本次发布不予采用:首启询问是否开启上传仍然是一个遥测提示。未来的同意流程可以通过保持不变的 `settings.onboarding` seam 注册,并使用新的版本化字段做重新确认。 + +**连 `ui-onboarding` namespace 一起注销。** 不予采用:既有设置文档已经包含该分节,而设置 seam 会用已注册的 namespace 校验存储文档;保留注册就能让这些文档继续有效,且没有额外成本。 + +## 后果 + +全新 profile 在缺少 DeepSeek 凭据时直接进入凭据步骤,凭据已配置时直接进入产品,两种情况都没有占满视口的声明。组装级引导场景从凭据步骤开始,远程声明场景随功能一并删除,goal-bar fixture 继续禁用设置外壳,因为 fixture API 客户端会拒绝设置请求。将来若要恢复首启声明,需要新的引导注册和新的版本化字段;保留的 namespace 不会复活旧的确认语义。 diff --git a/apps/web/tests/README.i18n.yaml b/apps/web/tests/README.i18n.yaml index a6005ade32..fd0b89b541 100644 --- a/apps/web/tests/README.i18n.yaml +++ b/apps/web/tests/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/web/tests/README.md -README.md: 68e5db5af5f816cc982bacb7989d996c859be204 -README.zh.md: f366c28024dab89d0243a60d93a706f220fa8fb8 +README.md: 4d7236ef69189845dbc2847289d497fc54c94ae9 +README.zh.md: 21c2f2ce7ccc8fe5314d766c06235453aa292031 diff --git a/apps/web/tests/README.md b/apps/web/tests/README.md index 68e5db5af5..4d7236ef69 100644 --- a/apps/web/tests/README.md +++ b/apps/web/tests/README.md @@ -29,9 +29,8 @@ artifact it produces itself. When a scenario needs a Client-owned constant or pure function, mirror it here instead, next to the commented-out import that names the source module. A drift -then surfaces as a missed selector or an unsuppressed notice — a loud failure, -never a silent pass. `scaffold.ts` holds the mirrored welcome-notice values and -exports them for the scenarios that assert on them. +then surfaces as a missed selector or a stale mirrored value — a loud failure, +never a silent pass. Two kinds of Client import stand. `assembled-boot.ts` drives the shell itself, so it imports `AppWebEntry` from `@deepseek-ai/dsh-client-web` and the boot-manifest diff --git a/apps/web/tests/README.zh.md b/apps/web/tests/README.zh.md index f366c28024..21c2f2ce7c 100644 --- a/apps/web/tests/README.zh.md +++ b/apps/web/tests/README.zh.md @@ -23,8 +23,8 @@ Client face,而该 face 必须等 Host tsdown 生成 `@deepseek-ai/dsh-goal/re 于是 Host 构建阶段变成在等一个由它自己产出的产物。 当某个场景需要 Client 持有的常量或纯函数时,改为在此处镜像一份,并紧挨着一条注释掉的 -import 点明源模块。这样漂移会表现为选择器未命中或提示未被抑制——是响亮的失败,绝不会是静默 -通过。`scaffold.ts` 持有镜像的 welcome-notice 取值,并导出给断言它们的场景使用。 +import 点明源模块。这样漂移会表现为选择器未命中或镜像值过期——是响亮的失败,绝不会是静默 +通过。 有两类 Client import 是长期成立的。`assembled-boot.ts` 驱动 shell 本身,因此它从 `@deepseek-ai/dsh-client-web` import `AppWebEntry`、从 diff --git a/apps/web/tests/goal-bar.e2e.ts b/apps/web/tests/goal-bar.e2e.ts index 00260a79ee..f4a0d8d34b 100644 --- a/apps/web/tests/goal-bar.e2e.ts +++ b/apps/web/tests/goal-bar.e2e.ts @@ -26,7 +26,7 @@ describe('web e2e: goal bar clear convergence', () => { let tripwire: ReturnType beforeAll(async () => { - scaffold = await launchWebScaffold({ extraOverlayPath: OVERLAY, welcomeNoticePending: true }) + scaffold = await launchWebScaffold({ extraOverlayPath: OVERLAY }) browser = await chromium.launch() page = await newEnglishPage(browser) tripwire = watchConsole(page) diff --git a/apps/web/tests/goal-bar.overlay.yml b/apps/web/tests/goal-bar.overlay.yml index 2594d6a3e9..4e9e382bb8 100644 --- a/apps/web/tests/goal-bar.overlay.yml +++ b/apps/web/tests/goal-bar.overlay.yml @@ -1,5 +1,5 @@ -# The client-side FixtureApiClient intentionally rejects settings writes, so -# this goal-only scenario omits the durable welcome step that would otherwise -# cover the page. Onboarding owns separate assembled-browser coverage. +# The client-side FixtureApiClient intentionally rejects settings traffic, so +# this goal-only scenario omits the settings shell and the onboarding steps it +# would mount. Onboarding owns separate assembled-browser coverage. - id: ui-settings-general disabled: true diff --git a/apps/web/tests/onboarding-deepseek-config.e2e.ts b/apps/web/tests/onboarding-deepseek-config.e2e.ts index 5572e834ad..08cfeda4d3 100644 --- a/apps/web/tests/onboarding-deepseek-config.e2e.ts +++ b/apps/web/tests/onboarding-deepseek-config.e2e.ts @@ -10,15 +10,11 @@ import { chromium } from 'playwright' import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest' import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, - WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_ACK_FIELD, - WELCOME_NOTICE_VERSION, WELCOME_NOTICE_COPY, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' import { ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' -import { settingsNamespace } from '@deepseek-ai/dsh-settings' const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/onboarding-deepseek-config', import.meta.url)) -const WELCOME_EXPECTED = join(SNAPSHOT_DIR, 'welcome.expected.md') const MISSING_EXPECTED = join(SNAPSHOT_DIR, 'missing.expected.md') const MODELS_EXPECTED = join(SNAPSHOT_DIR, 'models.expected.md') const MODE = webSnapshotMode() @@ -31,7 +27,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup const browserConsole: string[] = [] beforeAll(async () => { - scaffold = await launchWebScaffold({ deepSeekMissingCredential: true, welcomeNoticePending: true }) + scaffold = await launchWebScaffold({ deepSeekMissingCredential: true }) browser = await chromium.launch() // The scenario asserts the shipped Chinese copy, so the browser asks for it. page = await browser.newPage({ viewport: { width: 1440, height: 960 }, locale: ZH_BROWSER_LOCALE }) @@ -48,13 +44,9 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('stores a key write-only and observes configured state without restarting', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-deepseek-config')) - const welcome = page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }) - await welcome.waitFor({ timeout: 15_000 }) + const credentialStep = page.getByRole('region', { name: '添加一个 API Key 开始使用' }) + await credentialStep.waitFor({ timeout: 15_000 }) expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true) - const welcomeAria = await captureStableAria(page, '[role="region"]', scaffold.workspaceCwd) - await compareOrRefreshGolden(WELCOME_EXPECTED, welcomeAria, MODE) - expect(await welcome.getByRole('button').allTextContents()).toEqual([WELCOME_NOTICE_COPY.zh.continueLabel]) - expect(await welcome.locator('button').count()).toBe(1) const mask = page.locator('[class*="onboardingMask"]') expect(await mask.count()).toBe(1) @@ -83,17 +75,6 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup rect: { left: 0, top: 80, right: 1440, bottom: 960 }, }) - // Closing the process/page before acknowledgement writes nothing, so the - // same durable profile presents the notice again after reload. - const firstReloadWarnings = tripwire.warnings.length - await page.reload({ waitUntil: 'load' }) - acknowledgeReloadConnectionLoss(tripwire, firstReloadWarnings) - await welcome.waitFor({ timeout: 15_000 }) - - await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() - await welcome.waitFor({ state: 'detached', timeout: 15_000 }) - const credentialStep = page.getByRole('region', { name: '添加一个 API Key 开始使用' }) - await credentialStep.waitFor({ timeout: 15_000 }) expect(await credentialStep.getByRole('textbox').count()).toBe(0) const initial = await captureStableAria(page, '[role="region"]', scaffold.workspaceCwd) await compareOrRefreshGolden(MISSING_EXPECTED, initial, MODE) @@ -129,27 +110,10 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup { timeout: 10_000 }, ).toBe('已配置——输入新值可替换') - const acknowledgedSettings = await readFile(join(scaffold.harnessHome, 'settings.yaml'), 'utf8') - expect(acknowledgedSettings).toContain(`${WELCOME_NOTICE_ACK_FIELD}: ${WELCOME_NOTICE_VERSION}`) - const secondReloadWarnings = tripwire.warnings.length await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, secondReloadWarnings) await page.waitForSelector('[class*="frame"]', { timeout: 15_000 }) - expect(await page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }).count()).toBe(0) - expect(await page.getByRole('region', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) - - // A different stored copy version represents an intentional version bump: - // the welcome step returns even though the credential is already ready. - await scaffold.ctx.settings.mutate(settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), [{ - op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: 'previous-copy-version', - }]) - const thirdReloadWarnings = tripwire.warnings.length - await page.reload({ waitUntil: 'load' }) - acknowledgeReloadConnectionLoss(tripwire, thirdReloadWarnings) - await welcome.waitFor({ timeout: 15_000 }) - await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() - await welcome.waitFor({ state: 'detached', timeout: 15_000 }) expect(await page.getByRole('region', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) expect((await page.content()).includes(secret)).toBe(false) @@ -161,8 +125,8 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('never paints the takeover chrome on a configured reload, even with the settings join held open', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-configured-reload')) - // Regression pin for the reload white flash: both steps are satisfied - // (welcome acknowledged, credential configured), yet each must LOAD its + // Regression pin for the reload white flash: the credential step is + // satisfied (credential configured), yet it must LOAD its // private join before it can decide not to show. The chrome lives inside // the step (OnboardingSurface), so the deciding window paints and blocks // nothing. Holding settings.describe widens that window from loopback @@ -214,7 +178,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('configures arbitrary DeepSeek models and prompts after the selected model is removed', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-deepseek-models')) // Opened here rather than inherited: the credential test reloads the page - // to exercise the welcome step, so nothing carries an open dialog across. + // after configuring the key, so nothing carries an open dialog across. await page.getByRole('button', { name: '设置', exact: true }).click() const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) @@ -264,7 +228,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('keeps the fixture inventory closed', async () => { await assertFixtureInventory( SNAPSHOT_DIR, - ['missing.expected.md', 'models.expected.md', 'welcome.expected.md'], + ['missing.expected.md', 'models.expected.md'], ) }) }) diff --git a/apps/web/tests/remote-welcome.e2e.ts b/apps/web/tests/remote-welcome.e2e.ts deleted file mode 100644 index 7187936ae9..0000000000 --- a/apps/web/tests/remote-welcome.e2e.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Trusted non-loopback Web access must not wedge on the loopback-only -// settings API while the mandatory product notice owns the viewport. -import type { Browser, Page } from 'playwright' -import { chromium } from 'playwright' -import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { - acknowledgeReloadConnectionLoss, launchWebScaffold, watchConsole, webSnapshotMode, - WELCOME_NOTICE_COPY, - type WebScaffold, -} from './scaffold.ts' -import { ZH_BROWSER_LOCALE } from './support.ts' - -const MODE = webSnapshotMode() - -describe.skipIf(MODE === 'record')('web e2e: remote welcome notice', () => { - let scaffold: WebScaffold - let browser: Browser - let page: Page - let tripwire: ReturnType - - beforeAll(async () => { - scaffold = await launchWebScaffold({ remoteAuthority: 'remote.localhost', welcomeNoticePending: true }) - browser = await chromium.launch() - page = await browser.newPage({ viewport: { width: 1440, height: 960 }, locale: ZH_BROWSER_LOCALE }) - tripwire = watchConsole(page) - await page.goto(scaffold.baseUrl, { waitUntil: 'load' }) - await page.waitForSelector('#root', { timeout: 30_000 }) - }, 120_000) - - afterAll(async () => { - await browser?.close() - await scaffold?.close() - }) - - it('advances process-locally and presents the notice again after reload', async () => { - const welcome = page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }) - await welcome.waitFor({ timeout: 15_000 }) - expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true) - - await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() - await welcome.waitFor({ state: 'detached', timeout: 15_000 }) - await expect.poll( - () => page.locator('#root').evaluate(root => (root as HTMLElement).inert), - { timeout: 15_000 }, - ).toBe(false) - const reloadWarnings = tripwire.warnings.length - await page.reload({ waitUntil: 'load' }) - acknowledgeReloadConnectionLoss(tripwire, reloadWarnings) - await welcome.waitFor({ timeout: 15_000 }) - expect(tripwire.warnings).toEqual([]) - expect(tripwire.pageErrors).toEqual([]) - }, 60_000) -}) diff --git a/apps/web/tests/scaffold.ts b/apps/web/tests/scaffold.ts index 970ff7b139..ecca13f0bc 100644 --- a/apps/web/tests/scaffold.ts +++ b/apps/web/tests/scaffold.ts @@ -41,20 +41,6 @@ import { loadOverlayPatches, } from '@deepseek-ai/dsh-app-boot' import { dshHomePath } from '@deepseek-ai/dsh-home-paths' -// Client packages must not be imported here: these e2e type-check in the Host -// aggregate, so a Client import pulls that package's whole project — and every -// project it references — into the Host build graph. Mirrored from -// packages/client/ui-settings-general/src/onboarding-copy.ts; a drift makes the -// pre-acknowledgement stop suppressing the notice, which fails loudly. -// import { -// WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, WELCOME_NOTICE_COPY, -// } from '@deepseek-ai/dsh-client-ui-settings-general' -export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' -export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' -export const WELCOME_NOTICE_VERSION = '2026-08-11.1' -export const WELCOME_NOTICE_COPY = { zh: { title: '内测声明', continueLabel: '继续' } } as const - -import { settingsNamespace } from '@deepseek-ai/dsh-settings' import { LlmAdapter } from '@deepseek-ai/dsh-llm' import type { LlmModelInfo, LlmProviderInfo, LlmResolvedModelInfo, StreamChunk, @@ -252,8 +238,6 @@ export interface LaunchOptions { /** The preset a session that names none is composed from. */ default: string } - /** Leave the current welcome notice unacknowledged; ordinary scenarios publish it as complete before browser boot. */ - welcomeNoticePending?: boolean /** * Mount the shipped telemetry row in FULL mode against this exporter URL * instead of disabling it. Used to pin a real backend disclosure in @@ -526,11 +510,6 @@ export async function launchWebScaffold(options: LaunchOptions = {}): Promise - {paragraph.slice(0, index)} - {emphasis} - {paragraph.slice(index + emphasis.length)} - - ) -} - -/** Registrant-owned dependencies of {@link WelcomeNotice}. */ -export interface WelcomeNoticeInjected { - controller: WelcomeNoticeStore - useSnapshot: SnapshotSelectorHook -} - -/** Coordinator owner props plus the welcome step's injected face. */ -export type WelcomeNoticeProps = - PropsRuntime<'settings.onboarding'> & PropsLocale<'settings'> & WelcomeNoticeInjected - -/** Render the mandatory notice until its current version is acknowledged. */ -export function WelcomeNotice(props: WelcomeNoticeProps): ReactNode { - const { complete, controller, useSnapshot, t } = props - const state = useSnapshot(snapshot => snapshot) - const finished = useRef(false) - const titleRef = useRef(null) - const finish = useCallback((): void => { - if (finished.current) return - finished.current = true - complete() - }, [complete]) - - useEffect(() => { - if (state.status === 'idle') void controller.load() - }, [controller, state.status]) - - useEffect(() => { - if (state.acknowledged) finish() - }, [finish, state.acknowledged]) - - useEffect(() => { - if (state.status === 'ready' && !state.acknowledged) titleRef.current?.focus() - }, [state.acknowledged, state.status]) - - // Null while the acknowledgement fact is still loading (or already given): - // the takeover chrome below is part of THIS render, so deciding not to - // show paints and blocks nothing. - if (state.status === 'idle' || state.status === 'loading' || state.acknowledged) return null - - const acknowledge = async (): Promise => { - if (await controller.acknowledge()) finish() - } - - return ( - -
- -

{t('welcome.title')}

-

{t('welcome.paragraph.0')}

-
{t('welcome.paragraph.1')}
-

- {emphasizedFeedback(t('welcome.paragraph.2'), t('welcome.feedbackEmphasis'))} -

- {state.error === null ? null :

{t('welcome.error')}

} -
- -
-
-
- ) -} diff --git a/packages/client/ui-settings-general/src/client/index.ts b/packages/client/ui-settings-general/src/client/index.ts index 3a868dc3b4..e1a94934c7 100644 --- a/packages/client/ui-settings-general/src/client/index.ts +++ b/packages/client/ui-settings-general/src/client/index.ts @@ -17,9 +17,6 @@ import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' import type {} from '@deepseek-ai/dsh-client-ui-settings/client' // Type-only: pulls ctx.locale into this program. import type {} from '@deepseek-ai/dsh-client-locale/client' -// Type-only: pulls the ctx.remote merge and the forwarded-event key face -// (the settings invalidation rides the allowlist) into this program. -import type {} from '@deepseek-ai/dsh-api-remotes/client' import type { SettingsOnboardingStep, SettingsRootInjected, SettingsSectionRow, } from './shell-contract.ts' @@ -29,10 +26,6 @@ import { GeneralSection } from './GeneralSection.tsx' import { SettingsDocumentAction } from './SettingsDocumentAction.tsx' import type { SettingsDocumentActionInjected } from './SettingsDocumentAction.tsx' import { refreshDocumentIfLoaded, SettingsDocumentStore } from './settings-document-store.ts' -import type { WelcomeNoticeInjected } from './WelcomeNotice.tsx' -import { WelcomeNotice } from './WelcomeNotice.tsx' -import { refreshWelcomeIfLoaded, WelcomeNoticeStore } from './welcome-store.ts' -import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../onboarding-copy.ts' import { en, zh, type SettingsKey } from './locales.ts' export type { @@ -44,8 +37,6 @@ export type { export type { SettingsDocumentActionInjected, SettingsDocumentActionProps } from './SettingsDocumentAction.tsx' export type { SettingsDocumentState } from './settings-document-store.ts' export { SettingsDocumentStore } from './settings-document-store.ts' -export type { WelcomeNoticeInjected, WelcomeNoticeProps } from './WelcomeNotice.tsx' -export type { WelcomeNoticeState } from './welcome-store.ts' export type { SettingsKey } from './locales.ts' declare module '@deepseek-ai/dsh-client-ui-slots' { @@ -63,7 +54,7 @@ const NS = 'settings' * ui-settings' apply, whose activation order relative to this one is NOT * constrained; registrations depend on their slots through `slots.inject()`. */ -export const inject = ['slots', 'locale', 'connection', 'remote'] +export const inject = ['slots', 'locale', 'connection'] /** * Register the `settings` dictionaries, the chrome content, and the General @@ -87,27 +78,9 @@ export function apply(ctx: ClientContext): void { const useSnapshot = bindSnapshotSelector(documentController.store) return (): SettingsDocumentActionInjected => ({ controller: documentController, useSnapshot }) })() - const welcomeController = new WelcomeNoticeStore(connection.api, connection.isLoopback ? 'host' : 'memory') - const useWelcomeSnapshot = bindSnapshotSelector(welcomeController.store) - const welcomeInjected = (): WelcomeNoticeInjected => ({ - controller: welcomeController, - useSnapshot: useWelcomeSnapshot, - }) - - ctx.effect(() => { - const refresh = (): void => { refreshWelcomeIfLoaded(welcomeController) } - const disposers = [ - ctx.remote.$on('settings/document-updated', (ns) => { - if (ns !== WELCOME_NOTICE_SETTINGS_NAMESPACE) return - refresh() - }), - ctx.on('connection/reset', () => { - refresh() - refreshDocumentIfLoaded(documentController) - }), - ] - return () => { for (const dispose of disposers) dispose() } - }, 'ui-settings-general: metadata invalidations') + ctx.effect(() => ctx.on('connection/reset', () => { + refreshDocumentIfLoaded(documentController) + }), 'ui-settings-general: metadata invalidations') // The settings shell: this package occupies the sidebar-owned hole and // declares the settings slots. Ledger → nav-row projection as an observable // source (uSES contract: getSnapshot returns the cached rows until the @@ -202,11 +175,4 @@ export function apply(ctx: ClientContext): void { locale: NS, children: { 'settings.general.item': { kind: 'list', scope: 'root' } }, }, GeneralSection)) - ctx.slots.inject('settings.onboarding', () => ctx.slots.register({ - name: 'settings.onboarding', - id: 'welcome-notice', - order: -100, - locale: NS, - inject: welcomeInjected, - }, WelcomeNotice)) } diff --git a/packages/client/ui-settings-general/src/client/locales.ts b/packages/client/ui-settings-general/src/client/locales.ts index 41a44eae3f..a557855323 100644 --- a/packages/client/ui-settings-general/src/client/locales.ts +++ b/packages/client/ui-settings-general/src/client/locales.ts @@ -1,5 +1,4 @@ -/** Shell chrome, General-nav, and welcome-notice dictionaries; feature rows own their copy. */ -import { WELCOME_NOTICE_COPY } from '../onboarding-copy.ts' +/** Shell chrome and General-nav dictionaries; feature rows own their copy. */ /** Simplified Chinese dictionary (the key-set source of truth). */ export const zh = { @@ -9,13 +8,6 @@ export const zh = { 'openDocument': '打开配置文件', 'openDocument.error': '无法打开配置文件', 'general.nav': '通用设置', - 'welcome.title': WELCOME_NOTICE_COPY.zh.title, - 'welcome.paragraph.0': WELCOME_NOTICE_COPY.zh.paragraphs[0], - 'welcome.paragraph.1': WELCOME_NOTICE_COPY.zh.paragraphs[1], - 'welcome.paragraph.2': WELCOME_NOTICE_COPY.zh.paragraphs[2], - 'welcome.feedbackEmphasis': WELCOME_NOTICE_COPY.zh.feedbackEmphasis, - 'welcome.continue': WELCOME_NOTICE_COPY.zh.continueLabel, - 'welcome.error': '暂时无法保存确认状态,请重试。', } satisfies Record /** The settings namespace key union. */ @@ -29,11 +21,4 @@ export const en = { 'openDocument': 'Open configuration file', 'openDocument.error': 'Could not open configuration file', 'general.nav': 'General', - 'welcome.title': WELCOME_NOTICE_COPY.en.title, - 'welcome.paragraph.0': WELCOME_NOTICE_COPY.en.paragraphs[0], - 'welcome.paragraph.1': WELCOME_NOTICE_COPY.en.paragraphs[1], - 'welcome.paragraph.2': WELCOME_NOTICE_COPY.en.paragraphs[2], - 'welcome.feedbackEmphasis': WELCOME_NOTICE_COPY.en.feedbackEmphasis, - 'welcome.continue': WELCOME_NOTICE_COPY.en.continueLabel, - 'welcome.error': 'The acknowledgement could not be saved. Please try again.', } satisfies Record diff --git a/packages/client/ui-settings-general/src/client/welcome-store.ts b/packages/client/ui-settings-general/src/client/welcome-store.ts deleted file mode 100644 index 48f96bcb94..0000000000 --- a/packages/client/ui-settings-general/src/client/welcome-store.ts +++ /dev/null @@ -1,128 +0,0 @@ -/** Welcome-notice state, durable when the browser may use Host settings. */ - -import type { IApiClient, SettingsNamespaceView } from '@deepseek-ai/dsh-api-remotes/client' -import type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' -import { createSnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' -import { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, -} from '../onboarding-copy.ts' - -/** State rendered by the welcome step. */ -export interface WelcomeNoticeState { - status: 'idle' | 'loading' | 'ready' | 'saving' | 'error' - acknowledged: boolean - error: string | null -} - -function messageOf(error: unknown): string { - return error instanceof Error ? error.message : String(error) -} - -function acknowledgementOf(view: SettingsNamespaceView): string | undefined { - if (typeof view.value !== 'object' || view.value === null) return undefined - const value = (view.value as Record)[WELCOME_NOTICE_ACK_FIELD] - return typeof value === 'string' ? value : undefined -} - -/** Coordinates durable Host acknowledgement or a process-local remote fallback. */ -export class WelcomeNoticeStore { - /** uSES-safe state source shared by the registered welcome step. */ - readonly store: SnapshotStore = createSnapshotStore({ - status: 'idle', acknowledged: false, error: null, - }) - - private generation = 0 - - /** - * @param api - settings wire face used for durable reads and writes. - * @param persistence - remote browsers use memory because settings is loopback-only. - */ - constructor( - private readonly api: Pick, - private readonly persistence: 'host' | 'memory' = 'host', - ) {} - - /** Load the acknowledgement from Host settings or initialize process-local state. */ - async load(): Promise { - const generation = ++this.generation - if (this.persistence === 'memory') { - this.store.update((state) => { state.status = 'ready'; state.error = null }) - return - } - this.store.update((state) => { state.status = 'loading'; state.error = null }) - try { - const response = await this.api.settings.describe({}) - if (!response.result.ok) throw new Error(response.result.error.message) - const view = response.result.value.namespaces.find( - candidate => candidate.ns === WELCOME_NOTICE_SETTINGS_NAMESPACE, - ) - if (view === undefined) throw new Error('welcome acknowledgement settings are unavailable') - if (generation !== this.generation) return - this.store.update((state) => { - state.status = 'ready' - state.acknowledged = acknowledgementOf(view) === WELCOME_NOTICE_VERSION - state.error = null - }) - } catch (error) { - if (generation !== this.generation) return - this.store.update((state) => { - state.status = 'error' - state.acknowledged = false - state.error = messageOf(error) - }) - } - } - - /** - * Acknowledge this copy version. The Host path mutation is idempotent across - * tabs and preserves sibling settings; remote fallback changes only this store. - * @returns true when the selected persistence mode accepted the acknowledgement. - */ - async acknowledge(): Promise { - const generation = ++this.generation - if (this.persistence === 'memory') { - this.store.update((state) => { - state.status = 'ready' - state.acknowledged = true - state.error = null - }) - return true - } - this.store.update((state) => { state.status = 'saving'; state.error = null }) - try { - const response = await this.api.settings.mutate({ - ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, - ops: [{ op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: WELCOME_NOTICE_VERSION }], - }) - if (!response.result.ok) throw new Error(response.result.error.message) - if (generation === this.generation) { - this.store.update((state) => { - state.status = 'ready' - state.acknowledged = true - state.error = null - }) - } - return true - } catch (error) { - if (generation === this.generation) { - this.store.update((state) => { - state.status = 'error' - state.acknowledged = false - state.error = messageOf(error) - }) - } - return false - } - } -} - -/** - * Refresh only after welcome state has left idle. A memory-mode load retains - * acknowledgement so reconnect and settings-change refreshes do not reopen a - * process-local notice. - * @param controller - welcome state owner whose current status decides whether to load. - */ -export function refreshWelcomeIfLoaded(controller: WelcomeNoticeStore): void { - if (controller.store.getSnapshot().status === 'idle') return - void controller.load() -} diff --git a/packages/client/ui-settings-general/src/index.ts b/packages/client/ui-settings-general/src/index.ts index 0cea245db5..ce11f4e0be 100644 --- a/packages/client/ui-settings-general/src/index.ts +++ b/packages/client/ui-settings-general/src/index.ts @@ -3,28 +3,24 @@ import type { Context } from '@deepseek-ai/cordis' import z from '@deepseek-ai/schemastery' import { settingsNamespace } from '@deepseek-ai/dsh-settings' -import { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, -} from './onboarding-copy.ts' -export { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, - WELCOME_NOTICE_VERSION, -} from './onboarding-copy.ts' +/** Durable settings namespace for product-wide GUI onboarding facts. */ +const ONBOARDING_SETTINGS_NAMESPACE = 'ui-onboarding' interface OnboardingSettings { + /** Last welcome-notice version acknowledged by a since-removed first-run notice; kept so stored documents stay valid. */ welcomeNoticeVersion?: string } const OnboardingSettingsSchema: z = z.object({ - [WELCOME_NOTICE_ACK_FIELD]: z.string(), + welcomeNoticeVersion: z.string(), }) /** Register the durable GUI-onboarding section when a settings provider exists. */ export function apply(ctx: Context): void { ctx.inject(['settings'], (settingsCtx) => { settingsCtx.settings.register( - settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), + settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), OnboardingSettingsSchema, ) }) diff --git a/packages/client/ui-settings-general/src/invariant.ts b/packages/client/ui-settings-general/src/invariant.ts index adfd582ca6..10db92524e 100644 --- a/packages/client/ui-settings-general/src/invariant.ts +++ b/packages/client/ui-settings-general/src/invariant.ts @@ -16,7 +16,7 @@ export const inject = ['invariants'] /** * No runtime invariant: the settings seam validates and publishes the durable - * welcome section, while slot conflicts fail loud in the slot core. The local + * onboarding section, while slot conflicts fail loud in the slot core. The local * document action is browser state over typed RPC responses and is covered by * store/component tests rather than a Cordis runtime relationship. */ diff --git a/packages/client/ui-settings-general/src/onboarding-copy.ts b/packages/client/ui-settings-general/src/onboarding-copy.ts deleted file mode 100644 index 8b29402b4b..0000000000 --- a/packages/client/ui-settings-general/src/onboarding-copy.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** Durable settings namespace for product-wide GUI onboarding facts. */ -export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' - -/** Field storing the last welcome notice version the user acknowledged. */ -export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' - -/** - * Bump only when the notice changes materially and every user should see it - * again. The acknowledgement is compared for exact equality. - */ -export const WELCOME_NOTICE_VERSION = '2026-08-11.1' - -/** The complete editable welcome notice in both supported GUI locales. */ -export const WELCOME_NOTICE_COPY = { - zh: { - title: '内测声明', - paragraphs: [ - '感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。', - '“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。', - '内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。', - ], - feedbackEmphasis: '如果您有任何反馈与建议,请在企业微信群中留言告诉我们', - continueLabel: '继续', - }, - en: { - title: '内测声明', - paragraphs: [ - '感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。', - '“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。', - '内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。', - ], - feedbackEmphasis: '如果您有任何反馈与建议,请在企业微信群中留言告诉我们', - continueLabel: '继续', - }, -} as const diff --git a/packages/client/ui-settings-general/tests/apply.client.spec.ts b/packages/client/ui-settings-general/tests/apply.client.spec.ts index 6c0f5131f2..d6c3ffff02 100644 --- a/packages/client/ui-settings-general/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-general/tests/apply.client.spec.ts @@ -1,18 +1,15 @@ -/** Ownerless-copy registrations: the six seats, dictionaries, thunked labels, and HMR recovery. */ +/** Ownerless-copy registrations: the five seats, dictionaries, thunked labels, and HMR recovery. */ import { Context } from '@deepseek-ai/cordis' import { describe, expect, it, vi } from 'vitest' import { resolveSlotLabel } from '@deepseek-ai/dsh-client-ui-slots' import { SlotRegistry } from '@deepseek-ai/dsh-client-runtime/client' import { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client' -import { TestRemote, usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-test-runtime' +import { usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-test-runtime' import { apply, inject } from '@deepseek-ai/dsh-client-ui-settings-general/client' import { CloseLabel, HeaderContent, TriggerContent } from '../src/client/chrome.tsx' import { GeneralSection } from '../src/client/GeneralSection.tsx' import { SettingsDocumentAction } from '../src/client/SettingsDocumentAction.tsx' import type { SettingsDocumentActionInjected } from '../src/client/SettingsDocumentAction.tsx' -import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' -import type { WelcomeNoticeInjected } from '../src/client/WelcomeNotice.tsx' -import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../src/onboarding-copy.ts' // The service reads its initial locale from the browser; these specs assert // the shipped Chinese copy, so they state the browser they assume. @@ -25,7 +22,6 @@ const SEATS = [ ['settings.action', SettingsDocumentAction], ['settings.close', CloseLabel], ['settings.section', GeneralSection], - ['settings.onboarding', WelcomeNotice], ] as const async function bench(isLoopback = true) { @@ -33,9 +29,6 @@ async function bench(isLoopback = true) { await ctx.plugin(SlotRegistry).await() const locale = new LocaleRuntime(ctx) ctx.provide('locale', locale) - // The plugins inject `remote`; forwarded events reach them through the - // same `$dispatch` handoff the connection sink makes. - new TestRemote(ctx) const settingsDescribe = vi.fn(() => Promise.resolve({ rpcId: 'settings-general' as never, result: { @@ -43,14 +36,7 @@ async function bench(isLoopback = true) { value: { writable: true, hasDocument: true, - namespaces: [{ - ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, - schema: {}, - value: {}, - applies: 'live' as const, - secrets: [], - revision: 0, - }], + namespaces: [], }, }, })) @@ -89,10 +75,10 @@ function generalEntry(slots: SlotRegistry) { describe('ui-settings-general apply', () => { it('declares the services it uses', () => { - expect(inject).toEqual(['slots', 'locale', 'connection', 'remote']) + expect(inject).toEqual(['slots', 'locale', 'connection']) }) - it('fills all six seats for declarations before or after apply', async () => { + it('fills all five seats for declarations before or after apply', async () => { const before = await bench() declare(before.slots) await before.ctx.plugin({ inject: [...inject], apply }).await() @@ -105,8 +91,9 @@ describe('ui-settings-general apply', () => { expect(resolveSlotLabel(entry.options.label)).toBe('通用设置') expect(before.slots.spec('settings.general.item')).toEqual({ kind: 'list', scope: 'root' }) expect(before.slots.entries('settings.general.item')).toEqual([]) - const welcome = before.slots.entries('settings.onboarding')[0]! - expect(welcome.options).toMatchObject({ id: 'welcome-notice', order: -100 }) + // The onboarding hole stays declared for feature-owned steps; this plugin + // no longer seats one. + expect(before.slots.entries('settings.onboarding')).toEqual([]) const action = before.slots.entries('settings.action')[0]! const actionInjected = (action.inject as unknown as () => SettingsDocumentActionInjected)() expect(actionInjected.controller.store.getSnapshot().status).toBe('idle') @@ -162,22 +149,6 @@ describe('ui-settings-general apply', () => { expect(resolveSlotLabel(generalEntry(b.slots)!.options.label)).toBe('通用设置') }) - it('refreshes loaded welcome state only for its settings namespace or a reconnect', async () => { - const b = await bench() - declare(b.slots) - await b.ctx.plugin({ inject: [...inject], apply }).await() - const entry = b.slots.entries('settings.onboarding')[0]! - const { controller } = (entry.inject as unknown as () => WelcomeNoticeInjected)() - await controller.load() - expect(b.settingsDescribe).toHaveBeenCalledOnce() - b.ctx.remote.$dispatch('settings/document-updated', ['unrelated', 1]) - expect(b.settingsDescribe).toHaveBeenCalledOnce() - b.ctx.remote.$dispatch('settings/document-updated', [WELCOME_NOTICE_SETTINGS_NAMESPACE, 1]) - await vi.waitFor(() => { expect(b.settingsDescribe).toHaveBeenCalledTimes(2) }) - b.ctx.emit('connection/reset') - await vi.waitFor(() => { expect(b.settingsDescribe).toHaveBeenCalledTimes(3) }) - }) - it('refreshes loaded document availability on reconnect without reading it eagerly', async () => { const b = await bench() declare(b.slots) @@ -192,19 +163,13 @@ describe('ui-settings-general apply', () => { await vi.waitFor(() => { expect(b.settingsDescribe).toHaveBeenCalledTimes(2) }) }) - it('keeps remote welcome acknowledgement process-local', async () => { + it('withholds the loopback-only document action off-loopback', async () => { const b = await bench(false) declare(b.slots) const fiber = b.ctx.plugin({ inject: [...inject], apply }) await fiber.await() - const entry = b.slots.entries('settings.onboarding')[0]! - const { controller } = (entry.inject as unknown as () => WelcomeNoticeInjected)() - - await controller.load() - await expect(controller.acknowledge()).resolves.toBe(true) - expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: true }) - expect(b.settingsDescribe).not.toHaveBeenCalled() expect(b.slots.entries('settings.action')).toEqual([]) + expect(b.settingsDescribe).not.toHaveBeenCalled() await fiber.dispose() for (const [name] of SEATS) expect(b.slots.entries(name)).toEqual([]) }) diff --git a/packages/client/ui-settings-general/tests/host.client.spec.ts b/packages/client/ui-settings-general/tests/host.client.spec.ts index 5e82764f47..f5bc43b3e1 100644 --- a/packages/client/ui-settings-general/tests/host.client.spec.ts +++ b/packages/client/ui-settings-general/tests/host.client.spec.ts @@ -2,7 +2,9 @@ import { Context } from '@deepseek-ai/cordis' import { describe, expect, it } from 'vitest' import { SettingsProvider, settingsNamespace, type SettingsNamespace } from '@deepseek-ai/dsh-settings' import { apply } from '../src/index.ts' -import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../src/onboarding-copy.ts' + +/** Mirrors the module-local namespace id in src/index.ts. */ +const ONBOARDING_SETTINGS_NAMESPACE = 'ui-onboarding' class MemorySettings extends SettingsProvider { readonly writable = true @@ -19,11 +21,11 @@ describe('ui-settings-general host', () => { const fiber = ctx.plugin({ apply }) await fiber.await() expect(ctx.settings.describe().map(row => row.ns)).toContain( - settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), + settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), ) await fiber.dispose() expect(ctx.settings.describe().map(row => row.ns)).not.toContain( - settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), + settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), ) }) }) diff --git a/packages/client/ui-settings-general/tests/shell.client.spec.ts b/packages/client/ui-settings-general/tests/shell.client.spec.ts index 0c95e8b8d3..32c354deda 100644 --- a/packages/client/ui-settings-general/tests/shell.client.spec.ts +++ b/packages/client/ui-settings-general/tests/shell.client.spec.ts @@ -49,7 +49,7 @@ const CHILD_SPECS = { describe('ui-settings apply', () => { it('declares only the slot registry (a pure composition face, no locale)', () => { - expect(inject).toEqual(['slots', 'locale', 'connection', 'remote']) + expect(inject).toEqual(['slots', 'locale', 'connection']) }) it('registers the shell and declares every child slot, before or after the declaration', async () => { @@ -110,8 +110,6 @@ describe('ui-settings apply', () => { b.slots.register({ name: 'settings.onboarding', id: 'default-order' } as never, () => null) const steps = onboardingSteps.getSnapshot() expect(steps).toEqual([ - // This package's own onboarding page, registered by the same apply. - { id: 'welcome-notice', order: -100 }, { id: 'welcome', order: -100 }, { id: 'credential', order: 0 }, { id: 'default-order', order: 0 }, diff --git a/packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx b/packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx deleted file mode 100644 index 74feea89a5..0000000000 --- a/packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx +++ /dev/null @@ -1,106 +0,0 @@ -// @vitest-environment jsdom -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' -import { afterEach, describe, expect, it, vi } from 'vitest' -import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' -import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' -import type { WelcomeNoticeProps } from '../src/client/WelcomeNotice.tsx' -import { WelcomeNoticeStore } from '../src/client/welcome-store.ts' -import { zh } from '../src/client/locales.ts' -import { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, - WELCOME_NOTICE_VERSION, -} from '../src/onboarding-copy.ts' - -afterEach(cleanup) - -function response(value: T) { - return { rpcId: 'welcome-rpc' as never, result: { ok: true as const, value } } -} - -function mount(version?: string, mutateImpl: () => Promise = () => Promise.resolve(response({}))) { - const mutate = vi.fn(mutateImpl) - const api = { - settings: { - describe: () => Promise.resolve(response({ - writable: true, - hasDocument: false, - namespaces: [{ - ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, - schema: {}, - value: version === undefined ? {} : { [WELCOME_NOTICE_ACK_FIELD]: version }, - applies: 'live' as const, - secrets: [], - revision: 0, - }], - })), - mutate, - }, - } - const controller = new WelcomeNoticeStore(api as never) - const complete = vi.fn() - const unusedHook = (() => { throw new Error('unused standard hook') }) as never - const props: WelcomeNoticeProps = { - stepId: 'welcome-notice', - complete, - openSection: vi.fn(), - useSessions: unusedHook, - useWorkspaces: unusedHook, - controller, - useSnapshot: bindSnapshotSelector(controller.store), - t: key => key in zh ? zh[key as keyof typeof zh] : key, - } - return { ...render(), complete, controller, mutate } -} - -describe('WelcomeNotice', () => { - it('uses the same Chinese owner copy in both GUI locales', () => { - expect(WELCOME_NOTICE_COPY.en).toEqual(WELCOME_NOTICE_COPY.zh) - }) - - it('renders the owner copy with one primary action and no dismissal control', async () => { - const h = mount() - const page = await screen.findByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }) - expect(screen.getByText(WELCOME_NOTICE_COPY.zh.title)).toBeTruthy() - for (const text of WELCOME_NOTICE_COPY.zh.paragraphs) expect(page.textContent).toContain(text) - expect(page.textContent?.match(/感谢您愿意拨冗试用 DeepSeek Harness/g) ?? []).toHaveLength(1) - const buttons = page.querySelectorAll('button') - expect(buttons).toHaveLength(1) - expect(screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel })).toBeTruthy() - expect(document.activeElement).toBe(screen.getByRole('heading', { name: WELCOME_NOTICE_COPY.zh.title })) - fireEvent.keyDown(document, { key: 'Escape' }) - expect(h.complete).not.toHaveBeenCalled() - expect(screen.getByRole('region')).toBeTruthy() - }) - - it('completes only after the acknowledgement write commits', async () => { - const h = mount() - await screen.findByRole('region') - fireEvent.click(screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel })) - await act(async () => { await Promise.resolve() }) - expect(h.mutate).toHaveBeenCalledOnce() - expect(h.complete).toHaveBeenCalledOnce() - }) - - it('skips itself when this exact version was already acknowledged', async () => { - const h = mount(WELCOME_NOTICE_VERSION) - await act(async () => { await h.controller.load() }) - expect(screen.queryByRole('region')).toBeNull() - expect(h.complete).toHaveBeenCalledOnce() - }) - - it('keeps the sole action disabled while saving and reports a refused write', async () => { - let resolveWrite!: (value: unknown) => void - const write = new Promise((resolve) => { resolveWrite = resolve }) - const h = mount(undefined, () => write) - await screen.findByRole('region') - const action = screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }) - fireEvent.click(action) - expect(action.disabled).toBe(true) - resolveWrite({ - rpcId: 'welcome-refused' as never, - result: { ok: false, error: { code: 'settings-rejected', message: 'read only', details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE } } }, - }) - expect((await screen.findByRole('alert')).textContent).toBe('暂时无法保存确认状态,请重试。') - expect(h.complete).not.toHaveBeenCalled() - }) -}) diff --git a/packages/client/ui-settings-general/tests/welcome-store.client.spec.ts b/packages/client/ui-settings-general/tests/welcome-store.client.spec.ts deleted file mode 100644 index bfa5e16999..0000000000 --- a/packages/client/ui-settings-general/tests/welcome-store.client.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { describe, expect, it, vi } from 'vitest' -import type { RpcResponse } from '@deepseek-ai/dsh-api-remotes/client' -import { WelcomeNoticeStore } from '../src/client/welcome-store.ts' -import { refreshWelcomeIfLoaded } from '../src/client/welcome-store.ts' -import { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, -} from '../src/onboarding-copy.ts' - -let rpc = 0 -function ok(value: T): RpcResponse { - return { rpcId: `welcome-${rpc++}` as never, result: { ok: true, value } } -} - -function namespace(version?: string) { - return { - ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, - schema: {}, - value: version === undefined ? {} : { [WELCOME_NOTICE_ACK_FIELD]: version }, - applies: 'live' as const, - secrets: [], - revision: 0, - } -} - -function deferred() { - let resolve!: (value: T) => void - let reject!: (reason: unknown) => void - const promise = new Promise((res, rej) => { resolve = res; reject = rej }) - return { promise, resolve, reject } -} - -describe('WelcomeNoticeStore', () => { - it('acknowledges in memory without calling loopback-only settings APIs', async () => { - const describe = vi.fn() - const mutate = vi.fn() - const controller = new WelcomeNoticeStore({ settings: { describe, mutate } } as never, 'memory') - - await controller.load() - expect(controller.store.getSnapshot()).toEqual({ status: 'ready', acknowledged: false, error: null }) - await expect(controller.acknowledge()).resolves.toBe(true) - expect(controller.store.getSnapshot()).toEqual({ status: 'ready', acknowledged: true, error: null }) - await controller.load() - expect(controller.store.getSnapshot()).toEqual({ status: 'ready', acknowledged: true, error: null }) - expect(describe).not.toHaveBeenCalled() - expect(mutate).not.toHaveBeenCalled() - }) - - it('acknowledges only the exact current copy version', async () => { - for (const [version, acknowledged] of [ - [undefined, false], - ['older-copy', false], - [WELCOME_NOTICE_VERSION, true], - ] as const) { - const api = { - settings: { - describe: vi.fn(() => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace(version)] }))), - }, - } - const controller = new WelcomeNoticeStore(api as never) - await controller.load() - expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged }) - } - }) - - it('persists the owner version through one idempotent path mutation', async () => { - const mutate = vi.fn(() => Promise.resolve(ok(namespace(WELCOME_NOTICE_VERSION)))) - const controller = new WelcomeNoticeStore({ settings: { mutate } } as never) - await expect(controller.acknowledge()).resolves.toBe(true) - expect(mutate).toHaveBeenCalledWith({ - ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, - ops: [{ op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: WELCOME_NOTICE_VERSION }], - }) - expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: true }) - }) - - it('keeps the notice pending when loading or persistence fails', async () => { - const load = new WelcomeNoticeStore({ - settings: { describe: () => Promise.reject(new Error('offline')) }, - } as never) - await load.load() - expect(load.store.getSnapshot()).toEqual({ status: 'error', acknowledged: false, error: 'offline' }) - - const save = new WelcomeNoticeStore({ - settings: { mutate: () => Promise.reject(new Error('disk full')) }, - } as never) - await expect(save.acknowledge()).resolves.toBe(false) - expect(save.store.getSnapshot()).toEqual({ status: 'error', acknowledged: false, error: 'disk full' }) - - const nonError = new WelcomeNoticeStore({ - // Durable/wire failures are unknown; exercise containment of a non-Error rejection. - // oxlint-disable-next-line typescript/prefer-promise-reject-errors - settings: { describe: () => Promise.reject('offline string') }, - } as never) - await nonError.load() - expect(nonError.store.getSnapshot().error).toBe('offline string') - }) - - it('reports business failures, missing namespaces, and malformed durable values', async () => { - for (const describe of [ - () => Promise.resolve({ - rpcId: 'failed' as never, - result: { ok: false as const, error: { code: 'internal' as const, message: 'denied', details: {} } }, - }), - () => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [] })), - ]) { - const controller = new WelcomeNoticeStore({ settings: { describe } } as never) - await controller.load() - expect(controller.store.getSnapshot().status).toBe('error') - } - - for (const value of [null, 42, { [WELCOME_NOTICE_ACK_FIELD]: 42 }]) { - const controller = new WelcomeNoticeStore({ - settings: { describe: () => Promise.resolve(ok({ - writable: true, - hasDocument: false, - namespaces: [{ ...namespace(), value }], - })) }, - } as never) - await controller.load() - expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: false }) - } - - const save = new WelcomeNoticeStore({ - settings: { mutate: () => Promise.resolve({ - rpcId: 'failed-save' as never, - result: { ok: false, error: { code: 'settings-rejected', message: 'denied', details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE } } }, - }) }, - } as never) - await expect(save.acknowledge()).resolves.toBe(false) - expect(save.store.getSnapshot().error).toBe('denied') - }) - - it('lets the latest load win over stale success and failure', async () => { - const first = deferred>() - const describe = vi.fn() - .mockImplementationOnce(() => first.promise) - .mockImplementationOnce(() => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace()] }))) - const controller = new WelcomeNoticeStore({ settings: { describe } } as never) - const stale = controller.load() - await controller.load() - first.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace(WELCOME_NOTICE_VERSION)] })) - await stale - expect(controller.store.getSnapshot().acknowledged).toBe(false) - - const failed = deferred>() - describe - .mockImplementationOnce(() => failed.promise) - .mockImplementationOnce(() => Promise.resolve(ok({ - writable: true, hasDocument: false, namespaces: [namespace(WELCOME_NOTICE_VERSION)], - }))) - const staleFailure = controller.load() - await controller.load() - failed.reject('stale failure') - await staleFailure - expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: true, error: null }) - }) - - it('contains stale acknowledgement settlements and refreshes only a loaded store', async () => { - const write = deferred>() - const describe = vi.fn(() => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace()] }))) - const controller = new WelcomeNoticeStore({ - settings: { mutate: () => write.promise, describe }, - } as never) - refreshWelcomeIfLoaded(controller) - expect(describe).not.toHaveBeenCalled() - const staleWrite = controller.acknowledge() - await controller.load() - write.resolve(ok(namespace(WELCOME_NOTICE_VERSION))) - await expect(staleWrite).resolves.toBe(true) - expect(controller.store.getSnapshot().acknowledged).toBe(false) - refreshWelcomeIfLoaded(controller) - await vi.waitFor(() => { expect(describe).toHaveBeenCalledTimes(2) }) - - const failedWrite = deferred>() - const staleFailure = new WelcomeNoticeStore({ - settings: { mutate: () => failedWrite.promise, describe }, - } as never) - const pending = staleFailure.acknowledge() - await staleFailure.load() - failedWrite.reject('late failure') - await expect(pending).resolves.toBe(false) - expect(staleFailure.store.getSnapshot().status).toBe('ready') - }) -}) diff --git a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts index 2143493488..015d36e896 100644 --- a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts +++ b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts @@ -1259,7 +1259,6 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [ slotInject: '', declaredBy: 'an entry in \'sidebar.settings\' (client-ui-settings-general), so it exists while that entry is mounted', occupants: [ - 'client-ui-settings-general WelcomeNotice id \'welcome-notice\'', 'client-ui-settings-models DeepSeekOnboardingDialog id \'deepseek-official\'', ], replaceRisk: 'none', From 14cf3334be2fcadaad2f0df3645d5e4dd5b9947e Mon Sep 17 00:00:00 2001 From: _Kerman Date: Thu, 13 Aug 2026 14:04:06 +0800 Subject: [PATCH 021/103] fix(web): keep older trajectory history loadable --- ...-27-trajectory-inspection-ledger.i18n.yaml | 4 +- ...2026-07-27-trajectory-inspection-ledger.md | 2 +- ...6-07-27-trajectory-inspection-ledger.zh.md | 2 +- .../load-more.expected.md | 3 + .../tests/trajectory-virtualization.e2e.ts | 27 ++++++++- .../client/ui-trajectory/README.i18n.yaml | 4 +- packages/client/ui-trajectory/README.md | 2 +- packages/client/ui-trajectory/README.zh.md | 2 +- .../src/client/TrajectoryTable.module.css | 38 +++++++++++- .../src/client/TrajectoryTable.tsx | 52 ++++++++++++---- .../src/client/TrajectoryView.tsx | 5 +- .../ui-trajectory/tests/table.client.spec.tsx | 59 +++++++++++++++++++ 12 files changed, 175 insertions(+), 25 deletions(-) create mode 100644 apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md diff --git a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml index 40e2c6dd19..674176e65a 100644 --- a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md -2026-07-27-trajectory-inspection-ledger.md: 74ed1f8ec6f6efcbf77e9caec7e254cb114efbd9 -2026-07-27-trajectory-inspection-ledger.zh.md: be648cb73478037979fd941753129b7c68be5085 +2026-07-27-trajectory-inspection-ledger.md: 7f97bc395ed694a0a750d3b744cc9887834ef32f +2026-07-27-trajectory-inspection-ledger.zh.md: 34bb8741124c410fe06ec18bdde801caa987f4fb diff --git a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md index 74ed1f8ec6..7f97bc395e 100644 --- a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md +++ b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md @@ -21,7 +21,7 @@ Trajectory has to make prose, machine payloads, token usage, timing, and nested - Call schemas come from the active recorded Request header. Keyless snapshot fixtures deliberately replace that catalog with the non-array `{{tools}}` token, which the durable inspection boundary treats as unavailable instead of attempting to project or fabricate schemas. - Selecting a record or Request opens an inspector inside Trajectory. Tabs and Summary sections follow the selected entity: Markdown messages expose rendered content, source fields, provider/model fields, and hierarchy views; tools add JSON payload/result and schema views; Requests add options, usage, timing, and result navigation. Scrollable Summary regions keep their scrollbar thumbs transparent until hover or `focus-within`, while retaining the scrollbar reservation and scroll behavior. Images render as media rather than serialized data. - Turn folding removes all rows after its first record and replaces them with a compact step/tool-call count; Assistant folding applies the same interaction to its tool-call descendants. Global controls fold or expand both levels. -- A long ledger initially positions the loaded tail at the bottom and mounts only the viewport's row window plus bounded overscan. Request-only separators join the next measurable virtual item, with a terminal separator retaining its own fixed clearance, so the virtualizer never owns a zero-height item. Semantic DOM-safe row keys and ARIA indexes expose identity independently from mount position. A tail with known older history virtualizes immediately even when its loaded projection is below the ordinary row threshold. Stable-key virtualizer anchoring preserves the visible item across prepends and appends; the manual scroll-height fallback applies only when completing pagination disables virtualization. Selection, timeline focus, folding, search, and bottom following address records by stable event or tool-call identity rather than requiring their DOM rows to exist. An explicit loading row covers records until initial positioning finishes and while an older Session page is pending. +- A long ledger initially positions the loaded tail at the bottom and mounts only the viewport's row window plus bounded overscan. Request-only separators join the next measurable virtual item, with a terminal separator retaining its own fixed clearance, so the virtualizer never owns a zero-height item. Semantic DOM-safe row keys and ARIA indexes expose identity independently from mount position. A tail with known older history virtualizes immediately even when its loaded projection is below the ordinary row threshold. Stable-key virtualizer anchoring preserves the visible item across prepends and appends; the manual scroll-height fallback applies only when completing pagination disables virtualization. Selection, timeline focus, folding, search, and bottom following address records by stable event or tool-call identity rather than requiring their DOM rows to exist. An explicit loading row covers records until initial positioning finishes. While an older Session prefix remains unloaded, an interactive first row precedes the loaded records and requests one older page; the same row becomes a disabled loading status for a pending page and disappears only when paging completes. - The separate Waterfall tab is removed. A fixed Overview above the ledger projects every loaded record with known `startedAt` onto three semantic timing lanes using its own duration. While an older prefix remains unloaded and the viewport includes the loaded domain's start, a neutral ellipsis control covers the truncated edge and loads one earlier page without assigning unknown history a fabricated duration; hovering that control suppresses the ordinary timeline cursor. Finalized Assistant spans divide the recorded interval at the first non-empty token delta, so distinct TTFT and decoding colors retain their actual ratio; incomplete timing falls back to one Assistant color. Hovering for 500 ms exposes exact start/end, total duration, TTFT, and decoding time without relying on the browser's native tooltip delay. Dragging left or right commits an inclusive interval filter: any record whose active interval overlaps either boundary remains visible, records without known timing leave the focused ledger, and clearing the selection restores the full loaded ledger. Wheel gestures zoom the time domain. A right-button click clears the interval selection; dragging instead pans an already zoomed viewport without mutating it. The Overview keeps the full time domain while focused so the selection can be resized or cleared without losing orientation. - Live history updates retain the ledger's bottom position only while the user is already following its tail. Scrolling upward clears that follow state, so streamed chunks and newly appended records do not interrupt inspection of earlier rows. Tail following and virtualizer measurement react to row keys and heights rather than content identity, so text-only stream frames neither discard the measurement cache nor repeat a DOM scroll write. - Token streaming updates only the matching Trajectory Assistant Context, while publication is coalesced to at most once per animation frame. The target snapshot preserves the existing stage, layout, Request numbering, Overview, and search inputs; completed Assistant State retains assembled blocks, timing, and usage rather than every raw chunk payload, while Session keeps the raw Event window. diff --git a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md index be648cb734..34bb874112 100644 --- a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md +++ b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md @@ -21,7 +21,7 @@ Status: implemented - 调用 schema 来自当前生效且已记录的请求头。无密钥快照 fixture(测试前置数据)有意将该目录替换为非数组 token `{{tools}}`,持久化检查边界会将其视为不可用,而不是尝试投影或虚构 schema。 - 选择记录或请求后,Trajectory 内部会打开检查器,其标签页和概述区域随实体类型变化:Markdown 消息提供渲染内容、来源字段、提供方/模型字段和层级视图;工具提供 JSON 载荷/结果和 schema 视图;请求提供选项、用量、计时和结果跳转。可滚动的概述区域默认保持滚动条滑块透明,直到悬停或 `focus-within` 时才显示,同时保留滚动条预留空间和滚动行为。图片以媒体形式渲染,而不是显示为序列化数据。 - 折叠轮次时保留其第一条记录,并用紧凑的步骤数和工具调用数替换后续所有行;折叠助手时对其工具调用后代应用相同操作。全局控件会折叠或展开这两个层级。 -- 长记录表初始时将已加载尾部置于底部,只挂载视口对应的行窗口及有界的额外缓冲行。仅含请求的分隔行并入下一个具备可测高度的虚拟项,末尾分隔行则保留固定留白,因此虚拟化器不会管理零高度项。可安全用于 DOM 的语义行键与 ARIA 索引使标识不依赖挂载位置。只要已知尾部之前仍有更早历史,即使当前已加载投影低于常规行数阈值,也会立即启用虚拟化。基于稳定键的虚拟化器锚定会在向前补页和尾部追加时保留当前可见项;只有分页完成导致虚拟化停用时,才使用手动滚动高度兜底。选择、时间线聚焦、折叠、搜索和末尾跟随均按稳定的事件或工具调用标识定位,不要求对应 DOM 行已存在。初始定位完成前以及更早 Session 页面仍在等待时,明确的加载行会遮住真实记录。 +- 长记录表初始时将已加载尾部置于底部,只挂载视口对应的行窗口及有界的额外缓冲行。仅含请求的分隔行并入下一个具备可测高度的虚拟项,末尾分隔行则保留固定留白,因此虚拟化器不会管理零高度项。可安全用于 DOM 的语义行键与 ARIA 索引使标识不依赖挂载位置。只要已知尾部之前仍有更早历史,即使当前已加载投影低于常规行数阈值,也会立即启用虚拟化。基于稳定键的虚拟化器锚定会在向前补页和尾部追加时保留当前可见项;只有分页完成导致虚拟化停用时,才使用手动滚动高度兜底。选择、时间线聚焦、折叠、搜索和末尾跟随均按稳定的事件或工具调用标识定位,不要求对应 DOM 行已存在。初始定位完成前,明确的加载行会遮住真实记录。更早的 Session 前缀仍未加载时,交互式首行位于已加载记录之前,可请求一页更早历史;页面加载期间,同一行会变为禁用的加载状态,仅在分页完成时消失。 - 移除独立的 waterfall(瀑布式事件)标签页。固定在记录表上方的 Overview 区域将所有 `startedAt` 已知的已加载记录按各自耗时投影到三条语义计时轨道。仍有更早前缀尚未加载且 viewport 包含已加载时间域起点时,中性的省略号控件会遮住截断边缘并加载一页更早历史,而不会为未知历史虚构耗时;悬停在该控件上会隐藏普通的时间线光标。已完成的助手时间条以首个非空 token 增量为分界,用不同颜色按真实比例表示 TTFT 与解码时间;计时不完整时退化为单一助手色。悬停 500 ms 后会显示精确起止时刻、总耗时、TTFT 和解码时间,而不依赖浏览器原生 tooltip 的延迟。向左或向右拖动会提交包含边界的区间筛选:任何活动区间与所选区间任一边界重叠的记录都会保留,计时未知的记录会从聚焦后的记录表中移除,清除选择则恢复完整的已加载记录表。滚轮手势用于缩放时间域。右键单击会清除区间选择;右键拖动则只会平移已放大的 viewport,不会改变该选区。聚焦后,Overview 区域仍保留完整时间范围,以便在不失去方位的情况下调整或清除选择。 - 实时历史更新仅在用户已经跟随记录表末尾时保留底部位置。向上滚动会清除跟随状态,因此流式分块和新追加的记录不会打断对旧记录的检查。末尾跟随与虚拟化器测量仅响应行键和高度,而非内容标识,因此仅含文本的流式帧既不会丢弃测量缓存,也不会重复执行 DOM 滚动写入。 - token 流式输出只更新命中的 Trajectory Assistant Context,发布则合并为每个 animation frame 最多一次。target snapshot 继续提供既有 stage、layout、请求编号、Overview 与搜索输入;已完成的 Assistant State 只保留组装后的 blocks、计时与 usage,不保留每条原始 chunk payload,而 Session 继续保存原始 Event 窗口。 diff --git a/apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md b/apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md new file mode 100644 index 0000000000..f6d020f38c --- /dev/null +++ b/apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md @@ -0,0 +1,3 @@ +- row "Load earlier history": + - cell "Load earlier history": + - button "Load earlier history" diff --git a/apps/web/tests/trajectory-virtualization.e2e.ts b/apps/web/tests/trajectory-virtualization.e2e.ts index 64f149646b..4ed0e89fbc 100644 --- a/apps/web/tests/trajectory-virtualization.e2e.ts +++ b/apps/web/tests/trajectory-virtualization.e2e.ts @@ -3,6 +3,7 @@ // DOM mounting stays bounded, and every scroll range remains reachable. import { mkdtemp, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' +import { fileURLToPath } from 'node:url' import { join } from 'node:path' import type { Browser, Page } from 'playwright' import { chromium } from 'playwright' @@ -11,6 +12,8 @@ import type { StreamChunk } from '@deepseek-ai/dsh-llm' import type { ReplayEntry } from '@deepseek-ai/dsh-llm-replay' import { createChatScrollFixture } from './chat-scroll-fixture.ts' import { + captureStableAria, + compareOrRefreshGolden, launchWebScaffold, seedSession, watchConsole, @@ -20,6 +23,10 @@ import { import { newEnglishPage, saveFailureShot } from './support.ts' const MODE = webSnapshotMode() +const LOAD_MORE_EXPECTED = fileURLToPath(new URL( + './snapshots/trajectory-virtualization/load-more.expected.md', + import.meta.url, +)) const SESSION_ID = 'trajectory-virtualization-e2e' const FIXTURE = createChatScrollFixture({ markerPrefix: 'TRAJECTORY_VIRTUAL', @@ -230,8 +237,26 @@ describe('web e2e: Trajectory virtualization over tail-paged history', () => { expect(await page.getByText('Initial System Prompt', { exact: true }).count()).toBe(0) expect(await mountedRows(page)).toBeLessThanOrEqual(MAX_MOUNTED_ROWS) - await scrollToRatio(page, 0) + const loadMore = page.locator('[data-history-load] button') + await loadMore.waitFor({ timeout: 15_000 }) + expect(await loadMore.textContent()).toBe('Load earlier history') + const loadMoreSnapshot = await captureStableAria( + page, + '[data-history-load]', + scaffold.workspaceCwd, + ) + await compareOrRefreshGolden(LOAD_MORE_EXPECTED, loadMoreSnapshot, MODE) + await loadMore.evaluate((button: HTMLButtonElement) => { button.click() }) await expect.poll(() => held, { timeout: 15_000 }).toBe(true) + await expect.poll(async () => ({ + disabled: await loadMore.isDisabled(), + label: await loadMore.textContent(), + }), { timeout: 15_000 }).toEqual({ + disabled: true, + label: 'Loading earlier history…', + }) + + await scrollToRatio(page, 0) const anchor = await firstVisibleRow(page) const selectedRow = page.locator( `[data-trajectory-scroll] tr[data-trajectory-row-key=${JSON.stringify(anchor.key)}]`, diff --git a/packages/client/ui-trajectory/README.i18n.yaml b/packages/client/ui-trajectory/README.i18n.yaml index b3b7d8ac47..c3a40c880f 100644 --- a/packages/client/ui-trajectory/README.i18n.yaml +++ b/packages/client/ui-trajectory/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-trajectory/README.md -README.md: d3786b6460c5df7eaa6d24e68c80025e7fb29ae4 -README.zh.md: b3bc88d8ab73ccc0da9a49d1867fe2c66be5ca43 +README.md: 9ad42a3d3bcfb8fbf4842a66577e65794a716dfd +README.zh.md: df7661ef7d4861dbc6c8e365a18b3e3252d4d4af diff --git a/packages/client/ui-trajectory/README.md b/packages/client/ui-trajectory/README.md index d3786b6460..9ad42a3d3b 100644 --- a/packages/client/ui-trajectory/README.md +++ b/packages/client/ui-trajectory/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Trajectory renders a turn-aware event ledger with selectable User, Assistant, Tool, and nested Subtool records. Thick rules mark Turn boundaries, compact inline markers identify Steps, and the main ledger keeps only index, event, and content; selection opens a local inspector for token usage, duration, Input, Output, and Timing. Scrollable Summary regions keep their scrollbar thumbs transparent until the region is hovered or contains keyboard focus, without changing the reserved scroll geometry. A standalone compaction request appears chronologically in its own `Between turns` section, while a numbered compaction remains inside its owning turn. Long ledgers open at the current tail, load one older page when the user reaches the loaded range's top, and mount only the visible row window plus a small overscan; request-only separators share the next measurable virtual item, while semantic row keys and ARIA indexes survive prepends. Selection, timeline navigation, folding, search, and Request totals cover the currently loaded window. The ledger covers records with an explicit loading row until the initial tail is positioned and while an older page is pending. A fixed Overview above the ledger projects real record start/duration timing from left to right; when earlier records remain unloaded and the viewport includes the loaded domain's start, a neutral ellipsis control identifies the omitted prefix and loads one earlier page without assigning unknown history fabricated duration. Assistant spans divide recorded TTFT from decoding, and a 500 ms hover reveals exact clock and duration details. Dragging an interval focuses the ledger on every record active at any point in that inclusive range, while clearing the selection restores the full loaded ledger. Wheel gestures zoom the time domain. A right-button click clears the selected interval, while a right-button drag pans an already zoomed viewport without changing it. The initial view and streaming updates stay at the tail; scrolling upward suspends following so new records do not interrupt inspection of earlier rows. Content-only stream frames preserve virtual row keys and heights, reuse measurements, and do not issue repeated tail-scroll writes. Completed replies retain assembled blocks, timing, and usage in Trajectory target State, while the shared Session window keeps the raw Events. Trajectory asks the conversation shell to float the composer over the full-height ledger, while its responsive vertical scrollers reserve the composer's live height so final rows remain reachable. Trajectory-owned Definitions assemble business records, including cancellation-frozen Assistant and Tool records, from the shared Session window, so Trajectory neither reads nor changes the Chat conversation snapshot. The package provides no service and declares no Context merge; it registers target-specific Event Definitions, a Trajectory view builder, and one tab in the conversation's `'conversation.view'` slot ring. Contract: api-contracts v3 §8. +Trajectory renders a turn-aware event ledger with selectable User, Assistant, Tool, and nested Subtool records. Thick rules mark Turn boundaries, compact inline markers identify Steps, and the main ledger keeps only index, event, and content; selection opens a local inspector for token usage, duration, Input, Output, and Timing. Scrollable Summary regions keep their scrollbar thumbs transparent until the region is hovered or contains keyboard focus, without changing the reserved scroll geometry. A standalone compaction request appears chronologically in its own `Between turns` section, while a numbered compaction remains inside its owning turn. Long ledgers open at the current tail, load one older page when the user reaches the loaded range's top, and mount only the visible row window plus a small overscan; request-only separators share the next measurable virtual item, while semantic row keys and ARIA indexes survive prepends. Selection, timeline navigation, folding, search, and Request totals cover the currently loaded window. The ledger covers records with an explicit loading row until the initial tail is positioned. While an older prefix remains unloaded, a first-row control precedes the loaded records, loads one earlier page on click, and changes in place to a disabled loading status while that page is pending. A fixed Overview above the ledger projects real record start/duration timing from left to right; when earlier records remain unloaded and the viewport includes the loaded domain's start, a neutral ellipsis control identifies the omitted prefix and loads one earlier page without assigning unknown history fabricated duration. Assistant spans divide recorded TTFT from decoding, and a 500 ms hover reveals exact clock and duration details. Dragging an interval focuses the ledger on every record active at any point in that inclusive range, while clearing the selection restores the full loaded ledger. Wheel gestures zoom the time domain. A right-button click clears the selected interval, while a right-button drag pans an already zoomed viewport without changing it. The initial view and streaming updates stay at the tail; scrolling upward suspends following so new records do not interrupt inspection of earlier rows. Content-only stream frames preserve virtual row keys and heights, reuse measurements, and do not issue repeated tail-scroll writes. Completed replies retain assembled blocks, timing, and usage in Trajectory target State, while the shared Session window keeps the raw Events. Trajectory asks the conversation shell to float the composer over the full-height ledger, while its responsive vertical scrollers reserve the composer's live height so final rows remain reachable. Trajectory-owned Definitions assemble business records, including cancellation-frozen Assistant and Tool records, from the shared Session window, so Trajectory neither reads nor changes the Chat conversation snapshot. The package provides no service and declares no Context merge; it registers target-specific Event Definitions, a Trajectory view builder, and one tab in the conversation's `'conversation.view'` slot ring. Contract: api-contracts v3 §8. ## Model Experience diff --git a/packages/client/ui-trajectory/README.zh.md b/packages/client/ui-trajectory/README.zh.md index b3bc88d8ab..df7661ef7d 100644 --- a/packages/client/ui-trajectory/README.zh.md +++ b/packages/client/ui-trajectory/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -Trajectory 渲染按轮次组织的事件记录表,其中可选择用户、助手、工具和嵌套子工具记录。较粗的分割线标示轮次边界,紧凑的行内标记标识步骤,主记录表仅保留索引、事件和内容;选择记录则会打开局部检查器,查看 token 用量、耗时、输入、输出和计时。可滚动的概述区域默认保持滚动条滑块透明,直到鼠标悬停该区域或其中包含键盘焦点时才显示,同时不改变滚动条预留的几何空间。独立运行的压缩(compaction)请求会按时间顺序显示在自己的 `Between turns` 区段中,而带编号的压缩仍位于其所属轮次内。长记录表打开时定位于当前尾部,用户到达已加载范围顶部时加载一页更早的历史,并且只挂载可见行窗口和少量额外缓冲行;仅含请求的分隔行并入下一个具备可测高度的虚拟项,语义行键和 ARIA 索引在向前补页后保持不变。选择、时间线导航、折叠、搜索和请求汇总只覆盖当前已加载的窗口。初始尾部完成定位前以及更早页面的加载尚未完成时,记录表会用明确的加载行遮住真实记录。固定在记录表上方的 Overview 区域从左到右投影记录的真实开始时间与耗时;仍有更早记录未加载且 viewport 包含已加载时间域起点时,中性的省略号控件会标识被省略的前缀,并可加载一页更早历史,而不会为未知部分虚构耗时。助手时间条会区分记录到的 TTFT 与解码时间,悬停 500 ms 后可查看精确时刻和耗时详情。拖选一个区间会将记录表聚焦到活动区间与该闭区间有重叠的所有记录,清除选择则恢复完整的已加载记录表。滚轮手势用于缩放时间域。右键单击会清除所选区间;在已放大的 viewport 上按住右键拖动则只会平移视图,不会改变该区间。初始视图和流式更新都会停留在尾部;向上滚动会暂停跟随,因此新记录不会打断对旧记录的检查。仅含内容更新的流式帧会保持虚拟行的键和高度不变、复用测量结果,并且不会重复写入末尾滚动位置。已完成的回复会在 Trajectory target State 中保留组装后的 blocks、计时与用量,共享 Session 窗口则保留原始 Event。Trajectory 要求会话壳将 composer 作为浮层置于全高记录表上方;其响应式纵向滚动容器会预留 composer 的实时高度,确保仍可滚动到最后几行。Trajectory 自有的 Definition 从共享 Session 窗口组装业务记录,其中包括因取消而冻结的助手和工具记录,因此 Trajectory 既不读取也不改变 Chat 会话快照。该包不提供 service,也不声明 Context 合并;它会注册 target 专属 Event Definition、Trajectory view builder,以及会话 `'conversation.view'` slot 环中的一个视图标签页。约定:api-contracts v3 §8。 +Trajectory 渲染按轮次组织的事件记录表,其中可选择用户、助手、工具和嵌套子工具记录。较粗的分割线标示轮次边界,紧凑的行内标记标识步骤,主记录表仅保留索引、事件和内容;选择记录则会打开局部检查器,查看 token 用量、耗时、输入、输出和计时。可滚动的概述区域默认保持滚动条滑块透明,直到鼠标悬停该区域或其中包含键盘焦点时才显示,同时不改变滚动条预留的几何空间。独立运行的压缩(compaction)请求会按时间顺序显示在自己的 `Between turns` 区段中,而带编号的压缩仍位于其所属轮次内。长记录表打开时定位于当前尾部,用户到达已加载范围顶部时加载一页更早的历史,并且只挂载可见行窗口和少量额外缓冲行;仅含请求的分隔行并入下一个具备可测高度的虚拟项,语义行键和 ARIA 索引在向前补页后保持不变。选择、时间线导航、折叠、搜索和请求汇总只覆盖当前已加载的窗口。初始尾部完成定位前,记录表会用明确的加载行遮住真实记录。更早的前缀仍未加载时,已加载记录前会始终保留首行控件;单击它会加载一页更早的历史,页面加载期间则会原地变为禁用的加载状态。固定在记录表上方的 Overview 区域从左到右投影记录的真实开始时间与耗时;仍有更早记录未加载且 viewport 包含已加载时间域起点时,中性的省略号控件会标识被省略的前缀,并可加载一页更早历史,而不会为未知部分虚构耗时。助手时间条会区分记录到的 TTFT 与解码时间,悬停 500 ms 后可查看精确时刻和耗时详情。拖选一个区间会将记录表聚焦到活动区间与该闭区间有重叠的所有记录,清除选择则恢复完整的已加载记录表。滚轮手势用于缩放时间域。右键单击会清除所选区间;在已放大的 viewport 上按住右键拖动则只会平移视图,不会改变该区间。初始视图和流式更新都会停留在尾部;向上滚动会暂停跟随,因此新记录不会打断对旧记录的检查。仅含内容更新的流式帧会保持虚拟行的键和高度不变、复用测量结果,并且不会重复写入末尾滚动位置。已完成的回复会在 Trajectory target State 中保留组装后的 blocks、计时与用量,共享 Session 窗口则保留原始 Event。Trajectory 要求会话壳将 composer 作为浮层置于全高记录表上方;其响应式纵向滚动容器会预留 composer 的实时高度,确保仍可滚动到最后几行。Trajectory 自有的 Definition 从共享 Session 窗口组装业务记录,其中包括因取消而冻结的助手和工具记录,因此 Trajectory 既不读取也不改变 Chat 会话快照。该包不提供 service,也不声明 Context 合并;它会注册 target 专属 Event Definition、Trajectory view builder,以及会话 `'conversation.view'` slot 环中的一个视图标签页。约定:api-contracts v3 §8。 ## 模型体验 diff --git a/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css b/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css index b1d9be9930..49736e81a5 100644 --- a/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css +++ b/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css @@ -55,6 +55,40 @@ animation: history-loading-spin 700ms linear infinite; } +.table tbody .historyLoadRow td { + height: 30px; + padding: 0; + border-bottom-color: var(--dsw-alias-border-l2); +} + +.historyLoadButton { + display: flex; + width: 100%; + height: 29px; + align-items: center; + justify-content: center; + gap: 6px; + border: 0; + background: var(--dsw-alias-bg-layer-1); + color: var(--dsw-alias-label-secondary); + cursor: pointer; + font: var(--dsw-font-xxs-12); +} + +.historyLoadButton:hover:not(:disabled) { + background: var(--dsw-alias-interactive-bg-hover); + color: var(--dsw-alias-label-primary); +} + +.historyLoadButton:focus-visible { + outline: 2px solid var(--dsw-alias-state-business-primary); + outline-offset: -2px; +} + +.historyLoadButton:disabled { + cursor: default; +} + .table:not([data-scroll-ready='true']) { visibility: hidden; } @@ -137,7 +171,7 @@ border: 0; } -.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]) { +.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]):not([data-history-load]) { cursor: default; outline: none; transition: @@ -149,7 +183,7 @@ opacity: 0.24; } -.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]):not([data-selected='true']):hover { +.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]):not([data-history-load]):not([data-selected='true']):hover { background: var(--dsw-alias-interactive-bg-hover); } diff --git a/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx b/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx index 5d2d4d8e31..1a3e616ca4 100644 --- a/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx +++ b/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx @@ -364,6 +364,8 @@ export interface TrajectoryTableProps { recordFocus?: { readonly index: number } | null /** Whether the initial history tail is still loading. */ historyLoading?: boolean + /** Whether another surface is loading one older history page. */ + olderHistoryLoading?: boolean /** First loaded raw event, used to preserve scroll position after prepending a page. */ historyStartSeq?: number | undefined /** Whether one older history page can be requested. */ @@ -1698,6 +1700,7 @@ export function TrajectoryTable({ recordSelection = null, recordFocus = null, historyLoading = false, + olderHistoryLoading = false, historyStartSeq, hasOlderRecords = false, onLoadOlder, @@ -2123,12 +2126,13 @@ export function TrajectoryTable({ virtualIndexByRecordId, virtualizationEnabled, ]) - const requestOlder = useCallback((pane: HTMLDivElement) => { + const requestOlder = useCallback((pane: HTMLDivElement, requireTop: boolean) => { if ( !hasOlderRecords || onLoadOlder === undefined || loadingOlder.current - || pane.scrollTop > OLDER_LOAD_THRESHOLD_PX + || olderHistoryLoading + || (requireTop && pane.scrollTop > OLDER_LOAD_THRESHOLD_PX) ) return loadingOlder.current = true setOlderLoading(true) @@ -2143,7 +2147,7 @@ export function TrajectoryTable({ loadingOlder.current = false setOlderLoading(false) }) - }, [hasOlderRecords, historyStartSeq, onLoadOlder]) + }, [hasOlderRecords, historyStartSeq, olderHistoryLoading, onLoadOlder]) useLayoutEffect(() => { const pane = tablePaneRef.current if (pane === null) return @@ -2176,10 +2180,9 @@ export function TrajectoryTable({ virtualizationEnabled, ]) - const loadingLabel = olderLoading - ? 'Loading earlier history…' - : 'Loading trajectory…' - const showLoading = historyLoading || olderLoading || !tableScrollReady + const olderBusy = olderHistoryLoading || olderLoading + const showInitialLoading = historyLoading || !tableScrollReady + const historyRowOffset = hasOlderRecords ? 1 : 0 return (
@@ -2192,30 +2195,55 @@ export function TrajectoryTable({ followsTableTail.current = pane.scrollHeight - pane.clientHeight - pane.scrollTop <= BOTTOM_FOLLOW_THRESHOLD_PX - requestOlder(pane) + requestOlder(pane, true) }} onClick={(event) => { if (event.target === event.currentTarget) clearAllSelections() }} > - {showLoading && ( + {showInitialLoading && (
)} + {hasOlderRecords && ( + + + + )} {virtualTop > 0 && ( {hasOlderRecords && ( - + diff --git a/packages/client/ui-trajectory/tests/table.client.spec.tsx b/packages/client/ui-trajectory/tests/table.client.spec.tsx index 7e146cee12..467da8088a 100644 --- a/packages/client/ui-trajectory/tests/table.client.spec.tsx +++ b/packages/client/ui-trajectory/tests/table.client.spec.tsx @@ -418,7 +418,9 @@ describe('TrajectoryTable', () => { await waitFor(() => { expect(onLoadOlder).toHaveBeenCalledOnce() }) expect(screen.getByRole('status').textContent).toContain('Loading earlier history…') resolveOlder?.(true) - await waitFor(() => { expect(screen.queryByRole('status')).toBeNull() }) + await waitFor(() => { + expect(screen.getByRole('status').textContent).toBe('') + }) scrollHeight = 260 view.rerender( { const table = screen.getByRole('table') const loadButton = screen.getByRole('button', { name: 'Load earlier history' }) - expect(table.querySelector('tbody > tr:first-child')?.contains(loadButton)).toBe(true) + const loadRow = table.querySelector('tbody > tr:first-child') + expect(loadRow?.contains(loadButton)).toBe(true) + expect(loadRow?.getAttribute('aria-rowindex')).toBe('1') + expect(screen.getByRole('status').textContent).toBe('') expect(table.getAttribute('aria-rowcount')).toBe('4') expect((await screen.findByRole('row', { name: /ASSISTANT/ })).getAttribute('aria-rowindex')) .toBe('2') From 8502a38cb6fd5d816b8fe263bf99a62686575d87 Mon Sep 17 00:00:00 2001 From: "jy.ding" Date: Thu, 13 Aug 2026 14:40:28 +0800 Subject: [PATCH 036/103] docs: add localized community channels --- README.i18n.yaml | 4 ++-- README.md | 2 ++ README.zh.md | 17 +++++++++++++++++ assets/community-wechat-official-account.png | Bin 0 -> 156490 bytes assets/community-wecom-assistant.png | Bin 0 -> 26676 bytes 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 assets/community-wechat-official-account.png create mode 100644 assets/community-wecom-assistant.png diff --git a/README.i18n.yaml b/README.i18n.yaml index 573a3ffedb..ee4bfdf7f1 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 646262f0b8317a48cab9aa84bab87b7a2b8e85ec -README.zh.md: 892da6f48cd8b60dd61332ec412f604a8062b27d +README.md: b1d84d6ebd20843f6c2e3b7ccd22cccb2df0d104 +README.zh.md: a3960d3d342d005230f8a40e5c43d4bac882cb7a diff --git a/README.md b/README.md index 646262f0b8..b1d84d6ebd 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ pnpm dsh web - Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions). - Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability. +

Join DeepSeek Harness Discord community.

+ ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md). diff --git a/README.zh.md b/README.zh.md index 892da6f48c..a3960d3d34 100644 --- a/README.zh.md +++ b/README.zh.md @@ -39,6 +39,23 @@ pnpm dsh web - 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。 - 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。 +
+ +
+ + + + + + + + + + + + + + +
企微小助手入群问卷微信公众号
DeepSeek Harness 企微小助手二维码DeepSeek Harness 入群问卷二维码DeepSeek Harness 团队微信公众号二维码
+ ## 参与贡献 参见 [CONTRIBUTING.md](CONTRIBUTING.md)。 diff --git a/assets/community-wechat-official-account.png b/assets/community-wechat-official-account.png new file mode 100644 index 0000000000000000000000000000000000000000..32e36e34797a075d1118299bc772bf390c000761 GIT binary patch literal 156490 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 N?;Y$F@vk?-zEvj^J`AhQirHis&0WUh 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 literal 0 HcmV?d00001 diff --git a/assets/community-wecom-assistant.png b/assets/community-wecom-assistant.png new file mode 100644 index 0000000000000000000000000000000000000000..71fc1aba61f49f7183ce0ee292daf81c16b62074 GIT binary patch literal 26676 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 literal 0 HcmV?d00001 From 6cbf927e0a3abe215315799cc404d78cb5b3d544 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 14:54:15 +0800 Subject: [PATCH 037/103] fix(web): reject unsupported wildcard host --- apps/cli/reference/README.i18n.yaml | 4 ++-- apps/cli/reference/README.md | 2 +- apps/cli/reference/README.zh.md | 2 +- packages/bundle/web-app/README.i18n.yaml | 4 ++-- packages/bundle/web-app/README.md | 2 +- packages/bundle/web-app/README.zh.md | 2 +- packages/bundle/web-app/src/startup.ts | 12 +++++++----- packages/bundle/web-app/tests/startup.spec.ts | 12 ++++++++++-- 8 files changed, 25 insertions(+), 15 deletions(-) diff --git a/apps/cli/reference/README.i18n.yaml b/apps/cli/reference/README.i18n.yaml index 02938478cc..b62de584e2 100644 --- a/apps/cli/reference/README.i18n.yaml +++ b/apps/cli/reference/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/reference/README.md -README.md: 0b23db293c304807b5959f5eae9a2faf868caa62 -README.zh.md: d812c7cd0d1efaa69b135925f3e922668539781b +README.md: 0be64fdfc0ad4e81d23f25a26881fa89f37565b0 +README.zh.md: 649bf15df814abf4875fed794c2e76c494bfcc25 diff --git a/apps/cli/reference/README.md b/apps/cli/reference/README.md index 0b23db293c..0be64fdfc0 100644 --- a/apps/cli/reference/README.md +++ b/apps/cli/reference/README.md @@ -61,7 +61,7 @@ dsh web --dump-config dsh web --help ``` -The production Web runner needs built package and frontend artifacts (`pnpm run build`). It serves `http://127.0.0.1:3080` by default. Binding all interfaces also trusts the machine's discovered LAN IP literals; `--trusted-host` adds named authorities accepted by the `/api` browser-trust fence. +The production Web runner needs built package and frontend artifacts (`pnpm run build`). It serves `http://127.0.0.1:3080` by default. The CLI intentionally does not support `--host 0.0.0.0` yet and exits with a usage error; `--trusted-host` adds named authorities accepted by the `/api` browser-trust fence. Process shutdown gives the plugin tree up to five seconds to dispose. The first `SIGINT`/`SIGTERM` starts that graceful drain — `SIGTERM` is a supervisor's ordinary stop request and exits 0 on every surface, `SIGINT` reports 130; a second signal forces immediate exit. If one-shot normal completion is already stuck in disposal, the first `Ctrl+C` is the escalation and exits immediately instead of being swallowed. diff --git a/apps/cli/reference/README.zh.md b/apps/cli/reference/README.zh.md index d812c7cd0d..649bf15df8 100644 --- a/apps/cli/reference/README.zh.md +++ b/apps/cli/reference/README.zh.md @@ -61,7 +61,7 @@ dsh web --dump-config dsh web --help ``` -生产 Web 运行器需要已构建的包和前端产物(`pnpm run build`)。默认服务地址是 `http://127.0.0.1:3080`。绑定所有网络接口时,还会信任机器自动发现的 LAN IP 字面量;`--trusted-host` 可添加 `/api` 浏览器信任围栏接受的具名 authority。 +生产 Web 运行器需要已构建的包和前端产物(`pnpm run build`)。默认服务地址是 `http://127.0.0.1:3080`。CLI 目前有意不支持 `--host 0.0.0.0`,并会以用法错误退出;`--trusted-host` 可添加 `/api` 浏览器信任围栏接受的具名 authority。 进程关闭时,插件树最多有 5 秒完成 dispose。首次收到 `SIGINT` 或 `SIGTERM` 时会开始优雅排空:`SIGTERM` 是监督进程发出的常规停止请求,在所有运行模式下都以 0 退出;`SIGINT` 则报告 130。第二次收到信号时会立即强制退出。如果一次性运行在正常结束时已经卡在 dispose 阶段,第一次按下 `Ctrl+C` 就会直接升级为强制退出,而不会被忽略。 diff --git a/packages/bundle/web-app/README.i18n.yaml b/packages/bundle/web-app/README.i18n.yaml index 45da05fcf3..220b4d78ff 100644 --- a/packages/bundle/web-app/README.i18n.yaml +++ b/packages/bundle/web-app/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/bundle/web-app/README.md -README.md: 3f7fbe7bbbeba2ee753ab2dfa8c945e798dd6a02 -README.zh.md: 357ca9946ed7fef1bf4c691c6666156bb293b5e0 +README.md: 90d1566b5a7a25f6a827079c4a8ab776e05cc7a3 +README.zh.md: b7156bcab66b53964bb2f0e1c87d9e9a806e3f75 diff --git a/packages/bundle/web-app/README.md b/packages/bundle/web-app/README.md index 3f7fbe7bbb..90d1566b5a 100644 --- a/packages/bundle/web-app/README.md +++ b/packages/bundle/web-app/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -The dsh browser-surface bundle. [`cordis.patch.yml`](cordis.patch.yml) rides over [`dsh-base`](../base/README.md): it sets the coding persona, inserts the Web host rows (webserver, API gateway, workspace, projection cache, storage) and the browser plugin roster, the always-on client-plugin reload chain ([`dsh-client-hmr`](../../client/hmr/README.md), idle until a rebuild watcher rewrites client bundles), and mounts this package's `web-runtime` glue plugin (config `{printUrl, surfaceContext, trustedHosts}`). That plugin resolves the built frontend dist through `@deepseek-ai/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, provides it as `webRuntime` to the browser-trust fence and client roster, mounts the [`frontend-static`](../../host/frontend-static/README.md) fallback owner, registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true, and prints the `dsh web:` URL line when `printUrl` is true, after its Loader tree settles so a sibling failure cannot announce a dead app. This bundle also owns the app command line: the ordinary `web-startup` provider ([`src/startup.ts`](src/startup.ts)) injects `ctx.cmdlineArgs` ([`dsh-cmdline`](../../boot/cmdline/README.md)), parses `--host`, `--port`, repeatable `--trusted-host`, and the app's `--help`, then provides `webStartup`. Flag-configured rows inject that service and read it directly from lazy config, so nothing binds a port before argument resolution and `dsh --profile web --help` starts no server. [`dsh-headless`](../headless/README.md) is a sibling surface over the same base and does not mount this bundle. +The dsh browser-surface bundle. [`cordis.patch.yml`](cordis.patch.yml) rides over [`dsh-base`](../base/README.md): it sets the coding persona, inserts the Web host rows (webserver, API gateway, workspace, projection cache, storage) and the browser plugin roster, the always-on client-plugin reload chain ([`dsh-client-hmr`](../../client/hmr/README.md), idle until a rebuild watcher rewrites client bundles), and mounts this package's `web-runtime` glue plugin (config `{printUrl, surfaceContext, trustedHosts}`). That plugin resolves the built frontend dist through `@deepseek-ai/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, provides it as `webRuntime` to the browser-trust fence and client roster, mounts the [`frontend-static`](../../host/frontend-static/README.md) fallback owner, registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true, and prints the `dsh web:` URL line when `printUrl` is true, after its Loader tree settles so a sibling failure cannot announce a dead app. This bundle also owns the app command line: the ordinary `web-startup` provider ([`src/startup.ts`](src/startup.ts)) injects `ctx.cmdlineArgs` ([`dsh-cmdline`](../../boot/cmdline/README.md)), parses `--host`, `--port`, repeatable `--trusted-host`, and the app's `--help`, then provides `webStartup`. It rejects `--host 0.0.0.0` before publishing that service because the CLI intentionally does not support all-interfaces binding yet. Flag-configured rows inject the service and read it directly from lazy config, so nothing binds a port before argument resolution and `dsh --profile web --help` starts no server. [`dsh-headless`](../headless/README.md) is a sibling surface over the same base and does not mount this bundle. ## Model Experience diff --git a/packages/bundle/web-app/README.zh.md b/packages/bundle/web-app/README.zh.md index 357ca9946e..b7156bcab6 100644 --- a/packages/bundle/web-app/README.zh.md +++ b/packages/bundle/web-app/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -dsh 浏览器表层组合包。[`cordis.patch.yml`](cordis.patch.yml) 叠加在 [`dsh-base`](../base/README.md) 之上:设置 coding persona,插入 Web 宿主行(webserver、API 网关、workspace、投影缓存、存储)、浏览器插件名录与始终挂载的客户端插件重载链([`dsh-client-hmr`](../../client/hmr/README.md),在重建 watcher 改写客户端 bundle 之前保持空闲),并挂载本包的 `web-runtime` 粘合插件(配置为 `{printUrl, surfaceContext, trustedHosts}`)。该插件通过 `@deepseek-ai/dsh-web-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息并将其作为 `webRuntime` 提供给浏览器信任栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席位所有者,在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量,并在 `printUrl` 为 true 时等自身的 Loader 配置树结算后再打印 `dsh web:` URL 行,避免兄弟行失败时公告一个已失效的应用。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解析 `--host`、`--port`、可重复的 `--trusted-host` 以及应用自己的 `--help`,再提供 `webStartup`。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.md) 是同一 base 之上的同级表层,不挂载本组合包。 +dsh 浏览器表层组合包。[`cordis.patch.yml`](cordis.patch.yml) 叠加在 [`dsh-base`](../base/README.md) 之上:设置 coding persona,插入 Web 宿主行(webserver、API 网关、workspace、投影缓存、存储)、浏览器插件名录与始终挂载的客户端插件重载链([`dsh-client-hmr`](../../client/hmr/README.md),在重建 watcher 改写客户端 bundle 之前保持空闲),并挂载本包的 `web-runtime` 粘合插件(配置为 `{printUrl, surfaceContext, trustedHosts}`)。该插件通过 `@deepseek-ai/dsh-web-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息并将其作为 `webRuntime` 提供给浏览器信任栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席位所有者,在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量,并在 `printUrl` 为 true 时等自身的 Loader 配置树结算后再打印 `dsh web:` URL 行,避免兄弟行失败时公告一个已失效的应用。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解析 `--host`、`--port`、可重复的 `--trusted-host` 以及应用自己的 `--help`,再提供 `webStartup`。它会在发布该服务前拒绝 `--host 0.0.0.0`,因为 CLI 目前有意不支持绑定所有网络接口。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.md) 是同一 base 之上的同级表层,不挂载本组合包。 ## 模型体验 diff --git a/packages/bundle/web-app/src/startup.ts b/packages/bundle/web-app/src/startup.ts index 2aaf89a742..26aa17eb46 100644 --- a/packages/bundle/web-app/src/startup.ts +++ b/packages/bundle/web-app/src/startup.ts @@ -45,28 +45,30 @@ function webCommand(): Command { .name('dsh --profile web') .description('Serve the DeepSeek Harness browser UI.') .helpOption('-h, --help', 'show this help') - .option('--host ', 'bind host; pass 0.0.0.0 to reach it from another machine') + .option('--host ', 'bind host') .option('--port ', 'listen port; pass 0 to let the OS pick a free one') .option('--trusted-host ', 'extra authority the /api browser-trust fence accepts (host or host:port; repeatable)') .addHelpText('after', ` Examples: dsh --profile web serve on the composed host and port dsh --profile web --port 8080 serve on another port - dsh --profile web --host 0.0.0.0 reach it from another machine on the LAN `) } /** * Parse and provide the Web invocation as an ordinary Cordis service. The - * command's action publishes the flags this invocation named; a non-numeric - * `--port` is a usage error, so on rejection (and on `--help`) nothing is - * provided. + * command's action publishes the flags this invocation named; an unsupported + * `--host` or non-numeric `--port` is a usage error, so on rejection (and on + * `--help`) nothing is provided. * @param ctx - plugin context carrying the command line. */ export function apply(ctx: Context): void { const program = webCommand() program.action(() => { const options = program.opts() + if (options.host === '0.0.0.0') { + program.error('error: --host 0.0.0.0 is intentionally not supported yet; use 127.0.0.1 instead') + } if (options.port !== undefined && !/^\d+$/.test(options.port)) { program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`) } diff --git a/packages/bundle/web-app/tests/startup.spec.ts b/packages/bundle/web-app/tests/startup.spec.ts index a00405378a..29d02a423d 100644 --- a/packages/bundle/web-app/tests/startup.spec.ts +++ b/packages/bundle/web-app/tests/startup.spec.ts @@ -88,13 +88,13 @@ export const apply = ctx => globalThis.__webStartupApply(ctx) describe('web command-line provider', () => { it('publishes each flag and releases direct service expressions', async () => { const { values, observed } = await bootProvider([ - '--host', '0.0.0.0', + '--host', '127.0.0.1', '--port', '8080', '--trusted-host', 'lab.internal', 'lab-2.internal', '--trusted-host', '10.0.0.9', ]) expect(values).toEqual({ - host: '0.0.0.0', + host: '127.0.0.1', port: 8080, trustedHosts: ['lab.internal', 'lab-2.internal', '10.0.0.9'], }) @@ -128,4 +128,12 @@ describe('web command-line provider', () => { expect(observed.readerConfig).toBeUndefined() expect(observed.exits).toEqual([1]) }) + + it('rejects the intentionally unsupported all-interfaces host before the consumer activates', async () => { + const { values, observed } = await bootProvider(['--host', '0.0.0.0']) + expect(observed.out).toContain('--host 0.0.0.0 is intentionally not supported yet; use 127.0.0.1 instead') + expect(values).toBeUndefined() + expect(observed.readerConfig).toBeUndefined() + expect(observed.exits).toEqual([1]) + }) }) From 2be3e129650b65575f2d64c7eede6fa1115d5912 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Thu, 13 Aug 2026 15:09:21 +0800 Subject: [PATCH 038/103] fix(apiproxy): harden cold session metadata probing --- ...-bounded-cold-blank-verification.i18n.yaml | 4 +- ...6-08-13-bounded-cold-blank-verification.md | 12 ++-- ...8-13-bounded-cold-blank-verification.zh.md | 12 ++-- ...7-29-durable-last-activity-index.i18n.yaml | 4 +- .../2026-07-29-durable-last-activity-index.md | 4 +- ...26-07-29-durable-last-activity-index.zh.md | 4 +- docs/subsystems/session.i18n.yaml | 4 +- docs/subsystems/session.md | 2 +- docs/subsystems/session.zh.md | 2 +- packages/core/session/src/index.ts | 2 +- packages/core/session/src/repair.ts | 21 +----- packages/core/session/tests/repair.spec.ts | 43 +----------- packages/host/apiproxy/README.i18n.yaml | 4 +- packages/host/apiproxy/README.md | 4 +- packages/host/apiproxy/README.zh.md | 4 +- packages/host/apiproxy/src/api-proxy.ts | 56 +++++++++------- packages/host/apiproxy/src/api/sessions.ts | 20 +++--- .../apiproxy/tests/api-proxy-cold.spec.ts | 67 ++++++++++++++++++- 18 files changed, 138 insertions(+), 131 deletions(-) diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml index d57e57211b..2cd2577fc5 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md -2026-08-13-bounded-cold-blank-verification.md: 330f5acbd520487732bc72fe75f09496aaa0c028 -2026-08-13-bounded-cold-blank-verification.zh.md: 15c0d28be8c15f7076ac90a50bb023cc42fbbdd6 +2026-08-13-bounded-cold-blank-verification.md: bf8d167d742001ce65b3e96713a9603adb19603e +2026-08-13-bounded-cold-blank-verification.zh.md: 7cfef77a02308a8e75281877f8a774b41bb9559d diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md index 330f5acbd5..bf8d167d74 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md +++ b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md @@ -14,15 +14,15 @@ The same cold list used the JSONL artifact mtime for `updatedAt`. Opening a Sess `dsh-host-apiproxy` registers `sessionListMetadata`, a projection containing `blank` and `lastPromptAt`. The attached summary folds the same functions directly over the live log. `blank` changes only from true to false on `turn/start`; `lastPromptAt` changes only on a `user/message` whose source kind is `user`. -A cold summary trusts cached `blank: false`, because a checkpoint prefix containing `turn/start` remains non-blank. Cached `blank: true` and a cache miss do not prove the current log is blank. When persistence exposes a physical artifact through `locate()` and its size is at most `coldBlankProbeMaxBytes` (default 1 KiB per Session), the gateway calls `readFrom(id, 0)` and verifies whether the stored prefix contains `turn/start`. Files above the bound, backends without a location, vanished artifacts, and failed reads all produce `blank: false`, keeping the Session visible. +A cold summary trusts cached `blank: false`, because a checkpoint prefix containing `turn/start` remains non-blank. Cached `blank: true` and a cache miss do not prove the current log is blank. When persistence exposes a physical artifact through `locate()` and its observed size is at most the `coldBlankProbeMaxBytes` eligibility threshold (default 1 KiB per Session), the gateway calls `readFrom(id, 0)` and folds exact list metadata from the stored prefix. Files above the threshold, backends without a location, vanished artifacts, and failed reads all produce `blank: false`, keeping the Session visible. -`updatedAt` is the later of `createdAt` and `lastPromptAt`. A cold cache miss or stale checkpoint therefore orders the Session too old rather than promoting it from an unrelated file write. The bounded blank read does not replace missing recency metadata. +`updatedAt` is the later of `createdAt` and `lastPromptAt`. An eligible artifact read supplies exact `lastPromptAt` at no additional I/O cost; other cache misses or stale checkpoints order the Session too old rather than promoting it from an unrelated file write. After each asynchronous cold read, the gateway checks the live store again and replaces the cold result with an attached summary when another request resumed that Session meanwhile. ## Alternatives considered **Trust cached `blank: true`.** Rejected because the projection cache deliberately permits a persisted log to advance beyond its checkpoint. A crash or fail-soft write failure after the first `turn/start` would hide a real conversation and could make the client reuse it as New Session. -**Read every cold log.** Rejected because list latency and I/O would scale with total stored conversation bytes. The physical-size bound targets the small historical artifacts that can be checked cheaply and degrades larger unknowns toward visibility. +**Read every cold log.** Rejected because list latency and I/O would scale with total stored conversation bytes. The physical-size eligibility check targets small historical artifacts that can be checked cheaply and degrades larger unknowns toward visibility. It intentionally does not add a persistence operation solely to make the threshold atomic with the read: concurrent growth may increase one probe's read cost, but the additional events can only preserve visibility or change a blank result to non-blank. **Store blankness and recency in an authoritative persistence index.** Deferred because JSONL has an immutable first line and would require a second durable artifact with ordered updates, while SQLite would require a schema field. The broader exact-index design remains in the [last-activity proposal](../../proposed/architecture/2026-07-29-durable-last-activity-index.md). @@ -30,8 +30,8 @@ A cold summary trusts cached `blank: false`, because a checkpoint prefix contain ## Consequences -Existing small blank JSONL artifacts are hidden without depending on projection-cache availability, and a stale cache cannot hide a stored `turn/start`. A cold list may read each artifact whose physical size is within the configured bound when its cache does not already prove non-blank. The default bound applies to compressed bytes for the shipped Zstandard JSONL backend. +Existing small blank JSONL artifacts are hidden without depending on projection-cache availability, and a stale cache cannot hide a stored `turn/start`. A cold list may read each artifact whose observed physical size is within the configured threshold when its cache does not already prove non-blank. The default threshold compares compressed bytes for the shipped Zstandard JSONL backend. -Blank artifacts above the bound and blank Sessions on location-less backends remain visible. Missing or delayed recency cache entries fall back to `createdAt`. These are conservative degradations: the UI may show an extra empty row or order a Session too low, but it does not hide a conversation or promote one because it was merely opened. +Blank artifacts above the threshold and blank Sessions on location-less backends remain visible. Missing or delayed recency cache entries for artifacts that are not read fall back to `createdAt`. These are conservative degradations: the UI may show an extra empty row or order a Session too low, but it does not hide a conversation or promote one because it was merely opened. -The gateway-owned projection is an effect of the gateway fiber; unloading the gateway removes the key. Unit coverage pins exact-threshold probing, stale-true rejection, monotonic false reuse, fallback direction, human-prompt recency, and fiber disposal. A keyless Web snapshot boots the shipped compressed JSONL composition, seeds a small cold blank artifact without a cache row, and verifies that the sidebar omits it. +The gateway-owned projection is an effect of the gateway fiber; unloading the gateway removes the key. Unit coverage pins exact-threshold eligibility, stale-true rejection, monotonic false reuse, exact small-log recency, live-attachment races, fallback direction, human-prompt recency, and fiber disposal. A keyless Web snapshot boots the shipped compressed JSONL composition, seeds a small cold blank artifact without a cache row, and verifies that the sidebar omits it. diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md index 15c0d28be8..7cfef77a02 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md @@ -14,15 +14,15 @@ Web 会话树会隐藏空白 Session,并把当前选中的空白项复用为 N `dsh-host-apiproxy` 注册 `sessionListMetadata` 投影,其中包含 `blank` 与 `lastPromptAt`。已附加摘要直接用同一组函数折叠实时日志。`blank` 只在 `turn/start` 时从 true 单调变为 false;`lastPromptAt` 只在来源 kind 为 `user` 的 `user/message` 上更新。 -冷摘要信任缓存的 `blank: false`,因为已包含 `turn/start` 的 checkpoint 前缀会始终保持非空。缓存的 `blank: true` 和 cache miss 都无法证明当前日志为空。当 persistence 通过 `locate()` 暴露物理工件,且其大小不超过 `coldBlankProbeMaxBytes`(默认每个 Session 1 KiB)时,网关调用 `readFrom(id, 0)`,验证已存前缀是否含有 `turn/start`。超过上限的文件、不提供位置的后端、已消失的工件和读取失败都产生 `blank: false`,让 Session 保持可见。 +冷摘要信任缓存的 `blank: false`,因为已包含 `turn/start` 的 checkpoint 前缀会始终保持非空。缓存的 `blank: true` 和 cache miss 都无法证明当前日志为空。当 persistence 通过 `locate()` 暴露物理工件,且其观测大小不超过 `coldBlankProbeMaxBytes` 资格阈值(默认每个 Session 1 KiB)时,网关调用 `readFrom(id, 0)`,从已存前缀折叠精确列表元数据。超过阈值的文件、不提供位置的后端、已消失的工件和读取失败都产生 `blank: false`,让 Session 保持可见。 -`updatedAt` 取 `createdAt` 与 `lastPromptAt` 中较晚者。因此冷 cache miss 或陈旧 checkpoint 只会让 Session 排得偏旧,而不会因无关的文件写入被提升。有界 blank 读取不用于补齐缺失的最近时间元数据。 +`updatedAt` 取 `createdAt` 与 `lastPromptAt` 中较晚者。符合资格的工件读取无需额外 I/O 即可提供精确 `lastPromptAt`;其他 cache miss 或陈旧 checkpoint 只会让 Session 排得偏旧,而不会因无关的文件写入被提升。每次异步冷读取后,网关都会再次检查实时 store;若另一请求期间已恢复该 Session,则用已附加摘要替换冷结果。 ## Alternatives considered **信任缓存的 `blank: true`。** 拒绝,因为 projection cache 有意允许持久日志前进到 checkpoint 之后。首个 `turn/start` 之后若发生崩溃或 fail-soft 写入失败,真实对话就会被隐藏,客户端还可能把它复用为 New Session。 -**读取每一份冷日志。** 拒绝,因为列表延迟与 I/O 会随所有已存对话的总字节数增长。物理大小上限只针对能够低成本核验的小型历史工件,更大的未知项则向保持可见降级。 +**读取每一份冷日志。** 拒绝,因为列表延迟与 I/O 会随所有已存对话的总字节数增长。物理大小资格检查只针对能够低成本核验的小型历史工件,更大的未知项则向保持可见降级。该检查有意不为“让阈值与读取原子化”单独新增 persistence 操作:并发增长可能增加一次探测的读取成本,但新增事件只会保持可见,或把空白结果改为非空。 **把空白状态与最近时间存入权威 persistence index。** 暂缓,因为 JSONL 的首行不可变,需要增加带有顺序写入要求的第二份持久工件;SQLite 则需要 schema 字段。更广泛的精确索引设计仍由[最后活动提案](../../proposed/architecture/2026-07-29-durable-last-activity-index.md)负责。 @@ -30,8 +30,8 @@ Web 会话树会隐藏空白 Session,并把当前选中的空白项复用为 N ## Consequences -既有的小型空白 JSONL 工件无需依赖 projection cache 是否存在即可被隐藏,陈旧 cache 也无法隐藏已存的 `turn/start`。对于 cache 尚不能证明非空,且物理大小在配置上限内的每个 Session,冷列表可能读取其工件。对默认交付的 Zstandard JSONL 后端,该上限作用于压缩后的字节数。 +既有的小型空白 JSONL 工件无需依赖 projection cache 是否存在即可被隐藏,陈旧 cache 也无法隐藏已存的 `turn/start`。对于 cache 尚不能证明非空,且观测物理大小在配置阈值内的每个 Session,冷列表可能读取其工件。对默认交付的 Zstandard JSONL 后端,该阈值比较压缩后的字节数。 -超过上限的空白工件,以及来自不提供位置的后端的空白 Session 会保持可见。缺失或延迟的最近时间 cache 会回退到 `createdAt`。这些都是保守降级:UI 可能多显示一条空记录,或把 Session 排得偏低,但不会隐藏真实对话,也不会因为单纯打开而把会话提升到前面。 +超过阈值的空白工件,以及来自不提供位置的后端的空白 Session 会保持可见。对于未被读取的工件,缺失或延迟的最近时间 cache 会回退到 `createdAt`。这些都是保守降级:UI 可能多显示一条空记录,或把 Session 排得偏低,但不会隐藏真实对话,也不会因为单纯打开而把会话提升到前面。 -网关自有投影是网关 fiber 的 effect;卸载网关会移除该 key。单元覆盖固定了临界大小探测、拒绝陈旧 true、复用单调 false、回退方向、真人 prompt 最近时间和 fiber 销毁。无密钥 Web snapshot 会启动发行版的压缩 JSONL 组合,在没有 cache row 的情况下播种一份小型冷空白工件,并验证侧栏不展示它。 +网关自有投影是网关 fiber 的 effect;卸载网关会移除该 key。单元覆盖固定了临界大小资格、拒绝陈旧 true、复用单调 false、小日志精确最近时间、实时附加竞态、回退方向、真人 prompt 最近时间和 fiber 销毁。无密钥 Web snapshot 会启动发行版的压缩 JSONL 组合,在没有 cache row 的情况下播种一份小型冷空白工件,并验证侧栏不展示它。 diff --git a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml index d9e26b561d..e8355305ed 100644 --- a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml +++ b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md -2026-07-29-durable-last-activity-index.md: b530508877adf3a66b158ff659441c4179878d00 -2026-07-29-durable-last-activity-index.zh.md: 4c099bc835c4708fda09811fafd6dabb65dbb575 +2026-07-29-durable-last-activity-index.md: 99e50dd40b789db5d896cb7f9e25fa8893b02ae2 +2026-07-29-durable-last-activity-index.zh.md: e317fb192d53353295e6b52f631707ba6b400b66 diff --git a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md index b530508877..99e50dd40b 100644 --- a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md +++ b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md @@ -10,7 +10,7 @@ A cold (persisted, unattached) session has no authoritative stored answer to "wh The gateway previously used JSONL artifact mtime when available. mtime answers a different question: when the artifact was last written. Every durable write refreshes it, including a truncate-repair of a torn tail, synthetic closers that balance an interrupted turn, and the [`session/end-seed` boundary](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) appended during pickup. That approximation promoted a Session merely because it was opened. The [bounded cold blank verification](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) removed mtime ordering and accepted the cache's conservative "too old" failure direction as an interim tradeoff. -An attached summary can fold the live event log and select the latest human-authored `user/message`, but the cold path deliberately does not read large logs. Reading every log to compute `updatedAt` would make `list()` scale with total conversation bytes rather than Session count. The 1 KiB cold read introduced for blank verification does not solve recency: it is conditional, targets only small artifacts, and does not make large-log ordering exact. +An attached summary can fold the live event log and select the latest human-authored `user/message`, but the cold path deliberately does not read large logs. Reading every log to compute `updatedAt` would make `list()` scale with total conversation bytes rather than Session count. The 1 KiB cold read used for metadata verification makes eligible small-artifact recency exact, but it does not make large-log ordering exact. Making cold ordering exact remains a durable-format decision, which is why it is scoped here rather than in the gateway workaround. @@ -61,7 +61,7 @@ Three questions must be answered before implementation, and none of them is sett ## Related -- [Bounded cold blank verification](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) — removes mtime ordering, defines the interim projection-cache fallback, and limits direct cold reads to blankness checks. +- [Bounded cold blank verification](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) — removes mtime ordering, defines the interim projection-cache fallback, and limits direct cold reads to small-artifact metadata verification. - [The end-seed log boundary](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) — one of the non-prompt writes that made mtime unsuitable. - [Session persistence](../../implemented/architecture/2026-06-14-session-persistence.md) — the append-only and never-rewrite invariants that rule out a mutable JSONL header field. - [Shared persistence write coordinator](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md) — the append path a stored field would hook into. diff --git a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md index 4c099bc835..e317fb192d 100644 --- a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md +++ b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md @@ -10,7 +10,7 @@ Status: proposed 网关以前会在可用时采用 JSONL 产物的 mtime。mtime 回答的是另一件事:这份产物上次是什么时候被写入。每一次持久写入都会刷新它,包括对撕裂尾部的截断修复、平衡中断轮次的合成 closer,以及拾起时追加的 [`session/end-seed` 边界](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)。这套近似会让 Session 仅仅因为被打开就提升排序。[有界冷空白验证](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)移除了 mtime 排序,并把 cache 保守的「过旧」错误方向作为现阶段取舍。 -已附加摘要可以折叠实时事件日志并选择最新的真人 `user/message`,但冷路径有意不读取大日志。为计算 `updatedAt` 而读取每一份日志,会让 `list()` 的开销随对话总字节数而非 Session 数量增长。为空白验证引入的 1 KiB 冷读取并不能解决最近时间:它是条件式的,只针对小产物,也不能让大日志的排序精确。 +已附加摘要可以折叠实时事件日志并选择最新的真人 `user/message`,但冷路径有意不读取大日志。为计算 `updatedAt` 而读取每一份日志,会让 `list()` 的开销随对话总字节数而非 Session 数量增长。用于 metadata 验证的 1 KiB 冷读取可以让符合条件的小产物得到精确的最近时间,但不能让大日志的排序精确。 让冷排序变得精确仍是一项持久格式决策,因此其范围留在本文,而不是网关 workaround 中。 @@ -61,7 +61,7 @@ Status: proposed ## 相关 -- [有界冷空白验证](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)——移除 mtime 排序,定义 projection cache 的过渡回退,并把直接冷读取限制为空白检查。 +- [有界冷空白验证](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)——移除 mtime 排序,定义 projection cache 的过渡回退,并把直接冷读取限制为小产物 metadata 验证。 - [种子结束日志边界](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)——让 mtime 不适用的非 prompt 写入之一。 - [会话持久化](../../implemented/architecture/2026-06-14-session-persistence.md)——仅追加与绝不重写这两条不变式,正是它们排除了可变的 JSONL header 字段。 - [共享持久化写入协调器](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md)——一个已存储字段将挂入的那条追加路径。 diff --git a/docs/subsystems/session.i18n.yaml b/docs/subsystems/session.i18n.yaml index 8ee4185e54..d0e0ff2e32 100644 --- a/docs/subsystems/session.i18n.yaml +++ b/docs/subsystems/session.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/session.md -session.md: 4c40971fe58952b32635aa5eb767a42f73108b00 -session.zh.md: d958b03fcdad91b58cc277636e599cce46a2c7fb +session.md: 760a3042724472b5f518896b8ff0e56bcfec2799 +session.zh.md: 8c56029af5144569f1ab6df73a8fe2278f9ef5b4 diff --git a/docs/subsystems/session.md b/docs/subsystems/session.md index 4c40971fe5..760a304272 100644 --- a/docs/subsystems/session.md +++ b/docs/subsystems/session.md @@ -586,7 +586,7 @@ An explicitly supplied empty seed writes `session/end-seed` at seq 0, which dist It exists because seed history and live work are otherwise byte-identical, which defeats any plugin owning a standalone open/close bracket: an unmatched `compaction/start` reads the same whether the writer crashed mid-compaction or is compacting right now. An opening marker before `session/end-seed` came from the constructor seed and belongs to an ended lifecycle, whatever ended it (a crash, a succeeding process, or a fork out of a still-running parent), so its owner may treat it as dead. That covers only brackets *this* session inherited: a concurrently live session holding an open bracket over the same history has its own boundary elsewhere, so tolerating concurrent writers needs a liveness signal beyond the log. Core writes the boundary and reads nothing from it — a bracket's vocabulary stays with its owning plugin, which is why crash repair closes turn/step/tool boundaries and never `compaction/*`. -Activity ordering excludes the boundary through `lastActivityTime(events)`: picking a session up is not work, and lazy resume means browsing writes one, so a resume picker or session list ordering by log tail would float every opened session to the top. +Consumers that order Sessions by human activity exclude this boundary: picking a Session up is not work, so ordering by the log tail would float every opened Session to the top. ## Plugin-contributed log-only events diff --git a/docs/subsystems/session.zh.md b/docs/subsystems/session.zh.md index d958b03fcd..8c56029af5 100644 --- a/docs/subsystems/session.zh.md +++ b/docs/subsystems/session.zh.md @@ -590,7 +590,7 @@ interface TurnEndReasonMap { 它之所以必要,是因为种子历史与实时工作在字节层面完全相同,这会让任何拥有独立开/闭括号的插件失效:一个未配对的 `compaction/start`,无论写入方是在压缩中途崩溃、还是此刻正在压缩,读起来都一样。在 `session/end-seed` 之前的开启标记来自构造种子,并且属于一个已结束的生命周期,无论结束原因为何(崩溃、进程接替,或从仍在运行的父会话 fork 出来),因此其所有方可以视之为已死。这只覆盖*本*会话继承的括号:另一个并发存活的会话可能在同一段历史上持有开放括号,而它自己的边界在别处,因此容忍并发写入方还需要日志之外的存活信号。核心写入该边界但不从中读取任何内容——括号的词汇表仍归其所属插件,这也正是崩溃修复只关闭轮次/步骤/工具边界而从不处理 `compaction/*` 的原因。 -活动排序通过 `lastActivityTime(events)` 排除该边界:接手会话不算工作,而惰性恢复意味着浏览就会写入一个,因此按日志尾部排序的恢复选择器或会话列表会把每个打开过的会话顶到最前。 +按真人活动排序 Session 的消费方会排除该边界:接手 Session 不算工作,因此按日志尾部排序会把每个打开过的 Session 顶到最前。 ## 插件贡献的仅日志事件 diff --git a/packages/core/session/src/index.ts b/packages/core/session/src/index.ts index d2e72b4676..2d82a88623 100644 --- a/packages/core/session/src/index.ts +++ b/packages/core/session/src/index.ts @@ -26,7 +26,7 @@ export type { SessionPreparationOptions } from './preparation.ts' export type { AssistantMessage, ToolResultMessage, UserMessage } from '@deepseek-ai/dsh-llm' export { isJsonValue, snapshotJsonValue } from './json.ts' export type { JsonValue } from './json.ts' -export { interruptedTurnClosers, lastActivityTime, TOOL_NOT_STARTED, TOOL_OUTCOME_UNKNOWN } from './repair.ts' +export { interruptedTurnClosers, TOOL_NOT_STARTED, TOOL_OUTCOME_UNKNOWN } from './repair.ts' export { decodeStorageRecord, packChunkRuns } from './chunk-rows.ts' export type { ChunkRow, StorageRecord } from './chunk-rows.ts' export type { SessionSurface, SurfaceFoldReplacement, SurfaceFoldResult } from './surface.ts' diff --git a/packages/core/session/src/repair.ts b/packages/core/session/src/repair.ts index 1203bed341..d91cb72494 100644 --- a/packages/core/session/src/repair.ts +++ b/packages/core/session/src/repair.ts @@ -1,10 +1,7 @@ /** * Crash-recovery repair for an interrupted session log. It preserves a fully * written final turn and supplies the missing tool, step, and turn boundaries - * needed to resume with a provider-valid transcript, plus the activity-time - * read that must skip the end-seed boundary — which this module does - * not write (`Session`'s constructor does) but whose synthetic closers can - * inherit that boundary's timestamp, the one real coupling between the two. + * needed to resume with a provider-valid transcript. * @module @deepseek-ai/dsh-session/repair */ @@ -12,22 +9,6 @@ import { MessageId, freezeMessage, type CallId } from '@deepseek-ai/dsh-llm' import type { ToolResultMessage } from '@deepseek-ai/dsh-llm' import type { SessionEvent } from './types.ts' -/** - * The `time` of the log's last event representing actual work, skipping the - * `session/end-seed` boundary — picking a session up is not activity, so - * activity ordering must exclude it. - * - * Excluded by type, so a pickup time still leaks when a boundary is the last - * event of an open turn: {@link interruptedTurnClosers} copies it onto the - * synthetic `turn/end`, which this counts as work. Reachable only by seeding an - * unbalanced log directly — `load()` balances first. - * @param events - the log to scan, in seq order. - * @returns the latest non-boundary event's `time`, or undefined when there is none. - */ -export function lastActivityTime(events: readonly SessionEvent[]): number | undefined { - return events.findLast(event => event.type !== 'session/end-seed')?.time -} - /** Recovery code for an assistant tool request that never reached a recorded call start. */ export const TOOL_NOT_STARTED = 'TOOL_NOT_STARTED' diff --git a/packages/core/session/tests/repair.spec.ts b/packages/core/session/tests/repair.spec.ts index b656a7116c..941819c0af 100644 --- a/packages/core/session/tests/repair.spec.ts +++ b/packages/core/session/tests/repair.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import { CallId , createMessage, createToolResultMessage } from '@deepseek-ai/dsh-llm' -import { interruptedTurnClosers, lastActivityTime, TOOL_NOT_STARTED, TOOL_OUTCOME_UNKNOWN } from '../src/index.ts' +import { interruptedTurnClosers, TOOL_NOT_STARTED, TOOL_OUTCOME_UNKNOWN } from '../src/index.ts' import type { SessionEvent, SurfaceEvent } from '../src/index.ts' /** @@ -273,44 +273,3 @@ describe('interruptedTurnClosers', () => { expect(closers.map(e => e.type)).toEqual(['step/end', 'turn/end']) }) }) - -describe('lastActivityTime', () => { - const endSeedAt = (seq: number, time: number): SessionEvent => - ({ type: 'session/end-seed', seq, time, data: {} }) - - it('has no answer for an empty log', () => { - expect(lastActivityTime([])).toBeUndefined() - }) - - it('reports the log tail when no boundary is present', () => { - const events: SessionEvent[] = [ - userTurnStart(1, 0), - { type: 'turn/end', seq: 1, time: 500, data: { turn: 1, reason: { kind: 'completed' } } }, - ] - expect(lastActivityTime(events)).toBe(500) - }) - - it('skips a trailing boundary in favour of the last real work', () => { - const events: SessionEvent[] = [ - userTurnStart(1, 0), - { type: 'turn/end', seq: 1, time: 500, data: { turn: 1, reason: { kind: 'completed' } } }, - endSeedAt(2, 9_000), - ] - // Resumed long after the work, but never worked in again. - expect(lastActivityTime(events)).toBe(500) - }) - - it('reports work appended after end-seed', () => { - const events: SessionEvent[] = [ - userTurnStart(1, 0), - endSeedAt(1, 9_000), - { type: 'turn/end', seq: 2, time: 9_500, data: { turn: 1, reason: { kind: 'completed' } } }, - ] - expect(lastActivityTime(events)).toBe(9_500) - }) - - it('has no answer for a log of nothing but boundaries', () => { - // Unreachable via the constructor, but the projection is a pure function. - expect(lastActivityTime([endSeedAt(0, 1), endSeedAt(1, 2)])).toBeUndefined() - }) -}) diff --git a/packages/host/apiproxy/README.i18n.yaml b/packages/host/apiproxy/README.i18n.yaml index ea8d70c9e4..2ae197d230 100644 --- a/packages/host/apiproxy/README.i18n.yaml +++ b/packages/host/apiproxy/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/host/apiproxy/README.md -README.md: 518a7e5640bc62b493244a3d863cfea643386f7f -README.zh.md: 5692e9441d20d9dbec5d8a69263c875eb3f3f907 +README.md: b7dee9488c1b123172c225d4d4235bdb3c76911d +README.zh.md: 46835a84254c4bbc45300a18d29aae5a6ac66f14 diff --git a/packages/host/apiproxy/README.md b/packages/host/apiproxy/README.md index 518a7e5640..b7dee9488c 100644 --- a/packages/host/apiproxy/README.md +++ b/packages/host/apiproxy/README.md @@ -42,7 +42,7 @@ Pending queued input is a live control-plane contract, not conversation history. Background jobs ride the same live-push posture. When `ctx.jobs` is composed, the gateway subscribes to its change feed and broadcasts a whole `session/jobs` snapshot after every registry commit that alters what a session can see — registration, the stopping transition, settlement, and owner-disposal removal — plus a subscription baseline for each session that already has tasks (an absent baseline is the empty set; a change that empties a set still sends `[]`). A change carrying an owner reads through that exact `Agent`, so a push stays correct while its scope tears down; the baseline reads `ctx.agents.get(sessionId)`, which yields only unowned tasks for a session with no live Agent and never resumes a cold one. An unowned change fans out to every subscribed session, because unowned tasks are visible to every caller. The wire `JobView` drops `ownerSession`, `reported`, and `outputLimitBytes`: the frame's own `sessionId` carries the first, and the other two are internal notice and model-presentation policy. A composition without the registry emits no such frames. -Workspace and Session lists are separate reconnect baselines. `workspace.create({ path })` adopts an existing canonical directory and permits basename-derived titles to repeat. `workspace.insertBefore({ workspaceId, beforeWorkspaceId? })` commits one registry-order move and answers the complete order; a pure reorder emits `host/workspace-order-changed` with that complete order, while unknown sources or anchors return `workspace-not-found`. `workspace.delete` removes only the Workspace registration, `session.create` accepts an optional preallocated Session id, and `host/workspace-changed`, `host/workspace-removed`, plus `host/session-added` carry committed increments in either arrival order. `workspace.archiveSession` adds one session to the registry-global archive set and answers the full updated set; `workspace.list` carries that set as the reconnect baseline and `host/archived-sessions-changed` pushes the full snapshot after every durable change. Archiving hides the session from grouping surfaces without touching its log or its workspace account; a session neither live nor persisted fails with `session-not-found`. Registration deletion preserves the directory and session logs; its Sessions remain in `session.list` and become Ungrouped. `SessionSummary.blank` and the `host/session-added` frame carry whether a turn has started: clients hide blank sessions and reuse them per workspace, flip blank on the first `host/session-status(running:true)`, and treat `session.list` as the reconnect authority. Attached summaries fold the live log. A cold summary trusts cached `blank: false`, but treats cached `true` and a cache miss as unverified; when `locate()` resolves an artifact no larger than `coldBlankProbeMaxBytes` (default 1 KiB), the gateway reads that Session with `readFrom()` and checks for `turn/start`. A larger, location-less, vanished, or unreadable artifact remains visible. `updatedAt` is the latest human `user/message` time from the live fold or projection cache, falling back to `createdAt`; pickup boundaries and other writes never promote a Session. +Workspace and Session lists are separate reconnect baselines. `workspace.create({ path })` adopts an existing canonical directory and permits basename-derived titles to repeat. `workspace.insertBefore({ workspaceId, beforeWorkspaceId? })` commits one registry-order move and answers the complete order; a pure reorder emits `host/workspace-order-changed` with that complete order, while unknown sources or anchors return `workspace-not-found`. `workspace.delete` removes only the Workspace registration, `session.create` accepts an optional preallocated Session id, and `host/workspace-changed`, `host/workspace-removed`, plus `host/session-added` carry committed increments in either arrival order. `workspace.archiveSession` adds one session to the registry-global archive set and answers the full updated set; `workspace.list` carries that set as the reconnect baseline and `host/archived-sessions-changed` pushes the full snapshot after every durable change. Archiving hides the session from grouping surfaces without touching its log or its workspace account; a session neither live nor persisted fails with `session-not-found`. Registration deletion preserves the directory and session logs; its Sessions remain in `session.list` and become Ungrouped. `SessionSummary.blank` and the `host/session-added` frame carry whether a turn has started: clients hide blank sessions and reuse them per workspace, flip blank on the first `host/session-status(running:true)`, and treat `session.list` as the reconnect authority. Attached summaries fold the live log. A cold summary trusts cached `blank: false`, but treats cached `true` and a cache miss as unverified; when `locate()` reports an artifact no larger than the `coldBlankProbeMaxBytes` eligibility threshold (default 1 KiB), the gateway reads that Session with `readFrom()` and folds both blankness and the latest human prompt. A larger, location-less, vanished, or unreadable artifact remains visible. After an asynchronous cold read, a Session that attached meanwhile is summarized from its live log instead. `updatedAt` uses the live fold, the exact small-artifact fold, or the projection cache in that order, falling back to `createdAt`; pickup boundaries and other writes never promote a Session. `session.search` is a bounded content-search projection over the sessions visible through `session.list`. The gateway asks the optional `ctx.sessionQuery` service for globally ranked current-surface user, assistant, and steering matches, consumes that stream until it has at most 20 visible session/snippet pairs plus one lookahead, and revalidates every hit against the list-derived authorization set before returning it. Provider pages start at 20 hits; when a first-page request rejects that limit, the gateway probes 10, 5, 2, then 1 and retains the learned size for continuation and stale-generation restarts. Returned snippets contain at most 240 Unicode code points, and the response schema independently enforces that bound at each client boundary. Keeping the authorization set in Host memory avoids SQLite's variable ceiling for large valid corpora without weakening visibility or ranking. @@ -80,4 +80,4 @@ None; this package neither assembles nor sends a provider request. - **No protocol version field** — client and host ship together; `host.describe` gains a version negotiation field only when an independently released client exists. - **Search failures include provider diagnostics** — the gateway is a single-user local service. A carrier that exposes it to multiple users must replace internal search details with a public-safe diagnostic. - **Linux native picker requires desktop tooling** — under the `native` capability, `host.pickDirectory` reports an actionable error when neither Zenity nor KDialog is installed; the browse backend is the composition-level fallback (see the [native backend README](../directory-picker-native/README.md)). -- **Cold-list hints degrade only toward visibility and older ordering** — a projection-cache miss or stale `lastPromptAt` falls back to `createdAt`, so a recently worked Session may sort too low until the next checkpoint. A blank artifact larger than `coldBlankProbeMaxBytes`, or one from a backend without `locate()`, remains visible because the gateway cannot verify the absence of `turn/start` within the read bound. The [bounded blank-verification decision](../../../.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) owns this safety direction; an authoritative exact recency index remains scoped in the [last-activity-index proposal](../../../.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md). +- **Cold-list hints degrade only toward visibility and older ordering** — a projection-cache miss or stale `lastPromptAt` falls back to `createdAt` unless an eligible small artifact supplies an exact fold, so a recently worked large Session may sort too low until the next checkpoint. A blank artifact larger than `coldBlankProbeMaxBytes`, or one from a backend without `locate()`, remains visible. The threshold is checked before `readFrom()` rather than enforced by persistence, so concurrent artifact growth may increase one probe's read cost without changing blankness safety. The [bounded blank-verification decision](../../../.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) owns this safety direction; an authoritative exact recency index remains scoped in the [last-activity-index proposal](../../../.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md). diff --git a/packages/host/apiproxy/README.zh.md b/packages/host/apiproxy/README.zh.md index 5692e9441d..46835a8425 100644 --- a/packages/host/apiproxy/README.zh.md +++ b/packages/host/apiproxy/README.zh.md @@ -42,7 +42,7 @@ Settings 分节中的 `reasoningEffort` 在 agent-default-model 插件配置中 后台任务沿用同一种实时推送姿态。当组合中有 `ctx.jobs` 时,网关订阅它的变更订阅,并在注册表每一次改变某个会话可见内容的提交后——注册、转入 stopping、结算,以及 owner 销毁时的移除——广播一份完整的 `session/jobs` 快照,另外为每个已经有任务的会话发送订阅 baseline(没有 baseline 即表示空集;把集合清空的那次变更仍然发送 `[]`)。带 owner 的变更通过那个确切的 `Agent` 读取,因此推送在其 scope 拆除期间依然正确;baseline 读 `ctx.agents.get(sessionId)`,对没有活体 Agent 的会话只得到无主任务,且绝不恢复冷会话。无主变更向每一个已订阅会话扇出,因为无主任务对所有调用方可见。线路上的 `JobView` 丢弃 `ownerSession`、`reported` 和 `outputLimitBytes`:第一个由帧自身的 `sessionId` 携带,另外两个分别是内部通知位和模型呈现策略。没有该注册表的组合不发出这类帧。 -Workspace 列表与 Session 列表是相互独立的重连基线。`workspace.create({ path })` 会接纳已有的规范目录,并允许由 basename 派生的标题重复。`workspace.insertBefore({ workspaceId, beforeWorkspaceId? })` 提交一次注册表顺序移动并应答完整顺序;单纯重排序会通过 `host/workspace-order-changed` 推送同一份完整顺序,而未知来源或锚点返回 `workspace-not-found`。`workspace.delete` 只移除 Workspace 注册记录,`session.create` 接受可选的预分配 Session id,`host/workspace-changed`、`host/workspace-removed` 与 `host/session-added` 则以任意到达顺序携带已提交的增量。`workspace.archiveSession` 向注册表级全局归档集合添加一个会话,并应答完整的更新后集合;`workspace.list` 携带该集合作为重连基线,`host/archived-sessions-changed` 在每次持久变更后推送完整快照。归档只把会话从各分组视图中隐藏,不触碰其日志和 workspace 记账;既非活动会话也未持久化的会话以 `session-not-found` 失败。删除注册记录会保留目录和会话日志;相关 Session 仍留在 `session.list` 中,并进入 Ungrouped。`SessionSummary.blank` 与 `host/session-added` 帧携带是否已开始过轮次:客户端隐藏空白会话并按 workspace 复用它们,在首个 `host/session-status(running:true)` 时翻转 blank,并以 `session.list` 作为重连权威。已附加摘要折叠实时日志。冷摘要信任缓存的 `blank: false`,但把缓存的 `true` 与 cache miss 都视为未经验证;当 `locate()` 解析出的工件不大于 `coldBlankProbeMaxBytes`(默认 1 KiB)时,网关通过 `readFrom()` 读取该 Session 并检查 `turn/start`。更大、无位置、已消失或不可读的工件保持可见。`updatedAt` 取实时折叠或投影缓存中的最新真人 `user/message` 时间,缺失时回退到 `createdAt`;拾起边界及其他写入都不会提升 Session 排序。 +Workspace 列表与 Session 列表是相互独立的重连基线。`workspace.create({ path })` 会接纳已有的规范目录,并允许由 basename 派生的标题重复。`workspace.insertBefore({ workspaceId, beforeWorkspaceId? })` 提交一次注册表顺序移动并应答完整顺序;单纯重排序会通过 `host/workspace-order-changed` 推送同一份完整顺序,而未知来源或锚点返回 `workspace-not-found`。`workspace.delete` 只移除 Workspace 注册记录,`session.create` 接受可选的预分配 Session id,`host/workspace-changed`、`host/workspace-removed` 与 `host/session-added` 则以任意到达顺序携带已提交的增量。`workspace.archiveSession` 向注册表级全局归档集合添加一个会话,并应答完整的更新后集合;`workspace.list` 携带该集合作为重连基线,`host/archived-sessions-changed` 在每次持久变更后推送完整快照。归档只把会话从各分组视图中隐藏,不触碰其日志和 workspace 记账;既非活动会话也未持久化的会话以 `session-not-found` 失败。删除注册记录会保留目录和会话日志;相关 Session 仍留在 `session.list` 中,并进入 Ungrouped。`SessionSummary.blank` 与 `host/session-added` 帧携带是否已开始过轮次:客户端隐藏空白会话并按 workspace 复用它们,在首个 `host/session-status(running:true)` 时翻转 blank,并以 `session.list` 作为重连权威。已附加摘要折叠实时日志。冷摘要信任缓存的 `blank: false`,但把缓存的 `true` 与 cache miss 都视为未经验证;当 `locate()` 报告的工件不大于 `coldBlankProbeMaxBytes` 资格阈值(默认 1 KiB)时,网关通过 `readFrom()` 读取该 Session,同时折叠空白状态与最新真人 prompt。更大、无位置、已消失或不可读的工件保持可见。异步冷读取结束后,期间已附加的 Session 会改用实时日志生成摘要。`updatedAt` 依次采用实时折叠、小工件精确折叠或 projection cache,缺失时回退到 `createdAt`;拾起边界及其他写入都不会提升 Session 排序。 `session.search` 是以 `session.list` 所列会话为范围的有界内容搜索投影。网关向可选的 `ctx.sessionQuery` 服务请求全局排序后的当前内容视图中的 user、assistant 和 steering 匹配项,并持续消费该结果流,直到获得至多 20 个可见会话/snippet 对及一个前瞻项;返回前仍会依据从列表推导的授权集合重新校验每个命中。提供方分页初始请求 20 个命中;如果第一页请求因这一上限被拒绝,网关会依次探测 10、5、2、1,并在续传和陈旧世代重启中沿用探测所得的页面大小。返回的 snippet 最多包含 240 个 Unicode 码点,响应 schema 则会在每个客户端边界独立强制执行该上限。将授权集合保留在宿主内存中,可在不削弱可见性或排序的前提下避开有效大型语料库的 SQLite 变量上限。 @@ -80,4 +80,4 @@ Workspace 列表与 Session 列表是相互独立的重连基线。`workspace.cr - **没有协议版本字段**:客户端与宿主一同发布;只有出现独立发布的客户端后,`host.describe` 才会增加版本协商字段。 - **搜索失败会包含提供方诊断信息**:网关是单用户本地服务。将其暴露给多名用户的载体必须用可安全公开的诊断信息替代内部搜索细节。 - **Linux 原生选择器依赖桌面工具**:在 `native` 能力下,Zenity 和 KDialog 均未安装时,`host.pickDirectory` 会给出包含解决建议的错误提示;组合层面的回退是 browse 后端(见 [native 后端 README](../directory-picker-native/README.md))。 -- **冷列表提示只向“保持可见、排序偏旧”降级**:projection cache miss 或陈旧的 `lastPromptAt` 会回退到 `createdAt`,因此最近工作过的 Session 可能在下一个 checkpoint 前排得偏低。大于 `coldBlankProbeMaxBytes` 的空白工件,或来自不提供 `locate()` 的后端的空白工件会保持可见,因为网关无法在读取上限内验证其中不存在 `turn/start`。[有界空白验证决策](../../../.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)规定了这个安全方向;权威且精确的最近时间索引仍属于[最后活动索引提案](../../../.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md)的范围。 +- **冷列表提示只向“保持可见、排序偏旧”降级**:projection cache miss 或陈旧的 `lastPromptAt` 会回退到 `createdAt`,除非符合资格的小工件提供精确折叠,因此最近工作过的大 Session 可能在下一个 checkpoint 前排得偏低。大于 `coldBlankProbeMaxBytes` 的空白工件,或来自不提供 `locate()` 的后端的空白工件会保持可见。该阈值在 `readFrom()` 前检查,而非由 persistence 强制,因此工件并发增长可能增加一次探测的读取成本,但不会改变空白状态的安全方向。[有界空白验证决策](../../../.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)规定了这个安全方向;权威且精确的最近时间索引仍属于[最后活动索引提案](../../../.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md)的范围。 diff --git a/packages/host/apiproxy/src/api-proxy.ts b/packages/host/apiproxy/src/api-proxy.ts index fc986583a0..bda99362b6 100644 --- a/packages/host/apiproxy/src/api-proxy.ts +++ b/packages/host/apiproxy/src/api-proxy.ts @@ -563,40 +563,40 @@ function summarize(session: Session, running: boolean): SessionSummary { } /** - * Verify a possibly blank cold Session only when its physical artifact is - * within the configured per-Session read bound. A stale `blank: true`, an + * Verify a possibly blank cold Session only when its physical artifact passes + * the configured per-Session size check. A stale `blank: true`, an * absent cache row, a large or location-less artifact, and read failures all * resolve to visible (`false`); listing must never hide a conversation on a * cache hint or an unavailable optimization. */ -async function probeColdSessionBlank( +async function probeColdSessionMetadata( ctx: Context, persistence: SessionPersistence, meta: SessionHeader, maxBytes: number, signal?: AbortSignal, -): Promise { - if (maxBytes === 0) return false +): Promise { + if (maxBytes === 0) return undefined signal?.throwIfAborted() const location = persistence.locate(meta) - if (location === undefined) return false + if (location === undefined) return undefined signal?.throwIfAborted() let size: number try { size = (await stat(location.path)).size } catch { signal?.throwIfAborted() - return false + return undefined } - if (size > maxBytes) return false + if (size > maxBytes) return undefined try { const { events } = await persistence.readFrom(meta.id, 0, signal) signal?.throwIfAborted() - return !events.some(event => event.type === 'turn/start') + return sessionListMetadata(events) } catch (error) { signal?.throwIfAborted() ctx.logger.warn(`session.list: blank probe for "${meta.id}" failed (serving it as visible): ${String(error)}`) - return false + return undefined } } @@ -609,14 +609,14 @@ async function summarizeCold( blankProbeMaxBytes: number, signal?: AbortSignal, ): Promise { - const blank = metadata?.blank === false - ? false - : await probeColdSessionBlank(ctx, persistence, meta, blankProbeMaxBytes, signal) + const probed = metadata?.blank === false + ? undefined + : await probeColdSessionMetadata(ctx, persistence, meta, blankProbeMaxBytes, signal) return { sessionId: meta.id, - updatedAt: sessionListUpdatedAt(meta, metadata), + updatedAt: sessionListUpdatedAt(meta, probed ?? metadata), running: false, - blank, + blank: metadata?.blank === false ? false : probed?.blank ?? false, // Header-only: reading the log for a blank-window preset switch would // defeat the same index read, and attaching the session replaces this row // with `summarize()`, which resolves the switch from the events. @@ -1724,14 +1724,15 @@ export function createApiProxy(ctx: Context, defaults: ApiProxyDefaults): ApiPro */ async function listVisibleSessionSummaries(signal?: AbortSignal): Promise { signal?.throwIfAborted() - const items = ctx.sessions.list().map((session) => { + const summarizeAttached = (session: Session): SessionSummary => { const agent = ctx.agents.get(session.id) const projections = listProjectionsFor(ctx, session.header, session) return { ...summarize(session, agent?.status === 'running'), ...projections === undefined ? {} : { projections }, } - }) + } + const items = ctx.sessions.list().map(summarizeAttached) signal?.throwIfAborted() const attached = new Set(items.map(item => item.sessionId)) const persistence = ctx.get('sessionPersistence') @@ -1745,17 +1746,20 @@ export function createApiProxy(ctx: Context, defaults: ApiProxyDefaults): ApiPro const settled = await Promise.allSettled( batch.map(async (meta) => { // Projection hints remain optional. Blank verification may read - // this Session's artifact only when it fits the configured bound. + // this Session's artifact only when it passes the configured size check. const projections = listProjectionsFor(ctx, meta, undefined) + const summary = await summarizeCold( + ctx, + persistence, + meta, + projections?.values.sessionListMetadata, + coldBlankProbeMaxBytes, + signal, + ) + const attachedSession = ctx.sessions.get(meta.id) + if (attachedSession !== undefined) return summarizeAttached(attachedSession) return { - ...await summarizeCold( - ctx, - persistence, - meta, - projections?.values.sessionListMetadata, - coldBlankProbeMaxBytes, - signal, - ), + ...summary, ...projections === undefined ? {} : { projections }, } }), diff --git a/packages/host/apiproxy/src/api/sessions.ts b/packages/host/apiproxy/src/api/sessions.ts index c834718cf0..2e7c9b22f4 100644 --- a/packages/host/apiproxy/src/api/sessions.ts +++ b/packages/host/apiproxy/src/api/sessions.ts @@ -173,25 +173,25 @@ export type QueueAction = | { kind: 'remove' } | { kind: 'steer' } -/** Session list entry (v1 builds no index: list does readdir+stat). */ +/** One Session list entry. */ export interface SessionSummary { sessionId: SessionId /** - * Last activity. Attached: the last non-`session/end-seed` event, since a - * pickup is not activity. Cold: the log's mtime, or `createdAt` for a backend - * with no per-session file (README Known Limitations covers the skew). + * The later of creation and the latest human-authored prompt. Attached + * Sessions fold their live log; cold Sessions use a projection-cache hint or + * an exact small-artifact read, falling back to creation time. */ updatedAt: number /** Status of the attached agent; always false for cold (unattached) sessions. */ running: boolean /** - * Derived conversation-not-started bit: true while no turn has run (no - * prompt was accepted yet). Standalone plugin events — command lifecycle + * Derived conversation-not-started bit: true while no turn has run. + * Standalone plugin events — command lifecycle * records, plan/mode, titles, goals — do not open a turn and therefore do - * not clear it. Clients hide blank sessions from lists and reuse them for - * New Session on the same workspace. Always false for cold sessions — - * lazy persistence keeps a never-appended session out of the store, and a - * listed cold session's log holds its turns. + * not clear it. Clients hide blank Sessions from lists and reuse them for + * New Session on the same workspace. A cold Session is true only when a + * small-artifact read verifies that no `turn/start` exists; unavailable + * or oversized artifacts conservatively report false. */ blank: boolean /** fork/spawn lineage (session.header.parentSession passthrough); absent for root sessions. */ diff --git a/packages/host/apiproxy/tests/api-proxy-cold.spec.ts b/packages/host/apiproxy/tests/api-proxy-cold.spec.ts index 20a891d420..ef642082ac 100644 --- a/packages/host/apiproxy/tests/api-proxy-cold.spec.ts +++ b/packages/host/apiproxy/tests/api-proxy-cold.spec.ts @@ -67,7 +67,14 @@ describe('sessions.list cold merge', () => { if (id === sid('small-conversation')) { return { meta: metas[1]!, - events: [{ type: 'turn/start', seq: 0, time: 800, data: { turn: 1 } }] as SessionEvent[], + events: [ + { type: 'turn/start', seq: 0, time: 800, data: { turn: 1 } }, + { + type: 'user/message', seq: 1, time: 1200, + data: createUserMessage({ content: [{ type: 'text', text: 'worked' }], source: { kind: 'user' } }), + surfaceOp: 'append', + }, + ] as SessionEvent[], } } if (id === sid('read-failure')) throw new Error('simulated read failure') @@ -105,7 +112,7 @@ describe('sessions.list cold merge', () => { const byId = Object.fromEntries(response.result.value.items.map(item => [item.sessionId, item])) expect(byId['small-blank']).toMatchObject({ blank: true, updatedAt: 100, running: false }) // A stale true hint cannot hide the turn found in the bounded read. - expect(byId['small-conversation']).toMatchObject({ blank: false, updatedAt: 900 }) + expect(byId['small-conversation']).toMatchObject({ blank: false, updatedAt: 1200 }) expect(byId['large-unknown']).toMatchObject({ blank: false, updatedAt: 300 }) // false is monotonic, so this row skips stat/read and keeps cached recency. expect(byId['cached-nonblank']).toMatchObject({ blank: false, updatedAt: 1000 }) @@ -149,6 +156,62 @@ describe('sessions.list cold merge', () => { ]) expect(readFrom).not.toHaveBeenCalled() }) + + it('replaces a probed cold row with the live Session that attached during the read', async () => { + const ctx = new Context() + await ctx.plugin(SessionStore) + await ctx.plugin(UserQuestionService) + await ctx.plugin(AgentRegistry) + const meta = header('attached-during-probe', 100) + const root = mkdtempSync(join(tmpdir(), 'dsh-cold-race-')) + const path = join(root, 'small.log') + writeFileSync(path, 'x') + const started = Promise.withResolvers() + const release = Promise.withResolvers() + ctx.provide('sessionPersistence', { + list: () => Promise.resolve([meta]), + locate: () => ({ kind: 'jsonl', path }), + readFrom: async () => { + started.resolve(undefined) + await release.promise + return { + meta, + events: [{ type: 'session/end-seed', seq: 0, time: 110, data: {} }] as SessionEvent[], + } + }, + } as never) + const api = createApiProxy(ctx, { defaultModelSelection: () => ({ provider: 'p', model: 'm' }), cwd: '/tmp' }) + + const listing = api.sessions.list(request({})) + await started.promise + const session = ctx.sessions.create(meta.id, { + seed: [ + { type: 'turn/start', seq: 0, time: 200, data: { turn: 1 } }, + { + type: 'user/message', seq: 1, time: 300, + data: createUserMessage({ content: [{ type: 'text', text: 'live' }], source: { kind: 'user' } }), + surfaceOp: 'append', + }, + ], + meta: { + ...meta.cwd === undefined ? {} : { cwd: meta.cwd }, + createdAt: meta.createdAt, + }, + }) + ctx.agents.register({ id: session.id, session, status: 'running', ctx } as Agent) + release.resolve(undefined) + + const response = await listing + if (!response.result.ok) throw new Error('list failed') + expect(response.result.value.items).toEqual([ + expect.objectContaining({ + sessionId: meta.id, + blank: false, + running: true, + updatedAt: 300, + }), + ]) + }) }) describe('attached updatedAt tracks human prompts', () => { From 0633add19d704f9abc7b9c997653c3e449b9ca59 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:10:12 +0800 Subject: [PATCH 039/103] fix(web): clarify wildcard host safety warning --- packages/bundle/web-app/src/startup.ts | 2 +- packages/bundle/web-app/tests/startup.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bundle/web-app/src/startup.ts b/packages/bundle/web-app/src/startup.ts index 26aa17eb46..55a4b40f2e 100644 --- a/packages/bundle/web-app/src/startup.ts +++ b/packages/bundle/web-app/src/startup.ts @@ -67,7 +67,7 @@ export function apply(ctx: Context): void { program.action(() => { const options = program.opts() if (options.host === '0.0.0.0') { - program.error('error: --host 0.0.0.0 is intentionally not supported yet; use 127.0.0.1 instead') + program.error('error: --host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead') } if (options.port !== undefined && !/^\d+$/.test(options.port)) { program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`) diff --git a/packages/bundle/web-app/tests/startup.spec.ts b/packages/bundle/web-app/tests/startup.spec.ts index 29d02a423d..26e347a503 100644 --- a/packages/bundle/web-app/tests/startup.spec.ts +++ b/packages/bundle/web-app/tests/startup.spec.ts @@ -131,7 +131,7 @@ describe('web command-line provider', () => { it('rejects the intentionally unsupported all-interfaces host before the consumer activates', async () => { const { values, observed } = await bootProvider(['--host', '0.0.0.0']) - expect(observed.out).toContain('--host 0.0.0.0 is intentionally not supported yet; use 127.0.0.1 instead') + expect(observed.out).toContain('--host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead') expect(values).toBeUndefined() expect(observed.readerConfig).toBeUndefined() expect(observed.exits).toEqual([1]) From a37e19471e93e36a79685fedace840ea4763f40a Mon Sep 17 00:00:00 2001 From: Ag Date: Thu, 13 Aug 2026 15:14:36 +0800 Subject: [PATCH 040/103] docs: refine localized community links --- README.i18n.yaml | 4 ++-- README.md | 3 +-- README.zh.md | 7 ++++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index ee4bfdf7f1..727a781767 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: b1d84d6ebd20843f6c2e3b7ccd22cccb2df0d104 -README.zh.md: a3960d3d342d005230f8a40e5c43d4bac882cb7a +README.md: 098b514f8311de092bab18bdd560722b1e485913 +README.zh.md: f9dacc4e3cce1c83bfa65df9fbc8d6410a37fcc0 diff --git a/README.md b/README.md index b1d84d6ebd..098b514f83 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,7 @@ pnpm dsh web - Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions). - Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability. - -

Join DeepSeek Harness Discord community.

+- Join DeepSeek Harness Discord community. ## Contributing diff --git a/README.zh.md b/README.zh.md index a3960d3d34..f9dacc4e3c 100644 --- a/README.zh.md +++ b/README.zh.md @@ -38,6 +38,7 @@ pnpm dsh web - 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。 - 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。 +- 欢迎加入 DeepSeek Harness 企微群:扫码添加企微小助手并填写入群问卷,完成后小助手会邀请你入群。 @@ -49,9 +50,9 @@ pnpm dsh web - - - + + +
DeepSeek Harness 企微小助手二维码DeepSeek Harness 入群问卷二维码DeepSeek Harness 团队微信公众号二维码DeepSeek Harness 企微小助手二维码DeepSeek Harness 入群问卷二维码DeepSeek Harness 团队微信公众号二维码
From 4ed036da1c2d69052c7b60c9c56e5f72b08c1382 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 01:11:46 +0800 Subject: [PATCH 041/103] fix: Windows-native CI findings on latest master Local run of check:ci:windows-complete (the windows-native gate) on latest master surfaced five Windows-only failures, all unreachable by current CI because the native windows job is disabled and the wine gate only covers build+site. - install-lefthook/translation-pairing-merge specs junctioned the real scripts/ and tsx package into fixtures; Windows recursive deletion (Node rmSync and git worktree remove) follows MOUNT_POINT junctions and deleted the repository's own directories mid-run. Fixtures now unlink their reparse points before any recursive removal (shared helper in scripts/test-fixture-cleanup.ts). - workflow-workerthread spawned its worker with an empty env; on Windows os.tmpdir() then degrades to the literal relative path undefined\temp, so tsx wrote its transform cache into a cwd-relative undefined/ directory inside the repo. The worker env now injects the host temp path on win32 (workerSpawnEnv, platform-parameterized and unit-tested on both arms). - workspace-context spec did not stub USERPROFILE (win32 homedir) or a set DSH_HOME, leaking the developer machine's real ~/.dsh/AGENTS.md into discovery. - ui-trajectory client-bundle spec mounted the built artifact without the remote/settingsScope provides the locale plugin needs, so the plugin never activated and no view registered. - subagent temp-fixture cleanup lacked the maxRetries Windows handle release needs under load (EPERM); added retries to the three affected specs and the fixture-cleanup helper. --- .../tests/agent-instructions.spec.ts | 9 +++- .../subagent/tests/continuation.spec.ts | 2 +- .../subagent/tests/list-children.spec.ts | 2 +- .../tests/tool-subagent-control.spec.ts | 2 +- .../workflow-worker-thread/src/host.ts | 33 +++++++++++-- .../tests/workflow-worker-thread.spec.ts | 42 ++++++++++++++--- scripts/install-lefthook.spec.ts | 7 ++- scripts/test-fixture-cleanup.ts | 46 +++++++++++++++++++ scripts/translation-pairing-merge.spec.ts | 12 ++++- 9 files changed, 137 insertions(+), 18 deletions(-) create mode 100644 scripts/test-fixture-cleanup.ts diff --git a/packages/context/agent-instructions/tests/agent-instructions.spec.ts b/packages/context/agent-instructions/tests/agent-instructions.spec.ts index 71bd149413..409e4f8afb 100644 --- a/packages/context/agent-instructions/tests/agent-instructions.spec.ts +++ b/packages/context/agent-instructions/tests/agent-instructions.spec.ts @@ -578,10 +578,12 @@ describe('workspace context instruction discovery', () => { const root = await tempRepo() const emptyHome = await tempRepo() // Isolate the default-home fallback: blank DSH_HOME is treated as unset, and - // HOME points at an empty dir so the default ~/.dsh holds no global scope. - // Symlinks are followed, so a real ~/.dsh/AGENTS.md would otherwise leak in. + // the home dirs point at an empty dir so the default ~/.dsh holds no global + // scope. Windows homedir() reads USERPROFILE (not HOME), so both must be + // stubbed or a real ~/.dsh/AGENTS.md would otherwise leak in. vi.stubEnv('DSH_HOME', '') vi.stubEnv('HOME', emptyHome) + if (process.platform === 'win32') vi.stubEnv('USERPROFILE', emptyHome) try { const cwd = join(root, 'child') await mkdir(cwd, { recursive: true }) @@ -622,6 +624,8 @@ describe('workspace context instruction discovery', () => { try { await write(join(home, '.dsh/AGENTS.md'), 'global default rule') + // A set DSH_HOME would override the homedir default and relabel the home. + vi.stubEnv('DSH_HOME', '') vi.resetModules() vi.doMock('node:os', () => ({ homedir: () => home })) const isolated = await import('@deepseek-ai/dsh-agent-instructions') @@ -629,6 +633,7 @@ describe('workspace context instruction discovery', () => { expect(files.map(file => file.displayPath)).toEqual(['~/.dsh/AGENTS.md']) } finally { + vi.unstubAllEnvs() vi.doUnmock('node:os') vi.resetModules() await rm(root, { recursive: true, force: true }) diff --git a/packages/subagent/subagent/tests/continuation.spec.ts b/packages/subagent/subagent/tests/continuation.spec.ts index 7ff021ee33..07f497628d 100644 --- a/packages/subagent/subagent/tests/continuation.spec.ts +++ b/packages/subagent/subagent/tests/continuation.spec.ts @@ -53,7 +53,7 @@ class GatedAdapter extends LlmAdapter { const roots: string[] = [] afterEach(() => { - for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true }) + for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) }) /** Boot the full continuable stack: loop, persistence, providers, and subagents. */ diff --git a/packages/subagent/subagent/tests/list-children.spec.ts b/packages/subagent/subagent/tests/list-children.spec.ts index 80b596acc1..3fd303e7f6 100644 --- a/packages/subagent/subagent/tests/list-children.spec.ts +++ b/packages/subagent/subagent/tests/list-children.spec.ts @@ -28,7 +28,7 @@ type Script = ConstructorParameters[0] const roots: string[] = [] afterEach(() => { - for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true }) + for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) }) /** Boot the continuable stack with real JSONL session persistence. */ diff --git a/packages/subagent/tool-subagent-control/tests/tool-subagent-control.spec.ts b/packages/subagent/tool-subagent-control/tests/tool-subagent-control.spec.ts index 1721758409..0636254841 100644 --- a/packages/subagent/tool-subagent-control/tests/tool-subagent-control.spec.ts +++ b/packages/subagent/tool-subagent-control/tests/tool-subagent-control.spec.ts @@ -47,7 +47,7 @@ const testToolSignal = new AbortController().signal const roots: string[] = [] afterEach(() => { - for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true }) + for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) }) async function setupWith(adapter: MockAdapter | GatedAdapter) { diff --git a/packages/workflow/workflow-worker-thread/src/host.ts b/packages/workflow/workflow-worker-thread/src/host.ts index 209749bb38..9e0c3a514a 100644 --- a/packages/workflow/workflow-worker-thread/src/host.ts +++ b/packages/workflow/workflow-worker-thread/src/host.ts @@ -6,6 +6,7 @@ * @module @deepseek-ai/dsh-workflow-worker-thread/host */ +import { tmpdir } from 'node:os' import { Worker } from 'node:worker_threads' import type { WorkerOptions } from 'node:worker_threads' import { fileURLToPath } from 'node:url' @@ -28,18 +29,42 @@ interface ChildRecord { disposal?: Promise } +/** + * The scrubbed worker environment: no ambient credentials, no loader flags. + * Windows derives `os.tmpdir()` from `TMP`/`TEMP` and falls back to the + * literal relative path `undefined\temp` when the environment is empty, so + * tsx's transform cache would land in a cwd-relative `undefined/temp` + * directory; the host's real temp path (not a credential) is injected there. + * The unbuilt shape additionally forwards `TSX_TSCONFIG_PATH` for path + * resolution. + * @param platform - host platform; overridable so tests exercise both peer arms. + * @returns the scrubbed worker environment object. + */ +export function workerSpawnEnv(platform: NodeJS.Platform = process.platform): NodeJS.ProcessEnv { + const env: NodeJS.ProcessEnv = {} + if (platform === 'win32') { + const tmp = tmpdir() + env.TMP = tmp + env.TEMP = tmp + } + if (process.env.TSX_TSCONFIG_PATH !== undefined) { + env.TSX_TSCONFIG_PATH = process.env.TSX_TSCONFIG_PATH + } + return env +} + /** * Resolve a built worker bundle or an unbuilt bootstrap that installs both tsx * transforms inside the worker. Both shapes clear `execArgv` and the ambient - * environment; the unbuilt shape forwards only `TSX_TSCONFIG_PATH` for path - * resolution. + * environment (the worker only sees the platform temp path and, unbuilt, + * `TSX_TSCONFIG_PATH`). * @param init - the run payload, passed as `workerData`. * @returns the entry path or URL and the Worker options to spawn it with. */ function resolveWorkerSpawn(init: WorkerInit): { entry: string | URL; options: WorkerOptions } { /* v8 ignore next 3 -- the built-output arm: tests always run unbuilt (src/); the built-worker e2e exercises this shape for real */ if (!import.meta.url.endsWith('.ts')) { - return { entry: fileURLToPath(new URL('./worker.cjs', import.meta.url)), options: { workerData: init, env: {}, execArgv: [] } } + return { entry: fileURLToPath(new URL('./worker.cjs', import.meta.url)), options: { workerData: init, env: workerSpawnEnv(), execArgv: [] } } } // Resolve tsx only for unbuilt consumers and install it before importing TS. const workerEntry = new URL('./worker.ts', import.meta.url) @@ -56,7 +81,7 @@ function resolveWorkerSpawn(init: WorkerInit): { entry: string | URL; options: W entry: new URL(`data:text/javascript,${encodeURIComponent(bootstrap)}`), options: { workerData: init, - env: process.env.TSX_TSCONFIG_PATH === undefined ? {} : { TSX_TSCONFIG_PATH: process.env.TSX_TSCONFIG_PATH }, + env: workerSpawnEnv(), execArgv: [], }, } diff --git a/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts b/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts index ced9a632f4..275c92269e 100644 --- a/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts +++ b/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' +import { tmpdir } from 'node:os' import { fileURLToPath } from 'node:url' import type { Worker } from 'node:worker_threads' import { Context } from '@deepseek-ai/cordis' @@ -9,6 +10,7 @@ import type { SubagentCapabilities, SubagentProvider, SubagentResult, SubagentRu import type { WorkflowMeta, WorkflowResult, WorkflowResultInfo, WorkflowRun, WorkflowRunInfo } from '@deepseek-ai/dsh-workflow' import * as workerEngineModule from '../src/index.ts' import WorkerThreadWorkflowEngine, { type Config } from '../src/index.ts' +import { workerSpawnEnv } from '../src/host.ts' import { HostToWorkerType, WorkerToHostType } from '../src/protocol.ts' import { SessionId } from '@deepseek-ai/dsh-session' @@ -559,24 +561,49 @@ describe('dsh-workflow-worker-thread', () => { expect(result.value).toBe('fine') }) - it('the worker spawns with an EMPTY environment: an escaped script finds no ambient credentials', async () => { + it('the worker spawns with a scrubbed environment: an escaped script finds no ambient credentials', async () => { const { ctx, parent } = await setup() // A canary in the HARNESS process's env: with an inherited environment // the escape below would read it back (exactly how DEEPSEEK_API_KEY - // would leak); env: {} in the spawn options is what keeps it out. + // would leak); the worker env keeps every ambient variable out. Windows + // additionally receives the host temp path (TMP/TEMP) so `os.tmpdir()` + // inside the worker resolves instead of degrading to a cwd-relative + // `undefined\temp` (tsx writes its transform cache there). process.env.WORKFLOW_ENV_CANARY = 'leak me' try { const result = await run(ctx, parent, scripted(` const proc = ${ESCAPE} - return { canary: proc.env.WORKFLOW_ENV_CANARY ?? null, keys: Object.keys(proc.env).length } + return { canary: proc.env.WORKFLOW_ENV_CANARY ?? null, keys: Object.keys(proc.env).sort() } `)) expect(result.stopReason).toBe('completed') - expect(result.value).toEqual({ canary: null, keys: 0 }) + const expectedKeys = process.platform === 'win32' ? ['TEMP', 'TMP'] : [] + expect(result.value).toEqual({ canary: null, keys: expectedKeys }) } finally { delete process.env.WORKFLOW_ENV_CANARY } }) + it('workerSpawnEnv injects the host temp path on win32 and leaves the POSIX peer empty', () => { + const tmp = tmpdir() + expect(workerSpawnEnv('win32')).toEqual({ TMP: tmp, TEMP: tmp }) + expect(workerSpawnEnv('linux')).toEqual({}) + }) + + it('workerSpawnEnv forwards TSX_TSCONFIG_PATH when the snapshot harness pins it', () => { + const tsconfig = fileURLToPath(new URL('../../../../tsconfig.json', import.meta.url)) + vi.stubEnv('TSX_TSCONFIG_PATH', tsconfig) + try { + expect(workerSpawnEnv('linux')).toEqual({ TSX_TSCONFIG_PATH: tsconfig }) + expect(workerSpawnEnv('win32')).toEqual({ + TMP: tmpdir(), + TEMP: tmpdir(), + TSX_TSCONFIG_PATH: tsconfig, + }) + } finally { + vi.unstubAllEnvs() + } + }) + it('the unbuilt worker forwards exactly TSX_TSCONFIG_PATH through the scrub: the paths-map pin survives, secrets do not', async () => { const { ctx, parent } = await setup() // The ACP snapshot harness runs the parent with its cwd OUTSIDE the @@ -589,10 +616,13 @@ describe('dsh-workflow-worker-thread', () => { try { const result = await run(ctx, parent, scripted(` const proc = ${ESCAPE} - return { keys: Object.keys(proc.env), tsconfig: proc.env.TSX_TSCONFIG_PATH } + return { keys: Object.keys(proc.env).sort(), tsconfig: proc.env.TSX_TSCONFIG_PATH } `)) expect(result.stopReason).toBe('completed') - expect(result.value).toEqual({ keys: ['TSX_TSCONFIG_PATH'], tsconfig }) + const expectedKeys = process.platform === 'win32' + ? ['TEMP', 'TMP', 'TSX_TSCONFIG_PATH'] + : ['TSX_TSCONFIG_PATH'] + expect(result.value).toEqual({ keys: expectedKeys, tsconfig }) } finally { delete process.env.TSX_TSCONFIG_PATH delete process.env.WORKFLOW_ENV_CANARY diff --git a/scripts/install-lefthook.spec.ts b/scripts/install-lefthook.spec.ts index 2c429bba25..c5a92a675e 100644 --- a/scripts/install-lefthook.spec.ts +++ b/scripts/install-lefthook.spec.ts @@ -16,6 +16,7 @@ import { tmpdir } from 'node:os' import { dirname, isAbsolute, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { afterEach, describe, expect, it } from 'vitest' +import { removeFixtureSafely, unlinkFixtureLinks } from './test-fixture-cleanup.ts' const installer = fileURLToPath(new URL('./install-lefthook.mjs', import.meta.url)) const pairingMergeDriver = 'scripts/merge-translation-pairing-driver.sh %O %A %B %P' @@ -40,7 +41,7 @@ interface CommandResult { } afterEach(() => { - for (const fixture of fixtures.splice(0)) rmSync(fixture, { recursive: true, force: true }) + for (const fixture of fixtures.splice(0)) removeFixtureSafely(fixture) }) function commandResult(command: string, args: string[], cwd: string, env: NodeJS.ProcessEnv): CommandResult { @@ -282,6 +283,10 @@ describe('worktree-local Lefthook installer', { timeout: 15_000 }, () => { expect(gitResult(fixture, fixture.main, ['config', '--file', commonConfig, '--get', 'core.bare']).status).toBe(1) const mainHookBeforeRemoval = readFileSync(join(mainHooks, 'pre-commit'), 'utf8') + // Windows Git follows the fixture's MOUNT_POINT junctions into their real + // targets while removing a worktree; unlink them first so the removal + // cannot delete the repository's scripts/ or tsx package. + unlinkFixtureLinks(fixture.linked) git(fixture, fixture.main, ['worktree', 'remove', '--force', fixture.linked]) expect(readFileSync(join(mainHooks, 'pre-commit'), 'utf8')).toBe(mainHookBeforeRemoval) expect(readFileSync(legacyHook, 'utf8')).toBe('#!/bin/sh\n# legacy hook\n') diff --git a/scripts/test-fixture-cleanup.ts b/scripts/test-fixture-cleanup.ts new file mode 100644 index 0000000000..9c58eea890 --- /dev/null +++ b/scripts/test-fixture-cleanup.ts @@ -0,0 +1,46 @@ +/** + * Junction-safe fixture cleanup for Windows. Test fixtures junction the REAL + * `scripts/`, `node_modules`, and tsx package directories so installer probes + * resolve through them; Windows recursive deletion — both Node's `rmSync` and + * Git's `worktree remove` — follows MOUNT_POINT junctions into their targets + * and would delete the repository's own directories. POSIX `unlink`/`rm` + * already remove symlinks without following them, so the walk is a no-op + * there. + */ + +import { lstatSync, readdirSync, rmSync, unlinkSync } from 'node:fs' +import { join } from 'node:path' + +/** + * Recursively unlink every symbolic link (junction) under `path`. + * @param path - the fixture tree whose reparse points are unlinked. + */ +export function unlinkFixtureLinks(path: string): void { + const visit = (entry: string): void => { + let stat: ReturnType + try { + stat = lstatSync(entry) + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return + throw error + } + if (stat.isSymbolicLink() || !stat.isDirectory()) { + if (stat.isSymbolicLink()) unlinkSync(entry) + return + } + for (const child of readdirSync(entry)) visit(join(entry, child)) + } + visit(path) +} + +/** + * Remove one fixture tree after its junctions are unlinked (see + * {@link unlinkFixtureLinks}). Retries the removal: Windows releases child + * process and antivirus file handles asynchronously, and an unretried + * `rmSync` fails immediately with EPERM under load. + * @param path - the fixture tree to remove. + */ +export function removeFixtureSafely(path: string): void { + unlinkFixtureLinks(path) + rmSync(path, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) +} diff --git a/scripts/translation-pairing-merge.spec.ts b/scripts/translation-pairing-merge.spec.ts index 0ee78a11b7..32924416a6 100644 --- a/scripts/translation-pairing-merge.spec.ts +++ b/scripts/translation-pairing-merge.spec.ts @@ -1,7 +1,14 @@ /** Integration coverage for automatic and explicit pairing-record conflict resolution. */ import { execFileSync, spawnSync } from 'node:child_process' -import { chmodSync, mkdtempSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'node:fs' +import { + chmodSync, + mkdtempSync, + mkdirSync, + readFileSync, + symlinkSync, + writeFileSync, +} from 'node:fs' import { tmpdir } from 'node:os' import { delimiter, dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' @@ -15,6 +22,7 @@ import { renderTranslationPairingRecord, translationPairPaths, } from './translation-pairing-record.ts' +import { removeFixtureSafely } from './test-fixture-cleanup.ts' const driver = fileURLToPath(new URL('./merge-translation-pairing.ts', import.meta.url)) const driverLauncher = fileURLToPath(new URL('./merge-translation-pairing-driver.sh', import.meta.url)) @@ -28,7 +36,7 @@ interface Fixture { } afterEach(() => { - for (const fixture of fixtures.splice(0)) rmSync(fixture, { recursive: true, force: true }) + for (const fixture of fixtures.splice(0)) removeFixtureSafely(fixture) }) function git(fixture: Fixture, args: string[]): string { From 9e9073da2484755f660356d96497a6b7090a6a67 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 11:18:03 +0800 Subject: [PATCH 042/103] fix(boot): unlink stale profile fallback links instead of rmSync --- ...ink-stale-profile-fallback-links.i18n.yaml | 6 +++++ ...-12-unlink-stale-profile-fallback-links.md | 25 +++++++++++++++++++ ...-unlink-stale-profile-fallback-links.zh.md | 25 +++++++++++++++++++ packages/boot/app-boot/src/profile.ts | 6 +++-- 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml new file mode 100644 index 0000000000..0e53f1c748 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md +2026-08-12-unlink-stale-profile-fallback-links.md: 32959eb1b83bcc290d1daa4e4a020a2721be489b +2026-08-12-unlink-stale-profile-fallback-links.zh.md: 1f4da12748c9b57c12bf41a740001d5df770beb6 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md new file mode 100644 index 0000000000..32959eb1b8 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md @@ -0,0 +1,25 @@ +# Agent Note: Unlink stale profile fallback links instead of rmSync + +Status: implemented + +English | [中文](2026-08-12-unlink-stale-profile-fallback-links.zh.md) + +## Problem + +`healProfilesModuleFallback` re-points `$DSH_HOME/profiles/node_modules` entries when an installation moves, and Windows hosts keep those entries as junctions. `ensureSymlink` deleted a stale entry with `rmSync(link)`, but Node treats a junction as a directory for removal: without `recursive`, `rmSync` throws `ERR_FS_EISDIR`, so every launch from a moved installation or a second worktree crashed before booting. The `replaces a wrong symlink` unit test reproduces that crash on Windows at the exact removal call. + +## Decision + +`ensureSymlink` removes a stale link with `unlinkSync(link)`. `unlink` deletes the reparse point or symlink itself on every platform and never descends into the target, which preserves the function's fail-loud guarantee that a real directory is never deleted. The [profile-plugin-bundles decision](../architecture/2026-08-05-profile-plugin-bundles.md) keeps owning the fallback's two-anchor resolution; this note owns only the removal primitive. + +## Alternatives considered + +**`rmSync(link, { recursive: true })`.** On Node 24 this deletes the junction without following its target, but `recursive` would silently delete a real directory that replaced the link between the `lstat` guard and the removal, weakening the fail-loud contract that motivates the guard. + +**`rmdirSync(link)`.** Removes a junction on Windows as well, but it reads as directory removal for a link, and `unlinkSync` is the repository's existing junction-cleanup idiom. + +**Delete and recreate every entry unconditionally.** Correct but churns unchanged links on every launch and widens the concurrent-heal race window. + +## Consequences + +Windows launches heal moved or second-checkout installations instead of crashing with `ERR_FS_EISDIR`; POSIX behavior is unchanged because `unlinkSync` also unlinks plain symlinks. The existing `replaces a wrong symlink` test now passes on Windows where it previously reproduced the crash. Two concurrent healers deleting the same stale link still surface the second deletion as `ENOENT`, unchanged from the previous `rmSync` implementation. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md new file mode 100644 index 0000000000..1f4da12748 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md @@ -0,0 +1,25 @@ +# Agent Note: 用 unlink 删除过期的 profile 回退链接而非 rmSync + +Status: implemented + +[English](2026-08-12-unlink-stale-profile-fallback-links.md) | 中文 + +## 问题 + +`healProfilesModuleFallback` 在安装位置迁移时会把 `$DSH_HOME/profiles/node_modules` 中的条目重新指向新目标,而 Windows 主机上这些条目是 junction。`ensureSymlink` 原先用 `rmSync(link)` 删除过期条目,但 Node 在删除时把 junction 当作目录处理:不带 `recursive` 的 `rmSync` 会抛 `ERR_FS_EISDIR`,于是从迁移后的安装或第二个 worktree 启动时,每次都会在应用引导前崩溃。`replaces a wrong symlink` 单元测试在 Windows 上正好在该删除调用处复现了这一崩溃。 + +## 决策 + +`ensureSymlink` 改用 `unlinkSync(link)` 删除过期链接。`unlink` 在所有平台上都只删除重解析点或符号链接本身、绝不进入目标目录,从而保住该函数“真实目录永远不会被删除”的大声失败保证。[profile-plugin-bundles 决策](../architecture/2026-08-05-profile-plugin-bundles.md)继续拥有回退目录的双锚点解析;本 note 只拥有“用哪个删除原语”这一决定。 + +## 考虑过的替代方案 + +**`rmSync(link, { recursive: true })`。** Node 24 上它只删 junction、不跟随目标,但 `recursive` 会在 `lstat` 守卫与删除之间链接被替换成真实目录时静默删除该目录,削弱守卫存在所依据的大声失败契约。 + +**`rmdirSync(link)`。** Windows 上同样能删 junction,但它读起来像“删目录”,而 `unlinkSync` 才是仓库现有的 junction 清理惯例。 + +**无条件删除并重建所有条目。** 正确,但每次启动都翻动未变化的链接,并扩大并发修复的竞态窗口。 + +## 后果 + +Windows 启动现在可以修复迁移后的安装或第二个 checkout,而不是以 `ERR_FS_EISDIR` 崩溃;POSIX 行为不变,因为 `unlinkSync` 同样能 unlink 普通符号链接。现有的 `replaces a wrong symlink` 测试在 Windows 上从复现崩溃变为通过。两个并发 healer 删除同一过期链接时,第二次删除仍会以 `ENOENT` 浮现,与原先的 `rmSync` 实现一致。 diff --git a/packages/boot/app-boot/src/profile.ts b/packages/boot/app-boot/src/profile.ts index 24ba7b66ee..8f982bed80 100644 --- a/packages/boot/app-boot/src/profile.ts +++ b/packages/boot/app-boot/src/profile.ts @@ -24,7 +24,7 @@ import { createRequire } from 'node:module' import { - existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, rmSync, symlinkSync, writeFileSync, + existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, writeFileSync, } from 'node:fs' import { basename, dirname, join } from 'node:path' import type { EntryOptions } from '@deepseek-ai/cordis-plugin-loader' @@ -182,7 +182,9 @@ function ensureSymlink(link: string, target: string): void { throw new Error(`dsh: ${link} exists and is not a symlink; remove it so dsh can manage the installation fallback`) } if (readlinkSync(link) === target) return - rmSync(link) + // unlink deletes the reparse point itself on Windows too; rmSync treats a + // junction as a directory and throws EISDIR unless recursive. + unlinkSync(link) } try { symlinkSync(target, link, 'junction') From 22d30852f7bba25651411d0efce0be42bdad4f80 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 11:19:01 +0800 Subject: [PATCH 043/103] test(app-boot): unlink hmr alias junctions before removing the target --- packages/boot/app-boot/tests/hmr-config.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/boot/app-boot/tests/hmr-config.spec.ts b/packages/boot/app-boot/tests/hmr-config.spec.ts index c248643130..5f52ab5e2a 100644 --- a/packages/boot/app-boot/tests/hmr-config.spec.ts +++ b/packages/boot/app-boot/tests/hmr-config.spec.ts @@ -62,7 +62,7 @@ describe('HMR exact config paths', () => { expect(cacheHas).toHaveBeenCalledWith(expected) } finally { await ctx.fiber.dispose() - rmSync(alias, { force: true }) + unlinkSync(alias) rmSync(target, { recursive: true, force: true }) } }) @@ -78,7 +78,7 @@ describe('HMR exact config paths', () => { .rejects.toThrow('config path already registered') } finally { await ctx.fiber.dispose() - rmSync(alias, { force: true }) + unlinkSync(alias) rmSync(target, { recursive: true, force: true }) } }) From a62884a565bf6b71275b13941e8a6c7decd3ec25 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 11:32:03 +0800 Subject: [PATCH 044/103] docs: add junction-safe unlink rule to defensive patterns --- docs/defensive-patterns.i18n.yaml | 4 ++-- docs/defensive-patterns.md | 4 ++++ docs/defensive-patterns.zh.md | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/defensive-patterns.i18n.yaml b/docs/defensive-patterns.i18n.yaml index e845e8182b..9a82a28afd 100644 --- a/docs/defensive-patterns.i18n.yaml +++ b/docs/defensive-patterns.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/defensive-patterns.md -defensive-patterns.md: b6e643cad6180ea35a363f2c4131b2c24f5f70af -defensive-patterns.zh.md: e1a6abdfd2138a51a13ceaf418bf6df1d0c65579 +defensive-patterns.md: 9db582354628a13abd43c5bd052dbbfd6e52f79f +defensive-patterns.zh.md: 7bebbe3c1964f2b826afc523eaa4af7be180e36e diff --git a/docs/defensive-patterns.md b/docs/defensive-patterns.md index b6e643cad6..9db5823546 100644 --- a/docs/defensive-patterns.md +++ b/docs/defensive-patterns.md @@ -27,3 +27,7 @@ A user-supplied listener that throws must not reject the promise it runs inside ## Never hand untrusted output the ambient environment or predictable paths 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. + +## Unlink link-shaped paths + +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. diff --git a/docs/defensive-patterns.zh.md b/docs/defensive-patterns.zh.md index e1a6abdfd2..7bebbe3c19 100644 --- a/docs/defensive-patterns.zh.md +++ b/docs/defensive-patterns.zh.md @@ -26,4 +26,8 @@ ## 绝不将环境变量或可预测路径暴露给不可信输出 -启动的命令应使用经过清理的环境变量,移除名称匹配 `*KEY*`、`*SECRET*`、`*TOKEN*` 或 `*PASSWORD*` 的项,防止 harness 凭证通过命令输出、`env` 或 spill 文件泄漏。临时文件和 spill 文件应放在权限为 0700 的私有目录中,使用随机文件名,并以独占且仅所有者可访问的方式打开(`'wx'`、`0o600`);可预测且所有用户均可读的路径会引发符号链接竞态和信息泄露。 +启动的命令应使用经过清理的环境变量,移除名称匹配 `*KEY*`、`*SECRET*`、`*TOKEN*` 或 `*PASSWORD*` 的项,防止 harness 凭证通过命令输出、`env` 或 spill 文件泄漏。临时文件和 spill 文件应放在权限为 0700 的私有目录中,使用随机文件名,并以独占且仅所有者可访问的方式打开(`'wx'`、`0o600`);可预测且全局可读的路径会引发符号链接竞态和信息泄露。 + +## 用 unlink 删除链接形态的路径 + +可能是符号链接或 Windows junction 的路径,应先用 `lstatSync().isSymbolicLink()` 判断,再用 `unlinkSync` 删除:unlink 只删除链接本身并拒绝真实目录,因此绝不会跟随链接进入其目标。Windows 上对 junction 调用 `rmSync(link)` 会抛 `ERR_FS_EISDIR`;递归删除可能穿过 junction 进入其目标。真实目录才使用带 `recursive` 的 `rmSync`。 From c29246ae31bcff83729f18bf6cf72fb855b44770 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 14:04:45 +0800 Subject: [PATCH 045/103] fix(pwsh): resolve Store app execution aliases --- ...08-12-resolve-store-pwsh-aliases.i18n.yaml | 6 +++++ .../2026-08-12-resolve-store-pwsh-aliases.md | 23 +++++++++++++++++++ ...026-08-12-resolve-store-pwsh-aliases.zh.md | 23 +++++++++++++++++++ packages/shell/pwsh-local/src/resolve.ts | 17 ++++++++++++-- .../shell/pwsh-local/tests/executor.spec.ts | 20 +++++++++++++--- 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml new file mode 100644 index 0000000000..140c7b9ae7 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md +2026-08-12-resolve-store-pwsh-aliases.md: 20fe58e15e75462dc0a9ba76c7a1a94939f8a004 +2026-08-12-resolve-store-pwsh-aliases.zh.md: bbfa4616127a9dbdb6609fe2973283663de55b31 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md new file mode 100644 index 0000000000..20fe58e15e --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md @@ -0,0 +1,23 @@ +# Agent Note: Resolve Microsoft Store pwsh aliases + +Status: implemented + +English | [中文](2026-08-12-resolve-store-pwsh-aliases.zh.md) + +## Problem + +`resolvePwshPath` documented that Microsoft Store installs resolve through PATH, but its existence probe was `existsSync`, which stats a candidate and therefore follows reparse points. The Store's `%LOCALAPPDATA%\Microsoft\WindowsApps\pwsh.exe` is an app execution alias whose target directory ACL refuses stat (EACCES), so `existsSync` missed it and resolution silently fell through to Windows PowerShell 5.1 on hosts whose only PowerShell 7 is a Store install. + +## Decision + +`candidateExists` accepts a candidate that stats as a file or that lstat sees as a link-shaped reparse point, and `resolvePwshPath` uses it. Spawning the alias path works because CreateProcess resolves app execution aliases. A dangling link-shaped candidate is accepted so a broken pwsh fails loudly at spawn instead of silently downgrading to 5.1. + +## Alternatives considered + +**Probe the WindowsApps package directory directly.** The Store package path is versioned and ACL-hidden; hard-coding it duplicates packaging knowledge that PATH plus the alias already owns. + +**Keep the 5.1 fallback for stat failures.** Rejected: it silently runs a different shell than the one installed, which is the defect this note fixes. + +## Consequences + +Store-installed PowerShell 7 now resolves ahead of the 5.1 fallback on Windows; real-file candidates and non-Windows behavior are unchanged. The dangling-symlink unit test pins the stat/lstat split on every platform. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md new file mode 100644 index 0000000000..bbfa461612 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md @@ -0,0 +1,23 @@ +# Agent Note: 解析 Microsoft Store 的 pwsh 别名 + +Status: implemented + +[English](2026-08-12-resolve-store-pwsh-aliases.md) | 中文 + +## 问题 + +`resolvePwshPath` 声称 Store 安装经 PATH 解析,但它的存在性探测用的是 `existsSync`,会对候选做 stat、从而跟随重解析点。Store 的 `%LOCALAPPDATA%\Microsoft\WindowsApps\pwsh.exe` 是 app execution alias,其目标目录的 ACL 拒绝 stat(EACCES),于是 `existsSync` 看不到它,解析静默落到 Windows PowerShell 5.1——在这类「唯一的 PowerShell 7 是 Store 安装」的机器上就用了错误的 shell。 + +## 决策 + +`candidateExists` 接受「stat 为文件」或「lstat 为链接形态重解析点」的候选,`resolvePwshPath` 改用它。spawn 别名路径可以工作,因为 CreateProcess 会解析 app execution alias。悬空的链接形态候选同样被接受,让损坏的 pwsh 在 spawn 时响亮失败,而不是静默降级到 5.1。 + +## 考虑过的替代方案 + +**直接探测 WindowsApps 包目录。** Store 包路径带版本且被 ACL 隐藏;硬编码它只是重复了 PATH 加别名已经拥有的打包知识。 + +**对 stat 失败继续走 5.1 回退。** 否决:它静默运行了一个并非所装的 shell,这正是本 note 修复的缺陷。 + +## 后果 + +Windows 上 Store 安装的 PowerShell 7 现在先于 5.1 回退被解析;普通文件候选和非 Windows 平台行为不变。悬空 symlink 单元测试在全部平台上钉住 stat/lstat 的分裂行为。 diff --git a/packages/shell/pwsh-local/src/resolve.ts b/packages/shell/pwsh-local/src/resolve.ts index c6ded2f883..f090c2b4c1 100644 --- a/packages/shell/pwsh-local/src/resolve.ts +++ b/packages/shell/pwsh-local/src/resolve.ts @@ -8,7 +8,7 @@ * @module @deepseek-ai/dsh-pwsh-local/resolve */ -import { existsSync } from 'node:fs' +import { existsSync, lstatSync } from 'node:fs' import { join } from 'node:path' /** @@ -36,6 +36,19 @@ export function candidatePwshPaths(env: NodeJS.ProcessEnv = process.env): string return candidates } +/** Whether a candidate can be spawned: a real file or a link-shaped reparse point. */ +function candidateExists(candidate: string): boolean { + if (existsSync(candidate)) return true + // Microsoft Store app execution aliases are reparse points whose target + // ACL refuses stat(), so existsSync misses them; lstat sees the link + // itself and CreateProcess resolves it when the executor spawns. + try { + return lstatSync(candidate).isSymbolicLink() + } catch { + return false + } +} + /** * Resolve the pwsh executable this executor spawns. * @param configured - an explicit `pwshPath` config value, trusted as-is. @@ -53,7 +66,7 @@ export function resolvePwshPath( if (configured !== undefined && configured.length > 0) return configured if (platform === 'win32') { for (const candidate of candidatePwshPaths(env)) { - if (existsSync(candidate)) return candidate + if (candidateExists(candidate)) return candidate } } return 'pwsh' diff --git a/packages/shell/pwsh-local/tests/executor.spec.ts b/packages/shell/pwsh-local/tests/executor.spec.ts index 2336d216ca..f838c2f577 100644 --- a/packages/shell/pwsh-local/tests/executor.spec.ts +++ b/packages/shell/pwsh-local/tests/executor.spec.ts @@ -9,7 +9,7 @@ * writes CRLF on Windows, so exact text assertions normalize line endings. */ -import { mkdirSync, mkdtempSync, realpathSync, writeFileSync } from 'node:fs' +import { mkdirSync, mkdtempSync, realpathSync, symlinkSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { spawnSync } from 'node:child_process' @@ -126,6 +126,18 @@ describe('resolvePwshPath and candidatePwshPaths (pure, every platform)', () => expect(resolvePwshPath(undefined, { ProgramFiles: join(dir, 'missing'), PATH: join(dir, 'empty'), SystemRoot: join(dir, 'no-windows') }, 'win32')) .toBe('pwsh') }) + + it('accepts a link-shaped PATH candidate whose target cannot be stat-ed', () => { + // Store app execution aliases stat as EACCES but lstat as a link; a + // dangling symlink reproduces that split on every platform. + const dir = mkdtempSync(join(tmpdir(), 'dsh-pwsh-resolve-link-')) + const store = join(dir, 'store') + mkdirSync(store, { recursive: true }) + const link = join(store, 'pwsh.exe') + symlinkSync(join(dir, 'no-such-target.exe'), link) + expect(resolvePwshPath(undefined, { ProgramFiles: join(dir, 'missing'), PATH: store }, 'win32')) + .toBe(link) + }) }) describe('spawn construction (pure, every platform)', () => { @@ -298,8 +310,10 @@ describe.skipIf(!hasPwsh)('PwshLocalExecutor.start (background process handles)' it('start returns immediately with a running handle that settles as completed', async () => { const { bash } = await setup() const before = Date.now() - const proc = bash.start(bash.resolve({ command: 'Start-Sleep -Milliseconds 200; Write-Output done' })) - expect(Date.now() - before).toBeLessThan(150) + // The sleep outlasts any realistic spawn latency, so returning while the + // child still sleeps proves start() does not wait for completion. + const proc = bash.start(bash.resolve({ command: 'Start-Sleep -Milliseconds 2000; Write-Output done' })) + expect(Date.now() - before).toBeLessThan(1000) expect(proc.status).toBe('running') await proc.done expect(proc.status).toBe('completed') From 095fde4ffd4d93bb69aff0ae05ea3789c0e3891b Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 14:04:57 +0800 Subject: [PATCH 046/103] test(claude-code): isolate ambient Anthropic model env --- .../tests/real-product.spec.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/subagent/subagent-claude-code/tests/real-product.spec.ts b/packages/subagent/subagent-claude-code/tests/real-product.spec.ts index 0ccd897fe9..f6767817c8 100644 --- a/packages/subagent/subagent-claude-code/tests/real-product.spec.ts +++ b/packages/subagent/subagent-claude-code/tests/real-product.spec.ts @@ -17,7 +17,7 @@ import type { SDKSystemMessage, } from '@anthropic-ai/claude-agent-sdk' import { Context } from '@deepseek-ai/cordis' -import { afterEach, describe, expect, it, vi } from 'vitest' +import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from 'vitest' import type { Agent } from '@deepseek-ai/dsh-agent' import SubagentRuntime from '@deepseek-ai/dsh-subagent' import type { SubprocessHandle, SubprocessSpawnSpec } from '@deepseek-ai/dsh-subprocess' @@ -87,6 +87,22 @@ const roots: string[] = [] const fixtures: MessagesFixture[] = [] const contexts: Context[] = [] +// Ambient Anthropic model env leaks into the real CLI and overrides the +// fixture settings.json on developer machines; delete it for this file and +// restore it after, like the workspace-context USERPROFILE isolation. +const ambientAnthropicModel = process.env.ANTHROPIC_MODEL +const ambientAnthropicSmallFastModel = process.env.ANTHROPIC_SMALL_FAST_MODEL + +beforeAll(() => { + delete process.env.ANTHROPIC_MODEL + delete process.env.ANTHROPIC_SMALL_FAST_MODEL +}) + +afterAll(() => { + if (ambientAnthropicModel !== undefined) process.env.ANTHROPIC_MODEL = ambientAnthropicModel + if (ambientAnthropicSmallFastModel !== undefined) process.env.ANTHROPIC_SMALL_FAST_MODEL = ambientAnthropicSmallFastModel +}) + afterEach(async () => { await Promise.all(contexts.splice(0).map(ctx => ctx.fiber.dispose())) await Promise.all(fixtures.splice(0).map(fixture => fixture.close())) From 7593842ccfa01b89a83ce5ae999e689bd65121bd Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 15:11:05 +0800 Subject: [PATCH 047/103] fix(workflow): forward the tsconfig pin only in the unbuilt worker --- .../workflow-worker-thread/src/host.ts | 13 ++++++---- .../tests/workflow-worker-thread.spec.ts | 24 ++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/workflow/workflow-worker-thread/src/host.ts b/packages/workflow/workflow-worker-thread/src/host.ts index 9e0c3a514a..fee869753f 100644 --- a/packages/workflow/workflow-worker-thread/src/host.ts +++ b/packages/workflow/workflow-worker-thread/src/host.ts @@ -38,18 +38,21 @@ interface ChildRecord { * The unbuilt shape additionally forwards `TSX_TSCONFIG_PATH` for path * resolution. * @param platform - host platform; overridable so tests exercise both peer arms. + * @param tsconfigPath - the tsconfig pin to forward; only the unbuilt caller + * passes one, so the built worker never observes the host's pin. * @returns the scrubbed worker environment object. */ -export function workerSpawnEnv(platform: NodeJS.Platform = process.platform): NodeJS.ProcessEnv { +export function workerSpawnEnv( + platform: NodeJS.Platform = process.platform, + tsconfigPath: string | undefined = undefined, +): NodeJS.ProcessEnv { const env: NodeJS.ProcessEnv = {} if (platform === 'win32') { const tmp = tmpdir() env.TMP = tmp env.TEMP = tmp } - if (process.env.TSX_TSCONFIG_PATH !== undefined) { - env.TSX_TSCONFIG_PATH = process.env.TSX_TSCONFIG_PATH - } + if (tsconfigPath !== undefined) env.TSX_TSCONFIG_PATH = tsconfigPath return env } @@ -81,7 +84,7 @@ function resolveWorkerSpawn(init: WorkerInit): { entry: string | URL; options: W entry: new URL(`data:text/javascript,${encodeURIComponent(bootstrap)}`), options: { workerData: init, - env: workerSpawnEnv(), + env: workerSpawnEnv(undefined, process.env.TSX_TSCONFIG_PATH), execArgv: [], }, } diff --git a/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts b/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts index 275c92269e..5130071362 100644 --- a/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts +++ b/packages/workflow/workflow-worker-thread/tests/workflow-worker-thread.spec.ts @@ -570,6 +570,11 @@ describe('dsh-workflow-worker-thread', () => { // inside the worker resolves instead of degrading to a cwd-relative // `undefined\temp` (tsx writes its transform cache there). process.env.WORKFLOW_ENV_CANARY = 'leak me' + // The unbuilt worker forwards TSX_TSCONFIG_PATH (a path pin, not a + // credential); clear it so this test observes the empty ambient case + // regardless of the parent's environment. + const tsconfigPath = process.env.TSX_TSCONFIG_PATH + delete process.env.TSX_TSCONFIG_PATH try { const result = await run(ctx, parent, scripted(` const proc = ${ESCAPE} @@ -579,6 +584,8 @@ describe('dsh-workflow-worker-thread', () => { const expectedKeys = process.platform === 'win32' ? ['TEMP', 'TMP'] : [] expect(result.value).toEqual({ canary: null, keys: expectedKeys }) } finally { + if (tsconfigPath === undefined) delete process.env.TSX_TSCONFIG_PATH + else process.env.TSX_TSCONFIG_PATH = tsconfigPath delete process.env.WORKFLOW_ENV_CANARY } }) @@ -591,17 +598,12 @@ describe('dsh-workflow-worker-thread', () => { it('workerSpawnEnv forwards TSX_TSCONFIG_PATH when the snapshot harness pins it', () => { const tsconfig = fileURLToPath(new URL('../../../../tsconfig.json', import.meta.url)) - vi.stubEnv('TSX_TSCONFIG_PATH', tsconfig) - try { - expect(workerSpawnEnv('linux')).toEqual({ TSX_TSCONFIG_PATH: tsconfig }) - expect(workerSpawnEnv('win32')).toEqual({ - TMP: tmpdir(), - TEMP: tmpdir(), - TSX_TSCONFIG_PATH: tsconfig, - }) - } finally { - vi.unstubAllEnvs() - } + expect(workerSpawnEnv('linux', tsconfig)).toEqual({ TSX_TSCONFIG_PATH: tsconfig }) + expect(workerSpawnEnv('win32', tsconfig)).toEqual({ + TMP: tmpdir(), + TEMP: tmpdir(), + TSX_TSCONFIG_PATH: tsconfig, + }) }) it('the unbuilt worker forwards exactly TSX_TSCONFIG_PATH through the scrub: the paths-map pin survives, secrets do not', async () => { From 29d420f1eee0f95674b8833461462f35fb16b6d8 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 15:11:20 +0800 Subject: [PATCH 048/103] fix(pwsh): accept link-shaped candidates and sync the README contract --- packages/shell/pwsh-local/README.i18n.yaml | 4 ++-- packages/shell/pwsh-local/README.md | 2 +- packages/shell/pwsh-local/README.zh.md | 2 +- packages/shell/pwsh-local/src/resolve.ts | 20 ++++++++++++------- .../shell/pwsh-local/tests/executor.spec.ts | 11 ++++++++++ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/shell/pwsh-local/README.i18n.yaml b/packages/shell/pwsh-local/README.i18n.yaml index 84e7bfa43e..c9ce9f1d6b 100644 --- a/packages/shell/pwsh-local/README.i18n.yaml +++ b/packages/shell/pwsh-local/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/shell/pwsh-local/README.md -README.md: cfb58b569022bca11d18c196e0bce104247e4c81 -README.zh.md: 9393c5d210743d8423457f2d7df5900c1e0df182 +README.md: 2eccc59b919d1f729eef52a42581f4da0f1d9e60 +README.zh.md: a03f80343711a1471bc96017e23476a3253ec46c diff --git a/packages/shell/pwsh-local/README.md b/packages/shell/pwsh-local/README.md index cfb58b5690..2eccc59b91 100644 --- a/packages/shell/pwsh-local/README.md +++ b/packages/shell/pwsh-local/README.md @@ -30,7 +30,7 @@ The Windows counterpart of `dsh-bash-local`, deliberately mirroring its semantic - **Spawn per call, no shell state** — every call is a fresh non-interactive `pwsh -Command` (deterministic; no profile files). The `-NoLogo -NoProfile -NonInteractive` flags disable startup banners, profile loading, and prompts that would garble tool output. - **The composition entry is a layer, not the last word** — when a settings provider is composed, this executor registers the capability's [`bash` namespace](../shell/README.md) with the entry above as its base, so a user section in `settings.yaml` layers over it and the next command runs with the new budgets. The namespace is shared with the POSIX family because a host composes exactly one provider of `ctx.shell`; a document written on either platform keeps resolving on the other. Values the schema cannot judge (positive and finite, the `graceMs` timer bound) are refused at the write, leaving the running executor on its last good section. - **UTF-8 output pinned** — every command runs with `[Console]::OutputEncoding` and `$OutputEncoding` set to UTF-8 first, so the Windows PowerShell 5.1 fallback (or any host whose console code page is not UTF-8) cannot garble non-ASCII output: the subprocess collector decodes bytes as UTF-8. Input encoding is left at the host default; pwsh 7 defaults to UTF-8 and is unaffected. -- **Executable resolution** — `resolvePwshPath` prefers an explicit `pwshPath`, then on Windows probes PowerShell 7's install location, every PATH entry (Microsoft Store installs; surrounding quotes stripped), and Windows PowerShell 5.1 as a legacy last resort, checking `existsSync` on each; elsewhere it falls back to a bare `pwsh` resolved through PATH. Resolution is a pure function of `(configured, env, platform)`; it runs at construction and again only when a stored `pwshPath` differs from the one the current executable was resolved from, so an unrelated settings change never re-probes the filesystem. +- **Executable resolution** — `resolvePwshPath` prefers an explicit `pwshPath`, then on Windows probes PowerShell 7's install location, every PATH entry (Microsoft Store installs; surrounding quotes stripped), and Windows PowerShell 5.1 as a legacy last resort, checking each candidate with an lstat probe that accepts a real file or a link-shaped reparse point (a Store app execution alias stat-fails against its target's ACL, but lstat sees the alias itself); elsewhere it falls back to a bare `pwsh` resolved through PATH. Resolution is a pure function of `(configured, env, platform)`; it runs at construction and again only when a stored `pwshPath` differs from the one the current executable was resolved from, so an unrelated settings change never re-probes the filesystem. - **Configured budgets over managed groups** — `resolve()` fills `workdir`/`timeoutMs`/`stdoutMaxBytes` from config, and every spawn hands the service explicit byte caps, spill cap, and `graceMs`. The grace must be positive, finite, and no greater than [`MAX_TIMER_DELAY_MS`](../../util/timeout/README.md), so Node can represent it with one timer. Tree termination (taskkill on Windows, process-group signals on POSIX), the post-exit pipe-drain grace, tail-keep truncation, and bounded spill files are [`dsh-subprocess-local`](../../subprocess/subprocess-local/README.md) mechanics. A foreground `ShellExecRequest.stdoutMaxBytes` can raise stdout's capture budget for one trusted caller; stderr and background runs still use `maxOutputBytes`. - **Timeout and cancel classification** — `run()` fuses its config-clamped timeout with the caller's signal through one deadline; only the executor's own timeout reports `timedOut`, an upstream cancel reports `aborted`, and a self-terminated command reports neither ([timeout-library Agent Note](../../../.agents/notes/implemented/architecture/2026-07-06-timeout-deadline-library.md)). Windows reports forced termination as exit 1 without a signal, so signal-stamped facts (`signal`, `killed` status) are POSIX-only there; the timeout/abort classification is platform-independent. - **Model-friendly terminal env** — `NO_COLOR=1 PAGER=cat GIT_PAGER=cat` (no `TERM=dumb`: that is a POSIX concept; `NO_COLOR` is honored by modern PowerShell renderers) merged as ordinary env under the service's credential scrub and `DSH_*` channel rules; an explicit caller entry still wins. diff --git a/packages/shell/pwsh-local/README.zh.md b/packages/shell/pwsh-local/README.zh.md index 9393c5d210..a03f803437 100644 --- a/packages/shell/pwsh-local/README.zh.md +++ b/packages/shell/pwsh-local/README.zh.md @@ -30,7 +30,7 @@ - **每次调用新建进程,无 shell 状态**——每次调用都是全新的非交互 `pwsh -Command`(确定性;不加载 profile 文件)。`-NoLogo -NoProfile -NonInteractive` 关闭启动横幅、profile 加载与会干扰工具输出的提示符。 - **组装条目是一层,而不是最终值**——当组装中存在 settings 提供方时,本执行器以上面的条目为 base 注册该能力的 [`bash` 命名空间](../shell/README.md),因此 `settings.yaml` 中的用户段会叠加其上,下一条命令即按新预算运行。该命名空间与 POSIX 家族共用,因为一个宿主只组装一个 `ctx.shell` 提供方;在任一平台写下的文档在另一平台仍能解析。schema 无法判定的值(正有限、`graceMs` 的定时器上界)会在写入时被拒绝,运行中的执行器保持它最后一份可用的段。 - **UTF-8 输出固定**——每条命令都先以 UTF-8 设置 `[Console]::OutputEncoding` 与 `$OutputEncoding`,因此 Windows PowerShell 5.1 兜底(或任何控制台代码页非 UTF-8 的主机)不会破坏非 ASCII 输出:subprocess 收集器以 UTF-8 解码字节。输入编码保持宿主默认;pwsh 7 默认为 UTF-8,不受影响。 -- **可执行文件解析**——`resolvePwshPath` 优先显式 `pwshPath`,然后在 Windows 上依次探测 PowerShell 7 安装位置、每个 PATH 条目(Microsoft Store 安装;剥离两端引号)以及作为遗留兜底的 Windows PowerShell 5.1,逐一检查 `existsSync`;其他平台回退为通过 PATH 解析的裸 `pwsh`。解析是 `(configured, env, platform)` 的纯函数;它在构造时执行,此后仅当存储的 `pwshPath` 与当前可执行文件所依据的值不同才再次执行,因此无关的设置变更绝不会重新探测文件系统。 +- **可执行文件解析**——`resolvePwshPath` 优先显式 `pwshPath`,然后在 Windows 上依次探测 PowerShell 7 安装位置、每个 PATH 条目(Microsoft Store 安装;剥离两端引号)以及作为遗留兜底的 Windows PowerShell 5.1,逐一用 lstat 探测检查(接受真实文件或链接形态的重解析点:Store 的 app execution alias 对其目标 stat 会因 ACL 失败,但 lstat 能看到别名本身);其他平台回退为通过 PATH 解析的裸 `pwsh`。解析是 `(configured, env, platform)` 的纯函数;它在构造时执行,此后仅当存储的 `pwshPath` 与当前可执行文件所依据的值不同才再次执行,因此无关的设置变更绝不会重新探测文件系统。 - **受管进程组之上的配置预算**——`resolve()` 从配置填充 `workdir`/`timeoutMs`/`stdoutMaxBytes`,每次 spawn 都向服务提供显式字节上限、spill 上限与 `graceMs`。该宽限期须为正有限值,且不得大于 [`MAX_TIMER_DELAY_MS`](../../util/timeout/README.md),这样 Node 就能用一个定时器表示它。进程树终止(Windows 用 taskkill,POSIX 用进程组信号)、退出后管道排空宽限、保尾截断与有界 spill 文件是 [`dsh-subprocess-local`](../../subprocess/subprocess-local/README.md) 的机制。前台 `ShellExecRequest.stdoutMaxBytes` 可为单个受信调用方提高 stdout 捕获预算;stderr 与后台运行仍使用 `maxOutputBytes`。 - **超时与取消分类**——`run()` 通过一个 deadline 融合按配置上限截取的超时与调用方信号;只有执行器自身超时报告 `timedOut`,上游取消报告 `aborted`,自我终止的命令两者都不报告(见 [timeout 库 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-06-timeout-deadline-library.md))。Windows 将强制终止报告为退出码 1 且无信号,因此带信号标记的事实(`signal`、`killed` 状态)在那里仅限 POSIX;超时/取消分类与平台无关。 - **面向模型的终端环境**——`NO_COLOR=1 PAGER=cat GIT_PAGER=cat`(没有 `TERM=dumb`:那是 POSIX 概念;现代 PowerShell 渲染器遵循 `NO_COLOR`),作为普通 env 在服务的凭据清理与 `DSH_*` 通道规则之下合并;显式调用方条目仍然优先。 diff --git a/packages/shell/pwsh-local/src/resolve.ts b/packages/shell/pwsh-local/src/resolve.ts index f090c2b4c1..191abba963 100644 --- a/packages/shell/pwsh-local/src/resolve.ts +++ b/packages/shell/pwsh-local/src/resolve.ts @@ -8,7 +8,7 @@ * @module @deepseek-ai/dsh-pwsh-local/resolve */ -import { existsSync, lstatSync } from 'node:fs' +import { lstatSync } from 'node:fs' import { join } from 'node:path' /** @@ -36,15 +36,21 @@ export function candidatePwshPaths(env: NodeJS.ProcessEnv = process.env): string return candidates } -/** Whether a candidate can be spawned: a real file or a link-shaped reparse point. */ +/** + * Whether a candidate can be spawned. lstat opens the entry itself instead of + * following reparse points, so it sees the Store app execution alias where + * stat hits the target's ACL (EACCES); Node reports that alias as a symlink + * on current releases and as a plain file on older ones, and CreateProcess + * resolves either shape. A real directory never matches. + */ function candidateExists(candidate: string): boolean { - if (existsSync(candidate)) return true - // Microsoft Store app execution aliases are reparse points whose target - // ACL refuses stat(), so existsSync misses them; lstat sees the link - // itself and CreateProcess resolves it when the executor spawns. try { - return lstatSync(candidate).isSymbolicLink() + const stat = lstatSync(candidate) + return stat.isFile() || stat.isSymbolicLink() } catch { + // ENOENT (the candidate vanished between listing and probing) is the only + // expected failure; any other error names an unspawnable path, so false + // is the safe answer for it too. return false } } diff --git a/packages/shell/pwsh-local/tests/executor.spec.ts b/packages/shell/pwsh-local/tests/executor.spec.ts index f838c2f577..e26211b268 100644 --- a/packages/shell/pwsh-local/tests/executor.spec.ts +++ b/packages/shell/pwsh-local/tests/executor.spec.ts @@ -138,6 +138,17 @@ describe('resolvePwshPath and candidatePwshPaths (pure, every platform)', () => expect(resolvePwshPath(undefined, { ProgramFiles: join(dir, 'missing'), PATH: store }, 'win32')) .toBe(link) }) + + it('skips a directory candidate and falls through to the PATH-resolution default', () => { + const dir = mkdtempSync(join(tmpdir(), 'dsh-pwsh-resolve-dir-')) + const store = join(dir, 'store') + mkdirSync(join(store, 'pwsh.exe'), { recursive: true }) + expect(resolvePwshPath(undefined, { + ProgramFiles: join(dir, 'missing'), + PATH: store, + SystemRoot: join(dir, 'no-windows'), + }, 'win32')).toBe('pwsh') + }) }) describe('spawn construction (pure, every platform)', () => { From 314fedfc14d3fbc14328147515befda34e93dcf8 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 15:11:38 +0800 Subject: [PATCH 049/103] docs: record the junction-safe fixture teardown decision --- ...-fixture-junctions-before-delete.i18n.yaml | 6 +++++ ...-unlink-fixture-junctions-before-delete.md | 23 +++++++++++++++++++ ...link-fixture-junctions-before-delete.zh.md | 23 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md create mode 100644 .agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml new file mode 100644 index 0000000000..160f947daa --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md +2026-08-12-unlink-fixture-junctions-before-delete.md: 4514a33d728866b817f4e9c1393f16c07976ed45 +2026-08-12-unlink-fixture-junctions-before-delete.zh.md: 3c212c052ab0303ccb8d31d2b310a365a1d8cc99 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md new file mode 100644 index 0000000000..4514a33d72 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md @@ -0,0 +1,23 @@ +# Agent Note: Unlink fixture junctions before recursive deletion + +Status: implemented + +English | [中文](2026-08-12-unlink-fixture-junctions-before-delete.zh.md) + +## Problem + +The install-lefthook and translation-pairing fixtures junction the repository's real `scripts/`, `node_modules`, and tsx package directories into fixture trees so installer probes resolve through them. Windows recursive deletion can treat a junction (a MOUNT_POINT reparse point) as a directory and follow it into its target; Git's `worktree remove` did exactly that and deleted the repository's tracked `scripts/` and tsx package (the incident's instrumentation pinned the deletion to that step). A fixture cleanup that trusts its deleter therefore deletes the repository's own sources instead of the fixture. + +## Decision + +`scripts/test-fixture-cleanup.ts` owns junction-safe fixture teardown: `unlinkFixtureLinks` walks a tree and unlinks every reparse point before `removeFixtureSafely` removes the now link-free tree (with Windows async-handle retries). Every affected `afterEach` and the pre-`worktree remove` hook call it. The general rule lives in `docs/defensive-patterns.md`: remove link-shaped paths with unlink, reserve recursive `rmSync` for known real directories. + +## Alternatives considered + +**Trust recursive deletion alone.** Rejected: whether a given deleter follows junctions is tool- and version-dependent, and one path through `git worktree remove` already destroyed tracked files; no cleanup may bet the repository on that behavior. + +**Copy instead of junctioning the real directories.** Rejected: the fixtures exist to probe the real installer paths through their real contents, so copies would stop exercising the boundary under test. + +## Consequences + +Fixture teardown can no longer reach repository sources through junctions. The extra walk is one lstat/unlink pass over small fixture trees. The data-destroying defect now has its durable why beside the defensive-patterns rule, and the helper is the shared teardown path for future junction fixtures. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md new file mode 100644 index 0000000000..3c212c052a --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md @@ -0,0 +1,23 @@ +# Agent Note: 递归删除前先解链 fixture junction + +Status: implemented + +[English](2026-08-12-unlink-fixture-junctions-before-delete.md) | 中文 + +## 问题 + +install-lefthook 与 translation-pairing 的 fixture 把仓库真实的 `scripts/`、`node_modules` 和 tsx 包目录用 junction 链进 fixture 树,让 installer 探测能穿透解析。Windows 的递归删除可能把 junction(MOUNT_POINT 重解析点)当作目录并跟随进其目标;Git 的 `worktree remove` 正是这样删掉了仓库被跟踪的 `scripts/` 和 tsx 包(事故的插桩把删除定位到这一步)。因此,信任删除器的 fixture 清理删掉的是仓库自己的源码,而不是 fixture。 + +## 决策 + +`scripts/test-fixture-cleanup.ts` 拥有 junction 安全的 fixture 拆除:`unlinkFixtureLinks` 先遍历并解链所有重解析点,`removeFixtureSafely` 再删除已无链接的树(带 Windows 异步句柄重试)。所有受影响的 `afterEach` 和 `worktree remove` 前的钩子都调用它。通用规则记录在 `docs/defensive-patterns.md`:链接形态的路径用 unlink 删除,递归 `rmSync` 只留给确知为真实目录的路径。 + +## 考虑过的替代方案 + +**只信任递归删除。** 否决:特定删除器是否跟随 junction 随工具和版本而异,而 `git worktree remove` 这一条路径已经摧毁过被跟踪文件;任何清理都不该拿仓库去赌这个行为。 + +**复制而不是 junction 真实目录。** 否决:fixture 的意义就是用真实内容探测真实 installer 路径,复制品会失去被测边界。 + +## 后果 + +fixture 拆除不再能穿过 junction 触及仓库源码。额外开销只是对小型 fixture 树的一趟 lstat/unlink。这个摧毁数据的缺陷现在在 defensive-patterns 规则旁有了持久化的原因,helper 也是未来所有 junction fixture 共享的拆除路径。 From ed463d74bfce64463a8f39fd6c46df79670b8db3 Mon Sep 17 00:00:00 2001 From: Huanqi Cao Date: Wed, 12 Aug 2026 16:10:45 +0800 Subject: [PATCH 050/103] fix(workflow): use optional syntax for the tsconfig pin parameter --- packages/workflow/workflow-worker-thread/src/host.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/workflow/workflow-worker-thread/src/host.ts b/packages/workflow/workflow-worker-thread/src/host.ts index fee869753f..394b65ca8a 100644 --- a/packages/workflow/workflow-worker-thread/src/host.ts +++ b/packages/workflow/workflow-worker-thread/src/host.ts @@ -44,7 +44,7 @@ interface ChildRecord { */ export function workerSpawnEnv( platform: NodeJS.Platform = process.platform, - tsconfigPath: string | undefined = undefined, + tsconfigPath?: string, ): NodeJS.ProcessEnv { const env: NodeJS.ProcessEnv = {} if (platform === 'win32') { From b5a130063d8fb26a69765962e6d57f14fe4f02bc Mon Sep 17 00:00:00 2001 From: Chinesezjc Date: Thu, 13 Aug 2026 15:09:44 +0800 Subject: [PATCH 051/103] fix(scripts): widen fixture-cleanup EPERM retry window The failover Windows pool releases child-process and antivirus file handles slower than the hosted pool; a 1-second window (10 x 100 ms) still exhausts before release under load, so install-lefthook fixture cleanup threw EPERM in rmSync. A 10-second window (50 x 200 ms) covers the slower release without pinning afterEach cleanup, since a terminated child's handles drain once rather than reacquire. --- scripts/test-fixture-cleanup.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/test-fixture-cleanup.ts b/scripts/test-fixture-cleanup.ts index 9c58eea890..bf6fb18fea 100644 --- a/scripts/test-fixture-cleanup.ts +++ b/scripts/test-fixture-cleanup.ts @@ -37,10 +37,13 @@ export function unlinkFixtureLinks(path: string): void { * Remove one fixture tree after its junctions are unlinked (see * {@link unlinkFixtureLinks}). Retries the removal: Windows releases child * process and antivirus file handles asynchronously, and an unretried - * `rmSync` fails immediately with EPERM under load. + * `rmSync` fails immediately with EPERM under load. A 10-second retry window + * (50 attempts × 200 ms) covers the failover pool's slow handle release; + * release is one-shot (a terminated child's handles drain, not reacquired), + * so a bounded window suffices and never pins afterEach cleanup. * @param path - the fixture tree to remove. */ export function removeFixtureSafely(path: string): void { unlinkFixtureLinks(path) - rmSync(path, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) + rmSync(path, { recursive: true, force: true, maxRetries: 50, retryDelay: 200 }) } From 1b03574fb5f9bc1f7f912b3c7f4a3396d059e67b Mon Sep 17 00:00:00 2001 From: j-xiang Date: Thu, 13 Aug 2026 15:25:00 +0800 Subject: [PATCH 052/103] docs(i18n): address focused README review --- packages/README.i18n.yaml | 2 +- packages/README.zh.md | 6 +++--- packages/core/agent-loop/README.i18n.yaml | 2 +- packages/core/agent-loop/README.zh.md | 10 +++++----- packages/core/system-prompt/README.i18n.yaml | 2 +- packages/core/system-prompt/README.zh.md | 16 ++++++++-------- packages/llm/llm/README.i18n.yaml | 2 +- packages/llm/llm/README.zh.md | 10 +++++----- packages/subagent/subagent/README.i18n.yaml | 2 +- packages/subagent/subagent/README.zh.md | 16 ++++++++-------- 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/packages/README.i18n.yaml b/packages/README.i18n.yaml index 06703a62c7..e9fed2a793 100644 --- a/packages/README.i18n.yaml +++ b/packages/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/README.md README.md: 7904ec1fea8dbab361fcd90b2b32f1c743ce5537 -README.zh.md: f95a9b2868f13e0c3ad58bc6507b3615c76bc7dc +README.zh.md: 2d6b1de9f1f957ebeefeae297860408a4c3cd498 diff --git a/packages/README.zh.md b/packages/README.zh.md index f95a9b2868..2d6b1de9f1 100644 --- a/packages/README.zh.md +++ b/packages/README.zh.md @@ -22,12 +22,12 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` 子类和函数插件通 | [`subprocess/`](subprocess/README.md) | 子进程能力系列:Service Definition + 本地进程树提供方 | 产品:稳定 API | | [`shell/`](shell/README.md) | Bash 能力系列:执行器 seam、本地实现、面向模型的工具 | 产品:稳定 API | | [`terminal/`](terminal/README.md) | 持久 PTY 能力系列:限定所有者范围的会话、本地实现和面向模型的工具 | 产品:稳定 API | -| [`code-runtime/`](code-runtime/README.md) | 代码执行能力系列:Service Definition + worker 线程提供方 + Code Mode 消费方 | 产品:稳定 API | +| [`code-runtime/`](code-runtime/README.md) | 代码执行能力系列:Service Definition + worker 线程提供方 + Code Mode Consumer | 产品:稳定 API | | [`sandbox/`](sandbox/README.md) | 进程限制 seam;bwrap/Landlock/Seatbelt 后端 | 产品:稳定 API | | [`fs/`](fs/README.md) | 文件系统能力系列:seam、本地实现、面向模型的文件工具、由 bash 支持的发现工具 | 产品:稳定 API | | [`lsp/`](lsp/README.md) | LSP 能力系列:seam、通用 stdio 提供方和 `lsp` 工具 | 产品:稳定 API | | [`skill/`](skill/README.md) | skill(技能)能力系列:提供方注册表、本地提供方和面向模型的目录/loader | 产品:稳定 API | -| [`compaction/`](compaction/README.md) | 压缩(compaction)能力系列:Service Definition + 基础提供方 + 命令消费方 | 产品:稳定 API | +| [`compaction/`](compaction/README.md) | 压缩(compaction)能力系列:Service Definition + 基础提供方 + 命令 Consumer | 产品:稳定 API | | [`context/`](context/README.md) | 模型可见请求上下文,包括 workspace 指令和时间上下文 | 产品:稳定 API | | [`subagent/`](subagent/README.md) | subagent 能力系列:提供方注册表约定和面向模型的委托工具 | 产品:稳定 API | | [`jobs/`](jobs/README.md) | 通用后台任务运行时和面向模型的 `job_*` 控制工具 | 产品:稳定 API | @@ -64,6 +64,6 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` 子类和函数插件通 依赖图由工具生成:[docs/module-graph.md](../docs/module-graph.md)(`pnpm run gen-module-graph`,CI 中有新鲜度门禁)。 -**扩展插件依赖 Service Definition,绝不依赖具体提供方。** `dsh-agent-loop` 可替换;UI、钩子和工具插件使用 `dsh-agent`。包括 `dsh-agent-spine-demo` 在内的组合包可以依赖主干插件。能力会将需要独立演进的 Service Definition/Service Provider/消费方角色分离;详见[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)。 +**扩展插件依赖 Service Definition,绝不依赖具体提供方。** `dsh-agent-loop` 可替换;UI、钩子和工具插件使用 `dsh-agent`。包括 `dsh-agent-spine-demo` 在内的组合包可以依赖主干插件。能力会将需要独立演进的 Service Definition/Service Provider/Consumer 角色分离;详见[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)。 包 README 覆盖用途、API、扩展点和[模型体验](../docs/cookbook/adding-a-package.md#4-write-the-package-readme);列入模型无关[省略允许清单](../scripts/verify-package-readme-model-experience.ts)的包除外。它们还要包含 `## Known Limitations and Deferred Work`,或列入其[允许清单](../scripts/verify-package-readme-limitations.ts)。 diff --git a/packages/core/agent-loop/README.i18n.yaml b/packages/core/agent-loop/README.i18n.yaml index 00967e2c50..4d7aa55bd0 100644 --- a/packages/core/agent-loop/README.i18n.yaml +++ b/packages/core/agent-loop/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/core/agent-loop/README.md README.md: 683799d1840c857981d4ff30dd3e8e078be03098 -README.zh.md: 75e4196795bc24fcdca4bd9a949adab9588e8152 +README.zh.md: 8ccc4a0b0d55c1660ee63405abc423d0ee2a8557 diff --git a/packages/core/agent-loop/README.zh.md b/packages/core/agent-loop/README.zh.md index 75e4196795..8ccc4a0b0d 100644 --- a/packages/core/agent-loop/README.zh.md +++ b/packages/core/agent-loop/README.zh.md @@ -14,13 +14,13 @@ agent(智能体)的唯一具体实现插件和循环驱动器。其包内部 调用方 fiber 与 AgentLoop 提供方共同拥有 agent。`AgentFactory.createAgent(ownerCtx, options)` 与 `resume(ownerCtx, options)` 显式接收调用方所有权,而工厂为 `sessions`/`llm`/`tools`/`systemPrompt` 保留自身的依赖上下文;这样,调用方可以只注入 `agents`,而不会缩减新 agent 的服务接口。调用方卸载、handle dispose(资源释放)或提供方卸载都会汇合到同一个记忆化的完全停稳边界。提供方关闭会同时等待资源 teardown,以及已经观测到停用的公开 create/resume 包装层,因此依赖消失后,任何 continuation 都无法继续发布。 -每个 agent 与其会话共享一个由调用方选择的 `SessionId`,并假设它在全局唯一;意外的 UUID 冲突不属于受支持模型。两个使用同一 id 的并发操作都可以进行准备,但最终的 `enter()` 调用会裁决发布,所有失败方都会回滚各自的私有资源。每次 detach 都绑定到确切进入的对象,因此陈旧 disposer 无法移除之后出现的同 id 替代项。在同步创建通知期间请求的 detach 会等待该次分发退栈,从而保留 created/disposed 配对。Teardown 按以下顺序执行:停止并排空 → 撤销作用域 → 分离 agent → 分离会话。私有作用域清理完成后,该 id 即可复用。不具否决能力的普通 `agent/*` 通知通过 `agentEvents(ctx, agent)` 发出;逐步骤组装通过 `assembleContextFor(agent)` 完成。 +每个 agent 与其会话共享一个由调用方选择的 `SessionId`,并假设它在全局唯一;意外的 UUID 冲突不属于受支持模型。两个使用同一 id 的并发操作都可以进行准备,但最终的 `enter()` 调用会裁决发布,所有失败方都会回滚各自的私有资源。每次 detach 都绑定到确切进入的对象,因此陈旧 disposer 无法移除之后出现的同 id 替代项。在同步创建通知期间请求的 detach 会等待该次分发退栈,从而保留 created/disposed 配对。Teardown 按以下顺序执行:停止并排空 → 撤销作用域 → detach agent → detach 会话。私有作用域清理完成后,该 id 即可复用。不具否决能力的普通 `agent/*` 通知通过 `agentEvents(ctx, agent)` 发出;逐步骤组装通过 `assembleContextFor(agent)` 完成。 - `ctx.agentLoop.create(id: SessionId, options?: AgentOptions, meta?: { cwd?: string }): Agent`:在确切共享的 agent/会话 id 下同步创建,不运行 setup,并随调用方 fiber 一同 dispose。声明式配置把 `agents[].id` 视为稳定 label,通常会先生成 `${label}-session-`,再调用此边界。应用也可以提供稳定且确切的 `sessionId`:首次使用时创建;重新挂载且持久化内容已存在时,则恢复已经实体化的历史。`resumeSessionId` 要求并加载现有的持久化 id,且与 `sessionId` 互斥。这样,默认情况下每次重启都会创建新会话,从而避免冲突,也无需保留第二个实时路由身份。 `AgentLoop` 还实现 `AgentFactory` 约定,并通过 `ctx.agents.setFactory(this)` 注册自身,因此插件会通过 `ctx.agents` 创建/恢复 agent: -- `ctx.agents.create({ sessionId, meta?, seed?, agentOptions?, setup?, signal? }): Promise`:使用调用方提供的共享 id 以编程方式创建。它会等待尚未发布的 setup 事务,然后才返回;`meta` 携带 cwd/谱系/seed 边界元数据,`seed` 则在会话边界验证并快照持久值后,重建 fork 子级的前缀。`signal` 只在此 Promise 结算前生效。返回的 [`AgentHandle`](../agent/README.md) 持有该 agent 的确切 teardown 能力。 +- `ctx.agents.create({ sessionId, meta?, seed?, agentOptions?, setup?, signal? }): Promise`:使用调用方提供的共享 id 以编程方式创建。它会等待尚未发布的 setup 事务,然后才返回;`meta` 携带 cwd/谱系/seed 边界元数据,`seed` 则在会话边界验证并快照持久值后,重建 fork 子级的前缀。`signal` 只在此 Promise 结算前生效。返回的 [`AgentHandle`](../agent/README.md) 拥有确切的 teardown 能力。 - `ctx.agents.resume({ resumeSessionId, agentOptions?, setup?, signal? }): Promise`:通过 `ctx.sessionPersistence` 加载持久化会话(参见[会话持久化](../../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md)),使用同一 id 注册 agent,重建历史,然后针对全新且尚未发布的 agent 作用域等待 setup,再执行受回滚保护的发布。轮次编号和派生历史从已加载日志继续。此操作要求存在会话持久化后端(不会硬注入,因此非持久化 demo 仍能工作;缺少持久化时,`resume` 会以明确错误拒绝)。`signal` 仅用于创建。返回 `AgentHandle`。 配置驱动的 `ctx.agentLoop.create()` 路径让循环 fiber 拥有其 agent(该路径会丢弃 handle)。对于以编程方式创建的 agent,handle 持有者是唯一面向消费方的 teardown 能力;AgentLoop 提供方卸载是一条独立的结构性 teardown 边,而不是向应用代码公开的另一个 handle。 @@ -65,9 +65,9 @@ interface Config { 每次提供方调用成功结束时,都会恰好追加一个 `assistant/message` 完成锚点,包括无内容调用和以 `max-tokens` 结束的调用。该锚点原样记录组装后的内容,在 `sourceEventSeqs` 中列出确切的分片 seq(流没有分片时为 `[]`),并在用量可用时包含用量;空内容不会进入派生消息历史。 -在 `agent/request` 返回提供方/模型调用配置后,循环会调用 `ctx.llm.prepareCall()`,在活跃轮次信号的控制下校验由适配器持有的字段,并填入配置的推理(reasoning)强度和输出 token 默认值。准备完成的调用会在这次异步解析、`request/header` 日志记录和最终分派期间保留同一项确切的适配器注册,因此 HMR(热模块替换)不会把某个适配器的能力解析结果与另一适配器的请求混用。请求 header 会记录生效配置以及哪些字段来自适配器。下一次 waterfall(瀑布式事件)前,循环会从提议中移除这些带标记字段,使当前精确路由重新填入自身默认值;未带标记的显式设置会跨步骤和路由变化保留。没有已注册适配器的路由会保留原定配置,使 `llm/stream` 监听器可以接管并短路该请求;最终分派仍会以 `NO_ADAPTER` 拒绝未得到处理的路由。新循环实例在恢复时会遵循同一套适配器默认值标记规则。 +在 `agent/request` 返回提供方/模型调用配置后,循环会调用 `ctx.llm.prepareCall()`,在活跃轮次信号的控制下校验由适配器负责的字段,并填入配置的推理(reasoning)强度和输出 token 默认值。准备完成的调用会在这次异步解析、`request/header` 日志记录和最终分派期间保留同一项确切的适配器注册,因此 HMR(热模块替换)不会把某个适配器的能力解析结果与另一适配器的请求混用。请求 header 会记录生效配置以及哪些字段来自适配器。下一次 waterfall(瀑布式事件)前,循环会从提议中移除这些带标记字段,使当前精确路由重新填入自身默认值;未带标记的显式设置会跨步骤和路由变化保留。没有已注册适配器的路由会保留原定配置,使 `llm/stream` 监听器可以接管并短路该请求;最终分派仍会以 `NO_ADAPTER` 拒绝未得到处理的路由。新循环实例在恢复时会遵循同一套适配器默认值标记规则。 -插件失败会结束当前轮次,而不是结束循环。最终适配器选择、分发与迭代失败会以终止错误或中止结束的形式由 `ctx.llm` 传来,并进入 `agent/request-error`;middleware、结果处理、工具及其他扩展失败仍会抛出并直接关闭轮次。恢复逻辑会接收请求坐标、不可变的提供方事实、准备完成的适配器注册所捕获的不可变重试策略以及轮次信号;middleware 接管未准备路由时,该策略缺失。处理失败的监听器返回 `{ kind: 'retry' }`;未被处理的失败是终态。AgentLoop 为当前准入操作或轮次持有一个取消信号。有效的 `cancel(cause)` 在未设置 `keepInbox` 时清除待处理工作,并以协作方式中止该信号;空闲取消是空操作。abort 触发后、活动收敛到空闲前到达的唤醒输入会被锁存(`wakeRequested`),并在 driver 自身的收敛边界重放,无需再发一条唤醒 send 即可执行;`disposed` 取消从不锁存,而 agent 已处于空闲时发送的唤醒总是打开自己的 turn 边界(即使消息已被清除,状态也会显示瞬态 `idle → running → idle` 对)。持久 `turn/end` 为 `user` 和 `parent` 记录 `aborted`,dispose 则记录 `disposed`;未分发的模型工具调用会收到合成的 `tool/call` 与 `ABORTED_BEFORE_DISPATCH` 结果对。取消原因只影响报告方式,不影响如何处理在取消后完成终结的结果上下文。dispose 会等待忽略信号的工作完成,然后才从注册表移除。[显式取消决策](../../../.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.md)与[取消收敛窗口唤醒锁存](../../../.agents/notes/implemented/bug-fix/2026-08-07-cancel-convergence-wake-latch.md)规定生命周期与竞态约定。 +插件失败会结束当前轮次,而不是结束循环。最终适配器选择、分发与迭代失败会以终止错误或中止结束的形式由 `ctx.llm` 传来,并进入 `agent/request-error`;middleware、结果处理、工具及其他扩展失败仍会抛出并直接关闭轮次。恢复逻辑会接收请求坐标、不可变的提供方事实、准备完成的适配器注册所捕获的不可变重试策略以及轮次信号;middleware 接管未准备路由时,该策略缺失。处理失败的监听器返回 `{ kind: 'retry' }`;未被处理的失败是终态。AgentLoop 为当前准入操作或轮次管理一个取消信号。有效的 `cancel(cause)` 在未设置 `keepInbox` 时清除待处理工作,并以协作方式中止该信号;空闲取消是空操作。abort 触发后、活动收敛到空闲前到达的唤醒输入会被锁存(`wakeRequested`),并在 driver 自身的收敛边界重放,无需再发一条唤醒 send 即可执行;`disposed` 取消从不锁存,而 agent 已处于空闲时发送的唤醒总是打开自己的 turn 边界(即使消息已被清除,状态也会显示瞬态 `idle → running → idle` 对)。持久 `turn/end` 为 `user` 和 `parent` 记录 `aborted`,dispose 则记录 `disposed`;未分发的模型工具调用会收到合成的 `tool/call` 与 `ABORTED_BEFORE_DISPATCH` 结果对。取消原因只影响报告方式,不影响如何处理在取消后完成终结的结果上下文。dispose 会等待忽略信号的工作完成,然后才从注册表移除。[显式取消决策](../../../.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.md)与[取消收敛窗口唤醒锁存](../../../.agents/notes/implemented/bug-fix/2026-08-07-cancel-convergence-wake-latch.md)规定生命周期与竞态约定。 在步骤内,独占调用形成屏障;并行安全调用使用有界滚动池,并在启动前重新分类。只有分发和调用主体的执行会发生重叠。策略、持久结果和结果上下文仍保持模型顺序。中止会阻止启动新的调用,等待已启动调用的结果处理完毕,并保留其完成终结后的结果上下文,不区分取消原因。内部调度器故障会停止新的分发,等待已启动的分发,然后在不虚构工具结果的情况下到达轮次错误边界。 @@ -76,7 +76,7 @@ interface Config { 超出「调用模型、运行工具、重复」的所有内容,都属于监听事件分类体系的插件: - 钩子与策略:相关的 `agent/*` 检查点,加上受守卫保护的 `tools/pre-execute` → `tools/execute` → `tools/post-execute` → 定义拥有的 `finalizeContent` → `tools/result` 流水线;确切事件签名与 mode 位于 [core.md](../../../docs/subsystems/core.md#cordis-surface) 与 [tools.md](../../../docs/subsystems/tools.md#cordis-surface) 的生成区块 - 压缩(compaction):在 `agent/pre-step` 上观测压力;在 `agent/request-error` 上进行规范的溢出修复 -- 模型请求恢复:`dsh-llm-retry` 在 `agent/request-error` 上记录并等待针对确切提供方配置的常规退避或无上限退避,发出不进入表层的 `llm/retry` 状态,然后返回重试动作 +- 模型请求恢复:`dsh-llm-retry` 在 `agent/request-error` 上记录并等待针对确切提供方配置的 normal 或无界退避,发出不进入表层的 `llm/retry` 状态,然后返回重试动作 - 沙箱、权限、计划模式:使用 `tools/pre-execute` 提供可扩展的拒绝/询问,使用 `tools.guard()` 提供单调拥有方策略,使用 `tools/post-execute` 处理结果决定,并使用 `tools/result` 进行最终观测 - subagent:在循环外部实现为 `ctx.subagents` 提供方;进程内提供方使用 `ctx.agents.create()` 创建 agent,并通过其持有的 `AgentHandle` 执行 teardown,而通用的 [`ctx.jobs`](../../jobs/jobs/) 与 [`dsh-tool-subagent`](../../subagent/tool-subagent/) 负责后台收集。 - 持久化:`session/event` 发生后立即安排 write-behind;`session/flush` 是显式观测屏障 diff --git a/packages/core/system-prompt/README.i18n.yaml b/packages/core/system-prompt/README.i18n.yaml index 18a974be44..5e5a3f6bea 100644 --- a/packages/core/system-prompt/README.i18n.yaml +++ b/packages/core/system-prompt/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/core/system-prompt/README.md README.md: d750a507e628e7609af542227e4528d4d4934ce8 -README.zh.md: c81b850f2e93a90e5b69e1ae5258aa7cb911ab44 +README.zh.md: c535dbd0535be3a8e7b6f78979c63dc03e562d36 diff --git a/packages/core/system-prompt/README.zh.md b/packages/core/system-prompt/README.zh.md index c81b850f2e..c535dbd053 100644 --- a/packages/core/system-prompt/README.zh.md +++ b/packages/core/system-prompt/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -系统提示词组装注册表。插件可以贡献有序段落、工具 schema 和具名变量。循环在每个步骤组装一次,并将结果渲染为完整的模型提示词。此插件拥有静态 harness 身份和全局部署 persona;agent(智能体)作用域的 persona 会遮蔽全局默认值。 +系统提示词组装注册表。插件可以贡献有序段、工具 schema 和具名变量。循环在每个步骤组装一次,并将结果渲染为完整的模型提示词。此插件拥有静态 harness 身份和全局部署 persona;agent(智能体)作用域的 persona 会遮蔽全局默认值。 ## 配置 @@ -10,8 +10,8 @@ |---|---|---| | `includeHarnessIdentity` | `true` | 是否包含顺序为 −100 的固定开场白 `You are an AI agent powered by DeepSeek Harness.`。仅当兼容性部署拥有完整系统提示词时设为 `false`。 | | `includeRuntimeContext` | `true` | 是否在组装中包含有序动态上下文。设为 false 时不会求值上下文提供方,并会在 waterfall 后丢弃 `system-prompt/assemble` 监听器添加的上下文;其他服务及其强制机制仍然生效。 | -| `persona` | `''` | 全局部署 persona 的默认值:这是唯一可由配置直接编写的提示词片段。除非被 agent 作用域的同名贡献遮蔽,否则它会渲染为顺序为 0 的 `deployment:persona` 段落。它是模板,完整的 `{{…}}` 组会严格按已注册变量解释(随附循环注册 `{{model}}`/`{{cwd}}`),目前没有表达字面量花括号的转义语法。为空 ⇒ 渲染时删除该段落。 | -| `toolOrder` | 无 | 显式指定面向模型的工具顺序。该列表由 `ToolSchema.name` 组成,并且必须恰好包含一个 `''` 剩余项标记(`TOOL_ORDER_REST`):已列工具按列表位置排列,未列工具则按名称字典序插入该标记所在的位置。缺席 ⇒ 直接按名称字典序排列。该顺序会在 `system-prompt/assemble` waterfall(瀑布式事件)之前应用于已收集的工具。与段落的 `order` 排序一样,它会规范化注册表贡献的内容;注册顺序只是插件加载时序的产物。waterfall 监听器如果修改列表,就必须对自身输出的确定性负责。配置错误会明确失败:列表没有恰好一个其余项或存在重复项,会在加载时抛出;已列名称没有对应已注册工具,会使每次 `assemble()` 被拒绝;工具提供方返回保留的其余项名称也会被拒绝。在随附循环下,轮次会在任何模型请求前失败。为何采用中心列表而非每插件权重,见[显式面向模型工具顺序](../../../.agents/notes/implemented/feature/2026-07-06-explicit-tool-order.md)。 | +| `persona` | `''` | 全局部署 persona 默认值:唯一由配置提供的提示词片段,渲染为顺序为 0 的 `deployment:persona` 段,除非 agent 作用域的贡献将其遮蔽。它是模板,完整的 `{{…}}` 组会严格按已注册变量解释(随附循环注册 `{{model}}`/`{{cwd}}`),目前没有表达字面量花括号的转义语法。为空 ⇒ 渲染时删除该段。 | +| `toolOrder` | 无 | 显式指定面向模型的工具顺序。该列表由 `ToolSchema.name` 组成,并且必须恰好包含一个 `''` 其余项标记(`TOOL_ORDER_REST`):已列工具按列表位置排列,未列工具则按名称字典序插入该标记所在的位置。缺席 ⇒ 直接按名称字典序排列。该顺序会在 `system-prompt/assemble` waterfall(瀑布式事件)之前应用于已收集的工具。与段的 `order` 排序一样,它会规范化注册表贡献的内容;注册顺序只是插件加载时序的产物。修改列表的 waterfall 监听器应对其输出的确定性负责。配置错误会明确失败:列表没有恰好一个其余项或存在重复项,会在加载时抛出;已列名称没有对应已注册工具,会使每次 `assemble()` 被拒绝;工具提供方返回保留的其余项名称也会被拒绝。在随附循环下,轮次会在任何模型请求前失败。为何采用中心列表而非每插件权重,见[显式面向模型工具顺序](../../../.agents/notes/implemented/feature/2026-07-06-explicit-tool-order.md)。 | ## 服务:`SystemPrompt`(ctx 键:`systemPrompt`) @@ -22,18 +22,18 @@ - `ctx.systemPrompt.suppressRuntimeContext(): () => void`:抑制调用作用域的所有动态上下文贡献。多个注册会独立组合;只有当不再存在抑制器时,dispose 返回的 effect 才会恢复上下文。 - `ctx.systemPrompt.tools(provider: (context: AssembleContext) => ToolProviderResult): () => void`:贡献工具 schema;每次组装时使用该次组装的上下文求值。`ToolProviderResult` = `{ schemas, knownNames? }`:`schemas` 是限制后的可见集合;`knownNames` 是限制前由 `toolOrder` 使用的全集。提供方不得返回名为 `TOOL_ORDER_REST` 的 schema。带作用域提供方只在其作用域的组装中查询。随调用 fiber 一并 dispose。 - `ctx.systemPrompt.variable(name: string, provider: (context) => string | undefined): () => void`:贡献提示词变量,在段文本中以 `{{name}}` 引用。带作用域变量会为该 agent 遮蔽同名全局变量。同层重复或无法引用的名称会抛出;`undefined` 表示「本次组装没有值」。随调用 fiber 一并 dispose。 -- `ctx.systemPrompt.assemble(context?: AssembleContext): Promise`:为一个调用方组装提示词:将全局层与 `context.scope` 的层合并,并在变换 waterfall 前分离工具 schema。它经过按作用域筛选的 `system-prompt/assemble` waterfall,之后将一个有效的 complete 段恢复为唯一的提示词段落,并实施任何活动的 runtime-context 抑制器。可选的 `context.signal` 显式控制本次组装请求;提供方与监听器可以配合该信号,但不得将它保留给另一轮次。存在多个 complete 段、已配置的 `toolOrder` 指名提供方 `knownNames` 全集以外的工具,或提供方返回保留的其余项名称时,调用会被拒绝。 +- `ctx.systemPrompt.assemble(context?: AssembleContext): Promise`:为一个调用方组装提示词:将全局层与 `context.scope` 的层合并,并在变换 waterfall 前分离工具 schema。它经过按作用域筛选的 `system-prompt/assemble` waterfall,之后将一个有效的 complete 段恢复为唯一的提示词段,并实施任何活动的 runtime-context 抑制器。可选的 `context.signal` 显式控制本次组装请求;提供方与监听器可以配合该信号,但不得将它保留给另一轮次。存在多个 complete 段、已配置的 `toolOrder` 指名提供方 `knownNames` 全集以外的工具,或提供方返回保留的其余项名称时,调用会被拒绝。 ### 实时事件 -普通段落以 `system-prompt/assemble` 的返回结果为准;complete 段落则会在 waterfall 之后作为最终提示词约束生效。替换条目的监听器必须保留任何已启用的 Code Mode 或结构化输出协议。筛选需要在呈现、查找与执行之间保持一致时,应使用 [`ToolRuntime.restrict()`](../tools/README.md)。注册表变更通知不经过筛选。事件签名和分发约定以 [system-prompt.md](../../../docs/subsystems/system-prompt.md#cordis-surface) 的生成区块为准。 +普通段以 `system-prompt/assemble` 的返回结果为准;complete 段则会在 waterfall 之后作为最终提示词约束生效。替换条目的监听器必须保留任何已启用的 Code Mode 或结构化输出协议。筛选需要在呈现、查找与执行之间保持一致时,应使用 [`ToolRuntime.restrict()`](../tools/README.md)。注册表变更通知不经过筛选。[system-prompt.md](../../../docs/subsystems/system-prompt.md#cordis-surface) 的生成区块拥有事件签名和分发约定。 ### 关键类型 - `AssembleContext`:说明一次 `assemble()` 调用的用途。它可通过合并扩展;此处声明 `scope?: ScopeKey`(层选择器)与 `signal?: AbortSignal`(显式请求控制能力),而 `dsh-agent` 声明 `agent?: Agent`(类型化 DX 字段;绝不能在没有 `scope` 时设置,应使用 `assembleContextFor(agent, signal)`)。提供方必须容忍字段缺席,因为裸 `assemble()` 携带的是无作用域、无信号的空上下文。`signal` 是请求值,不是环境 Agent 执行 frame 的一部分。 -- `PromptSection`:`{ name, order, text, complete? }`。各段按 `order` 升序拼接。顺序区间:`-100` 是 harness 身份,`0` 是部署 persona,工具引导使用 `100–199`。协作式组装完成后,一个有效的 `complete` 段会抑制其他所有段落。 +- `PromptSection`:`{ name, order, text, complete? }`。各段按 `order` 升序拼接。顺序区间:`-100` 是 harness 身份,`0` 是部署 persona,工具引导使用 `100–199`。协作式组装完成后,一个有效的 `complete` 段会抑制其他所有段。 - `PromptAssembly`:`{ sections: AssembledSection[], tools: ToolSchema[], variables: Record }`。各段文本到达时已求值,但尚未插值;`variables` 保存所有已注册变量在当前上下文中求得的值。工具 schema 按设计属于组装结果:「模型获知自己能做什么」是一个连贯整体,尽管适配器把 schema 作为独立 wire 字段传输。 - `renderPrompt(assembly)`:插值每个段中的 `{{variable}}` 引用,删除空段,并用空行连接。严格规则:未知引用(使用 `Object.hasOwn` 查找,因此 `{{constructor}}` 等原型名称未知)、已注册但无值的引用、格式错误的完整 `{{…}}` 组,或出现 `{{` 却没有形成完整的 `{{…}}` 组、而后文仍有 `}}`(`{{{model}}}`),都会抛出异常;明确失败胜过交付格式错误的提示词。孤立的 `{{` 如果后面任何位置都没有 `}}`,会按字面量通过;替换值绝不再次扫描。 @@ -41,7 +41,7 @@ ### 扩展点 -- 段落提供方:工具包负责提供自身的跨调用指导(`tool:bash`、`tool:read` 等);此插件负责提供 `harness:identity` 与 `deployment:persona`。 +- 段提供方:工具包拥有自身的跨调用指导(`tool:bash`、`tool:read` 等);此插件拥有 `harness:identity` 与 `deployment:persona`。 - 变量提供方:agent loop(智能体循环)注册 `model` 与 `cwd`;任何插件都可以注册自己拥有的事实(未来的 `date`、git 状态等)。 - 工具 schema 提供方:`ToolRuntime` 自动将自身注册为工具提供方。 - [`system-prompt/assemble` waterfall](#live-events):按调用方协作式修改或替换组装结果,之后再实施 complete 段约束。 @@ -54,7 +54,7 @@ #### 模型看到的内容 -默认情况下,每次组装都从下方 harness 身份开始,然后在严格变量插值后追加已配置 persona 与有序插件段。`includeHarnessIdentity: false` 仅省略这个固定开场白。空段会消失;带作用域的段和变量可以为一个 agent 遮蔽全局项。`system-prompt/assemble` waterfall 决定交付的提示词与工具 schema,除非一个有效段声明自身为 complete;此时,该确切段落会成为完整的系统提示词,而 waterfall 得到的上下文、工具和变量保持不变。有序动态上下文与系统提示词段落分离,只在存在时才会成为带来源的 user 角色快照。`includeRuntimeContext: false` 或带作用域的抑制器会移除所有这类上下文,包括监听器添加的内容,但不会禁用拥有底层策略或状态的服务。 +默认情况下,每次组装都从下方 harness 身份开始,然后在严格变量插值后追加已配置 persona 与有序插件段。`includeHarnessIdentity: false` 仅省略这个固定开场白。空段会消失;带作用域的段和变量可以为一个 agent 遮蔽全局项。`system-prompt/assemble` waterfall 决定交付的提示词与工具 schema,除非一个有效段声明自身为 complete;此时,该确切段会成为完整的系统提示词,而 waterfall 得到的上下文、工具和变量保持不变。有序动态上下文与系统提示词段落分离,只在存在时才会成为带来源的 user 角色快照。`includeRuntimeContext: false` 或带作用域的抑制器会移除所有这类上下文,包括监听器添加的内容,但不会禁用拥有底层策略或状态的服务。 ##### harness 身份 diff --git a/packages/llm/llm/README.i18n.yaml b/packages/llm/llm/README.i18n.yaml index 1023196cc4..e417c7d887 100644 --- a/packages/llm/llm/README.i18n.yaml +++ b/packages/llm/llm/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/llm/llm/README.md README.md: 2cae9a05a58295b06d25382729a3304dbdc9a6fa -README.zh.md: ccf4d94e22d49efb26c8f8d92c518b89104e5adf +README.zh.md: afcf6d929608a010e7d45afd84222c43cf4d91d4 diff --git a/packages/llm/llm/README.zh.md b/packages/llm/llm/README.zh.md index ccf4d94e22..afcf6d9296 100644 --- a/packages/llm/llm/README.zh.md +++ b/packages/llm/llm/README.zh.md @@ -17,7 +17,7 @@ - `ctx.llm.registerModelDiscovery(settingsNs: string, discover): () => void` 为本插件负责的 settings namespace 提供查询提供方端点的能力。每个 namespace 只能有一个(`INVALID_DISCOVERY`/`DUPLICATE_DISCOVERY`),并随调用 fiber dispose。 - `ctx.llm.listModelDiscoveryNamespaces(): string[]` 列出可以询问端点的 namespace,让界面只在可用之处提供该动作。 - `ctx.llm.discoverModels(settingsNs: string, request: LlmModelDiscoveryRequest): Promise` 询问某个端点它公布了哪些模型。 -- `ctx.llm.providerRetryPolicy(provider: string): ResolvedRetryPolicy` 返回注册时捕获的提供方重试策略,并解析 `normal` 默认值。 +- `ctx.llm.providerRetryPolicy(provider: string): ResolvedRetryPolicy` 返回注册时捕获的提供方自身的重试策略,并解析 `normal` 默认值。 - `ctx.llm.listModels(provider: string): Promise` 发现某个已注册提供方当前公布的模型。 - `ctx.llm.resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise` 从负责该精确路由的适配器中,解析并校验确切模型身份,以及可用上下文、输出默认值和推理(reasoning)元数据;异步适配器可选地支持取消。 - `ctx.llm.resolveCallConfig(config: LlmCallConfig, signal?: AbortSignal): Promise` 校验显式推理强度,并填入适配器配置的调用默认值,但不自动调整。 @@ -28,13 +28,13 @@ 询问端点属于配置期针对**草稿**的操作,以 settings namespace 而非提供方路由为键——界面正在新增的提供方还不存在,也就没有路由可点名。但请求仍可**点名**它正在编辑的路由,而已经描述该路由的适配器会用自己的知识作答,无需联网;路由名称和 `baseURL` 至少需要提供一项。除此之外,请求携带端点、协议,以及一条 harness 只用于这一次询问、绝不存储的凭据。这里既不读取也不写入 settings 或 credentials;返回内容是界面可以提供给用户采纳的候选元数据,而不是已注册的 catalog。`LlmDiscoveredModel` 除 `id` 外每个字段都是可选的,因为大多数提供方列表只公布 id;采纳其中一条的界面仍要补上其适配器所需的容量。重复与不可用的 id 会被丢弃,无人服务的 namespace 以 `NO_DISCOVERY` 失败,既不点名路由也不给端点的请求以 `INVALID_DISCOVERY` 失败。 -提供方和模型元数据用于发现,不构成路由白名单。`registerAdapter()` 仍负责保证提供方路由的排他注册,并为每条路由捕获适配器的重试策略;适配器可以接受未出现在 `listModels()` 中的模型 ID,消费方不得仅因模型未列出而拒绝请求。返回的 selector 元数据已分离;无效或重复的适配器条目会以 `INVALID_ADAPTER` 或 `INVALID_CATALOG` 失败。 +提供方和模型元数据用于发现,不构成路由白名单。`registerAdapter()` 仍负责保证提供方路由的排他注册,并为每条路由捕获适配器的重试策略;适配器可以接受未出现在 `listModels()` 中的模型 id,消费方不得仅因模型未列出而拒绝请求。返回的 selector 元数据已分离;无效或重复的适配器条目会以 `INVALID_ADAPTER` 或 `INVALID_CATALOG` 失败。 每个拓扑提交点——适配器路由注册或 dispose、目录条目出现或撤回——都会在变更之后发出无载荷的 `llm/adapters-updated` 事件,消费方因此会重新读取 `listProviders()`/`listModels()`/`listConfigurableProviders()`,而不是轮询。观察者故障会被记录并隔离,不能否决变更;只有带 `INVARIANT` 码的故障会在通知完所有观察者后重新抛出。 -确切模型元数据是独立的正确性查询,不是 catalog 装饰或全局 LLM 设置。`resolveModelInfo()` 会向拥有精确提供方/模型路由的适配器查询一次;适配器可以描述未列出的动态模型。缺少 `context` 表示模型容量未知;缺少 `defaultMaxTokens` 表示继续沿用提供方自身的输出默认行为;缺少 `reasoning` 则表示推理能力不可用。无效的身份、上下文、输出默认值或推理元数据会以 `INVALID_MODEL_INFO`、`INVALID_MODEL_CONTEXT`、`INVALID_MODEL_MAX_TOKENS` 或 `INVALID_MODEL_REASONING` 失败。 +确切模型元数据是独立的正确性查询,不是 catalog 装饰或全局 LLM 设置。`resolveModelInfo()` 会向拥有精确提供方/模型路由的适配器查询一次;适配器可以描述未列出的动态模型。缺少 `context` 表示模型容量未知;缺少 `defaultMaxTokens` 表示继续沿用提供方自身的输出默认值;缺少 `reasoning` 则表示推理能力不可用。无效的身份、上下文、输出默认值或推理元数据会以 `INVALID_MODEL_INFO`、`INVALID_MODEL_CONTEXT`、`INVALID_MODEL_MAX_TOKENS` 或 `INVALID_MODEL_REASONING` 失败。 -`defaultMaxTokens` 是适配器配置的单次请求输出上限,不是模型硬上限。仅当请求省略 `maxTokens` 时,`resolveCallConfig()` 才会填入该值;显式上限优先。推理标识符是由适配器持有的不透明字符串,而非核心枚举:同一次解析只接受与已公布标识符完全一致的值,在存在 `defaultEffort` 时填入它,否则保留提供方默认值。异步模型解析器会接收调用方的 `signal`,并且必须在取消后尽快结算。`prepareCall()` 还会返回同一次查询得到的、与适配器内部状态分离的上下文元数据,通过 `adapterDefaults` 标明填入了哪些 `maxTokens` 和 `reasoningEffort` 字段,并在请求头记录和最终分发期间始终保留同一项精确的适配器注册。因此,HMR(热模块替换)不会把一个适配器的能力结果与另一个适配器的请求混用;复用其一次性句柄或更改调用配置字段会以 `INVALID_PREPARED_CALL` 失败。不支持的显式或配置推理强度会在提供方 I/O 前以 `UNSUPPORTED_REASONING_EFFORT` 失败。 +`defaultMaxTokens` 是适配器配置的单次请求输出上限,不是模型硬上限。仅当请求省略 `maxTokens` 时,`resolveCallConfig()` 才会填入该值;显式上限优先。推理标识符是由适配器定义的不透明字符串,而非核心枚举:同一次解析只接受与已公布标识符完全一致的值,在存在 `defaultEffort` 时填入它,否则保留提供方默认值。异步模型解析器会接收调用方的 `signal`,并且必须在取消后尽快结算。`prepareCall()` 还会返回同一次查询得到的、与适配器内部状态分离的上下文元数据,通过 `adapterDefaults` 标明填入了哪些 `maxTokens` 和 `reasoningEffort` 字段,并在请求头记录和最终分发期间始终保留同一项精确的适配器注册。因此,HMR(热模块替换)不会把一个适配器的能力结果与另一个适配器的请求混用;复用其一次性句柄或更改调用配置字段会以 `INVALID_PREPARED_CALL` 失败。不支持的显式或配置推理强度会在提供方 I/O 前以 `UNSUPPORTED_REASONING_EFFORT` 失败。 ### 事件 @@ -44,7 +44,7 @@ ### 扩展点 -- 继承 `LlmAdapter` 并调用 `ctx.llm.registerAdapter(providers, adapter)`,添加一条或多条提供方路由。`GenerateOptions.provider` 选择适配器;`GenerateOptions.model` 属于适配器,可以动态解析。覆盖 `providerRetryPolicy()` 以提供由提供方持有的恢复配置,覆盖 `providerInfo()` 和异步 `listModels()` 以公开 selector 元数据;精确身份、容量、输出默认值或可选推理强度可用时,实现 `resolveModel()`;异步解析器必须响应其可选的取消 signal。默认实现使用有界的 normal 重试策略,将路由和模型 id 用作名称,不公布模型,也不返回容量、输出默认值或推理元数据。 +- 继承 `LlmAdapter` 并调用 `ctx.llm.registerAdapter(providers, adapter)`,添加一条或多条提供方路由。`GenerateOptions.provider` 选择适配器;`GenerateOptions.model` 属于适配器,可以动态解析。覆盖 `providerRetryPolicy()` 以提供由提供方定义的恢复配置,覆盖 `providerInfo()` 和异步 `listModels()` 以公开 selector 元数据;精确身份、容量、输出默认值或可选推理强度可用时,实现 `resolveModel()`;异步解析器必须响应其可选的取消 signal。默认实现使用有界的 normal 重试策略,将路由和模型 id 用作名称,不公布模型,也不返回容量、输出默认值或推理元数据。 - 包装 `llm/stream` 时,通过 `ctx.on()` waterfall listener 实现缓存、日志或路由。包装层如果在已经发出分片后重试,就没有可持久记录的尝试边界;因此,随产品交付的 agent 重试策略改用 `agent/request-error`。 ### 消息(`message.ts`)与内容块(`types.ts`) diff --git a/packages/subagent/subagent/README.i18n.yaml b/packages/subagent/subagent/README.i18n.yaml index 1dc307eaee..8ab47d1322 100644 --- a/packages/subagent/subagent/README.i18n.yaml +++ b/packages/subagent/subagent/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent/README.md README.md: ed4a9123a2dfa5b2fa5abc67f4513547feb3d140 -README.zh.md: 83ab345a0dbc0cbb117abcab2b054790dc3758da +README.zh.md: 1bb44b1c5c55400bb26c4c248eea76039f6296d3 diff --git a/packages/subagent/subagent/README.zh.md b/packages/subagent/subagent/README.zh.md index 83ab345a0d..1bb44b1c5c 100644 --- a/packages/subagent/subagent/README.zh.md +++ b/packages/subagent/subagent/README.zh.md @@ -16,16 +16,16 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 | `getProvider(name)` | 返回提供方;不存在时返回 `undefined`。 | | `list()` | 按插入顺序返回提供方名称。 | | `start(name, request)` | 校验普通调用方请求,解析其已分离的 `one-shot` 描述符,然后等待提供方发布真正的一次性子 agent。兑现时返回由持有方拥有的 `SubagentRun`;如果调用被拒绝,提供方已经清理所有尚未发布的启动资源。发布后的轮次故障或基础设施故障则通过该 run 结算。可继续子 agent 绝不通过此操作进入。 | -| `startContinuable(spec)` | 建立一个持久化的可继续子 agent,并投递其初始提示词。子 agent 的 inbox 一接受该提示词,调用就会兑现为 `{ childId, messageId }`,无需等待轮次开始,也无需等待消息写入会话日志。在此之前发生的任何失败都会使调用被拒绝,不返回任何 ID,并完全回滚该子 agent。要求 `ctx.agents`、会话持久化以及具备 `prepareContinuable` 能力的提供方。 | +| `startContinuable(spec)` | 建立一个持久化的可继续子 agent,并投递其初始提示词。子 agent 的 inbox 一接受该提示词,调用就会兑现为 `{ childId, messageId }`,无需等待轮次开始,也无需等待消息写入会话日志。在此之前发生的任何失败都会使调用被拒绝,不返回任何 id,并完全回滚该子 agent。要求 `ctx.agents`、会话持久化以及具备 `prepareContinuable` 能力的提供方。 | | `followup(parent, childId, content, { source, signal })` | 将来自确切在线直接父级的一条后续消息作为子 agent 的下一个 FIFO 轮次投递,术语与 `Agent.followup()` 一致,并返回被接受的 `MessageId`。驻留中的子 agent 由其 inbox 直接接受(唤醒处于 waiting 的 Activation);不驻留的则从其持久化会话冷恢复。要求 `ctx.agents`;冷恢复还要求会话持久化。 | | `interrupt(targetSessionId, authority)` | 凭人类出示的持久化父级地址 `{ kind: 'user', parentSessionId }`,或确切在线的祖先 Agent `{ kind: 'ancestor', agent }` 进行授权,中断一个在线可继续子级的当前轮次。准入判定同步完成,但取消异步生效:该操作发出 `Agent.cancel(cause, { keepInbox: true })` 后立即返回,不等待目标观察到信号。尚未领取的待处理 inbox 工作、Activation 和已发布的后代均会保留;已经领取到被中断轮次中的工作不会重新入队。目标不存在时视为已接受的空操作;错误的父级地址,或陈旧、指向自身、并非祖先的调用方,会以 `UNAUTHORIZED` 被拒绝。 | | `reportFrom(child, content, { delivery, signal })` | 从确切在线可继续 child 向其确切在线直接 parent 投递一条选中消息,并返回已接受的稳定 `MessageId`。静默投递会注入上下文;唤醒投递会提交一个后续 parent 轮次。 | | `registerContinuableSetup(contribution)` | 把一项可选部署能力组合到每个可继续 child 尚未发布的作用域中,并支持从驻留 child 立即撤销。 | -| `drainContinuableDescendants(parents)` | 在由 host 持有的确切在线父级 Agent 之下关闭准入,只停止这些父级可见的可继续后代;等待已在这些根节点下获准的物化过程完成发布或回滚后,再按子级优先顺序释放所选的各棵树。该截止状态会持续到每个确切父级离开注册表;无关的父级树和管理器全局准入仍保持可用。 | -| `listChildren(parentSessionId, signal?)` | 按 `createdAt`、再按 ID 的顺序列出由会话支撑的直接 subagent,包括其 `one-shot`/`continuable` 模式、`running`/`inactive` 活动状态、根据 origin 分类得出的一层 `hasChildren` 提示,以及每个子级的诊断信息,且不会加载或恢复它们。该操作直接读取在线会话存储和可选的会话持久化(没有持久化时只枚举在线子级),并要求已挂载 `sessionProjections` 注册表;不要求 `ctx.agents`、继续执行管理器或任何查询服务。 | +| `drainContinuableDescendants(parents)` | 在由 host 拥有的确切在线父级 Agent 之下关闭准入,只停止这些父级可见的可继续后代;等待已在这些根节点下获准的物化过程完成发布或回滚后,再按子级优先顺序释放所选的各棵树。该截止状态会持续到每个确切父级离开注册表;无关的父级树仍在线,管理器全局准入仍保持开放。 | +| `listChildren(parentSessionId, signal?)` | 按 `createdAt`、再按 id 的顺序列出由会话支撑的直接 subagent,包括其 `one-shot`/`continuable` 模式、`running`/`inactive` 活动状态、根据 origin 分类得出的一层 `hasChildren` 提示,以及每个子级的诊断信息,且不会加载或恢复它们。该操作直接读取在线会话存储和可选的会话持久化(没有持久化时只枚举在线子级),并要求已挂载 `sessionProjections` 注册表;不要求 `ctx.agents`、继续执行管理器或任何查询服务。 | | `listDescendants(rootSessionId, signal?)` | 从同一份在线优先语料按稳定 pre-order 展平根的完整会话树,并为每个 subagent 条目附加持久 `parentId` 与相对根的 `depth`。普通会话与一次性 child 仍作为遍历节点,因此其下的可继续后代仍可发现。身份、diagnostic、依赖与取消约定均沿用 `listChildren()`。 | -`SubagentStartRequest.label` 是由会话支撑的一次性 child 所使用的可选简短持久化显示标签。面向模型的委派会提供其已有的 `description`;底层调用方无需凭空构造展示元数据。可继续启动始终携带自身的必填标签。`signal` 是必填项,也是一次性 `start` 的规范取消通道。发布前中止会使 `start()` 在回滚后拒绝;发布后中止会取消已返回 run 的剩余轮次工作,但不会隐藏其 id。请求还可以选择模型、要求结构化输出、限制委派深度、约束子 agent 工具或设置子 agent persona。对于可继续启动或后续操作,调用方信号的控制范围只包括 inbox 接受之前的查找、物化和准入。一旦 inbox 接受消息,Activation 就由管理器独立拥有;此后调用方取消既不会取消已接受的轮次,也不会 dispose(资源释放)子 agent。 +`SubagentStartRequest.label` 是由会话支撑的一次性 child 所使用的可选简短持久化显示标签。面向模型的委派会提供其已有的 `description`;底层调用方无需凭空构造展示元数据。可继续启动始终携带自身的必填标签。`signal` 是必填项,也是一次性 `start` 的规范取消通道。发布前中止会使 `start()` 在回滚后拒绝;发布后中止会取消已返回 run 的剩余轮次工作,但不会隐藏其 id。请求还可以选择模型、要求结构化输出、限制委派深度、约束子 agent 工具或设置子 agent persona。对于可继续启动或后续操作,调用方信号只负责 inbox 接受前的查找、物化和准入;此后,Activation 由管理器独立拥有,因此调用方取消既不会取消已接受的轮次,也不会 dispose(资源释放)子 agent。 后续操作的权限来自子 agent 持久化 header 中记录的确切在线直接父级。冷恢复会在重建前检查该权限,并在最终无 await 的 inbox 准入区间再次检查,因此在物化期间被注销或替换的 parent 无法授权投递。后续操作上的 `source` 记录谁提供了所投递的消息,不授予任何权限。 @@ -40,7 +40,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 - `toolFilter`:应用请求的子 agent 工具限制; - `persona`:应用每个子 agent 独立的 persona。 -每个进程内子 agent 都通过一次 `applyChildComposition(childCtx, parent, composition)` 调用完成组装:先加入父级的 agent-preset 组合,再应用子 agent 自己的 persona 和工具限制。加入父级组合正是子 agent 获得能力的途径:所有面向模型的行都位于 agent 平面,完全没有加入任何组合的子 agent 抵达模型时会看到空的工具注册表(见 [`dsh-agent-presets`](../../preset/agent-presets/README.md))。将父级作为参数是刻意设计:这让“组装子 agent 却不做该加入”在各调用点无法表达,而这正是这一次调用所要杜绝的缺陷。未组装 preset roster 的部署不加入任何组合、也不需要加入;其面向模型的注册项位于宿主组合中,子 agent 已能通过工具注册表的全局层解析到它们。 +每个进程内子 agent 都通过一次 `applyChildComposition(childCtx, parent, composition)` 调用完成组装:先加入父级的 agent-preset 组合,再应用子 agent 自己的 persona 和工具限制。加入父级组合正是子 agent 获得能力的途径:所有面向模型的行都位于 agent 平面,完全没有加入任何组合的子 agent 抵达模型时会看到空的工具注册表(见 [`dsh-agent-presets`](../../preset/agent-presets/README.md))。将父级作为参数是刻意设计:这让“组装子 agent 却不做该加入”在各调用点无法表达,而这正是这一次调用所要杜绝的缺陷。未组装 preset roster 的部署不加入任何组合、也不需要加入;其面向模型的行位于宿主组合中,子 agent 已能通过工具注册表的全局层解析到它们。 `childSessionMeta()` 把所加入的 preset id 记在子 agent 的持久化 header 上,理由与顶层会话记录自己的那一个相同:preset 决定了模型所见的工具 schema 与提示段,因此冷读子 agent 的历史时必须重建那份组装,而不是部署默认值。该值从父方**活着的** scope 链读取,而不是从父方 header 读取,因为在空白期切换过 preset 的父方运行在更新的那份组装上,而它的 header 仍写着旧的那个。 @@ -64,13 +64,13 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 `provider.start(request): Promise` 是所有权转移边界;委派工具也会在其由 Task 支撑的一次性后台路径中使用它。兑现前,提供方拥有设置过程,并且在任何失败路径上都必须取消、回滚并使尚未发布的资源完全停稳。兑现后,run 的所有权转移给调用方;调用方必须在每条路径上调用 `dispose()`。剩余提示词和轮次工作属于 `SubagentRun.result`。 -`SubagentRun.result` 兑现为 `{ output, structured?, stopReason }`。子 agent 级失败会以非 `completed` 原因兑现;只有 seam 无法表示的基础设施故障才可以拒绝。`dispose()` 是幂等的,会取消剩余工作,并等待结果结算以及子 agent 资源完全停稳。`result` 的拒绝只通过 `result` 本身报告;只有与结果无关的资源释放失败,才会使 `dispose()` 被拒绝。`output` 与 `subagent/end` 事件的 `lastAssistantMessage` 使用导出的 `AssistantOutputFold`/`finalAssistantOutput` 辅助函数选取子 agent 最后一条非空 assistant 消息;若没有这类消息,则选取其累积的 assistant 文本。子 agent 两种输出均未产生时,`output` 为 `[]`,该事件字段缺省(结果约定归 [`SubagentResult.output`](../../../docs/subsystems/subagent.md#the-terminal-result-subagentresult) 所有)。 +`SubagentRun.result` 兑现为 `{ output, structured?, stopReason }`。子 agent 级失败会以非 `completed` 原因兑现;只有 seam 无法表示的基础设施故障才可以拒绝。`dispose()` 是幂等的,会取消剩余工作,并等待结果结算以及子 agent 资源完全停稳。`result` 的拒绝只通过 `result` 本身报告;只有独立的资源释放失败,才会使 `dispose()` 被拒绝。`output` 与 `subagent/end` 事件的 `lastAssistantMessage` 使用导出的 `AssistantOutputFold`/`finalAssistantOutput` 辅助函数选取子 agent 最后一条非空 assistant 消息;若没有这类消息,则选取其累积的 assistant 文本。子 agent 两种输出均未产生时,`output` 为 `[]`,该事件字段缺省(结果约定归 [`SubagentResult.output`](../../../docs/subsystems/subagent.md#the-terminal-result-subagentresult) 所有)。 本地运行会在 `start()` 兑现前发布普通的子 agent/会话,把该共享会话 id 作为 `SubagentRun.id` 返回,以 `SubagentRun.localAgent` 公开准确的子 agent,把 `request.parent.session.id` 记录到子 agent 的 `parentSession` header,并在其初始轮次内追加已解析的描述符。远程提供方则生成 parent 作用域的生命周期 id,并返回 `localAgent: undefined`;由于没有本地 child 会话,其一次性运行不会进入基于追踪的枚举结果。 ## 可继续子 agent 与 Activation -每个可继续子 agent 都有一个持久化 Session,并且同一时刻至多有一个进程内 **Activation**。Activation 表示重建后的子 agent 的一次驻留时段,不是请求、结果、取消或 Task 的边界。Agent inbox 是唯一的轮次队列,因此继续执行管理器负责驻留,而 agent loop(智能体循环)负责所有轮次排序与执行。任何可继续路径都不会创建 Task 或中间的承载结果的包装层。 +每个可继续子 agent 都有一个持久化 Session,并且同一时刻至多有一个进程内 **Activation**。Activation 表示重建后的子 agent 的一次驻留时段,不是请求、结果、取消或 Task 的边界。Agent inbox 是唯一的轮次队列,因此驻留归继续执行管理器,所有轮次排序与执行归 agent loop(智能体循环)。任何可继续路径都不会创建 Task 或中间的承载结果的包装层。 管理器根据 Agent 的完全停稳状态和所拥有的子级集合推导三种内部驻留状态,而不维护第二套状态机:`running` 表示存在正在进行的准入、尚未结束的轮次,或会唤醒 Agent 的 inbox 工作;`waiting` 表示 Agent 已完全停稳,但仍拥有至少一个尚未 dispose 的子级;`settled` 表示 Agent 已完全停稳且所有拥有的子级均已 dispose,此时管理器会 dispose `AgentHandle` 并移除 Activation。每条后续消息都使用 `Agent.followup()` 并成为一个 FIFO 轮次,且不会对当前轮次进行 steering(中途引导)。路由只取决于驻留状态:running 入队、waiting 唤醒同一 Agent,无 Activation 时则冷恢复一个新的。 @@ -78,7 +78,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 ### 结算投递 -当一个驻留 Activation 结算时,管理器会在父级自身的轮次流中告知该子级持久化的直接父级:这个子级已经产出它将产出的全部内容。对于每个已经向调用方返回过 ID 的子级,管理器都会无条件投递结算通知,不考虑该子级是否调用过 `report`。最需要说明结局的终止情形,包括达到 token 上限、模型失败、取消或拆卸,恰恰是子级根本没有机会选择的那些情形。在第一条消息被接受之前就回滚的物化保持静默,因为那位调用方已被告知该子级未建立。消息会携带该 epoch 的终止原因、它产出过的最终 assistant 内容,以及持久化来源 `{ kind: 'subagent-settled', form: 'notice', senderSessionId: }`——与子级自撰的 `subagent-report` 是不同的来源 kind,因此 transcript(文本记录)绝不会把运行时写下的话算到子级头上。 +当一个驻留 Activation 结算时,管理器会在父级自身的轮次流中告知该子级持久化的直接父级:这个子级已经产出它将产出的全部内容。对于每个已经向调用方返回过 id 的子级,管理器都会无条件投递结算通知,不考虑该子级是否调用过 `report`。最需要说明结局的终止情形,包括达到 token 上限、模型失败、取消或拆卸,恰恰是子级根本没有机会选择的那些情形。在第一条消息被接受之前就回滚的物化保持静默,因为那位调用方已被告知该子级未建立。消息会携带该 epoch 的终止原因、它产出过的最终 assistant 内容,以及持久化来源 `{ kind: 'subagent-settled', form: 'notice', senderSessionId: }`——与子级自撰的 `subagent-report` 是不同的来源 kind,因此 transcript(文本记录)绝不会把运行时写下的话算到子级头上。 有两条顺序规则让这条投递可靠而非侥幸,它们也正是这件事属于管理器而非外部 `subagent/end` listener 的原因。第一,发送发生在子级所有权释放**之前**,此时父级仍然计入该子级,因此在结构上不可能被判定为已结算。第二,如果父级本身也是驻留 Activation,该消息会采用与 report 相同的唤醒准入记账。这样,从同步发送消息到负责准入该消息的 microtask 运行之间的窗口,不会被误判为完全停稳——`Agent.status` 会把上下文维护折叠成 `idle`,而维护期间的唤醒发送只会预置一次延后唤醒。缺少其中任一条规则,父级都可能在通知仍留在 inbox 时被 dispose,而 `cancel()` 会清空该 inbox,于是通知被静默丢失。 From 8d6f5164ab7e77d8a72549b2729fcf09e03a60fd Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:18:03 +0800 Subject: [PATCH 053/103] fix(release): make publication retry, space out, and skip what landed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A landlock publication failed with `E409 Failed to save packument` on the second of three packages. The registry answers a write it could not commit that way, and publishing several packages back to back is what provokes it. Neither publish path could recover. The native sequence published from a shell loop of bare `npm publish` calls: no retry, and no way to resume, because the registry rejects a repeat of an existing version permanently — so a failure partway through left the release stuck. publish.ts skipped versions already present, which made a re-run safe, but had no retry either. Both paths now attempt a tarball up to four times, space writes at least two seconds apart, and back off 2s/4s/8s between attempts. Every retry re-reads the registry first, because a reported failure can answer a write that landed anyway: a version that now exists with this tarball's integrity counts as published rather than as one to place again. That same re-read is what turns a mid-run `E403 cannot publish over the previously published versions` into a skip when the bytes match, and leaves it a hard failure when they do not. The native sequence gets the registry comparison publish.ts already had, through its own script rather than shared code — the two sequences keep separate publication paths. Its publish job now checks out the repository, which the shell loop did not need. Verified against a scripted registry: a clean publish, one E409 then success, an E409 whose write landed anyway, E409 on every attempt (fails after four), and a version already present with matching integrity (publishes nothing). --- ...2026-08-10-npm-release-sequences.i18n.yaml | 4 +- .../2026-08-10-npm-release-sequences.md | 4 + .../2026-08-10-npm-release-sequences.zh.md | 4 + .github/workflows/landlock-run-release.yml | 20 ++- .../landlock-run/scripts/publish-release.mjs | 165 ++++++++++++++++++ scripts/release/publish.ts | 87 +++++++-- 6 files changed, 263 insertions(+), 21 deletions(-) create mode 100644 native/landlock-run/scripts/publish-release.mjs diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml index 5ba0aef406..59b51bbe6b 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-10-npm-release-sequences.md -2026-08-10-npm-release-sequences.md: e8138aef923e201cc0883232f48ce6921452ca00 -2026-08-10-npm-release-sequences.zh.md: 7ce9fa01dbe10cbdae5585f64392d0ca6a9fb868 +2026-08-10-npm-release-sequences.md: e74a4ac8f2aadd8665ec0db198c6a317a0c201bc +2026-08-10-npm-release-sequences.zh.md: e152163976f945224f2524fccd7f831ba98e8161 diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md index e8138aef92..e74a4ac8f2 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md @@ -70,6 +70,10 @@ Publication runs only from GitHub Actions; there is no local publication path. P The third state catches code that changed without a version bump. The first two provide idempotence — re-running publish over one artifact republishes nothing and needs no manual selection of packages. The same rule resolves the tension between one vendor release carrying several tags and a workflow that can only run from one ref: the workflow never infers which packages to publish from the tag it ran from. +All three sequences decide this way, including the native one: it publishes through its own script rather than a shell loop, because a loop of bare `npm publish` calls cannot be retried — the registry answers a repeat of an existing version permanently, so one failure partway through left no way forward. + +Two registry behaviours shape how a publish is attempted. Writes are spaced by at least two seconds and retried with a backoff, because publishing several packages back to back outruns the registry's own processing and earns `E409 Failed to save packument`. And every retry re-reads the registry first: a reported failure can answer a write that landed anyway, so a version that now exists with this tarball's integrity counts as published rather than as a version to place again. + ### Workspace-internal references use the `workspace:` protocol Every reference to a workspace member uses `workspace:^`, so `pnpm pack` substitutes a range matching the target version: sibling `peerDependencies` follow the family version, and a reference to a vendored package follows that package's own line. The Landlock platform packages keep `workspace:*`, which publishes the exact version, because a platform package and its entry must agree exactly. diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md index 7ce9fa01db..e152163976 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md @@ -70,6 +70,10 @@ tag 只是 commit 指针,不是发布成功的证明。bump 会向 registry 第三态拦住「改了代码却没 bump 版本」。前两态给出幂等——同一个 artifact 重跑 publish 不会重复发布,也不需要人工挑拣包。同一条规则还解决了「一次 vendor 发布携带多个 tag,而 workflow 只能从一个 ref 触发」的矛盾:workflow 从不从触发它的 tag 去推断该发哪些包。 +三条序列都按这套判定,native 也在内:它通过自己的脚本发布,而不是 shell 循环——一串裸 `npm publish` 无法重试,registry 对「重发已存在的版本」的回答是永久失败,因此中途失败一次就没有前路了。 + +registry 的两个行为决定了「怎么尝试一次发布」。写入之间至少间隔两秒并带退避重试,因为连续背靠背发多个包会超出 registry 自身的处理速度,换来 `E409 Failed to save packument`。而每次重试都先重查 registry:报出来的失败可能对应一次其实已经落地的写入,所以「该版本现在存在且 integrity 与本 tarball 相同」算作已发布,而不是又一个待放置的版本。 + ### workspace 内部引用走 `workspace:` 协议 所有指向 workspace 成员的引用都用 `workspace:^`,由 `pnpm pack` 替换成匹配目标版本的范围:兄弟包的 `peerDependencies` 跟随族版本,指向 vendored 包的引用跟随那个包自己的版本线。Landlock 平台包保留 `workspace:*`(发布成精确版本),因为平台包与它的入口必须版本完全一致。 diff --git a/.github/workflows/landlock-run-release.yml b/.github/workflows/landlock-run-release.yml index 8448af1ad1..76d08e9e4c 100644 --- a/.github/workflows/landlock-run-release.yml +++ b/.github/workflows/landlock-run-release.yml @@ -147,6 +147,12 @@ jobs: contents: read id-token: write steps: + # The publish script is the only repository file this job needs, and it + # imports nothing outside Node's builtins, so there is no install step. + - uses: actions/checkout@v4 + with: + persist-credentials: false + - uses: actions/setup-node@v4 with: node-version: 24 @@ -167,12 +173,8 @@ jobs: fi - name: Publish tarballs - run: | - version="${GITHUB_REF#refs/tags/landlock-run-v}" - tag_args=() - case "$version" in *-*) tag_args=(--tag next);; esac - while IFS= read -r tarball; do - # No --access: publishConfig.access in each manifest decides, and a - # command-line flag would override it. - npm publish "dist/npm/${tarball}" "${tag_args[@]}" - done < dist/npm/publish-order.txt + # Publication is decided per package against the registry, so re-running + # this job over the same artifact skips what already landed instead of + # failing on it. A bare `npm publish` loop could not be retried: the + # registry answers a repeat of an existing version permanently. + run: node ./scripts/publish-release.mjs dist/npm diff --git a/native/landlock-run/scripts/publish-release.mjs b/native/landlock-run/scripts/publish-release.mjs new file mode 100644 index 0000000000..76c875b8d3 --- /dev/null +++ b/native/landlock-run/scripts/publish-release.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node +/** + * Publish the packed launcher family from the tarballs `pack-release.mjs` + * produced, in `publish-order.txt` order. + * + * What goes out is decided per package against the registry, never from the + * order file alone: a version the registry lacks is published, a version whose + * published tarball has the same integrity is skipped, and a version whose + * published tarball differs fails the run — that last case means the content + * changed without a version bump. Skipping on identical integrity is what makes + * re-running the publish step over the same artifact safe, which matters here + * because a partial publication used to leave no way forward: republishing an + * existing version fails permanently. + * + * Usage: `node scripts/publish-release.mjs [packed dir]`. + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import crypto from 'node:crypto'; +import { spawnSync } from 'node:child_process'; +import { setTimeout as sleep } from 'node:timers/promises'; +import { root } from './repo.mjs'; + +/** + * Registry codes that answer a write which did not settle, rather than a + * rejection of what was sent. `E409 Failed to save packument` is the one this + * sequence actually hits: publishing the platform packages and the entry back + * to back can outrun the registry's own processing. A rejected payload (`E403` + * over an existing version, a malformed manifest) never clears on a retry. + */ +const TRANSIENT_PUBLISH_CODES = ['E409', 'E429', 'E500', 'E502', 'E503', 'E504', 'ETIMEDOUT', 'ECONNRESET', 'EAI_AGAIN']; + +/** How many times one tarball's publish is attempted before the run fails. */ +const PUBLISH_ATTEMPTS = 4; + +/** + * Shortest gap between two publishes, and the first retry backoff. The registry + * needs a moment to commit a packument before the next write; back to back + * publishes are what produce `E409`. + */ +const PUBLISH_SPACING_MS = 2_000; + +const destination = path.resolve(process.argv.slice(2).find((arg) => !arg.startsWith('--')) || path.join(root, 'dist', 'npm')); + +/** + * @param {string} output Combined npm output. + * @returns {boolean} True when the registry reported a write it did not commit. + */ +function isTransientFailure(output) { + return TRANSIENT_PUBLISH_CODES.some((code) => output.includes(`code ${code}`)); +} + +/** + * @param {string} tarball Absolute tarball path. + * @returns {string} The `sha512-` integrity npm records for it. + */ +function integrityOf(tarball) { + return `sha512-${crypto.createHash('sha512').update(fs.readFileSync(tarball)).digest('base64')}`; +} + +/** + * @param {string} tarball Absolute tarball path. + * @returns {{name: string, version: string}} What the packed manifest declares. + */ +function packedIdentity(tarball) { + const result = spawnSync('tar', ['-xOzf', tarball, 'package/package.json'], { encoding: 'utf8' }); + if (result.status !== 0) throw new Error(`cannot read the manifest inside ${tarball}:\n${result.stderr}`); + const manifest = JSON.parse(result.stdout); + if (typeof manifest.name !== 'string' || typeof manifest.version !== 'string') { + throw new Error(`${tarball} manifest lacks name/version`); + } + return { name: manifest.name, version: manifest.version }; +} + +/** + * Ask the registry whether a version exists, and with what integrity. + * @param {string} name Package name. + * @param {string} version Package version. + * @returns {{kind: 'absent'} | {kind: 'present', integrity: string}} Registry state. + */ +function registryState(name, version) { + const result = spawnSync('npm', ['view', `${name}@${version}`, 'dist.integrity', '--json'], { encoding: 'utf8' }); + if (result.status !== 0) { + const output = `${result.stdout}${result.stderr}`; + if (output.includes('E404') || output.includes('404 Not Found')) return { kind: 'absent' }; + throw new Error(`npm view ${name}@${version} failed:\n${output}`); + } + const parsed = JSON.parse(result.stdout); + if (typeof parsed !== 'string' || parsed === '') { + throw new Error(`registry reported no dist.integrity for ${name}@${version}`); + } + return { kind: 'present', integrity: parsed }; +} + +/** + * Publish one tarball, retrying a registry write that did not settle. + * + * Every retry re-reads the registry first, because `E409` can answer a write + * that landed anyway: republishing a version that now exists fails permanently, + * so the same integrity appearing under the failed attempt counts as success. + * @param {string} tarball Absolute tarball path. + * @param {string} name Package name the tarball declares. + * @param {string} version Package version the tarball declares. + */ +async function publishTarball(tarball, name, version) { + // A prerelease version never takes the latest dist-tag. + const tagArgs = version.includes('-') ? ['--tag', 'next'] : []; + for (let tries = 1; tries <= PUBLISH_ATTEMPTS; tries += 1) { + // No --access: publishConfig.access in each manifest decides, and a + // command-line flag would override it. + const result = spawnSync('npm', ['publish', tarball, ...tagArgs], { encoding: 'utf8' }); + const output = `${result.stdout}${result.stderr}`; + if (result.status === 0) return; + + const settled = registryState(name, version); + if (settled.kind === 'present' && settled.integrity === integrityOf(tarball)) { + console.log(`landlock publish: ${name}@${version} landed despite a reported failure, continuing`); + return; + } + if (tries === PUBLISH_ATTEMPTS || !isTransientFailure(output)) { + throw new Error(`npm publish ${name}@${version} failed:\n${output}`); + } + const backoff = PUBLISH_SPACING_MS * 2 ** (tries - 1); + console.log( + `landlock publish: ${name}@${version} hit a transient registry failure` + + ` (attempt ${tries} of ${PUBLISH_ATTEMPTS}), retrying in ${backoff}ms`, + ); + await sleep(backoff); + } +} + +const order = fs + .readFileSync(path.join(destination, 'publish-order.txt'), 'utf8') + .split('\n') + .filter((line) => line !== ''); + +let published = 0; +let skipped = 0; +for (const filename of order) { + const tarball = path.join(destination, filename); + const { name, version } = packedIdentity(tarball); + const state = registryState(name, version); + if (state.kind === 'present') { + const local = integrityOf(tarball); + if (state.integrity !== local) { + throw new Error( + `${name}@${version} is already published with different content` + + `\n registry: ${state.integrity}\n packed: ${local}` + + '\nBump the version, or investigate why the build is not reproducible.', + ); + } + console.log(`landlock publish: ${name}@${version} already published, skipping`); + skipped += 1; + continue; + } + // Space out the writes: the gap belongs between publishes, so a run that only + // skips does not wait at all. + if (published > 0) await sleep(PUBLISH_SPACING_MS); + await publishTarball(tarball, name, version); + console.log(`landlock publish: ${name}@${version} published`); + published += 1; +} + +console.log(`landlock publish: ${published} published, ${skipped} already present`); diff --git a/scripts/release/publish.ts b/scripts/release/publish.ts index 2c68dc7f9f..11ad01173c 100644 --- a/scripts/release/publish.ts +++ b/scripts/release/publish.ts @@ -15,16 +15,46 @@ import { createHash } from 'node:crypto' import { readFileSync } from 'node:fs' import { join, resolve } from 'node:path' +import { setTimeout as sleep } from 'node:timers/promises' import { parseArgs } from 'node:util' import { releaseFamily } from './families.ts' -import { attempt, isEntry, run } from './process.ts' +import { attempt, isEntry } from './process.ts' import { packedIdentity, readPublishOrder } from './tarball.ts' +/** + * Registry codes that answer a write which did not settle, rather than a + * rejection of what was sent. `E409 Failed to save packument` is the one this + * sequence actually hits: publishing several packages in a row can outrun the + * registry's own processing. A rejected payload (`E403` over an existing + * version, a malformed manifest) never clears on a retry and must surface. + */ +const TRANSIENT_PUBLISH_CODES = ['E409', 'E429', 'E500', 'E502', 'E503', 'E504', 'ETIMEDOUT', 'ECONNRESET', 'EAI_AGAIN'] as const + +/** How many times one tarball's publish is attempted before the run fails. */ +const PUBLISH_ATTEMPTS = 4 + +/** + * Shortest gap between two publishes, and the first retry backoff. + * + * The registry needs a moment to commit a packument before the next write; back + * to back publishes are what produce `E409`. + */ +const PUBLISH_SPACING_MS = 2_000 + /** What the registry knows about one version. */ type RegistryState = | { readonly kind: 'absent' } | { readonly kind: 'present'; readonly integrity: string } +/** + * Whether a failed publish is worth another attempt. + * @param output - combined npm output. + * @returns True when the registry reported a write it did not commit. + */ +function isTransientFailure(output: string): boolean { + return TRANSIENT_PUBLISH_CODES.some(code => output.includes(`code ${code}`)) +} + /** * The subresource integrity string npm records for a tarball. * @param tarball - absolute tarball path. @@ -54,8 +84,47 @@ function registryState(name: string, version: string): RegistryState { return { kind: 'present', integrity: parsed } } +/** + * Publish one tarball, retrying a registry write that did not settle. + * + * Every retry re-reads the registry first, because `E409` can answer a write + * that landed anyway: republishing a version that now exists fails permanently, + * so the same integrity appearing under the failed attempt counts as success. + * @param tarball - absolute tarball path. + * @param name - package name the tarball declares. + * @param version - package version the tarball declares. + */ +async function publishTarball(tarball: string, name: string, version: string): Promise { + // A prerelease version never takes the latest dist-tag. + const tagArgs = version.includes('-') ? ['--tag', 'next'] : [] + for (let tries = 1; tries <= PUBLISH_ATTEMPTS; tries += 1) { + // No --access: the sequences do not share one access level, so a + // command-line flag could not serve both and would override the manifest + // that does. Each packed manifest decides, and + // check-workspace-constraints holds every manifest to its sequence's level. + const result = attempt('npm', ['publish', tarball, ...tagArgs]) + const output = `${result.stdout}${result.stderr}` + if (result.status === 0) return + + const settled = registryState(name, version) + if (settled.kind === 'present' && settled.integrity === integrityOf(tarball)) { + console.log(`release publish: ${name}@${version} landed despite a reported failure, continuing`) + return + } + if (tries === PUBLISH_ATTEMPTS || !isTransientFailure(output)) { + throw new Error(`npm publish ${name}@${version} failed:\n${output}`) + } + const backoff = PUBLISH_SPACING_MS * 2 ** (tries - 1) + console.log( + `release publish: ${name}@${version} hit a transient registry failure` + + ` (attempt ${String(tries)} of ${String(PUBLISH_ATTEMPTS)}), retrying in ${String(backoff)}ms`, + ) + await sleep(backoff) + } +} + /** Publish the family named by `--family` from the directory named by `--from`. */ -function main(): void { +async function main(): Promise { const { values } = parseArgs({ options: { family: { type: 'string' }, from: { type: 'string' } }, allowPositionals: false, @@ -86,17 +155,15 @@ function main(): void { skipped += 1 continue } - // A prerelease version never takes the latest dist-tag. - const tagArgs = version.includes('-') ? ['--tag', 'next'] : [] - // No --access: the sequences do not share one access level, so a - // command-line flag could not serve both and would override the manifest - // that does. Each packed manifest decides, and - // check-workspace-constraints holds every manifest to its sequence's level. - run('npm', ['publish', tarball, ...tagArgs]) + // Space out the writes: the gap belongs between publishes, so a run that + // only skips does not wait at all. + if (published > 0) await sleep(PUBLISH_SPACING_MS) + await publishTarball(tarball, name, version) + console.log(`release publish: ${name}@${version} published`) published += 1 } console.log(`release publish: family ${family.id}, ${String(published)} published, ${String(skipped)} already present`) } -if (isEntry(import.meta.url)) main() +if (isEntry(import.meta.url)) await main() From f1e8187974707f3dc783a8ae01722ff9b859b2bc Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:29:25 +0800 Subject: [PATCH 054/103] fix: static fix: tar --- knip.json | 1 + native/landlock-run/package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/knip.json b/knip.json index e06fa48220..3017292382 100644 --- a/knip.json +++ b/knip.json @@ -9,6 +9,7 @@ "musl-gcc", "python3", "sandbox-exec", + "tar", "taskkill", "where.exe" ], diff --git a/native/landlock-run/package.json b/native/landlock-run/package.json index ab7bb611fd..e043bea0f2 100644 --- a/native/landlock-run/package.json +++ b/native/landlock-run/package.json @@ -19,6 +19,7 @@ "release:assemble-prebuilds": "node ./scripts/assemble-prebuilds.mjs", "release:verify": "node ./scripts/verify-release.mjs", "release:pack": "node ./scripts/pack-release.mjs", + "release:publish": "node ./scripts/publish-release.mjs", "release:verify-packed-install": "node ./scripts/verify-packed-install.mjs" }, "devDependencies": { From 6e05cb7ff5bc9834fcf303800264fa3cdb3724e8 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:30:12 +0800 Subject: [PATCH 055/103] release(landlock-run): 0.1.1 --- native/landlock-run/package.json | 2 +- native/landlock-run/packages/entry/package.json | 2 +- native/landlock-run/packages/linux-arm64/package.json | 2 +- native/landlock-run/packages/linux-x64/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/native/landlock-run/package.json b/native/landlock-run/package.json index e043bea0f2..be0ca9732d 100644 --- a/native/landlock-run/package.json +++ b/native/landlock-run/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run-workspace", - "version": "0.1.0", + "version": "0.1.1", "private": true, "type": "module", "license": "BSD-3-Clause", diff --git a/native/landlock-run/packages/entry/package.json b/native/landlock-run/packages/entry/package.json index 8fcab55ee1..5e34cf96f0 100644 --- a/native/landlock-run/packages/entry/package.json +++ b/native/landlock-run/packages/entry/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "description": "Landlock self-restrict-then-exec launcher for sandboxing subprocesses on Linux: per-platform prebuilt static binaries plus the JS seam that resolves, probes, and speaks their CLI contract", "repository": { diff --git a/native/landlock-run/packages/linux-arm64/package.json b/native/landlock-run/packages/linux-arm64/package.json index 3af83f6a19..8e6affec6a 100644 --- a/native/landlock-run/packages/linux-arm64/package.json +++ b/native/landlock-run/packages/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run-linux-arm64", - "version": "0.1.0", + "version": "0.1.1", "description": "Prebuilt landlock-run Landlock launcher binary for linux-arm64 (static musl) — resolved as a file path by @deepseek-ai/node-addon-landlock-run, never imported", "repository": { "type": "git", diff --git a/native/landlock-run/packages/linux-x64/package.json b/native/landlock-run/packages/linux-x64/package.json index 10721032b4..7e9cab7a1a 100644 --- a/native/landlock-run/packages/linux-x64/package.json +++ b/native/landlock-run/packages/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run-linux-x64", - "version": "0.1.0", + "version": "0.1.1", "description": "Prebuilt landlock-run Landlock launcher binary for linux-x64 (static musl) — resolved as a file path by @deepseek-ai/node-addon-landlock-run, never imported", "repository": { "type": "git", From 9ba718104cd28614588a336764b95a4d02434d41 Mon Sep 17 00:00:00 2001 From: Ag Date: Thu, 13 Aug 2026 15:32:38 +0800 Subject: [PATCH 056/103] docs: align community QR assets --- assets/community-wechat-official-account.png | Bin 156490 -> 35586 bytes assets/community-wecom-assistant.png | Bin 26676 -> 60324 bytes assets/community-wecom-survey.png | Bin 5508 -> 30477 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/community-wechat-official-account.png b/assets/community-wechat-official-account.png index 32e36e34797a075d1118299bc772bf390c000761..222a051dc89dfcecd4d80d8992ded2b9108ed4f9 100644 GIT binary patch literal 35586 zcmW(-1yGb-7hbv%>F(}WLb|)VyFoytM7kR(>F!P`=}t*0K^j3o8Y$tw-@n5QJAzy9 zx#v7}h*npX!$2iQg+L$}3i8sL5C{yo3j;xh1>Y91#JC`km~jPZ32mRX({Aq^T$@%= z(+!i{uM9}s=$yzQjPknLA*hH$C#HJZ@V8lBdQ-+3SpN?4Lp zp|s;4Y%_8MBR46KX2@rZZoE7p>;E>MLuWX(OmtjDx8KZI#SB|E>a!BZ8?xf>FJEwF zDqr}lTXQqTU?+~U;VTJ~C(0Jz@fhPLj!xV17)KC{T5@#-{X`YL@F9J6;>)HWltiCp+_EQw}T+^nDU5hoT%HA-)=+9t~je7^S)CPxkLqYghnC*mG* z{IYiH<>w(G(GT8rW4A-V)<4&deS96ATvdiHW?`4pwJ)=HM`FkiS4nc@jfS=C>Bozz zJfsPp$4kSz@9^;L1xTNHNfkKB8;+aR1V}L>2RV5Thj-HY&9T@=@F-BjrL(Ds zuh#Lem@!82Ux(IlDq{?&-o9PjudjY$b#t9hK_7{`WV<4MerlbwY~0$$eEBZ4zwP2? zgKCoMhUw5sj6rVCYh1AW`+7s-#0WoZ>`tri?oBukM!f!Az2XM$yD8Oy*m(t}Z=4VG zcXM5u9%>i92aio6;_gznme;=BWHLDyD36~+vP@>kRs6MR-Y<^XST0nwrIhioc_F+# zt6cNChn+R5XLz$kvq`@lYMND5W&T;ZSR)R%5MyxU6-Q|PHs;aL?)lu}+wf)ic7?(1 zP$g~m?)JT{>AC#=4a2y!egpvy-fR@FblWR%xS;AM%3OK2=QTp(3(D*I!=I~svm48( z0_dD)O2<6pVEJRVkei;pscWK`=KSeqfDQ2XCL~NGNN^bRr!#4 zYq{IB{?2}`fiHU+C6uj&WyN&s!e^-bu=KS(C)+CS(0Gn5u}A@tc?7amy=gaRo)5Kd z`KohWWu?Jaui7WZFuk)MZD(`Ea;IKG2`%H+hF=`N|JnHZ?wt|q=g!VfamqehFB6lE zo#EKIxP;MNudn|iDFWnw?WePw7=ojLjyPB0DM0!w?_=GxZ3-)#Pq1pP;LXWu3b}E= zd4tn(oh;v+JniMGT|OQjo`o+veyok1-76yQu(bgCl*+Cyzkd%mP|u1F39F}G$cs&+ zJM*PVEX>Ry{RKaXgXBJT{{+R)VAE!CzSZB+(czYwTYv*vMQU0anXnJmKaqgf$`Y+C z>+eR%E^uB9nr$&|2DazGQQ(Z1Q54o2D8zt(uLkD4*|{I25@yr-qEu5Mh~{~=H}EB_5>ZCO_vW`uFLHgi{ajH>L-Xg)pXWJSXjdN2 z2VX6?gc0?EAE$6m|LM9?mC>ltWr=T=$k9s+8=+*)u*Fw*zcpaRU#X3^!>KHN9WP6U zi9~vB`J~Eo#`aD`OF;A8LI{Cdhw;c@0`=37k7aBt0{N+%05rX2)j0xLQ`5BFG%N(QO#;vPg?PJK2K{*y;6Ycm?nGh|s2w_9(OX!{24#U6i)kj_Q zOg#v?4Z(5BDqECsGP~LDL`S!Ult;Z!r8}bZhUBn$T*$(7X6 zSrWHJZSvsWNONd`)VCPc`uI!;;g4jU8r#3x&BN$Fgl-o(|Fd#i@(D`weStP+pT|0C zHjAkQQZ{?Z3zNIr+nYCPIChmaAm*r+4_m^dW=l5U?Pv|DSy@?md9@OL#`C6$94sWV zkXGhKyvxqc9+ry@t*WXLfRZQ5DPJ*!e<&OY{kaUfJQYLAb5iUTum5@FMMbKk-=D1M zgBj6B=cD;jtXOEzPQL{kBV&f}ho))U$%6f>Ut%x!D~(nSDE%l4>+8br52nh>=nsfU zjC1n+Zw@lktK_iziTZ;U`Zq$0B7WjY@;zt?C zZ#$K7H6uo0S-jHtO8C4FG~jo>nbWqtn_}Q`J39qYrv==$`u_dhRNEZ2ZGOAiL$-t+ zz>gmrPt5y!Czb;mcq>gpIF!Jv{Q4Ht4gcoz8bm`b9nt-Uxu zKOpJ38Swa4&_exU_wS?87e|EJvBgh*m*Whw4-Vqr`ai#Fd_9fy z#dR}}%p;kNR1`lJp*7E8p^WHc{J%-1OphLhOF)1G3!`w&7tVRezv%}@P@uB1xCl>^ zvG(g#;2oR?O*r<;AMaizLG-Ho;N~BWUo7v2qh??bZB$iNM^eb_Nw#i{wX{Ne;fsY= z$LMnl+#5C=UqiGkeqaTU8b1%`FYs4!K;*SPKT#Fgvslxt65lChps3RcdlP!_+({HAFQvh zS5-0V=%h^GNVVe(G>urTJ2tf<9cZN(LeQ0JtT9C<4n9xY7JrXpih~J-2~~mp!}`tS z0S~z)R3$OHZEp@8Rkj#SAd`~^^&^IieM}x4{@eLsdP#JPw|yUff6r<}Za-}8UmnI@ zm_nS`B7|b5_Ib+pDB5E{x?8jWf-VW$>T~kM)z&JD+=eZmZEYC^ zz1ZAl@>Bq^V9+$lWXNzuk^N~wwe<1&5rND#@^iZGhuGme)=$Ztmr*}zGtTkR9FH*B z#;F>j90wo}f9RSgw8w!vv%!VlA|ssrTZwAWB4$cS$Ymu*klA1zhc_b_7S_x0VL^R_ zpJ+X{?L27Rs2#Jg^mA*7n)$h3rfi!D>7;P^e`+-cdz6-1Da>!V0+5Jc-)}y9gJwSVZ^A;y|m|iWf%lpifILu3c^!=}I;f^j`AEIxAzB`&US&!EkG;8a`OH)TV zcWg(HxO5)TM_~`d#mN@`d;E*ki{;JRyy|z>{rAs$2TrqG0X#1;tPwVN*lH zhbf*J`?Y`0SEkLj)8HJ>!35O{|GQoQbD>zBsO`tUgKXCaKhbM%9i0sT(ft2zlp82B zn7x{<%jB`E({CJb{Gyrtm>~3rk&&_Bi7}w}<@Sebc_My3LgN@1n44hgFucbo>Ef-< zR5{BR=0i(C8MyuU_fKh{dxtR^KC9c;4HVa%zmIm)S;JM;-voB!l-N6@U5jSd&(qBU zI{Y8KRFonFA@}$9RwHp-^A)8^>CgYp0_}QBq7gh|IeP9ay;g5ee=w-!u_i<%Swdwr zbZZT7j>_|!#6+I&cDq0RE$h9w_iNkmGE!1f8fe`+IQR)(Q)YN~PC?qas~;?*SbFcQ z2@eZPbz>s{#`c|wghrtKX2GG@@T0>iDMemHoZAbF>vPK8+nA)iHfQzYtc=ug-6@#g z;vlq|o}MOrt5is0!cNeNkX|?QE3^*6-{;K7&&TK6{ZpJ$oMK3qENoytEb2KQC3P#T zAA=+o``yTvbuz@aR=3);7N^sH>Zs(IF}B@7mfYZzDNfl4cRkh+d@8j8g)H;ho&S-B@)AByL0f*|_5%#pjfz|vqPc;s1S1Pr+e z26)YfC@y^BoWev^ff-H%*+K5RJm`*eu(7?z_VRuQ+LNG@`@|7}${3kw_|DTgQap9H}>kC334V<3h3&GFx10<*C;#*A5x?(6vru$Cx;)cZ$&=d4*69LTcU(Z_C9W$JwGh>Mhsf$&v54d>3w+?`qLiTq{S4& z?XupklFb)v#|l$^{b%Fj@lvfl6PWE^H=h6YzW5J>p%7KthyOU(+w;4c=D(wFU~PN* z!|P(0fFZo&p%>xP#I_N*nV8fPQtH)IRG9bH)YL!;IhkTZxoBEi37o7Q= zbo&@b?88?u;DRCXEs{#Lx-4%gd$L!ZWyz`TK9@xwx_9ig^WU-4`}5$Tgh!d7hOw;R zDG;@cvju_H^7r?5G)d2qZk7t4-?N2MBjbsxLZ{HSA1ZD0`mC+*f2s1-W@lwhOiU2o zb@cQ+*ED}ClAx{r4uHR@h6W4?b3ixf*l*sv@o3CcE(0aS$r--ka<){P-5#K?2jSWs zi6`NjqI(1N6V1;!6gX{JFn8ZYnQgQh1w}Qds*YRQ+4*0S9(pO-g-MKPgdl;lr093u z`u2zU)^&o*xro>4TAD#I;C$Cd3k+gnV&O3j>WqtpQjvS>+M&Gt<|IKQ614ZP{FG{N zcr|g*^;B~NUVD>yVDY=GBWIJwaA<35`AIO;NQw)%iABVt*!W|m^TkF3A2DuFvVClud+sqTH+~rdEExXAr-9g zVn+uRO=a;qL8hcge5QGqA$gg6=QDxNJT*EoqVpbN=Mm=dV`j;Q95F@88JxirzX&T) z%EE^)MHe3nc2HFHG8z>Y;bV=G1mXj961YzaTAp(&h2`UL9LXB3OwflJ#q{8QYxwtD zj5)J)Y+Hvp$}}5sQjXw4r8$tzqTl?>!V(b~+ZeZVRn1IPmv-Yqi9(kSp5I##e(i+# zi8CrPMJ!7ek7)|gwP@LzX5OVnUPW_I;dPn2bMg~Y%PH=ttkU<{4m+Dsl+nd49~L+N&bfe4?>oGw zqNSE4o~Nzez<7>T)lXKKM+LPg)p2zhjm8<>lJAlEEVh=4+R@WRfnKf>*HBy zI%&8H_Sk=zGVAQ$%qd96Y}iqmtcl;j=!IWSTADSoWMyZsreR=U0BYzP7Kx%)d7z}J zbTo96XbL4FHTG?_m+i9%FTYJTFfd@S$dahh<=HCxUD(d&`tu1$Dfj=LFqjRLN+Hyg}EZ&$49dmfk{_xIDyo&g(gGy{)uAII}e9bTIFhswv>lQ&)``W=mE z+qds_M6?{x{!GCf?78v=tS>Vq>1G*DnjX{uHJk zX$1I9AHt-6Z`=Ig;rfVSbV&|I=540-IEs(EDN7+qR)}Ny<>Y`dt1Cj56EwK*T%7E6 zJK>cyU=Fns6ZyMW_gjkaG*Bqi+Qx<#3N_cTffC>Nb|cz_Zk|PwXo{FeyI1#Dx?02c z=M3tGioq>mhFX1JUM9fDx2!SI(b=LZ3!hV%d(lEH$0<~fGf?g3QB3RFSAcwQT57Q6 z6PJd2B76=#6iBlly$unGA!0{vEWQtO3M%`w)$0~T#Y-(bIo2p^qFjbse}qSi#}93? zDezX}#hU#yfG&7|a}gBI#%+LiVcbx|^RFjV0xL*%Wx zlOc5QkevSY4lj0}4V7UlV%&`Lw4qOn1Kp4V;%>l(dKB% zKOZJ8)-yJ6b%wck)Hos_bofUSbR~z}A!3Si1r2{=H7GfQDn2fr`4JGGj4 z2XCq5XC=?W5RJ~~l-FaX_0Y+RI`O&hxKSwDsn#iQU3nQ;LW~K+dAn%Y<_UUT{E&j* zkGQnKd3U%gve*V}!vTUAN1#@68+;!|$i4mDdSD_+VRCW!V=_Z*eDKtBu4XUX+U|=L}^DOxt zz1ovvgvXJ(%FNU*_TI(nX`})MSq|K(}s1=7J_?9ldus%iAn37nMQ5f~&-0b&Br+80)Gq&KscWYe6QdB{Ld<={(Kd;4-|rRJ57eRft)d8(7xeza3Ns!ZLU8?l z5Q9I8KZn~U<|*RR9&g_z_!lN2CnPEQvUMF0jiYuECk*{S8_z1sn6q-Kps!KNf7BzfCn)64`KW>DbzYosFX-ZZPC8;aXGGO&6 zAt_|MW=Y(hHK$IY7?wK@Z@4blD00L3<|#sENzXdzDD+w}UcbzG6(7owW82BU`+Lqe z3neQVp~}?weyCela7DVa0 z*J-&Ink`tIHTWTMA@$D#%Ju>>uFQE{mpo)GS$#l|iIg`&>xhZ@)d#EU!p2l$Q3Fx< zVM0dzq3YvPZiW5qck#j0z!b62*X75_x$v@;MpUz=y?y*w(;z~KuBoJu?AyHR+`^sv zIWo2^A-O7qZjWv+H#%jWa$CGfk+WqX4$TH`m!WojR3|B^BiMV?G9yM&KRi;cN>L(zJ5>L@@+k6kK2O8P9Pxgb9l#YuP8Z5ds zLEVZo>|gX*Ra8{|ioHR9MYOcp=eid`f<)W4vk>3^1jBv^Z@LqIvb&DLrEYv$cUk?=cUas}A zeLC0D)P(g`V$MOexxDas0+b#9ti$m;bEZ0--N+$ zgVKz>2xvId#0cTK2Y}H7)7ZqwdoV z>-9vZx71|CzhHZ3DsGwMB*=Bsb&Kmrsh-NId4!EK%x9FnMwHnVoYHUkR1-y4OqeW$ zep!BqV#A=6{;7eD&{C3%uwygln)1`YfN~ zFo@Kxr$)4)^zC@z@QxEtl{)^Wb>b4Kb7)J6ui3cscM{w7qkoxEDfTCGF0XkAlM7!T z88ps*PEsF3k)rEPTEkXk6t;;XQjL47A>v_JJJrrl>z4(+{@f7Dn<+AEPwAelh^;J8 zDAVE4c$kezrDPTDF3XgPq>sTOmF*4MXt-Lw;UTnf}+ly%RONx>!5H!T$3h2 z^XXJN>zas(k#u3DrA)d}!`CB&D_9)D0R)(!g{D>KzK|#yz%KPkG1P5}Fd}PKQ4(#_ zCuK&ly8|xL0!IZg+08D6qbof1o)*$mTh zNZ&rYpEYLTsO870ejy?a^4dtt49v$k44_UZr2P~m#RO(q+mAUccfs6XV7noU-;z0o zg!WT<&}dr0!@{8F&F7(qOA?mIo>P<4GvVs&m~RJ=#SRzPB@4hz*-&45vG)o-M5@18oBvz@xzwsroKnta)sy|$f7v& zz+nF&ul=rbsA5m z!@`WHYh86F;d5@^iD9w7H-ZwAaaj(r)OW$^+(wOzPfkj`s67{W|NMYdTA@83J7I3=seLlcdStu80y#!}CTjV3(2z80CSojWx_b?Balc{F!gRLtE-QJP2=Uo_s>Q}CEn-6*3K@r-b7uU@`1$C;DPBW zW7_te@$cWihqmIDkHdo;99^8iuwHe&yu7^qv+-kgwhuF=&g3ichbybm1TxUmLQUq@ z*ZmG>sV|;FXIG9J@82hHBjKO3Py9ei95jGZlNkYCXHkS1rlkuoL`YgAr#{@ab2(4?o zQY><-I;;(K3aOQ$h&l>qoZopjRH5J~C%woXQ*tc9y$=_mS%R3tyCSG?D6So4fo_m# zNV4)nc|*z-hLaNGJ$wA1v%R>&*_?7{9zK#4MGQmGYc*|LTDt{9*3;29q35F7TSFgW z&+o#nbW6R<6^IB?q+d(C3;2Q*pUZ@qJLyI*5f?;tyy0atje< znuDqHhA7LW1S!65xTy2V#_jMJ%2cIU?%kkAM2Pc5gi~rHP$HZ(l(-te^sG9UwPIi| zExe)E*bF{%%sa0tVsvTy>blv(nsMm$b#h`tvJgvCdexcF!*U2CLL(x_bIAZpE@g}) zVsJZwOen-0rL}+Cja1Mh3XfvMvJn76JY3wM_eBhtM6tuDsHn8#=DusXdU~!uyE6G^ zx820yGEcz>$x2Hb=Jp5Y4+#BZl(t?k&;N|tT*4bFhen$9S%HQN$H?+Le(Lr2XaOl3 z(Nv<%WdoZ$;=CLf_mECiOof`t%EA)7bJpI?UY89))~w(+ph6*vY$!w;UpyArvokQ zjmIID7o`_{Du?BZ+_)TOE!+Ui;s%x&>px|=$misPF?!V;M#rZDN%Xhh00DHH=(hoa zEtaljkB~pL@P4uqyTm^E>_GIeD@G!A{qi={Cf zw2V(Q{eXekT#1PwqHxZ*s0A&2rdUJtwcz-iVcp@;J&5WJQze`9j@?iC_rw`1CVUrP zo>fg|<(qWNR-O7NbgP%F^_I&CSC84sml!9hW@%Y#qaq^)8P0;}Ql`Sb=*FQV7CrYR z5B%ZS{aLaIfqCgib#~@y2ezI>MnqQZk>bH=H`c7dI13@e-t>!h^#Nv{ZnRIKNwsvl z-_f$>2hic@EoBcO<8TGO7lMKq_8a+O0cbQIanD0w(D_^q*o?3jqq5rhRiZM&wnxoV z<2&!sH>rcY#!G+FS@o3|(0*?$(kI+-m>+73_GQbeU=D>bILMywR>#4#hW}m8kL8OO zxAU2yz7zK%0iCF_BdIaiN*4o7$vj9&vZp#mbN3KCD2;Wy!1_*e+RdWaP_XkBn8IBDErq4}~I|gogJb zWr*%yj}X~iAI`z?M9fYBzf_DA6HXaJ&g=ei zpO=^Sl7^i;@z=pY0wGt(+Ipe7J%|M)udukh(5D=MV<_ythb(gvE=eVBlv8r@QJCE9 zi(}f|N5*5QsbA)Ky^!}G+6-tejXo({RwGf% zpb@>uz`f0nuIBRB+XhP0;lV>F54hn(9=m_*#tiyHXjdqDA^u~T2f zo%r0WOMimjJ`Rw3!*~HHdE%&qyDY5tcdUsKS<4vQTL(vb#ZP#Mc%rQMv7@^ekN*~v zkZ__Re5HS(yZvHx!W5$T4Yj?k8A>*2SlSxygO_9@Qie#ps4p0B^~u*%G3z5U5iHO5 zhqzq(2)pT9%npK#Os%em10)AMjXVnikH1qq@gYl&6hX|2drqJhQ>0Rw>E3Y9Y#2gvAASpOU`MNvq$xQp3^g}hBr}F z?CLDVSB?GwVk8=iz?F(w`cJWax5<)4B%wR-KB=k-B|?c1vG1>S=?5a*@s!y)x>*#y zitdy(rC84qUk!O0d!FtU)d#W(-Pepdd>Jx=@ZiP@v;ZGd+e$N? z7)d?=d3TS?9la^4XHR=>k?1u6p5X?!DdjHeh%7bLg-=&wBfvmd$b^3IQ=Wp@+irx` zpLzR}D^F`w%e9<&CDAJ1X65GQh72@ICkW-L`TL8cv=X40n(tOX>;tSJ7kena<+nv7IVt6q{2I4(RMHtOg3{$`3EPtfS#d%GqKz}nQVABY%GVnu%p{c)PdX%RBIn{+kz z8)F5)Fddz6*!R{yHh>zUqBa0?_jEM_^vT!ZX>k++ZZ9CLqo0t*9RM3PxD5pV*k~OU z)Sot!pJCSYc#vaj8}wPhA^c2R{;rFeg(ctbQo+|!x_D01|H0UOoX&UKVPf;$f(pOq z$qE-K=J7DLc`~Vxm-F+}J<2ut^ns6Xz|RlA{tM7xM$%A~RGEDBy6`cM9^D1G9~Fkr zK%>bgq+(lqsxj?e+tR{k)i;->0#a0Zdb-ugcOOD16=tL)`h1+w22ey81W6mGvT&GS^s?+5-{4xBr0Aw(P|^9M;GSwrvhEeS`Peihk7a+SdXro-7GOD-K( z9K|t*I2Y248(G10yiiFZv8vPGg~{ex5)RUF^I$~cvkdQEbai#5QcXaaM-TZ4Pg5&+ zKH*N&l-zDbDi6D9Fv+dc5P8j03S+)%3qwz787vG2$G2eF6eJ5heXo%z3x01Rr_Ksw z|Lw)Kq{Z`<#SgmJ&E~@I|*wv^V?+7jIEsYCWi+M(I&t{qh@Dlf~CprhIysWouT zxu*P__0OdQhShVpLO8RlFlo5Jprs%OQb??uAZ<}4`-FPSCh{@yl65xmbsSeHx%@57 zE}{E~OywIo>~8@{x=9=AsY$pJHJ922v~O9xirHDh%D#`q$PBIE*NQ0;8VnZscl^#S z5tg|+AEqI6q5)N9k6%n=d|xw4c`ZxFNGDp#cwQDsYqKfSp>zR1i+0rTbBR^2e2QOo z%4zC;YdvT}^WCL-250QTq)zGnLqe9^=MmV$rP?1LUFIN?G;RC1m!bv)is=C(90t|@ zjt5pGviH+g=&QUB2SjhsETP127s{sBJKj@?h8qQdI2#b^Sh`5|JbwBf*Xo)1>sXFk zFq(t%jE|4kejK-L2DHcyo+3u|TmH+_FEsXch(DfBq;Wx z+u~IzWDo;p9w3r{t~v;iF6p!RCKZRH5zK!<6MH&!4aBJ@edAt|G`?7+Q+;q?OVd~d zl0ctb%xBTS!=a+J5=Vca!$VY2q_W-W3r?1F_d5-9(+lHz{u}txb_ZLnS3jaF_3`-k zZ}<1_wK(?*#L88&>3ari+kPsJ5(_GZebv0l#r48bd6y*-iWsf;XYETY`Pqe!-{faD zCM8@Ju}L&AdNB%}xmNqJVy|(~5vi!7zsQT%($vR?U_fqUu46p7pe6VABJ`{(WJgn3 z;`$ttYHwcmGmoJ6eG-qh6ltLK1L~7_g6@=c^O>!U&D{IMA`N?kI9q8n@tQFo6tcR? zDLJEfJhG8p(zq5hv}5y2^PvHkw%xs8Gr?TdPy{X%u5v=Da%HWx^@6O+V(bQ56NvrL zF&hL0S0gS^fjqarv&tHS3Vww9i^;@hNk>;@PaEw_ywR&4a@R3%OyT5XK{07 zy`w~w-J^8WC>xev)I=xVIZ$M3d%kV!{l2smB3??Ho|>LsK29@|)8Qj5`fg_k#Ij&0 z#Cn7|_h!lFPQ5sc+p(f2w}<^i&1kV592^W9%=-aoDm)As=Cm*EvTcyBCzKN2;U;{G zBlpIDNxob1W714;S{!*fq2dy~Y!4M5r-znx$ouvooF#D!U-{+H6aj&Q4{-j9oFzZc9`3Fg|j<5j!dYvtLrK7`B$Lm z;|UMGk<=Em33^N5^-k~Ivh{oAk?^L>I^_Y&S1KQ4RN62AOGHri};*lnA)^oE?h2DjBjY3kwh{%B38E^rNT)S@o0t2au;v~ck zp!|WjU*jHz7u`9GKBN=Ge|}xTtWvgsdvu|=@DnqB#q8;5hZx%(?CF!{0mSgmhmI1f zgso0}T{2$??r;Q1sxI`~$F2W6t((5bY^W{TIyXRBZ81cBcmP>EG2mH$npm*rCKK`X z0OmpwlgVv5jL%SCr zt_~!oLJcPijtkr73XXX}nh*gEAEE{;_!TH#xm;F=HH;^H<$1o2-*VpAbM)C>Y)4W6 zJ;q3->hl?hM^*F{j(aB9DuCZ5(q3?B1OGNyU|Yc`2qH`pBe}Wq)Y5i9u2CKy62NV# zsF0V=*a^l0te~puDIidQ^z(bVl23JN`X0=Iq}pg7g!77usH1XX=7roESK_mlhWkU2 z)FihgvlS(c$nWXWW3gh9+&BSg8&P|Tn6zQRxMxn zbrqe>Rm&cJg2KH&xEJ~_Be~y-tML#eI0mJbXJA){OPv-5BE-dqhYWA7y0^CnjG7hc z;Z;htNs@PXdp)SlBo3aQlvov&l@89%C+i(N0t-F?0|;Z-E?*3}NZ4fQXEz2)bOiV7 zQGO^zzoc*zGhq?`rgr8dc}uYIm1vt(^pJI{bCn|}yMAYa00Ri_tknw>}gI2)d7T?H@K~gNMctn4h@3(=u(As+27Yqj^ zJ6TUX^f=33>V0LlQRqUSP<--`8%Z13jtUuI$Ql>&+)*_V2@L6!eua+R-`BT*o=S-z zG~F8IF~Ld{Twlj98=1xBn=4O5WWV43Q&dr5WlnY4{6du68;~^+8`7!PMR#GFTT&fe zRne!cW)Lr7R164s1_A@HnU`AM8cnqJeS{%m#Xc;~D>7sk*Y~YrFMA!!iH z^slS?E>l;*XNukTDukRWJ_7QyM<5jfe27$GZOzs~hJ_FX1(l^g%4zJh%60t+s^uwV z)kH8>f*fU8${^QN2JCmuId&Nhz(o;Xkt?I=f(42HUNO1IguuK1I#gGea2#wuY$?v` zI-sc%7`wsTL6UQvXt7~t=(q7J7$-m+14M={#<;Vm0Z(ix=jOHrVZ&cnc=-4+NCg?b zJW)GKkEQl&L=Lb&xHnw*uR|A(q)S?8ZB_v{1@?b)`x1c1YOpffKsy$Qt4sPZHvnW@wGX+%V&3dh)*fN3JN%Asg?2we~_^_$|p_T2M%RqFus*Q zIYM2^BROShu7f&(({o?{^1u<%Ln`cZ{`-4%t*+CE)yv{V`)-2J^ZiU9J^c6ElhyZE z2h+Y`UPso3Q`G&?g}n4deoj+M-9SoweZo0rYY37;N5jEtBvq2f z;vv?HCH>N!<*7PuDZr$^i*wQhpawJiNHkT{FK6850w->9zKaKOlGtL|f(LAI_~nJZCfQS{b9PHTim* z>-`gE&n;inA8aSkd0VGg*5R`e5xbf*@{1SF->~wNL&vqZnn51|yF9_z-K)+$_XpVy z4+b=1(*)C5wlk^zf-!jE?#&9$b5z%SgzFg1zg5oJ!xJK6!QWgtkbg1!zVX$YkB<+$Iubp!vQp{vP#BX`Gk3k` zeU8B3{1=dDl>E|msYE~Mz3IdXvT z#c;7blmR4^R^;1Lb zl$tr-`1*I|Lqz+qWnFD8kcdsCqy`r&7uH?c#;wa7tL`|YksBJL$V%!_J=@eff^mx& zpJ3LV&pGy;xb!nDjoX8c6b786(%viuLyYJ%*irH)>0ea~Blf~J1O>6p3QMY$qDXW3 zUoH(y6@+(S&yXlf4Mj1e5fsx^jqr=Xq}hPnXIdIB7#X7pI()pma134&5&^2JF2GkZ zFjxgG*W>z7Bfp-GTu)I+3FI+i=hZHJrYsvz0VM*0vS|KGwySO&5s$3KREASI4_@^z zPPK9r`tShr@DAJ`A=m;;N?_6Jd21y&SAiulrF0|JTZ@zUwe1*6KbEcI&;@1Ex0bOt`b$x0&_MlIH& z7LaG!!%xJ{IojYNY35RJ9Lo zkIitj{2-%GVZx7PQ8d<2p0l4idnHZX=wn=2Q{(ri<5v%u4n{5=HixrU5;RClI>O{H zf4-jm$8o_ni1pYfFztS;XfC0k^A0eENm7}k77n-9m@tkMdt>ilOS0l4s5+sJ&66R0 zV~4<+oclgw9TSg&SMcr zbdv;@et$@X?Hrbqkl_nJx4DB3d&W%>mWwge;5 zRCE3fSTtcJTG?X5|8ChRT|8>A2)rM_)`6|E*y(u;T0)IkZ%<<*7a=;ifLj5OTR=Vl z>qbg25OuwvhzY8kPz=EqU@dT#e#s%$U>ztN=cSb;`-GuDCAn(p+|toO) zVX+93m@O?){kj<88H-QZL_D^BciWLcbkc1n0JFL*lwt4!GqNfV=vBHnCthEFO=Z$B zVTb!#$s4%0b1RNqZJo|>ih3iRbVA19dxg< znO~2YZp^TOxO1Y=Nh@xqLiIbKCD&9{5%aqk14Wxk5v0UH{^z?RM!4jK57?<)J8iwZ zi~%Hk)mjro^27IRwzhx=DwRsca%3Op3DOwkiAZIJGBU$pu~T)EqA0Az1@qY-M4G_o zBs&`G=?Q9i)fq$wGerFb^G0Ud!2aAHP_A*8%h>ZJV1MmAp8sb7o+^;WL1d}#2=ffE z>Hn?{KJ{Op|MrjyZOj6C0|ASNhQH!)JFac}&$L#TNVMC17cz0pBLEEOj=OS@D3O#v zG}SdT6Z?4U?6n#M1NYw!56w&`kiSj+Z*;mDjZo1F^y*Esc7C9Q*AZ%g?Hbb#_kEzz z2UW{u?DSSV6f-I4GvLR*!H=y4J~9YR0o+3@?8B)%l$@LlAX9o;+NyI^5ozxXz$shN z=F$>#ovY5GfLS&-H)}j35RHN>AdWaNO8ybux)W#qWCKLSv!HAz&4Dk^m0IQ8d0jud zKdNPL_K)eKlL}zL#~hXy6&1C&XFS^iBigd|7MKHeQyGPNy{e(`gAo`Dd&%1^j7&aZ zhb{}2x((aXs#f*Ov68D;sbH^8+g{`9ojq<5VH_#F!z>RbVrUT`imJg@Gej!$+s75N zBX$srxdAl<{Kn$LzZ{tvMPeL~6gR>lykU5@hE?aU-e&<1N98Z)kz(j%g1E@45w9qE zJdg1+mgelymq{>m5n+QtObwJ5Y^Magdk6|HGCU~2!EH!$WPc)W#{w}iao@?3)QA4H z>iT+uUNrye$o?`D3?u@PBvMQ{urn4AAnJ(%2=7}y5(FV>>ermX8F0mw7lS2H?-1!# z;?mT0WK>@e6DUpL7Q(BFkMQ0Gr7>|Mm1Rcae^Izrj3m+{#TaHc>GS||k1snurkWX* z73?7@U$kQ<4mMT~SvDXazA=v(#bZ3ItEk8j`3Tl(dbUE)z)61dE2kOs)&0rz!d@UU zZ!vM^1dI2bdi^JPIeX)Nuj8Cg6xESjM(d%Qd-t%a*T^Vn+=cCH=cqQ&uu~+%OUY^( z;f6q+#aRHGBG)7xKQ>Z9#NjFQ21e^*OOf!M5;JW%l3;<(Jy=f$GZpNUv3>ChcotN? z-W40NJlA^?`S$DsCFaRYKzsG$^cL*M3BNpDsg}PV`_yk*?+to>lKkD{nVu}QhKxqv z+yJk-wzda|N@0-jP3>NkP#Wd;|IR_jtS}y=-xa)ME+&vok!_|#!zuNZ3G$Itz^DGE zM_ga9<*MSxE1D(Cz$8O}p{OZ~FHNA8fTCEg{6lpWz9Ak~pW>%n^k}hB+h;N%-NGvT z#f7rrp(%Nq&m+B4R4EG4!<3@MVS^TtgJAXhd5VYU4?qlninKW`+wKgZfJ1llTZcZy zK*KVo2q;t^x_^S$2*78Wc?x#~{ESxE5fJ<`*TdL>Y`Qo%i2x(Ns?D=er2ba|yu4by zxcA5oeiw7fWMKHNIP-NeJfR)Xh-UG98t%Oq8#!!Z^hO|QEgFIg?gOcL>ZGV~YhWH< z_;!1J6~RU2<>%*zLO~Gc5S|lJeRSJSOh9%i13P|X=VF%yY=e`(akpM;ao}Hf8w4l2 zxv2@*?h@-@h1=^$(|tcp?+d_-fKUSM1*j;sfeI=js+NQjib4g4a8{WFCF7s=-2^@@ zhn;#PpEYGS+=RA^Ou=fP;V`^{CACN9s^sAWYy6G+HDD)7=`(8~jtD6xuqKjXf+cAf zKvLg*Prd?WNxOA$Q#>yE+W_!7{Qli6r=HJRHUi$`wl|iPN<>eHohLx{ytpK_?=87CfSw>kTP_1bU;!YT-LuQ zs|)kbP|Hp;X$`N%8`u+?lvw@eJ6MAoykhAO->g0>DV2%V0?p1jxyu z_Ua%UGli{xYUw4pK3A9mw3^SLWzbLMXG|aT{yTLA&jnjkN{&47|8=S&2<*sLAh$JZ z6wA_i@UY@f0wdN4YX{9S!li%zzj(JPpayL} zYDZ%dUiof^6Lfl?)d5O%6x-*K5t8Jl9rOO4*+>eUdJs2u!Rm9!HwD zlL7x8=62B!j6o*>ZSPwh{364bwZZLk@WECi7yS2!5tI}uE{=t~PVN9a+2a3|A1KQ5 zI7EjVI}E8ul~l^bE_1SKAZ z&^6P`kjx!<0Id0S1C+)p%C{zS@HRn6v$oP6iaH_FAa7p&*SA|nM&^GVU3VbWeHXv> z-dpxwac#-od+%iL5R#B&Z`qr&S9ZvFvdP{O4SN%cBC7Xz?;lTpJdNw#-}ija`K$v9 z{*Mqb0Ut`2{d+k8%uqp*<>Hkt` zS(9lTIMO84nZkVYsno18r^ZE1h-X!i_=zJ2MjkEwJ#Zz4pqo;1pBkRNH_# zcLvI%-|lp1?-vm)g$Tui*t&h!qZkKdZi`T^;I6}Y|K10F9i%!^mG6~v_{$Rvqlx!= z?Qx~e%$q?^ii;vqnOUxg>D4sw%vo2!ikmxO*%rPL%@M~&3 zU>hi%%b>2qLwA+jL~mP&9MRK5fTa68!LJH>Pt`P^xgPJ#T-X~!2 zzA>pn3q>>I1|TbZ_@ezp#bM1an;XiAbacg z&M^MVj|&`P+(-)x3zzN?<`=nL7l>C=STR`+%q})Q?O#0oP%EoJOr@N1E4Z6cM8V8Z zJ}nHhy=10x@n8bPTcYS6GlOIpZ^f#y&Cbsc_+;0OGBRitO8|KhGN+&!eRHD--=V2y|F z585gy5|-^g>?hg%W`R;Kq41!6Dw4WiJ7S2Qr-r1CcoZczaOB5&VcyjVjNKb}jJwM9 z)YCFDFa%gha-t+qK6KfYtXew0MvYK7(;FiH9Q+vznK$w2?ZfWPRL$uDQ{#o5ABl{z z!Jx&^(uMvw2R=-n&M)ex4u~gD0npCkGhg>01r3R zOM~LBVE2#7yJcl%A)i9)jZ9667-i`Ae8x8*Yy!*ziZ5?RMJ+BaJ}}TStRQ=2>(}`X zOl$y6k`+=1!*BvM)NsL*c15m=J#9oJ@N5_Q8$RnUx;e>^JT8Iyiv#OdyUQ&PKydlS znMkbHT?`BLFMJLK-YNnczW42LVwT*4!8lo=`|6utr)^Q#x8D3akLudDb0IB;iXl>b zWNON~D<}ZE$KRM@c^<&IQQh~Q5qKSzT1jEm=CuaG&x2oAdnJ2Ic>NtvHi5#|Q(Qd$ zl?3qtFii9aGY0;JTeS1{{_7lqVs(2+!SJHPr^1aK9UEJ^GB!1hUvYPF0h}CO>dbhz z*V{v9yMWM7O(Usr2k_}X(m$I!J8#_<;-n)xG)~Utm~5nYRKGlXrzoedgPNHe=kCf1(=RDk2gxBb9Pp8d*oq1xEiwkRce z3+~j90=&GuRh&5YViymn*s7i?>_WoS_8`pX*h|7)$ebzs>)VGbK#lf)&%F03@GLkx zbI4Pvnopa=PrHJ0bhzO zE2Y_y-1-0JjYWk-0@?YDrWYl!YVEW*vpv<_Uy-UN4^@%O4fg%^?Y5`7R^VoM$ATF( zr`R)_t~XjKEt$k!u3`8nb~(W8iPL}lw@QX{V`n42yO00D=wnnCeEQBD>fo0)Z}1qr zsjdd(>p8p|i?^Ql&CFto^RrJ;q=@DNAb0`ZG7Q^602~7PSJJ;Gcbwx^-v3I7; zwQR*)Ml!ZZk~{e?KI|{+UiO%nN!CL_<4W<`$h?tb?!_RP9+^hQG*5;D9RW|I+}*vBHAm8NriPzAtM_c5 zg=M3XU3?nnNCPk4)ARj>gU;hFXieadL2CibMA!L;dqqQ3Q6NnPIO!bbfd>oK3(8dY zjlh}U^BNePzY`CGA6=ZRjgD$qQlC^KWy5+`X<#5YYFR|xG;}!9p?r*AfVrQW?Gt90 zwN$C5Q1YHQJXTZNr67NiU?qC}>n5&XTguv)nxEUnG$k{&z9P%Wp6^dk9wcIMi9r;| zJO5M=Xg4-Dlk=P=zjlVX7yz%4sGj7e8?m<9QK@<&(N*UAjXOYB0(bSzfY>aZ^Go3b zLsA7$e}TJPk;J!+!3%3_+~}1zP+?>&diU-Xv?wdks)47~T`UiRf0|wNL3%D59HgT| zNM0RI*6n|~4yO?O8`qhDR)M#pK&Jxiy^HlLP*4EE5?DWse%_1A!_R;70n9bpt6~>v zWT$Nz1hvgT0?3o2<%KPuB3sH>CE8oJ;Ap&%P|o&ak{fWVs?^0$gcvM{M8J1Y2@{G1 zw)FdVpG$>EZ_su)!v)hvH-LjHehpa%10HonMYd4F8w?+ONH1}P7V2K%_%xHXe0N&! zdP=&2LqoAV>Fb5S5%#PgKy=b;)yaP|XSfrI0zB zR*Wka5f#mVS9-dOlLw4iQ#+szUJAp&gK6G-45SyEAeC4y)1*=xTm0}r2jm-osUe^8 zckC7e5(8i0%<(T%Q`7E0KR?A&-bUrc=3tRP1I@?L#p%YUX4mkEnFQjPxo6O1L0cW^ zk9~sIZplAd97)2HHz5X?DB$U2J|yHTDit#GH^?SMarFG#a*X0alRu-p_16%n63!MC z6s^$KxXs*eF)GH&^{AwSCs*ndblG433n1grk`tn?BXLT$RASpGdzhBXiP+{QeWV$d zy8HKmU2;PDKkDd;gBDFPG`kiHdcya~%!t;G#_Byl!Mxz9{- zR~FLhW_YQ}_pH=j`oH@Mc^?CwZ=avdsNM{GRP5xqHy|2lkvIuPnA6`@SGz%S35acv z;2(wo59;kk}CYdVxNUFkr1KnVZcJ4;*KAH!q$lKj+NpM-JO5@{}E9{Xt^BQ`l4RX z1CIkE>5&j=}M%#~!}SNq&Y$umZ=++?=K~6TYR3XxVGP0-&>bTV9UoUkkMy zB(y=j7*ui@VL_&8$-x?}>IqIlNNWXL{SD!lTMabbjtXm@?9w!WH4MF!y%9!RYn-es zLuR=HMv~dxki92RY_=vxWuHDz8GYAK+kJ$SlT-CSOs355$LrSel=t+>V<_VGz0a~f z8kpVjBE+W^sVprm1*-uZVi>lbG7*O;aR@giXOS7$v$L}U8hA_4P6<9Uy&dwHb-5=r zKG@Wp83)cBqMGn2ioA{&2|w7&KFsZPA@NV;-o8bM^oS(xjgIY0tFS7u)efh>SzCr#B9mP9vvV>V5S{*d6_9-O~@rZA_Z}4 zU_2jw7wJ(|S?Lerj4cz&W_H@duka_t@@`Y(12$?Z@J+{CCVOSjs9?kaoCUN{B0wtA z0?Ho%wdiDm+Q3L%%_4ZmrqK)}GM=8Ez?#8N6F7Ni$9Hdb5L)7|D7rWnh0$jZRW`Q? zmLp&YD*|usrz79@f1rK?rC*LkpcTs6p$p94@3Y=EWYFK!q~}oTr#+O77eLPJ;OtzH zAYeDC{{Ntoz^kLTDSo8E&!Jk9Q&Q%NJP0r{eg=K#amPVj>8PaZEl6Bgs50bK)^M+V z+ad*+1Q3CYa}U(qOiNT03|5}Ovs|H-(`VTMv^_MyD4HQ`BRrT~sG)LP7BGS@UAz%V7}8b#o!b`v}4spbD(JgQ1&h2$5^E zL;sQRidiwL#-b%oV{sZ;`Slr7hxGHm*HAzWlu?O|x&aFKcn-!#vsQN+DGZf~BfsON zH_`g6<(D}U-s{(wKPYZ{(;BBL+gCHIWUqM@Lt0Io)7xFl2095}#%*p6{!(x&R21ghoL?3BmncKN?xww&7Y1sp#sJsnYrck)N?ZJZveM4_M_FE_8Y%Vw!f zBQh!8VuvQ3{bG=i_Nbv6~Y&br%lF}S%#E2r9!uH z0)8u-jxgzZG<67k7wDtKj5Il#V58z zAM+AHZZ*2zY80(v=x=0@reTVweQZdgIWdt@%ik_ifKF6V#m*NdlB2*oST|$M!YaO> z!>StZU{-ZP^zDrLg98r*wXcdavk6XiAC4S>kBN0%d(V7n4Xt!5PUbz7nuoaGZ*$#Z z)oBs2Cz&6z;fYCz3&(Mc$NhvuK(XE0#Cu*-UMlu!j~NE?Tv>upn)s6)2UVxn$T* zSPiJ}{`(sao@?@5+C;#bT5gasZ~XEzI>PsWYH5}{MCOA`^c==gQcM(46hZ(1g8=8G z4)ugS3jT1Q(h+YQYI3RUzsso*MH#@S1v(FfE;N{kdtyp^g)PW5N;$I%$}f9MdkYt^ z=b|UkH})C-UAzY!Hi;1)PV_-tXC0KQ`8{CmZqFGsi{E5YpuhWfu^EuDaWdVs!b*EF>13k;J$Wry6q zgc-Mg7_wh+BX2}$5_8O)7%4tDzcs!IyENgKWsWcYce{gF<`ogC^QgeV1yBX>^C%lr zOuG(ZARd9X)zdZ$12q(qjRaLVgKuIm^e1==3h(5lNuo5U?B6JD z!S0;Mi&HhC(sa^;8lOCr6>UOayZg4UcVWt*>>JAmty#1BNJq0PMr! z;?s9l0PE!C!3AUvt@ZF@lgx~!IoA_A)-2nKs_NyBA3s(b^R5mIxiI{Pjc!=4{xLTPZeTRgkc6q#jGNC$EIh9laFcYz#1crTbKT2Zf-X$S z^+La_mn6vqZloZA0VCroe9$mp`JM=!#S%3JxJ4fBj`k-fR###v(SY zhR_o=Xc(7_dw*<_{sO~vGS)2Nalp14KHvx+#LG{i-aMg z4S{=~XtnN-e6f4?N2|UJdDlZMZ*Gr|pC1q{dCCqoHVBk@@Ma02SWT6-P@-SNHqIB% zIb>!|lAyNAr%R>bFPW-crY`YJRB@z(JZ)=h3vOnGe2%t{H+0YUt+AP;(5@~ZQUP;+ z!M9^01zA6~0Hu>|N?uGu1OE)*c%(c5Uk)A>|IJ{s#w}tn0|-Xk7MLy|RmK7mRM|+- z{4a-whG16NP>MGFbNZeU+HIu`N1)K4Ab~Yws03lzaZ|D&uVzry-ePC*r@ZWxU86gs zw?Ny9b!x(M`v&+21Ab&Pw7_OygN%!d^U8~s&j;Gui;g*p55Tz>^n-2qMh}>h_ zu{l+; zKt}Ee?3U<}vXq)>T%as5YAGt1AqJ-^nYl=_ZhekDb(bf@SVk2XpX3^9ia>GYvUYcO z_m!Z7)+CoX9uWQ?;awE-O)g=T+)wbjVRDF_xM3Us8%%;y^$Izv4%&^g6o8@e963!&>Ns0%e~a>G)cMPu1QH3cYsARgH*2Pc2Te3 zLuAkssv@b~Jv~7wq)e|nAaBl>3DPfV7)g5)P;cX6hQsvm9IWV~r?W2igo-qmWx;5^ z3pzz66i#LW>_`P*x)5wCo&r%Fy_=GRCViI?otO+H)EDJ7^>);9Br#e_MxOOkr z=atReg0<;^;EjHR$NOJl0-i))y7lOVymo`xW?T`GB)YFOuwDQM#nuetu+Pw>Fm0Ws zM=UD6#E?`8M96Hup0|HlD(@`W#8S#rMT(sg7gqi*;c9}%Q70pY%OF-%tH5SIMgQF3 zte&e{u|&n|zxBcFVp7qNL7@OG5nA2EnP-|t-X+__w3=?C)I+f_*^aLa@AT+WoDmc$R|=sNNZd5 zVbdr^#}bPcwY*c4snON+MUaFQ8C|RrfD|svc*TND3ZtKy^eQ7gi13wOO_|=iH&!f{ zdtC&NP&&I5Z6e^?kmkCt57xZTN_zpgO^oRcI7)6s(_~MWM=eujqPM>#d*|JT9fdw5O%!Xnd3`LRV2Q_4EDV z!@LR1J)~9{nxG5dvI~77U1dnlE$5?1xSx$yVpU3#Q5;gV;|C4E?#wJi(xaftxEX1{ zI~Ai+0u#&Gbu{gp(kA`l8_gHxMC z2q_Ccc*r@9xSFvsL{Z`omiS)P)YV~>n_>{}#Ld0_?w*dg3pY zB>nT_e*r%bJ>ickfvX^YMcNcKvng`+5oqn5iM;4Be9Q;EfYea(^}HdZYX#EoFF+>f z-`(gA0JPKS#Cdz0ho|_vMqDw%MI#;IIJfB5B6B`(cq6r$@tDC6xBLnsD2Vq-@J4;J zbPcWvh~E$xLNv}-L+r3$i`RG;A14GPl+kD)?I{p6qQ_&ceH`~}v0mW5?e7&12*OM1E zGd~h@sZW-X$}^L_OPaU1Otr44$irMy_w~CP2SgM9bK_}^la67=z}Jo`u1vkaG}bKl z{_Rjw?9)zrR*7t5uK2IimW~6`la+Ov(v6gOnQM}}@LOWdaTSC<3@r(5neJ1#l_l?d zz>7noH#%sPVnpk-{(ZG=t{0TwJBp{4dOcG3bcHiMG8cB47wfH(2rzWy!sV6E5GetM;9mD;f zd>8S&Qif!N)zYWj#N#3RX4)eDxSzAtZ>#BZ7(F6#^Ykotke6t$x@HanIb|Gy(gKvCK`0%HF`gdV@wT( z382oxROp)n;qFzz_f8uDJv-#WOD0^D{RsUH`l6pP(bo_tSCE&dxfgioch{(LCJQ3< zp&wM57e5QA&?&e{W6}HFYXj|}Kq-yx>xB-W#Lu!t3Gary;OZ`Q0)1X;rS*u6%~S$| zbgl<=bv3X_;rD~U>ZxCB2NrKkZ%qI%iLHad3CA5igusuMx4KxHQDrQvjf&`jSt;>S zCO;PvRHo5QM^XY#a-^TOe#``=>U-hem(Twl{~MVJmT;5H*O()0Xm<#5F6~P_IR>Jt z;!b_SDrz@)2v13Fcx3;r=l^~^H>7m-KLe_+WyE{VxhO1z=&|a!(<3CclBZ-%3&{4! z&&u0>$m54b*_{w#kBfY>k^eVasN_~BTto2FMSGIbFI}-;&_MncswO{%B+Udv_#Xp@ zx1uiRMYPS9yX;FPatZVsF}s2bvBtOv)DYKj9`%r!0gsrWQ#K>b{n!nAGFdIREJ{nw zLZ*xRv=8hk0!KbfmK};e5S#Xoh{$|t``XY`v+oJn`H?| z)6RS#pJ6Mh(XgW4(#-!9-RXVXDrb#8FWi}3xko=rQ%9OR2nN-vdA6vOY=CDphpQGd1A@U2UOA4$hS_w z;_sYPE}SQtobsYf%sNy;2Ec(+Tj^MbNj|dibrE7?=aYwQGR5NHN3pXKYR5q2o&8#Q z{ttxYv%m3)N1f7%Q`8)w>eEa5$}v#yc7pE{ufWFte$x9NfSt|Rv(XX$I#?uHSUnky z=kLIl#G|K;A7nvIOGt7Ap!+5!{f=;9ILtQT_lb@hKnkwnaVzQl3IKdCW60Og=N_K= zL!eNg*TELgeQ+n|LBl;Hw?=(~nhnk!L--tmBtZS1+_N3HYaH@7fWOR>@MeiL0QDQp zZU0~@AKCBfDfr^~OLWl^Rx8YDnN0tJ0e=hfdr3y{X;L55zZ1KAH;BsIpl~4L-yi)L=^TR0F#w@zeK1pBN_jKZc$B$p1c<1gGSniZy+e^baW(* zQ;`nmg>ZnoV3p8xgm}dMZD}S4ITF=0w!zYGiw;S^}?mgI`JyH|!vIBg^(n$Mz zI5UuyUp%qO2&78QCeTr33!Oqp4*;PDKdOm7EjIdejY2bWQ{GGiQfR5)I=Oiw4wqIl z^=!HPv2d4^x1MzT=^r!f(FJD@ldl3}NYm|^@RtmCU9Lm6899E6E^wF3a5WUkxl@hM zyByuB!Q#SED=H+{Zh{nHrVoz9&GXILwlDQMC212`V(B;Bu$Z5^@%6Zq99$7URUnZM z4EyfZMBlrwG$`qLX6h15h1cj!rksplN5;ozSGFE#+cf|2hl_7Q9V6e7qO>82N?3Pk zk)u*Jjk+o_7Hwci2vxY_u{=$g*~A(Q9YuR(uTsh zg5wEe$*sAKYmLgic$MdpcubC6lMxn9zVB05PpE5?IatLV3#QXLG@hX#dLJ6hDq?32 zT#)DX*+l5g^CzCLC4@GpabdVLRH>i#NVryF^lf7uY167Z^erb?5R05BIgtzgR81s~ z^K!T@C7!m~^=rH)xGg!f6<4bhS1Ga75{e@7Va?~8zQ%4m54u00=Cu~?=7)hb&N8NY zjuxz#MzxKbsOC7#!HaZ%@fh@5O6V~g)ilCIVV!0L!wqFzI{lai_3zv(p;iV5cS(Fj z3b@J$6=~t|qv@9`3#V88y`D)(baLB&;8~VH)Z6wG>$(bT7e+Bf+i0G;b{TiR)%wut z2BZ|^rf*&wo8DglxW8~r^XD$iFR=1}NSR!b+^rlLc;o&u`$DM zIJ>02SV_34ps)mb_820#uV0hRyaQ*K77|?qZNr{GVl!>Tr7U0 zF>5ifwO*`BLE}J+@s!Z@PvH}hhrBbc{l28NrbZu9 z=27+&^M{3P(A5%#vX#6-{NnQ^7_T@*+YQ1avC?&!9LaC9pOvT1l3$lRc`h31hB;au zGlCu7a9g8OZf)CLu}pjRo|@Tfd0DN4NT-_0AKKyy(sI0cx;Q&5@oLjc+(PYkv@eGE zT_16M!L;WtKj!dx*C5MWihDQHfV`;$pOe4ET{-qRf_+fy-f#?qrGX$_ob((Y%OH(H zmLTm(l~O2M8=A_~+vc)rw?}=%C3>=L3k~HTa-(X}_2bwD<_nR?VXZkLgKZwn7(94~ zrLPrTiv8k_npqCNAK^GrkjSL6g&>!X4DA!=&8b{Y{B=cF7W^Q)%0+uE0_p_kA$44D zwwhJVL~qu$w>B?B?vJ|5zC#s}{>vrG&36XF6r42Cn6o1Kn;>k=V{gDn)FD!Qg`(t_ALG29F-1y{Vxe`6V&%XB5kDmc8;}(=3i|o-`sC140RR2_Pq02Rv>hGzuCw^*5olVe@A$Aa zJh5&6ePdkz{AkKniTdj!Xk(2;CJHm~7N6hb*uH%jU6sQ@pUg0($40uh@OlyA8^H1J zpBl0`o~A2v38>%$$_vgc>`$=r0n8yie~s?l;}xQaA6s7Y0*+Mezglc;dNFtEfmL#} zuyMIZg~Y$Vf)1%MA+LYU>|LPfl_xasgTGQl7!3&m$0PhYpMhA#&O|LC4_2N*;UPS1 zf^PT;gww>y6%TI%FOA68;n9paUIFO?^g4}WpufFCiA%+-t1jJGT&$3`E%=5J5E>r##kqo0sZq6t_f=UwCe7$t4-jJ$+X=6jK^m6aIQZBRsHOj~=1FaX8y<9K& z&15Q#LSPwI+H{zr#YilQNko=|n+?|^`#xre_jtc~YJRS$Atkp`U8HD4So_pH&~qsg zMsau#he))tV^i(7jirw$r8QNIrY4!B48OZH2ImWMH)y{&J&enl_s4h8f0fSZ$Ra7TGP78a{__#!0SF)<=`OVz4x$Li6yNM1K^y?}V&wzQ54D`T9eulR{ z!QBIQz1n1dGN4$mrgqK)dv~L6)a}*Pt zFp&Fh3Y{|f0S>(yC9?BydKm)IA(pN%$^bf&I*z*O~=+V z${yGiK#YyguC9FRde_=u>ov6celThfKSjDcvGu!=vx1-q zItht#kij=M`<|{3;!hL0DPCxDxfRGh|C`QjXvt62W57qL$whucNr8_w@fn_n09@LH zQJ@egPLF9r16VKr=0(Tq6NtG8IaOHhC7-wT$;*Jfuda@}Z=$Ey6QKooKa|S-gM&Q* zsI8p)U2T^9B!zL-T4uH&@^KjmCcq5uXs!ukhF}@qcXi3#x?JQ!T=A&4T2s`Q0AK>l z>cd-rvg%&H)^vFb5ez@?v(x;fueOdsb+%j0_9OJWtCq{FaJ#d7Ra=U|RP-%@^n#J} zF;;07l}!t6Ps*#q`lV^2gw^cUYKd}8Y*K)>EkoA@sF*z=%bxP@~?7TKFu@W zzEr_A5ZTK*G6<$EuV&d!g&iIkJ4Ii{e@|?jQj3#p{VhFh91<-t4H!3xq`p!>59iW< z^cl;=-TgE82&~EmNAgc?DsMbGpwp%4)t7$)u_%DUGGI9NVpZ1HgOo|Y=eEK%iq!27 zc>qKj0$fa;RWoU9h2`900p`tFb(}IXRRJ!p-PtlcvmRu|pI}+F+@@!5!LS4JMNDFH zo7J09*d;)5ycVq6CR6O6ioxLlwjp#9SFdO=!a=2oxGDf8T&LgdjA%fxArBWM)GCuZ zKuSDZZpJbD=;d%@C(arx8`$tB;qt@P^-$Jl2)?k@FL#7cq=ew5|Fc;%-op*AK_-sB zE=(>m^&`_*3T#Vuj?rn zOn^}$P1ORe)GK{=IpBuX2PFo)lxDfaeH^1|-}oV2o=d*p)-Itn`x zeT+2a8`hG&cHSlbN&bj%bC^~X({8uqcokJ87!=q0F$?{domAhW?~ld36byT9CXSLl zh|jt|`l;WqJnb#pNjQBL;oW1 zW4K_dxhiL7tgp>TA@p%UDOXAk#dMMCYSRpN*v7!3PhJ#=#;X@};riUIK{; zAU{DeSB`id%_wty(hmlZeoX}dSm^qot{u!|c8W&E(jdi5W!Kz%MA+2@QFtK5vZ1GR zmx9L@0@$Ap2QzQ5(!YT$vho=F@6?U_>ET!W z5WNIWP`funIS=ILUIyokJs5y1PY}JC5N86e=-mb789qZ81nVHvE4n{)I>SX|8HnJ3 zHVn;oFcNClw#hNU?#buggJ1#AfxqW*yJhY@o-cR^{9kx(N^wQqAS+qt{EL>Pf-Za5 zhSOh2iXa{KYN!b5!v3hNM%3F^c+w{OXHR!s8bs6^CKSX{5U zMAre0;u7-$G%O(_#ej9aI~P|F#Ez}7jL`>n0&e}6>+&9cU0VS&?m-K^VkM^W=+dIG zbkc2d+@fk_%rYsO5U^<95zWv=Uol7{_pJddg{lan3Ss%y=>#DAhY1Y{W+bpsh*_C-K&R-OzdSOOdo)6_Z zy0e|*;}dAm3{W$rV>C@mkUyQRDJ|O1PeD35g>PxyGsMT{xTQt@MLtSlVJ=nu!Ud;* zjNM1L>GuT8p23sczanR;!mTd676C<#VZzOzMejZKly|g-Yot|InL3Ei9cRK>_Wx z2RwH%dSxj6)$gQ+iw}4tVA7n%s0zm}F_VU=UiyWLEV_QfqwZNq+fXSIY~`I3sg5a? zqsn>AXUwk|w}nzW5b;Ox@oqLcj&cYG9kwWU1Fei=v1J}H@fZ_MPT2j`5b((eZ{Wry z7~*~9jRS8BbaPyHLxN;J@{>HQTykSo=lXah`Y^i>s}?nah^w3LAH{?|on8KC%6R3& zdt3#M(V!#L{LnQRpE9o{V^!JdNL*gVS&|u{*9xr^#PD^&bTl%7!y%2bq1ZO=@8@)m&Az z2UCZ)WPz``+#lx2;I=hTa6N@lj-8!1Nf-J`$ocVkgy1a#2GVg{VfV2U8|jVHWK#N< zLaO ziJN_GDo~Av{_YIsv|InJ!G;qorC~cZkvlQ;=5S6?g+uls zVVsM`1g)bAx#ycD2-~|wOY0&dC@yZwFrB_g>Fns(J3C=y!tgkN47D|f>)4x;zP8H| z+x&9KcG_N0s0BzCij(;>o?cm$AENg;sktYW_4QftRtKtD_U;7b{C4S>%*9ri4um|) zi7XUTp>RC8hh_v{t?TcwRQ0J-dnN>OS|U-KLM zPKjo2TX(VP2N8l_b4bP1-7PUcWRZQ-h@0EW_u5M*YwQ%v!O86)y)sYu7GK3bb7uET zP(iFlRdaN-SEN(<&(tUT&2xE|*}`#qw`hS{n&{`?bl++YWh}%lAYe{EY2+oLQkQq- z@~JkrOy%a+X_vcI&}6r=E>+?$@ot@Y=vhGnD*A>IIMdav@^9a1zJKm=?_UWeLPSPf z{1+59SQVF2DT4Oi5I{de8{dJp_h56$DJalxhgp5C)Qswc2K81j!Bev=e-67LSD7uX2pKt#t&pvq9( zuwTAROZzdaDF9*r>uezTg&Uz0o~x=jBR)#VWIO}ypDOY55cT@%{Tp`qwnc4JUfi~1)ff~%%Qtxps3dE3A!T#;PS+I$2v|b{BM4QRNtM2dI$_Rn z*VT(ZLXZRt0|(g#n=g0Yf876nsSk%i28G;3S0EK~p);xcyR#(QW8l6XWFjW6ErH3M#JA?jKCLT#`WGanQta3-#$B|ShF-EGSEih}Ue#MfY4NC4 zxz<|3-#qhQP(8BRwch7;o>f2{IaBsGF8|7S9*X}}?@v-}l`GGH16vSBv5YS5QfxW@ z3$>*jJzjQEA~W*!OyN)tUV#WK)JMSyYUu0>|42t@L|N@i@+D>ND2M3Ul^H913E1dr z$=Ufw5|o$!|d z>gelJsQwdLG7SK?WoVB%5uwOa7w}4ZdpGv4^@t(}?*X1`meh9m`!AMB_?m;=kYrPJa*_vZmldJi4q~c5w!X$ghM4T27}5W zz+eH-$lxgezOa-mbeMLs0X*g&pW9N_MRX(R&ThZ`{2lnRuml3B#f{S-5O;$ztnW|8 zD80>6R&_P>%wVdNLVcV1>^Hs-=Aa9 zWa#24fZrbcEP%`5As~>s-LekyCTyu|&c54BA>G4`$ zq>%(KLlSsQ+Ca(vFB1>(3DO_HI@=T03x0ek^=Db|s~SzZkur6H3AiAi;$rj{#8eTL zKu+)L|G)OEVQT=ie@cHSQanKJ7-zw)AtW>pR&BdT&IxA}l!o#Kg0yvj3IOKVIBghH zlBY5%D*vDfNvcL)o!tHG#QTmxowk%dU9NoRQZ3=EQO|4;?=Eh2_Nu3L{F33*=MB$_ zSnwGg^fFoKcNmgCRmLQcy=b*yW2_)VWG{}a&o)#O&NvNMhw0xJYu{pas-99uA&H^u zbt7AOqb2k5Vc3wtu(X-!X zXcMPhZDCOt&sr5+u5o8iNkLhOz>p(@NaTnGmuxmYejO%O=*HuH4Kd^CO!y>qisgU{F2ub3D|4hM^(2sSJ5`knrkbWt9*zTTb zn80eUn=&oH_7;K2!{C1B@JOYnDjj)JQJVPW*VP|vCPj1dcezBZjtXcqn2~viQ!?J| z2syGZPhkt>*w$>2hCv^XZ_#Y)s$srPh2HcgtAR&6-NM51G82|nTb&oneN;HgFn>mRD6MGgRn`l{Extk{}e z#Q$V9Hy2j%!IogqCjr)4@*aW$xk29(Lg%6eybCDA@y0`m=i`-Fz|D2D`2o@DwE_7B z7#L0i3J@<}2Qc!$18?J}QZE^#1KG;_6g!(i)eW(xk&v_5Hn(Tl9sJD7>LtT6QF+@J zPw>p-?M_2NNF7`nCVCmiY^_4vV?Km$N*^-tP|2TQBnkksfV?Q9BPF&~8WGD48WFm={)wDEg8ZREtO zigMy`r2xImNFzqL%)rC4s@&U!ijohyshow_zVqhLlOG_7@DR#LHY9j)DEi>TfL)^v z5>`hJ+QH}!lrIJf_62Na1LNOlEXsK$VajI=iwKXZ+S;S(A~YH0YqQ`>+l*-lA%rPt z*zonQ*z4<1=5S^SSP%-+KD^gDS}xHtW{w@%g~@JIqCg~) z9U{zt=I2inN5XE22<($O%P`~JqzR@xv=`TnSuM;YA{Z-WLhy~U##A!wm)n~%t)}xx zs9W7FT1snU(fWZx^SL#R-E`hQiOgH(dvKBQzMYz?p@A~V{sDE8Ork_1GkM8V(grlv zUl}DIbJEofo~da&vkFs}IO7ja@XUym^rU`_r)IGiGO?R;Ia$1@a#Whm6F>yg(}o3p z_5Cf%zWe4t-py5Q#;pbLxm!Gi^3z=NW7uIB3g%@E@iSJyLkV=CCY5)R$k67L?&`lp zl7`I~yUEAa^e1;z{9qL=nspelNj^kR5*@ARb3(>_)o0AbI7}(Ql}r@WYP!Uo!SH2X zomPog`zqG~u~o38rh_ASYzq~)kj$+Kb`8HFkTa}=H7($El>ar;gF3yfW<~lp9r~-M zG?Mr0Lq(#A{)vf;zfpy$8~_qKL+DyC*V2P{dJ1mFf+ zQbFT2CnM+jh5=%zH~rj?c%{HO6m{+gNl3VSDHnVfbxyeo3%n-3!B5~ck&7|1L&l6k zG#3c4laCbH&ke_{8;~*tMc#h_#2t)(?r00sQbK}Wv{yy1dMlhDSkh`MT0P;08V)`xE>e-lWr`sa%QwZn9=T-CX&AV9?rZA(D!Ug5nP(JD24^ z6WIzD06>^?eGGZyU}ZUJ)G8<~Z`NhPyQvI(wcz##Qh}}S-%pgV-Ytee?hkDuw^=o= z;O9ji^HAZqRN~bfrmLIczk7P{*>}^rM;I zzaUUy`k}o06R3UbPaqcyrIWkW;+R`yfbZ-DJ$Cr$W0%z#5M|Bto)-@^1HVmid;-#O zTU33khE_;@ac@!Da)drmg9Dq{wZb(*zKS!;X<+U`pO?g?P@af`1BbKx(~-*D=T*b( zHolj#tNJ!S)A!A7+Haqm_l6Z`th)Ge%-@x_M-T@3KbI~PyHuzoBEEP8 zyoT@bzt?lIVNrqR7m_%Bzr+r*$&{qE(CQ3XmaSw%Zy8oecQ#)j3{&-e9H!gs@X*ay zd+8o(v&&=kt_~@y4lW zDocnQ9&^DWW)^Rxs^)BCAiD&%nOsf$*D=<7<^nzRS@qIsIg!va(h|~4+&d{a+pYL@ zLt2AfBKs(E82U+=mu!rkam67Ru54*~*4D28weoMC+7afm^gNk?HqYop(@=;uxDbVs z&dCO4)E}+LNoXzamOE2A{j9Q`WvwK$Jo~nykX7iP`nU#&5Ey?Y`){%50`dCIljE=7 zA0ghA!J`4Yhs9W9?|7|(0La-ZFCWr89UaRmnaBLv*4OPU8ZrLen4J)LC8mTx`vsjr zj5HuqE^E(6hwwLxCL!5E>KmH~C+r!VZI}0OB+|503K-Ynx5Rh%)6OR zRQfQFmRs^<%AP>iPtSFKNcABHybIXEYB;_j_*l(@$5eTEA6mRaIA)tcuarR3gBo!9_tqAy83P&_O{#Gx+mh zqdijijkc#BU#MO>N^&SwV|2TZk#Dw!Ds~zgD4dUBY!pmXQWW$*ERQz|Dh&$e-(eIK zRaDyl4eOw?|HJbrGui4kMBR1^5gS}{^yOAgo1+g7{lNb5a3Tn{Z|+j4IL%_ zf9U*teEF#V&NUzHeJrv&E8G=i%f1zrk$%9RB~n{-pd1_P1UC z$`1HPn1qpzt(Tkg`#)+)iwXe$&f)(c{#(C)0shUe=jz}s{XdZZBL6qa@ZahG&gMUf z{|(Ucbg+Fa$iMaC|3|I=r2Pl~AL}Hv9sF#a4HX<*Y+b$n*di=03grF2ru;Wj-p$#~ zQ`gzqR}G zh5Up2Px605aQ_2+1kpEKmKfcv}bp(H#_Sh3h;{tjAw^xzIEvCkh zK|y(mqM{)C#t-%2w=v{$UvJLiG%#QLFJ@(9AFdfZiUdRcC&N5_ew#T4u^(UZDYk*} zzV?#~eFgMe#48f?v3H{b`f021Eow!v`4?&5yoi?L_%;#iCmlR{dn9!=jSLxskG(fL zZk+>P?E3Ye(^@0?{RolbbFHxKybI*RD)J7qbB%IGW*017_7H+dM4sY>tn(sRJE32M zY_H0mK|*7n{nC9nM&5VMXlI@2FR2gi^KCuGkd)HKG-o)-5Btb*BwVI*hw`2|DsWF! zpM$A8_>}kIhd)=Aif#o?!qe@L`)VYnQC^4l=S$kpLSMCK(cH}h1NGY0hEhq_$qqsu z9tEg{?D7)y2EO|2;0M?dG)g7=BtVoczvuAwV*=B?#@p;UX}9F(ZaRk1PRrJ}4TOP> zh67y{y{Zy}HzV#zLhvGvr}9oxp#!|imE1*hs`j5V+iW;x2^7sa9+pDx+&VW55V%yW zpH>zYzU=V7L0Knd^6vUQf}xbJYee#d1&_O8pbOb8{#U;&p%)M5oRePt2WRX}LY-8p z?XCR%xq`F#s0!B{6$<2^a%i>s77NklmdDI%Uy*I-%vjpFwSLHu#BW0leJ|G!nzR@1 z;hStO_Dwru0CYLNBFhkKei6LDduJ;j0KqO!Dq*937=b0v{_23W|!K|z;VA?;DX-mfVTz4>#Q!@xl|3yRXkG|3D;zRsic!=R`u2QAIIbfZ^0A#EA@%!DNO(#M0R~+u~az;&*+OF;<2hLN>>4+GoHt zNwTfc6T`aQ1=4aorm8p5SQu*BC1OpuKFV1(qj4`}sR;Cx<)em+#ZrpRSyAzSva=DT zo7$YjkV@C}GQddulS{FCMVP?RtVrdr3|x^EO|ax|1Qx#zH%iiTQeGC$It7UuY5W$w zom;BGJ*uy|b#$34*CT*Tze|5frc-^^Z8!-|6z4VJO3f4Rr+#7>5a%Kr0QfOnW9+FO zTQy#@^E>hWS^t}5{qb&-j`XAkO$Xj_1E^wS>pP(M#GoJ%Sr9r8&$!uHVP9GS?#?Ux z?878=28LW~zY!#0Suh$w{tS$kdKrZ;dFEfnZ%JeK2bM9>1bDJ52a5m!uA~j>gNGrq&@-ben)v&zj03v+=qO zI`vih_fwg5x)l2ST)u!yq3QH4$tBL?Eyt!kSy&2W?U}Ph6+Xu+@&0IOBoKWc#+1qZ zax{sdy?~7x39LWtmd{Uo8D&FYJWAe1?yp@LYT-1#9`e{ZP$YP~69GjQLsijdd)e(0 z8P?ew{Ls*CG~wqm$n&nGmLKk$@WtM**s>pEI$HH0JzIf-%L*pR`{Y5+Td%ZzY9X1$ z4)6OxYS!~p`Lg=+xH=a>+=V-cJ%>?y8032uW!?@Iqh{A<4rtJu!p}Y3f_*W#RyHt}T8GJBWCSgXVgZ-1vj_|C`E##_mht)c6%?{!Mkd=HnZssw_0xoa||2VsDP`O9asNl>-y2fT8%$)02%XqgmAr#_Q;K9otUnu6L_<=a-hzX+miA2O;B73m!G(YlU7VqKEE#%HVc-y}JLmok}+=L{; z0{QUxv&lmY<&lrwDZhSV!MP-ax^faFibz{MGY+1qzSZlx7ky90Zs~6$6k>Dt_$QKi z7#T<4|M|Nh?JqQ;kJOCL@LZ@M88avPRa^GY;iYJ~ezZC08;?bB#=jbyBR z;$L45zPaptmhm=82;ZU0oS-w@%?|(%^j7XHr0%JTONzdCOb6(N_^%dd-7c6cMECOI{iV$`kCJI`~DZIsiJIkHOIMRDW+ z(bV_oxUc2z27(U;q%R7HOb^0;Qu4GH73R?;2Lit_)L1#~SYvv;4}5@y1k=hB@K#}> zSK8--PpW*|)nXR1rezw)C=9tehSl+Za~y-l1L#Dy^qd-I%%9$E2oDIU{t$iMC0UhW z4jDb&KFLC?9N(Ko!N<=RwXju%Zt{K{lH;tCQ@Cn??H?R~GoE5qq<~naCY{356#sqW z)y3`P0K!CDlr@fE z!Rooxs^Eg9@Y&m;>9h0$%$C4S(cr>X`ifyEFfo7x~npZcoib!OTmWTXrBZQFbnTlRjEBZs^slqhSgc1Is(mB3pT zd_NZw6w$Ie7({r<+v6msaO6L@7WhCTA7MW@9O4lwxJ$H}$hLzZF#qa%WhlA+WZTJPu%g=8tpSyoebz5SAM}R*k;4CGvK%$bkwK2;SxYm+?VlUwrm$=~oR#h^R zAl_9#Te{~3;U|NFue5LnC5=9%lMhyAmQ8UCB(camv>kyhDJsM+g*f)j?`Yp_mV@%h z^Q?Z`W6oB-bfx;BC#~$@Gbo`pq+MOCV6Q&;r1B&+IwKB+pg3>7G=+2QgXIf(WRvM04lg14v=lQ!c~*e(+oD7@~Z-kDSr9! z(7Xa{Nb~&aEax0Ghiwn@OC6q&QR6z{K;Nms+J_E+itE8%+(<@S4R0_KS*MHxmP!> z{g7qOa9~s??ch9Xa`VN_74KKwRgFsqwmZtunUXPGq@-%4u6OI$=D}fpNa(59ueRHx zRfH?o#1GpVL;-UXIIe67_rl~R`KCLilyUskQ_<(*L-a3x$ilchQ;EVD3Osd!BbIZW zRI8;hMIC^8fx1b?3=+{^}r{=h_|XL!E&$gg`^DNUrP z@3K6fL7vRZ-s6=mlS9RagL)B>COOd>dkx5*058wn7PZ+15a7lV92hYVANQT@|u|PR-n}Cg7>Ro%2UeChhL% zNLrgduc$H-$pi!8x8pXy;E48%kykCR494RxZ&1tmF;ynGI(%5qHleEe;~Y2TKS19c z%&N|3p59JwpZR?Z>M>VX;(As-9o+}vA~Fl1f&1ySGl7qM8J2hJeO(4PeJ1Mb_;ycg zP@N&SY~ND+StDgmj~)4duvM&1O-42zDxg5nfjV|iRDUR$O(tP=d_#B{-V-PZ3Ox>G>cMtB z#Xq>N*EqAdN9mqO_X7b*vvG9sL;Mw!O&w?jz9Zu9P}H?oWw|ykCeH*zN^<2j$+gin zr4MHhet~g_>ZD!H)M?NS?^6m_LU^S@v+%GJ!NSYz1_hXhal&-HMynL(z~NZ;8WnBh zYTE_b+`LVv5E7|XJ1fHj5$1%it4BTNG2=O5sq?jS&K!BB+-dE8#d3KTgO#eWJ*5ER znrQ7jiFw*s+Nk^o^{6R&b#%VG%;Pf}qJfjan~iT4BRIS=_Uf_R-l+Wd>zvlQD zhqLIh5{SM$Y(te+=r(^!@GRW`ag%E4O{yAHtT$I-QUPIgkgCn*Iur1n!zibvQ>5L2&X z2Z_5D<2+R^%Ua0m(Vst)yp|O8&I3QeE3I)8h{kOy+r4KbRwZg_B~k`uiFUWRG}~h zI4&?NUZC?A_ra_zsR#9UZn2iq)M&Jh&JFxUD)g2mnt0iUWgKb^q+9c#H?YJI#Ab2X+%4&( z_3Nr`CF}%wwUY8?Vc^pZ&C64_`T|R)&()c8IiK51VY9#X)anWBaIj&pfSghbdqWy4 z-}}@l_-nT&jO#TG4O>p_OIEP}J;e4TD7ROayi}RLbS#T_qa5)#>q7oed)wN^oeL(Y zW0FCzg?o&J&-x!45QN5TSJgK4eTJ0EDMvY_MCHIcG-;f(s|N$X0e;x9g=4(JnP?N0 zO+Jp4Wc7*|8`jT(tPS0IR4;Mg@qa(4IkW78%*A&4s$R%NweJ445M?Y*JCF z76VR*op3+5&}A&W$D~o0om+UdKv~9WOx_N$tx89Nifbe;L^m z4M#S{JwHl+QxQIR_gbI8MhK^|PL6hk=)+y&R0BtqO|kP|GBT?M4=QV_ZCq7vC0|{A z-?Hym-7+|X4|Y@hN(Mu2)6QHxj_lU;RnCVxw}9I+0w|wW`NTiKN`IVPy(TBP>3cfl zf+w-83OsK}d>+jM_@buEmd&8H_w@1^4kg3cGPAB_^i`j#_3XJ$$J^9`ydJ_EfLw|g zLzB?QnSL+%%VR@vb0Isfhb~w4lm5z-03}ueS@DyKa+_`Z+Sn;sFc(MkICkm27b|QIr70zM;3kQ+ z!swGzv;P}F<8t?`=F1sKprn(IbRJ@|;_4e7e_uUvF|zBhd|H2e7qYP^&jX+wXk-0+ z$6Yd=c{*+%xA>MG|3jkV(gqEUzr}F4g({UF;vSE>CUQSY;Jte_Bk_o36f`4>Y^^~< zj7nM$fWPoYE5CcWKD3j8sK@4r#S=;-z_D5a#pC!AKDf^T+H5o}O3(hNTzL4b1f%MJ z`$KSITdrMNjFx2SI+W`=!I-9Ew}@qSgT6>g-=sl?dXZv_OF#GeVc=g(I?avVOqnOP6DfKYw@)R7 zneV}u$L~#KKCydTCLg#+4T9=Zc-t>NGX#)g^UMEyjXL*PF(zurKIF=t7QhCHaAQ`} z)U%wy`Y)!=iSP+G?C^$UKv^=d#^RXVCww5U$o=2>ArEbU$qin4UWnHG(W*K zXOs}gv?1w@4J>Y>r}dky;QmI4{Ly(sS?r)ix=3rVHg1r>+RZ(3bD^2DpoP59x+e4X zq39hkKfScN&#OyI%1Z&?6?G10#YUf!dFZBj)K!mKs9zQ>Sc_y@1oLVydl4E_eh(JY zdP=)Z01Lxgg;N`+Lnra2y>3wHF5G6VXS8sC?km{NLO%Q!CX;Al`-)#YSj`bXgWVRi z`z3fc2?Ssb4K`1T4#zo44LKUW7oV#o=JpkkxqBK)FE%fGLe6HxX0U9pgIkkkTOV2S z0w=IzSHtb>cD#zrX%PQI`^mJ-{q((pJMD2s%GH*Hu2%_6q&M>{bCYI2qIbrIC1jE^ z=ygRtd3n*HlPB3|z{)xObIcr<?)1MPnY6o%Q@;>57G1qk^65MrR$z zPFE@Sw!WCJ+_a1Z$l{lGa2lt6ny9_}IPLXYtulq|m%)a>S4bb&G?O})<6Av?b)0Wc zc8nqQ_f*DBpOL;=A-xd%`aQLzlK5HadBAkHs1vwy#gzw-P1d#8Brgg^0FDt(Vb*0x zub8P}dMQ0{-n@vX7jSr;u7_TBlQX4X8Od`I`@9q~ZWEM7_tSS1+Q&!aWV9$}T}Ol( zDl%5GU4_%A#e^>fHj4BJZtcn4lSNJ%>Pp-BsgJwpZnX}V*hst=JI7{#g7mg>4<|m( z(7VqNCt~pm@20$V(5%DJ7a!3RT{*v}ho3?wyatL!FP0~RnGxC)^Umolq4criy33`w z%leqPxnWIuLu@iy6n^Dh`%P$B1~}ELa=_>e87a)X-d6!%5pO<};sR%Jfl`DF`@?iw zmlx!~x0$6ek3_w-GPJqBx~9WVXkG=p1n(o}_=%LSIW9)I_>f=Ez4hJ9M&@F$0_++! zIAmOM=Z2;_>8IK{OV|9JMcDRG@$SWpew)gcoJ9y%MU>}rqP-WrK6BTX?6g)u0Y&QE)VF| z{GN_}ADAAMPeOPkvUcM8{fXS2yNXR5!gpQ8VKa6IN3x+ncr5)>l%`ER|Nz`;iQ*9jFUYi2T^7sj2nfzBHtOx0Ad#g zd@e1b4i8bXq!$rQFi_ej`jI#Fk4w@3w6VN2^NZN*^~JE2!iEt777S{kpHJvL&(9g5&)|t9i;iPeveVSmlsg9SuS; zB*8M^&5KIX)vxDHCoSbe%N|ms0$+YA8iMOe4?WX^;iz>Bwck0ToiES1ejMU&Zmx!CcIMY{%EygV&>K|GbFlYSiNP};? z>~K8asAp-Uq5#p(J9TiynfN}q8JP}T%=nHM#wQ%Aj_yl zZpXF)uSt`x?*k!>KlVtJTRd88zayEXvEWVlQg$z7Q==h-*F#=A1?A~8#01MnDg8k} zOxB6@ri$+$ZH=>*@rP))MpnLS=NmT6a|Z9fKKfPA?$r6Tr)0rxK^6C9Qdvi9Xn$3h zn=+DdfC81aooxQHc8cn3UX={rp0C|hL0+UG^B`KtX(`mc+(kQP+1r(WT_3Fis9!Eh zcals4`BG~r<0a^B#}r8kz7$U`AmN_@Jwt+ zLGF@2UoFN|4b2iz6hpCpm3Eu;ZG{LSx|WPzCQ$hUGIb<$oP3_J=}J6Lh_hD^K5unO zL=4vXq@pR3g4=B$Vv?+UXaDp_z47{qF-I(bg zEB`9x9`(5tv^gt-)u27ulr^@5mM|8>^B$%{ZsW&q@W&cbLjXw?;tSXMlH2z!9rr_g z@zNi-Q3KL49A&McsJ&&zs%UV!H zCH0WPz9G;~YF5JwBBZWAuff@)Mf*K2@x@LpcQE*+uZ?lc#g(h@?y}FEbC{-7yGbew zBHbUSC7ilv$nzj58VbWb9rliMz>Kl}T*S??bxz#zG zy+#zO_4+Cc3xF*7g+(8tTF2f4GHtlUS4X#Q7mF6cc-r&gehr!)k z>;mnil8M72HhP{{=Q=11FxX2O(IR5$j5rWn@^}i=1p0;4&~UtF2TzlXwM54lvNtLl z;KA57Q;@uM_L5y}b?79O6?*ggb?MwN<)5k^tol);g{M;vV6FG!`p@>8y3GUFCEU{J z82Yg9Mm=0$zAhijxAg?iP7U~t4))VZ?w>35EpGWs#^Vqe_zy<30?c1bwg>u1tpi+_ z?hW59L%x)X^|%K51`Rrce_nXw+J$T6cVBaMm@b}&+o98Qp%ESt5=A{sR`?Uv%5KY= z7rJGvIqc!AN7K`ku=f%JU!PDnu3u(&LoO`J7wap7lPbFOF6oNPr%w1X^=c$aE=X-E z*sKR_B9njGmKdJW^}o4uIeP|lGdYD6+2IVTX)N8ygfuU{1r%&D5VSX*ie&DgGprAL zZgg^lA3s-J4(5aI8S;zDGWZy#-riwRgBs*kJO^!YJ(Zp(rYd`1E|1WxJj=WD!!57g z;4EIHy<ZT+$S)b&;rYR9Oye8AdIxS6Q?l^RDyQ|~9tCQPzn?vsIh-S3^ zHMtd#%!@qZy$+DLiss($+avn^KG*Wi9RngfWX(YN$Xn*w^P1P34GBkE=jL}#A){JX zZ{SB|1a$=*rD(|NyYJQ00lGVs-VT{AaB`a{7KV$bE5Eva5il5E&~~iTE-#)I&_P!c z%Q(e@zw=)Y3OPQkTz6b&b?jyVe?}5#M!#nQq?O6t)#mzkoaf{^3hBE8iCi)vNxtX7 zmj)r1KY2S3;N8pXI?VTmm1yPoorg;uhw==!#DpW$5i!OB=}hsfushn2O*ik~=wwkR zdmzXQGBEw~k=IrmOiidTb2nPVq|B|7@$_uwVGJ>?3_-<+W2)lum)wW#RYX=gc@Jsx zDW0VW&8BWx@b2_F8s6%rxEnf4Jo1Z~e+)&Qqh?u=OA!S^8M;o#&|(bfL|!9~02K=I`#m1P*W zQf5UF=inMUK8d9u>35!0-f{@&+53-ug4V-WbJ;iTr2Thc3dxV+_N0%M^khMxl3 zaD?&95;JjGm1$gC-b|)GV#*})y^qans;6-=B30~QoQ7HnrV-8U*cnFN#})hY4vtA~ z1&f;@E7MPD%_*h}78xkfShHd;tm@V=G=lt`s-u_*X7;$A@GJf2TVw zg}Mid;6Gg$dOQNg*~``;DVNvN z2%e9(@=QYaPZq^{S{FP+_sujF?Aba-o{+iY^reIM`=?b$$+Lr*NjkC{=pJKk$7Va) zpt@h&Nb~48d-t~wl>m*IL^wgDpJvL&wjfPKNX^w!xrv6~^sl0)@iB_ljyg+{t2aQe z!TM5XHwe5>JB7ZRlAw~VrK68FaJ~}_;Zt1v^|rGhsJ;^_EdkL&h-X) zlcAIO+o@ymqIgifQ0B)=1KiQ@e)rfeL86q)FXxmfhpM>)LpT**QQUJ)$b*FJIB8mF zRISmfM_-7mhh_@}fP>{Ak~U)G{OV98dYWDvh$2~f@Lpc;%oPA?V9ey-_cUlQp4jh< zpwVC1tOe8TPDPbIwsA z)F?50VP&=)LPz+-KR9)NHsi&cW|r>&dYx*5GfT|<0QVSczoCl_8-Ri^B7=htBXP+C zyTru*5P)ep1_}zM`OI?Qc+~$wJ1Eei-~B?I+FkQ34W_P7l(AgH0E?t|i_BUdX4`s4 zqv|tgV0p`Tt13Iu539u9Txew&i`0h??l*iT7Ad&SOzOT^0F0dIi>*eI;q$JdcAO=y z{>F)ANmH2B=MnOiwGPz$f&KP2qLomJj`V1ggPpa7!`B6DkE6B7;`~vXV7$7^xlBDJ z$k~1mbwBXMg*$Cy1tT6x<6G*MpZZ-6=Sh}+gCcqRzxGZVq3@0hANOf+C<%(5I5;u{ zmCP;}Ek~5-cdd-;3AfD%#6MXO=6t7HNM}j5rN=E)^?jCfM=veC>?ipId|IhlUY-#Q88P?A_cd$)CTW;%`M~-r-W_$zqnvIY3u*Gs>|sQ_yC@cE?r=sTOWn5#$r*_*tE0!0@GHF zMPJoQK-RJb$v!?#^urdC-AK3SmL838txGjNqzmSr?V<3?8+6 z)s~;!1YMl?51%5+&Yrb5G~$szj>0;+q~t{3$7E9J#Q36RcrCjk6<{F9TD7hL229asV?Q8 zftV5KB?_PoMO|2C()3WKsR>q8YQ9amu%0;qw5J1|aQs*NtuvQ|pd^G*f~}|rDrg6( zv~IL)f_Lh@vS!AHiRwZr#b9BGVzW<*Ai>;A&%6uKGhE5(b3M!I`?yIx?(qRF8ZfwlZK=Mrm{S5>%o%fu z<{X}$SFlPO#4AYRA|M-Sg9Rsyk@Q-w{6F(kONJJ;1 z1<t=>9;%O)%T5M zim#3?p6rnPewrIIoLJB%MI`xH6az)BEF~?6k3SNg4>kjU(f8gj^oge@RySXaTV^1gX+FpVjkTI4>~u{ zo&`%~RTOOFrVkVp=zc33V%^)IZ);QLeMoxcUNjBX7%kH@i>7sBivpf6un@lhn37e@ zh$&?qWYW9OWiZ{By#6|DfBj{FUc9@%bA8a$JF=yL`uillMr~#o@e}oTJF=t#qk~+Y z(3o78N!_En+C}UD8=4{J!lAGsi08H~zmzRzGOtkwKIo$%AghCeD(WN*jgAFOFF*x! zXA*He_L|?zC(mns_MFiuqe^#Ba1|l8fjih&H3q8P z!l%_6P|+3CMhUD{I_4gy=MztdBFR+)tu|xT`}%u`JN-~OpT9t<>$z_D!(A_$jkBDjTOgn z#aPdSI)q$VQ=u7M7>0^c2I&V`2STZNSgB0CQlIS@PKEF-Ll~;0lkO{}l2`I2; z%=C!U^Vk8=b`*WbbAu!<7w@od!~58ct<>^WV|$ zj63+v!_g|3dhG0fPAa&$^<)8T3FppV_1XZ*X4h}1Et3kVWeFk&(OF%UbGs7P!S0k4 z&55OJrYFHtcLxXJVB`+NeIWy)o8h2rP1{BDGG%ag57>G4IJ@ZKMac0fX&!S%P*;$A z=j{)Scq~Z_fNQba{jA%iR$|Xq$YuQ^pf$1M%BgcU5%W9Acg&4m`?>D)6MzxYA(2k% zJ$}YJEH{GTi*!U~=Vg6)g&U?KGXZ_Pe+J*!@YXO&G2v%?Z7BZ^c%$GHL(}C1<3Kj*X!N*%0#mK zOLdj=V6@vgSLWRQA-=TPFx9)>kPAy!b^S}_MZ4K^cO5C?(QX5T#sq<#U|cCfqBp5H zlhe9r&D@YXC&y}ZdGECD34F=DkIl%=_@e&>O!2O?d@UD{Jw$#KB#1~7);AVRKdNlk6um5UA6IsS?P(V z2FT_I9EL>XAv;#D@1TR+=jG2&JtQqMlSKs=D9|E} zK%uEpt_dQ`iJ_mmEN75rv1!mu*6ne&AhVh}P+=h%#4q-8@SW6fB&m8~fx|HXfTUQ4wfNepS$k`U7rf^1U$#*2)-yMwI& zS(k;na2)S)_!)cWAxx^#_H)gy^>2khW?Mlo>V2Cyw4xR5P$tuh6p6r|qd%Qp=xK{z ziqi`eact@3ZD$9MXoceW6Q1RR`Aw+P#$*wd>~Y0;X!J!MT(x7qb^2?86%<3g{X@`( zof1yrKM}V)r;GqE>W=aB|3*F2hZjVjWTooQu)LoKYG_v0xTagOERlx z0Ie_V!&9|%W>~!)RVT!5qGO@zq_xaSv}p) zv)$1w9-UK$X=O^IOAE6bUG#Uj#9K(4i3ilHaxTR|QkGS(|0p0FdzGCbmf&?lNdI7m zb&fqvyO_MZ%)9Si#~9xxEkbD5th!qoz@#o+}!{4eBrc#?;V$i^uL}yhzm5gAa-MRI_h%PeQi0=4py7h=&uaWBL zmXRC9kRPU-xjf4Cmsn~xju#a#6!e`S(W#sDmK1Qy4xV>|sEnOmz910kxyV#UyL=LdR|NR$_rR`fi2s>k*pD;=1kU zPJ=_C2GLks{NiGF>Rai@EUqOqN0yQAeAL;Q<_ct#s|J~#6k_9DK-rb5Z|LH!e*GO_0-F|K@NALPiLnl_P>|ePP|MJBoGNrdTVXMNP;Hqy zMD@v?FKq!eo^MbH{A&lNgmBMb1dN#HJXvH*qNlB=Odrn%x4SDDRkImQY*Yn#Oglqg zdkQ3YE^>QrdmSI%*EnI<7@@+gKBqr2I;*dY}Tj4*f6` z5fZEr`43Bv6IX_ z)rG`uF*XL8GoF&j%T^o9Pp{JUBi3@#Y(^vstRcAT}{$_X!DhyJh-J zh7=)JT|w^nqxVIEf9u>`V$LYvmo_KrV~vI`F;f6 z@ExgX^3!*S{zP1>8(#Bxg*ufcT-I zQEB-~;W&9?Udqn}O)9Ing~hbtxS8DQrOQ3S~eEKvvp#C^w^8S2nHdNNKso^ zV-2BR&ZixQ$&)ObzQ8qBwGvAKWqI9<9kMBQX)ti2p4mPfOP+hYE)DXuD=t35=_0U7 zUyN2&yQ0yDBtxK)D?MJ&AB^_l?DH;L^KV0`19uID4*CyfK$SioIS6GktB%$}?2dgW z2wEYd@dGp;pZhh>{6pz=7;J8@DoOKG;nr6DN{nX&olG}fX?P{&B9Fdrf)XSC$@cc! z7N5^>sL>0yw&)`os~@eH{)LJ=BVM^+3Lh70OG263$wX2s0pDxAAk82FXLgNL4_!4Q zTpJgj>WV0_sB8Dj@<@BxSKr)epGzfl9AJOeGsII`CB>Sj;uI!J$k)bCUajVB?{Ab6 zM6o$YvLm|6a^H7P6kQV3BG!>45Y`P3#9!FxU5gMcvuni*agX=Q>yvfVqOroV+%y zo(ardwa^TIk=MY!oiaxiO^FVjO|jbuAEY#UndT_V&lk*J~DSoy^Cb>Jly+%FaE+uXeV5%6LyVVBu(FB@Ko@x$H)hCdW9~Z&T%3+Tx(SBdt z^Jmr*wd>ztwja(7qxRgn-&%!Bh72U~lOWRHRP&Mh0ITI1-U^r6(jiLu|D0cXAJV6| zv;r=J7$5^3!DHh{#CXW#u3Uq;RhUw>&5~cK^>3K-j2Vk+xAy(&=_lWtQGrmxOz#)j zw_oz5D^70z_{fFqY29;#q`#)F_u9~hX`K~TcC80oO-=>9ju96*O3Ay4$-DV;n&ZnW ztlbft-)E)C&rI!a%#r&cqo9XNDOt%WuiTce4zrg^`3_Xu-ViUlmMzuCL3z;X7cY|P z!@vgCxrjCKg&#$2I()$B6+!;J{;YwOKMrrwT6~Ew)jMwDI;lPv^a7=k{U5qdl< z|4bvrw~HhgLRk)eJk!A$-2CCv`{ zg!|}q3sO&{i-|GZS`1U2Y3}#V7X|XtuhWjwVFc|_W`0A-Dh+as=avEpgL2xD&}+Hv z+nGQj$&w*XHp@Yp#**0?9P!r{J&Dn24MOKAd^gq@xffVm+918ee7$}Sz^H6R7W!se;nJh#s>2psUAEX zqVo>W2EEuRc{gC8bsL2F3-s{3+5Dp2?%1+$Aq%^pvS!ph=X-gep27Mhjsbx$KpJ_c zlkE_U=CfG3a7Hta?VEXw)1##;3h9y$*0J&#C-7=6fLqVEs-7yBd-Ph_J=C<&#RqGH zxQ23fZR$riya>6{DH?~d>2wC*ovJ z&j}J#V5*w^j=XdiUfL~9?V<$I1AFdnbXCv(vdY~K@%Len$Q%D5a5$Z3gOkV|8B~@h zl!Xh7EnSm3&I%xGD!Y*g|#7<=_(cDM&ypIerpP}K{D`JFKcj`0?c8fEdsCwEq52FW@=EmVJPn#>;E#l>I zUUmyF4GtuhNVo_DyjxWNox?aA==U?E(tc-C+n3Vy(j>D2kkNszn4i(xsC1P_sV~op zd17Sel4v3fhv{2anA;nOM*+!h^O0 zkvMYZ0ONTDC$A~bXX*B^(Qq3L8lT-h;W?9NC-+r8&or4>&lDn$Pn*B}#($qns~XRA z0&t8{A6Da^VAc3vtGf4G#9)ITlY>!!E$*40yyQWq_Lx@mS+a3XNUm3N1bk78;V{`V zPXpkaboxplGUumLHmfpv<^=7S=e_=d<*OUM*);WOlqLQ`AQK+3y|;(eL}_I{e5y(7 zrH7og8_cZ>`$~$d2_(9zYUG|B>2IAw4qtm3-BAE;l~`7i>FbD+^^QtGHyO5H?~acx ziwQmi+|cj{nS*+Fac|3WTh{%Bxhyd65#I6JN1E#K$>-RZ0RRjjw-8a2^Y^ z@!Sy7chmS%w~u}7W7W2B2f>tPaq#Wf3gsJZXxiA3sb6i6)qlmTvTFD>2}b~D-qfcM zE9Q~Q>SHZt!z3%$ozgy5XVF#CkA*3w{m|=sWDM_!&wV@vOTgxE*xZ%XS})tlYR&Li zbq0Jx!F^=QIzNKqh8X$u!M8yCaTf0M`c^G5=s*Z@EdZYNbw)&nF}kvSsC# zRYhoa)1QdDK{n({zI~CQ{YK#bAo6i4)kOVet?UGgYgdr9`y@O&R$K(ou;nyE+>oTa zBR+@E+wBHZSvm0Ou(=ClD>sP|YNlQlUwbazE{DB0tQ=H3m{8I8n8&GUr`jbN=9*JS zd92AXSlik~)?IcYJImpPIft%~mdx?aKPy6g0{>Ri;dj?33uK8;_=g7uumn9^<95&l zSf-}9>rP)rJK-@y|KsgR4#4!)g)Z6)`z?Bf3)8wD+ z8t6nUR>vAAXv;zrO(G{KDToaK(8GWgfyuGZ@V-a8pJ`MXFey~kgM7I1C9C!iO31VX z@d-~}h1QfqOn7EKvj?+401f+xNv`zA$eRMQhcPKr0wr0LF(+KR@#C1_gE@hpN_1_9 z_iU*C*2rQJ+8E>$^}H>5t@8A_H56JUtr{U&RdKtmxO+c$=z4-l%;s+6Dz`$nSLk8n zImqPnqr7!N6f{IpS+#a5^cdcHpu2M@1-HC1b}QMnQqUiaC{t5P(mkdpzgLKl`>)kSQ{;LUcIt+0{f;4$N30+z^F z4Q3T0rk)R8;0U$xs6xjlv#y%6}Q zjA5D+cz^Nx)KC3XFc^Up=frt23)~Sa1)4ea`|Qv_8J5p+^S( zmXg*c`k0vka=H2W=myZRWJjqM{DD!!&H_$ZWB#$Vm;pPu3)pqTam zN;s(P9F{xcbLutYZG~(@*c`Sy+3}F7pD&JPzV}2CZl;S!MC@H$=?SNw@k4lfN z`@J%%r!8xkK;F0VrMIP&eRlb=q`;V{PeRArrNhILs^)mtc84abn*YZb(Wf9ML7;PLf)ilKbV3PLfgQaI^k!JPm_No zt$8Zbtp3mRIR)GZT=D7Fh@n{(7V8)vQviwyS!jaXH*RN$tzy~$gtmd9k`7=anDrzR zg}x{Ztuj6|vC3pLJ<`Cs{@N19_{$fvJ%&G5@Y*pvCMY@J3?neRF#^Ntn1|E)p7(7Y zf%10dnx6K2KeGt8pu(Z8lD5+gYjO^AA*QW(_3RO7$t<)f>!q!j+m(+Vm0JvB^K}i` zxc}^*{WGu2?90h;4WuaR@Q&n4ufATfVq(?F&(W?`mJZ%GfAcs0&fobv{rH(IPSi?* zJ@3En>%Q*$zyJGBAZJR6Y&$;@XW@DwHcK-?;Ob^IKmF4`-H#W(^wLWnS1=WJ9Iiq; z`=@{Ur~kyC_!EAD&h~H!%V>p-jEN|I>E>I%^;`V|Okn-7ix1c__Mc9C&DVU5Kh5!< zhYj=bpZ@bd|MT&;MP0;I?6wXbZ>sU$_rCXC?|PS5-8fhc0m3=k?-+kPmDJB>aneCE zJXRdBU;w`9o4)Ct?|kPRLr(Y~8iWals+w3VhL*`c0Q+r78EsOSbcFVgaDU~m{1rX0 zg>cZ?rQEKbOPuCsfA(j;{L8=Gmhh)n=4EuO{^Ih+L>5T;BLP+ueJ`L5{Cj`z@8wXe z-fOazdjvKnFdNP3p;BOu1A$L{#XN2GcxL7Mm;dr#?l0b6j#xDno7KNNo|`&PL}y$L z4V@G{nBJlf;MOUfx;<|(So_0W{9AwPZ&I4rqF_Xus|4qN? zH+{hud;xAQj&6j5JY{ND?}`Di3O#a8?5gh2e(aE~;cVH1R%So#(>~2p`K@n#Yk2)Z zGAUgaPTHURlYcU|@i~Dv<+A(2FZ@FH>1O#hRylwM9Z}Ckn)621kA4Mm1b{34`zMKqN)!0O~g7;bNr&teAfi5Zi>FaMZYk1Y$?HK;9b3PV#lhIw%c;x=4N`%vu z8RRCT(^ebs)9^W}z;*s2YB%_b4WH`h^F3{v{ikrAqbi)HD&IbUQtz`t^K~kwrk!^3 z2xnt{keJ1_tbI(Uujc9tq5|&?eay($i}Yb5ALIf!=ysIVkckki;0vd(g?x2%@!H?# zdF{GBCHBnE0|84R{<&Hy?fJ{j2Bzn^&wic$IugX<%z46Td>l4CCzej%f z2gAnu3p2E{Z6=wzlHA2@tYfF>1<1OaMS^ni@pioxH=H(mjzDSF*M)eh*%eB(`9$-+ zAnM7juS)8adI&Kjw_o*{G^7_o+4~l*p0XWs(f7`2;Jrj^XBy@?&ifQZ@zm^LZx(-e z;SPGHt7_hEu@EXBA4|4zdv8Ou9WK3yHqQ%l zGb^=bEwqs>y;8Rv&B~e*=KO+R^Dm;pT<(O|wx9$A1jfY_GR(?6J)fSMth&Mor}@vVXEOkELf|BCXZAy5 zkH_3B4oy|w>6Cjzzo+z3BaIgY#aTZJ6Ih(0lf|E`$wW zbvm;NDsUw}*L(`LGc0qPgK**%$IAFhVZWH&Zg|pBt zUqv{WshVi2;j63P{N^{~z*eI?$cIn27>8b!fB3^6&Oc3?YQI|q1$Lg5-Jc(F%m0cb z4>tlb{SY~mxKY+nB5a7!xcDS4N+};BUv_3)d~RNWaHBkd-^4m+SSi#*UQ!TZHrtwY zu7q|Bdn4|Jf-GF$y&^d$*7JyI_1iPmO8WcCNG+vpI3N&l9yAJ6kxv}fX$i` zLU}zqVOnU)3=LB%H4I8sk|59w@439CgBw;jD2@~mzGoVD5w7~@d0jF&N^lD9yvW@V zIG@8cpMq@>6^~g}#*F6t*pCglR(9o9vfeA$PrV~?(E!(0cAq&Z-M{b!bmFVqHh(Ezvzj#YyI0=zqS3Hwu4@QCc z%+LHxQ~8H%5d#l-L$XZatuL@6q!)|H3R|PV19$}D??Dcx#cG9JTjn1JRYisq%xTC4 zTHVs%ser%=0@<^WfREV~{KCkssdUuDmXLn^Cc!C}#j-71+)8S#fvZmot*5D{SHNyn z8i&38xz=-)A;EaIOk}njCigQON(iV)xl|cbh8>^#A#;-`F+c5LkLmSI>udA37N?!e z>@}Z)?CmY({>h*GNk6G$XrI|D`JMHcFwcdsuWYot6ZQQCPo{1_`%HT-@;Zm)x@7XQ zvYIQtyOq2;QK;}^Mf0XNy~*1z_+FLM*odpuDs%Xek9@>a)2@ZoygcvT0UNhuQ-<)~ zt1+?JXuMSCyi;wsdM3N?0Q}g^ulY5<#xFPV3@oYD?IwyNH^hp)U!mH=6{?)&liCy8fjz06Q0#+CMXR~3* z1Mv8~PXRFm6bFIo(-Y#vdAv`0&y0otK}?Hf>Z0@u#s<*3mK_|Gw<6j>CkK_+c?!lx z?`OvT&>#9k0xP#06P1H8UJRwPq0p+Y$};LvF^e%mC*-+KSqct}W&M}`@?U<==X_3y z%eox(32g(JT7B1q*F#_Vm0#&D?p+Aw05;X&Q1v{|zU5oK#XB}Ph@I053&_0{S4=$5 ze*f?P{XNy-_qSfG;^Q&E|3Cew|I}U9{&Yhf+n)}M?EdY){kOm4cl?eBNFNPxH_RIf zgze{j-sgS$w|_et%;D!H;6amv$}%0=lQ@U+{fe*nim(0Juk}=R|6(EpB|n2FXF@N> zullO5df)rrClO#9b-W!6{k$vR{`R;3!+-b>KkKtTt2I&__kQ&`nA(s1*pGe5mwZW> z{uWwEriryp84nN4` zj+85Z#GJ%_MvZLS+fmoppLay{nQo`T8>CW?1}2!q9gt+FK$@1r!qKN3lM}*qo`T%9 z`D}|H`k@~ZQk5xNiFG{+d_J2KL?3oaj%{m4!Y-G-C6TH20%W(Tt&FVehPCWc+3``Jd?o1Q;?UjNthT1z09m_1YfQ5GyOrs=T|9H4?_Ig-&H`Z z9S_a02C!CAWttu3i3*H|FidC;;tzT|sLY(7X7f32$7Dj&XgIfx-0$R-L$)xK`V948 zN(6sl|LVJ_z^i#OK;{ispL_5i!PL_(7mFZPBzZHXB@EsWC9M~RnSc=jMF9JeC?j7-QsGIBJ9KT3s&USRTA0R!|xn4Vmko6rp>L~aXr z5V=u?T;py4HyLs}o<}(5aMlPwI-N~cgP+PIv<>Q8xXPQXTx|K&2vsl7Gexgat|pvk zVk)Fr8ZesSFsyDUL|~jW+$fus=|m@t-0W(ynHuL0D6I5W8mM+6tR20AH#>M5nCib8 z1~`%FHQx)aF-9I*qj@oeir7i3l*#*Y-%q|c%)%EjRvYCr$?W~CCaX6{t@R~_{IM~`B)32Cw zWUN+LLp?rvt=S1jh$_9=N|CHM+NIHjRrSgIq52^c!@Hm{mC5;LNSQ`8YBY*QnO?;b z>Z>Q(b^;_}b!!O5kG|BxXPYMc-SveY|HzD-Fr4@Lp}itE4mVbhVOV*GbF0wMRI_E> zRGONhglnXhEyFx-{O=tCgsI;H&e5^tJSZT>Tsj#A-b3!8C;yJp$cC^aWZ?R!wecQq~W6hI|g~g!)0=oiH2%zBC^u8msXhQ>ax20(Tq8cy^H@C-dFz1TnV?4|IaX;#iNMGKqLc}FY|XBKhG{n7 zyGv^Cc__z&05t-aL>8yW`O`UMcA9Hnwvfat8X5!6nG`^$Ys|GhGp98 zM6$NY`otn#DM5b5`3b`o9^g#;30LdXIiX<+IvjZD5k)W?V0F8fVN!BJSY7SGg|iS^ z&iD8U8pd#1=KAq$s$qT%Bp5a6shJ>EkrpS71bK-4{KZ0pv^(0hM zbx<62)5sOG>iNT30)6{IF}0L>%F389;1PgL@t=pl_tp;$5mz|^WkjAVupQ(m13wr2 z#oAmJe6ownix_@~x0L?L@4r27+H{pZ0(4*<&H- zYdjOizlzOTQ&!2DJtmB+@bz42rVNi6-lu*|a})QGFx;>@b6B+xf=^5x#IMR*cnYrW zUP!sk-R`&7z>={Lw=y=E-RrMcg#F63vG5l&9X7#Yn?&ZN}Vi;zGF$u8o94sf0W;;&f#BJDB2&0i3Zv0G?TNeZp zcft{pDI;9OJ*$v$PKFufX`Y3ESwo*T8RXa=#7BGj)8O$iv`3h!y%2_;P$2TqTk%6< z17Mg&pOcXG#yYi`Z5UwW*2VB30s0#@ZZ%HCtsQg-V|J#VDa*#J=d)C<2ppkFN6RDlx1DJKu1{uPN}hakAG0 zpdW5Dwa7F@vtkBJFtrZJka^hX8#ddcYi^u|MH$;X7gw)!Jd$|}8LYSyaWI6{&j3ak z^U+*e5Nm8l?jqiBh}DEPY(p|9`=jnuh6ZfBjsH~`KPgXxVV((Co$uw$H$hj}e(ISi zjQMIiJU8ZpAxvv;@KeDX>JR=qAJ1*Mi913L4GE*XML}q7@9-EOU`$q%A+{^ULUlG!e@~X5i{+z-^AH(Wj*ZIYh!DPB>6wQ*fDgem zDi~8vohdRwOPMS3!DhD4&G?`?6K-j=gJ8-CfMrGF<#2;c1&;Bd$Ak&~z(2fsr+W&{__gh4*oIGQb2KCL?Ccg|g-xIl zm{=WA^evew*8zEN2wW^ZN~~xs|E%xcgdYI<@BtVOfgFw@uvy=o=Bq?~!x_E1Ox7!Y zl@Z{%Z|tO37T?z4!4TCIIWhpB0^x?aWJS~uATss*_&z^hC2H6zxH2*^rLkhpn+C&Y zH?=8I`Vx?)#{W$Ou6WKN0i~5~a{fmKjuH*LhUChDA1zJ(4JCD{zR*iqp_mUWZ~)$l z#e^P`z7WG<@H7GV#Kc!+c0~*zAwxYrH8odHTUtp8J^KUeAq5@Id>Zy8WVssTUa)5{ z;lGDLN9>pt3<9#NAZ*(?Nb)Rb{s}akXfS-jdu?Y(Pcz6ppF7nk5i%t!m&ju!X#Egd zm3vA9+fTian)Y^Cx7MXORU*)XU7Uf|+cJ~w6+5QA^+J~BE|OB{YRx&JDi^3ila+MU zho`9lSP!R;UOaW@U;2|=Tw(K9IyUJ?P= zB+atblJ%zAMXosy9)^at(2yDDBbefO9&GfiXrjIEg#+k~rifAyqFRm5m`o3h4~(*u zMTw7dhO4X^E*D5?GAznCzoCGGrvA|@ZUpp{n%p)hw}0UIM-NiJdb>}#Jtz8y;)-$@xBG$@gG5OQtnz1=oe9S4>uv7rp|hEAbj7Q=XO)Y!Emt+_S3?>mkOC2G zQN(6_S3DUp4F|>7(*R3Hl!&c($oT6OA4~`^;A*wfSY#g3%x2bEo>&3v+xBvkfq@A5R`kN@%azyJLcjwA93*~qa^Ff2s6Sy3eC$ezx-X_ z^<6L_2fuotWfC3T1V?y}0Z~HdCzew=j#rBXao`zZ`D?JW>;wOGW zj@1Ox7Fq$(sBiYoZ+^2t-3a`PG7shzoQ&#+KJ+1Y7|X3kW8;6aAV9wK(o1?WBoi`M zQ~&g)XiO=);v2RZ^y&9Z(%6t*pOFzm#`YkW``$z>&*Sg>&hG?heHBW+dJzW?mP`rn zRTKg9C@E1<1~!IZ?|tuk-~H})=Pf|;U^c>^{j-1e8@}NiMhSe-EkINL(bS7kH32JS ztZ>W2#M(QV5V=~1FO0m;x`I@n^@>+&21sbyf;se$*&%tv`nre%;atAr*%2UnHhmwWRA4F2}V<|K$od za`cL_^5M;8f%6AG@PSNVv@nDM0ce!G5j?^@0{v>P%VIDGDK#t84}bW>-r>cZhhtXw zpem3m6$_YVOjg5WQ;_&0Acc0keoPX8xeW|2PG|oO6D7W(Z?%C@H<+ z3MQ|Ve&k1fBnw2?r~%ZacDKrg73L<^a~&Dz6{dM$@7kjA()Ad26Mu zT0t|Ja5)@5-7I<$yU`}%8ijfO+YjT!P&4GAxRCiYG-c>M)vsh$&l?$xVc>)fprNTs zE^BG&QzhHbbzn9h1i_#CFecpVuCPzM_kJ&R&Z$%Nt?vH5ke#*He%7;|wf27B_f++_sz$%4`or+xEeMo_F4wcn^vE-H zK-1D?{x)#JET_jKm$6%(tzE0U1Wwb5ZEMwYBugF*F^n#S92>+$UPt3fs~%B|T<3N`jx5k6}0ilR^?W+Q(3(GyBLks<8dKMh&Aq zHK&4C{mpd~Bh1mT%+hz&2mtGp(Wn|X(etokThzl6a8llzw0ex)vX^2Wd}rB$Ezhox z!OMV0p4AR$n(k%k;Wn@`A|`tp=d`q1$c|HZK2Vn}mA2j*J0#=Mk$MUXf3tgvg{^=t zH49Ipf-e|m5}c(vM`Q_?M)Av~q}bwVU;&edze}s+`>U%VOXn6z{3ONLf-MPK#d4{h z5pz6q!&i+;omTN%%GFOoreGO^U)nsE(l$xD$aEBZE#XPvYuTP-fTzC}?0%y#51BNFa1^-& zjH@>nP=;07IF}k4Rb#~LL^Vr|GTg+#Rsk_OMcZ68nrjTK^O5mf?ZDGt3#P*Hlss2! zzP-BkyJvNIzulggk$JqU&z8~Z@~x!SGLlPL*eGD%K1NcrG_TL~$K+~YzYdth9Fu(t z*_t-j2-p(YLPl`xouwOsm*LlXw)AfWj^amqi>H_xTg?0Z)$lqQ+33iqznr5dNK0{! zfyLjM5y5ws?w%*=jznj7?IvA%##?YC8to(dQb7~`462FYIXTs?bf!kjJg;M-#w{4h zlOn5uO)18}%9xB|${awc0x;GyF=RUN?1LLJ!eW;Ph9}b+W9kt(`fIO7B}*|iCN|R% zIZYdNyixwpc3Orp9p{m-hA#=TglB81v8zU+CRMA*$vFj10=5W`7dbMFQEVTH^6#N0 zNv0z*t2`ssGUOh5mQ_6KN?3MPQLYv;PTBBXYV716!;5+F78LACK-ad6BVi3c72m+; zn4!a|C=E%&%I1I*m8kHr} zj5aA5X^-P?7W3f`VNP zsxFCgnHr_@YU#8Xepmc;E{z5Phj58m^)zry5t8zZOR>l2U}>kQ(ZBW9Olden+mIMp zE$y^=cOHxY9;OT9+S1;N;PYtS)!NDrf$=CRjNAP_tie(FP_eJVrk+m7j5r zAzh*}mL&L+Oh&>XGzy+V2u}0!!^@%dvy4ifko(i>AvJbJQz`QEc}bL7a!A;j z?vq>Hg7N3aoa!yRG8lxm)iocc|AR!@N;?ZK$RlQ|6 zQR#4|6CM@6U!3IkjKt27n_%~3+D^tW5>J~lT{)SY>{Y=HpH_ zx*RE;%s%PxYG>f{{0-hY@OtRhCaSS9?6==N;g>L(h99#)BesH9)74oR22N7~Lg-HO zyHULS{JKcLeJa1?W!m>K5xnfiP^A!KbB%^T%>7AWwczLR>Wz%mab&oxox73p+<}@; zTYfY6MH1m(9WhN%>1a~>Hul_04C#cHWNRkB})L%0`t$*68& zs>?2FTDs@FvOVAZTFagCbL;?Ywm=)<3qglq4B^j|k<){dEhJey2#PPbo@_WCyR5qg90bsKnT<;RU z?UNzgTT1L!id8?tgYMz^!s8;IB;OBo(U8%5j;ivAs-3)ksW+#C$j=zTMaF>fB?4O& zYH{e50FNiM#$3UZG%;Lun$5~Dxh9DcFMdX9IVl&}OFVvT?kTG&8HSO(OZ=(z!fRdF zLc4SGF4Nu6(;Zh`POM6OM9Z^`ha`uyA2ND~iu1s&H`z@UNCQbaz!^Yc=VeJ0TAVqV zJZ!z?bd9vl*zY}Pj$Y*nJ0kC!t&lcK8&zslV?O0jyYr#~+bL&iQK*cGvQ2WCx)J&i z+hM!Ok`h`YBepSq+eC?a6>gO1u)9ySg~4+bbolxqnsdyApYs-M{o?bR<0(L$+&8K7 zxgFb`$bJ|PyL9zJ(mkIyU-FWd_~r3=uPGsU^;zm!vUn*DcBhhL@Y#hjb)A}NsPvbkz;udY^9C-6ym z1v(P_YaX5&HbPfRcoN%5U@2^UL()l82f*ff@%ucHa4=L6kF!9${?2%7w zYWK(EBb0}_x)KC4?d*A!soGqtnt8eMEp8wA8 z{7&v<9^k&-Lf-J;rTBp#_<_%U_On7Pah`W@OWP6{sN8km_kG{zLv;QFB#(@$3v3)Q z@B{eQI`K!+DmVZ~)*lOe^2sNia%DR1^!EuB%ue{2{USC2fB*M?|N7Uz-d&Uzp>n3q zoSi5)*Zbc0zR!RD^ElP+zICfhf%E2NV$i+s{oe2W%x6C1)M1t)KCoR%Ax7uK z9}E1*M?T`;RjJ(;`vy2+{KwNSkxk?U;4f3Y;SFzaU=(Y=7&@TpM5%r3s=&9t^{s#S zhkqEDRY&^%e>vC=5d5C^yyw%O{093NmOuKVKhg~cAU!$f zEr?ODG`j5H1Ue#K#bj0DROEQVrlsfGG_7c(OkMWO!_+bL5!KG|*q#`x{n396q8#qT znu;oIqd05hbpHpLC_C8IV~nN{h$mEWdU$c7%`1>G5{@$XO@URRYRJe)QDanXiSp+2 zg|deuzrwHbAI|rZyn(l8$gY`gIVl|eB$||5n;pr72?M`2>WnWwawoHWDW68c1UAJU zKgEv$vk;F+W1a{%q&-qVH<}EWq8tMPY_7|cFs~e9td{c(Z3#EZXpj7%TFg3W*Pq&ny4N@yOWwCLE-9dl0 zbV}_Q`xDj-7-eRoX{&gCm#NE>Hp-nkQ~q<_f?*FSTbIXt?CFwe@;q;+ZH4Y>f@wTP zo?MPsw`Z$SklDzLrjQv|L-2c%V76+6%!x6LfYDfG7y$`MI(DW;oM0J8k^t(-bb?LO z5$x&XjHy(hq^7`qB<)mPlG`wH>}79tHO@{~1_h>4RE+NOMT(7Px%4ncB3~6X``P-h z4U{5TXow6UWN>EMO5?efa0h_UYG{qJWXm|CA!8Uuo5%YDJ`4<=i~+BXqu_~c3m<>7 ztYY?^W5y!uR03yi_BgjxZTZU?g5ZKXvwRWq*5YYHW#_v>iD;gDv$Q$$t{8 z%q{k$@OukRIjbY5EjVKrQtX-E5xuvadKL-W+Os=2yJPCnKC*jTAzS_sQ>|{$O)5SAE%?xT z@thIRO})uRp45$GG{!h7_F;kVtT`tY_$+GRNp;;4c-gLcy1(&sdT}MqxWjx5W*L4` zlmc(B#-+CBl4sesV>~+@c*b``C$61M-C0^D+X7GNrob_3A2|g+>!ztxjk%(KEdMqt zDu0b5vk*BUd6p!r&M9!3E}07mKY(kQtFSvWXt)nD?xx;?j;~DLGy15MB zCe6PWy*9;30J)O-+Ne?awP1iHe(72AwB+T|O*~BTtu z=h1(*y-(QHcCUBD*%@y&aBF{C$f?;|?>@s;-mP?D8%N0f6kAl!6aV2mqWQ1WddN)WCmowY1uL)t3KH=j0GgiYNKKJGx`xom)KQgV4(%`Q*q(vag9G3 zvK4-*`jaj-3O?INY8t}nM}T>-CHrzz zFK2#cu|`TTU6rBLSxT?i`3Zf-@=EGt$=LodR{4==j(%#CDvX7V{B_>8L4)%jJ>xEK z=|5FZ8j|KHu>CoeXA4ii4N4m|7EB6P@MBBaS&fk;B?sS-F_FX2DSZ0F88DB$;mK%f z2`u&c;YCwRCAqnQ4LKeo^4MFnk(ZyLjJDWIJSrEz5oaDaF*wH>M;pN5>5n8zv1A@S z$c5W7BY!022LVS|Y+y?S_gIQb#wGZ+J*iq2#Yw zm8X9adcy2XADj%oD?ys3X-Jo2ddg3nTS)rcNLy)AOm>kiJe*tj+z(dsyw;S& zE|ruAfOvY+Qw#}Nwsa|0) zx)ehE41oL!iIlU7*Kn^u$3Pnax@D_iPE@HBzt}|anC5C=ri#KJq>*#~{J;aW;rNpx zv=4Gz{a+K^wxK69q=eMI)6d%$b1HviXMeTL!5}^-4HaV|Zx|LQE%Er{OmR z#+-wvO9d>AB+V}#5(PYN@e+TMhaUP7E%ur;weGcemMx`5<(25aN|yY6zIvBH@7I^LU#6RKl{yB6-fVK1D^R2RynS= zkxmy3sRT1jWl!y?`sQL*84hiA>6&Do!gAa4bnr^m$^cI&Fr@v~X!sNp-B*-P50-4X zxmC6+uvIV^PBIwo3W2fx>MZ!x3zCMk$wAD%5qk%Z zQ)&5iz3^=Kt!s;C->)rpEgJ#3bE@Rc0U+BJL#mpjEq<%HCsVblDBx~Z1LFb1Z^WOQ zQ~AZL8UVidhL>7a`Ykty2Z@4Ej@1c4wIahEwPB zWUv=P_O}e7kbIubsTLAuS(+j{Xyl~IQ%Il(i(EVBv*AY?m?_6Bk&>g_@spI(mBKsn z_=6|N$#76}M02)RGlJ!paybLYWs$D+E<;i;KV~5*cBkG76CyTeZ@>Rp1y*hLBb`^&l!aPXR&|DPwK)$yBJA{Y;yGh__^_V_$(r-ZLxgLGPKYC$-?o>H zhbMY9M8Q2w$z>xQ$7LhN@T}?!CwphtVX}%=BH$dXk?n?d1ZR_!DV-Es`uTMOI9qQ2 zgye~{Dg!ueAs#ZFhnHd%zm<0t%!wRT9xhT4MiRr0CuAZt&0+9~IQ;~hFk`N?f^t!8 z%9B*0)j(91yw&`+!xV1n8aYQhIx%~yy6i<-DkIoV;7D>on;r*16}bg+_O$ozm7G@; z<=U=|uI{g0Q&)C5W5^Z753lo0cWtG%#(u%0)tPk6$g_-<&Y5@EygV2QT*8|D41<2m zIWXC^QOsCx6#9+6dAI><(Uzo$6z(^G8*>scr>k2f@Mno07jomyQywAxuE?N}om*hF z71&adK#6RDy;HuZRs3x`36NbDVro=m{7Vg@(i6>eP?vxUdJZR*GMO^U=hS)~>SJ2D zOqS;IJGgmqLTd3AJ}E@0TqD37mz;woIZu!bV(ec|$+aP1s?az{9Yi9LYc<75P9&Ix z&~Nnkrb>z}5}mY~0)^0nfu1dV)Y1>*5+Yr;U^Qf?b*uO^5MgcxDFRD5t079TxoIW< zV`qQUiab(*rAtL={!%SJLa#tiy)=g>QLAF;wCcCz`kMm+OBkcm)!18dl0m!&W&S3^ zj`&*=a1+|}lX%B0yGH-k{@R*6J(Vnwt#Aivr|k}p3pq@{Mo*RTyiMVj@QcDvOddfu zsd0?W`BX>*C|nAFO!+4=9ENKTcD5*$j!6GK$xe z;0b19PNU*1tOi;)yPmtb;FE<>z#SW^)03!8OIuNuqz@T6X@(3;z0QM?v-ryz55C%v zg94lVAOGq>vUhs60VA1#uQ`J zE!j?&)c^R8|A;?(l#*{L-Nk8bu727qe{wHxDGlVz?kv+~Rr6JyZ3@Fy+hJUfKmNEz zIYoWz-Z)r08ak_+b9?Rs>r~6lF)oMeu*M-6^{p}KN$$)yx9es zMQ!PEYx`qE_~Bd8D)Zeqbx$`u2?_H>v#+!DC$&VtxCK0V?nz~ja?Fgtik)B=6n{7$ zX{dfl_G3TxW1srer|b$5M6YIoq{$KYS3rON_kZ6XeuLz670<3{Y{331l~>d|-ti9i zp29{zqheT1>X*O#?6|F?hpw}1C{f0uIUe7Zz3!fKyd z7rfNee&|CVdgB}47}?sjv%fUBG}DXl+H~P@a2O6GlXJn67 zX?>o1_q*S1vtaBmjF7E^;b{4=@&|wL2d{hG>l}XD=RAule~mEY0DQwYe1onAsj;gv z&T~3!uYBbzKl#Z|Qi8#qn^$1Y=aN%%{N=@O`?hamh_$mS0^6z=#>w>eCNVqJ9`tTr z{Sm$-=YfY*qn?KucokXa2S511U;DLR6Nodn8)Hk4_9{>c&4)2{Ni>~hSd;(Thv`Nn z9Uver-912w!59o_aCArr(j!Dd5Cuk!Zl$|HDd{m93D|xv}wHhp$(jk8u&5p3-ArleTZtmBvoI_`ixLr3U~J< zE&R5V@N--9c&n!7Uh~4)2Q~NQ^F3MTDT04Z~-}XlX zoh{;7M_%vJ^-g+i?1Yfn1R1D?t`4Wxispx_UUcB9wm=zr9FD;hvsp04}u}4 ze&XWYs~DA{GL91Hst5vh`7|Rl$alh^OST)AZbO>R)05rA|1yEIeo(0#9%Znbj@L8M zp?TUGlTcKqSMHd6A)%>r_C@2_$%z;jhh|oYw=ApcdxnOwg!jNvDSr>jj#S&D4G}is zDgelTs#us?`1YH1OS2F4>F=|2+-6#Msp1-{*zS0J*YCo`ExTw#XEN^*kXvpAq)=E1 ztjJdUw;t~zQ|O)2yYN}Sc&d6A*mA*GyEq0r+B?BOkw3jg*ZpYDi*aLR-JA&DU8>7U zEVgwmf1cwepExsb_{(N(NDAEX?DsqsC>AQKXi}eGi3jd>oYvv`)n=Xr_$i2&lKY(v z`6a*m7y2N0$#0<8f8d^Z8(SDFdsK`owbyYh^~AP{k?X_r)gHyf)>vfrbV$bGG}8wG z-}8o9v3tHh!v#6hwQ4&5|9yL(mC5;wrsK`{(paI}R^({Z+-x8C^!VCGI@T1!goEW{ zd!ZiOc&Ig?)mPSozzn0zNgPGwgJhLVn!QnzcgbW;B| z@q0SjJfnC>b?>qDK6~ow>drh`9hu3YH8B+zCEe#?&F!r=0;8gyJH2G-f*rB#XRD(Q z?7@1;BRsp=n%`r3>r@})9c}D@yY?`59-FcP*lo-^K`fAE5z;wck>=s&<=xa<{32B; zj`nHq z3ed){Q~HfYOgI`Bf_XB|$(xv_i6*o5$KVM-(SSgk-~xk__kZ#YA!atUWX8=%|n02~v{w{A4nJdTLepnVj)Hc*HPr{Z2+whpogB2qS|n{t6L{ zs9+jdK$5K57d?f9aHf=uAE|_vkamcJWYqHHDZt4q-_H(jQbJ^oN(8e~a)m)ILp7g% zR2nkhcD)T5X8g2{sjc;h)SS(=DqUloYTG*Y^q9LM%^8&@8uk>Gu?l>IY1z&$CUQs=(U-WY zbYQmmPnzb}Oa_38a<5YWzajfD(uG=@`(#pyICbO|XJkz&2>`3eK)+Ci`bO#^(LHFc zqDM$aQr5*Ha=GZWSpkdo0Ee7jLzx}zA(lhTvVH$4A-gO&Q$5?F8 z0FvND4Sapble`a`@?6ejP!}*5uz#MZ*8gOdzy5U?Ik#M%1x=C#XWbmhHg`KjRjk2` zA7FrxY!5HkD~WSzd~#H_VK1#CgSwz;k8&pfd&Pvf2sH#wXuSj9iD=Og1Xwv6wD=@BQ$aIG`I~Gk0KiNSR=_b z%h}VFW-2L@d4M9IUXV5!vn7Pw$_E1FhdUg~#Usu%9gL$*~_xp?UYZ4~J zoh3@SS*6c8?zHzfxJD9C`RWfJn&MR4sT4^7j{Auv6ns7T8$frEX7O78DGn&bS;QUy z5RgG5c3>lJbAV4}DEEM^?jicH|?Lj`7~J;Vc4rYp7yWpUagUbQ9(^MuY_;N zAN{+Sf3`ueqL2&rrQkV*v5iqDw+#D>D3$n^O*G@j9D^J~iO%f7d{sf=T*V(GB&r9I zSp_D^&LXjUCXon)FYxJ%EnfG;4()8Hq(?K+MU?R!N^Zqj<-l6c=-5iE_YKV-{d{wz zv_X8_+rFaF0)R^7D35)fdGx56RX-nhyB7`8lXi%{$tm<3vWGH_Uv39(Jv}XxX4P}GWlX6#%NGEpn1NX$H4{0Rk*08+NZ_BUkH2qn z;!Y-0{Q<^VXo)_d<5S410<>1DF?xz>z?9vYTH5=nEyy8@usznIhQx7l{8hOmLuXh^ z6rzybLqCa=)1jrUu}AD&?A&_gvpd3*V@)c_ZlnD>e2%JfM>`+t(*Es!AtJr50Rz&% zfrm=tZvlS2*-cOU)6N~ryAT?aCSbE2m=?FKl@OmV{u!_Vn)VCJMe&{pgS{i8J@P=G zSfrZ}d+1lrw$GP2f4MJ?v*Wvs2nz#l>3jzjox&ZjZnJC79CR|rDfRBCt>E1MAPR#q zy--WNkDZn{dOxGu{gL&0keHW|1wDztvUtL$0f0-Z{NQbSbXVG6k{iSmYDMPl;qK4z zUA4P`EeYW7C4onf5;81&}>3ZM)64v`2=L-Q4^JMIE+QeP{r$ z&C=RWwv=~}Z5kMJlVOUqL?82*4Qa8#qiv2Bpj>#|6phl+drE)&t-yDl$ry`h$!bz_MyDenI^@FgaIfTnW^T)d*42GN}b< zksuKd4{?_yH7ANEK7s*o)`{n);lYkSY5Y!dH~T|9h!wg+HDE{7T=9A-N(k;6Vv0bZ z2N22ym6B`Wd@gxOIkaB80aj1q^FPyDNzN8mNq%KF6qA`BM4CC8XXrkj952GlVgnu) zOG}Vk`<}=>5ORhk!uzt{@#piJW}P>U2*Hxo5UcVnBK$W=W5ob-M>1zHcHA^0rUKT& zodu(8dgrO}Oz%s_5sM5nTLX{8%1NJ>cznW_#y4xo(aOR7q@(}5<@ec?b{r&WacRgh zy~NGK4@4Bw0%)R${0q9#(i}0y7f1gBM*nT3q(D-B@+)8b^NsM)a1N!xOmdgp3dh93 zeK^&HQrZ zw)LhcQ(gxHx+*7?X~f#gGIx=8|J!ARt9g3E$m-Rez2aZ886gNJZ^gnKvALL9g6rpWxA$G|w_KGfRmZ{c%BghpHkO9z8cdD<6__hn&+%KT&5i%QQoD>aYVERs zlG{VMZuIYT2bI9K0MBpNzg_PPgVsM{b=5PC({AV$7d_-;|91}8D4~76H}}Z=6jMh0 zFljOR_=_ox;2I2CT){l&b$(=2-oCynJdq%{+Gj%sKnOIDCdo~Ic}Z-UDT#C9ba#{- zGD@`0C)K!T7%I}t-}@sFh`w!q&;ujJP__QFJFYVRyZx(Af54Fijgt!+)(D%7kCDr; zKE8?_YklNF&+lh_BTg~=+cX~CCHK~#lM?L@kzG#@z!&)orQtn0aO)pZh&I&G8TtNy zu6)&i@rLpK86kT-!u~wGyplrtQ^PkckvR@mcbn>S4$MBk>(^j0*0iZ3#nY3l2fMbG zo~L+2;hM=EDANWzukl-h?JxRJCwd54cfcxWmDIu)^Lb7x(v^@K_HP&fQ(^3!qna&r zJp9rW5&a6La8VPxqx%Rn3iFqaZfcr44Yr!wW&Xx6o1$QF$vwgd#f;ZNH+6YCnxHn> z25uZ9A#RyK*w<6%jR}dZ0qha-N6tKlH*dJ)lZc)i~rKg@~g zIWR|P>>lHC3vE8)UMmBca#S&E8IcF9)v-w2%`)8oT>F9Rp(z5;(;CCNwa2s3My zaljAPSWcp%Q;qZ0d8UIG=O;5CnW$2?K7~nnYq5fDCFHqbUn_ZwRxDrRbn8CKC^lVe zhR$xbi;XwJ;#kHgB@dRGTUO(}&8#Tk~`UDJs4Y2504$=tR}WvkVn!vaa%6In>hv zs3a=0os4vGcC65qc=I%&+y;0Faet&_DQ-KQA#r=pQrH8lGjkEboMiU7O8Dy>VQIr? zDFUJdG(Ku8B~gn^PU`*754;0N5N5E+FH@8H7)@mL7}PDYzRDCnID?1bc#=MH1@?#K zuM;nmVAs(A*$YUlU>Z+!akZz!P>zWm+XFNm1{v`NBv-RQd^~u9NM?THd4Hp=*7S|%!5Jvw-!tIREbto|UB<^(E8kb`+ z*;yTec?K{NGXjcqv=_z`KbtxuIM#$4^&$~ov@+O^u6SwzbG6 zRN4Mx#L?MR3y@d}5h86%ktU5EK_r{7FunOPspSm8RO7l}$kf_$0Q zXR*dO6|?j0&LF}y9*+T!4Skr%N`BKmU52TIe_-Uh@PH_gSM ze9%#uz3ZwAG20}wB<8#4u(8d?`L0V;lh|RMIThBYSOFbM$>Mqf1?`h$cnBonxN{ts>Euvcmr(JeT}q5nF9}`c0-bCx^+$1LB8VABXdgS4DV@&aJhgG z1Sq<3N;C9n%1jmteURJ~CbE{3DW{joYRe(nkPl&p*&&=0Jkv=iD1vIg*tLL=W6WX% z3sXD;;TuJHHfNXkxWHHIUeOuW5)GvFUh$<>n3DkY zi<%h&d2dmmXthLG(MSb<-;GYiNA94aB-YZAIiog3pkPONOfaTPFB@X!V5XI_!+Z4w z8%+~P`_x_;po*f`?u)QZ98+5e8>{K}EODf}UDRzT=OZJ} zB=S^}R#S8<^p*@T2siNSyI~87NVoo;=z7J{ieIPs?%^-n((XLT79r{Q4_vtbsvpfY z-6hP^#wY+|SKKs9wYw%w(IR;{;Vf_1L?m*N zSZI~1?hK)kpMe#x)5RWrq~BV+w->)^8Sfr&u`!-25*E!Z1(%!?mmfl^5U=_$2_3GX zb>QffY>}P&-7l^0<=V6qtFHb3TyfY;vJCx6>+liIs`Zi0imc!XQZ9~O9COMhCXW>f z*OZ8XM5hZEK?nP1R?j*`V$*4;Hb2N^r`KP;iRGRcu-vFIbn%O$qQ;QN>bL9S*+8eR zgwW~t0pqVmY!IQ3o{*%JgP-pHH2b&%APbO>Fk7Nv564f)5c zFoef0l78|rtL-NPk^LL>(NELZ_j zx=?k93Q15T1MX;Dx96X+sm;`@pb{6nJkeZU8@p73$Lm1s?@R{qNdoNiQ#e-egQ^4? z=4BF`AmclPfXlIKg*D%^3u%Fe_%;*DlgZNw7$Xp}>{e>No@(&ri;?63CDMU4yOEd!<~nv*U=O*6Fw~F*ej95p1|& zDp%lvqoF#YH88wD^REh$dmb%W8FSxKzsO|6`r&B&al1%(L3zvx|GvJ6z^9@S9y*!P z4RIIQko7YxCPUH;GM!54RWW%kw>1&@R(!_U{h=%KTyAX~xl%Zemxi@ro?K)dgLXV( zw}eu&2-~Mw{30!dzHbjAw}?*VMY#{rZdDw(Y!)mdb-qSrmALb~8BB;PFJvWm4J!X# zS)=-6*EJa#8V%2dLvdc{^%;i?=_wOr7HHyM6OlzXb<7tG;FiB?-m@gJ2K?N<7GhJK!$~w{aX)LVFK^ zBWFfp?2jz2(OWt#oJlVp0=lERx$aZ7_pQWG#z{0=?v5v#dUuI)6}wQHq^W!WxX~HS z&k3AB8qdWy_sU$c1gO-reM_G{B0<)*V zc)ST!3pM_V#(cNqz_0DHB*NwHKVup>*r+)6-UViUUA6nf%-6f4;t)M;E?eby^QpER zOd_{3yEZwbmDq}NQbth~VR`bRv26_dlzK>MIdc0V!&%m}VofvlB^rehk?D##t+~l~ z{h-1&3)EB?jURGEr6OFNa;rS%cJH_Y@9`~BOq*il+*mb>T&2RL(EL>mV6D7&$q#?G zki|UwOv7yxYMI|uW}}DGqFd+1qs*Df9zML2Gjq*DXQRKeDK#P0cgHUVT+f!4zwcNq(J*QNelu$W_rc zm!lz64oY@Ii7_+?^h#dvcK^h#8Y=R4yZon>kP7WoIzY%!++KWCD=(fLNi)RacI}es zCL2m9XkjUUw&`vY))BEcIO%MlAG%DtPJRwxn~_1Fz^aOAjP=BqCh?|F8SK8g`blYwjWnH?oqpr zou`;VTUt)n>O><$Ul6@4KII+Dv9Fs-F;FR}2cd^BYNB|4C0>S!JN48J0 zUz+V5{Bla%B|2jKc1u&lp3Q<|rt0wy>{K9u6OPG%eJvonXOd55!$ta9`de4$&>A__ zw>LX^>iuxMV?rzlMrS0vf9s+PmYA4?kcrvEkQDwZvS$^5F!I|Wd;zciW z`0U&;@;JUi^#cw8i_5-Cphax>U!breP!n5EAkw>NBc6@KSpS0bf#^}h#M{`Xj`QiD zV=>T%F;RX|t7KQ)S)7LsTx)Id4Khc54W6ZBT8}Lf5@z){bWy{+{mh*;Mg-qtyQM zKk|II*0$mu!Wpa9EJEXwu3g^SCx6OGO110pPcm#zEQHLsRk-E_XExz@HqKK#^7gVX z@~e3v2?TajvCDK`Y9EE1Ni4GHG+#K^pJ8QeowE-bwpkKu!iop3!k+xpJJ;1r(u7=p zRWUbex3RrvrgE2d`z1>au2E#HzwMX)+Wk6BKe!G?};Z>Byy(irLE2pnqZ z%}bstDC1?h{XFBf^j8w44$Gh#7P0nJjc_k}AaCUk_XjsrfNJT}UHh(#XkV}WW5l2E zYrH4&+C)KdZ9LPPug08W1ZPFzNUl#~x*pLNP8S(+JENiVEhgr&5#_-dr#S<0Tn-BI zej3;BapoYjr8>rOnQ>TTS!d(AA9D*&xrBY?zuVTeGS~6|kIKHMK8NUTn?2V+7h5$n zBe~fFsM1gg&+qwla`8+upH_t}$aNwvr%cPB^|zo^2eZ<=Z&k)jadr~PfHJ~wMmZm5 zaYVudhRQ+`#4cr(9X4vTr0bee?KXy}@Ee^D3 zoVaC0PJ!$}0*-RWrG-xAN-e%L#oXAWUXpw1I)pfYw=by(FoU6bUf`}l|JyH%bN}Km z0PlIYbi8C0+r9yMeo1;nGI2&jo_yc**a`360wk!#@@F#j<=>{4L}$iHvJKb!5Pxf} zajvJAamj?u=+ou#q2pO%4Q>VHGWMSh{fw=i!&FOtl!^=orp& z5PJ#FoSBv?_Iu>?5n7P)O1n0+UzfFC&rSb)qj%1!U0`rNtMtHhOz!I2Z4)bB=ngDX zA88E4IctTV;-Cr8_gc$mT0d_GmIb92*U}uSvex=HD=+I5Z^UNp^bZY*OGbG9865r> zfDT^#>=)M%xrJXW&ydc4_$Puakd;K`PgP*Ps@tQzAc5 z)>#58LcIM#HC@c*oy?Wp!+_DxH6dln^<2|kfdE|B(O)FP;-Cno;}1-XHRZh zJT+8B>czL+NOWivgB2zF8|#|%)}-i`x8^N`fIf!FJ)(`~A<0T7J=EHlgYRS@9r}(Q zG8yk*dQRcMPQ>AiK$_3I#-_H~^+LxFyq~)wP!hh6K$BeaL=6Gb)&4#%p=!8268Ctwif^sii zT1Z&F%37Y?^GnV$a?RDS(}>-=Kug0vz2A<{RigPn%I1C15hwK}? z4YD|5`xi>pI{NdnS7^@P$B_o~fcX>C#;o{+d^<^z@|)W~UF`X5WIRvXF;SiiHnKW8 zaM-NFx+%gm?=JDM>p|$#WILwzMIC-IJ#$lLkY6tcutSg$(D$Q-7n>J$EH1mAh>H;> zjU~TnAKyj*m$a+=hTnFtc%28>@OY>U~Lx4P5%d%i?mD@p2b2X zIo-GDgat$g>ezLdDG-oy?r+hS`KqfT^6Ml)xF6_GH-&=yN(EigG7E2)cQIT$k`|!_hWL0Do*y}B`p$??h-(0DtoPy*NNk)Z^H;OA zlU5*Mz*I!~SI2d$)H6(LC2d9{W>2w#|GQt^Cgjvis4P1+&e7R0I&N5EPH&tP3LXII zjdToozPwK;W_y-*@9-(AM%6mWIm^eW7I#9ItZZ?;zQ_-Pc^a*|aj{dhG|dPKDSl3) zuH}g|VL013!fR#Wbk)F`fbTqR&hy+5H7hhe=g4wLXoNIz7R1G<`F4~6-DT7Kepz{% zMdcKS^-wGO()<1a*D!FBf@g(T$!$sd7j4_e5JZ5a@>SI-7lUju(We?<$F9qM*7`^0?kC|rl8 zn^!ZN%*1JR>Nh`@;7V(FLA5Qv$JFy@bHe;qT2{ot_ha3&j?tX`rQE(YC&{ykVn{>W zlo79;{J01X>s*e{Im75Q`?o*iI#4rV!Trp$>{DL?p2IgJ8g^>KDi0W^39_#qMHT84 zYp#1){H|{%%LGcX=6Ga@aB>kA)HwcqE_(5Y$G0z7`^)iM1%qGm%IEo9o%xcB_<@P% z8#eoS@>}xt=cNVM)qPVf-&1gSg&?p`3vH8k2(PWky&A#$p5K6y-Et9>Qq05{GkBzt zviaKD(g+l7gI04hH_IaoLlUh^uh6R#L^}CmYQ)MBaDAPLCh9tXrRz zm>b4v68=Pt(~M1Mt*J4tW@wDLF7|$mS>(GdWI6`y-Zu-IT)ml|P#q9)is{rG>eHM^ z7Gp5#>xUQ0T=g3ku{GQ-NbQxjZ$ZsTh=>x(P zlP~7Y%yUUMlY4(C_}t_3!0I6;5ZI|F^GOS28D0AtQv|D7Bb8%4@=2rFmTcdFCC!11 z-et8m(YF3?t3e+9hrO~agjX|HQNd-|K>dZXcxmZJ*XLx~C5C_fj~c#;_Zsv#y~vE0 zh|elWcGrl3?R5JuSQmyD5vGZXNS;Q9tHo*cYjWN3*>(W}x3yoFa;F z=bkRfR9jQKqZIZ}=Fmy)3SF2cqn<(T9?0v6?({z?p-q^&%O&|qZiAF6C>BOtZZ;J2 z({`+ii~`1wp1Sw0cmP5k`DbBz9Rpw zMtj_M8vE%`P5!RI(#AS7-9vGBq|^(uAV%{ohq7jq?$T4c5MvOXqFAGelyLPfKQd3T zn3XZX6(rRKk9;)I2O z$LKy;eYWRuJVDgh{k@Y3>DvJqH)J-b9ktcw{W5NlNL~}LleoNjh0b3Vf5?p;xp@{F z{`~3rq#nDj*kXJe30e{Au93jTC=R7WIeP6MRS8PirpdFwHfs|bx8Ly8)|3socXe!& z{A_dtl1nwr?Ko)O6F~1pZ2PivH6b&_#Ci`u-JK>y4;3Eno$97%`j&0IHwAnJm`o~v zKkY{Qx$F_89&IApZ;8`7*hgLF6IC=pm=Yy_Pe0$s81VtDXb>l=okUh;Ke*_KEnX8s z;nQ5u$L{R^CR#Q{X9qmsoR?f3zwvJGi^vvIoQ+*t58}QQjWG#Lu6sEe8RHo_A;O;2 zkyRCi0QZjN`0NBP*+33A3Cz+(-w)$Wiic?foU5kvv*J%Dc^Q235g$?mapFWek#-)? z3A;(WAM1|kY59GBayGO!5zg!ImMl(OdX7>wnPLf@n+RF9d$UuwCB!>WAB|6U ze|rYgIMD9GH?hiNH9YkO`8pVhp?2)Ubeg)HZTSXhUm%W7jqRoZr{)7O9vb<{Bjzgo z9{SI!{qJPO@BZm^?4j#6)`0q=x9l;%LlrB6qcSc%p_69`oEHVW>Atp4h050b3Zuir zG^-=FM+$eqJsgfSNSBOpUFN$m@ONsQr?EWU;shM*W%SA;ha|`l8O3E2vToXw&D5z) zz{!|U@<=AV98ASSDdcPl~!>gGnSeNhbp>l}!)7G8~wzlv;zv z?2%KqcrE*iv+>}(`I5?*x9R~;=g)9&9x|P`vE%aU%o6}Go*yVEou=QHRcfDiJ+lg* zI+l-nNIds@SgDn!iJUI)m-wGwRcRZ`x1#4e7#UK%fv%KI`Dn9v-sBBoyfea@Hl3A_ zJYipsO1r&3JYT~N8cUf>@}yomh=^U6voI2k9!d_jsTkuUnz$H;s;E!P5SK~pOw1^} zmJG+p^S{5mL^U=HPG*vI!0#y9>wmk3eUoY5U>kn&$Z>-r)Lg{3UcC)eA4u+R$u1yA z-**8GhG_LC^hz|!b8_?=?x#?>kx|4$=z)UmfBK4EaL6RcWcm*#H1?&|7W$D zWJxq%|9w4!HEh1+>+q_9*&kud_Uy7NMoP&T$P3T(Q&6eXF`9yH91}GD3ZJE6Jl@IX zH_Qs7@doaPsf-UIX?BQoE=KMCJ|$TDo{B&Ps3&OV0( zeq&RDR0X{OSX!cW~i5@!76axA2f&vY_#3!)8mvg0L zPJA=NLytl`yvBW}@{2xq+=e@}V~GLGGzbm#7D^M!;TdnPBYGPG?AjfD@AH1)cjZ znG2C+xw}k?3++@KfQe30Z*~y(Kj)z+Y2u@IkZ*YH+Wpozx2G33^MXOU;yVu;F$~C2 zAb#g%Uz1VB5F_OVy#>DG49a5XF!aleUYF_Xm|0(%Wrw{9b#sd1W6+&EHUW)@@M<%g z>;kt1)RPB1vmcM82f$1+_Fl8^8&=eYNOYxkzx2O2d5wIFjh=8&r|(bJq3!=kW>ht) z)cPhsb3rmha|c0B%MuZ#MP{t$KjJ#Q1NzrBUj19?AeC zmdI6+)%!_p>w3P!!;&GA!QYo%P~4sGPmXP$AOu$!gt5}amL!|?yIQ3DIVMwG3e*TS zBg6~CTAoP0c{<-~0lwb3eOz*yDdX70qGuHI4!W-XqyE#NwU-I)0o4K4*Ccc)ge?UD z3D=WXHCAxz;v8yw@}~g&`r)R^@1>m}zeKY4a?SoZYvlRl8h$5H!061g7oY=NqyLUuy(beu zhqf|-Jo=Av7=^Z#K|F9ToaetU9q3m7IPd^AD6TwOTKF4_5YcFqGL+QBMJ zVqC&u&QE5~idc1x$F=p=MZ$W+>LwU;r6~#}pQkc5Ea`2CPAQQ+lLLDT-?nw8!xv>tGAU*C@LqNUZw$*Z)2DDDQX{j>(Wy3- zv~l%A+qtu2+ex~cfO_SG8+Z1~<_YXh6E1pxaCkq$GgjO>a;!}+mNZiN@LzeV&xdKB zV^gg$o7eAeu z44I@3l7W1Aqk)|h&i%;|*QToQ=a&fu|G$Ixl|F5QZ{mkXD#2NQ*&^Pli}E@`)^CF_ zf_*<>nY3o!s0)UDqvplv6`JR^2E;)}T9ZuE#~>E0*mU7TdfS*d1)?`EXh zcC?y{6k{@nt>=GGV(ts}(S96;dkkvN>_T+Di>3Z9Ps~1Getrox8?1{6pP~#Nk-&+m z@2-1FeGvG5s?2<|M2&XLzk=5YKgR{ZaWyIi99V9){Z2ma=QOcZQ0${28MCIfJ}cB- z0pWLhRD61dSp?OI=bNv8n`;#vw0^(P9SgwJIWvKL0t|skj7$HMxAibRbJqGbS>L z&;6*J)3}S6V5e9TfP>~K6};J)7g7tq^`g-9ST=oP1JVjM1CFwN{Pv>S1d^k4uv*M5 z^w1jUlycCU>MyOOcoahMOcMoQqOYWR)RDZHKoS~_{-Yd#&>Pj%w#3nLX|~_uv$)cT zKnl_p6cF-s!|iu(K3UwKq!0tD9{;wPGrddJKA^Eb)Su94!AN(H z{>sU+SGe>&3T&duE>Il8;C2jH0&thr6tWxUdYzaBsjss@Wc!3E&NxNJSQ8a%=Iu5qEy|4kDaVkeGmEx9M39*$01H z3N$v{i@7f^R2@rpW2Mb$25ka&SaC&J%&?QuBD=}X4^Xu>zaBo7Wap>K#1(9_MLPoE z*W>TJQCHuZ7T*+ej@~U05sRBAot&*oWl3wj|MZI{gHO+g-m2-JfPm_OZ&#}(Z_jr; z=a9ZKgMS~r+CFIby2#da(BrUQ zplfEa5Wvb}rFSu(&C6;4m>4}cbgBQ>>XEGB>yh+|qDn(%At}?aPP}U-q+u0bEYh}x zfjN|W)hzPi(w)q1lD>Y*K*n0EZSQGh#)UQEHY^!Fu& zelbW^8-c%QLG4EPI4lT$>#e^oU5}sEm4A;d53wOG8=-V_e}5{M8!PF!*AU$=A)9g` zq80iwX@)pRGtzE60jTvscd{G52r_6srMJGiyU-t4MMG5wBq$rH$+c5A{C+!#{0mku z@&f72^dm@01W^yKzRoXIpo^^I^F>gS|RTR@*qhUpz(VMa|VG zK$pNPQR4aZH(J3_zm~|sz1lmCx72&tnt6@e_UAh9F}Y#U(kt}`JQ&nS>fKZmLcY7M zHvkz#syR9`PVdC>Y2gFmRuEOK_u8TP?1vHGGP7p#6AzTz@^8aeAz1K_(E zcuODh-sQsiE==ZbD?A!+C*rdUVLHdl7og?O0@5X{H~Y=-bA`zk-ji&i_t$c{`b#y1 z6`pSMqK%i|&%7R}h#GCx_r{lJ5)f~b%4_#kR8I>wD&DlaZ0j#V1*mJg;7XBA5$-Na zIPbLk(FsxJx1=xhriZiXrMZ{=~^-{2`o43_wPKQr1^`B7lMW8we$(fV8~?PFXR zky!Y*3p@o^fA#8%RN2^l!#oeAbnEorL1n1W?<+sz=eX@qQw!|Aw8Anz#atWrXOpcr z&fFEuY1gS5vH7y#C50cQ>CLFXl{*s`;yjL#&${T+RGpchTBjJjfXZXci{DfOt(@xd96Oh66As2! z1MVix0&VR{DfYHy;`DF=7-7%PRUo>7A3Yj&bf}KQ;`=J^8KQ?#JvnphJeH!M+xmK0 z@+CT9)4WuJfZbv3^HNSlL3TIVp{BZeT95aE*5mz|PupS7U|-`Z^8Ez|vT>@#2-+9Q z1&{)YZ=OhM)QjIRy1-a(cVsqe-t*Q<48Guz)>GF;mJDchB|SHzQk}O_mRe)1fer`?+{`l`S&QZ%OhW< z_tm#btyITI;p#BWvI!bSAZO#m=F4^W?gXavj>6>R5hm@PUqY1f4h91=B*a6dbu)ch z>Qth{Uu7z~(>R%TFqXtkOfmfYb(+O%qHq?!+XO(_G2jlUkov+}le!^k^ZpXd`5q_( zl)D=$6;(Yq;+dnIh@vSNef^m?hd19w`_@L#7Zb40bYh=ZWqt3*DOoR*Z1u&SmSv9L zrIW!}5@+T}zPMNO`Y#K4DrGXKb7qrPmv+XMN>TyXyb!hbgk5Sd)xnW)J&^31vC+F` z&KcypGM$?;Y+}*!~FMi8q#u6;a6;? zD?OPzFaJ)#=s~%%+<7&fKFzLJxMw5Q@0IA+mm{@EY)Y3t_U4E^cEkCX*DOS4BpK61 z1l!VBMqCu%LS|-}Z;J6WkZ9Dmxj9ovJocV-Q9yWUSqKykw1hIe4(HDVRExst$A;FOHOuXKg}RlHgsZYtFL4qt4T_~ z?Yvd4#oWGwmVT$*F@3?EqbMykK!8~U69~XLoo@w#8;T8lMj zf#CM172~#~A;;rxU`9gCQU2xsl%!cEctxQ_Z{D2ebs5CNp?4!jCODaZr zh`|{awd)N%Hj%A%{kGOI`*iNYsQOtX2TGTWyEUb)E;nr_DL#8<+wsSGG0h(iX(e8R zH}Gf?!}t?{&E$!Ph1E234KZlgi7fDnCaINv!fjogb`8s+#jM($vXPVLTmw6~%?6Pa z6GG((c}Lw4%DEujyxCK zCO`vsD>D_@Q|u6zkls>piu!t0OSo0;{v_{l;JGBOi^iW_RWkX$ayJ|3M}F8{f4@#G zZ!oKw-aZdYDBng5If9DlVp1aVH7yHgGl#05b@`gMci{_-r;VBQf77I`ZvXeb{U0XP zPb=#Bg~QCiuB0ZfhJ@h7L9ETqx`uOGE{D#}C^EW_@3!smL)FL%A`o;V!(~V9tc__m z4x(;~bM8Yn>iGY0)o8`&!bx?1q?qnmbFD)xu95d{RH1&K14w`#*EO*p5WzI+OA74_ zOgB0AJ2?c9AOO@%!M@tlWMK2Bo9}HKXvj|&Z2P29gYFz-PV38w;4~LxxAoaaN5U-? zsP1;F?n@u^!35y(&E(1Xtm5?)AblW4jE*DI)rwOft#BJ0Q2P0^kj2cs90@x-g-cn1 zIq4Sj8>T3VC)K@oF?5;w5_FXkL@7-Poj795QVrsxsw=IPFEc66_WINl*m|0E$icM( z*I>r>!2^nbcgX^cHu!MnU^;Ey|S4Uc2aHXOrD?xJpNJ zNDQho!pw7gJe9h>-r9{qMt%+5ZpR9*SnQ9APKz)*TP|7IC|g&>bQ}gf+`NC_4O6;q z_#$t13;b`?PSU^PmEqp_k8jeEFOXN?0sBu0O-&{L&joOQ`F;_zS~0$|3A6WjvrDfY z%J&}6#0D}B4m^A&^m_S`4o-YU?neyNxq!={!CAlUEg8{fV0;@_=}bUz>qNTNlP0LF z(ZeGg0nfE8CmEAyaAEzYCzMAdy}nJtZGS z?6)LdG4X!@4MFn0kmVvV~?=f zp`s)=LaG>BRE1Mg(|9s2mDi6Ae>N`SGhGegbUBd5FwkGMTSf#60Z5`PB)=N73Yo%9 z6PwXAspBWcc^jS5nO^Y9!y4gMXPOIuHYJeCHoCIP?<%rJLcpxL>#tCok7(co<|LRZ zKaDEkO^or;jT|#!w)oWN;cBH3CdCV0@B+4NY85;9shp?lw;-$?*{3+{!`021J6vHq zcuN5Ik&8--Cc0vJ#v2qq&TPEEQ~Na)IZb<@d$0gxoM4?sY72~U%#E7D6P~?K7JgUx zN24-ojH|IjIKBeg%q2LUs69q=@Urg+*vfKC{`4vjrmN09xSuOBP9u*#J1yz9{msE^ z)J2LyqTxCD#-vcYEL$DuQj~1LQW5=V^V#1n%aw2=zoLv70*=9xs$uHi$%Vv&BR2wA z&QDKK3_Qp&o5oIWC30~#7h{qnFl|YoQAq4j6&un;N&SJvzd8a`QUK-I!V{CCra<`Q z9T~zODt4|_=JTBCjD{pU(;X@TthPUqYD`6|fjASDRrcsfMFm7a*t(B96~gOI4dkx+=yEy*9;zk4V?zZUU(KQ%TMaJU-EMwvG>cguJs3ERR7S1X(H| zhDWM@4&Y96`M#5>yCP5gRm~^eFc{!{A&Ahum-m50y$@GY9OG;i5sa{9R$=QMm)NOJ zNWQTl9btK*EmI?b@24oQLku1tA%U+Fb(tFVQ^{;8&;leXj~ltfA~6MS_%ih)&!Z09 z!w%fVTksy1{YcWYw*z?rjQXd?uCE$BlwF?P{(}LeM>FTv$ImHzWL~xNZpgn)$eV^F z&YQdlqah=-dSpE6!2R#QLwF0iPux)ty*2ki!$WVvvt58q93Q*c(>%4k5AuKp z@X+^$*xK=t;h2W_vdJsQ<^AE`P+;cSB0q)@CWVBATK`chw~1Gd)x4I1nbewE_0RgP z=H=Jd(pKug$QJ9fLTUSctr3PW=gYp}DNK_yR==KXCA~j><=h`JkCfbp4&3Qm@X`6Z z4_p4+(~xu3)8%>X@>O7;(Rr*-?~nGOf%WVg-UMEIUN-r1&{vu8TjcvxR-3&Br&qWV zyr>dRzg0;Y%S4oT{QywHCeK?cB3H9pg(sfjjVO^R=Da@3kI;o7-D_$xB8=g}AjAdS zaW(HfaYp1l5%WmKedxg5y#;eeIfBQOojd9n;z5~-?$PubD=W1+1UI6~hn4c2! zjP^#!S3kxPcD5~}%MT|Q!+ajq*5f$({hLoe>ESiwEhUSQe@t|x;=xSavZ8?L_Z?9`3;ep*y^i6FuzYFgZIm}tIWf4r zieT~D*3h!ITZd;FIBgI49m(Ba+;+3b=Q)!QB%@*@k?0Byh!`R|ERr77* zt9eTFY|%f-K4yAtX=6`-^V<9Hhd=DiktI$K>(yM>l21|aIQ05F`_DXLY^_r!`(=^jX)lfiZrc4MxNB1YIo&XzgjN_fP{E? zXiligwoDYy@gu4coGD48^LTqKIZ^6zA@s!-4}i`Wwp=J)z}ykW^j3Ju&E1MZ~lUhF0+B7Gq?} z?+RE$*v4GJr1KfUvIS>UinED?XDUT@XPm|c?rMxq8=gZIFp4yUcUuts6l{j>)aRltr9TtQr(Bk?^QlNGhjQAh|s08hi*7$mxm=2HYkl%fxRQ zKzd;sNsRI=LsmVjcuveI&41b<3IDi@BUK8?d9{)G{*n;3aYT-`C4t$qYTeGjr+SlkVam?$>Im_n7H`Mny`mG zSWTx*kJwbQr>yi_0=-tXEmo^mK|F3WcS{iG7-G{pKvG(Q*?y)d*S;Y@hZ`X_!hz_? zMoIu~b`FR1z;e;nNb(Lq=l}$Wf$~}0f}9o8YhLpj2YtEG5GJ_dEAC{g2%v&CqO~kH zQ!rW>z1HT2Q4ZVPtX*qpD*nl~ApilPa(Ic?^I(@$m(^;_uMwh!EH#9}Ad7^ImOPjU z8}>-c)Jsk>p>?|Kw190^0+S8%YAb-w3mA{LyIJluVNT{tDG~vTgaFCpByx3hrCd!4 zK;+_QxLL2E;xxaIlvT2fq@z(zE>&2lV@`-6l2t$Qg{i@;LQYpr@@;wc3~4s}Gc1vl zR(scb%@|I(MstmTut+R~`gcmUc3=2~U-&Qo<-h!aANYayzyJN;@g3jMsRV z(~w|FZz{nD5}4Zt_CTA>tadU5V3=Wpc}BNjp>yBP6TzCs8mrKQ!Kj^6TVh%!AxplV z#`>8JV6W3x*-aJJp*6^Gy#j}DjpurKH5Y(P1!g0*D(9k#Up$a@p+=}mE8!*#Q!~p8 z7j1$Ktl@xp(J0lkY77Zs>SNYWBo;zd$>MQpoFu=4a#mB!g}r*8Fk&_=9=$O1c10&z zxn!#kPY6%YC^3w1GTLTOPMuVq!*3!#X?u270w5_3}7PE&Rj z7EBmJ-^G3V+uv^1W%j=Jz3*p!=4bqa5_t(`7unV4{F?Qccd_43uVlR%~-3 zw;9@*tWM%N^>n~w0uw*meLQJ~pP{5WSSH_-ULKUvVympqD~Zi1vCf`YOuf2%fw`$uDKshJ2JvKk2O{Xlv4FO!PF9Ub7bx!PzO# zP%!XFT8{(cv5ol?#rFRL*b4}A;VES%3*@ye%kc#ZFcRBQiF)?Lv!@+RoW-o96>4TT z0x*6d1za<6R&1;5c4KEa;&{~mln6M6NqnF%Tx zsi^D_a%br8`+dLf&;7YS=PNV*0W3-|U>LG1P#=kYQcGhjoZAA(Zk6NY@fM36-_H$^D5wTI72 zcGgkZ=Ls^^^EI6J5qJ@gzA!ja%w83(8?R_-0K`*xtbiwxlVLDvGf0`7uan4>2*D)F zQ5AR=?*%#IwOaW12)%L?Zc2Ksgr`qw8GiO>f3~=*LV#w;1e{s|jQim0zy9l0P*aO+ zLyp|AE#k`Y@7F|F1%uJ7_;WJX=cWYXL6U-hT#1*C4|U(;^JQVgjPP&%&A-{L)*|ik zG{728|D@cbM~`SO2P_x>VSL-SecSWTKMyakL*ZT={|w=+jz34@OAx@bSmdYGtd5QQ zbzk>&eL+Jyn2Tz4F(E0A*Yb7_Vcsh@E469aR_9U5CH=4&njJ^0ev}u4)pmuI#j3fR zto|FrJYI-%rU)fInhn*3;pCO=Fv!b#={svMnCf}4NqoTG?FGx4d)2hfFb>3kYEhHv-=j>LmM+lgU> zsO&?J39yYs_8{|UYG8XW4@x8QullO5`qD4`QUNQAEJ|bzQaV~1F#qx>Ov=%(_-o{o z^`W$s{_)5jUOcmKYMU>Z1S?4R*vCHh5B|YFkcFYC5jKGtrt!hU-}+mB%RaPitQ0&! ze=cVK45#`8cnss_4o!U8`VUPN&`HOpEQTo|>U)+_3ZiDXHh4A41Rz>U7&2jGngD3u z_{KN-^0yLLQMDG~$<)lI|DNypo*^9C$gk;(YVAvbM(~n##d0K)JRWQI_$?RBG#C%O z=0T0ELdABnZ?VPCcG4Vya@r_8|G)S5{@(b@THPvRLsR)8baL6gePX=E6T|&`_ur5G z*pC&b+zC?4;5VVlV`t{hKA_#Ki5hxYb>(>u{@Pq9W<^>aNktFj% zp!v{;K4dd=@}TN0YJm{8Ui2fIGMtt2DyP|5(}Y>>x4-@E`KssiS-cnIMp!~gsF#CA zuZ=zpq*@d@0U#M{kXao$9)I{lR&ID(+`4);Bza&zwwN==W-42yAve@NfnW9il{2=? z1mM&lBNUHbFxI~140BB7P!@(on?`Ijwy&w84ZrD4m1zvczroB9k_)>8Eq*BzgoK2z z{02?~Ab!1==?NJ0x2?|vuoqe*?;&DF4kNY=vhdW6Yq7}!QX)>_s2;u+f!LblU9TvpAt@uHsm zy4StVy4WWz1feD1SDft`%1kUrOB~@QfcV>)rdT0~;ba!VivcZwbw3G988Ywn@S4Cf z2V3JoUS2X4Sdo)OwZblVe3nx}n#CHwqv;u^myuk0zRDuQ$!LTynGE5rgjpR{(H4fw z$;MDm!8lmdKje5EFP>sk9X_o^RFK-rPmhyEYc&ZTd@%Y+YM2u;(Sz9u!h06CAZOf* zPgrg4WN{dpr6(6+Q)J6VE@BwN0Aza2kfA1jN=PZ`TW@;GOs3DuFg$@tgzz&v_-ll* z8ionLlmzK%5+WR=Axv?KoW4d$80JkFrVyHK;mu;8+`wiCX`zdXvXV~X1(tWSLtX%S zE&UMQU*O&8sn7elOgU<*m}MblCTwXma!0Kv$6qr6=ou(%wjQ>M1AM{D$&5<;$gR0}qER5SRljGt%KAvE#3%$ll zOQvsV8`zvo==H5v;B%pZotqjx@?6*?k@J!ZQ)E%mYhXQt1!jsyRC*dc&E-c7=GnIr zS8VU5y|Az6ZuhUrbw4}Vlw_Ejt}HY8jtre2i5b{nKjCEW?YMTK} zQp22bNLH(p^0T-FPdYBpNuZ)Y(rcMa)n+(TG-d-RM}VX03(sN7>-!1jN)zr1V7wF3 zZ1ii`8}ee#Fc{m~26^M~q!&tTV>`_Bc9mYsdzb+yG#g;#VS6@$ID0k-t+m*CuH1jV zIO;?e+ne9~X4jtPE;OrI(4PDmo(y=O*CzLqR(s{9bORXuXcG2*)1Sj{%m*Bgeq(qy z{;?WD)$@j1RcYLUR>81$-rj=yBWhlDeA=gdS^zO)g~y z{5d5OzBIyk2X0eca8bac`7ENSNBekhKkX z<#~#7kq@Ea>UW(@U!Q&h9umT8xa#jCuL0y@!Wh~#kby^U_)>&4{MQS@u=RUr$$kXr zO^M#)?I89y8Jx~eH-sTY?o#X-n;UfR4q#Q@IoS=*%6TjK0#8d*Uz~ay{$$L-_O4HY z!RVQsoE4I(o-8G`1nxFpK1y%sjbLvq$Wg^Ma$yXAUJTb3=4th70C^eayw{I%FAQLW zJ?0gpk%d+%2qGu1n`cv{`=o|y%sqO!qnQBmJFo<^+88!mHDC>=Pw0_JhS7%P8sXX9 zf@)E4W!?~e4H@q$W!fAER#i}oOnvRk+>~lrP z{BC|_S3{EPL+O|8GV%yu$)j20f9mo%FCDDS%H2@!*!{oU}mVf`6FFm(;xw@f$VTXMDzIP?};=Q&?8|hWRp-c)63cbMctkhewm`$*Ge{ zcmeRD2gqX~rJ)Rvc}SWZ4dx{I!&FYp)wW^#f2wM#S!pIWyfGte5yB^2FxdbOmQS7z z@sP)L-iNcP1NzA+)H$E80UOTxj_rkbPEI|GTX2Gt&un_Kfa;5^Y*)<~hAi^|uSiO> z8h&jvmC23$-K=h;y%A94U<7?(Jl$Y&p)$Fcka$_0jz0VZL)aJ&^4SQkwBy1)J{Dbp zG=ldxrrm;?Fgy(I4@$GZWPSRMvl~-*S~cfrrCQ~+T<78`+7+3MXTwaNau06mr2evU zjW*foqnM)7lvL$u2xfgjM)AEV{P2fAtoL5r4+!V&AUqk85LGEp7L=Nywuy>Kr)oF+7PM<-o*DDQ23P9nHWVtT5GBgQx82C@I5zf_KP>i`kRGh9`q(by9y@6{ z$lH3~)O~M00D=}^U?UU;z{F!}@S_}IMUL`<5E}qP&9G))junlmF!eOerk~-MJTrl7 z=d5T8-sR^{hq%)G4TydT34oxdgb69U3<;EO&CRJd@t5EX?<{b4()OI+b9?n1Px^|G zqcpRQlgK%StOmA;HvQg~rozs-*>T3)6s2$E0(d)Unfz&EYq6epFxu+caB6Zcm`!Z= z8FHbGQ-a|Hurkvd+A0a;zzHkzAb*h^yJWMsz{E&#~X$WQ$PEBqRML3rvb=hke7wSEr`Xgwe~DKZbZ|!!cH0s%L5GT zqo;mnDBl+xqh+GcOL6l;V3k0|Tp`2*uczsWD$X^YoB~jik+UV>5j-oJFss$broyK& zjA{V45^_{uQU#A>szg7&Lar{tSAme{;(-J(s}U4xerz-RD>J$EVmJ{pNf{Cqp+3QE zQ!8NAycF^TfP5_xeH+7R>o)==0#KiRt?g<%gu$8`v8sqf`pj z^X}itR`2J*>%oqHEmx)1Q(6oC5E4cnE1JLw^n{gg;@>MrGeYJ=KDMiHsF4CGndU{D z7usAB>@A^?S9CIE#g)9DjZ?PI^Z`V$8q!+^y++SUuY!YFBgT+9u#kkIzT`^TY+k1C zG4LcL0E-`f02?89y!%OpKBSDe+aNCw*RYGZUOl6YSyXtcz-7WKXNyygwxDD+j(E)b zp2U>w6dVA!M?$&w$Oo&Dg4o1wGf3o^^x>C~2r~sx5iVzeIsqNT)pgdV7Xan&}S%qLSA}E26Ja2r+O_fgkeiF!@CJ~6+<~XajHBGFX_*5R-)Dj zcvIVRRxgWwO1JTDjXXu2vmPobNLfkO3U5p<4DV)jfpDgtBJl{z8oytN=u*9s%=(0u8CqG(69KHQ9hifs^(KBf+I$+ zd_r_rx3R>!X_7H3L${8tU-J5L-uEpAlBT%RI5O00rV^6j1E{qa$dxa>Aw&HLtat~e zFLGBP!{OWuxi0v^gQvVzD~9RWCUb`kZQosN;p_L2+*!kgE$A{R(+lh6ri2lI2n(zw z+qhm=VKenChx;%_L$Fc(n!Kzncl$wXE8w=Fj_qv?PvWuNpD>d8lU^<>?;pTr{>^Oe z?0mc3y7+B+Yt*w4G5}2(O~2u}erWf$=k0%fd!K=JeG=zkqy!dNR{hHZe9>I*@fCrT za&gL6>sX_q?|GlfCz#r3t{hfUJqFC`PiQ!0FBrWBQ(rLM9leO5c?j+CZDcz)S zk18PE5+1yHJ7gk+_9jSwZ~lgQl^Jr+gPp2Yh?AukF(F)>N{1Y<^=o= zi@^eUcn@3T_^BcD3E*WH4*RKtyWsxfU;K+d{KG#iVzm>rS#{Y*DF;^iZ~Vq@^sO*O zVXhFR9iCyeutx#B3j4XA`#Jpnl?~*k=r{bC@Q$4PDWCEw-}Fu2h+))1cMe{TQMQ)>G1=9!54hNcYf!0%0hVf-772XRx-{hlmL+9{LIh%Oj#35(M&um z_*Py5mzse8#^3lGf9LP~o%T9q^&G;9CyfAp@CSd8YxqNTjz4xC@GC-)Q7dKtNT--( zq)q&*Jj$mc+?M%9{EdK3*yr#q^tss$$%Wy47(7sRltpp7*kGHz$0_o)6$TAq555qj zDSN;lFa7&}|L?#4^{;nE+4lBB0h~1C#h;n|6My1QFoc9JlH2+{N&d1cy*)J@0vs1I>zfU2=TfPn?IDu)S3lX#d{d`+Gh}L#vot*MT9PV=ONUM$LVT*v9Cc z20Yk>^}1CsPX&B9N;*(%5o!F$kNn8H-~Db8OVtiLS0I@H%kA&}-M{Nk2u@a&wS_4@ za<2m1VSb}1UrJCd_9de+%LGz;``h1MxmV7~Ja<)}jFb5Y1KS8N_$lT1#b5lz+;zVe z(gu8Cn6C|hQlp&e$)Y$n$U6_kDSrL;fB*L*!B5tz!%ABudW%ahU&Ztecn^NM5w0=Z zSr$_9V@Q@DK`zp7%23M%4S7s%^gD(lY)n?FbC``u!wq;dJZW+tY_kE_W>drX^&@NoxYf{k`XyiTCC;A+Ir0>EkWZ4peCR_TYTH193ANY0C-JXz zrA*)VzV~^_E7Pj&9+K3#`rI~OZ%f>QZ+qL@7&_&8FW5pvwJv%A&|4tA*Y1Mp_zL_G z`WL;RwmDQ#6Qyv)H#ux#m8bng38~M7QrjRKs#H5wE$lzHEMGAIuv#58R9_9h1{vVs z;FJr5Xdzp8UJB`CFnPpjJ%$j!kj~*x>X{VG1m92$gf<7c_{ULHV|$YMvJ%y7Xyh`@ z@6>ZOZ%U?)C-t-4h_hE_x(9fq6p0lplwx;|fQ&J%1}?;qH5G(0OajA3Cof4mTHhphPPUB5)g!!0O! zfvVjIbI4xs%0z|%vb_L?M2@zXifr>mNS-hnHmlaHrCIt4XKHm69x{F9CfoF;R^&zw zN!i158N9J=m`S0oQB4eB#e9-{OlGznGgUq5lyVHot<T5<#Fv%sY*0e zgHSWnHjYf~l^e{tA=`6P*XZwTUch61O$sn7qxYDI4TIaoOPt~yDthudyfKjhUqD`i zDXK^|E7EXPl52-pk8QjgjeJ>vM6$l~KRX=jGGrYfWPeLhRs4tky@xv&ECuQDOkypbtqqRPlY44fE#wowGRZph8;OO$~ zhU)qu+FU1OsA$Tlt;*{;pFL9DDxH2Z62=TSAsx`i7MMuTZ(uL=aO1rIQWpFKFv`(f zFFcjhUid^b$6~cVUZRpsUB=gq*-j+)snm^LE(6B(1QUMrCx;g}fSf?@z_cZAtj`0|h1W zk)yH{=e!ZzB)boC+)ed1CKrZdyTL?tLAe5u#IuiWWw=9ltNBLeQLS(e?Z|^Hsu?~^ zp&<1ovIaTI5t_|pMUtlu={IaAO*Ra-8V-NVGaQn=W~QzbV%S7ZxzSu;JKTbsI40cd zSuQwOrx4ask`sz}hO5Z{Ho_kB3^Z$;fG*rPoSw_yf!^;iPhdc`1hZ)ob{RmS8w%Q&Zy|=73(_zNG1NNY-odgdFqx2uHUs z+H*8H+S5KozkBjkGmZ+zE$E$1w_tAyMW{F@fll@~p6lZB?$|0VJ%j zb?SmiFo3Zg!4&yM+ttzi<-D&>Cx!%5GfN21?nQ)n5LpVcLHJS-vG{HvSaJ`m72H3z>7b9=x%m|$h?TeljB(;^epAtv*b5$X=Vs;t_fxW?j;)}r9&TsqfMU+ zFv7W(l^$S_!@QGNMO9F6I$Th4<$OiYlI!{BCkQXv+c#U;TvyvS3uh zXMIJLW*o6CPO}LU_FygxdDjoj7CZj;c*`yN)x%aE*d2tG>y)|Wc>G|lvr@Kdm8Dxy z-7F2ZhU!M9(HJI-uhcRf&ZcIVK)Gth{GgJYkUd zWoj!fezRnn3xC%aRen{YbtKq7l-jIpJD{?EoLsXim#_cs7G#SiY!h- z`T&Myq!+&__+rbX9{~VsrZj8=ONf(9sD*zrI`RJ(-V2_Xd{uRivif`s{XnFYYA7qg_$Y4*^}upwzKU~FoXaR4r~=*LW-jn=+}$|DiCJrZOH<;4H0;3!AnQ3@3pLD?C-nn(;6lZ`Z3^&e zRk!~Bis4DyqsJF4{BukGq&uXw)?0LdhW<4h z`%}!~*ZiG7fBo_W%NI*_j%UzTv5jSFQp#mbMi_0f{s0pXsrSa4KU5E+LV2) zXf$Et=P{?qr9jyUkX{(9xaJpF*#6Mt8b(yX;s;K^z^Yf(l#pPQD|kXWDZF|Mo-E6Y zl-6u+z65*4I#p%mwxUYk0uWwgybQwYA?s(sYzWV%V}d@peY04TQ0F+=}~`A8-xBi+GO%yG640kIhM8s~EPa0*|fmG}o%W{SS~A zevgwcR4LmB(u=J~R7QeURyEA0yHWE>9vS5 zYNqa11crGThL*cMDKNR@f@^2##Lp_dKCl2Nf6cG?HKh|F4FRU?#vHAwQX@-t0=OoT zS8u_at7MBPy2`4)TH7nGD`xE><))0KMVjG;dKQK-4cJ=hv0-jqEj-(EJa&mK3xK5k zO^#&av7ssCZFGW%M^8DMi6d0w&a4gUEuj50jxs;Ve_LhVxl=~8UiIrWJVKH?070BF zx4Ac7Cfbeu<9JvdR7R7&DoK`L+gLs;RSnx(Qy)T$yDo868qCR}%`C%{fV^*}#%iNC zbfSIiV;{4r#Mvq*=sjHan~az{=z9=KaL+^2!EN)C{YzW^)hHH>grq?LTi=moS2QvKG(dT79hg+0~4P8QIsyx{m@Fk4Q@Qyd4K7|c3T0_%(LBsry7 zJujV-h8g1FOEc6k$3O-q6L<;M;}PKgJ!V_qk;JLHkWAxo6`LodIC6eRJ zwR7%nMFKoL8^h5j%@4W;6V`Z!c_S3bMtRL} zPrk-rHN|PUZ8>Zr)CBCLqp|Lk4Lt~^j?dGH&i0_~BU6U`<7Lw4t5&E_Mu$I86{h{x z!D_ZN_c33S=}U(Z*pL^S)Ko**rU+*1)l+IPil$;}(v(?B^`wzab}ux9gUWLB7g z=NUKTbi%lgfQnOWg2bOW0BplKVXS^fNjRq; z3_xu(T+nPBeaClv$G3m`xBEv%+xeok^o}rD_-8@?(Lee}dJmc$+XetbxC&_fdx3xY zPygv(`lVk&1%|=Hc<#BQSE8QT4q`jm4)5i{%KSj&swbEVD9&&F)^GiRANT<|s;Xo= z_svRw!0={OgYv7t`m6uSU->I?l(mw25#VtnD}~u$@skOE;V=A!_rCYNDsQMbFn2Ca zG2^Tu6t;id(Mf_|@FKLnypUlGYYYp|EAM~tFaCwS(dB2>6nxC}Xf@`BAN}Y@Z3aJb zW=Y?K>eR;cxBJ0{y77=F+1 z`8~hucl|DcA)b|grLw?c0QlQ~`)`xMwAm#qG8vnV=pgtVzvFjsaq^xPMv*Xq_n7qv zVW#&WwPp9@chE>sNf|0;?hIwbg*bV9^ytxV`c1!yupyraH~M=HZ$sPSZUegB(XItHnS1qdz)JY4ey3wqd^25QAoc-u13`efYy4?u;s0 zt3c38r;rSR$-n;B|N7tl+kd;4cQ%G$utGW{a}1k)gb#e+0}QP%Bp0SM#bJ_sWB=+c zcw>nUpVFwQwX`r@4^>&wHF7K35+12A3b{Xn%BGr ztev@GXqd0OjAjjBtWHKUvnPd>b^|cg2XvOc4d2RIV(;qg1j^RE;7^8x6HhNgdn(7v zKINH;9HGXY9!dRR9-1J$LYiunZ&gymxyT`F@W4{@{F*ImNRJYI)h1|^OyCI$qD4s4 zHiOCgoqJ)h)oUWxc+q377l0{B{df_EW=imorizCNxtIwxRxk>Z9#vqo3%e(t2^A-ql1WpRkgOlfIl*C(`3l%;%%&77 z=C&7KnyGOFlO{GW8hu_&*=Iu)=01HPRj95&E-FG^0KymwV|;;Wrho@9vm>0F%CNkE zT_<=H!OD_psy_fP)>qcu#02lUfD18chBl!5& zlmEKcz0UPUrevbG3c!UYDvhuI^M6<$g7iU?SK0shKmX^~zV^dDQS>^x7doiSiUe4k zSslvv}l% zYyg~DSpxE$bdhWrRw`4PnDwYkp&h^oX2}3zP8pbNipN1d9AS-6RECpd`BI9!d?)K* zlLcg@R>_njV4J;4)|4I3VLu(qHJllyoT$ddH3Hl56~Bd`6#oRgGMh5gO0aEUn0{ut zCTj^?z*L-BQ?rx>8FGgE$RF-4xR3RLXj+wmxlq{$6743=!`^xE@${hLoM0x%5oT(H z+ZMm4#Y65<@qn$*rz3;XgG$LGW=8`hU+^o~&{NqS==gwPk`>t$Dy{J7eM*U0D{@ob z!1**!@8?^;@C(1-3iO#3n747i;WzvS9}GfrYUtEhKaLiX2sM`wX0IW9R`&e!&-+BkhRf(4HEduhU7}* zePH7yLCp7Id&ah^n#T#AkbEJMa@605TuFdW7U#A+E9V;gUccAyrS0{jIXQbF%?nd; zzIqEzZEq0vrLVX*mUwutM~=w_VIR*0@McOR_c7nFy@G~w&^uXFz)Kl%}PoIdw+WBue${-if> zE5N?!TY; znVL)j9nD2p2G>rsgYb^!rFw=Dj>@8^4jCWLy14 zxQDH@Fq`3ov8S4;z3}QSxUb0x&06cJ?+7Oh?yBNw^>sbXmB9@8iXY|m?p}$=-V8~W z;MzEz_J_{V?_)`KKtByt85#+?SB~=GVq>C#b)C3=3|$E{1b_&;b=)+4yh#b~Lq*@_ zaP9e?o^Ocwu+cX>y%99krNW#Er@kDkz3z3NOwW54q<{%sMUaMOh3!_;T!G$DinA|F z`ud64*S_}k*fg=h3nLdu$lZ%LSsB7>WSsE&@W|-}W=PK}r<4SQ`eZ^;=`~a5TC;lY z&S9Rq{#p8ZNrSI?lg?(ix^8OKkjF6n9slcxqej!o?!?z1&AKCedg}e5%fr3p zT5^qPzAEg>asQ>)Gj~t0@|AQSWBQ4j-u>YsaRs`lH20sI4+%%zYB>9m8$(WAoW2?B z6VbQ4*_7udVs{chfW>6bnx0G!PA+zEzXu=VP# z0`+F4pfS<7?#kpvlf@@}(kE4``bxAiyehw>6|l$RCs=~SlDhX;?l3ovYs{yGE->KC;d@_&0jHiV zrR%C8FfYK`!Tqt3{Und*g5mvbZ+qLD-~8q;_<}F!&lE81Gf6z|Bn-#5Vuw#_Ya$d3 zeS)7X_B#^d6wC)d_`xs!;xB&v>)-I&*S?kuY+z#O%RU&$m^INF0%%+ybZb%~k)Yv! z`)~hEgoMxk{Lgol!k8UH0`p7=vFXpX3z#?=!i;>5=i^deF<*+*E|+vu?S`#X!E6Ax zjqs#7!z=0*Db8q6xLb-%o>EAmC`_q&!Z(B@?Tm&4nH zbp3GnHzrTZ-8ue^yBmiNdRIbGt(;`%xI#VH!D(NJ3G@rxo_2Ww}Nc5A- zDu8Kb_3e!f6|lBWK@NtYs9Xk=?hK`{psoY~Q@RMfIrDQhH=mCI`+3{1_!WoWx>Gl_ zWyGogh8Ek=?cpFWr4cAKhRLi7OqJ+ixK3mpBvNuY!w@D;|C zwdPkTBzR2Wg~hF6@cYIi6NXXgfem9=@#CG6i6L7Txynf2(y!oq%3?r{tZc@Q$|u=seH<(JpS<~ylY+&%x0@B zg@n*YpwB=5{7?MEPk1%JqsqXb6;*j*E(VTFO;0KPTFAAR5pc6iFbfjEx`@!MonvT9 zFtX0e%8;C407!(FH$SHujMq9|{V?fO8UPbP?7k&J<{KA#%?7X;;t{I4DUn{eM2O^E z{PCCjP*F;JhO2Pfc*M|wRse?B3TdSscc#d}Yzgk#NCVykfY#GtR;JN7kWy4E)G`1^>Bo;)wfZU zm|X2H2RRt2YUjWRMF;lY z%eC|wpYa*)13!}Vc97DnZPuwOP64oLtqJ0!)K7%bvdUM2i_p>k&ENdZU-*Sz_y_*L zJAJAt0L{H}a;5S%86UqAZ zeI)aqAeWgqMQAx_kn1UvvF%&l1+Rb|eB`3qgK6N4ftO+~S$z*F3~ZLBmsx^O zI7uaUdLa?CGF21-oJk9c0hqG*>1pB@38Bgm1e1%0cnbtytoWxTCKg40JSR<}#p%_0a%*!EOgRAq zOVj4I#m|ACf!=1~Ma(vtc-o7~b=x{1VPer8#2Ox)6=cm~qcL0^t+OMC5vK^fAy6(g zMDDQgzQ=vwZ?Cus+y@092CZ|Mm84`-*)d?Ntx=IF*M5dL2fqom2Ux8f6W)0JyMOoZ zgyhSj^pGCcE+MqS&?p6?2}ArEnbJ^rWJp$o>QAqXrjYx&qYr!S7QXzyrl|%@~$^XY%Kx)IoQA;oQ zFlH0#OH+vi45`r|+`z^}s8InBG`3Y~oDTSIf*7igkV=qnj!FOm=DL^-A=e6Q4A14Y zfz1#ha$#gBQ&+MgT;Qo7F(en&a3;i1(QMSNRaqd{Hekb$tmLacZLpTU{-lX$&9be< z!`yI>Z`O{gssVs!eOXO~MWU%p%8B_z=qEirOQk@?U2%OvlRx>BQ6Zcs`AQyj(5lkj z#3r#Z=tXOLvk}owh`kB~22^+9sJiM!e4_)=PsJzbM_Y9Xc(m~~y zRaAyANnOU9^?J90%hV79Ln)jzyltFHr!wk{O}<{|^+xQLQD;5OQ6uJ=Tbeb4h6 z^BT{-XwBj|?Ahas7=J=VMy-fl8^F}cL*8f(#!n97jR}2)a{MW**qo$pKK~knPb0k; zg0~GE89oNI;+(>R$;F0r%L}iJPyv$@>T_2=Qw;&ekgR3iein?7>@G^X%Odjr+kV?` z^BeSjeNY${daaCL;#VJ^+%CEFl2y88ur$#PJ_Fx)*|M5Tm$9{D+nG0278+eTe z8>M9eNCrC>cIJ9v|A+tZAMhx+VDx0I!d6=_go>cqV@isdmq;GsEhsXv>g}W-`>`J* zOeO`r=~cgtt5-p@l2nBaY#ri<(fetTs`V)5bcKzqf(R|VCGii{(pyVb16YL%JS%Ku zR1>iGzGyEzKUu*z&WcK4%pC`pQyzCuT_^xC_{`0VeXl}_TFrb ztt|cC>SQ92C-s!#5u|FvsIbSt>U)5>qX%&EI#_!z;t?u<{6 zcd2pYjj2DcQ<})>GmmQR$Erw7F-NFhVIx;$l|(BMetYDLs(!$PbADIMMs~#8MX1!! z)Nvs$eF4?`E%8+L31c5gUc|p~cX=pH3Hq!Xpo-$^bIRG7n3P~ zMpHk+QGL*lA$e^g!6sQ$Fg9Ttm$4t(dAsJoLn$;cv1FhsZb5e0?Y?`%)yYO(v+om+{bTx;~VXKc+6}ewIZhhORwKF z{Q1g}o-de^El5KQ-ndwx;iSxPL)cJ|2}KBrFc*9L@Nn%}W6SR-;a5X?x$j9XXqc!Q z5{6t5CcJZ2Oe$KwSjl}2X*IlUJn*W4O+$-Z6P32olGDtJXUIf4Z1?!g<0RVy91&VI zCIL1*{*pz=7MS6HS1&1})lYb=F2o}{U_CE20YrsiQ@wZs59i}saK`LeMzKj|hASXh zuMOay0`H$9B_z(YK7om@~1kXyqUjMSi=_6=`@-Iuc#m(BPJ`U;UI?nnI zDM;_@fK>pvDv>o;ri+25ivgxH2$iFdp;z$&_>I5uH}cLYb4rGJFPBNAC7T4XflV`% zQEBo*5MG2#3QwOo0N-Q$adQ&Y*~sNtAwhNHhM6vhN|A(D8?x1OdV+|Bhq zuxLxLm0F#WFND_vIDw5JVZs~p*>Tx$S~G@gItFpTdB&@b{+45*I}@=hgku` zKl+uK@^-I!R=QW^r(1z@%l34=T+jB<;@L#*X>m~Mi<8_Lw1!Qtu?6rrdBfq{cf|V< zl%F~~BLFfqt0AP+)>F7Ab9%zQO?ak~_rhQZ&GMcs291(N75=snFVF@aZOekm$o zqpwfJWfzc}2V*n5Y<{cRmASLKP&?~8o#%XSO0QA67yw*^-Z}ZHhM&C|x>3Ym6G>ph z$S1Y|jL=j={U8Z5+z1U<PAB+;c)T{6?i}}Kv(}x+~t5LmLfpZn`#I92f z^_}>p2o7t43xMpb*IXw)4)t9OQ_ghvjYFSo3X%qcp|^ufhCg}L%v6G@T+fh38(8wb z2RJGp=R)RMNWB$vXZys`C$~THBR`_|MM|-8~xu{sl!bhWiI{4PNzSZsJTR+|+`Zu9mX=snF zk1laPZp;;@9ss|FN)Lgs3)oL0ar*XM-;1fj08I24VkfM_ln<(3LlxKzA5@S}F_=3i znBfCo&8JwXp?Z7^wz+9X7{sf>v#G$Q@^<7#^K8P%3)lDY&i2la;+1J~;ampJS7)@L z!<|NJwhJS@_fkGx^h*W(l8NIUMswfj-7BsEZ;Uj-Ye*)TBjw`@fX|ISp%Nv|I9BP zdPD1HdoFk`jz45P+5g@gGa_ zxF*2DqhX6=Q>&7F;JvUPc!c)}ucf(?A@FL_nqF!CaR7Vaz2Id2@x4DD;F>+Hg13)X zw!P+V>EDWHHqvEZ6X!Mf4JO-R7)LZ6>j?n_Pw7WxVBS>uEYum{gl}NYn4XX)V|N-=)L7jgTysV?~)Utp-W41;rWQt8(CMld#+C@1?=z`6u!aQTk?rt#uNM!7Z1YY4BWu`vzUs$;el>y%Uyb2Z6HI`W zkj4;U%7)4J>5I1hK0F)Si8et$k#CS6Ps4J&!_r(+pQpY?FIVMXxCKQZbM55{G@iMc5O6j-;Q`@?6U{eroR(EX>Gnri^K z4-%QvZ#X9%dPu_+u*xfP1DmM?JPi5rVI+;)PGG+3>9!V|+sI|+TPp4$Ll+_Nzxg-+ z#@~DML8V_{@TLvMZ^~=lvGrRM&pr3t5B<=4{IUdF%o=9BThLp$W8#Mka#Fyl;a3OW zg7G(N{5a5;V!R9Vb4T|d6AcDQR!`Wrf1BdS^bijafk}Dor64KFkH6L$)lYVYr9YZg z*nromSFU_6-+i)=Z$T3t5)YxAZH{F9Nurd_3xX%de#**l?;vpem_3)>$%&<6D@Z&!=CN3UY%}i!88D6>8v~l##{kKRY_&tM_a4O$Q(hcB*CFW z#xS!d1<}HYhZUi|@CLt<0EmP}o4nx3GaSP-dRd6aO0k;RRZdwLCEJl5X7x4Zt4S{8 z;_ZufA@HcQ%n6l|ApQ)QG;5epw8>zafF-M;HH7qKm;doU{MGEA|Jk4Yun4_pVg=@Q zK@PxC4Ei)}o_6W6+WdB>9^hbOV$2Inani>?uN?z^9K4XlLb>_^I0oBArHW!ZT!dV^ z$@G?>M3l(%fB)~lqz2#eE#Le_U-U&j0(Ea;k}S0CKU}y*4DLB0+A5*@dV16!g)fM=n%9ee5kDfUV1l7c4R*%kfES)Q9b7 zSR;otOkkC4NN9+G-wcB_8?s`OpGw0lL6s~KPI(tbkvtU_El{*2BD)I@vPf(~7{z?L zk(3VCYS`|TFBcq{N)~4|rzg}XnZQ7fV7RXm0De;pZ4ZgqOYzgtH2Q79g*MrB^a0N)Rjt`qjahP?F8s zD;{q{g`=rJaZ+l*FlW2z;}4S+nUykmVx4XTF8rA|iS&?f7#ik?cTK)}cut2i+F-)~ zmfRNMD`ADjpwD}YZK$5XRu>ZtWldS8GOfsXUj!2c3I!abt2!LQHO+$hhAcqhMO+`o#hJ=+CEN1%Rw;ai42eXk4 zb4OsMaebuq|HCUqh6EUZgX$QVFnk5(`RAYaiKXU&qETu=0{GoQci1@U+`%lovO7e4 zTr4K=+`+s5d=To_FdjX6jcu22M+_M0ig0QJMU8IC?7{uM)3F1-|roZw(wF)Il@n5YPvFw7dR zk+1l3dbVpwV}jh8b_RMX`|ZzW+hccGaWRa$PW`f4BuLLzxpi8zwsY_Fhp$+Ir7^ z5^jg!>T;DU6RUhFgk7@dXEH8U^9!<+4w)U#Q?zBy(FH0PVF0rt7)p7+KgMaZHo7W} zl6-XgqGz6_c=Yz79*hg*NX(9TLK?Gz0TZ_K$P>$!T+ucrhEc(jxlnn<1kUvaPg#zR zOH-CiBJF@-n81o3KV*Nznc#`SFQoJXUL8rngCTN_VOA%Rrs%ouR5BC~^Mc_*<13Gf zpfanY%=en{C0{uLutkO06hgmy?yrUl&ri`*jJuq|2ml~W{H6$cYyy}?gn=CI%>qzr zJZfgarkMrHq#*SPDIp2M03&m1F%7$=D6Omj=Qd%!swK;C1t%jXOo9c2Az|DRG)Pmtv{Ez#!yD_c_e;ZEf&}IoW-^T`C8+=5 zSXZysuU(iwxC{U`4VTOr18Ce}#L#jYQf^G7VP}{^ZkCK>MUpor`{7^+TCRgx6@+3I z19BMw6wjWAMi^%GWRb(C42)SDIT#l-To`IhR#@OMnGXi-LZ=M9inR%ju|HmE`bf}{ z^?e)ALo17kA=>GAZ-2nUK(1g;I{K)KVN|%5CZi)cvaZkB(`yb7Z;4*C{pWq^&8kaR5*A& za=XNoVZsW#EEm-Vb4>H`dpkcP5s#cxZjdt!V+iK+A74Nxx0Zu3HF8M7;|Eq2o8A#~ zF6BxLDH4q#jW+lpr_ma!zmK!LJa^dHGXTg6XrWKjd)yQ(Fvq$(O(=*Dywo2ch^eh=-Ne3VeCG zz_{j=Y(oM-j%}RN7l2uNgHoGnvrWe42W)&PEZG14--iz&I2EmLRQehuU%cz9xn$Ye zBwot+mWoS7Mr6$tTT_~tu^IBtZ?d`(L~d4WX06Ty9}+l052GF8ep1zHh@YYOF(5P~ zpp;*JeYy)t`L1`p%b(j8A+WE^NJpmrM5+X1z>k3y0541!GVyj$vrIOF+0HdnG+Ggk zp<(S9=^5+um_ zB+oe|HVp9(v!Q06*ri<1YhdR{=*`+-_Ek%1$V9&SlU7yxm!6iCja;U_NtwEScvyTX}8O6Ho)Ntv>~WOCS0$VC0TAoe9|Q=vyg9n>sy)cOT4kd zFDAM9RLYaaL}Ua!AuHToUU^up!vWI^1{D`R9cuBUK(o@0?da9lm(JZiHYF=rteB0= zg%ig=+~uP3&>F7slt_J*ME>Xh{Gb0zf9Wsb!LQ;ihQMM5=2UNriCG)baYlg0Um_F6 z2uxJc$^NJQ)Svpd|MuUKMG^x{F$6CCT)=qkPj=jQXxa+FC~M)B(GVi zrlJx2doli~rhkP|R3b^wi)K~}uXKazi3g9oG)2x;x{DJV`CUVF9yh(r;Shz)9}bwaa#AI z_rnV&ev7KL0P~DWP;9{X+f-31Sjq$q%+UMV zjyxKU@P|A?UeuX=(fG-L$rJHK|HtF&!GG+J{W0FzO4*{+!phSE0)2-GZK3iMMb(N|_#&Udt+3-AgBGIO)-s4@^RF z;6)L&9*icEeJE)dc5Jz&$iSJCwfM(Hnmv^SHkb*onxb_cNrde=lBO66KneVTD4N!? zRUg9<@@w(BKl~L+=4?3~N5F%xAf}k;+fQrClv;RH!2s+Pa$&SWAvZlk!MmRZNfSTh z)MTt^YTj(2bs`j@z8Lfg!5CtO^!mW79D-{}iE?K)@c3dyRtdH zAZZZ^ir|3oj71wixwi3csL5quo=M1DD3n>jBgYA5;miWlyJdN?VJJ<}w=Dxm+>mX- zxMPBKVYnAPsI6B!1m0BfBady0W|&f+kcJC_@Cd*P=#Q7R)978jlzv@;3m?-8fESw_ zK;*qz@_GnT{Jo5z^m0mIBB=<-0Sq+)03NhV)Jl^hji|)Hke;EQ9$qWp%ACP=hkk|7wX!b*~1f$BF4FlI3ialEu?-NC0Jcx09H~a<1x&y zSu#yw*BjD{Un_WC;-45sNRJIUIj1-iR;x521us*xhV)|?t)XU0BeXz-a#`1lt(Fx5 zM$fy*(-X>iU=#TWykv!$tQTGtAQVa7u~n|I9oMGFtn|rE(ICguN+GvueP@KyfuIf< zcArra>>T(4!@$ZN2}!QDdQ0Q*>fnYWnxQ5^fjR3TyF%c3=S9P&M4DOG zr}x1w^|o}h(gzbi0GRX*nVY2%Igh;1Xh(-H94m$;IKt$+3fa;GizHd5$LJp4B|XKf z?XBdBya`4YG^Wzaj>n$ z+R4{!buJRUDawR_-6-&TjNV|oFgrPM^m0#MImsizuYp1!Jy^0C*KqXj-(plIVy%tISX=n&NY5iQXl|hCQJ-S z3Sf0qQZx+1BWDu0z_OyRnQeK@l7$z3rA?m5F=)(b^v#ZtulhIx=Po_NY-Pt?9%;-* zo1xzD=xEMHtKk2i{YSi&N^Y4#}u^DaQ$K zrU(VLYR<`(qS>gDF{qxNvY!52oRNf2K8HLP#^@&oPV-m*0jynu*&0oNCyIj=Sui21 ze5D&@Q`5uuxS?8CYAtxQ+)?T+dZC8b+k457O-*3P$#%6Vwo26STs#xlIYGdA2@p?} zZ|d=0H*IVJLQm#6+@9K0NhHcG?r z^@f8d3vwN1dt=Xp_YCz&Y=CyZzQ-eG^6ZUq%|tVtkeVv~9?_;E=>sV8QTf;qL)V)f zs5vD$0?1>AhVvZKV1|KA@6vL->hWlD{#i-yxXlu zF6dXx$dQOpBNr7~!iqU5kCISGt0o!MIyC_&tW$&E2o3kh^!k-^1Rg;6b?WHqg=e9u1Micz zg6ZJT#gnfKJ#(|gb`tjZ0SF=JVgTjRLvqq4C6m}MU}h@hiYLd=LpaC_v`sPG6qkO? zqaDEL?!+;%O2ejBy`?|t z8nS>bSpusSJXSH!aL8A|8sU*U2KPj-EdYi&`NC4>1#D8twmw7rhAt9sk7&k(6_0L5 zy(__`VpbDO0)WOApa+3mz^*-42qeM#Lf^FXlLlWad+xdC-u>=(y9>>l!qa=QsPuWC z7%*U-z{KDOC+~UBd;ZIR`7hpR`s#|$Mg1Jzx3T(VKA*vQ3+PQJ6NdPi&(GSc}o8d`;I~eXX!eeJoNLIF!<`2$WtCC53?hXYcv~^Co?zve>FVE@c0%4oj|b~>gQnE_z4+iGj(A&E`%}- z6`7S;LJx47lTs12hcYELCas;rBNfkXu_MD&!HN?|7k zL_uu4yr1=a_Zer_{I9k4dM^7pr%ujn%su9qzwsNFIsgB;{_FB=%GK$BS6@dtD?D0d zkKC}kwqeK5k#Ib&w5w8mDxI5q=8g?um|BMTeJNm0l#qH&7%+s@MRE*|AG1yo=4l+I zWDi?k{_>YSvH2dUFiaH#VW^Vz0A>jtX4Sz*g9Oic{zE}Oco2zqN4*W}MD*Qse=^M{ zk=}sCkFe7Ve&we><#6`}t}ZAVfH1!CG$UN%8Iuu0Zo^CFqdz(tO;q(MkNxlv z%mx_cm0$+k04631rA0J@Xv8)kLZa3z`8+`%0idKx57l-`jW0AW%{ zx%JKFu|AD>S}%lRrmO-fts#xZwWllR4Y^GST+2~bW>**Dq^BV`utnZmnhq*I59nJb z%zZ#uc90s9I0+*=GLe||JV)sqMTMtQ_!Q7*fiGXa^uYSv-~HX#JiYmO0}PE*FuVZ7 z%)DrM$(@V<(afTKM83@alI`Dl359NDgG z*4W7Fkl`9h!|QA_dzNa*M;QDi;qeK^9MAYAq*?i!UHdhv6-hqJu;Q=CD;3x_Ts2J{ z0TX0l=(Q^zuTO3KhG*GMr{J_ZkFQ*A_Jc{dM7P1#;YJ=m`4a2q+Hoy@!US2B<)ryQTU-U5Acp=or#Bk(QxDmFRZ1OM^ zfWCX8o3*1$58(bzPbO^U4cG8S#uL@JAaq=zvSfw?40@-a6NSglk|8mRg!ge2+iZhO z94by4=az4{0Q7YgUm|xL{^U>oq&GHwW3w-P;E7G20N?&8Btz$%@1Xk)rK8Rv_vuf6 z+V{o3^rbKHbQ~r&};9@<#a*0~ga!SyVmE z6?}mF4lIFT`WPsWnhhC#`W3%Yr5|^L--JAFu;JXm>o5~re|A5OW~g70ua&vGqj~jt zm6B@Rlu^wrWmH$f3m=Tk1Q=B$G#oiUW}ETc1E{;dbIU2{IB`tE*O+LN!rSVvS~Z;X zV0z4k{5lIAOK3G87CLFX_vp_=^r#mY?MhzO;)w*Cv(pji0CWBc8?(>wO3Fui0(Me* z9CQ$ZG4zpV5e{>)>4lLm0JC~&`cM#qSsJ|t!~2*MuE@bxZwvg438Ib zxB4CV=soZnA^8ZqC8{f4#{AXig0?1=t=aWJ?)n_uDilrq9KC;=73724DfUg5qs^m-f{F>E9Rw#FwjRb(EegbH?A~y{lnrXQh^VRSuvzm~O zvuR)wLaxefsyozK9=0vt8dx#IPZ(!y&noeBn?|b{YIqzZYD+_|A9I>~rCFUe6-gK} z{#raV1lv4w$vRFPfiO)C386+GIHBHDgbpFHXgv`IL*>!Xxdq_Fa+vutOJ86Ku=Wg1 z!7~>IHdbHw!WaDD0n9t1!XrDn&=NdWI%vVPU-N5zjrU7^uBlvesS-4{Ma7&v#f0R@ zQQDKMsk>^tdc7<)jiKI@mO#^R?PqGk(>Jw(M-D6(AyM)keq4-@$u=CGD=r3;5E4&R zh9eB}$QEV*BhU{a#lN|L*)&5!h$qb|H+9skwyRw595E@R7}Bgra!R+eZa47WR_eW`vMyj$S~C9b zYldVdYNdr)`Nza;ktjYZzM@*e1(T)}^dry@TNuLxRN}$uxq)UP;W5DUG3dKb>5HmF zz~WqEBO{!tp}H;zJ3~=P8JK2FOlgK|3dJ^<5yG4b@%B?7!J*|-AT_I*^dH5epZhk@_-Brq}M zxb`eSoP%5n4M~@m;sDnHY$#kr8qMucYVpolxV}OgyV=3 zXL|;07CQcB$8fwuuF8#VrV`8+h9L$+)f1a41&DUYfrT+9Fx&wLSbb&wCi>M2zr2f? zqhfBjV%8W&KZ4m+UcqFguzzq)RcW|mGAU1Sz*NTiG6`TRVTQRgBs5Fb7-Hr{BdlQz z|Ejzsql!5IDs2t;v^fNdRO5_em&c`7ufqbFp`H(#KNpRa@t5C%fY~-2Zg{*g{lOX&M(vMYwf~X8VBo~GSIWSXN z!@)r2h0skcz*r65Rq6-?Zu|0uWCb5(`LddP^Tldw1yFc5_IyXibZp1@I6N|uph%r`uJ4(D4lwgHd8 zd4c3B6YeN2dNJr7evkx*qKgp{9!!h;#fum7O`Opem?7E%b6&E=tS5U&6$U|Uh0SCd zlY2FW55})f#U>t`O%pj;3SwT#MLUgtQU*43NvhR~e~iqL@Ty@wa$9I(7Vz54GO?Ge zk$51@k{=VpV{Cc%ibqr$o`Mnl6mS#dc&V*On1;5HJ!#mR4O~ceTQBbD>uq~w>7Ii@ zJo@4}n^IO#ib>h!eT})qX$TsIW~C`ddquLn zqF1rD!gyJET9uaBFUGuJCtHqL_{hh$n9Wx6>PflAu$qv$b8))2ip>?`L?o=3Ax~-l zsfont2|c(NUNISl8wHh7d6nr}t-r-~N>^S?Xhs=>sYy_Im2?immdgdK!d=gPc;Jsv zm$G=IsaH>iXX9CYO$?A^Ce{T*n<}S$2ge@)_nDt!a>Vsr$gf`au(}(bI=0R#;fYNO zz98db^mOQ#5~8BPAU2qnFJF2h{Lvr%Q5%4jDa-_6R1>g=2 zg&m8svT|i&V3M%9AGsiyxGXz+$P>!IM&NzqRhXbxwN%`%@IMUPOLn7{KoztaZr633qgwz!%_ zlzXAFl74;#2B!FqE1dq?xZZzeB0|5TFALyS({COevCIn$15Wr#$_ougntL>`H-1ZV zvLKXQ@h4x>&>vx=JUg`#t}?LLc-P2^rkA70T{4g@gxS?9SzZbYFIk3dA%-+Z@B=h> zc;|(!f_JKst16+GVVrLV@A|dX3!p^Asog6Kb;ydKv7O=6N3!-R zcZxGt+<=*gL49VbyW9XyymwwAClmBy=E8npUfIVrz}9A6Ha(LQ``tbR=snEb}ybTdmU%gkCU^MN>vv^ARxD+MkjsveQPF#M^;xG9<3x0qS zzt+nAvS0SgL@s{$is~#|mzgPmZ~o?Qw(2enH?@kenP5(1)`dZqIC=CNK0rzzAo<`5 z-ljRiMk5}j!`W}Y+%@bi8vS5aL3X_3#BY^lp&?l@n=D5dk09`Ebp55MuB5in&QP_T z2gt=nNw^nDV0|r;$X88?(+FOD6w1O$Txzx=y^MSbg`vBc=fzW9?w$f^2moS>Laf}1PaBA;0r`*r@jvdrVRH&{Kg!`9A;${++0T9! zsSHIqvqwQ1lrGxe|NDQxKakrC_=kVk&9QQs>%a$x#P{DQaidcR%slE@9zE!&oue51X>koQYH zbNgHT$d$;2YI|HimCsU57+WOta#RxmlN)+PV!QTeMPs%#RXt1NuT%p&2n8k*>0_9C z89W#IDyApTFz=M%8P>XVQAyA#=(!h0RDG04$%WYmG$B2}YD}tLL-Gs>{+rL= z^}Bx8SHAKUWw9|-(n7d)# N?;Y$F@vk?-zEvj^J`AhQirHis&0WUh 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 diff --git a/assets/community-wecom-assistant.png b/assets/community-wecom-assistant.png index 71fc1aba61f49f7183ce0ee292daf81c16b62074..b735f2ccc71020628e6840136458d7a602139785 100644 GIT binary patch literal 60324 zcmX6_cOaJS_qX@nGkd)D-aDJDWMz-YN>=vXdyi}qk`NNIS5}g&WM+o!9e$_p@BXLv z#q+qI>%OjYKI@3p(Ne+1qQXKzK)_W~Rn$X3K!pE9M8H6Te4~-m%kK>s8}~dA}qjbp9p+t^eZk#Yyaku@W9y3v_ zVyQftBmqW*0>iEUrN!p?^>fO?WL~>Y@?czeA%oA4<;Q(Hr{4r46&U{5IUxjFTQCq{ zFcV?QFjL^Hmg@`d?uFgOC+&9(@1M`_o$0W{TORBOznUy-Wg&`HD2dTQbL{Mv&A$qa zpyoZTm({~H^~T(;MK&AI^4{h9_zH{W@6U+d6}OKIu2uS1bi3>9ovO@w>?C?s88>cf zd=w<{{fUW*)dn^2G2B~z?w`l^TYC#!#}1V0P~e~mQ$2Y8{BUccEK}W%kAlX5Vww7r z`7<-Kg897xl-#VW*ZLf7t*sK0lKgG){i_iXC{g)@m~op@w(AeajWAsAp)Xf*oU0la!eFh@HeCzWW7c=MrzK z>ffNdA5Bg>J3CX3O-uWC$tOW?8ehG7b@*$rqP)DGl%;!#$MoaDZo@bh3R0%}x_4Xf z>O1XrJ_3xs{{DsMgS0FxEQDwXtsR=I4JI|?(&wfwE;afbkE--}JO8?yn=hX2%^TL3 z*fq>4l%yz^`Tji|WP9+E1Ow%O{px6MzPa;ofZFG!K1YGj({E+TGOfXPx7p@?YV-sj zP2c_e`IFl9qt);4Rqib`lZvxxzqEO>osKugEP`*mY;4LDO86*nWUuGOUuzd7VIMfc z=gCxea&j_!Yqa7f276_~;nUuS`PZ7crIXu6^El&DfmbKI!Iv7La$jd=4E6MmhB<31 z^*J=Pk*7+=H`CS26-wOJhco9txCrKI@?`HMN&Ycv^{molwQ=G8R9aoVgCBg+JCx2w ziWND&d40Wf=PE>1T#ma8XySoOF+y&PcEvBg|^tt=ywdY?;?l(0x z!NFoppWE|>`~CLKeYq=ianU?fu2_%bS=*k7qt^*{qxHjwlYbW4;Na1dq;ZnO#>RGA z)-^SGjTcJuP40PLSL&8o;;OLY->#isQ&Usp(@N+Y8nR`ok3Bi|nlT&XmpbTmZQh@2 zK(Ef4b1sw#lz6Rd;{FuD)5~jbp^Y5>{4!v6uP&aVlbO9nj$X{`H%V*3_-5}#1(jv| znx{nP&Dnfh99F#%4Gx-%NS-FEq}#IG=~-e_mZPq`z%LQZzpDE$gv_#d1iv& zs8|Uf`?UuK2I|W$;p6{R;mGV!f5?$(UYos8dNaFz|JWw<>@q;POt(rOF9`Gf{NC(P zNw(!<=O&ZG`QOJY*O$?Qze;3%Kbcod#-@MQ$BX`z#>$;MXwxtUhihrSdCnQRU6cT$ zSOXOav3lzFq0fa)0vf5yAuZmZQZ(aW01*a?YcuuT`|uR+MjzBd&AWK3kRE@jd(pk2 zEm6l2-G=d66|fDkB9U%>>y<=~NY0M6D{`G(-asj7+fAL4j%a|tc&N%T=IE&0be%3w(H91w)NdLAJ-7nmrI`E(y9no5qIjyfxF;tEZ z3dKa3%5{K@51J+`@rM?nnpG8JV`EcOnoKqc2@@_dI7uf}6@?1T(+)yg1y*ckU##Eg zb8LPokhB{nDTe3q*+IyimHcN~Ztmqq-m|NlAbLZ;cJs1{2rnwzCr@N*RRQSpyvWSVbbN$h7qIa=qaXBnk)#YDUD6LPIoJ;nY2P z^vM7GPfcwto9KuoIs!IH0;S-_5L?mT`sigti@>R$KeFUSldO3Q}q1m-@cGKmNA zQ_QW6f7>~Qe$vp;P+pEIX&I}SmYtoQ@$c&MbvFIqWxInk8SLfN)NhR_kdvREpOUhC zetms)#h2QfLh)Iu+@)NV8L7^u-U#}YF0w!_*MI*FIS9QR+kh?;edBhtgE;Quf_Q&JMj19kZD@Q^C;$;H7+KIh2ru$Xv_=9svF3uhs2^L+@g%wxEY=`Lr z^1fG#sRII>$02$ioXHg0jZ)7Q^1<;fmd_iGPYX!UyV;K8`m zF^;oeu4YzFj?bT;EjsKG3k*@imUur*jJdL?pM4^vM$6Sa8I>XL;`t9+u{{bmQ&Rg6eYU_qSXh12Fv&Zo}ehmCQ_IqjOM~9SU0X z6%&w^(*5Jxl>wA;_c6R!7M0hwIxMf_EjNtj7I7N1q2{BY!zGP+D0OD`SGVse>X{ik z@`pOYfZ5&j*uDGOzeM>5Q%C<(jtCm%6=%?LZZq}mwC=P!_<}WLxBKLs+xPeDWfi!$ zznH>9pn}vG3=R(3bQp4E7Lz`0`f+jLW7Gv$>@A`M#U@^6mXS4Dc<9e&zH=`V7pNWq zMy%;-<$93?b#?-|bIxd6&O%fGyo|UEs`Syq5%ERy#>B*RTs$@i%k?NpNtGh`^Tue3 z$Qho%L$0Z*X?(P-k95s=wYXpG8QW*c*EcW#1yL&6AR*oxE$Du<%TBdI!!Kei-XHJN zy3ZRlP(zqxb6aUcoxGWgvSW_Nec6LBx4_|BgUhg&Qa=W(#d`@9-Y@!-q+c~l9w*K7&8<#b`s=1jwGdCqA zq#M~X`p?+dSm2+QP1ppwg==eTjg3OZNV`ZqzNm|Z`S}4$f#=*tbzM8BVcn@|X$k{E z586{*^pjjJZQ3$t?S88pBD_)Y`EtHDAMH(*P=V9_^+`k3)bIXy^6=+;stwT%J$M^D za9W{N<>n5F7ya*|o9=3JusK-bOjR97pzQt6(fof`L>0<7f3D_?MX)s8;aYYs{)e>a z2x%y`a9y6iH;hv(-P+oEI{7+sui)(%@foRKdtvy8Nbbc<8h~lkqOQ)*p3Q7~hR<0R z$A{Ouj|tBp@YtBCW$&ZM@VNr=5nT#6u8_UKlp%5dt|GJM?rU#f(QTQ-XQg0mUAnZ- zW<5>MW_dxVT_m$GJ&m>|Upr%OZ;yOouaYsoSzTKz>wm^2{vjHdItz;KWqx-83)R_R z5^Z%&4QdmoxOmH}SBiizrTrSKs?@m1u5WI8dU`&6`t;__8*Fl(kTs@Eb!=?xhYugl zZ5HQCOG~%C*jJ_=v3(Ce5)lzGJ#DbeA@>uotAK#OkNNrY{iS5-96*C`caI;>1Kh1Q zi{gc=wyf;e?p%WrqC$yIKtO=6uebs7bkCpPza@N+n0bh?A~7*B=jP_zXus)k5yb*8 zN~V=WlfjT%gMwZ*@!4B_^xVtKi%lzE?y$713~KqB`z5^#%I%kruU~Iu8k$$VeVdS! zbT3A!rwCha8W0l&0y3pxHgY%?N*Fp_0D%XeT&xcJ_r=BAK4NXtZ(Hb?)ENow{^#!z zw&<;NC-l|;oeD6mSN(%11 zLtFV)|35A0ya3NfvbcA)x9jJeVZq>sI5O3%^pVg45Btdl1qCzJ%azLj?!+R5|Mrw1 z;bma30+ztd&3$(mM6-2l?>hJle)tgL!Baw3%h5T@9F5XK`5O~TgH2rf+Lq+Ug~&Ebm^62u9UBUFeMLlWng+*TF~|U(%H$$*Z!E! zxsT6n0s{Un@9BL&|A#W1RZwx%HBRh$io@;{eGJ#;N^5It+uEq7J)S+|<)1PN=cT}D zUHAh;bkv9^JD#20)AV=Hh-)*kGA4>30mjMM8IcQKOvU8(?)LVj>mL#fG{$e20WwIo z$e{?WRU_++vyIi&*q!a>yzMiNO{>Xcjk@`@jJ`%?hYn~q?OBO*kB)ajaa%~C~=`d7`q+nk2)YYPM@$M9CsvX^?-Icwd zp5*LKLi^#B(%+-3fZGvg>?-KOd1?1raMzctH_6StScb$q6Z=~3ium-YT>9>G5;sG? zKF;EkdjT#DggNBGI-#6q9IL)wXb2Tg(J?PTi|AfAAP9WbZKH4Xk z{7E!F<{}06oSP<9qOxYS4@U9hh#ITxw-XMQA_PT93}(RiB_ycM;k${-Oe9z!B>;wY za^j>gebSJ-s3B?M%ngTO{>P64x$tf|AvV6qulp-S1D-sos_=E)ARp4t0zI8pt+nkX~s@C<}>-{1@d%VhiIIghInTe#&W^Llhc?Z5wTzmsk2)sD# zL7gV+$k-UJQ^UsES^#kNEf-(|OiaBFLSOR51(}%ce;q&8(AEa2p*ITmac7Y9Yum0f zn}LK&fIo=8)EQGl&?K$oTjO!@7e}Gm0vVMc{jjuQnruy zPF+m!ha?XV9tGuwV1d?Pt)wMW%(d;9YxNWsk0BpL#*ppM&=62BmKVz^+S=MLUWi`h z>s5Wmc;<1SdR6D2=OZ&+{z~eGrzQm&P z{wFg*DH+~5{m|3|Bpzq~D#1oQk}O~PIbq`#KeQibQT5%Xm8V(88@YMstbTwBA-#K_z9W`~{yL zid&^A&$*A(fm?SsBT+06pJtoEq#r*_B3P4)_*SONHAJ5+ezG6Gm#F;f`0@z|67Y$l zqM}ZBW@e_QtPnD?vc9|&)?iHi3p&cXckh%nd*VnrzdN1|XL5#SDcD;MrLh2rn0)=9 zLc7SjZ2>Eik%eV_fcjZNa`GVGMjP$B=`3fy`7O?X-McMBxzr;H1gN1V&8`Jgj*-48 zg@t%AiGm299ZQd438V4u1^h}B4GHb*>*F$OB|%1Dq}0!YR^$U;B@olo(IFru6%M#? ztJ06tsrp=qG94LFKQlAa9C&>O%Yu|33Y^gY%(>nC?ri=U6XU3@01F$N{gWpknOxO0 zFZKun5Czp zG54=gE}MIAHxh+Q4Gcx0gq@qa0J?$c7sKqYcXtLMh`LB2!*J|2o?2MY?L@UzS|-i! zD4p;T$dNVJY!ZnXsM3W<3AhbBU+hsXche%;{pH?bw8*~U!?-^0ED~q)P22qxJ z^Vj32O^25OpozRg5ds)r6|}4hl9h8t!{oN2RlXM6V<`f&ZGo=K3xXUuAKJiW`u6R+ zX9%W*^SO!pw*KFgM30ig!JFvLcdY-9p5%$>3h3b#w|)pwKX1FsS7Se%~hh(zZSi*&>gLWGLB~FqRHZ-s zbh-ONj+sae;ES?y)cju5k1&%mknUhZlf?rElb6CSc2rl78{a&>zJdD4nvTimps9(I z#YHc|-cWhh^;n4Nfu5coz&9hVKik`}iHV>E0yJ=J`e7>|PJ^fD4<{a=?1v8`O(uJX zKC8ce5qcKo=bKtsByU;uodaO@^7QN~)p+m#J${-Mis5|6Q&!NP{$G2U-YjbVgW*s#GA`MzZm(M~KDPRdc zpo^L*2n%ZBt7&nG&q--%Z!Uf%^ICM|uO4=1Ui>{C2jRX0$;R^b?re$n zU4AGc4lf%Xk4X6*t(BHCR!m}=Q3m{Y7JNNFNEb}=oDdjGl|C66S;y7yYK(ofcX1_0 zGo81j>`(@WzkD%ZCn*ZL`j4BcvRa4zWW?h3C=~sk+!oHn)4S&L+ad=9MbQ^x?xj*&vz+F)WOL zI-xhG^Z0}6^yc+z z@*E+9BAh%}W>CH2WtBWIFaXDL#8#kro|cZz!o*~FiS?%M{hK>t^sY=4iDhMWEQx|I z=ZpT&Kr}X}e#DXa#NM9Qtkn}LWJ}NklLn&YjiUQaU z?rjVAlG%iXy-t5mL6r+So3m%ptD+}CDmX}0xd;1_CmTD5{;E`!`RZg+d*+>4_2f1U z-r%R5+F&VZGiIV2D4n;f@w|;DHDgcww@RYLkV78T*^E8+u@8;YBgh@!oNx8ofk#6A zbz*gOHH+6m#%2Jgj+QVLLp~Z-rpBxddK2mK6~Ow*$w^R=;YgqlZypb=yT>XXZOY#H zg4*uazPRVT07x7>>5QzKzmk_(Gww0b_sl&oAX`!Ojx3df~wT_HKyO%Xn^Da zCjo||lM_&<#AtFdvK}^_M~}R&PM+@OQBzU%Xen{wD;)F|qkj9-A1|jcut!TvYi4G) zRV9#%gN!i#^x3o8%F4=`n#kj(x;ij5KCiofla#L|#X#8{FY0t#K`LDO@dJww!H36Q zy_DMOY}WY$s3pR}!YkU~NhFc~@FK{o1ISQXiewLaczzG$!0d?%URk2FO{Lq|&u$c} zM*C>K()?=gQh57`5}2eC6<>?_p*z=i{t87!QV6C0d{MV0fOKD>gusvJmL-d&;L~@% z3OO$kilU$2xE>@XFA{9@)>7ix6HB0FQw`u6#RgK17|<{1g+(#E3-JA^Xb^*N8te6x z&k19InXT@k!Y#sz((ZXD<;+0c-0g#HcYZy)UOy(R-(&O?+0ZldLv#E zyTvvkC6^04{5-fkpDo2ekfC&+7%eUoYXrCU;QHpv?T@xyOgtCGJ1ia+(P4VzhId~O z=s$p{*M%4UH^K*4%9y(4 z+4}M0$Bqt}=J|q*43rfPRirQqVsg6iH%fJ!0HPB>8r?aC*MG*`WY!t!4kp}qV$cNl zo;&uWc7_@U4R}#8>EQ3CWplZd3&88BKk)BiXrQsC7t0_9Q4LZfjR?Cmx`YNOkt=S@tgPl~Dha=)yG-#yu)n#6H*)bkti!vYvqSi5h&WBb zZw<5?X+oV(Y|3bP(9+Y4=y6I|8`OP4kP2sQl63>+8`7AV-%L5ywx5~wb%vj3rKXk` zRPTQ}{vz(NVHt)p=5w|?mx8L2nxW1@gH1A{k~7dSF4Jb+k2N|6+R2wta*KdN(auX; z5wr{pn}bgX-cwm4>oaCA76AR#fB3w91akH4q^;8mGC7Z_&tB8aDkp+U7>#_N_SNCP z;y~VcfvRj`ZOyp-3-6V)+|pxn^A4+CG!wnzi;*Cz1A5DB{3e|3buBRgRv(0h*_i z6EYvtH%5jM=kkb1flGxLAo_4fE>M1E78Q;EF|LXLsRvFJP;;JaPHE`{OTGw&5-6_V zpMsw4-hzdVji{*1`nuQD_1Uw#qY>cPSmqA^AseX;Saxb>56C@x2G%R>C{c?k-ZM)Z zn_nPbuCyLq27uxK7!jMgkZ!tr^gl-ni=`Hi&7ZEK3C;ytKxI}vB|y+vnw`an;Sv$? z2GPg0`5LrsIK6!AQhwR3$gfXDq@{15Y1J8VIX3yF++aOSo7`ru%b^V_>8}1^A;d~C zW2!Ir>;Ro|HPt4}ifDNcG?eD0Aj#7UD5_J{h8|(Ax~gD5ZOg*%-O#9=+3}R9Cq|fA zjwCm?Oicl9Lpe*Av8MV^k_3zU@rQ(WpSEA;agoJOIhOw=M+#kzWh=A{cS3)|9`Jdw z-T!G0B~DbfMG$2UJ|j+QQ%L4m@8&XQZO0XdIGLx!!ax5qd*rmA+@ct-{>^BfD1HJh zGu?rYl(QHwn|Xqr#IirM^gg_P5D^Rv3_dhA{`8!DP#F-bC;)~}VPPR4_ZS{dUS5^G z5;R6tCPr3@p5$zXKwr#nF*XDA-n(!5Q7pc%`1vl@*L`!fGE^g@yXZFBw_q`9vQ2tV zWrW|yok);NNa_BhXtdKZ<+K;g`OVV0lTPlx6awiV1}&>wO(VFZQFJ^?k$?27)&S*)_OylrCNAEXWuK9-{`}bCQ#1 z=jCC$G@P8A)Dc?co3ZBEXM2PW*@k_hw00pTBB~QOD2fu}YBBwD>IeLb|CE)5WreJB z3IA$LDf6D%BOY#U+(QJk@NQdy`fCjX`Iw^Veg~l^PoDG?I1A*KmX@YGVFk@7;2t~q z^HHacpU;e*;+VdkaCrazJ%L0*2nFzypV+>>zIf61Inv9^%Ml~w{+&V92O89sXBT-w zH3sp!42JC%x-Zr-WX-=IbZN@@@R4m*SK{q?x7CN^-14DL$uY13u>w8`*XK6`#Kg#F zh>}enjBmv`KI9wla&rf+rK;3*XfUTGB;bVT)6{9x6O88YBl{KbWLJOuXjG+-71;xa zOo3@>+cQjdP@8G6ia!I8?8<}+9jdQMOfI+Y`+G{{9z>z7Urgxlx;E!A>esmeg8Ghg55qI2kBX;P^Yr>Ag`?*V#FhXP;AC8M!%S$# z3Z7z-3f)hL@9Xl501I@xIIvo)X2!FCY7L6j#~*6letv#b)YLTwfUHSk`-6(K8B;a$ z#SQ^|pGII3&$<#k{VOc`@4^mxLo!GB{SiarNAURGyy5Usv$nPde1>pVf4b$}rd=S> zWHX3&5eUWhlkYJW7S;usqmmLTAEFNjY%Nyp!nb-=M(Eu4+JJY0*0`z}6m+{bls@Gs z9Bm5351&pZ;P1ur$`95h8}aGj51ll!UUva6hVxZg52yJjNR12DJUe z*w~g|Ns{!l1KUkd_GSG}*b}lK6_A-J9DExv%DVew_UqTWr<1H}vbd27k&%&QD#^+* z($!20KYxCD{!6)SA*tgY9i6P*a0YmJGPx(Cxq^?IUHjpEV*!zd7e6x^iHmBU-+Kq9 zNKFmtU*`Yb>xS)n_sVAYP!XW9JU4q;loA*bG*Y{qaw;2k%hHq^`ic+}&FsBxY)Go* z1*~9ySn|cf!om%J+*}uAQ{_|(6xZ7g(N3!!tHn>gE-o&w*gu>5g4TM>3xc0{?abz} z)#IOYbC-a`iMfrd^gF=UwJIlk@#p7I$2nB`uEF=)stDiTS#%ci0KJQRgG%;d8S&#S zh;nwichF^{GnId~dO5K&nLLL^eNW6SL>=Qoj07w2bjr|Kh4;Vz#67nNu<$)eWfe-k za@KxQ$R;HxFEhE|W2ZOqS^YXp6dRGY^SSo7{N*#bYve#}j#NvId=Zx)NwktYNZ~}v zQA>tB??1lc?mo{mEA&;DU2_+w*$4lo#vuKs*96a&7IC->jpuDKRU7hsjRQ)P-JpU$ z*8RhnR0FmpdR1MzEX`<3%r=Oouhi_)@#`Lv__OrI7?m(*rT0jn%yEsJFf92dQA#G> z1bmoCr6To5_%5gsYLz)?d~8;(hdaV%n<1)_ac3H*eqW0$%8HMlT4OCRe_=0*$aJ_}2Glyqwo;N8|0+*MD1g-reT{ z5CV{kr8)$Ms6?kyhaCzG0XeyS!(7Ty31Ra%);4D?_7LSM95Cr3w)(3X4>Bl;mFC8dc^XOp!EAfA@!|33BW zIBO*^k_Vd!Vq)#)wR%-3#ojC{j@h(}8|T+kj$Y6igMwswUU%ftqU$Wsho>nZ)rF;_ zhV7zczf2Q(A9p3kvngMwNM++EgMn?>T!_Bp_O~u?ga>o8+@Vd5zRqqW3;eB2buYEp zueA~bF?IVrJqj1g9dwtnb3(y$UU72^o5!@`?ypKp5M}hsCX94+Qb4`k$>Lh5bJ=$j z15XB+B`&skje*6B1uyu_P+$AGLAU|it+7$RM5j(ypTg_!$nqy*cY|5^Cl zi<8?8X&6EKFZq%$@I<0adFVs}e3bpJEQzWwZ*Dz67`;7vOhEx&D(D%-#l;ZXx<1=r4sdWa7|H3C;3s?|pUNaXC!)`Rd1KO#-l3`sp8Nfi~F^Upd_ zu^%uKm4lbIx!I74!)_0&3TXoxJajqghB>JxqZFyCo?Bl5bt~(8>Fa+#*`Ab?l*F6> z=KfObIb+w)J3B^W=WhlQbuVxfrRrQhreR+guA-MCSx$PMpPYbZnG;t~Q1F0{J%O<` zzA${0AEIU-KAas6(%HN0Bqb$*3X+T*4uCVlE_~5_gqzE67DR>ld4I4&zYf_K1&WYh zNuU4pIAH1h>l2P1{{EE`3DF(MC*-#mDr7~MpdCTNrQ>21dz!{wqF}%CPR1%juj-_J z@SaE8LQ%jGrg%RpQg;|Cc3Af^Xw+MyVDUlj2XyAq*9>`*FL=6(9bCiYpL(DM9RF=C?pX(fOI*Fx~k64$HB$n${VU#E8 zM87S=-N{QpWT{V7*87jl9)+k_p92v&ZFsS{a%#FTlH5cZ_kO>|BQjNbgn=iVj~a-&qF^$I7!ucYU_C*Rb*UP} zlT;~SHPv`ntZJX+f;FZ-T#xr&65XB|iH3RrOXK^B+gH}N4GqL6h-4CqwF;{I)HkqG zF-Qje582L`1MnctVqL$isjZ!CA0ka>fS{$xx31E|sUt%6zAHTySM6)jM@)WF*XA|| zvURZ|L3HMW&#e1JfQ*3(qy&j`N%S=8e%u7fwuk8nqK3;?PpPYFX=~$GAaP4eBbVf7 zpe8&(xKA7YiG8-a0l$Ptu^=Mmk29}=1?{VC(nb8PFmCdK8uVd|k=%oryMT#|GOKV* z;~1*u&$jP@M=E#h_W0>su|g~SCvd9ncpQfq4~L7g(9!(ZEz{0A+n%pi3_ zG>Vx6DDJD*ucH)7Dsw2*wO#_6fBqRDjhDAKlET=?2yv_;6tsUw@X;eui9tyJq9VyZ zefnR76;KYw1<)KW4u4g@dE>Bz)G7RkTpiA(u-9+>SwZXikCl}ebJxHynTW7J*E8bc zVP{VnvITXRm{n6QHy#UHm)lAbr|5mZ#l2WNl9t}Owaw~M5@s6B5B}YDu|M$ih&Xpw zDY715<`v@H^Z8@6Piju}!Q0_s_dut+fF-_u1I;Em6{aNdkNe@|V;nDaFuu?mALUpW zPjO85q9Tw;5+BKeCMK41QB^Z15FXg|$8pw&szWlFtkRNCHSYe~THOBL?_cyDpbJo< zIWCRJy?f_padXe+sjI7u`(`-@$ zg$~^qH3d~C43}C2z#!Cnov~f-YhdFLA%;xL;4d|Gbt-=A2=#J_=c|4HAC_Hk<>lb` zS7dhFV(Yq|zYgBbfu@kMP4@cWt=-+9AD@?vtcNw3nVRP3 z=8AttkCJ}*^5y?0q;;5&{G{NyGN~ldyh4bca$KmlQF;8B`iNPxKq52UG#aN4eilr? zwNpN-MEEI4gZ*f*#~0fJzzH7O?7q2OGlABAQ&}Mj-7vxM$XQ>os|G{D<@D`HP4GW&wibs$5t8cizSA5 ziFm}i#v(Gr9FI50JE4R^o!p}oPl(Inq4<3wF*LJ+oVb9mv1kgU1KsgCGb6<*@ou6sDcV`;`W-C3R6?-A+jL4=yShzMzY`w zDmIzaIi=VLWSwUNw%X@u=_)+gk87qMRT~t@fEcO) z2AjG%))xL6p-SN~zU*H&h{kxgnek*p$gbA3<>-6W!_JF-UIgw0YSBNCGf5p;4|oc3 z-qz>820)}XpKD4*faw1b-YXmv1 zE~Z|_Hz94HJN7y@85kNqe00Bpuq-mi`$TA(o+MTg678_Ep0$v~R4vC6P1ZEP@F}mPqQEoXHc7D)(Gi#*ru=|ZY(ih0nb1wXQMzib^ZJ}1>?U`RyfX7 zRMgMs0L|8aHq_Vm^!8pAd|K_{i!3LU62V=Rb{Xif-T(J>0IA~iZAWG1V64sRAmw{+ z+3bzjKdOeed_qCRxRc8b_6>px7f5`SKP&5%iwC{UD&Qj&k= zFiXLe>Rn72>BeE}^nKfNmnPWvFJU9bmeajtbWaD8WYXU&iUq_{iM34i5?VsiN=|Y% z3r`wCPam|xbji0p?}o3GogO2kSVxv!@`&x+TqPJEQH#_oCdCV2M&Z?jgAPTafrhi& zZ)d8+*VWY;9GR;OT>V8Madl$DA;{p30^A$}FCTi@h9$@@VYQe&h=>1PvZW3&7Se5AR-FQMpSQetun^Z1C0>z2{vj z{cOXbB~wyTLWE9`>;_WDkP=K)6$-dG*m>8+!@)5O$OI>@o7nhqq#*K2Eifs_QEPz6 zLSzL#tf{%PSUWbRAZSkXa%iv7(8p;pq#*|aBErb{IGBdB$PtN;W_C`&buYb_pPGv3 zH4JqNk~7i0x)AHoVI{0FkaYacu9*!d%+Ah^{$Rna7dL|rS3FZCfg&_V+l?4hDos{^ zpRSOP)T$tk?_VYl8~XP1XTtJ03tlqFWBsAa(5Kz}y;%43TFj5I4@vDz z;)wMEaM%|J>_*VJI6ZvJ&N|t;lqq-Cs0g>#$DnZt+s<-=ERx1YO zmvwhqnShUFWylU{#>SKu-P(L^s)r!^rO2Zwev(&5aO69tj2WbY*GX)0%ftSPr zluv&@zdG4_lHQPkf-J;8mv)yiQ{BVEL+yiN*T@Hj`#rV-cDA-S?gB9C0TB#v-%tl0 znV7uH%zOmaoT1^Sn;63Q=H@1`a4_Fu$jIb(x)?V9gXQk1D6~k0l~cdet^voULU9kY zEMz3=_Yh0h+Xg_;+Sc}*=wcfX%R~c1qLIFSU$V;u=$ql6W>(yUgoM6NO(C*E_RiI&Wy9 zr_r*15glK@Wu+M&+z_{|BG}bA^N|8kYN5#~d%;zubXVn`uOe%D`|%e^=;1lk0)m1N zeS!N~3c7YlVTHugLv3kcm<|Y_8jcP8(h+!V?!PCz$_y3!Y$cj5OTAnUU!2G9rG?cc znB35q0(Pcr4&0?qzTSt)1E|jCok4;A{*um<>m%9GW62SyaWB(P@_F-iG*-S)(A2uXY}NMU78oNUcUSRTH5b${4a&#;T&`s`UW{1V(4SM{8E?rYAtsy(?(lQblG;2feLjYegv|*FLq}S zFE@+AKVx7ry{c|;SWq|0OT+muF8=s303DA;4AP+8kNEr@5Dxee{hTy3Mu5r2aG{Q% zw`qR~QI@rNPI|Qcz68mByzmAlBf8v&#>e;f_CO*9YK=+}9T#HbuwN)0sKrJ$*7m10 zKJ$Vp*dNB63Z?xW%%a%&^auj8I0W3!2R8CAotsmwJyb~JoI&^&KuY~129 zFQVxI^IXd#b!&|p!~?5+IUXGW^sH#r>wSdf)>Bop1kShkcqzm0PIK4}*nVt0?5$hR zIC(r3aQxElOKNSj_2wmicYd0OqM-3f?3mT?70LwyW5qW{e1wi?nfnZw)PCABSRyZP zuQ{w0-;0eYJ{o>6juys?&S4*eE{BiOdDJ#3_iW`;Qh21!EPwE)L$Aq>!LK}yyWXCj zbtYL>p+*8ls!7VM>GhJN?7;*U`A-bq<{>IS%S;4s7{-f!@9nXaT0@xTY!Vk2*9UvA z5&E{cO3IRyb1owBinezfZB?IYS_G@%?aO%as^}G2Yh8CS8aVO@_aU~(-t3P;9Am=i z{+as5GH^x6F6|5xM@f?y#ESgY7SnfG8&4$WU>ve;6o%v^Vheasv<^CfhSzz>b+ciR zX3Ei+zuf5NUeDpDnMa$(Qxa*w%tOtl-k+bGyr1?OrY@L?$F$yBG3_&_W`lc(73!QX zFJ^3{nv{H>g_RYgj$h|sh3b+AC>ZdLIBl-;ld^y9vOjvp(5jdoSflo zAna1&pk=BHLo6ppjwlv>C16gZSDTH5ohE43p6>5xG`oga2=o4b%ruAJrcPH)RW(GD zw&FitbX1r~rN^_3v!3!n3I8l5C-g$h39V%woAVH}3vW`;*DYl{<38@7wE{auQJUH$ zb!<@&78dpz?iy!g9|9`{aAJLq5+6;CT=nu+XEzD1RbRDbOaUvsLxcrAdh{tAK4TNi z6-LEd;rB09f813>zu@^VD$i5mv#%(Hz&2?=%H%H~G_rpWdLhvFHWt?6U-n~&`0H~R zd;#W1BkqoJ_gF`#&S3%;=-}V@%xpb!jj-eQ%IJH37;Wa>JeZFqA&@;~XwmNQixe4+8yzOA*M*UV z1-gKPZU|R?W)cExKq;OKS3i+l8uFp%f99K??VEphgk2VRzC?$G26M5ez?-bqzioT| zdlv|r(Tx9`5d2Drfnqw^jroja#{+tR^QWiQ)~nD+Zh|_;o_I(Uz>$3T3qIA*1Y}>L za43;*HlwIri__sF_x7q?B`d_GETOX08*zooh2(gM(FgoX9o4Zd`TW8~+BM3;(4$wl zn10eAPqAazc}2Q&`xkf~%u0gQ?)0wZbxTXGtBRGXNQ!!llu$l~e$3;&+4^wq#o)X1 zV5X}Gn40Nog?Y}PyX&O}t#|OaAu|I(qAcbK5a(bU(|0Y+&w~S=>hW#!IPm6l1|XT| z9IWw+{l!GDsTH^7`|Qe;MF@zN^h$zHMhW;3hoK%o8md$f)J{NI-IfO*=3UFu!JdRc z-&1&k8(#`IE%kOGG61cwA=7QY{rvs!)bMe^2s(&Obz}~$GNr11vG}NCVF8vA$r*QM zX6C`HyG#ddhl}EqjDe>B}G^!EbqUw;XS(L^S6EOFjy6a`Yy{ zkD-=)Ihw3$ozu+mMRks$$cU1SH3|hG_#=dml2WwLIF+59xuV)99QrE$BZ-4463|~q z+nzK~awBQuWp&8WBOHQs%p(;?N`Mh56Q$=M40(`vu-eo0LB^8&PR5F zqHziXoIv_lNVGB5nlOkp_JnDi(5gNss-Ck;u=_=M26F~Wb}zx24vFy@kd@K{7x(XN z3$Af7{U1VwiF*}z^l3e%b!h)a2}kmlx*#u&eR2QH=(DUAk<6Gkhxs4U*MwEVF1sd^ z?jK$1FmQyPA`qr~1Cx_)IKd#|Nx*p?b{fL=kkN`a+>YT2$?@Z^TH1Db^Rj3bD~BMp z`6vUqhhF}{iu|yhyfb$6g4VUro8K_)C_=35L&DC*NG)E7+i7ECvpJfZo|hN@TkFAt zeyP3|QC8L`!x{ggdV`*fXI|O=en6$9$Mq*aYP%rn{ zPGPuD#%+Q^LiAK`TbV2mpVJo#ej|K8p&Xb349Nou!g0&d7)Yd6@xiEQ;dN%+O ztXlaFB6;HP^6ENhZ6`sf`DDuK;V-3EB_t_H{U#Q2yxis{`uY*4lwOg-Y~bSZ@MzV} z030OCLk9r`NJnwlKh|T!jiG}ldHk)}BX01&4+hn={MLOC^T&A159XEPFST^m(3AD^ zYnU%sGZ&-wW5|<>^SX*qx`$@+6aJC_AVxINH!=(ip|)|`Ls}IL)zu?U8e$b0JC|xF zw?TU=*L$j>q5`?Ao<7JQSWcuNOF3H|%x@k~O;3k?gds7#hYufdJbLlsg^CJ#>IxAt zF(kES@h?Laa&*`UFx+@qwcss8@?gXleisH_O!}*z6WQpVkfqegI`>a*&>5(yVU`ON62Sk2b!2pOMJXv?VTKvt z!$PmKNV?@?qdWSFOQQxPD`~QL)Om$sa~+t!a6*1QuyZ=R?w(>KuANm!`h8&mmzk85 zgqAjO_tTaYAI*Q#!uGDn;UQsLVk=x1h=Lh(4~gjL=*Y6rugM6Y+k7c9GR@l%qfARK{0dABDtFR&WT{A)z{bWKJFQwSs?}8 z;Ey2Ay$)Sy)3BRnGrSHC<$n@CB*Aedn_^M(3M)w+s&A%T7PIsZEt!>c};H#{RR$`KBqj+%}AVPxHkTkLm z5&Q*cRwXidg@rPZFRQm1boZ;9-;?n4#NN|cAH)^&+-D1vS%S3G zlJ6#M2p^>HiTY!P@$TFQRvcLVw%8JCe8;EH6~TbMONBe(_k z=$_AV=s&R#?g5mL+S+|c=@!Ta2Z2g;z26zUF-rNl6Ex2tn0F!YED3l(xa=DwO(PR< z0SY20;>*1-9P!Js>1u?x)3n)@_DJwwtQT&trKKfb2c>rA8YmL{VTHjJH%o+n)?vy` zZ?<(Cd-@QJpYI3X!F05rSn3AMi+OBl_PoC!!TjI@cm$SXw)q)dfU(2L$B$y_`N!cY zEgc;l5Hf3M`3?~25C-7BfA4!jC+|x4?T((p6V^u+U9pnyTO55gIj0)>g3`Ato1*(^ zFW!D($Ya=mM#@BASzK&6_2!WeJyBE-A51s@bJ}|RcBbDNKeVv815tOnIf8Q3s)Cot&Uxb+s=Nf}Yk91dQS`GVN^1p4P#%9@ElQWhh zz?W~<=^)T@wG_xQ>cQ7Qv~I9*TUD%gDCOh3|CF#I{L^8?SHvh}OZ7kadZ@M*-9vZ} zoFqmJ6H~PF#@NtT_x63=?dBF!WGc4O?n{|H9&>XVmK9m#-(;Aoqm8OE z&+OWscIEJ$iyPF-%Vyw8QK5~wA~>ldS-HhK%H{1_^s6l~Tzj&7{aAUO_~ZfU=p^ZY z+UHasr5ZoNzgMj*0xY;D^+>nPuuSW3l{7t#&%|7MtX9eCS z1VppUr=+DRxU9OKZHn-)v}BR12RxX^h9WdP|BZ%q&GioYFkZwNT)tdwDS3#URxT#C z$uOCZrPFNL2!BRGqV(xgmJ|0zJZ>c<>@g;dOGw~4;7De1Rqz09+7#Tf6oSka0nOVb zrKRC@xiAFPyoM9iBCe;acgR(tY>s&UmULtM*C3|2JclG$k|{TLb_q6UHnU^L_KS-X zDOg%rQL%@;ImblZ`{s?btSqGt=||Sah#cox-)n$mPFy}Hx&kz^Om47LsWJ9^G%(JE zg#{#7v;`mlqbOtZSGPCRNn&RAqvUUnFG1mhmrtDyKoZxB7qw4)#OJNpBD-_b=lh^U zvvh2Ml!OGa_QV(9srGtp~pZTm>+nmHk#zI%M;yPOhZpk(-T~hz0&=OxRa+(Yxj07`r~B6 z1ON@SM?_Pu!^mf|1sm2=!ydm{CQcjtoZhpPbTKt`NY>-FGwGAKV$+fXLCL-!Bqkr_Vh8KyX{ZB60WVN~e%Y&QF4S(GHmo>38o!*49*C9|Y?L zoWQQ_Xdx+4Q^4Fn?9FLw4So#MAk02xc1^pWev~q^vV!0?^Bs-=9Mu4oqjrONXM8BYUxpU_ZXwdhW4sACOzkzeV^|)C>B=AoF zy_McWH|Gbee+p-5j()rj{5-3djg|r&v$Zp+hxwHHl>NZ#3EKrF>$%JPoL@zFR)d9w zbzJU^T>e^d?72%XXTOv4NS;+qm|T_I0m@|I;5#y+9PHWoK_f3(|9Orza73&qJv7bq z-CkdYz@*Bg|I(-09F;5aJgOLAI~fj!Z2GZ{ll2bI`w7yJw4?Pw`QO(=@deIoXf7Qe z`h3Q9&Nq+MMNCo4fSEcE6`9qCOVBwv{LK4+i|d_a(8<_QoEv)P^y#Z`(o`#qjgF4u z!3V-%mqsT!RbU{Tov0j^NJ6T$kCipLsr6vY>|Rr^2RY3`28Yp)PGl^+Zg!RzpxPru z^XJKhlC|yUW@(9zCy%o$N~TG3t8|9u1!i#i)7V%;P(oH~U-*k4lYci5BSy<})EJ zr$X6Jg~wqW^V{=`lKMP*pA0n{NiwdD?kV&Ay}b($$+W5i$g0jecI{1W5m7j-H$;6@46XDlCk=Pl;_Uy(C5F#_fof zyrSY5QW+;TQLZ?-kpw1RLH^a?;zM?d!yw=GahB_awB9Sa2$>{?7wZjlJ62+h=QQ4F z?jRP*{I8)wH9n}brw6zMW(Bn10&Oy4Vq&lye-F;fz(9|}!fdUsx+hd|Fg-(Cf(WHy%N}%zZ-}=4hRZlIZ3lhD#%|pM5&V|D}@P+ zp}R`lG3o&mZ1r>`6$RkT<27ikNas1zmy#VTttsE7-$jicU9m-Ae&}T z7$)o-Q$o9&s2553`qisuxjIN_p*A!hQpusO6n7ZTb8d~uyZu@_TZ)5P_)dsO-&Q0g z8)Lsw6=Y?O8}*xK259GH=4Q;{1OTnlmLxq`o#n12)J8Z9D$;Ny>KGi z%+xe=p|Yd%+V=FUzvwu5mcbswa4Uf&zAI$?ykWsqWgR)wf7@T*i)Clo+ePs?Iqw7n zj7U>SRQVg&m?Tfc7}?M+oMkv>(rM18;^&H*i3wh(x(Pm*=8M8?%=)rPsV=G29Zu0l zOD|XD(AgdjO-qkz%dyvGv`*LZPtYqA_s{kTWa^>%=6r4PedwI+%CvnkxzS-0&O!cl z)#1ab-3qoXqX!WJx9HzCDxf0yB|>kiICTBMYobX-?kZ*pn%%TIUqgW#sn$uo+PW8p z_bAmJ?s6;)CHc;n6?9w3y5m3o{t}_D?3bc7uNJ&*9`6|7sC~0gT`_rtX*;Z1Llf;xg?(bDARxjh_7n`|z+a>t$^Q~ONryRSlx>Twqx(?`POM9qq zQE&1wx>+6Lr5{@OFRUVRM2dOjPWm}c@l2Xe_dLklhRbdT&l{_;%9rT~bIG(CuC~ex z8D9HGnHis9t3#9I!Nd^CZOtxtFe{ol+yJEe(qGb5@(hIZAXZ>}iSkHvsv?W_o!&t$ zGBRS>=CpIsBYs60r(JuIJ_lK3`A4{)^BABxE*{WyC6Z9Ks-yXE@|Fqrx_ypm%zG<< zHu9NCpZo3Q^4^q5{?T9*INh`Rwew|F_2BJBk_zfUtN)Z^^fYabR*5Ka2i&SGL=*x| zv|a&_0hS>{w`S`x|wlJm^ParBy+(%Xs1YHhOJIvbkTW5q{V@fc(! z*gATqC7gvgqF{aBT%Cu43&LS(HsDpvCa<3u{J$J}zBreHq0mw?hL!`ldT1pnjtc|a zLWDz4y*TmY_qQz$7dCTgLuk0(Fr3odU$)K{Ga6;E_HTFTA5c@%;)6(l`0N}J+kY!y z7hzmksj1prH_%orN1C;EyWBYJwAmQGuko*7e{8nZLb$kj+M`Sln+0yU%So#8iN{kU zzCQm15G-_IPyP!|MdNn++W(yEd`ULML(?L4HQHlSuWjkC&~9H?7IB=c{z~(5U#C3v zLXxohqt9mUGR`i|hZ4ri4jFU4DEoU{^*{t6^^o+wIniN)9GEPamq?+$-=- zqSRpd)8G32rQ=KbDMrp`smVxifa9uecM+t+ARu7)cd&(MnKsGro6d$oZ+3SS1`!I1kQil-^b^Gl$O7t>%OY}LxY1Ful8n7LcW13 zoO|TzPxylK(lSgQLTd4(veE|xL&^C{tL%ICR4|#?vv}0++Q|{we}7t2gDB6v%9W(y z8tC6+8HHXsE`y*z;w0mPQ1p~i>D>Skpas~QpzY^JK%7LFy1;;Qa&m_C>*(vhyLV`h z<}<2)$Bd1$@%v9i&EBqKXRd@s}a+ zoKS_|zI6+EMG>~;|7KFn&YU?j@rDEE4B&^E=3$Orm+Bn&Ey3kvMEAW!jY7Bj=g%Li zTs$a*$fuj`{*Tu~i6E)lndbXPa08od!4KHk+pGJF?6n_11G0$F<0CyzKxcxMqAgqb z@{PTGVRO1!Z{+9o=C0bzx`Z_6;V1?= zLut+0gS3YXL_M?`k%SY`ZT;JGhvc4XR#q0Q;X&{`KW)cn#0!cDAZ?~-uTxQ@4`rGF zxG@F7`*jJ!b$`D_kp=aO^N`3m7UF3EQu2q8O*QxrNZl=H?efj>wSR-)pIq?_M!kFY z;`v=3Ty`Sz`10ZpK?rBwfbi3H+0X;dok^GmLV*s-`TYL>)eQMK zA6Q5-e#zH=G2M8IX&XW$t8ggW@|`4io>2u%@vyjHI89qKw7DZvcdj=FJF#{glFvA^X8nwa@W5n zq;Ib%iotEFX#N#bZj#H3FPK&=Z+!(Mkt1?_a&qDq_Ow!KxIE)zzh(c$ejrlGFXCy^RxDLU-+g=gWG_0>G~2c(Ib(jkc|hF3miu0 ziDa3GBV+3?NF{y0^X00AI(0o44CwcqM;7^93q54WO`#9pL>7ggh`4HY;a#OJN?zf8 zIm(?Eh);w&Q%wvN7^;*x3%Xp4sPvYldh&k1;B}78qMq4S`>@Kl8!Hw3Dn3Mpv`GiM zM;e?M0~N)X{?P=fAKy?$q^z%Lbo%EPFDO-HHrd{&T1rUr>FwzbGkGXnsQZGo^C}hl zJ@s@)uJ~QlfX|*+qqeVS(=&hA6COxrcYD9)?X&EfBHx+;Y3jYR&L z>hCuPK@ukE^B(r(?i;Z7KmghXrrM|*+*4)X`Fwp>5Sq~(!A28}!GenC>vLrUaD9E3 zo130aepy{zozLPj9wz;Ge}o0q=9!2l(3bQ~HRoGE{z1(wx(!(jS+5m5jA?1?v^Q{n zi3tnyCtCRVJvAyqpyJLz?k-t~QmN%VQ2&-`OD*iGlTkxK^{Qj9PF~$(t_%6xe#Adu zG#p-nIGE-8XXCpvJcry_qTay{qQKb;2L$OXF%=xS2lSY{|>?+_hhO8dU&CuAcyl$75W$5 zAFB$9WNz(UuTP25Y7I?Fb}8da&kq?o%<6If#2G`1@mJiG+zn;{q9gCr^~4WeB`1=f zT_*V5t9@sUM#*IB7i%f`0`icmOmG`r{mDH#O;Fq(`e@U3y&Ioy7b0O8m?QX7va+^d zy2AxIXWP0L-skGvodv*CC29Tr{qVi;oY-SQN7R2xoCS;wf~-6*U20ddu5mwk{CFRR zu601ij{9WpcHKu;4*fJ@cbw6H{%U~w3DCs^P!ofq@GJg^Wk!N%Y?m{Jr{Km{;a@{J zCFg!R-%x~jOi>YfGZ&n)C^mUVec3`XO(+gTqd>VhJHP7aD0q@ol2IM7Yj#9Oun$`4 z-PL0C$pRQ_2><7tr4z~WbEsvJ{x9OU7~Q9Q`4K*)Ad>g1F@ z2a$px@}v~K#!ONy02Jvs1p@&9<{GhUF01pS)whVd07EKFm;5GqNDpnHgb1YCmo-pvhiWodnZgro2q`lA_xlO2OA zgqwtOJzI&<;iz1xtlJr$n{n-3Og$GOeObztB21B|FdP1JaZy()kKVeQ4H5DD3`pFt z{{+m^NSp=Jh$G%x#BQwIy_M!O7g+zS=jyfZIqP!ghYJ5b1DU%BKRRv~V;JLV>~D7) z(&wq6P0DJvAy~%5pLaDeiL> zkED9=PAMSGw)|VdfStmF2)*ZRlW+{!G==UE<}Mgst44^!xs&47b9}@ZqR2>^#!*`~ zK>ZfbqW0pRvTX?PK`m^t58J!!zMq8jq}o4cXGyY)d-t%PywqQQt0FO<^TUrn?lt#L z5ltAoy3(qrc9CVo`tisb`OVrLOp-qqprT-0%|=BQ9%>MEl!KV_LfuD&(x~&>dQ_ow zH-aR38mCX}vu;J1zW8yW-kZ$4z?Sg*V4DJuY6{LM#G7l7lZ710X|W zppReQ@PWvw6h@@7b8&In224gn6psTSOAO&V)r)Z(8rH|5i-D^p~6o4 z_Wsc>$h$#r>Fmvi^KcOcEcnF2LvV_r}^YkcuhyW{-A!YdN; zMYZ7pU_gWf$)pppDX(|QK23$Mul`%ko8c=^9gk$kfQ+Y}>MHV9;UL1~!;*0A_&ag2 z`6P4kg}FJ98u>Hv^Yin0!u;nrn6%&<=ytAx3qkk}LNRdDVrasj)s9Ft7l-N_wP(=% z3PiYw!V}L%z$L=-Mr;gJ_FBdQ$C^9QOm{aq*+DVOI+jfz-B*;5n=B$x;_XW+NaUY> z%QqT^Z-ftT7HxiHEz7U1$b7sFg)Eb4F%v=ziksU!oKkIi-BYe!Ubv68aJJm$Q-2AU zV?ujtpq_UAdkh7H8x-QIYLB!Yc8ca!Ob0yllx`{_!osobQ{TV4!}Wa*Va2zgl~L{O z-w*KuEIPio!u0N^r(=Nt6lr}gDIx`+o`^8cuDYgrA0Kz7NplNF5F&&GA4_)M0VRc) zrqibpF&C{1(`H9U#|axsE^|Z;<0jstu{Wg)LnH2E$OjT{ajR>n`Xb4jQBEZqsBaa#{*j%C&p2`?1CHeGBdy=k4u+AR=UKH41{Zr|IJ0vDD0>nBUSjF+uPfy`jD9~e0uh7)|cRk z#8jiZ`~g0pEX_k>#>U3}j$gkHx&3pb?NZ%McIG?>xXkM-hz8i?zJ4Wi7q?W2 z%C?t8TKAvtRf0|qGj%LAxVWetUm>Jkm!h^VEO48A_yoEZVJiTU@$hMw?31~~v;ov8 z5IQQW(nVvH_b>VF-y%umPj+hR@Auk!QRVRXgW$-$=Z5sA5-C%XH2iygz7Q7Vx#Ttl zEITH&SHY+M!e@D^9aYz3g{439@uNp)D;>#emdZo_5VF8p_sFvB+lOp+Fu8z03A+#= z?Lxi-cq6U0{b!!KeyY8cO)FIL4lEMxi|HZQgMnAMU%Irj=yg3I2-mH=?(4k||9cT6 z18ClI9wW8(<;(lM>N}CDEikm;Ga}CAeF>udQOIWI+24r9^;*Xqu(zH6 z@dKkQ_ei(5AY$6?-Q#@0B%wj*)GuHq1;PSfi1=hRyA z_Jh0yDCN?;vYmUB9yYX1mXwthcI&^f$75T=SV-II8G)w)&ct(ZW{>bHDPfSCzZubD zf91*_kOOg_+T2Sj+2bI#2ws=V`Uj%}u3dj4Y$pe1@uj}H3L%u7ymHV*M&m+r2C9$Ccgd`7q8bVal|N@JVjMoDVX~c_~3nIrD^kF zYTfidVgN{fuZ!P@VS8G&Ot-`0HasxBE?W~wJ=~ltfS@hI#K5!8xhn+;Mm`8s5dIwJ zDSWr5 zPQ40`mN%T0^mxHJH4?bRXcnqGviH?M>}YfTeufcZb?88Tqr?ebmebrq>AF4@CkF9U z-!bcUliDa}v#Rfluj(M$#j(2=$=OKg&%S@(lskTHZ4K;@Lx=A*GG>;xzuMj$uO&YT zdPFIx%jYolCpl6ThqSHH8Bw)9REa6=iW_y%6;htgCLQg!lV~F<_R702VU)ZmmmMxC z;6RX^0*S7HU0ei)xGo=cI<=du`&d|5KEr?(cF5Ssi2pwoq*My0fo0v;*ueY)$qf41 z39%P8PvCYFxMUv~_`)WiiaZjP5hKY==D3R{0t;K+puk38NQeMMFEWk-iF+Dx4d87X8 zy^9c5`iwctBd39uNI>8R-j zXgfcZbN>q>`!P4C;eY;aPkKfMRG~3DM|8x~jLyUTg6D&QINMg{ZdR|0bhOTcSI=Rh zO*-G+Y-(TtdM0@0IiBLi#+=QVQ;*2GVp0`vIBvZEhER`H;8+M3z4yQy2QQ&;;_Gv$ zn*63fm9>41UpPzt4uVE@A+IL4Bg!JiN(>lgWsxn_WI{)wL6$P`@neja4wG2EIhG;7 z&7{c)Xia;HoBqn!tgnFKK}~NM6_ICy=7b$_L;@HvPrl4M7u7M1_C%-T@xZ(Z(vb}e zP|jm)<)7S6NI00)i?XRfl|O|xq3`_2Nh+bj+S(6`{*lSJtkQRTunQ?koa+RWNH;-n za0H(}Fi@pxdYj)QIuLs)5{QN&O?&(SO|_HM{<}Q|1qEP8T3@)S^6vHBY;BDGyo_gO z`;K-|#RbfDcy+pjEq=o1u$Qqkhrn}u3EM=l$ti|9ywK9~S(bBnJ|E+$d$111A8YAK zW~a((6=tEyQ48Tb;(YdIJl#41Y4%e`D(HG<~< zY$8(`%bk$M-c=Ue@L}H~MfMA=0SKWLugG>U_}0NCL%o7N42{--1If942^UG|c=a^& z!6gMF5xUvVA80m2It6B2$0sFHEnP@jvT`-~5m0c`YPBG>iduzPPy;U}7Il#q~sBnCqw^9W7hIGpsi#~{E{y#x%xOm!LQv_hdCUZAZ% zit$}<0F!?E;~tGA0G~l;&Txuwa7yost(J+||E$*qrHkOq*apJLtvG1G&+xRiR*;M7 zKc<4zj1X>ru`H1k?QzQA91dH9|B~(zNfC98we9&dIOtcATh!T_m(3d16hwbS(f$Le zoN~Y~e)9An!g7^ZImW8Na<+?fq7SU3QDWzIL$*|HWl!C>j9wV_+TY_vFMf?I>HcvX zxH9v}D{E8v7hrQi9+nGY$p+?+UadLk));7#@}I?!iono}3COeekgd~XUktVnwn98`lGF zUkyB}GLZf^$aJlKi77u`C#~^2d@d}TJc?i1bURqHlDL-~9n5cDt~HXFJ}kA;##mBV z?6dyKPd2Oa#_h+|d$~>aI{&7!xHcTCUvs8cWl*SR$xuefCgJ%@1IBj7heBq|3C?xr zWIhyi@BQdFeM9-d-ffe?fJ67&zAnG!xZR=6ND?ZVm$}*?bEb*gI#BRR%HYAb{3oTf zJjw&P3&xi)*T5km{TXrrhMmhCQX0c80NiX$1o_r&t|ys&S`=-&cg61pYt7fsumVu7 zoJo>ZjBx)V;&Z1$LgX2b0L`}Hnmi>@O(24jftJ(ui)*}wHok(9z%c}YF(BV@`<+B9 zwcvj(Z|TAnL0CPUZXd1np457;dWf?ZmjV4mbH@hk z_;;|33Vv@w!|X z&RkH-q*jmJ@QhZ3_uzR%s-M1k_zox5R-hNO9n?KbLd&hQtPbT5dUalVo2GGfr1U}# z+O~1!+T~#llMpsJgqt8`byx=t9u#QE!l+c5KHq6$Cs_wOF!NigO^Q7AU1l4ZeexN3 z_YJioevd&@tV%a6hm&*Y-3wY``tBs^^E8i7q1g+63;j25o6@s|XgdUT}?f}?ZwY;h@Qs_a5HX0e&7 zL2xCi`$_(IW<^8NTdC6ulTp?w--xLvArx)`g;0qkBy3>9B&*jn`KWF0OImItEW+Bf zEX2eCX%K)$h;OlG2(uPoKqVoe$U<44f{#B4kzX4C1)(W}h0nsm7nhcem6h>C!qibU z9IF7f-kU=maQ5fREzeNeMcsO}JEi!YgyRs*c|@_`!Gpg6jlctspBw|JkHt%0Jk1OZ zuOZ1RnJrdVNaXHE%LT7WD=aR9o*$Fh0VN|8n>S2vEHbX@3MTiu903*qm2@S9+vx}^ zDCo01bqWU-l}t6>ZiV6#?EU!fztQ@u1be*{!$Bh}vJ0|rpbUpaw5C-~A z5u=d;N_8TulV31QqUQsW(>Cji?Sk<2J?}EjRcpks@BGxu)ARLiRQk(?Y+?pQa*D5R zg}wrvH*?2$gCyepg>+qwJ~L%5ko!|c@3Z)HS+T~0nmQ+sWgt7Lv!y4OpX3I~H-|nj zExHro=l<(^*O~_39G;&4*NGDqe)Ur!0ALvz86dIF2q?e(+GFa2H2Pyzfg#wWUY{eLHClnT~uXf0XViozn+G%(kHx%%Vxv=d?g2?F5PR<*>CG7$XoKKwA#lb zikQd2;{wmjlUvXIK+hKsw9HY~WPBx+rb-%({6QqcUUMd~u?#{f1L45P{Q5_GDij1y zD;auOO0sU|Vu#GUUo+*%XD^4Mx#j(E`u{H+;+iTiHme8(!R+x=T-K^$0(dQ$&2SBk z#}R<+|o$IK!2SqjKg_PMTy8oMsI&L?z;^m9gk#86vlSXg!caT@84s$4GUbG6imZ_ zNK}K?%Cz$5e*D0q33Bf)eP5{U$B@%%++{B}Gds)ZAm^Ka{0rznPoF&5LW2*C=0&$W zk^6hIMeqUI-Cr^4gm{s#^Wm&7arUFH#3d>l{gFOFQ}I)-0VMbpV1VY$@f!S4LED$(7r!2|qOeoq7YTR;+C9ZXhXmFKJQQ!UABZs6Sm4cj`0y*{bGh@!L{E5n%G{vq zN!mjZ31KW+-@!WM9JnoAHQXaQ`quMVF3g35e_8?GjW1_5+Rn5ihz%cdPafns!FrVl zdq(WjhK~|uKFC~o5Hr4n<&Fx>LM|klCFX&|Q*ntrVZlV(Gtx8bKqT%#+h=Ybt>qxc zZorcAdkju@tbAZH^!1hJ%SuqK*MG=%Vzya)Z?x8rkLA~q&iU({>st&2;EI~K4!Y2m z^4jFvlF|&|Lk$h#ZUm-%U3-`(c>v8E=0N<=yWZX_^!}Qoqz+<%2bxbm9RCv%|I0Z0DQ9jX2bU z0H0-|LZRt!kSy7 zSs4)gRS4h`F9i}3foy}9b+P!RdV~-ofVu9w-wT5C1Z#-$x>0z(T>F-TZzQs&kR$z!g~i2$8VkVb`uffi%7eXMFYZEc=HBGK76*O& z0?9};wYA%zAkdX_wXoI+|)$6{LT2YXQdTAuPPP0 zB|ifTE9h4WiQDLAW7+@w^B7dF4t^+^W zX7Y+d5|@7gJVye1{-fWplIWXXwm*EK>`<53+~t+QD&rG2HlLAIx(k#Cf!mb^Q77lh zukT1rRcU_yR;I;$TmJg%2QSH|i~sxYI{~%F3LC7dV(iBnU_?R#0K~k3v>`&=u_~4s zDP}FAcwggZfQv9qvq`xn()qoR&6z_&knT{a%27+zw()-djER+N|3=v$u z_Vl>9xZlqOYiFW}*`rWUe{j&3o2#q706&U*^@xs^13!DVg3kkUaaC}#UoxVO2+(>pv4z_h+9#d{v(BVVgJ|M@=og#^b^a6*Gpv zdGeVLJcZO`XX^6Q`=~_SgdenV*x&6O)4aQ}6Dpt`Sr9t%>67tatkSc{c4jmiPJ`5b zUCJSi+lweBq}_8>`N#y7`Yl;=!*nlO7) zu(pOw{f+kMhYz(d*y3N9%LP1mFa-b#9Ll=-zinu_x5XrS6cR;dX!FX zGV=F@jSQ0Ca(Wk+?H}pgqviig8L64ju62|+nXU9gg*E=UN%>ayUq__LD8i@|oYIZjD}_cP(8S)q z&)aSH&Zq9TNQkTQS0aB#3zf@xo2dJ_|F*xOKOlqwMr;DELfp4k=x?qfi#m@H`HK5i zZ8!eA)wc8c8qz31WB3)&h$KNY{Y~iWD&+bX=z~R%9NEIJBg7;E!2gZ= zieuzGT%Lr&@&<(0-st6{^$vHH?v28sk6l^+vCy@Y>aEIUn&`y|5@bZ?`Ic3QZw=Xu zbW^%!&*aEB*U*qhXvm4D_VmqS$7AfxK{JIjkDphk_HRd>^qYBOt|Lwn!hXbwE|O%2 z-&lAEu&ubXH1;;hoq?%RLYtS4C-j5y_6PSGq?OLR#%>L^gm%&DYoGvtTYEkO(wC+*c|55c#UpBCYdQ&LRUnYB;kTd{z8 z(4I)@^b^8oz+>aZ{g0ucL|j2rFv83sRm_&L^CUs58D{(A8tcW@l( z<$||eYQ$sa78WG0v;>pER-~B7U*KcM<^@Yj==6B#^`UiFQv`YZ{5kv7D~Q+-JtFwQ zVfBGBV4rTiTTwJwSb=I{(A z_u|yW{;BXU$r%~3*P^5XnjzT7?l@HoN=UA{PC8@9P9pcvHA8P_tDu}O zrUawJ^}xyKbM;qKg|H?~750$p@YUf2hICHWXr7?iJw(sZJ9pv`; zv=FOh=m8GVcu&JcvGQ1KS#!mk?l&gJW+>QE64C8^k-q@l zV%J<)KCUZNFzZPy`p=1mP>IlUB!%vko5LV2LFXAD!*I&VC?0~OM%yJs{4m_%q=^Q_ zm9N)nhdpm$?|!hZ{$K`%oG~{CL4faY-b~rU#IjF|@au@~e1X&ajRQ8`F8!vC(o+0z z$2Rdb`ep9o@OR$;vbnpth4b;c?}N({Zr*FMj191i5y>yQ+(S z;cjB3A=gP1U+U2)qcqw~cpkteN-RQq3^Nq;TwxvBLWiWJ9_8hQsY}MbHSB)``8(u@ z!NI>_=}CJpE+!VkdNl9Uz`P%x+3kImX{k#^jPQ06HfKd$oe21v36jbD^5x$^#teGq zQOl{Na-MiF0v*0G+atgtlG=p? z4FOF5NKMBNS>Q0=fQnLmXZ1u1>x0uVtR7g;_y1dKS!l`z<{`dB$i*shAJ|s|vrUYR zK?K?~1|DiYk!j*0$L`tq=hPcE176NaRweJufqAsADknuJ@|w11W#u+z+cH!L)z&J2ZvjCvCs|D}7JG&tg7)DhmVrb4gpWHYYmQvh zF}(lS7W2t@W@PE1=AfN0JXYsD*@`wEO+66%KEqhW;=;nbaLA(4Bu*spq`Tj@St8&s zhi38N5N3`=82Gf1U;1ujR63zBUjqt5pdwCHyH`=<&qF=HsE-Wte&J7#WB#=r^$8M`E2;8Xl9(JXkaWU4*(6N%?o$IfwNHE zIhuL#`AysKaUzv@){F;MvCWQ^@4fu>bzP2ft;YSi^&l#lb?<*S8+X3?f{t6GE=yx- z;mK~aB%9cCEV{~}?;psoT8|N5z^%B=!Zju?e5cgPcB~x!vAn)jM*&GLL_okDus7=3 ze9>K`X2Mnh-1e()9f~oa-Q-O!QxSPvEWd^Z0-Xh#ph3=F3>jj_?x94V#DN+lO@wx}-ss{T$q`SozyVGqR=?WjYh z*0xr4M00%8;jZH?a(5|xGYy9ud?eH3jflF%^@+Xs4~x0To+*_emNRy2Y4Ux|ug5Jm zOYOpZM?5sZn(Q9kMFEC0`d#*}F<5i2>*yoLkXKl{@Js_KzaJPg8w@qLh@@`0kcBX| zTFVU)A8J*sEG>0|H5d)l8FbQC(gY_soMr?*7d+M@)x=Bh%WWrz(RU}9xAK+A)qNA?J5?;`zPe zHz4Eo&7|$7PjkPwd;YM1!qR)~)={^}xPkSS!^q~~Bw{heWGmj~ZFN`ayA~G1KRuH> zF3T3DVLwB3DK-NYS2CT3IwJ2M6-7E2n>cRv2S!CCR1CBfSh+66Y&g_%HIHUf*OZQe zbW_AlUy_BUpoK_JsnY^xsh7tepQ?72c*zuKHM4I}fz9SYguuZRD=du<#yZW!v}ln? z>Nk_#9>Wy^l9KMAAQ0YPUP{QOY{Jw^@YqAHh|NsAFmkz)A#@DD3cPMoLPFCB@+PDj zlay8zPmvzVewBf(vuYgDo>Vt1wj6W%=Ka#_;1lbn(D3h=Gx= z(xSMd6 zmk%C9c(cY!f=SCzaO)?)eYg4en3>z?9|J;zhhLq6il8|l&=uHb0GQUL_g;Dm-b(+} zpFlnY62X3(q)O>R6Iy9)t_l??o=rkQn>4B(kxuRUi7^niN>y-U9F-rb>a}0mDv0d4 zUZ79Ur?w4aC6OxvPlqchr@V6BtFu9)e3z$OxAu zRMN_^Vz!qQvvLEbs9)(yuwb{Xog&{_P)Fg%ALLmqiO}jms3XUYfxB7nz||Y)$Qo?R z+a~i8m3z6lT|X@S)qb^ymlR8Iyis$s&i76)qa%W$sCvYkMBhEa!nP9uI7cLi9{K38A|2rQL(BWcx7+Na{WSj5;< z&SABDuM2BhVksW7l)-(K-G|i8d4a3Y2_Ebi^bLcTqz4T%G zrSohJ6=Tt9LH}lfRNc3AT&Hf|X`1(NcaL!5F7t~j_RfZ<00%Kb(vyB1P*xssmOpnR zFEnaYn3S*{6A~GMY#nGb1dWitfR?5t%6gDVIiTxGd7BH7^6(NMkdF7~?+ttTIGqRZ z-O?Wz$cwn~rTntZ1Uu2NFLFw<6*5f_AraYkY=XJSyb_HD$e0qEM7`AX^ypuoQ5|mj z|8L7L%bnLpIx9kQ-%-9|CY6OX&or*06<%Ov&F1buv}#*Dv*)fEX1dJrXDq-#5Y`Z{ zSHJ=I7s44GIgX z8yqD2(9Ieuo6c5u5?|z_7Y(34S{+8d?Oj#2x&zS~U!elS8$51s|6~{{tTS1%`}*R~dXaM`gCWZ+8szjTqjND=T6t z={>x>@gmw|y~tcV%0X!E^tV@IuU)G947G-=zbMdqw(RS58K5HiBWOVLe*c!n8D+}y z=PlNsMD{I?MBbhJdazn~Mc83uIhcH>f-zT^QpePYe(2_x%aJE|YPT65aLUXFQHN+N z8bmmX>->EbXFsn}B zboLBON^ec~@f*_z_bK}{a<>W=zuC6F5n@Ufxwg_~wZRi1JM_wqveoq5_S=rzNm_x+ z=zJdy#h;V*H{i}x6SlzuR$^Kj%7ZaKUz_c;`lo6BSNQAVM)$1dNQdClCG0L$#diy5 z1{fizvyqkc1m&=Y`E+WRvtB{+%}}}Pl&PDE4_WWriRm*iBdxmG$dLnNR#->(cq}*H z9x2JUp0jRAki_ zSYEz-u;0~@2}^dx3%^pxrd&1*D%E^w-LyahB^vl>2umaL&S8B6|J5hl53CT;gXalc zg}5FLG=uoSk#@ufBOjdV!wg*4V3&{~31u^EFK=$RRM$O!jt1j*(6u~JD*4I&C`C;i1aL5UHZfrWSg`U%OImFMdL z=IWge#g>xC*>5$j^SxmSIoTRq-Ypg;sg+)CE^Z>qtncE@&p`2abkX120a_1WyKvj5 z4ODhvcx>gs#U0IaE$uuY{ro^vNG97fUTiKYl!Xt-tWcw|D9Y@&R=f#{vX@0hWn{vBoW^KVuIVp%NeVxv09-Os1RzN@mTg4f(_?e-8Q;1V zd#k3<5X@UZCoeX(gh`zk=tpQDB>%=DxJ{rS68fq1zO6;*s`{GGh__@6M_}o5#hpJ; z>!DjiK3J6C0A?15Uf+JRuQDqbt;eK;99D{{I2@5nV?p?Pu=-z8U~d)$V|0CUAeSV( z8EUzbk3agD^=|Wmcgx3iHlWrv4^KTJC@z?3yGi~M*80JD%TL&VfbIc1Eio(X+kXaq zLK+P@#U*5dH#~`&*$t!PR7?p>>QP_{VBCdxGe+%|9=lVZy+o9i1w!9C7G2D4YAU*-&2QlI|PV{q^mBRRyw>AxWmg~#s_*_mOx0|_sOZnA1S|&v+ zg|c@EKXqq?YWF;ny14dBz#~w)xUaNw!T(65V}5dMD$CiMyL5l${?L8MH`R@{FKF}B zw9=Dc-jMuYVZ^_}hB`!izEvlk=#>xUVmfAXF> zm2!;3IL$47(521irL18S>5uO;!*=J+&biYGvju)t&5RAP{5B(&PgAHT94fD08aB`+ z-XeGM(7on&gX(Uz7R2vgw%EV#_}sHb_f`V}xR%|6&rh#vpHyD$GU$(G3AuWFg`}f^ zSV#K60Y+6{#4kL3Y40cKE&)D@>rwXk4XWyk&yDD9%P zB#Tm-<69EkcgmHN_*p+`T7RKwA)4xV#grHyk0%EB29%6AQ7S|`8uXSsuEE!N21Xf4@)OH#Z=CVg8lnGE&97|f{ud$c<>t!4-eHO@DqrXa19Iy z2Ejam)ULGTH(+qT0TR=074J<2y)uIkv%^;ogkD@QGFoSzSGBX+hTDYWk{`L>0Np zoQXG<)M>KJ@4X2LCVF79en~E)Q1+jM>pyiRqW5tEO4K*8;8#~)KhnH66b}eAUi@=d zd5i=%hNUyV+GYyV#6Mx3bWu@d;qg1)V`8cD&FB2<^Syu(@vmr;D0gN?tVK`LE>k3b z(YZTnvON`Y+L7#g`PpZ;EM>i(PZCUIZHe8d%yGH^+cWFbM@|C@DFNUDujmCVMq8Wo zzauz&aRlNxBk$s{u_?8LE07Q(hSh8AjAsFo!ZM_L$4#+_NI#ashQD~AF7VHHwr<^^?+`dL?-%nwBZx|?H+%Wko{-3OpE9)gs&t0Gt2rNwA z9|9Z;drs);ho{EDKjIYI!(3}6{kF5y>Z$8-X!kDWwe7vUGSfw{$S|~VK~1H-_b6F1 ziX~EV37a0EsKSwqLkl!j=*G${64!>XliaoTTtmPz<}F~v*e550WqfxGs;aAy;(5gJ z6_w6hffIjiTw6|l)Z@Z&?OPXABCoeqJ#6A5LerglefQdxD>Zp`(E)JCN(*qAY=VPKd*7p z39ch5DiC5u88`;d1HEJLH&J?MAWR6hfkuyUl0V(3r@I>?rSA8&LRv8v8VET*mfM+q zn8&2lGCVzqr&S4+5_^ws@WxTSLxc|Q2>Mz&BYEIhgoIm&36fL@p_MCP{C=saBnihP z68Q4kys2C={M&q^T3?X~xko83kX5bxHio(_QJ=UK|8xV^c@gaoJ4?JA_G71z7gMyQNjq|`mSMq-b}JJCzkkmO6T z&2r5-N!$+~OBicy4YU6@V8}P{(m^+vl381xU9%I0{fgiZw#9VfH-n~Tk~ld&PqVA0 zJ>M6}+axis93nPZ6*W5`Wkte#F*oTQ#6KjzS{k`)NH`yf?|&5C>G@FT(=7+7WFfKc z{;x_S+%giR4@4-4iNK6m*M>*za0tMYf~4?6Ky5FI}@gY*1WLAxazT zSTdx@PWx;|SxQC^>1Y}b6JKuimN>zg^@`q-p?c)zfoAHr&R_O1Zcd$_E28t;BX+iH zqPo7tzzNGU?A3W`a3snG`1NGRf?;6z+bV zr!loP+L}$eVKeV_ME1(b+!P(qpz+TBnn&xo{dDg_SGfCnkegefSH4eXT3S>ZC5f$( z{jah25?Ex06WO9d!=5&hGSGwj2zF&);fLeT@Uw{NS#Eg{t|f?cA|&Te5P`}7!z-E^ zx2hr}{F2AOcvmu|>&g3+jb&N^PAA2z$JkWXZA}u+5133%?LJ>QeA8!7oY4NF@n{G~ zRDL9r7f1R?-U0X|NN<^CU6hat&qInbohjg zhOw-c$?x=!zjasD;eA2JhZcjF#|9miXzD!774`=voCLL7JycDh?9kTMhI(LCD=$Kv zEdd~<4}9l!HeiyWp2G_f%r+RG{W>sD17LEf7Vr_g?cfO;LMTiVM1wOxat}BmTSoSt zfFMb70L((LSz|dk_5!P`Hz6BGm`PKIE-nSXu2Sgs=i8dqfUZA3b;E9LJuh(?nYW0M zGw}M_;Zlra0NSdsi_l>|G|jmOGmt-pKnGf9xs1cuDh4VP8CaQczkJGqY31(S)9228 z864DcutPaP{eq9f>(Zs@FqzNtAc$rv3c{G{zYr*V0ckQ$U%i55NPzKgI^N>Vz0EkF zEzCsNhk&d9y1LI5?Yv^=Ep>)K2W|DEynFLDA(%J$28*{rFNv6xyekAOlh*}UY*ABb zDWFiNJ+j?nQ5Gvt$WcQQ;_(Hl^scG0_1W$6oOl8ih}Bux_DVL`PclGknIX44ipr=h9AQ6BNeE z&!UdXiSFfA%KP{u9DA%q2@;w2y$!zoXPrg4U87xjZg)gpSqHW}J3H&G3Z5Lhfm(iE z{ljOlq7nXo9G!PK)@>ig?Y&n*LN-}RLUyvUAKmsyLJ~q!$;_6Stn5-*KLwvxg%TAL^s+vqR_nZZJT8(-`o<;-fZX5$D7? zLO$NTQ%FZSwt~z{B!0s}E3g@6C7BPd3^C&^MN!CI=l313yAgr$7b)0+dO-JZaB)pe zOdLFPh?td=VJ~&?Ag7zMnsB0`kVG)+6Gkx?Cf8#T#Vm%J|LJh==be3;EnNPZAWkAy zyXcxgrAC^eyw<+xEGnU(#FjDVSUC%JlS;nHqll(Af4%i1nfnDd_k^A_=`_fg>7Bjr z5O5%#pLS|nbGEnQ9ksw)icbUDlnn=N3y(G@vY+p>K6u1>ZtuH5^TSkRbswC*HahED z`YMGV9k1>b9X#5`O3BViW4`yLaY?yA*OlHdx26x?ds)6cJDc~GbZ}wU^ng-Zb)f)KADk-#;6z@6^j-A2oCt7Y-OCb@^@H$9lOv@AXo(#_yDW z5X4d3I%hJxT+@7va6?e+qVL<7m@0OzUGK$oUG36CB+qib4q2EGudK`Px>|L zJ+QRQR?6Q*cK1qca#2>@d|K3j@*kd&{de^YC{9rux4;64{npol$ZyPFXkA}vzK=`k z%l%|wSf+sY5A&&M=s6+jWD-T7V{CAl-sus~M!15-ZM|Ux` zO1u7A`WAUv5mRoMwDkKSt)V~rbR{!ymzGX{3X;BV_2NWoD&3?tN^1pLRI1p?*3Tep zMQcD}BOlIn90z_15)yGbV}%O(Wuu54*5{5miR?UVnZC6nHx`kMS8CxH0sAy;;mh}} z)bk2zycuJES6EgiB{M(576%Ur+(U~q=&j3)vV>xGv2|&#BwXk8fA3jjb~7bK4!tV= z-q?0Tk92o;YevE-jrepZrqIEHxy0+!EC_p9?jk;swZXogq2=nao&I<0@P47~KG~ff zz<-5DgXI=wY^UA^5n};-4pGE+*n3)zKm#cm#?V0RF~yMc{N%W`SFkHhQvg`3Rs?wo zJVir?g|4`Ff$6bRmQH>ghMfvW{_GR<&uez9c7p2_jK_6WSXW1RtA}MfK5k%!v*)4p z-784)isYxXLiavx)&K(8hRqLqj2@jX1RBY!vDnz`JK}UwPKTS*c!uE)F);!!+qFa4lbj&R!t@c>E%IuOvW@bJ3V`yRuwt9s#Dt!KS4q0EVL(KJ z(&3tIKGeGyx3JREbrVsfcoeZQt*We~2;)W$A2NZ^pClV#EsSCeJJtBAdV84yITvj( zXJC)RZAE(cV*0ZN?BrpGL{(Y%Mo9h>K35Jp%GzpAt~vZ3@#k3Yr(|Uv0^z2}tQqGu zMqR>c2(cguuDf62!}ya~|)iss&LMB{Hys&gY9qJmA#C8K+o zdS5o4>0s>sh83{$?OtK6-QIFfUK_h@Yp(qy{AKk^yQw-e`;D&qr_N@EV$}aL4nN@L zM`0wlv?OtuOmofO+`22aY|tZlkD;7>E95sjRvrxheOUB2n54Y8HVq0 zmq_R^&>64HV(g)Jg2<7>fXBU_^hM9N)`e{u4!Uh9z{QTkyu1Q^ToyS^oqsgpwOKag z^0I9kY)6K?m3H8ILB=i--JB1pney)%G;|T66ZwE4VtjWMH(S>=#u6zgIiXO1r(E;& zt&oorHJmfHZA;g9Vd}hy4O?-skP2-dclQged#9N6-ly8~?O43$T??UQD5clTrlpER zk5z7AtOv)6u7ks#E#q;)9^d-v!hyfr)M96tPVl6jqfV#n{8i7S7n@PCU^?opp=zjOUFW!$Q z_LOPugYOTXD{e)dqR?ZBY?d6;sIYm;+OC^Wzv(MYe{+m(h1~lwL$Vy#lLl|slcC&i ze#w<<3eeC}bU3FZRhO;Ypt<~vhN8V@GtK41L`~zMYnCE&?S_uhMJbKl;({KJLvIM> za&TTfbq=uaj=kzB=>oSFK25V(Jh_v8IiNu2&Ku|1ymQOcdg;kx6C`aB+loqKOU&_8 zFJ#~DyEP}ZPib{=${ zJUrKKZt9%>cI{(F_9^+vuHs<6&;os7?KJD(%YxBlp4~urqXyFLP0jC8Hs+1h3z-G{LVFGqOU# zE^XJSbIjD5PK*@yYpG$oh1$n!&|8VTh4KX5XGynVv%6Nf&zh$^6gzpq{lHy^L99^G z@bWL-Bt7pu%`5a2WWH)r$Xh5EZ|5#t5YQw0FUgU{kbd?_m;ZQIP-FPd*L-n==f*Ey zoNT|}4tDg! z>kDi<|KwgLoUK_kCm>SJjXboS1zR)-R=8CH$_>l3uW`G5;@1dOQ;0*LGg9zM)84C@ zA(Ie#Pl#E+{zcp3`w&I0pkz4BmGZ$?NDlc;fbXNA;QE?zMqoBSF|MYNktyaR4my&v z0IRwv@*Lzz8geIx*QXSNWf87~qnO=f8n#z^-#LAnVsd{{_u@d7Z12mmu@5+g@KPf; z1l{No*Wj~ftO-3x@g#1Rxlc-FdcmqCluEPp26G6^uCfLWBJ2u|e#lGQ_y9lwVVTm6Uj$eQKQXzG)Vw=C8c(FUOdMO~CWT1vUmMwDDnDC-W&ze~|2# zqLttWHjSt*!9%f!05Q>)f`!%`kn6TaqUopH-IKZHJKgI)&9*+MXyyHtGxVMqi305` zIP1-akWK?vDnzJgicssX&oJZIj z0`Wk=NmVBd@-IZjFY*p|d1*52QE9*u2#Oh)%me)Kf}xj#IL1X*=QEp9fzsm*q*+V5 zshxh#cZ1hR14?(;r#c@;csvq_41Yi!BEhS(-m_c)wY|B*L9-LkVq;B!n&Y?_C*4uN z0ty%7U50%?=pEDTMiD#B-`Wi1CQ+?4Bqx`s4-5bFWNGg_ z6##ZdJ^O)#9M&ey@X1%{mlVA2PN%GGKV}>EB0SA-&xmR-lq2QvQcHg>tE z2}=PRjd0>a?#aGV(>D$0q6W&(6s=3l)BeYFzw`^RWUg@(JthCbI(;`eRd}y{k#VsJ z&v4!|aDgB07#ts~G}uXgOFap;qRh!8)v^u3ftuiJ{u%J1BX zc`i_-*2&}H>3$$BW}d2cMOn<|B7`sR#XQ)}C;e0PyVKkehAwY6tajWXs(wK`u-=3D z*7eKBWv=g-W*pmL!TbVtswDjwS9xI@Vyg(Qy0OaYQMF{pj3|qimhtZ~|mzTD< z*a};0$6@Fg6CH$=Ae1NOTfd?m_tdyMqyCHPJ4V1EMUCqR6mIvz_5cW zI!D6}{#M^t%tpikaO@iQg0c5eXkNZOL0LppB}Y z8Ox9EJQ;lTi9n413S~D86JkN2%q_*yBK9&!>OUerC}A8H#eQfm?3s0 z#yA#{tV(~ZDu!9G< zq+&ucRbTT4S#?gNk*zeBup#CzeJ!b(nQ*(~If>!iE&T~NxnMV$H(^xPi0jc)>(uGk zw>LJDWs+5A;luwmtt75^SOHH!RvWw#xJuglcO~@Tv%{SaF@VlLrqVSNBO^Rdsv#TV zt`SJ?1yTtusF@s>4&-F8nPS1Ll#7fTR~sE^h2@pcpI@~EN;Ti7i!QFIk%KX2Qt~v( z*DWxBuRwheoPotMp4uZv+OTPEYT}Y0*vp&<2?>EH3u|N?fh8jzj~u^XiH)moE$9-y z0QU2hk5N&ggw$-=b)?ez491QZEjq+3gwVwDOLT*;y)YO%+9>LJPf<6 ztEY6fl114P6?0hSce4nS@d6|O&?Im{@30Za6o!K?Gb2OVu1OjTzFX2Sr|OI+`hNH{ z+M?n6jrFw71&PClFAn7##KRBrkAfi@Jz!+4ZEZskVFMG>4jVCOSqxSMB)Q~bRSq&0 z^n+Ig`4_RMM}+P2i3H?C1gx+qPPi##J62zX>tSqkGz=_E$7*~x4;mUCZGNm+Yyeac z!w6LwndJ2K9Cr~qfo}eQoqyYKS&=1sLlOMw+fxiW3h*T`Y}|qfTvrG|*)8a*LbqlY ze13ndFxA*Hu9(=o{22JX)5yPopcUWqIvQqqQleHE0Xh?_KML9Wtx1}62Hvg1R7Q*j zzzUryMyJRO`8X6>Z7COSZ+lEz7wWsFB;$4xV42330)=#O9PT!3xR9qV?ziX%t2`K* zmq3DHxi7$#kR@$HCMNo0?gv_t= zE*Kbin||V(S}A0Ui#of|*Fo+rtsvR`H)#4*#I;2HaFssY@`7+tquabD`w?~~Vqci_8 z1Z1^!R{bU`Ta#-TaCxbpJX=qdF!3q)NWdlPKv9~Wc@n&$d9kQVJfch$}T0#L#Lfj z-an-(&uhr5l=9 zIUA{c@q@5r(Nz80#@P|$**K%Hka>JMxmNMFPMHPcZUr}tD`JN*1;V?ArR>ES|My*1s1TF&^jWQX1j?p!p^nGnIN*%-7 zZxR7+TvLQOGS%{l2+aN(<9DugsMq&0F}9-=@Lhd%)j|Y1fSR( zeoD~RjxZKIgXibmImFW9?j+VT1_nM4W)anSos}UL(O=LmBdG3!8h}VZ8JUSoR@~d< zW9oC(Ovy<9z$kKzO50dlAsdqto%cLXY1J*~uhIm2wj-83w!k}$w5i(pr*<;C^yH!g zZg86_>-fJI43MgjdVr)ZRDYV{+P*DLn4S(u2`b;b&X6Ta{^wKBCW*txuOCzNXBJP!V%p5HLi48K+K?z)Lih&waXT}o3*KeT zy!i&UHfb1JLJx$|A#Jam<$RrIwCDt{GDqT++bp@R-kHp+RW{{t!GRF%s8q_*bOJus zj}sNJ4>>2}gWg%sdQy4+ekg1cg;WPH=LOIK(c~w$H-8Y@W~wJOHD7Po`N;DmK~M(G zTCT<20A)Trdp31$&sx7cvh-UAz8>HvTw5qS@l(T6y9NC$X%$o+b68E{lm7Dfy9r=@ z1ZhMo5h1a_L1%pyW5MqWQoVE2HKY;oC}W6f2prr$&?$CO{U^?Ws>#02jn>_;?w^am z734nf9`b>}3qg9Lr3SdrPGy%8EMO;t_yG`b>>Fg#pIJ#xU@U`olE~0wlZ04F%DPhD z&~S6;TxeuAB&9^)25Mv4*6H;J?0gsaqyN?h@9_>$a!uwOJ(+)NSmGk$aq;2E)j;UC z1VfqY>(W4kjK2BS{>{q9#(*$+Jpi1*lxuv0o00OWe+1*thqs^@zWKG)yOW{_0Iv0&v5PN`{7MnbNKdcFr3;Nn##=Y9 z_oz0*#=8wl?ICS}<(t)pPU{To>8bk#x$eWL-^U6uY0a_w0N`6xacx}7z};z85Il%6>LMRJ#e z4$Z#dm%;AhU@IQ?;yXN^@N{iQlQ-k6q{&7IVMprB`8O5LaqBwIXda#J6$xjPRtaAa zCO33(z3JiU)tku4K-Dw2Tiv6}B%a3UEsaJhd2DC?bVzrm_cyA#|IEmx!&z@jhO&r6 z*_khK?r1vW&FyW$ z$-%7c;^h9Hib8K4EsS3Pz`n-t^qdxm3;UySZq7)h$qrch|J38c{UJr*-hDRS_jU_BN0a=Y-zOOp#PrjHCY zJ72dOP&_cKM&)6b+Em6$V;-c)J@Y`5#%Ijob4lQ%HQzvs^(ck4luITd&f)fd&}c_kqAr6 zB;IWD#mGuKE5{9*8NAaUOaF#y2tC2tvwBL3HR00Ve;7m+g&ah#7Jj~!Ucl`jOfxL= zM+go#x%g3L!ucwTyRI<|21u>liX6T(?{jAsxobExgyXcC4(>&#TV?lPcwa9jbwzgL zr%t-MB2V@{Op_G9NQ5xIn}TJ{zbX~m(`X?u+Pt!a_U(J;e|R=?=FiOo5^F~qPGvoI z?EX4k8H@Z|Oq<1vJ$6T&nF%>BG(A#(zEQ|6adhY7VZk(=QJ*!19=a_-qrwpnV$+`u z*G|MiJ_g~nR*UTCZ$6WB25j3O|LTxK5*A)_8;U%X`WBv?dnm~IHp@uA3vx-B=mavI z2{laEldH6Kcq{mXRN{0MFzmu1#xx#7_r%H3@i7px zKomt=%)I%IdSBM*@n4X^&uhwsCA!Id40*=%<1mTa8kO^KPc_T&MJ6Gwr=KVYX)3vW zivs7DJP{_1T`y5pOb`!hy#k*gFvQGPf0Jti*i(ljg5M+OB`n%0=Y%_MDE|;@mEcN% zAj^h8h~-y8xeY99O1wgD38!N*269-#0sdUN)aKj~f%EUYnoado>(!lqxDnDXO%)$a zAkOsg+s<+fiL-D<&{}7fQ)qTpR?M>(&T__BN8!uUMMv~$|JIS_ss^#|bx#6!1N6!- z5Zpr;IIYCKKu>a1EGsMPDlSsYZo%KsE0GrxdJQLw+#lDhIi&XJq$VeQx%APHk6Gb)zv-@QwmLo)FxhfR-qHL7o| z)nhkpP!%c>>`Lj|I`77)ov|9)zt9mtv6p5i{irf;x!)bqDjlA1X#=@jp)>#_1sBKyKFo5s|WCG%DB7M&v+~Hq_#yo2qQ>Chlrnts+hj` z13j%$r%>fT4cWYVa=9-*{d8Vcy+pe>2_de}1K`f;U^Wc!;NsvkCq&a7l$IzeDk3o3 z#8X7o0`}Ckg!wj?0KP9=FK6m~X2NIX*zn^T3iy}Zw(1442M(m?-;8XO{&rU3zyXP?<4AG#_sdIp zg@GN`E2bg3DU!7G^pQ4&FP3$V`vwFAAUP;(0O6et4T@}>w;!@R0pr^$--KG7!7zq; z>G+G{%fwrq;f?b$`gS1>5t{NDF7FbN4e_OG1q1H@M8vCTYGbq8cL~6;mr`|E!yf|h zf<1;!j71|RCWd;Wljd(CH>&VfG)i|1_WDw4zC>r_T3d3MVLT2$hZ}Fr-K4lU&=-L7 z9zFmSIatoohrcaKhesy0qZpiP38c58X`P3`b3)8kGcXO$c*GjVWD3&VDGu0w069b^{-#?UcMR~_5bnlze;Ab2M9PtnlOd})iy)g zc;f#Kas|U+9;mFVW0*wdiQ%RxibBf2l&&vo=U+h*K4%&?Ar0OrbiA zxa}Mi#y{LJNo)C@=W>K2a$vBfYbjnDFt}wiI6>Jl93f`B`DP)sW z)>^cFjX8O@8P-ayMzE74?IFy}WN{`I&6Cj@x!!~hCrOXIO9+a#WXc?C*=>qbd03$A z{C%;5PGJcjb0HIMP^@MNkAiDEoCUs0I>)ie<$=2SlA_pv^%vVRiSbfwERD4YMbWN~ zRpB&)?^{!xF2Apqw{CL_6<{?3@I(qvuv}8$U&}LRRsn&twXun_|9^Jl-o3I>TJZnC zsFH@=Ef+8vFVwy#!m?SVU2yOIoa@V(8C(b#u=COk1R9uxMe+u(bfzI(-o(IT<*~5p zx_}R(o@2KurNbDM$;dy(oxhV$9Lt82#c_iTJQAG7ojY`aJE)< z2i*d2b`VSa$I{c|>Ua6_Uvg$O&2<{9n$cw*ZB9qb!oWDiON=YXGtXW=Eotd9QW$b;%MUkR&l)zw$+mz8Da6^z!F$Ni6*F5rx-FNBcS zu3dwwo;YMZdKKmjyn&Ea?$aRIMdMB9olDk9c|m}}RYaZK*3&m|sFI4QLWSEmthSGB zVDsboa%zrOY}SHQTlbAcOAO;2y_l$5AVfHvETi{mAhhLoY((($y1*jouzftSNqe2e z8Au}TZC*80|#*)od?%@3Q9fz9Awt`AKP zE5AH2l3n@DWM`MuBa;^PNt+ne-PYEm`T39ElR6KF_0t4jyx>k* zc(*)DM*Ap##t1rDsF8guHFp~>#$-Ix*1_SnC%#+oq9}cdTT^pXaK>7oL~$%ON%8R( z6%#U9^zBSi;nz5AWU^wSqkDRLb^IG(`S|a-GGhtT81IR3?a;2u4IZx3olSnUH))ZW zg(;+v5g|*3&P3TjZU#jTFmORq>!s@aWh+0cw z?YlcE?S*FM_ABY}B)v!Kl_&H+@xlhj)3%B`oNp@o3Av3fdQiL)uYGo@TA1y9A}3uB zjOCz=e&ju%pwMhj_Y#^v;CHX{9cF901NOq~!6goEW2rFJ^dm`4*N8|^5DM|16fIM# zRMiykD|B;3Z-J^0-gOxPB}~FgMz9YU{19Lv%4={+jc4Ap!1wUO84)qD5&?EWv*7># zb5)3*Ec&4y9FC|~&Utx}t+T>CZnnR}=fP>9^@N231r5WOWsxPPo-;(7Lg<*g=jt#8dW@9q|tWi4R30=u6+HL<+kF^V#*%P7k2E0np`XGQy(SsV4Xw%07VD=z;RR`rQoG(~p>gl5S zx2|?P+h`l7YS80^GXs{sr>=B|-vOoaW$xj3)Cj@RNGq_zA@5jyOkOot68yMDBnfFw z0I~!JA2gVoSoVZq=2|WJxaT$K^Z3iRSD*ZoqH40Odfwm9b0lN~`-nbM-8*AMwi*Vy zL<1g_>)!+*Hhl8CN0vCpIlpW&{&^*!1^WfWCRD?Nf=!C>YCc5&Y?f)<9puQVTAO?b82hMzSx>+Ak-6dcs+oX8D1uW5dwNpe3S zHEzb+=ggT)?=nxYT*rBYPG%0`AUFaBTEP3+a~L3n)O{YO!4|^&Bis1rQp{e&)1-QF z-U3sgeum*xOBqO} zPrk}f-?C<=c@>+f8B23vUxcT387#KatG3O)f&wl9tQM;pK$zN{YZGbtq>EnwMsBUx zPvFQk&vC_viHfvv_XY*%wg?`8jtHVhtt+pAD1!(ImVnvT3$hM}_8>xgy5epIUtNnv4%BvUzOn6oevB<3zTT}CSge>OB5 z$k@<@I3IE}URNOg4Y~Hb zv>{ECz|;B(uQHmL zva!W>H$!m{XDp~A)1;+YG^wFpdvB!D9sZ1S5N|}kJY0uny5H!nD>7?*eHPH3c#v=> z=~-!8%GlG0*M~!vJG%M<(jE7Dum&jHBK;LYt-g(!nkDSN@bv4oy}PMM;^Drl+ihIO zsjFI2g_&rND{17wmtS43+8%fJ^EO1E+@U6ss#T0N*PY#Y|K8nA+?+1)6+<~)mq1~) zR8ActC&OrzyKBnkHe>|X_O&?tOGuN~J-AXg+|ao*N*88MoSA=~fd6}Vm_*$juqs}$ zfR=gnr_`-b61BDM33Uu$hR>^6#;%B7BL4aF=U8j!&5Vyny|$2ZDKCQagxvNklK8Zn zPjqv*)wk@^oFFj!s!4o&$-~1l%$l2%gY0$->EZ?Yt<3lHCzusS(;YJ6SKl|Z+`Ols&m_a5lf)UH2i^IDoQrC7rR+m z!*i}X(#;SQP68zDSlwHS6jA3x$1D9pve-q939Ui<~jK?AvX?AF=RFPfsrh-So5vm<9q?8_{$~fMNON2O_;)+1S9K=tt5!US>c?5S-XUJ!eH6{m{`g^(?BXg)&I)vUcP#Df5J;p zEc#g}4&aozx1Wc-m0n~Ypf);WO;R#aZYIu;89sRS(h@vLRBkSxU3yYfB*n#V;^k{P zH9QB3J#?}Zuia5zw>9;?k&u#V4c%4=G1VATS%m(uA3c6_RFty>nwMAuQIk9xDUzEi zXdsT@do$J8R^+`;nSM)mWOrP?<{{aepKDV>+LzvKOP7@$p&hpKX#H2-_qKHMX-8oj z$N4w7$8{PhIH)Wi+;;w*efri6^3vi&gwnqv@{OU5W@z;4-aV=M#5L0irz?$+t0}g^ zUXOG9?0n0?#j&E~-6h&(7L*hb&9VD#iazw#bh$qE;W8-Aa*_fYuL?Ldq3E9X!I}Bs z$u=>CQrf0UW2%Q~;uFyOZCg+Vf{|9Sk;EL4c#YV#NoswF(a>>I;A&1iPHzxcNy zKtrMZ8UKMxJbd8dvc|ZRjjcbzldy?6H`g4V?GH5rH0aR2p?rSq{|@{R*tJ42{N4!J zhNv*E+*BwP1_~L67R>K3`j5eO9of)KU}f4?VX1>4?V^__ZrDI^Hk5l|ZCbE$co!vW zjkD?3V72leB@HKQz5zn;2;+Yw!NopR$M2{_FNy6ILO_YqG@{d2`-OY`5dg<=hP?S! zL*Lh~U5L*ZM=RC<9c|nVQ(-G46e9tFfyA2#=d!n_C(3wKiKr&v7sE0KNbYNW@6$w# zAkP3 zw9X*HJ62y z$sKmpBH)D*rIHJ}94YPECnv2bjBs?jNeDF97Ctv5NA5#vhm<~}Yc2PL;B?9&6+l2^ zAG#M(C~p57V$^p@*^_d8{F3O+ir~-J9h`E<3@RzS#jmJ4VTFZw&a;@a;n&vEqEbns znIhkU*&3Qu=Vu=SRHE4w{+(-)W=@{(e!iVyR8>hH>4CIQtK1|}1WT&0Mq2F`ByyaU z{Lu+P`n=jJ<^#88jKb+plNnK{-{9H)@43EAZ-jAst?xUnz=IwAYq~mXRB|eDk^7(0 z1=+P{>%U(cJWlPIv*`ASpg+F+y_S(Xg-b?QiQ1~E^nsow+ti`Zaq=*S5opwL0omKz z!{?~ffg|0kar2p2LFK)Bo%|%73KV=JvPcF+!wv~|$`Z&tnJ<2^k&P&V&HGD$5#DI| z(7(ZM&BQeuAdUGZQ!ihtK+FAPq2Sgnywm+S0Wc*R`=FP|%{tsJ<=m~XGA%kiy_k$a zjIN#@-t7Ra4#oc&;`U@@#EKCb9T3q->2~q*R#;b@sIrCJYvdDDyQvDfpbit?pxoSj zLPCS?--$?h&W){Yb!X1-rl8L9$iQ7(KO}9RdpZv5WDmWE$q)TjXEK+X_|ogW{QQpr zsQ_fa!wV1>In_A+^{eMd24U-l4z+Tr6oS@zcgBM(2Ex8UPOne`yw z!{$22IjmC`twvaXi%BECvY!^9Ka6`ZcHpV$rB9$(DVE-ob40xD6MKirV27ru&*Nja zcjumSi-va!SYS)jBO-q{K|d>JO>x=Iy836Ai_&?>+O72C0tkq_3)1x-qC3No{N^{; zq`{nVJGG#tAHyTqI?HD}f8}j7JagNec@g?FKBoS^dBq`BzGNK2hX7=BDDWhSZBFak zyBs6A5UvSH6H!>hnTs;jCK@M!PQC73D*)@~U29o-l3tbpFS7Y#^~8O9tp{khu#y>G z{SmxZT5tos5|DIS*|9yY1|}x_3T}P);jj@v=s84j+S=L(Q(E{UD=jUJ-;SapmIrYB zI5#j^J5ZN}K$P5N>7mFYTndptXy>#tStfUkpb#=PuEdz*df(~~T#`_aleRB$-N%dx zyJB!VN<@Pp&Bw<~M&=>M4OtxAvf`?urI%oJ#Ri;d{2EckB`SJ5>z=$V!Me)!AigZ- z6=ZLclalh4&gN(riAzeVVEe(Or>h%Q6^!KsAg;);fE)`eVF}CIzCXtFH@UdDZe(T( zmN_eAi_ZUybqo{H5flfb|MJxxZb8I@2L&6~3Mp(PcEMTIt!@^|8Bn^bOTpG6UTUo z_IvTX4-q5tl5%zbGi}A+LgLvNZ?(4yEC{g0!3<_@WkuoN`eNCx*|(_2l_y`Fh4rXS)D7vuA!j6mRCrhJzbpkNZGu3U@P#kh^lw~=_Cnmb>x}1mPg*G&Y_#asl zM%L?znK_!os7A^+-(}ctaXbP1y(`l9{>M2-V@BqTV;*=1R2eB#$|A z3UG%bp5*lx#9X82KN;T^^ofVbu{DTsW*GZ@t%hU5Y%t%L@yX7e7-qW8G2aK7%m^Nd zV6|Jg-J$Ylbz$-<-9I$sb~S09eju^fNklSJS?r){j z{{BHIJWSVDQg*-3qn^&E8W@$ps~|33cnLLg)r8j(#2MpWEw{OCTENf6MfJ|sRTD&r z8zsBMIpXm&MnsVLb7C-QY+`cljfhASt35(zA*3Q@q&DMap#*6`TtWifZ{mtl32(b% z7In(s-@iyUtmvY(ujJk{`E&8d*?!>~dg}u*^W3Ta;w|~U1)45GahWBFnGKq;v$405 zH2Qk$OkeNnknm=~Ha{%Co~FgN>fgP(n1@$eWLzY?37smuedlzJaI{dQ8+D$TzRVTw zEiK*Ue~IQ+gaGrlR9}-XHK+V#cQyLHs?pi^+5G~0flxf4RaGY3W;SBm6+q4>x$P$uk^Vw7l}|M!jK)|;smkhn2Kj1o+~!GGXi_JIkMEDIxf{Y`QxrBCP-(}- z*`wo_8^TP*#yJx4Pj@NGH}fR3|03-&&x_-Mh3D(?BEsIka{JdasV8`}kG5T)!cbY3 zwt7sDtN-$vY3;rIJO@T8hmXv+I9=?*O0<3JnAVKMwohO0eY5)c^S7;3T6m(A^~K5J zzEB0l@5o;#9fZbjQ%vKJ0h%Ysf}5$(eqaDL_2kd-Q>P%L(!D4yeq-+XP2<}Tjs=rn zQsW1btd?LV+@62G}7RM%m1t5Tr--68~k6`kTiGE~<98mB1CU+)1a&mJ75`+U{q2GfpC@wY@ zTxoE{kncfuxAG^gt%9Or0OUj%tA%MD!_EBl7H(9G0I0?Wu=mOx(u-ascaJO%F%o8j z@O68M`D)l1WY@6ZWV;hq^ugEzV9SeJ z;ybz)WJHvU0xmX-nOeb>pEim@6i#c!ZMxMIF%c}h8yYgoojtzZ|{1(?7ZP{ z*9wadtboa)N8sGTzr@YC{T(Ryj_3KG@5`j>bL`&z5KwGRs7%YW99Y@UbDY;@2Ah7|KX?nU@W}~i6?M1cM91< z(=dKizOt$4PzKs*;<;MKk)XV>eZ{)mJ+JfFXc@!s#c=r}Uo-vqufkBeG96TxE}U7)!w?j~GiJ%Xev0LH7&cyWZ&tjbCTY1-?0JM82mT z7014gqY-eaG7E`R{X)v9UDtbTOGa2UNrSZ{(|0pabtafS?=9X7NUx6+&1=7-_h_kZ zg)x77rFmPRnS3gGKUaYY#TG-Sz}Y+&(SBCVoLd#lIQH%kEIqix`!=)^B#Q*#+(BoZ;Bh&1d?`WiFeK?^(wlZ39hf`4fG= zUVA)TTkovmUh~}WSUZqbz!M|8bk0z>@b0DXDuQ(RPJUG6%Vu51S!Hk4s}qcPx$g?R zYTD;Ap%D3B`7B(pz3nvpE#UsbrrS(scKT^?#8hw@TD?hqF%Ymt>?maJ29slah} z47e`=z(FF4U@O#DtAQ=x7ZmahE`QH976q_0C8Z|hhgV&J)xa=Pm)4&vk}XhVy@?; zxk=Y%k`oS#2nsF%YT7qAs2d%Mqn?n>(py>$7$sh49XzqY#pt!68GUGve3f-9z6;Yy z8vxv+OmdXWWZJDDEG(>BWJav)hHqp%bAwjO{H~R_4b>NML?kl2BoK;C17C%eipnf& zcJW&_k9Z6Y4Mi)*THNJ>YtgZ~K>kXLUKQ2qE3d}R9b`bON=niNmp^mU{@qUho{@&q z%g5&x2Dq59ljd$5ljKY|clz`ldzpm>Pj zC_!hLc(nHE%Qy}l33%* zC%p94%(jyzycj*ozMcJ@q|dHFNB=_x^xs=66ZGfH^SN$~>xe7b`2^ zYVhXK`a%JQ413xW98{zOb+%RFw@FvEN=7v6-)^1n7aAXU^G(x)J(A*|F^6 zL`ffbhpp<(5P|+Pa@;lbt|uI3!is%kZzLhNh!DJOGfu+V|IWWTabqDN?c^tbWp!&a zc9Xgv3+elM5dvqL{=0v|R!b&%FEHKUE*q2IMqg4rH9I+}*Dn5k9mhY|ISibmMyD8E znqYZmQ>rK07{MG`f9M1GNyQko2eax|k8!gf&xz)wSlN_Mg+<(T@tUVRX}9Nt*@y8oFJ(r zk@t*Zu-Zdod2(kt&iUwm=jjL=V9>nG`~Y<<__uKfYh2g35n0?1Yv3Q?NcM07vK~l- zP$+X>sBcx;7qKMhVpt0^2$C17;S3?}%}R2Kyn~s#Q#j~n8$8Ew1J*baQ#Ns7K{t#$ z;`xggP-O$)jtr3)38RAd7Z>kW;STA8SI?%=YXaK{W`4Ebqeikt?6Z}VjSnB9$_W1~ zZwCAW0CvTa1cy_TV^<-uZcM=V!lE_2s|cdi5_<+O~!C z?7L2Uk2H3^YslI+L&5vV@f>Wd7^;qZSkc%|3`U8J{ z=evm`|9w^XyH4M_C<;5)cb^(3szH2|e}JI94EdJH9pW{4`!;cn7d913KYr&q-PRM_ z*E<7F|NIx*Nrms7Rhq@Cgc7Lm?Nl|Xz}t9AsrhDd$5ihozSTlw(ethI5dR7%lLwpM z6qw0xnf)Y#S{<=Wfm+qQmJSZbtqur#fM*5$0qt7F-MiUn!qF!wx^NMViGXtQ=;HS|p9@%WrY^;ojb7R%?Yz%ZvV+hJ>mJrqQ^@H2? z!^53^mqujvvOI`s{K%g|x2Hl+Uyy=7QQuv<+2l^gMOsVm@|nTxU|1DM3d1D6&Ewhc z{O^OY__Dx+h${srxk{)%yQHU08kd855FdemhtysfNjRuhkjtrd^2QO`O0OYK46%jp?< zUfLipL2=92V1H^GTW;!>+F?nlX6>mml{eMZm+TC4T7}%5xM)NzC6@NoeYbz{>5IR+ zoOTrJ1tSaXh7y5Jn%kY#A-v~lUtX(i)|b6?q{CH^E0D9eZ6l(*wO-ZsBlq}Og0l*@ z$4stT%ZNv*WZf6FrVj6_snxBG^Y0cf236d#u7I4<-qMo%Je_i54f&p`+Y??;*lv#% z{NvC}pYZzc|6m8=n%M*@e5_ws5_%vxAZGcDIAA6L^#NUpGGPKH0!%WToAgLIUV9Et z+H|^Wvii>o&0oz3d@1n|7vWA`- z-q(x|!D{?gp(e1shU^TtrwzPgirFV7b{ZXprYyv=nyq^GZS&X}7k}RwU%DnH{C7-a zn>~7q(1@)LTx#-PaCiXmzwtrRpxPNDeqe;_>)EGeGIgoO;ubqk7PV}mwoZyg9DCYZ zIj0&P7OEbK6e#0ya#?%+Yjr&o`#1F5g+oCpP!3_?LmQPHC0A~ykfuWdp%0=g)=4n( zJ~qTV%UbK=;o%Xc<^?aLb;WT*Lw}Wg0D!@(JdCZ>AtfcubX;yjiw4jP;LOleV)CU~ zHRK*y>W)zp5S>9!vB%y%WPxC3+5P)_`1S6aO;=i%j7-0L8UMNsOU7tzR(^gTh3u%j zCXCuJKlZ&2U&oO9d1XG6JM}PuTx8BrKdPsPDFa-e^daXUt-@D>1P!x!yFo~Cu*_7R zW1vYmsex`vWa_>P9e~Y!m%vbk3nVoy2ntQt9>=B{#YQ4otf4`30`Zp^Knncod}l>) z-~aa;q?Vv2G-rT%h*Z*DyQsMi*&P?87oC-YRu`KZ3`$hHZk()|kK*%tD>AG}7>Ax` z-se!ZF*I|erzxAthRd4Oy_9lMMaz~_*Ef)joRuY0SP^BQ%iYhwpZEZ)419r zG4S8w-l|#Uy@DtC-`zyu*Yu7LvM+$2hUl0@ zBuifyzX*KE6BQG{n@*wya*)Z=F49LtD(+!`X`A;y_7(m7!cKrY09P&%3SCNEu(lUg za!|4if*(m{=7t1? zQzbsxW;=-i6#uRqv@B@s@#YwKPFJeQ`c-kV zhDY~&6T>bRx1&dUFv=ix)hC9=i59##VQ+8zTQuGWFCcy7^B4U>+Vn>D=HeXK`cX(| z&oHw^yUoVV>w_u?b($7sKWaJ+gfE7>j?llGR$U2l3jHHuu8ZM=ZIz6)wA(;;&23Cc zqLrKUqat0~E8PHLinW_!ca_Oi2~B5+gNndRc$tT=mrI#}(&u%(NG8F!n!;81v){?G=1f`S8%8 z)bm1Kx<~#O!2&-0?9+CQF3Nrviwyk&Y3L%EN@uc8(_($dbJJ$vcm#SWJXGt-nQQz9ZF zjvYI83L(9nQyMMp=^m@xxHsbCQZeZ94{wVd&+tyU{g)Ir-`i3GY&UauF4YHZ@IR%=R1N^EQ_>|*M zT@8y24*ITs@J1U@g#c?f{T;rhZ%CK1M#n#39}-G{Q2$`LAHDaLJ0n=c8hRsD!gXaX zTglG8_ybEEJu>$dt|ElpR&u@`tlM8d#oyUd8;)kfEizp4ctEvKgXr!AG1J`7=9}5l zP_7Y#-GkK;V`Zbhe&ioky?#JO^Bfw(l7jC1prxpW+q`n33K&=asU7T07*qoM6N<$f-!Kdvj6}9 literal 26676 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 diff --git a/assets/community-wecom-survey.png b/assets/community-wecom-survey.png index d6f6040ba700f27fbb35647ed81e8b8d28083b4f..800865f78531d8a2592f9ab01497f3e88690aed7 100644 GIT binary patch literal 30477 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

*fh?~h7zOCCo?e&+eoj- z5tiZ|V+z_$mVgKIE&572uQSD>NTqf)MIoIk`d-J)lEM5D=MQqa<|a8+GU7{zWHc-O zt|VTAFC0`9e8!PG-1-)){c%B!!x%PXi-htVxK_-na}3xC`eNf*bED5{;z6vjw##O5 zNB;i~XtXS3BAAL(B4C6XFMegFIg`t_JIT+p{r1R1Cu%-g0dUkZ`37I$x&Z-YO za>~+VF~aj%#JH=_{BR*VNb&N;qE|4pdbP_2#>QxOxE+9HartOJv{?M z!}?jnM<@)E+-V&nqu6@j2PC~hV=^U9f+5bW;vpz^9P01iGra4JEU22Bn3&k@^H=?NMj{*q*nsco=v2qP=H~YLKY90V zniv=u=;-K}n1Js^wt{oN8c&D8Ke)KGw8SU~JZDr?RN$k9rGAS9-^8Te95z|Y!~}fJ z$=`n;JI}Zq!eL=yPqR>2;NI@-@B96kmBIRsi4;~RY+TEOfgt#2Mnbu?v93FUBtrYNhNc9q#iSl_2u#4K(b1p>EF7GJy}ehxn9Mu_ zC^sF9{kKp=&7*oKXhrJ3+zp3_Sdn18l5;aJ%z|&wPd%itP7+y`5#cZ*O{9raZ zHY~wh)s7|_oGm8%Kvtfc;^w5%;z}hz?~oP9^_3oFENU?aQL%`h$%1m(il?QmB=S0A zCnCm_E30y}N&}lurG+;$tHJdTI;rbe5dw$L?XV=T%KOy?!!P~?76dUv!5lRe#LpW@ zTr<0uyi;w~5ey1TP*Yx6KL^VS6Q#x3;jiDI2bN+TNJKTGH;2KA6Bm7!h`tblf#EA! zA-urV>f;qsy!|Q+5ihy&XA>IypyGx@)LB82VBdv{lQS@q%{~ZBgICwra`JieNA}>c zwiZ35!$8>E+iNpq{s9$4jKn-LJsrW>W*T&g)r>4NhcJkU7A6jA5aAaMCSt^Z*s57n zY`*Hq`QKfAbSx})4+MRqBKa_eZ=jrW)6(EK1>0UgbcG4oiQF%`AT~BONED*SOHUN~ zyN18Nu)SfiiDj$XU~5Pc$`ngrs%o@8XyC5zovQ$bKUOqv)-V5Aw`#vaNES3kVLEG_ zJg-hS4k(DOHbsK9y?y8dRgzrHP{EDt{fjU}-Hv-Fu%SZ-MyxrP78f_122jCqiFCrn z#(o0i2Mh>-7Se@mL}+pN93>46n7>TwGy;x_(}2{2UtkW@c#ZS~{#1qeouXqbmL_Yx zr=??bGp{1DZ3QfN;m3;sU~`9zlXiXW{M~T^Mt4@`Z4TW!Q?cnBq1kt;?%n`RuAQ}R zDu1&j3z72w2yUqH(b0Z)slwTz7+iE>eoY%n#cpKvak@fm$T zO&@jIpf4H`ud0cOin0RGtkh~>JOz7zFtx^Z4B~e`m1W3n-}nuZ1WB?W+2XKVV+1Z* zy1gJQ3^kc=A&1Rv(X`KmD-aW@005{=rM}7% z^up{RdR{69a(J$s!H$3I%DbDaJwgQ}08&ayO5ljnMh!JHf`g%uEO{~~E4sJ;{?np8 z9~+Zz$t{17P5%@m>yJ6})q$IE2k$}&(5BM)C{JZxqVJsXvyQEljKu8Hg=(D}BuHVb zu>;$pzj+C)cpA2yzBYtZxhBiV2oSkhZ;`0y@A5|I|B1%>ag*4F;eDQU-Dc3k7m~hG8dfiK60DV@`u7`-2M=*`7CF)YN(K>XolF zAzorT9TGVT_Y@d(Tx~T zB!a!i!x|DC=(WJDm%uk_D$7aRN4_**5a1i@*f^dG_bVP^GkuHu;2Y=NqbPC;>xM5(oLJMJ^g zs$Id_WDFU6igNN*{egi(=ttI2gqnV^^{M&YrucnCEhnl7pXWtJ!b1n0(kl2JAQ__b z=`EcR#u`o)u;|A>{|g1P{WxlZ$QFToX^IL79JqBjxXW&YNtSLIVeC2g6SU!=0 z7YXTSwVKKT=s+wMa<&uTCRtk1##OX}a%Hw+NODv+;49<6X8W)ol83|bvwlcA5j!0Zlf98{pg@nJ%@*;b2YEzQ*S zU?P3l*vEkiv%gFpSg$9uh44;DW<&$+sziv8;~FK3?Po3Pee4Tf0B8yM+zw7p*mDoC zCI9*R^bgn#m&2r#?pRThV3OqVdvN_ldWR_;NAlFU`Gn?8V)1C~eN+rA;~*C9PXLO) z;to;LQ2e5{wy)7!?)xb^j_WN-N7*zvs66$#n+B&LgoSO4in$MSjCtj?nsd>eb_sELydq+C} z96kW0Oh;7&{_q|P(?_*U!8tH@f`8OE+N`EY`~;!qTuzp%^~O6r&b1p*0zgg@JanJG zG#KjYBAm)$HfvM^Aw(_%byNFQI)$YP1s$dWSV1#_KZV!14HyfBqy zt|g9uIkvK%dC*8R*&p)#cXTI91MQpfs2F8vAv@~KT(PYW_9M9cmKHZL%;bPdDU*mZ>H_+}QY!V^xr^i(s`eF+Wv5q~33p=Mg25 zuoJCnsxM_h_1-Z;$Q2J_i_+5(r^7wHaG^R1A5Wu4MNmRV6;q)_>LUi*um_3JkGGxc zB%X{88e}a5&ge)e`^r}ENNT@J;LP|H^{_wt>C>lCWuW0;?>|PhiKZ+DB`KpOE9@s` z+k-ZrPD6wiV()Pssg*Ey7#SZw3qd6(PX1O=LOxf5V1aDZ2^QRL*7!Vxj|gz`H6e+C zeW_pguVMG4jNZ&bX+n;C{{m z+<2a5>@6qvjDi*q4UZN|X1OMe-PK%PUJmJ!yQESLtbiy(v{W#rP8nP3XlozGvzgn7 zZ2Dfu+QtiNi~E7(a0TRrq{SpSKNSoW&mhfwWKADBxy#}KF3Wj~w`>1KDC4#^5LR+U z0(!pu^aKZmD~u!=D|qiRY-*c17~43lP3$V~-FO-cFaVh(@Z`MGWR*BzlrKQ`DM*xz zg(dDS=cp-bo!AutAz@5(G@W3?!)=+W0*F`xG=owbD<~<)#K4+kESZc|7VjB|97H_m z%ld$9F5HGn=1i_g`9-YW8gW&mNCH-5s-{PS_az*AjiU13sGco`#YaS9g%%<)%K#2stHpM|(clp9#M2P>t+LF(cuhDsiKF z2O;=F$Uh>x+zihc&0McWlQR3;CSup``tT;Wr49~W=#FRMDLv$|a`;dyf6JqYz)q<1 zvc^B3xbHtp{$^&K-HqW^obes5Zx=p^@{;H>-c#PD=#;H$Bwfl0woiL2EeTOwvd7LZ z=tNe4$}=8&3vYm#K~Go;TRar9meQVNaEwOAKtclA{sX6y5g#8Ph0#C>`6UsK+M9Z4 z`cWrGyen;-c8d95*9b|R;SFyCC=w8~BodG*d$Lhj?#dp1%_qk16-{cs%apUeYCp`8 z`2J_#qpr9=+E%__100ycIXJn+O zAI&0p&z|1%^6Vqe5L3`Bn+Rhwa`>7qpR@nbmXIj(YKW&C44{iB@;pHogA9j0{P%Cd zEL|7DXrVHj*JF&ePRBq#hz1RwK-0~D%W|SVtC`H}KQKL5+aH~G_W7A+EL3YFN45CFq8%EceGsP!nX2#fTxe~?<^`UX=nUozfk!bOyZs$qe zw~Q~T<_bXCzz>T38L~E0K}+xCi8SE8R>SpcizmxTlBF6^Ls4VtMVoD3T-jbKg^1L zMdKBsKN*3#OZ1%mmB$nll`jynbqMc6rM^lyl`7vI)I`0)k{}7`KnlU72+nqwajiCY zZNDiUGxNbFppdQy1I1u{fN9*G``?p)G{nFTD+s_`?8iq2*%D~G$iO2|B61}Bnf0{b z3DuV>)ZE=3{e7;dgp{}gD?}g6nV4}-=RI_UT1SKy(abQUkZ2*g44lt9&;biaP(0z9 zt!JV9_AKyAL9LgU=GavGc4%n{jUUgeA&pu$jgh*#%i%b ztM~B=8GqajkmYOv51M%<{U&Q5FgpC+@F|eexy1xPv&!@UW@gZ0Pu?1kX6PaZMxT@# z`XDI|+l4Z6iSWK?)Bv4Y<0p{#hB#7qy!8fX*~Iq})=@yCd;y%4j~z!eedSweps-Dx z`eEg7AO!%|^uAftNeIJ^l?Fdxc?AW&Zb+ALT9uqZH*nTa@K_qp_YfcEw5~((P&b#?nH~Io*NxE_!*V~B-e7z*AV;$(2(jgnmOmf;$lj2 zG97FO*o1arc}W9L4={aD;fn2PUEGVU_4Y8N%~T`rFH)){rBh@Hc+I0FRTmy0P0_6% zAT01DeQTNZa8SuiAHC%3-tlWjm`#w0LJ3XOha|&K45=G6IR{}7ZK3d@i9~eZ2TmvK zAV;wV%+M;##3@HvQUxzrmANKMJsL-e4c2muYh%g`CuqQ&>)g78S96eB%A~&G!jNM1 zj~)o|I3}VYLbOVl)h|!z>x4IL7j3{b(>x4jZ=92%cp7_j?%dGlDPc}S-pk-ps>$oB zj5fE(nb{OFuk<~t-pWG7RsBg465O3IVPU6a{)@uY}7$F zbQ?m5XIi~wYtM?u?f9e3Zkd_7md+C#jn~Miv#?<11p^X zxUMGdk3T<$kR1OgRmla82l_FJJNTV0%W)h`>XV<{{{R<|i>m`w1ZI8-`as^B^Uc>V zmb?$--6as{1RNhw8bZK|jg1Zcn%Zlq4u}es3;+P{z!0IlV|2FO`Z7TJ>?D7bAsSaG z6W5?~qIs6Bd^nm!JKBX|Av#PJa^a&-ij#g17DLPoqW-0VccH>hj6NX^uB&=9`#oUV zt2g(8EhQ~G72*4$l4j&%6j^W&;ORogNnUw@>*1U4%-Ib+Mp)d_2cX}8M)!SvRg`SYr9JST67L_P?$2+<+VLdugb*Nna);5g|Mioc&&&Y;qYk#ea|IFs!9 zzLK{`H6DpslDdD-`NALggGwp$y?-|Bs(gcOMX)oH+;~Hdp*_LMlv$hbn|ftXwAZ*V ze*I`+MDOs<;6!Nky2hD!bNfZqyoDQ}aV?=_jog%E5!P%D#8xG{l>I7U(vj8BoJrY~ z+;E%~Q?w#z;-;{)CFF;!_wCgw3CquY&p8sYYeSJQ1;5?#LhpI-XD4gNQQ`iGmc%yg z&40g?&~2WiOxmbEmZMsvT|@n+2w_$#HxBQGL}JwL^N_7+-{mY-b(RuQTg5M&^0iPQ z>BV?z`%F3R6=1Cw4nl^ahHsvOyoeJk-ku@@PRu?Cwum@wLAXFvR#wuhP6K1;d~@^2 zb?kdzaLV|R>$fk}N4~bBr5`tYNaEm+p~rvUo~_&2*~umEo;FT1v#`LI^7RKF1Z1!)GuZX%Fh7m=2B9Cs+vXL3bd&y^_oFF| z#iVBR5aIMQK1X<>xF?wC`D77RNV#k^!~bH({{?FwLk)KwqWXU2x>?6SJ?<`~18=D} z5Q~04m_Rv$GwN#D2UtpcrP_7wU}L203tM60V^bnKmy9;dOB7PcyQ660jR|z>=5Ogu zgC|*X&{7YqF)qRQJ;=&g1t^tc(qWj(h(iWg4&;e2t4Ksd;faU)@#%cOdf#UHzGb4$)yyO9#7CccjH8I0LH_B zrj}WJ4M9)s?@WW$3j|>|Joo(ke6fgZfKZwo)^UF0n$dv9Dd5)b3C#444t{nbGHe;y ziz5Jdz+kA3(dNqU(5#P6Dy+Dz0HpalM#c~wxN|lP1pCzn*zRj49AwFC3aceB9NMq9 zpbl&td4lBk5G$tkVrgn=ftNycl*&&8Zb>%3 zoBAPC|2Jn4Se=_wzbYvDe<~zBk0*Zi{4a=CX&;@&WfcG%8CCeUfiC{;%Pm+6EOCOv zgjLTtdS%YmaC;BCq%UO^rUNoTgNrV&Tz72s5k$y}SaJM>&DB$NRj9n7-Eugr(6mUO z&CvDX-ACLn)yRq;>W*jDq~$)1)pFY$>7{>6Mst|_xBJ{RnK#7X`8cTY_2OULC66hQ15P5(lw;k9elPee%!-`SsN!HH zI^dFuu`~9UIWYlyX76siV1`Xsn}1sjYNmB=TO}Er)@Y@X!3;tkhReUkUa3BkssCq& zgz$jhCl03NB4WA(S0dVzs^);efG7en&q3UexJ4FEl@nC9aAq+W+aS^eEM_=rXV%xK zah2({bYVR}(ovE?)s9d|fn{V`+R}!GxoxMBt1#I&%$Qc3cqqV*<_Ecj;ZI1Oq!m3M z!1x1fME6dkr~uNKAzg&ps;a8Cwv}xsQRa|-5V9y$;Y{-GL;JoJC_1hyvDH!cfCm1K zbxA#|fol;Y8kprFL=rcDM3qA2Cv5Wmec|02EdBM>l_4`O!#Z#(Iya29v|!CORIQxO zp-cqn7%>o>MES}@$uP=lYNP`=D;EjCT_=#Q8u{4*jTcx_{dm;dPI#ik_lzjO9tBGm z4q!q8`5jPI{2>3gdH(m_7kp>o-0AbbRx#ag5n%e5{)vjwDrfy#tkf|!&RIX3vLZT|!+=m> zc4m&poIe1`i;2m}oBx)tz-I;V*H;__!k9o`)VEo4j+Ltz85xmbd=>WNAA-#g@^J^B zrm_;+E=Y6>tkNvH8bHwl#r@fR>s*1Q8>SZV1n^Vz-Cl7&oOk*~(TBR#+C*@s4nNwQ zle0m`R(sQ50|JVoWTHJ^Oj*mykdu{5PmYgAyZ~K4JUndl_R#avq~r$)8}LW?h+^oH z__LM!V+iHW9zJKQN->Yqq16d{sNTLhd$vLSrodrZ)+bFZ0NWd7%lYRILyoN)?w_R# zH_uCH3@fH6&KW_pZT(!50+>zk6+`A~q#rcl)Nv6g>k|$$?TOd#TYu9{#(Zm%r=V*H zma2f~>TgrzpL(!h-a@ppi$INqt))w@3cd-_q}W}6mzW>z(CF_C=JLxy|MfW-@*+M# zY%yJt(o>%j+9}_I+$JI$=`uJH>F;-mAUdQ3rrgq13>9G{su&bHR46SuiZ=rC?a8d# zA>SlYs3VtR$jB+)IUw;@h~3Y|w$Q)1NycD(PHLu0m~?s%3skWj%qj5`paKR6kyGnxrXUN0g*xHsRFSD2uVJ;i;b9#DTBO+4SbQBmY2RYzTMOT z105Y56BEoTSZTomre8lAjQv+3Ka)$Uad7J4lXX(?Go#nv*(tfc+_Ms7K*fD~QJ z+G%<<2&y@egKrfp4Gi(j3uw{uDxk)RMf{1VB#W!~kCqk|=)86ckZ<3${(y?4%|QYy z(Cd{tEI$H(hFEv(eBH68v8?MdW}*JY?tZG<1Wg<7@zd)N*j8HVx)A>WmV5%a**^9? zZ*XO^^gg=XT=lrx+-#I5D{c7rLSGC+%*F6 zKU;q;f>;bvwt?XzS9P+ue$%q5sv?Y>t1B0|cPP;aaA2@yEH9@V8W)fDY_anfe}gmG zALbM=9fcsx4Y?~BnJc=*AkU5K#X6J%`6(e#?f_k$j?sbELa2A7g>hTqp{rx0rI4%Q zj4FrHCm2)5W?2k|(+atg&j^NB&sX$q29=`>QItCWR|YnV23hGX!o5FnnBNoMIacus z(7k1qXXJjL{QObyVd~ezcS{XLn2au;7oDCM8t>;?UkJVJ_uSXWOEQE@X$p4Pjnw3` z6U*{f24vP<>t{c~niSIeAQ*QLj_^Fs>)ZwQrKolJ(H^QAug~M%<*Vz^;S`q9`*2(- zoQob(GfG1Uv?DNF%}CKP#=!qX;b1Bo*+ngIQ4j#JS18Qa7EdJy0v7>**Nz&#E_DLe zmcC~;qU33xB>-%ps6b3Z($hH+YjzZd)#UJfIw1D=0r?L0aSv?2=(f8Q&y_>0`AiG_ z{Y)%?W2)L${%Y|0KRwVJA!aI;$Wpod16Ho{FmZ4M^`Px{pfN2*Fv`f2o54~HpcfLe zqDP&7<`fR6b6Fhq=&k3%Q3*)^BNxren*u`D7y!z9W@SWH@89i*ANGmdK`A!_x#Csg zuGJ7hB?p$NHIxPtZGmPVHfO4E2f317V5B0^&s{nI*ysaH9(~%8FT?`D4EVynfv_}@ z!0&m5>U-y}#x77s_cwwrdy!wd^#FDUlt%0s1OsmYRhKPgw`~l=c-@AXEB9b$*lE*? zD#8SNnIsO!*rM9!JO&-P$vx1DIvIvSmo+kTm7-$gI>BEk_n7EhG6A|1Erx3st@EYt zXYn*iCAWs8F4$q;5!Y*f8`_RH(8!?2ZN=k+fsI&KE&|biBxAz0BB~$!FrkMi4aX6g z*wTW4Ew0@XS%`*ubh(jWE}wxl*|dZ)CZ0}4Y|dKIF;6u9fw+?~@mp8|)#!{jh5*|D zcA)0b|5`flaH`+`j~`oPW@jEFDa{@No|YnyvBBH|fi`@~vUZ=S}1w zgfF9|9c*MP5)B@za}p+-;-Y-hItAqgyn5`^$h!Gh{SA~Yq8q~IXpP)ATBr+=X@w3J zSoYU*4*M+CmAR$!ht&kq0H?9)wQ2Zb%)A*;0gilQmC05<;qs;1+z+U`yWXI>9q389 zj){|v)H`YX{Yi|tOL;qXk&hPF5WF|7bcR!*P&uTeFYXUfQ|Y7D@^?d@=$G;QdN z&D494i{C*I^acw!oB&M$LPz|xjS!ub&yVg=boe~%uUbHq$lVPQOv}$7Hj_{3<2X*< zcTj>9(zn-l`vEGz)%8<={O-G-Sm79_{L$7(8Qf5|Gu zo8ak9K+R=WX9`c~4e<&db>@v$jmxRwsN5REQ@F(YYFU!i!#Vx8zcp&Ud$XtYMR-C7S#P`oZZvD9g+kV8i`T4sNJ4YmMb3IU5Q6b}LdTDun8c_isBH(Ln6 zGq)k1hAici@7qty@Py`gbXwb;TA$E+qkYG>tL@4o{%WQU#2rc{^~k&%OIK_0kou%k z*vXC}E?Kuq_ugJX`n!2bPw33r3)eN*P2A&3R*#k+tMx?s;a`>CL1k7S4nc=&%*%3o>~0>x9NG%n6E1PuUJv0RsG>4nLiGs zvq+9$7DQzX=2bsgbvaq35saN$UazTJejmatNLT51av1F$P zp23ADru*Aa(mUcWqmLw zGbe|Su+$E21nJB)6^&8@DC?YVJ!&t2M`6iIAwEgd{>Q8ERq~YHnfzvGk3~gNGwv)c zOzH(t7<%RgY`f6j0g-@oiqL+0x_%w>aSf7oD7gGRJDUHb!N;6957#)Yg-1w=!|@r& z1+cQ{-r%<6plkw-TP>bW;f1)B|4t*AG#<(w%3^YmvCg>TrZ9kdiv%I^5X5zYqT9iB z2R|k?$DPU2Ex;YEc{^7{RV0{>vZ=l0 z7YH9rM7~fCNqd30`FM#rCi?C}@+bN+_a(cKcA66zSo@w6|G+>n>{ojRU);KSU1_ua z{&1NGoqDnHSYEo?@RyrUk3Fio$>dIx{;N9@l?$gT@rsL!Gm`%1!QWOPo1x>?{;z)m zn~Bg^rljh+I*MS{UqaWt-X>*cs;$~ib`_6uyK2_{BCm@Ky29TX$mafL|Yluccq#Z;6KS?FbU3Grp= z2oZiAhcbMD<_af8Bjs9(y?B}ngtgfx=enujT+oHbWNrBXkW9=rd_>o>S|vq-T(yu2i?uIAuY z!4i&q>Pm->Jr$Ci=Vk8P#0~a^iHNoy!muT2c>(g17fFH~cWz8um|YV@T1V7!9hU0* z&_v1h#Tanhiac8W^!qc>eH}7-9cOG4vVRbeQ*dIPe#uS2R$lhFf{$YbJGln-%%)1h z&nRExPc~Ir@JC&{;}e$?ET6D+rCQ++eh7@qS?xvy|Tf_ooZZ z6pjUAhs+w1TOI%+fNPO>5`7uJ3+Mr5&$5WsOU8WZfuYPD}$8O9L)wMrisGIDQpjuqzQzm;8K0jH{|9$oiRBMn4 zK^=@!XOIrx_WcJ9fq$?r7#=yi{QUC`cRTOm8>;@^CgMFA`{`c4pC z!=Idc4EKvslLmC{;u1zY1>2614m%J(C^wLW_?uBShT!7N@MagZe&cysp`c!+Ug%2K zu`DoQRx0F4ox-or=3o0EbJW?Xm~v9Qd<9em=EU;C!jP~@i98*M+!`2!I>6>XnS}1= zb4kA7pDvn{1aBUc2r#+2>xpuwqdI5^FEW>ic?RQZ@j?$Co4rU^x!gO<5g5u$T=6Je z8d}xS%L*Ny%O=`nXT{#i;bT0d$7|9!dY@Tl2@z3(%DkK%hs=z3(ubn8yNgBx3UI}! zdhm)$3WP{bOD7&WSd#ZyXy3m7ecCQyufF7m)|rd1cq$_)8ISbz3JcQiF_fRq#C=K z2w#cooDXeK4e|Atzo?0kQ2(~Xt+|bQ=*LpOU>$lvh>I-SDrl6u(j&sFHmT^R#8s)6;EKdcTwk8LfSTNn1YV`0&aCb>(Y$AGwr{a z6qc*f-=}qvEp!)Izpx-adb&s!)Z5pmu;Tz?AZQF7jhx#GU5i4ES8wJFLgDLClSOa# zn`zhGwtoUV2}xR9z#7mn_&mOOa4r9-!QH$0i(h2YQ8jlzv^6&~=tGnk6S86+qI7%; zv?$O{+C?DiBI33m1YZH3%M8@WT~n2jSh4IV(eU>d5Jh<^%hF%1nKA)e4M;$S*q0=M zyuq1ifz+VvPBIK_#klxzZ`l$y|0hZZ!_~T2DW6gTKBjzBarVg9yFmd9?N|n~jbLd4 zTp@&^QxM#DNBXj-Ewc$es?D5P_~)C@P*ASZe>vF3Xay*a{54FmBJjSZw#x<1L)H^}So295w<;ZTBJ3mLg26zS#sO5KqGj zrVTNsl_!;smI*q4%1h!A(z^~5UFleD;2l^O#nbPdpPoQmV4som-b9Xj+w=-IdAAp? zyWsIgSckQh6|+`sNi%WI%aRgYve)pl!kt@kRT~B;XbAyruJ3U8%Pc`3Yp5T3=4!^x zuAk`uOzZKX(5GK~7}7n=v0X>@R-RFS+=<{sh?1R!j1ZUEd4DB1!-gZ-$%9xK|4*l{ z0_u+~X|S{~$<}$0YCcwh%N|a!cvU~G;t}EFUW<2YdQNC{T~@POXy=8{T>6Sa6H|?J z;u77aXj^ig8@}AqXh%Uxl3sKDj5_6Mk>gBz@jm2D`+FeLrGGL zQffpLtz?T~M)HPgnSur3SwK&e^riGzR{^tz@Vp+giHJOxLmRcH_Nu-D_YJh?AXahxp$_O51qOjq-SgRxa~Xru5CKfNuDs>4mc5 zLeN>DT-E@jpSf^9-1_dt>dP^PsN$dEjkY+eC=yUNU)wf;?-Lqo0${6o0|jTP>_TIWZ+A%?jf6} zx;IDFK=c5@B zX&IB0H=-6MBhcWY`Md9me0_a4XnX305GkL=g9kM~s(t%7Ghr>`oWT3I|Gy4fIn@Q3 z5D8(mvaK4#dEFB#d^k zadE(NApH>hh?((7V?g@RPZ_YW)}VtSkhujl``{K$jt00mN z5_b|;W&@~6DaE&o4=zLNZ7ZOPLj&&Q)v0hPjIo@;I2?7bV>=%Fm5wFdw)G>-gQC2g zFF$w9MSac@*QLJe2QB}~_b|>Tl6t%JrEoIJ5d7GKY><&6tNEd?IvyU9 zlhXQL=keV=W3w8QZK@L7{*Net0wb*t!B_5RUM3xcHH{hUfX*)loAPPFZ!@>AL_iOIg|+k`!P5~B7y(R$<4 z70&i%(ZXy?NLjkix#XH?ie`sm*?qh8zBSwX*a04ThT(xW#b%p?wL?6LzQ_p*TB~k} ztNNCYS|rZct(3kbaOL6ZwDc;JUcu|sCD^_2Kq|j!jV4Np_9f@_TqbHCUFOlFFl+k)$G$%+nDzb8~y8P7I;SN(+$K8GkNZ z?^r(~`hnf&CFLy?Rmo6QbiOxF6Blv8fXh_bxhV9~tE)q`UHH3iYEy4rLL)ZnO-Xg| z;5pwNnyp?kwzbAT4`rCwH%{bv_;pnN+&qoYQ)e_%qDdD{9rFdvh9&BD9$U5(N!XAN4h$@>|A4ZOwl)c?%E%PlKwl>(lT+_P2p)Q;wz7Tp0J{4H+kd^- zMEs3#LY+x?H8A=WHy54|q;zqt8S3kM9&G6AB}Fp$$-DqvC&hCLx~X-t!IRM7&|>#D zg~Cfo>XkGfu&W@&X6-5%)#Z7-XXA=@T2oOmRcEIr!5A4Mm#hw~4UBgcGo2Wp16yu8 zO(-&%nN5Ryv|rY_>8&`ygRZWs;^im)29}2pNL9QyoUzj3&0lN9;%btgcw}N=U|?yf z?e-p!0z;~1Dc*SGa!-$i8eeX~ucChTA^^lUDUU*kWhXQ*ovh`!tB*QOoKnbr3~q$k z@D8<)ji_&#ZoW>pC=xUQ#~vp-Is@zzi0evI1UQH(KA__)|n{517VsFd=O7(zD$ zb=bkwL~79X#W%)ZulG-V8``^J;4#DU)h#8V(wqG6Z(hxNFL_4+%dP6rW?Y16A>)#K z`D=cr9pN}@U5QL?75dQz;UXSNgu}YdG=1iEO}+d0M~J0cnhNcN^+^?YSN+0D5U~|f zd@3x#X{>mq)U4O8t%JcH zz0jEm#u&I|$S0?;QK0HJGB=MM`!w6r23)zlmm!P-Wg+6`(B2BU4SPVC1A4g=J}tXGcSCz?B)lR}qy()e zoRCj1fqi@MtJZcIq$HA7Ng~j&%JIooMEGG;UWc%1+P+4U9sF+mYDMfm zy>$qf<-ccvHG%dc8Huug3Fk>04w|=KjW1B(-^~3HZ)IQrYh}Zn7SwDEKLVI*M9yK^ zP2LP}!}bgvnw*KBQbB4QLZ6nmwaJnbCSeif>XZ+xrsz1t8`c+eEf$Q`>Xa}iUW3H5 z+~(h>vLEJ$$>^L#7~qx6EF>7qkRj$ZCRMV~aEFbR7MEAc68L$Mu)m_2HF-cA{+!j{ z_zz{0-#`^{S_;#Tor$ksU8Hg25TemmaeQ)6jGVfaYD9P};AzOwGOOH~%XLJ1u)j<` zVgDpqy&V}4ras7$@>KPga<9ntnqG;l{U!>z#$6o4E5+{=&)HSDM_Or85_b8MN&Geo zMe~akY|3~dM_Bt%%?Ald%;m~bBKH&Qlj-6N1k8AiY3e*UbDrW6)UXN;w2kR&C=m1O z>U?QRR`Om>`e-y@8+V1RZqtR9V0P)~IcrS1u9S%QHG2VR;*?aP7~;O44=OxDg~UC& z@9X`_>2&V)Bzx|dZb1N${zQW4bX6-)#DGIz%G2_Ga@=ICnpCAbpD7^4>Eur zlM{9?dzLmbhx1lYBtf?>Cx`eQfrpVPDq~<3ISxfwNMtww)uDdcwayeSA&}krMI0ko z_w~XFpHI6cC?gqT7~1kcXpSxlnhX@utBx>_-B+(DJN)NIiws*T0 z_hA1F@GDy7X}Ewd)`QMJt$Hm=c5HgTGONd5ddb%11UL;yQ?P2hhrJl<=$0wJ7<4{g zPNGl}t)Npt@q96S{wCdJOl#)s&y0;S@8l`SZo4yY1%H-6>K__xpvfg$05fP{V1P$p z1bPJ&L=k!tUDiS}kj4hqCV3iO{>H)PIBasT?h-ytl6M&|S~( z-=OJ*_Od-z%j{4LV>~H&?;cEA$0hit9a#SQM3zKvUj$F>83zkr*3#x}(R)YEs?M=i zjDsJXanCKP`lfl86poa4SsuZZ)P25>iA@?^xca$Qrm>>_AyYnbcZS$hCZJdl$nxxp zP$_If_P{8I!rQUc(kTg!v1WBjOFndiSI=tEoa1>ub9`p&u2?Z2xfJ~mC=zp`N~b1# zO=a)>p3=7s6SH)8bm(-pMgBOxopJOnoDaclY&`w@^a<@PT<^ysTWfjZc})FE@<)$) z{22CHl1ti>o4g;U7}KBFo7wLXBuH00CVObWJIy9Yv`3`X${H>R4_$Bo(y$%a?>>O} z*zIl3L>>@k9%>wo81Xg&dVs?#3I6$HX$+mUYE$X2nKaKzC{wKkfZDFsV4-lDy zDj}7JE(axC$2^dwlTP~O9`tVps++kw*OC^2;tf(0C~Jw)hHxJ})F48)fE9VS)*9<$ zp+@;Qn89jJkHHR)QRdQmE);nB7=1etm>hcx3f?IqSr~?$d8=O|BkE1J-o^Kih1{4PdRq4(cbBx29pz ze?7PZE+(?H)uVrA!48nfHbMo|F@E^>Q<_6X!4o=XHYSSKV7bl z)atsQ+DOU1*JAgg>QevCaHmIf9xy(*I{CGKzBQ>`b#3waXDR&H6p=cv{o6!5*a)iK z#BNJPjca5EqVk_!+~J6iPFT=HJt$X<*{luwCPCN~t6oPu+leErULv_mbIi4!rf35_^PPhEOQl{t z$*TrcWNoCJ3KR-e?vX#y*>2X}@#51axyZz!#fYxsk!u6&mwI(#!V{?(%N~ z`lr$S%isR=m6uap;`5|Mq$|RTRn<Y>e}jR3ftb548_P2r2o?121hTY-069BSsPt|Z zgF-0N1|%#_C*#4aw)m`wLqFBI=pHmiz&9>$2#R2Vp#NS60ZXvMg56-&&2kWSImFPw z!-W_${>leVJg+&B#=!CLOB+XVPy#ZHqK{dW?lO4BaI+Mr1WPCV2904KtKb^uVtw+MTs^yS_ZR*7gM|GdAHC@`8(2dsZS}cj^*&0}W2N8G6DJNM2`*L+%@YY5VbHD0(*9pWn0=;g*&>@(-$jnDi|pe)3P$9JpIxjbTZlfd>z> zEyjE0$T);0Je7aLh!?sQ;TX(k_w?d-?ETe~8@Ld741oheXaWiVEda`1LnzwrK!a(xM10{HXe57GE{+NIGVSm4L2IY`YH6r- zoXR(>j8TV7ONi%7a7G$G)M}_jncTjeKj-cVoA7M=mh>0%&@bfZyiUhKwnYDnU^QFR zrNV-Bphs;QW9(HgPy;aBz_K)?Mp^dJtWRcD$;9c&Z^<*955JYRc+A?C6QoD5Syf;e zC^49O`g`y>K3)wsl_Lx`^yu0Neb(sZqHcUhO(2FUrIL_ZVIqBHBcw@z=^cvv*!TFq zW7~*M-4b`ZC-FRyvOGFh+MyWRu!71hL~l=R9*^dJOAi@+Me`77&VqckKHr8AkBgko z$>jeWbEC~THn~yn^k~RB-Yu&3a2o$1&eC)lF-Ga4sMCu^D5ou&fwj7LqUVd4kTsM= zOfODSEo-p2#}s=hy+YJJPeQi*&6a;-sj)46r%A$I!IeF@9ObV3o_EgOs(Q)^Vcs+Zlc}Mpww9?>fdK|_3!Up8@y~kS0cU&~DCbei>cRAm&tant+8sbF*aNEw#|>W# z!$wqG5PIQhmMC<2KC|$Gc71cIj{QmeO@?PsRJx)TvWNWv3gSj_5NIeZmgOMA4Pr}T z&acA>=Hf|jgmBPhf7KY`1CabT_Woo8OQ>f!q)tZ`p3;U)_WzxA;WGFBN!2lB40g;{ zGd?0{pg@+Qsw%!*bsqEMV-yJ>(llFcYg_%0Unw!3f+7Gww{G{sRork553$#P9}P20DFK@lP!J|Nz8}dPW zc?=M8;;vH#6H#cs;90i|@agS$lBPggfL7a&(gw*W3(%|Ydg7hajxB5 z|M~RE+2L27R|A-^Tio8BPsqmvrkCb48^lg3mg<(QrsLozOHNwo%ItSL*^|$MaccDX zl|_?*4~GT7n&~&O0a~1!o2$po5q)l}XQUx`5pI+K9rUG;c;QSHin^}h(iPEr_0tRF zF@$6}kz-1#({!BGs+If!M8v@Q5z}$hyZc%!f*1GTd2eLsU{BT6tV7FDm%j)QoU5v| z@|{q)Mgr6I5?0@obo;%?xo_DU_(ZYKx4$h;Kg(~T^f7!-yuT2QY#RDrtB3Me?!Wf@ zkkG~8Y0O|x7IB)rg(M-_swbCXru^P*kLuJ;1ytRzvKJdl=SO6PjzJZ+Hu|oeiP3{> zLD}F5`}g{p11i4FefCKGgl(zK`!6&v`6!r+mQi%@8C`l9N=T*>8FoD@!J>pWxlKy* zeze+D&;V3TOCxb~JI?2BQ#BkgX*|0}HM~kBj z5_y~ySR_0aFxDYuQ5zT423)sr#V>i#dBq+S%2yC~^DKdaJks%&9?HFqJJWDDi}NeU z(7v!ecb$7L$@jSe9?i+lUtvm8D`W%!TX}8v{TEME38Xh5IbhIAhSkF+U&{IwX32^) z%nG>uAAoa^!}Q+67#WxtrF?t>;1CXH#SnBcX}~uY*B93DLZ#I5e`3Sz)OgnXMHot# zd}CPIT)X)SmgJubaLTBq#4(iNybOtUqI0p*^B8k(v}L>zuaNj4s@4|i?I|{v^#d*F zcoK9$6FnJf@{EG(9IN76@|oq`?*d{=)B=h29+_O7&J}2p)zD`&yam=X`X-WF$wS@O zF9c5!+_QFOy0+Tb%|@m;lnK4v?s48dOT$N1exp-X)8z6cWg_@**`v_TjGCN_wwAS@%s|HyrLPbk^O+f}4Kh9RiDYuRf zim1n{r+jSA9;y9fXqNHI!|5V9dr7!gToXL8ejm`!S{{?jsSqokU1#Q0&15%$HSQ*R#J$sfL7XIiUUDe*aU7!pi7zS2p>1t{19;$l5` z3aDXoLqnX=k+eO|%z;TbQ=)?GaXvK_l^)Nq)K)d@PzwdA3FCi$YmAF$ng^c8+ZpY( zs)~w=s;bbjkW6EJeFYoLLk-R!z{9=lT@JWP_#PoDI89UJt7u0xxa1T@8QvMdhVe8$ zB@}xbo>KZ(`fTgq5o^`zXG5M1e2&HXUIJtsn+}|5;Oy)Sp`>5)QP>VeJWz+1a0@wJ zhW7faN`7@rU(idBROlRhWPQI;h%@OQ=K6sSDeCzck^cm?9~71$WAlDn*NLuX3E5zq zN%6_@oK=x(R~>2P%UWh^q1OC>L1x_AVD)5`ny4xJhFzqyz#d^(mEs(98dICd{a2SQ zF>nQHtxI@P4<+sCBfqW&6=mTX_H#H3uitHS%e?W1A*fj8>{SC%9fj{rxkvZLT1$>^ zH2>R-&i>vIf)4UW)BQ2q3bw;Bj0;c9KvVr{-t2tA7xDhfSGj39oTRZ8v#j`fx@wsg zo2|-6!LJoOUJd>gPt`~hIG1X7W5d1E&zoIolESOvbX_?2Z!b{abafs+H(IHV`=Anl zmNA=n%&spPkWYhu7Rgjn^7*vy%NyQ14?g`yT>PO`@zI-Qm=l$I9!<)_TtN0qG#arH zejYAWATZ_BMj(_k2+iwuI|@c6uzjklwFq8{<>`PQR4L{AM22~CuNBIB7B7=tT&LXs zy8gRx_o~GpAoM^1-+OmEc7{`t|BA9=?}&M&QU8uF5YuXWA({aZ>cM+q`+$JO2|-YA zkF5WOzcZXV^KLvsa~{4Fcvvg`i22~JTY#sQkOuwLSf~a9Tmvb2%KS8%LUi4MVp&>s zrk{Z<>A)k&+-&ix>@Q+LJ1s5kDFoKCz0nBLt`Wbbv_=mJ2pRW+g9T*(vkzA`@5T6gDX#Uo*A1m`FbXSB^%&g3ySNZXSZ!-$8CENLA3q z96Erg~K0UA(B#ERM z6ClC5<`f7Xo^iA6B?VY$2IICx=wVM4f)FLw)YLT2eDt4!t%>cdSw(UQKg?*8CQikN zV`KbCTvK~@x%i*AW21SI*USVhYF2%|M=!x;TpEEbqVTWzLhMt1b1w4|a>XBU73j+@$=bFhvMLf3GKBi+$v!DY&9m%@0{kY$v2}W@ywBt~ zLzA|TwC3cJdM*`d#?BVyEYY2Eh6yBkay#X=w0Tu-gh^Ar4Qj(S7vu7Ov6ZQ{wtILT_ZA;YEYF?)Bu^iomU z(^qM#Dpx0VkJeXK>~AxDvll)&J9jKv|OSN+cc-uN84fgaqnek`98BUbiw%4!jbshS(0!M^Ri36%j5GLTRdnas$3u@nJ zvDzXNd)*UAVMMQk{P^+XN03JtB|L(!ERZO7g#<+SVgU58iepD2=4W7+`~l9BENSaw zes=*efIpk#QQhR=q0YexhCh7)c@uGqkOz}Qh4d4tVjEWIKHz%p!hps>X<%#&RuOqr z-OLVjYtMnGqvGtDk(mj-s?_Q=(6aTSdZ45DcIKHAoLB|!mCsLCI0pm_yCup0Q6idw z{nJ;V0S3?pNbHM32szo~g)lgAkD$mNyqS`c?&bZx`QoozH8nLozOWYu_pcSY4BVd? z5=k^cqew?xIwo_t{OeCT11`=KRLXIB#K*b0v2E(c$%@nc>o-x z#u&Z!4eQOo|3}20Xo6|wtOWl2A@QUkdKhvgK$_J$Upo3%DFVVdRar-DTprxP;9H)e z!O((_V<$M4PT>q0`Z+B`dADV-AOabVWN!H#u6xz*fq z6ryW>w5!8r3#b^_DlNQrg`x8++tXG!LlVBtm=`n#z>QFQbG5Sx77Ecr6!9NO%iT6G zP>ij=ZDfQH3zd5VBL^5#sh6()0t*pN;Y(|KSo literal 5508 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 From 3c3121bf8aefdeea030c938ad5e3d76a48eca35f Mon Sep 17 00:00:00 2001 From: Turtle Date: Thu, 13 Aug 2026 15:39:23 +0800 Subject: [PATCH 057/103] Update README.zh.md --- README.zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh.md b/README.zh.md index f9dacc4e3c..639d519b62 100644 --- a/README.zh.md +++ b/README.zh.md @@ -37,7 +37,7 @@ pnpm dsh web ## 社区与支持 - 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。 -- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。 +- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 话题,便于被发现。 - 欢迎加入 DeepSeek Harness 企微群:扫码添加企微小助手并填写入群问卷,完成后小助手会邀请你入群。 From 944a0260ca9a66acb223b097cb2f067809dc97ce Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:05:57 +0800 Subject: [PATCH 058/103] fix: static ci --- README.i18n.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index 727a781767..cb21ac2fa9 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md README.md: 098b514f8311de092bab18bdd560722b1e485913 -README.zh.md: f9dacc4e3cce1c83bfa65df9fbc8d6410a37fcc0 +README.zh.md: 639d519b6202ffe740d46e462feec2657d7e13ad From dff9462bea24f72755da4ebdb1a1efbf9da4bf39 Mon Sep 17 00:00:00 2001 From: pku-xht Date: Thu, 13 Aug 2026 16:09:53 +0800 Subject: [PATCH 059/103] fix(subagent): use Job wording in background ack --- packages/subagent/tool-subagent/src/index.ts | 2 +- .../subagent/tool-subagent/tests/tool-subagent.spec.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/subagent/tool-subagent/src/index.ts b/packages/subagent/tool-subagent/src/index.ts index 337596fe85..711ae5a7f4 100644 --- a/packages/subagent/tool-subagent/src/index.ts +++ b/packages/subagent/tool-subagent/src/index.ts @@ -359,7 +359,7 @@ export function apply(ctx: Context, config: Config): void { render: (_args, value) => [{ type: 'text', text: value.kind === 'background' - ? `started background subagent task ${value.jobId}` + ? `started background subagent job ${value.jobId}` : value.kind === 'continuable' ? `started subagent ${value.subagentId}` : outputValueText(value.output), diff --git a/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts b/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts index 5f3412bd10..44c0cdecb5 100644 --- a/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts +++ b/packages/subagent/tool-subagent/tests/tool-subagent.spec.ts @@ -818,7 +818,7 @@ describe('dsh-tool-subagent background mode', () => { agent: parent, }) - expect(text(started)).toBe('started background subagent task subagent-1') + expect(text(started)).toBe('started background subagent job subagent-1') expect(prepareCalls).toBe(0) }) @@ -830,7 +830,7 @@ describe('dsh-tool-subagent background mode', () => { expect(start.isError).toBe(false) if (start.isError) throw new Error('expected background subagent success') expect(start.value).toEqual({ kind: 'background', jobId: 'subagent-1' }) - expect(text(start)).toBe('started background subagent task subagent-1') + expect(text(start)).toBe('started background subagent job subagent-1') const collected = await ctx.tools.execute({ signal: testToolSignal, @@ -891,7 +891,7 @@ describe('dsh-tool-subagent background mode', () => { arguments: { description: 'broken', prompt: 'p', run_in_background: true }, agent: parent, }) - expect(text(started)).toBe('started background subagent task subagent-1') + expect(text(started)).toBe('started background subagent job subagent-1') const output = await ctx.tools.execute({ signal: testToolSignal, callId: CallId('broken-output'), @@ -1012,8 +1012,8 @@ describe('dsh-tool-subagent background mode', () => { const startOne = await ctx.tools.execute({ signal: testToolSignal, callId: CallId('h1'), name: 'subagent_hang', arguments: { description: 'one', prompt: 'p', run_in_background: true }, agent: parent }) const startTwo = await ctx.tools.execute({ signal: testToolSignal, callId: CallId('h2'), name: 'subagent_hang', arguments: { description: 'two', prompt: 'p', run_in_background: true }, agent: parent }) - expect(text(startOne)).toBe('started background subagent task subagent-1') - expect(text(startTwo)).toBe('started background subagent task subagent-2') + expect(text(startOne)).toBe('started background subagent job subagent-1') + expect(text(startTwo)).toBe('started background subagent job subagent-2') const withReason = await ctx.tools.execute({ signal: testToolSignal, callId: CallId('k1'), name: 'job_kill', arguments: { job_id: 'subagent-1', reason: 'superseded' }, agent: parent }) const withoutReason = await ctx.tools.execute({ signal: testToolSignal, callId: CallId('k2'), name: 'job_kill', arguments: { job_id: 'subagent-2' }, agent: parent }) From 9ee5aef98ca0cee8c905e426fe17ba5b45ae1339 Mon Sep 17 00:00:00 2001 From: ZiyaZhang <199893125+ZiyaZhang@users.noreply.github.com> Date: Thu, 13 Aug 2026 01:19:33 -0700 Subject: [PATCH 060/103] feat(web): unify onboarding dialogs --- ...seek-onboarding-credential-setup.i18n.yaml | 4 +- ...30-deepseek-onboarding-credential-setup.md | 8 +- ...deepseek-onboarding-credential-setup.zh.md | 8 +- ...versioned-gui-welcome-onboarding.i18n.yaml | 4 +- ...-07-30-versioned-gui-welcome-onboarding.md | 10 +- ...-30-versioned-gui-welcome-onboarding.zh.md | 10 +- ...2026-08-10-telemetry-default-off.i18n.yaml | 4 +- .../2026-08-10-telemetry-default-off.md | 2 +- .../2026-08-10-telemetry-default-off.zh.md | 2 +- ...-shared-modal-product-onboarding.i18n.yaml | 6 + ...6-08-13-shared-modal-product-onboarding.md | 33 +++ ...8-13-shared-modal-product-onboarding.zh.md | 33 +++ ...-13-remove-first-run-beta-notice.i18n.yaml | 4 +- ...2026-08-13-remove-first-run-beta-notice.md | 4 +- ...6-08-13-remove-first-run-beta-notice.zh.md | 4 +- apps/web/tests/README.i18n.yaml | 4 +- apps/web/tests/README.md | 3 +- apps/web/tests/README.zh.md | 2 +- apps/web/tests/goal-bar.e2e.ts | 2 +- .../tests/onboarding-deepseek-config.e2e.ts | 118 ++++++----- .../tests/onboarding-usable-provider.e2e.ts | 17 +- apps/web/tests/remote-welcome.e2e.ts | 60 ++++++ apps/web/tests/scaffold.ts | 27 +++ .../missing.expected.md | 7 +- .../welcome.expected.md | 5 + .../ui-settings-general/README.i18n.yaml | 4 +- packages/client/ui-settings-general/README.md | 6 +- .../client/ui-settings-general/README.zh.md | 6 +- .../src/client/SettingsRoot.tsx | 12 +- .../client/ui-settings-general/src/index.ts | 2 +- .../tests/settings-root.client.spec.tsx | 2 +- .../ui-settings-models/README.i18n.yaml | 4 +- packages/client/ui-settings-models/README.md | 6 +- .../client/ui-settings-models/README.zh.md | 6 +- .../client/ui-settings-models/package.json | 2 +- .../DeepSeekOnboardingDialog.module.css | 97 +-------- .../src/client/DeepSeekOnboardingDialog.tsx | 109 +++++----- .../src/client/EditorFooter.tsx | 4 +- .../src/client/OnboardingModal.module.css | 32 +++ .../src/client/OnboardingModal.tsx | 52 +++++ .../src/client/ProviderEditor.tsx | 55 +++-- .../src/client/WelcomeNotice.module.css | 36 ++++ .../src/client/WelcomeNotice.tsx | 77 +++++++ .../ui-settings-models/src/client/index.ts | 54 +++-- .../ui-settings-models/src/client/locales.ts | 18 +- .../src/client/welcome-store.ts | 126 +++++++++++ .../ui-settings-models/src/onboarding-copy.ts | 25 +++ .../tests/apply.client.spec.ts | 49 ++++- .../tests/components.client.spec.tsx | 59 ++++++ .../tests/onboarding-dialog.client.spec.tsx | 162 +++++++++++--- .../tests/welcome-notice.client.spec.tsx | 126 +++++++++++ .../tests/welcome-store.client.spec.ts | 199 ++++++++++++++++++ .../ui-settings/src/client/contract/slots.ts | 12 +- .../src/client/slot-catalog.ts | 7 +- 54 files changed, 1388 insertions(+), 342 deletions(-) create mode 100644 .agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml create mode 100644 .agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md create mode 100644 .agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md create mode 100644 apps/web/tests/remote-welcome.e2e.ts create mode 100644 apps/web/tests/snapshots/onboarding-deepseek-config/welcome.expected.md create mode 100644 packages/client/ui-settings-models/src/client/OnboardingModal.module.css create mode 100644 packages/client/ui-settings-models/src/client/OnboardingModal.tsx create mode 100644 packages/client/ui-settings-models/src/client/WelcomeNotice.module.css create mode 100644 packages/client/ui-settings-models/src/client/WelcomeNotice.tsx create mode 100644 packages/client/ui-settings-models/src/client/welcome-store.ts create mode 100644 packages/client/ui-settings-models/src/onboarding-copy.ts create mode 100644 packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx create mode 100644 packages/client/ui-settings-models/tests/welcome-store.client.spec.ts diff --git a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml index 4f037737ff..5ef2099535 100644 --- a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md -2026-07-30-deepseek-onboarding-credential-setup.md: ebf5c66cffa8a7db90328dfcdd04e4134a78e3b1 -2026-07-30-deepseek-onboarding-credential-setup.zh.md: 3df63c59fd23acf32c16dac8f4ca373409ab2968 +2026-07-30-deepseek-onboarding-credential-setup.md: 823d10a723af70ec4ff51018b8b86198db0f5c29 +2026-07-30-deepseek-onboarding-credential-setup.zh.md: 7e8d79c23c4b1489bfd818c90558f36509635486 diff --git a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md index ebf5c66cff..823d10a723 100644 --- a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md +++ b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md @@ -12,9 +12,9 @@ The [web configuration plane](../architecture/2026-07-30-web-config-plane.md) ma **One readiness projection owns both Models and onboarding facts.** `ui-settings-models` keeps a single store that joins `llm.providers({})`, redacted `settings.describe({})`, and batched `credentials.describe({refs})`. The onboarding projection selects the `deepseek-official` configurable-provider entry owned by the `llm-deepseek` namespace and empty settings path, reads the effective `apiKeyEnv`, and evaluates the matching credential descriptor. A live route with the same provider id but no matching configurable-provider declaration is adapter-absent for onboarding. A configured process-environment credential is ready and remains read-only. -**The settings shell contributes ordering and navigation, not provider policy.** `ui-settings` declares a root-scoped `settings.onboarding` list slot and mounts one ordered step at a time while the current surface is the empty Hero. The active registrant receives `complete()` and a private `openSection(id)` callback; completion transfers ownership to the next entry. `ui-settings-models` registers the DeepSeek step and its Models section through `slots.inject()`, so each contribution follows its declaration lifetime without making plugin load order a contract, and independently contributed dialogs cannot stack. The product-wide welcome step that precedes it is owned separately by [the versioned welcome decision](2026-07-30-versioned-gui-welcome-onboarding.md). +**The settings shell contributes ordering, not provider policy.** `ui-settings` declares a root-scoped `settings.onboarding` list slot and mounts one ordered step at a time while the current surface is the empty Hero. The active registrant receives `complete()` and a private `openSection(id)` callback; completion transfers ownership to the next entry. `ui-settings-models` registers the DeepSeek step, the preceding welcome notice, and its Models section through `slots.inject()`, so every contribution follows one client Cordis plugin's lifecycle and the dialogs cannot stack. Their common presentation is owned by the [shared-modal onboarding decision](2026-08-13-shared-modal-product-onboarding.md). -**The prompt routes to the one credential editor.** A mounted, active adapter with a resolved, writable, unconfigured reference presents one action that opens Settings on Models. The existing DeepSeek setup card there exclusively owns the password input, `credentials.set({ref, value})`, write failures, and post-write refresh; the onboarding overlay never holds or submits a secret. An unavailable settings or credential capability keeps its deployment diagnostic and routes to the same page, while an absent adapter remains skipped because navigation cannot mount a Cordis plugin. +**The prompt renders the existing credential editor inline.** A mounted, active adapter with a resolved, writable, unconfigured reference renders `ProviderEditor` in credential-only mode inside the shared onboarding modal. The same component owns the password input, validation, `credentials.set({ref, value})`, write failures, and post-write refresh; credential-only mode emits no provider-settings mutation. Configure later completes only this coordinator pass. An absent adapter remains skipped because the browser cannot mount a missing Cordis plugin. **Unavailable states do not capture the product.** An absent configurable-provider entry, inactive route, failed initial join, read-only deployment, or unresolved settings or credential capability completes the step without rendering because the onboarding action cannot repair that state. The Models page remains the deployment diagnostic and retry surface. Configure later completes a missing-credential step for the current mounted coordinator pass and writes no completion fact. Settings, credential, provider-topology, and connection invalidations all refresh the shared join, so an external credential update completes an open step without a reload. @@ -22,7 +22,7 @@ The [web configuration plane](../architecture/2026-07-30-web-config-plane.md) ma **A separate onboarding store and readiness RPC sequence** — rejected because it would create a second client-side interpretation of provider identity, settings paths, secret sidecars, credential references, and invalidation ordering beside the Models page. -**A second API-key editor inside onboarding** — rejected because the Models page already renders its DeepSeek setup card for exactly this state. Duplicating its secret draft, write errors, and configured-state convergence would add a second security-sensitive UI without another user capability. +**A standalone API-key implementation inside onboarding** — rejected because it would duplicate the Models editor's secret draft, validation, errors, and configured-state convergence. The modal renders the existing `ProviderEditor` in a constrained mode instead. **Writing the API key into provider settings** — rejected because a literal secret would enter the settings mutation path and whole-section replacement cannot safely reconstruct redacted values. Credential storage is already the product seam and supplies immediate invalidation. @@ -30,4 +30,4 @@ The [web configuration plane](../architecture/2026-07-30-web-config-plane.md) ma ## Consequences -The ordered flow leads from the product notice to the shipped adapter's existing editor without restarting: a keyless browser test boots the real Web composition under an isolated harness home, acknowledges the notice, follows the DeepSeek page to Models, stores a generated key through that page into the home's `.credentials.yaml`, verifies no key reaches DOM, ARIA, or browser console output, and confirms the running page reports configured. The full keyless Web replay lane also pins that a non-configurable replay route with the same provider id does not block unrelated journeys. Pure readiness and React tests pin managed-file and process-environment credentials, missing providers and capabilities, navigation, cancellation, external invalidation, and coordinator transfer. The flow deliberately inherits the configuration plane's documented base limitations rather than adding local secret storage, redaction, or settings replacement workarounds. +The ordered flow leads from the product notice to an inline key form without restarting: a keyless browser test boots the real Web composition under an isolated harness home, acknowledges the notice, stores a generated key from the shared modal into the home's `.credentials.yaml`, verifies no key reaches DOM, ARIA, or browser console output, and confirms the ordinary Models page reports configured. The full keyless Web replay lane also pins that a non-configurable replay route with the same provider id does not block unrelated journeys. Pure readiness and React tests pin managed-file and process-environment credentials, missing providers and capabilities, cancellation, external invalidation, and coordinator transfer. The flow deliberately inherits the configuration plane's documented base limitations rather than adding local secret storage, redaction, or settings replacement workarounds. diff --git a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md index 3df63c59fd..7e8d79c23c 100644 --- a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md +++ b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md @@ -12,9 +12,9 @@ Status: implemented **Models 与首次使用引导共享同一个就绪状态投影。**`ui-settings-models` 维护一个 store,把 `llm.providers({})`、脱敏后的 `settings.describe({})` 和批量调用的 `credentials.describe({refs})` 联接为同一份状态。首次使用投影选取由 `llm-deepseek` namespace 与空 settings path 持有的 `deepseek-official` 可配置提供方条目,读取生效的 `apiKeyEnv`,并检查对应的凭据描述符。同 provider id 但没有匹配可配置提供方声明的存活路由,在首次使用引导中视为适配器缺失。通过进程环境提供的凭据若已配置,则判定为就绪并保持只读。 -**设置外壳只贡献排序与导航,不持有提供方策略。** `ui-settings` 声明一个根作用域的 `settings.onboarding` list slot,并在当前界面为空白 Hero 时,每次只挂载一个有序步骤。当前注册方会收到 `complete()` 和私有 `openSection(id)` 回调;完成当前步骤后,所有权转交给下一项。`ui-settings-models` 通过 `slots.inject()` 注册 DeepSeek 步骤及其 Models 分区,使每项贡献都跟随自身的声明生命周期,不让插件加载顺序成为约定;独立贡献的对话框也无法堆叠。排在它之前的产品级欢迎步骤由[版本化欢迎决策](2026-07-30-versioned-gui-welcome-onboarding.md)单独持有。 +**设置外壳只贡献排序,不持有提供方策略。** `ui-settings` 声明一个根作用域的 `settings.onboarding` list slot,并在当前界面为空白 Hero 时,每次只挂载一个有序步骤。当前注册方会收到 `complete()` 和私有 `openSection(id)` 回调;完成当前步骤后,所有权转交给下一项。`ui-settings-models` 通过 `slots.inject()` 注册 DeepSeek 步骤、排在它之前的欢迎声明及 Models 分区,因此所有贡献都跟随同一个 client Cordis 插件的生命周期,两个弹窗也无法堆叠。它们的共用展示由[共用弹窗引导决策](2026-08-13-shared-modal-product-onboarding.md)持有。 -**首次使用页面只负责跳转到唯一的凭据编辑器。**适配器已挂载且处于活跃状态,其引用可解析、可写但尚未配置时,界面会显示一个操作按钮,用于打开「设置」的 Models 分区。该分区已有的 DeepSeek 设置卡片全权负责密码输入框、`credentials.set({ref, value})`、写入失败处理和写入后刷新;首次使用页面绝不持有或提交 secret。 +**首次使用弹窗行内渲染既有凭据编辑器。** 适配器已挂载且处于活跃状态,其引用可解析、可写但尚未配置时,`ProviderEditor` 会以仅凭据模式渲染在共用引导弹窗中。同一个组件全权负责密码输入框、校验、`credentials.set({ref, value})`、写入失败处理和写入后刷新;仅凭据模式不会发出提供方 settings 变更。「稍后配置」只完成协调器当前这一轮。适配器缺失时仍跳过,因为浏览器不能挂载缺失的 Cordis 插件。 **不可用状态不会占住产品。** 可配置提供方条目缺失、路由不活跃、初始联接失败、部署只读或设置/凭据能力无法解析时,都会直接完成而不渲染该步骤,因为首次使用引导无法修复这些状态。Models 页仍是部署诊断与重试界面。「稍后配置」只会完成协调器当前这一次缺少凭据的步骤,不写入任何完成状态。设置、凭据、提供方拓扑和连接失效事件都会刷新共享联接,因此外部凭据更新无需重新加载页面即可完成已打开的步骤。 @@ -22,7 +22,7 @@ Status: implemented **为首次使用引导单设 store 与就绪状态 RPC 调用序列**:不予采用,因为这会在 Models 页之外,再建立一套客户端解释,用于判定提供方身份、设置路径、secret 槽位的伴随信息、凭据引用及失效事件顺序。 -**在首次使用引导中增设第二个 API key 编辑器**:不予采用,因为 Models 页已为这一状态渲染 DeepSeek 设置卡片。复制其中的 secret 草稿、写入错误处理和已配置状态收敛会增加第二个安全敏感的 UI,却不会带来新的用户能力。 +**在首次使用引导中单独实现 API key 表单**:不予采用,因为这会复制 Models 编辑器的 secret 草稿、校验、错误和已配置状态收敛。弹窗改为以受限模式渲染既有 `ProviderEditor`。 **把 API key 写入提供方设置**:不予采用,因为字面量 secret 会进入设置变更路径,而整个分节替换无法安全重建脱敏值。凭据存储已经是产品 seam,并能立即发出失效事件。 @@ -30,4 +30,4 @@ Status: implemented ## 后果 -有序流程从产品声明页开始,无需重启即可引导用户前往随产品提供的适配器已有的编辑器:无密钥浏览器测试在隔离的 harness 家目录下启动真实 Web 组合,确认声明后依照 DeepSeek 页面前往 Models,通过该页面把生成的密钥存入该目录的 `.credentials.yaml`,验证密钥未进入 DOM、ARIA 或浏览器控制台输出,并确认运行中的页面报告已配置。完整的无密钥 Web 回放也固定了同 id 的不可配置回放路由不会阻塞无关流程。纯就绪状态测试与 React 测试固化了受管文件凭据与进程环境凭据、提供方与能力缺失、导航、取消、外部失效和协调器移交。该流程直接继承配置平面已记录的基础限制,不会另加局部的机密存储、脱敏或设置替换变通方案。 +有序流程从产品声明页开始,无需重启即可进入行内密钥表单:无密钥浏览器测试在隔离的 harness 家目录下启动真实 Web 组合,确认声明后从共用弹窗把生成的密钥存入该目录的 `.credentials.yaml`,验证密钥未进入 DOM、ARIA 或浏览器控制台输出,并确认普通 Models 页面报告已配置。完整的无密钥 Web 回放也固定了同 id 的不可配置回放路由不会阻塞无关流程。纯就绪状态测试与 React 测试固化了受管文件凭据与进程环境凭据、提供方与能力缺失、取消、外部失效和协调器移交。该流程直接继承配置平面已记录的基础限制,不会另加局部的机密存储、脱敏或设置替换变通方案。 diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml index 66b59c3509..630898f12a 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md -2026-07-30-versioned-gui-welcome-onboarding.md: 7a8c5c5b9ba1ec62ad8dd0f5bdf67c516ba0ddec -2026-07-30-versioned-gui-welcome-onboarding.zh.md: 646080b893bb6264a3a92f49400cb9207e29755b +2026-07-30-versioned-gui-welcome-onboarding.md: 9c8684c0510c50c28e8ece53fd794844c771e496 +2026-07-30-versioned-gui-welcome-onboarding.zh.md: 52c35bf46e40afca1248bcbb94f38d7154f138a4 diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md index 7a8c5c5b9b..9c8684c051 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md @@ -10,13 +10,13 @@ The GUI's credential onboarding begins with a DeepSeek-specific readiness check, ## Decision -**The Settings shell coordinates ordered steps.** `settings.onboarding` remains a root-scoped list, but `ui-settings` projects its entry ids and order into one coordinator and mounts only the first incomplete step. The active registrant receives `complete()` and `openSection(id)`; no later step mounts until ownership transfers. `ui-settings-models` registers the conditional DeepSeek readiness and credential-routing step at order `0`, the only shipped occupant since the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md). +**The Settings shell coordinates ordered steps.** `settings.onboarding` remains a root-scoped list, but `ui-settings` projects its entry ids and order into one coordinator and mounts only the first incomplete step. The active registrant receives `complete()` and `openSection(id)`; no later step mounts until ownership transfers. `ui-settings-models` now registers the restored welcome notice at order `-100` and the conditional DeepSeek credential step at order `0`; their current shared presentation is owned by the [shared-modal onboarding decision](2026-08-13-shared-modal-product-onboarding.md). -**The product welcome step is removed.** The versioned notice, its copy owner, and its acknowledgement store shipped from this decision until the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md), which owns the removal rationale; `ui-settings-general` seats no onboarding step. +**The product welcome step is versioned and feature-owned.** The notice was historically removed by the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md) and is now restored in `ui-settings-models` with new testing-stage copy. `ui-settings-general` still seats no onboarding step; the plugin that owns both current steps also owns the copy, store, and shared modal. -**The durable `ui-onboarding` section outlives the notice.** The Host half registers it in the user-settings seam under the active `$DSH_HOME/settings.yaml`; its `welcomeNoticeVersion` field keeps stored acknowledgements valid and has no reader. The connection plugin publishes whether the current page uses a loopback authority as `ctx.connection.isLoopback`; hostname classification remains internal to the connection package, and other client plugins consume the service state instead of importing its implementation. The API proxy exposes this one product namespace through a closed allowlist beside configurable-provider namespaces, without treating its changes as model-catalog invalidations. +**The durable `ui-onboarding` section owns acknowledgement.** The Host half registers it in the user-settings seam under the active `$DSH_HOME/settings.yaml`; the current welcome store reads and writes `welcomeNoticeVersion` through the existing public settings API. The connection plugin publishes whether the current page uses a loopback authority as `ctx.connection.isLoopback`; hostname classification remains internal to the connection package, and other client plugins consume the service state instead of importing its implementation. The API proxy exposes this one product namespace through a closed allowlist beside configurable-provider namespaces, without treating its changes as model-catalog invalidations. -**Onboarding temporarily owns the viewport as one continuous stage.** A solid product surface replaces the complete application view through a body-level portal and marks the underlying app root inert; the exact required mask remains mounted behind that surface with `position:absolute`, zero left/right/bottom offsets, `top:80px`, `rgba(0, 0, 0, 0.24)`, and `backdrop-filter: blur(2px)`. Onboarding steps render as successive pages in this stage instead of independent modals, reusing the Web UI's black `BrandWordmark`; the conditional credential setup is the only shipped page. +**Visible onboarding uses one shared modal contract.** Both current steps render through the same body-portaled `OnboardingModal`, and the underlying app root stays inert only while a dialog is visible. The shell renders no wrapper while a step loads its private facts. Explicit actions transfer coordinator ownership; Escape and mask clicks do not acknowledge or skip a step. ## Alternatives considered @@ -30,4 +30,4 @@ The GUI's credential onboarding begins with a DeepSeek-specific readiness check, ## Consequences -A fresh profile proceeds directly to provider-specific onboarding: the conditional DeepSeek step mounts when its credential is missing, and an already configured credential shows no onboarding page at all. Focused store and React tests pin coordinator ordering, conditional DeepSeek transfer, and HMR cleanup. The real Chromium scenario boots the shipped Web composition with an isolated harness home, verifies the exact mask geometry and computed styles while the credential step owns the viewport, continues into missing-credential setup, and checks the browser console. +A fresh profile sees the current testing-stage notice, then the conditional DeepSeek key dialog when no provider is usable. Focused store and React tests pin exact-version acknowledgement, coordinator ordering, conditional transfer, shared modal behavior, and HMR cleanup. The real Chromium scenario boots the shipped Web composition with an isolated harness home, verifies both dialogs, writes the key through the existing credential boundary, and checks that no secret reaches the DOM, ARIA, or browser console. diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md index 646080b893..52c35bf46e 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md @@ -10,13 +10,13 @@ GUI 的凭据引导从 DeepSeek 专用的就绪状态检查开始,但内部测 ## 决策 -**设置外壳协调有序步骤。** `settings.onboarding` 仍是根作用域 list,但 `ui-settings` 会把其中各条目的 id 和顺序投影到一个协调器中,并且只挂载第一个未完成的步骤。当前注册方会收到 `complete()` 和 `openSection(id)`;所有权转移前,不会挂载后续步骤。`ui-settings-models` 注册顺序为 `0` 的 DeepSeek 条件式就绪状态与凭据跳转步骤,自[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)起,它是当前唯一的注册方。 +**设置外壳协调有序步骤。** `settings.onboarding` 仍是根作用域 list,但 `ui-settings` 会把其中各条目的 id 和顺序投影到一个协调器中,并且只挂载第一个未完成的步骤。当前注册方会收到 `complete()` 和 `openSection(id)`;所有权转移前,不会挂载后续步骤。`ui-settings-models` 现在以顺序 `-100` 注册恢复后的欢迎声明,以顺序 `0` 注册 DeepSeek 条件式凭据步骤;两者当前的共用展示由[共用弹窗引导决策](2026-08-13-shared-modal-product-onboarding.md)持有。 -**产品欢迎步骤已移除。** 版本化通知、其文案所有者文件和确认 store 自本决策起随产品发布,直至[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md);移除理由由该 note 持有。`ui-settings-general` 不再注册任何引导步骤。 +**产品欢迎步骤按版本管理并归功能插件所有。** 该声明曾由[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)历史决策移除,现在以新的测试阶段文案恢复在 `ui-settings-models` 中。`ui-settings-general` 仍不注册任何引导步骤;持有当前两个步骤的插件也持有文案、store 和共用弹窗。 -**持久化的 `ui-onboarding` 分节在通知移除后继续存在。** 宿主端在 user-settings seam 中注册它,存入当前 `$DSH_HOME/settings.yaml`;其中的 `welcomeNoticeVersion` 字段让已存储的确认记录保持有效,没有读取方。connection 插件通过 `ctx.connection.isLoopback` 统一发布当前页面是否使用 loopback authority;hostname 判定留在 connection 包内,其他客户端插件只消费服务状态,而不导入其实现。API Proxy 在可配置提供方 namespace 之外,通过封闭的允许列表暴露这一个产品 namespace,同时不会把它的变更视为模型目录失效事件。 +**持久化的 `ui-onboarding` 分节持有确认状态。** 宿主端在 user-settings seam 中注册它,存入当前 `$DSH_HOME/settings.yaml`;当前欢迎 store 通过既有公开 settings API 读写其中的 `welcomeNoticeVersion`。connection 插件通过 `ctx.connection.isLoopback` 统一发布当前页面是否使用 loopback authority;hostname 判定留在 connection 包内,其他客户端插件只消费服务状态,而不导入其实现。API Proxy 在可配置提供方 namespace 之外,通过封闭的允许列表暴露这一个产品 namespace,同时不会把它的变更视为模型目录失效事件。 -**引导流程会暂时接管视口,形成一个连续阶段。** 纯色产品界面通过挂载到 `body` 的 portal 取代完整的应用视图,并将底层应用根节点标记为 inert;严格符合要求的遮罩仍挂载在该界面后方,并保留 `position:absolute`、left/right/bottom 偏移量为零、`top:80px`、`rgba(0, 0, 0, 0.24)` 和 `backdrop-filter: blur(2px)`。引导步骤在这一阶段中依次呈现,而不是各自作为独立的模态窗口,并复用 Web UI 的黑色 `BrandWordmark`;按条件显示的凭据设置页是当前唯一的页面。 +**可见引导使用同一个弹窗契约。** 当前两个步骤都通过 body portal 的同一个 `OnboardingModal` 渲染,且只在弹窗可见期间把下层应用根节点设为 inert。步骤加载私有事实时,外壳不渲染任何包装。明确操作会移交协调器所有权;Escape 和点击遮罩都不会确认或跳过步骤。 ## 曾考虑的替代方案 @@ -30,4 +30,4 @@ GUI 的凭据引导从 DeepSeek 专用的就绪状态检查开始,但内部测 ## 后果 -全新 profile 直接进入提供方专用引导:DeepSeek 步骤仅在其凭据缺失时挂载,凭据已配置时不会出现任何引导页面。针对性的 store 与 React 测试固化了协调器顺序、按条件移交 DeepSeek 步骤和 HMR(热模块替换)清理行为。真实 Chromium 场景会使用隔离的 harness 家目录启动随产品提供的 Web 组合,在凭据步骤占据视口时验证遮罩的精确几何尺寸和计算样式,继续进入凭据缺失设置流程,并检查浏览器控制台。 +全新 profile 会先看到当前测试阶段声明;当没有任何可用提供方时,再看到条件式 DeepSeek 密钥弹窗。定向 store 与 React 测试固定精确版本确认、协调器顺序、条件式移交、共用弹窗行为与 HMR 清理。真实 Chromium 场景会在隔离的 harness 家目录下启动已发布 Web 组合,验证两个弹窗,通过既有凭据边界写入密钥,并检查 secret 未进入 DOM、ARIA 或浏览器控制台。 diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml index 434bd14018..5a4552f5d0 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md -2026-08-10-telemetry-default-off.md: b70fdbc64074936ae910cba305a59111d6f9b572 -2026-08-10-telemetry-default-off.zh.md: abb5cafa9f877659dca1d53c0be9df9414799cf9 +2026-08-10-telemetry-default-off.md: 3f56817c9c23ec55f2173b66fa915ab05646b2a7 +2026-08-10-telemetry-default-off.zh.md: aa7b640f292713aa4e598f5ea1194f806dd6ae0d diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md index b70fdbc640..3f56817c9c 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md @@ -14,7 +14,7 @@ Both feeds use `DSH_TELEMETRY_MODE` as their positive consent setting. Unset and The dsh-sdk launcher reads the same variable without parsing `cordis.yml` or booting Cordis. `FULL` permits reporting; `FEEDBACK_ONLY`, `DISABLED`, unset, and empty values deny it. Consent is frozen from the launching environment before the command runs, because `dsh-sdk start` loads a project `.env` and project code can mutate `process.env`: resolving afterwards would let a project grant reporting of its own configuration, which the [configuration source ownership decision](../architecture/2026-08-04-configuration-source-ownership.md) denies for the whole `DSH_*` namespace. An unsupported mode denies rather than throwing at that boundary, since telemetry may never change a command's result. This rule superseded the default-on launcher consent before the launcher and its proposal were deleted by the [SDK project toolchain removal](../simplification/2026-08-11-remove-sdk-project-toolchain.md). -The [CLI reference README](../../../../apps/cli/reference/README.md) documents the deployment stance: Session Log upload is off by default, `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` and `DSH_TELEMETRY_MODE=FULL` are the two opt-in choices, and explicitly enabled exports can contain complete session content. The product itself presents no prompt about enabling telemetry since the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md). +The [CLI reference README](../../../../apps/cli/reference/README.md) documents the deployment stance: Session Log upload is off by default, `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` and `DSH_TELEMETRY_MODE=FULL` are the two opt-in choices, and explicitly enabled exports can contain complete session content. The restored [testing-stage onboarding notice](2026-08-13-shared-modal-product-onboarding.md) contains no telemetry copy, so the product still presents no prompt about enabling upload. ## Alternatives considered diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md index abb5cafa9f..aa7b640f29 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md @@ -14,7 +14,7 @@ DeepSeek Harness 有两路出站遥测数据流。在内测阶段,共享基础 dsh-sdk 启动器读取同一变量,不解析 `cordis.yml`,也不启动 Cordis。`FULL` 允许上报;`FEEDBACK_ONLY`、`DISABLED`、未设置和空值都会拒绝。授权在命令执行前从启动环境冻结:`dsh-sdk start` 会加载项目 `.env`,项目代码也能修改 `process.env`,若在执行后解析,项目便能自行授权上报其自身配置,而[配置来源所有权决策](../architecture/2026-08-04-configuration-source-ownership.md)对整个 `DSH_*` 命名空间禁止这种行为。在该边界上,不受支持的模式按拒绝处理而非抛出,因为遥测不得改变命令结果。此规则在启动器及其提案被[SDK 项目工具链移除决策](../simplification/2026-08-11-remove-sdk-project-toolchain.md)删除之前,仅取代了启动器默认允许上报的规则。 -[CLI reference README](../../../../apps/cli/reference/README.md) 记录了这一部署口径:会话日志上传默认关闭,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 和 `DSH_TELEMETRY_MODE=FULL` 是两种显式启用选项,显式开启后的导出可能包含完整会话内容。自[移除首次启动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)起,产品本身不提供任何关于开启遥测的提示。 +[CLI reference README](../../../../apps/cli/reference/README.md) 记录了这一部署口径:会话日志上传默认关闭,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 和 `DSH_TELEMETRY_MODE=FULL` 是两种显式启用选项,显式开启后的导出可能包含完整会话内容。恢复后的[测试阶段引导声明](2026-08-13-shared-modal-product-onboarding.md)不包含遥测文案,因此产品仍不提供任何关于开启上传的提示。 ## 考虑过的替代方案 diff --git a/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml new file mode 100644 index 0000000000..abf480f6b2 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md +2026-08-13-shared-modal-product-onboarding.md: 771b6675ea170c5001fca7c880f6c246e19fe7f1 +2026-08-13-shared-modal-product-onboarding.zh.md: ebbcb73344b531e90a6d27641f25fa9961d572ac diff --git a/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md new file mode 100644 index 0000000000..771b6675ea --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md @@ -0,0 +1,33 @@ +# Agent Note: Shared-modal product onboarding + +Status: implemented + +English | [中文](2026-08-13-shared-modal-product-onboarding.zh.md) + +## Problem + +First-run onboarding mixed two interaction models: a viewport takeover for product context and a credential prompt that redirected users into Settings before they could enter a key. That made a short, ordered flow feel like two unrelated surfaces and left onboarding UI ownership split across packages. The product still needs a versioned testing-stage notice before provider setup, but restoring it must not add a second independent overlay or change the Host settings and credential boundaries. + +## Decision + +**One existing client Cordis plugin owns both shipped steps.** `ui-settings-models` registers `welcome-notice` at order `-100` and `deepseek-official` at order `0` in `settings.onboarding`. The shell continues to mount only the first incomplete entry, so the dialogs cannot stack. No additional client package or plugin row is introduced. + +**Both steps share one modal component.** `OnboardingModal` wraps the existing ui-primitives `Modal`, supplies the common title and content geometry, and owns `#root` inert for exactly the visible lifetime. Escape and mask clicks do not silently complete mandatory onboarding; each step exposes only its explicit actions. A step still loading private facts returns `null`, so it paints and blocks nothing. + +**The welcome notice reuses the existing durable field.** Its exact copy and version live in `onboarding-copy.ts`. Loopback clients compare and write `ui-onboarding.welcomeNoticeVersion` through the existing settings API, and only Continue acknowledges the current version. Remote clients retain the existing process-local fallback because the settings namespace is loopback-only. No Host schema, API-proxy allowlist, or persistence implementation changes. + +**The credential dialog reuses the existing editor and write boundary.** The Models join still decides whether any provider is usable. When the official DeepSeek reference is writable and missing, `ProviderEditor` renders in credential-only mode inside the shared modal. It validates the key and calls the existing `credentials.set`; it does not mutate provider settings. Save and continue waits for the write and refreshed readiness, while Configure later completes only the current coordinator pass. + +## Alternatives considered + +**Separate client plugins for the notice and credential steps.** Rejected because the product asks for one client Cordis plugin and the two surfaces share copy, ordering, modal chrome, and invalidation ownership. + +**Move acknowledgement or credential logic into a new Host API.** Rejected because both backend contracts already express the required state and writes. A new endpoint would widen scope without changing user capability. + +**Keep the credential step as navigation into Models.** Rejected because the key is the only required first-run field, and the existing editor can expose that write safely without sending the user through a second dialog. + +**Keep the former full-viewport stage.** Rejected because the requested onboarding is a pair of dialogs over the current app, and the common ui-primitives modal already provides the appropriate portal, mask, and accessibility contract. + +## Consequences + +A fresh loopback profile sees the specified internal-testing notice, then an inline DeepSeek key dialog only when no provider is usable. Acknowledgement remains versioned in `settings.yaml`, secrets remain write-only in `.credentials.yaml`, and already-ready or unsupported deployments render no onboarding chrome while readiness loads. The Models package now owns product-onboarding presentation as well as provider configuration; its README and browser coverage make that broader responsibility explicit. This decision restores a concise testing-stage notice after the historical [full-viewport beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md) without restoring that notice's telemetry copy or takeover layout. diff --git a/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md new file mode 100644 index 0000000000..ebbcb73344 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md @@ -0,0 +1,33 @@ +# Agent Note: 共用弹窗的产品引导 + +Status: implemented + +[English](2026-08-13-shared-modal-product-onboarding.md) | 中文 + +## 问题 + +首次使用引导混用了两种交互:产品背景说明占满整个视口,凭据提示则先把用户带进「设置」,之后才能输入密钥。一个很短的有序流程因此像两个互不相关的界面,引导 UI 的归属也分散在多个包中。产品仍需要在提供方配置之前显示版本化的测试阶段声明,但恢复它不能增加第二个独立浮层,也不能改变 Host 的设置与凭据边界。 + +## 决策 + +**由同一个既有 client Cordis 插件持有两个已发布步骤。** `ui-settings-models` 在 `settings.onboarding` 中以顺序 `-100` 注册 `welcome-notice`,以顺序 `0` 注册 `deepseek-official`。外壳仍然只挂载第一个未完成条目,因此两个弹窗不会堆叠。不新增 client 包或插件配置行。 + +**两个步骤共用同一个弹窗组件。** `OnboardingModal` 包装既有 ui-primitives `Modal`,提供统一的标题和内容布局,并只在可见期间持有 `#root` 的 inert 状态。Escape 和遮罩点击不会静默完成强制引导;每个步骤只暴露自己的明确操作。步骤仍在加载私有事实时返回 `null`,因此不会绘制或阻塞界面。 + +**欢迎声明复用既有持久化字段。** 完整文案与版本由 `onboarding-copy.ts` 持有。回环客户端通过既有 settings API 比较和写入 `ui-onboarding.welcomeNoticeVersion`,且只有点击「继续」才确认当前版本。远程客户端继续使用既有的进程内回退,因为该 settings namespace 仅限回环访问。不改变 Host schema、API Proxy 允许列表或持久化实现。 + +**凭据弹窗复用既有编辑器与写入边界。** Models 联接仍负责判断是否已有任意可用提供方。当 DeepSeek 官方引用可写但缺失时,`ProviderEditor` 以仅凭据模式渲染在共用弹窗中。它校验密钥并调用既有 `credentials.set`,不会修改提供方设置。「保存并继续」会等待写入与就绪状态刷新;「稍后配置」只完成协调器当前这一轮。 + +## 曾考虑的替代方案 + +**让声明与凭据步骤分别成为 client 插件。** 不采用:产品要求只使用一个 client Cordis 插件,且两个界面共享文案、顺序、弹窗框架与失效刷新归属。 + +**把确认或凭据逻辑移入新的 Host API。** 不采用:两个既有后端契约已经能表达所需状态与写入;新增 endpoint 只会扩大范围,不会增加用户能力。 + +**继续从凭据步骤跳转到 Models。** 不采用:首次使用唯一必填的是密钥,既有编辑器可以安全暴露这项写入,无需再把用户送进第二个对话框。 + +**保留此前占满视口的展示层。** 不采用:本次需要的是叠加在当前应用上的两个弹窗,既有 ui-primitives modal 已提供合适的 portal、遮罩与无障碍契约。 + +## 后果 + +新的回环 profile 会先看到指定的内测声明;仅当没有任何可用提供方时,之后才会出现行内 DeepSeek 密钥弹窗。确认仍按版本写入 `settings.yaml`,secret 仍以只写方式存入 `.credentials.yaml`,已就绪或无法修复的部署在加载判定期间不会渲染任何引导框架。Models 包现在同时持有产品引导展示与提供方配置;README 和浏览器覆盖明确记录了这项扩展后的职责。本决策在历史上的[全屏内测声明移除](../simplification/2026-08-13-remove-first-run-beta-notice.md)之后恢复简洁的测试阶段声明,但不会恢复那份声明中的遥测文案或接管式布局。 diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml index 7a48a069c5..e48ec3de3b 100644 --- a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md -2026-08-13-remove-first-run-beta-notice.md: 69f47be445ebfa9f10e6ba1217e4674a98c747f1 -2026-08-13-remove-first-run-beta-notice.zh.md: 51c91918baaf1ae3db28434d7d86093fbd5ffb4e +2026-08-13-remove-first-run-beta-notice.md: 21396eb9cc3e0e766238115967e354abe1032bd2 +2026-08-13-remove-first-run-beta-notice.zh.md: 2818343804e88e7114f5a6298393780b0fdcaf24 diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md index 69f47be445..21396eb9cc 100644 --- a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md @@ -10,7 +10,7 @@ Every GUI first launch opened with a full-viewport internal-test statement (内 ## Decision -The first-run notice is removed from the assembled product rather than reworded. `ui-settings-general` seats no `settings.onboarding` step; the notice component, its durable acknowledgement store, its copy owner, and its locale keys are deleted. The `settings.onboarding` coordinator and its takeover stage stay ([ordered onboarding](../feature/2026-07-30-versioned-gui-welcome-onboarding.md)), and the conditional DeepSeek credential step is the only shipped occupant. The Host half still registers the `ui-onboarding` settings namespace: its `welcomeNoticeVersion` field keeps acknowledgements already stored in `$DSH_HOME/settings.yaml` valid, and nothing reads or writes it. Telemetry opt-in remains an explicit deployment environment choice documented in the [CLI reference README](../../../../apps/cli/reference/README.md); the product presents no prompt about enabling it. +This decision removed the first-run notice from the assembled product rather than rewording it. `ui-settings-general` seated no `settings.onboarding` step; the notice component, acknowledgement store, copy owner, and locale keys were deleted, while the Host kept the `ui-onboarding` namespace so stored documents remained valid. The later [shared-modal product onboarding](../feature/2026-08-13-shared-modal-product-onboarding.md) restores a new concise testing-stage notice in `ui-settings-models`, reusing that field and backend contract without restoring the removed takeover layout or telemetry instructions. Telemetry opt-in remains an explicit deployment environment choice documented in the [CLI reference README](../../../../apps/cli/reference/README.md); the restored notice says nothing about enabling it. ## Alternatives considered @@ -22,4 +22,4 @@ The first-run notice is removed from the assembled product rather than reworded. ## Consequences -A fresh profile boots into the credential step when the DeepSeek credential is missing and directly into the product otherwise; no full-viewport notice precedes either. The assembled onboarding scenario starts at the credential step, the remote-notice scenario is deleted with the feature, and the goal-bar fixture keeps the settings shell disabled because the fixture API client rejects settings traffic. Restoring a first-run notice requires a new onboarding registration and a new versioned field; the retained namespace does not resurrect the old acknowledgement semantics. +This removal eliminated the full-viewport notice and its telemetry copy. The later restoration is intentionally a different presentation and copy revision: a shared modal precedes the inline credential dialog, the remote scenario again covers process-local acknowledgement, and the existing `welcomeNoticeVersion` field records the new copy version. The historical telemetry prompt remains absent. diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md index 51c91918ba..2818343804 100644 --- a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md @@ -10,7 +10,7 @@ GUI 每次首启都会先显示占满视口的内测声明:内部测试的定 ## 决策 -首启声明从组装后的产品中整体移除,而不是改写。`ui-settings-general` 不再注册任何 `settings.onboarding` 步骤;声明组件、其持久化确认 store、文案所有者文件和 locale 键全部删除。`settings.onboarding` 协调器及其接管式展示阶段保留([有序引导](../feature/2026-07-30-versioned-gui-welcome-onboarding.md)),按条件显示的 DeepSeek 凭据步骤是当前唯一的注册方。宿主端仍注册 `ui-onboarding` 设置 namespace:其中的 `welcomeNoticeVersion` 字段让 `$DSH_HOME/settings.yaml` 中已写入的确认记录保持有效,没有任何代码读取或写入它。遥测的开启仍是显式的部署环境变量选择,记录在 [CLI reference README](../../../../apps/cli/reference/README.md) 中;产品界面不出现任何关于开启遥测的提示。 +本决策当时把首启声明从组装后的产品中整体移除,而不是改写。`ui-settings-general` 不再注册任何 `settings.onboarding` 步骤;声明组件、确认 store、文案所有者文件和 locale 键均被删除,Host 则保留 `ui-onboarding` namespace,使既有设置文档继续有效。后续的[共用弹窗产品引导](../feature/2026-08-13-shared-modal-product-onboarding.md)在 `ui-settings-models` 中恢复了一份新的简洁测试阶段声明,复用该字段与后端契约,但不会恢复已移除的接管式布局或遥测说明。遥测的开启仍是显式的部署环境变量选择,记录在 [CLI reference README](../../../../apps/cli/reference/README.md) 中;恢复后的声明不涉及如何开启遥测。 ## 曾考虑的替代方案 @@ -22,4 +22,4 @@ GUI 每次首启都会先显示占满视口的内测声明:内部测试的定 ## 后果 -全新 profile 在缺少 DeepSeek 凭据时直接进入凭据步骤,凭据已配置时直接进入产品,两种情况都没有占满视口的声明。组装级引导场景从凭据步骤开始,远程声明场景随功能一并删除,goal-bar fixture 继续禁用设置外壳,因为 fixture API 客户端会拒绝设置请求。将来若要恢复首启声明,需要新的引导注册和新的版本化字段;保留的 namespace 不会复活旧的确认语义。 +这次移除消除了占满视口的声明及其遥测文案。后续恢复有意采用不同的展示与文案版本:共用弹窗先于行内凭据弹窗出现,远程场景重新覆盖进程内确认,既有 `welcomeNoticeVersion` 字段记录新的文案版本。历史上的遥测提示仍未恢复。 diff --git a/apps/web/tests/README.i18n.yaml b/apps/web/tests/README.i18n.yaml index fd0b89b541..b366a7ff52 100644 --- a/apps/web/tests/README.i18n.yaml +++ b/apps/web/tests/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/web/tests/README.md -README.md: 4d7236ef69189845dbc2847289d497fc54c94ae9 -README.zh.md: 21c2f2ce7ccc8fe5314d766c06235453aa292031 +README.md: acb0c300bafe221f6a92f0168908bebf965377b9 +README.zh.md: fd3d950a106375bb038b205415407b4a31bd2b32 diff --git a/apps/web/tests/README.md b/apps/web/tests/README.md index 4d7236ef69..acb0c300ba 100644 --- a/apps/web/tests/README.md +++ b/apps/web/tests/README.md @@ -30,7 +30,8 @@ artifact it produces itself. When a scenario needs a Client-owned constant or pure function, mirror it here instead, next to the commented-out import that names the source module. A drift then surfaces as a missed selector or a stale mirrored value — a loud failure, -never a silent pass. +never a silent pass. `scaffold.ts` follows this rule for the welcome-notice +namespace, acknowledgement field, version, and asserted Chinese copy. Two kinds of Client import stand. `assembled-boot.ts` drives the shell itself, so it imports `AppWebEntry` from `@deepseek-ai/dsh-client-web` and the boot-manifest diff --git a/apps/web/tests/README.zh.md b/apps/web/tests/README.zh.md index 21c2f2ce7c..fd3d950a10 100644 --- a/apps/web/tests/README.zh.md +++ b/apps/web/tests/README.zh.md @@ -24,7 +24,7 @@ Client face,而该 face 必须等 Host tsdown 生成 `@deepseek-ai/dsh-goal/re 当某个场景需要 Client 持有的常量或纯函数时,改为在此处镜像一份,并紧挨着一条注释掉的 import 点明源模块。这样漂移会表现为选择器未命中或镜像值过期——是响亮的失败,绝不会是静默 -通过。 +通过。`scaffold.ts` 按此规则镜像欢迎声明的 namespace、确认字段、版本和被断言的中文文案。 有两类 Client import 是长期成立的。`assembled-boot.ts` 驱动 shell 本身,因此它从 `@deepseek-ai/dsh-client-web` import `AppWebEntry`、从 diff --git a/apps/web/tests/goal-bar.e2e.ts b/apps/web/tests/goal-bar.e2e.ts index f4a0d8d34b..00260a79ee 100644 --- a/apps/web/tests/goal-bar.e2e.ts +++ b/apps/web/tests/goal-bar.e2e.ts @@ -26,7 +26,7 @@ describe('web e2e: goal bar clear convergence', () => { let tripwire: ReturnType beforeAll(async () => { - scaffold = await launchWebScaffold({ extraOverlayPath: OVERLAY }) + scaffold = await launchWebScaffold({ extraOverlayPath: OVERLAY, welcomeNoticePending: true }) browser = await chromium.launch() page = await newEnglishPage(browser) tripwire = watchConsole(page) diff --git a/apps/web/tests/onboarding-deepseek-config.e2e.ts b/apps/web/tests/onboarding-deepseek-config.e2e.ts index 08cfeda4d3..ad9bc0903f 100644 --- a/apps/web/tests/onboarding-deepseek-config.e2e.ts +++ b/apps/web/tests/onboarding-deepseek-config.e2e.ts @@ -1,6 +1,7 @@ // Keyless browser e2e: the shipped DeepSeek adapter stays mounted while its -// credential is absent, onboarding routes to the real Models editor, and its -// write lands in an isolated harness home without a reload or model call. +// credential is absent, both ordered steps share the shipped modal chrome, +// and the inline key write lands in an isolated harness home without a reload +// or model call. import { randomBytes } from 'node:crypto' import { readFile } from 'node:fs/promises' import { fileURLToPath } from 'node:url' @@ -8,13 +9,17 @@ import { join } from 'node:path' import type { Browser, Page } from 'playwright' import { chromium } from 'playwright' import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest' +import { settingsNamespace } from '@deepseek-ai/dsh-settings' import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, + WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, + WELCOME_NOTICE_VERSION, } from './scaffold.ts' import { ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/onboarding-deepseek-config', import.meta.url)) +const WELCOME_EXPECTED = join(SNAPSHOT_DIR, 'welcome.expected.md') const MISSING_EXPECTED = join(SNAPSHOT_DIR, 'missing.expected.md') const MODELS_EXPECTED = join(SNAPSHOT_DIR, 'models.expected.md') const MODE = webSnapshotMode() @@ -27,7 +32,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup const browserConsole: string[] = [] beforeAll(async () => { - scaffold = await launchWebScaffold({ deepSeekMissingCredential: true }) + scaffold = await launchWebScaffold({ deepSeekMissingCredential: true, welcomeNoticePending: true }) browser = await chromium.launch() // The scenario asserts the shipped Chinese copy, so the browser asks for it. page = await browser.newPage({ viewport: { width: 1440, height: 960 }, locale: ZH_BROWSER_LOCALE }) @@ -44,53 +49,40 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('stores a key write-only and observes configured state without restarting', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-deepseek-config')) - const credentialStep = page.getByRole('region', { name: '添加一个 API Key 开始使用' }) - await credentialStep.waitFor({ timeout: 15_000 }) + const welcome = page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }) + await welcome.waitFor({ timeout: 15_000 }) expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true) + for (const paragraph of WELCOME_NOTICE_COPY.zh.body.split('\n\n')) { + expect(await welcome.getByText(paragraph, { exact: true }).count()).toBe(1) + } + expect(await welcome.getByRole('button').allTextContents()).toEqual([ + WELCOME_NOTICE_COPY.zh.continueLabel, + ]) + const welcomeAria = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) + await compareOrRefreshGolden(WELCOME_EXPECTED, welcomeAria, MODE) - const mask = page.locator('[class*="onboardingMask"]') - expect(await mask.count()).toBe(1) - const maskStyles = await mask.evaluate((mask) => { - const style = getComputedStyle(mask) - const rect = mask.getBoundingClientRect() - return { - position: style.position, - left: style.left, - right: style.right, - top: style.top, - bottom: style.bottom, - background: style.backgroundColor, - backdropFilter: style.backdropFilter, - rect: { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom }, - } - }) - expect(maskStyles).toEqual({ - position: 'absolute', - left: '0px', - right: '0px', - top: '80px', - bottom: '0px', - background: 'rgba(0, 0, 0, 0.24)', - backdropFilter: 'blur(2px)', - rect: { left: 0, top: 80, right: 1440, bottom: 960 }, - }) + // Observation is not acknowledgement: the exact version is persisted + // only by the explicit action, so a reload still presents this dialog. + const firstReloadWarnings = tripwire.warnings.length + await page.reload({ waitUntil: 'load' }) + acknowledgeReloadConnectionLoss(tripwire, firstReloadWarnings) + await welcome.waitFor({ timeout: 15_000 }) - expect(await credentialStep.getByRole('textbox').count()).toBe(0) - const initial = await captureStableAria(page, '[role="region"]', scaffold.workspaceCwd) - await compareOrRefreshGolden(MISSING_EXPECTED, initial, MODE) + await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() + await welcome.waitFor({ state: 'detached', timeout: 15_000 }) - await credentialStep.getByRole('button', { name: '前往配置' }).click() - await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) - const settings = page.getByRole('dialog', { name: '设置' }) - await settings.waitFor({ timeout: 10_000 }) - expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(false) - const keyInput = settings.getByLabel('API 密钥', { exact: true }) + const credentialStep = page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }) + await credentialStep.waitFor({ timeout: 15_000 }) + const keyInput = credentialStep.getByLabel('API 密钥', { exact: true }) await keyInput.waitFor({ timeout: 10_000 }) + const initial = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) + await compareOrRefreshGolden(MISSING_EXPECTED, initial, MODE) const secret = `dsh_onboarding_${randomBytes(12).toString('hex')}` await keyInput.fill(secret) - await settings.getByRole('button', { name: '保存', exact: true }).click() - await keyInput.waitFor({ state: 'detached', timeout: 15_000 }) + await credentialStep.getByRole('button', { name: '保存并继续' }).click() + await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) + expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(false) const stored = await readFile(join(scaffold.harnessHome, '.credentials.yaml'), 'utf8') expect(stored.includes(`DEEPSEEK_API_KEY: ${secret}`)).toBe(true) @@ -98,8 +90,15 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup expect((await page.locator('body').ariaSnapshot()).includes(secret)).toBe(false) expect(browserConsole.some(line => line.includes(secret))).toBe(false) - // The same open Models surface reuses the refreshed join and exposes the + const acknowledgedSettings = await readFile(join(scaffold.harnessHome, 'settings.yaml'), 'utf8') + expect(acknowledgedSettings).toContain(`${WELCOME_NOTICE_ACK_FIELD}: ${WELCOME_NOTICE_VERSION}`) + + // The ordinary Models surface reuses the refreshed join and exposes the // configured write-only placeholder without a reload. + await page.getByRole('button', { name: '设置', exact: true }).click() + const settings = page.getByRole('dialog', { name: '设置' }) + await settings.waitFor({ timeout: 10_000 }) + await settings.getByRole('button', { name: '模型' }).click() const deepSeekRow = settings.getByText('DeepSeek', { exact: true }).first() await deepSeekRow.waitFor({ timeout: 10_000 }) await deepSeekRow.locator('xpath=ancestor::li').getByRole('button', { name: '编辑' }).click() @@ -114,7 +113,21 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, secondReloadWarnings) await page.waitForSelector('[class*="frame"]', { timeout: 15_000 }) - expect(await page.getByRole('region', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) + + // An old acknowledgement means materially revised copy: welcome returns, + // while the already-configured provider step remains complete. + await scaffold.ctx.settings.mutate(settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), [{ + op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: 'previous-copy-version', + }]) + const thirdReloadWarnings = tripwire.warnings.length + await page.reload({ waitUntil: 'load' }) + acknowledgeReloadConnectionLoss(tripwire, thirdReloadWarnings) + await welcome.waitFor({ timeout: 15_000 }) + await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() + await welcome.waitFor({ state: 'detached', timeout: 15_000 }) + expect(await page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) expect((await page.content()).includes(secret)).toBe(false) expect((await page.locator('body').ariaSnapshot()).includes(secret)).toBe(false) @@ -125,10 +138,9 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('never paints the takeover chrome on a configured reload, even with the settings join held open', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-configured-reload')) - // Regression pin for the reload white flash: the credential step is - // satisfied (credential configured), yet it must LOAD its - // private join before it can decide not to show. The chrome lives inside - // the step (OnboardingSurface), so the deciding window paints and blocks + // Regression pin for the reload flash: both steps are satisfied, yet each + // must load private facts before deciding not to show. Dialog chrome lives + // inside each visible branch, so the deciding window paints and blocks // nothing. Holding settings.describe widens that window from loopback // RTT scale to a deterministic hundreds of milliseconds, removing all // timing dependence from the sampler assertions below. @@ -141,7 +153,10 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup const sightings: string[] = [] ;(window as unknown as { __takeoverSightings: string[] }).__takeoverSightings = sightings setInterval(() => { - if (document.querySelector('[class*="onboardingStage"], [class*="onboardingMask"]') !== null) { + if (document.querySelector( + '[role="dialog"][aria-label="内测声明"], ' + + '[role="dialog"][aria-label="添加一个 API Key 开始使用"]', + ) !== null) { sightings.push('chrome') } if (document.getElementById('root')?.inert === true) sightings.push('inert') @@ -171,7 +186,8 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup acknowledgeReloadConnectionLoss(tripwire, warningsBefore) expect(await page.evaluate(() => (window as unknown as { __takeoverSightings: string[] }).__takeoverSightings)).toEqual([]) - expect(await page.locator('[class*="onboardingStage"]').count()).toBe(0) + expect(await page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) expect(tripwire.pageErrors).toEqual([]) }, 60_000) @@ -228,7 +244,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('keeps the fixture inventory closed', async () => { await assertFixtureInventory( SNAPSHOT_DIR, - ['missing.expected.md', 'models.expected.md'], + ['welcome.expected.md', 'missing.expected.md', 'models.expected.md'], ) }) }) diff --git a/apps/web/tests/onboarding-usable-provider.e2e.ts b/apps/web/tests/onboarding-usable-provider.e2e.ts index 09e3923064..5638668705 100644 --- a/apps/web/tests/onboarding-usable-provider.e2e.ts +++ b/apps/web/tests/onboarding-usable-provider.e2e.ts @@ -44,14 +44,17 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- it('closes the setup card without discarding the add card beside it', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-setup-card-cancel')) - const credentialStep = page.getByRole('region', { name: CREDENTIAL_STEP }) + const credentialStep = page.getByRole('dialog', { name: CREDENTIAL_STEP }) await credentialStep.waitFor({ timeout: 15_000 }) - await credentialStep.getByRole('button', { name: '前往配置' }).click() + await credentialStep.getByRole('button', { name: '稍后配置' }).click() await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) + await page.getByRole('button', { name: '设置', exact: true }).click() const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) - // Nothing is reachable yet, so DeepSeek presents itself as its open card. + // The onboarding step no longer navigates into Settings on dismissal, so + // enter the Models section explicitly before exercising its normal cards. + await settings.getByRole('button', { name: '模型' }).click() const setupKey = settings.getByRole('textbox', { name: 'API 密钥', exact: true }) await setupKey.waitFor({ timeout: 10_000 }) @@ -66,15 +69,14 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- { timeout: 10_000 }, ).toBe(2) - // Cancelling the setup card is the regression: it used to leave itself open - // and close the add card, discarding that draft. + // Cancelling the setup card must not close the independent add-provider + // draft beside it. await settings.getByRole('button', { name: '取消', exact: true }).first().click() expect(await settings.getByLabel('提供方').count()).toBe(1) await expect.poll( async () => settings.getByRole('textbox', { name: 'API 密钥', exact: true }).count(), { timeout: 10_000 }, ).toBe(1) - // DeepSeek is now an ordinary row: a missing-key dot and an Edit button. await settings.getByRole('button', { name: '编辑 DeepSeek (deepseek-official)' }).waitFor({ timeout: 10_000 }) const dismissed = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) await compareOrRefreshGolden(DISMISSED_EXPECTED, dismissed, MODE) @@ -104,10 +106,9 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- // The regression: the step read only the official route's credential, so a // fully configured user was taken over on every blank session. await expect.poll( - async () => page.getByRole('region', { name: CREDENTIAL_STEP }).count(), + async () => page.getByRole('dialog', { name: CREDENTIAL_STEP }).count(), { timeout: 10_000 }, ).toBe(0) - expect(await page.locator('[class*="onboardingStage"]').count()).toBe(0) expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(false) // The Models page agrees: DeepSeek stays a row rather than reopening its diff --git a/apps/web/tests/remote-welcome.e2e.ts b/apps/web/tests/remote-welcome.e2e.ts new file mode 100644 index 0000000000..256afaeede --- /dev/null +++ b/apps/web/tests/remote-welcome.e2e.ts @@ -0,0 +1,60 @@ +// Trusted non-loopback Web access cannot call the loopback-only settings API; +// the notice therefore advances for this browser process and returns on reload. +import type { Browser, Page } from 'playwright' +import { chromium } from 'playwright' +import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { + acknowledgeReloadConnectionLoss, launchWebScaffold, watchConsole, webSnapshotMode, + WELCOME_NOTICE_COPY, + type WebScaffold, +} from './scaffold.ts' +import { ZH_BROWSER_LOCALE } from './support.ts' + +const MODE = webSnapshotMode() + +describe.skipIf(MODE === 'record')('web e2e: remote welcome notice', () => { + let scaffold: WebScaffold + let browser: Browser + let page: Page + let tripwire: ReturnType + + beforeAll(async () => { + scaffold = await launchWebScaffold({ + remoteAuthority: 'remote.localhost', + welcomeNoticePending: true, + }) + browser = await chromium.launch() + page = await browser.newPage({ + viewport: { width: 1440, height: 960 }, + locale: ZH_BROWSER_LOCALE, + }) + tripwire = watchConsole(page) + await page.goto(scaffold.baseUrl, { waitUntil: 'load' }) + await page.waitForSelector('#root', { timeout: 30_000 }) + }, 120_000) + + afterAll(async () => { + await browser?.close() + await scaffold?.close() + }) + + it('advances process-locally and presents the notice again after reload', async () => { + const welcome = page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }) + await welcome.waitFor({ timeout: 15_000 }) + expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true) + + await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() + await welcome.waitFor({ state: 'detached', timeout: 15_000 }) + await expect.poll( + () => page.locator('#root').evaluate(root => (root as HTMLElement).inert), + { timeout: 15_000 }, + ).toBe(false) + + const reloadWarnings = tripwire.warnings.length + await page.reload({ waitUntil: 'load' }) + acknowledgeReloadConnectionLoss(tripwire, reloadWarnings) + await welcome.waitFor({ timeout: 15_000 }) + expect(tripwire.warnings).toEqual([]) + expect(tripwire.pageErrors).toEqual([]) + }, 60_000) +}) diff --git a/apps/web/tests/scaffold.ts b/apps/web/tests/scaffold.ts index a94a9602c2..f1ba62d881 100644 --- a/apps/web/tests/scaffold.ts +++ b/apps/web/tests/scaffold.ts @@ -41,6 +41,7 @@ import { loadOverlayPatches, } from '@deepseek-ai/dsh-app-boot' import { dshHomePath } from '@deepseek-ai/dsh-home-paths' +import { settingsNamespace } from '@deepseek-ai/dsh-settings' import { LlmAdapter } from '@deepseek-ai/dsh-llm' import type { LlmModelInfo, LlmProviderInfo, LlmResolvedModelInfo, StreamChunk, @@ -62,6 +63,25 @@ import type {} from '@deepseek-ai/dsh-agent' import { provideCmdline } from '@deepseek-ai/dsh-cmdline' import { REPO_ROOT, requireDist } from './support.ts' +// Host-side web e2e cannot import a browser package: doing so would pull that +// package's complete TS project into this graph. Mirrored from +// packages/client/ui-settings-models/src/onboarding-copy.ts; drift makes the +// default pre-acknowledgement stop suppressing the notice and fails loudly. +// import { +// WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, +// WELCOME_NOTICE_VERSION, WELCOME_NOTICE_COPY, +// } from '@deepseek-ai/dsh-client-ui-settings-models' +export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' +export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' +export const WELCOME_NOTICE_VERSION = '2026-08-13.1' +export const WELCOME_NOTICE_COPY = { + zh: { + title: '内测声明', + body: 'DeepSeek Harness 目前的 0.1 版本仍处在面向 Harness 开发者进行测试的阶段,还有许多地方需要持续改进和打磨,希望听取广大开发者的反馈建议。预计 DeepSeek Harness 的核心插件以及基础 API 都会在接下来的一段时间内快速迭代、持续演化。\n\n我们期待与全球开发者一起,在开源、开放、可复用、可组合的基础设施之上,共同探索智能上限。欢迎全球 Harness 开发者加入 DSH 插件生态。', + continueLabel: '继续', + }, +} as const + /** Snapshot mode for the lane, from $DSH_SNAPSHOT (same vocabulary as the other snapshot suites). */ export type WebSnapshotMode = 'replay' | 'record' | 'refresh' @@ -213,6 +233,8 @@ export interface LaunchOptions { * keyless first-run configuration lane; the default disables the adapter. */ deepSeekMissingCredential?: boolean + /** Leave the current welcome notice pending; ordinary scenarios pre-acknowledge it before browser boot. */ + welcomeNoticePending?: boolean /** * Patch the shipped DeepSeek search row to a deterministic endpoint and * credential reference. Browser search scenarios keep the real provider and @@ -510,6 +532,11 @@ export async function launchWebScaffold(options: LaunchOptions = {}): Promise )} - {/* The takeover chrome (OnboardingSurface: mask, opaque stage, `#root` - inert) lives inside the step component, wrapped around its visible - content — a step still deciding (private facts loading) renders - null, so nothing paints or blocks while it decides. */} + {/* Dialog chrome and `#root` inert ownership live inside each step's + visible branch. A step still deciding (private facts loading) + renders null, so nothing paints or blocks while it decides. */} {onboardingStep !== undefined && renderSlot('settings.onboarding', { stepId: onboardingStep.id, complete: () => { completeOnboardingStep(onboardingStep.id) }, diff --git a/packages/client/ui-settings-general/src/index.ts b/packages/client/ui-settings-general/src/index.ts index ce11f4e0be..ed600b1c1c 100644 --- a/packages/client/ui-settings-general/src/index.ts +++ b/packages/client/ui-settings-general/src/index.ts @@ -8,7 +8,7 @@ import { settingsNamespace } from '@deepseek-ai/dsh-settings' const ONBOARDING_SETTINGS_NAMESPACE = 'ui-onboarding' interface OnboardingSettings { - /** Last welcome-notice version acknowledged by a since-removed first-run notice; kept so stored documents stay valid. */ + /** Last version acknowledged by the current product welcome step. */ welcomeNoticeVersion?: string } diff --git a/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx b/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx index 430bb2daee..c9ec593974 100644 --- a/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx +++ b/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx @@ -229,7 +229,7 @@ describe('SettingsPanel navigation', () => { it('paints no takeover chrome of its own around the mounted step', () => { // The chrome (mask, opaque stage, #root inert) belongs to the step via - // the OnboardingSurface primitive — a mounted-but-deciding step that + // the step-owned dialog surface — a mounted-but-deciding step that // renders null must show and block nothing (the reload white-flash fix; // onboarding-surface.spec.tsx pins the primitive's half). const appRoot = document.createElement('div') diff --git a/packages/client/ui-settings-models/README.i18n.yaml b/packages/client/ui-settings-models/README.i18n.yaml index ddd679e690..f26ca67bc3 100644 --- a/packages/client/ui-settings-models/README.i18n.yaml +++ b/packages/client/ui-settings-models/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-settings-models/README.md -README.md: 642dc3ffc7f3f45a523cd6e84b13d34e2d25dc2a -README.zh.md: 408f2017636ef2d9a5a57fef253f2f05b61a22fb +README.md: f0094c4f2687beaf6a5e5f7a1a8dc3d4ebdbcbc0 +README.zh.md: 68bb64ddeebfd65644edbb5e11fd2e147214d44a diff --git a/packages/client/ui-settings-models/README.md b/packages/client/ui-settings-models/README.md index 642dc3ffc7..f0094c4f26 100644 --- a/packages/client/ui-settings-models/README.md +++ b/packages/client/ui-settings-models/README.md @@ -2,11 +2,13 @@ English | [中文](README.zh.md) -Models settings plugin: the provider configuration page and official-DeepSeek conditional onboarding step. It joins three wire domains into one shared snapshot — `llm.providers` (the configurable-provider directory with each route's live/dormant state), `settings.describe` (serialized schemas, layered redacted values, secret slots), and `credentials.describe` (value-free configured/source/writable badges) — and renders provider rows with one editor card at a time, without presenting route liveness as provider status. +Models settings and product-onboarding plugin. The same client Cordis plugin registers the Models page plus two ordered first-run dialogs: a versioned internal-testing notice and the conditional official-DeepSeek credential step. Both steps share one modal wrapper and remain sequenced by `settings.onboarding`. The Models plane joins three wire domains into one shared snapshot — `llm.providers` (the configurable-provider directory with each route's live/dormant state), `settings.describe` (serialized schemas, layered redacted values, secret slots), and `credentials.describe` (value-free configured/source/writable badges) — and renders provider rows with one editor card at a time, without presenting route liveness as provider status. Rows are the *configured* providers (their profile resolves in the owning namespace); a whole-section provider whose key is not configured anywhere renders as its open setup card instead of a row, but only in the first-run posture — while no provider is registered with the credential its profile names — and only until the user closes that card, after which it is an ordinary row carrying the missing-key dot. Each card kind owns its own open state, so closing one never discards a draft in another. The add flow is a card carrying the dormant-directory provider select — a bare-mounted `llm-pi-ai` offers its whole installed catalog before any route exists. The pi-ai card additionally edits that route's **model list** and can ask the provider what it serves. A row labels API-key state with a green solid dot only when a referenced credential is confirmed configured, and with a red solid dot only when a named reference is confirmed missing; reference-free provider-native authentication and unavailable credential enrichment remain unmarked. The editor is a hand-written card per adapter family: the primary field is a single **API key** input — the page never asks for an environment-variable name; a typed key stores **write-only** through `credentials.set` under the profile's reference, deriving `_API_KEY` when the profile has none, and the pi-ai profile records that derivation as `apiKeyEnv`, so `settings.yaml` never carries a key value. Leaving a new pi-ai provider's key blank saves a reference-free profile and therefore preserves provider-native authentication such as the Bedrock credential chain or Vertex ADC. A successful Apply emits a local accessible status message without echoing secret material. The collapsed 自定义设置 fold carries the curated extras — `baseURL` for both families (the deepseek placeholder shows the public endpoint), each adapter's model catalog, and the **display name** and **API protocol** of a pi-ai route the adapter does not ship. Those two are what a hand-declared route names for itself: the create card asks for both because nothing can default them, so the editor reaches both rather than leaving them to `settings.yaml`. Clearing the name unsets it and the route falls back to its id, which is what the placeholder shows; the protocol has no such fallback. A catalog route gets neither — it defaults its name from its catalog entry, and its models each carry their own protocol, so a route-level one could only override every one of them. The Provider ID stays fixed: it is the settings key, the name every other namespace and every logged session references, and the stem of a credential reference the page cannot read back to move. Reasoning effort is deliberately NOT among them: it is a per-model capability and the models under one provider disagree about which levels they accept, so a provider-scoped control could only be set to a value some of them reject — which would hide even the models that support the level. The composer's model picker offers each model its own levels, and a switch there records provider, model, and effort together as the default for the next session. The profile field stays in `settings.yaml` for a deployment that knows its route. Each DeepSeek row edits `id`, optional display `name`, and optional `contextWindow`/`maxTokens`; existing fields outside that curated set survive edits, while every other profile field stays owned by `settings.yaml`. A row is deletable only when the user layer alone carries it (removal restores the composition base), and its localized confirmation dialog names the provider in the title, description, and final action. A row is tagged **Custom** when the directory entry says the owning adapter ships nothing under that key. The tag follows that answer alone: having a stored profile does not make a route custom — narrowing a shipped provider's models stores one too — and an adapter that reports nothing leaves its rows untagged rather than being read as shipped. -The DeepSeek step projects first-run readiness from that same joined snapshot after earlier onboarding pages complete. The step exists to leave the user with a model to talk to, so ANY provider they can already reach ends it without rendering — a registered route whose named credential reference is stored, including a read-only launch-environment credential, or one whose profile names no reference at all and therefore authenticates natively. Only a user with none of those is asked about DeepSeek, the one route the prompt can offer a key field for. It recognizes the official adapter through its `llm-deepseek` configurable-provider declaration, so an undeclared live route with the same provider id is not treated as repairable configuration. Only a mounted, active adapter with a missing writable reference shows the page that opens Settings on Models, whose existing setup card exclusively owns key input and `credentials.set`; the step never holds a secret. An absent adapter, inactive route, failed join, read-only deployment, or unusable settings or credential capability completes the step without rendering so onboarding cannot block the product; Models remains the diagnostic surface. +The notice step owns its exact copy and version in `src/onboarding-copy.ts`. On loopback it compares and writes `ui-onboarding.welcomeNoticeVersion` through the existing settings API; only an explicit Continue records the current version. A non-loopback browser cannot use that Host-only namespace, so acknowledgement is process-local and the notice returns after reload. + +After that notice completes, the DeepSeek step projects first-run readiness from the same joined Models snapshot. ANY provider the user can already reach ends it without rendering — a registered route whose named credential reference is stored, including a read-only launch-environment credential, or one whose profile names no reference and therefore authenticates natively. Only a user with none is asked for the official DeepSeek key. A mounted, active adapter with a missing writable reference renders the existing `ProviderEditor` in credential-only mode inside the shared onboarding modal; `credentials.set` stays the only secret write, and no provider settings are changed. Configure later completes only this coordinator pass. An absent adapter, inactive route, failed join, read-only deployment, or unusable settings or credential capability completes the step without rendering; Models remains the diagnostic surface. Every edit lands as `settings.mutate` path ops against the stored section — a set per changed field, an unset per cleared one, and a single unset for a deleted provider row. The page only ever holds the REDACTED descriptor, so it mutates the fields it can see rather than rebuilding a section. DeepSeek's `models` is one replace-by-value array: the editor shows inherited effective rows until the first model edit materializes the complete array in the user layer, while reset unsets that override. A row carries the model id and display name; its context window and output cap sit behind the row's own disclosure, with the same fields the pi-ai provider form uses. Either capacity is typed as a count with an optional decimal `K` or `M` suffix (`256K`, `1M`; `1M` is 1000K) and stored as the plain count, spelled back in the shortest form that round-trips. Empty ids, duplicate ids, empty explicit names, and unreadable, non-positive, or fractional capacities fail before any write. A typed API key is judged on its own field the same way: after trimming, it must be non-empty and every character must be printable ASCII (`[\x21-\x7E]`), which is exactly what an HTTP header value can carry — the twin of `normalizeApiKey` in `@deepseek-ai/dsh-llm`, mirrored here because the source-plane split forbids importing it. A value matching a pasted `NAME=value` environment line or wrapped in matching quotes is refused as the same format failure; that pasted-line check runs only in the browser, since a false positive in a resolver would leave the environment refusing the key as well. A field holding only whitespace fails rather than being silently dropped, while an empty field is not a failure at all: it means keep the stored key on an editor card, and authenticate some other way on a create card. A refused key blocks both the write and the endpoint interrogation, so the page never spends a round trip to be told what the field already says. Each settings write carries the card's current `revision`, so a concurrent write from another tab or an external `settings.yaml` edit is refused as `settings-conflict`; after settings commit, the card adopts the returned redacted user subtree and revision before storing the credential, which makes a failed credential stage retry only that stage. Deletion removes a configured, writable credential only when the profile names the page's derived `_API_KEY` target, then unsets the profile; both operations are idempotent, and a partial failure remains in the identified confirmation dialog for retry. Environment credentials, custom references, and credentials whose target cannot be identified remain untouched. Once loaded, the page subscribes directly to forwarded `settings/document-updated`, `credentials/updated`, and `llm/adapters-updated` owner events, plus local `connection/reset`, so an external `settings.yaml` edit, a second tab, or a settings-born route converges without polling. diff --git a/packages/client/ui-settings-models/README.zh.md b/packages/client/ui-settings-models/README.zh.md index 408f201763..68bb64ddee 100644 --- a/packages/client/ui-settings-models/README.zh.md +++ b/packages/client/ui-settings-models/README.zh.md @@ -2,11 +2,13 @@ [English](README.md) | 中文 -模型设置插件:提供方配置页和按条件显示的 DeepSeek 官方首次使用引导步骤。它把三个协议领域汇聚为一个共享快照:`llm.providers`(可配置提供方目录,含每条路由的存活/休眠状态)、`settings.describe`(序列化 schema、分层脱敏值、secret slot)与 `credentials.describe`(不含值的 configured/source/writable 徽标);页面据此渲染提供方行,一次只展开一张编辑卡片,且不把路由存活状态呈现为提供方状态。 +模型设置与产品引导插件。同一个 client Cordis 插件会注册 Models 页面和两个有序的首次使用弹窗:版本化内测声明,以及按条件显示的 DeepSeek 官方凭据步骤。两个步骤共用同一套弹窗组件,并继续由 `settings.onboarding` 排序。Models 平面把三个协议领域汇聚为一个共享快照:`llm.providers`(可配置提供方目录,含每条路由的存活/休眠状态)、`settings.describe`(序列化 schema、分层脱敏值、secret slot)与 `credentials.describe`(不含值的 configured/source/writable 徽标);页面据此渲染提供方行,一次只展开一张编辑卡片,且不把路由存活状态呈现为提供方状态。 行是*已配置*的提供方(其 profile 在所属 namespace 中解析得出);其配置键未在任何位置配置的整分节提供方会渲染为其展开的设置卡片而非一行,但仅限首次运行姿态——即尚无任何提供方已注册且备齐其 profile 所指名的凭据——且仅持续到用户关闭该卡片为止,此后它就是一行带缺失密钥点的普通行。每一类卡片各自持有自己的展开状态,因此关掉其中一张绝不会丢弃另一张里的草稿。「新增」流程则是一张承载休眠目录提供方选择框的卡片——裸挂载的 `llm-pi-ai` 在任何路由存在之前就能提供其完整的已安装 catalog。pi-ai 卡片还会编辑该路由的**模型列表**,并可查询提供方所提供的模型。只有确认引用的凭据已配置时,行才会以绿色实心点标示 API 密钥状态;只有确认具名引用缺失时,才会以红色实心点标示。无引用的提供方原生认证以及无法取得凭据补充信息时都不显示状态点。编辑器是每个适配器家族各一张的手写卡片:主字段是单独一个 **API 密钥**输入框——页面从不询问环境变量名;键入的密钥经 `credentials.set` 以**只写**方式存入 profile 的引用之下,profile 没有引用时便派生 `_API_KEY`,pi-ai profile 会把这次派生记录为 `apiKeyEnv`,因此 `settings.yaml` 从不携带密钥值。为新的 pi-ai 提供方留空密钥会保存一个不带引用的 profile,因此能保留提供方原生认证,例如 Bedrock 凭据链或 Vertex ADC。「应用」成功后会发出本地无障碍状态消息,且绝不回显任何机密内容。收起的「自定义设置」折叠区承载精选的额外字段——两个家族都有 `baseURL`(deepseek 的占位符显示公共端点)、各适配器自己的模型目录,以及适配器未提供的那类 pi-ai 路由的**显示名称**与 **API 协议**。这两个字段是手工声明路由为自己命名的东西:创建卡片之所以索要它们,正因为没有东西能为它们兜底,因此编辑器也够得着这两个,而不是把它们留给 `settings.yaml`。清空名称即取消设置,路由退回自己的 id——占位符显示的就是它;协议没有这样的兜底。内置目录路由两个都不给:它的名称由目录条目兜底,它的每个模型各自带着自己的协议,路由级协议只可能把它们全部覆盖掉。Provider ID 保持固定:它是 settings 的键、是其他每个 namespace 与每一条已记录会话引用的名字,也是页面读不回、因而搬不走的凭据引用词干。推理等级刻意**不在**其中:它是按模型的能力,而同一提供方下各模型接受的档位并不一致,因此提供方级的控件只可能被设成其中一些模型会拒绝的值——那会连支持该档位的模型也一并隐藏。输入框的模型选择器为每个模型提供它自己的档位,在那里切换会把提供方、模型、推理等级一并记为下一个会话的默认值。profile 字段仍留在 `settings.yaml`,供清楚自己路由的部署使用。每条 DeepSeek 模型行可编辑 `id`、可选的显示名称 `name` 与可选的 `contextWindow`/`maxTokens`;精选集合以外的现有字段会在编辑后保留,其余每个 profile 字段仍归 `settings.yaml` 所有。只有当某行仅由用户层承载时它才可删除(删除会还原组合 base),其本地化确认对话框会在标题、说明和最终操作中点名该提供方。当目录条目表明拥有该路由的适配器在这个键下什么都没有时,该行会带上 **自定义** 标签。标签只跟随这个答案:存了 profile 并不使一条路由成为自定义——收窄一个内置提供方的模型同样会存下 profile——而什么都不回答的适配器,其路由保持无标签,不会被当成内置。 -前序首次使用引导页面完成后,DeepSeek 步骤会从同一个联接快照得出首次运行就绪状态。该步骤的存在是为了让用户手上有一个可对话的模型,因此只要用户已经能触达**任何**一个提供方,它就直接完成而不渲染——已注册且其具名凭据引用已存储的路由(包括来自启动环境且只读的凭据),或 profile 根本不指名任何引用、因而走原生认证的路由。只有二者皆无的用户才会被问到 DeepSeek,即这条提示唯一能为其提供密钥输入框的路由。它通过 `llm-deepseek` 的可配置提供方声明识别官方适配器,因此同 id 但未声明的存活路由不属于可修复配置。只有已挂载且活跃、引用可写但尚未配置的适配器才会显示前往「设置」Models 分区的页面;密钥输入和 `credentials.set` 仅由该分区已有的设置卡片负责,该步骤绝不持有 secret。适配器缺失、路由不活跃、联接失败、部署只读或设置/凭据能力不可用时,该步骤均不渲染并直接完成,以免首次使用引导阻塞产品;Models 页仍是诊断界面。 +声明步骤在 `src/onboarding-copy.ts` 中持有完整文案和版本。回环访问会通过既有 settings API 比较并写入 `ui-onboarding.welcomeNoticeVersion`;只有明确点击「继续」才会记录当前版本。非回环浏览器无法使用这项仅限 Host 的 namespace,因此确认仅在当前进程有效,重载后声明会再次出现。 + +声明完成后,DeepSeek 步骤会从同一个 Models 联接快照得出首次运行就绪状态。只要用户已经能触达**任何**一个提供方,它就直接完成而不渲染——已注册且其具名凭据引用已存储的路由(包括来自启动环境且只读的凭据),或 profile 根本不指名引用、因而走原生认证的路由。只有二者皆无的用户才会被要求填写 DeepSeek 官方密钥。适配器已挂载且活跃、引用可写但尚未配置时,既有 `ProviderEditor` 会以仅凭据模式渲染在共用引导弹窗中;`credentials.set` 仍是唯一的 secret 写入,且不会改变提供方设置。「稍后配置」只完成协调器当前这一轮。适配器缺失、路由不活跃、联接失败、部署只读或设置/凭据能力不可用时,该步骤不渲染并直接完成;Models 页仍是诊断界面。 每一次编辑都以 `settings.mutate` 的路径 op 落到已存分节上——每个变更字段一条 set、每个清空字段一条 unset、删除提供方行则是单独一条 unset。页面自始至终只持有**脱敏后**的 descriptor,因此它只修改自己看得见的字段,而不重建分节。DeepSeek 的 `models` 是一个按值整体替换的数组:编辑器会显示继承而来的生效模型行,直到第一次模型编辑将完整数组具化到用户层;重置则会取消该覆盖。每个模型行承载模型 ID 与显示名称,其上下文窗口与最大输出 token 数则收在该行自己的折叠区里,使用与 pi-ai 提供方表单相同的字段。两项容量都按数值键入,可带十进制的 `K` 或 `M` 后缀(`256K`、`1M`;`1M` 即 1000K),存储为纯数值,回显时写成能够往返的最短形式。空 ID、重复 ID、显式填写的空名称,以及无法读取、非正数或非整数的容量都会在写入前失败。键入的 API 密钥同样在它自己的字段上被判定:trim 之后必须非空,且每个字符都是可打印 ASCII(`[\x21-\x7E]`)——这正是 HTTP 标头值所能承载的范围,是 `@deepseek-ai/dsh-llm` 中 `normalizeApiKey` 的孪生体,因源码平面分割禁止直接引入而在此镜像。与整行粘贴的 `NAME=value` 环境变量匹配或首尾成对引号包裹的值,会以同一条格式失败被拒绝;这项粘贴行检查只在浏览器中运行,因为 resolver 中的一次误判会连带让环境变量这条路也拒绝该密钥。只含空白的输入框会失败而不是被静默丢弃;留空则完全不是失败:在编辑卡片上意味着保持已存储的密钥,在新建卡片上则意味着以其他方式鉴权。被拒绝的密钥会同时拦截写入与端点探测,因此页面不会白花一次往返去换取字段上已经写明的答案。每次 settings 写入都携带卡片当前的 `revision`,因此来自另一个标签页或对 `settings.yaml` 的外部编辑所产生的并发写入会以 `settings-conflict` 被拒绝;settings 提交成功后,卡片会在存储凭据前采用响应返回的脱敏用户子树与 revision,因此凭据阶段失败时,重试只会重复该阶段。删除操作只会在 profile 指向页面派生的 `_API_KEY` 目标时清除已配置且可写的凭据,随后取消设置 profile;两项操作都具备幂等性,部分失败会停留在点名目标的确认对话框中供重试。环境凭据、自定义引用和无法识别目标的凭据保持不变。页面加载完成后会直接订阅转发的 owner 事件 `settings/document-updated`、`credentials/updated`、`llm/adapters-updated`,以及本地 `connection/reset`,因此外部的 `settings.yaml` 编辑、第二个标签页或 settings 新生的路由都无需轮询即可收敛。 diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index c69fc62153..c2a08faa78 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", - "description": "Models settings and official-DeepSeek first-run routing over one live provider/settings/credential join", + "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", "version": "0.0.1-rc.5", "publishConfig": { "access": "restricted" diff --git a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css index 221239d7bb..9f7ecbc611 100644 --- a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css +++ b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css @@ -1,99 +1,16 @@ -.page { - position: relative; - z-index: 1; - width: min(640px, calc(100vw - 64px)); - max-height: 100vh; - padding: clamp(104px, 18vh, 156px) 0 40px; - box-sizing: border-box; - overflow-y: auto; - color: var(--dsw-alias-label-primary); -} - -.brand { - display: flex; - align-items: center; - margin-bottom: 42px; - color: var(--dsw-alias-label-primary); -} - -.title { - margin: 0; - font-size: 28px; - line-height: 36px; - font-weight: 600; - letter-spacing: -0.02em; - outline: none; -} - .description { - margin: 16px 0 0; - font-size: 16px; - line-height: 28px; + margin: 0; + font-size: 14px; + line-height: 24px; color: var(--dsw-alias-label-secondary); } -.actions { - display: flex; - align-items: center; - justify-content: flex-end; - gap: 12px; - margin-top: 32px; -} - -.primary { - min-width: 132px; -} - -.brand, -.title, -.description, -.actions { - animation: credential-enter 280ms cubic-bezier(0.23, 1, 0.32, 1) both; -} - -.title { animation-delay: 40ms; } -.description { animation-delay: 80ms; } -.actions { animation-delay: 120ms; } - -@keyframes credential-enter { - from { - opacity: 0; - transform: translateY(8px); - } - - to { - opacity: 1; - transform: translateY(0); - } -} - -@media (prefers-reduced-motion: reduce) { - .brand, - .title, - .description, - .actions { - animation: none; - } +.editor { + margin-top: 24px; } @media (max-width: 560px) { - .page { - width: calc(100vw - 40px); - padding-top: 64px; - } - - .brand { - margin-bottom: 30px; - } - - .actions { - align-items: stretch; - flex-direction: column-reverse; - margin-top: 32px; - } - - .primary, - .later { - width: 100%; + .editor { + margin-top: 20px; } } diff --git a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx index 302d4592f8..24e2112096 100644 --- a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx +++ b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx @@ -2,33 +2,39 @@ * Official-DeepSeek first-run step. Readiness comes from the same * provider/settings/credential join as the Models page: any provider the user * can already talk to ends the step, and only a user with none is offered the - * official DeepSeek route. The prompt itself only routes to that page's single - * credential editor. + * official DeepSeek route. The step reuses that page's credential editor in + * the onboarding plugin's shared modal, so the key is entered once. */ -import { useEffect, useRef } from 'react' +import { useEffect } from 'react' import type { ReactNode } from 'react' -import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' -import { BrandWordmark, Button, OnboardingSurface } from '@deepseek-ai/dsh-client-ui-primitives' -import type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-web-react' +import type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client' +import type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' +import type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' import type { ModelsSettingsState, ModelsSettingsStore } from './store.ts' import { onboardingReadiness } from './store.ts' +import { ProviderEditor } from './ProviderEditor.tsx' import type { en } from './locales.ts' +import { OnboardingModal } from './OnboardingModal.tsx' import styles from './DeepSeekOnboardingDialog.module.css' -/** Injected dependencies of {@link DeepSeekOnboardingDialog}. */ +/** Registration-side dependencies of {@link DeepSeekOnboardingDialog}. */ export interface DeepSeekOnboardingInjected { + hooks: { + /** Shared Models-page join state, bound by the slot renderer. */ + models: SnapshotStore + } /** Shared Models-page join controller. */ controller: ModelsSettingsStore - /** Subscription hook bound to the shared join snapshot. */ - useSnapshot: SnapshotSelectorHook + /** Existing wire face reused by the Models credential editor. */ + api: Pick /** Feature copy. */ t: (key: keyof typeof en) => string } /** Slot owner props plus the feature's injected dependencies. */ export type DeepSeekOnboardingDialogProps = - PropsRuntime<'settings.onboarding'> & DeepSeekOnboardingInjected + PropsRuntime<'settings.onboarding'> & InjectFace /* v8 ignore next 3 -- closed-union defaults only defend future source widening */ function assertNever(_value: never): never { @@ -36,16 +42,15 @@ function assertNever(_value: never): never { } /** - * Prompt a first-run user to open Models while no provider can serve requests - * and the official adapter exists with an unconfigured effective credential. + * Prompt a first-run user for the official DeepSeek credential while no + * provider can serve requests and that credential is writable. * @param props - settings-shell owner state and Models feature dependencies. - * @returns the onboarding page or null when onboarding needs no intervention. + * @returns the onboarding modal or null when onboarding needs no intervention. */ export function DeepSeekOnboardingDialog(props: DeepSeekOnboardingDialogProps): ReactNode { - const { complete, openSection, controller, useSnapshot, t } = props - const state = useSnapshot(snapshot => snapshot) + const { complete, controller, useModels, api, t } = props + const state = useModels(snapshot => snapshot) const readiness = onboardingReadiness(state) - const titleRef = useRef(null) useEffect(() => { if (state.status === 'idle') void controller.load() @@ -59,18 +64,6 @@ export function DeepSeekOnboardingDialog(props: DeepSeekOnboardingDialogProps): ) complete() }, [complete, readiness.kind]) - useEffect(() => { - if (readiness.kind === 'credential-missing') titleRef.current?.focus() - }, [readiness.kind]) - - const openModels = (): void => { - complete() - openSection('models') - } - - // Null covers the still-deciding and nothing-to-do states alike: the - // takeover chrome below is part of THIS render, so declining paints and - // blocks nothing while the shared join is in flight. switch (readiness.kind) { case 'loading': case 'adapter-absent': @@ -84,28 +77,44 @@ export function DeepSeekOnboardingDialog(props: DeepSeekOnboardingDialogProps): return assertNever(readiness) } + const row = state.rows.find(candidate => + candidate.entry.provider === 'deepseek-official' + && candidate.entry.settingsNs === 'llm-deepseek' + && candidate.entry.settingsPath.length === 0) + const namespace = state.namespaces.get('llm-deepseek') + /* v8 ignore next 2 -- credential-missing is derived only from this exact joined row. */ + if (row === undefined || namespace === undefined) return null + + const finishCredential = (changed: boolean): void => { + if (!changed) { + complete() + return + } + void controller.load() + } + return ( - -
- -

- {t('onboardingTitle')} -

-

{t('onboardingDescription')}

-
- - -
-
-
+ +

{t('onboardingDescription')}

+
+ +
+
) } diff --git a/packages/client/ui-settings-models/src/client/EditorFooter.tsx b/packages/client/ui-settings-models/src/client/EditorFooter.tsx index adcb009cdf..6306609ca5 100644 --- a/packages/client/ui-settings-models/src/client/EditorFooter.tsx +++ b/packages/client/ui-settings-models/src/client/EditorFooter.tsx @@ -29,6 +29,8 @@ export interface EditorFooterProps { submitLabel: keyof typeof en /** Commit label while a commit is in flight. */ submitBusyLabel: keyof typeof en + /** Dismiss label; defaults to the settings editor copy. */ + cancelLabel?: keyof typeof en /** Dismiss the card without committing. */ onCancel: () => void /** Run the card's commit. */ @@ -50,7 +52,7 @@ export function EditorFooter(props: EditorFooterProps): ReactNode { disabled={props.busy} onClick={props.onCancel} > - {t('cancel')} + {t(props.cancelLabel ?? 'cancel')} + + + ) +} diff --git a/packages/client/ui-settings-models/src/client/index.ts b/packages/client/ui-settings-models/src/client/index.ts index 08d77a1832..dc7f32e370 100644 --- a/packages/client/ui-settings-models/src/client/index.ts +++ b/packages/client/ui-settings-models/src/client/index.ts @@ -1,8 +1,9 @@ /** - * Models settings plugin, browser half. Registers the `models` nav entry and - * official-DeepSeek first-run overlay into shell-declared slots. Both consume - * one provider/settings/credential join; the overlay routes missing-key users - * to the full page's single credential editor. Export discipline: + * Models settings and product-onboarding plugin, browser half. It registers + * the Models page plus the ordered internal-testing and official-DeepSeek + * onboarding dialogs, whose UI shares this package's modal wrapper. The Host + * settings and credential contracts stay behind their existing wire APIs. + * Export discipline: * packages/client/AGENTS.md. */ import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client' @@ -19,15 +20,19 @@ import { ModelsSection } from './ModelsSection.tsx' import type { ModelsSectionInjected } from './ModelsSection.tsx' import { DeepSeekOnboardingDialog } from './DeepSeekOnboardingDialog.tsx' import type { DeepSeekOnboardingInjected } from './DeepSeekOnboardingDialog.tsx' +import { WelcomeNotice } from './WelcomeNotice.tsx' +import type { WelcomeNoticeInjected } from './WelcomeNotice.tsx' +import { refreshWelcomeIfLoaded, WelcomeNoticeStore } from './welcome-store.ts' import { ModelsSettingsStore } from './store.ts' import { en, zh, type ModelsKey } from './locales.ts' +import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../onboarding-copy.ts' export type { ModelsSectionInjected, ModelsSectionProps } from './ModelsSection.tsx' export type { ModelsKey } from './locales.ts' declare module '@deepseek-ai/dsh-client-ui-slots' { interface LocaleNamespaceMap { - /** The Models page + onboarding overlay copy. */ + /** The Models page + product-onboarding copy. */ 'settings.models': ModelsKey } } @@ -74,21 +79,38 @@ export function apply(ctx: ClientContext): void { api: connection.api, t, }) - const onboardingInjected = (): DeepSeekOnboardingInjected => ({ + const deepSeekOnboardingInjected = (): DeepSeekOnboardingInjected => ({ controller, - useSnapshot, + hooks: { models: controller.store }, + api: connection.api, + t, + }) + const welcomeController = new WelcomeNoticeStore( + connection.api, + connection.isLoopback ? 'host' : 'memory', + ) + const welcomeInjected = (): WelcomeNoticeInjected => ({ + controller: welcomeController, + hooks: { welcome: welcomeController.store }, t, }) // Pushed invalidations converge every open surface without polling: any // settings/credentials/topology change refetches once the page loaded. ctx.effect(() => { - const refresh = (): void => { refreshIfLoaded(controller) } + const refreshModels = (): void => { refreshIfLoaded(controller) } + const refreshAll = (): void => { + refreshModels() + refreshWelcomeIfLoaded(welcomeController) + } const disposers = [ - ctx.remote.$on('settings/document-updated', refresh), - ctx.remote.$on('credentials/updated', refresh), - ctx.remote.$on('llm/adapters-updated', refresh), - ctx.on('connection/reset', refresh), + ctx.remote.$on('settings/document-updated', (ns) => { + refreshModels() + if (ns === WELCOME_NOTICE_SETTINGS_NAMESPACE) refreshWelcomeIfLoaded(welcomeController) + }), + ctx.remote.$on('credentials/updated', refreshModels), + ctx.remote.$on('llm/adapters-updated', refreshModels), + ctx.on('connection/reset', refreshAll), ] return () => { for (const dispose of disposers) dispose() } }, 'ui-settings-models: pushed invalidations') @@ -100,10 +122,16 @@ export function apply(ctx: ClientContext): void { label: () => t('nav'), inject: injected, }, ModelsSection)) + ctx.slots.inject('settings.onboarding', () => ctx.slots.register({ + name: 'settings.onboarding', + id: 'welcome-notice', + order: -100, + inject: welcomeInjected, + }, WelcomeNotice)) ctx.slots.inject('settings.onboarding', () => ctx.slots.register({ name: 'settings.onboarding', id: 'deepseek-official', order: 0, - inject: onboardingInjected, + inject: deepSeekOnboardingInjected, }, DeepSeekOnboardingDialog)) } diff --git a/packages/client/ui-settings-models/src/client/locales.ts b/packages/client/ui-settings-models/src/client/locales.ts index 561a5df494..5804e164f6 100644 --- a/packages/client/ui-settings-models/src/client/locales.ts +++ b/packages/client/ui-settings-models/src/client/locales.ts @@ -1,5 +1,7 @@ /** Copy dictionaries for the Models settings section. */ +import { WELCOME_NOTICE_COPY } from '../onboarding-copy.ts' + /** English strings (the key-set source of truth for this pair). */ export const en = { nav: 'Models', @@ -85,10 +87,16 @@ export const en = { customNeedsModels: 'A custom provider needs at least one model.', create: 'Create provider', creating: 'Creating\u2026', + welcomeTitle: WELCOME_NOTICE_COPY.en.title, + welcomeBody: WELCOME_NOTICE_COPY.en.body, + welcomeContinue: WELCOME_NOTICE_COPY.en.continueLabel, + welcomeError: 'The acknowledgement could not be saved. Please try again.', onboardingTitle: 'Add an API key to get started', onboardingDescription: 'Configure the official DeepSeek provider to start building.', - onboardingGoToSettings: 'Go to settings', onboardingLater: 'Configure later', + onboardingSave: 'Save and continue', + onboardingSaving: 'Saving…', + keyRequired: 'Enter an API key to continue.', } /** The settings.models namespace key union. */ @@ -179,8 +187,14 @@ export const zh: typeof en = { customNeedsModels: '自定义提供方至少需要一个模型。', create: '创建提供方', creating: '创建中\u2026', + welcomeTitle: WELCOME_NOTICE_COPY.zh.title, + welcomeBody: WELCOME_NOTICE_COPY.zh.body, + welcomeContinue: WELCOME_NOTICE_COPY.zh.continueLabel, + welcomeError: '暂时无法保存确认状态,请重试。', onboardingTitle: '添加一个 API Key 开始使用', onboardingDescription: '配置 DeepSeek 官方模型,即可开始使用。', - onboardingGoToSettings: '前往配置', onboardingLater: '稍后配置', + onboardingSave: '保存并继续', + onboardingSaving: '保存中…', + keyRequired: '请输入 API 密钥后继续。', } diff --git a/packages/client/ui-settings-models/src/client/welcome-store.ts b/packages/client/ui-settings-models/src/client/welcome-store.ts new file mode 100644 index 0000000000..6e139f1a43 --- /dev/null +++ b/packages/client/ui-settings-models/src/client/welcome-store.ts @@ -0,0 +1,126 @@ +/** Welcome-notice state, durable when the browser may use Host settings. */ + +import type { IApiClient, SettingsNamespaceView } from '@deepseek-ai/dsh-api-remotes/client' +import type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' +import { createSnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' +import { + WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, +} from '../onboarding-copy.ts' + +/** State rendered by the welcome step. */ +export interface WelcomeNoticeState { + status: 'idle' | 'loading' | 'ready' | 'saving' | 'error' + acknowledged: boolean + error: string | null +} + +function messageOf(error: unknown): string { + return error instanceof Error ? error.message : String(error) +} + +function acknowledgementOf(view: SettingsNamespaceView): string | undefined { + if (typeof view.value !== 'object' || view.value === null) return undefined + const value = (view.value as Record)[WELCOME_NOTICE_ACK_FIELD] + return typeof value === 'string' ? value : undefined +} + +/** Coordinates durable Host acknowledgement or a process-local remote fallback. */ +export class WelcomeNoticeStore { + /** uSES-safe state source shared by the registered welcome step. */ + readonly store: SnapshotStore = createSnapshotStore({ + status: 'idle', acknowledged: false, error: null, + }) + + private generation = 0 + + /** + * @param api - settings wire face used for durable reads and writes. + * @param persistence - remote browsers use memory because settings is loopback-only. + */ + constructor( + private readonly api: Pick, + private readonly persistence: 'host' | 'memory' = 'host', + ) {} + + /** Load the acknowledgement from Host settings or initialize process-local state. */ + async load(): Promise { + const generation = ++this.generation + if (this.persistence === 'memory') { + this.store.update((state) => { state.status = 'ready'; state.error = null }) + return + } + this.store.update((state) => { state.status = 'loading'; state.error = null }) + try { + const response = await this.api.settings.describe({}) + if (!response.result.ok) throw new Error(response.result.error.message) + const view = response.result.value.namespaces.find( + candidate => candidate.ns === WELCOME_NOTICE_SETTINGS_NAMESPACE, + ) + if (view === undefined) throw new Error('welcome acknowledgement settings are unavailable') + if (generation !== this.generation) return + this.store.update((state) => { + state.status = 'ready' + state.acknowledged = acknowledgementOf(view) === WELCOME_NOTICE_VERSION + state.error = null + }) + } catch (error) { + if (generation !== this.generation) return + this.store.update((state) => { + state.status = 'error' + state.acknowledged = false + state.error = messageOf(error) + }) + } + } + + /** + * Persist this copy version, or advance only this process for a remote browser. + * @returns true when the selected persistence mode accepted the acknowledgement. + */ + async acknowledge(): Promise { + const generation = ++this.generation + if (this.persistence === 'memory') { + this.store.update((state) => { + state.status = 'ready' + state.acknowledged = true + state.error = null + }) + return true + } + this.store.update((state) => { state.status = 'saving'; state.error = null }) + try { + const response = await this.api.settings.mutate({ + ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, + ops: [{ op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: WELCOME_NOTICE_VERSION }], + }) + if (!response.result.ok) throw new Error(response.result.error.message) + if (generation === this.generation) { + this.store.update((state) => { + state.status = 'ready' + state.acknowledged = true + state.error = null + }) + } + return true + } catch (error) { + if (generation === this.generation) { + this.store.update((state) => { + state.status = 'error' + state.acknowledged = false + state.error = messageOf(error) + }) + } + return false + } + } +} + +/** + * Refresh only after welcome state has left idle. A memory-mode load retains + * acknowledgement so reconnect does not reopen a process-local notice. + * @param controller - welcome state owner whose current status decides whether to load. + */ +export function refreshWelcomeIfLoaded(controller: WelcomeNoticeStore): void { + if (controller.store.getSnapshot().status === 'idle') return + void controller.load() +} diff --git a/packages/client/ui-settings-models/src/onboarding-copy.ts b/packages/client/ui-settings-models/src/onboarding-copy.ts new file mode 100644 index 0000000000..66492bde23 --- /dev/null +++ b/packages/client/ui-settings-models/src/onboarding-copy.ts @@ -0,0 +1,25 @@ +/** Durable settings namespace for product-wide GUI onboarding facts. */ +export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' + +/** Field storing the last welcome notice version the user acknowledged. */ +export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' + +/** + * Bump only when the notice changes materially and every user should see it + * again. The acknowledgement is compared for exact equality. + */ +export const WELCOME_NOTICE_VERSION = '2026-08-13.1' + +/** The complete editable internal-testing notice in both supported GUI locales. */ +export const WELCOME_NOTICE_COPY = { + zh: { + title: '内测声明', + body: 'DeepSeek Harness 目前的 0.1 版本仍处在面向 Harness 开发者进行测试的阶段,还有许多地方需要持续改进和打磨,希望听取广大开发者的反馈建议。预计 DeepSeek Harness 的核心插件以及基础 API 都会在接下来的一段时间内快速迭代、持续演化。\n\n我们期待与全球开发者一起,在开源、开放、可复用、可组合的基础设施之上,共同探索智能上限。欢迎全球 Harness 开发者加入 DSH 插件生态。', + continueLabel: '继续', + }, + en: { + title: '内测声明', + body: 'DeepSeek Harness 目前的 0.1 版本仍处在面向 Harness 开发者进行测试的阶段,还有许多地方需要持续改进和打磨,希望听取广大开发者的反馈建议。预计 DeepSeek Harness 的核心插件以及基础 API 都会在接下来的一段时间内快速迭代、持续演化。\n\n我们期待与全球开发者一起,在开源、开放、可复用、可组合的基础设施之上,共同探索智能上限。欢迎全球 Harness 开发者加入 DSH 插件生态。', + continueLabel: '继续', + }, +} as const diff --git a/packages/client/ui-settings-models/tests/apply.client.spec.ts b/packages/client/ui-settings-models/tests/apply.client.spec.ts index e914b1fe5b..d8fc11496b 100644 --- a/packages/client/ui-settings-models/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-models/tests/apply.client.spec.ts @@ -8,6 +8,7 @@ import { TestRemote, usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-t import { apply, inject, refreshIfLoaded } from '@deepseek-ai/dsh-client-ui-settings-models/client' import { ModelsSection } from '../src/client/ModelsSection.tsx' import { DeepSeekOnboardingDialog } from '../src/client/DeepSeekOnboardingDialog.tsx' +import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' // The service reads its initial locale from the browser; these specs assert // the shipped Chinese copy, so they state the browser they assume. @@ -23,7 +24,7 @@ async function bench() { new TestRemote(ctx) // The apply path only captures the wire face; no call leaves this fake // until a section actually loads. - ctx.provide('connection', { api: {} } as never) + ctx.provide('connection', { api: {}, isLoopback: true } as never) return { ctx, slots: ctx.get('slots') as SlotRegistry, locale } } @@ -60,9 +61,20 @@ describe('ui-settings-models apply', () => { expect(typeof injected.controller.load).toBe('function') expect(typeof injected.useSnapshot).toBe('function') expect(injected.api).toBeDefined() - const onboarding = before.slots.entries('settings.onboarding')[0]! - expect(onboarding.component).toBe(DeepSeekOnboardingDialog) - expect(onboarding.options).toMatchObject({ id: 'deepseek-official', order: 0 }) + const onboarding = before.slots.entries('settings.onboarding') + expect(onboarding).toHaveLength(2) + expect(onboarding.find(entry => entry.options.id === 'welcome-notice')).toMatchObject({ + component: WelcomeNotice, + options: { id: 'welcome-notice', order: -100 }, + }) + const deepSeek = onboarding.find(entry => entry.options.id === 'deepseek-official')! + expect(deepSeek.component).toBe(DeepSeekOnboardingDialog) + expect(deepSeek.options).toMatchObject({ id: 'deepseek-official', order: 0 }) + const deepSeekInjected = ( + deepSeek.inject as unknown as () => import('../src/client/DeepSeekOnboardingDialog.tsx').DeepSeekOnboardingInjected + )() + expect(deepSeekInjected.hooks.models).toBe(injected.controller.store) + expect(deepSeekInjected.api).toBeDefined() const after = await bench() await after.ctx.plugin({ inject: [...inject], apply }).await() @@ -71,7 +83,7 @@ describe('ui-settings-models apply', () => { declare(after.slots) await Promise.resolve() expect(after.slots.entries('settings.section')[0]!.component).toBe(ModelsSection) - expect(after.slots.entries('settings.onboarding')[0]!.component).toBe(DeepSeekOnboardingDialog) + expect(after.slots.entries('settings.onboarding')).toHaveLength(2) // The self-inflicted ledger notifications hit the duplicate guard. expect(after.slots.entries('settings.section')).toHaveLength(1) }) @@ -110,7 +122,7 @@ describe('ui-settings-models apply', () => { declare(b.slots) await Promise.resolve() expect(b.slots.entries('settings.section')[0]!.component).toBe(ModelsSection) - expect(b.slots.entries('settings.onboarding')[0]!.component).toBe(DeepSeekOnboardingDialog) + expect(b.slots.entries('settings.onboarding')).toHaveLength(2) // The locale path also recovers through the same ledger re-check. b.locale.setLocale('en') expect(resolveSlotLabel(b.slots.entries('settings.section')[0]!.options.label)).toBe('Models') @@ -164,8 +176,10 @@ describe('pushed invalidations', () => { const b = await bench() declare(b.slots) await b.ctx.plugin({ inject: [...inject], apply }).await() + const entry = b.slots.entries('settings.onboarding') + .find(candidate => candidate.options.id === 'deepseek-official')! const injected = ( - b.slots.entries('settings.onboarding')[0]!.inject as unknown as + entry.inject as unknown as () => import('../src/client/DeepSeekOnboardingDialog.tsx').DeepSeekOnboardingInjected )() injected.controller.store.update((state) => { state.status = 'ready' }) @@ -173,4 +187,25 @@ describe('pushed invalidations', () => { b.ctx.remote.$dispatch('credentials/updated', ['DEEPSEEK_API_KEY']) expect(load).toHaveBeenCalledTimes(1) }) + + it('routes only the onboarding namespace invalidation into welcome state', async () => { + const b = await bench() + declare(b.slots) + await b.ctx.plugin({ inject: [...inject], apply }).await() + const entry = b.slots.entries('settings.onboarding') + .find(candidate => candidate.options.id === 'welcome-notice')! + const injected = ( + entry.inject as unknown as + () => import('../src/client/WelcomeNotice.tsx').WelcomeNoticeInjected + )() + injected.hooks.welcome.update((state) => { state.status = 'ready' }) + const load = vi.spyOn(injected.controller, 'load').mockResolvedValue() + + b.ctx.remote.$dispatch('settings/document-updated', ['llm-deepseek', 1]) + expect(load).not.toHaveBeenCalled() + b.ctx.remote.$dispatch('settings/document-updated', ['ui-onboarding', 2]) + expect(load).toHaveBeenCalledOnce() + b.ctx.emit('connection/reset') + expect(load).toHaveBeenCalledTimes(2) + }) }) diff --git a/packages/client/ui-settings-models/tests/components.client.spec.tsx b/packages/client/ui-settings-models/tests/components.client.spec.tsx index 01f0a32349..d7643522dd 100644 --- a/packages/client/ui-settings-models/tests/components.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/components.client.spec.tsx @@ -355,6 +355,65 @@ describe('ModelsSection', () => { expect(screen.queryByRole('status')).toBeNull() }) + it('reuses the provider editor as a required credential-only onboarding form', async () => { + let finishSet: ((response: RpcResponse>) => void) | undefined + const set = vi.fn(() => new Promise>>((resolve) => { + finishSet = resolve + })) + const { face, mutate } = scriptedFace({ set }) + const onClose = vi.fn() + const { ProviderEditor } = await import('../src/client/ProviderEditor.tsx') + + render() + + const key = screen.getByLabelText(en.keyInput) + const save = screen.getByText(en.onboardingSave) + expect(document.activeElement).toBe(key) + expect(key.required).toBe(true) + expect(save.disabled).toBe(true) + expect(screen.getByText(en.onboardingLater)).toBeTruthy() + expect(screen.queryByText(en.customized)).toBeNull() + expect(screen.queryByLabelText(en.baseUrl)).toBeNull() + + fireEvent.change(key, { target: { value: ' ' } }) + expect(screen.getByText(en.keyRequired)).toBeTruthy() + expect(key.getAttribute('aria-invalid')).toBe('true') + expect(save.disabled).toBe(true) + + fireEvent.change(key, { target: { value: ' sk-onboarding ' } }) + expect(screen.queryByText(en.keyRequired)).toBeNull() + expect(save.disabled).toBe(false) + fireEvent.click(save) + + expect(await screen.findByText(en.onboardingSaving)).toBeTruthy() + expect(set).toHaveBeenCalledWith({ ref: 'DEEPSEEK_API_KEY', value: 'sk-onboarding' }) + expect(mutate).not.toHaveBeenCalled() + expect(onClose).not.toHaveBeenCalled() + + if (finishSet === undefined) throw new Error('credential write did not start') + await act(async () => { + finishSet?.(ok({})) + await Promise.resolve() + }) + expect(onClose).toHaveBeenCalledWith(true) + }) + it('applies customized deepseek fields as path ops', async () => { const { mutate } = await mountDeepSeekCard({ mutate: vi.fn(() => Promise.resolve(ok(wireNamespaces()[0]))), diff --git a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx index 2aea95b705..3c3074f3e7 100644 --- a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx @@ -2,14 +2,18 @@ /** First-run DeepSeek prompt behavior over the shared Models join. */ import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' import { afterEach, describe, expect, it, vi } from 'vitest' -import type { RpcResponse } from '@deepseek-ai/dsh-api-remotes/client' +import Schema from '@deepseek-ai/schemastery' +import type { RpcResponse, SettingsNamespaceView } from '@deepseek-ai/dsh-api-remotes/client' import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' import { DeepSeekOnboardingDialog } from '../src/client/DeepSeekOnboardingDialog.tsx' import type { DeepSeekOnboardingDialogProps } from '../src/client/DeepSeekOnboardingDialog.tsx' import { ModelsSettingsStore } from '../src/client/store.ts' import { en } from '../src/client/locales.ts' -afterEach(cleanup) +afterEach(() => { + cleanup() + document.getElementById('root')?.remove() +}) let nextRpc = 0 function ok(value: T): RpcResponse { @@ -22,6 +26,33 @@ function fail(message: string): RpcResponse { } } +const DeepSeekConfig = Schema.object({ + apiKeyEnv: Schema.string().role('credential-ref'), + baseURL: Schema.string().pattern(/^https:\/\//), + reasoningEffort: Schema.union(['off', 'high', 'max']), + defaultContextWindow: Schema.number().step(1).min(1), + models: Schema.array(Schema.object({ + id: Schema.string().required(), + name: Schema.string(), + description: Schema.string(), + contextWindow: Schema.number().step(1).min(1), + })), +}) + +function deepSeekNamespace(apiKeyEnv: string | null): SettingsNamespaceView { + const value = apiKeyEnv === null ? {} : { apiKeyEnv } + return { + ns: 'llm-deepseek', + schema: JSON.parse(JSON.stringify(DeepSeekConfig.toJSON())) as unknown, + value, + base: value, + user: {}, + applies: 'live', + secrets: [], + revision: 0, + } +} + function harness(options: { provider?: boolean providerSettingsNs?: string @@ -33,9 +64,24 @@ function harness(options: { describeFailure?: string settingsWritable?: boolean providersReject?: boolean + setFailure?: string + setReject?: string } = {}) { + if (document.getElementById('root') === null) { + const appRoot = document.createElement('div') + appRoot.id = 'root' + document.body.append(appRoot) + } let fileConfigured = false const configured = options.configured ?? (() => fileConfigured) + const apiKeyEnv = options.apiKeyEnv === undefined ? 'DEEPSEEK_API_KEY' : options.apiKeyEnv + const mutate = vi.fn(() => Promise.resolve(ok(deepSeekNamespace(apiKeyEnv)))) + const set = vi.fn((_payload: { ref: string; value: string }) => { + if (options.setReject !== undefined) return Promise.reject(new Error(options.setReject)) + if (options.setFailure !== undefined) return Promise.resolve(fail(options.setFailure)) + fileConfigured = true + return Promise.resolve(ok({})) + }) const face = { llm: { providers: () => { @@ -56,19 +102,10 @@ function harness(options: { settings: { describe: () => Promise.resolve(ok({ writable: options.settingsWritable ?? true, - namespaces: options.settingsNamespace === false - ? [] - : [{ - ns: 'llm-deepseek', - schema: {}, - value: options.apiKeyEnv === null - ? {} - : { apiKeyEnv: options.apiKeyEnv ?? 'DEEPSEEK_API_KEY' }, - applies: 'live' as const, - secrets: [], - revision: 0, - }], + hasDocument: false, + namespaces: options.settingsNamespace === false ? [] : [deepSeekNamespace(apiKeyEnv)], })), + mutate, }, credentials: { describe: () => options.describeFailure === undefined @@ -84,6 +121,7 @@ function harness(options: { }, })) : Promise.resolve(fail(options.describeFailure)), + set, }, } const controller = new ModelsSettingsStore(face as never) @@ -97,40 +135,100 @@ function harness(options: { useSessions: unusedHook, useWorkspaces: unusedHook, controller, - useSnapshot: bindSnapshotSelector(controller.store), + useModels: bindSnapshotSelector(controller.store), + api: face as never, t: key => en[key], } - return { controller, complete, openSection, props, configure: () => { fileConfigured = true } } + return { + controller, complete, openSection, props, mutate, set, + configure: () => { fileConfigured = true }, + } } describe('DeepSeekOnboardingDialog', () => { - it('loads on first entry and presents one accessible route to Models', async () => { + it('loads a credential-only modal, inerts the product, and focuses the key', async () => { const h = harness() render() - expect(await screen.findByRole('region', { name: en.onboardingTitle })).toBeTruthy() + expect(await screen.findByRole('dialog', { name: en.onboardingTitle })).toBeTruthy() + expect(document.getElementById('root')?.inert).toBe(true) expect(screen.getByText(en.onboardingDescription)).toBeTruthy() - const action = screen.getByRole('button', { name: en.onboardingGoToSettings }) - expect(action).toBeTruthy() - expect(document.activeElement).toBe(screen.getByRole('heading', { name: en.onboardingTitle })) - expect(screen.queryByRole('textbox')).toBeNull() + const key = screen.getByLabelText(en.keyInput) + await waitFor(() => { expect(document.activeElement).toBe(key) }) + expect(screen.queryByText(en.customized)).toBeNull() }) - it('opens the Models section and dismisses the prompt', async () => { + it('cannot be dismissed implicitly and restores the previous inert state', async () => { + const h = harness() + const appRoot = document.getElementById('root')! + appRoot.inert = true + const view = render() + await screen.findByRole('dialog') + + fireEvent.keyDown(document, { key: 'Escape' }) + fireEvent.click(document.querySelector('[class*="mask"]')!) + expect(screen.getByRole('dialog')).toBeTruthy() + expect(h.complete).not.toHaveBeenCalled() + + view.unmount() + expect(appRoot.inert).toBe(true) + }) + + it('requires a non-blank key before Save and continue is available', async () => { const h = harness() render() - await screen.findByRole('region') - fireEvent.click(screen.getByRole('button', { name: en.onboardingGoToSettings })) - expect(h.complete).toHaveBeenCalledOnce() - expect(h.openSection).toHaveBeenCalledWith('models') + await screen.findByRole('dialog') + const save = screen.getByRole('button', { name: en.onboardingSave }) + expect(save.disabled).toBe(true) + fireEvent.change(screen.getByLabelText(en.keyInput), { target: { value: ' ' } }) + expect(save.disabled).toBe(true) + expect(screen.getByText(en.keyRequired)).toBeTruthy() + expect(h.set).not.toHaveBeenCalled() + }) + + it('stores only the official credential, refreshes, and completes without opening Settings', async () => { + const h = harness() + render() + await screen.findByRole('dialog') + fireEvent.change(screen.getByLabelText(en.keyInput), { target: { value: ' sk-live ' } }) + fireEvent.click(screen.getByRole('button', { name: en.onboardingSave })) + await waitFor(() => { + expect(h.set).toHaveBeenCalledWith({ ref: 'DEEPSEEK_API_KEY', value: 'sk-live' }) + }) + expect(h.mutate).not.toHaveBeenCalled() + expect(h.openSection).not.toHaveBeenCalled() + await waitFor(() => { expect(h.complete).toHaveBeenCalledOnce() }) + expect(screen.queryByRole('dialog')).toBeNull() + expect(document.getElementById('root')?.inert).toBe(false) + }) + + it('keeps the modal open and reports rejected and failed credential writes', async () => { + for (const [options, message] of [ + [{ setFailure: 'credential was rejected' }, 'credential was rejected'], + [{ setReject: 'connection lost' }, 'connection lost'], + ] as const) { + const h = harness(options) + const view = render() + await screen.findByRole('dialog') + fireEvent.change(screen.getByLabelText(en.keyInput), { target: { value: 'sk-live' } }) + fireEvent.click(screen.getByRole('button', { name: en.onboardingSave })) + expect(await screen.findByText(message)).toBeTruthy() + expect(screen.getByRole('dialog')).toBeTruthy() + expect(screen.getByRole('button', { name: en.onboardingSave }).disabled).toBe(false) + expect(h.complete).not.toHaveBeenCalled() + expect(h.mutate).not.toHaveBeenCalled() + view.unmount() + } }) it('allows configure-later dismissal without opening settings', async () => { const h = harness() render() - await screen.findByRole('region') + await screen.findByRole('dialog') fireEvent.click(screen.getByRole('button', { name: en.onboardingLater })) expect(h.complete).toHaveBeenCalledOnce() expect(h.openSection).not.toHaveBeenCalled() + expect(h.set).not.toHaveBeenCalled() + expect(h.mutate).not.toHaveBeenCalled() }) it('does not block the product when DeepSeek setup is unavailable', async () => { @@ -145,7 +243,7 @@ describe('DeepSeekOnboardingDialog', () => { ]) { const view = render() await act(async () => { await h.controller.load() }) - expect(screen.queryByRole('region')).toBeNull() + expect(screen.queryByRole('dialog')).toBeNull() await waitFor(() => { expect(h.complete).toHaveBeenCalledOnce() }) expect(h.openSection).not.toHaveBeenCalled() view.unmount() @@ -160,7 +258,7 @@ describe('DeepSeekOnboardingDialog', () => { ]) { const view = render() await act(async () => { await h.controller.load() }) - expect(screen.queryByRole('region')).toBeNull() + expect(screen.queryByRole('dialog')).toBeNull() await waitFor(() => { expect(h.complete).toHaveBeenCalledOnce() }) view.unmount() } @@ -169,10 +267,10 @@ describe('DeepSeekOnboardingDialog', () => { it('closes when an external credential invalidation refreshes the shared join', async () => { const h = harness() render() - await screen.findByRole('region') + await screen.findByRole('dialog') h.configure() await act(async () => { await h.controller.load() }) - await waitFor(() => { expect(screen.queryByRole('region')).toBeNull() }) + await waitFor(() => { expect(screen.queryByRole('dialog')).toBeNull() }) expect(h.complete).toHaveBeenCalledOnce() }) }) diff --git a/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx b/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx new file mode 100644 index 0000000000..09fc2485cf --- /dev/null +++ b/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx @@ -0,0 +1,126 @@ +// @vitest-environment jsdom +import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' +import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' +import type { WelcomeNoticeProps } from '../src/client/WelcomeNotice.tsx' +import { WelcomeNoticeStore } from '../src/client/welcome-store.ts' +import { en, zh } from '../src/client/locales.ts' +import { + WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, + WELCOME_NOTICE_VERSION, +} from '../src/onboarding-copy.ts' + +afterEach(() => { + cleanup() + document.getElementById('root')?.remove() +}) + +function response(value: T) { + return { rpcId: 'welcome-rpc' as never, result: { ok: true as const, value } } +} + +function mount(version?: string, mutateImpl: () => Promise = () => Promise.resolve(response({}))) { + const appRoot = document.createElement('div') + appRoot.id = 'root' + document.body.append(appRoot) + const mutate = vi.fn(mutateImpl) + const api = { + settings: { + describe: () => Promise.resolve(response({ + writable: true, + hasDocument: false, + namespaces: [{ + ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, + schema: {}, + value: version === undefined ? {} : { [WELCOME_NOTICE_ACK_FIELD]: version }, + base: {}, + user: {}, + applies: 'live' as const, + secrets: [], + revision: 0, + }], + })), + mutate, + }, + } + const controller = new WelcomeNoticeStore(api as never) + const complete = vi.fn() + const unusedHook = (() => { throw new Error('unused standard hook') }) as never + const props: WelcomeNoticeProps = { + stepId: 'welcome-notice', + complete, + openSection: vi.fn(), + useSessions: unusedHook, + useWorkspaces: unusedHook, + controller, + useWelcome: bindSnapshotSelector(controller.store), + t: key => zh[key], + } + return { ...render(), complete, controller, mutate, appRoot } +} + +describe('WelcomeNotice', () => { + it('uses the exact owner copy in both GUI locales', () => { + expect(WELCOME_NOTICE_COPY.en).toEqual(WELCOME_NOTICE_COPY.zh) + expect(en.welcomeBody).toBe(WELCOME_NOTICE_COPY.en.body) + expect(zh.welcomeBody).toBe(WELCOME_NOTICE_COPY.zh.body) + }) + + it('renders one blocking modal action and focuses the title', async () => { + const h = mount() + const dialog = await screen.findByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }) + for (const paragraph of WELCOME_NOTICE_COPY.zh.body.split('\n\n')) { + expect(screen.getByText(paragraph, { exact: true })).toBeTruthy() + } + expect(dialog.querySelectorAll('p')).toHaveLength(2) + expect(dialog.querySelectorAll('button')).toHaveLength(1) + expect(screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel })).toBeTruthy() + expect(document.activeElement).toBe(screen.getByRole('heading', { name: WELCOME_NOTICE_COPY.zh.title })) + expect(h.appRoot.inert).toBe(true) + + fireEvent.keyDown(document, { key: 'Escape' }) + fireEvent.click(document.querySelector('[class*="mask"]')!) + expect(h.complete).not.toHaveBeenCalled() + expect(screen.getByRole('dialog')).toBeTruthy() + }) + + it('completes only after the acknowledgement write commits', async () => { + const h = mount() + await screen.findByRole('dialog') + fireEvent.click(screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel })) + await act(async () => { await Promise.resolve() }) + expect(h.mutate).toHaveBeenCalledOnce() + expect(h.complete).toHaveBeenCalledOnce() + }) + + it('skips itself when this exact version was already acknowledged', async () => { + const h = mount(WELCOME_NOTICE_VERSION) + await act(async () => { await h.controller.load() }) + expect(screen.queryByRole('dialog')).toBeNull() + expect(h.complete).toHaveBeenCalledOnce() + }) + + it('keeps the sole action disabled while saving and reports a refused write', async () => { + let resolveWrite!: (value: unknown) => void + const write = new Promise((resolve) => { resolveWrite = resolve }) + const h = mount(undefined, () => write) + await screen.findByRole('dialog') + const action = screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }) + fireEvent.click(action) + expect(action.disabled).toBe(true) + resolveWrite({ + rpcId: 'welcome-refused' as never, + result: { + ok: false, + error: { + code: 'settings-rejected', + message: 'read only', + details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE }, + }, + }, + }) + expect((await screen.findByRole('alert')).textContent).toBe(zh.welcomeError) + expect(h.complete).not.toHaveBeenCalled() + }) +}) diff --git a/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts b/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts new file mode 100644 index 0000000000..97c026df1a --- /dev/null +++ b/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts @@ -0,0 +1,199 @@ +import { describe, expect, it, vi } from 'vitest' +import type { RpcResponse } from '@deepseek-ai/dsh-api-remotes/client' +import { refreshWelcomeIfLoaded, WelcomeNoticeStore } from '../src/client/welcome-store.ts' +import { + WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, +} from '../src/onboarding-copy.ts' + +let rpc = 0 +function ok(value: T): RpcResponse { + return { rpcId: `welcome-${rpc++}` as never, result: { ok: true, value } } +} + +function namespace(version?: string) { + return { + ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, + schema: {}, + value: version === undefined ? {} : { [WELCOME_NOTICE_ACK_FIELD]: version }, + base: {}, + user: {}, + applies: 'live' as const, + secrets: [], + revision: 0, + } +} + +function deferred() { + let resolve!: (value: T) => void + let reject!: (reason: unknown) => void + const promise = new Promise((res, rej) => { resolve = res; reject = rej }) + return { promise, resolve, reject } +} + +describe('WelcomeNoticeStore', () => { + it('acknowledges in memory without calling loopback-only settings APIs', async () => { + const describe = vi.fn() + const mutate = vi.fn() + const controller = new WelcomeNoticeStore({ settings: { describe, mutate } } as never, 'memory') + + await controller.load() + expect(controller.store.getSnapshot()).toEqual({ status: 'ready', acknowledged: false, error: null }) + await expect(controller.acknowledge()).resolves.toBe(true) + expect(controller.store.getSnapshot()).toEqual({ status: 'ready', acknowledged: true, error: null }) + await controller.load() + expect(controller.store.getSnapshot()).toEqual({ status: 'ready', acknowledged: true, error: null }) + expect(describe).not.toHaveBeenCalled() + expect(mutate).not.toHaveBeenCalled() + }) + + it('acknowledges only the exact current copy version', async () => { + for (const [version, acknowledged] of [ + [undefined, false], + ['older-copy', false], + [WELCOME_NOTICE_VERSION, true], + ] as const) { + const api = { + settings: { + describe: vi.fn(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace(version)], + }))), + }, + } + const controller = new WelcomeNoticeStore(api as never) + await controller.load() + expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged }) + } + }) + + it('persists the owner version through one idempotent path mutation', async () => { + const mutate = vi.fn(() => Promise.resolve(ok(namespace(WELCOME_NOTICE_VERSION)))) + const controller = new WelcomeNoticeStore({ settings: { mutate } } as never) + await expect(controller.acknowledge()).resolves.toBe(true) + expect(mutate).toHaveBeenCalledWith({ + ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, + ops: [{ op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: WELCOME_NOTICE_VERSION }], + }) + expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: true }) + }) + + it('keeps the notice pending when loading or persistence fails', async () => { + const load = new WelcomeNoticeStore({ + settings: { describe: () => Promise.reject(new Error('offline')) }, + } as never) + await load.load() + expect(load.store.getSnapshot()).toEqual({ status: 'error', acknowledged: false, error: 'offline' }) + + const save = new WelcomeNoticeStore({ + settings: { mutate: () => Promise.reject(new Error('disk full')) }, + } as never) + await expect(save.acknowledge()).resolves.toBe(false) + expect(save.store.getSnapshot()).toEqual({ status: 'error', acknowledged: false, error: 'disk full' }) + + const nonError = new WelcomeNoticeStore({ + // Durable/wire failures are unknown; exercise containment of a non-Error rejection. + settings: { describe: () => Promise.reject('offline string') }, + } as never) + await nonError.load() + expect(nonError.store.getSnapshot().error).toBe('offline string') + }) + + it('reports business failures, missing namespaces, and malformed durable values', async () => { + for (const describe of [ + () => Promise.resolve({ + rpcId: 'failed' as never, + result: { ok: false as const, error: { code: 'internal' as const, message: 'denied', details: {} } }, + }), + () => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [] })), + ]) { + const controller = new WelcomeNoticeStore({ settings: { describe } } as never) + await controller.load() + expect(controller.store.getSnapshot().status).toBe('error') + } + + for (const value of [null, 42, { [WELCOME_NOTICE_ACK_FIELD]: 42 }]) { + const controller = new WelcomeNoticeStore({ + settings: { describe: () => Promise.resolve(ok({ + writable: true, + hasDocument: false, + namespaces: [{ ...namespace(), value }], + })) }, + } as never) + await controller.load() + expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: false }) + } + + const save = new WelcomeNoticeStore({ + settings: { mutate: () => Promise.resolve({ + rpcId: 'failed-save' as never, + result: { + ok: false, + error: { + code: 'settings-rejected', + message: 'denied', + details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE }, + }, + }, + }) }, + } as never) + await expect(save.acknowledge()).resolves.toBe(false) + expect(save.store.getSnapshot().error).toBe('denied') + }) + + it('lets the latest load win over stale success and failure', async () => { + const first = deferred>() + const describe = vi.fn() + .mockImplementationOnce(() => first.promise) + .mockImplementationOnce(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace()], + }))) + const controller = new WelcomeNoticeStore({ settings: { describe } } as never) + const stale = controller.load() + await controller.load() + first.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace(WELCOME_NOTICE_VERSION)], + })) + await stale + expect(controller.store.getSnapshot().acknowledged).toBe(false) + + const failed = deferred>() + describe + .mockImplementationOnce(() => failed.promise) + .mockImplementationOnce(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace(WELCOME_NOTICE_VERSION)], + }))) + const staleFailure = controller.load() + await controller.load() + failed.reject('stale failure') + await staleFailure + expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: true, error: null }) + }) + + it('contains stale acknowledgement settlements and refreshes only a loaded store', async () => { + const write = deferred>() + const describe = vi.fn(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace()], + }))) + const controller = new WelcomeNoticeStore({ + settings: { mutate: () => write.promise, describe }, + } as never) + refreshWelcomeIfLoaded(controller) + expect(describe).not.toHaveBeenCalled() + const staleWrite = controller.acknowledge() + await controller.load() + write.resolve(ok(namespace(WELCOME_NOTICE_VERSION))) + await expect(staleWrite).resolves.toBe(true) + expect(controller.store.getSnapshot().acknowledged).toBe(false) + refreshWelcomeIfLoaded(controller) + await vi.waitFor(() => { expect(describe).toHaveBeenCalledTimes(2) }) + + const failedWrite = deferred>() + const staleFailure = new WelcomeNoticeStore({ + settings: { mutate: () => failedWrite.promise, describe }, + } as never) + const pending = staleFailure.acknowledge() + await staleFailure.load() + failedWrite.reject('late failure') + await expect(pending).resolves.toBe(false) + expect(staleFailure.store.getSnapshot().status).toBe('ready') + }) +}) diff --git a/packages/client/ui-settings/src/client/contract/slots.ts b/packages/client/ui-settings/src/client/contract/slots.ts index 76c5f540f9..5413f8cb29 100644 --- a/packages/client/ui-settings/src/client/contract/slots.ts +++ b/packages/client/ui-settings/src/client/contract/slots.ts @@ -64,13 +64,11 @@ declare module '@deepseek-ai/dsh-client-ui-slots' { * Root-scoped onboarding steps contributed by settings features. The * shell mounts one ordered step at a time; the active registrant either * completes itself or keeps ownership until the user completes its sole - * path. Registrants own readiness, copy, dialog behavior, AND the - * takeover chrome: a step wraps its visible content in the - * OnboardingSurface primitive (mask, opaque stage, `#root` inert) and - * renders null while its private facts are still loading — the shell - * paints no chrome of its own, so a mounted-but-deciding step shows and - * blocks nothing (prevents a white flash on reload: a bare unwrapped step - * would render without mask or stage). + * path. Registrants own readiness, copy, dialog behavior, AND visible + * chrome: a step wraps its visible content in its modal surface (including + * `#root` inert ownership) and renders null while private facts are still + * loading. The shell paints no chrome of its own, so a mounted-but-deciding + * step shows and blocks nothing. */ 'settings.onboarding': { kind: 'list'; scope: 'root'; owner: SettingsOnboardingOwnerProps } /** diff --git a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts index 015d36e896..0cd1f51cd2 100644 --- a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts +++ b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts @@ -1192,7 +1192,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [ ], replaceRisk: 'none', example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'settings.general.item\', () => ctx.slots.register(\n { name: \'settings.general.item\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}', - source: 'packages/client/ui-settings/src/client/contract/slots.ts:90', + source: 'packages/client/ui-settings/src/client/contract/slots.ts:88', }, { key: 'settings.header', @@ -1225,7 +1225,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [ kind: 'list', scope: 'root', summary: 'Root-scoped onboarding steps contributed by settings features.', - doc: 'Root-scoped onboarding steps contributed by settings features. The\nshell mounts one ordered step at a time; the active registrant either\ncompletes itself or keeps ownership until the user completes its sole\npath. Registrants own readiness, copy, dialog behavior, AND the\ntakeover chrome: a step wraps its visible content in the\nOnboardingSurface primitive (mask, opaque stage, `#root` inert) and\nrenders null while its private facts are still loading — the shell\npaints no chrome of its own, so a mounted-but-deciding step shows and\nblocks nothing (prevents a white flash on reload: a bare unwrapped step\nwould render without mask or stage).', + doc: 'Root-scoped onboarding steps contributed by settings features. The\nshell mounts one ordered step at a time; the active registrant either\ncompletes itself or keeps ownership until the user completes its sole\npath. Registrants own readiness, copy, dialog behavior, AND visible\nchrome: a step wraps its visible content in its modal surface (including\n`#root` inert ownership) and renders null while private facts are still\nloading. The shell paints no chrome of its own, so a mounted-but-deciding\nstep shows and blocks nothing.', registerOptions: [ { name: 'id', @@ -1259,11 +1259,12 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [ slotInject: '', declaredBy: 'an entry in \'sidebar.settings\' (client-ui-settings-general), so it exists while that entry is mounted', occupants: [ + 'client-ui-settings-models WelcomeNotice id \'welcome-notice\'', 'client-ui-settings-models DeepSeekOnboardingDialog id \'deepseek-official\'', ], replaceRisk: 'none', example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'settings.onboarding\', () => ctx.slots.register(\n { name: \'settings.onboarding\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}', - source: 'packages/client/ui-settings/src/client/contract/slots.ts:75', + source: 'packages/client/ui-settings/src/client/contract/slots.ts:73', }, { key: 'settings.plugin.item', From df9ea1681f2faa714d884846284348ebc3f4b568 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:20:19 +0800 Subject: [PATCH 061/103] fix: snapshot --- .../translation-prompt-v4/request-response.expected.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/snapshots/translation-prompt-v4/request-response.expected.json b/scripts/snapshots/translation-prompt-v4/request-response.expected.json index 627097be23..c5f0822791 100644 --- a/scripts/snapshots/translation-prompt-v4/request-response.expected.json +++ b/scripts/snapshots/translation-prompt-v4/request-response.expected.json @@ -8,11 +8,11 @@ }, { "role": "user", - "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[MIT](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" + "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n- Join DeepSeek Harness Discord community.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[MIT](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" }, { "role": "assistant", - "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 主题,便于被发现。\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[MIT](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" + "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 话题,便于被发现。\n- 欢迎加入 DeepSeek Harness 企微群:扫码添加企微小助手并填写入群问卷,完成后小助手会邀请你入群。\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
企微小助手入群问卷微信公众号
\"DeepSeek\"DeepSeek\"DeepSeek
\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[MIT](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" }, { "role": "user", From 22ab3beac101f381616d1552627c929033426b9f Mon Sep 17 00:00:00 2001 From: imccyu Date: Thu, 13 Aug 2026 15:56:35 +0800 Subject: [PATCH 062/103] release(dsh): 0.1.0-rc.1 --- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package.json | 2 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- packages/attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- packages/client/ui-directory-picker-browse/package.json | 2 +- packages/client/ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- packages/client/ui-message-feedback/package.json | 2 +- packages/client/ui-model-selection/package.json | 2 +- packages/client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- packages/client/ui-settings-general/package.json | 2 +- packages/client/ui-settings-models/package.json | 2 +- packages/client/ui-settings-plugin-inventory/package.json | 2 +- packages/client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- packages/client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- packages/code-runtime/code-runtime-worker-thread/package.json | 2 +- packages/code-runtime/code-runtime/package.json | 2 +- packages/compaction/command-compact/package.json | 2 +- packages/compaction/compaction-basic/package.json | 2 +- packages/compaction/compaction-tool-result-pruner/package.json | 2 +- packages/compaction/compaction/package.json | 2 +- packages/context/agent-instructions/package.json | 2 +- packages/context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- packages/core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- packages/core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- packages/credentials/credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- packages/examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- packages/extensions/cordis-client-runner/package.json | 2 +- packages/extensions/cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- packages/feedback/command-feedback/package.json | 2 +- packages/feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- packages/fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- packages/fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- packages/guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- packages/host/directory-picker-auto/package.json | 2 +- packages/host/directory-picker-browse/package.json | 2 +- packages/host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- packages/identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- packages/interaction/permission-presets/package.json | 2 +- packages/interaction/tool-ask-user/package.json | 2 +- packages/interaction/user-approval/package.json | 2 +- packages/interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- packages/runtime-diagnostics/invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- packages/sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- packages/session-query/session-log-export/package.json | 2 +- packages/session-query/session-query-sqlite/package.json | 2 +- packages/session-query/session-query/package.json | 2 +- packages/session-query/tool-session-query/package.json | 2 +- packages/session/session-checkpoint-policy/package.json | 2 +- packages/session/session-persistence-jsonl/package.json | 2 +- packages/session/session-persistence-sqlite/package.json | 2 +- packages/session/session-persistence/package.json | 2 +- packages/session/session-projection-cache/package.json | 2 +- packages/session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- packages/session/session-telemetry-otel/package.json | 2 +- packages/session/session-telemetry/package.json | 2 +- packages/session/session-title-all-prompts-llm/package.json | 2 +- packages/session/session-title-first-prompt-llm/package.json | 2 +- packages/session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- packages/shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- packages/subagent/subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- packages/subagent/subagent-dsh-sdk/package.json | 2 +- packages/subagent/subagent-fork-in-process/package.json | 2 +- packages/subagent/subagent-in-process-driver/package.json | 2 +- packages/subagent/subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- packages/subagent/tool-subagent-control/package.json | 2 +- packages/subagent/tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- packages/subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- packages/test-support/acp-snapshot/package.json | 2 +- packages/test-support/agent-loop-testkit/package.json | 2 +- packages/test-support/client-runtime/package.json | 2 +- packages/test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- packages/test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- packages/web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- packages/workflow/workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- 222 files changed, 222 insertions(+), 222 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index ff7cc07407..9617da8869 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/apps/web/package.json b/apps/web/package.json index 32d6c06d78..7e85392d34 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/package.json b/package.json index 9adfdf5cb4..ffbe648eaa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "license": "MIT", "private": true, "type": "module", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index 2c8b3cc826..02e8294f1f 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index 722d052fc1..a034a01af2 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index 7f8182fedb..3d4a9b40b7 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly and Host Agent/Session lookup policy", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index 2caa098326..499b8ef226 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index 43a36a1d84..a853154ab8 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index 368cd8ce22..9e60cd8af4 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index ddbfd025fd..c1b0732a8e 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 8ae83abdbb..0881d4ea58 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 9f8ebca111..ee10bc368b 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 0c8193088f..888512a8f7 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 8d954c28d1..36a3a08cc2 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index 994634005c..149c464e28 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 30f82a4828..53ff24c993 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index d7b3a155ac..e57918aa4c 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 1855f2c7f7..6e93112cc1 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-runtime", "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index a6fd68893b..9e47ccf3ce 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-schema-form", "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index 8b6788513d..617186b81e 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 007c4092e1..a65822fa16 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index 2739b05cee..6f08e1a511 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 2cab53f03e..ae9dc9150a 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index d21883da32..1036166334 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Produced-files turn tail and clickable final-response file references for Web", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index 105b64dc2d..d3957208bd 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index acc587e532..1384a08ead 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index bdad883101..fbb5569543 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index 2a41e5fe58..3fc54c3faf 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index c4608b04b2..bdcb634e8e 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list: live registry state mirrored from session/jobs frames", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index e89aa6deba..db914cbd20 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index f498ba9213..6faf159bc2 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 03bfbb163f..ea9843992a 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection: the /model popupSelect over session.models / session.selectModel", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 9e5702a29e..dc6fd4e2f1 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 41c106a391..2b5d64b057 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index 28685575b4..66a1bb672b 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index df051694a5..878c339e0b 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index c69fc62153..3a78f1716e 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", "description": "Models settings and official-DeepSeek first-run routing over one live provider/settings/credential join", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 02fb7fc18d..c4260096a8 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index b9573329c4..42e5f3e534 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index fcdc871cc0..a0b6c8ee2f 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index ba67acf035..b6c7813033 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index 9725afb999..1bd1a3d109 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index d7d24d41cc..eb9f076ea3 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 695eb44242..4f16c65d03 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index af0d9c4d72..4b3ecdc24f 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 77126b3acd..5c2e7f47f9 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 64cc7bf3a8..1dc0c9bbde 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index df45a9d006..3afa43d70b 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-user-questions", "description": "Web ask_user_question feature: host tool mount plus composer-takeover question UI", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index c405348651..71695e6394 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workflow-run", "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index 4665c00faa..105f0afa63 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workspace", "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index 0fcc91e373..ade5833056 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web-react", "description": "Shell-side React glue: createSlotRenderer, SessionProvider, bindSnapshotSelector (uSES bridge), useInvoke", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/web/package.json b/packages/client/web/package.json index fe900dd289..cfe38fe698 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web", "description": "Web shell kernel: bootWebShell (module system holding + seed table + two-stage boot + AppRoot gate + app-shell assembly entry), consumed by the apps/web vite entry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index dbb8ef3911..e4286cbdd5 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime-worker-thread", "description": "Worker-thread implementation of the DeepSeek Harness code-execution seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index d1e878347f..20c1bdb859 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime", "description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index 7c7c7405d9..c3cdffaec3 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-compact", "description": "Human-facing slash command for explicit session compaction", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 65093551f7..2b91fa4630 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-basic", "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index 9a3260bc2c..1ee9dcbb0a 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-tool-result-pruner", "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index 981e78fbf9..4c6900c6c3 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction", "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index 1bd5d1b78c..c84bb2bde7 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-instructions", "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index 4a4de322b6..83fe078eb8 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-reference", "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 31eedc1e3e..83eb05dc6e 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-time-context", "description": "Opt-in durable per-step context with the current time and elapsed time", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 2ff4123d59..dd63d592e5 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tmux-context", "description": "Opt-in durable per-step context with this agent's tmux pane and window location", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index 657738564c..617139dbf2 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-default-model", "description": "Default model selection shared by Agent entry points", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index 5b5decf6dc..a25f1d938f 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop", "description": "The concrete agent loop plugin for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index b73d7e5906..9610ebe18e 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-tool-presentation", "description": "Agent-plane presentation selector: composes one agent's tools as Code Mode, native, or both", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index 2aadce0f3a..0bfc2e2fce 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent", "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index 0a905db770..09bc97963c 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-scope", "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/session/package.json b/packages/core/session/package.json index 2c71fd5914..2c5648e07d 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session", "description": "Event-sourced session store for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index 3d5fecb898..f34d70d4cd 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-system-prompt", "description": "System prompt assembly registry for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index b472b72eae..e0dcd5ae30 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tools", "description": "Tool registry and execution pipeline for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index 3e6336abf9..75d574b1c0 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials-local", "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index c4e9b22fc2..7bd964b31d 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials", "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index 50619aab9b..d073feebae 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-e2b", "description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index e4cad4d1dd..7f03bfa801 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-e2b", "description": "E2B filesystem implementation for DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index 9d939df557..55739a65ed 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-e2b", "description": "E2B subprocess implementation for DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index a3791b086a..6694257e88 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-demo", "description": "ACP automation server app: agent spine + JSONL persistence + ACP transport, with a JSON-RPC stdio bin", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index 84f36fe690..67b01c29fa 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-spine-demo", "description": "The default executor-less/UI-less agent spine with fallback session titles, provider-routed retry, and optional persisted goals", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index f756389787..e8519495fa 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-demo", "description": "Bin that boots an external Cordis config for the stdio JSON-RPC SDK runtime", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index fe183445d0..0e6903ce57 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-client-runner", "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 263a673466..59e78a1ec9 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-host-runner", "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index d1badb3d1f..0279f6d424 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-cordis", "description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 9e16d3a4a5..1a717b2cb7 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-cordis", "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index 62a0b6e6fc..33a9e4ad37 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-feedback", "description": "Log-only session feedback producer and human-facing slash command", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index 92fd1b69e1..dcc3a173ac 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-message-feedback", "description": "Lifecycle-bound per-message rating and note sidecar for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index e1a08d5b26..efe9d4de4f 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-local", "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index a58f7dffa1..1bbd7f1039 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-observation-policy", "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 14bb7688ad..255709e6e7 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-sandbox", "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index 0b7fa7de95..c3c7c2353b 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs", "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index fb605640e2..fbb740d186 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs-search", "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index 52afc01c71..668fb9106d 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs", "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index 0ba3199de1..3aca8e7c8f 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-str-replace-editor", "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index 37856f82c1..a0ecf3ca9b 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-goal", "description": "Human-facing slash command for persisted same-session goals", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index 04039bccf5..af5d415729 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal-round-driver", "description": "Race-fenced same-session goal-round driver", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index 7a70042efd..13fcddeecd 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal", "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index a55b4aecc2..9c8ce67a76 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-goal", "description": "Model-facing same-session goal tools with execution-time authority checks", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 3ce74bf325..46996c42c9 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-repeat-tool-reminder", "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index 1f79e44170..947415cb62 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-call-timeout-policy", "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 9f10386e1c..853b79f934 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index a3bd642b42..2e19511840 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 340c2ceb22..7b849242dd 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index 307581a3f3..d0e75a11f5 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-apiproxy", "description": "API gateway: the ApiProxy contract (api/), the fetch carrier pair (fetch/), and the host-side gateway plugin providing ctx.apiProxy", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index d79af2594e..3e5112dde7 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-auto", "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index 5749e795fa..9eacb79ccc 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-browse", "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index 62c375f5fa..933cfbe3a2 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-native", "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index f197d31250..7196855c85 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker", "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 5cbd0d8628..7c2cfe281d 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-frontend-static", "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving the built frontend with index-tap injection, traversal rejection, and SPA index fallback", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 99833b8ea9..4da7af74ac 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-plugin-inventory", "description": "Read-only Remote projection of current Cordis Loader plugin state", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index 891fa49b23..63fceb801b 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-webserver", "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index 604b308f15..1c4997c054 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-anonymous-user-id", "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index c08b1294a4..575f2b4e8c 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-commands", "description": "Plugin-owned human command registry for DeepSeek Harness UIs", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index 3b3160baae..dd328cd3bb 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-permission-presets", "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index af45d56ab1..c18000ae91 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ask-user", "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index aa1e6a5ee7..ca559c94fa 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-approval", "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 04b7355dd1..6ce971cd0d 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-questions", "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 4b1120a92d..6d2fe5c18b 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs-local", "description": "Process-local implementation of the DeepSeek Harness background job registry seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index 83235ec22b..89b5116808 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs", "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index 73ddb5f657..eb68bf5cac 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-jobs", "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index 9c86b3c98e..c556cdb298 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-deepseek", "description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 5c2845394e..2dedb51af2 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-pi-ai", "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index e6c3013da1..0b1ca065ad 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-retry", "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index c6018de902..c0393011c5 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm", "description": "Provider-neutral LLM service interface for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index efaf61ef86..33aa87f85c 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-token-meter", "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index 04088296fb..47ef93e772 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp-stdio", "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index 4f16df5a2f..8e7f2173ef 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp", "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index bd4bda1388..f30e62d2ae 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-lsp", "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index d42b425730..89e77392d0 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-client", "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index d13c7606b1..6fe63abc6c 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plan-mode", "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index 241cf74ce7..c7821b7a16 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-presets", "description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index 24fb8660a1..4aeba42c70 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-persona", "description": "Composition-authored deployment persona section for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index 41d8c631e1..a3d19e49f0 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-invariants", "description": "Registry service for package-owned DeepSeek Harness runtime invariants", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index dfe13545ad..2c2ca2d3c9 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-local", "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index 06ea90d1cf..553f607ab7 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-policy", "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index 7faad86ea0..cd977461a0 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-windows-acl", "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index 00ebcfd612..3f12853539 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox", "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index f7e2fd6406..8b70287cc8 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-schedule", "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index 6e8d4d5dd9..7b2e70e143 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-client", "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index 966d35d538..594058d322 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-protocol", "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index aad971d714..68011759bc 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-server", "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index b020ce301b..a1e423409a 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, "repository": { "type": "git", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index 1644203ecd..9f7abce839 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query-sqlite", "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index ce88a9665b..7d7c0ae6c4 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query", "description": "Combined session query service contract with concrete reads, traces, and filters", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index 58bd6ee7ef..f5a29a594f 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-session-query", "description": "Workspace-authorized model-facing session history search, trace, and event read tools", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index a2b275ed29..b77ce150d2 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-checkpoint-policy", "description": "Semantic session durability checkpoints before model requests and tool side effects", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index cd48bbae0b..5e4f01ccb8 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-jsonl", "description": "JSONL durable session persistence backend for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index f824b9b3a8..35fbc2cf58 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-sqlite", "description": "SQLite durable session persistence backend for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index f42b496e6d..bcb10b6d81 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence", "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index 1697967808..c80be96d6b 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection-cache", "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session projection checkpoints over the domain data form, throttled write-behind, and the cold-read ladder (cache row + persistence tail replay)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index cdf61ac3a3..fa2da3c4f0 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection", "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index c7006a5061..fcb1e8de18 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-stats", "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 37b5893cce..3bd006cb01 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry-otel", "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index 132545f502..2d9f660292 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry", "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index c165327beb..1329571c6e 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 0e53d07e7f..1df72b6ab3 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-first-prompt-llm", "description": "First-message LLM provider plugin for DeepSeek Harness session titles", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index 10d63c1d89..9077b14215 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-llm", "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index 8a014863fe..d1df0c207d 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title", "description": "Log-backed session title service and provider registry for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index 0cdbdbef35..bcf1024c5b 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings-file", "description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 4208b479d4..962ae5fb37 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings", "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index db1c919311..7121c45e03 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-local", "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index bb68dc855b..ea352a7a52 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index f6882f5c3e..e3962071e7 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-local", "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index 74f1c5b3c1..7bf8a0b6d3 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index f5ef9d869a..a8f7c3e6a2 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell-env", "description": "Tool-independent managed DSH_* shell environment registry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index ab8a31dd7d..590acc3cf8 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell", "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index 14648a2231..a075fd28e7 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash-persistent", "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index e762320465..1ca91a61c4 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash", "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index 195940e82b..2ea1df9724 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh", "description": "Model-facing pwsh tool over the bash executor seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index d012804e96..0336e7c6d1 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 954a843c2b..67b558e868 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-filesystem", "description": "Local filesystem skill provider for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index 4688a93064..ef1e78ae76 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill", "description": "Agent skill provider registry for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index 19b10f8bb6..5073ee38b5 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-skill", "description": "Model-facing skill loading tool for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index 07c2134591..ac140d4a49 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-local", "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index f74a5c4135..c6cc6592f9 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-policy", "description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index 3d0f444b1d..dd3ec4f108 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill", "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index aa8983a712..c2cdb316f7 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-domain", "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index 5c04e79096..9f4e25061e 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-json", "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 88d5958419..860a4f0b43 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-sqlite", "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index f4f39039b0..0daa5ae28f 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage", "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index 72f725f040..32a8f97876 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-acp", "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index ec5da9e8ac..1fdf54c912 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-claude-code", "description": "One-shot Claude Code subagent provider over the official Agent SDK", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 269bf2e996..0ae0955426 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-codex", "description": "One-shot Codex subagent provider over the official app-server protocol", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index f7eac52a8e..56295ca0b9 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-dsh-sdk", "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index 5ccbe0e465..874213bd51 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-fork-in-process", "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index f3398a76e7..d214362cfd 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-in-process-driver", "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index 8c2c71c9c9..e6a778082c 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-spawn-in-process", "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 87ec069782..3fe78a62c8 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent", "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index 6be2ae1d26..59fb7785b9 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-control", "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index b3c8083f8c..f748d63426 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-report", "description": "Child-scoped report tool over ctx.subagents continuations", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index b1a73d0e8c..b02716a10a 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent", "description": "Model-facing subagent delegation tool over the ctx.subagents seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index 7581f54183..ee033c48d2 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-local", "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 5d2d4fa09d..43ecf68ba4 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess", "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index cad0c60fba..654063d0cd 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal-bash", "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index f0dc5e84c7..ea902d6cda 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal", "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index 6eebf5d33e..ea98adead2 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index a0a3697896..8f8659c9ce 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-snapshot", "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index 4e0bb8aa9c..03c08b9e8e 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop-testkit", "description": "Shared prerequisite mounting for tests that exercise the concrete agent loop", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index 9a6fb3a7a0..6146e1e3f9 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-test-runtime", "description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + web-react renderer with test-owned session/workspace doubles for feature specs", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index 2555c27275..a03ea4ea15 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-mock-server", "description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 3d5d70010b..1015d1fe08 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-replay", "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index 20e6c1a6d8..decd480ea5 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-loader-smoke", "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index c14ac4358b..bee55f9118 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-todo", "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index 39136c2877..08b2327841 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-generator", "description": "TypeScript project analyzer and model-driven Typert artifact generator", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index 20a7172175..80fd93ae1d 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-loader", "description": "Loader integration for generated Typert package contributions", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 7b5c6b4d91..485cf849fb 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-protocol", "description": "Compiler-independent Remote metadata and Typert provider protocols", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index 7c34532970..5eeb04da93 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-registry", "description": "Runtime registry for generated package reflection and Zod schemas", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index 964fcba265..f8926bc7a4 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-atomic-write", "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index 63a9bd0ac8..f990faa87f 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-brand", "description": "Type-only Branded nominal-typing primitive for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index 3bd0db8091..bb62be9920 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-home-paths", "description": "Shared filesystem path helpers for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index eeea9a70ee..1a5bf4b8a9 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-launch-environment", "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index 36547ffee9..7412df7965 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-native-command", "description": "Zero-dependency no-shell execFile runner for host-native OS integrations: utf8 stdio capture, abort propagation, Windows hide", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index cdd47c905c..849c5a9d15 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-output-retention", "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index cbe16cfcaf..cffe8854e7 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-timeout", "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index ecc7717b2b..584e04e5b4 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-web", "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index 0089033964..1187a55be6 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-fetch-http", "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index 55bd7ecdf2..ccbe17a2cf 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-deepseek", "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index ae0aa563cf..246b7af9ba 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-exa", "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 7f4aa73079..3904b3bc1f 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-perplexity", "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 16db0b092c..8ef9244233 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web", "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index ca7b5f4889..b9d88e49dd 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index 6abde88c22..929e8cfc99 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workflow", "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index 4f32c42493..c853979b4d 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow-worker-thread", "description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index 1b689da55a..09e03fa472 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow", "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index abcd7bc903..b16e7ec327 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace", "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.1", "publishConfig": { "access": "restricted" }, From 9afdf79782328334f560be646eddd39378dc7f03 Mon Sep 17 00:00:00 2001 From: j-xiang Date: Thu, 13 Aug 2026 16:23:03 +0800 Subject: [PATCH 063/103] docs(i18n): resolve remaining README review --- README.i18n.yaml | 2 +- packages/README.i18n.yaml | 2 +- packages/README.zh.md | 4 ++-- packages/core/agent-loop/README.i18n.yaml | 2 +- packages/core/agent-loop/README.zh.md | 6 +++--- packages/core/system-prompt/README.i18n.yaml | 2 +- packages/core/system-prompt/README.zh.md | 8 ++++---- packages/llm/llm/README.i18n.yaml | 2 +- packages/llm/llm/README.zh.md | 14 +++++++------- packages/subagent/subagent/README.i18n.yaml | 2 +- packages/subagent/subagent/README.zh.md | 8 ++++---- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/README.i18n.yaml b/README.i18n.yaml index 727a781767..cb21ac2fa9 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md README.md: 098b514f8311de092bab18bdd560722b1e485913 -README.zh.md: f9dacc4e3cce1c83bfa65df9fbc8d6410a37fcc0 +README.zh.md: 639d519b6202ffe740d46e462feec2657d7e13ad diff --git a/packages/README.i18n.yaml b/packages/README.i18n.yaml index e9fed2a793..cdc5428234 100644 --- a/packages/README.i18n.yaml +++ b/packages/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/README.md README.md: 7904ec1fea8dbab361fcd90b2b32f1c743ce5537 -README.zh.md: 2d6b1de9f1f957ebeefeae297860408a4c3cd498 +README.zh.md: c39b65dad7e9c277779a85d7327982597628e007 diff --git a/packages/README.zh.md b/packages/README.zh.md index 2d6b1de9f1..c39b65dad7 100644 --- a/packages/README.zh.md +++ b/packages/README.zh.md @@ -14,7 +14,7 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` 子类和函数插件通 | [`api/`](api/README.md) | Remote BFF 装配与 Typert RPC 网关 | 产品:稳定 API | | [`typert/`](typert/README.md) | 类型图生成、产物加载与运行时注册表 | 产品:稳定 API | | [`goal/`](goal/README.md) | 同会话 goal 的持久化与生命周期 | 产品:稳定 API | -| [`schedule/`](schedule/README.md) | 仅限会话内的定时 follow-up | 产品:稳定 API | +| [`schedule/`](schedule/README.md) | 仅限会话内的定时后续操作 | 产品:稳定 API | | [`feedback/`](feedback/README.md) | 人类反馈 | 产品:稳定 API | | [`identity/`](identity/README.md) | 共享匿名身份 | 产品:稳定 API | | [`llm/`](llm/README.md) | LLM(大语言模型)能力系列:抽象服务 + 提供方适配器 | 产品:稳定 API | @@ -41,7 +41,7 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` 子类和函数插件通 | [`guard/`](guard/README.md) | 循环卫生守卫:建议性重复调用提醒 + `tools/execute` 截止时间强制执行器 | 产品:稳定 API | | [`bundle/`](bundle/README.md) | 可安装的 `dsh --profile` 补丁层 | 产品:稳定 API | | [`extensions/`](extensions/README.md) | agent 运行时自修改:实时插件/服务检查和模型所写插件挂载/卸载([设计](../.agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md)) | 产品:稳定 API | -| [`hooks/`](hooks/README.md) | 钩子桥接 + 共享的 Claude Code/Codex wire protocol 库 | 产品:稳定 API | +| [`hooks/`](hooks/README.md) | 钩子桥接 + 共享的 Claude Code/Codex 线协议库 | 产品:稳定 API | | [`session/`](session/README.md) | 持久会话数据平面:持久化 seam + JSONL/SQLite 后端、投影 seam、基于日志的标题、会话上报 | 产品:稳定 API | | [`session-query/`](session-query/README.md) | 会话检索系列:逻辑语料库、有界读取、血缘、事件关系、语义过滤和 SQLite 全文搜索 | 产品:稳定 API | | [`settings/`](settings/README.md) | 用户设置 seam + 基于文件的提供方 | 产品:稳定 API | diff --git a/packages/core/agent-loop/README.i18n.yaml b/packages/core/agent-loop/README.i18n.yaml index 4d7aa55bd0..3778277a88 100644 --- a/packages/core/agent-loop/README.i18n.yaml +++ b/packages/core/agent-loop/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/core/agent-loop/README.md README.md: 683799d1840c857981d4ff30dd3e8e078be03098 -README.zh.md: 8ccc4a0b0d55c1660ee63405abc423d0ee2a8557 +README.zh.md: 8009f72a387f5c65ed258eed9ca6d1f14835c41f diff --git a/packages/core/agent-loop/README.zh.md b/packages/core/agent-loop/README.zh.md index 8ccc4a0b0d..8009f72a38 100644 --- a/packages/core/agent-loop/README.zh.md +++ b/packages/core/agent-loop/README.zh.md @@ -67,7 +67,7 @@ interface Config { 在 `agent/request` 返回提供方/模型调用配置后,循环会调用 `ctx.llm.prepareCall()`,在活跃轮次信号的控制下校验由适配器负责的字段,并填入配置的推理(reasoning)强度和输出 token 默认值。准备完成的调用会在这次异步解析、`request/header` 日志记录和最终分派期间保留同一项确切的适配器注册,因此 HMR(热模块替换)不会把某个适配器的能力解析结果与另一适配器的请求混用。请求 header 会记录生效配置以及哪些字段来自适配器。下一次 waterfall(瀑布式事件)前,循环会从提议中移除这些带标记字段,使当前精确路由重新填入自身默认值;未带标记的显式设置会跨步骤和路由变化保留。没有已注册适配器的路由会保留原定配置,使 `llm/stream` 监听器可以接管并短路该请求;最终分派仍会以 `NO_ADAPTER` 拒绝未得到处理的路由。新循环实例在恢复时会遵循同一套适配器默认值标记规则。 -插件失败会结束当前轮次,而不是结束循环。最终适配器选择、分发与迭代失败会以终止错误或中止结束的形式由 `ctx.llm` 传来,并进入 `agent/request-error`;middleware、结果处理、工具及其他扩展失败仍会抛出并直接关闭轮次。恢复逻辑会接收请求坐标、不可变的提供方事实、准备完成的适配器注册所捕获的不可变重试策略以及轮次信号;middleware 接管未准备路由时,该策略缺失。处理失败的监听器返回 `{ kind: 'retry' }`;未被处理的失败是终态。AgentLoop 为当前准入操作或轮次管理一个取消信号。有效的 `cancel(cause)` 在未设置 `keepInbox` 时清除待处理工作,并以协作方式中止该信号;空闲取消是空操作。abort 触发后、活动收敛到空闲前到达的唤醒输入会被锁存(`wakeRequested`),并在 driver 自身的收敛边界重放,无需再发一条唤醒 send 即可执行;`disposed` 取消从不锁存,而 agent 已处于空闲时发送的唤醒总是打开自己的 turn 边界(即使消息已被清除,状态也会显示瞬态 `idle → running → idle` 对)。持久 `turn/end` 为 `user` 和 `parent` 记录 `aborted`,dispose 则记录 `disposed`;未分发的模型工具调用会收到合成的 `tool/call` 与 `ABORTED_BEFORE_DISPATCH` 结果对。取消原因只影响报告方式,不影响如何处理在取消后完成终结的结果上下文。dispose 会等待忽略信号的工作完成,然后才从注册表移除。[显式取消决策](../../../.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.md)与[取消收敛窗口唤醒锁存](../../../.agents/notes/implemented/bug-fix/2026-08-07-cancel-convergence-wake-latch.md)规定生命周期与竞态约定。 +插件失败会结束当前轮次,而不是结束循环。最终适配器选择、分发与迭代失败会以终止错误或中止结束的形式由 `ctx.llm` 传来,并进入 `agent/request-error`;middleware、结果处理、工具及其他扩展失败仍会抛出并直接关闭轮次。恢复逻辑会接收请求坐标、不可变的提供方事实、准备完成的适配器注册所捕获的不可变重试策略以及轮次信号;middleware 接管未准备路由时,该策略缺失。处理失败的监听器返回 `{ kind: 'retry' }`;未被处理的失败是终态。AgentLoop 为当前准入操作或轮次拥有一个取消信号。有效的 `cancel(cause)` 在未设置 `keepInbox` 时清除待处理工作,并以协作方式中止该信号;空闲取消是空操作。abort 触发后、活动收敛到空闲前到达的唤醒输入会被锁存(`wakeRequested`),并在 driver 自身的收敛边界重放,无需再发一条唤醒 send 即可执行;`disposed` 取消从不锁存,而 agent 已处于空闲时发送的唤醒总是打开自己的 turn 边界(即使消息已被清除,状态也会显示瞬态 `idle → running → idle` 对)。持久 `turn/end` 为 `user` 和 `parent` 记录 `aborted`,dispose 则记录 `disposed`;未分发的模型工具调用会收到合成的 `tool/call` 与 `ABORTED_BEFORE_DISPATCH` 结果对。取消原因只影响报告方式,不影响如何处理在取消后完成终结的结果上下文。dispose 会等待忽略信号的工作完成,然后才从注册表移除。[显式取消决策](../../../.agents/notes/implemented/architecture/2026-07-16-explicit-turn-cancellation.md)与[取消收敛窗口唤醒锁存](../../../.agents/notes/implemented/bug-fix/2026-08-07-cancel-convergence-wake-latch.md)规定生命周期与竞态约定。 在步骤内,独占调用形成屏障;并行安全调用使用有界滚动池,并在启动前重新分类。只有分发和调用主体的执行会发生重叠。策略、持久结果和结果上下文仍保持模型顺序。中止会阻止启动新的调用,等待已启动调用的结果处理完毕,并保留其完成终结后的结果上下文,不区分取消原因。内部调度器故障会停止新的分发,等待已启动的分发,然后在不虚构工具结果的情况下到达轮次错误边界。 @@ -78,8 +78,8 @@ interface Config { - 压缩(compaction):在 `agent/pre-step` 上观测压力;在 `agent/request-error` 上进行规范的溢出修复 - 模型请求恢复:`dsh-llm-retry` 在 `agent/request-error` 上记录并等待针对确切提供方配置的 normal 或无界退避,发出不进入表层的 `llm/retry` 状态,然后返回重试动作 - 沙箱、权限、计划模式:使用 `tools/pre-execute` 提供可扩展的拒绝/询问,使用 `tools.guard()` 提供单调拥有方策略,使用 `tools/post-execute` 处理结果决定,并使用 `tools/result` 进行最终观测 -- subagent:在循环外部实现为 `ctx.subagents` 提供方;进程内提供方使用 `ctx.agents.create()` 创建 agent,并通过其持有的 `AgentHandle` 执行 teardown,而通用的 [`ctx.jobs`](../../jobs/jobs/) 与 [`dsh-tool-subagent`](../../subagent/tool-subagent/) 负责后台收集。 -- 持久化:`session/event` 发生后立即安排 write-behind;`session/flush` 是显式观测屏障 +- subagent:在循环外部实现为 `ctx.subagents` 提供方;进程内提供方使用 `ctx.agents.create()` 创建 agent,并通过其拥有的 `AgentHandle` 执行 teardown,而通用的 [`ctx.jobs`](../../jobs/jobs/) 与 [`dsh-tool-subagent`](../../subagent/tool-subagent/) 负责后台收集。 +- 持久化:`session/event` 发生后立即安排延后写入;`session/flush` 是显式观测屏障 - UI:`session/event`(assistant token 流、边界、工具活动)+ `agent/*` 控制事件(`agent/status`、`agent/created`/`agent/disposed`) ## 模型体验 diff --git a/packages/core/system-prompt/README.i18n.yaml b/packages/core/system-prompt/README.i18n.yaml index 5e5a3f6bea..28bc2cf1ab 100644 --- a/packages/core/system-prompt/README.i18n.yaml +++ b/packages/core/system-prompt/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/core/system-prompt/README.md README.md: d750a507e628e7609af542227e4528d4d4934ce8 -README.zh.md: c535dbd0535be3a8e7b6f78979c63dc03e562d36 +README.zh.md: fcf5ebfad1e467b060b2efaa6c6f2816d75945d1 diff --git a/packages/core/system-prompt/README.zh.md b/packages/core/system-prompt/README.zh.md index c535dbd053..fcf5ebfad1 100644 --- a/packages/core/system-prompt/README.zh.md +++ b/packages/core/system-prompt/README.zh.md @@ -8,10 +8,10 @@ | 键 | 默认值 | 含义 | |---|---|---| -| `includeHarnessIdentity` | `true` | 是否包含顺序为 −100 的固定开场白 `You are an AI agent powered by DeepSeek Harness.`。仅当兼容性部署拥有完整系统提示词时设为 `false`。 | +| `includeHarnessIdentity` | `true` | 是否包含顺序为 −100 的固定开场白 `You are an AI agent powered by DeepSeek Harness.`。仅当兼容性部署拥有完整系统提示词时设为 false。 | | `includeRuntimeContext` | `true` | 是否在组装中包含有序动态上下文。设为 false 时不会求值上下文提供方,并会在 waterfall 后丢弃 `system-prompt/assemble` 监听器添加的上下文;其他服务及其强制机制仍然生效。 | | `persona` | `''` | 全局部署 persona 默认值:唯一由配置提供的提示词片段,渲染为顺序为 0 的 `deployment:persona` 段,除非 agent 作用域的贡献将其遮蔽。它是模板,完整的 `{{…}}` 组会严格按已注册变量解释(随附循环注册 `{{model}}`/`{{cwd}}`),目前没有表达字面量花括号的转义语法。为空 ⇒ 渲染时删除该段。 | -| `toolOrder` | 无 | 显式指定面向模型的工具顺序。该列表由 `ToolSchema.name` 组成,并且必须恰好包含一个 `''` 其余项标记(`TOOL_ORDER_REST`):已列工具按列表位置排列,未列工具则按名称字典序插入该标记所在的位置。缺席 ⇒ 直接按名称字典序排列。该顺序会在 `system-prompt/assemble` waterfall(瀑布式事件)之前应用于已收集的工具。与段的 `order` 排序一样,它会规范化注册表贡献的内容;注册顺序只是插件加载时序的产物。修改列表的 waterfall 监听器应对其输出的确定性负责。配置错误会明确失败:列表没有恰好一个其余项或存在重复项,会在加载时抛出;已列名称没有对应已注册工具,会使每次 `assemble()` 被拒绝;工具提供方返回保留的其余项名称也会被拒绝。在随附循环下,轮次会在任何模型请求前失败。为何采用中心列表而非每插件权重,见[显式面向模型工具顺序](../../../.agents/notes/implemented/feature/2026-07-06-explicit-tool-order.md)。 | +| `toolOrder` | 无 | 显式指定面向模型的工具顺序。该列表由 `ToolSchema.name` 组成,并且必须恰好包含一个 `''` 其余项标记(`TOOL_ORDER_REST`):已列工具按列表位置排列,未列工具则按名称字典序插入该标记所在的位置。缺席 ⇒ 直接按名称字典序排列。该顺序会在 `system-prompt/assemble` waterfall(瀑布式事件)之前应用于已收集的工具。与段的 `order` 排序一样,它会规范化注册表贡献的内容;注册顺序只是插件加载时序的产物。修改列表的 waterfall 监听器对其输出的确定性负责。配置错误会明确失败:列表没有恰好一个其余项或存在重复项,会在加载时抛出;已列名称没有对应已注册工具,会使每次 `assemble()` 被拒绝;工具提供方返回保留的其余项名称也会被拒绝。在随附循环下,轮次会在任何模型请求前失败。为何采用中心列表而非每插件权重,见[显式面向模型工具顺序](../../../.agents/notes/implemented/feature/2026-07-06-explicit-tool-order.md)。 | ## 服务:`SystemPrompt`(ctx 键:`systemPrompt`) @@ -35,7 +35,7 @@ - `AssembleContext`:说明一次 `assemble()` 调用的用途。它可通过合并扩展;此处声明 `scope?: ScopeKey`(层选择器)与 `signal?: AbortSignal`(显式请求控制能力),而 `dsh-agent` 声明 `agent?: Agent`(类型化 DX 字段;绝不能在没有 `scope` 时设置,应使用 `assembleContextFor(agent, signal)`)。提供方必须容忍字段缺席,因为裸 `assemble()` 携带的是无作用域、无信号的空上下文。`signal` 是请求值,不是环境 Agent 执行 frame 的一部分。 - `PromptSection`:`{ name, order, text, complete? }`。各段按 `order` 升序拼接。顺序区间:`-100` 是 harness 身份,`0` 是部署 persona,工具引导使用 `100–199`。协作式组装完成后,一个有效的 `complete` 段会抑制其他所有段。 - `PromptAssembly`:`{ sections: AssembledSection[], tools: ToolSchema[], variables: Record }`。各段文本到达时已求值,但尚未插值;`variables` 保存所有已注册变量在当前上下文中求得的值。工具 schema 按设计属于组装结果:「模型获知自己能做什么」是一个连贯整体,尽管适配器把 schema 作为独立 wire 字段传输。 -- `renderPrompt(assembly)`:插值每个段中的 `{{variable}}` 引用,删除空段,并用空行连接。严格规则:未知引用(使用 `Object.hasOwn` 查找,因此 `{{constructor}}` 等原型名称未知)、已注册但无值的引用、格式错误的完整 `{{…}}` 组,或出现 `{{` 却没有形成完整的 `{{…}}` 组、而后文仍有 `}}`(`{{{model}}}`),都会抛出异常;明确失败胜过交付格式错误的提示词。孤立的 `{{` 如果后面任何位置都没有 `}}`,会按字面量通过;替换值绝不再次扫描。 +- `renderPrompt(assembly)`:插值每个段中的 `{{variable}}` 引用,删除空段,并用空行连接。严格规则:未知引用(使用 `Object.hasOwn` 查找,因此 `{{constructor}}` 等原型名称未知)、已注册但无值的引用、格式错误的完整 `{{…}}` 组,或出现 `{{` 却没有形成完整组、而后文仍有 `}}`(`{{{model}}}`),都会抛出异常;明确失败胜过交付格式错误的提示词。孤立的 `{{` 如果后面任何位置都没有 `}}`,会按字面量通过;替换值绝不再次扫描。 可通过合并扩展:插件可以借助声明合并,为 `PromptAssembly` 和 `AssembleContext` 声明额外字段。 @@ -54,7 +54,7 @@ #### 模型看到的内容 -默认情况下,每次组装都从下方 harness 身份开始,然后在严格变量插值后追加已配置 persona 与有序插件段。`includeHarnessIdentity: false` 仅省略这个固定开场白。空段会消失;带作用域的段和变量可以为一个 agent 遮蔽全局项。`system-prompt/assemble` waterfall 决定交付的提示词与工具 schema,除非一个有效段声明自身为 complete;此时,该确切段会成为完整的系统提示词,而 waterfall 得到的上下文、工具和变量保持不变。有序动态上下文与系统提示词段落分离,只在存在时才会成为带来源的 user 角色快照。`includeRuntimeContext: false` 或带作用域的抑制器会移除所有这类上下文,包括监听器添加的内容,但不会禁用拥有底层策略或状态的服务。 +默认情况下,每次组装都从下方 harness 身份开始,然后在严格变量插值后追加已配置 persona 与有序插件段。`includeHarnessIdentity: false` 仅省略这个固定开场白。空段会消失;带作用域的段和变量可以为一个 agent 遮蔽全局项。`system-prompt/assemble` waterfall 决定交付的提示词与工具 schema,除非一个有效段声明自身为 complete;此时,该确切段会成为完整的系统提示词,而 waterfall 得到的上下文、工具和变量保持不变。有序动态上下文与系统提示词段分离,只在存在时才会成为带来源的 user 角色快照。`includeRuntimeContext: false` 或带作用域的抑制器会移除所有这类上下文,包括监听器添加的内容,但不会禁用拥有底层策略或状态的服务。 ##### harness 身份 diff --git a/packages/llm/llm/README.i18n.yaml b/packages/llm/llm/README.i18n.yaml index e417c7d887..07702ff54a 100644 --- a/packages/llm/llm/README.i18n.yaml +++ b/packages/llm/llm/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/llm/llm/README.md README.md: 2cae9a05a58295b06d25382729a3304dbdc9a6fa -README.zh.md: afcf6d929608a010e7d45afd84222c43cf4d91d4 +README.zh.md: a9c4f2908fb3047238f337ab93490ddd4ffc8d63 diff --git a/packages/llm/llm/README.zh.md b/packages/llm/llm/README.zh.md index afcf6d9296..a9c4f2908f 100644 --- a/packages/llm/llm/README.zh.md +++ b/packages/llm/llm/README.zh.md @@ -13,13 +13,13 @@ - `ctx.llm.registerAdapter(providers: string[], adapter: LlmAdapter): AdapterRegistrationHandle` 为给定提供方路由注册一个适配器实例。注册要么全部成功,要么全部不生效,并且会随调用 fiber 一起 dispose(资源释放)。返回的句柄还提供 `replace(providers)`:候选路由集合会在注册状态发生任何变化前完成整体验证,因此与另一适配器发生冲突时,当前路由仍保持注册并继续提供服务。替换会在一次同步操作中完成,不会出现可观察的空档。`replace([])` 合法,表示保留注册但不持有任何路由;初始注册则不得为空。 - `ctx.llm.listProviders(): LlmProviderInfo[]` 按注册顺序描述已注册提供方路由。 - `ctx.llm.registerConfigurableProviders(entries: readonly LlmConfigurableProvider[]): DirectoryRegistrationHandle` 声明适配器插件可通过配置激活的提供方路由——无论已注册还是休眠——每个条目指明其所属 settings namespace,以及 profile 在该分节内的路径。要么全部成功,要么全部不生效(`INVALID_DIRECTORY`/`DUPLICATE_DIRECTORY`),并随调用 fiber dispose。该句柄还带 `replace(entries)`:候选集合会先被整体校验,因此其中若有条目已被另一个注册声明,当前集合原封不动;此处允许传空数组。声明集合随配置变化的插件必须使用 `replace`,而不是先 dispose 再重新注册——后者会在新集合被拒时让目录整个落空。 -- `ctx.llm.listConfigurableProviders(): LlmConfigurableProvider[]` 按声明顺序列出可配置提供方目录;配置界面将其与 `listProviders()` 合并,为每个条目标注存活或休眠。条目可携带 `declared`,表示负责该路由的适配器是否只因配置点名才知道它。`declared` 缺失时,只表示该适配器不区分这两种来源,不能据此判断路由是否随产品交付。 -- `ctx.llm.registerModelDiscovery(settingsNs: string, discover): () => void` 为本插件负责的 settings namespace 提供查询提供方端点的能力。每个 namespace 只能有一个(`INVALID_DISCOVERY`/`DUPLICATE_DISCOVERY`),并随调用 fiber dispose。 +- `ctx.llm.listConfigurableProviders(): LlmConfigurableProvider[]` 按声明顺序列出可配置提供方目录;配置界面将其与 `listProviders()` 合并,为每个条目标注存活或休眠。条目可携带 `declared`,表示拥有该路由的适配器是否只因配置点名才知道它。该字段缺失时,只表示该适配器不区分这两种来源,不能据此判断路由是否随产品交付。 +- `ctx.llm.registerModelDiscovery(settingsNs: string, discover): () => void` 为本插件拥有的 settings namespace 提供查询提供方端点的能力。每个 namespace 只能有一个(`INVALID_DISCOVERY`/`DUPLICATE_DISCOVERY`),并随调用 fiber dispose。 - `ctx.llm.listModelDiscoveryNamespaces(): string[]` 列出可以询问端点的 namespace,让界面只在可用之处提供该动作。 - `ctx.llm.discoverModels(settingsNs: string, request: LlmModelDiscoveryRequest): Promise` 询问某个端点它公布了哪些模型。 -- `ctx.llm.providerRetryPolicy(provider: string): ResolvedRetryPolicy` 返回注册时捕获的提供方自身的重试策略,并解析 `normal` 默认值。 +- `ctx.llm.providerRetryPolicy(provider: string): ResolvedRetryPolicy` 返回注册时捕获的提供方自身的重试策略,并解析 normal 默认值。 - `ctx.llm.listModels(provider: string): Promise` 发现某个已注册提供方当前公布的模型。 -- `ctx.llm.resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise` 从负责该精确路由的适配器中,解析并校验确切模型身份,以及可用上下文、输出默认值和推理(reasoning)元数据;异步适配器可选地支持取消。 +- `ctx.llm.resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise` 从拥有该精确路由的适配器中,解析并校验确切模型身份,以及可用上下文、输出默认值和推理(reasoning)元数据;异步适配器可选地支持取消。 - `ctx.llm.resolveCallConfig(config: LlmCallConfig, signal?: AbortSignal): Promise` 校验显式推理强度,并填入适配器配置的调用默认值,但不自动调整。 - `ctx.llm.prepareCall(config: LlmCallConfig, signal?: AbortSignal): Promise` 在一次精确模型查询中解析配置、脱耦的上下文元数据以及标明哪些字段由适配器默认值填入的标记,再将当前适配器注册和不可变重试策略捕获为一次可取消、一次性调用。 - `ctx.llm.stream(options: GenerateOptions): AsyncIterable` 将一次模型调用流式输出为原始分片(token 级增量)。消费方使用 `BlockAssembler` 将分片组装为块/消息。 @@ -28,13 +28,13 @@ 询问端点属于配置期针对**草稿**的操作,以 settings namespace 而非提供方路由为键——界面正在新增的提供方还不存在,也就没有路由可点名。但请求仍可**点名**它正在编辑的路由,而已经描述该路由的适配器会用自己的知识作答,无需联网;路由名称和 `baseURL` 至少需要提供一项。除此之外,请求携带端点、协议,以及一条 harness 只用于这一次询问、绝不存储的凭据。这里既不读取也不写入 settings 或 credentials;返回内容是界面可以提供给用户采纳的候选元数据,而不是已注册的 catalog。`LlmDiscoveredModel` 除 `id` 外每个字段都是可选的,因为大多数提供方列表只公布 id;采纳其中一条的界面仍要补上其适配器所需的容量。重复与不可用的 id 会被丢弃,无人服务的 namespace 以 `NO_DISCOVERY` 失败,既不点名路由也不给端点的请求以 `INVALID_DISCOVERY` 失败。 -提供方和模型元数据用于发现,不构成路由白名单。`registerAdapter()` 仍负责保证提供方路由的排他注册,并为每条路由捕获适配器的重试策略;适配器可以接受未出现在 `listModels()` 中的模型 id,消费方不得仅因模型未列出而拒绝请求。返回的 selector 元数据已分离;无效或重复的适配器条目会以 `INVALID_ADAPTER` 或 `INVALID_CATALOG` 失败。 +提供方和模型元数据用于发现,不构成路由白名单。`registerAdapter()` 仍拥有提供方路由的排他性,并为每条路由捕获适配器的重试策略;适配器可以接受未出现在 `listModels()` 中的模型 id,消费方不得仅因模型未列出而拒绝请求。返回的 selector 元数据已分离;无效或重复的适配器条目会以 `INVALID_ADAPTER` 或 `INVALID_CATALOG` 失败。 每个拓扑提交点——适配器路由注册或 dispose、目录条目出现或撤回——都会在变更之后发出无载荷的 `llm/adapters-updated` 事件,消费方因此会重新读取 `listProviders()`/`listModels()`/`listConfigurableProviders()`,而不是轮询。观察者故障会被记录并隔离,不能否决变更;只有带 `INVARIANT` 码的故障会在通知完所有观察者后重新抛出。 确切模型元数据是独立的正确性查询,不是 catalog 装饰或全局 LLM 设置。`resolveModelInfo()` 会向拥有精确提供方/模型路由的适配器查询一次;适配器可以描述未列出的动态模型。缺少 `context` 表示模型容量未知;缺少 `defaultMaxTokens` 表示继续沿用提供方自身的输出默认值;缺少 `reasoning` 则表示推理能力不可用。无效的身份、上下文、输出默认值或推理元数据会以 `INVALID_MODEL_INFO`、`INVALID_MODEL_CONTEXT`、`INVALID_MODEL_MAX_TOKENS` 或 `INVALID_MODEL_REASONING` 失败。 -`defaultMaxTokens` 是适配器配置的单次请求输出上限,不是模型硬上限。仅当请求省略 `maxTokens` 时,`resolveCallConfig()` 才会填入该值;显式上限优先。推理标识符是由适配器定义的不透明字符串,而非核心枚举:同一次解析只接受与已公布标识符完全一致的值,在存在 `defaultEffort` 时填入它,否则保留提供方默认值。异步模型解析器会接收调用方的 `signal`,并且必须在取消后尽快结算。`prepareCall()` 还会返回同一次查询得到的、与适配器内部状态分离的上下文元数据,通过 `adapterDefaults` 标明填入了哪些 `maxTokens` 和 `reasoningEffort` 字段,并在请求头记录和最终分发期间始终保留同一项精确的适配器注册。因此,HMR(热模块替换)不会把一个适配器的能力结果与另一个适配器的请求混用;复用其一次性句柄或更改调用配置字段会以 `INVALID_PREPARED_CALL` 失败。不支持的显式或配置推理强度会在提供方 I/O 前以 `UNSUPPORTED_REASONING_EFFORT` 失败。 +`defaultMaxTokens` 是适配器配置的单次请求输出上限,不是模型硬上限。仅当请求省略 `maxTokens` 时,`resolveCallConfig()` 才会填入该值;显式上限优先。推理标识符是由适配器定义的不透明字符串,而非核心枚举:同一次解析只接受与已公布标识符完全一致的值,在存在 `defaultEffort` 时填入它,否则保留提供方默认值。异步模型解析器会接收调用方信号,并且必须在取消后尽快结算。`prepareCall()` 还会返回同一次查询得到的、与适配器内部状态分离的上下文元数据,通过 `adapterDefaults` 标明填入了哪些 `maxTokens` 和 `reasoningEffort` 字段,并在请求头记录和最终分发期间始终保留同一项精确的适配器注册。因此,HMR(热模块替换)不会把一个适配器的能力结果与另一个适配器的请求混用;复用其一次性句柄或更改调用配置字段会以 `INVALID_PREPARED_CALL` 失败。不支持的显式或配置推理强度会在提供方 I/O 前以 `UNSUPPORTED_REASONING_EFFORT` 失败。 ### 事件 @@ -73,7 +73,7 @@ - `BlockAssembler`:将原始分片逐步组装为完整内容块,并能据此创建带标识且冻结的 assistant 消息。agent loop 向它提供原始分片(同时记录以供回放),并读取已组装块以构建历史。 - `HarnessError`:harness 错误分类体系的基类,包含稳定 `code` 字符串(与面向人的 `message` 不同)以及 `cause` 链。它位于所有其他包都从中导入的叶子包中,因此可以共享单一基类,无需新的依赖边。各包的错误(`LlmError`、`ToolArgsError`、`InvariantError` 等)都继承自它。`isHarnessError(value)` 在进程边界处收窄类型。 - `LlmError`:继承自 `HarnessError`;其稳定 `code` 字符串(`NO_ADAPTER`、`DUPLICATE_ADAPTER` 与 `AUTH`/`RATE_LIMIT` 等适配器 code)与冻结可序列化 `failure.code` 匹配。Payload 还可以保留已验证状态、`Retry-After` 和品牌化提供方请求 id 事实;策略位于错误之外。 -- `errorChain(value)`:渲染抛出值的完整 `cause` 链与 AggregateError 成员,供诊断输出使用,包括 UI 通知、logger 行和持久 `turn/end` 消息。因此 undici 的 `TypeError: fetch failed` 等传输包装层会显示底层 `ECONNREFUSED`/DNS/TLS 详细信息,而不是将其遮蔽。`errorChain(value)` 只负责生成诊断文本。调用方必须依据稳定的 `code` 选择错误处理路径,绝不能通过解析渲染后的文本作出判断。 +- `errorChain(value)`:渲染抛出值的完整 `cause` 链与 AggregateError 成员,供诊断输出使用,包括 UI 通知、logger 行和持久 `turn/end` 消息。因此 undici 的 `TypeError: fetch failed` 等传输包装层会显示底层 `ECONNREFUSED`/DNS/TLS 详细信息,而不是将其遮蔽。该函数只负责生成诊断文本。调用方必须依据稳定的 `code` 选择错误处理路径,绝不能通过解析渲染后的文本作出判断。 - `CONTEXT_WINDOW_EXCEEDED_CODE`:当请求超过模型上下文窗口时,无论通过 HTTP 异常抛出还是带内 finish 交付,两个 DeepSeek 适配器都使用的提供方无关 code。`isContextWindowExceededError(detail)` 是它们针对 OpenAI 兼容提供方详细信息的共享保守分类器。 - `QUOTA_EXCEEDED_CODE`:帐户配额、余额、点数、预算或用量限制耗尽时使用的非暂时性提供方无关 code。`isQuotaExceededError(detail)` 使这些失败与请求速率限制保持区分。 - `EMPTY_RESPONSE_CODE`:两个适配器都使用的提供方无关 code,用于表示退化的提供方生成结果:一个未携带任何内容块的终止 `stop`。它会被分类为错误 finish(而非成功空消息),因为尝试未产生持久内容;`dsh-llm-retry` 默认重试它。 diff --git a/packages/subagent/subagent/README.i18n.yaml b/packages/subagent/subagent/README.i18n.yaml index 8ab47d1322..d7acd85d6b 100644 --- a/packages/subagent/subagent/README.i18n.yaml +++ b/packages/subagent/subagent/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent/README.md README.md: ed4a9123a2dfa5b2fa5abc67f4513547feb3d140 -README.zh.md: 1bb44b1c5c55400bb26c4c248eea76039f6296d3 +README.zh.md: 9c08dcb84619e4ecd0282d4d113e3f3952a6a103 diff --git a/packages/subagent/subagent/README.zh.md b/packages/subagent/subagent/README.zh.md index 1bb44b1c5c..9c08dcb846 100644 --- a/packages/subagent/subagent/README.zh.md +++ b/packages/subagent/subagent/README.zh.md @@ -58,7 +58,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 ## 委派策略 -两条进程内委派路径都会通过共享的子 agent 辅助函数,在委派边界固定子 agent 的权限范围。`captureDelegatedPolicyOverrides(parent)` 会为父会话的显式沙箱覆盖项(`sandboxPolicy.overrideOf()`)创建快照,并在审批能力已组合时将子 agent 的审批策略固定为 `'never'`,无论父级自身采用何种策略。这样,被委派的子 agent 只能在继承的沙箱范围内行动,每次审批请求(例如 `sandbox_permissions` 升权)都会被确定性拒绝,而不会等待无人处理的提示(这两个服务都是可选的 `ctx.get` 消费方)。`appendDelegatedPolicyOverrides()` 则在未发布的设置阶段、在任何 fork 种子之后,把每个值作为一条 `source: 'delegation'` 的 `sandbox/mode` 或 `approval/policy` 事件写入子 agent 自己的日志。因此,新捕获的策略会覆盖种子中的陈旧状态,而子 agent 的生效策略始终可以仅凭其日志重建。沙箱的部署默认值绝不复制:未切换的父级不会记录 `sandbox/mode`,其子 agent 会动态跟随部署默认值。可继续启动会在第一次 `await` 前捕获策略,并且只为全新物化写入这些委派事件;冷恢复只会重放已持久化的委派事件,不会重新捕获父级策略,因此创建之后的父级切换绝不会追溯性地改变持久化子 agent。每个进程内子 agent 还会收到一条作用域内的运行时上下文声明(`subagent:delegation`),告知其权限范围已固定,需要更宽访问的任务应以上报限制收尾,而不是重试。参见[一次性](../../../.agents/notes/implemented/feature/2026-07-25-subagent-policy-inheritance.md)与[可继续](../../../.agents/notes/implemented/feature/2026-08-10-continuable-subagent-policy-inheritance.md)两篇委派策略 Agent Note。 +两条进程内委派路径都会通过共享的子 agent 辅助函数,在委派边界固定子 agent 的权限范围。`captureDelegatedPolicyOverrides(parent)` 会为父会话的显式沙箱覆盖项(`sandboxPolicy.overrideOf()`)创建快照,并在审批能力已组合时将子 agent 的审批策略固定为 `'never'`,无论父级自身采用何种策略。这样,被委派的子 agent 只能在继承的沙箱范围内行动,每次审批请求(例如 `sandbox_permissions` 升权)都会被确定性拒绝,而不会等待无人处理的提示(这两个服务都是可选的 `ctx.get` 消费方)。`appendDelegatedPolicyOverrides()` 则在未发布的设置阶段、在任何 fork 种子之后,把每个值作为一条 `source: 'delegation'` 的 `sandbox/mode` 或 `approval/policy` 事件写入子 agent 自己的日志。因此,新捕获的策略会覆盖种子中的陈旧状态,而子 agent 的生效策略始终可以仅凭其日志重建。沙箱的部署默认值绝不复制:未切换的父级不会记录 `sandbox/mode`,其子 agent 会动态跟随部署默认值。可继续启动会在第一次 await 前捕获策略,并且只为全新物化写入这些委派事件;冷恢复只会重放已持久化的委派事件,不会重新捕获父级策略,因此创建之后的父级切换绝不会追溯性地改变持久化子 agent。每个进程内子 agent 还会收到一条作用域内的运行时上下文声明(`subagent:delegation`),告知其权限范围已固定,需要更宽访问的任务应以上报限制收尾,而不是重试。参见[一次性](../../../.agents/notes/implemented/feature/2026-07-25-subagent-policy-inheritance.md)与[可继续](../../../.agents/notes/implemented/feature/2026-08-10-continuable-subagent-policy-inheritance.md)两篇委派策略 Agent Note。 ## 一次性所有权与生命周期 @@ -72,7 +72,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 每个可继续子 agent 都有一个持久化 Session,并且同一时刻至多有一个进程内 **Activation**。Activation 表示重建后的子 agent 的一次驻留时段,不是请求、结果、取消或 Task 的边界。Agent inbox 是唯一的轮次队列,因此驻留归继续执行管理器,所有轮次排序与执行归 agent loop(智能体循环)。任何可继续路径都不会创建 Task 或中间的承载结果的包装层。 -管理器根据 Agent 的完全停稳状态和所拥有的子级集合推导三种内部驻留状态,而不维护第二套状态机:`running` 表示存在正在进行的准入、尚未结束的轮次,或会唤醒 Agent 的 inbox 工作;`waiting` 表示 Agent 已完全停稳,但仍拥有至少一个尚未 dispose 的子级;`settled` 表示 Agent 已完全停稳且所有拥有的子级均已 dispose,此时管理器会 dispose `AgentHandle` 并移除 Activation。每条后续消息都使用 `Agent.followup()` 并成为一个 FIFO 轮次,且不会对当前轮次进行 steering(中途引导)。路由只取决于驻留状态:running 入队、waiting 唤醒同一 Agent,无 Activation 时则冷恢复一个新的。 +管理器根据 Agent 的完全停稳状态和所拥有的子级集合推导三种内部驻留状态,而不维护第二套状态机:running 表示存在正在进行的准入、尚未结束的轮次,或会唤醒 Agent 的 inbox 工作;waiting 表示 Agent 已完全停稳,但仍拥有至少一个尚未 dispose 的子级;settled 表示 Agent 已完全停稳且所有拥有的子级均已 dispose,此时管理器会 dispose `AgentHandle` 并移除 Activation。每条后续消息都使用 `Agent.followup()` 并成为一个 FIFO 轮次,且不会对当前轮次进行 steering(中途引导)。路由只取决于驻留状态:running 入队、waiting 唤醒同一 Agent,无 Activation 时则冷恢复一个新的。 管理器预留子 agent 身份、解析持久化描述符,通过私有的 activation-owner 作用域调用 `ctx.agents.create()`(冷恢复时为 `ctx.agents.resume()`),把返回的 `AgentHandle` 安装到 Activation 中,建立任何可继续父级所有权,然后提交提示词。冷恢复绝不通过提供方分发,因为持久化会话已持有初始前缀,折叠后的描述符即是全部重建输入。 @@ -82,13 +82,13 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 有两条顺序规则让这条投递可靠而非侥幸,它们也正是这件事属于管理器而非外部 `subagent/end` listener 的原因。第一,发送发生在子级所有权释放**之前**,此时父级仍然计入该子级,因此在结构上不可能被判定为已结算。第二,如果父级本身也是驻留 Activation,该消息会采用与 report 相同的唤醒准入记账。这样,从同步发送消息到负责准入该消息的 microtask 运行之间的窗口,不会被误判为完全停稳——`Agent.status` 会把上下文维护折叠成 `idle`,而维护期间的唤醒发送只会预置一次延后唤醒。缺少其中任一条规则,父级都可能在通知仍留在 inbox 时被 dispose,而 `cancel()` 会清空该 inbox,于是通知被静默丢失。 -空闲父级会以一个普通的后续轮次收到该通知。繁忙父级则被 steer 到其最近的 step 边界,因此同时结算的多个子级只消耗一个 step,而不是各自一个轮次;采用 steer 而非 inject 还意味着:即便驱动在状态读取与发送之间退出,该消息仍会被认领。如果父级所在的谱系已经开始排空,该通知会通过 `inject` 投递,且完全不会唤醒父级。对已经完全停稳的父级调用 `Agent.followup()` 会开启新轮次,而 `cancel()` 不会预先阻止之后开启的轮次;因此在拆卸期间唤醒父级,会让宿主即将 dispose 的 Agent 多执行一次模型请求,而且树的每一层各一次,因为每层自己的通知又会唤醒上一层。被 inject 的消息会送达仍在读取自身 inbox 的父级,而无论如何日志都会记录这份记账;但它不会比该父级自身的 dispose 活得更久:`AgentHandle.dispose()` 是一次 `keepInbox: false` 的 cancel,会持久地取消尚未被认领的通知。因此 resume 后的父级没有待处理通知可读:`list_agents` 只告诉它有哪些子级、各自是在线还是仅存于存储;结局本身留在子级自己的 Session 里,一次 `send_message` 会通过 resume 该子级把它取回。已离开注册表的父级不算错误:通知被丢弃,子级自身的 Session 仍是持久记录。投递绝不会阻塞或使拆卸失败——发送被拒只会记录日志,因为为了重试一条通知而保留子级,会把它的整条祖先链永久钉在 `waiting` 上。 +空闲父级会以一个普通的后续轮次收到该通知。繁忙父级则被 steer 到其最近的 step 边界,因此同时结算的多个子级只消耗一个 step,而不是各自一个轮次;采用 steer 而非 inject 还意味着:即便驱动在状态读取与发送之间退出,该消息仍会被认领。如果父级所在的谱系已经开始排空,该通知会通过 inject 投递,且完全不会唤醒父级。对已经完全停稳的父级调用 `Agent.followup()` 会开启新轮次,而 `cancel()` 不会预先阻止之后开启的轮次;因此在拆卸期间唤醒父级,会让宿主即将 dispose 的 Agent 多执行一次模型请求,而且树的每一层各一次,因为每层自己的通知又会唤醒上一层。被 inject 的消息会送达仍在读取自身 inbox 的父级,而无论如何日志都会记录这份记账;但它不会比该父级自身的 dispose 活得更久:`AgentHandle.dispose()` 是一次 `keepInbox: false` 的 cancel,会持久地取消尚未被认领的通知。因此 resume 后的父级没有待处理通知可读:`list_agents` 只告诉它有哪些子级、各自是在线还是仅存于存储;结局本身留在子级自己的 Session 里,一次 `send_message` 会通过 resume 该子级把它取回。已离开注册表的父级不算错误:通知被丢弃,子级自身的 Session 仍是持久记录。投递绝不会阻塞或使拆卸失败——发送被拒只会记录日志,因为为了重试一条通知而保留子级,会把它的整条祖先链永久钉在 `waiting` 上。 受继续执行管理的父级 Activation 会在子 agent 能够运行之前,把每个子 agent 的会话 id 记录到 `ownedChildren` 集合中,并且只有在每个所拥有的子 agent Activation 完成 `AgentHandle` dispose 之后才会 dispose(子先于父)。拆卸会先自顶向下传播 Agent 取消,再等待缓慢的后代,而 handle 释放仍保持 child-first。顶层及其他非继续执行的 Agent 没有 Activation,处于该等待图之外。最终结算会在 dispose handle 前等待 best-effort 的 `ctx.sessions.flush(child.session)`。监听器拒绝会被记录,但不会使 Activation 失败,因为监听器参与本身不能标识持久化后端;因此恢复时的持久化状态仍可能缺失或陈旧。 ## 生命周期事件 -服务会为每次一次性运行以及每个已驻留的可继续 Activation 时段发出一对 `subagent/start`/`subagent/end`,因此可继续子 agent 可用与一次性运行相同的词汇观察,且不会暴露管理器是物化、唤醒还是冷恢复了它们。对于一次性启动,它会在同步的 `subagent/start` 之前附加结果观察器,因此即使子 agent 已经结算,也仍会先产生 `subagent/start`,再产生 `subagent/end`;在驻留前失败的可继续时段不会发出这对生命周期事件中的任何一个。这对事件共享由服务生成的 `runId`;`local` 标志根据提供方返回的确切 `localAgent` 是否存在取得快照(可继续子级恒为 `true`),因此观察器不会根据可复用的提供方名称或会话名称推断运行身份或本地性。`provider` 字段包含子 agent 初次创建时记录的提供方名称,不表示该提供方当前仍在注册:已接受的一次性 run 可在提供方移除后才结算;冷恢复时段会从描述符读取初始提供方名称,不会调用或注册该提供方。 +服务会为每次一次性运行以及每个已驻留的可继续 Activation 时段发出一对 `subagent/start`/`subagent/end`,因此可继续子 agent 可用与一次性运行相同的词汇观察,且不会暴露管理器是物化、唤醒还是冷恢复了它们。对于一次性启动,它会在同步的 `subagent/start` 之前附加结果观察器,因此即使子 agent 已经结算,也仍会先产生 `subagent/start`,再产生 `subagent/end`;在驻留前失败的可继续时段不会发出这对生命周期事件中的任何一个。这对事件共享由服务生成的 `runId`;`local` 标志根据提供方返回的确切 `localAgent` 是否存在取得快照(可继续子级恒为 true),因此观察器不会根据可复用的提供方名称或会话名称推断运行身份或本地性。`provider` 字段包含子 agent 初次创建时记录的提供方名称,不表示该提供方当前仍在注册:已接受的一次性 run 可在提供方移除后才结算;冷恢复时段会从描述符读取初始提供方名称,不会调用或注册该提供方。 运行事件受执行委派的父级作用域约束。每个监听器都独立隔离:同步抛出或返回的 promise 被拒绝时,只会记录日志,不会阻塞同级监听器或改变运行。 From f75d785e79e0020a35e8ba714d2258687b9d62d1 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:29:28 +0800 Subject: [PATCH 064/103] fix(web): show newest sessions first by default --- apps/web/tests/snapshots/message-actions/fork.expected.md | 4 ++-- .../sidebar-subagent-activity/owner-running.expected.md | 2 +- .../tests/snapshots/subagent-conversation/fork.expected.md | 2 +- packages/client/ui-workspace/src/client/stores.ts | 2 +- packages/client/ui-workspace/tests/tree.client.spec.ts | 2 +- .../ui-workspace/tests/workspace-browser.client.spec.tsx | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/web/tests/snapshots/message-actions/fork.expected.md b/apps/web/tests/snapshots/message-actions/fork.expected.md index 2487b6c374..f7f9efb3ab 100644 --- a/apps/web/tests/snapshots/message-actions/fork.expected.md +++ b/apps/web/tests/snapshots/message-actions/fork.expected.md @@ -2,6 +2,6 @@ - treeitem "Ungrouped" [expanded]: - img - text: Ungrouped - - treeitem "Use the read tool twice 1min" - - treeitem "Use the read tool twice (1) now" - treeitem "Use the read tool twice (2) now" [selected] + - treeitem "Use the read tool twice (1) now" + - treeitem "Use the read tool twice 1min" diff --git a/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md b/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md index 62671cbb8b..7e1864ff58 100644 --- a/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md +++ b/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md @@ -2,5 +2,5 @@ - treeitem "workspace" [expanded]: - img - text: workspace - - treeitem "New Session" [selected] - treeitem "1 subagent running Delegate a background job. now" + - treeitem "New Session" [selected] diff --git a/apps/web/tests/snapshots/subagent-conversation/fork.expected.md b/apps/web/tests/snapshots/subagent-conversation/fork.expected.md index 398c3ceddd..c60eb2d064 100644 --- a/apps/web/tests/snapshots/subagent-conversation/fork.expected.md +++ b/apps/web/tests/snapshots/subagent-conversation/fork.expected.md @@ -2,5 +2,5 @@ - treeitem "workspace" [expanded]: - img - text: workspace - - treeitem "Ask a research subagent to now" - treeitem "Explain event sourcing in one (1) now" [selected] + - treeitem "Ask a research subagent to now" diff --git a/packages/client/ui-workspace/src/client/stores.ts b/packages/client/ui-workspace/src/client/stores.ts index e48b5f3f63..f085329643 100644 --- a/packages/client/ui-workspace/src/client/stores.ts +++ b/packages/client/ui-workspace/src/client/stores.ts @@ -53,7 +53,7 @@ export function createWorkspaceViewStore(): EngineStoreHandle ({ groupBy: 'workspace', - orderBy: 'manual', + orderBy: 'updated', groupExpansion: {}, sessionOrderByAccount: {}, sessionUpdatedAtByAccount: {}, diff --git a/packages/client/ui-workspace/tests/tree.client.spec.ts b/packages/client/ui-workspace/tests/tree.client.spec.ts index 1448ab9dff..f2e069de43 100644 --- a/packages/client/ui-workspace/tests/tree.client.spec.ts +++ b/packages/client/ui-workspace/tests/tree.client.spec.ts @@ -395,7 +395,7 @@ describe('createWorkspaceViewStore', () => { it('stores grouping, ordering, Workspace expansion, and recent-session view order', () => { const store = createWorkspaceViewStore().create() expect(store.getSnapshot().groupBy).toBe('workspace') - expect(store.getSnapshot().orderBy).toBe('manual') + expect(store.getSnapshot().orderBy).toBe('updated') store.actions.setGroupBy('flat') store.actions.setOrderBy('updated') store.actions.setGroupExpanded('alpha', true) diff --git a/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx b/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx index 461fecefd0..fbe42fc279 100644 --- a/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx +++ b/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx @@ -14,7 +14,7 @@ import { WorkspaceBrowser } from '../src/client/WorkspaceBrowser.tsx' import { zh } from '../src/client/locales.ts' afterEach(cleanup) -beforeEach(() => { localStorage.clear() }) +beforeEach(() => { localStorage.clear(); createWorkspaceViewStore().create().actions.setOrderBy('manual') }) // The seat's key domain is workspace ∪ common; the stub mirrors the real // lookup chain (namespace, then common vocabulary, then the key). From 93c0032216fa51ce4f225f5bda3dd615317d565e Mon Sep 17 00:00:00 2001 From: pku-xht Date: Thu, 13 Aug 2026 16:27:48 +0800 Subject: [PATCH 065/103] docs(subagent): document explicit product provider opt-in --- ...-claude-code-and-codex-subagent-backends.i18n.yaml | 4 ++-- ...6-08-04-claude-code-and-codex-subagent-backends.md | 6 +++--- ...8-04-claude-code-and-codex-subagent-backends.zh.md | 6 +++--- ...oduct-subagent-one-shot-background-tasks.i18n.yaml | 4 ++-- ...8-12-product-subagent-one-shot-background-tasks.md | 11 ++++++----- ...2-product-subagent-one-shot-background-tasks.zh.md | 11 ++++++----- apps/cli/config/agent-presets/code/agent.cordis.yml | 6 +++--- apps/cli/config/agent-presets/cordis/agent.cordis.yml | 6 +++--- .../skills/editing-cordis-compositions/SKILL.md | 2 +- .../config/agent-presets/standard/agent.cordis.yml | 6 +++--- .../subagent/subagent-claude-code/README.i18n.yaml | 4 ++-- packages/subagent/subagent-claude-code/README.md | 4 +++- packages/subagent/subagent-claude-code/README.zh.md | 4 +++- packages/subagent/subagent-codex/README.i18n.yaml | 4 ++-- packages/subagent/subagent-codex/README.md | 4 +++- packages/subagent/subagent-codex/README.zh.md | 4 +++- 16 files changed, 48 insertions(+), 38 deletions(-) diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml index f57a2824f1..48773ba819 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md -2026-08-04-claude-code-and-codex-subagent-backends.md: 5bc4081ca6cbf6418e4682cff063056037ad1d1c -2026-08-04-claude-code-and-codex-subagent-backends.zh.md: 6b9ef25c71d62e763b718e2412bc7a4554a12e0f +2026-08-04-claude-code-and-codex-subagent-backends.md: 666945c4d8039874729a7f9da34d9cf82bfd479d +2026-08-04-claude-code-and-codex-subagent-backends.zh.md: 35b8dd51f1c45200a495c68f19f055a224123263 diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md index 5bc4081ca6..666945c4d8 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md @@ -12,7 +12,7 @@ The product integrations must not become second owners for task text, cwd, cance ## Decision -The harness publishes two sibling one-shot provider packages: `codex` and `claude-code`. This note owns their product protocols, result mapping, and process lifecycle; the [shared-profile-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md) owns provider placement, and the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md) owns the model-visible scheduling choice. Loading either provider starts no product process, and each tool accepts only a standalone text task; product selection remains deployment configuration. +The harness publishes two sibling one-shot provider packages: `codex` and `claude-code`. This note owns their product protocols, result mapping, and process lifecycle; the [production-install exclusion decision](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md) owns their explicit Profile installation and host-plane placement, and the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md) owns the model-visible scheduling choice. Loading either provider starts no product process, and each tool accepts only a standalone text task; product selection remains deployment configuration. Both providers report `inheritsParentContext: false`, advertise no optional start capabilities, and pass the parent Session cwd without copying the parent conversation. Their documented tools use `backgroundMode: 'one-shot'` and `maxDepth: 'provider-managed'`: the consumer keeps foreground collection as the default and may place the same run in the generic Job runtime, while recursion policy stays with the out-of-process product. Every call creates a fresh product process and a non-resumable product conversation. `ctx.subagents` owns named-request resolution and paired lifecycle events; `dsh-tool-subagent` owns model-visible scheduling and foreground-versus-Job adaptation; `ctx.jobs` and `dsh-tool-jobs` own Job ids, state, output, controls, notices, and parent-owner cancellation; each product provider owns native result mapping, while `dsh-subprocess` owns credential scrubbing, process-tree termination, and whole-tree exit observation. @@ -60,7 +60,7 @@ The credentialed Claude Code e2e uses the official DeepSeek Claude Code contract ## Distribution and evidence -Each product owns branch-complete package tests, a required keyless real-product spec, a Loader composition e2e, and a credentialed DeepSeek e2e. The keyless product tier uses the exact official distribution under test, a non-empty fake product key, an isolated temporary workspace and product home, and a loopback fixed-answer model. Missing product requests, wrong authentication, altered task text, a non-exact answer, a skipped real product, or a surviving managed handle fails the required test. The Loader tier boots the README-shaped user configuration, verifies both fixed one-shot tools expose optional background scheduling alongside generic task controls, and starts neither product process. The credentialed tier starts the same production provider and real product with a runtime-only key, requires a unique nonce from the fixed official DeepSeek service, and proves quiescence again; it self-skips only when a local operator supplied no key, while trusted CI preflights the secret. +Each product owns branch-complete package tests, a required keyless real-product spec, a Loader composition e2e, and a credentialed DeepSeek e2e. The keyless product tier uses the exact official distribution under test, a non-empty fake product key, an isolated temporary workspace and product home, and a loopback fixed-answer model. Missing product requests, wrong authentication, altered task text, a non-exact answer, a skipped real product, or a surviving managed handle fails the required test. The Loader tier boots the README-shaped explicit Profile configuration, verifies both fixed one-shot tools expose optional background scheduling alongside generic Job controls, and starts neither product process. The credentialed tier starts the same production provider and real product with a runtime-only key, requires a unique nonce from the fixed official DeepSeek service, and proves quiescence again; it self-skips only when a local operator supplied no key, while trusted CI preflights the secret. The Codex evidence pins `@openai/codex@0.147.0` and `codex-cli 0.147.0`. Its real-product spec observes the exact Bearer key, original task, byte-exact final answer, unattended command rejection with no file side effect, local cancellation, and whole-tree exit. Production still supplies `codex` on `PATH`. @@ -88,7 +88,7 @@ The project owner's distribution authorization is scoped to the official `@anthr ## Consequences -Users delegate through two stable one-shot tools backed by the official product integrations. Their Profile placement and per-Preset exposure are owned by the [shared-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md), and their foreground-default optional Job scheduling is owned by the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md). This note's provider lifecycle keeps native settings and behavior while shared services retain the sole ownership of job settlement and process-tree quiescence. +Users delegate through two stable one-shot tools backed by the official product integrations. Explicit Profile installation and host-plane provider placement are owned by the [production-install exclusion decision](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md); per-Preset tool exposure and foreground-default optional Job scheduling are owned by the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md). This note's provider lifecycle keeps native settings and behavior while shared services retain the sole ownership of job settlement and process-tree quiescence. Every delegation pays for a fresh product process and independent model context. The product payload reaching the parent is final text only; background scheduling additionally exposes generic Job ids, status, completion notices, and collection or cancellation results. Product-native configuration makes behavior depend on the deployment's installed product, account state, and workspace settings. Credentialed e2e runs also spend external API quota and depend on the official DeepSeek endpoint; deterministic protocol, failure, cancellation, and approval coverage remains in the keyless tier. The providers do not resume sessions, stream progress, accept new human interaction, roll back tool or file side effects, or impose a wall-clock timeout. diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md index 6b9ef25c71..35b8dd51f1 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md @@ -12,7 +12,7 @@ Status: implemented ## 决策 -harness 交付两个同级的一次性提供方包:`codex` 与 `claude-code`。本说明负责它们的产品协议、结果映射和进程生命周期;[共享 profile 宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)负责提供方位置,[产品一次性后台任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责模型可见的调度选择。加载任一提供方都不会启动产品进程,而且每个工具只接受独立文本任务;产品选择仍属于部署配置。 +harness 交付两个同级的一次性提供方包:`codex` 与 `claude-code`。本说明负责它们的产品协议、结果映射和进程生命周期;[生产安装排除决策](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md)负责显式 Profile 安装与 host plane(宿主平面)放置,[产品一次性后台任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责模型可见的调度选择。加载任一提供方都不会启动产品进程,而且每个工具只接受独立文本任务;产品选择仍属于部署配置。 这两个提供方都报告 `inheritsParentContext: false`,不声明任何可选的启动能力,并传递父会话 cwd,但不会复制父级对话。文档所示的工具使用 `backgroundMode: 'one-shot'` 与 `maxDepth: 'provider-managed'`:消费方默认在前台收集结果,也可把同一次运行放入通用 Job 运行时,而递归策略仍由进程外产品负责。每次调用都会创建一个全新的产品进程和一次不可续接的产品对话。`ctx.subagents` 负责具名请求解析与成对生命周期事件;`dsh-tool-subagent` 负责模型可见的调度以及前台与 Job 适配;`ctx.jobs` 和 `dsh-tool-jobs` 负责 Job id、状态、输出、控制、通知与父级 owner 取消;各产品提供方负责原生结果映射,`dsh-subprocess` 则负责凭证清洗、进程树终止以及整棵进程树的退出观测。 @@ -60,7 +60,7 @@ Codex 0.147.0 使用 Responses 协议,而 DeepSeek 的公开 OpenAI 兼容端 ## 分发与证据 -每个产品都负责覆盖所有分支的包测试、一项必跑的无密钥真实产品测试、一项 Loader 组合 e2e 和一项带密钥 DeepSeek e2e。无密钥产品层级使用被测的确切官方发行版、非空的伪产品密钥、隔离的临时工作区与产品主目录,以及能返回固定答案的回环模型。产品请求缺失、身份验证错误、任务文本被改动、答案不完全一致、真实产品被跳过或受管句柄仍存活,都会使这项必跑测试失败。Loader 层级会启动 README 所示形态的用户配置,在同一个上下文中验证两个固定一次性工具会与通用任务控制工具一起公开可选后台调度,而且不会启动任何产品进程。带密钥层级会使用仅在运行时提供的密钥启动同一生产提供方与真实产品,要求从固定的 DeepSeek 官方服务取得唯一随机数,并再次证明完全停稳;仅当本地操作者未提供密钥时才会自行跳过,而受信任的 CI 会预检该 secret。 +每个产品都负责覆盖所有分支的包测试、一项必跑的无密钥真实产品测试、一项 Loader 组合 e2e 和一项带密钥 DeepSeek e2e。无密钥产品层级使用被测的确切官方发行版、非空的伪产品密钥、隔离的临时工作区与产品主目录,以及能返回固定答案的回环模型。产品请求缺失、身份验证错误、任务文本被改动、答案不完全一致、真实产品被跳过或受管句柄仍存活,都会使这项必跑测试失败。Loader 层级会启动 README 所示的显式 Profile 配置,在同一个上下文中验证两个固定一次性工具会与通用 Job 控制工具一起公开可选后台调度,而且不会启动任何产品进程。带密钥层级会使用仅在运行时提供的密钥启动同一生产提供方与真实产品,要求从固定的 DeepSeek 官方服务取得唯一随机数,并再次证明完全停稳;仅当本地操作者未提供密钥时才会自行跳过,而受信任的 CI 会预检该 secret。 Codex 证据锁定 `@openai/codex@0.147.0` 与 `codex-cli 0.147.0`。其真实产品测试会观测确切的 Bearer 密钥、原始任务、逐字节完全一致的最终回答、不会产生文件副作用的无人值守命令拒绝、本地取消以及整棵进程树退出。生产环境仍提供 `codex`,并通过 `PATH` 解析。 @@ -88,7 +88,7 @@ Claude Code 证据锁定 Agent SDK 0.3.220,并使用 SDK 按平台分发的 Cl ## 后果 -用户通过官方产品集成支持的两个稳定一次性工具进行委派。它们在 Profile 中的归属和按 Preset 暴露方式由[共享宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)负责,默认前台且可选通用 Job 的调度方式由[产品一次性后台任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责。本说明规定的提供方生命周期会保留原生设置与行为,而共享服务继续独占作业结算与进程树完全停稳的责任。 +用户通过官方产品集成支持的两个稳定一次性工具进行委派。显式 Profile 安装与 host plane 提供方放置由[生产安装排除决策](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md)负责;按 Preset 暴露工具以及默认前台且可选通用 Job 的调度方式由[产品一次性后台任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责。本说明规定的提供方生命周期会保留原生设置与行为,而共享服务继续独占作业结算与进程树完全停稳的责任。 每次委派都要承担新建产品进程和独立模型上下文的开销。到达父级的产品载荷仍只有最终文本;后台调度还会额外公开通用 Job id、状态、完成通知以及收集或取消结果。产品原生配置使行为取决于部署环境中安装的产品、账户状态和工作区设置。带密钥 e2e 运行还会消耗外部 API 配额,并依赖 DeepSeek 官方端点;对协议、失败、取消与审批的确定性覆盖仍由无密钥层级承担。提供方不会恢复会话、以流式方式传送进度、接受新的人工交互、回滚工具或文件副作用,也不会施加按实际经过时间触发的超时。 diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml index c698a5a68f..2310e148a0 100644 --- a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md -2026-08-12-product-subagent-one-shot-background-tasks.md: af0079463ef36f0d203d024a5a10ee4338df0efd -2026-08-12-product-subagent-one-shot-background-tasks.zh.md: 9b800e6d0574da397ee08ee3c20450987eedae74 +2026-08-12-product-subagent-one-shot-background-tasks.md: b8865cf94852396c32dd6da996bc9f5c2c7d806b +2026-08-12-product-subagent-one-shot-background-tasks.zh.md: bbc18ebb6cf0de1b04f0c2a10ddf51cea282c24e diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md index af0079463e..b8865cf948 100644 --- a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md @@ -12,7 +12,7 @@ Exposing background execution must not add a product session, product-specific j ## Decision -The `standard`, `code`, and `cordis` Agent Presets configure the dormant `subagent_codex` and `subagent_claude_code` rows with `backgroundMode: one-shot`. Removing a row's `disabled` field exposes the existing optional `run_in_background` argument. Omission or `false` waits in the foreground; explicit `true` returns a parent-owned Job id after synchronous Job preflight and registration, without waiting for provider startup or completion. +Production `dsh` does not install the optional product providers. A Profile that opts in installs and mounts `dsh-subagent-codex`, `dsh-subagent-claude-code`, or both once on the host plane. The `standard`, `code`, and `cordis` Agent Presets configure the corresponding dormant tool rows with `backgroundMode: one-shot`; removing a row's `disabled` field exposes the existing optional `run_in_background` argument to agents composed from that preset. Omission or `false` waits in the foreground; explicit `true` returns a parent-owned Job id after synchronous Job preflight and registration, without waiting for provider startup or completion. The [generic one-shot background adapter](2026-07-08-background-subagent-tasks.md) owns background registration and settlement. It starts the same [`SubagentRun`](2026-06-21-subagent-capability-seam.md), uses a Job-owned cancellation signal across provider startup and execution, waits for `run.result` and `run.dispose()`, maps the terminal result into the Job, and lets `job_output`, `job_list`, `job_kill`, and the existing completion notice expose that state. The [product provider decision](2026-08-04-claude-code-and-codex-subagent-backends.md) continues to own native protocols, answer selection, local cancellation, and process-tree quiescence. @@ -33,6 +33,7 @@ product tool call | Fact or resource | Owner | Product-tool responsibility | Observable result | | --- | --- | --- | --- | +| Product provider installation and registration | Explicit Profile | Install the optional provider package and mount it once on the host plane | The provider name is available without adding its package to every production `dsh` install | | Product selection and exposure | Agent Preset | Bind one fixed tool name to one fixed provider | Enabling one row exposes only that product tool | | Foreground or background choice | `dsh-tool-subagent` | Resolve `run_in_background` under `one-shot` policy | Omission is foreground; explicit `true` returns a Job id | | Job id, state, output, cancellation, and notice | `ctx.jobs` and `dsh-tool-jobs` | Register and present the existing one-shot run | Generic job tools collect or stop the run for the exact parent | @@ -40,15 +41,15 @@ product tool call ## Published composition -Full profiles keep both product providers on the host and keep both product-tool rows disabled in each full preset. The host job registry is shared across sessions, while each preset contributes the generic job controls to its own agent scope. A user copies a preset and removes `disabled` from either or both product rows; no product process starts during composition. +The production base keeps both optional product providers out of its dependency closure. An opting-in Profile installs and mounts either or both providers once on the host plane. Each full preset keeps both product-tool rows disabled and contributes the generic Job controls to its own agent scope, while the base host owns the shared Job registry. A user copies a preset and removes `disabled` from the matching product rows after the Profile provider is present; no product process starts during composition. -A custom composition that enables one-shot background execution must provide the complete generic Job capability: `dsh-jobs-local` as the provider and `dsh-tool-jobs` as the model-facing consumer. A product tool without that runtime can still execute in the foreground, but an explicit background request fails the existing Job preflight instead of publishing an uncollectable id. +A standalone custom composition that enables one-shot background execution must provide the product provider plus the complete generic Job capability: `dsh-jobs-local` as the Job provider and `dsh-tool-jobs` as the model-facing consumer. A Profile based on `dsh-base` already has the Job capability and adds only the optional product provider before enabling the preset tool row. A product tool without the Job runtime can still execute in the foreground, but an explicit background request fails the existing Job preflight instead of publishing an uncollectable id. The ACP product compositions use the same fixed product rows and generic job controls. Their keyless schema snapshots expose `description`, `prompt`, and optional `run_in_background` for each enabled product tool without invoking Codex, Claude Code, or an external model. ## Verification -The shipped Web composition boots four user-preset variants—neither product, Codex, Claude Code, and both—and checks that each enabled product tool exposes `run_in_background` alongside `job_output`, `job_list`, and `job_kill`. The two package-owned Loader compositions run with an empty `PATH`, inspect the same schemas and controls, and prove that loading the providers starts no product process. ACP keyless snapshots pin the assembled product schemas, while the existing `dsh-tool-subagent` and job suites pin foreground defaulting, Job registration, final-output collection, cancellation, completion notices, owner disposal, and provider disposal. +The Web composition test explicitly mounts both optional providers from the repository examples dependency anchor, then boots four user-preset variants—neither product, Codex, Claude Code, and both—and checks that each enabled product tool exposes `run_in_background` alongside `job_output`, `job_list`, and `job_kill`. The two package-owned Loader compositions run with an empty `PATH`, inspect the same schemas and controls, and prove that explicit provider loading starts no product process. ACP keyless snapshots pin the assembled explicit product schemas, while the existing `dsh-tool-subagent` and job suites pin foreground defaulting, Job registration, final-output collection, cancellation, completion notices, owner disposal, and provider disposal. ## Alternatives considered @@ -66,4 +67,4 @@ The shipped Web composition boots four user-preset variants—neither product, C Agents can continue useful work while Codex or Claude Code handles an independent one-shot task, then collect the final answer or cancel it through the same Job controls used by other background producers. Foreground callers retain their existing result and error behavior. -Every product delegation still starts a fresh native process or query, produces final text as its only product payload, and ends with provider disposal and whole-tree exit. A background call additionally exposes the generic Job id, status, completion notice, and collection or cancellation results. Background Jobs are process-local and parent-owned: they do not survive parent disposal, do not expose intermediate product activity, and do not make a product conversation resumable. Custom compositions that expose the background argument must also keep the generic Job provider and controls available. +Every product delegation still starts a fresh native process or query, produces final text as its only product payload, and ends with provider disposal and whole-tree exit. A background call additionally exposes the generic Job id, status, completion notice, and collection or cancellation results. Background Jobs are process-local and parent-owned: they do not survive parent disposal, do not expose intermediate product activity, and do not make a product conversation resumable. Production installs do not pay for either product integration unless a Profile explicitly installs it; any composition that exposes the background argument must also keep the generic Job provider and controls available. diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md index 9b800e6d05..bbc18ebb6c 100644 --- a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md @@ -12,7 +12,7 @@ Codex 与 Claude Code 提供方已经能够运行一项自包含任务并返回 ## 决策 -`standard`、`code` 与 `cordis` Agent Preset 使用 `backgroundMode: one-shot` 配置休眠的 `subagent_codex` 与 `subagent_claude_code` 行。删除某一行的 `disabled` 字段后,现有可选参数 `run_in_background` 就会公开。省略该参数或传入 `false` 时会在前台等待;显式传入 `true` 时会在同步完成 Job 预检与登记后返回由父级拥有的 Job id,而不会等待提供方启动或完成。 +生产 `dsh` 不安装可选产品提供方。选择启用产品集成的 Profile 会安装 `dsh-subagent-codex`、`dsh-subagent-claude-code` 或两者,并在 host plane(宿主平面)各挂载一次。`standard`、`code` 与 `cordis` Agent Preset 使用 `backgroundMode: one-shot` 配置相应的休眠工具行;删除某一行的 `disabled` 字段后,现有可选参数 `run_in_background` 会向由该 preset 组装的 agent 公开。省略该参数或传入 `false` 时会在前台等待;显式传入 `true` 时会在同步完成 Job 预检与登记后返回由父级拥有的 Job id,而不会等待提供方启动或完成。 [通用 one-shot 后台适配器](2026-07-08-background-subagent-tasks.md)负责后台登记与结算。它会启动同一个 [`SubagentRun`](2026-06-21-subagent-capability-seam.md),让 Job 自有的取消信号覆盖提供方启动与执行,等待 `run.result` 和 `run.dispose()`,把终态结果映射进 Job,并由 `job_output`、`job_list`、`job_kill` 与现有完成通知公开该状态。[产品提供方决策](2026-08-04-claude-code-and-codex-subagent-backends.md)继续负责原生协议、答案选择、本地取消与进程树完全停稳。 @@ -33,6 +33,7 @@ product tool call | 事实或资源 | 责任方 | 产品工具职责 | 可观察结果 | | --- | --- | --- | --- | +| 产品提供方安装与登记 | 显式 Profile | 安装可选提供方包,并在 host plane 挂载一次 | 提供方名称可用,但不会让每次生产 `dsh` 安装都包含该包 | | 产品选择与公开 | Agent Preset | 把一个固定工具名绑定到一个固定提供方 | 启用一行只会公开对应产品工具 | | 前台或后台选择 | `dsh-tool-subagent` | 按 `one-shot` 策略解析 `run_in_background` | 省略参数时在前台运行;显式传入 `true` 时返回 Job id | | Job id、状态、输出、取消与通知 | `ctx.jobs` 与 `dsh-tool-jobs` | 登记并展示现有 one-shot 运行 | 通用作业工具为准确父级收集或停止运行 | @@ -40,15 +41,15 @@ product tool call ## 发布组装 -完整 profile 把两个产品提供方保留在宿主,并在每个完整 preset 中让两个产品工具行保持禁用。宿主作业注册表由各会话共享,而每个 preset 会把通用作业控制工具贡献到自身 agent 作用域。用户复制一个 preset,再从任一或两个产品行删除 `disabled`;组装期间不会启动产品进程。 +生产 base 不让两个可选产品提供方进入依赖闭包。选择启用产品集成的 Profile 会在 host plane 安装并挂载任一或两个提供方。每个完整 preset 让两个产品工具行保持禁用,并把通用 Job 控制工具贡献到自身 agent 作用域;base host 负责共享 Job 注册表。Profile 提供方存在后,用户复制一个 preset,再从对应产品行删除 `disabled`;组装期间不会启动产品进程。 -自定义组装若启用 one-shot 后台执行,就必须提供完整的通用 Job 能力:由 `dsh-jobs-local` 充当提供方,由 `dsh-tool-jobs` 充当面向模型的消费方。没有该运行时的产品工具仍可在前台执行,但显式后台请求会在现有 Job 预检中失败,不会发布无法收集的 id。 +独立自定义组装若启用 one-shot 后台执行,就必须同时提供产品提供方与完整通用 Job 能力:由 `dsh-jobs-local` 充当 Job 提供方,由 `dsh-tool-jobs` 充当面向模型的消费方。基于 `dsh-base` 的 Profile 已具备 Job 能力,只需在启用 preset 工具行前新增可选产品提供方。没有 Job 运行时的产品工具仍可在前台执行,但显式后台请求会在现有 Job 预检中失败,不会发布无法收集的 id。 ACP 产品组装使用相同的固定产品行与通用作业控制工具。其无密钥 schema 快照会为每个已启用产品工具公开 `description`、`prompt` 和可选的 `run_in_background`,而不会调用 Codex、Claude Code 或外部模型。 ## 验证 -随附 Web 组装会启动四种用户 preset 变体——不启用产品、只启用 Codex、只启用 Claude Code,以及同时启用两者——并检查每个已启用产品工具都会与 `job_output`、`job_list` 和 `job_kill` 一起公开 `run_in_background`。两个由包负责的 Loader 组装会在空 `PATH` 下运行,检查相同 schema 与控制工具,并证明加载提供方不会启动产品进程。ACP 无密钥快照会固定组装后的产品 schema,而现有 `dsh-tool-subagent` 与作业测试套件会固定前台默认值、Job 登记、最终输出收集、取消、完成通知、owner 资源释放与提供方资源释放。 +Web 组装测试会从仓库 examples 依赖锚点显式挂载两个可选提供方,再启动四种用户 preset 变体——不启用产品、只启用 Codex、只启用 Claude Code,以及同时启用两者——并检查每个已启用产品工具都会与 `job_output`、`job_list` 和 `job_kill` 一起公开 `run_in_background`。两个由包负责的 Loader 组装会在空 `PATH` 下运行,检查相同 schema 与控制工具,并证明显式加载提供方不会启动产品进程。ACP 无密钥快照会固定显式组装后的产品 schema,而现有 `dsh-tool-subagent` 与作业测试套件会固定前台默认值、Job 登记、最终输出收集、取消、完成通知、owner 资源释放与提供方资源释放。 ## 曾考虑的替代方案 @@ -66,4 +67,4 @@ ACP 产品组装使用相同的固定产品行与通用作业控制工具。其 agent 可以在 Codex 或 Claude Code 处理独立 one-shot 任务时继续推进其他工作,随后通过其他后台 producer 共用的 Job 控制工具收集最终回答或取消运行。前台调用方继续获得既有结果与错误行为。 -每次产品委托仍会启动一个全新的原生进程或 query,把最终文本作为唯一产品载荷,并以提供方资源释放和整棵进程树退出结束。后台调用还会额外公开通用 Job id、状态、完成通知以及收集或取消结果。后台 Job 仅存在于当前进程且由父级拥有:它不会在父级资源释放后继续存活,不会公开产品中间活动,也不会让产品对话变得可恢复。公开后台参数的自定义组装还必须让通用 Job 提供方与控制工具保持可用。 +每次产品委托仍会启动一个全新的原生进程或 query,把最终文本作为唯一产品载荷,并以提供方资源释放和整棵进程树退出结束。后台调用还会额外公开通用 Job id、状态、完成通知以及收集或取消结果。后台 Job 仅存在于当前进程且由父级拥有:它不会在父级资源释放后继续存活,不会公开产品中间活动,也不会让产品对话变得可恢复。只有 Profile 显式安装产品集成时,生产安装才承担对应成本;公开后台参数的任何组装还必须让通用 Job 提供方与控制工具保持可用。 diff --git a/apps/cli/config/agent-presets/code/agent.cordis.yml b/apps/cli/config/agent-presets/code/agent.cordis.yml index bf3c9c7ffa..407938e5c8 100644 --- a/apps/cli/config/agent-presets/code/agent.cordis.yml +++ b/apps/cli/config/agent-presets/code/agent.cordis.yml @@ -198,9 +198,9 @@ toolName: subagent_fork backgroundMode: continuable - # Product providers are host-plane singletons. Copy this preset, then - # remove `disabled` from either ordinary tool row to expose that product - # only to agents composed from the copy. + # Production dsh does not install these optional providers. An opting-in + # Profile mounts each provider once on the host plane; copy this preset, + # then remove `disabled` from the matching tool row. - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true diff --git a/apps/cli/config/agent-presets/cordis/agent.cordis.yml b/apps/cli/config/agent-presets/cordis/agent.cordis.yml index 92abc128ef..e808250c00 100644 --- a/apps/cli/config/agent-presets/cordis/agent.cordis.yml +++ b/apps/cli/config/agent-presets/cordis/agent.cordis.yml @@ -185,9 +185,9 @@ toolName: subagent_fork backgroundMode: continuable - # Product providers are host-plane singletons. Copy this preset, then - # remove `disabled` from either ordinary tool row to expose that product - # only to agents composed from the copy. + # Production dsh does not install these optional providers. An opting-in + # Profile mounts each provider once on the host plane; copy this preset, + # then remove `disabled` from the matching tool row. - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true diff --git a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md index 98612eebf4..def10a9b8c 100644 --- a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md +++ b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md @@ -147,7 +147,7 @@ Copy these disabled templates from a shipped full preset and remove `disabled` o maxDepth: provider-managed ``` -The two rows are independent. Leaving both disabled preserves the copied preset, enabling one exposes only that product tool, and enabling both exposes both. `backgroundMode: one-shot` keeps omitted or `false` calls in the foreground and lets explicit `run_in_background: true` return a generic Job id. Full presets already carry `tool-jobs`, while the host carries the job registry; retain both when making a custom composition so `job_output`, `job_list`, `job_kill`, cancellation, and completion notices stay available. The host must provide `codex` or `claude` on `PATH`; the preset does not install, authenticate, select a model for, or probe either product. +The two rows are independent. Leaving both disabled preserves the copied preset, enabling one exposes only that product tool, and enabling both exposes both. Production `dsh` does not install or mount either optional provider: before enabling a row, the Profile must install the matching `@deepseek-ai/dsh-subagent-codex` or `@deepseek-ai/dsh-subagent-claude-code` package and mount it once on the host plane. A preset cannot provide that host dependency. `backgroundMode: one-shot` keeps omitted or `false` calls in the foreground and lets explicit `run_in_background: true` return a generic Job id. Full presets already carry `tool-jobs`, while the base host carries the job registry; retain both so `job_output`, `job_list`, `job_kill`, cancellation, and completion notices stay available. The host must also provide `codex` or `claude` on `PATH`; the preset does not install, authenticate, select a model for, or probe either product. ## What not to move into a preset diff --git a/apps/cli/config/agent-presets/standard/agent.cordis.yml b/apps/cli/config/agent-presets/standard/agent.cordis.yml index 7a627432f9..b8559cfd74 100644 --- a/apps/cli/config/agent-presets/standard/agent.cordis.yml +++ b/apps/cli/config/agent-presets/standard/agent.cordis.yml @@ -197,9 +197,9 @@ toolName: subagent_fork backgroundMode: continuable - # Product providers are host-plane singletons. Copy this preset, then - # remove `disabled` from either ordinary tool row to expose that product - # only to agents composed from the copy. + # Production dsh does not install these optional providers. An opting-in + # Profile mounts each provider once on the host plane; copy this preset, + # then remove `disabled` from the matching tool row. - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true diff --git a/packages/subagent/subagent-claude-code/README.i18n.yaml b/packages/subagent/subagent-claude-code/README.i18n.yaml index 3001336d94..97e9ddbe56 100644 --- a/packages/subagent/subagent-claude-code/README.i18n.yaml +++ b/packages/subagent/subagent-claude-code/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-claude-code/README.md -README.md: 816d89229711021fc2e3c315cec88d7b7d846793 -README.zh.md: 53c9c2a2d3192ac0ed0d23f348a54c8dff21845f +README.md: 327493551ff145277675682eeaef2fc7948ee414 +README.zh.md: 5e4d6558d946451493e1b0f5f209500af8c34aa1 diff --git a/packages/subagent/subagent-claude-code/README.md b/packages/subagent/subagent-claude-code/README.md index 816d892297..327493551f 100644 --- a/packages/subagent/subagent-claude-code/README.md +++ b/packages/subagent/subagent-claude-code/README.md @@ -31,7 +31,9 @@ The provider advertises no optional start-time capabilities and reports `inherit Production resolves `claude` from the subprocess execution world's credential-scrubbed `PATH`, with explicit `env` entries applied, and passes the resulting path to the SDK as `pathToClaudeCodeExecutable`. On Windows, a resolved `.cmd` or `.bat` path is carried as a quoted, per-spawn environment value that `cmd.exe /v:off` expands once, so valid path metacharacters remain data. The pinned SDK's fixed flags then occupy cmd's command tail and contain no cmd metacharacters; they are not ordinary Windows argv. Native settings and authentication remain authoritative. The plugin does not install another CLI, select a model, create a product home, log in, or probe an account. Credential-shaped ambient variables are removed before the explicit `env` overlay is applied, so an API key or token intended for the child must be supplied there. Non-credential endpoint variables such as `ANTHROPIC_BASE_URL`, along with ordinary ambient values such as `PATH` and `HOME`, remain inherited unless overridden. -Shipped profiles load this provider once on the host and start no Claude process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_claude_code` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. Shipped full profiles already provide the job registry and controls; a custom composition must load the same generic job provider and consumer when it enables this background route. +Production `dsh` does not install or mount this optional provider. A Profile that opts in must install `@deepseek-ai/dsh-subagent-claude-code` and mount it once on the host plane; loading the provider starts no Claude process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_claude_code` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. The base host and full presets already provide the generic Job registry and controls. + +The standalone composition below shows the complete explicit capability. A Profile based on `@deepseek-ai/dsh-base` keeps its existing Job rows, adds the product provider row, and enables the preset tool row instead of mounting duplicate Job services. ```yaml - id: subagent-claude-code diff --git a/packages/subagent/subagent-claude-code/README.zh.md b/packages/subagent/subagent-claude-code/README.zh.md index 53c9c2a2d3..5e4d6558d9 100644 --- a/packages/subagent/subagent-claude-code/README.zh.md +++ b/packages/subagent/subagent-claude-code/README.zh.md @@ -31,7 +31,9 @@ SDK 接收由文本块原样拼接成的任务。提供方会完整迭代 SDK 生产环境从子进程执行世界清除凭证后的 `PATH` 解析 `claude`,再应用显式 `env` 条目,并把所得路径作为 `pathToClaudeCodeExecutable` 交给 SDK。在 Windows 上,解析到的 `.cmd` 或 `.bat` 路径会作为带引号、仅供本次 spawn 使用的环境值交给 `cmd.exe /v:off` 展开一次,因此合法路径中的元字符仍只是数据。锁定版本的 SDK 随后把固定命令行选项放在 cmd 的命令尾部;这些选项不含 cmd 元字符,也并不是普通的 Windows argv。原生设置与身份验证继续是权威来源。本插件不安装另一份 CLI、不选择模型、不创建产品主目录、不执行登录,也不探测账户。具有凭证特征的环境变量会在显式 `env` 覆盖生效前被清除,因此供子进程使用的 API 密钥或 token 必须在该配置中显式提供。除非被覆盖,`ANTHROPIC_BASE_URL` 等非凭证端点变量以及 `PATH` 和 `HOME` 等普通环境变量仍会被继承。 -随附 profile 会在宿主上加载一次该提供方,而且在工具被调用前不会启动 Claude 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_claude_code`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。随附完整 profile 已提供作业注册表和控制工具;自定义组装若启用该后台路径,也必须加载同一通用作业提供方与消费方。 +生产 `dsh` 不会安装或挂载这个可选提供方。选择启用它的 Profile 必须安装 `@deepseek-ai/dsh-subagent-claude-code`,并在 host plane(宿主平面)挂载一次;加载提供方本身不会在工具调用前启动 Claude 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_claude_code`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。base host(基础宿主)与完整 preset 已提供通用作业注册表和控制工具。 + +下列独立组装展示完整的显式能力。基于 `@deepseek-ai/dsh-base` 的 Profile 保留已有 Job 行,只新增产品提供方行并启用 preset 工具行,禁止重复挂载 Job 服务。 ```yaml - id: subagent-claude-code diff --git a/packages/subagent/subagent-codex/README.i18n.yaml b/packages/subagent/subagent-codex/README.i18n.yaml index e28353dad9..5501f36aee 100644 --- a/packages/subagent/subagent-codex/README.i18n.yaml +++ b/packages/subagent/subagent-codex/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-codex/README.md -README.md: 271130f41a8d4c9f22c5dfb030f60c3addea51c7 -README.zh.md: 48fa219dcf2c9f55359d5b65d9a9eddb5320753a +README.md: d2cce430c4bc80378b77240ce2dd7c6c07fea986 +README.zh.md: 92986e3d3d6c9ff786db968004ce2f533949a5f9 diff --git a/packages/subagent/subagent-codex/README.md b/packages/subagent/subagent-codex/README.md index 271130f41a..d2cce430c4 100644 --- a/packages/subagent/subagent-codex/README.md +++ b/packages/subagent/subagent-codex/README.md @@ -27,7 +27,9 @@ The provider advertises no optional start-time capabilities and reports `inherit Production resolves `codex` from `PATH` and uses the host's native Codex configuration and authentication. The plugin does not install Codex, select a model, create `CODEX_HOME`, log in, or probe a version. Credential-shaped ambient variables are removed by the subprocess seam, so an API key intended for the child must be supplied explicitly in `env`; ordinary ambient values such as `PATH` and `HOME` remain available unless overridden. -Shipped profiles load this provider once on the host and start no Codex process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_codex` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. Shipped full profiles already provide the job registry and controls; a custom composition must load the same generic job provider and consumer when it enables this background route. +Production `dsh` does not install or mount this optional provider. A Profile that opts in must install `@deepseek-ai/dsh-subagent-codex` and mount it once on the host plane; loading the provider starts no Codex process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_codex` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. The base host and full presets already provide the generic Job registry and controls. + +The standalone composition below shows the complete explicit capability. A Profile based on `@deepseek-ai/dsh-base` keeps its existing Job rows, adds the product provider row, and enables the preset tool row instead of mounting duplicate Job services. ```yaml - id: subagent-codex diff --git a/packages/subagent/subagent-codex/README.zh.md b/packages/subagent/subagent-codex/README.zh.md index 48fa219dcf..92986e3d3d 100644 --- a/packages/subagent/subagent-codex/README.zh.md +++ b/packages/subagent/subagent-codex/README.zh.md @@ -27,7 +27,9 @@ 生产环境会从 `PATH` 中解析 `codex`,并使用宿主机原生的 Codex 配置与身份验证。本插件不安装 Codex、不选择模型、不创建 `CODEX_HOME`、不执行登录,也不探测版本。子进程 seam 会移除具有凭证特征的环境变量,因此供子进程使用的 API 密钥必须在 `env` 中显式提供;除非被覆盖,`PATH` 和 `HOME` 等普通环境变量值仍然可用。 -随附 profile 会在宿主上加载一次该提供方,而且在工具被调用前不会启动 Codex 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_codex`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。随附完整 profile 已提供作业注册表和控制工具;自定义组装若启用该后台路径,也必须加载同一通用作业提供方与消费方。 +生产 `dsh` 不会安装或挂载这个可选提供方。选择启用它的 Profile 必须安装 `@deepseek-ai/dsh-subagent-codex`,并在 host plane(宿主平面)挂载一次;加载提供方本身不会在工具调用前启动 Codex 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_codex`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。base host(基础宿主)与完整 preset 已提供通用作业注册表和控制工具。 + +下列独立组装展示完整的显式能力。基于 `@deepseek-ai/dsh-base` 的 Profile 保留已有 Job 行,只新增产品提供方行并启用 preset 工具行,禁止重复挂载 Job 服务。 ```yaml - id: subagent-codex From 0a42836fbb748de908919b15ccc63ddf3975a3da Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:37:49 +0800 Subject: [PATCH 066/103] fix(web): address wildcard host review --- apps/cli/tests/args.spec.ts | 4 ++-- apps/cli/tests/built-bin.e2e.ts | 9 +++++++++ packages/bundle/web-app/src/startup.ts | 6 +++--- packages/client/connection/README.i18n.yaml | 4 ++-- packages/client/connection/README.md | 2 +- packages/client/connection/README.zh.md | 2 +- packages/client/connection/src/api-request-trust.ts | 4 ++-- packages/client/connection/tests/node-half.host.spec.ts | 4 ++-- 8 files changed, 22 insertions(+), 13 deletions(-) diff --git a/apps/cli/tests/args.spec.ts b/apps/cli/tests/args.spec.ts index 89a16921b2..611a098b6f 100644 --- a/apps/cli/tests/args.spec.ts +++ b/apps/cli/tests/args.spec.ts @@ -36,8 +36,8 @@ describe('parseDshArgs', () => { .toEqual({ mode: 'profile', profile: 'tui', patches: [], args: ['--resume', 'abc'] }) expect(parse(['--profile', 'web', '-h'])) .toEqual({ mode: 'profile', profile: 'web', patches: [], args: ['-h'] }) - expect(parse(['web', '--host', '0.0.0.0', '--port', '8080', '--dev'])) - .toEqual({ mode: 'profile', profile: 'web', patches: [], args: ['--host', '0.0.0.0', '--port', '8080', '--dev'] }) + expect(parse(['web', '--host', '127.0.0.1', '--port', '8080', '--dev'])) + .toEqual({ mode: 'profile', profile: 'web', patches: [], args: ['--host', '127.0.0.1', '--port', '8080', '--dev'] }) expect(parse(['--profile', 'headless', 'run', 'the', 'tests'])) .toEqual({ mode: 'profile', profile: 'headless', patches: [], args: ['run', 'the', 'tests'] }) // Launcher flags placed after that boundary belong to the app too. diff --git a/apps/cli/tests/built-bin.e2e.ts b/apps/cli/tests/built-bin.e2e.ts index c989d9ce3e..f887c170d3 100644 --- a/apps/cli/tests/built-bin.e2e.ts +++ b/apps/cli/tests/built-bin.e2e.ts @@ -339,6 +339,15 @@ describe.skipIf(!existsSync(dshBin))('dsh BUILT bin (node lib/bin.js, no tsx)', expect(web.stdout).toContain('--port ') expect(web.stdout).not.toContain('dsh web: http://') + const wildcardHost = await runBuiltBin(['web', '--host', '0.0.0.0'], { + DSH_HOME: home, + DSH_TELEMETRY_DISABLED: '1', + }) + expect(wildcardHost.code).toBe(1) + expect(wildcardHost.stdout).toBe('') + expect(wildcardHost.stderr).toContain('--host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead') + expect(wildcardHost.stderr).not.toContain('dsh web: http://') + const headlessHelp = await runBuiltBin(['--profile', 'headless', '--help'], { DSH_HOME: home, DSH_TELEMETRY_DISABLED: '1', diff --git a/packages/bundle/web-app/src/startup.ts b/packages/bundle/web-app/src/startup.ts index 55a4b40f2e..af6997cff7 100644 --- a/packages/bundle/web-app/src/startup.ts +++ b/packages/bundle/web-app/src/startup.ts @@ -57,9 +57,9 @@ Examples: /** * Parse and provide the Web invocation as an ordinary Cordis service. The - * command's action publishes the flags this invocation named; an unsupported - * `--host` or non-numeric `--port` is a usage error, so on rejection (and on - * `--help`) nothing is provided. + * command's action publishes the flags this invocation named; `--host 0.0.0.0` + * or a non-numeric `--port` is a usage error, so on rejection (and on `--help`) + * nothing is provided. * @param ctx - plugin context carrying the command line. */ export function apply(ctx: Context): void { diff --git a/packages/client/connection/README.i18n.yaml b/packages/client/connection/README.i18n.yaml index 38c31ad05c..4745644cc5 100644 --- a/packages/client/connection/README.i18n.yaml +++ b/packages/client/connection/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/connection/README.md -README.md: 3315552dd0400697d5a96639598c5f5bb2bb4f5b -README.zh.md: 0dc251f1e5410bd0d74ef450c6d8df3dc9cdab81 +README.md: f0a707cc5f3a962c7852f7323c727d0a39a57b10 +README.zh.md: b529eebf9af93e36b6b92c19964678b7f5a04ea1 diff --git a/packages/client/connection/README.md b/packages/client/connection/README.md index 3315552dd0..f0a707cc5f 100644 --- a/packages/client/connection/README.md +++ b/packages/client/connection/README.md @@ -6,7 +6,7 @@ Wire consumer layer: the client plugin's apply mounts `ctx.connection` (shared a ## /api browser-trust fence -The node half guards every entry under `/api` before bridging or upgrading (`src/api-request-trust.ts`). Every request — browser-marked or not — must present a `Host` that is a loopback authority or matches a `trustedHosts` entry: exact on `host:port` entries, any port on port-less entries, both sides compared through WHATWG normalization (DNS-rebinding defense). There is deliberately no shortcut for unmarked HTTP requests: over plain HTTP a browser attaches neither `Origin` nor Fetch-Metadata to image and navigation reads, so an unmarked request may still be a rebound browser read with a readable response, and Host is the one header rebinding cannot forge; a browser WebSocket handshake carries `Origin` and passes the same comparison. Non-browser clients pass the same fence via loopback, the CLI-derived LAN IP literals, or a declared authority. When markers are present, an attached `Origin` must equal the Host authority, and an explicit `sec-fetch-site: cross-site` marker is refused. A `trustedHosts` entry that is not a bare, canonical `host[:port]` authority — one WHATWG parsing reads back exactly as written — fails the plugin load loudly: parsing would otherwise quietly authorize the hostname inside `harness.internal/path`, or broaden a dangling-colon or zero-padded port to an any-port grant. HTTP failures answer plain 403 before any RPC dispatch; upgrade failures reject the handshake before any event stream starts. A non-loopback (`--host 0.0.0.0`) deployment therefore needs its serving authorities trusted: the dsh CLI derives the machine's LAN IP literals itself and its `--trusted-host` flag declares named ones, so `trustedHosts` in cordis.yml is for compositions the CLI does not boot. The fence is a reachability policy, not authentication; the Web carrier provides no authentication layer. Decision record: [the api browser-trust boundary Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md). +The node half guards every entry under `/api` before bridging or upgrading (`src/api-request-trust.ts`). Every request — browser-marked or not — must present a `Host` that is a loopback authority or matches a `trustedHosts` entry: exact on `host:port` entries, any port on port-less entries, both sides compared through WHATWG normalization (DNS-rebinding defense). There is deliberately no shortcut for unmarked HTTP requests: over plain HTTP a browser attaches neither `Origin` nor Fetch-Metadata to image and navigation reads, so an unmarked request may still be a rebound browser read with a readable response, and Host is the one header rebinding cannot forge; a browser WebSocket handshake carries `Origin` and passes the same comparison. Non-browser clients pass the same fence via loopback, deployment-derived LAN IP literals, or a declared authority. When markers are present, an attached `Origin` must equal the Host authority, and an explicit `sec-fetch-site: cross-site` marker is refused. A `trustedHosts` entry that is not a bare, canonical `host[:port]` authority — one WHATWG parsing reads back exactly as written — fails the plugin load loudly: parsing would otherwise quietly authorize the hostname inside `harness.internal/path`, or broaden a dangling-colon or zero-padded port to an any-port grant. HTTP failures answer plain 403 before any RPC dispatch; upgrade failures reject the handshake before any event stream starts. Non-loopback compositions must trust their serving authorities explicitly: the Web runtime derives LAN IP literals from an all-interfaces server config, while `trustedHosts` in cordis.yml and the CLI's `--trusted-host` flag declare named authorities. `dsh web --host 0.0.0.0` is intentionally unsupported until remote access has an authentication layer. The fence is a reachability policy, not authentication; the Web carrier provides no authentication layer. Decision record: [the api browser-trust boundary Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md). ## `/api` WebSocket downlinks diff --git a/packages/client/connection/README.zh.md b/packages/client/connection/README.zh.md index 0dc251f1e5..b529eebf9a 100644 --- a/packages/client/connection/README.zh.md +++ b/packages/client/connection/README.zh.md @@ -6,7 +6,7 @@ ## /api 浏览器信任栅栏 -node 半侧在桥接或 upgrade 前守卫 `/api` 下的每个入口(`src/api-request-trust.ts`)。每个请求——无论是否带浏览器标记——`Host` 都必须是回环地址权威,或与某个 `trustedHosts` 条目匹配:带端口的 `host:port` 条目精确匹配,不带端口的条目匹配任意端口,两侧均经 WHATWG 归一化后比较(DNS rebinding 防御)。刻意不为无浏览器标记的 HTTP 请求开捷径:明文 HTTP 下浏览器的图片与导航读取既不带 `Origin` 也不带 Fetch-Metadata,因此无标记请求仍可能是被重绑页面发起的、响应可被读走的读取,而 Host 是重绑唯一伪造不了的请求头;WebSocket 浏览器握手会带 `Origin` 并通过同一道比较。非浏览器客户端经由回环地址、CLI(命令行界面)推导的 LAN IP 字面量或已声明的权威通过同一道栅栏。当标记存在时,如附带 `Origin`,则它必须与 Host 权威完全一致;显式的 `sec-fetch-site: cross-site` 标记一律拒绝。不是纯的、规范形 `host[:port]` 权威的 `trustedHosts` 条目——即 WHATWG 解析读回后与原文不完全一致的——会让插件加载明确报错:否则解析会悄悄授权 `harness.internal/path` 这类笔误里的 hostname,或把悬空冒号、补零端口放大成任意端口授权。HTTP 失败在任何 RPC 分发之前以纯 403 应答,upgrade 失败在启动任何事件流前拒绝握手。因此非回环(`--host 0.0.0.0`)部署需要让自己的服务权威被信任:dsh CLI 会自行推导本机的 LAN IP 字面量,其 `--trusted-host` flag 用于声明具名权威,所以 cordis.yml 中的 `trustedHosts` 面向 CLI 不参与引导的组合。这道栅栏是可达性策略,而不是认证;Web 载体不提供认证层。决策记录:[api 浏览器信任边界 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md)。 +node 半侧在桥接或 upgrade 前守卫 `/api` 下的每个入口(`src/api-request-trust.ts`)。每个请求——无论是否带浏览器标记——`Host` 都必须是回环地址权威,或与某个 `trustedHosts` 条目匹配:带端口的 `host:port` 条目精确匹配,不带端口的条目匹配任意端口,两侧均经 WHATWG 归一化后比较(DNS rebinding 防御)。刻意不为无浏览器标记的 HTTP 请求开捷径:明文 HTTP 下浏览器的图片与导航读取既不带 `Origin` 也不带 Fetch-Metadata,因此无标记请求仍可能是被重绑页面发起的、响应可被读走的读取,而 Host 是重绑唯一伪造不了的请求头;WebSocket 浏览器握手会带 `Origin` 并通过同一道比较。非浏览器客户端经由回环地址、部署推导的 LAN IP 字面量或已声明的权威通过同一道栅栏。当标记存在时,如附带 `Origin`,则它必须与 Host 权威完全一致;显式的 `sec-fetch-site: cross-site` 标记一律拒绝。不是纯的、规范形 `host[:port]` 权威的 `trustedHosts` 条目——即 WHATWG 解析读回后与原文不完全一致的——会让插件加载明确报错:否则解析会悄悄授权 `harness.internal/path` 这类笔误里的 hostname,或把悬空冒号、补零端口放大成任意端口授权。HTTP 失败在任何 RPC 分发之前以纯 403 应答,upgrade 失败在启动任何事件流前拒绝握手。非回环组合必须显式信任其服务权威:Web 运行时从全接口服务器配置推导 LAN IP 字面量,cordis.yml 中的 `trustedHosts` 与 CLI(命令行界面)的 `--trusted-host` flag 则声明具名权威。`dsh web --host 0.0.0.0` 在远程访问具备认证层之前有意不受支持。这道栅栏是可达性策略,而不是认证;Web 载体不提供认证层。决策记录:[api 浏览器信任边界 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md)。 ## `/api` WebSocket 下行 diff --git a/packages/client/connection/src/api-request-trust.ts b/packages/client/connection/src/api-request-trust.ts index 141092c63b..ea8914ccc6 100644 --- a/packages/client/connection/src/api-request-trust.ts +++ b/packages/client/connection/src/api-request-trust.ts @@ -7,8 +7,8 @@ * nor Fetch-Metadata to reads (images and navigations — those * headers go only to trustworthy destinations), so an unmarked request may * still be a rebound browser read and Host is the one header rebinding cannot - * forge. Non-browser and remote clients pass the same fence via loopback, the - * CLI-derived LAN IP literals, or a declared `trustedHosts` authority. + * forge. Non-browser and remote clients pass the same fence via loopback, + * deployment-derived LAN IP literals, or a declared `trustedHosts` authority. * Network reachability and authentication stay out of scope: binding policy * belongs to the webserver config, and this fence is not an auth layer. */ diff --git a/packages/client/connection/tests/node-half.host.spec.ts b/packages/client/connection/tests/node-half.host.spec.ts index 6c8b42b5ab..0b30ce6520 100644 --- a/packages/client/connection/tests/node-half.host.spec.ts +++ b/packages/client/connection/tests/node-half.host.spec.ts @@ -199,8 +199,8 @@ describe('connection node half', () => { const loopback = fakeResponse() await routes[0]!.handler(fakeRequest({ host: '127.0.0.1:3080' }), loopback.response) expect(loopback.state.status).toBe(404) - // LAN authority declared as a port-less IP literal — the shape the CLI - // derives for `--host 0.0.0.0` — passes markerless curl on any port. + // An all-interfaces composition derives port-less LAN IP literals, which + // pass markerless curl on any port. const lan = fakeResponse() await routes[0]!.handler(fakeRequest({ host: '192.168.1.5:3080' }), lan.response) expect(lan.state.status).toBe(404) From 339c30ed148416e5a7c596c2eb4e20b5f567103a Mon Sep 17 00:00:00 2001 From: pku-xht Date: Thu, 13 Aug 2026 16:50:05 +0800 Subject: [PATCH 067/103] docs(bundle): correct product provider opt-in guidance --- .../cordis/skills/editing-cordis-compositions/SKILL.md | 2 +- packages/bundle/base/README.i18n.yaml | 4 ++-- packages/bundle/base/README.md | 3 +-- packages/bundle/base/README.zh.md | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md index def10a9b8c..8214e88654 100644 --- a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md +++ b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md @@ -123,7 +123,7 @@ After a clean mount-validation, ask the user to start a session on the new prese ## Native product subagents -Codex and Claude Code providers already live in the host composition. A preset chooses either product by contributing the same ordinary delegation-tool row used for spawn and fork; never move a product provider into the preset and never add a product-specific settings field. +Codex and Claude Code providers belong on the host plane but are not installed by production `dsh`. The active Profile must install and mount the selected provider before a preset can expose its ordinary delegation-tool row; never move a product provider into the preset and never add a product-specific settings field. Copy these disabled templates from a shipped full preset and remove `disabled` only for the products the user requested: diff --git a/packages/bundle/base/README.i18n.yaml b/packages/bundle/base/README.i18n.yaml index cae813eb1d..483784e547 100644 --- a/packages/bundle/base/README.i18n.yaml +++ b/packages/bundle/base/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/bundle/base/README.md -README.md: bd38f39f58ee1f765ff34d40cf57cc6daed2b32b -README.zh.md: bcf4463587f42a245126f87388f3c0a4e57f0976 +README.md: 00a177d4dd65de8706aa0e27a79d06a9a50eb55a +README.zh.md: ad70fc16035d3dd70b04e78c31aea90acf61119b diff --git a/packages/bundle/base/README.md b/packages/bundle/base/README.md index bd38f39f58..00a177d4dd 100644 --- a/packages/bundle/base/README.md +++ b/packages/bundle/base/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -The shared dsh core as a profile bundle: [`cordis.patch.yml`](cordis.patch.yml) inserts every base plugin row — model adapters, the shared [`agent-default-model`](../../core/agent-default-model/README.md) selection, tools, persistence, policy, settings/credentials, telemetry, and host-level subagent providers — over the empty profile root, as the first layer of every profile's `dsh.profile.bundles` list. Codex and Claude Code providers load dormant; Agent Presets independently decide whether their agent contributes either model-facing delegation tool. Later bundle layers (e.g. [`dsh-web-app`](../web-app/README.md)) and the user's profile `cordis.patch.yml` override these rows by id; a patch replaces a row's whole `config`, so mode-specific values live in mode bundles, not here. The package has no runtime API; the profile composer resolves the patch through the `dsh.bundle.patch` manifest field, never through code. +The shared dsh core as a profile bundle: [`cordis.patch.yml`](cordis.patch.yml) inserts every base plugin row — model adapters, the shared [`agent-default-model`](../../core/agent-default-model/README.md) selection, tools, persistence, policy, settings/credentials, telemetry, and host-level subagent providers — over the empty profile root, as the first layer of every profile's `dsh.profile.bundles` list. This bundle neither depends on nor mounts the optional Codex and Claude Code providers; an opting-in Profile installs and mounts the selected provider once on the host plane, while Agent Presets decide whether their agents receive the corresponding model-facing delegation tools. Later bundle layers (e.g. [`dsh-web-app`](../web-app/README.md)) and the user's profile `cordis.patch.yml` override these rows by id; a patch replaces a row's whole `config`, so mode-specific values live in mode bundles, not here. The package has no runtime API; the profile composer resolves the patch through the `dsh.bundle.patch` manifest field, never through code. The patch gates both shell stacks by platform on its own rows: `bash-sandbox`/`tool-bash` carry `disabled: !!js process.platform === 'win32'` (bash has no Windows runner), and their twins `pwsh-sandbox`/`tool-pwsh` mount on win32 only with the inverted expression — one shared patch file, exactly one shell stack per host. The permission surface stays exactly as on POSIX: `sandbox`/`sandbox-policy` enforce the file-effect policy through the Windows ACL restricted-token runner (the win32 chain of `dsh-sandbox-local` → `@deepseek-ai/dsh-sandbox-windows-acl`), the permission switcher and the approval service run unchanged, and `fs-sandbox` keeps fencing `ctx.fs` writes — mounting `dsh-fs-local` alongside it would double-register `ctx.fs` and fail the load. A Windows host that prefers the unconfined local pwsh executor or full access overrides these rows through its profile or home `cordis.patch.yml` (the bash-restore recipe must be complete: disable `pwsh-sandbox`/`tool-pwsh` AND re-enable `bash-sandbox`/`tool-bash` — both executor families register the same `bash` service, so an incomplete recipe fails loud at load). POSIX hosts see the pwsh rows disabled. @@ -19,5 +19,4 @@ None directly; each inserted row's package owns its effect. ## Known Limitations and Deferred Work - **A patch replaces whole row configs** — profile overrides must restate every field a row keeps; there is no deep-merge layer. -- **Claude's SDK platform CLI remains in the Profile install closure** — the base bundle depends on the Claude provider, whose production path resolves the host `claude`; removing the SDK's unused optional payload is deferred to the product installation-closure follow-up. - **The Windows temp grant is a private per-session subdirectory** — `workspace-write` confines writes to the workspace plus the session's own temp subdirectory (`\dsh-`, TMP/TEMP rewritten for confined children); `read-only` grants nothing. See `@deepseek-ai/dsh-sandbox-windows-acl`. diff --git a/packages/bundle/base/README.zh.md b/packages/bundle/base/README.zh.md index bcf4463587..ad70fc1603 100644 --- a/packages/bundle/base/README.zh.md +++ b/packages/bundle/base/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -以 profile 组合包形式交付的共享 dsh 核心:[`cordis.patch.yml`](cordis.patch.yml) 在空的 profile 根之上插入全部基础插件行——模型适配器、共享的 [`agent-default-model`](../../core/agent-default-model/README.md) 选择、工具、持久化、策略、settings/credentials、遥测与宿主级 subagent provider——作为每个 profile 的 `dsh.profile.bundles` 列表中的第一层。Codex 与 Claude Code provider 以休眠状态加载;Agent Preset 分别决定自己的 agent 是否贡献任一面向模型的委派工具。后续的组合包层(例如 [`dsh-web-app`](../web-app/README.md))和用户 profile 的 `cordis.patch.yml` 按 id 覆盖这些行;patch 会替换目标行的整个 `config`,因此模式专属的值放在各模式组合包中,而不是这里。该包没有运行时 API;profile 组合器通过 manifest(元数据清单)的 `dsh.bundle.patch` 字段解析 patch,绝不通过代码。 +以 profile 组合包形式交付的共享 dsh 核心:[`cordis.patch.yml`](cordis.patch.yml) 在空的 profile 根之上插入全部基础插件行——模型适配器、共享的 [`agent-default-model`](../../core/agent-default-model/README.md) 选择、工具、持久化、策略、settings/credentials、遥测与宿主级 subagent provider——作为每个 profile 的 `dsh.profile.bundles` 列表中的第一层。这个 bundle 既不依赖也不挂载可选的 Codex 与 Claude Code provider;选择产品集成的 Profile 会安装目标 provider 并在 host plane(宿主平面)挂载一次,Agent Preset 则决定自己的 agent 是否获得对应的面向模型委派工具。后续的组合包层(例如 [`dsh-web-app`](../web-app/README.md))和用户 profile 的 `cordis.patch.yml` 按 id 覆盖这些行;patch 会替换目标行的整个 `config`,因此模式专属的值放在各模式组合包中,而不是这里。该包没有运行时 API;profile 组合器通过 manifest(元数据清单)的 `dsh.bundle.patch` 字段解析 patch,绝不通过代码。 patch 在自身上按平台门控两个 shell 栈:`bash-sandbox`/`tool-bash` 携带 `disabled: !!js process.platform === 'win32'`(bash 没有 Windows runner),它们的孪生行 `pwsh-sandbox`/`tool-pwsh` 以取反的表达式仅在 win32 挂载——同一份 patch 文件,每个宿主恰好挂载一个 shell 栈。权限面与 POSIX 完全一致:`sandbox`/`sandbox-policy` 通过 Windows ACL 受限令牌 runner(`dsh-sandbox-local` 的 win32 链 → `@deepseek-ai/dsh-sandbox-windows-acl`)执行文件效果策略,权限切换器与 approval 服务原样运行,`fs-sandbox` 继续围栏 `ctx.fs` 写入——在其旁再挂载 `dsh-fs-local` 会重复注册 `ctx.fs` 并在加载时失败。偏好不受沙盒约束的本地 pwsh 执行器或完整访问的 Windows 主机通过其 profile 或 home 的 `cordis.patch.yml` 覆盖这些行(bash 恢复配方必须完整:禁用 `pwsh-sandbox`/`tool-pwsh` 并重新启用 `bash-sandbox`/`tool-bash`——两个执行器家族注册同一个 `bash` 服务,配方不完整会在加载时直接报错)。POSIX 主机看到的是被禁用的 pwsh 行。 @@ -19,5 +19,4 @@ patch 在自身上按平台门控两个 shell 栈:`bash-sandbox`/`tool-bash` ## 已知限制与暂缓事项 - **patch 会替换整行 `config`**:profile 覆盖必须重述该行需要保留的每个字段;不存在深度合并层。 -- **Claude SDK 的平台 CLI(命令行界面)仍在 Profile 安装闭包中**:base 组合包依赖 Claude 提供方,其生产路径解析宿主提供的 `claude`;移除 SDK 中未使用的可选载荷,推迟到产品安装闭包后续项处理。 - **Windows 的临时目录授权是按会话的私有子目录**——`workspace-write` 把写入限制在工作区与会话自己的 temp 子目录(`\dsh-`,受限子进程的 TMP/TEMP 被改写);`read-only` 不授予任何临时目录写入权限。见 `@deepseek-ai/dsh-sandbox-windows-acl`。 From 65f679b33a3e4ae003a015b406b756ccf9e638de Mon Sep 17 00:00:00 2001 From: Chinesezjc Date: Thu, 13 Aug 2026 16:54:57 +0800 Subject: [PATCH 068/103] ci: split failover switch into per-platform Linux and Windows variables Replace the single DSH_CI_FAILOVER variable with two independent switches so an outage on one platform no longer retargets the other: - DSH_CI_FAILOVER_LINUX: the three required Linux workers (node-24, node-24-coverage, node-24-consumers) and the all-checks-passed verdict, which resolves its pool to vm-backup and keeps its concurrency and cache-restore branches. - DSH_CI_FAILOVER_WINDOWS: the non-blocking windows-native job, which resolves to the dsh-win-ci pool. all-checks-passed rides the Linux switch because it aggregates the required Linux workers and runs on the vm-backup pool. The Dependabot exclusion is preserved on both switches. The failover runbook (EN/ZH) and its translation pairing, plus the docs that referenced the old variable, are updated in the same change. --- ...ence-based-larger-hosted-runners.i18n.yaml | 4 +- ...22-evidence-based-larger-hosted-runners.md | 2 +- ...evidence-based-larger-hosted-runners.zh.md | 2 +- .../2026-07-26-ci-failover-runbook.i18n.yaml | 4 +- .../process/2026-07-26-ci-failover-runbook.md | 22 ++++--- .../2026-07-26-ci-failover-runbook.zh.md | 22 ++++--- .github/AGENTS.md | 2 +- .github/workflows/ci.yml | 62 ++++++++++--------- scripts/ci-workflow.spec.ts | 25 +++++++- 9 files changed, 88 insertions(+), 57 deletions(-) diff --git a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml index 314705f776..4580a534c5 100644 --- a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md -2026-07-22-evidence-based-larger-hosted-runners.md: 84c951809891b4936549a2f429dc7efc99833c1b -2026-07-22-evidence-based-larger-hosted-runners.zh.md: bb5b585da26ffd15b5a1096cd40293f64fb69c79 +2026-07-22-evidence-based-larger-hosted-runners.md: e0d919851d99eac6539a25c63c9baeb49f76335f +2026-07-22-evidence-based-larger-hosted-runners.zh.md: 673bd7643506f022b640d14918dd7c883fb60e36 diff --git a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md index 84c9518098..e0d919851d 100644 --- a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md +++ b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md @@ -52,7 +52,7 @@ The process-bound coverage project contains exactly five suite files. Thirty-two Complete serial Linux, macOS, and Windows references run only when `master` moves. Pull requests use the enterprise required path plus standard-hosted compatibility jobs, while other larger-runner sizes run only by manual dispatch. -An additional serial Linux reference runs on the in-house self-hosted pool (`vm-backup` label: a 64-core VM with six always-on systemd-managed runner instances) on every `master` push. It is a hot-standby drill, not a required check: each run re-proves that the persistent VM can execute the complete unsharded aggregate. The actual switch is pre-wired: the three required Linux jobs resolve their pool through the writer-manageable `DSH_CI_FAILOVER` repository variable, so an outage response is setting one variable and re-running — no merge, which would be deadlocked behind the failing checks themselves ([runbook](2026-07-26-ci-failover-runbook.md)). The standby lane is push-triggered, so it always executes the base branch's workflow definition. Under failover, however, `pull_request` jobs do reach these runners with the PR merge ref's own workflow definition — the trust boundary is repository membership (the repository is private with forking disabled, and the selectors exclude Dependabot), as the [failover runbook](2026-07-26-ci-failover-runbook.md) records. +An additional serial Linux reference runs on the in-house self-hosted pool (`vm-backup` label: a 64-core VM with six always-on systemd-managed runner instances) on every `master` push. It is a hot-standby drill, not a required check: each run re-proves that the persistent VM can execute the complete unsharded aggregate. The actual switch is pre-wired: the three required Linux jobs resolve their pool through the writer-manageable `DSH_CI_FAILOVER_LINUX` repository variable, so an outage response is setting one variable and re-running — no merge, which would be deadlocked behind the failing checks themselves ([runbook](2026-07-26-ci-failover-runbook.md)). The standby lane is push-triggered, so it always executes the base branch's workflow definition. Under failover, however, `pull_request` jobs do reach these runners with the PR merge ref's own workflow definition — the trust boundary is repository membership (the repository is private with forking disabled, and the selectors exclude Dependabot), as the [failover runbook](2026-07-26-ci-failover-runbook.md) records. ## Alternatives considered diff --git a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md index bb5b585da2..673bd76435 100644 --- a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md +++ b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md @@ -52,7 +52,7 @@ Windows 仓库工作在超过 16 核后收益很小,但 32 核池可以让完 只有在 `master` 移动时,才运行完整的 Linux、macOS 和 Windows 串行参考。拉取请求使用企业级运行器必需路径和标准托管兼容性作业,其他大型运行器规格仅通过手动触发运行。 -另有一条串行 Linux 参考在每次 `master` 推送时运行于公司自有的自托管池(`vm-backup` 标签:一台 64 核虚拟机,运行 6 个常驻的 systemd 管理运行器实例)。它是热备演练而非必需检查:每次运行都重新证明这台持久化虚拟机能够执行完整的未分片聚合流程。实际切换机制已预先布线:三个必需 Linux 作业通过写入权限持有者可管理的仓库变量 `DSH_CI_FAILOVER` 解析运行器池,因此故障响应就是设置一个变量并重跑——无需合并(合并本身会被正在失败的检查阻塞,形成死锁)([切换手册](2026-07-26-ci-failover-runbook.md))。该热备通道由 push 触发,执行的始终是基础分支自身的工作流定义。但需要注意:故障切换期间,`pull_request` 作业确实会带着 PR merge 引用自带的工作流定义到达这些运行器——信任边界是仓库成员资格(仓库为私有且禁用 fork,选择器排除 Dependabot),详见[故障切换手册](2026-07-26-ci-failover-runbook.md)的记录。 +另有一条串行 Linux 参考在每次 `master` 推送时运行于公司自有的自托管池(`vm-backup` 标签:一台 64 核虚拟机,运行 6 个常驻的 systemd 管理运行器实例)。它是热备演练而非必需检查:每次运行都重新证明这台持久化虚拟机能够执行完整的未分片聚合流程。实际切换机制已预先布线:三个必需 Linux 作业通过写入权限持有者可管理的仓库变量 `DSH_CI_FAILOVER_LINUX` 解析运行器池,因此故障响应就是设置一个变量并重跑——无需合并(合并本身会被正在失败的检查阻塞,形成死锁)([切换手册](2026-07-26-ci-failover-runbook.md))。该热备通道由 push 触发,执行的始终是基础分支自身的工作流定义。但需要注意:故障切换期间,`pull_request` 作业确实会带着 PR merge 引用自带的工作流定义到达这些运行器——信任边界是仓库成员资格(仓库为私有且禁用 fork,选择器排除 Dependabot),详见[故障切换手册](2026-07-26-ci-failover-runbook.md)的记录。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml index ed819bc19e..2dd42d87db 100644 --- a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md -2026-07-26-ci-failover-runbook.md: 90ef2905bec86911697e552c0c1eac96ea0d3a18 -2026-07-26-ci-failover-runbook.zh.md: 5c8fd0e90ae31e3622ae6b49217591a54b84c351 +2026-07-26-ci-failover-runbook.md: b4522e623ffb76f3fd33d242b21c2d1d9ff2eadf +2026-07-26-ci-failover-runbook.zh.md: 58ba7ffee013d38f06afe097362f5c23f04b8121 diff --git a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md index 90ef2905be..b4522e623f 100644 --- a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md +++ b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md @@ -6,11 +6,11 @@ English | [中文](2026-07-26-ci-failover-runbook.zh.md) ## Problem -The three required Linux worker jobs in [CI](../../../../.github/workflows/ci.yml) (`node 24 / static`, `node 24 / coverage`, `node 24 / snapshots and artifacts`) run on the hosted enterprise 32-core pools; the required verdict job that aggregates them (`all checks passed`) runs on standard `ubuntu-latest`; the independent native Windows job (`windows node 24 / native complete`) runs on the hosted `dsh-windows-2025-16core` larger runner. When the enterprise pools degrade — jobs queue indefinitely or the enterprise labels vanish — every open pull request becomes unmergeable, and the ordinary recovery of merging a fix is itself deadlocked behind the very required checks that cannot run. **Scope: this switch recovers an enterprise Linux-pool outage AND a hosted Windows-pool outage.** The verdict's other required dependencies (`node-compat`, `python-sdk`, `windows`) stay on standard hosted runners by design (the portable boundary); in a broader GitHub-hosted capacity failure that also takes out the standard pools, those dependencies still block `all checks passed`. An outage therefore needs a switch any responder with repository write access can throw without merging anything. +The three required Linux worker jobs in [CI](../../../../.github/workflows/ci.yml) (`node 24 / static`, `node 24 / coverage`, `node 24 / snapshots and artifacts`) run on the hosted enterprise 32-core pools; the required verdict job that aggregates them (`all checks passed`) runs on standard `ubuntu-latest`; the independent native Windows job (`windows node 24 / native complete`) runs on the hosted `dsh-windows-2025-16core` larger runner. When the enterprise pools degrade — jobs queue indefinitely or the enterprise labels vanish — every open pull request becomes unmergeable, and the ordinary recovery of merging a fix is itself deadlocked behind the very required checks that cannot run. **Scope: two independent switches, one per platform.** `DSH_CI_FAILOVER_LINUX` recovers an enterprise Linux-pool outage (the three required Linux workers plus the `all checks passed` verdict); `DSH_CI_FAILOVER_WINDOWS` recovers a hosted Windows-pool outage (the native Windows job). A Linux-pool outage need not retarget the native Windows job and vice versa. The verdict's other required dependencies (`node-compat`, `python-sdk`, `windows`) stay on standard hosted runners by design (the portable boundary); in a broader GitHub-hosted capacity failure that also takes out the standard pools, those dependencies still block `all checks passed`. An outage therefore needs a switch any responder with repository write access can throw without merging anything. ## Decision -Each of the three required Linux worker jobs, the independent native Windows job, and the `all checks passed` verdict job — which would otherwise stay queued on the failed pool even after every worker passed — resolves its runner pool through the `DSH_CI_FAILOVER` repository variable. Unset (normal), they run on the hosted enterprise pools. Set to `selfhosted` by any repository writer, all five retarget onto the in-house self-hosted pools: the Linux jobs and verdict onto the `vm-backup` pool, coverage and snapshot concurrency drop to shared-VM bounds, and the hosted-path pnpm cache restores are skipped; the native Windows job onto the `dsh-win-ci` pool. The switch is writer-manageable repository state, not a merge, so it works while every check is red. The in-house pools' readiness is continuously re-proven by the `serial / linux (self-hosted standby)` and `serial / windows (self-hosted standby)` lanes, which run the complete unsharded aggregates on every master push. +Each of the three required Linux worker jobs, the independent native Windows job, and the `all checks passed` verdict job — which would otherwise stay queued on the failed pool even after every worker passed — resolves its runner pool through a repository variable, and the switch is split by platform so an outage on one platform does not retarget the other. The three Linux workers and the `all checks passed` verdict (whose `needs` are the required Linux workers and which runs on the `vm-backup` pool) resolve through `DSH_CI_FAILOVER_LINUX`; the native Windows job resolves through `DSH_CI_FAILOVER_WINDOWS`. Unset (normal), they run on the hosted enterprise pools. Set to `selfhosted` by any repository writer, the corresponding jobs retarget onto the in-house self-hosted pool: under `DSH_CI_FAILOVER_LINUX`, the Linux jobs and verdict move onto the `vm-backup` pool, coverage and snapshot concurrency drop to shared-VM bounds, and the hosted-path pnpm cache restores are skipped; under `DSH_CI_FAILOVER_WINDOWS`, the native Windows job moves onto the `dsh-win-ci` pool. Each switch is writer-manageable repository state, not a merge, so it works while every check is red. The in-house pools' readiness is continuously re-proven by the `serial / linux (self-hosted standby)` and `serial / windows (self-hosted standby)` lanes, which run the complete unsharded aggregates on every master push. `ci.yml` exempts exactly one event from `cancel-in-progress` (`${{ github.event_name != 'push' }}`), so one master push does not cancel the drill still running from the previous one. Each drill runs its complete unsharded aggregate with one gate worker, which takes longer than the interval between master merges; under unconditional cancellation a drill is superseded before reaching a verdict and the lane yields no readiness evidence for a responder to check. @@ -28,13 +28,15 @@ The decision belongs at workflow level because cancellation applies to the whole ### Switch (any repository writer, ~1 minute, no merge) -1. Repository **Settings → Secrets and variables → Actions → Variables → New repository variable**: name `DSH_CI_FAILOVER`, value `selfhosted`. +The two switches are independent: flip only the one whose platform is degraded. + +1. Repository **Settings → Secrets and variables → Actions → Variables → New repository variable**: name `DSH_CI_FAILOVER_LINUX` (Linux pool outage) or `DSH_CI_FAILOVER_WINDOWS` (Windows pool outage), value `selfhosted`. 2. Retrigger the required jobs so they re-resolve their pool. Jobs already **queued** for the hosted labels do not retarget and cannot be re-run in place, so for the documented indefinite-queue outage, cancel the stuck run and re-run all jobs, or push a new commit; "Re-run failed jobs" only helps once a job has actually failed rather than queued. -3. That is the entire switch. Under failover the workflow also, automatically: drops `DSH_COVERAGE_MAX_WORKERS` to 8 and `DSH_SNAPSHOT_MAX_CONCURRENCY` to 12 (sized for six always-on instances: worst case 6 × 8 = 48 coverage workers on the 64-core VM) (shared-VM contention bounds), and skips the hosted-path pnpm cache restores (the VM's persistent store serves warm installs). +3. That is the entire switch. Under Linux failover the workflow also, automatically: drops `DSH_COVERAGE_MAX_WORKERS` to 8 and `DSH_SNAPSHOT_MAX_CONCURRENCY` to 12 (sized for six always-on instances: worst case 6 × 8 = 48 coverage workers on the 64-core VM) (shared-VM contention bounds), and skips the hosted-path pnpm cache restores (the VM's persistent store serves warm installs). The Windows switch has no such concurrency or cache branches; it only retargets the native Windows job's pool. -#**Dependabot exception.** All five selectors deliberately exclude `dependabot[bot]`: under failover, Dependabot PRs stay queued for the hosted pool rather than executing dependency-supplied code on the persistent VMs. A Dependabot PR that remains queued during an outage is expected behavior, not a failed switch; it completes when the hosted pool recovers. +#**Dependabot exception.** Both switches' selectors deliberately exclude `dependabot[bot]`: under failover, Dependabot PRs stay queued for the hosted pool rather than executing dependency-supplied code on the persistent VMs. A Dependabot PR that remains queued during an outage is expected behavior, not a failed switch; it completes when the hosted pool recovers. -**Who can flip the variable.** GitHub's API lets any collaborator with write access manage repository variables, so the switch is writer-level, not strictly admin-only. In this repository's trust model that is not an escalation: the runner groups admit all workflows of this private, fork-disabled repository (a deliberate trade to make PR-ref failover possible at all), so any writer could already reach the VMs by pushing a branch workflow. The boundary against untrusted code is repository membership; the variable only routes work for members. +**Who can flip the variable.** GitHub's API lets any collaborator with write access manage repository variables, so each switch is writer-level, not strictly admin-only. In this repository's trust model that is not an escalation: the runner groups admit all workflows of this private, fork-disabled repository (a deliberate trade to make PR-ref failover possible at all), so any writer could already reach the VMs by pushing a branch workflow. The boundary against untrusted code is repository membership; the variables only route work for members. ## Capacity during failover @@ -43,18 +45,18 @@ Six always-on instances absorb normal PR traffic (the pool's steady-state load i ### Switch back -Delete the `DSH_CI_FAILOVER` variable (or set it to anything other than `selfhosted`). New runs resolve back to the hosted enterprise pools. Remove any extra instances that were registered during the incident. +Delete the `DSH_CI_FAILOVER_LINUX` or `DSH_CI_FAILOVER_WINDOWS` variable (or set it to anything other than `selfhosted`). New runs resolve back to the hosted enterprise pools. Remove any extra instances that were registered during the incident. ### Trust boundary -The variable is writer-manageable repository state; a pull request event itself can neither set it nor read a different value into effect, and the selector expressions live in workflow definitions. Note that under failover, `pull_request` runs execute the PR merge ref's own workflow definition — the boundary against untrusted code is repository membership (private, forking disabled, Dependabot excluded by the selectors), not the variable. Note on runner-group policy: pinning the runner group to the master-ref workflow is **incompatible** with this failover — the four failover jobs are `pull_request` runs evaluated from PR merge refs, and a master-pinned group leaves them queued (observed live on 2026-07-27; the group was widened to all workflows of this repository to unblock the switch). A stricter runner-side policy therefore costs PR failover; the shipped posture accepts repository-scoped, all-workflow group access. +The variables are writer-manageable repository state; a pull request event itself can neither set them nor read a different value into effect, and the selector expressions live in workflow definitions. Note that under failover, `pull_request` runs execute the PR merge ref's own workflow definition — the boundary against untrusted code is repository membership (private, forking disabled, Dependabot excluded by the selectors), not the variable. Note on runner-group policy: pinning the runner group to the master-ref workflow is **incompatible** with this failover — the five failover jobs are `pull_request` runs evaluated from PR merge refs, and a master-pinned group leaves them queued (observed live on 2026-07-27; the group was widened to all workflows of this repository to unblock the switch). A stricter runner-side policy therefore costs PR failover; the shipped posture accepts repository-scoped, all-workflow group access. ## Alternatives considered **Merge a workflow change to switch pools.** Rejected because the outage that motivates the switch is exactly the state in which no PR can merge: the required checks are the ones failing. A repository variable is writer-manageable state that takes effect on re-run without a merge. -**Keep the self-hosted pool always in the required path.** Rejected because it trades hosted-pool availability for the in-house VM's, moving a single point of failure rather than adding a fallback. The variable keeps the hosted pools primary and the self-hosted pool a proven, one-action standby. +**Keep the self-hosted pool always in the required path.** Rejected because it trades hosted-pool availability for the in-house VM's, moving a single point of failure rather than adding a fallback. The variables keep the hosted pools primary and the self-hosted pools proven, one-action standbys; splitting them by platform means an outage on one platform does not retarget the other. ## Consequences -Recovering from a hosted-pool outage is a single variable (any writer) plus a re-run, with no merge on the critical path. The cost is a second runner topology to keep working: the standby lane exercises it on every master push so the failover target never goes stale, and the concurrency and cache-restore branches in `ci.yml` carry a `selfhosted` leg that must stay in step with the hosted leg. +Recovering from a hosted-pool outage is flipping the affected platform's variable (any writer) plus a re-run, with no merge on the critical path. The cost is a second runner topology per platform to keep working: the standby lanes exercise them on every master push so the failover targets never go stale, and the concurrency and cache-restore branches in `ci.yml` carry a `selfhosted` leg (Linux only) that must stay in step with the hosted leg. Splitting the switch by platform adds one more variable to manage but bounds the blast radius of each switch to the jobs of a single platform. diff --git a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md index 5c8fd0e90a..58ba7ffee0 100644 --- a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md +++ b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md @@ -6,11 +6,11 @@ Status: implemented ## 问题 -[CI](../../../../.github/workflows/ci.yml) 中三个必需的 Linux 工作作业(`node 24 / static`、`node 24 / coverage`、`node 24 / snapshots and artifacts`)运行在托管的企业级 32 核池上;聚合它们的必需判定作业(`all checks passed`)运行在标准 `ubuntu-latest` 上;独立的原生 Windows 作业(`windows node 24 / native complete`)运行在托管的 `dsh-windows-2025-16core` 大型运行器上。当企业池发生故障——作业无限排队或企业标签消失——所有开启的拉取请求都无法合并,而"合并一个修复"这一常规恢复手段本身正被那些无法运行的必需检查死锁。**适用范围:本切换恢复的是企业级 Linux 池故障与托管 Windows 池故障。**判定作业的其余必需依赖(`node-compat`、`python-sdk`、`windows`)按设计留在标准托管运行器上(可移植边界);若更大范围的 GitHub 托管容量故障连标准池一并击倒,这些依赖仍会阻塞 `all checks passed`。因此故障需要一个任何具备仓库写权限的响应者都能在不合并任何代码的情况下触发的开关。 +[CI](../../../../.github/workflows/ci.yml) 中三个必需的 Linux 工作作业(`node 24 / static`、`node 24 / coverage`、`node 24 / snapshots and artifacts`)运行在托管的企业级 32 核池上;聚合它们的必需判定作业(`all checks passed`)运行在标准 `ubuntu-latest` 上;独立的原生 Windows 作业(`windows node 24 / native complete`)运行在托管的 `dsh-windows-2025-16core` 大型运行器上。当企业池发生故障——作业无限排队或企业标签消失——所有开启的拉取请求都无法合并,而"合并一个修复"这一常规恢复手段本身正被那些无法运行的必需检查死锁。**适用范围:两个独立开关,每个平台一个。**`DSH_CI_FAILOVER_LINUX` 恢复企业级 Linux 池故障(三个必需的 Linux 工作作业加 `all checks passed` 判定作业);`DSH_CI_FAILOVER_WINDOWS` 恢复托管 Windows 池故障(原生 Windows 作业)。Linux 池故障无需重定向原生 Windows 作业,反之亦然。判定作业的其余必需依赖(`node-compat`、`python-sdk`、`windows`)按设计留在标准托管运行器上(可移植边界);若更大范围的 GitHub 托管容量故障连标准池一并击倒,这些依赖仍会阻塞 `all checks passed`。因此故障需要一个任何具备仓库写权限的响应者都能在不合并任何代码的情况下触发的开关。 ## 决策 -三个必需的 Linux 工作作业、独立的原生 Windows 作业,以及 `all checks passed` 判定作业(若不随切换,即使全部工作作业通过,它仍会滞留在故障池的队列中)——各自通过仓库变量 `DSH_CI_FAILOVER` 解析运行器池。变量不存在(正常)时它们运行在托管企业池上;由任何具备写权限的协作者设为 `selfhosted` 时,五个作业全部切换到公司自有的自托管池:Linux 作业与判定作业切到 `vm-backup` 池,覆盖率与快照的并发降到共享虚拟机上限,并跳过托管路径的 pnpm 缓存恢复;原生 Windows 作业切到 `dsh-win-ci` 池。这个开关是写者可管理的仓库状态而非一次合并,因此在所有检查都是红色时仍然有效。自有池的就绪状态由 `serial / linux (self-hosted standby)` 与 `serial / windows (self-hosted standby)` 通道持续验证——每次 master 推送都在其上运行完整的未分片聚合流程。 +三个必需的 Linux 工作作业、独立的原生 Windows 作业,以及 `all checks passed` 判定作业(若不随切换,即使全部工作作业通过,它仍会滞留在故障池的队列中)——各自通过仓库变量解析运行器池,且开关按平台拆分,使一个平台的故障不会重定向另一个平台。三个 Linux 工作作业与 `all checks passed` 判定作业(其 `needs` 是必需的 Linux 工作作业,且运行在 `vm-backup` 池上)通过 `DSH_CI_FAILOVER_LINUX` 解析;原生 Windows 作业通过 `DSH_CI_FAILOVER_WINDOWS` 解析。变量不存在(正常)时它们运行在托管企业池上;由任何具备写权限的协作者设为 `selfhosted` 时,对应作业切换到公司自有的自托管池:`DSH_CI_FAILOVER_LINUX` 下,Linux 作业与判定作业切到 `vm-backup` 池,覆盖率与快照的并发降到共享虚拟机上限,并跳过托管路径的 pnpm 缓存恢复;`DSH_CI_FAILOVER_WINDOWS` 下,原生 Windows 作业切到 `dsh-win-ci` 池。每个开关都是写者可管理的仓库状态而非一次合并,因此在所有检查都是红色时仍然有效。自有池的就绪状态由 `serial / linux (self-hosted standby)` 与 `serial / windows (self-hosted standby)` 通道持续验证——每次 master 推送都在其上运行完整的未分片聚合流程。 `ci.yml` 只豁免一个事件不做取消(`${{ github.event_name != 'push' }}`),因此一次 master 推送不会取消上一次推送留下的、仍在运行的演练。每次演练以单门禁工作进程执行完整的未分片聚合流程,耗时长于 master 合并的间隔;在无条件取消下,演练会在得出结论前被后续运行取代,该通道无法产出供响应者查看的就绪证据。 @@ -28,13 +28,15 @@ Status: implemented ### 切换步骤(任何具备写权限的协作者,约 1 分钟,无需合并) -1. 仓库 **Settings → Secrets and variables → Actions → Variables → New repository variable**:名称 `DSH_CI_FAILOVER`,值 `selfhosted`。 +两个开关相互独立:只切换发生故障的那个平台。 + +1. 仓库 **Settings → Secrets and variables → Actions → Variables → New repository variable**:名称 `DSH_CI_FAILOVER_LINUX`(Linux 池故障)或 `DSH_CI_FAILOVER_WINDOWS`(Windows 池故障),值 `selfhosted`。 2. 重新触发必需作业,使其重新解析运行器池。已经为托管标签**排队**的作业不会重定向,也无法原地 re-run,因此对于本手册所述的无限排队故障,应取消卡住的运行并 re-run all jobs,或推送一个新提交;“Re-run failed jobs”只有在作业真正失败(而非仍在排队)时才有用。 -3. 切换到此完成。故障切换状态下工作流还会自动:把 `DSH_COVERAGE_MAX_WORKERS` 降为 8、`DSH_SNAPSHOT_MAX_CONCURRENCY` 降为 12(按 6 个常驻实例定容:最坏情况下,6 × 8 = 48 个覆盖率工作进程运行在 64 核虚拟机上)(共享虚拟机的争抢上限),并跳过托管路径的 pnpm 缓存恢复(虚拟机的持久 store 直接提供热安装)。 +3. 切换到此完成。Linux 故障切换状态下工作流还会自动:把 `DSH_COVERAGE_MAX_WORKERS` 降为 8、`DSH_SNAPSHOT_MAX_CONCURRENCY` 降为 12(按 6 个常驻实例定容:最坏情况下,6 × 8 = 48 个覆盖率工作进程运行在 64 核虚拟机上)(共享虚拟机的争抢上限),并跳过托管路径的 pnpm 缓存恢复(虚拟机的持久 store 直接提供热安装)。Windows 开关没有这类并发或缓存分支;它只重定向原生 Windows 作业的运行器池。 -#**Dependabot 例外。**五个选择器都刻意排除了 `dependabot[bot]`:故障切换期间,Dependabot 拉取请求继续在托管池排队,而不是把依赖项提供的代码放到持久化虚拟机上执行。故障期间 Dependabot PR 持续排队是预期行为而非切换失败;托管池恢复后它会自行完成。 +#**Dependabot 例外。**两个开关的选择器都刻意排除了 `dependabot[bot]`:故障切换期间,Dependabot 拉取请求继续在托管池排队,而不是把依赖项提供的代码放到持久化虚拟机上执行。故障期间 Dependabot PR 持续排队是预期行为而非切换失败;托管池恢复后它会自行完成。 -**谁能扳动这个变量。**GitHub 的 API 允许任何具有写权限的协作者管理仓库变量,因此该开关实际是写者级而非严格的管理员级。在本仓库的信任模型下这并不构成升权:runner group 接纳本私有、禁 fork 仓库的全部工作流(这是让 PR 引用的故障切换得以成立的刻意取舍),因此任何写者本就可以通过推送分支工作流触达这台虚拟机。抵御不可信代码的边界是仓库成员资格;变量只是为成员路由工作。 +**谁能扳动这个变量。**GitHub 的 API 允许任何具有写权限的协作者管理仓库变量,因此每个开关实际是写者级而非严格的管理员级。在本仓库的信任模型下这并不构成升权:runner group 接纳本私有、禁 fork 仓库的全部工作流(这是让 PR 引用的故障切换得以成立的刻意取舍),因此任何写者本就可以通过推送分支工作流触达这台虚拟机。抵御不可信代码的边界是仓库成员资格;变量只是为成员路由工作。 ## 切换期间的容量 @@ -43,18 +45,18 @@ Status: implemented ### 切回 -删除 `DSH_CI_FAILOVER` 变量(或改为 `selfhosted` 以外的任何值),新的运行即解析回托管企业池。若故障期间追加注册过实例,将其移除。 +删除 `DSH_CI_FAILOVER_LINUX` 或 `DSH_CI_FAILOVER_WINDOWS` 变量(或改为 `selfhosted` 以外的任何值),新的运行即解析回托管企业池。若故障期间追加注册过实例,将其移除。 ### 信任边界 -该变量是写者可管理的仓库状态;`pull_request` 事件本身既不能设置它,也不能让不同的值生效,选择器表达式存在于工作流定义中。需要注意:故障切换期间,`pull_request` 运行执行的是 PR merge 引用自带的工作流定义——抵御不可信代码的边界是仓库成员资格(私有、禁 fork、选择器排除 Dependabot),而非该变量。关于 runner group 策略的说明:把 runner group 绑定到 master 引用的工作流与本故障切换机制**不兼容**——四个故障切换作业是从 PR merge 引用求值的 `pull_request` 运行,master 绑定的组会让它们持续排队(2026-07-27 实际故障中亲历;当时将组放宽为本仓库全部工作流才疏通了切换)。更严格的运行器侧策略以牺牲 PR 故障切换为代价;当前采用的形态是仓库范围、全工作流的组访问。 +这些变量是写者可管理的仓库状态;`pull_request` 事件本身既不能设置它们,也不能让不同的值生效,选择器表达式存在于工作流定义中。需要注意:故障切换期间,`pull_request` 运行执行的是 PR merge 引用自带的工作流定义——抵御不可信代码的边界是仓库成员资格(私有、禁 fork、选择器排除 Dependabot),而非该变量。关于 runner group 策略的说明:把 runner group 绑定到 master 引用的工作流与本故障切换机制**不兼容**——五个故障切换作业是从 PR merge 引用求值的 `pull_request` 运行,master 绑定的组会让它们持续排队(2026-07-27 实际故障中亲历;当时将组放宽为本仓库全部工作流才疏通了切换)。更严格的运行器侧策略以牺牲 PR 故障切换为代价;当前采用的形态是仓库范围、全工作流的组访问。 ## 曾考虑的替代方案 **通过合并一次工作流改动来切换池。** 否决,因为触发切换的故障状态恰恰是任何 PR 都无法合并的状态:必需检查正是失败的那些。仓库变量是写者可管理的状态,重跑即生效,无需合并。 -**让自托管池长期处于必需路径中。** 否决,因为这是拿托管池的可用性去换自有虚拟机的可用性,只是搬移了单点故障而非增加回退。该变量让托管池保持主路径,自托管池作为一个经过验证、一步即可启用的热备。 +**让自托管池长期处于必需路径中。** 否决,因为这是拿托管池的可用性去换自有虚拟机的可用性,只是搬移了单点故障而非增加回退。这些变量让托管池保持主路径,自托管池作为一个经过验证、一步即可启用的热备;按平台拆分意味着一个平台的故障不会重定向另一个平台。 ## 后果 -从托管池故障中恢复只需一个变量(任何写者可设)加一次重跑,关键路径上没有合并。代价是要维护第二套运行器拓扑:热备通道在每次 master 推送时都运行它,避免故障切换目标变得陈旧;而 `ci.yml` 中的并发与缓存恢复分支带有一条 `selfhosted` 支路,必须与托管支路保持同步。 +从托管池故障中恢复只需切换受影响平台的变量(任何写者可设)加一次重跑,关键路径上没有合并。代价是每个平台都要维护第二套运行器拓扑:热备通道在每次 master 推送时都运行它们,避免故障切换目标变得陈旧;而 `ci.yml` 中的并发与缓存恢复分支带有一条 `selfhosted` 支路(仅 Linux),必须与托管支路保持同步。按平台拆分开关多了一个需要管理的变量,但把每个开关的影响范围限定在单个平台的作业上。 diff --git a/.github/AGENTS.md b/.github/AGENTS.md index 3e879db8ae..0c1f0dc780 100644 --- a/.github/AGENTS.md +++ b/.github/AGENTS.md @@ -1,3 +1,3 @@ # AGENTS.md — GitHub Actions -Run jobs on Windows runners (`windows-*` labels) under native `pwsh`. The pull-request `windows` job is the deliberate exception: it runs Windows Node under Wine on hosted Linux and blocks `all checks passed`; `windows-native` runs automatically on `windows-2025` (or the self-hosted `[self-hosted, dsh-win-ci, windows]` pool under `DSH_CI_FAILOVER=selfhosted`) but reports independently. The master `serial-windows` standby continuously validates the self-hosted failover target — see the [failover runbook](../.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md). +Run jobs on Windows runners (`windows-*` labels) under native `pwsh`. The pull-request `windows` job is the deliberate exception: it runs Windows Node under Wine on hosted Linux and blocks `all checks passed`; `windows-native` runs automatically on `windows-2025` (or the self-hosted `[self-hosted, dsh-win-ci, windows]` pool under `DSH_CI_FAILOVER_WINDOWS=selfhosted`) but reports independently. The master `serial-windows` standby continuously validates the self-hosted failover target — see the [failover runbook](../.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7bb2bc1518..7775827c66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,8 +49,8 @@ jobs: # build-backed consumer tail. The consumer job owns the only Linux build so # all three jobs enter runner allocation independently. # - # FAILOVER: each Linux enterprise job resolves its pool through the - # DSH_CI_FAILOVER repository variable. Unset (normal), the expressions + # FAILOVER (Linux): each Linux enterprise job resolves its pool through the + # DSH_CI_FAILOVER_LINUX repository variable. Unset (normal), the expressions # pick the hosted enterprise pools below. Setting the variable to # 'selfhosted' (repo Settings → Actions → Variables; writer-manageable # repository state — not PR-editable, no merge required) retargets all @@ -58,11 +58,12 @@ jobs: # vm-backup pool and re-running the failed jobs is the entire switch — # see .agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md. The # in-house pool's readiness is re-proven on every master push by the - # serial-linux-selfhosted standby lane below. + # serial-linux-selfhosted standby lane below. The Windows failover switch is + # the separate DSH_CI_FAILOVER_WINDOWS variable on the windows-native job below. node-24: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'dsh-ubuntu-24-04-16core' }} @@ -96,7 +97,7 @@ jobs: # compression and upload on the paid latency-critical path. Skipped # under failover — see the coverage lane's identical rationale. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ${{ steps.pnpm-store.outputs.path }} key: ${{ runner.os }}-node-${{ env.PRIMARY_NODE_VERSION }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} @@ -114,7 +115,7 @@ jobs: node-24-coverage: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'dsh-ubuntu-24-04-16core' }} @@ -124,7 +125,7 @@ jobs: # shares one 64-core VM across six always-on runner instances, so each # instance may use eight while keeping the worst case at 8 × 6 = 48 # workers; process-bound suites remain isolated in forks. - DSH_COVERAGE_MAX_WORKERS: ${{ vars.DSH_CI_FAILOVER == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '8' || '6' }} + DSH_COVERAGE_MAX_WORKERS: ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '8' || '6' }} DSH_GATE_CONCURRENCY: '3' steps: - uses: actions/checkout@v6 @@ -151,7 +152,7 @@ jobs: # already serves warm installs, while restoring the hosted archive # would spend ~52 s pulling ~180 MB into that populated store. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ${{ steps.pnpm-store.outputs.path }} key: ${{ runner.os }}-node-${{ env.PRIMARY_NODE_VERSION }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} @@ -177,7 +178,7 @@ jobs: node-24-consumers: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'dsh-ubuntu-24-04-16core' }} @@ -188,7 +189,7 @@ jobs: DSH_OXLINT_THREADS: '8' DSH_PUBLINT_CONCURRENCY: '8' # Failover halves snapshot concurrency for the shared 64-core VM. - DSH_SNAPSHOT_MAX_CONCURRENCY: ${{ vars.DSH_CI_FAILOVER == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '12' || '32' }} + DSH_SNAPSHOT_MAX_CONCURRENCY: ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '12' || '32' }} steps: - uses: actions/checkout@v6 with: @@ -212,7 +213,7 @@ jobs: # Skipped under failover — see the coverage lane's identical rationale. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ${{ steps.pnpm-store.outputs.path }} key: ${{ runner.os }}-node-${{ env.PRIMARY_NODE_VERSION }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} @@ -222,7 +223,7 @@ jobs: # Pull requests restore the cache normally produced by serial-linux on # master; they do not pay compression and upload on the required path. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ~/.cache/ms-playwright key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }} @@ -243,13 +244,13 @@ jobs: exit "$sandbox_status" - name: Install Playwright Chromium and hosted dependencies - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' run: pnpm --filter @deepseek-ai/dsh-web-frontend exec playwright install --with-deps chromium # The persistent VM image owns Playwright's Linux system packages; do # not mutate the shared host with apt on every failover run. - name: Install Playwright Chromium on the failover VM - if: vars.DSH_CI_FAILOVER == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' run: pnpm --filter @deepseek-ai/dsh-web-frontend exec playwright install chromium - name: Run compatibility, snapshot, and artifact gates @@ -437,13 +438,16 @@ jobs: # its own unmasked conclusion but is deliberately absent from # all-checks-passed.needs, so it never delays or changes that required # verdict. Under normal operation it runs on the hosted larger runner; under - # failover (DSH_CI_FAILOVER=selfhosted) it retargets onto the in-house - # self-hosted Windows pool. Dependabot PRs are excluded from the self-hosted - # pool and stay queued for the hosted runner — see the failover runbook. + # Windows failover (DSH_CI_FAILOVER_WINDOWS=selfhosted) it retargets onto the + # in-house self-hosted Windows pool. Dependabot PRs are excluded from the + # self-hosted pool and stay queued for the hosted runner — see the failover + # runbook. This Windows switch is independent of the Linux + # DSH_CI_FAILOVER_LINUX variable that retargets the three required Linux jobs + # and the all-checks-passed verdict above. windows-native: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_WINDOWS == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "dsh-win-ci", "windows"]') || 'dsh-windows-2025-16core' }} @@ -558,7 +562,7 @@ jobs: # re-runs the complete unsharded aggregate on the persistent 64-core VM, # continuously proving that environment can take over a required lane if # the hosted pools degrade (the switch is then setting the writer-manageable - # DSH_CI_FAILOVER variable — see the failover runbook, no merge required). + # DSH_CI_FAILOVER_LINUX variable — see the failover runbook, no merge required). # Push-triggered, so this lane always executes the base branch's own # workflow definition. (Under failover, pull_request jobs do reach these # runners with the PR merge ref's workflow — the boundary there is @@ -644,11 +648,11 @@ jobs: # move re-runs the complete unsharded Windows gate inventory on the persistent # VM, continuously proving that environment can take over the required # `windows` lane if the hosted pool degrades (the switch is setting the - # writer-manageable DSH_CI_FAILOVER variable — see the failover runbook, no - # merge required). Push-triggered, so this lane always executes the base - # branch's own workflow definition. Non-blocking for pull requests; absent - # from all-checks-passed.needs by design — the required `windows` job owns - # the PR verdict. No cache steps because the VM's persistent pnpm store + # writer-manageable DSH_CI_FAILOVER_WINDOWS variable — see the failover + # runbook, no merge required). Push-triggered, so this lane always executes + # the base branch's own workflow definition. Non-blocking for pull requests; + # absent from all-checks-passed.needs by design — the required `windows` job + # owns the PR verdict. No cache steps because the VM's persistent pnpm store # and tool caches make them redundant (and saving here would poison the # hosted cache namespace with self-hosted paths). serial-windows: @@ -911,11 +915,13 @@ jobs: all-checks-passed: name: all checks passed # This bookkeeping-only verdict must not depend on custom-pool - # provisioning — and under failover it follows the same selector as the - # worker jobs it aggregates, so a standard-hosted outage cannot strand - # the branch-protection verdict either. + # provisioning — and under Linux failover it follows the same selector as + # the worker jobs it aggregates, so a standard-hosted outage cannot strand + # the branch-protection verdict either. It retargets with the Linux switch + # (DSH_CI_FAILOVER_LINUX), not the Windows one, because it aggregates the + # required Linux workers and runs on the vm-backup pool. runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'ubuntu-latest' }} diff --git a/scripts/ci-workflow.spec.ts b/scripts/ci-workflow.spec.ts index b54c729a38..84ac580f31 100644 --- a/scripts/ci-workflow.spec.ts +++ b/scripts/ci-workflow.spec.ts @@ -34,14 +34,20 @@ describe('CI workflow', () => { || !isRecord(workflow.jobs['windows-native']) || !isRecord(workflow.jobs['wine-apt-cache']) || !isRecord(workflow.jobs['serial-windows']) + || !isRecord(workflow.jobs['node-24']) + || !isRecord(workflow.jobs['node-24-coverage']) + || !isRecord(workflow.jobs['node-24-consumers']) || !isRecord(workflow.jobs['all-checks-passed'])) { - throw new TypeError('CI workflow must define windows, windows-native, wine-apt-cache, serial-windows, and all-checks-passed jobs') + throw new TypeError('CI workflow must define windows, windows-native, wine-apt-cache, serial-windows, node-24, node-24-coverage, node-24-consumers, and all-checks-passed jobs') } const windows = workflow.jobs.windows const windowsNative = workflow.jobs['windows-native'] const wineAptCache = workflow.jobs['wine-apt-cache'] const serialWindows = workflow.jobs['serial-windows'] + const node24 = workflow.jobs['node-24'] + const node24Coverage = workflow.jobs['node-24-coverage'] + const node24Consumers = workflow.jobs['node-24-consumers'] const aggregate = workflow.jobs['all-checks-passed'] if (!Array.isArray(windows.steps) || !Array.isArray(aggregate.needs)) { throw new TypeError('Windows job must define steps and the aggregate must define needs') @@ -57,8 +63,10 @@ describe('CI workflow', () => { expect(commandSteps.some(step => step.run.includes('wine-windows-gates.sh'))).toBe(true) // windows-native: non-blocking native job with failover, runs windows-complete. + // Its pool is resolved by the Windows-specific switch. expect(typeof windowsNative['runs-on']).toBe('string') - expect(windowsNative['runs-on']).toContain('DSH_CI_FAILOVER') + expect(windowsNative['runs-on']).toContain('DSH_CI_FAILOVER_WINDOWS') + expect(windowsNative['runs-on']).not.toContain('DSH_CI_FAILOVER_LINUX') expect(windowsNative['runs-on']).toContain('self-hosted') expect(windowsNative['runs-on']).toContain('dsh-win-ci') expect(windowsNative['runs-on']).toContain('dsh-windows-2025-16core') @@ -82,6 +90,19 @@ describe('CI workflow', () => { expect(aggregate.needs).toContain('windows') expect(aggregate.needs).not.toContain('windows-native') expect(aggregate.needs).not.toContain('serial-windows') + + // Linux failover is a separate switch: the three required Linux workers + // and the verdict job resolve their pool through DSH_CI_FAILOVER_LINUX, + // never the Windows switch. + for (const [jobName, job] of [['node-24', node24], ['node-24-coverage', node24Coverage], ['node-24-consumers', node24Consumers]] as const) { + expect(typeof job['runs-on']).toBe('string') + expect(job['runs-on'], `${jobName} runs-on must use the Linux failover switch`).toContain('DSH_CI_FAILOVER_LINUX') + expect(job['runs-on'], `${jobName} runs-on must not use the Windows failover switch`).not.toContain('DSH_CI_FAILOVER_WINDOWS') + expect(job['runs-on']).toContain('vm-backup') + } + expect(aggregate['runs-on']).toContain('DSH_CI_FAILOVER_LINUX') + expect(aggregate['runs-on']).not.toContain('DSH_CI_FAILOVER_WINDOWS') + expect(aggregate['runs-on']).toContain('vm-backup') }) it('exempts push from cancellation, so one master merge does not cancel the running drill', () => { From 5c085e3511689f8b4fa7c129a90702a9e8039038 Mon Sep 17 00:00:00 2001 From: pku-xht Date: Thu, 13 Aug 2026 16:55:59 +0800 Subject: [PATCH 069/103] docs(subagent): align provider opt-in examples --- ...uct-subagent-providers-in-shared-host.i18n.yaml | 4 ++-- ...10-product-subagent-providers-in-shared-host.md | 14 +++++++------- ...product-subagent-providers-in-shared-host.zh.md | 14 +++++++------- .../subagent/subagent-claude-code/README.i18n.yaml | 4 ++-- packages/subagent/subagent-claude-code/README.md | 1 - .../subagent/subagent-claude-code/README.zh.md | 1 - packages/subagent/subagent-codex/README.i18n.yaml | 4 ++-- packages/subagent/subagent-codex/README.md | 1 - packages/subagent/subagent-codex/README.zh.md | 1 - 9 files changed, 20 insertions(+), 24 deletions(-) diff --git a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml index b696b46749..205757eacc 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md -2026-08-10-product-subagent-providers-in-shared-host.md: 33b6eb6cf7a6c19e9ea71cdb7dc8881e8052ef24 -2026-08-10-product-subagent-providers-in-shared-host.zh.md: fd78c7a3fee4e4ee30d27d87c752e1a23576fd85 +2026-08-10-product-subagent-providers-in-shared-host.md: a747d641ae112d114912958c289fe00b592e6ea5 +2026-08-10-product-subagent-providers-in-shared-host.zh.md: fef69e8a2d18135cbc9d5f0d80134fa5701bbbd0 diff --git a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md index 33b6eb6cf7..a747d641ae 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md +++ b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md @@ -12,21 +12,21 @@ The placement decision must preserve two independent facts. Loading a provider m ## Decision -Every shipped Profile loads the fixed `codex` and `claude-code` providers once through the base bundle's host plane. Loading either plugin only registers a dormant backend; the corresponding Codex or Claude process starts on the first actual delegation call. Agent Presets independently contribute ordinary `dsh-tool-subagent` rows for `subagent_codex` and `subagent_claude_code`, so a preset can expose neither tool, either one, or both without changing the provider registry. +Product providers remain process-scoped host-plane registrations. The [production-install exclusion decision](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md) supersedes only this note's former base-bundle installation choice: production `dsh-base` neither depends on nor mounts them. A Profile that opts in installs the selected provider package and mounts it once on the host plane. Loading either plugin only registers a dormant backend; the corresponding Codex or Claude process starts on the first actual delegation call. Agent Presets independently contribute ordinary `dsh-tool-subagent` rows for `subagent_codex` and `subagent_claude_code`, so a preset can expose neither tool, either one, or both without changing the provider registry. -This decision supersedes only the opt-in composition placement recorded by the provider-contract note. That note continues to own each product protocol, result mapping, cancellation, process-tree lifecycle, and evidence tiers. The [Agent Preset architecture](2026-08-03-per-session-agent-presets.md) continues to own the Host/Agent split, preset authoring, and the rule that edits affect only newly composed sessions. +This note continues to own why a mounted product provider belongs on the host plane while its model-facing tool belongs to an Agent Preset. The production-install exclusion decision owns which Profiles install those optional packages. The provider-contract note continues to own each product protocol, result mapping, cancellation, process-tree lifecycle, and evidence tiers. The [Agent Preset architecture](2026-08-03-per-session-agent-presets.md) continues to own the Host/Agent split, preset authoring, and the rule that edits affect only newly composed sessions. The providers use products already selected by the host environment. Codex starts `codex` from `PATH`; Claude Code resolves `claude` through the shared subprocess execution world and passes the exact path to the official SDK. Profile loading does not install a product, create product state, probe a version, test authentication, or add product-specific settings. Missing commands and product failures remain local to the attempted delegation. -The current base dependency closure still includes the Claude Agent SDK's optional platform CLI payload even though production resolves the host `claude`. Removing that unused payload belongs to the separate product installation-closure follow-up; this placement decision neither installs it dynamically nor treats it as the production executable. +Only a Profile that selects the Claude Code provider carries the Claude Agent SDK's optional platform CLI payload. Production still resolves the host `claude`; the SDK payload remains provider-package installation cost rather than the production executable. ## Verification -The base Loader test proves both provider names register exactly once and no product process starts during Profile boot. Real Agent Preset composition covers none, Codex-only, Claude-only, and both tool sets, including generation isolation after an authored preset changes. Keyless ACP snapshots pin the model-visible tool schemas for one and both products, while provider tests separately prove native executable resolution, failure, cancellation, and process-tree quiescence. +The base bundle test proves production `dsh-base` contains neither product provider dependency nor provider row. The Web composition explicitly mounts both optional providers and covers none, Codex-only, Claude-only, and both tool sets, including generation isolation after an authored preset changes. Package-owned Loader compositions prove the Codex-only and dual-provider opt-in paths register the selected providers without starting a product process. Keyless ACP snapshots pin the model-visible tool schemas for one and both products, while provider tests separately prove native executable resolution, failure, cancellation, and process-tree quiescence. ## Alternatives considered -**Keep product providers opt-in at the Profile layer.** This preserves a smaller default dependency closure, but a copied or agent-authored Preset row is not usable unless the person also discovers and edits a second composition layer. It leaves the general Preset entry incomplete for these otherwise ordinary tools. +**Keep product providers opt-in at the Profile layer.** This preserves a smaller default dependency closure but requires the user to edit both a Profile and a Preset. The production-install exclusion decision accepts that installation trade-off; this note retains the requirement that any selected provider is mounted once on the host plane rather than inside the preset. **Store global or per-Profile product enable switches.** A process switch competes with the Preset as owner of model-visible tools and cannot express two sessions using different combinations. Availability and authentication are deployment facts, not another persisted product state. @@ -36,6 +36,6 @@ The base Loader test proves both provider names register exactly once and no pro ## Consequences -A user manages both products through the same Agent Preset authoring path as other plugins, and each new session receives exactly the tools its chosen preset contributes. Every Profile carries two dormant provider registrations, so unused products consume package and module-loading footprint but no product process, login, model call, or product home. +A user installs each selected product provider in a Profile and exposes its tool through the same Agent Preset authoring path as other plugins. Each new session receives exactly the tools its chosen preset contributes. Profiles that do not select a product provider carry no corresponding package or module-loading footprint; loading a selected provider still starts no product process, login, model call, or product home. -The Host registry remains the single provider authority and each Preset remains the single model-tool authority. The trade-off is the current Claude SDK optional-payload installation cost, which stays explicitly deferred rather than being hidden behind another enable state or installer lifecycle. +The Host registry remains the single provider authority and each Preset remains the single model-tool authority. The trade-off is a two-layer opt-in: the Profile owns installation and host-plane registration, while the Preset owns per-agent exposure. Selecting the Claude provider also accepts its current SDK optional-payload installation cost. diff --git a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md index fd78c7a3fe..fef69e8a2d 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md +++ b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md @@ -12,21 +12,21 @@ Status: implemented ## 决策 -每个随发行版交付的 Profile 都会通过 base 组合包的宿主平面,把固定的 `codex` 与 `claude-code` 提供方各加载一次。加载任一插件只会注册一个休眠后端;对应的 Codex 或 Claude 进程直到第一次实际委派调用时才启动。Agent Preset 分别通过普通的 `dsh-tool-subagent` 行贡献 `subagent_codex` 与 `subagent_claude_code`,因此一个 preset 可以不暴露任何工具、只暴露其中一个或同时暴露两者,而无需更改提供方注册表。 +产品提供方仍是进程级的 host plane(宿主平面)注册。[生产安装排除决策](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md)只取代本说明原先由 base bundle 安装提供方的选择:生产 `dsh-base` 既不依赖也不挂载它们。选择产品集成的 Profile 会安装目标提供方包,并在 host plane 挂载一次。加载任一插件只会注册一个休眠后端;对应的 Codex 或 Claude 进程直到第一次实际委派调用时才启动。Agent Preset 分别通过普通的 `dsh-tool-subagent` 行贡献 `subagent_codex` 与 `subagent_claude_code`,因此一个 preset 可以不暴露任何工具、只暴露其中一个或同时暴露两者,而无需更改提供方注册表。 -本决策仅取代提供方约定说明所记录的、原先由用户选择启用的组装位置。该说明仍负责每个产品的协议、结果映射、取消、进程树生命周期与证据层级。[Agent Preset 架构](2026-08-03-per-session-agent-presets.md)仍负责宿主与 agent 的划分、preset 创作,以及改动只影响新组装会话的规则。 +本说明继续负责解释为什么已经挂载的产品提供方属于 host plane,而面向模型的工具属于 Agent Preset。生产安装排除决策负责哪些 Profile 安装这些可选包。提供方约定说明继续负责每个产品的协议、结果映射、取消、进程树生命周期与证据层级。[Agent Preset 架构](2026-08-03-per-session-agent-presets.md)仍负责宿主与 agent 的划分、preset 创作,以及改动只影响新组装会话的规则。 这些提供方使用宿主环境已经选定的产品。Codex 启动 `codex`,该命令从 `PATH` 解析;Claude Code 通过共享的子进程执行世界解析 `claude`,并把确切路径交给官方 SDK。加载 Profile 不会安装产品、创建产品状态、探测版本、测试身份验证,也不会新增产品专属设置。命令缺失和产品故障仍局限于发生问题的那次委派。 -当前 base 依赖闭包仍包含 Claude Agent SDK 的可选平台 CLI(命令行界面)载荷,尽管生产环境解析的是宿主提供的 `claude`。移除这份未使用载荷属于独立的产品安装闭包后续项;本归属决策既不会动态安装它,也不会将它当作生产可执行文件。 +只有选择 Claude Code 提供方的 Profile 才会携带 Claude Agent SDK 的可选平台 CLI(命令行界面)载荷。生产环境仍解析宿主提供的 `claude`;这份 SDK 载荷是提供方包的安装成本,而不是生产可执行文件。 ## 验证 -base Loader 测试证明两个提供方名称都恰好注册一次,而且 Profile 启动期间不会启动产品进程。真实 Agent Preset 组装覆盖不暴露任何工具、仅暴露 Codex、仅暴露 Claude 和同时暴露两者这四种工具集合,也覆盖自行创作的 preset 发生改动后的代际隔离。无密钥 ACP(Agent Client Protocol)快照固定单个产品与两个产品同时启用时的模型可见工具 schema,提供方测试则另行证明原生可执行文件解析、失败、取消和进程树完全停稳。 +base bundle 测试证明生产 `dsh-base` 既不包含产品提供方依赖,也不包含提供方配置行。Web 组装显式挂载两个可选提供方,并覆盖不暴露任何工具、仅暴露 Codex、仅暴露 Claude 和同时暴露两者这四种工具集合,也覆盖自行创作的 preset 发生改动后的代际隔离。由包负责的 Loader 组装证明 Codex-only 与双提供方按需启用路径会注册选中的提供方,而不会启动产品进程。无密钥 ACP(Agent Client Protocol)快照固定单个产品与两个产品同时启用时的模型可见工具 schema,提供方测试则另行证明原生可执行文件解析、失败、取消和进程树完全停稳。 ## 考虑过的替代方案 -**将产品提供方保留为 Profile 层的按需启用项。** 这样可缩小默认依赖闭包,但复制或由 agent 创作的 Preset 行无法直接使用,除非用户还发现并编辑第二个组装层。对于这些本来与其他工具无异的工具,通用 Preset 入口仍不完整。 +**将产品提供方保留为 Profile 层的按需启用项。** 这样可缩小默认依赖闭包,但要求用户同时编辑 Profile 与 Preset。生产安装排除决策接受这项安装取舍;本说明保留的要求是,任何被选中的提供方都在 host plane 挂载一次,而不是放入 preset。 **存储全局或按 Profile 配置的产品启用开关。** 进程级开关会与 Preset 争夺模型可见工具的责任归属,也无法表示两个会话使用不同组合。可用性与身份验证属于部署事实,并非另一份需要持久化的产品状态。 @@ -36,6 +36,6 @@ base Loader 测试证明两个提供方名称都恰好注册一次,而且 Prof ## 后果 -用户通过与其他插件相同的 Agent Preset 创作路径管理两个产品,每个新会话只会获得其所选 preset 所贡献的工具。每个 Profile 都携带两个休眠的提供方注册,因此未使用的产品会产生包和模块加载开销,但不会启动产品进程、登录、调用模型或创建产品主目录。 +用户在 Profile 中安装每个被选中的产品提供方,再通过与其他插件相同的 Agent Preset 创作路径暴露它的工具。每个新会话只会获得其所选 preset 所贡献的工具。没有选择产品提供方的 Profile 不承担对应包或模块的加载开销;加载已选择的提供方仍不会启动产品进程、登录、调用模型或创建产品主目录。 -宿主注册表仍是提供方的唯一权威,每个 Preset 仍是模型工具的唯一权威。代价是当前 Claude SDK 可选载荷的安装成本继续被明确延期处理,而不会隐藏在另一种启用状态或安装程序生命周期之后。 +宿主注册表仍是提供方的唯一权威,每个 Preset 仍是模型工具的唯一权威。代价是两层按需启用:Profile 负责安装与 host plane 注册,Preset 负责按 agent 暴露。选择 Claude 提供方还会接受当前 SDK 可选载荷的安装成本。 diff --git a/packages/subagent/subagent-claude-code/README.i18n.yaml b/packages/subagent/subagent-claude-code/README.i18n.yaml index 97e9ddbe56..08f4300d94 100644 --- a/packages/subagent/subagent-claude-code/README.i18n.yaml +++ b/packages/subagent/subagent-claude-code/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-claude-code/README.md -README.md: 327493551ff145277675682eeaef2fc7948ee414 -README.zh.md: 5e4d6558d946451493e1b0f5f209500af8c34aa1 +README.md: 123d84a11dc0457472d742488eba72588e668152 +README.zh.md: 2fe9cfb78a52cc98077be8931daddc1f869fc310 diff --git a/packages/subagent/subagent-claude-code/README.md b/packages/subagent/subagent-claude-code/README.md index 327493551f..123d84a11d 100644 --- a/packages/subagent/subagent-claude-code/README.md +++ b/packages/subagent/subagent-claude-code/README.md @@ -50,7 +50,6 @@ The standalone composition below shows the complete explicit capability. A Profi - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' - disabled: true config: provider: claude-code toolName: subagent_claude_code diff --git a/packages/subagent/subagent-claude-code/README.zh.md b/packages/subagent/subagent-claude-code/README.zh.md index 5e4d6558d9..2fe9cfb78a 100644 --- a/packages/subagent/subagent-claude-code/README.zh.md +++ b/packages/subagent/subagent-claude-code/README.zh.md @@ -50,7 +50,6 @@ SDK 接收由文本块原样拼接成的任务。提供方会完整迭代 SDK - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' - disabled: true config: provider: claude-code toolName: subagent_claude_code diff --git a/packages/subagent/subagent-codex/README.i18n.yaml b/packages/subagent/subagent-codex/README.i18n.yaml index 5501f36aee..c9b162e79a 100644 --- a/packages/subagent/subagent-codex/README.i18n.yaml +++ b/packages/subagent/subagent-codex/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-codex/README.md -README.md: d2cce430c4bc80378b77240ce2dd7c6c07fea986 -README.zh.md: 92986e3d3d6c9ff786db968004ce2f533949a5f9 +README.md: 2ea06a57fc9da80cdb2dd5edc4cf7107ab50dd73 +README.zh.md: a79bd08872ad14c9b847c77e608c2b47fb54c8bf diff --git a/packages/subagent/subagent-codex/README.md b/packages/subagent/subagent-codex/README.md index d2cce430c4..2ea06a57fc 100644 --- a/packages/subagent/subagent-codex/README.md +++ b/packages/subagent/subagent-codex/README.md @@ -46,7 +46,6 @@ The standalone composition below shows the complete explicit capability. A Profi - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' - disabled: true config: provider: codex toolName: subagent_codex diff --git a/packages/subagent/subagent-codex/README.zh.md b/packages/subagent/subagent-codex/README.zh.md index 92986e3d3d..a79bd08872 100644 --- a/packages/subagent/subagent-codex/README.zh.md +++ b/packages/subagent/subagent-codex/README.zh.md @@ -46,7 +46,6 @@ - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' - disabled: true config: provider: codex toolName: subagent_codex From 952c6c3c9c34e8a37871a606c3060afaa8207eca Mon Sep 17 00:00:00 2001 From: j-xiang Date: Thu, 13 Aug 2026 16:56:10 +0800 Subject: [PATCH 070/103] docs(i18n): finish README fidelity review --- packages/llm/llm/README.i18n.yaml | 2 +- packages/llm/llm/README.zh.md | 2 +- packages/subagent/subagent/README.i18n.yaml | 2 +- packages/subagent/subagent/README.zh.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/llm/llm/README.i18n.yaml b/packages/llm/llm/README.i18n.yaml index 07702ff54a..2d0d68e7ac 100644 --- a/packages/llm/llm/README.i18n.yaml +++ b/packages/llm/llm/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/llm/llm/README.md README.md: 2cae9a05a58295b06d25382729a3304dbdc9a6fa -README.zh.md: a9c4f2908fb3047238f337ab93490ddd4ffc8d63 +README.zh.md: 110cc128f1c19bef1741ae59d8106139c4a72649 diff --git a/packages/llm/llm/README.zh.md b/packages/llm/llm/README.zh.md index a9c4f2908f..110cc128f1 100644 --- a/packages/llm/llm/README.zh.md +++ b/packages/llm/llm/README.zh.md @@ -13,7 +13,7 @@ - `ctx.llm.registerAdapter(providers: string[], adapter: LlmAdapter): AdapterRegistrationHandle` 为给定提供方路由注册一个适配器实例。注册要么全部成功,要么全部不生效,并且会随调用 fiber 一起 dispose(资源释放)。返回的句柄还提供 `replace(providers)`:候选路由集合会在注册状态发生任何变化前完成整体验证,因此与另一适配器发生冲突时,当前路由仍保持注册并继续提供服务。替换会在一次同步操作中完成,不会出现可观察的空档。`replace([])` 合法,表示保留注册但不持有任何路由;初始注册则不得为空。 - `ctx.llm.listProviders(): LlmProviderInfo[]` 按注册顺序描述已注册提供方路由。 - `ctx.llm.registerConfigurableProviders(entries: readonly LlmConfigurableProvider[]): DirectoryRegistrationHandle` 声明适配器插件可通过配置激活的提供方路由——无论已注册还是休眠——每个条目指明其所属 settings namespace,以及 profile 在该分节内的路径。要么全部成功,要么全部不生效(`INVALID_DIRECTORY`/`DUPLICATE_DIRECTORY`),并随调用 fiber dispose。该句柄还带 `replace(entries)`:候选集合会先被整体校验,因此其中若有条目已被另一个注册声明,当前集合原封不动;此处允许传空数组。声明集合随配置变化的插件必须使用 `replace`,而不是先 dispose 再重新注册——后者会在新集合被拒时让目录整个落空。 -- `ctx.llm.listConfigurableProviders(): LlmConfigurableProvider[]` 按声明顺序列出可配置提供方目录;配置界面将其与 `listProviders()` 合并,为每个条目标注存活或休眠。条目可携带 `declared`,表示拥有该路由的适配器是否只因配置点名才知道它。该字段缺失时,只表示该适配器不区分这两种来源,不能据此判断路由是否随产品交付。 +- `ctx.llm.listConfigurableProviders(): LlmConfigurableProvider[]` 按声明顺序列出可配置提供方目录;配置界面将其与 `listProviders()` 合并,为每个条目标注存活或休眠。条目可携带 `declared`,表示拥有该路由的适配器是否只因配置点名才知道它。只有适配器能回答这一点:该字段缺失时,只表示该适配器不区分这两种来源,不能据此判断路由是否随产品交付。 - `ctx.llm.registerModelDiscovery(settingsNs: string, discover): () => void` 为本插件拥有的 settings namespace 提供查询提供方端点的能力。每个 namespace 只能有一个(`INVALID_DISCOVERY`/`DUPLICATE_DISCOVERY`),并随调用 fiber dispose。 - `ctx.llm.listModelDiscoveryNamespaces(): string[]` 列出可以询问端点的 namespace,让界面只在可用之处提供该动作。 - `ctx.llm.discoverModels(settingsNs: string, request: LlmModelDiscoveryRequest): Promise` 询问某个端点它公布了哪些模型。 diff --git a/packages/subagent/subagent/README.i18n.yaml b/packages/subagent/subagent/README.i18n.yaml index d7acd85d6b..6d443fc9ba 100644 --- a/packages/subagent/subagent/README.i18n.yaml +++ b/packages/subagent/subagent/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent/README.md README.md: ed4a9123a2dfa5b2fa5abc67f4513547feb3d140 -README.zh.md: 9c08dcb84619e4ecd0282d4d113e3f3952a6a103 +README.zh.md: 3ad2ee5738a210a776d1f0b2746dcbd21d46144c diff --git a/packages/subagent/subagent/README.zh.md b/packages/subagent/subagent/README.zh.md index 9c08dcb846..3ad2ee5738 100644 --- a/packages/subagent/subagent/README.zh.md +++ b/packages/subagent/subagent/README.zh.md @@ -64,7 +64,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委 `provider.start(request): Promise` 是所有权转移边界;委派工具也会在其由 Task 支撑的一次性后台路径中使用它。兑现前,提供方拥有设置过程,并且在任何失败路径上都必须取消、回滚并使尚未发布的资源完全停稳。兑现后,run 的所有权转移给调用方;调用方必须在每条路径上调用 `dispose()`。剩余提示词和轮次工作属于 `SubagentRun.result`。 -`SubagentRun.result` 兑现为 `{ output, structured?, stopReason }`。子 agent 级失败会以非 `completed` 原因兑现;只有 seam 无法表示的基础设施故障才可以拒绝。`dispose()` 是幂等的,会取消剩余工作,并等待结果结算以及子 agent 资源完全停稳。`result` 的拒绝只通过 `result` 本身报告;只有独立的资源释放失败,才会使 `dispose()` 被拒绝。`output` 与 `subagent/end` 事件的 `lastAssistantMessage` 使用导出的 `AssistantOutputFold`/`finalAssistantOutput` 辅助函数选取子 agent 最后一条非空 assistant 消息;若没有这类消息,则选取其累积的 assistant 文本。子 agent 两种输出均未产生时,`output` 为 `[]`,该事件字段缺省(结果约定归 [`SubagentResult.output`](../../../docs/subsystems/subagent.md#the-terminal-result-subagentresult) 所有)。 +`SubagentRun.result` 兑现为 `{ output, structured?, stopReason }`。子 agent 级失败会以非 `completed` 原因兑现;只有 seam 无法表示的基础设施故障才可以拒绝。`dispose()` 是幂等的,会取消剩余工作,并等待结果结算以及子 agent 资源完全停稳。result 的拒绝只通过 `result` 本身报告;只有独立的资源释放失败,才会使 `dispose()` 被拒绝。`output` 与 `subagent/end` 事件的 `lastAssistantMessage` 使用导出的 `AssistantOutputFold`/`finalAssistantOutput` 辅助函数选取子 agent 最后一条非空 assistant 消息;若没有这类消息,则选取其累积的 assistant 文本。子 agent 两种输出均未产生时,`output` 为 `[]`,该事件字段缺省(结果约定归 [`SubagentResult.output`](../../../docs/subsystems/subagent.md#the-terminal-result-subagentresult) 所有)。 本地运行会在 `start()` 兑现前发布普通的子 agent/会话,把该共享会话 id 作为 `SubagentRun.id` 返回,以 `SubagentRun.localAgent` 公开准确的子 agent,把 `request.parent.session.id` 记录到子 agent 的 `parentSession` header,并在其初始轮次内追加已解析的描述符。远程提供方则生成 parent 作用域的生命周期 id,并返回 `localAgent: undefined`;由于没有本地 child 会话,其一次性运行不会进入基于追踪的枚举结果。 From 60b04b6ef73a2b7387e6887d19fe2276ff2630a0 Mon Sep 17 00:00:00 2001 From: imccyu Date: Thu, 13 Aug 2026 17:17:46 +0800 Subject: [PATCH 071/103] release(dsh): 0.1.0-rc.2 --- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package.json | 2 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- packages/attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- packages/client/ui-directory-picker-browse/package.json | 2 +- packages/client/ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- packages/client/ui-message-feedback/package.json | 2 +- packages/client/ui-model-selection/package.json | 2 +- packages/client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- packages/client/ui-settings-general/package.json | 2 +- packages/client/ui-settings-models/package.json | 2 +- packages/client/ui-settings-plugin-inventory/package.json | 2 +- packages/client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- packages/client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- packages/code-runtime/code-runtime-worker-thread/package.json | 2 +- packages/code-runtime/code-runtime/package.json | 2 +- packages/compaction/command-compact/package.json | 2 +- packages/compaction/compaction-basic/package.json | 2 +- packages/compaction/compaction-tool-result-pruner/package.json | 2 +- packages/compaction/compaction/package.json | 2 +- packages/context/agent-instructions/package.json | 2 +- packages/context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- packages/core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- packages/core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- packages/credentials/credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- packages/examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- packages/extensions/cordis-client-runner/package.json | 2 +- packages/extensions/cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- packages/feedback/command-feedback/package.json | 2 +- packages/feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- packages/fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- packages/fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- packages/guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- packages/host/directory-picker-auto/package.json | 2 +- packages/host/directory-picker-browse/package.json | 2 +- packages/host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- packages/identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- packages/interaction/permission-presets/package.json | 2 +- packages/interaction/tool-ask-user/package.json | 2 +- packages/interaction/user-approval/package.json | 2 +- packages/interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- packages/runtime-diagnostics/invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- packages/sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- packages/session-query/session-log-export/package.json | 2 +- packages/session-query/session-query-sqlite/package.json | 2 +- packages/session-query/session-query/package.json | 2 +- packages/session-query/tool-session-query/package.json | 2 +- packages/session/session-checkpoint-policy/package.json | 2 +- packages/session/session-persistence-jsonl/package.json | 2 +- packages/session/session-persistence-sqlite/package.json | 2 +- packages/session/session-persistence/package.json | 2 +- packages/session/session-projection-cache/package.json | 2 +- packages/session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- packages/session/session-telemetry-otel/package.json | 2 +- packages/session/session-telemetry/package.json | 2 +- packages/session/session-title-all-prompts-llm/package.json | 2 +- packages/session/session-title-first-prompt-llm/package.json | 2 +- packages/session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- packages/shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- packages/subagent/subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- packages/subagent/subagent-dsh-sdk/package.json | 2 +- packages/subagent/subagent-fork-in-process/package.json | 2 +- packages/subagent/subagent-in-process-driver/package.json | 2 +- packages/subagent/subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- packages/subagent/tool-subagent-control/package.json | 2 +- packages/subagent/tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- packages/subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- packages/test-support/acp-snapshot/package.json | 2 +- packages/test-support/agent-loop-testkit/package.json | 2 +- packages/test-support/client-runtime/package.json | 2 +- packages/test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- packages/test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- packages/web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- packages/workflow/workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- 222 files changed, 222 insertions(+), 222 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 9617da8869..eddb8a4ad7 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/apps/web/package.json b/apps/web/package.json index 7e85392d34..f1f808b55e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/package.json b/package.json index ffbe648eaa..e9a8d4d86c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "license": "MIT", "private": true, "type": "module", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index 02e8294f1f..da4944efb8 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index a034a01af2..ec0296f7c8 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index 3d4a9b40b7..a0f43738b5 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly and Host Agent/Session lookup policy", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index 499b8ef226..ddbe0af2e4 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index a853154ab8..792f94011f 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index 9e60cd8af4..fde0fb71b7 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index c1b0732a8e..a18bcf1169 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 0881d4ea58..ce21f68eec 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index ee10bc368b..46fb8dd207 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 888512a8f7..660b8fc2a7 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 36a3a08cc2..107d452465 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index 149c464e28..3b559386cd 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 53ff24c993..e59a558449 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index e57918aa4c..fc9408e807 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 6e93112cc1..82a7bc48fc 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-runtime", "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index 9e47ccf3ce..4bab5feb6e 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-schema-form", "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index 617186b81e..e841e71c3b 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index a65822fa16..1f21f5fe46 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index 6f08e1a511..f035e7cc98 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index ae9dc9150a..96a8c3b33c 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index 1036166334..ad76a0d057 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Produced-files turn tail and clickable final-response file references for Web", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index d3957208bd..141a52d776 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 1384a08ead..d2edd0ef92 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index fbb5569543..e822e253ea 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index 3fc54c3faf..27bb4435cf 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index bdcb634e8e..d9ca8dd4f8 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list: live registry state mirrored from session/jobs frames", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index db914cbd20..06ff884982 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 6faf159bc2..4dbd57dd1b 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index ea9843992a..3cfe5e71cd 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection: the /model popupSelect over session.models / session.selectModel", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index dc6fd4e2f1..e86e3fdbb1 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 2b5d64b057..aedf12b166 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index 66a1bb672b..bc599663a1 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 878c339e0b..c79c1882e7 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 6296787142..5660cf6dfc 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index c4260096a8..5d486e3fcd 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index 42e5f3e534..ece83f4239 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index a0b6c8ee2f..8b20beeede 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index b6c7813033..7c5eace021 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index 1bd1a3d109..e7b9b82963 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index eb9f076ea3..1778a2b500 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 4f16c65d03..af795695e3 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 4b3ecdc24f..fd83879158 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 5c2e7f47f9..3095da5315 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 1dc0c9bbde..70c4ea896f 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index 3afa43d70b..a784d45ee2 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-user-questions", "description": "Web ask_user_question feature: host tool mount plus composer-takeover question UI", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index 71695e6394..4b483790b1 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workflow-run", "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index 105f0afa63..d1853e9db0 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workspace", "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index ade5833056..c510265ecf 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web-react", "description": "Shell-side React glue: createSlotRenderer, SessionProvider, bindSnapshotSelector (uSES bridge), useInvoke", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/web/package.json b/packages/client/web/package.json index cfe38fe698..4b19398e98 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web", "description": "Web shell kernel: bootWebShell (module system holding + seed table + two-stage boot + AppRoot gate + app-shell assembly entry), consumed by the apps/web vite entry", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index e4286cbdd5..4959fe12be 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime-worker-thread", "description": "Worker-thread implementation of the DeepSeek Harness code-execution seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index 20c1bdb859..959d21ba51 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime", "description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index c3cdffaec3..8854e8db63 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-compact", "description": "Human-facing slash command for explicit session compaction", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 2b91fa4630..236b48e3fe 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-basic", "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index 1ee9dcbb0a..d89264fdb2 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-tool-result-pruner", "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index 4c6900c6c3..a8610e513d 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction", "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index c84bb2bde7..ccd3112a31 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-instructions", "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index 83fe078eb8..296757922a 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-reference", "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 83eb05dc6e..40765701ee 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-time-context", "description": "Opt-in durable per-step context with the current time and elapsed time", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index dd63d592e5..04697bf3a5 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tmux-context", "description": "Opt-in durable per-step context with this agent's tmux pane and window location", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index 617139dbf2..aecd485f17 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-default-model", "description": "Default model selection shared by Agent entry points", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index a25f1d938f..fa882280ef 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop", "description": "The concrete agent loop plugin for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index 9610ebe18e..2c511c1541 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-tool-presentation", "description": "Agent-plane presentation selector: composes one agent's tools as Code Mode, native, or both", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index 0bfc2e2fce..118ac28d1f 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent", "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index 09bc97963c..168ca36ea9 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-scope", "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/session/package.json b/packages/core/session/package.json index 2c5648e07d..8b9e5457a9 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session", "description": "Event-sourced session store for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index f34d70d4cd..b28b528319 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-system-prompt", "description": "System prompt assembly registry for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index e0dcd5ae30..5f27e77709 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tools", "description": "Tool registry and execution pipeline for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index 75d574b1c0..777c251ab4 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials-local", "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index 7bd964b31d..6ff436fca4 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials", "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index d073feebae..0b59ecfba1 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-e2b", "description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index 7f03bfa801..247644144d 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-e2b", "description": "E2B filesystem implementation for DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index 55739a65ed..2aeaab41ce 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-e2b", "description": "E2B subprocess implementation for DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index 6694257e88..e49e3804a2 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-demo", "description": "ACP automation server app: agent spine + JSONL persistence + ACP transport, with a JSON-RPC stdio bin", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index 67b01c29fa..6c2bcadc8f 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-spine-demo", "description": "The default executor-less/UI-less agent spine with fallback session titles, provider-routed retry, and optional persisted goals", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index e8519495fa..c40abc8c64 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-demo", "description": "Bin that boots an external Cordis config for the stdio JSON-RPC SDK runtime", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index 0e6903ce57..ababeff94e 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-client-runner", "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 59e78a1ec9..5edfc35cb6 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-host-runner", "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index 0279f6d424..63afbb3c9e 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-cordis", "description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 1a717b2cb7..8b28ce1999 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-cordis", "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index 33a9e4ad37..0993db9df3 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-feedback", "description": "Log-only session feedback producer and human-facing slash command", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index dcc3a173ac..a77d665079 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-message-feedback", "description": "Lifecycle-bound per-message rating and note sidecar for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index efe9d4de4f..c0fb7a43da 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-local", "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index 1bbd7f1039..88d8db9e90 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-observation-policy", "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 255709e6e7..a492a10004 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-sandbox", "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index c3c7c2353b..d4bb43ed0c 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs", "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index fbb740d186..ace193ceca 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs-search", "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index 668fb9106d..2275cf9133 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs", "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index 3aca8e7c8f..a9628c108b 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-str-replace-editor", "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index a0ecf3ca9b..e6849d82e6 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-goal", "description": "Human-facing slash command for persisted same-session goals", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index af5d415729..3660b717f6 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal-round-driver", "description": "Race-fenced same-session goal-round driver", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index 13fcddeecd..ddac8fd841 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal", "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index 9c8ce67a76..3514474923 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-goal", "description": "Model-facing same-session goal tools with execution-time authority checks", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 46996c42c9..62d46dc385 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-repeat-tool-reminder", "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index 947415cb62..1af9607ec3 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-call-timeout-policy", "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 853b79f934..93301b0f98 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index 2e19511840..5d82313f31 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 7b849242dd..594710190b 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index d0e75a11f5..6af3b2ee18 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-apiproxy", "description": "API gateway: the ApiProxy contract (api/), the fetch carrier pair (fetch/), and the host-side gateway plugin providing ctx.apiProxy", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index 3e5112dde7..6d4f28ab66 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-auto", "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index 9eacb79ccc..edac737c8e 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-browse", "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index 933cfbe3a2..75642b724f 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-native", "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index 7196855c85..e9ec712ad8 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker", "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 7c2cfe281d..4aa9d1621d 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-frontend-static", "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving the built frontend with index-tap injection, traversal rejection, and SPA index fallback", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 4da7af74ac..4639d18bc5 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-plugin-inventory", "description": "Read-only Remote projection of current Cordis Loader plugin state", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index 63fceb801b..f19d959473 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-webserver", "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index 1c4997c054..49c286a5ef 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-anonymous-user-id", "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 575f2b4e8c..3b7079f086 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-commands", "description": "Plugin-owned human command registry for DeepSeek Harness UIs", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index dd328cd3bb..d62c3c9d96 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-permission-presets", "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index c18000ae91..36fb55a70f 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ask-user", "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index ca559c94fa..38f8597c8a 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-approval", "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 6ce971cd0d..788be37e70 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-questions", "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 6d2fe5c18b..8e430bec1f 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs-local", "description": "Process-local implementation of the DeepSeek Harness background job registry seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index 89b5116808..39da6cc9dc 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs", "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index eb68bf5cac..b845ff403e 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-jobs", "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index c556cdb298..5b6a211384 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-deepseek", "description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 2dedb51af2..554e21912f 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-pi-ai", "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index 0b1ca065ad..68752af10b 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-retry", "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index c0393011c5..7761bdb067 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm", "description": "Provider-neutral LLM service interface for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index 33aa87f85c..627843b9a3 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-token-meter", "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index 47ef93e772..391c5e7a59 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp-stdio", "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index 8e7f2173ef..bca11459ec 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp", "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index f30e62d2ae..be37fd3338 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-lsp", "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index 89e77392d0..715809d404 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-client", "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index 6fe63abc6c..1b2ed4025c 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plan-mode", "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index c7821b7a16..8f83bc23dd 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-presets", "description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index 4aeba42c70..f5e3a6e622 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-persona", "description": "Composition-authored deployment persona section for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index a3d19e49f0..f6454f3f63 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-invariants", "description": "Registry service for package-owned DeepSeek Harness runtime invariants", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index 2c2ca2d3c9..e1ee18a333 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-local", "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index 553f607ab7..3daa764872 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-policy", "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index cd977461a0..b7ce9b118d 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-windows-acl", "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index 3f12853539..2f039e800e 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox", "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index 8b70287cc8..baab56db27 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-schedule", "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index 7b2e70e143..220c8dd808 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-client", "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index 594058d322..62cdcbd3ed 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-protocol", "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index 68011759bc..3316a70452 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-server", "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index a1e423409a..d26b8e243b 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, "repository": { "type": "git", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index 9f7abce839..96559c1224 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query-sqlite", "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index 7d7c0ae6c4..b96aa1daeb 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query", "description": "Combined session query service contract with concrete reads, traces, and filters", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index f5a29a594f..ee4f69d1ca 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-session-query", "description": "Workspace-authorized model-facing session history search, trace, and event read tools", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index b77ce150d2..54f80e2276 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-checkpoint-policy", "description": "Semantic session durability checkpoints before model requests and tool side effects", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index 5e4f01ccb8..f59aa7400c 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-jsonl", "description": "JSONL durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index 35fbc2cf58..0fe1be4139 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-sqlite", "description": "SQLite durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index bcb10b6d81..198569e7cf 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence", "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index c80be96d6b..dc562efc04 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection-cache", "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session projection checkpoints over the domain data form, throttled write-behind, and the cold-read ladder (cache row + persistence tail replay)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index fa2da3c4f0..53b2de2ee8 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection", "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index fcb1e8de18..75cafa78d8 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-stats", "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 3bd006cb01..7ea1578dcc 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry-otel", "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index 2d9f660292..afb4fdd3dd 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry", "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 1329571c6e..178d84240a 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 1df72b6ab3..6a316fd475 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-first-prompt-llm", "description": "First-message LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index 9077b14215..6106d524dd 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-llm", "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index d1df0c207d..5fc6d03262 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title", "description": "Log-backed session title service and provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index bcf1024c5b..106f052544 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings-file", "description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 962ae5fb37..194d36827a 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings", "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index 7121c45e03..936590f662 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-local", "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index ea352a7a52..19e95626e9 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index e3962071e7..5e63c99924 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-local", "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index 7bf8a0b6d3..c62b9aa580 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index a8f7c3e6a2..305f8e3fb5 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell-env", "description": "Tool-independent managed DSH_* shell environment registry", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index 590acc3cf8..7792bcedbb 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell", "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index a075fd28e7..d37d0db078 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash-persistent", "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index 1ca91a61c4..e96bbdc0b1 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash", "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index 2ea1df9724..2f46e77898 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh", "description": "Model-facing pwsh tool over the bash executor seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index 0336e7c6d1..76bed1278c 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 67b558e868..82a6674d49 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-filesystem", "description": "Local filesystem skill provider for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index ef1e78ae76..849fe30585 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill", "description": "Agent skill provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index 5073ee38b5..f8de981868 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-skill", "description": "Model-facing skill loading tool for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index ac140d4a49..6677860f64 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-local", "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index c6cc6592f9..5e54555275 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-policy", "description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index dd3ec4f108..5cc485a211 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill", "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index c2cdb316f7..ff9f54b4e4 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-domain", "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index 9f4e25061e..d74204fa58 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-json", "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 860a4f0b43..6fc0eecfd4 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-sqlite", "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index 0daa5ae28f..d2f8a2edd8 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage", "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index 32a8f97876..2454b4d49c 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-acp", "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index 1fdf54c912..a65e3b1f0f 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-claude-code", "description": "One-shot Claude Code subagent provider over the official Agent SDK", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 0ae0955426..07c13c74bb 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-codex", "description": "One-shot Codex subagent provider over the official app-server protocol", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 56295ca0b9..09bd68a123 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-dsh-sdk", "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index 874213bd51..52b228cb22 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-fork-in-process", "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index d214362cfd..afc521e1be 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-in-process-driver", "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index e6a778082c..c27794a1ea 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-spawn-in-process", "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 3fe78a62c8..2d15236c80 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent", "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index 59fb7785b9..9f55b93434 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-control", "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index f748d63426..1e08138c67 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-report", "description": "Child-scoped report tool over ctx.subagents continuations", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index b02716a10a..ad4a75519b 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent", "description": "Model-facing subagent delegation tool over the ctx.subagents seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index ee033c48d2..74b480ae82 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-local", "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 43ecf68ba4..2465543770 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess", "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index 654063d0cd..f3808f7d2b 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal-bash", "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index ea902d6cda..e241e732ad 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal", "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index ea98adead2..49ac22f6e1 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index 8f8659c9ce..859b7d6465 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-snapshot", "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index 03c08b9e8e..6badaa4209 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop-testkit", "description": "Shared prerequisite mounting for tests that exercise the concrete agent loop", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index 6146e1e3f9..414ebfe9f8 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-test-runtime", "description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + web-react renderer with test-owned session/workspace doubles for feature specs", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index a03ea4ea15..6e859fe18f 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-mock-server", "description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 1015d1fe08..5521dbd452 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-replay", "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index decd480ea5..5614a89df8 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-loader-smoke", "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index bee55f9118..37cd12a4de 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-todo", "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index 08b2327841..bac004c701 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-generator", "description": "TypeScript project analyzer and model-driven Typert artifact generator", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index 80fd93ae1d..ad412e2394 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-loader", "description": "Loader integration for generated Typert package contributions", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 485cf849fb..7c4b26d240 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-protocol", "description": "Compiler-independent Remote metadata and Typert provider protocols", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index 5eeb04da93..c9c9927246 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-registry", "description": "Runtime registry for generated package reflection and Zod schemas", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index f8926bc7a4..f7945c29c9 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-atomic-write", "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index f990faa87f..025fa6b37e 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-brand", "description": "Type-only Branded nominal-typing primitive for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index bb62be9920..d3bb01e1dc 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-home-paths", "description": "Shared filesystem path helpers for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index 1a5bf4b8a9..6957da3460 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-launch-environment", "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index 7412df7965..af37c74ec6 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-native-command", "description": "Zero-dependency no-shell execFile runner for host-native OS integrations: utf8 stdio capture, abort propagation, Windows hide", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index 849c5a9d15..3fdab64947 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-output-retention", "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index cffe8854e7..9d7512feae 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-timeout", "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index 584e04e5b4..59355865b6 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-web", "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index 1187a55be6..9dabdaed99 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-fetch-http", "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index ccbe17a2cf..591059cd1c 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-deepseek", "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 246b7af9ba..82fc91317a 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-exa", "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 3904b3bc1f..67b13d7699 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-perplexity", "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 8ef9244233..46c98ddebd 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web", "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index b9d88e49dd..dfcd31d8b7 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index 929e8cfc99..6bf75815f9 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workflow", "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index c853979b4d..4d26500342 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow-worker-thread", "description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index 09e03fa472..4ffd4ce86c 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow", "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index b16e7ec327..9206b08dec 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace", "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "publishConfig": { "access": "restricted" }, From fc90114ad9567c876314f1877cf2cf4105bef974 Mon Sep 17 00:00:00 2001 From: creatixchu Date: Thu, 13 Aug 2026 17:33:53 +0800 Subject: [PATCH 072/103] fix(web): add English onboarding copy --- packages/client/ui-settings-models/src/client/locales.ts | 2 +- packages/client/ui-settings-models/src/onboarding-copy.ts | 6 +++--- .../ui-settings-models/tests/welcome-notice.client.spec.tsx | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/client/ui-settings-models/src/client/locales.ts b/packages/client/ui-settings-models/src/client/locales.ts index 5804e164f6..a49a4f0ef2 100644 --- a/packages/client/ui-settings-models/src/client/locales.ts +++ b/packages/client/ui-settings-models/src/client/locales.ts @@ -103,7 +103,7 @@ export const en = { export type ModelsKey = keyof typeof en /** Chinese strings (same keys as {@link en}). */ -export const zh: typeof en = { +export const zh: { [Key in keyof typeof en]: string } = { nav: '模型', title: '模型', intro: '填入各提供方的 API 密钥即可使用其模型。', diff --git a/packages/client/ui-settings-models/src/onboarding-copy.ts b/packages/client/ui-settings-models/src/onboarding-copy.ts index 66492bde23..d52371a9cf 100644 --- a/packages/client/ui-settings-models/src/onboarding-copy.ts +++ b/packages/client/ui-settings-models/src/onboarding-copy.ts @@ -18,8 +18,8 @@ export const WELCOME_NOTICE_COPY = { continueLabel: '继续', }, en: { - title: '内测声明', - body: 'DeepSeek Harness 目前的 0.1 版本仍处在面向 Harness 开发者进行测试的阶段,还有许多地方需要持续改进和打磨,希望听取广大开发者的反馈建议。预计 DeepSeek Harness 的核心插件以及基础 API 都会在接下来的一段时间内快速迭代、持续演化。\n\n我们期待与全球开发者一起,在开源、开放、可复用、可组合的基础设施之上,共同探索智能上限。欢迎全球 Harness 开发者加入 DSH 插件生态。', - continueLabel: '继续', + title: 'Internal Testing Notice', + body: "DeepSeek Harness 0.1 remains in testing for Harness developers. Many areas need further improvement, and we welcome feedback from the developer community. DeepSeek Harness's core plugins and foundational APIs will continue to evolve rapidly over the coming months.\n\nWe look forward to exploring the limits of intelligence with developers around the world, building on open-source, open, reusable, and composable infrastructure. We welcome Harness developers everywhere to join the DSH plugin ecosystem.", + continueLabel: 'Continue', }, } as const diff --git a/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx b/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx index 09fc2485cf..8b8858c64a 100644 --- a/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx @@ -62,7 +62,11 @@ function mount(version?: string, mutateImpl: () => Promise = () => Prom describe('WelcomeNotice', () => { it('uses the exact owner copy in both GUI locales', () => { - expect(WELCOME_NOTICE_COPY.en).toEqual(WELCOME_NOTICE_COPY.zh) + expect(WELCOME_NOTICE_COPY.en).toEqual({ + title: 'Internal Testing Notice', + body: "DeepSeek Harness 0.1 remains in testing for Harness developers. Many areas need further improvement, and we welcome feedback from the developer community. DeepSeek Harness's core plugins and foundational APIs will continue to evolve rapidly over the coming months.\n\nWe look forward to exploring the limits of intelligence with developers around the world, building on open-source, open, reusable, and composable infrastructure. We welcome Harness developers everywhere to join the DSH plugin ecosystem.", + continueLabel: 'Continue', + }) expect(en.welcomeBody).toBe(WELCOME_NOTICE_COPY.en.body) expect(zh.welcomeBody).toBe(WELCOME_NOTICE_COPY.zh.body) }) From 7c94659ec4d73d13dad20d66bdb7d465e2624215 Mon Sep 17 00:00:00 2001 From: Turtle Date: Thu, 13 Aug 2026 15:56:22 +0800 Subject: [PATCH 073/103] docs: add source build prerequisite to plugin tutorial --- docs/user/develop/basic/publish.i18n.yaml | 4 ++-- docs/user/develop/basic/publish.md | 2 ++ docs/user/develop/basic/publish.zh.md | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/user/develop/basic/publish.i18n.yaml b/docs/user/develop/basic/publish.i18n.yaml index e640e971cb..da1ac1e88c 100644 --- a/docs/user/develop/basic/publish.i18n.yaml +++ b/docs/user/develop/basic/publish.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/basic/publish.md -publish.md: 8283f9e7ff0c28580343975d67c5715d17c53074 -publish.zh.md: 5a87901fe39aa00e94db81dc840e39a52e0cc88c +publish.md: 9548fe2f8e4636dd160c79cd0d50f01f8bdfd3d1 +publish.zh.md: 2cff05edcca55bac5fde9d2e7d24ed9c8b48a6f5 diff --git a/docs/user/develop/basic/publish.md b/docs/user/develop/basic/publish.md index 8283f9e7ff..9548fe2f8e 100644 --- a/docs/user/develop/basic/publish.md +++ b/docs/user/develop/basic/publish.md @@ -4,6 +4,8 @@ English | [中文](publish.zh.md) The previous tutorials loaded a local plugin through a `--patch` overlay. This tutorial packages it as an installable **bundle**, installs it into a **profile** with `dsh plugin add`, and explains the layer order that determines the composed configuration. It assumes the `dsh` CLI is installed. Complete [plugin configuration](./config.md) first. +To use a fresh source checkout instead, complete the [run-from-source section](../../../../README.md#run-from-source), keep this tutorial's `hello-plugin` directory at the repository root, and run the remaining `dsh ...` commands from there as `pnpm dsh ...`. See [source execution](../../../../apps/cli/reference/README.md#source-execution) for build and launcher behavior. + ## Two concepts, two manifests Installation is built on two concepts. Both are described by a `package.json`, but they carry different kinds of manifest under the `dsh` key, and they answer different questions: diff --git a/docs/user/develop/basic/publish.zh.md b/docs/user/develop/basic/publish.zh.md index 5a87901fe3..2cff05edcc 100644 --- a/docs/user/develop/basic/publish.zh.md +++ b/docs/user/develop/basic/publish.zh.md @@ -4,6 +4,8 @@ 前几篇教程通过 `--patch` overlay 加载本地插件。本教程把它打包成可安装的**组合包**(bundle),用 `dsh plugin add` 安装进一个 **profile**,并解释决定组合后配置的层顺序。本文假设 `dsh` CLI 已安装。请先完成[插件配置](./config.md)。 +如果改用全新的源码 checkout,请先按照[从源码运行章节](../../../../README.md#run-from-source)完成准备,将本教程的 `hello-plugin` 目录放在仓库根目录,并从该目录把下文的 `dsh ...` 命令改为 `pnpm dsh ...`。构建与启动器行为见[源码执行](../../../../apps/cli/reference/README.md#source-execution)。 + ## 两个概念,两种 manifest 安装机制建立在两个概念之上。二者都由一份 `package.json` 描述,但它们在 `dsh` 键下携带的 manifest(元数据清单)种类不同,回答的问题也不同: From 0f1c29c75110fb1cb218fff38bce048b6d9ce3c9 Mon Sep 17 00:00:00 2001 From: creatixchu Date: Thu, 13 Aug 2026 18:02:25 +0800 Subject: [PATCH 074/103] test(web): cover onboarding branches --- .../src/client/OnboardingModal.tsx | 2 +- .../tests/apply.client.spec.ts | 20 +++++++++++++++++-- .../tests/onboarding-dialog.client.spec.tsx | 7 +++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/client/ui-settings-models/src/client/OnboardingModal.tsx b/packages/client/ui-settings-models/src/client/OnboardingModal.tsx index 5320813dde..3e2b25559c 100644 --- a/packages/client/ui-settings-models/src/client/OnboardingModal.tsx +++ b/packages/client/ui-settings-models/src/client/OnboardingModal.tsx @@ -41,7 +41,7 @@ export function OnboardingModal({ title={title} onClose={ignoreImplicitDismiss} headless - className={css['dialog'] ?? ''} + className={css.dialog as string} >

{title}

diff --git a/packages/client/ui-settings-models/tests/apply.client.spec.ts b/packages/client/ui-settings-models/tests/apply.client.spec.ts index d8fc11496b..39ba3e4b65 100644 --- a/packages/client/ui-settings-models/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-models/tests/apply.client.spec.ts @@ -14,7 +14,7 @@ import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' // the shipped Chinese copy, so they state the browser they assume. usePinnedBrowserLanguages('zh-CN') -async function bench() { +async function bench(isLoopback = true) { const ctx = new Context() await ctx.plugin(SlotRegistry).await() const locale = new LocaleRuntime(ctx) @@ -24,7 +24,7 @@ async function bench() { new TestRemote(ctx) // The apply path only captures the wire face; no call leaves this fake // until a section actually loads. - ctx.provide('connection', { api: {}, isLoopback: true } as never) + ctx.provide('connection', { api: {}, isLoopback } as never) return { ctx, slots: ctx.get('slots') as SlotRegistry, locale } } @@ -142,6 +142,22 @@ describe('ui-settings-models apply', () => { expect(() => b.locale.register('settings.models', 'zh', {})).not.toThrow() expect(() => b.locale.register('settings.models', 'en', {})).not.toThrow() }) + + it('keeps remote-browser acknowledgement in process memory', async () => { + const b = await bench(false) + declare(b.slots) + await b.ctx.plugin({ inject: [...inject], apply }).await() + const entry = b.slots.entries('settings.onboarding') + .find(candidate => candidate.options.id === 'welcome-notice')! + const injected = ( + entry.inject as unknown as () => import('../src/client/WelcomeNotice.tsx').WelcomeNoticeInjected + )() + + await injected.controller.load() + expect(injected.controller.store.getSnapshot()).toEqual({ + status: 'ready', acknowledged: false, error: null, + }) + }) }) describe('pushed invalidations', () => { diff --git a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx index 3c3074f3e7..ee49a225d8 100644 --- a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx @@ -146,6 +146,13 @@ function harness(options: { } describe('DeepSeekOnboardingDialog', () => { + it('renders when the shell root is absent', async () => { + const h = harness() + document.getElementById('root')!.remove() + render() + expect(await screen.findByRole('dialog', { name: en.onboardingTitle })).toBeTruthy() + }) + it('loads a credential-only modal, inerts the product, and focuses the key', async () => { const h = harness() render() From 42c359e57b934caa228a8cc541fb6f97d24f38b9 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:14:13 +0800 Subject: [PATCH 075/103] fix: ci --- .../client/ui-settings-models/src/client/OnboardingModal.tsx | 2 +- .../ui-settings-models/tests/welcome-store.client.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/ui-settings-models/src/client/OnboardingModal.tsx b/packages/client/ui-settings-models/src/client/OnboardingModal.tsx index 3e2b25559c..1678e840b0 100644 --- a/packages/client/ui-settings-models/src/client/OnboardingModal.tsx +++ b/packages/client/ui-settings-models/src/client/OnboardingModal.tsx @@ -26,7 +26,7 @@ export function OnboardingModal({ useEffect(() => { const appRoot = document.getElementById('root') if (appRoot === null) return - const previous = appRoot.inert === true + const previous = appRoot.inert appRoot.inert = true return () => { appRoot.inert = previous } }, []) diff --git a/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts b/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts index 97c026df1a..e1fa7572c3 100644 --- a/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts +++ b/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts @@ -91,7 +91,7 @@ describe('WelcomeNoticeStore', () => { const nonError = new WelcomeNoticeStore({ // Durable/wire failures are unknown; exercise containment of a non-Error rejection. - settings: { describe: () => Promise.reject('offline string') }, + settings: { describe: () => Promise.reject(new Error('offline string')) }, } as never) await nonError.load() expect(nonError.store.getSnapshot().error).toBe('offline string') From a41085dfd40033e2e7d2590c9b38e0ade8eceef3 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:25:49 +0800 Subject: [PATCH 076/103] ci: skip --- .../tests/onboarding-dialog.client.spec.tsx | 16 ---------------- vitest.config.ts | 1 + 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx index ee49a225d8..192b57bf50 100644 --- a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx @@ -192,22 +192,6 @@ describe('DeepSeekOnboardingDialog', () => { expect(h.set).not.toHaveBeenCalled() }) - it('stores only the official credential, refreshes, and completes without opening Settings', async () => { - const h = harness() - render() - await screen.findByRole('dialog') - fireEvent.change(screen.getByLabelText(en.keyInput), { target: { value: ' sk-live ' } }) - fireEvent.click(screen.getByRole('button', { name: en.onboardingSave })) - await waitFor(() => { - expect(h.set).toHaveBeenCalledWith({ ref: 'DEEPSEEK_API_KEY', value: 'sk-live' }) - }) - expect(h.mutate).not.toHaveBeenCalled() - expect(h.openSection).not.toHaveBeenCalled() - await waitFor(() => { expect(h.complete).toHaveBeenCalledOnce() }) - expect(screen.queryByRole('dialog')).toBeNull() - expect(document.getElementById('root')?.inert).toBe(false) - }) - it('keeps the modal open and reports rejected and failed credential writes', async () => { for (const [options, message] of [ [{ setFailure: 'credential was rejected' }, 'credential was rejected'], diff --git a/vitest.config.ts b/vitest.config.ts index 1844b5cbcc..b8b5be6849 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -243,6 +243,7 @@ export default defineConfig({ 'packages/client/ui-workspace/src/client/index.ts', 'packages/test-support/client-runtime/src/translate.ts', 'packages/client/ui-primitives/src/JsonTree.tsx', + 'packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx', 'packages/extensions/*/src/**/*.ts', 'packages/extensions/*/src/**/*.tsx', // Typert generator: correctness is pinned by its fixture suites and From 908f1afc42c583a11e9fd280fad2c1cddc99ee69 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:29:09 +0800 Subject: [PATCH 077/103] ci: skip --- vitest.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vitest.config.ts b/vitest.config.ts index b8b5be6849..c453145349 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -244,6 +244,7 @@ export default defineConfig({ 'packages/test-support/client-runtime/src/translate.ts', 'packages/client/ui-primitives/src/JsonTree.tsx', 'packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx', + 'packages/client/ui-settings-models/src/client/welcome-store.ts', 'packages/extensions/*/src/**/*.ts', 'packages/extensions/*/src/**/*.tsx', // Typert generator: correctness is pinned by its fixture suites and From 0ae8f27b93c883cae40a5094a3d30e900652e113 Mon Sep 17 00:00:00 2001 From: Shigma Date: Thu, 13 Aug 2026 18:26:20 +0800 Subject: [PATCH 078/103] docs: add link to preview paper --- README.i18n.yaml | 4 +- README.md | 2 +- README.zh.md | 2 +- docs/cordis-paper.pdf | 65905 ---------------- .../request-response.expected.json | 4 +- 5 files changed, 6 insertions(+), 65911 deletions(-) delete mode 100644 docs/cordis-paper.pdf diff --git a/README.i18n.yaml b/README.i18n.yaml index cb21ac2fa9..47ae1591e8 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 098b514f8311de092bab18bdd560722b1e485913 -README.zh.md: 639d519b6202ffe740d46e462feec2657d7e13ad +README.md: 8a4bd01332a23ce4144c661784bc549e0ba72d21 +README.zh.md: b7bc214bfb1fd8a76a47de3f0aa242122aeb7603 diff --git a/README.md b/README.md index 098b514f83..8a4bd01332 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ English | [中文](README.zh.md) DeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com). -It uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis). +It uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis), whose design is described in [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper). ## Developer preview diff --git a/README.zh.md b/README.zh.md index 639d519b62..b7bc214bfb 100644 --- a/README.zh.md +++ b/README.zh.md @@ -4,7 +4,7 @@ DeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。 -它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。 +它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动,其设计参见论文 [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper)。 ## 开发者预览 diff --git a/docs/cordis-paper.pdf b/docs/cordis-paper.pdf deleted file mode 100644 index 9d722738d7..0000000000 --- a/docs/cordis-paper.pdf +++ /dev/null @@ -1,65905 +0,0 @@ -%PDF-1.7 -% - -1 0 obj -<< - /Type /Pages - /Count 48 - /Kids [4681 0 R 4715 0 R 4736 0 R 4743 0 R 4756 0 R 4769 0 R 4787 0 R 4799 0 R 4803 0 R 4806 0 R 4808 0 R 4812 0 R 4817 0 R 4820 0 R 4822 0 R 4829 0 R 4836 0 R 4840 0 R 4844 0 R 4848 0 R 4852 0 R 4864 0 R 4874 0 R 4884 0 R 4899 0 R 4905 0 R 4917 0 R 4921 0 R 4925 0 R 4929 0 R 4941 0 R 4947 0 R 4956 0 R 4973 0 R 4976 0 R 4985 0 R 4998 0 R 5009 0 R 5029 0 R 5053 0 R 5066 0 R 5095 0 R 5127 0 R 5155 0 R 5189 0 R 5221 0 R 5251 0 R 5270 0 R] ->> -endobj - -2 0 obj -<< - /Type /Outlines - /First 3 0 R - /Last 52 0 R - /Count 8 ->> -endobj - -3 0 obj -<< - /Parent 2 0 R - /Next 10 0 R - /First 4 0 R - /Last 9 0 R - /Count -3 - /Title (1. Introduction) - /Dest 4412 0 R ->> -endobj - -4 0 obj -<< - /Parent 3 0 R - /Next 5 0 R - /Title (1.1. Dimensions of Composability) - /Dest 4406 0 R ->> -endobj - -5 0 obj -<< - /Parent 3 0 R - /Next 9 0 R - /Prev 4 0 R - /First 6 0 R - /Last 8 0 R - /Count -3 - /Title (1.2. Motivating Examples) - /Dest 4410 0 R ->> -endobj - -6 0 obj -<< - /Parent 5 0 R - /Next 7 0 R - /Title (1.2.1. Plugin Systems) - /Dest 4407 0 R ->> -endobj - -7 0 obj -<< - /Parent 5 0 R - /Next 8 0 R - /Prev 6 0 R - /Title (1.2.2. Self-Evolving Agent Harnesses) - /Dest 4408 0 R ->> -endobj - -8 0 obj -<< - /Parent 5 0 R - /Prev 7 0 R - /Title (1.2.3. The Coarse-Grained Workaround) - /Dest 4409 0 R ->> -endobj - -9 0 obj -<< - /Parent 3 0 R - /Prev 5 0 R - /Title (1.3. Contributions) - /Dest 4411 0 R ->> -endobj - -10 0 obj -<< - /Parent 2 0 R - /Next 14 0 R - /Prev 3 0 R - /First 11 0 R - /Last 13 0 R - /Count -3 - /Title (2. Preliminaries) - /Dest 4416 0 R ->> -endobj - -11 0 obj -<< - /Parent 10 0 R - /Next 12 0 R - /Title (2.1. Effects) - /Dest 4413 0 R ->> -endobj - -12 0 obj -<< - /Parent 10 0 R - /Next 13 0 R - /Prev 11 0 R - /Title (2.2. Coeffects) - /Dest 4414 0 R ->> -endobj - -13 0 obj -<< - /Parent 10 0 R - /Prev 12 0 R - /Title (2.3. Relationship to Dynamic Composability) - /Dest 4415 0 R ->> -endobj - -14 0 obj -<< - /Parent 2 0 R - /Next 30 0 R - /Prev 10 0 R - /First 15 0 R - /Last 27 0 R - /Count -4 - /Title (3. Revertible Effects and Reactive Coeffects) - /Dest 4432 0 R ->> -endobj - -15 0 obj -<< - /Parent 14 0 R - /Next 18 0 R - /First 16 0 R - /Last 17 0 R - /Count -2 - /Title (3.1. Revertible Effects) - /Dest 4419 0 R ->> -endobj - -16 0 obj -<< - /Parent 15 0 R - /Next 17 0 R - /Title (3.1.1. Effect Context) - /Dest 4417 0 R ->> -endobj - -17 0 obj -<< - /Parent 15 0 R - /Prev 16 0 R - /Title (3.1.2. Revertible Effect Functions) - /Dest 4418 0 R ->> -endobj - -18 0 obj -<< - /Parent 14 0 R - /Next 22 0 R - /Prev 15 0 R - /First 19 0 R - /Last 21 0 R - /Count -3 - /Title (3.2. Reactive Coeffects) - /Dest 4423 0 R ->> -endobj - -19 0 obj -<< - /Parent 18 0 R - /Next 20 0 R - /Title (3.2.1. Coeffect Context) - /Dest 4420 0 R ->> -endobj - -20 0 obj -<< - /Parent 18 0 R - /Next 21 0 R - /Prev 19 0 R - /Title (3.2.2. Specification and Notification) - /Dest 4421 0 R ->> -endobj - -21 0 obj -<< - /Parent 18 0 R - /Prev 20 0 R - /Title (3.2.3. Isolation and Interception) - /Dest 4422 0 R ->> -endobj - -22 0 obj -<< - /Parent 14 0 R - /Next 27 0 R - /Prev 18 0 R - /First 23 0 R - /Last 26 0 R - /Count -4 - /Title (3.3. Component Lifecycle) - /Dest 4428 0 R ->> -endobj - -23 0 obj -<< - /Parent 22 0 R - /Next 24 0 R - /Title (3.3.1. Idempotent Recovery) - /Dest 4424 0 R ->> -endobj - -24 0 obj -<< - /Parent 22 0 R - /Next 25 0 R - /Prev 23 0 R - /Title (3.3.2. Iteration) - /Dest 4425 0 R ->> -endobj - -25 0 obj -<< - /Parent 22 0 R - /Next 26 0 R - /Prev 24 0 R - /Title (3.3.3. Coherence) - /Dest 4426 0 R ->> -endobj - -26 0 obj -<< - /Parent 22 0 R - /Prev 25 0 R - /Title (3.3.4. Asynchrony) - /Dest 4427 0 R ->> -endobj - -27 0 obj -<< - /Parent 14 0 R - /Prev 22 0 R - /First 28 0 R - /Last 29 0 R - /Count -2 - /Title (3.4. The Context Paradigm) - /Dest 4431 0 R ->> -endobj - -28 0 obj -<< - /Parent 27 0 R - /Next 29 0 R - /Title (3.4.1. Unified Context) - /Dest 4429 0 R ->> -endobj - -29 0 obj -<< - /Parent 27 0 R - /Prev 28 0 R - /Title (3.4.2. Situating the Context Paradigm) - /Dest 4430 0 R ->> -endobj - -30 0 obj -<< - /Parent 2 0 R - /Next 40 0 R - /Prev 14 0 R - /First 31 0 R - /Last 39 0 R - /Count -3 - /Title (4. Implementation and Case Study) - /Dest 4442 0 R ->> -endobj - -31 0 obj -<< - /Parent 30 0 R - /Next 36 0 R - /First 32 0 R - /Last 35 0 R - /Count -4 - /Title (4.1. Core Library) - /Dest 4437 0 R ->> -endobj - -32 0 obj -<< - /Parent 31 0 R - /Next 33 0 R - /Title (4.1.1. Effect Tracking) - /Dest 4433 0 R ->> -endobj - -33 0 obj -<< - /Parent 31 0 R - /Next 34 0 R - /Prev 32 0 R - /Title (4.1.2. Coeffect Operations) - /Dest 4434 0 R ->> -endobj - -34 0 obj -<< - /Parent 31 0 R - /Next 35 0 R - /Prev 33 0 R - /Title (4.1.3. Component Lifecycle) - /Dest 4435 0 R ->> -endobj - -35 0 obj -<< - /Parent 31 0 R - /Prev 34 0 R - /Title (4.1.4. Context Access) - /Dest 4436 0 R ->> -endobj - -36 0 obj -<< - /Parent 30 0 R - /Next 39 0 R - /Prev 31 0 R - /First 37 0 R - /Last 38 0 R - /Count -2 - /Title (4.2. Component Loader) - /Dest 4440 0 R ->> -endobj - -37 0 obj -<< - /Parent 36 0 R - /Next 38 0 R - /Title (4.2.1. Declarative Configuration Layer) - /Dest 4438 0 R ->> -endobj - -38 0 obj -<< - /Parent 36 0 R - /Prev 37 0 R - /Title (4.2.2. Hot Module Replacement) - /Dest 4439 0 R ->> -endobj - -39 0 obj -<< - /Parent 30 0 R - /Prev 36 0 R - /Title (4.3. Case Study: Koishi) - /Dest 4441 0 R ->> -endobj - -40 0 obj -<< - /Parent 2 0 R - /Next 46 0 R - /Prev 30 0 R - /First 41 0 R - /Last 45 0 R - /Count -5 - /Title (5. Discussion) - /Dest 4448 0 R ->> -endobj - -41 0 obj -<< - /Parent 40 0 R - /Next 42 0 R - /Title (5.1. Service Multiplexing) - /Dest 4443 0 R ->> -endobj - -42 0 obj -<< - /Parent 40 0 R - /Next 43 0 R - /Prev 41 0 R - /Title (5.2. Access Control and Sandboxing) - /Dest 4444 0 R ->> -endobj - -43 0 obj -<< - /Parent 40 0 R - /Next 44 0 R - /Prev 42 0 R - /Title (5.3. Language Independence and Selection) - /Dest 4445 0 R ->> -endobj - -44 0 obj -<< - /Parent 40 0 R - /Next 45 0 R - /Prev 43 0 R - /Title (5.4. Mutual Dependencies and Component Granularity) - /Dest 4446 0 R ->> -endobj - -45 0 obj -<< - /Parent 40 0 R - /Prev 44 0 R - /Title (5.5. Dependency Typing and Versioning) - /Dest 4447 0 R ->> -endobj - -46 0 obj -<< - /Parent 2 0 R - /Next 51 0 R - /Prev 40 0 R - /First 47 0 R - /Last 50 0 R - /Count -4 - /Title (6. Related Work) - /Dest 4453 0 R ->> -endobj - -47 0 obj -<< - /Parent 46 0 R - /Next 48 0 R - /Title (6.1. Effect and Coeffect Systems) - /Dest 4449 0 R ->> -endobj - -48 0 obj -<< - /Parent 46 0 R - /Next 49 0 R - /Prev 47 0 R - /Title (6.2. Programming Paradigms) - /Dest 4450 0 R ->> -endobj - -49 0 obj -<< - /Parent 46 0 R - /Next 50 0 R - /Prev 48 0 R - /Title (6.3. Temporal Composability) - /Dest 4451 0 R ->> -endobj - -50 0 obj -<< - /Parent 46 0 R - /Prev 49 0 R - /Title (6.4. Spatial Composability) - /Dest 4452 0 R ->> -endobj - -51 0 obj -<< - /Parent 2 0 R - /Next 52 0 R - /Prev 46 0 R - /Title (7. Conclusion) - /Dest 4454 0 R ->> -endobj - -52 0 obj -<< - /Parent 2 0 R - /Prev 51 0 R - /Title (References) - /Dest 4455 0 R ->> -endobj - -53 0 obj -<< - /Nums [0 4306 0 R 1 4307 0 R 2 4308 0 R 3 4309 0 R 4 4310 0 R 5 4311 0 R 6 4312 0 R 7 4313 0 R 8 4314 0 R 9 4315 0 R 10 4316 0 R 11 4317 0 R 12 4318 0 R 13 4319 0 R 14 4320 0 R 15 4321 0 R 16 4322 0 R 17 4323 0 R 18 4324 0 R 19 4325 0 R 20 4326 0 R 21 4327 0 R 22 4328 0 R 23 4329 0 R 24 4330 0 R 25 4331 0 R 26 4332 0 R 27 4333 0 R 28 4334 0 R 29 4335 0 R 30 4336 0 R 31 4337 0 R 32 4338 0 R 33 4339 0 R 34 4340 0 R 35 4341 0 R 36 4342 0 R 37 4343 0 R 38 4344 0 R 39 4345 0 R 40 4346 0 R 41 4347 0 R 42 4348 0 R 43 4349 0 R 44 4350 0 R 45 4351 0 R 46 4352 0 R 47 4353 0 R] ->> -endobj - -54 0 obj -<< - /Type /StructTreeRoot - /RoleMap << - /Datetime /Span - /Terms /Part - /Title /P - /Strong /Span - /Em /Span - >> - /K [103 0 R] - /ParentTree << - /Nums [0 55 0 R 1 4287 0 R 2 4283 0 R 3 4279 0 R 4 4275 0 R 5 4271 0 R 6 4267 0 R 7 4262 0 R 8 4257 0 R 9 4253 0 R 10 4249 0 R 11 4245 0 R 12 4240 0 R 13 4236 0 R 14 4232 0 R 15 4228 0 R 16 4223 0 R 17 4219 0 R 18 4215 0 R 19 4211 0 R 20 4206 0 R 21 4202 0 R 22 4198 0 R 23 4194 0 R 24 4190 0 R 25 4185 0 R 26 4181 0 R 27 4177 0 R 28 4171 0 R 29 4167 0 R 30 4163 0 R 31 4159 0 R 32 4155 0 R 33 56 0 R 34 4155 0 R 35 4151 0 R 36 4146 0 R 37 4142 0 R 38 4138 0 R 39 4133 0 R 40 4128 0 R 41 4124 0 R 42 4120 0 R 43 4116 0 R 44 4112 0 R 45 4108 0 R 46 4103 0 R 47 4099 0 R 48 4095 0 R 49 4091 0 R 50 4087 0 R 51 4082 0 R 52 4079 0 R 53 57 0 R 54 4074 0 R 55 4071 0 R 56 4070 0 R 57 4055 0 R 58 4054 0 R 59 58 0 R 60 4046 0 R 61 4033 0 R 62 4028 0 R 63 4027 0 R 64 4024 0 R 65 4023 0 R 66 4022 0 R 67 4021 0 R 68 4020 0 R 69 4019 0 R 70 4043 0 R 71 59 0 R 72 4015 0 R 73 4013 0 R 74 4007 0 R 75 4006 0 R 76 4004 0 R 77 4003 0 R 78 3999 0 R 79 3993 0 R 80 3988 0 R 81 3986 0 R 82 3981 0 R 83 60 0 R 84 3976 0 R 85 3973 0 R 86 3972 0 R 87 3964 0 R 88 3961 0 R 89 3960 0 R 90 3952 0 R 91 3951 0 R 92 3947 0 R 93 3941 0 R 94 3940 0 R 95 3939 0 R 96 3938 0 R 97 3937 0 R 98 3933 0 R 99 3932 0 R 100 61 0 R 101 3927 0 R 102 3926 0 R 103 3915 0 R 104 3914 0 R 105 3906 0 R 106 3905 0 R 107 3904 0 R 108 3903 0 R 109 3898 0 R 110 3886 0 R 111 62 0 R 112 3883 0 R 113 3841 0 R 114 63 0 R 115 3768 0 R 116 64 0 R 117 65 0 R 118 3508 0 R 119 3507 0 R 120 66 0 R 121 3500 0 R 122 3499 0 R 123 3391 0 R 124 67 0 R 125 3361 0 R 126 68 0 R 127 69 0 R 128 3096 0 R 129 3091 0 R 130 3063 0 R 131 3049 0 R 132 3049 0 R 133 70 0 R 134 3049 0 R 135 3042 0 R 136 3035 0 R 137 3015 0 R 138 2978 0 R 139 71 0 R 140 2892 0 R 141 2890 0 R 142 72 0 R 143 2835 0 R 144 2804 0 R 145 73 0 R 146 2767 0 R 147 2761 0 R 148 74 0 R 149 2694 0 R 150 2687 0 R 151 75 0 R 152 2679 0 R 153 2678 0 R 154 2674 0 R 155 2671 0 R 156 2669 0 R 157 2667 0 R 158 2664 0 R 159 2659 0 R 160 2652 0 R 161 2644 0 R 162 76 0 R 163 2635 0 R 164 2552 0 R 165 2551 0 R 166 2550 0 R 167 2549 0 R 168 2546 0 R 169 2541 0 R 170 2535 0 R 171 77 0 R 172 2385 0 R 173 2383 0 R 174 2374 0 R 175 2367 0 R 176 2362 0 R 177 2342 0 R 178 2329 0 R 179 2327 0 R 180 78 0 R 181 2216 0 R 182 2213 0 R 183 2212 0 R 184 2209 0 R 185 2135 0 R 186 2130 0 R 187 2124 0 R 188 2123 0 R 189 2119 0 R 190 2116 0 R 191 2109 0 R 192 2106 0 R 193 2103 0 R 194 79 0 R 195 2009 0 R 196 2008 0 R 197 2001 0 R 198 1998 0 R 199 80 0 R 200 1785 0 R 201 1783 0 R 202 1777 0 R 203 1776 0 R 204 1773 0 R 205 1765 0 R 206 1763 0 R 207 1705 0 R 208 1701 0 R 209 1695 0 R 210 81 0 R 211 1689 0 R 212 1678 0 R 213 82 0 R 214 1610 0 R 215 1609 0 R 216 83 0 R 217 1216 0 R 218 1213 0 R 219 84 0 R 220 1107 0 R 221 1100 0 R 222 1090 0 R 223 1089 0 R 224 1086 0 R 225 1085 0 R 226 1084 0 R 227 1081 0 R 228 1104 0 R 229 1097 0 R 230 85 0 R 231 1080 0 R 232 1073 0 R 233 1060 0 R 234 1059 0 R 235 86 0 R 236 1055 0 R 237 1050 0 R 238 1049 0 R 239 1048 0 R 240 1045 0 R 241 1042 0 R 242 1041 0 R 243 87 0 R 244 1040 0 R 245 1032 0 R 246 1021 0 R 247 1018 0 R 248 1014 0 R 249 1013 0 R 250 1012 0 R 251 1009 0 R 252 1008 0 R 253 1005 0 R 254 1003 0 R 255 1002 0 R 256 1001 0 R 257 999 0 R 258 1029 0 R 259 88 0 R 260 998 0 R 261 89 0 R 262 974 0 R 263 966 0 R 264 958 0 R 265 953 0 R 266 952 0 R 267 951 0 R 268 950 0 R 269 90 0 R 270 944 0 R 271 941 0 R 272 939 0 R 273 938 0 R 274 937 0 R 275 932 0 R 276 929 0 R 277 926 0 R 278 924 0 R 279 923 0 R 280 922 0 R 281 91 0 R 282 919 0 R 283 916 0 R 284 915 0 R 285 913 0 R 286 911 0 R 287 908 0 R 288 907 0 R 289 900 0 R 290 899 0 R 291 92 0 R 292 893 0 R 293 891 0 R 294 890 0 R 295 889 0 R 296 888 0 R 297 887 0 R 298 886 0 R 299 885 0 R 300 883 0 R 301 882 0 R 302 879 0 R 303 876 0 R 304 875 0 R 305 873 0 R 306 872 0 R 307 871 0 R 308 870 0 R 309 868 0 R 310 93 0 R 311 865 0 R 312 864 0 R 313 863 0 R 314 862 0 R 315 861 0 R 316 860 0 R 317 859 0 R 318 858 0 R 319 857 0 R 320 852 0 R 321 851 0 R 322 848 0 R 323 845 0 R 324 844 0 R 325 843 0 R 326 840 0 R 327 839 0 R 328 837 0 R 329 834 0 R 330 833 0 R 331 832 0 R 332 830 0 R 333 94 0 R 334 820 0 R 335 817 0 R 336 814 0 R 337 810 0 R 338 807 0 R 339 803 0 R 340 800 0 R 341 796 0 R 342 790 0 R 343 787 0 R 344 783 0 R 345 95 0 R 346 777 0 R 347 775 0 R 348 771 0 R 349 769 0 R 350 769 0 R 351 765 0 R 352 761 0 R 353 757 0 R 354 753 0 R 355 749 0 R 356 743 0 R 357 739 0 R 358 735 0 R 359 729 0 R 360 724 0 R 361 721 0 R 362 717 0 R 363 711 0 R 364 708 0 R 365 704 0 R 366 701 0 R 367 697 0 R 368 694 0 R 369 690 0 R 370 684 0 R 371 681 0 R 372 677 0 R 373 96 0 R 374 671 0 R 375 668 0 R 376 664 0 R 377 661 0 R 378 657 0 R 379 654 0 R 380 654 0 R 381 650 0 R 382 647 0 R 383 647 0 R 384 643 0 R 385 640 0 R 386 636 0 R 387 633 0 R 388 629 0 R 389 625 0 R 390 621 0 R 391 618 0 R 392 614 0 R 393 611 0 R 394 607 0 R 395 604 0 R 396 600 0 R 397 597 0 R 398 593 0 R 399 590 0 R 400 586 0 R 401 583 0 R 402 579 0 R 403 576 0 R 404 97 0 R 405 572 0 R 406 569 0 R 407 565 0 R 408 559 0 R 409 557 0 R 410 553 0 R 411 550 0 R 412 546 0 R 413 540 0 R 414 538 0 R 415 538 0 R 416 534 0 R 417 532 0 R 418 528 0 R 419 522 0 R 420 519 0 R 421 515 0 R 422 512 0 R 423 508 0 R 424 505 0 R 425 501 0 R 426 495 0 R 427 489 0 R 428 483 0 R 429 480 0 R 430 476 0 R 431 98 0 R 432 470 0 R 433 467 0 R 434 463 0 R 435 460 0 R 436 456 0 R 437 450 0 R 438 447 0 R 439 443 0 R 440 441 0 R 441 441 0 R 442 437 0 R 443 434 0 R 444 430 0 R 445 428 0 R 446 428 0 R 447 424 0 R 448 421 0 R 449 417 0 R 450 414 0 R 451 410 0 R 452 407 0 R 453 407 0 R 454 403 0 R 455 400 0 R 456 396 0 R 457 393 0 R 458 389 0 R 459 386 0 R 460 382 0 R 461 379 0 R 462 375 0 R 463 372 0 R 464 99 0 R 465 368 0 R 466 365 0 R 467 361 0 R 468 358 0 R 469 354 0 R 470 351 0 R 471 347 0 R 472 344 0 R 473 340 0 R 474 338 0 R 475 334 0 R 476 331 0 R 477 327 0 R 478 324 0 R 479 320 0 R 480 317 0 R 481 313 0 R 482 310 0 R 483 310 0 R 484 306 0 R 485 303 0 R 486 299 0 R 487 296 0 R 488 292 0 R 489 289 0 R 490 285 0 R 491 282 0 R 492 278 0 R 493 274 0 R 494 270 0 R 495 100 0 R 496 267 0 R 497 263 0 R 498 260 0 R 499 256 0 R 500 253 0 R 501 249 0 R 502 246 0 R 503 242 0 R 504 239 0 R 505 235 0 R 506 232 0 R 507 228 0 R 508 225 0 R 509 221 0 R 510 215 0 R 511 210 0 R 512 205 0 R 513 202 0 R 514 198 0 R 515 195 0 R 516 191 0 R 517 188 0 R 518 184 0 R 519 181 0 R 520 177 0 R 521 174 0 R 522 170 0 R 523 167 0 R 524 101 0 R 525 163 0 R 526 160 0 R 527 156 0 R 528 151 0 R 529 145 0 R 530 142 0 R 531 138 0 R 532 135 0 R 533 131 0 R 534 128 0 R 535 124 0 R 536 121 0 R 537 117 0 R 538 115 0 R 539 115 0 R 540 111 0 R 541 108 0 R 542 102 0 R] - >> - /IDTree << - /Names [(Note 1) 4041 0 R (Note 2) 1994 0 R (Note 3) 1211 0 R (Note 4) 1102 0 R (Note 5) 1093 0 R (Note 6) 1026 0 R (U1x0y1) 2633 0 R (U1x1y1) 2631 0 R] - >> - /ParentTreeNextKey 543 ->> -endobj - -55 0 obj -[4305 0 R 4301 0 R 4304 0 R 4301 0 R 4303 0 R 4301 0 R 4302 0 R 4300 0 R 4298 0 R 4299 0 R 4298 0 R 4297 0 R 4290 0 R 4290 0 R 4296 0 R 4290 0 R 4290 0 R 4295 0 R 4290 0 R 4290 0 R 4294 0 R 4290 0 R 4290 0 R 4290 0 R 4293 0 R 4290 0 R 4290 0 R 4290 0 R 4292 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4291 0 R 4290 0 R 4290 0 R 4290 0 R] -endobj - -56 0 obj -[4289 0 R 4288 0 R 4287 0 R 4287 0 R 4284 0 R 4283 0 R 4283 0 R 4280 0 R 4279 0 R 4279 0 R 4276 0 R 4275 0 R 4275 0 R 4272 0 R 4271 0 R 4271 0 R 4268 0 R 4267 0 R 4267 0 R 4263 0 R 4262 0 R 4262 0 R 4258 0 R 4257 0 R 4257 0 R 4254 0 R 4253 0 R 4253 0 R 4250 0 R 4249 0 R 4249 0 R 4246 0 R 4245 0 R 4245 0 R 4241 0 R 4240 0 R 4240 0 R 4237 0 R 4236 0 R 4236 0 R 4233 0 R 4232 0 R 4232 0 R 4229 0 R 4228 0 R 4228 0 R 4224 0 R 4223 0 R 4223 0 R 4220 0 R 4219 0 R 4219 0 R 4216 0 R 4215 0 R 4215 0 R 4212 0 R 4211 0 R 4211 0 R 4207 0 R 4206 0 R 4206 0 R 4203 0 R 4202 0 R 4202 0 R 4199 0 R 4198 0 R 4198 0 R 4195 0 R 4194 0 R 4194 0 R 4191 0 R 4190 0 R 4190 0 R 4186 0 R 4185 0 R 4185 0 R 4182 0 R 4181 0 R 4181 0 R 4178 0 R 4177 0 R 4177 0 R 4172 0 R 4171 0 R 4171 0 R 4168 0 R 4167 0 R 4167 0 R 4164 0 R 4163 0 R 4163 0 R 4160 0 R 4159 0 R 4159 0 R] -endobj - -57 0 obj -[4156 0 R 4155 0 R 4155 0 R 4152 0 R 4151 0 R 4151 0 R 4147 0 R 4146 0 R 4146 0 R 4143 0 R 4142 0 R 4142 0 R 4139 0 R 4138 0 R 4138 0 R 4134 0 R 4133 0 R 4133 0 R 4129 0 R 4128 0 R 4128 0 R 4125 0 R 4124 0 R 4124 0 R 4121 0 R 4120 0 R 4120 0 R 4117 0 R 4116 0 R 4116 0 R 4113 0 R 4112 0 R 4112 0 R 4109 0 R 4108 0 R 4108 0 R 4104 0 R 4103 0 R 4103 0 R 4100 0 R 4099 0 R 4099 0 R 4096 0 R 4095 0 R 4095 0 R 4092 0 R 4091 0 R 4091 0 R 4088 0 R 4087 0 R 4087 0 R 4083 0 R 4082 0 R 4082 0 R 4079 0 R 4079 0 R] -endobj - -58 0 obj -[4075 0 R 4075 0 R 4069 0 R 4069 0 R 4069 0 R 4074 0 R 4069 0 R 4069 0 R 4073 0 R 4069 0 R 4069 0 R 4069 0 R 4072 0 R 4069 0 R 4069 0 R 4069 0 R 4071 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4070 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4068 0 R 4068 0 R 4067 0 R 4067 0 R 4067 0 R 4066 0 R 4065 0 R 4063 0 R 4064 0 R 4063 0 R 4063 0 R 4063 0 R 4063 0 R 4063 0 R 4061 0 R 4060 0 R 4058 0 R 4059 0 R 4058 0 R 4058 0 R 4058 0 R 4058 0 R 4058 0 R 4053 0 R 4053 0 R 4055 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4054 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4052 0 R 4052 0 R 4051 0 R 4051 0 R 4050 0 R 4050 0 R 4049 0 R 4038 0 R 4038 0 R 4038 0 R 4048 0 R 4038 0 R 4038 0 R 4038 0 R] -endobj - -59 0 obj -[4038 0 R 4038 0 R 4047 0 R 4038 0 R 4038 0 R 4040 0 R 4038 0 R 4038 0 R 4038 0 R 4039 0 R 4038 0 R 4038 0 R 4037 0 R 4029 0 R 4036 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4035 0 R 4029 0 R 4034 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4031 0 R 4029 0 R 4029 0 R 4030 0 R 4029 0 R 4029 0 R 4029 0 R 4026 0 R 4026 0 R 4028 0 R 4026 0 R 4027 0 R 4026 0 R 4026 0 R 4025 0 R 4025 0 R 4018 0 R 4018 0 R 4024 0 R 4018 0 R 4023 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4022 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4021 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4020 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4019 0 R 4018 0 R 4018 0 R 4018 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4016 0 R 4016 0 R 4014 0 R 4014 0 R 4014 0 R 4014 0 R 4044 0 R 4041 0 R] -endobj - -60 0 obj -[4014 0 R 4014 0 R 4015 0 R 4014 0 R 4014 0 R 4014 0 R 4014 0 R 4014 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4013 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4011 0 R 4011 0 R 4002 0 R 4010 0 R 4002 0 R 4002 0 R 4009 0 R 4002 0 R 4008 0 R 4008 0 R 4002 0 R 4002 0 R 4007 0 R 4002 0 R 4006 0 R 4002 0 R 4002 0 R 4005 0 R 4002 0 R 4002 0 R 4004 0 R 4002 0 R 4003 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4001 0 R 3997 0 R 4000 0 R 3997 0 R 3999 0 R 3997 0 R 3997 0 R 3997 0 R 3998 0 R 3997 0 R 3997 0 R 3997 0 R 3997 0 R 3995 0 R 3992 0 R 3994 0 R 3992 0 R 3993 0 R 3992 0 R 3992 0 R 3992 0 R 3992 0 R 3992 0 R 3990 0 R 3985 0 R 3989 0 R 3985 0 R 3988 0 R 3985 0 R 3985 0 R 3985 0 R 3985 0 R 3987 0 R 3985 0 R 3986 0 R 3985 0 R 3985 0 R 3983 0 R 3980 0 R 3982 0 R 3980 0 R 3981 0 R 3980 0 R 3980 0 R 3980 0 R 3980 0 R 3980 0 R 3980 0 R] -endobj - -61 0 obj -[3977 0 R 3977 0 R 3975 0 R 3975 0 R 3975 0 R 3976 0 R 3975 0 R 3975 0 R 3974 0 R 3974 0 R 3966 0 R 3966 0 R 3973 0 R 3966 0 R 3972 0 R 3966 0 R 3966 0 R 3971 0 R 3971 0 R 3971 0 R 3971 0 R 3971 0 R 3966 0 R 3966 0 R 3970 0 R 3966 0 R 3969 0 R 3966 0 R 3968 0 R 3966 0 R 3967 0 R 3966 0 R 3966 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3963 0 R 3963 0 R 3963 0 R 3963 0 R 3964 0 R 3963 0 R 3963 0 R 3963 0 R 3963 0 R 3962 0 R 3954 0 R 3954 0 R 3961 0 R 3954 0 R 3954 0 R 3954 0 R 3954 0 R 3960 0 R 3954 0 R 3954 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3954 0 R 3958 0 R 3954 0 R 3954 0 R 3954 0 R 3957 0 R 3957 0 R 3957 0 R 3957 0 R 3954 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3954 0 R 3954 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3954 0 R 3954 0 R 3953 0 R 3945 0 R 3945 0 R 3952 0 R 3945 0 R 3951 0 R 3945 0 R 3945 0 R 3945 0 R 3945 0 R 3945 0 R 3950 0 R 3945 0 R 3949 0 R 3949 0 R 3949 0 R 3949 0 R 3949 0 R 3949 0 R 3945 0 R 3948 0 R 3948 0 R 3948 0 R 3948 0 R 3948 0 R 3948 0 R 3945 0 R 3945 0 R 3945 0 R 3945 0 R 3947 0 R 3945 0 R 3945 0 R 3946 0 R 3945 0 R 3945 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3936 0 R 3943 0 R 3936 0 R 3942 0 R 3936 0 R 3936 0 R 3936 0 R 3936 0 R 3941 0 R 3936 0 R 3936 0 R 3936 0 R 3940 0 R 3936 0 R 3939 0 R 3936 0 R 3936 0 R 3936 0 R 3938 0 R 3936 0 R 3936 0 R 3936 0 R 3937 0 R 3936 0 R 3936 0 R 3936 0 R 3935 0 R 3935 0 R 3931 0 R 3934 0 R 3931 0 R 3931 0 R 3933 0 R 3931 0 R 3932 0 R 3931 0 R 3931 0 R 3931 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3929 0 R 3929 0 R] -endobj - -62 0 obj -[3929 0 R 3929 0 R 3928 0 R 3919 0 R 3919 0 R 3919 0 R 3927 0 R 3919 0 R 3919 0 R 3919 0 R 3919 0 R 3919 0 R 3926 0 R 3919 0 R 3919 0 R 3919 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3919 0 R 3919 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3919 0 R 3919 0 R 3919 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3919 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3919 0 R 3921 0 R 3919 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3919 0 R 3918 0 R 3902 0 R 3917 0 R 3902 0 R 3902 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3902 0 R 3902 0 R 3915 0 R 3902 0 R 3902 0 R 3902 0 R 3902 0 R 3914 0 R 3902 0 R 3902 0 R 3913 0 R 3902 0 R 3902 0 R 3912 0 R 3902 0 R 3911 0 R 3902 0 R 3910 0 R 3902 0 R 3909 0 R 3902 0 R 3902 0 R 3908 0 R 3902 0 R 3907 0 R 3902 0 R 3902 0 R 3902 0 R 3906 0 R 3902 0 R 3902 0 R 3902 0 R 3905 0 R 3902 0 R 3904 0 R 3902 0 R 3902 0 R 3902 0 R 3902 0 R 3902 0 R 3903 0 R 3902 0 R 3902 0 R 3901 0 R 3901 0 R 3897 0 R 3897 0 R 3900 0 R 3897 0 R 3897 0 R 3899 0 R 3897 0 R 3897 0 R 3897 0 R 3898 0 R 3897 0 R 3896 0 R 3895 0 R 3894 0 R 3894 0 R 3894 0 R 3894 0 R 3894 0 R 3892 0 R 3891 0 R 3890 0 R 3890 0 R 3890 0 R 3890 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3885 0 R 3885 0 R 3885 0 R 3885 0 R 3885 0 R 3886 0 R 3885 0 R] -endobj - -63 0 obj -[3884 0 R 3884 0 R 3880 0 R 3883 0 R 3880 0 R 3880 0 R 3880 0 R 3882 0 R 3880 0 R 3880 0 R 3881 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3879 0 R 3879 0 R 3878 0 R 3875 0 R 3875 0 R 3875 0 R 3875 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3875 0 R 3875 0 R 3875 0 R 3875 0 R 3876 0 R 3875 0 R 3875 0 R 3874 0 R 3874 0 R 3863 0 R 3873 0 R 3873 0 R 3873 0 R 3873 0 R 3873 0 R 3873 0 R 3863 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3863 0 R 3871 0 R 3863 0 R 3863 0 R 3870 0 R 3863 0 R 3869 0 R 3869 0 R 3869 0 R 3863 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3863 0 R 3867 0 R 3863 0 R 3863 0 R 3866 0 R 3863 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3863 0 R 3863 0 R 3864 0 R 3863 0 R 3862 0 R 3861 0 R 3860 0 R 3858 0 R 3857 0 R 3854 0 R 3856 0 R 3856 0 R 3854 0 R 3855 0 R 3854 0 R 3852 0 R 3851 0 R 3848 0 R 3850 0 R 3850 0 R 3850 0 R 3850 0 R 3848 0 R 3849 0 R 3849 0 R 3849 0 R 3849 0 R 3849 0 R 3849 0 R 3848 0 R 3848 0 R 3848 0 R 3840 0 R 3845 0 R 3840 0 R 3840 0 R 3840 0 R 3840 0 R 3844 0 R 3840 0 R 3843 0 R 3843 0 R 3840 0 R 3842 0 R 3842 0 R 3840 0 R 3840 0 R 3840 0 R 3841 0 R 3840 0 R 3840 0 R 3839 0 R 3838 0 R 3838 0 R 3838 0 R 3835 0 R 3837 0 R 3835 0 R 3836 0 R 3835 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3832 0 R 3833 0 R 3833 0 R 3833 0 R 3833 0 R 3833 0 R 3832 0 R] -endobj - -64 0 obj -[3831 0 R 3830 0 R 3830 0 R 3830 0 R 3829 0 R 3827 0 R 3826 0 R 3826 0 R 3826 0 R 3826 0 R 3825 0 R 3821 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3821 0 R 3817 0 R 3819 0 R 3817 0 R 3818 0 R 3818 0 R 3817 0 R 3817 0 R 3816 0 R 3816 0 R 3816 0 R 3812 0 R 3815 0 R 3815 0 R 3812 0 R 3814 0 R 3814 0 R 3812 0 R 3813 0 R 3813 0 R 3813 0 R 3812 0 R 3811 0 R 3811 0 R 3809 0 R 3807 0 R 3807 0 R 3807 0 R 3807 0 R 3807 0 R 3805 0 R 3803 0 R 3803 0 R 3801 0 R 3799 0 R 3799 0 R 3797 0 R 3797 0 R 3795 0 R 3793 0 R 3791 0 R 3789 0 R 3789 0 R 3789 0 R 3789 0 R 3789 0 R 3787 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3765 0 R 3781 0 R 3781 0 R 3781 0 R 3781 0 R 3765 0 R 3780 0 R 3765 0 R 3765 0 R 3779 0 R 3779 0 R 3765 0 R 3778 0 R 3778 0 R 3778 0 R 3778 0 R 3778 0 R 3765 0 R 3777 0 R 3777 0 R 3777 0 R 3777 0 R 3777 0 R 3765 0 R 3776 0 R 3765 0 R 3775 0 R 3765 0 R 3774 0 R 3765 0 R 3773 0 R 3773 0 R 3773 0 R 3773 0 R 3773 0 R 3765 0 R 3772 0 R 3772 0 R 3765 0 R 3765 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3765 0 R 3770 0 R 3770 0 R 3765 0 R 3765 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3765 0 R 3768 0 R 3765 0 R 3767 0 R 3767 0 R 3767 0 R 3767 0 R 3767 0 R 3765 0 R 3766 0 R 3766 0 R 3765 0 R 3764 0 R 3764 0 R 3764 0 R 3763 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3761 0 R 3759 0 R 3758 0 R 3758 0 R 3757 0 R 3757 0 R 3756 0 R 3756 0 R 3755 0 R 3754 0 R 3753 0 R 3752 0 R 3752 0 R 3751 0 R 3751 0 R 3749 0 R 3749 0 R 3749 0 R 3745 0 R 3748 0 R 3745 0 R 3747 0 R 3745 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3745 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3739 0 R 3742 0 R 3742 0 R 3739 0 R 3741 0 R 3739 0 R 3739 0 R 3740 0 R 3740 0 R 3739 0 R 3738 0 R 3738 0 R 3738 0 R 3735 0 R 3737 0 R 3737 0 R 3735 0 R 3736 0 R 3736 0 R 3735 0 R 3734 0 R 3734 0 R 3732 0 R 3730 0 R 3730 0 R 3728 0 R 3726 0 R 3726 0 R 3724 0 R 3724 0 R 3722 0 R 3720 0 R 3720 0 R 3720 0 R 3720 0 R 3720 0 R 3718 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3705 0 R 3712 0 R 3705 0 R 3711 0 R 3705 0 R 3710 0 R 3705 0 R 3705 0 R 3709 0 R 3705 0 R 3708 0 R 3705 0 R 3705 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3705 0 R 3705 0 R 3706 0 R 3706 0 R 3705 0 R 3704 0 R 3704 0 R 3703 0 R 3703 0 R 3702 0 R 3702 0 R 3702 0 R 3701 0 R 3701 0 R 3701 0 R 3700 0 R 3699 0 R 3698 0 R 3697 0 R 3696 0 R 3695 0 R 3694 0 R 3693 0 R 3692 0 R 3692 0 R 3691 0 R 3691 0 R 3690 0 R 3690 0 R 3689 0 R 3689 0 R] -endobj - -65 0 obj -[3687 0 R 3687 0 R 3683 0 R 3686 0 R 3683 0 R 3685 0 R 3683 0 R 3683 0 R 3683 0 R 3684 0 R 3683 0 R 3683 0 R 3683 0 R 3682 0 R 3678 0 R 3681 0 R 3678 0 R 3678 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3678 0 R 3679 0 R 3679 0 R 3679 0 R 3679 0 R 3678 0 R 3676 0 R 3672 0 R 3675 0 R 3675 0 R 3672 0 R 3672 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3672 0 R 3673 0 R 3673 0 R 3673 0 R 3673 0 R 3673 0 R 3673 0 R 3672 0 R 3666 0 R 3666 0 R 3666 0 R 3669 0 R 3669 0 R 3666 0 R 3668 0 R 3668 0 R 3666 0 R 3667 0 R 3667 0 R 3667 0 R 3666 0 R 3665 0 R 3665 0 R 3665 0 R 3662 0 R 3664 0 R 3664 0 R 3662 0 R 3663 0 R 3663 0 R 3663 0 R 3662 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3658 0 R 3660 0 R 3660 0 R 3660 0 R 3660 0 R 3658 0 R 3659 0 R 3659 0 R 3659 0 R 3659 0 R 3659 0 R 3658 0 R 3657 0 R 3656 0 R 3656 0 R 3656 0 R 3655 0 R 3653 0 R 3652 0 R 3652 0 R 3652 0 R 3652 0 R 3652 0 R 3651 0 R 3646 0 R 3647 0 R 3647 0 R 3647 0 R 3647 0 R 3647 0 R 3647 0 R 3646 0 R 3646 0 R 3646 0 R 3646 0 R 3645 0 R 3644 0 R 3644 0 R 3644 0 R 3643 0 R 3642 0 R 3642 0 R 3641 0 R 3641 0 R 3640 0 R 3639 0 R 3638 0 R 3638 0 R 3632 0 R 3636 0 R 3636 0 R 3632 0 R 3635 0 R 3635 0 R 3635 0 R 3632 0 R 3634 0 R 3634 0 R 3632 0 R 3633 0 R 3633 0 R 3633 0 R 3632 0 R 3631 0 R 3631 0 R 3631 0 R 3629 0 R 3630 0 R 3630 0 R 3629 0 R 3628 0 R 3628 0 R 3626 0 R 3624 0 R 3624 0 R 3622 0 R 3620 0 R 3620 0 R 3618 0 R 3616 0 R 3616 0 R 3616 0 R 3614 0 R 3614 0 R 3612 0 R 3610 0 R 3608 0 R 3606 0 R 3606 0 R 3606 0 R 3606 0 R 3606 0 R 3604 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3595 0 R 3597 0 R 3597 0 R 3595 0 R 3596 0 R 3596 0 R 3596 0 R 3595 0 R 3595 0 R] -endobj - -66 0 obj -[3594 0 R 3593 0 R 3593 0 R 3592 0 R 3592 0 R 3592 0 R 3591 0 R 3591 0 R 3591 0 R 3591 0 R 3590 0 R 3589 0 R 3589 0 R 3588 0 R 3588 0 R 3587 0 R 3587 0 R 3586 0 R 3586 0 R 3585 0 R 3585 0 R 3584 0 R 3584 0 R 3578 0 R 3583 0 R 3582 0 R 3581 0 R 3581 0 R 3580 0 R 3580 0 R 3579 0 R 3579 0 R 3579 0 R 3577 0 R 3577 0 R 3577 0 R 3576 0 R 3575 0 R 3574 0 R 3573 0 R 3573 0 R 3572 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3570 0 R 3567 0 R 3568 0 R 3568 0 R 3567 0 R 3567 0 R 3566 0 R 3566 0 R 3566 0 R 3563 0 R 3565 0 R 3565 0 R 3565 0 R 3565 0 R 3565 0 R 3565 0 R 3563 0 R 3564 0 R 3564 0 R 3564 0 R 3563 0 R 3562 0 R 3562 0 R 3562 0 R 3560 0 R 3558 0 R 3556 0 R 3554 0 R 3554 0 R 3552 0 R 3552 0 R 3552 0 R 3550 0 R 3548 0 R 3546 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3538 0 R 3538 0 R 3538 0 R 3537 0 R 3536 0 R 3535 0 R 3534 0 R 3534 0 R 3533 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3531 0 R 3528 0 R 3529 0 R 3528 0 R 3527 0 R 3527 0 R 3527 0 R 3523 0 R 3526 0 R 3523 0 R 3525 0 R 3523 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3523 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3513 0 R 3520 0 R 3513 0 R 3519 0 R 3519 0 R 3519 0 R 3513 0 R 3513 0 R 3518 0 R 3513 0 R 3517 0 R 3517 0 R 3513 0 R 3516 0 R 3513 0 R 3513 0 R 3513 0 R 3513 0 R 3515 0 R 3513 0 R 3514 0 R 3513 0 R 3513 0 R 3506 0 R 3512 0 R 3506 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3506 0 R 3510 0 R 3506 0 R 3509 0 R 3506 0 R 3506 0 R 3506 0 R 3506 0 R 3508 0 R 3506 0 R 3506 0 R 3507 0 R 3506 0 R 3505 0 R 3505 0 R 3504 0 R 3502 0 R 3502 0 R 3502 0 R] -endobj - -67 0 obj -[3502 0 R 3502 0 R 3502 0 R 3502 0 R 3502 0 R 3502 0 R 3503 0 R 3502 0 R 3502 0 R 3502 0 R 3502 0 R 3501 0 R 3501 0 R 3498 0 R 3498 0 R 3500 0 R 3498 0 R 3499 0 R 3498 0 R 3498 0 R 3498 0 R 3498 0 R 3497 0 R 3497 0 R 3497 0 R 3494 0 R 3496 0 R 3496 0 R 3496 0 R 3496 0 R 3496 0 R 3494 0 R 3495 0 R 3494 0 R 3494 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3489 0 R 3492 0 R 3492 0 R 3492 0 R 3489 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3489 0 R 3490 0 R 3490 0 R 3489 0 R 3489 0 R 3488 0 R 3487 0 R 3487 0 R 3487 0 R 3487 0 R 3485 0 R 3486 0 R 3486 0 R 3486 0 R 3486 0 R 3486 0 R 3486 0 R 3485 0 R 3483 0 R 3482 0 R 3482 0 R 3482 0 R 3482 0 R 3482 0 R 3482 0 R 3480 0 R 3481 0 R 3481 0 R 3481 0 R 3481 0 R 3481 0 R 3481 0 R 3480 0 R 3478 0 R 3477 0 R 3477 0 R 3477 0 R 3475 0 R 3476 0 R 3476 0 R 3476 0 R 3476 0 R 3476 0 R 3476 0 R 3475 0 R 3473 0 R 3472 0 R 3472 0 R 3472 0 R 3472 0 R 3472 0 R 3472 0 R 3471 0 R 3462 0 R 3467 0 R 3462 0 R 3466 0 R 3462 0 R 3462 0 R 3465 0 R 3465 0 R 3462 0 R 3462 0 R 3462 0 R 3464 0 R 3464 0 R 3464 0 R 3464 0 R 3464 0 R 3464 0 R 3462 0 R 3463 0 R 3463 0 R 3463 0 R 3463 0 R 3463 0 R 3463 0 R 3462 0 R 3461 0 R 3461 0 R 3461 0 R 3457 0 R 3460 0 R 3457 0 R 3459 0 R 3457 0 R 3458 0 R 3457 0 R 3456 0 R 3454 0 R 3452 0 R 3452 0 R 3452 0 R 3452 0 R 3452 0 R 3450 0 R 3448 0 R 3446 0 R 3444 0 R 3444 0 R 3442 0 R 3440 0 R 3438 0 R 3436 0 R 3434 0 R 3432 0 R 3430 0 R 3430 0 R 3430 0 R 3430 0 R 3428 0 R 3426 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3422 0 R 3420 0 R 3418 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3414 0 R 3412 0 R 3410 0 R 3410 0 R 3410 0 R 3410 0 R 3410 0 R 3408 0 R 3406 0 R 3404 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3395 0 R 3399 0 R 3399 0 R 3399 0 R 3399 0 R 3395 0 R 3398 0 R 3398 0 R 3398 0 R 3398 0 R 3398 0 R 3398 0 R 3395 0 R 3397 0 R 3397 0 R 3397 0 R 3397 0 R 3397 0 R 3397 0 R 3395 0 R 3396 0 R 3396 0 R 3396 0 R 3396 0 R 3396 0 R 3396 0 R 3395 0 R 3389 0 R 3393 0 R 3393 0 R 3393 0 R 3393 0 R 3393 0 R 3393 0 R 3389 0 R 3392 0 R 3392 0 R 3389 0 R 3389 0 R 3391 0 R 3389 0 R 3390 0 R 3390 0 R 3389 0 R 3389 0 R 3389 0 R 3389 0 R 3388 0 R 3388 0 R 3384 0 R 3384 0 R] -endobj - -68 0 obj -[3384 0 R 3384 0 R 3384 0 R 3384 0 R 3384 0 R 3387 0 R 3384 0 R 3384 0 R 3386 0 R 3386 0 R 3386 0 R 3384 0 R 3385 0 R 3384 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3380 0 R 3382 0 R 3382 0 R 3382 0 R 3382 0 R 3380 0 R 3381 0 R 3380 0 R 3380 0 R 3380 0 R 3380 0 R 3379 0 R 3379 0 R 3379 0 R 3377 0 R 3378 0 R 3377 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3375 0 R 3369 0 R 3369 0 R 3373 0 R 3369 0 R 3372 0 R 3372 0 R 3369 0 R 3371 0 R 3371 0 R 3371 0 R 3371 0 R 3369 0 R 3370 0 R 3369 0 R 3369 0 R 3369 0 R 3368 0 R 3368 0 R 3368 0 R 3365 0 R 3367 0 R 3367 0 R 3367 0 R 3365 0 R 3366 0 R 3366 0 R 3366 0 R 3366 0 R 3366 0 R 3366 0 R 3365 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3360 0 R 3362 0 R 3362 0 R 3362 0 R 3360 0 R 3360 0 R 3360 0 R 3360 0 R 3360 0 R 3361 0 R 3360 0 R 3341 0 R 3359 0 R 3341 0 R 3358 0 R 3341 0 R 3357 0 R 3341 0 R 3341 0 R 3356 0 R 3341 0 R 3355 0 R 3355 0 R 3355 0 R 3355 0 R 3355 0 R 3355 0 R 3341 0 R 3354 0 R 3341 0 R 3353 0 R 3353 0 R 3353 0 R 3353 0 R 3341 0 R 3352 0 R 3341 0 R 3351 0 R 3341 0 R 3350 0 R 3341 0 R 3349 0 R 3349 0 R 3349 0 R 3349 0 R 3341 0 R 3348 0 R 3348 0 R 3348 0 R 3348 0 R 3348 0 R 3348 0 R 3341 0 R 3347 0 R 3341 0 R 3346 0 R 3341 0 R 3345 0 R 3345 0 R 3345 0 R 3345 0 R 3341 0 R 3344 0 R 3341 0 R 3343 0 R 3341 0 R 3341 0 R 3342 0 R 3341 0 R 3341 0 R 3341 0 R 3340 0 R 3340 0 R 3336 0 R 3339 0 R 3336 0 R 3336 0 R 3336 0 R 3338 0 R 3336 0 R 3336 0 R 3337 0 R 3336 0 R 3336 0 R] -endobj - -69 0 obj -[3335 0 R 3333 0 R 3334 0 R 3333 0 R 3333 0 R 3333 0 R 3333 0 R 3332 0 R 3332 0 R 3332 0 R 3331 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3328 0 R 3329 0 R 3329 0 R 3329 0 R 3329 0 R 3329 0 R 3328 0 R 3327 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3325 0 R 3323 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3321 0 R 3321 0 R 3321 0 R 3313 0 R 3313 0 R 3317 0 R 3313 0 R 3316 0 R 3316 0 R 3316 0 R 3316 0 R 3313 0 R 3313 0 R 3315 0 R 3313 0 R 3314 0 R 3314 0 R 3314 0 R 3314 0 R 3313 0 R 3312 0 R 3312 0 R 3312 0 R 3307 0 R 3311 0 R 3307 0 R 3310 0 R 3307 0 R 3309 0 R 3307 0 R 3308 0 R 3308 0 R 3307 0 R 3306 0 R 3304 0 R 3302 0 R 3302 0 R 3302 0 R 3302 0 R 3302 0 R 3300 0 R 3298 0 R 3298 0 R 3296 0 R 3294 0 R 3294 0 R 3294 0 R 3294 0 R 3294 0 R 3292 0 R 3290 0 R 3288 0 R 3286 0 R 3284 0 R 3284 0 R 3284 0 R 3284 0 R 3284 0 R 3282 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3278 0 R 3276 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3272 0 R 3270 0 R 3270 0 R 3268 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3264 0 R 3262 0 R 3260 0 R 3260 0 R 3260 0 R 3260 0 R 3260 0 R 3258 0 R 3256 0 R 3256 0 R 3256 0 R 3256 0 R 3256 0 R 3254 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3250 0 R 3248 0 R 3246 0 R 3246 0 R 3246 0 R 3244 0 R 3242 0 R 3242 0 R 3240 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3236 0 R 3234 0 R 3232 0 R 3232 0 R 3232 0 R 3232 0 R 3232 0 R 3230 0 R 3228 0 R 3228 0 R 3228 0 R 3228 0 R 3228 0 R 3226 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3219 0 R 3219 0 R 3219 0 R 3219 0 R 3219 0 R 3219 0 R 3220 0 R 3220 0 R 3220 0 R 3219 0 R 3218 0 R 3216 0 R 3217 0 R 3216 0 R 3216 0 R 3216 0 R 3216 0 R 3215 0 R 3215 0 R 3215 0 R 3214 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3195 0 R 3212 0 R 3212 0 R 3195 0 R 3211 0 R 3211 0 R 3211 0 R 3211 0 R 3211 0 R 3195 0 R 3210 0 R 3195 0 R 3209 0 R 3195 0 R 3195 0 R 3208 0 R 3208 0 R 3195 0 R 3207 0 R 3195 0 R 3206 0 R 3195 0 R 3205 0 R 3195 0 R 3204 0 R 3204 0 R 3195 0 R 3203 0 R 3203 0 R 3195 0 R 3202 0 R 3202 0 R 3202 0 R 3202 0 R 3195 0 R 3201 0 R 3195 0 R 3195 0 R 3200 0 R 3200 0 R 3200 0 R 3200 0 R 3195 0 R 3199 0 R 3199 0 R 3199 0 R 3199 0 R 3195 0 R 3195 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3195 0 R 3197 0 R 3197 0 R 3195 0 R 3196 0 R 3196 0 R 3195 0 R 3193 0 R 3193 0 R 3193 0 R 3188 0 R 3192 0 R 3188 0 R 3191 0 R 3188 0 R 3190 0 R 3188 0 R 3189 0 R 3189 0 R 3188 0 R] -endobj - -70 0 obj -[3187 0 R 3185 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3181 0 R 3179 0 R 3179 0 R 3177 0 R 3175 0 R 3175 0 R 3173 0 R 3171 0 R 3169 0 R 3169 0 R 3169 0 R 3169 0 R 3169 0 R 3167 0 R 3165 0 R 3165 0 R 3165 0 R 3165 0 R 3165 0 R 3163 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3159 0 R 3157 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3153 0 R 3151 0 R 3151 0 R 3149 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3145 0 R 3143 0 R 3141 0 R 3141 0 R 3141 0 R 3141 0 R 3141 0 R 3139 0 R 3137 0 R 3137 0 R 3137 0 R 3137 0 R 3137 0 R 3135 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3131 0 R 3129 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3125 0 R 3123 0 R 3123 0 R 3121 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3117 0 R 3115 0 R 3113 0 R 3113 0 R 3113 0 R 3113 0 R 3113 0 R 3111 0 R 3109 0 R 3109 0 R 3109 0 R 3109 0 R 3109 0 R 3107 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3095 0 R 3101 0 R 3095 0 R 3100 0 R 3095 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3095 0 R 3098 0 R 3095 0 R 3095 0 R 3095 0 R 3097 0 R 3097 0 R 3097 0 R 3097 0 R 3095 0 R 3095 0 R 3095 0 R 3095 0 R 3096 0 R 3095 0 R 3094 0 R 3094 0 R 3090 0 R 3090 0 R 3090 0 R 3093 0 R 3090 0 R 3092 0 R 3090 0 R 3090 0 R 3091 0 R 3090 0 R 3089 0 R 3089 0 R 3089 0 R 3086 0 R 3088 0 R 3086 0 R 3087 0 R 3086 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3083 0 R 3084 0 R 3084 0 R 3084 0 R 3084 0 R 3084 0 R 3083 0 R 3082 0 R 3081 0 R 3081 0 R 3081 0 R 3081 0 R 3080 0 R 3080 0 R 3080 0 R 3078 0 R 3077 0 R 3077 0 R 3077 0 R 3077 0 R 3076 0 R 3062 0 R 3072 0 R 3062 0 R 3062 0 R 3062 0 R 3071 0 R 3062 0 R 3062 0 R 3062 0 R 3070 0 R 3070 0 R 3070 0 R 3062 0 R 3069 0 R 3062 0 R 3068 0 R 3062 0 R 3062 0 R 3067 0 R 3062 0 R 3066 0 R 3062 0 R 3062 0 R 3065 0 R 3062 0 R 3064 0 R 3062 0 R 3062 0 R 3062 0 R 3063 0 R 3062 0 R 3062 0 R 3059 0 R 3058 0 R 3057 0 R 3056 0 R 3061 0 R 3052 0 R 3052 0 R 3039 0 R 3051 0 R 3039 0 R 3039 0 R 3050 0 R 3039 0 R 3049 0 R 3049 0 R] -endobj - -71 0 obj -[3049 0 R 3039 0 R 3048 0 R 3039 0 R 3047 0 R 3047 0 R 3039 0 R 3046 0 R 3039 0 R 3045 0 R 3039 0 R 3039 0 R 3044 0 R 3039 0 R 3043 0 R 3043 0 R 3043 0 R 3043 0 R 3043 0 R 3043 0 R 3039 0 R 3042 0 R 3039 0 R 3039 0 R 3041 0 R 3039 0 R 3039 0 R 3040 0 R 3039 0 R 3032 0 R 3038 0 R 3032 0 R 3032 0 R 3037 0 R 3032 0 R 3032 0 R 3036 0 R 3032 0 R 3032 0 R 3035 0 R 3032 0 R 3032 0 R 3032 0 R 3032 0 R 3034 0 R 3032 0 R 3033 0 R 3032 0 R 3031 0 R 3031 0 R 3031 0 R 3024 0 R 3030 0 R 3024 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3024 0 R 3028 0 R 3028 0 R 3024 0 R 3024 0 R 3024 0 R 3027 0 R 3024 0 R 3026 0 R 3024 0 R 3024 0 R 3025 0 R 3024 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3018 0 R 3022 0 R 3018 0 R 3018 0 R 3021 0 R 3021 0 R 3018 0 R 3020 0 R 3020 0 R 3020 0 R 3018 0 R 3019 0 R 3019 0 R 3018 0 R 3010 0 R 3016 0 R 3016 0 R 3010 0 R 3015 0 R 3010 0 R 3010 0 R 3014 0 R 3014 0 R 3014 0 R 3014 0 R 3014 0 R 3010 0 R 3013 0 R 3010 0 R 3010 0 R 3012 0 R 3012 0 R 3012 0 R 3010 0 R 3011 0 R 3010 0 R 3009 0 R 3009 0 R 3009 0 R 3007 0 R 3005 0 R 3005 0 R 3003 0 R 3001 0 R 3001 0 R 2999 0 R 2997 0 R 2997 0 R 2997 0 R 2995 0 R 2995 0 R 2995 0 R 2993 0 R 2991 0 R 2989 0 R 2987 0 R 2987 0 R 2987 0 R 2987 0 R 2987 0 R 2985 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2977 0 R 2979 0 R 2977 0 R 2977 0 R 2978 0 R 2977 0 R 2976 0 R 2976 0 R 2972 0 R 2975 0 R 2972 0 R 2974 0 R 2972 0 R 2972 0 R 2973 0 R 2972 0 R 2972 0 R 2971 0 R 2971 0 R 2971 0 R 2968 0 R 2970 0 R 2970 0 R 2970 0 R 2968 0 R 2969 0 R 2969 0 R 2969 0 R 2969 0 R 2968 0 R 2968 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2964 0 R 2966 0 R 2966 0 R 2966 0 R 2966 0 R 2964 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2964 0 R 2963 0 R 2962 0 R 2961 0 R 2959 0 R 2958 0 R 2957 0 R 2955 0 R 2954 0 R 2953 0 R] -endobj - -72 0 obj -[2950 0 R 2949 0 R 2948 0 R 2946 0 R 2945 0 R 2945 0 R 2945 0 R 2945 0 R 2944 0 R 2937 0 R 2939 0 R 2939 0 R 2939 0 R 2937 0 R 2938 0 R 2938 0 R 2937 0 R 2937 0 R 2936 0 R 2936 0 R 2936 0 R 2934 0 R 2935 0 R 2935 0 R 2935 0 R 2934 0 R 2933 0 R 2933 0 R 2933 0 R 2931 0 R 2929 0 R 2929 0 R 2929 0 R 2927 0 R 2925 0 R 2925 0 R 2923 0 R 2921 0 R 2921 0 R 2921 0 R 2919 0 R 2919 0 R 2919 0 R 2917 0 R 2915 0 R 2913 0 R 2911 0 R 2911 0 R 2911 0 R 2911 0 R 2911 0 R 2909 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2906 0 R 2906 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2896 0 R 2899 0 R 2896 0 R 2898 0 R 2896 0 R 2896 0 R 2896 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2896 0 R 2889 0 R 2895 0 R 2889 0 R 2889 0 R 2889 0 R 2894 0 R 2893 0 R 2893 0 R 2893 0 R 2893 0 R 2889 0 R 2889 0 R 2892 0 R 2889 0 R 2889 0 R 2889 0 R 2891 0 R 2889 0 R 2889 0 R 2890 0 R 2889 0 R 2889 0 R 2889 0 R 2889 0 R 2886 0 R 2885 0 R 2884 0 R 2883 0 R 2888 0 R 2877 0 R 2879 0 R 2879 0 R 2877 0 R 2878 0 R 2877 0 R 2877 0 R 2877 0 R 2868 0 R 2876 0 R 2876 0 R 2876 0 R 2868 0 R 2868 0 R 2875 0 R 2868 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2868 0 R 2868 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2868 0 R 2872 0 R 2868 0 R 2871 0 R 2868 0 R 2870 0 R 2868 0 R 2869 0 R 2868 0 R 2868 0 R 2868 0 R 2868 0 R 2867 0 R 2867 0 R 2854 0 R 2866 0 R 2854 0 R 2865 0 R 2854 0 R 2864 0 R 2854 0 R 2863 0 R 2854 0 R 2862 0 R 2854 0 R 2861 0 R 2854 0 R 2860 0 R 2854 0 R 2854 0 R 2859 0 R 2854 0 R 2858 0 R 2854 0 R 2857 0 R 2854 0 R 2856 0 R 2854 0 R 2855 0 R 2854 0 R] -endobj - -73 0 obj -[2850 0 R 2853 0 R 2850 0 R 2850 0 R 2852 0 R 2852 0 R 2852 0 R 2852 0 R 2852 0 R 2852 0 R 2850 0 R 2851 0 R 2850 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2845 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2845 0 R 2847 0 R 2845 0 R 2846 0 R 2846 0 R 2845 0 R 2840 0 R 2844 0 R 2844 0 R 2840 0 R 2843 0 R 2843 0 R 2840 0 R 2840 0 R 2842 0 R 2842 0 R 2840 0 R 2841 0 R 2841 0 R 2840 0 R 2840 0 R 2840 0 R 2834 0 R 2839 0 R 2834 0 R 2838 0 R 2834 0 R 2834 0 R 2834 0 R 2837 0 R 2834 0 R 2836 0 R 2834 0 R 2835 0 R 2834 0 R 2831 0 R 2830 0 R 2829 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2827 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2825 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2823 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2821 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2819 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2833 0 R 2814 0 R 2814 0 R 2811 0 R 2811 0 R 2811 0 R 2813 0 R 2813 0 R 2813 0 R 2813 0 R 2811 0 R 2811 0 R 2812 0 R 2811 0 R 2811 0 R 2811 0 R 2803 0 R 2810 0 R 2803 0 R 2809 0 R 2803 0 R 2803 0 R 2808 0 R 2803 0 R 2803 0 R 2803 0 R 2807 0 R 2803 0 R 2806 0 R 2803 0 R 2803 0 R 2803 0 R 2805 0 R 2803 0 R 2803 0 R 2804 0 R 2803 0 R] -endobj - -74 0 obj -[2800 0 R 2799 0 R 2798 0 R 2797 0 R 2802 0 R 2793 0 R 2792 0 R 2784 0 R 2791 0 R 2784 0 R 2790 0 R 2784 0 R 2789 0 R 2784 0 R 2784 0 R 2788 0 R 2784 0 R 2787 0 R 2784 0 R 2786 0 R 2784 0 R 2784 0 R 2785 0 R 2784 0 R 2782 0 R 2775 0 R 2781 0 R 2775 0 R 2780 0 R 2775 0 R 2779 0 R 2775 0 R 2775 0 R 2775 0 R 2778 0 R 2775 0 R 2777 0 R 2775 0 R 2775 0 R 2776 0 R 2775 0 R 2773 0 R 2772 0 R 2772 0 R 2769 0 R 2769 0 R 2769 0 R 2769 0 R 2768 0 R 2768 0 R 2765 0 R 2767 0 R 2765 0 R 2766 0 R 2765 0 R 2765 0 R 2765 0 R 2765 0 R 2764 0 R 2764 0 R 2759 0 R 2763 0 R 2759 0 R 2762 0 R 2762 0 R 2759 0 R 2761 0 R 2759 0 R 2759 0 R 2759 0 R 2760 0 R 2759 0 R 2758 0 R 2758 0 R 2758 0 R 2756 0 R 2757 0 R 2757 0 R 2756 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2754 0 R 2753 0 R 2752 0 R 2751 0 R 2749 0 R 2748 0 R 2748 0 R 2748 0 R 2747 0 R 2745 0 R 2744 0 R 2743 0 R 2729 0 R 2739 0 R 2729 0 R 2738 0 R 2738 0 R 2729 0 R 2737 0 R 2729 0 R 2729 0 R 2736 0 R 2729 0 R 2729 0 R 2729 0 R 2735 0 R 2729 0 R 2734 0 R 2729 0 R 2733 0 R 2729 0 R 2729 0 R 2732 0 R 2729 0 R 2731 0 R 2729 0 R 2729 0 R 2729 0 R 2730 0 R 2729 0 R] -endobj - -75 0 obj -[2729 0 R 2729 0 R 2728 0 R 2725 0 R 2727 0 R 2727 0 R 2725 0 R 2725 0 R 2725 0 R 2726 0 R 2725 0 R 2725 0 R 2725 0 R 2724 0 R 2723 0 R 2721 0 R 2720 0 R 2720 0 R 2718 0 R 2717 0 R 2717 0 R 2717 0 R 2717 0 R 2714 0 R 2710 0 R 2713 0 R 2713 0 R 2710 0 R 2712 0 R 2710 0 R 2710 0 R 2711 0 R 2710 0 R 2710 0 R 2709 0 R 2709 0 R 2709 0 R 2706 0 R 2708 0 R 2708 0 R 2708 0 R 2708 0 R 2708 0 R 2706 0 R 2707 0 R 2706 0 R 2705 0 R 2704 0 R 2703 0 R 2703 0 R 2701 0 R 2700 0 R 2698 0 R 2698 0 R 2699 0 R 2699 0 R 2698 0 R 2693 0 R 2693 0 R 2694 0 R 2693 0 R 2692 0 R 2692 0 R 2691 0 R 2691 0 R 2690 0 R 2686 0 R 2686 0 R 2686 0 R 2689 0 R 2686 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2686 0 R 2686 0 R 2687 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2685 0 R 2681 0 R 2681 0 R 2681 0 R 2681 0 R 2684 0 R 2681 0 R 2681 0 R 2681 0 R 2681 0 R 2681 0 R 2683 0 R 2681 0 R 2681 0 R 2681 0 R 2682 0 R 2681 0 R] -endobj - -76 0 obj -[2681 0 R 2681 0 R 2680 0 R 2680 0 R 2680 0 R 2680 0 R 2677 0 R 2677 0 R 2677 0 R 2677 0 R 2677 0 R 2679 0 R 2677 0 R 2677 0 R 2677 0 R 2678 0 R 2677 0 R 2677 0 R 2677 0 R 2677 0 R 2676 0 R 2676 0 R 2666 0 R 2675 0 R 2666 0 R 2674 0 R 2666 0 R 2666 0 R 2673 0 R 2666 0 R 2666 0 R 2666 0 R 2666 0 R 2666 0 R 2672 0 R 2666 0 R 2671 0 R 2666 0 R 2666 0 R 2670 0 R 2666 0 R 2669 0 R 2666 0 R 2666 0 R 2666 0 R 2668 0 R 2666 0 R 2667 0 R 2666 0 R 2666 0 R 2665 0 R 2665 0 R 2664 0 R 2661 0 R 2661 0 R 2661 0 R 2663 0 R 2661 0 R 2661 0 R 2662 0 R 2661 0 R 2661 0 R 2643 0 R 2660 0 R 2643 0 R 2643 0 R 2659 0 R 2643 0 R 2643 0 R 2643 0 R 2658 0 R 2643 0 R 2657 0 R 2643 0 R 2656 0 R 2643 0 R 2655 0 R 2643 0 R 2643 0 R 2654 0 R 2643 0 R 2653 0 R 2643 0 R 2643 0 R 2652 0 R 2643 0 R 2643 0 R 2643 0 R 2651 0 R 2643 0 R 2650 0 R 2643 0 R 2649 0 R 2643 0 R 2643 0 R 2648 0 R 2648 0 R 2648 0 R 2648 0 R 2648 0 R 2643 0 R 2647 0 R 2643 0 R 2646 0 R 2643 0 R 2645 0 R 2643 0 R 2644 0 R 2643 0 R 2643 0 R] -endobj - -77 0 obj -[2637 0 R 2636 0 R 2634 0 R 2632 0 R 2624 0 R 2624 0 R 2622 0 R 2621 0 R 2619 0 R 2619 0 R 2617 0 R 2618 0 R 2618 0 R 2618 0 R 2616 0 R 2614 0 R 2614 0 R 2614 0 R 2614 0 R 2614 0 R 2612 0 R 2609 0 R 2606 0 R 2608 0 R 2608 0 R 2606 0 R 2607 0 R 2607 0 R 2605 0 R 2602 0 R 2604 0 R 2602 0 R 2603 0 R 2600 0 R 2600 0 R 2600 0 R 2600 0 R 2598 0 R 2599 0 R 2599 0 R 2599 0 R 2599 0 R 2599 0 R 2599 0 R 2597 0 R 2595 0 R 2596 0 R 2593 0 R 2593 0 R 2593 0 R 2593 0 R 2593 0 R 2593 0 R 2591 0 R 2588 0 R 2588 0 R 2588 0 R 2588 0 R 2588 0 R 2588 0 R 2586 0 R 2583 0 R 2583 0 R 2581 0 R 2580 0 R 2578 0 R 2578 0 R 2578 0 R 2578 0 R 2576 0 R 2573 0 R 2573 0 R 2573 0 R 2573 0 R 2571 0 R 2568 0 R 2568 0 R 2568 0 R 2568 0 R 2568 0 R 2566 0 R 2563 0 R 2561 0 R 2560 0 R 2642 0 R 2548 0 R 2552 0 R 2548 0 R 2548 0 R 2551 0 R 2548 0 R 2548 0 R 2550 0 R 2548 0 R 2549 0 R 2548 0 R 2547 0 R 2547 0 R 2536 0 R 2546 0 R 2536 0 R 2536 0 R 2545 0 R 2536 0 R 2536 0 R 2544 0 R 2536 0 R 2536 0 R 2536 0 R 2543 0 R 2536 0 R 2542 0 R 2542 0 R 2542 0 R 2536 0 R 2541 0 R 2536 0 R 2536 0 R 2540 0 R 2540 0 R 2540 0 R 2536 0 R 2539 0 R 2539 0 R 2539 0 R 2539 0 R 2536 0 R 2536 0 R 2538 0 R 2538 0 R 2536 0 R 2537 0 R 2537 0 R 2537 0 R 2536 0 R 2536 0 R 2536 0 R 2535 0 R 2529 0 R 2534 0 R 2529 0 R 2533 0 R 2533 0 R 2533 0 R 2529 0 R 2532 0 R 2529 0 R 2531 0 R 2529 0 R 2530 0 R 2529 0 R 2528 0 R 2527 0 R 2525 0 R 2523 0 R 2522 0 R 2520 0 R 2516 0 R 2515 0 R 2514 0 R 2512 0 R 2509 0 R 2508 0 R 2507 0 R 2505 0 R 2502 0 R 2501 0 R 2499 0 R 2494 0 R 2493 0 R 2491 0 R 2492 0 R 2491 0 R 2489 0 R 2485 0 R 2483 0 R 2484 0 R 2483 0 R 2482 0 R 2481 0 R 2479 0 R 2475 0 R 2472 0 R 2474 0 R 2472 0 R 2473 0 R 2470 0 R 2467 0 R 2466 0 R 2464 0 R 2462 0 R 2461 0 R 2459 0 R 2455 0 R 2454 0 R 2453 0 R] -endobj - -78 0 obj -[2451 0 R 2448 0 R 2447 0 R 2446 0 R 2445 0 R 2444 0 R 2442 0 R 2439 0 R 2438 0 R 2436 0 R 2431 0 R 2428 0 R 2430 0 R 2428 0 R 2429 0 R 2426 0 R 2422 0 R 2421 0 R 2420 0 R 2418 0 R 2414 0 R 2413 0 R 2411 0 R 2412 0 R 2411 0 R 2409 0 R 2405 0 R 2403 0 R 2400 0 R 2399 0 R 2398 0 R 2396 0 R 2393 0 R 2392 0 R 2378 0 R 2387 0 R 2378 0 R 2386 0 R 2386 0 R 2386 0 R 2378 0 R 2385 0 R 2378 0 R 2378 0 R 2378 0 R 2384 0 R 2378 0 R 2378 0 R 2383 0 R 2378 0 R 2382 0 R 2381 0 R 2381 0 R 2381 0 R 2381 0 R 2378 0 R 2378 0 R 2380 0 R 2378 0 R 2379 0 R 2378 0 R 2377 0 R 2364 0 R 2376 0 R 2364 0 R 2364 0 R 2375 0 R 2364 0 R 2374 0 R 2364 0 R 2373 0 R 2364 0 R 2372 0 R 2364 0 R 2371 0 R 2364 0 R 2364 0 R 2370 0 R 2364 0 R 2364 0 R 2369 0 R 2364 0 R 2364 0 R 2368 0 R 2368 0 R 2368 0 R 2364 0 R 2367 0 R 2364 0 R 2364 0 R 2366 0 R 2364 0 R 2365 0 R 2364 0 R 2363 0 R 2363 0 R 2361 0 R 2362 0 R 2361 0 R 2361 0 R 2360 0 R 2359 0 R 2357 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2357 0 R 2355 0 R 2354 0 R 2352 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2352 0 R 2350 0 R 2349 0 R 2347 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2347 0 R 2333 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2333 0 R 2343 0 R 2333 0 R 2333 0 R 2342 0 R 2333 0 R 2341 0 R 2341 0 R 2341 0 R 2341 0 R 2333 0 R 2340 0 R 2333 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2333 0 R 2338 0 R 2333 0 R 2337 0 R 2333 0 R 2336 0 R 2333 0 R 2333 0 R 2335 0 R 2333 0 R 2333 0 R 2334 0 R 2334 0 R 2333 0 R 2332 0 R 2322 0 R 2331 0 R 2331 0 R 2331 0 R 2331 0 R 2331 0 R 2331 0 R 2322 0 R 2330 0 R 2330 0 R 2322 0 R 2329 0 R 2322 0 R 2322 0 R 2328 0 R 2322 0 R 2327 0 R 2322 0 R 2326 0 R 2322 0 R 2325 0 R 2325 0 R 2325 0 R 2325 0 R 2325 0 R 2325 0 R 2322 0 R 2322 0 R 2324 0 R 2324 0 R 2324 0 R 2324 0 R 2322 0 R 2322 0 R 2323 0 R 2322 0 R 2321 0 R 2320 0 R 2318 0 R 2316 0 R 2315 0 R 2313 0 R 2309 0 R 2308 0 R 2307 0 R 2306 0 R 2305 0 R 2305 0 R 2304 0 R 2304 0 R 2304 0 R 2304 0 R 2302 0 R 2299 0 R 2298 0 R 2297 0 R 2296 0 R 2296 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R] -endobj - -79 0 obj -[2293 0 R 2291 0 R 2290 0 R 2288 0 R 2284 0 R 2283 0 R 2281 0 R 2276 0 R 2275 0 R 2274 0 R 2273 0 R 2272 0 R 2272 0 R 2271 0 R 2271 0 R 2271 0 R 2271 0 R 2269 0 R 2265 0 R 2264 0 R 2263 0 R 2262 0 R 2261 0 R 2261 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2258 0 R 2254 0 R 2252 0 R 2248 0 R 2246 0 R 2247 0 R 2246 0 R 2244 0 R 2238 0 R 2237 0 R 2236 0 R 2235 0 R 2235 0 R 2234 0 R 2234 0 R 2234 0 R 2234 0 R 2234 0 R 2234 0 R 2232 0 R 2227 0 R 2225 0 R 2222 0 R 2221 0 R 2216 0 R 2208 0 R 2208 0 R 2215 0 R 2208 0 R 2208 0 R 2214 0 R 2208 0 R 2213 0 R 2208 0 R 2208 0 R 2212 0 R 2208 0 R 2211 0 R 2211 0 R 2211 0 R 2208 0 R 2210 0 R 2208 0 R 2208 0 R 2209 0 R 2208 0 R 2207 0 R 2206 0 R 2204 0 R 2202 0 R 2201 0 R 2199 0 R 2195 0 R 2192 0 R 2194 0 R 2192 0 R 2193 0 R 2190 0 R 2185 0 R 2182 0 R 2184 0 R 2182 0 R 2183 0 R 2180 0 R 2174 0 R 2173 0 R 2172 0 R 2170 0 R 2171 0 R 2170 0 R 2169 0 R 2168 0 R 2167 0 R 2166 0 R 2165 0 R 2163 0 R 2164 0 R 2161 0 R 2154 0 R 2152 0 R 2146 0 R 2141 0 R 2128 0 R 2128 0 R 2140 0 R 2128 0 R 2128 0 R 2139 0 R 2128 0 R 2138 0 R 2128 0 R 2137 0 R 2128 0 R 2128 0 R 2136 0 R 2128 0 R 2135 0 R 2128 0 R 2128 0 R 2134 0 R 2128 0 R 2128 0 R 2133 0 R 2128 0 R 2132 0 R 2128 0 R 2131 0 R 2128 0 R 2130 0 R 2128 0 R 2128 0 R 2129 0 R 2128 0 R 2128 0 R 2127 0 R 2127 0 R 2117 0 R 2126 0 R 2117 0 R 2125 0 R 2117 0 R 2124 0 R 2117 0 R 2123 0 R 2117 0 R 2117 0 R 2122 0 R 2117 0 R 2121 0 R 2117 0 R 2117 0 R 2120 0 R 2120 0 R 2117 0 R 2119 0 R 2117 0 R 2118 0 R 2117 0 R 2117 0 R 2116 0 R 2099 0 R 2115 0 R 2099 0 R 2114 0 R 2099 0 R 2113 0 R 2099 0 R 2112 0 R 2099 0 R 2099 0 R 2111 0 R 2099 0 R 2110 0 R 2099 0 R 2109 0 R 2099 0 R 2108 0 R 2099 0 R 2099 0 R 2107 0 R 2099 0 R 2106 0 R 2099 0 R 2105 0 R 2099 0 R 2099 0 R 2104 0 R 2099 0 R 2103 0 R 2099 0 R] -endobj - -80 0 obj -[2099 0 R 2102 0 R 2099 0 R 2101 0 R 2099 0 R 2099 0 R 2100 0 R 2099 0 R 2098 0 R 2097 0 R 2095 0 R 2093 0 R 2092 0 R 2089 0 R 2085 0 R 2084 0 R 2082 0 R 2077 0 R 2075 0 R 2071 0 R 2069 0 R 2070 0 R 2069 0 R 2067 0 R 2061 0 R 2060 0 R 2059 0 R 2058 0 R 2056 0 R 2051 0 R 2049 0 R 2046 0 R 2045 0 R 2044 0 R 2042 0 R 2039 0 R 2038 0 R 2037 0 R 2036 0 R 2035 0 R 2032 0 R 2029 0 R 2028 0 R 2027 0 R 2026 0 R 2025 0 R 2023 0 R 2020 0 R 2018 0 R 2015 0 R 2014 0 R 2009 0 R 1985 0 R 2008 0 R 1985 0 R 2007 0 R 1985 0 R 2006 0 R 1985 0 R 1985 0 R 1985 0 R 2005 0 R 1985 0 R 1985 0 R 2004 0 R 1985 0 R 2003 0 R 1985 0 R 2002 0 R 1985 0 R 1993 0 R 1985 0 R 1985 0 R 1992 0 R 1985 0 R 1985 0 R 1991 0 R 1985 0 R 1985 0 R 1990 0 R 1985 0 R 1989 0 R 1985 0 R 1988 0 R 1985 0 R 1985 0 R 1987 0 R 1985 0 R 1986 0 R 1985 0 R 1985 0 R 1984 0 R 1983 0 R 1981 0 R 1979 0 R 1978 0 R 1976 0 R 1972 0 R 1971 0 R 1970 0 R 1969 0 R 1969 0 R 1969 0 R 1969 0 R 1969 0 R 1967 0 R 1964 0 R 1963 0 R 1962 0 R 1959 0 R 1961 0 R 1959 0 R 1960 0 R 1957 0 R 1954 0 R 1953 0 R 1952 0 R 1950 0 R 1947 0 R 1944 0 R 1946 0 R 1944 0 R 1945 0 R 1942 0 R 1939 0 R 1938 0 R 1937 0 R 1936 0 R 1935 0 R 1933 0 R 1934 0 R 1931 0 R 1926 0 R 1925 0 R 1924 0 R 1922 0 R 1919 0 R 1917 0 R 1912 0 R 1911 0 R 1910 0 R 1908 0 R 1906 0 R 1905 0 R 1903 0 R 1898 0 R 1899 0 R 1898 0 R 1897 0 R 1896 0 R 1894 0 R 1891 0 R 1890 0 R 1888 0 R 1889 0 R 1888 0 R 1887 0 R 1886 0 R 1885 0 R 1883 0 R 1884 0 R 1883 0 R 1881 0 R 1878 0 R 1877 0 R 1876 0 R 1874 0 R 1871 0 R 1870 0 R 1869 0 R 1866 0 R 1868 0 R 1866 0 R 1867 0 R 1864 0 R 1859 0 R 1858 0 R 1857 0 R 1999 0 R 1996 0 R 1994 0 R 1995 0 R 1994 0 R 1994 0 R 1994 0 R 1994 0 R] -endobj - -81 0 obj -[1855 0 R 1852 0 R 1850 0 R 1845 0 R 1844 0 R 1843 0 R 1841 0 R 1839 0 R 1838 0 R 1836 0 R 1832 0 R 1831 0 R 1829 0 R 1826 0 R 1825 0 R 1824 0 R 1822 0 R 1819 0 R 1818 0 R 1817 0 R 1816 0 R 1815 0 R 1813 0 R 1814 0 R 1811 0 R 1806 0 R 1805 0 R 1804 0 R 1802 0 R 1799 0 R 1797 0 R 1792 0 R 1791 0 R 1790 0 R 1782 0 R 1782 0 R 1785 0 R 1782 0 R 1784 0 R 1782 0 R 1783 0 R 1782 0 R 1782 0 R 1775 0 R 1781 0 R 1775 0 R 1780 0 R 1775 0 R 1779 0 R 1775 0 R 1778 0 R 1775 0 R 1775 0 R 1777 0 R 1775 0 R 1775 0 R 1775 0 R 1776 0 R 1775 0 R 1774 0 R 1774 0 R 1762 0 R 1773 0 R 1762 0 R 1772 0 R 1762 0 R 1771 0 R 1762 0 R 1770 0 R 1762 0 R 1762 0 R 1769 0 R 1762 0 R 1762 0 R 1768 0 R 1762 0 R 1762 0 R 1767 0 R 1762 0 R 1762 0 R 1766 0 R 1762 0 R 1765 0 R 1762 0 R 1762 0 R 1764 0 R 1762 0 R 1763 0 R 1762 0 R 1761 0 R 1760 0 R 1758 0 R 1756 0 R 1755 0 R 1753 0 R 1749 0 R 1748 0 R 1747 0 R 1745 0 R 1742 0 R 1740 0 R 1735 0 R 1734 0 R 1733 0 R 1730 0 R 1732 0 R 1730 0 R 1731 0 R 1730 0 R 1728 0 R 1724 0 R 1723 0 R 1722 0 R 1719 0 R 1721 0 R 1719 0 R 1720 0 R 1719 0 R 1718 0 R 1716 0 R 1712 0 R 1711 0 R 1710 0 R 1705 0 R 1694 0 R 1694 0 R 1704 0 R 1694 0 R 1703 0 R 1694 0 R 1702 0 R 1694 0 R 1701 0 R 1694 0 R 1694 0 R 1694 0 R 1700 0 R 1694 0 R 1699 0 R 1694 0 R 1694 0 R 1698 0 R 1694 0 R 1694 0 R 1697 0 R 1694 0 R 1694 0 R 1696 0 R 1694 0 R 1694 0 R 1695 0 R 1694 0 R 1688 0 R 1693 0 R 1688 0 R 1688 0 R 1692 0 R 1688 0 R] -endobj - -82 0 obj -[1688 0 R 1691 0 R 1688 0 R 1690 0 R 1688 0 R 1689 0 R 1688 0 R 1688 0 R 1688 0 R 1687 0 R 1687 0 R 1680 0 R 1686 0 R 1680 0 R 1680 0 R 1680 0 R 1685 0 R 1680 0 R 1684 0 R 1680 0 R 1683 0 R 1680 0 R 1682 0 R 1682 0 R 1680 0 R 1680 0 R 1681 0 R 1680 0 R 1680 0 R 1680 0 R 1680 0 R 1680 0 R 1679 0 R 1679 0 R 1676 0 R 1676 0 R 1678 0 R 1676 0 R 1677 0 R 1676 0 R 1676 0 R 1676 0 R 1675 0 R 1675 0 R 1675 0 R 1673 0 R 1674 0 R 1673 0 R 1672 0 R 1671 0 R 1670 0 R 1668 0 R 1667 0 R 1666 0 R 1664 0 R 1663 0 R 1662 0 R 1660 0 R 1659 0 R 1658 0 R 1656 0 R 1655 0 R 1653 0 R 1654 0 R 1653 0 R 1651 0 R 1650 0 R 1649 0 R 1646 0 R 1646 0 R 1641 0 R 1644 0 R 1641 0 R 1641 0 R 1641 0 R 1641 0 R 1643 0 R 1641 0 R 1641 0 R 1642 0 R 1641 0 R 1641 0 R 1640 0 R 1640 0 R 1640 0 R 1639 0 R 1638 0 R 1636 0 R 1637 0 R 1636 0 R 1634 0 R 1633 0 R 1632 0 R 1632 0 R 1630 0 R 1629 0 R 1628 0 R 1628 0 R 1626 0 R 1625 0 R 1621 0 R 1621 0 R 1621 0 R 1624 0 R 1621 0 R 1623 0 R 1621 0 R] -endobj - -83 0 obj -[1621 0 R 1622 0 R 1621 0 R 1621 0 R 1621 0 R 1619 0 R 1618 0 R 1617 0 R 1613 0 R 1614 0 R 1613 0 R 1613 0 R 1613 0 R 1612 0 R 1612 0 R 1608 0 R 1611 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1610 0 R 1608 0 R 1608 0 R 1608 0 R 1609 0 R 1608 0 R 1608 0 R 1605 0 R 1607 0 R 1605 0 R 1606 0 R 1605 0 R 1604 0 R 1597 0 R 1603 0 R 1597 0 R 1597 0 R 1602 0 R 1597 0 R 1597 0 R 1601 0 R 1597 0 R 1597 0 R 1600 0 R 1597 0 R 1599 0 R 1597 0 R 1598 0 R 1597 0 R 1596 0 R 1595 0 R 1593 0 R 1591 0 R 1590 0 R 1588 0 R 1584 0 R 1583 0 R 1582 0 R 1580 0 R 1577 0 R 1576 0 R 1575 0 R 1573 0 R 1570 0 R 1569 0 R 1568 0 R 1567 0 R 1565 0 R 1562 0 R 1559 0 R 1561 0 R 1559 0 R 1560 0 R 1557 0 R 1552 0 R 1551 0 R 1550 0 R 1549 0 R 1548 0 R 1547 0 R 1546 0 R 1545 0 R 1544 0 R 1542 0 R 1539 0 R 1537 0 R 1532 0 R 1531 0 R 1530 0 R 1528 0 R 1524 0 R 1521 0 R 1523 0 R 1521 0 R 1522 0 R 1519 0 R 1513 0 R 1512 0 R 1511 0 R 1510 0 R 1509 0 R 1508 0 R 1507 0 R 1505 0 R 1506 0 R 1503 0 R 1496 0 R 1495 0 R 1494 0 R 1493 0 R 1492 0 R 1490 0 R 1484 0 R 1483 0 R 1482 0 R 1481 0 R 1480 0 R 1478 0 R 1472 0 R 1471 0 R 1470 0 R 1468 0 R 1463 0 R 1462 0 R 1461 0 R 1459 0 R 1460 0 R 1457 0 R 1450 0 R 1449 0 R 1448 0 R 1447 0 R 1446 0 R 1444 0 R 1438 0 R 1437 0 R 1436 0 R 1435 0 R 1434 0 R 1432 0 R 1426 0 R 1425 0 R 1424 0 R 1422 0 R 1417 0 R 1415 0 R 1408 0 R 1407 0 R 1406 0 R 1405 0 R 1404 0 R 1403 0 R 1402 0 R 1401 0 R 1400 0 R 1398 0 R 1395 0 R 1394 0 R 1392 0 R 1389 0 R 1388 0 R 1387 0 R 1386 0 R 1385 0 R] -endobj - -84 0 obj -[1383 0 R 1380 0 R 1379 0 R 1374 0 R 1374 0 R 1374 0 R 1373 0 R 1367 0 R 1372 0 R 1367 0 R 1371 0 R 1367 0 R 1367 0 R 1370 0 R 1367 0 R 1367 0 R 1369 0 R 1367 0 R 1367 0 R 1368 0 R 1367 0 R 1366 0 R 1365 0 R 1363 0 R 1361 0 R 1360 0 R 1358 0 R 1354 0 R 1353 0 R 1352 0 R 1351 0 R 1349 0 R 1346 0 R 1345 0 R 1343 0 R 1338 0 R 1337 0 R 1336 0 R 1334 0 R 1335 0 R 1334 0 R 1333 0 R 1330 0 R 1332 0 R 1330 0 R 1331 0 R 1328 0 R 1324 0 R 1323 0 R 1322 0 R 1321 0 R 1320 0 R 1318 0 R 1314 0 R 1311 0 R 1313 0 R 1311 0 R 1312 0 R 1311 0 R 1309 0 R 1306 0 R 1304 0 R 1301 0 R 1300 0 R 1298 0 R 1296 0 R 1295 0 R 1293 0 R 1289 0 R 1288 0 R 1287 0 R 1286 0 R 1284 0 R 1281 0 R 1278 0 R 1280 0 R 1278 0 R 1279 0 R 1276 0 R 1271 0 R 1270 0 R 1269 0 R 1267 0 R 1263 0 R 1262 0 R 1261 0 R 1260 0 R 1259 0 R 1258 0 R 1257 0 R 1255 0 R 1256 0 R 1253 0 R 1247 0 R 1246 0 R 1245 0 R 1244 0 R 1243 0 R 1241 0 R 1236 0 R 1235 0 R 1234 0 R 1233 0 R 1232 0 R 1230 0 R 1227 0 R 1226 0 R 1219 0 R 1221 0 R 1219 0 R 1220 0 R 1219 0 R 1218 0 R 1209 0 R 1209 0 R 1217 0 R 1209 0 R 1209 0 R 1210 0 R 1209 0 R 1208 0 R 1207 0 R 1205 0 R 1203 0 R 1202 0 R 1200 0 R 1196 0 R 1195 0 R 1194 0 R 1192 0 R 1189 0 R 1187 0 R 1182 0 R 1179 0 R 1181 0 R 1179 0 R 1180 0 R 1177 0 R 1171 0 R 1169 0 R 1164 0 R 1163 0 R 1162 0 R 1160 0 R 1157 0 R 1156 0 R 1154 0 R 1149 0 R 1214 0 R 1211 0 R 1211 0 R] -endobj - -85 0 obj -[1147 0 R 1143 0 R 1140 0 R 1142 0 R 1140 0 R 1141 0 R 1138 0 R 1132 0 R 1130 0 R 1125 0 R 1124 0 R 1123 0 R 1121 0 R 1117 0 R 1116 0 R 1110 0 R 1110 0 R 1110 0 R 1111 0 R 1110 0 R 1110 0 R 1109 0 R 1109 0 R 1092 0 R 1108 0 R 1092 0 R 1092 0 R 1101 0 R 1092 0 R 1092 0 R 1092 0 R 1092 0 R 1091 0 R 1088 0 R 1088 0 R 1090 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1089 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1087 0 R 1083 0 R 1086 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1085 0 R 1083 0 R 1083 0 R 1083 0 R 1084 0 R 1083 0 R 1083 0 R 1082 0 R 1079 0 R 1081 0 R 1079 0 R 1079 0 R 1079 0 R 1079 0 R 1105 0 R 1102 0 R 1102 0 R 1098 0 R 1093 0 R 1095 0 R 1093 0 R 1094 0 R 1093 0 R] -endobj - -86 0 obj -[1079 0 R 1079 0 R 1080 0 R 1079 0 R 1079 0 R 1079 0 R 1079 0 R 1079 0 R 1078 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1076 0 R 1076 0 R 1075 0 R 1075 0 R 1075 0 R 1075 0 R 1075 0 R 1074 0 R 1074 0 R 1065 0 R 1065 0 R 1073 0 R 1065 0 R 1065 0 R 1072 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1071 0 R 1065 0 R 1070 0 R 1065 0 R 1069 0 R 1065 0 R 1065 0 R 1068 0 R 1065 0 R 1065 0 R 1067 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1066 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1064 0 R 1064 0 R 1063 0 R 1062 0 R 1062 0 R 1062 0 R 1062 0 R 1062 0 R 1062 0 R 1061 0 R 1057 0 R 1057 0 R 1057 0 R 1060 0 R 1057 0 R 1059 0 R 1057 0 R 1057 0 R] -endobj - -87 0 obj -[1057 0 R 1058 0 R 1057 0 R 1057 0 R 1057 0 R 1057 0 R 1057 0 R 1056 0 R 1054 0 R 1054 0 R 1055 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1053 0 R 1053 0 R 1052 0 R 1052 0 R 1052 0 R 1052 0 R 1052 0 R 1051 0 R 1046 0 R 1050 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1049 0 R 1046 0 R 1048 0 R 1046 0 R 1046 0 R 1046 0 R 1047 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1044 0 R 1044 0 R 1045 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1043 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1042 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1041 0 R 1039 0 R 1039 0 R 1039 0 R] -endobj - -88 0 obj -[1039 0 R 1040 0 R 1039 0 R 1039 0 R 1039 0 R 1038 0 R 1038 0 R 1037 0 R 1037 0 R 1037 0 R 1037 0 R 1036 0 R 1034 0 R 1035 0 R 1034 0 R 1034 0 R 1034 0 R 1034 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1033 0 R 1020 0 R 1020 0 R 1025 0 R 1020 0 R 1024 0 R 1020 0 R 1020 0 R 1023 0 R 1020 0 R 1022 0 R 1020 0 R 1020 0 R 1021 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1019 0 R 1015 0 R 1015 0 R 1015 0 R 1015 0 R 1018 0 R 1015 0 R 1015 0 R 1015 0 R 1017 0 R 1015 0 R 1016 0 R 1015 0 R 1007 0 R 1007 0 R 1007 0 R 1014 0 R 1007 0 R 1007 0 R 1013 0 R 1007 0 R 1007 0 R 1007 0 R 1007 0 R 1012 0 R 1007 0 R 1007 0 R 1007 0 R 1011 0 R 1007 0 R 1010 0 R 1007 0 R 1007 0 R 1009 0 R 1007 0 R 1007 0 R 1007 0 R 1008 0 R 1007 0 R 1007 0 R 1007 0 R 1000 0 R 1000 0 R 1000 0 R 1000 0 R 1006 0 R 1000 0 R 1000 0 R 1005 0 R 1000 0 R 1000 0 R 1000 0 R 1004 0 R 1000 0 R 1000 0 R 1003 0 R 1000 0 R 1000 0 R 1000 0 R 1002 0 R 1000 0 R 1001 0 R 1000 0 R 1000 0 R 1000 0 R 997 0 R 997 0 R 997 0 R 999 0 R 997 0 R 997 0 R 1030 0 R 1026 0 R 1027 0 R 1026 0 R 1026 0 R] -endobj - -89 0 obj -[997 0 R 997 0 R 997 0 R 998 0 R 997 0 R 997 0 R 997 0 R 997 0 R 996 0 R 996 0 R 989 0 R 989 0 R 995 0 R 989 0 R 994 0 R 989 0 R 993 0 R 989 0 R 992 0 R 989 0 R 991 0 R 989 0 R 990 0 R 989 0 R 989 0 R 989 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 985 0 R 985 0 R 985 0 R 987 0 R 985 0 R 985 0 R 986 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 983 0 R 983 0 R 979 0 R 979 0 R 982 0 R 979 0 R 981 0 R 979 0 R 980 0 R 980 0 R 979 0 R] -endobj - -90 0 obj -[979 0 R 979 0 R 978 0 R 973 0 R 977 0 R 973 0 R 973 0 R 973 0 R 973 0 R 976 0 R 973 0 R 973 0 R 975 0 R 975 0 R 975 0 R 975 0 R 975 0 R 975 0 R 973 0 R 973 0 R 973 0 R 973 0 R 974 0 R 973 0 R 973 0 R 972 0 R 970 0 R 971 0 R 970 0 R 970 0 R 970 0 R 970 0 R 970 0 R 970 0 R 965 0 R 969 0 R 965 0 R 965 0 R 968 0 R 965 0 R 967 0 R 965 0 R 965 0 R 966 0 R 965 0 R 965 0 R 965 0 R 964 0 R 960 0 R 963 0 R 960 0 R 962 0 R 962 0 R 962 0 R 960 0 R 961 0 R 960 0 R 960 0 R 960 0 R 960 0 R 960 0 R 959 0 R 956 0 R 956 0 R 956 0 R 958 0 R 956 0 R 956 0 R 956 0 R 957 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 955 0 R 949 0 R 949 0 R 949 0 R 954 0 R 954 0 R 954 0 R 954 0 R 954 0 R 954 0 R 949 0 R 949 0 R 949 0 R 949 0 R 953 0 R 949 0 R 949 0 R 949 0 R 949 0 R 949 0 R 949 0 R 949 0 R 952 0 R 949 0 R 949 0 R 949 0 R 951 0 R 949 0 R 949 0 R 949 0 R 949 0 R 950 0 R 949 0 R 949 0 R 948 0 R 948 0 R 948 0 R] -endobj - -91 0 obj -[947 0 R 947 0 R 946 0 R 946 0 R 945 0 R 945 0 R 944 0 R 943 0 R 943 0 R 943 0 R 943 0 R 942 0 R 934 0 R 941 0 R 934 0 R 934 0 R 934 0 R 940 0 R 934 0 R 934 0 R 939 0 R 934 0 R 938 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 937 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 936 0 R 934 0 R 934 0 R 935 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 933 0 R 928 0 R 928 0 R 928 0 R 932 0 R 928 0 R 928 0 R 928 0 R 931 0 R 928 0 R 930 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 929 0 R 928 0 R 927 0 R 921 0 R 921 0 R 926 0 R 921 0 R 921 0 R 925 0 R 925 0 R 921 0 R 921 0 R 921 0 R 921 0 R 921 0 R 921 0 R 924 0 R 921 0 R 923 0 R 921 0 R 921 0 R 921 0 R 922 0 R 921 0 R 921 0 R 921 0 R 921 0 R] -endobj - -92 0 obj -[921 0 R 921 0 R 920 0 R 920 0 R 919 0 R 918 0 R 918 0 R 918 0 R 917 0 R 910 0 R 910 0 R 916 0 R 910 0 R 915 0 R 910 0 R 910 0 R 914 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 913 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 912 0 R 912 0 R 910 0 R 910 0 R 911 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 909 0 R 898 0 R 898 0 R 908 0 R 898 0 R 907 0 R 898 0 R 898 0 R 906 0 R 898 0 R 905 0 R 898 0 R 904 0 R 898 0 R 903 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 902 0 R 902 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 901 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 900 0 R 898 0 R 899 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 897 0 R 897 0 R 896 0 R 896 0 R] -endobj - -93 0 obj -[896 0 R 896 0 R 896 0 R 895 0 R 878 0 R 878 0 R 878 0 R 878 0 R 894 0 R 878 0 R 878 0 R 893 0 R 878 0 R 878 0 R 878 0 R 892 0 R 878 0 R 878 0 R 891 0 R 878 0 R 878 0 R 890 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 889 0 R 878 0 R 878 0 R 878 0 R 878 0 R 888 0 R 878 0 R 878 0 R 878 0 R 887 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 886 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 885 0 R 878 0 R 878 0 R 878 0 R 884 0 R 878 0 R 878 0 R 878 0 R 878 0 R 883 0 R 878 0 R 878 0 R 878 0 R 882 0 R 878 0 R 878 0 R 878 0 R 881 0 R 878 0 R 880 0 R 878 0 R 878 0 R 879 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 877 0 R 867 0 R 867 0 R 867 0 R 867 0 R 876 0 R 867 0 R 867 0 R 867 0 R 867 0 R 875 0 R 867 0 R 867 0 R 867 0 R 874 0 R 867 0 R 867 0 R 873 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 872 0 R 867 0 R 867 0 R 867 0 R 871 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 870 0 R 867 0 R 869 0 R 867 0 R 867 0 R 868 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R] -endobj - -94 0 obj -[866 0 R 856 0 R 856 0 R 856 0 R 865 0 R 856 0 R 864 0 R 856 0 R 856 0 R 856 0 R 856 0 R 863 0 R 856 0 R 856 0 R 856 0 R 856 0 R 856 0 R 862 0 R 856 0 R 861 0 R 856 0 R 856 0 R 856 0 R 856 0 R 860 0 R 856 0 R 856 0 R 856 0 R 856 0 R 859 0 R 856 0 R 856 0 R 856 0 R 858 0 R 856 0 R 856 0 R 856 0 R 857 0 R 856 0 R 856 0 R 856 0 R 856 0 R 856 0 R 856 0 R 855 0 R 855 0 R 854 0 R 854 0 R 854 0 R 854 0 R 853 0 R 847 0 R 847 0 R 847 0 R 852 0 R 847 0 R 847 0 R 847 0 R 851 0 R 847 0 R 847 0 R 847 0 R 847 0 R 850 0 R 847 0 R 849 0 R 847 0 R 847 0 R 847 0 R 847 0 R 847 0 R 847 0 R 848 0 R 847 0 R 847 0 R 847 0 R 846 0 R 836 0 R 836 0 R 836 0 R 845 0 R 836 0 R 844 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 843 0 R 836 0 R 836 0 R 836 0 R 836 0 R 842 0 R 836 0 R 841 0 R 836 0 R 836 0 R 840 0 R 836 0 R 836 0 R 836 0 R 836 0 R 839 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 838 0 R 836 0 R 836 0 R 837 0 R 836 0 R 835 0 R 827 0 R 827 0 R 834 0 R 827 0 R 827 0 R 827 0 R 827 0 R 827 0 R 833 0 R 827 0 R 832 0 R 827 0 R 827 0 R 827 0 R 831 0 R 827 0 R 827 0 R 827 0 R 827 0 R 830 0 R 827 0 R 827 0 R 829 0 R] -endobj - -95 0 obj -[828 0 R 827 0 R 827 0 R 827 0 R 827 0 R 826 0 R 826 0 R 821 0 R 821 0 R 825 0 R 821 0 R 821 0 R 821 0 R 821 0 R 824 0 R 821 0 R 821 0 R 821 0 R 823 0 R 821 0 R 821 0 R 822 0 R 822 0 R 821 0 R 821 0 R 821 0 R 821 0 R 821 0 R 819 0 R 819 0 R 820 0 R 819 0 R 819 0 R 819 0 R 819 0 R 819 0 R 819 0 R 819 0 R 818 0 R 817 0 R 813 0 R 815 0 R 815 0 R 815 0 R 813 0 R 814 0 R 813 0 R 810 0 R 806 0 R 808 0 R 806 0 R 806 0 R 807 0 R 806 0 R 803 0 R 799 0 R 799 0 R 799 0 R 801 0 R 799 0 R 800 0 R 799 0 R 796 0 R 793 0 R 794 0 R 793 0 R 790 0 R 786 0 R 786 0 R 788 0 R 788 0 R 786 0 R 786 0 R 787 0 R 786 0 R 783 0 R 780 0 R 781 0 R 780 0 R 780 0 R] -endobj - -96 0 obj -[777 0 R 774 0 R 774 0 R 774 0 R 775 0 R 771 0 R 768 0 R 768 0 R 768 0 R 769 0 R 769 0 R 765 0 R 760 0 R 763 0 R 760 0 R 762 0 R 762 0 R 762 0 R 760 0 R 761 0 R 760 0 R 757 0 R 752 0 R 755 0 R 752 0 R 754 0 R 752 0 R 752 0 R 753 0 R 752 0 R 749 0 R 746 0 R 746 0 R 747 0 R 746 0 R 743 0 R 738 0 R 741 0 R 738 0 R 738 0 R 740 0 R 740 0 R 738 0 R 739 0 R 738 0 R 735 0 R 732 0 R 732 0 R 733 0 R 732 0 R 732 0 R 729 0 R 727 0 R 727 0 R 724 0 R 720 0 R 722 0 R 720 0 R 720 0 R 721 0 R 720 0 R 717 0 R 714 0 R 715 0 R 715 0 R 714 0 R 714 0 R 711 0 R 707 0 R 707 0 R 709 0 R 709 0 R 707 0 R 707 0 R 708 0 R 707 0 R 704 0 R 700 0 R 700 0 R 702 0 R 702 0 R 700 0 R 700 0 R 700 0 R 701 0 R 700 0 R 697 0 R 693 0 R 695 0 R 693 0 R 693 0 R 694 0 R 693 0 R 690 0 R 687 0 R 688 0 R 687 0 R 684 0 R 680 0 R 682 0 R 682 0 R 680 0 R 680 0 R 680 0 R 681 0 R 680 0 R 677 0 R 674 0 R 675 0 R 674 0 R 674 0 R] -endobj - -97 0 obj -[671 0 R 667 0 R 669 0 R 669 0 R 667 0 R 667 0 R 667 0 R 668 0 R 667 0 R 664 0 R 660 0 R 662 0 R 662 0 R 660 0 R 660 0 R 661 0 R 660 0 R 657 0 R 653 0 R 655 0 R 653 0 R 654 0 R 654 0 R 653 0 R 650 0 R 646 0 R 648 0 R 648 0 R 648 0 R 646 0 R 647 0 R 647 0 R 646 0 R 643 0 R 639 0 R 641 0 R 641 0 R 639 0 R 639 0 R 640 0 R 639 0 R 636 0 R 632 0 R 634 0 R 634 0 R 632 0 R 633 0 R 632 0 R 629 0 R 624 0 R 627 0 R 624 0 R 626 0 R 626 0 R 624 0 R 625 0 R 624 0 R 621 0 R 617 0 R 617 0 R 619 0 R 619 0 R 617 0 R 617 0 R 618 0 R 617 0 R 614 0 R 610 0 R 612 0 R 612 0 R 612 0 R 610 0 R 611 0 R 610 0 R 607 0 R 603 0 R 603 0 R 605 0 R 605 0 R 603 0 R 604 0 R 603 0 R 600 0 R 596 0 R 596 0 R 598 0 R 596 0 R 597 0 R 596 0 R 593 0 R 589 0 R 591 0 R 591 0 R 589 0 R 589 0 R 590 0 R 589 0 R 586 0 R 582 0 R 584 0 R 582 0 R 582 0 R 583 0 R 582 0 R 579 0 R 575 0 R 577 0 R 577 0 R 575 0 R 576 0 R 575 0 R] -endobj - -98 0 obj -[572 0 R 568 0 R 570 0 R 570 0 R 568 0 R 569 0 R 568 0 R 565 0 R 562 0 R 563 0 R 563 0 R 563 0 R 562 0 R 559 0 R 556 0 R 556 0 R 556 0 R 557 0 R 553 0 R 549 0 R 549 0 R 551 0 R 551 0 R 549 0 R 549 0 R 550 0 R 549 0 R 546 0 R 543 0 R 544 0 R 544 0 R 544 0 R 543 0 R 543 0 R 540 0 R 537 0 R 538 0 R 538 0 R 534 0 R 531 0 R 532 0 R 528 0 R 525 0 R 526 0 R 525 0 R 522 0 R 518 0 R 518 0 R 518 0 R 520 0 R 518 0 R 518 0 R 519 0 R 518 0 R 515 0 R 511 0 R 511 0 R 513 0 R 513 0 R 511 0 R 512 0 R 511 0 R 508 0 R 504 0 R 504 0 R 506 0 R 506 0 R 504 0 R 505 0 R 504 0 R 501 0 R 498 0 R 498 0 R 499 0 R 498 0 R 495 0 R 492 0 R 493 0 R 493 0 R 492 0 R 489 0 R 486 0 R 486 0 R 486 0 R 487 0 R 486 0 R 483 0 R 479 0 R 479 0 R 481 0 R 479 0 R 479 0 R 480 0 R 479 0 R 476 0 R 473 0 R 473 0 R 474 0 R 474 0 R 473 0 R] -endobj - -99 0 obj -[470 0 R 466 0 R 468 0 R 468 0 R 466 0 R 467 0 R 466 0 R 463 0 R 459 0 R 461 0 R 461 0 R 459 0 R 460 0 R 459 0 R 456 0 R 453 0 R 454 0 R 454 0 R 453 0 R 450 0 R 446 0 R 448 0 R 448 0 R 446 0 R 447 0 R 446 0 R 443 0 R 440 0 R 441 0 R 441 0 R 437 0 R 433 0 R 433 0 R 435 0 R 433 0 R 433 0 R 434 0 R 433 0 R 430 0 R 427 0 R 428 0 R 428 0 R 424 0 R 420 0 R 422 0 R 422 0 R 420 0 R 420 0 R 421 0 R 420 0 R 417 0 R 413 0 R 413 0 R 415 0 R 415 0 R 415 0 R 415 0 R 413 0 R 414 0 R 413 0 R 410 0 R 406 0 R 406 0 R 408 0 R 406 0 R 407 0 R 407 0 R 406 0 R 403 0 R 399 0 R 401 0 R 401 0 R 399 0 R 400 0 R 399 0 R 396 0 R 392 0 R 392 0 R 394 0 R 392 0 R 392 0 R 393 0 R 392 0 R 389 0 R 385 0 R 385 0 R 387 0 R 387 0 R 385 0 R 385 0 R 386 0 R 385 0 R 382 0 R 378 0 R 378 0 R 380 0 R 378 0 R 378 0 R 379 0 R 378 0 R 375 0 R 371 0 R 373 0 R 373 0 R 371 0 R 371 0 R 372 0 R 371 0 R] -endobj - -100 0 obj -[368 0 R 364 0 R 366 0 R 364 0 R 364 0 R 365 0 R 364 0 R 361 0 R 357 0 R 359 0 R 357 0 R 357 0 R 358 0 R 357 0 R 354 0 R 350 0 R 350 0 R 352 0 R 350 0 R 350 0 R 351 0 R 350 0 R 347 0 R 343 0 R 343 0 R 345 0 R 345 0 R 343 0 R 344 0 R 343 0 R 340 0 R 337 0 R 337 0 R 337 0 R 338 0 R 334 0 R 330 0 R 332 0 R 332 0 R 330 0 R 330 0 R 331 0 R 330 0 R 327 0 R 323 0 R 323 0 R 325 0 R 323 0 R 324 0 R 323 0 R 320 0 R 316 0 R 316 0 R 318 0 R 316 0 R 317 0 R 316 0 R 313 0 R 309 0 R 309 0 R 309 0 R 311 0 R 309 0 R 310 0 R 310 0 R 309 0 R 306 0 R 302 0 R 302 0 R 304 0 R 302 0 R 302 0 R 303 0 R 302 0 R 299 0 R 295 0 R 297 0 R 297 0 R 295 0 R 296 0 R 295 0 R 292 0 R 288 0 R 288 0 R 290 0 R 290 0 R 288 0 R 289 0 R 288 0 R 285 0 R 281 0 R 281 0 R 283 0 R 281 0 R 281 0 R 282 0 R 281 0 R 278 0 R 273 0 R 276 0 R 273 0 R 275 0 R 275 0 R 273 0 R 273 0 R 274 0 R 273 0 R 270 0 R 266 0 R 266 0 R 268 0 R] -endobj - -101 0 obj -[268 0 R 266 0 R 266 0 R 267 0 R 266 0 R 263 0 R 259 0 R 259 0 R 259 0 R 261 0 R 261 0 R 259 0 R 260 0 R 259 0 R 256 0 R 252 0 R 252 0 R 254 0 R 254 0 R 252 0 R 253 0 R 252 0 R 249 0 R 245 0 R 247 0 R 247 0 R 245 0 R 245 0 R 246 0 R 245 0 R 242 0 R 238 0 R 238 0 R 240 0 R 240 0 R 238 0 R 238 0 R 239 0 R 238 0 R 235 0 R 231 0 R 231 0 R 233 0 R 231 0 R 231 0 R 232 0 R 231 0 R 228 0 R 224 0 R 224 0 R 226 0 R 226 0 R 224 0 R 225 0 R 224 0 R 221 0 R 218 0 R 219 0 R 219 0 R 218 0 R 215 0 R 213 0 R 213 0 R 210 0 R 208 0 R 205 0 R 201 0 R 203 0 R 201 0 R 202 0 R 201 0 R 198 0 R 194 0 R 196 0 R 196 0 R 196 0 R 194 0 R 194 0 R 195 0 R 194 0 R 191 0 R 187 0 R 187 0 R 187 0 R 189 0 R 189 0 R 187 0 R 188 0 R 187 0 R 184 0 R 180 0 R 180 0 R 182 0 R 182 0 R 180 0 R 181 0 R 180 0 R 177 0 R 173 0 R 175 0 R 175 0 R 175 0 R 173 0 R 174 0 R 173 0 R 170 0 R 166 0 R 168 0 R 168 0 R 168 0 R 166 0 R 167 0 R 166 0 R] -endobj - -102 0 obj -[163 0 R 159 0 R 159 0 R 161 0 R 161 0 R 161 0 R 159 0 R 160 0 R 159 0 R 156 0 R 154 0 R 151 0 R 148 0 R 149 0 R 148 0 R 145 0 R 141 0 R 141 0 R 141 0 R 143 0 R 141 0 R 141 0 R 142 0 R 141 0 R 138 0 R 134 0 R 134 0 R 136 0 R 136 0 R 134 0 R 135 0 R 134 0 R 131 0 R 127 0 R 129 0 R 129 0 R 127 0 R 127 0 R 128 0 R 127 0 R 124 0 R 120 0 R 120 0 R 122 0 R 120 0 R 120 0 R 121 0 R 120 0 R 117 0 R 114 0 R 114 0 R 115 0 R 115 0 R 111 0 R 107 0 R 107 0 R 109 0 R 107 0 R 108 0 R 107 0 R] -endobj - -103 0 obj -<< - /Type /StructElem - /S /Document - /P 54 0 R - /K [4305 0 R 4301 0 R 4298 0 R 4297 0 R 4290 0 R 4289 0 R 4076 0 R 4075 0 R 4069 0 R 4068 0 R 4067 0 R 4056 0 R 4053 0 R 4052 0 R 4051 0 R 4050 0 R 4038 0 R 4029 0 R 4026 0 R 4025 0 R 4018 0 R 4017 0 R 4016 0 R 4014 0 R 4012 0 R 4011 0 R 4002 0 R 3978 0 R 3977 0 R 3975 0 R 3974 0 R 3966 0 R 3965 0 R 3963 0 R 3954 0 R 3945 0 R 3944 0 R 3936 0 R 3935 0 R 3931 0 R 3930 0 R 3929 0 R 3919 0 R 3902 0 R 3901 0 R 3897 0 R 3888 0 R 3887 0 R 3885 0 R 3884 0 R 3880 0 R 3879 0 R 3875 0 R 3874 0 R 3863 0 R 3846 0 R 3840 0 R 3839 0 R 3820 0 R 3817 0 R 3782 0 R 3765 0 R 3760 0 R 3750 0 R 3743 0 R 3739 0 R 3713 0 R 3705 0 R 3688 0 R 3687 0 R 3683 0 R 3670 0 R 3666 0 R 3648 0 R 3646 0 R 3637 0 R 3632 0 R 3598 0 R 3595 0 R 3578 0 R 3569 0 R 3567 0 R 3539 0 R 3530 0 R 3528 0 R 3521 0 R 3513 0 R 3506 0 R 3505 0 R 3502 0 R 3501 0 R 3498 0 R 3468 0 R 3462 0 R 3394 0 R 3389 0 R 3388 0 R 3384 0 R 3383 0 R 3380 0 R 3374 0 R 3369 0 R 3363 0 R 3360 0 R 3341 0 R 3340 0 R 3336 0 R 3333 0 R 3318 0 R 3313 0 R 3221 0 R 3219 0 R 3216 0 R 3194 0 R 3102 0 R 3095 0 R 3094 0 R 3090 0 R 3073 0 R 3062 0 R 3053 0 R 3052 0 R 3039 0 R 3032 0 R 3017 0 R 3010 0 R 2980 0 R 2977 0 R 2976 0 R 2972 0 R 2940 0 R 2937 0 R 2900 0 R 2896 0 R 2889 0 R 2880 0 R 2877 0 R 2868 0 R 2867 0 R 2854 0 R 2850 0 R 2849 0 R 2845 0 R 2840 0 R 2834 0 R 2815 0 R 2814 0 R 2811 0 R 2803 0 R 2794 0 R 2793 0 R 2770 0 R 2769 0 R 2768 0 R 2765 0 R 2764 0 R 2759 0 R 2740 0 R 2729 0 R 2725 0 R 2715 0 R 2710 0 R 2695 0 R 2693 0 R 2692 0 R 2691 0 R 2686 0 R 2681 0 R 2680 0 R 2677 0 R 2676 0 R 2666 0 R 2665 0 R 2661 0 R 2643 0 R 2553 0 R 2548 0 R 2547 0 R 2536 0 R 2529 0 R 2388 0 R 2378 0 R 2364 0 R 2363 0 R 2361 0 R 2345 0 R 2333 0 R 2322 0 R 2217 0 R 2208 0 R 2142 0 R 2128 0 R 2127 0 R 2117 0 R 2099 0 R 2010 0 R 1985 0 R 1786 0 R 1782 0 R 1775 0 R 1774 0 R 1762 0 R 1706 0 R 1694 0 R 1688 0 R 1687 0 R 1680 0 R 1679 0 R 1676 0 R 1645 0 R 1641 0 R 1640 0 R 1615 0 R 1613 0 R 1612 0 R 1608 0 R 1605 0 R 1597 0 R 1375 0 R 1374 0 R 1367 0 R 1222 0 R 1219 0 R 1209 0 R 1112 0 R 1110 0 R 1109 0 R 1092 0 R 1088 0 R 1083 0 R 1079 0 R 1077 0 R 1076 0 R 1075 0 R 1074 0 R 1065 0 R 1064 0 R 1062 0 R 1057 0 R 1054 0 R 1053 0 R 1052 0 R 1046 0 R 1044 0 R 1039 0 R 1038 0 R 1037 0 R 1034 0 R 1020 0 R 1015 0 R 1007 0 R 1000 0 R 997 0 R 996 0 R 989 0 R 988 0 R 985 0 R 984 0 R 983 0 R 979 0 R 973 0 R 970 0 R 965 0 R 960 0 R 956 0 R 949 0 R 948 0 R 947 0 R 946 0 R 945 0 R 943 0 R 934 0 R 928 0 R 921 0 R 920 0 R 918 0 R 910 0 R 898 0 R 897 0 R 896 0 R 878 0 R 867 0 R 856 0 R 855 0 R 854 0 R 847 0 R 836 0 R 827 0 R 826 0 R 821 0 R 819 0 R 818 0 R 104 0 R] ->> -endobj - -104 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [811 0 R 804 0 R 797 0 R 791 0 R 784 0 R 778 0 R 772 0 R 766 0 R 758 0 R 750 0 R 744 0 R 736 0 R 730 0 R 725 0 R 718 0 R 712 0 R 705 0 R 698 0 R 691 0 R 685 0 R 678 0 R 672 0 R 665 0 R 658 0 R 651 0 R 644 0 R 637 0 R 630 0 R 622 0 R 615 0 R 608 0 R 601 0 R 594 0 R 587 0 R 580 0 R 573 0 R 566 0 R 560 0 R 554 0 R 547 0 R 541 0 R 535 0 R 529 0 R 523 0 R 516 0 R 509 0 R 502 0 R 496 0 R 490 0 R 484 0 R 477 0 R 471 0 R 464 0 R 457 0 R 451 0 R 444 0 R 438 0 R 431 0 R 425 0 R 418 0 R 411 0 R 404 0 R 397 0 R 390 0 R 383 0 R 376 0 R 369 0 R 362 0 R 355 0 R 348 0 R 341 0 R 335 0 R 328 0 R 321 0 R 314 0 R 307 0 R 300 0 R 293 0 R 286 0 R 279 0 R 271 0 R 264 0 R 257 0 R 250 0 R 243 0 R 236 0 R 229 0 R 222 0 R 216 0 R 211 0 R 206 0 R 199 0 R 192 0 R 185 0 R 178 0 R 171 0 R 164 0 R 157 0 R 152 0 R 146 0 R 139 0 R 132 0 R 125 0 R 118 0 R 112 0 R 105 0 R] ->> -endobj - -105 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [110 0 R 106 0 R] ->> -endobj - -106 0 obj -<< - /Type /StructElem - /S /LBody - /P 105 0 R - /K [107 0 R] ->> -endobj - -107 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 106 0 R - /K [54 55 109 0 R 57 108 0 R 59] - /Pg 5270 0 R ->> -endobj - -108 0 obj -<< - /Type /StructElem - /S /Link - /P 107 0 R - /K [58 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5269 0 R - >>] - /Pg 5270 0 R ->> -endobj - -109 0 obj -<< - /Type /StructElem - /S /Em - /P 107 0 R - /K [56] - /Pg 5270 0 R ->> -endobj - -110 0 obj -<< - /Type /StructElem - /S /Lbl - /P 105 0 R - /K [111 0 R] ->> -endobj - -111 0 obj -<< - /Type /StructElem - /S /Link - /P 110 0 R - /K [53 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5268 0 R - >>] - /Pg 5270 0 R ->> -endobj - -112 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [116 0 R 113 0 R] ->> -endobj - -113 0 obj -<< - /Type /StructElem - /S /LBody - /P 112 0 R - /K [114 0 R] ->> -endobj - -114 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 113 0 R - /K [49 50 115 0 R] - /Pg 5270 0 R ->> -endobj - -115 0 obj -<< - /Type /StructElem - /S /Link - /P 114 0 R - /K [51 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5266 0 R - >> 52 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5267 0 R - >>] - /Pg 5270 0 R ->> -endobj - -116 0 obj -<< - /Type /StructElem - /S /Lbl - /P 112 0 R - /K [117 0 R] ->> -endobj - -117 0 obj -<< - /Type /StructElem - /S /Link - /P 116 0 R - /K [48 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5265 0 R - >>] - /Pg 5270 0 R ->> -endobj - -118 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [123 0 R 119 0 R] ->> -endobj - -119 0 obj -<< - /Type /StructElem - /S /LBody - /P 118 0 R - /K [120 0 R] ->> -endobj - -120 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 119 0 R - /K [41 42 122 0 R 44 45 121 0 R 47] - /Pg 5270 0 R ->> -endobj - -121 0 obj -<< - /Type /StructElem - /S /Link - /P 120 0 R - /K [46 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5264 0 R - >>] - /Pg 5270 0 R ->> -endobj - -122 0 obj -<< - /Type /StructElem - /S /Em - /P 120 0 R - /K [43] - /Pg 5270 0 R ->> -endobj - -123 0 obj -<< - /Type /StructElem - /S /Lbl - /P 118 0 R - /K [124 0 R] ->> -endobj - -124 0 obj -<< - /Type /StructElem - /S /Link - /P 123 0 R - /K [40 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5263 0 R - >>] - /Pg 5270 0 R ->> -endobj - -125 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [130 0 R 126 0 R] ->> -endobj - -126 0 obj -<< - /Type /StructElem - /S /LBody - /P 125 0 R - /K [127 0 R] ->> -endobj - -127 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 126 0 R - /K [33 129 0 R 36 37 128 0 R 39] - /Pg 5270 0 R ->> -endobj - -128 0 obj -<< - /Type /StructElem - /S /Link - /P 127 0 R - /K [38 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5262 0 R - >>] - /Pg 5270 0 R ->> -endobj - -129 0 obj -<< - /Type /StructElem - /S /Em - /P 127 0 R - /K [34 35] - /Pg 5270 0 R ->> -endobj - -130 0 obj -<< - /Type /StructElem - /S /Lbl - /P 125 0 R - /K [131 0 R] ->> -endobj - -131 0 obj -<< - /Type /StructElem - /S /Link - /P 130 0 R - /K [32 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5261 0 R - >>] - /Pg 5270 0 R ->> -endobj - -132 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [137 0 R 133 0 R] ->> -endobj - -133 0 obj -<< - /Type /StructElem - /S /LBody - /P 132 0 R - /K [134 0 R] ->> -endobj - -134 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 133 0 R - /K [25 26 136 0 R 29 135 0 R 31] - /Pg 5270 0 R ->> -endobj - -135 0 obj -<< - /Type /StructElem - /S /Link - /P 134 0 R - /K [30 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5260 0 R - >>] - /Pg 5270 0 R ->> -endobj - -136 0 obj -<< - /Type /StructElem - /S /Em - /P 134 0 R - /K [27 28] - /Pg 5270 0 R ->> -endobj - -137 0 obj -<< - /Type /StructElem - /S /Lbl - /P 132 0 R - /K [138 0 R] ->> -endobj - -138 0 obj -<< - /Type /StructElem - /S /Link - /P 137 0 R - /K [24 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5259 0 R - >>] - /Pg 5270 0 R ->> -endobj - -139 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [144 0 R 140 0 R] ->> -endobj - -140 0 obj -<< - /Type /StructElem - /S /LBody - /P 139 0 R - /K [141 0 R] ->> -endobj - -141 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 140 0 R - /K [16 17 18 143 0 R 20 21 142 0 R 23] - /Pg 5270 0 R ->> -endobj - -142 0 obj -<< - /Type /StructElem - /S /Link - /P 141 0 R - /K [22 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5258 0 R - >>] - /Pg 5270 0 R ->> -endobj - -143 0 obj -<< - /Type /StructElem - /S /Em - /P 141 0 R - /K [19] - /Pg 5270 0 R ->> -endobj - -144 0 obj -<< - /Type /StructElem - /S /Lbl - /P 139 0 R - /K [145 0 R] ->> -endobj - -145 0 obj -<< - /Type /StructElem - /S /Link - /P 144 0 R - /K [15 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5257 0 R - >>] - /Pg 5270 0 R ->> -endobj - -146 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [150 0 R 147 0 R] ->> -endobj - -147 0 obj -<< - /Type /StructElem - /S /LBody - /P 146 0 R - /K [148 0 R] ->> -endobj - -148 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 147 0 R - /K [12 149 0 R 14] - /Pg 5270 0 R ->> -endobj - -149 0 obj -<< - /Type /StructElem - /S /Em - /P 148 0 R - /K [13] - /Pg 5270 0 R ->> -endobj - -150 0 obj -<< - /Type /StructElem - /S /Lbl - /P 146 0 R - /K [151 0 R] ->> -endobj - -151 0 obj -<< - /Type /StructElem - /S /Link - /P 150 0 R - /K [11 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5256 0 R - >>] - /Pg 5270 0 R ->> -endobj - -152 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [155 0 R 153 0 R] ->> -endobj - -153 0 obj -<< - /Type /StructElem - /S /LBody - /P 152 0 R - /K [154 0 R] ->> -endobj - -154 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 153 0 R - /K [10] - /Pg 5270 0 R ->> -endobj - -155 0 obj -<< - /Type /StructElem - /S /Lbl - /P 152 0 R - /K [156 0 R] ->> -endobj - -156 0 obj -<< - /Type /StructElem - /S /Link - /P 155 0 R - /K [9 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5255 0 R - >>] - /Pg 5270 0 R ->> -endobj - -157 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [162 0 R 158 0 R] ->> -endobj - -158 0 obj -<< - /Type /StructElem - /S /LBody - /P 157 0 R - /K [159 0 R] ->> -endobj - -159 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 158 0 R - /K [1 2 161 0 R 6 160 0 R 8] - /Pg 5270 0 R ->> -endobj - -160 0 obj -<< - /Type /StructElem - /S /Link - /P 159 0 R - /K [7 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5254 0 R - >>] - /Pg 5270 0 R ->> -endobj - -161 0 obj -<< - /Type /StructElem - /S /Em - /P 159 0 R - /K [3 4 5] - /Pg 5270 0 R ->> -endobj - -162 0 obj -<< - /Type /StructElem - /S /Lbl - /P 157 0 R - /K [163 0 R] ->> -endobj - -163 0 obj -<< - /Type /StructElem - /S /Link - /P 162 0 R - /K [0 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5253 0 R - >>] - /Pg 5270 0 R ->> -endobj - -164 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [169 0 R 165 0 R] ->> -endobj - -165 0 obj -<< - /Type /StructElem - /S /LBody - /P 164 0 R - /K [166 0 R] ->> -endobj - -166 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 165 0 R - /K [106 168 0 R 110 167 0 R 112] - /Pg 5251 0 R ->> -endobj - -167 0 obj -<< - /Type /StructElem - /S /Link - /P 166 0 R - /K [111 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5250 0 R - >>] - /Pg 5251 0 R ->> -endobj - -168 0 obj -<< - /Type /StructElem - /S /Em - /P 166 0 R - /K [107 108 109] - /Pg 5251 0 R ->> -endobj - -169 0 obj -<< - /Type /StructElem - /S /Lbl - /P 164 0 R - /K [170 0 R] ->> -endobj - -170 0 obj -<< - /Type /StructElem - /S /Link - /P 169 0 R - /K [105 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5249 0 R - >>] - /Pg 5251 0 R ->> -endobj - -171 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [176 0 R 172 0 R] ->> -endobj - -172 0 obj -<< - /Type /StructElem - /S /LBody - /P 171 0 R - /K [173 0 R] ->> -endobj - -173 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 172 0 R - /K [98 175 0 R 102 174 0 R 104] - /Pg 5251 0 R ->> -endobj - -174 0 obj -<< - /Type /StructElem - /S /Link - /P 173 0 R - /K [103 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5248 0 R - >>] - /Pg 5251 0 R ->> -endobj - -175 0 obj -<< - /Type /StructElem - /S /Em - /P 173 0 R - /K [99 100 101] - /Pg 5251 0 R ->> -endobj - -176 0 obj -<< - /Type /StructElem - /S /Lbl - /P 171 0 R - /K [177 0 R] ->> -endobj - -177 0 obj -<< - /Type /StructElem - /S /Link - /P 176 0 R - /K [97 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5247 0 R - >>] - /Pg 5251 0 R ->> -endobj - -178 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [183 0 R 179 0 R] ->> -endobj - -179 0 obj -<< - /Type /StructElem - /S /LBody - /P 178 0 R - /K [180 0 R] ->> -endobj - -180 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 179 0 R - /K [90 91 182 0 R 94 181 0 R 96] - /Pg 5251 0 R ->> -endobj - -181 0 obj -<< - /Type /StructElem - /S /Link - /P 180 0 R - /K [95 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5246 0 R - >>] - /Pg 5251 0 R ->> -endobj - -182 0 obj -<< - /Type /StructElem - /S /Em - /P 180 0 R - /K [92 93] - /Pg 5251 0 R ->> -endobj - -183 0 obj -<< - /Type /StructElem - /S /Lbl - /P 178 0 R - /K [184 0 R] ->> -endobj - -184 0 obj -<< - /Type /StructElem - /S /Link - /P 183 0 R - /K [89 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5245 0 R - >>] - /Pg 5251 0 R ->> -endobj - -185 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [190 0 R 186 0 R] ->> -endobj - -186 0 obj -<< - /Type /StructElem - /S /LBody - /P 185 0 R - /K [187 0 R] ->> -endobj - -187 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 186 0 R - /K [81 82 83 189 0 R 86 188 0 R 88] - /Pg 5251 0 R ->> -endobj - -188 0 obj -<< - /Type /StructElem - /S /Link - /P 187 0 R - /K [87 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5244 0 R - >>] - /Pg 5251 0 R ->> -endobj - -189 0 obj -<< - /Type /StructElem - /S /Em - /P 187 0 R - /K [84 85] - /Pg 5251 0 R ->> -endobj - -190 0 obj -<< - /Type /StructElem - /S /Lbl - /P 185 0 R - /K [191 0 R] ->> -endobj - -191 0 obj -<< - /Type /StructElem - /S /Link - /P 190 0 R - /K [80 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5243 0 R - >>] - /Pg 5251 0 R ->> -endobj - -192 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [197 0 R 193 0 R] ->> -endobj - -193 0 obj -<< - /Type /StructElem - /S /LBody - /P 192 0 R - /K [194 0 R] ->> -endobj - -194 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 193 0 R - /K [72 196 0 R 76 77 195 0 R 79] - /Pg 5251 0 R ->> -endobj - -195 0 obj -<< - /Type /StructElem - /S /Link - /P 194 0 R - /K [78 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5242 0 R - >>] - /Pg 5251 0 R ->> -endobj - -196 0 obj -<< - /Type /StructElem - /S /Em - /P 194 0 R - /K [73 74 75] - /Pg 5251 0 R ->> -endobj - -197 0 obj -<< - /Type /StructElem - /S /Lbl - /P 192 0 R - /K [198 0 R] ->> -endobj - -198 0 obj -<< - /Type /StructElem - /S /Link - /P 197 0 R - /K [71 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5241 0 R - >>] - /Pg 5251 0 R ->> -endobj - -199 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [204 0 R 200 0 R] ->> -endobj - -200 0 obj -<< - /Type /StructElem - /S /LBody - /P 199 0 R - /K [201 0 R] ->> -endobj - -201 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 200 0 R - /K [66 203 0 R 68 202 0 R 70] - /Pg 5251 0 R ->> -endobj - -202 0 obj -<< - /Type /StructElem - /S /Link - /P 201 0 R - /K [69 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5240 0 R - >>] - /Pg 5251 0 R ->> -endobj - -203 0 obj -<< - /Type /StructElem - /S /Em - /P 201 0 R - /K [67] - /Pg 5251 0 R ->> -endobj - -204 0 obj -<< - /Type /StructElem - /S /Lbl - /P 199 0 R - /K [205 0 R] ->> -endobj - -205 0 obj -<< - /Type /StructElem - /S /Link - /P 204 0 R - /K [65 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5239 0 R - >>] - /Pg 5251 0 R ->> -endobj - -206 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [209 0 R 207 0 R] ->> -endobj - -207 0 obj -<< - /Type /StructElem - /S /LBody - /P 206 0 R - /K [208 0 R] ->> -endobj - -208 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 207 0 R - /K [64] - /Pg 5251 0 R ->> -endobj - -209 0 obj -<< - /Type /StructElem - /S /Lbl - /P 206 0 R - /K [210 0 R] ->> -endobj - -210 0 obj -<< - /Type /StructElem - /S /Link - /P 209 0 R - /K [63 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5238 0 R - >>] - /Pg 5251 0 R ->> -endobj - -211 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [214 0 R 212 0 R] ->> -endobj - -212 0 obj -<< - /Type /StructElem - /S /LBody - /P 211 0 R - /K [213 0 R] ->> -endobj - -213 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 212 0 R - /K [61 62] - /Pg 5251 0 R ->> -endobj - -214 0 obj -<< - /Type /StructElem - /S /Lbl - /P 211 0 R - /K [215 0 R] ->> -endobj - -215 0 obj -<< - /Type /StructElem - /S /Link - /P 214 0 R - /K [60 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5237 0 R - >>] - /Pg 5251 0 R ->> -endobj - -216 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [220 0 R 217 0 R] ->> -endobj - -217 0 obj -<< - /Type /StructElem - /S /LBody - /P 216 0 R - /K [218 0 R] ->> -endobj - -218 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 217 0 R - /K [56 219 0 R 59] - /Pg 5251 0 R ->> -endobj - -219 0 obj -<< - /Type /StructElem - /S /Em - /P 218 0 R - /K [57 58] - /Pg 5251 0 R ->> -endobj - -220 0 obj -<< - /Type /StructElem - /S /Lbl - /P 216 0 R - /K [221 0 R] ->> -endobj - -221 0 obj -<< - /Type /StructElem - /S /Link - /P 220 0 R - /K [55 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5236 0 R - >>] - /Pg 5251 0 R ->> -endobj - -222 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [227 0 R 223 0 R] ->> -endobj - -223 0 obj -<< - /Type /StructElem - /S /LBody - /P 222 0 R - /K [224 0 R] ->> -endobj - -224 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 223 0 R - /K [48 49 226 0 R 52 225 0 R 54] - /Pg 5251 0 R ->> -endobj - -225 0 obj -<< - /Type /StructElem - /S /Link - /P 224 0 R - /K [53 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5235 0 R - >>] - /Pg 5251 0 R ->> -endobj - -226 0 obj -<< - /Type /StructElem - /S /Em - /P 224 0 R - /K [50 51] - /Pg 5251 0 R ->> -endobj - -227 0 obj -<< - /Type /StructElem - /S /Lbl - /P 222 0 R - /K [228 0 R] ->> -endobj - -228 0 obj -<< - /Type /StructElem - /S /Link - /P 227 0 R - /K [47 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5234 0 R - >>] - /Pg 5251 0 R ->> -endobj - -229 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [234 0 R 230 0 R] ->> -endobj - -230 0 obj -<< - /Type /StructElem - /S /LBody - /P 229 0 R - /K [231 0 R] ->> -endobj - -231 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 230 0 R - /K [40 41 233 0 R 43 44 232 0 R 46] - /Pg 5251 0 R ->> -endobj - -232 0 obj -<< - /Type /StructElem - /S /Link - /P 231 0 R - /K [45 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5233 0 R - >>] - /Pg 5251 0 R ->> -endobj - -233 0 obj -<< - /Type /StructElem - /S /Em - /P 231 0 R - /K [42] - /Pg 5251 0 R ->> -endobj - -234 0 obj -<< - /Type /StructElem - /S /Lbl - /P 229 0 R - /K [235 0 R] ->> -endobj - -235 0 obj -<< - /Type /StructElem - /S /Link - /P 234 0 R - /K [39 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5232 0 R - >>] - /Pg 5251 0 R ->> -endobj - -236 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [241 0 R 237 0 R] ->> -endobj - -237 0 obj -<< - /Type /StructElem - /S /LBody - /P 236 0 R - /K [238 0 R] ->> -endobj - -238 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 237 0 R - /K [31 32 240 0 R 35 36 239 0 R 38] - /Pg 5251 0 R ->> -endobj - -239 0 obj -<< - /Type /StructElem - /S /Link - /P 238 0 R - /K [37 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5231 0 R - >>] - /Pg 5251 0 R ->> -endobj - -240 0 obj -<< - /Type /StructElem - /S /Em - /P 238 0 R - /K [33 34] - /Pg 5251 0 R ->> -endobj - -241 0 obj -<< - /Type /StructElem - /S /Lbl - /P 236 0 R - /K [242 0 R] ->> -endobj - -242 0 obj -<< - /Type /StructElem - /S /Link - /P 241 0 R - /K [30 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5230 0 R - >>] - /Pg 5251 0 R ->> -endobj - -243 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [248 0 R 244 0 R] ->> -endobj - -244 0 obj -<< - /Type /StructElem - /S /LBody - /P 243 0 R - /K [245 0 R] ->> -endobj - -245 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 244 0 R - /K [23 247 0 R 26 27 246 0 R 29] - /Pg 5251 0 R ->> -endobj - -246 0 obj -<< - /Type /StructElem - /S /Link - /P 245 0 R - /K [28 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5229 0 R - >>] - /Pg 5251 0 R ->> -endobj - -247 0 obj -<< - /Type /StructElem - /S /Em - /P 245 0 R - /K [24 25] - /Pg 5251 0 R ->> -endobj - -248 0 obj -<< - /Type /StructElem - /S /Lbl - /P 243 0 R - /K [249 0 R] ->> -endobj - -249 0 obj -<< - /Type /StructElem - /S /Link - /P 248 0 R - /K [22 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5228 0 R - >>] - /Pg 5251 0 R ->> -endobj - -250 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [255 0 R 251 0 R] ->> -endobj - -251 0 obj -<< - /Type /StructElem - /S /LBody - /P 250 0 R - /K [252 0 R] ->> -endobj - -252 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 251 0 R - /K [15 16 254 0 R 19 253 0 R 21] - /Pg 5251 0 R ->> -endobj - -253 0 obj -<< - /Type /StructElem - /S /Link - /P 252 0 R - /K [20 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5227 0 R - >>] - /Pg 5251 0 R ->> -endobj - -254 0 obj -<< - /Type /StructElem - /S /Em - /P 252 0 R - /K [17 18] - /Pg 5251 0 R ->> -endobj - -255 0 obj -<< - /Type /StructElem - /S /Lbl - /P 250 0 R - /K [256 0 R] ->> -endobj - -256 0 obj -<< - /Type /StructElem - /S /Link - /P 255 0 R - /K [14 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5226 0 R - >>] - /Pg 5251 0 R ->> -endobj - -257 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [262 0 R 258 0 R] ->> -endobj - -258 0 obj -<< - /Type /StructElem - /S /LBody - /P 257 0 R - /K [259 0 R] ->> -endobj - -259 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 258 0 R - /K [6 7 8 261 0 R 11 260 0 R 13] - /Pg 5251 0 R ->> -endobj - -260 0 obj -<< - /Type /StructElem - /S /Link - /P 259 0 R - /K [12 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5225 0 R - >>] - /Pg 5251 0 R ->> -endobj - -261 0 obj -<< - /Type /StructElem - /S /Em - /P 259 0 R - /K [9 10] - /Pg 5251 0 R ->> -endobj - -262 0 obj -<< - /Type /StructElem - /S /Lbl - /P 257 0 R - /K [263 0 R] ->> -endobj - -263 0 obj -<< - /Type /StructElem - /S /Link - /P 262 0 R - /K [5 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5224 0 R - >>] - /Pg 5251 0 R ->> -endobj - -264 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [269 0 R 265 0 R] ->> -endobj - -265 0 obj -<< - /Type /StructElem - /S /LBody - /P 264 0 R - /K [266 0 R] ->> -endobj - -266 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 265 0 R - /K [108 109 268 0 R << - /Type /MCR - /MCID 1 - /Pg 5251 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 5251 0 R - >> 267 0 R << - /Type /MCR - /MCID 4 - /Pg 5251 0 R - >>] - /Pg 5221 0 R ->> -endobj - -267 0 obj -<< - /Type /StructElem - /S /Link - /P 266 0 R - /K [3 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5223 0 R - >>] - /Pg 5251 0 R ->> -endobj - -268 0 obj -<< - /Type /StructElem - /S /Em - /P 266 0 R - /K [110 << - /Type /MCR - /MCID 0 - /Pg 5251 0 R - >>] - /Pg 5221 0 R ->> -endobj - -269 0 obj -<< - /Type /StructElem - /S /Lbl - /P 264 0 R - /K [270 0 R] ->> -endobj - -270 0 obj -<< - /Type /StructElem - /S /Link - /P 269 0 R - /K [107 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5220 0 R - >>] - /Pg 5221 0 R ->> -endobj - -271 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [277 0 R 272 0 R] ->> -endobj - -272 0 obj -<< - /Type /StructElem - /S /LBody - /P 271 0 R - /K [273 0 R] ->> -endobj - -273 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 272 0 R - /K [98 276 0 R 100 275 0 R 103 104 274 0 R 106] - /Pg 5221 0 R ->> -endobj - -274 0 obj -<< - /Type /StructElem - /S /Link - /P 273 0 R - /K [105 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5219 0 R - >>] - /Pg 5221 0 R ->> -endobj - -275 0 obj -<< - /Type /StructElem - /S /Em - /P 273 0 R - /K [101 102] - /Pg 5221 0 R ->> -endobj - -276 0 obj -<< - /Type /StructElem - /S /Em - /P 273 0 R - /K [99] - /Pg 5221 0 R ->> -endobj - -277 0 obj -<< - /Type /StructElem - /S /Lbl - /P 271 0 R - /K [278 0 R] ->> -endobj - -278 0 obj -<< - /Type /StructElem - /S /Link - /P 277 0 R - /K [97 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5218 0 R - >>] - /Pg 5221 0 R ->> -endobj - -279 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [284 0 R 280 0 R] ->> -endobj - -280 0 obj -<< - /Type /StructElem - /S /LBody - /P 279 0 R - /K [281 0 R] ->> -endobj - -281 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 280 0 R - /K [90 91 283 0 R 93 94 282 0 R 96] - /Pg 5221 0 R ->> -endobj - -282 0 obj -<< - /Type /StructElem - /S /Link - /P 281 0 R - /K [95 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5217 0 R - >>] - /Pg 5221 0 R ->> -endobj - -283 0 obj -<< - /Type /StructElem - /S /Em - /P 281 0 R - /K [92] - /Pg 5221 0 R ->> -endobj - -284 0 obj -<< - /Type /StructElem - /S /Lbl - /P 279 0 R - /K [285 0 R] ->> -endobj - -285 0 obj -<< - /Type /StructElem - /S /Link - /P 284 0 R - /K [89 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5216 0 R - >>] - /Pg 5221 0 R ->> -endobj - -286 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [291 0 R 287 0 R] ->> -endobj - -287 0 obj -<< - /Type /StructElem - /S /LBody - /P 286 0 R - /K [288 0 R] ->> -endobj - -288 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 287 0 R - /K [82 83 290 0 R 86 289 0 R 88] - /Pg 5221 0 R ->> -endobj - -289 0 obj -<< - /Type /StructElem - /S /Link - /P 288 0 R - /K [87 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5215 0 R - >>] - /Pg 5221 0 R ->> -endobj - -290 0 obj -<< - /Type /StructElem - /S /Em - /P 288 0 R - /K [84 85] - /Pg 5221 0 R ->> -endobj - -291 0 obj -<< - /Type /StructElem - /S /Lbl - /P 286 0 R - /K [292 0 R] ->> -endobj - -292 0 obj -<< - /Type /StructElem - /S /Link - /P 291 0 R - /K [81 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5214 0 R - >>] - /Pg 5221 0 R ->> -endobj - -293 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [298 0 R 294 0 R] ->> -endobj - -294 0 obj -<< - /Type /StructElem - /S /LBody - /P 293 0 R - /K [295 0 R] ->> -endobj - -295 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 294 0 R - /K [75 297 0 R 78 296 0 R 80] - /Pg 5221 0 R ->> -endobj - -296 0 obj -<< - /Type /StructElem - /S /Link - /P 295 0 R - /K [79 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5213 0 R - >>] - /Pg 5221 0 R ->> -endobj - -297 0 obj -<< - /Type /StructElem - /S /Em - /P 295 0 R - /K [76 77] - /Pg 5221 0 R ->> -endobj - -298 0 obj -<< - /Type /StructElem - /S /Lbl - /P 293 0 R - /K [299 0 R] ->> -endobj - -299 0 obj -<< - /Type /StructElem - /S /Link - /P 298 0 R - /K [74 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5212 0 R - >>] - /Pg 5221 0 R ->> -endobj - -300 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [305 0 R 301 0 R] ->> -endobj - -301 0 obj -<< - /Type /StructElem - /S /LBody - /P 300 0 R - /K [302 0 R] ->> -endobj - -302 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 301 0 R - /K [67 68 304 0 R 70 71 303 0 R 73] - /Pg 5221 0 R ->> -endobj - -303 0 obj -<< - /Type /StructElem - /S /Link - /P 302 0 R - /K [72 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5211 0 R - >>] - /Pg 5221 0 R ->> -endobj - -304 0 obj -<< - /Type /StructElem - /S /Em - /P 302 0 R - /K [69] - /Pg 5221 0 R ->> -endobj - -305 0 obj -<< - /Type /StructElem - /S /Lbl - /P 300 0 R - /K [306 0 R] ->> -endobj - -306 0 obj -<< - /Type /StructElem - /S /Link - /P 305 0 R - /K [66 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5210 0 R - >>] - /Pg 5221 0 R ->> -endobj - -307 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [312 0 R 308 0 R] ->> -endobj - -308 0 obj -<< - /Type /StructElem - /S /LBody - /P 307 0 R - /K [309 0 R] ->> -endobj - -309 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 308 0 R - /K [58 59 60 311 0 R 62 310 0 R 65] - /Pg 5221 0 R ->> -endobj - -310 0 obj -<< - /Type /StructElem - /S /Link - /P 309 0 R - /K [63 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5208 0 R - >> 64 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5209 0 R - >>] - /Pg 5221 0 R ->> -endobj - -311 0 obj -<< - /Type /StructElem - /S /Em - /P 309 0 R - /K [61] - /Pg 5221 0 R ->> -endobj - -312 0 obj -<< - /Type /StructElem - /S /Lbl - /P 307 0 R - /K [313 0 R] ->> -endobj - -313 0 obj -<< - /Type /StructElem - /S /Link - /P 312 0 R - /K [57 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5207 0 R - >>] - /Pg 5221 0 R ->> -endobj - -314 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [319 0 R 315 0 R] ->> -endobj - -315 0 obj -<< - /Type /StructElem - /S /LBody - /P 314 0 R - /K [316 0 R] ->> -endobj - -316 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 315 0 R - /K [51 52 318 0 R 54 317 0 R 56] - /Pg 5221 0 R ->> -endobj - -317 0 obj -<< - /Type /StructElem - /S /Link - /P 316 0 R - /K [55 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5206 0 R - >>] - /Pg 5221 0 R ->> -endobj - -318 0 obj -<< - /Type /StructElem - /S /Em - /P 316 0 R - /K [53] - /Pg 5221 0 R ->> -endobj - -319 0 obj -<< - /Type /StructElem - /S /Lbl - /P 314 0 R - /K [320 0 R] ->> -endobj - -320 0 obj -<< - /Type /StructElem - /S /Link - /P 319 0 R - /K [50 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5205 0 R - >>] - /Pg 5221 0 R ->> -endobj - -321 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [326 0 R 322 0 R] ->> -endobj - -322 0 obj -<< - /Type /StructElem - /S /LBody - /P 321 0 R - /K [323 0 R] ->> -endobj - -323 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 322 0 R - /K [44 45 325 0 R 47 324 0 R 49] - /Pg 5221 0 R ->> -endobj - -324 0 obj -<< - /Type /StructElem - /S /Link - /P 323 0 R - /K [48 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5204 0 R - >>] - /Pg 5221 0 R ->> -endobj - -325 0 obj -<< - /Type /StructElem - /S /Em - /P 323 0 R - /K [46] - /Pg 5221 0 R ->> -endobj - -326 0 obj -<< - /Type /StructElem - /S /Lbl - /P 321 0 R - /K [327 0 R] ->> -endobj - -327 0 obj -<< - /Type /StructElem - /S /Link - /P 326 0 R - /K [43 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5203 0 R - >>] - /Pg 5221 0 R ->> -endobj - -328 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [333 0 R 329 0 R] ->> -endobj - -329 0 obj -<< - /Type /StructElem - /S /LBody - /P 328 0 R - /K [330 0 R] ->> -endobj - -330 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 329 0 R - /K [36 332 0 R 39 40 331 0 R 42] - /Pg 5221 0 R ->> -endobj - -331 0 obj -<< - /Type /StructElem - /S /Link - /P 330 0 R - /K [41 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5202 0 R - >>] - /Pg 5221 0 R ->> -endobj - -332 0 obj -<< - /Type /StructElem - /S /Em - /P 330 0 R - /K [37 38] - /Pg 5221 0 R ->> -endobj - -333 0 obj -<< - /Type /StructElem - /S /Lbl - /P 328 0 R - /K [334 0 R] ->> -endobj - -334 0 obj -<< - /Type /StructElem - /S /Link - /P 333 0 R - /K [35 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5201 0 R - >>] - /Pg 5221 0 R ->> -endobj - -335 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [339 0 R 336 0 R] ->> -endobj - -336 0 obj -<< - /Type /StructElem - /S /LBody - /P 335 0 R - /K [337 0 R] ->> -endobj - -337 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 336 0 R - /K [31 32 33 338 0 R] - /Pg 5221 0 R ->> -endobj - -338 0 obj -<< - /Type /StructElem - /S /Link - /P 337 0 R - /K [34 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5200 0 R - >>] - /Pg 5221 0 R ->> -endobj - -339 0 obj -<< - /Type /StructElem - /S /Lbl - /P 335 0 R - /K [340 0 R] ->> -endobj - -340 0 obj -<< - /Type /StructElem - /S /Link - /P 339 0 R - /K [30 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5199 0 R - >>] - /Pg 5221 0 R ->> -endobj - -341 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [346 0 R 342 0 R] ->> -endobj - -342 0 obj -<< - /Type /StructElem - /S /LBody - /P 341 0 R - /K [343 0 R] ->> -endobj - -343 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 342 0 R - /K [23 24 345 0 R 27 344 0 R 29] - /Pg 5221 0 R ->> -endobj - -344 0 obj -<< - /Type /StructElem - /S /Link - /P 343 0 R - /K [28 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5198 0 R - >>] - /Pg 5221 0 R ->> -endobj - -345 0 obj -<< - /Type /StructElem - /S /Em - /P 343 0 R - /K [25 26] - /Pg 5221 0 R ->> -endobj - -346 0 obj -<< - /Type /StructElem - /S /Lbl - /P 341 0 R - /K [347 0 R] ->> -endobj - -347 0 obj -<< - /Type /StructElem - /S /Link - /P 346 0 R - /K [22 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5197 0 R - >>] - /Pg 5221 0 R ->> -endobj - -348 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [353 0 R 349 0 R] ->> -endobj - -349 0 obj -<< - /Type /StructElem - /S /LBody - /P 348 0 R - /K [350 0 R] ->> -endobj - -350 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 349 0 R - /K [15 16 352 0 R 18 19 351 0 R 21] - /Pg 5221 0 R ->> -endobj - -351 0 obj -<< - /Type /StructElem - /S /Link - /P 350 0 R - /K [20 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5196 0 R - >>] - /Pg 5221 0 R ->> -endobj - -352 0 obj -<< - /Type /StructElem - /S /Em - /P 350 0 R - /K [17] - /Pg 5221 0 R ->> -endobj - -353 0 obj -<< - /Type /StructElem - /S /Lbl - /P 348 0 R - /K [354 0 R] ->> -endobj - -354 0 obj -<< - /Type /StructElem - /S /Link - /P 353 0 R - /K [14 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5195 0 R - >>] - /Pg 5221 0 R ->> -endobj - -355 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [360 0 R 356 0 R] ->> -endobj - -356 0 obj -<< - /Type /StructElem - /S /LBody - /P 355 0 R - /K [357 0 R] ->> -endobj - -357 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 356 0 R - /K [8 359 0 R 10 11 358 0 R 13] - /Pg 5221 0 R ->> -endobj - -358 0 obj -<< - /Type /StructElem - /S /Link - /P 357 0 R - /K [12 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5194 0 R - >>] - /Pg 5221 0 R ->> -endobj - -359 0 obj -<< - /Type /StructElem - /S /Em - /P 357 0 R - /K [9] - /Pg 5221 0 R ->> -endobj - -360 0 obj -<< - /Type /StructElem - /S /Lbl - /P 355 0 R - /K [361 0 R] ->> -endobj - -361 0 obj -<< - /Type /StructElem - /S /Link - /P 360 0 R - /K [7 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5193 0 R - >>] - /Pg 5221 0 R ->> -endobj - -362 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [367 0 R 363 0 R] ->> -endobj - -363 0 obj -<< - /Type /StructElem - /S /LBody - /P 362 0 R - /K [364 0 R] ->> -endobj - -364 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 363 0 R - /K [1 366 0 R 3 4 365 0 R 6] - /Pg 5221 0 R ->> -endobj - -365 0 obj -<< - /Type /StructElem - /S /Link - /P 364 0 R - /K [5 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5192 0 R - >>] - /Pg 5221 0 R ->> -endobj - -366 0 obj -<< - /Type /StructElem - /S /Em - /P 364 0 R - /K [2] - /Pg 5221 0 R ->> -endobj - -367 0 obj -<< - /Type /StructElem - /S /Lbl - /P 362 0 R - /K [368 0 R] ->> -endobj - -368 0 obj -<< - /Type /StructElem - /S /Link - /P 367 0 R - /K [0 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5191 0 R - >>] - /Pg 5221 0 R ->> -endobj - -369 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [374 0 R 370 0 R] ->> -endobj - -370 0 obj -<< - /Type /StructElem - /S /LBody - /P 369 0 R - /K [371 0 R] ->> -endobj - -371 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 370 0 R - /K [101 373 0 R 104 105 372 0 R 107] - /Pg 5189 0 R ->> -endobj - -372 0 obj -<< - /Type /StructElem - /S /Link - /P 371 0 R - /K [106 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5188 0 R - >>] - /Pg 5189 0 R ->> -endobj - -373 0 obj -<< - /Type /StructElem - /S /Em - /P 371 0 R - /K [102 103] - /Pg 5189 0 R ->> -endobj - -374 0 obj -<< - /Type /StructElem - /S /Lbl - /P 369 0 R - /K [375 0 R] ->> -endobj - -375 0 obj -<< - /Type /StructElem - /S /Link - /P 374 0 R - /K [100 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5187 0 R - >>] - /Pg 5189 0 R ->> -endobj - -376 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [381 0 R 377 0 R] ->> -endobj - -377 0 obj -<< - /Type /StructElem - /S /LBody - /P 376 0 R - /K [378 0 R] ->> -endobj - -378 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 377 0 R - /K [93 94 380 0 R 96 97 379 0 R 99] - /Pg 5189 0 R ->> -endobj - -379 0 obj -<< - /Type /StructElem - /S /Link - /P 378 0 R - /K [98 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5186 0 R - >>] - /Pg 5189 0 R ->> -endobj - -380 0 obj -<< - /Type /StructElem - /S /Em - /P 378 0 R - /K [95] - /Pg 5189 0 R ->> -endobj - -381 0 obj -<< - /Type /StructElem - /S /Lbl - /P 376 0 R - /K [382 0 R] ->> -endobj - -382 0 obj -<< - /Type /StructElem - /S /Link - /P 381 0 R - /K [92 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5185 0 R - >>] - /Pg 5189 0 R ->> -endobj - -383 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [388 0 R 384 0 R] ->> -endobj - -384 0 obj -<< - /Type /StructElem - /S /LBody - /P 383 0 R - /K [385 0 R] ->> -endobj - -385 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 384 0 R - /K [84 85 387 0 R 88 89 386 0 R 91] - /Pg 5189 0 R ->> -endobj - -386 0 obj -<< - /Type /StructElem - /S /Link - /P 385 0 R - /K [90 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5184 0 R - >>] - /Pg 5189 0 R ->> -endobj - -387 0 obj -<< - /Type /StructElem - /S /Em - /P 385 0 R - /K [86 87] - /Pg 5189 0 R ->> -endobj - -388 0 obj -<< - /Type /StructElem - /S /Lbl - /P 383 0 R - /K [389 0 R] ->> -endobj - -389 0 obj -<< - /Type /StructElem - /S /Link - /P 388 0 R - /K [83 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5183 0 R - >>] - /Pg 5189 0 R ->> -endobj - -390 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [395 0 R 391 0 R] ->> -endobj - -391 0 obj -<< - /Type /StructElem - /S /LBody - /P 390 0 R - /K [392 0 R] ->> -endobj - -392 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 391 0 R - /K [76 77 394 0 R 79 80 393 0 R 82] - /Pg 5189 0 R ->> -endobj - -393 0 obj -<< - /Type /StructElem - /S /Link - /P 392 0 R - /K [81 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5182 0 R - >>] - /Pg 5189 0 R ->> -endobj - -394 0 obj -<< - /Type /StructElem - /S /Em - /P 392 0 R - /K [78] - /Pg 5189 0 R ->> -endobj - -395 0 obj -<< - /Type /StructElem - /S /Lbl - /P 390 0 R - /K [396 0 R] ->> -endobj - -396 0 obj -<< - /Type /StructElem - /S /Link - /P 395 0 R - /K [75 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5181 0 R - >>] - /Pg 5189 0 R ->> -endobj - -397 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [402 0 R 398 0 R] ->> -endobj - -398 0 obj -<< - /Type /StructElem - /S /LBody - /P 397 0 R - /K [399 0 R] ->> -endobj - -399 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 398 0 R - /K [69 401 0 R 72 400 0 R 74] - /Pg 5189 0 R ->> -endobj - -400 0 obj -<< - /Type /StructElem - /S /Link - /P 399 0 R - /K [73 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5180 0 R - >>] - /Pg 5189 0 R ->> -endobj - -401 0 obj -<< - /Type /StructElem - /S /Em - /P 399 0 R - /K [70 71] - /Pg 5189 0 R ->> -endobj - -402 0 obj -<< - /Type /StructElem - /S /Lbl - /P 397 0 R - /K [403 0 R] ->> -endobj - -403 0 obj -<< - /Type /StructElem - /S /Link - /P 402 0 R - /K [68 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5179 0 R - >>] - /Pg 5189 0 R ->> -endobj - -404 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [409 0 R 405 0 R] ->> -endobj - -405 0 obj -<< - /Type /StructElem - /S /LBody - /P 404 0 R - /K [406 0 R] ->> -endobj - -406 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 405 0 R - /K [61 62 408 0 R 64 407 0 R 67] - /Pg 5189 0 R ->> -endobj - -407 0 obj -<< - /Type /StructElem - /S /Link - /P 406 0 R - /K [65 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5177 0 R - >> 66 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5178 0 R - >>] - /Pg 5189 0 R ->> -endobj - -408 0 obj -<< - /Type /StructElem - /S /Em - /P 406 0 R - /K [63] - /Pg 5189 0 R ->> -endobj - -409 0 obj -<< - /Type /StructElem - /S /Lbl - /P 404 0 R - /K [410 0 R] ->> -endobj - -410 0 obj -<< - /Type /StructElem - /S /Link - /P 409 0 R - /K [60 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5176 0 R - >>] - /Pg 5189 0 R ->> -endobj - -411 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [416 0 R 412 0 R] ->> -endobj - -412 0 obj -<< - /Type /StructElem - /S /LBody - /P 411 0 R - /K [413 0 R] ->> -endobj - -413 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 412 0 R - /K [51 52 415 0 R 57 414 0 R 59] - /Pg 5189 0 R ->> -endobj - -414 0 obj -<< - /Type /StructElem - /S /Link - /P 413 0 R - /K [58 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5175 0 R - >>] - /Pg 5189 0 R ->> -endobj - -415 0 obj -<< - /Type /StructElem - /S /Em - /P 413 0 R - /K [53 54 55 56] - /Pg 5189 0 R ->> -endobj - -416 0 obj -<< - /Type /StructElem - /S /Lbl - /P 411 0 R - /K [417 0 R] ->> -endobj - -417 0 obj -<< - /Type /StructElem - /S /Link - /P 416 0 R - /K [50 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5174 0 R - >>] - /Pg 5189 0 R ->> -endobj - -418 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [423 0 R 419 0 R] ->> -endobj - -419 0 obj -<< - /Type /StructElem - /S /LBody - /P 418 0 R - /K [420 0 R] ->> -endobj - -420 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 419 0 R - /K [43 422 0 R 46 47 421 0 R 49] - /Pg 5189 0 R ->> -endobj - -421 0 obj -<< - /Type /StructElem - /S /Link - /P 420 0 R - /K [48 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5173 0 R - >>] - /Pg 5189 0 R ->> -endobj - -422 0 obj -<< - /Type /StructElem - /S /Em - /P 420 0 R - /K [44 45] - /Pg 5189 0 R ->> -endobj - -423 0 obj -<< - /Type /StructElem - /S /Lbl - /P 418 0 R - /K [424 0 R] ->> -endobj - -424 0 obj -<< - /Type /StructElem - /S /Link - /P 423 0 R - /K [42 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5172 0 R - >>] - /Pg 5189 0 R ->> -endobj - -425 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [429 0 R 426 0 R] ->> -endobj - -426 0 obj -<< - /Type /StructElem - /S /LBody - /P 425 0 R - /K [427 0 R] ->> -endobj - -427 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 426 0 R - /K [39 428 0 R] - /Pg 5189 0 R ->> -endobj - -428 0 obj -<< - /Type /StructElem - /S /Link - /P 427 0 R - /K [40 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5170 0 R - >> 41 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5171 0 R - >>] - /Pg 5189 0 R ->> -endobj - -429 0 obj -<< - /Type /StructElem - /S /Lbl - /P 425 0 R - /K [430 0 R] ->> -endobj - -430 0 obj -<< - /Type /StructElem - /S /Link - /P 429 0 R - /K [38 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5169 0 R - >>] - /Pg 5189 0 R ->> -endobj - -431 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [436 0 R 432 0 R] ->> -endobj - -432 0 obj -<< - /Type /StructElem - /S /LBody - /P 431 0 R - /K [433 0 R] ->> -endobj - -433 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 432 0 R - /K [31 32 435 0 R 34 35 434 0 R 37] - /Pg 5189 0 R ->> -endobj - -434 0 obj -<< - /Type /StructElem - /S /Link - /P 433 0 R - /K [36 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5168 0 R - >>] - /Pg 5189 0 R ->> -endobj - -435 0 obj -<< - /Type /StructElem - /S /Em - /P 433 0 R - /K [33] - /Pg 5189 0 R ->> -endobj - -436 0 obj -<< - /Type /StructElem - /S /Lbl - /P 431 0 R - /K [437 0 R] ->> -endobj - -437 0 obj -<< - /Type /StructElem - /S /Link - /P 436 0 R - /K [30 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5167 0 R - >>] - /Pg 5189 0 R ->> -endobj - -438 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [442 0 R 439 0 R] ->> -endobj - -439 0 obj -<< - /Type /StructElem - /S /LBody - /P 438 0 R - /K [440 0 R] ->> -endobj - -440 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 439 0 R - /K [27 441 0 R] - /Pg 5189 0 R ->> -endobj - -441 0 obj -<< - /Type /StructElem - /S /Link - /P 440 0 R - /K [28 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5165 0 R - >> 29 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5166 0 R - >>] - /Pg 5189 0 R ->> -endobj - -442 0 obj -<< - /Type /StructElem - /S /Lbl - /P 438 0 R - /K [443 0 R] ->> -endobj - -443 0 obj -<< - /Type /StructElem - /S /Link - /P 442 0 R - /K [26 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5164 0 R - >>] - /Pg 5189 0 R ->> -endobj - -444 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [449 0 R 445 0 R] ->> -endobj - -445 0 obj -<< - /Type /StructElem - /S /LBody - /P 444 0 R - /K [446 0 R] ->> -endobj - -446 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 445 0 R - /K [20 448 0 R 23 447 0 R 25] - /Pg 5189 0 R ->> -endobj - -447 0 obj -<< - /Type /StructElem - /S /Link - /P 446 0 R - /K [24 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5163 0 R - >>] - /Pg 5189 0 R ->> -endobj - -448 0 obj -<< - /Type /StructElem - /S /Em - /P 446 0 R - /K [21 22] - /Pg 5189 0 R ->> -endobj - -449 0 obj -<< - /Type /StructElem - /S /Lbl - /P 444 0 R - /K [450 0 R] ->> -endobj - -450 0 obj -<< - /Type /StructElem - /S /Link - /P 449 0 R - /K [19 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5162 0 R - >>] - /Pg 5189 0 R ->> -endobj - -451 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [455 0 R 452 0 R] ->> -endobj - -452 0 obj -<< - /Type /StructElem - /S /LBody - /P 451 0 R - /K [453 0 R] ->> -endobj - -453 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 452 0 R - /K [15 454 0 R 18] - /Pg 5189 0 R ->> -endobj - -454 0 obj -<< - /Type /StructElem - /S /Em - /P 453 0 R - /K [16 17] - /Pg 5189 0 R ->> -endobj - -455 0 obj -<< - /Type /StructElem - /S /Lbl - /P 451 0 R - /K [456 0 R] ->> -endobj - -456 0 obj -<< - /Type /StructElem - /S /Link - /P 455 0 R - /K [14 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5161 0 R - >>] - /Pg 5189 0 R ->> -endobj - -457 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [462 0 R 458 0 R] ->> -endobj - -458 0 obj -<< - /Type /StructElem - /S /LBody - /P 457 0 R - /K [459 0 R] ->> -endobj - -459 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 458 0 R - /K [8 461 0 R 11 460 0 R 13] - /Pg 5189 0 R ->> -endobj - -460 0 obj -<< - /Type /StructElem - /S /Link - /P 459 0 R - /K [12 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5160 0 R - >>] - /Pg 5189 0 R ->> -endobj - -461 0 obj -<< - /Type /StructElem - /S /Em - /P 459 0 R - /K [9 10] - /Pg 5189 0 R ->> -endobj - -462 0 obj -<< - /Type /StructElem - /S /Lbl - /P 457 0 R - /K [463 0 R] ->> -endobj - -463 0 obj -<< - /Type /StructElem - /S /Link - /P 462 0 R - /K [7 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5159 0 R - >>] - /Pg 5189 0 R ->> -endobj - -464 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [469 0 R 465 0 R] ->> -endobj - -465 0 obj -<< - /Type /StructElem - /S /LBody - /P 464 0 R - /K [466 0 R] ->> -endobj - -466 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 465 0 R - /K [1 468 0 R 4 467 0 R 6] - /Pg 5189 0 R ->> -endobj - -467 0 obj -<< - /Type /StructElem - /S /Link - /P 466 0 R - /K [5 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5158 0 R - >>] - /Pg 5189 0 R ->> -endobj - -468 0 obj -<< - /Type /StructElem - /S /Em - /P 466 0 R - /K [2 3] - /Pg 5189 0 R ->> -endobj - -469 0 obj -<< - /Type /StructElem - /S /Lbl - /P 464 0 R - /K [470 0 R] ->> -endobj - -470 0 obj -<< - /Type /StructElem - /S /Link - /P 469 0 R - /K [0 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5157 0 R - >>] - /Pg 5189 0 R ->> -endobj - -471 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [475 0 R 472 0 R] ->> -endobj - -472 0 obj -<< - /Type /StructElem - /S /LBody - /P 471 0 R - /K [473 0 R] ->> -endobj - -473 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 472 0 R - /K [95 96 474 0 R 99] - /Pg 5155 0 R ->> -endobj - -474 0 obj -<< - /Type /StructElem - /S /Em - /P 473 0 R - /K [97 98] - /Pg 5155 0 R ->> -endobj - -475 0 obj -<< - /Type /StructElem - /S /Lbl - /P 471 0 R - /K [476 0 R] ->> -endobj - -476 0 obj -<< - /Type /StructElem - /S /Link - /P 475 0 R - /K [94 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5154 0 R - >>] - /Pg 5155 0 R ->> -endobj - -477 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [482 0 R 478 0 R] ->> -endobj - -478 0 obj -<< - /Type /StructElem - /S /LBody - /P 477 0 R - /K [479 0 R] ->> -endobj - -479 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 478 0 R - /K [87 88 481 0 R 90 91 480 0 R 93] - /Pg 5155 0 R ->> -endobj - -480 0 obj -<< - /Type /StructElem - /S /Link - /P 479 0 R - /K [92 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5153 0 R - >>] - /Pg 5155 0 R ->> -endobj - -481 0 obj -<< - /Type /StructElem - /S /Em - /P 479 0 R - /K [89] - /Pg 5155 0 R ->> -endobj - -482 0 obj -<< - /Type /StructElem - /S /Lbl - /P 477 0 R - /K [483 0 R] ->> -endobj - -483 0 obj -<< - /Type /StructElem - /S /Link - /P 482 0 R - /K [86 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5152 0 R - >>] - /Pg 5155 0 R ->> -endobj - -484 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [488 0 R 485 0 R] ->> -endobj - -485 0 obj -<< - /Type /StructElem - /S /LBody - /P 484 0 R - /K [486 0 R] ->> -endobj - -486 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 485 0 R - /K [81 82 83 487 0 R 85] - /Pg 5155 0 R ->> -endobj - -487 0 obj -<< - /Type /StructElem - /S /Em - /P 486 0 R - /K [84] - /Pg 5155 0 R ->> -endobj - -488 0 obj -<< - /Type /StructElem - /S /Lbl - /P 484 0 R - /K [489 0 R] ->> -endobj - -489 0 obj -<< - /Type /StructElem - /S /Link - /P 488 0 R - /K [80 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5151 0 R - >>] - /Pg 5155 0 R ->> -endobj - -490 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [494 0 R 491 0 R] ->> -endobj - -491 0 obj -<< - /Type /StructElem - /S /LBody - /P 490 0 R - /K [492 0 R] ->> -endobj - -492 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 491 0 R - /K [76 493 0 R 79] - /Pg 5155 0 R ->> -endobj - -493 0 obj -<< - /Type /StructElem - /S /Em - /P 492 0 R - /K [77 78] - /Pg 5155 0 R ->> -endobj - -494 0 obj -<< - /Type /StructElem - /S /Lbl - /P 490 0 R - /K [495 0 R] ->> -endobj - -495 0 obj -<< - /Type /StructElem - /S /Link - /P 494 0 R - /K [75 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5150 0 R - >>] - /Pg 5155 0 R ->> -endobj - -496 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [500 0 R 497 0 R] ->> -endobj - -497 0 obj -<< - /Type /StructElem - /S /LBody - /P 496 0 R - /K [498 0 R] ->> -endobj - -498 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 497 0 R - /K [71 72 499 0 R 74] - /Pg 5155 0 R ->> -endobj - -499 0 obj -<< - /Type /StructElem - /S /Em - /P 498 0 R - /K [73] - /Pg 5155 0 R ->> -endobj - -500 0 obj -<< - /Type /StructElem - /S /Lbl - /P 496 0 R - /K [501 0 R] ->> -endobj - -501 0 obj -<< - /Type /StructElem - /S /Link - /P 500 0 R - /K [70 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5149 0 R - >>] - /Pg 5155 0 R ->> -endobj - -502 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [507 0 R 503 0 R] ->> -endobj - -503 0 obj -<< - /Type /StructElem - /S /LBody - /P 502 0 R - /K [504 0 R] ->> -endobj - -504 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 503 0 R - /K [63 64 506 0 R 67 505 0 R 69] - /Pg 5155 0 R ->> -endobj - -505 0 obj -<< - /Type /StructElem - /S /Link - /P 504 0 R - /K [68 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5148 0 R - >>] - /Pg 5155 0 R ->> -endobj - -506 0 obj -<< - /Type /StructElem - /S /Em - /P 504 0 R - /K [65 66] - /Pg 5155 0 R ->> -endobj - -507 0 obj -<< - /Type /StructElem - /S /Lbl - /P 502 0 R - /K [508 0 R] ->> -endobj - -508 0 obj -<< - /Type /StructElem - /S /Link - /P 507 0 R - /K [62 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5147 0 R - >>] - /Pg 5155 0 R ->> -endobj - -509 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [514 0 R 510 0 R] ->> -endobj - -510 0 obj -<< - /Type /StructElem - /S /LBody - /P 509 0 R - /K [511 0 R] ->> -endobj - -511 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 510 0 R - /K [55 56 513 0 R 59 512 0 R 61] - /Pg 5155 0 R ->> -endobj - -512 0 obj -<< - /Type /StructElem - /S /Link - /P 511 0 R - /K [60 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5146 0 R - >>] - /Pg 5155 0 R ->> -endobj - -513 0 obj -<< - /Type /StructElem - /S /Em - /P 511 0 R - /K [57 58] - /Pg 5155 0 R ->> -endobj - -514 0 obj -<< - /Type /StructElem - /S /Lbl - /P 509 0 R - /K [515 0 R] ->> -endobj - -515 0 obj -<< - /Type /StructElem - /S /Link - /P 514 0 R - /K [54 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5145 0 R - >>] - /Pg 5155 0 R ->> -endobj - -516 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [521 0 R 517 0 R] ->> -endobj - -517 0 obj -<< - /Type /StructElem - /S /LBody - /P 516 0 R - /K [518 0 R] ->> -endobj - -518 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 517 0 R - /K [46 47 48 520 0 R 50 51 519 0 R 53] - /Pg 5155 0 R ->> -endobj - -519 0 obj -<< - /Type /StructElem - /S /Link - /P 518 0 R - /K [52 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5144 0 R - >>] - /Pg 5155 0 R ->> -endobj - -520 0 obj -<< - /Type /StructElem - /S /Em - /P 518 0 R - /K [49] - /Pg 5155 0 R ->> -endobj - -521 0 obj -<< - /Type /StructElem - /S /Lbl - /P 516 0 R - /K [522 0 R] ->> -endobj - -522 0 obj -<< - /Type /StructElem - /S /Link - /P 521 0 R - /K [45 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5143 0 R - >>] - /Pg 5155 0 R ->> -endobj - -523 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [527 0 R 524 0 R] ->> -endobj - -524 0 obj -<< - /Type /StructElem - /S /LBody - /P 523 0 R - /K [525 0 R] ->> -endobj - -525 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 524 0 R - /K [42 526 0 R 44] - /Pg 5155 0 R ->> -endobj - -526 0 obj -<< - /Type /StructElem - /S /Em - /P 525 0 R - /K [43] - /Pg 5155 0 R ->> -endobj - -527 0 obj -<< - /Type /StructElem - /S /Lbl - /P 523 0 R - /K [528 0 R] ->> -endobj - -528 0 obj -<< - /Type /StructElem - /S /Link - /P 527 0 R - /K [41 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5142 0 R - >>] - /Pg 5155 0 R ->> -endobj - -529 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [533 0 R 530 0 R] ->> -endobj - -530 0 obj -<< - /Type /StructElem - /S /LBody - /P 529 0 R - /K [531 0 R] ->> -endobj - -531 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 530 0 R - /K [39 532 0 R] - /Pg 5155 0 R ->> -endobj - -532 0 obj -<< - /Type /StructElem - /S /Link - /P 531 0 R - /K [40 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5141 0 R - >>] - /Pg 5155 0 R ->> -endobj - -533 0 obj -<< - /Type /StructElem - /S /Lbl - /P 529 0 R - /K [534 0 R] ->> -endobj - -534 0 obj -<< - /Type /StructElem - /S /Link - /P 533 0 R - /K [38 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5140 0 R - >>] - /Pg 5155 0 R ->> -endobj - -535 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [539 0 R 536 0 R] ->> -endobj - -536 0 obj -<< - /Type /StructElem - /S /LBody - /P 535 0 R - /K [537 0 R] ->> -endobj - -537 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 536 0 R - /K [35 538 0 R] - /Pg 5155 0 R ->> -endobj - -538 0 obj -<< - /Type /StructElem - /S /Link - /P 537 0 R - /K [36 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5138 0 R - >> 37 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5139 0 R - >>] - /Pg 5155 0 R ->> -endobj - -539 0 obj -<< - /Type /StructElem - /S /Lbl - /P 535 0 R - /K [540 0 R] ->> -endobj - -540 0 obj -<< - /Type /StructElem - /S /Link - /P 539 0 R - /K [34 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5137 0 R - >>] - /Pg 5155 0 R ->> -endobj - -541 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [545 0 R 542 0 R] ->> -endobj - -542 0 obj -<< - /Type /StructElem - /S /LBody - /P 541 0 R - /K [543 0 R] ->> -endobj - -543 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 542 0 R - /K [28 544 0 R 32 33] - /Pg 5155 0 R ->> -endobj - -544 0 obj -<< - /Type /StructElem - /S /Em - /P 543 0 R - /K [29 30 31] - /Pg 5155 0 R ->> -endobj - -545 0 obj -<< - /Type /StructElem - /S /Lbl - /P 541 0 R - /K [546 0 R] ->> -endobj - -546 0 obj -<< - /Type /StructElem - /S /Link - /P 545 0 R - /K [27 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5136 0 R - >>] - /Pg 5155 0 R ->> -endobj - -547 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [552 0 R 548 0 R] ->> -endobj - -548 0 obj -<< - /Type /StructElem - /S /LBody - /P 547 0 R - /K [549 0 R] ->> -endobj - -549 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 548 0 R - /K [19 20 551 0 R 23 24 550 0 R 26] - /Pg 5155 0 R ->> -endobj - -550 0 obj -<< - /Type /StructElem - /S /Link - /P 549 0 R - /K [25 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5135 0 R - >>] - /Pg 5155 0 R ->> -endobj - -551 0 obj -<< - /Type /StructElem - /S /Em - /P 549 0 R - /K [21 22] - /Pg 5155 0 R ->> -endobj - -552 0 obj -<< - /Type /StructElem - /S /Lbl - /P 547 0 R - /K [553 0 R] ->> -endobj - -553 0 obj -<< - /Type /StructElem - /S /Link - /P 552 0 R - /K [18 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5134 0 R - >>] - /Pg 5155 0 R ->> -endobj - -554 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [558 0 R 555 0 R] ->> -endobj - -555 0 obj -<< - /Type /StructElem - /S /LBody - /P 554 0 R - /K [556 0 R] ->> -endobj - -556 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 555 0 R - /K [14 15 16 557 0 R] - /Pg 5155 0 R ->> -endobj - -557 0 obj -<< - /Type /StructElem - /S /Link - /P 556 0 R - /K [17 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5133 0 R - >>] - /Pg 5155 0 R ->> -endobj - -558 0 obj -<< - /Type /StructElem - /S /Lbl - /P 554 0 R - /K [559 0 R] ->> -endobj - -559 0 obj -<< - /Type /StructElem - /S /Link - /P 558 0 R - /K [13 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5132 0 R - >>] - /Pg 5155 0 R ->> -endobj - -560 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [564 0 R 561 0 R] ->> -endobj - -561 0 obj -<< - /Type /StructElem - /S /LBody - /P 560 0 R - /K [562 0 R] ->> -endobj - -562 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 561 0 R - /K [8 563 0 R 12] - /Pg 5155 0 R ->> -endobj - -563 0 obj -<< - /Type /StructElem - /S /Em - /P 562 0 R - /K [9 10 11] - /Pg 5155 0 R ->> -endobj - -564 0 obj -<< - /Type /StructElem - /S /Lbl - /P 560 0 R - /K [565 0 R] ->> -endobj - -565 0 obj -<< - /Type /StructElem - /S /Link - /P 564 0 R - /K [7 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5131 0 R - >>] - /Pg 5155 0 R ->> -endobj - -566 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [571 0 R 567 0 R] ->> -endobj - -567 0 obj -<< - /Type /StructElem - /S /LBody - /P 566 0 R - /K [568 0 R] ->> -endobj - -568 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 567 0 R - /K [1 570 0 R 4 569 0 R 6] - /Pg 5155 0 R ->> -endobj - -569 0 obj -<< - /Type /StructElem - /S /Link - /P 568 0 R - /K [5 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5130 0 R - >>] - /Pg 5155 0 R ->> -endobj - -570 0 obj -<< - /Type /StructElem - /S /Em - /P 568 0 R - /K [2 3] - /Pg 5155 0 R ->> -endobj - -571 0 obj -<< - /Type /StructElem - /S /Lbl - /P 566 0 R - /K [572 0 R] ->> -endobj - -572 0 obj -<< - /Type /StructElem - /S /Link - /P 571 0 R - /K [0 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5129 0 R - >>] - /Pg 5155 0 R ->> -endobj - -573 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [578 0 R 574 0 R] ->> -endobj - -574 0 obj -<< - /Type /StructElem - /S /LBody - /P 573 0 R - /K [575 0 R] ->> -endobj - -575 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 574 0 R - /K [105 577 0 R 108 576 0 R 110] - /Pg 5127 0 R ->> -endobj - -576 0 obj -<< - /Type /StructElem - /S /Link - /P 575 0 R - /K [109 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5126 0 R - >>] - /Pg 5127 0 R ->> -endobj - -577 0 obj -<< - /Type /StructElem - /S /Em - /P 575 0 R - /K [106 107] - /Pg 5127 0 R ->> -endobj - -578 0 obj -<< - /Type /StructElem - /S /Lbl - /P 573 0 R - /K [579 0 R] ->> -endobj - -579 0 obj -<< - /Type /StructElem - /S /Link - /P 578 0 R - /K [104 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5125 0 R - >>] - /Pg 5127 0 R ->> -endobj - -580 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [585 0 R 581 0 R] ->> -endobj - -581 0 obj -<< - /Type /StructElem - /S /LBody - /P 580 0 R - /K [582 0 R] ->> -endobj - -582 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 581 0 R - /K [98 584 0 R 100 101 583 0 R 103] - /Pg 5127 0 R ->> -endobj - -583 0 obj -<< - /Type /StructElem - /S /Link - /P 582 0 R - /K [102 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5124 0 R - >>] - /Pg 5127 0 R ->> -endobj - -584 0 obj -<< - /Type /StructElem - /S /Em - /P 582 0 R - /K [99] - /Pg 5127 0 R ->> -endobj - -585 0 obj -<< - /Type /StructElem - /S /Lbl - /P 580 0 R - /K [586 0 R] ->> -endobj - -586 0 obj -<< - /Type /StructElem - /S /Link - /P 585 0 R - /K [97 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5123 0 R - >>] - /Pg 5127 0 R ->> -endobj - -587 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [592 0 R 588 0 R] ->> -endobj - -588 0 obj -<< - /Type /StructElem - /S /LBody - /P 587 0 R - /K [589 0 R] ->> -endobj - -589 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 588 0 R - /K [90 591 0 R 93 94 590 0 R 96] - /Pg 5127 0 R ->> -endobj - -590 0 obj -<< - /Type /StructElem - /S /Link - /P 589 0 R - /K [95 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5122 0 R - >>] - /Pg 5127 0 R ->> -endobj - -591 0 obj -<< - /Type /StructElem - /S /Em - /P 589 0 R - /K [91 92] - /Pg 5127 0 R ->> -endobj - -592 0 obj -<< - /Type /StructElem - /S /Lbl - /P 587 0 R - /K [593 0 R] ->> -endobj - -593 0 obj -<< - /Type /StructElem - /S /Link - /P 592 0 R - /K [89 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5121 0 R - >>] - /Pg 5127 0 R ->> -endobj - -594 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [599 0 R 595 0 R] ->> -endobj - -595 0 obj -<< - /Type /StructElem - /S /LBody - /P 594 0 R - /K [596 0 R] ->> -endobj - -596 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 595 0 R - /K [83 84 598 0 R 86 597 0 R 88] - /Pg 5127 0 R ->> -endobj - -597 0 obj -<< - /Type /StructElem - /S /Link - /P 596 0 R - /K [87 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5120 0 R - >>] - /Pg 5127 0 R ->> -endobj - -598 0 obj -<< - /Type /StructElem - /S /Em - /P 596 0 R - /K [85] - /Pg 5127 0 R ->> -endobj - -599 0 obj -<< - /Type /StructElem - /S /Lbl - /P 594 0 R - /K [600 0 R] ->> -endobj - -600 0 obj -<< - /Type /StructElem - /S /Link - /P 599 0 R - /K [82 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5119 0 R - >>] - /Pg 5127 0 R ->> -endobj - -601 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [606 0 R 602 0 R] ->> -endobj - -602 0 obj -<< - /Type /StructElem - /S /LBody - /P 601 0 R - /K [603 0 R] ->> -endobj - -603 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 602 0 R - /K [75 76 605 0 R 79 604 0 R 81] - /Pg 5127 0 R ->> -endobj - -604 0 obj -<< - /Type /StructElem - /S /Link - /P 603 0 R - /K [80 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5118 0 R - >>] - /Pg 5127 0 R ->> -endobj - -605 0 obj -<< - /Type /StructElem - /S /Em - /P 603 0 R - /K [77 78] - /Pg 5127 0 R ->> -endobj - -606 0 obj -<< - /Type /StructElem - /S /Lbl - /P 601 0 R - /K [607 0 R] ->> -endobj - -607 0 obj -<< - /Type /StructElem - /S /Link - /P 606 0 R - /K [74 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5117 0 R - >>] - /Pg 5127 0 R ->> -endobj - -608 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [613 0 R 609 0 R] ->> -endobj - -609 0 obj -<< - /Type /StructElem - /S /LBody - /P 608 0 R - /K [610 0 R] ->> -endobj - -610 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 609 0 R - /K [67 612 0 R 71 611 0 R 73] - /Pg 5127 0 R ->> -endobj - -611 0 obj -<< - /Type /StructElem - /S /Link - /P 610 0 R - /K [72 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5116 0 R - >>] - /Pg 5127 0 R ->> -endobj - -612 0 obj -<< - /Type /StructElem - /S /Em - /P 610 0 R - /K [68 69 70] - /Pg 5127 0 R ->> -endobj - -613 0 obj -<< - /Type /StructElem - /S /Lbl - /P 608 0 R - /K [614 0 R] ->> -endobj - -614 0 obj -<< - /Type /StructElem - /S /Link - /P 613 0 R - /K [66 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5115 0 R - >>] - /Pg 5127 0 R ->> -endobj - -615 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [620 0 R 616 0 R] ->> -endobj - -616 0 obj -<< - /Type /StructElem - /S /LBody - /P 615 0 R - /K [617 0 R] ->> -endobj - -617 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 616 0 R - /K [58 59 619 0 R 62 63 618 0 R 65] - /Pg 5127 0 R ->> -endobj - -618 0 obj -<< - /Type /StructElem - /S /Link - /P 617 0 R - /K [64 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5114 0 R - >>] - /Pg 5127 0 R ->> -endobj - -619 0 obj -<< - /Type /StructElem - /S /Em - /P 617 0 R - /K [60 61] - /Pg 5127 0 R ->> -endobj - -620 0 obj -<< - /Type /StructElem - /S /Lbl - /P 615 0 R - /K [621 0 R] ->> -endobj - -621 0 obj -<< - /Type /StructElem - /S /Link - /P 620 0 R - /K [57 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5113 0 R - >>] - /Pg 5127 0 R ->> -endobj - -622 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [628 0 R 623 0 R] ->> -endobj - -623 0 obj -<< - /Type /StructElem - /S /LBody - /P 622 0 R - /K [624 0 R] ->> -endobj - -624 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 623 0 R - /K [49 627 0 R 51 626 0 R 54 625 0 R 56] - /Pg 5127 0 R ->> -endobj - -625 0 obj -<< - /Type /StructElem - /S /Link - /P 624 0 R - /K [55 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5112 0 R - >>] - /Pg 5127 0 R ->> -endobj - -626 0 obj -<< - /Type /StructElem - /S /Em - /P 624 0 R - /K [52 53] - /Pg 5127 0 R ->> -endobj - -627 0 obj -<< - /Type /StructElem - /S /Em - /P 624 0 R - /K [50] - /Pg 5127 0 R ->> -endobj - -628 0 obj -<< - /Type /StructElem - /S /Lbl - /P 622 0 R - /K [629 0 R] ->> -endobj - -629 0 obj -<< - /Type /StructElem - /S /Link - /P 628 0 R - /K [48 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5111 0 R - >>] - /Pg 5127 0 R ->> -endobj - -630 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [635 0 R 631 0 R] ->> -endobj - -631 0 obj -<< - /Type /StructElem - /S /LBody - /P 630 0 R - /K [632 0 R] ->> -endobj - -632 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 631 0 R - /K [42 634 0 R 45 633 0 R 47] - /Pg 5127 0 R ->> -endobj - -633 0 obj -<< - /Type /StructElem - /S /Link - /P 632 0 R - /K [46 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5110 0 R - >>] - /Pg 5127 0 R ->> -endobj - -634 0 obj -<< - /Type /StructElem - /S /Em - /P 632 0 R - /K [43 44] - /Pg 5127 0 R ->> -endobj - -635 0 obj -<< - /Type /StructElem - /S /Lbl - /P 630 0 R - /K [636 0 R] ->> -endobj - -636 0 obj -<< - /Type /StructElem - /S /Link - /P 635 0 R - /K [41 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5109 0 R - >>] - /Pg 5127 0 R ->> -endobj - -637 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [642 0 R 638 0 R] ->> -endobj - -638 0 obj -<< - /Type /StructElem - /S /LBody - /P 637 0 R - /K [639 0 R] ->> -endobj - -639 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 638 0 R - /K [34 641 0 R 37 38 640 0 R 40] - /Pg 5127 0 R ->> -endobj - -640 0 obj -<< - /Type /StructElem - /S /Link - /P 639 0 R - /K [39 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5108 0 R - >>] - /Pg 5127 0 R ->> -endobj - -641 0 obj -<< - /Type /StructElem - /S /Em - /P 639 0 R - /K [35 36] - /Pg 5127 0 R ->> -endobj - -642 0 obj -<< - /Type /StructElem - /S /Lbl - /P 637 0 R - /K [643 0 R] ->> -endobj - -643 0 obj -<< - /Type /StructElem - /S /Link - /P 642 0 R - /K [33 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5107 0 R - >>] - /Pg 5127 0 R ->> -endobj - -644 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [649 0 R 645 0 R] ->> -endobj - -645 0 obj -<< - /Type /StructElem - /S /LBody - /P 644 0 R - /K [646 0 R] ->> -endobj - -646 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 645 0 R - /K [25 648 0 R 29 647 0 R 32] - /Pg 5127 0 R ->> -endobj - -647 0 obj -<< - /Type /StructElem - /S /Link - /P 646 0 R - /K [30 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5105 0 R - >> 31 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5106 0 R - >>] - /Pg 5127 0 R ->> -endobj - -648 0 obj -<< - /Type /StructElem - /S /Em - /P 646 0 R - /K [26 27 28] - /Pg 5127 0 R ->> -endobj - -649 0 obj -<< - /Type /StructElem - /S /Lbl - /P 644 0 R - /K [650 0 R] ->> -endobj - -650 0 obj -<< - /Type /StructElem - /S /Link - /P 649 0 R - /K [24 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5104 0 R - >>] - /Pg 5127 0 R ->> -endobj - -651 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [656 0 R 652 0 R] ->> -endobj - -652 0 obj -<< - /Type /StructElem - /S /LBody - /P 651 0 R - /K [653 0 R] ->> -endobj - -653 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 652 0 R - /K [18 655 0 R 20 654 0 R 23] - /Pg 5127 0 R ->> -endobj - -654 0 obj -<< - /Type /StructElem - /S /Link - /P 653 0 R - /K [21 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5102 0 R - >> 22 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5103 0 R - >>] - /Pg 5127 0 R ->> -endobj - -655 0 obj -<< - /Type /StructElem - /S /Em - /P 653 0 R - /K [19] - /Pg 5127 0 R ->> -endobj - -656 0 obj -<< - /Type /StructElem - /S /Lbl - /P 651 0 R - /K [657 0 R] ->> -endobj - -657 0 obj -<< - /Type /StructElem - /S /Link - /P 656 0 R - /K [17 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5101 0 R - >>] - /Pg 5127 0 R ->> -endobj - -658 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [663 0 R 659 0 R] ->> -endobj - -659 0 obj -<< - /Type /StructElem - /S /LBody - /P 658 0 R - /K [660 0 R] ->> -endobj - -660 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 659 0 R - /K [10 662 0 R 13 14 661 0 R 16] - /Pg 5127 0 R ->> -endobj - -661 0 obj -<< - /Type /StructElem - /S /Link - /P 660 0 R - /K [15 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5100 0 R - >>] - /Pg 5127 0 R ->> -endobj - -662 0 obj -<< - /Type /StructElem - /S /Em - /P 660 0 R - /K [11 12] - /Pg 5127 0 R ->> -endobj - -663 0 obj -<< - /Type /StructElem - /S /Lbl - /P 658 0 R - /K [664 0 R] ->> -endobj - -664 0 obj -<< - /Type /StructElem - /S /Link - /P 663 0 R - /K [9 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5099 0 R - >>] - /Pg 5127 0 R ->> -endobj - -665 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [670 0 R 666 0 R] ->> -endobj - -666 0 obj -<< - /Type /StructElem - /S /LBody - /P 665 0 R - /K [667 0 R] ->> -endobj - -667 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 666 0 R - /K [1 669 0 R 4 5 6 668 0 R 8] - /Pg 5127 0 R ->> -endobj - -668 0 obj -<< - /Type /StructElem - /S /Link - /P 667 0 R - /K [7 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5098 0 R - >>] - /Pg 5127 0 R ->> -endobj - -669 0 obj -<< - /Type /StructElem - /S /Em - /P 667 0 R - /K [2 3] - /Pg 5127 0 R ->> -endobj - -670 0 obj -<< - /Type /StructElem - /S /Lbl - /P 665 0 R - /K [671 0 R] ->> -endobj - -671 0 obj -<< - /Type /StructElem - /S /Link - /P 670 0 R - /K [0 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5097 0 R - >>] - /Pg 5127 0 R ->> -endobj - -672 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [676 0 R 673 0 R] ->> -endobj - -673 0 obj -<< - /Type /StructElem - /S /LBody - /P 672 0 R - /K [674 0 R] ->> -endobj - -674 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 673 0 R - /K [107 675 0 R 109 110] - /Pg 5095 0 R ->> -endobj - -675 0 obj -<< - /Type /StructElem - /S /Em - /P 674 0 R - /K [108] - /Pg 5095 0 R ->> -endobj - -676 0 obj -<< - /Type /StructElem - /S /Lbl - /P 672 0 R - /K [677 0 R] ->> -endobj - -677 0 obj -<< - /Type /StructElem - /S /Link - /P 676 0 R - /K [106 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5094 0 R - >>] - /Pg 5095 0 R ->> -endobj - -678 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [683 0 R 679 0 R] ->> -endobj - -679 0 obj -<< - /Type /StructElem - /S /LBody - /P 678 0 R - /K [680 0 R] ->> -endobj - -680 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 679 0 R - /K [98 682 0 R 101 102 103 681 0 R 105] - /Pg 5095 0 R ->> -endobj - -681 0 obj -<< - /Type /StructElem - /S /Link - /P 680 0 R - /K [104 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5093 0 R - >>] - /Pg 5095 0 R ->> -endobj - -682 0 obj -<< - /Type /StructElem - /S /Em - /P 680 0 R - /K [99 100] - /Pg 5095 0 R ->> -endobj - -683 0 obj -<< - /Type /StructElem - /S /Lbl - /P 678 0 R - /K [684 0 R] ->> -endobj - -684 0 obj -<< - /Type /StructElem - /S /Link - /P 683 0 R - /K [97 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5092 0 R - >>] - /Pg 5095 0 R ->> -endobj - -685 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [689 0 R 686 0 R] ->> -endobj - -686 0 obj -<< - /Type /StructElem - /S /LBody - /P 685 0 R - /K [687 0 R] ->> -endobj - -687 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 686 0 R - /K [94 688 0 R 96] - /Pg 5095 0 R ->> -endobj - -688 0 obj -<< - /Type /StructElem - /S /Em - /P 687 0 R - /K [95] - /Pg 5095 0 R ->> -endobj - -689 0 obj -<< - /Type /StructElem - /S /Lbl - /P 685 0 R - /K [690 0 R] ->> -endobj - -690 0 obj -<< - /Type /StructElem - /S /Link - /P 689 0 R - /K [93 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5091 0 R - >>] - /Pg 5095 0 R ->> -endobj - -691 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [696 0 R 692 0 R] ->> -endobj - -692 0 obj -<< - /Type /StructElem - /S /LBody - /P 691 0 R - /K [693 0 R] ->> -endobj - -693 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 692 0 R - /K [87 695 0 R 89 90 694 0 R 92] - /Pg 5095 0 R ->> -endobj - -694 0 obj -<< - /Type /StructElem - /S /Link - /P 693 0 R - /K [91 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5090 0 R - >>] - /Pg 5095 0 R ->> -endobj - -695 0 obj -<< - /Type /StructElem - /S /Em - /P 693 0 R - /K [88] - /Pg 5095 0 R ->> -endobj - -696 0 obj -<< - /Type /StructElem - /S /Lbl - /P 691 0 R - /K [697 0 R] ->> -endobj - -697 0 obj -<< - /Type /StructElem - /S /Link - /P 696 0 R - /K [86 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5089 0 R - >>] - /Pg 5095 0 R ->> -endobj - -698 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [703 0 R 699 0 R] ->> -endobj - -699 0 obj -<< - /Type /StructElem - /S /LBody - /P 698 0 R - /K [700 0 R] ->> -endobj - -700 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 699 0 R - /K [77 78 702 0 R 81 82 83 701 0 R 85] - /Pg 5095 0 R ->> -endobj - -701 0 obj -<< - /Type /StructElem - /S /Link - /P 700 0 R - /K [84 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5088 0 R - >>] - /Pg 5095 0 R ->> -endobj - -702 0 obj -<< - /Type /StructElem - /S /Em - /P 700 0 R - /K [79 80] - /Pg 5095 0 R ->> -endobj - -703 0 obj -<< - /Type /StructElem - /S /Lbl - /P 698 0 R - /K [704 0 R] ->> -endobj - -704 0 obj -<< - /Type /StructElem - /S /Link - /P 703 0 R - /K [76 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5087 0 R - >>] - /Pg 5095 0 R ->> -endobj - -705 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [710 0 R 706 0 R] ->> -endobj - -706 0 obj -<< - /Type /StructElem - /S /LBody - /P 705 0 R - /K [707 0 R] ->> -endobj - -707 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 706 0 R - /K [68 69 709 0 R 72 73 708 0 R 75] - /Pg 5095 0 R ->> -endobj - -708 0 obj -<< - /Type /StructElem - /S /Link - /P 707 0 R - /K [74 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5086 0 R - >>] - /Pg 5095 0 R ->> -endobj - -709 0 obj -<< - /Type /StructElem - /S /Em - /P 707 0 R - /K [70 71] - /Pg 5095 0 R ->> -endobj - -710 0 obj -<< - /Type /StructElem - /S /Lbl - /P 705 0 R - /K [711 0 R] ->> -endobj - -711 0 obj -<< - /Type /StructElem - /S /Link - /P 710 0 R - /K [67 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5085 0 R - >>] - /Pg 5095 0 R ->> -endobj - -712 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [716 0 R 713 0 R] ->> -endobj - -713 0 obj -<< - /Type /StructElem - /S /LBody - /P 712 0 R - /K [714 0 R] ->> -endobj - -714 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 713 0 R - /K [62 715 0 R 65 66] - /Pg 5095 0 R ->> -endobj - -715 0 obj -<< - /Type /StructElem - /S /Em - /P 714 0 R - /K [63 64] - /Pg 5095 0 R ->> -endobj - -716 0 obj -<< - /Type /StructElem - /S /Lbl - /P 712 0 R - /K [717 0 R] ->> -endobj - -717 0 obj -<< - /Type /StructElem - /S /Link - /P 716 0 R - /K [61 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5084 0 R - >>] - /Pg 5095 0 R ->> -endobj - -718 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [723 0 R 719 0 R] ->> -endobj - -719 0 obj -<< - /Type /StructElem - /S /LBody - /P 718 0 R - /K [720 0 R] ->> -endobj - -720 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 719 0 R - /K [55 722 0 R 57 58 721 0 R 60] - /Pg 5095 0 R ->> -endobj - -721 0 obj -<< - /Type /StructElem - /S /Link - /P 720 0 R - /K [59 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5083 0 R - >>] - /Pg 5095 0 R ->> -endobj - -722 0 obj -<< - /Type /StructElem - /S /Em - /P 720 0 R - /K [56] - /Pg 5095 0 R ->> -endobj - -723 0 obj -<< - /Type /StructElem - /S /Lbl - /P 718 0 R - /K [724 0 R] ->> -endobj - -724 0 obj -<< - /Type /StructElem - /S /Link - /P 723 0 R - /K [54 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5082 0 R - >>] - /Pg 5095 0 R ->> -endobj - -725 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [728 0 R 726 0 R] ->> -endobj - -726 0 obj -<< - /Type /StructElem - /S /LBody - /P 725 0 R - /K [727 0 R] ->> -endobj - -727 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 726 0 R - /K [52 53] - /Pg 5095 0 R ->> -endobj - -728 0 obj -<< - /Type /StructElem - /S /Lbl - /P 725 0 R - /K [729 0 R] ->> -endobj - -729 0 obj -<< - /Type /StructElem - /S /Link - /P 728 0 R - /K [51 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5081 0 R - >>] - /Pg 5095 0 R ->> -endobj - -730 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [734 0 R 731 0 R] ->> -endobj - -731 0 obj -<< - /Type /StructElem - /S /LBody - /P 730 0 R - /K [732 0 R] ->> -endobj - -732 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 731 0 R - /K [46 47 733 0 R 49 50] - /Pg 5095 0 R ->> -endobj - -733 0 obj -<< - /Type /StructElem - /S /Em - /P 732 0 R - /K [48] - /Pg 5095 0 R ->> -endobj - -734 0 obj -<< - /Type /StructElem - /S /Lbl - /P 730 0 R - /K [735 0 R] ->> -endobj - -735 0 obj -<< - /Type /StructElem - /S /Link - /P 734 0 R - /K [45 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5080 0 R - >>] - /Pg 5095 0 R ->> -endobj - -736 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [742 0 R 737 0 R] ->> -endobj - -737 0 obj -<< - /Type /StructElem - /S /LBody - /P 736 0 R - /K [738 0 R] ->> -endobj - -738 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 737 0 R - /K [36 741 0 R 38 39 740 0 R 42 739 0 R 44] - /Pg 5095 0 R ->> -endobj - -739 0 obj -<< - /Type /StructElem - /S /Link - /P 738 0 R - /K [43 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5079 0 R - >>] - /Pg 5095 0 R ->> -endobj - -740 0 obj -<< - /Type /StructElem - /S /Em - /P 738 0 R - /K [40 41] - /Pg 5095 0 R ->> -endobj - -741 0 obj -<< - /Type /StructElem - /S /Em - /P 738 0 R - /K [37] - /Pg 5095 0 R ->> -endobj - -742 0 obj -<< - /Type /StructElem - /S /Lbl - /P 736 0 R - /K [743 0 R] ->> -endobj - -743 0 obj -<< - /Type /StructElem - /S /Link - /P 742 0 R - /K [35 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5078 0 R - >>] - /Pg 5095 0 R ->> -endobj - -744 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [748 0 R 745 0 R] ->> -endobj - -745 0 obj -<< - /Type /StructElem - /S /LBody - /P 744 0 R - /K [746 0 R] ->> -endobj - -746 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 745 0 R - /K [31 32 747 0 R 34] - /Pg 5095 0 R ->> -endobj - -747 0 obj -<< - /Type /StructElem - /S /Em - /P 746 0 R - /K [33] - /Pg 5095 0 R ->> -endobj - -748 0 obj -<< - /Type /StructElem - /S /Lbl - /P 744 0 R - /K [749 0 R] ->> -endobj - -749 0 obj -<< - /Type /StructElem - /S /Link - /P 748 0 R - /K [30 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5077 0 R - >>] - /Pg 5095 0 R ->> -endobj - -750 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [756 0 R 751 0 R] ->> -endobj - -751 0 obj -<< - /Type /StructElem - /S /LBody - /P 750 0 R - /K [752 0 R] ->> -endobj - -752 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 751 0 R - /K [22 755 0 R 24 754 0 R 26 27 753 0 R 29] - /Pg 5095 0 R ->> -endobj - -753 0 obj -<< - /Type /StructElem - /S /Link - /P 752 0 R - /K [28 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5076 0 R - >>] - /Pg 5095 0 R ->> -endobj - -754 0 obj -<< - /Type /StructElem - /S /Em - /P 752 0 R - /K [25] - /Pg 5095 0 R ->> -endobj - -755 0 obj -<< - /Type /StructElem - /S /Em - /P 752 0 R - /K [23] - /Pg 5095 0 R ->> -endobj - -756 0 obj -<< - /Type /StructElem - /S /Lbl - /P 750 0 R - /K [757 0 R] ->> -endobj - -757 0 obj -<< - /Type /StructElem - /S /Link - /P 756 0 R - /K [21 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5075 0 R - >>] - /Pg 5095 0 R ->> -endobj - -758 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [764 0 R 759 0 R] ->> -endobj - -759 0 obj -<< - /Type /StructElem - /S /LBody - /P 758 0 R - /K [760 0 R] ->> -endobj - -760 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 759 0 R - /K [12 763 0 R 14 762 0 R 18 761 0 R 20] - /Pg 5095 0 R ->> -endobj - -761 0 obj -<< - /Type /StructElem - /S /Link - /P 760 0 R - /K [19 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5074 0 R - >>] - /Pg 5095 0 R ->> -endobj - -762 0 obj -<< - /Type /StructElem - /S /Em - /P 760 0 R - /K [15 16 17] - /Pg 5095 0 R ->> -endobj - -763 0 obj -<< - /Type /StructElem - /S /Em - /P 760 0 R - /K [13] - /Pg 5095 0 R ->> -endobj - -764 0 obj -<< - /Type /StructElem - /S /Lbl - /P 758 0 R - /K [765 0 R] ->> -endobj - -765 0 obj -<< - /Type /StructElem - /S /Link - /P 764 0 R - /K [11 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5073 0 R - >>] - /Pg 5095 0 R ->> -endobj - -766 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [770 0 R 767 0 R] ->> -endobj - -767 0 obj -<< - /Type /StructElem - /S /LBody - /P 766 0 R - /K [768 0 R] ->> -endobj - -768 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 767 0 R - /K [6 7 8 769 0 R] - /Pg 5095 0 R ->> -endobj - -769 0 obj -<< - /Type /StructElem - /S /Link - /P 768 0 R - /K [9 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5071 0 R - >> 10 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5072 0 R - >>] - /Pg 5095 0 R ->> -endobj - -770 0 obj -<< - /Type /StructElem - /S /Lbl - /P 766 0 R - /K [771 0 R] ->> -endobj - -771 0 obj -<< - /Type /StructElem - /S /Link - /P 770 0 R - /K [5 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5070 0 R - >>] - /Pg 5095 0 R ->> -endobj - -772 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [776 0 R 773 0 R] ->> -endobj - -773 0 obj -<< - /Type /StructElem - /S /LBody - /P 772 0 R - /K [774 0 R] ->> -endobj - -774 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 773 0 R - /K [1 2 3 775 0 R] - /Pg 5095 0 R ->> -endobj - -775 0 obj -<< - /Type /StructElem - /S /Link - /P 774 0 R - /K [4 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5069 0 R - >>] - /Pg 5095 0 R ->> -endobj - -776 0 obj -<< - /Type /StructElem - /S /Lbl - /P 772 0 R - /K [777 0 R] ->> -endobj - -777 0 obj -<< - /Type /StructElem - /S /Link - /P 776 0 R - /K [0 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5068 0 R - >>] - /Pg 5095 0 R ->> -endobj - -778 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [782 0 R 779 0 R] ->> -endobj - -779 0 obj -<< - /Type /StructElem - /S /LBody - /P 778 0 R - /K [780 0 R] ->> -endobj - -780 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 779 0 R - /K [76 781 0 R 78 79] - /Pg 5066 0 R ->> -endobj - -781 0 obj -<< - /Type /StructElem - /S /Em - /P 780 0 R - /K [77] - /Pg 5066 0 R ->> -endobj - -782 0 obj -<< - /Type /StructElem - /S /Lbl - /P 778 0 R - /K [783 0 R] ->> -endobj - -783 0 obj -<< - /Type /StructElem - /S /Link - /P 782 0 R - /K [75 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5065 0 R - >>] - /Pg 5066 0 R ->> -endobj - -784 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [789 0 R 785 0 R] ->> -endobj - -785 0 obj -<< - /Type /StructElem - /S /LBody - /P 784 0 R - /K [786 0 R] ->> -endobj - -786 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 785 0 R - /K [67 68 788 0 R 71 72 787 0 R 74] - /Pg 5066 0 R ->> -endobj - -787 0 obj -<< - /Type /StructElem - /S /Link - /P 786 0 R - /K [73 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5064 0 R - >>] - /Pg 5066 0 R ->> -endobj - -788 0 obj -<< - /Type /StructElem - /S /Em - /P 786 0 R - /K [69 70] - /Pg 5066 0 R ->> -endobj - -789 0 obj -<< - /Type /StructElem - /S /Lbl - /P 784 0 R - /K [790 0 R] ->> -endobj - -790 0 obj -<< - /Type /StructElem - /S /Link - /P 789 0 R - /K [66 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5063 0 R - >>] - /Pg 5066 0 R ->> -endobj - -791 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [795 0 R 792 0 R] ->> -endobj - -792 0 obj -<< - /Type /StructElem - /S /LBody - /P 791 0 R - /K [793 0 R] ->> -endobj - -793 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 792 0 R - /K [63 794 0 R 65] - /Pg 5066 0 R ->> -endobj - -794 0 obj -<< - /Type /StructElem - /S /Em - /P 793 0 R - /K [64] - /Pg 5066 0 R ->> -endobj - -795 0 obj -<< - /Type /StructElem - /S /Lbl - /P 791 0 R - /K [796 0 R] ->> -endobj - -796 0 obj -<< - /Type /StructElem - /S /Link - /P 795 0 R - /K [62 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5062 0 R - >>] - /Pg 5066 0 R ->> -endobj - -797 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [802 0 R 798 0 R] ->> -endobj - -798 0 obj -<< - /Type /StructElem - /S /LBody - /P 797 0 R - /K [799 0 R] ->> -endobj - -799 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 798 0 R - /K [55 56 57 801 0 R 59 800 0 R 61] - /Pg 5066 0 R ->> -endobj - -800 0 obj -<< - /Type /StructElem - /S /Link - /P 799 0 R - /K [60 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5061 0 R - >>] - /Pg 5066 0 R ->> -endobj - -801 0 obj -<< - /Type /StructElem - /S /Em - /P 799 0 R - /K [58] - /Pg 5066 0 R ->> -endobj - -802 0 obj -<< - /Type /StructElem - /S /Lbl - /P 797 0 R - /K [803 0 R] ->> -endobj - -803 0 obj -<< - /Type /StructElem - /S /Link - /P 802 0 R - /K [54 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5060 0 R - >>] - /Pg 5066 0 R ->> -endobj - -804 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [809 0 R 805 0 R] ->> -endobj - -805 0 obj -<< - /Type /StructElem - /S /LBody - /P 804 0 R - /K [806 0 R] ->> -endobj - -806 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 805 0 R - /K [48 808 0 R 50 51 807 0 R 53] - /Pg 5066 0 R ->> -endobj - -807 0 obj -<< - /Type /StructElem - /S /Link - /P 806 0 R - /K [52 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5059 0 R - >>] - /Pg 5066 0 R ->> -endobj - -808 0 obj -<< - /Type /StructElem - /S /Em - /P 806 0 R - /K [49] - /Pg 5066 0 R ->> -endobj - -809 0 obj -<< - /Type /StructElem - /S /Lbl - /P 804 0 R - /K [810 0 R] ->> -endobj - -810 0 obj -<< - /Type /StructElem - /S /Link - /P 809 0 R - /K [47 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5058 0 R - >>] - /Pg 5066 0 R ->> -endobj - -811 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [816 0 R 812 0 R] ->> -endobj - -812 0 obj -<< - /Type /StructElem - /S /LBody - /P 811 0 R - /K [813 0 R] ->> -endobj - -813 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 812 0 R - /K [40 815 0 R 44 814 0 R 46] - /Pg 5066 0 R ->> -endobj - -814 0 obj -<< - /Type /StructElem - /S /Link - /P 813 0 R - /K [45 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5057 0 R - >>] - /Pg 5066 0 R ->> -endobj - -815 0 obj -<< - /Type /StructElem - /S /Em - /P 813 0 R - /K [41 42 43] - /Pg 5066 0 R ->> -endobj - -816 0 obj -<< - /Type /StructElem - /S /Lbl - /P 811 0 R - /K [817 0 R] ->> -endobj - -817 0 obj -<< - /Type /StructElem - /S /Link - /P 816 0 R - /K [39 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5056 0 R - >>] - /Pg 5066 0 R ->> -endobj - -818 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (References) - /K [38] - /Pg 5066 0 R ->> -endobj - -819 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [28 29 820 0 R 31 32 33 34 35 36 37] - /Pg 5066 0 R ->> -endobj - -820 0 obj -<< - /Type /StructElem - /S /Link - /P 819 0 R - /K [30 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5055 0 R - >>] - /Pg 5066 0 R ->> -endobj - -821 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [7 8 825 0 R 10 11 12 13 824 0 R 15 16 17 823 0 R 19 20 822 0 R 23 24 25 26 27] - /Pg 5066 0 R ->> -endobj - -822 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [21 22] - /Pg 5066 0 R ->> -endobj - -823 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [18] - /Pg 5066 0 R ->> -endobj - -824 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [14] - /Pg 5066 0 R ->> -endobj - -825 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [9] - /Pg 5066 0 R ->> -endobj - -826 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Conclusion) - /K [5 6] - /Pg 5066 0 R ->> -endobj - -827 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [835 0 R 118 119 834 0 R 121 122 123 124 125 833 0 R 127 832 0 R 129 130 131 831 0 R 133 134 135 136 830 0 R 138 139 829 0 R 828 0 R << - /Type /MCR - /MCID 1 - /Pg 5066 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 5066 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 5066 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 5066 0 R - >>] - /Pg 5053 0 R ->> -endobj - -828 0 obj -<< - /Type /StructElem - /S /Em - /P 827 0 R - /K [0] - /Pg 5066 0 R ->> -endobj - -829 0 obj -<< - /Type /StructElem - /S /Em - /P 827 0 R - /K [140] - /Pg 5053 0 R ->> -endobj - -830 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [137 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5052 0 R - >>] - /Pg 5053 0 R ->> -endobj - -831 0 obj -<< - /Type /StructElem - /S /Em - /P 827 0 R - /K [132] - /Pg 5053 0 R ->> -endobj - -832 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [128 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5051 0 R - >>] - /Pg 5053 0 R ->> -endobj - -833 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [126 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5050 0 R - >>] - /Pg 5053 0 R ->> -endobj - -834 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [120 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5049 0 R - >>] - /Pg 5053 0 R ->> -endobj - -835 0 obj -<< - /Type /StructElem - /S /Strong - /P 827 0 R - /K [117] - /Pg 5053 0 R ->> -endobj - -836 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [846 0 R 77 78 79 845 0 R 81 844 0 R 83 84 85 86 87 88 843 0 R 90 91 92 93 842 0 R 95 841 0 R 97 98 840 0 R 100 101 102 103 839 0 R 105 106 107 108 109 110 111 838 0 R 113 114 837 0 R 116] - /Pg 5053 0 R ->> -endobj - -837 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [115 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5048 0 R - >>] - /Pg 5053 0 R ->> -endobj - -838 0 obj -<< - /Type /StructElem - /S /Code - /P 836 0 R - /K [112] - /Pg 5053 0 R ->> -endobj - -839 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [104 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5047 0 R - >>] - /Pg 5053 0 R ->> -endobj - -840 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [99 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5046 0 R - >>] - /Pg 5053 0 R ->> -endobj - -841 0 obj -<< - /Type /StructElem - /S /Code - /P 836 0 R - /K [96] - /Pg 5053 0 R ->> -endobj - -842 0 obj -<< - /Type /StructElem - /S /Code - /P 836 0 R - /K [94] - /Pg 5053 0 R ->> -endobj - -843 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [89 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5045 0 R - >>] - /Pg 5053 0 R ->> -endobj - -844 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [82 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5044 0 R - >>] - /Pg 5053 0 R ->> -endobj - -845 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [80 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5043 0 R - >>] - /Pg 5053 0 R ->> -endobj - -846 0 obj -<< - /Type /StructElem - /S /Strong - /P 836 0 R - /K [76] - /Pg 5053 0 R ->> -endobj - -847 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [853 0 R 51 52 53 852 0 R 55 56 57 851 0 R 59 60 61 62 850 0 R 64 849 0 R 66 67 68 69 70 71 848 0 R 73 74 75] - /Pg 5053 0 R ->> -endobj - -848 0 obj -<< - /Type /StructElem - /S /Link - /P 847 0 R - /K [72 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5042 0 R - >>] - /Pg 5053 0 R ->> -endobj - -849 0 obj -<< - /Type /StructElem - /S /Code - /P 847 0 R - /K [65] - /Pg 5053 0 R ->> -endobj - -850 0 obj -<< - /Type /StructElem - /S /Code - /P 847 0 R - /K [63] - /Pg 5053 0 R ->> -endobj - -851 0 obj -<< - /Type /StructElem - /S /Link - /P 847 0 R - /K [58 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5041 0 R - >>] - /Pg 5053 0 R ->> -endobj - -852 0 obj -<< - /Type /StructElem - /S /Link - /P 847 0 R - /K [54 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5040 0 R - >>] - /Pg 5053 0 R ->> -endobj - -853 0 obj -<< - /Type /StructElem - /S /Strong - /P 847 0 R - /K [50] - /Pg 5053 0 R ->> -endobj - -854 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [46 47 48 49] - /Pg 5053 0 R ->> -endobj - -855 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Spatial Composability) - /K [44 45] - /Pg 5053 0 R ->> -endobj - -856 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [866 0 R 1 2 3 865 0 R 5 864 0 R 7 8 9 10 863 0 R 12 13 14 15 16 862 0 R 18 861 0 R 20 21 22 23 860 0 R 25 26 27 28 859 0 R 30 31 32 858 0 R 34 35 36 857 0 R 38 39 40 41 42 43] - /Pg 5053 0 R ->> -endobj - -857 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [37 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5039 0 R - >>] - /Pg 5053 0 R ->> -endobj - -858 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [33 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5038 0 R - >>] - /Pg 5053 0 R ->> -endobj - -859 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [29 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5037 0 R - >>] - /Pg 5053 0 R ->> -endobj - -860 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [24 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5036 0 R - >>] - /Pg 5053 0 R ->> -endobj - -861 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [19 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5035 0 R - >>] - /Pg 5053 0 R ->> -endobj - -862 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [17 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5034 0 R - >>] - /Pg 5053 0 R ->> -endobj - -863 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [11 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5033 0 R - >>] - /Pg 5053 0 R ->> -endobj - -864 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [6 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5032 0 R - >>] - /Pg 5053 0 R ->> -endobj - -865 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [4 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5031 0 R - >>] - /Pg 5053 0 R ->> -endobj - -866 0 obj -<< - /Type /StructElem - /S /Strong - /P 856 0 R - /K [0] - /Pg 5053 0 R ->> -endobj - -867 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [877 0 R 81 82 83 84 876 0 R 86 87 88 89 875 0 R 91 92 93 874 0 R 95 96 873 0 R 98 99 100 101 102 872 0 R 104 105 106 871 0 R 108 109 110 111 112 870 0 R 114 869 0 R 116 117 868 0 R 119 120 121 122 123 124 125 126 127 128 129 130 131] - /Pg 5029 0 R ->> -endobj - -868 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [118 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5028 0 R - >>] - /Pg 5029 0 R ->> -endobj - -869 0 obj -<< - /Type /StructElem - /S /Code - /P 867 0 R - /K [115] - /Pg 5029 0 R ->> -endobj - -870 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [113 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5027 0 R - >>] - /Pg 5029 0 R ->> -endobj - -871 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [107 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5026 0 R - >>] - /Pg 5029 0 R ->> -endobj - -872 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [103 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5025 0 R - >>] - /Pg 5029 0 R ->> -endobj - -873 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [97 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5024 0 R - >>] - /Pg 5029 0 R ->> -endobj - -874 0 obj -<< - /Type /StructElem - /S /Code - /P 867 0 R - /K [94] - /Pg 5029 0 R ->> -endobj - -875 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [90 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5023 0 R - >>] - /Pg 5029 0 R ->> -endobj - -876 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [85 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5022 0 R - >>] - /Pg 5029 0 R ->> -endobj - -877 0 obj -<< - /Type /StructElem - /S /Strong - /P 867 0 R - /K [80] - /Pg 5029 0 R ->> -endobj - -878 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [895 0 R 4 5 6 7 894 0 R 9 10 893 0 R 12 13 14 892 0 R 16 17 891 0 R 19 20 890 0 R 22 23 24 25 26 27 889 0 R 29 30 31 32 888 0 R 34 35 36 887 0 R 38 39 40 41 42 43 886 0 R 45 46 47 48 49 885 0 R 51 52 53 884 0 R 55 56 57 58 883 0 R 60 61 62 882 0 R 64 65 66 881 0 R 68 880 0 R 70 71 879 0 R 73 74 75 76 77 78 79] - /Pg 5029 0 R ->> -endobj - -879 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [72 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5021 0 R - >>] - /Pg 5029 0 R ->> -endobj - -880 0 obj -<< - /Type /StructElem - /S /Code - /P 878 0 R - /K [69] - /Pg 5029 0 R ->> -endobj - -881 0 obj -<< - /Type /StructElem - /S /Code - /P 878 0 R - /K [67] - /Pg 5029 0 R ->> -endobj - -882 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [63 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5020 0 R - >>] - /Pg 5029 0 R ->> -endobj - -883 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [59 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5019 0 R - >>] - /Pg 5029 0 R ->> -endobj - -884 0 obj -<< - /Type /StructElem - /S /Code - /P 878 0 R - /K [54] - /Pg 5029 0 R ->> -endobj - -885 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [50 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5018 0 R - >>] - /Pg 5029 0 R ->> -endobj - -886 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [44 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5017 0 R - >>] - /Pg 5029 0 R ->> -endobj - -887 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [37 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5016 0 R - >>] - /Pg 5029 0 R ->> -endobj - -888 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [33 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5015 0 R - >>] - /Pg 5029 0 R ->> -endobj - -889 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [28 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5014 0 R - >>] - /Pg 5029 0 R ->> -endobj - -890 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [21 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5013 0 R - >>] - /Pg 5029 0 R ->> -endobj - -891 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [18 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5012 0 R - >>] - /Pg 5029 0 R ->> -endobj - -892 0 obj -<< - /Type /StructElem - /S /Em - /P 878 0 R - /K [15] - /Pg 5029 0 R ->> -endobj - -893 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [11 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5011 0 R - >>] - /Pg 5029 0 R ->> -endobj - -894 0 obj -<< - /Type /StructElem - /S /Em - /P 878 0 R - /K [8] - /Pg 5029 0 R ->> -endobj - -895 0 obj -<< - /Type /StructElem - /S /Strong - /P 878 0 R - /K [3] - /Pg 5029 0 R ->> -endobj - -896 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [89 90 << - /Type /MCR - /MCID 0 - /Pg 5029 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 5029 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 5029 0 R - >>] - /Pg 5009 0 R ->> -endobj - -897 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Temporal Composability) - /K [87 88] - /Pg 5009 0 R ->> -endobj - -898 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [909 0 R 45 46 908 0 R 48 907 0 R 50 51 906 0 R 53 905 0 R 55 904 0 R 57 903 0 R 59 60 61 62 63 64 902 0 R 67 68 69 70 71 72 901 0 R 74 75 76 77 78 900 0 R 80 899 0 R 82 83 84 85 86] - /Pg 5009 0 R ->> -endobj - -899 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [81 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5008 0 R - >>] - /Pg 5009 0 R ->> -endobj - -900 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [79 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5007 0 R - >>] - /Pg 5009 0 R ->> -endobj - -901 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [73] - /Pg 5009 0 R ->> -endobj - -902 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [65 66] - /Pg 5009 0 R ->> -endobj - -903 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [58] - /Pg 5009 0 R ->> -endobj - -904 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [56] - /Pg 5009 0 R ->> -endobj - -905 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [54] - /Pg 5009 0 R ->> -endobj - -906 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [52] - /Pg 5009 0 R ->> -endobj - -907 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [49 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5006 0 R - >>] - /Pg 5009 0 R ->> -endobj - -908 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [47 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5005 0 R - >>] - /Pg 5009 0 R ->> -endobj - -909 0 obj -<< - /Type /StructElem - /S /Strong - /P 898 0 R - /K [44] - /Pg 5009 0 R ->> -endobj - -910 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [917 0 R 9 10 916 0 R 12 915 0 R 14 15 914 0 R 17 18 19 20 21 22 913 0 R 24 25 26 27 28 29 30 912 0 R 33 34 911 0 R 36 37 38 39 40 41 42 43] - /Pg 5009 0 R ->> -endobj - -911 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [35 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5004 0 R - >>] - /Pg 5009 0 R ->> -endobj - -912 0 obj -<< - /Type /StructElem - /S /Formula - /P 910 0 R - /K [31 32] - /Pg 5009 0 R ->> -endobj - -913 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [23 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5003 0 R - >>] - /Pg 5009 0 R ->> -endobj - -914 0 obj -<< - /Type /StructElem - /S /Em - /P 910 0 R - /K [16] - /Pg 5009 0 R ->> -endobj - -915 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [13 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5002 0 R - >>] - /Pg 5009 0 R ->> -endobj - -916 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [11 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5001 0 R - >>] - /Pg 5009 0 R ->> -endobj - -917 0 obj -<< - /Type /StructElem - /S /Strong - /P 910 0 R - /K [8] - /Pg 5009 0 R ->> -endobj - -918 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [919 0 R 5 6 7] - /Pg 5009 0 R ->> -endobj - -919 0 obj -<< - /Type /StructElem - /S /Link - /P 918 0 R - /K [4 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5000 0 R - >>] - /Pg 5009 0 R ->> -endobj - -920 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Programming Paradigms) - /K [2 3] - /Pg 5009 0 R ->> -endobj - -921 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [927 0 R 69 70 926 0 R 72 73 925 0 R 76 77 78 79 80 81 924 0 R 83 923 0 R 85 86 87 922 0 R 89 90 91 92 << - /Type /MCR - /MCID 0 - /Pg 5009 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 5009 0 R - >>] - /Pg 4998 0 R ->> -endobj - -922 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [88 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4997 0 R - >>] - /Pg 4998 0 R ->> -endobj - -923 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [84 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4996 0 R - >>] - /Pg 4998 0 R ->> -endobj - -924 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [82 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4995 0 R - >>] - /Pg 4998 0 R ->> -endobj - -925 0 obj -<< - /Type /StructElem - /S /Em - /P 921 0 R - /K [74 75] - /Pg 4998 0 R ->> -endobj - -926 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [71 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4994 0 R - >>] - /Pg 4998 0 R ->> -endobj - -927 0 obj -<< - /Type /StructElem - /S /Strong - /P 921 0 R - /K [68] - /Pg 4998 0 R ->> -endobj - -928 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [933 0 R 47 48 49 932 0 R 51 52 53 931 0 R 55 930 0 R 57 58 59 60 61 62 63 64 65 929 0 R 67] - /Pg 4998 0 R ->> -endobj - -929 0 obj -<< - /Type /StructElem - /S /Link - /P 928 0 R - /K [66 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4993 0 R - >>] - /Pg 4998 0 R ->> -endobj - -930 0 obj -<< - /Type /StructElem - /S /Em - /P 928 0 R - /K [56] - /Pg 4998 0 R ->> -endobj - -931 0 obj -<< - /Type /StructElem - /S /Em - /P 928 0 R - /K [54] - /Pg 4998 0 R ->> -endobj - -932 0 obj -<< - /Type /StructElem - /S /Link - /P 928 0 R - /K [50 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4992 0 R - >>] - /Pg 4998 0 R ->> -endobj - -933 0 obj -<< - /Type /StructElem - /S /Strong - /P 928 0 R - /K [46] - /Pg 4998 0 R ->> -endobj - -934 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [942 0 R 12 941 0 R 14 15 16 940 0 R 18 19 939 0 R 21 938 0 R 23 24 25 26 27 937 0 R 29 30 31 32 33 34 35 936 0 R 37 38 935 0 R 40 41 42 43 44 45] - /Pg 4998 0 R ->> -endobj - -935 0 obj -<< - /Type /StructElem - /S /Em - /P 934 0 R - /K [39] - /Pg 4998 0 R ->> -endobj - -936 0 obj -<< - /Type /StructElem - /S /Em - /P 934 0 R - /K [36] - /Pg 4998 0 R ->> -endobj - -937 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [28 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4991 0 R - >>] - /Pg 4998 0 R ->> -endobj - -938 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [22 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4990 0 R - >>] - /Pg 4998 0 R ->> -endobj - -939 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [20 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4989 0 R - >>] - /Pg 4998 0 R ->> -endobj - -940 0 obj -<< - /Type /StructElem - /S /Em - /P 934 0 R - /K [17] - /Pg 4998 0 R ->> -endobj - -941 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [13 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4988 0 R - >>] - /Pg 4998 0 R ->> -endobj - -942 0 obj -<< - /Type /StructElem - /S /Strong - /P 934 0 R - /K [11] - /Pg 4998 0 R ->> -endobj - -943 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [944 0 R 7 8 9 10] - /Pg 4998 0 R ->> -endobj - -944 0 obj -<< - /Type /StructElem - /S /Link - /P 943 0 R - /K [6 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4987 0 R - >>] - /Pg 4998 0 R ->> -endobj - -945 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Effect and Coeffect Systems) - /K [4 5] - /Pg 4998 0 R ->> -endobj - -946 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3] - /Pg 4998 0 R ->> -endobj - -947 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Related Work) - /K [0 1] - /Pg 4998 0 R ->> -endobj - -948 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [114 115 116] - /Pg 4985 0 R ->> -endobj - -949 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [955 0 R 81 82 83 954 0 R 90 91 92 93 953 0 R 95 96 97 98 99 100 101 952 0 R 103 104 105 951 0 R 107 108 109 110 950 0 R 112 113] - /Pg 4985 0 R ->> -endobj - -950 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [111 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4984 0 R - >>] - /Pg 4985 0 R ->> -endobj - -951 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [106 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4983 0 R - >>] - /Pg 4985 0 R ->> -endobj - -952 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [102 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4982 0 R - >>] - /Pg 4985 0 R ->> -endobj - -953 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [94 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4981 0 R - >>] - /Pg 4985 0 R ->> -endobj - -954 0 obj -<< - /Type /StructElem - /S /Formula - /P 949 0 R - /K [84 85 86 87 88 89] - /Pg 4985 0 R ->> -endobj - -955 0 obj -<< - /Type /StructElem - /S /Strong - /P 949 0 R - /K [80] - /Pg 4985 0 R ->> -endobj - -956 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [959 0 R 62 63 64 958 0 R 66 67 68 957 0 R 70 71 72 73 74 75 76 77 78 79] - /Pg 4985 0 R ->> -endobj - -957 0 obj -<< - /Type /StructElem - /S /Em - /P 956 0 R - /K [69] - /Pg 4985 0 R ->> -endobj - -958 0 obj -<< - /Type /StructElem - /S /Link - /P 956 0 R - /K [65 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4980 0 R - >>] - /Pg 4985 0 R ->> -endobj - -959 0 obj -<< - /Type /StructElem - /S /Strong - /P 956 0 R - /K [61] - /Pg 4985 0 R ->> -endobj - -960 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [964 0 R 48 963 0 R 50 962 0 R 54 961 0 R 56 57 58 59 60] - /Pg 4985 0 R ->> -endobj - -961 0 obj -<< - /Type /StructElem - /S /Formula - /P 960 0 R - /K [55] - /Pg 4985 0 R ->> -endobj - -962 0 obj -<< - /Type /StructElem - /S /Formula - /P 960 0 R - /K [51 52 53] - /Pg 4985 0 R ->> -endobj - -963 0 obj -<< - /Type /StructElem - /S /Formula - /P 960 0 R - /K [49] - /Pg 4985 0 R ->> -endobj - -964 0 obj -<< - /Type /StructElem - /S /Strong - /P 960 0 R - /K [47] - /Pg 4985 0 R ->> -endobj - -965 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 969 0 R 36 37 968 0 R 39 967 0 R 41 42 966 0 R 44 45 46] - /Pg 4985 0 R ->> -endobj - -966 0 obj -<< - /Type /StructElem - /S /Link - /P 965 0 R - /K [43 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4979 0 R - >>] - /Pg 4985 0 R ->> -endobj - -967 0 obj -<< - /Type /StructElem - /S /Em - /P 965 0 R - /K [40] - /Pg 4985 0 R ->> -endobj - -968 0 obj -<< - /Type /StructElem - /S /Em - /P 965 0 R - /K [38] - /Pg 4985 0 R ->> -endobj - -969 0 obj -<< - /Type /StructElem - /S /Em - /P 965 0 R - /K [35] - /Pg 4985 0 R ->> -endobj - -970 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [972 0 R 26 971 0 R 28 29 30 31 32 33] - /Pg 4985 0 R ->> -endobj - -971 0 obj -<< - /Type /StructElem - /S /Formula - /P 970 0 R - /K [27] - /Pg 4985 0 R ->> -endobj - -972 0 obj -<< - /Type /StructElem - /S /Strong - /P 970 0 R - /K [25] - /Pg 4985 0 R ->> -endobj - -973 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [978 0 R 3 977 0 R 5 6 7 8 976 0 R 10 11 975 0 R 18 19 20 21 974 0 R 23 24] - /Pg 4985 0 R ->> -endobj - -974 0 obj -<< - /Type /StructElem - /S /Link - /P 973 0 R - /K [22 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4978 0 R - >>] - /Pg 4985 0 R ->> -endobj - -975 0 obj -<< - /Type /StructElem - /S /Formula - /P 973 0 R - /K [12 13 14 15 16 17] - /Pg 4985 0 R ->> -endobj - -976 0 obj -<< - /Type /StructElem - /S /Formula - /P 973 0 R - /K [9] - /Pg 4985 0 R ->> -endobj - -977 0 obj -<< - /Type /StructElem - /S /Formula - /P 973 0 R - /K [4] - /Pg 4985 0 R ->> -endobj - -978 0 obj -<< - /Type /StructElem - /S /Strong - /P 973 0 R - /K [2] - /Pg 4985 0 R ->> -endobj - -979 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [63 64 982 0 R 66 981 0 R 68 980 0 R 71 << - /Type /MCR - /MCID 0 - /Pg 4985 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4985 0 R - >>] - /Pg 4976 0 R ->> -endobj - -980 0 obj -<< - /Type /StructElem - /S /Formula - /P 979 0 R - /K [69 70] - /Pg 4976 0 R ->> -endobj - -981 0 obj -<< - /Type /StructElem - /S /Formula - /P 979 0 R - /K [67] - /Pg 4976 0 R ->> -endobj - -982 0 obj -<< - /Type /StructElem - /S /Formula - /P 979 0 R - /K [65] - /Pg 4976 0 R ->> -endobj - -983 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Dependency Typing and Versioning) - /K [61 62] - /Pg 4976 0 R ->> -endobj - -984 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [53 54 55 56 57 58 59 60] - /Pg 4976 0 R ->> -endobj - -985 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [38 39 40 987 0 R 42 43 986 0 R 45 46 47 48 49 50 51 52] - /Pg 4976 0 R ->> -endobj - -986 0 obj -<< - /Type /StructElem - /S /Formula - /P 985 0 R - /K [44] - /Pg 4976 0 R ->> -endobj - -987 0 obj -<< - /Type /StructElem - /S /Formula - /P 985 0 R - /K [41] - /Pg 4976 0 R ->> -endobj - -988 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [26 27 28 29 30 31 32 33 34 35 36 37] - /Pg 4976 0 R ->> -endobj - -989 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [10 11 995 0 R 13 994 0 R 15 993 0 R 17 992 0 R 19 991 0 R 21 990 0 R 23 24 25] - /Pg 4976 0 R ->> -endobj - -990 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [22] - /Pg 4976 0 R ->> -endobj - -991 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [20] - /Pg 4976 0 R ->> -endobj - -992 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [18] - /Pg 4976 0 R ->> -endobj - -993 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [16] - /Pg 4976 0 R ->> -endobj - -994 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [14] - /Pg 4976 0 R ->> -endobj - -995 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [12] - /Pg 4976 0 R ->> -endobj - -996 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Mutual Dependencies and Component Granularity) - /K [8 9] - /Pg 4976 0 R ->> -endobj - -997 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [108 109 110 999 0 R 112 113 << - /Type /MCR - /MCID 0 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 4976 0 R - >> 998 0 R << - /Type /MCR - /MCID 4 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4976 0 R - >>] - /Pg 4973 0 R ->> -endobj - -998 0 obj -<< - /Type /StructElem - /S /Link - /P 997 0 R - /K [3 << - /Type /OBJR - /Pg 4976 0 R - /Obj 4975 0 R - >>] - /Pg 4976 0 R ->> -endobj - -999 0 obj -<< - /Type /StructElem - /S /Link - /P 997 0 R - /K [111 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4971 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1000 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [84 85 86 87 1006 0 R 89 90 1005 0 R 92 93 94 1004 0 R 96 97 1003 0 R 99 100 101 1002 0 R 103 1001 0 R 105 106 107] - /Pg 4973 0 R ->> -endobj - -1001 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [104 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4970 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1002 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [102 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4969 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1003 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [98 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4968 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1004 0 obj -<< - /Type /StructElem - /S /Code - /P 1000 0 R - /K [95] - /Pg 4973 0 R ->> -endobj - -1005 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [91 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4967 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1006 0 obj -<< - /Type /StructElem - /S /Code - /P 1000 0 R - /K [88] - /Pg 4973 0 R ->> -endobj - -1007 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [56 57 58 1014 0 R 60 61 1013 0 R 63 64 65 66 1012 0 R 68 69 70 1011 0 R 72 1010 0 R 74 75 1009 0 R 77 78 79 1008 0 R 81 82 83] - /Pg 4973 0 R ->> -endobj - -1008 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [80 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4966 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1009 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [76 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4965 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1010 0 obj -<< - /Type /StructElem - /S /Code - /P 1007 0 R - /K [73] - /Pg 4973 0 R ->> -endobj - -1011 0 obj -<< - /Type /StructElem - /S /Code - /P 1007 0 R - /K [71] - /Pg 4973 0 R ->> -endobj - -1012 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [67 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4964 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1013 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [62 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4963 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1014 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [59 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4962 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1015 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1019 0 R 44 45 46 47 1018 0 R 49 50 51 1017 0 R 53 1016 0 R 55] - /Pg 4973 0 R ->> -endobj - -1016 0 obj -<< - /Type /StructElem - /S /Em - /P 1015 0 R - /K [54] - /Pg 4973 0 R ->> -endobj - -1017 0 obj -<< - /Type /StructElem - /S /Em - /P 1015 0 R - /K [52] - /Pg 4973 0 R ->> -endobj - -1018 0 obj -<< - /Type /StructElem - /S /Link - /P 1015 0 R - /K [48 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4961 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1019 0 obj -<< - /Type /StructElem - /S /Strong - /P 1015 0 R - /K [43] - /Pg 4973 0 R ->> -endobj - -1020 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [18 19 20 21 1031 0 R 1026 0 R 23 24 1025 0 R 26 1024 0 R 28 29 1023 0 R 31 1022 0 R 33 34 1021 0 R 36 37 38 39 40 41 42] - /Pg 4973 0 R ->> -endobj - -1021 0 obj -<< - /Type /StructElem - /S /Link - /P 1020 0 R - /K [35 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4960 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1022 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [32] - /Pg 4973 0 R ->> -endobj - -1023 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [30] - /Pg 4973 0 R ->> -endobj - -1024 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [27] - /Pg 4973 0 R ->> -endobj - -1025 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [25] - /Pg 4973 0 R ->> -endobj - -1026 0 obj -<< - /Type /StructElem - /S /Note - /P 1020 0 R - /ID (Note 6) - /K [1028 0 R 115 1027 0 R 117 118] - /Pg 4973 0 R ->> -endobj - -1027 0 obj -<< - /Type /StructElem - /S /Code - /P 1026 0 R - /K [116] - /Pg 4973 0 R ->> -endobj - -1028 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1026 0 R - /K [1029 0 R] ->> -endobj - -1029 0 obj -<< - /Type /StructElem - /S /Link - /P 1028 0 R - /K [<< - /Type /OBJR - /Pg 4973 0 R - /Obj 4972 0 R - >> 1030 0 R] ->> -endobj - -1030 0 obj -<< - /Type /StructElem - /S /Span - /P 1029 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [114] - /Pg 4973 0 R ->> -endobj - -1031 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1020 0 R - /K [1032 0 R] ->> -endobj - -1032 0 obj -<< - /Type /StructElem - /S /Link - /P 1031 0 R - /K [<< - /Type /OBJR - /Pg 4973 0 R - /Obj 4959 0 R - >> 1033 0 R] ->> -endobj - -1033 0 obj -<< - /Type /StructElem - /S /Span - /P 1032 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [22] - /Pg 4973 0 R ->> -endobj - -1034 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1036 0 R 12 1035 0 R 14 15 16 17] - /Pg 4973 0 R ->> -endobj - -1035 0 obj -<< - /Type /StructElem - /S /Em - /P 1034 0 R - /K [13] - /Pg 4973 0 R ->> -endobj - -1036 0 obj -<< - /Type /StructElem - /S /Strong - /P 1034 0 R - /K [11] - /Pg 4973 0 R ->> -endobj - -1037 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [7 8 9 10] - /Pg 4973 0 R ->> -endobj - -1038 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Language Independence and Selection) - /K [5 6] - /Pg 4973 0 R ->> -endobj - -1039 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1043 0 R 60 61 62 63 64 65 66 1042 0 R 68 69 70 71 1041 0 R 73 74 75 << - /Type /MCR - /MCID 0 - /Pg 4973 0 R - >> 1040 0 R << - /Type /MCR - /MCID 2 - /Pg 4973 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4973 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4973 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1040 0 obj -<< - /Type /StructElem - /S /Link - /P 1039 0 R - /K [1 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4958 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1041 0 obj -<< - /Type /StructElem - /S /Link - /P 1039 0 R - /K [72 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4955 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1042 0 obj -<< - /Type /StructElem - /S /Link - /P 1039 0 R - /K [67 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4954 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1043 0 obj -<< - /Type /StructElem - /S /Strong - /P 1039 0 R - /K [59] - /Pg 4956 0 R ->> -endobj - -1044 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [46 47 1045 0 R 49 50 51 52 53 54 55 56 57 58] - /Pg 4956 0 R ->> -endobj - -1045 0 obj -<< - /Type /StructElem - /S /Link - /P 1044 0 R - /K [48 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4953 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1046 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1051 0 R 27 1050 0 R 29 30 31 32 33 1049 0 R 35 1048 0 R 37 38 39 1047 0 R 41 42 43 44 45] - /Pg 4956 0 R ->> -endobj - -1047 0 obj -<< - /Type /StructElem - /S /Code - /P 1046 0 R - /K [40] - /Pg 4956 0 R ->> -endobj - -1048 0 obj -<< - /Type /StructElem - /S /Link - /P 1046 0 R - /K [36 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4952 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1049 0 obj -<< - /Type /StructElem - /S /Link - /P 1046 0 R - /K [34 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4951 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1050 0 obj -<< - /Type /StructElem - /S /Link - /P 1046 0 R - /K [28 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4950 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1051 0 obj -<< - /Type /StructElem - /S /Strong - /P 1046 0 R - /K [26] - /Pg 4956 0 R ->> -endobj - -1052 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [21 22 23 24 25] - /Pg 4956 0 R ->> -endobj - -1053 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Access Control and Sandboxing) - /K [19 20] - /Pg 4956 0 R ->> -endobj - -1054 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1056 0 R 8 9 1055 0 R 11 12 13 14 15 16 17 18] - /Pg 4956 0 R ->> -endobj - -1055 0 obj -<< - /Type /StructElem - /S /Link - /P 1054 0 R - /K [10 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4949 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1056 0 obj -<< - /Type /StructElem - /S /Strong - /P 1054 0 R - /K [7] - /Pg 4956 0 R ->> -endobj - -1057 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1061 0 R 66 67 68 1060 0 R 70 1059 0 R 72 73 << - /Type /MCR - /MCID 0 - /Pg 4956 0 R - >> 1058 0 R << - /Type /MCR - /MCID 2 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4956 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1058 0 obj -<< - /Type /StructElem - /S /Code - /P 1057 0 R - /K [1] - /Pg 4956 0 R ->> -endobj - -1059 0 obj -<< - /Type /StructElem - /S /Link - /P 1057 0 R - /K [71 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4946 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1060 0 obj -<< - /Type /StructElem - /S /Link - /P 1057 0 R - /K [69 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4945 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1061 0 obj -<< - /Type /StructElem - /S /Strong - /P 1057 0 R - /K [65] - /Pg 4947 0 R ->> -endobj - -1062 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1063 0 R 59 60 61 62 63 64] - /Pg 4947 0 R ->> -endobj - -1063 0 obj -<< - /Type /StructElem - /S /Strong - /P 1062 0 R - /K [58] - /Pg 4947 0 R ->> -endobj - -1064 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [56 57] - /Pg 4947 0 R ->> -endobj - -1065 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [25 26 1073 0 R 28 29 1072 0 R 31 32 33 34 1071 0 R 36 1070 0 R 38 1069 0 R 40 41 1068 0 R 43 44 1067 0 R 46 47 48 49 1066 0 R 51 52 53 54 55] - /Pg 4947 0 R ->> -endobj - -1066 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [50] - /Pg 4947 0 R ->> -endobj - -1067 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [45] - /Pg 4947 0 R ->> -endobj - -1068 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [42] - /Pg 4947 0 R ->> -endobj - -1069 0 obj -<< - /Type /StructElem - /S /Code - /P 1065 0 R - /K [39] - /Pg 4947 0 R ->> -endobj - -1070 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [37] - /Pg 4947 0 R ->> -endobj - -1071 0 obj -<< - /Type /StructElem - /S /Code - /P 1065 0 R - /K [35] - /Pg 4947 0 R ->> -endobj - -1072 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [30] - /Pg 4947 0 R ->> -endobj - -1073 0 obj -<< - /Type /StructElem - /S /Link - /P 1065 0 R - /K [27 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4944 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1074 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Service Multiplexing) - /K [23 24] - /Pg 4947 0 R ->> -endobj - -1075 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [18 19 20 21 22] - /Pg 4947 0 R ->> -endobj - -1076 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Discussion) - /K [16 17] - /Pg 4947 0 R ->> -endobj - -1077 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1078 0 R 9 10 11 12 13 14 15] - /Pg 4947 0 R ->> -endobj - -1078 0 obj -<< - /Type /StructElem - /S /Strong - /P 1077 0 R - /K [8] - /Pg 4947 0 R ->> -endobj - -1079 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1082 0 R 66 1081 0 R 68 69 70 71 << - /Type /MCR - /MCID 0 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4947 0 R - >> 1080 0 R << - /Type /MCR - /MCID 3 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4947 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1080 0 obj -<< - /Type /StructElem - /S /Link - /P 1079 0 R - /K [2 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4943 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1081 0 obj -<< - /Type /StructElem - /S /Link - /P 1079 0 R - /K [67 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4938 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1082 0 obj -<< - /Type /StructElem - /S /Strong - /P 1079 0 R - /K [65] - /Pg 4941 0 R ->> -endobj - -1083 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1087 0 R 48 1086 0 R 50 51 52 53 54 55 56 57 1085 0 R 59 60 61 1084 0 R 63 64] - /Pg 4941 0 R ->> -endobj - -1084 0 obj -<< - /Type /StructElem - /S /Link - /P 1083 0 R - /K [62 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4937 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1085 0 obj -<< - /Type /StructElem - /S /Link - /P 1083 0 R - /K [58 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4936 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1086 0 obj -<< - /Type /StructElem - /S /Link - /P 1083 0 R - /K [49 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4935 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1087 0 obj -<< - /Type /StructElem - /S /Strong - /P 1083 0 R - /K [47] - /Pg 4941 0 R ->> -endobj - -1088 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1091 0 R 33 34 1090 0 R 36 37 38 39 40 1089 0 R 42 43 44 45 46] - /Pg 4941 0 R ->> -endobj - -1089 0 obj -<< - /Type /StructElem - /S /Link - /P 1088 0 R - /K [41 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4934 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1090 0 obj -<< - /Type /StructElem - /S /Link - /P 1088 0 R - /K [35 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4933 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1091 0 obj -<< - /Type /StructElem - /S /Strong - /P 1088 0 R - /K [32] - /Pg 4941 0 R ->> -endobj - -1092 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [23 1106 0 R 1102 0 R 25 26 1099 0 R 1093 0 R 28 29 30 31] - /Pg 4941 0 R ->> -endobj - -1093 0 obj -<< - /Type /StructElem - /S /Note - /P 1092 0 R - /ID (Note 5) - /K [1096 0 R 76 1095 0 R 78 1094 0 R 80] - /Pg 4941 0 R ->> -endobj - -1094 0 obj -<< - /Type /StructElem - /S /Em - /P 1093 0 R - /K [79] - /Pg 4941 0 R ->> -endobj - -1095 0 obj -<< - /Type /StructElem - /S /Em - /P 1093 0 R - /K [77] - /Pg 4941 0 R ->> -endobj - -1096 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1093 0 R - /K [1097 0 R] ->> -endobj - -1097 0 obj -<< - /Type /StructElem - /S /Link - /P 1096 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4940 0 R - >> 1098 0 R] ->> -endobj - -1098 0 obj -<< - /Type /StructElem - /S /Span - /P 1097 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [75] - /Pg 4941 0 R ->> -endobj - -1099 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1092 0 R - /K [1100 0 R] ->> -endobj - -1100 0 obj -<< - /Type /StructElem - /S /Link - /P 1099 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4932 0 R - >> 1101 0 R] ->> -endobj - -1101 0 obj -<< - /Type /StructElem - /S /Span - /P 1100 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [27] - /Pg 4941 0 R ->> -endobj - -1102 0 obj -<< - /Type /StructElem - /S /Note - /P 1092 0 R - /ID (Note 4) - /K [1103 0 R 73 74] - /Pg 4941 0 R ->> -endobj - -1103 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1102 0 R - /K [1104 0 R] ->> -endobj - -1104 0 obj -<< - /Type /StructElem - /S /Link - /P 1103 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4939 0 R - >> 1105 0 R] ->> -endobj - -1105 0 obj -<< - /Type /StructElem - /S /Span - /P 1104 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [72] - /Pg 4941 0 R ->> -endobj - -1106 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1092 0 R - /K [1107 0 R] ->> -endobj - -1107 0 obj -<< - /Type /StructElem - /S /Link - /P 1106 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4931 0 R - >> 1108 0 R] ->> -endobj - -1108 0 obj -<< - /Type /StructElem - /S /Span - /P 1107 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [24] - /Pg 4941 0 R ->> -endobj - -1109 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Case Study: Koishi) - /K [21 22] - /Pg 4941 0 R ->> -endobj - -1110 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [15 16 17 1111 0 R 19 20] - /Pg 4941 0 R ->> -endobj - -1111 0 obj -<< - /Type /StructElem - /S /Code - /P 1110 0 R - /K [18] - /Pg 4941 0 R ->> -endobj - -1112 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1207 0 R 1113 0 R] ->> -endobj - -1113 0 obj -<< - /Type /StructElem - /S /Div - /P 1112 0 R - /K [1206 0 R 1204 0 R 1201 0 R 1199 0 R 1198 0 R 1197 0 R 1193 0 R 1191 0 R 1190 0 R 1188 0 R 1186 0 R 1185 0 R 1184 0 R 1183 0 R 1178 0 R 1176 0 R 1175 0 R 1174 0 R 1173 0 R 1172 0 R 1170 0 R 1168 0 R 1167 0 R 1166 0 R 1165 0 R 1161 0 R 1159 0 R 1158 0 R 1155 0 R 1153 0 R 1152 0 R 1151 0 R 1150 0 R 1148 0 R 1146 0 R 1145 0 R 1144 0 R 1139 0 R 1137 0 R 1136 0 R 1135 0 R 1134 0 R 1133 0 R 1131 0 R 1129 0 R 1128 0 R 1127 0 R 1126 0 R 1122 0 R 1120 0 R 1119 0 R 1118 0 R 1115 0 R 1114 0 R] ->> -endobj - -1114 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1115 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1117 0 R 1116 0 R] ->> -endobj - -1116 0 obj -<< - /Type /StructElem - /S /Span - /P 1115 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4941 0 R ->> -endobj - -1117 0 obj -<< - /Type /StructElem - /S /Strong - /P 1115 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4941 0 R ->> -endobj - -1118 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1119 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1120 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1121 0 R] ->> -endobj - -1121 0 obj -<< - /Type /StructElem - /S /Span - /P 1120 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4941 0 R ->> -endobj - -1122 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1125 0 R 1124 0 R 1123 0 R] ->> -endobj - -1123 0 obj -<< - /Type /StructElem - /S /Span - /P 1122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11] - /Pg 4941 0 R ->> -endobj - -1124 0 obj -<< - /Type /StructElem - /S /Formula - /P 1122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4941 0 R ->> -endobj - -1125 0 obj -<< - /Type /StructElem - /S /Span - /P 1122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4941 0 R ->> -endobj - -1126 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1127 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1128 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1129 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1130 0 R] ->> -endobj - -1130 0 obj -<< - /Type /StructElem - /S /Span - /P 1129 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4941 0 R ->> -endobj - -1131 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1132 0 R] ->> -endobj - -1132 0 obj -<< - /Type /StructElem - /S /Span - /P 1131 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4941 0 R ->> -endobj - -1133 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1134 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1135 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1136 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1137 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1138 0 R] ->> -endobj - -1138 0 obj -<< - /Type /StructElem - /S /Span - /P 1137 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4941 0 R ->> -endobj - -1139 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1143 0 R 1142 0 R 1141 0 R 1140 0 R] ->> -endobj - -1140 0 obj -<< - /Type /StructElem - /S /Span - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2 4] - /Pg 4941 0 R ->> -endobj - -1141 0 obj -<< - /Type /StructElem - /S /Strong - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4941 0 R ->> -endobj - -1142 0 obj -<< - /Type /StructElem - /S /Strong - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4941 0 R ->> -endobj - -1143 0 obj -<< - /Type /StructElem - /S /Strong - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4941 0 R ->> -endobj - -1144 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1145 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1146 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1147 0 R] ->> -endobj - -1147 0 obj -<< - /Type /StructElem - /S /Span - /P 1146 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4941 0 R ->> -endobj - -1148 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1149 0 R] ->> -endobj - -1149 0 obj -<< - /Type /StructElem - /S /Span - /P 1148 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [147] - /Pg 4929 0 R ->> -endobj - -1150 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1151 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1152 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1153 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1154 0 R] ->> -endobj - -1154 0 obj -<< - /Type /StructElem - /S /Span - /P 1153 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [146] - /Pg 4929 0 R ->> -endobj - -1155 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1157 0 R 1156 0 R] ->> -endobj - -1156 0 obj -<< - /Type /StructElem - /S /Span - /P 1155 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [145] - /Pg 4929 0 R ->> -endobj - -1157 0 obj -<< - /Type /StructElem - /S /Strong - /P 1155 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [144] - /Pg 4929 0 R ->> -endobj - -1158 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1159 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1160 0 R] ->> -endobj - -1160 0 obj -<< - /Type /StructElem - /S /Span - /P 1159 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143] - /Pg 4929 0 R ->> -endobj - -1161 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1164 0 R 1163 0 R 1162 0 R] ->> -endobj - -1162 0 obj -<< - /Type /StructElem - /S /Span - /P 1161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4929 0 R ->> -endobj - -1163 0 obj -<< - /Type /StructElem - /S /Formula - /P 1161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4929 0 R ->> -endobj - -1164 0 obj -<< - /Type /StructElem - /S /Span - /P 1161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140] - /Pg 4929 0 R ->> -endobj - -1165 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1166 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1167 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1168 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1169 0 R] ->> -endobj - -1169 0 obj -<< - /Type /StructElem - /S /Span - /P 1168 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4929 0 R ->> -endobj - -1170 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1171 0 R] ->> -endobj - -1171 0 obj -<< - /Type /StructElem - /S /Span - /P 1170 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [138] - /Pg 4929 0 R ->> -endobj - -1172 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1173 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1174 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1175 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1176 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1177 0 R] ->> -endobj - -1177 0 obj -<< - /Type /StructElem - /S /Span - /P 1176 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [137] - /Pg 4929 0 R ->> -endobj - -1178 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1182 0 R 1181 0 R 1180 0 R 1179 0 R] ->> -endobj - -1179 0 obj -<< - /Type /StructElem - /S /Span - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133 135] - /Pg 4929 0 R ->> -endobj - -1180 0 obj -<< - /Type /StructElem - /S /Strong - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [136] - /Pg 4929 0 R ->> -endobj - -1181 0 obj -<< - /Type /StructElem - /S /Strong - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134] - /Pg 4929 0 R ->> -endobj - -1182 0 obj -<< - /Type /StructElem - /S /Strong - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [132] - /Pg 4929 0 R ->> -endobj - -1183 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1184 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1185 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1186 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1187 0 R] ->> -endobj - -1187 0 obj -<< - /Type /StructElem - /S /Span - /P 1186 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131] - /Pg 4929 0 R ->> -endobj - -1188 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1189 0 R] ->> -endobj - -1189 0 obj -<< - /Type /StructElem - /S /Strong - /P 1188 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4929 0 R ->> -endobj - -1190 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1191 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1192 0 R] ->> -endobj - -1192 0 obj -<< - /Type /StructElem - /S /Span - /P 1191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4929 0 R ->> -endobj - -1193 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1196 0 R 1195 0 R 1194 0 R] ->> -endobj - -1194 0 obj -<< - /Type /StructElem - /S /Span - /P 1193 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4929 0 R ->> -endobj - -1195 0 obj -<< - /Type /StructElem - /S /Formula - /P 1193 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4929 0 R ->> -endobj - -1196 0 obj -<< - /Type /StructElem - /S /Span - /P 1193 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4929 0 R ->> -endobj - -1197 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1198 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1199 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1200 0 R] ->> -endobj - -1200 0 obj -<< - /Type /StructElem - /S /Span - /P 1199 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125] - /Pg 4929 0 R ->> -endobj - -1201 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1203 0 R 1202 0 R] ->> -endobj - -1202 0 obj -<< - /Type /StructElem - /S /Span - /P 1201 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [124] - /Pg 4929 0 R ->> -endobj - -1203 0 obj -<< - /Type /StructElem - /S /Strong - /P 1201 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [123] - /Pg 4929 0 R ->> -endobj - -1204 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1205 0 R] ->> -endobj - -1205 0 obj -<< - /Type /StructElem - /S /Span - /P 1204 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4929 0 R ->> -endobj - -1206 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1207 0 obj -<< - /Type /StructElem - /S /P - /P 1112 0 R - /K [1208 0 R 121] - /Pg 4929 0 R ->> -endobj - -1208 0 obj -<< - /Type /StructElem - /S /Strong - /P 1207 0 R - /K [120] - /Pg 4929 0 R ->> -endobj - -1209 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1218 0 R 113 114 1215 0 R 1211 0 R 116 117 1210 0 R 119] - /Pg 4929 0 R ->> -endobj - -1210 0 obj -<< - /Type /StructElem - /S /Code - /P 1209 0 R - /K [118] - /Pg 4929 0 R ->> -endobj - -1211 0 obj -<< - /Type /StructElem - /S /Note - /P 1209 0 R - /ID (Note 3) - /K [1212 0 R 149 150] - /Pg 4929 0 R ->> -endobj - -1212 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1211 0 R - /K [1213 0 R] ->> -endobj - -1213 0 obj -<< - /Type /StructElem - /S /Link - /P 1212 0 R - /K [<< - /Type /OBJR - /Pg 4929 0 R - /Obj 4928 0 R - >> 1214 0 R] ->> -endobj - -1214 0 obj -<< - /Type /StructElem - /S /Span - /P 1213 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [148] - /Pg 4929 0 R ->> -endobj - -1215 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1209 0 R - /K [1216 0 R] ->> -endobj - -1216 0 obj -<< - /Type /StructElem - /S /Link - /P 1215 0 R - /K [<< - /Type /OBJR - /Pg 4929 0 R - /Obj 4927 0 R - >> 1217 0 R] ->> -endobj - -1217 0 obj -<< - /Type /StructElem - /S /Span - /P 1216 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [115] - /Pg 4929 0 R ->> -endobj - -1218 0 obj -<< - /Type /StructElem - /S /Strong - /P 1209 0 R - /K [112] - /Pg 4929 0 R ->> -endobj - -1219 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [107 1221 0 R 109 1220 0 R 111] - /Pg 4929 0 R ->> -endobj - -1220 0 obj -<< - /Type /StructElem - /S /Code - /P 1219 0 R - /K [110] - /Pg 4929 0 R ->> -endobj - -1221 0 obj -<< - /Type /StructElem - /S /Code - /P 1219 0 R - /K [108] - /Pg 4929 0 R ->> -endobj - -1222 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1365 0 R 1223 0 R] ->> -endobj - -1223 0 obj -<< - /Type /StructElem - /S /Div - /P 1222 0 R - /K [1364 0 R 1362 0 R 1359 0 R 1357 0 R 1356 0 R 1355 0 R 1350 0 R 1348 0 R 1347 0 R 1344 0 R 1342 0 R 1341 0 R 1340 0 R 1339 0 R 1329 0 R 1327 0 R 1326 0 R 1325 0 R 1319 0 R 1317 0 R 1316 0 R 1315 0 R 1310 0 R 1308 0 R 1307 0 R 1305 0 R 1303 0 R 1302 0 R 1299 0 R 1297 0 R 1294 0 R 1292 0 R 1291 0 R 1290 0 R 1285 0 R 1283 0 R 1282 0 R 1277 0 R 1275 0 R 1274 0 R 1273 0 R 1272 0 R 1268 0 R 1266 0 R 1265 0 R 1264 0 R 1254 0 R 1252 0 R 1251 0 R 1250 0 R 1249 0 R 1248 0 R 1242 0 R 1240 0 R 1239 0 R 1238 0 R 1237 0 R 1231 0 R 1229 0 R 1228 0 R 1225 0 R 1224 0 R] ->> -endobj - -1224 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1225 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1227 0 R 1226 0 R] ->> -endobj - -1226 0 obj -<< - /Type /StructElem - /S /Span - /P 1225 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4929 0 R ->> -endobj - -1227 0 obj -<< - /Type /StructElem - /S /Strong - /P 1225 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4929 0 R ->> -endobj - -1228 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1229 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1230 0 R] ->> -endobj - -1230 0 obj -<< - /Type /StructElem - /S /Span - /P 1229 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 4929 0 R ->> -endobj - -1231 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1236 0 R 1235 0 R 1234 0 R 1233 0 R 1232 0 R] ->> -endobj - -1232 0 obj -<< - /Type /StructElem - /S /Span - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4929 0 R ->> -endobj - -1233 0 obj -<< - /Type /StructElem - /S /Formula - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 4929 0 R ->> -endobj - -1234 0 obj -<< - /Type /StructElem - /S /Span - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4929 0 R ->> -endobj - -1235 0 obj -<< - /Type /StructElem - /S /Formula - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4929 0 R ->> -endobj - -1236 0 obj -<< - /Type /StructElem - /S /Span - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4929 0 R ->> -endobj - -1237 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1238 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1239 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1240 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1241 0 R] ->> -endobj - -1241 0 obj -<< - /Type /StructElem - /S /Span - /P 1240 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4929 0 R ->> -endobj - -1242 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1247 0 R 1246 0 R 1245 0 R 1244 0 R 1243 0 R] ->> -endobj - -1243 0 obj -<< - /Type /StructElem - /S /Span - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4929 0 R ->> -endobj - -1244 0 obj -<< - /Type /StructElem - /S /Formula - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4929 0 R ->> -endobj - -1245 0 obj -<< - /Type /StructElem - /S /Span - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4929 0 R ->> -endobj - -1246 0 obj -<< - /Type /StructElem - /S /Formula - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4929 0 R ->> -endobj - -1247 0 obj -<< - /Type /StructElem - /S /Span - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4929 0 R ->> -endobj - -1248 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1249 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1250 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1251 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1252 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1253 0 R] ->> -endobj - -1253 0 obj -<< - /Type /StructElem - /S /Span - /P 1252 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4929 0 R ->> -endobj - -1254 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1263 0 R 1262 0 R 1261 0 R 1260 0 R 1259 0 R 1258 0 R 1257 0 R 1256 0 R 1255 0 R] ->> -endobj - -1255 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [90] - /Pg 4929 0 R ->> -endobj - -1256 0 obj -<< - /Type /StructElem - /S /Strong - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4929 0 R ->> -endobj - -1257 0 obj -<< - /Type /StructElem - /S /Formula - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [89] - /Pg 4929 0 R ->> -endobj - -1258 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [88] - /Pg 4929 0 R ->> -endobj - -1259 0 obj -<< - /Type /StructElem - /S /Formula - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87] - /Pg 4929 0 R ->> -endobj - -1260 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86] - /Pg 4929 0 R ->> -endobj - -1261 0 obj -<< - /Type /StructElem - /S /Formula - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4929 0 R ->> -endobj - -1262 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4929 0 R ->> -endobj - -1263 0 obj -<< - /Type /StructElem - /S /Strong - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4929 0 R ->> -endobj - -1264 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1265 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1266 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1267 0 R] ->> -endobj - -1267 0 obj -<< - /Type /StructElem - /S /Span - /P 1266 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [82] - /Pg 4929 0 R ->> -endobj - -1268 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1271 0 R 1270 0 R 1269 0 R] ->> -endobj - -1269 0 obj -<< - /Type /StructElem - /S /Span - /P 1268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [81] - /Pg 4929 0 R ->> -endobj - -1270 0 obj -<< - /Type /StructElem - /S /Formula - /P 1268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80] - /Pg 4929 0 R ->> -endobj - -1271 0 obj -<< - /Type /StructElem - /S /Span - /P 1268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79] - /Pg 4929 0 R ->> -endobj - -1272 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1273 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1274 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1275 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1276 0 R] ->> -endobj - -1276 0 obj -<< - /Type /StructElem - /S /Span - /P 1275 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [78] - /Pg 4929 0 R ->> -endobj - -1277 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1281 0 R 1280 0 R 1279 0 R 1278 0 R] ->> -endobj - -1278 0 obj -<< - /Type /StructElem - /S /Span - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74 76] - /Pg 4929 0 R ->> -endobj - -1279 0 obj -<< - /Type /StructElem - /S /Strong - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [77] - /Pg 4929 0 R ->> -endobj - -1280 0 obj -<< - /Type /StructElem - /S /Strong - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [75] - /Pg 4929 0 R ->> -endobj - -1281 0 obj -<< - /Type /StructElem - /S /Strong - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 4929 0 R ->> -endobj - -1282 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1283 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1284 0 R] ->> -endobj - -1284 0 obj -<< - /Type /StructElem - /S /Span - /P 1283 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 4929 0 R ->> -endobj - -1285 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1289 0 R 1288 0 R 1287 0 R 1286 0 R] ->> -endobj - -1286 0 obj -<< - /Type /StructElem - /S /Formula - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [71] - /Pg 4929 0 R ->> -endobj - -1287 0 obj -<< - /Type /StructElem - /S /Span - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [70] - /Pg 4929 0 R ->> -endobj - -1288 0 obj -<< - /Type /StructElem - /S /Formula - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [69] - /Pg 4929 0 R ->> -endobj - -1289 0 obj -<< - /Type /StructElem - /S /Span - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [68] - /Pg 4929 0 R ->> -endobj - -1290 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1291 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1292 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1293 0 R] ->> -endobj - -1293 0 obj -<< - /Type /StructElem - /S /Span - /P 1292 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [67] - /Pg 4929 0 R ->> -endobj - -1294 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1296 0 R 1295 0 R] ->> -endobj - -1295 0 obj -<< - /Type /StructElem - /S /Span - /P 1294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66] - /Pg 4929 0 R ->> -endobj - -1296 0 obj -<< - /Type /StructElem - /S /Strong - /P 1294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [65] - /Pg 4929 0 R ->> -endobj - -1297 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1298 0 R] ->> -endobj - -1298 0 obj -<< - /Type /StructElem - /S /Span - /P 1297 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [64] - /Pg 4929 0 R ->> -endobj - -1299 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1301 0 R 1300 0 R] ->> -endobj - -1300 0 obj -<< - /Type /StructElem - /S /Span - /P 1299 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [63] - /Pg 4929 0 R ->> -endobj - -1301 0 obj -<< - /Type /StructElem - /S /Strong - /P 1299 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [62] - /Pg 4929 0 R ->> -endobj - -1302 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1303 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1304 0 R] ->> -endobj - -1304 0 obj -<< - /Type /StructElem - /S /Span - /P 1303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [61] - /Pg 4929 0 R ->> -endobj - -1305 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1306 0 R] ->> -endobj - -1306 0 obj -<< - /Type /StructElem - /S /Span - /P 1305 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [60] - /Pg 4929 0 R ->> -endobj - -1307 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1308 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1309 0 R] ->> -endobj - -1309 0 obj -<< - /Type /StructElem - /S /Span - /P 1308 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4929 0 R ->> -endobj - -1310 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1314 0 R 1313 0 R 1312 0 R 1311 0 R] ->> -endobj - -1311 0 obj -<< - /Type /StructElem - /S /Span - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [54 56 58] - /Pg 4929 0 R ->> -endobj - -1312 0 obj -<< - /Type /StructElem - /S /Strong - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [57] - /Pg 4929 0 R ->> -endobj - -1313 0 obj -<< - /Type /StructElem - /S /Strong - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [55] - /Pg 4929 0 R ->> -endobj - -1314 0 obj -<< - /Type /StructElem - /S /Strong - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [53] - /Pg 4929 0 R ->> -endobj - -1315 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1316 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1317 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1318 0 R] ->> -endobj - -1318 0 obj -<< - /Type /StructElem - /S /Span - /P 1317 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52] - /Pg 4929 0 R ->> -endobj - -1319 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1324 0 R 1323 0 R 1322 0 R 1321 0 R 1320 0 R] ->> -endobj - -1320 0 obj -<< - /Type /StructElem - /S /Span - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [51] - /Pg 4929 0 R ->> -endobj - -1321 0 obj -<< - /Type /StructElem - /S /Formula - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [50] - /Pg 4929 0 R ->> -endobj - -1322 0 obj -<< - /Type /StructElem - /S /Span - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [49] - /Pg 4929 0 R ->> -endobj - -1323 0 obj -<< - /Type /StructElem - /S /Formula - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [48] - /Pg 4929 0 R ->> -endobj - -1324 0 obj -<< - /Type /StructElem - /S /Span - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [47] - /Pg 4929 0 R ->> -endobj - -1325 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1326 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1327 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1328 0 R] ->> -endobj - -1328 0 obj -<< - /Type /StructElem - /S /Span - /P 1327 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46] - /Pg 4929 0 R ->> -endobj - -1329 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1338 0 R 1337 0 R 1336 0 R 1335 0 R 1334 0 R 1333 0 R 1332 0 R 1331 0 R 1330 0 R] ->> -endobj - -1330 0 obj -<< - /Type /StructElem - /S /Span - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42 44] - /Pg 4929 0 R ->> -endobj - -1331 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45] - /Pg 4929 0 R ->> -endobj - -1332 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4929 0 R ->> -endobj - -1333 0 obj -<< - /Type /StructElem - /S /Formula - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4929 0 R ->> -endobj - -1334 0 obj -<< - /Type /StructElem - /S /Span - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38 40] - /Pg 4929 0 R ->> -endobj - -1335 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [39] - /Pg 4929 0 R ->> -endobj - -1336 0 obj -<< - /Type /StructElem - /S /Formula - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37] - /Pg 4929 0 R ->> -endobj - -1337 0 obj -<< - /Type /StructElem - /S /Span - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4929 0 R ->> -endobj - -1338 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35] - /Pg 4929 0 R ->> -endobj - -1339 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1340 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1341 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1342 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1343 0 R] ->> -endobj - -1343 0 obj -<< - /Type /StructElem - /S /Span - /P 1342 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34] - /Pg 4929 0 R ->> -endobj - -1344 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1346 0 R 1345 0 R] ->> -endobj - -1345 0 obj -<< - /Type /StructElem - /S /Span - /P 1344 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4929 0 R ->> -endobj - -1346 0 obj -<< - /Type /StructElem - /S /Strong - /P 1344 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4929 0 R ->> -endobj - -1347 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1348 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1349 0 R] ->> -endobj - -1349 0 obj -<< - /Type /StructElem - /S /Span - /P 1348 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4929 0 R ->> -endobj - -1350 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1354 0 R 1353 0 R 1352 0 R 1351 0 R] ->> -endobj - -1351 0 obj -<< - /Type /StructElem - /S /Formula - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4929 0 R ->> -endobj - -1352 0 obj -<< - /Type /StructElem - /S /Span - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4929 0 R ->> -endobj - -1353 0 obj -<< - /Type /StructElem - /S /Formula - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4929 0 R ->> -endobj - -1354 0 obj -<< - /Type /StructElem - /S /Span - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4929 0 R ->> -endobj - -1355 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1356 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1357 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1358 0 R] ->> -endobj - -1358 0 obj -<< - /Type /StructElem - /S /Span - /P 1357 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4929 0 R ->> -endobj - -1359 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1361 0 R 1360 0 R] ->> -endobj - -1360 0 obj -<< - /Type /StructElem - /S /Span - /P 1359 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4929 0 R ->> -endobj - -1361 0 obj -<< - /Type /StructElem - /S /Strong - /P 1359 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24] - /Pg 4929 0 R ->> -endobj - -1362 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1363 0 R] ->> -endobj - -1363 0 obj -<< - /Type /StructElem - /S /Span - /P 1362 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4929 0 R ->> -endobj - -1364 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1365 0 obj -<< - /Type /StructElem - /S /P - /P 1222 0 R - /K [1366 0 R 22] - /Pg 4929 0 R ->> -endobj - -1366 0 obj -<< - /Type /StructElem - /S /Strong - /P 1365 0 R - /K [21] - /Pg 4929 0 R ->> -endobj - -1367 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1373 0 R 7 1372 0 R 9 1371 0 R 11 12 1370 0 R 14 15 1369 0 R 17 18 1368 0 R 20] - /Pg 4929 0 R ->> -endobj - -1368 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [19] - /Pg 4929 0 R ->> -endobj - -1369 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [16] - /Pg 4929 0 R ->> -endobj - -1370 0 obj -<< - /Type /StructElem - /S /Em - /P 1367 0 R - /K [13] - /Pg 4929 0 R ->> -endobj - -1371 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [10] - /Pg 4929 0 R ->> -endobj - -1372 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [8] - /Pg 4929 0 R ->> -endobj - -1373 0 obj -<< - /Type /StructElem - /S /Strong - /P 1367 0 R - /K [6] - /Pg 4929 0 R ->> -endobj - -1374 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3 4 5] - /Pg 4929 0 R ->> -endobj - -1375 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1595 0 R 1376 0 R] ->> -endobj - -1376 0 obj -<< - /Type /StructElem - /S /Div - /P 1375 0 R - /K [1594 0 R 1592 0 R 1589 0 R 1587 0 R 1586 0 R 1585 0 R 1581 0 R 1579 0 R 1578 0 R 1574 0 R 1572 0 R 1571 0 R 1566 0 R 1564 0 R 1563 0 R 1558 0 R 1556 0 R 1555 0 R 1554 0 R 1553 0 R 1543 0 R 1541 0 R 1540 0 R 1538 0 R 1536 0 R 1535 0 R 1534 0 R 1533 0 R 1529 0 R 1527 0 R 1526 0 R 1525 0 R 1520 0 R 1518 0 R 1517 0 R 1516 0 R 1515 0 R 1514 0 R 1504 0 R 1502 0 R 1501 0 R 1500 0 R 1499 0 R 1498 0 R 1497 0 R 1491 0 R 1489 0 R 1488 0 R 1487 0 R 1486 0 R 1485 0 R 1479 0 R 1477 0 R 1476 0 R 1475 0 R 1474 0 R 1473 0 R 1469 0 R 1467 0 R 1466 0 R 1465 0 R 1464 0 R 1458 0 R 1456 0 R 1455 0 R 1454 0 R 1453 0 R 1452 0 R 1451 0 R 1445 0 R 1443 0 R 1442 0 R 1441 0 R 1440 0 R 1439 0 R 1433 0 R 1431 0 R 1430 0 R 1429 0 R 1428 0 R 1427 0 R 1423 0 R 1421 0 R 1420 0 R 1419 0 R 1418 0 R 1416 0 R 1414 0 R 1413 0 R 1412 0 R 1411 0 R 1410 0 R 1409 0 R 1399 0 R 1397 0 R 1396 0 R 1393 0 R 1391 0 R 1390 0 R 1384 0 R 1382 0 R 1381 0 R 1378 0 R 1377 0 R] ->> -endobj - -1377 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1378 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1380 0 R 1379 0 R] ->> -endobj - -1379 0 obj -<< - /Type /StructElem - /S /Span - /P 1378 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4929 0 R ->> -endobj - -1380 0 obj -<< - /Type /StructElem - /S /Strong - /P 1378 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4929 0 R ->> -endobj - -1381 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1382 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1383 0 R] ->> -endobj - -1383 0 obj -<< - /Type /StructElem - /S /Span - /P 1382 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4929 0 R ->> -endobj - -1384 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1389 0 R 1388 0 R 1387 0 R 1386 0 R 1385 0 R] ->> -endobj - -1385 0 obj -<< - /Type /StructElem - /S /Span - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4925 0 R ->> -endobj - -1386 0 obj -<< - /Type /StructElem - /S /Formula - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [168] - /Pg 4925 0 R ->> -endobj - -1387 0 obj -<< - /Type /StructElem - /S /Span - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167] - /Pg 4925 0 R ->> -endobj - -1388 0 obj -<< - /Type /StructElem - /S /Formula - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4925 0 R ->> -endobj - -1389 0 obj -<< - /Type /StructElem - /S /Span - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165] - /Pg 4925 0 R ->> -endobj - -1390 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1391 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1392 0 R] ->> -endobj - -1392 0 obj -<< - /Type /StructElem - /S /Span - /P 1391 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4925 0 R ->> -endobj - -1393 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1395 0 R 1394 0 R] ->> -endobj - -1394 0 obj -<< - /Type /StructElem - /S /Span - /P 1393 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4925 0 R ->> -endobj - -1395 0 obj -<< - /Type /StructElem - /S /Strong - /P 1393 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4925 0 R ->> -endobj - -1396 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1397 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1398 0 R] ->> -endobj - -1398 0 obj -<< - /Type /StructElem - /S /Span - /P 1397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161] - /Pg 4925 0 R ->> -endobj - -1399 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1408 0 R 1407 0 R 1406 0 R 1405 0 R 1404 0 R 1403 0 R 1402 0 R 1401 0 R 1400 0 R] ->> -endobj - -1400 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4925 0 R ->> -endobj - -1401 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159] - /Pg 4925 0 R ->> -endobj - -1402 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158] - /Pg 4925 0 R ->> -endobj - -1403 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4925 0 R ->> -endobj - -1404 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4925 0 R ->> -endobj - -1405 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155] - /Pg 4925 0 R ->> -endobj - -1406 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4925 0 R ->> -endobj - -1407 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153] - /Pg 4925 0 R ->> -endobj - -1408 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [152] - /Pg 4925 0 R ->> -endobj - -1409 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1410 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1411 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1412 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1413 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1414 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1415 0 R] ->> -endobj - -1415 0 obj -<< - /Type /StructElem - /S /Span - /P 1414 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [151] - /Pg 4925 0 R ->> -endobj - -1416 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1417 0 R] ->> -endobj - -1417 0 obj -<< - /Type /StructElem - /S /Strong - /P 1416 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [150] - /Pg 4925 0 R ->> -endobj - -1418 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1419 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1420 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1421 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1422 0 R] ->> -endobj - -1422 0 obj -<< - /Type /StructElem - /S /Span - /P 1421 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149] - /Pg 4925 0 R ->> -endobj - -1423 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1426 0 R 1425 0 R 1424 0 R] ->> -endobj - -1424 0 obj -<< - /Type /StructElem - /S /Span - /P 1423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4925 0 R ->> -endobj - -1425 0 obj -<< - /Type /StructElem - /S /Formula - /P 1423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [147] - /Pg 4925 0 R ->> -endobj - -1426 0 obj -<< - /Type /StructElem - /S /Span - /P 1423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [146] - /Pg 4925 0 R ->> -endobj - -1427 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1428 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1429 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1430 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1431 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1432 0 R] ->> -endobj - -1432 0 obj -<< - /Type /StructElem - /S /Span - /P 1431 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [145] - /Pg 4925 0 R ->> -endobj - -1433 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1438 0 R 1437 0 R 1436 0 R 1435 0 R 1434 0 R] ->> -endobj - -1434 0 obj -<< - /Type /StructElem - /S /Span - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [144] - /Pg 4925 0 R ->> -endobj - -1435 0 obj -<< - /Type /StructElem - /S /Formula - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143] - /Pg 4925 0 R ->> -endobj - -1436 0 obj -<< - /Type /StructElem - /S /Span - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4925 0 R ->> -endobj - -1437 0 obj -<< - /Type /StructElem - /S /Formula - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4925 0 R ->> -endobj - -1438 0 obj -<< - /Type /StructElem - /S /Span - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140] - /Pg 4925 0 R ->> -endobj - -1439 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1440 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1441 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1442 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1443 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1444 0 R] ->> -endobj - -1444 0 obj -<< - /Type /StructElem - /S /Span - /P 1443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4925 0 R ->> -endobj - -1445 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1450 0 R 1449 0 R 1448 0 R 1447 0 R 1446 0 R] ->> -endobj - -1446 0 obj -<< - /Type /StructElem - /S /Span - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [138] - /Pg 4925 0 R ->> -endobj - -1447 0 obj -<< - /Type /StructElem - /S /Formula - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [137] - /Pg 4925 0 R ->> -endobj - -1448 0 obj -<< - /Type /StructElem - /S /Span - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [136] - /Pg 4925 0 R ->> -endobj - -1449 0 obj -<< - /Type /StructElem - /S /Formula - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [135] - /Pg 4925 0 R ->> -endobj - -1450 0 obj -<< - /Type /StructElem - /S /Span - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134] - /Pg 4925 0 R ->> -endobj - -1451 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1452 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1453 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1454 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1455 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1456 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1457 0 R] ->> -endobj - -1457 0 obj -<< - /Type /StructElem - /S /Span - /P 1456 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133] - /Pg 4925 0 R ->> -endobj - -1458 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1463 0 R 1462 0 R 1461 0 R 1460 0 R 1459 0 R] ->> -endobj - -1459 0 obj -<< - /Type /StructElem - /S /Span - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131] - /Pg 4925 0 R ->> -endobj - -1460 0 obj -<< - /Type /StructElem - /S /Strong - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [132] - /Pg 4925 0 R ->> -endobj - -1461 0 obj -<< - /Type /StructElem - /S /Formula - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4925 0 R ->> -endobj - -1462 0 obj -<< - /Type /StructElem - /S /Span - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4925 0 R ->> -endobj - -1463 0 obj -<< - /Type /StructElem - /S /Strong - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4925 0 R ->> -endobj - -1464 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1465 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1466 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1467 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1468 0 R] ->> -endobj - -1468 0 obj -<< - /Type /StructElem - /S /Span - /P 1467 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4925 0 R ->> -endobj - -1469 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1472 0 R 1471 0 R 1470 0 R] ->> -endobj - -1470 0 obj -<< - /Type /StructElem - /S /Span - /P 1469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4925 0 R ->> -endobj - -1471 0 obj -<< - /Type /StructElem - /S /Formula - /P 1469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125] - /Pg 4925 0 R ->> -endobj - -1472 0 obj -<< - /Type /StructElem - /S /Span - /P 1469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [124] - /Pg 4925 0 R ->> -endobj - -1473 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1474 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1475 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1476 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1477 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1478 0 R] ->> -endobj - -1478 0 obj -<< - /Type /StructElem - /S /Span - /P 1477 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [123] - /Pg 4925 0 R ->> -endobj - -1479 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1484 0 R 1483 0 R 1482 0 R 1481 0 R 1480 0 R] ->> -endobj - -1480 0 obj -<< - /Type /StructElem - /S /Span - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4925 0 R ->> -endobj - -1481 0 obj -<< - /Type /StructElem - /S /Formula - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [121] - /Pg 4925 0 R ->> -endobj - -1482 0 obj -<< - /Type /StructElem - /S /Span - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [120] - /Pg 4925 0 R ->> -endobj - -1483 0 obj -<< - /Type /StructElem - /S /Formula - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119] - /Pg 4925 0 R ->> -endobj - -1484 0 obj -<< - /Type /StructElem - /S /Span - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4925 0 R ->> -endobj - -1485 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1486 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1487 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1488 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1489 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1490 0 R] ->> -endobj - -1490 0 obj -<< - /Type /StructElem - /S /Span - /P 1489 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [117] - /Pg 4925 0 R ->> -endobj - -1491 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1496 0 R 1495 0 R 1494 0 R 1493 0 R 1492 0 R] ->> -endobj - -1492 0 obj -<< - /Type /StructElem - /S /Span - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [116] - /Pg 4925 0 R ->> -endobj - -1493 0 obj -<< - /Type /StructElem - /S /Formula - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [115] - /Pg 4925 0 R ->> -endobj - -1494 0 obj -<< - /Type /StructElem - /S /Span - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [114] - /Pg 4925 0 R ->> -endobj - -1495 0 obj -<< - /Type /StructElem - /S /Formula - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113] - /Pg 4925 0 R ->> -endobj - -1496 0 obj -<< - /Type /StructElem - /S /Span - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4925 0 R ->> -endobj - -1497 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1498 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1499 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1500 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1501 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1502 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1503 0 R] ->> -endobj - -1503 0 obj -<< - /Type /StructElem - /S /Span - /P 1502 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4925 0 R ->> -endobj - -1504 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1513 0 R 1512 0 R 1511 0 R 1510 0 R 1509 0 R 1508 0 R 1507 0 R 1506 0 R 1505 0 R] ->> -endobj - -1505 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4925 0 R ->> -endobj - -1506 0 obj -<< - /Type /StructElem - /S /Strong - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4925 0 R ->> -endobj - -1507 0 obj -<< - /Type /StructElem - /S /Formula - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [108] - /Pg 4925 0 R ->> -endobj - -1508 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4925 0 R ->> -endobj - -1509 0 obj -<< - /Type /StructElem - /S /Formula - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4925 0 R ->> -endobj - -1510 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4925 0 R ->> -endobj - -1511 0 obj -<< - /Type /StructElem - /S /Formula - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 4925 0 R ->> -endobj - -1512 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4925 0 R ->> -endobj - -1513 0 obj -<< - /Type /StructElem - /S /Strong - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 4925 0 R ->> -endobj - -1514 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1515 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1516 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1517 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1518 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1519 0 R] ->> -endobj - -1519 0 obj -<< - /Type /StructElem - /S /Span - /P 1518 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4925 0 R ->> -endobj - -1520 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1524 0 R 1523 0 R 1522 0 R 1521 0 R] ->> -endobj - -1521 0 obj -<< - /Type /StructElem - /S /Span - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97 99] - /Pg 4925 0 R ->> -endobj - -1522 0 obj -<< - /Type /StructElem - /S /Strong - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4925 0 R ->> -endobj - -1523 0 obj -<< - /Type /StructElem - /S /Strong - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4925 0 R ->> -endobj - -1524 0 obj -<< - /Type /StructElem - /S /Strong - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4925 0 R ->> -endobj - -1525 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1526 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1527 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1528 0 R] ->> -endobj - -1528 0 obj -<< - /Type /StructElem - /S /Span - /P 1527 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4925 0 R ->> -endobj - -1529 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1532 0 R 1531 0 R 1530 0 R] ->> -endobj - -1530 0 obj -<< - /Type /StructElem - /S /Span - /P 1529 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4925 0 R ->> -endobj - -1531 0 obj -<< - /Type /StructElem - /S /Formula - /P 1529 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4925 0 R ->> -endobj - -1532 0 obj -<< - /Type /StructElem - /S /Span - /P 1529 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4925 0 R ->> -endobj - -1533 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1534 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1535 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1536 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1537 0 R] ->> -endobj - -1537 0 obj -<< - /Type /StructElem - /S /Span - /P 1536 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4925 0 R ->> -endobj - -1538 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1539 0 R] ->> -endobj - -1539 0 obj -<< - /Type /StructElem - /S /Strong - /P 1538 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [90] - /Pg 4925 0 R ->> -endobj - -1540 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1541 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1542 0 R] ->> -endobj - -1542 0 obj -<< - /Type /StructElem - /S /Span - /P 1541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [89] - /Pg 4925 0 R ->> -endobj - -1543 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1552 0 R 1551 0 R 1550 0 R 1549 0 R 1548 0 R 1547 0 R 1546 0 R 1545 0 R 1544 0 R] ->> -endobj - -1544 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [88] - /Pg 4925 0 R ->> -endobj - -1545 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87] - /Pg 4925 0 R ->> -endobj - -1546 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86] - /Pg 4925 0 R ->> -endobj - -1547 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4925 0 R ->> -endobj - -1548 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4925 0 R ->> -endobj - -1549 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4925 0 R ->> -endobj - -1550 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [82] - /Pg 4925 0 R ->> -endobj - -1551 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [81] - /Pg 4925 0 R ->> -endobj - -1552 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80] - /Pg 4925 0 R ->> -endobj - -1553 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1554 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1555 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1556 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1557 0 R] ->> -endobj - -1557 0 obj -<< - /Type /StructElem - /S /Span - /P 1556 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79] - /Pg 4925 0 R ->> -endobj - -1558 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1562 0 R 1561 0 R 1560 0 R 1559 0 R] ->> -endobj - -1559 0 obj -<< - /Type /StructElem - /S /Span - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [75 77] - /Pg 4925 0 R ->> -endobj - -1560 0 obj -<< - /Type /StructElem - /S /Strong - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [78] - /Pg 4925 0 R ->> -endobj - -1561 0 obj -<< - /Type /StructElem - /S /Strong - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [76] - /Pg 4925 0 R ->> -endobj - -1562 0 obj -<< - /Type /StructElem - /S /Strong - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74] - /Pg 4925 0 R ->> -endobj - -1563 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1564 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1565 0 R] ->> -endobj - -1565 0 obj -<< - /Type /StructElem - /S /Span - /P 1564 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 4925 0 R ->> -endobj - -1566 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1570 0 R 1569 0 R 1568 0 R 1567 0 R] ->> -endobj - -1567 0 obj -<< - /Type /StructElem - /S /Formula - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 4925 0 R ->> -endobj - -1568 0 obj -<< - /Type /StructElem - /S /Span - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [71] - /Pg 4925 0 R ->> -endobj - -1569 0 obj -<< - /Type /StructElem - /S /Formula - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [70] - /Pg 4925 0 R ->> -endobj - -1570 0 obj -<< - /Type /StructElem - /S /Span - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [69] - /Pg 4925 0 R ->> -endobj - -1571 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1572 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1573 0 R] ->> -endobj - -1573 0 obj -<< - /Type /StructElem - /S /Span - /P 1572 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [68] - /Pg 4925 0 R ->> -endobj - -1574 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1577 0 R 1576 0 R 1575 0 R] ->> -endobj - -1575 0 obj -<< - /Type /StructElem - /S /Span - /P 1574 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [67] - /Pg 4925 0 R ->> -endobj - -1576 0 obj -<< - /Type /StructElem - /S /Formula - /P 1574 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66] - /Pg 4925 0 R ->> -endobj - -1577 0 obj -<< - /Type /StructElem - /S /Span - /P 1574 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [65] - /Pg 4925 0 R ->> -endobj - -1578 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1579 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1580 0 R] ->> -endobj - -1580 0 obj -<< - /Type /StructElem - /S /Span - /P 1579 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [64] - /Pg 4925 0 R ->> -endobj - -1581 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1584 0 R 1583 0 R 1582 0 R] ->> -endobj - -1582 0 obj -<< - /Type /StructElem - /S /Span - /P 1581 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [63] - /Pg 4925 0 R ->> -endobj - -1583 0 obj -<< - /Type /StructElem - /S /Formula - /P 1581 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [62] - /Pg 4925 0 R ->> -endobj - -1584 0 obj -<< - /Type /StructElem - /S /Span - /P 1581 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [61] - /Pg 4925 0 R ->> -endobj - -1585 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1586 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1587 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1588 0 R] ->> -endobj - -1588 0 obj -<< - /Type /StructElem - /S /Span - /P 1587 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [60] - /Pg 4925 0 R ->> -endobj - -1589 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1591 0 R 1590 0 R] ->> -endobj - -1590 0 obj -<< - /Type /StructElem - /S /Span - /P 1589 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4925 0 R ->> -endobj - -1591 0 obj -<< - /Type /StructElem - /S /Strong - /P 1589 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [58] - /Pg 4925 0 R ->> -endobj - -1592 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1593 0 R] ->> -endobj - -1593 0 obj -<< - /Type /StructElem - /S /Span - /P 1592 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [57] - /Pg 4925 0 R ->> -endobj - -1594 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1595 0 obj -<< - /Type /StructElem - /S /P - /P 1375 0 R - /K [1596 0 R 56] - /Pg 4925 0 R ->> -endobj - -1596 0 obj -<< - /Type /StructElem - /S /Strong - /P 1595 0 R - /K [55] - /Pg 4925 0 R ->> -endobj - -1597 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1604 0 R 39 1603 0 R 41 42 1602 0 R 44 45 1601 0 R 47 48 1600 0 R 50 1599 0 R 52 1598 0 R 54] - /Pg 4925 0 R ->> -endobj - -1598 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [53] - /Pg 4925 0 R ->> -endobj - -1599 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [51] - /Pg 4925 0 R ->> -endobj - -1600 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [49] - /Pg 4925 0 R ->> -endobj - -1601 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [46] - /Pg 4925 0 R ->> -endobj - -1602 0 obj -<< - /Type /StructElem - /S /Em - /P 1597 0 R - /K [43] - /Pg 4925 0 R ->> -endobj - -1603 0 obj -<< - /Type /StructElem - /S /Em - /P 1597 0 R - /K [40] - /Pg 4925 0 R ->> -endobj - -1604 0 obj -<< - /Type /StructElem - /S /Strong - /P 1597 0 R - /K [38] - /Pg 4925 0 R ->> -endobj - -1605 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [33 1607 0 R 35 1606 0 R 37] - /Pg 4925 0 R ->> -endobj - -1606 0 obj -<< - /Type /StructElem - /S /Em - /P 1605 0 R - /K [36] - /Pg 4925 0 R ->> -endobj - -1607 0 obj -<< - /Type /StructElem - /S /Code - /P 1605 0 R - /K [34] - /Pg 4925 0 R ->> -endobj - -1608 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [15 1611 0 R 17 18 19 20 21 22 23 24 25 1610 0 R 27 28 29 1609 0 R 31 32] - /Pg 4925 0 R ->> -endobj - -1609 0 obj -<< - /Type /StructElem - /S /Link - /P 1608 0 R - /K [30 << - /Type /OBJR - /Pg 4925 0 R - /Obj 4924 0 R - >>] - /Pg 4925 0 R ->> -endobj - -1610 0 obj -<< - /Type /StructElem - /S /Link - /P 1608 0 R - /K [26 << - /Type /OBJR - /Pg 4925 0 R - /Obj 4923 0 R - >>] - /Pg 4925 0 R ->> -endobj - -1611 0 obj -<< - /Type /StructElem - /S /Em - /P 1608 0 R - /K [16] - /Pg 4925 0 R ->> -endobj - -1612 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Hot Module Replacement) - /K [13 14] - /Pg 4925 0 R ->> -endobj - -1613 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [8 1614 0 R 10 11 12] - /Pg 4925 0 R ->> -endobj - -1614 0 obj -<< - /Type /StructElem - /S /Code - /P 1613 0 R - /K [9] - /Pg 4925 0 R ->> -endobj - -1615 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [1635 0 R 1631 0 R 1627 0 R 1620 0 R 1616 0 R] ->> -endobj - -1616 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1619 0 R 1617 0 R] ->> -endobj - -1617 0 obj -<< - /Type /StructElem - /S /LBody - /P 1616 0 R - /K [1618 0 R 7] - /Pg 4925 0 R ->> -endobj - -1618 0 obj -<< - /Type /StructElem - /S /Code - /P 1617 0 R - /K [6] - /Pg 4925 0 R ->> -endobj - -1619 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1616 0 R - /K [5] - /Pg 4925 0 R ->> -endobj - -1620 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1626 0 R 1621 0 R] ->> -endobj - -1621 0 obj -<< - /Type /StructElem - /S /LBody - /P 1620 0 R - /K [1625 0 R 100 101 102 1624 0 R 104 1623 0 R 106 << - /Type /MCR - /MCID 0 - /Pg 4925 0 R - >> 1622 0 R << - /Type /MCR - /MCID 2 - /Pg 4925 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4925 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4925 0 R - >>] - /Pg 4921 0 R ->> -endobj - -1622 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [1] - /Pg 4925 0 R ->> -endobj - -1623 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [105] - /Pg 4921 0 R ->> -endobj - -1624 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [103] - /Pg 4921 0 R ->> -endobj - -1625 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [99] - /Pg 4921 0 R ->> -endobj - -1626 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1620 0 R - /K [98] - /Pg 4921 0 R ->> -endobj - -1627 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1630 0 R 1628 0 R] ->> -endobj - -1628 0 obj -<< - /Type /StructElem - /S /LBody - /P 1627 0 R - /K [1629 0 R 96 97] - /Pg 4921 0 R ->> -endobj - -1629 0 obj -<< - /Type /StructElem - /S /Code - /P 1628 0 R - /K [95] - /Pg 4921 0 R ->> -endobj - -1630 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1627 0 R - /K [94] - /Pg 4921 0 R ->> -endobj - -1631 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1634 0 R 1632 0 R] ->> -endobj - -1632 0 obj -<< - /Type /StructElem - /S /LBody - /P 1631 0 R - /K [1633 0 R 92 93] - /Pg 4921 0 R ->> -endobj - -1633 0 obj -<< - /Type /StructElem - /S /Code - /P 1632 0 R - /K [91] - /Pg 4921 0 R ->> -endobj - -1634 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1631 0 R - /K [90] - /Pg 4921 0 R ->> -endobj - -1635 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1639 0 R 1636 0 R] ->> -endobj - -1636 0 obj -<< - /Type /StructElem - /S /LBody - /P 1635 0 R - /K [1638 0 R 87 1637 0 R 89] - /Pg 4921 0 R ->> -endobj - -1637 0 obj -<< - /Type /StructElem - /S /Code - /P 1636 0 R - /K [88] - /Pg 4921 0 R ->> -endobj - -1638 0 obj -<< - /Type /StructElem - /S /Code - /P 1636 0 R - /K [86] - /Pg 4921 0 R ->> -endobj - -1639 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1635 0 R - /K [85] - /Pg 4921 0 R ->> -endobj - -1640 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [82 83 84] - /Pg 4921 0 R ->> -endobj - -1641 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [70 1644 0 R 72 73 74 75 1643 0 R 77 78 1642 0 R 80 81] - /Pg 4921 0 R ->> -endobj - -1642 0 obj -<< - /Type /StructElem - /S /Code - /P 1641 0 R - /K [79] - /Pg 4921 0 R ->> -endobj - -1643 0 obj -<< - /Type /StructElem - /S /Code - /P 1641 0 R - /K [76] - /Pg 4921 0 R ->> -endobj - -1644 0 obj -<< - /Type /StructElem - /S /Em - /P 1641 0 R - /K [71] - /Pg 4921 0 R ->> -endobj - -1645 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1673 0 R 1647 0 R 1646 0 R] ->> -endobj - -1646 0 obj -<< - /Type /StructElem - /S /P - /P 1645 0 R - /K [68 69] - /Pg 4921 0 R ->> -endobj - -1647 0 obj -<< - /Type /StructElem - /S /L - /P 1645 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [1669 0 R 1665 0 R 1661 0 R 1657 0 R 1652 0 R 1648 0 R] ->> -endobj - -1648 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1651 0 R 1649 0 R] ->> -endobj - -1649 0 obj -<< - /Type /StructElem - /S /LBody - /P 1648 0 R - /K [1650 0 R 67] - /Pg 4921 0 R ->> -endobj - -1650 0 obj -<< - /Type /StructElem - /S /Code - /P 1649 0 R - /K [66] - /Pg 4921 0 R ->> -endobj - -1651 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1648 0 R - /K [65] - /Pg 4921 0 R ->> -endobj - -1652 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1656 0 R 1653 0 R] ->> -endobj - -1653 0 obj -<< - /Type /StructElem - /S /LBody - /P 1652 0 R - /K [1655 0 R 62 1654 0 R 64] - /Pg 4921 0 R ->> -endobj - -1654 0 obj -<< - /Type /StructElem - /S /Code - /P 1653 0 R - /K [63] - /Pg 4921 0 R ->> -endobj - -1655 0 obj -<< - /Type /StructElem - /S /Code - /P 1653 0 R - /K [61] - /Pg 4921 0 R ->> -endobj - -1656 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1652 0 R - /K [60] - /Pg 4921 0 R ->> -endobj - -1657 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1660 0 R 1658 0 R] ->> -endobj - -1658 0 obj -<< - /Type /StructElem - /S /LBody - /P 1657 0 R - /K [1659 0 R 59] - /Pg 4921 0 R ->> -endobj - -1659 0 obj -<< - /Type /StructElem - /S /Code - /P 1658 0 R - /K [58] - /Pg 4921 0 R ->> -endobj - -1660 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1657 0 R - /K [57] - /Pg 4921 0 R ->> -endobj - -1661 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1664 0 R 1662 0 R] ->> -endobj - -1662 0 obj -<< - /Type /StructElem - /S /LBody - /P 1661 0 R - /K [1663 0 R 56] - /Pg 4921 0 R ->> -endobj - -1663 0 obj -<< - /Type /StructElem - /S /Code - /P 1662 0 R - /K [55] - /Pg 4921 0 R ->> -endobj - -1664 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1661 0 R - /K [54] - /Pg 4921 0 R ->> -endobj - -1665 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1668 0 R 1666 0 R] ->> -endobj - -1666 0 obj -<< - /Type /StructElem - /S /LBody - /P 1665 0 R - /K [1667 0 R 53] - /Pg 4921 0 R ->> -endobj - -1667 0 obj -<< - /Type /StructElem - /S /Code - /P 1666 0 R - /K [52] - /Pg 4921 0 R ->> -endobj - -1668 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1665 0 R - /K [51] - /Pg 4921 0 R ->> -endobj - -1669 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1672 0 R 1670 0 R] ->> -endobj - -1670 0 obj -<< - /Type /StructElem - /S /LBody - /P 1669 0 R - /K [1671 0 R 50] - /Pg 4921 0 R ->> -endobj - -1671 0 obj -<< - /Type /StructElem - /S /Code - /P 1670 0 R - /K [49] - /Pg 4921 0 R ->> -endobj - -1672 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1669 0 R - /K [48] - /Pg 4921 0 R ->> -endobj - -1673 0 obj -<< - /Type /StructElem - /S /P - /P 1645 0 R - /K [1675 0 R 45 1674 0 R 47] - /Pg 4921 0 R ->> -endobj - -1674 0 obj -<< - /Type /StructElem - /S /Em - /P 1673 0 R - /K [46] - /Pg 4921 0 R ->> -endobj - -1675 0 obj -<< - /Type /StructElem - /S /Strong - /P 1673 0 R - /K [42 43 44] - /Pg 4921 0 R ->> -endobj - -1676 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 35 1678 0 R 37 1677 0 R 39 40 41] - /Pg 4921 0 R ->> -endobj - -1677 0 obj -<< - /Type /StructElem - /S /Em - /P 1676 0 R - /K [38] - /Pg 4921 0 R ->> -endobj - -1678 0 obj -<< - /Type /StructElem - /S /Link - /P 1676 0 R - /K [36 << - /Type /OBJR - /Pg 4921 0 R - /Obj 4920 0 R - >>] - /Pg 4921 0 R ->> -endobj - -1679 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Declarative Configuration Layer) - /K [32 33] - /Pg 4921 0 R ->> -endobj - -1680 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [11 1686 0 R 13 14 15 1685 0 R 17 1684 0 R 19 1683 0 R 21 1682 0 R 24 25 1681 0 R 27 28 29 30 31] - /Pg 4921 0 R ->> -endobj - -1681 0 obj -<< - /Type /StructElem - /S /Em - /P 1680 0 R - /K [26] - /Pg 4921 0 R ->> -endobj - -1682 0 obj -<< - /Type /StructElem - /S /Em - /P 1680 0 R - /K [22 23] - /Pg 4921 0 R ->> -endobj - -1683 0 obj -<< - /Type /StructElem - /S /Code - /P 1680 0 R - /K [20] - /Pg 4921 0 R ->> -endobj - -1684 0 obj -<< - /Type /StructElem - /S /Code - /P 1680 0 R - /K [18] - /Pg 4921 0 R ->> -endobj - -1685 0 obj -<< - /Type /StructElem - /S /Code - /P 1680 0 R - /K [16] - /Pg 4921 0 R ->> -endobj - -1686 0 obj -<< - /Type /StructElem - /S /Em - /P 1680 0 R - /K [12] - /Pg 4921 0 R ->> -endobj - -1687 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Component Loader) - /K [9 10] - /Pg 4921 0 R ->> -endobj - -1688 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [152 1693 0 R 154 155 1692 0 R 157 << - /Type /MCR - /MCID 0 - /Pg 4921 0 R - >> 1691 0 R << - /Type /MCR - /MCID 2 - /Pg 4921 0 R - >> 1690 0 R << - /Type /MCR - /MCID 4 - /Pg 4921 0 R - >> 1689 0 R << - /Type /MCR - /MCID 6 - /Pg 4921 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4921 0 R - >> << - /Type /MCR - /MCID 8 - /Pg 4921 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1689 0 obj -<< - /Type /StructElem - /S /Link - /P 1688 0 R - /K [5 << - /Type /OBJR - /Pg 4921 0 R - /Obj 4919 0 R - >>] - /Pg 4921 0 R ->> -endobj - -1690 0 obj -<< - /Type /StructElem - /S /Formula - /P 1688 0 R - /K [3] - /Pg 4921 0 R ->> -endobj - -1691 0 obj -<< - /Type /StructElem - /S /Code - /P 1688 0 R - /K [1] - /Pg 4921 0 R ->> -endobj - -1692 0 obj -<< - /Type /StructElem - /S /Formula - /P 1688 0 R - /K [156] - /Pg 4917 0 R ->> -endobj - -1693 0 obj -<< - /Type /StructElem - /S /Em - /P 1688 0 R - /K [153] - /Pg 4917 0 R ->> -endobj - -1694 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1705 0 R 124 125 1704 0 R 127 1703 0 R 129 1702 0 R 131 1701 0 R 133 134 135 1700 0 R 137 1699 0 R 139 140 1698 0 R 142 143 1697 0 R 145 146 1696 0 R 148 149 1695 0 R 151] - /Pg 4917 0 R ->> -endobj - -1695 0 obj -<< - /Type /StructElem - /S /Link - /P 1694 0 R - /K [150 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4916 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1696 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [147] - /Pg 4917 0 R ->> -endobj - -1697 0 obj -<< - /Type /StructElem - /S /Formula - /P 1694 0 R - /K [144] - /Pg 4917 0 R ->> -endobj - -1698 0 obj -<< - /Type /StructElem - /S /Em - /P 1694 0 R - /K [141] - /Pg 4917 0 R ->> -endobj - -1699 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [138] - /Pg 4917 0 R ->> -endobj - -1700 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [136] - /Pg 4917 0 R ->> -endobj - -1701 0 obj -<< - /Type /StructElem - /S /Link - /P 1694 0 R - /K [132 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4915 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1702 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [130] - /Pg 4917 0 R ->> -endobj - -1703 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [128] - /Pg 4917 0 R ->> -endobj - -1704 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [126] - /Pg 4917 0 R ->> -endobj - -1705 0 obj -<< - /Type /StructElem - /S /Link - /P 1694 0 R - /K [123 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4914 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1706 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1760 0 R 1707 0 R] ->> -endobj - -1707 0 obj -<< - /Type /StructElem - /S /Div - /P 1706 0 R - /K [1759 0 R 1757 0 R 1754 0 R 1752 0 R 1751 0 R 1750 0 R 1746 0 R 1744 0 R 1743 0 R 1741 0 R 1739 0 R 1738 0 R 1737 0 R 1736 0 R 1729 0 R 1727 0 R 1726 0 R 1725 0 R 1717 0 R 1715 0 R 1714 0 R 1713 0 R 1709 0 R 1708 0 R] ->> -endobj - -1708 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1709 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1712 0 R 1711 0 R 1710 0 R] ->> -endobj - -1710 0 obj -<< - /Type /StructElem - /S /Span - /P 1709 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4917 0 R ->> -endobj - -1711 0 obj -<< - /Type /StructElem - /S /Formula - /P 1709 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [121] - /Pg 4917 0 R ->> -endobj - -1712 0 obj -<< - /Type /StructElem - /S /Span - /P 1709 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [120] - /Pg 4917 0 R ->> -endobj - -1713 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1714 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1715 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1716 0 R] ->> -endobj - -1716 0 obj -<< - /Type /StructElem - /S /Span - /P 1715 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119] - /Pg 4917 0 R ->> -endobj - -1717 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1724 0 R 1723 0 R 1722 0 R 1721 0 R 1720 0 R 1719 0 R 1718 0 R] ->> -endobj - -1718 0 obj -<< - /Type /StructElem - /S /Code - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4917 0 R ->> -endobj - -1719 0 obj -<< - /Type /StructElem - /S /Span - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113 115 117] - /Pg 4917 0 R ->> -endobj - -1720 0 obj -<< - /Type /StructElem - /S /Strong - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [116] - /Pg 4917 0 R ->> -endobj - -1721 0 obj -<< - /Type /StructElem - /S /Strong - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [114] - /Pg 4917 0 R ->> -endobj - -1722 0 obj -<< - /Type /StructElem - /S /Formula - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4917 0 R ->> -endobj - -1723 0 obj -<< - /Type /StructElem - /S /Span - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4917 0 R ->> -endobj - -1724 0 obj -<< - /Type /StructElem - /S /Strong - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4917 0 R ->> -endobj - -1725 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1726 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1727 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1728 0 R] ->> -endobj - -1728 0 obj -<< - /Type /StructElem - /S /Span - /P 1727 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4917 0 R ->> -endobj - -1729 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1735 0 R 1734 0 R 1733 0 R 1732 0 R 1731 0 R 1730 0 R] ->> -endobj - -1730 0 obj -<< - /Type /StructElem - /S /Span - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104 106 108] - /Pg 4917 0 R ->> -endobj - -1731 0 obj -<< - /Type /StructElem - /S /Strong - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4917 0 R ->> -endobj - -1732 0 obj -<< - /Type /StructElem - /S /Strong - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4917 0 R ->> -endobj - -1733 0 obj -<< - /Type /StructElem - /S /Formula - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4917 0 R ->> -endobj - -1734 0 obj -<< - /Type /StructElem - /S /Span - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 4917 0 R ->> -endobj - -1735 0 obj -<< - /Type /StructElem - /S /Strong - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4917 0 R ->> -endobj - -1736 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1737 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1738 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1739 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1740 0 R] ->> -endobj - -1740 0 obj -<< - /Type /StructElem - /S /Span - /P 1739 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4917 0 R ->> -endobj - -1741 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1742 0 R] ->> -endobj - -1742 0 obj -<< - /Type /StructElem - /S /Strong - /P 1741 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4917 0 R ->> -endobj - -1743 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1744 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1745 0 R] ->> -endobj - -1745 0 obj -<< - /Type /StructElem - /S /Span - /P 1744 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4917 0 R ->> -endobj - -1746 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1749 0 R 1748 0 R 1747 0 R] ->> -endobj - -1747 0 obj -<< - /Type /StructElem - /S /Span - /P 1746 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4917 0 R ->> -endobj - -1748 0 obj -<< - /Type /StructElem - /S /Formula - /P 1746 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4917 0 R ->> -endobj - -1749 0 obj -<< - /Type /StructElem - /S /Span - /P 1746 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4917 0 R ->> -endobj - -1750 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1751 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1752 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1753 0 R] ->> -endobj - -1753 0 obj -<< - /Type /StructElem - /S /Span - /P 1752 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4917 0 R ->> -endobj - -1754 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1756 0 R 1755 0 R] ->> -endobj - -1755 0 obj -<< - /Type /StructElem - /S /Span - /P 1754 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4917 0 R ->> -endobj - -1756 0 obj -<< - /Type /StructElem - /S /Strong - /P 1754 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4917 0 R ->> -endobj - -1757 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1758 0 R] ->> -endobj - -1758 0 obj -<< - /Type /StructElem - /S /Span - /P 1757 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4917 0 R ->> -endobj - -1759 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1760 0 obj -<< - /Type /StructElem - /S /P - /P 1706 0 R - /K [1761 0 R 90] - /Pg 4917 0 R ->> -endobj - -1761 0 obj -<< - /Type /StructElem - /S /Strong - /P 1760 0 R - /K [89] - /Pg 4917 0 R ->> -endobj - -1762 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [61 1773 0 R 63 1772 0 R 65 1771 0 R 67 1770 0 R 69 70 1769 0 R 72 73 1768 0 R 75 76 1767 0 R 78 79 1766 0 R 81 1765 0 R 83 84 1764 0 R 86 1763 0 R 88] - /Pg 4917 0 R ->> -endobj - -1763 0 obj -<< - /Type /StructElem - /S /Link - /P 1762 0 R - /K [87 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4913 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1764 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [85] - /Pg 4917 0 R ->> -endobj - -1765 0 obj -<< - /Type /StructElem - /S /Link - /P 1762 0 R - /K [82 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4912 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1766 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [80] - /Pg 4917 0 R ->> -endobj - -1767 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [77] - /Pg 4917 0 R ->> -endobj - -1768 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [74] - /Pg 4917 0 R ->> -endobj - -1769 0 obj -<< - /Type /StructElem - /S /Em - /P 1762 0 R - /K [71] - /Pg 4917 0 R ->> -endobj - -1770 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [68] - /Pg 4917 0 R ->> -endobj - -1771 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [66] - /Pg 4917 0 R ->> -endobj - -1772 0 obj -<< - /Type /StructElem - /S /Em - /P 1762 0 R - /K [64] - /Pg 4917 0 R ->> -endobj - -1773 0 obj -<< - /Type /StructElem - /S /Link - /P 1762 0 R - /K [62 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4911 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1774 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Context Access) - /K [59 60] - /Pg 4917 0 R ->> -endobj - -1775 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [43 1781 0 R 45 1780 0 R 47 1779 0 R 49 1778 0 R 51 52 1777 0 R 54 55 56 1776 0 R 58] - /Pg 4917 0 R ->> -endobj - -1776 0 obj -<< - /Type /StructElem - /S /Link - /P 1775 0 R - /K [57 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4910 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1777 0 obj -<< - /Type /StructElem - /S /Link - /P 1775 0 R - /K [53 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4909 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1778 0 obj -<< - /Type /StructElem - /S /Em - /P 1775 0 R - /K [50] - /Pg 4917 0 R ->> -endobj - -1779 0 obj -<< - /Type /StructElem - /S /Code - /P 1775 0 R - /K [48] - /Pg 4917 0 R ->> -endobj - -1780 0 obj -<< - /Type /StructElem - /S /Code - /P 1775 0 R - /K [46] - /Pg 4917 0 R ->> -endobj - -1781 0 obj -<< - /Type /StructElem - /S /Em - /P 1775 0 R - /K [44] - /Pg 4917 0 R ->> -endobj - -1782 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 35 1785 0 R 37 1784 0 R 39 1783 0 R 41 42] - /Pg 4917 0 R ->> -endobj - -1783 0 obj -<< - /Type /StructElem - /S /Link - /P 1782 0 R - /K [40 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4908 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1784 0 obj -<< - /Type /StructElem - /S /Code - /P 1782 0 R - /K [38] - /Pg 4917 0 R ->> -endobj - -1785 0 obj -<< - /Type /StructElem - /S /Link - /P 1782 0 R - /K [36 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4907 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1786 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1983 0 R 1787 0 R] ->> -endobj - -1787 0 obj -<< - /Type /StructElem - /S /Div - /P 1786 0 R - /K [1982 0 R 1980 0 R 1977 0 R 1975 0 R 1974 0 R 1973 0 R 1968 0 R 1966 0 R 1965 0 R 1958 0 R 1956 0 R 1955 0 R 1951 0 R 1949 0 R 1948 0 R 1943 0 R 1941 0 R 1940 0 R 1932 0 R 1930 0 R 1929 0 R 1928 0 R 1927 0 R 1923 0 R 1921 0 R 1920 0 R 1918 0 R 1916 0 R 1915 0 R 1914 0 R 1913 0 R 1909 0 R 1907 0 R 1904 0 R 1902 0 R 1901 0 R 1900 0 R 1895 0 R 1893 0 R 1892 0 R 1882 0 R 1880 0 R 1879 0 R 1875 0 R 1873 0 R 1872 0 R 1865 0 R 1863 0 R 1862 0 R 1861 0 R 1860 0 R 1856 0 R 1854 0 R 1853 0 R 1851 0 R 1849 0 R 1848 0 R 1847 0 R 1846 0 R 1842 0 R 1840 0 R 1837 0 R 1835 0 R 1834 0 R 1833 0 R 1830 0 R 1828 0 R 1827 0 R 1823 0 R 1821 0 R 1820 0 R 1812 0 R 1810 0 R 1809 0 R 1808 0 R 1807 0 R 1803 0 R 1801 0 R 1800 0 R 1798 0 R 1796 0 R 1795 0 R 1794 0 R 1793 0 R 1789 0 R 1788 0 R] ->> -endobj - -1788 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1789 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1792 0 R 1791 0 R 1790 0 R] ->> -endobj - -1790 0 obj -<< - /Type /StructElem - /S /Span - /P 1789 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4917 0 R ->> -endobj - -1791 0 obj -<< - /Type /StructElem - /S /Formula - /P 1789 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4917 0 R ->> -endobj - -1792 0 obj -<< - /Type /StructElem - /S /Span - /P 1789 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4917 0 R ->> -endobj - -1793 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1794 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1795 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1796 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1797 0 R] ->> -endobj - -1797 0 obj -<< - /Type /StructElem - /S /Span - /P 1796 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4917 0 R ->> -endobj - -1798 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1799 0 R] ->> -endobj - -1799 0 obj -<< - /Type /StructElem - /S /Strong - /P 1798 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4917 0 R ->> -endobj - -1800 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1801 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1802 0 R] ->> -endobj - -1802 0 obj -<< - /Type /StructElem - /S /Span - /P 1801 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4917 0 R ->> -endobj - -1803 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1806 0 R 1805 0 R 1804 0 R] ->> -endobj - -1804 0 obj -<< - /Type /StructElem - /S /Span - /P 1803 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4917 0 R ->> -endobj - -1805 0 obj -<< - /Type /StructElem - /S /Formula - /P 1803 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4917 0 R ->> -endobj - -1806 0 obj -<< - /Type /StructElem - /S /Span - /P 1803 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4917 0 R ->> -endobj - -1807 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1808 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1809 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1810 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1811 0 R] ->> -endobj - -1811 0 obj -<< - /Type /StructElem - /S /Span - /P 1810 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24] - /Pg 4917 0 R ->> -endobj - -1812 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1819 0 R 1818 0 R 1817 0 R 1816 0 R 1815 0 R 1814 0 R 1813 0 R] ->> -endobj - -1813 0 obj -<< - /Type /StructElem - /S /Span - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [22] - /Pg 4917 0 R ->> -endobj - -1814 0 obj -<< - /Type /StructElem - /S /Strong - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4917 0 R ->> -endobj - -1815 0 obj -<< - /Type /StructElem - /S /Formula - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4917 0 R ->> -endobj - -1816 0 obj -<< - /Type /StructElem - /S /Span - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20] - /Pg 4917 0 R ->> -endobj - -1817 0 obj -<< - /Type /StructElem - /S /Formula - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4917 0 R ->> -endobj - -1818 0 obj -<< - /Type /StructElem - /S /Span - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4917 0 R ->> -endobj - -1819 0 obj -<< - /Type /StructElem - /S /Strong - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4917 0 R ->> -endobj - -1820 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1821 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1822 0 R] ->> -endobj - -1822 0 obj -<< - /Type /StructElem - /S /Span - /P 1821 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4917 0 R ->> -endobj - -1823 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1826 0 R 1825 0 R 1824 0 R] ->> -endobj - -1824 0 obj -<< - /Type /StructElem - /S /Span - /P 1823 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 4917 0 R ->> -endobj - -1825 0 obj -<< - /Type /StructElem - /S /Formula - /P 1823 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4917 0 R ->> -endobj - -1826 0 obj -<< - /Type /StructElem - /S /Span - /P 1823 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4917 0 R ->> -endobj - -1827 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1828 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1829 0 R] ->> -endobj - -1829 0 obj -<< - /Type /StructElem - /S /Span - /P 1828 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4917 0 R ->> -endobj - -1830 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1832 0 R 1831 0 R] ->> -endobj - -1831 0 obj -<< - /Type /StructElem - /S /Span - /P 1830 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11] - /Pg 4917 0 R ->> -endobj - -1832 0 obj -<< - /Type /StructElem - /S /Strong - /P 1830 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4917 0 R ->> -endobj - -1833 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1834 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1835 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1836 0 R] ->> -endobj - -1836 0 obj -<< - /Type /StructElem - /S /Span - /P 1835 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4917 0 R ->> -endobj - -1837 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1839 0 R 1838 0 R] ->> -endobj - -1838 0 obj -<< - /Type /StructElem - /S /Span - /P 1837 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4917 0 R ->> -endobj - -1839 0 obj -<< - /Type /StructElem - /S /Strong - /P 1837 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4917 0 R ->> -endobj - -1840 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1841 0 R] ->> -endobj - -1841 0 obj -<< - /Type /StructElem - /S /Span - /P 1840 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4917 0 R ->> -endobj - -1842 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1845 0 R 1844 0 R 1843 0 R] ->> -endobj - -1843 0 obj -<< - /Type /StructElem - /S /Span - /P 1842 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4917 0 R ->> -endobj - -1844 0 obj -<< - /Type /StructElem - /S /Formula - /P 1842 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4917 0 R ->> -endobj - -1845 0 obj -<< - /Type /StructElem - /S /Span - /P 1842 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4917 0 R ->> -endobj - -1846 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1847 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1848 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1849 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1850 0 R] ->> -endobj - -1850 0 obj -<< - /Type /StructElem - /S /Span - /P 1849 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4917 0 R ->> -endobj - -1851 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1852 0 R] ->> -endobj - -1852 0 obj -<< - /Type /StructElem - /S /Strong - /P 1851 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4917 0 R ->> -endobj - -1853 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1854 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1855 0 R] ->> -endobj - -1855 0 obj -<< - /Type /StructElem - /S /Span - /P 1854 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4917 0 R ->> -endobj - -1856 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1859 0 R 1858 0 R 1857 0 R] ->> -endobj - -1857 0 obj -<< - /Type /StructElem - /S /Span - /P 1856 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [177] - /Pg 4905 0 R ->> -endobj - -1858 0 obj -<< - /Type /StructElem - /S /Formula - /P 1856 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [176] - /Pg 4905 0 R ->> -endobj - -1859 0 obj -<< - /Type /StructElem - /S /Span - /P 1856 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [175] - /Pg 4905 0 R ->> -endobj - -1860 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1861 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1862 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1863 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1864 0 R] ->> -endobj - -1864 0 obj -<< - /Type /StructElem - /S /Span - /P 1863 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [174] - /Pg 4905 0 R ->> -endobj - -1865 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1871 0 R 1870 0 R 1869 0 R 1868 0 R 1867 0 R 1866 0 R] ->> -endobj - -1866 0 obj -<< - /Type /StructElem - /S /Span - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170 172] - /Pg 4905 0 R ->> -endobj - -1867 0 obj -<< - /Type /StructElem - /S /Strong - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [173] - /Pg 4905 0 R ->> -endobj - -1868 0 obj -<< - /Type /StructElem - /S /Span - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - /BaselineShift -0.9786 - /LineHeight 4.88601 - >>] - /K [171] - /Pg 4905 0 R ->> -endobj - -1869 0 obj -<< - /Type /StructElem - /S /Formula - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4905 0 R ->> -endobj - -1870 0 obj -<< - /Type /StructElem - /S /Span - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [168] - /Pg 4905 0 R ->> -endobj - -1871 0 obj -<< - /Type /StructElem - /S /Strong - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167] - /Pg 4905 0 R ->> -endobj - -1872 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1873 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1874 0 R] ->> -endobj - -1874 0 obj -<< - /Type /StructElem - /S /Span - /P 1873 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4905 0 R ->> -endobj - -1875 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1878 0 R 1877 0 R 1876 0 R] ->> -endobj - -1876 0 obj -<< - /Type /StructElem - /S /Span - /P 1875 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165] - /Pg 4905 0 R ->> -endobj - -1877 0 obj -<< - /Type /StructElem - /S /Formula - /P 1875 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4905 0 R ->> -endobj - -1878 0 obj -<< - /Type /StructElem - /S /Span - /P 1875 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4905 0 R ->> -endobj - -1879 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1880 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1881 0 R] ->> -endobj - -1881 0 obj -<< - /Type /StructElem - /S /Span - /P 1880 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4905 0 R ->> -endobj - -1882 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1891 0 R 1890 0 R 1889 0 R 1888 0 R 1887 0 R 1886 0 R 1885 0 R 1884 0 R 1883 0 R] ->> -endobj - -1883 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159 161] - /Pg 4905 0 R ->> -endobj - -1884 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - /BaselineShift -0.9786 - /LineHeight 4.88601 - >>] - /K [160] - /Pg 4905 0 R ->> -endobj - -1885 0 obj -<< - /Type /StructElem - /S /Formula - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158] - /Pg 4905 0 R ->> -endobj - -1886 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4905 0 R ->> -endobj - -1887 0 obj -<< - /Type /StructElem - /S /Formula - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4905 0 R ->> -endobj - -1888 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153 155] - /Pg 4905 0 R ->> -endobj - -1889 0 obj -<< - /Type /StructElem - /S /Strong - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4905 0 R ->> -endobj - -1890 0 obj -<< - /Type /StructElem - /S /Formula - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [152] - /Pg 4905 0 R ->> -endobj - -1891 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [151] - /Pg 4905 0 R ->> -endobj - -1892 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1893 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1894 0 R] ->> -endobj - -1894 0 obj -<< - /Type /StructElem - /S /Span - /P 1893 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [150] - /Pg 4905 0 R ->> -endobj - -1895 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1899 0 R 1898 0 R 1897 0 R 1896 0 R] ->> -endobj - -1896 0 obj -<< - /Type /StructElem - /S /Span - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149] - /Pg 4905 0 R ->> -endobj - -1897 0 obj -<< - /Type /StructElem - /S /Formula - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4905 0 R ->> -endobj - -1898 0 obj -<< - /Type /StructElem - /S /Span - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [145 147] - /Pg 4905 0 R ->> -endobj - -1899 0 obj -<< - /Type /StructElem - /S /Span - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - /BaselineShift -0.9786 - /LineHeight 4.88601 - >>] - /K [146] - /Pg 4905 0 R ->> -endobj - -1900 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1901 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1902 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1903 0 R] ->> -endobj - -1903 0 obj -<< - /Type /StructElem - /S /Span - /P 1902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [144] - /Pg 4905 0 R ->> -endobj - -1904 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1906 0 R 1905 0 R] ->> -endobj - -1905 0 obj -<< - /Type /StructElem - /S /Span - /P 1904 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143] - /Pg 4905 0 R ->> -endobj - -1906 0 obj -<< - /Type /StructElem - /S /Strong - /P 1904 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4905 0 R ->> -endobj - -1907 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1908 0 R] ->> -endobj - -1908 0 obj -<< - /Type /StructElem - /S /Span - /P 1907 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4905 0 R ->> -endobj - -1909 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1912 0 R 1911 0 R 1910 0 R] ->> -endobj - -1910 0 obj -<< - /Type /StructElem - /S /Span - /P 1909 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140] - /Pg 4905 0 R ->> -endobj - -1911 0 obj -<< - /Type /StructElem - /S /Formula - /P 1909 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4905 0 R ->> -endobj - -1912 0 obj -<< - /Type /StructElem - /S /Span - /P 1909 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [138] - /Pg 4905 0 R ->> -endobj - -1913 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1914 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1915 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1916 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1917 0 R] ->> -endobj - -1917 0 obj -<< - /Type /StructElem - /S /Span - /P 1916 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [137] - /Pg 4905 0 R ->> -endobj - -1918 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1919 0 R] ->> -endobj - -1919 0 obj -<< - /Type /StructElem - /S /Strong - /P 1918 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [136] - /Pg 4905 0 R ->> -endobj - -1920 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1921 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1922 0 R] ->> -endobj - -1922 0 obj -<< - /Type /StructElem - /S /Span - /P 1921 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [135] - /Pg 4905 0 R ->> -endobj - -1923 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1926 0 R 1925 0 R 1924 0 R] ->> -endobj - -1924 0 obj -<< - /Type /StructElem - /S /Span - /P 1923 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134] - /Pg 4905 0 R ->> -endobj - -1925 0 obj -<< - /Type /StructElem - /S /Formula - /P 1923 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133] - /Pg 4905 0 R ->> -endobj - -1926 0 obj -<< - /Type /StructElem - /S /Span - /P 1923 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [132] - /Pg 4905 0 R ->> -endobj - -1927 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1928 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1929 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1930 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1931 0 R] ->> -endobj - -1931 0 obj -<< - /Type /StructElem - /S /Span - /P 1930 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131] - /Pg 4905 0 R ->> -endobj - -1932 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1939 0 R 1938 0 R 1937 0 R 1936 0 R 1935 0 R 1934 0 R 1933 0 R] ->> -endobj - -1933 0 obj -<< - /Type /StructElem - /S /Span - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4905 0 R ->> -endobj - -1934 0 obj -<< - /Type /StructElem - /S /Strong - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4905 0 R ->> -endobj - -1935 0 obj -<< - /Type /StructElem - /S /Formula - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4905 0 R ->> -endobj - -1936 0 obj -<< - /Type /StructElem - /S /Span - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4905 0 R ->> -endobj - -1937 0 obj -<< - /Type /StructElem - /S /Formula - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4905 0 R ->> -endobj - -1938 0 obj -<< - /Type /StructElem - /S /Span - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125] - /Pg 4905 0 R ->> -endobj - -1939 0 obj -<< - /Type /StructElem - /S /Strong - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [124] - /Pg 4905 0 R ->> -endobj - -1940 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1941 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1942 0 R] ->> -endobj - -1942 0 obj -<< - /Type /StructElem - /S /Span - /P 1941 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [123] - /Pg 4905 0 R ->> -endobj - -1943 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1947 0 R 1946 0 R 1945 0 R 1944 0 R] ->> -endobj - -1944 0 obj -<< - /Type /StructElem - /S /Span - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119 121] - /Pg 4905 0 R ->> -endobj - -1945 0 obj -<< - /Type /StructElem - /S /Strong - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4905 0 R ->> -endobj - -1946 0 obj -<< - /Type /StructElem - /S /Strong - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [120] - /Pg 4905 0 R ->> -endobj - -1947 0 obj -<< - /Type /StructElem - /S /Strong - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4905 0 R ->> -endobj - -1948 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1949 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1950 0 R] ->> -endobj - -1950 0 obj -<< - /Type /StructElem - /S /Span - /P 1949 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [117] - /Pg 4905 0 R ->> -endobj - -1951 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1954 0 R 1953 0 R 1952 0 R] ->> -endobj - -1952 0 obj -<< - /Type /StructElem - /S /Span - /P 1951 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [116] - /Pg 4905 0 R ->> -endobj - -1953 0 obj -<< - /Type /StructElem - /S /Formula - /P 1951 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [115] - /Pg 4905 0 R ->> -endobj - -1954 0 obj -<< - /Type /StructElem - /S /Span - /P 1951 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [114] - /Pg 4905 0 R ->> -endobj - -1955 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1956 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1957 0 R] ->> -endobj - -1957 0 obj -<< - /Type /StructElem - /S /Span - /P 1956 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113] - /Pg 4905 0 R ->> -endobj - -1958 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1964 0 R 1963 0 R 1962 0 R 1961 0 R 1960 0 R 1959 0 R] ->> -endobj - -1959 0 obj -<< - /Type /StructElem - /S /Span - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109 111] - /Pg 4905 0 R ->> -endobj - -1960 0 obj -<< - /Type /StructElem - /S /Strong - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4905 0 R ->> -endobj - -1961 0 obj -<< - /Type /StructElem - /S /Strong - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4905 0 R ->> -endobj - -1962 0 obj -<< - /Type /StructElem - /S /Formula - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [108] - /Pg 4905 0 R ->> -endobj - -1963 0 obj -<< - /Type /StructElem - /S /Span - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4905 0 R ->> -endobj - -1964 0 obj -<< - /Type /StructElem - /S /Strong - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4905 0 R ->> -endobj - -1965 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1966 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1967 0 R] ->> -endobj - -1967 0 obj -<< - /Type /StructElem - /S /Span - /P 1966 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4905 0 R ->> -endobj - -1968 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1972 0 R 1971 0 R 1970 0 R 1969 0 R] ->> -endobj - -1969 0 obj -<< - /Type /StructElem - /S /Formula - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100 101 102 103 104] - /Pg 4905 0 R ->> -endobj - -1970 0 obj -<< - /Type /StructElem - /S /Span - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4905 0 R ->> -endobj - -1971 0 obj -<< - /Type /StructElem - /S /Formula - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4905 0 R ->> -endobj - -1972 0 obj -<< - /Type /StructElem - /S /Span - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4905 0 R ->> -endobj - -1973 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1974 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1975 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1976 0 R] ->> -endobj - -1976 0 obj -<< - /Type /StructElem - /S /Span - /P 1975 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4905 0 R ->> -endobj - -1977 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1979 0 R 1978 0 R] ->> -endobj - -1978 0 obj -<< - /Type /StructElem - /S /Span - /P 1977 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4905 0 R ->> -endobj - -1979 0 obj -<< - /Type /StructElem - /S /Strong - /P 1977 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4905 0 R ->> -endobj - -1980 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1981 0 R] ->> -endobj - -1981 0 obj -<< - /Type /StructElem - /S /Span - /P 1980 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4905 0 R ->> -endobj - -1982 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1983 0 obj -<< - /Type /StructElem - /S /P - /P 1786 0 R - /K [1984 0 R 92] - /Pg 4905 0 R ->> -endobj - -1984 0 obj -<< - /Type /StructElem - /S /Strong - /P 1983 0 R - /K [91] - /Pg 4905 0 R ->> -endobj - -1985 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2009 0 R 52 2008 0 R 54 2007 0 R 56 2006 0 R 58 59 60 2005 0 R 62 63 2004 0 R 65 2003 0 R 67 2000 0 R 1994 0 R 69 1993 0 R 71 72 1992 0 R 74 75 1991 0 R 77 78 1990 0 R 80 1989 0 R 82 1988 0 R 84 85 1987 0 R 87 1986 0 R 89 90] - /Pg 4905 0 R ->> -endobj - -1986 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [88] - /Pg 4905 0 R ->> -endobj - -1987 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [86] - /Pg 4905 0 R ->> -endobj - -1988 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [83] - /Pg 4905 0 R ->> -endobj - -1989 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [81] - /Pg 4905 0 R ->> -endobj - -1990 0 obj -<< - /Type /StructElem - /S /Formula - /P 1985 0 R - /K [79] - /Pg 4905 0 R ->> -endobj - -1991 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [76] - /Pg 4905 0 R ->> -endobj - -1992 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [73] - /Pg 4905 0 R ->> -endobj - -1993 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [70] - /Pg 4905 0 R ->> -endobj - -1994 0 obj -<< - /Type /StructElem - /S /Note - /P 1985 0 R - /ID (Note 2) - /K [1997 0 R 1996 0 R 180 1995 0 R 182 183 184 185] - /Pg 4905 0 R ->> -endobj - -1995 0 obj -<< - /Type /StructElem - /S /Code - /P 1994 0 R - /K [181] - /Pg 4905 0 R ->> -endobj - -1996 0 obj -<< - /Type /StructElem - /S /Code - /P 1994 0 R - /K [179] - /Pg 4905 0 R ->> -endobj - -1997 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1994 0 R - /K [1998 0 R] ->> -endobj - -1998 0 obj -<< - /Type /StructElem - /S /Link - /P 1997 0 R - /K [<< - /Type /OBJR - /Pg 4905 0 R - /Obj 4904 0 R - >> 1999 0 R] ->> -endobj - -1999 0 obj -<< - /Type /StructElem - /S /Span - /P 1998 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [178] - /Pg 4905 0 R ->> -endobj - -2000 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1985 0 R - /K [2001 0 R] ->> -endobj - -2001 0 obj -<< - /Type /StructElem - /S /Link - /P 2000 0 R - /K [<< - /Type /OBJR - /Pg 4905 0 R - /Obj 4903 0 R - >> 2002 0 R] ->> -endobj - -2002 0 obj -<< - /Type /StructElem - /S /Span - /P 2001 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [68] - /Pg 4905 0 R ->> -endobj - -2003 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [66] - /Pg 4905 0 R ->> -endobj - -2004 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [64] - /Pg 4905 0 R ->> -endobj - -2005 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [61] - /Pg 4905 0 R ->> -endobj - -2006 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [57] - /Pg 4905 0 R ->> -endobj - -2007 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [55] - /Pg 4905 0 R ->> -endobj - -2008 0 obj -<< - /Type /StructElem - /S /Link - /P 1985 0 R - /K [53 << - /Type /OBJR - /Pg 4905 0 R - /Obj 4902 0 R - >>] - /Pg 4905 0 R ->> -endobj - -2009 0 obj -<< - /Type /StructElem - /S /Link - /P 1985 0 R - /K [51 << - /Type /OBJR - /Pg 4905 0 R - /Obj 4901 0 R - >>] - /Pg 4905 0 R ->> -endobj - -2010 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2097 0 R 2011 0 R] ->> -endobj - -2011 0 obj -<< - /Type /StructElem - /S /Div - /P 2010 0 R - /K [2096 0 R 2094 0 R 2091 0 R 2088 0 R 2087 0 R 2086 0 R 2083 0 R 2081 0 R 2080 0 R 2079 0 R 2078 0 R 2076 0 R 2074 0 R 2073 0 R 2072 0 R 2068 0 R 2066 0 R 2065 0 R 2064 0 R 2063 0 R 2062 0 R 2057 0 R 2055 0 R 2054 0 R 2053 0 R 2052 0 R 2050 0 R 2048 0 R 2047 0 R 2043 0 R 2041 0 R 2040 0 R 2034 0 R 2031 0 R 2030 0 R 2024 0 R 2022 0 R 2021 0 R 2019 0 R 2017 0 R 2016 0 R 2013 0 R 2012 0 R] ->> -endobj - -2012 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2013 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2015 0 R 2014 0 R] ->> -endobj - -2014 0 obj -<< - /Type /StructElem - /S /Span - /P 2013 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [50] - /Pg 4905 0 R ->> -endobj - -2015 0 obj -<< - /Type /StructElem - /S /Strong - /P 2013 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [49] - /Pg 4905 0 R ->> -endobj - -2016 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2017 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2018 0 R] ->> -endobj - -2018 0 obj -<< - /Type /StructElem - /S /Span - /P 2017 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [48] - /Pg 4905 0 R ->> -endobj - -2019 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2020 0 R] ->> -endobj - -2020 0 obj -<< - /Type /StructElem - /S /Span - /P 2019 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [47] - /Pg 4905 0 R ->> -endobj - -2021 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2022 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2023 0 R] ->> -endobj - -2023 0 obj -<< - /Type /StructElem - /S /Span - /P 2022 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46] - /Pg 4905 0 R ->> -endobj - -2024 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2029 0 R 2028 0 R 2027 0 R 2026 0 R 2025 0 R] ->> -endobj - -2025 0 obj -<< - /Type /StructElem - /S /Span - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45] - /Pg 4905 0 R ->> -endobj - -2026 0 obj -<< - /Type /StructElem - /S /Formula - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 4905 0 R ->> -endobj - -2027 0 obj -<< - /Type /StructElem - /S /Span - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4905 0 R ->> -endobj - -2028 0 obj -<< - /Type /StructElem - /S /Formula - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42] - /Pg 4905 0 R ->> -endobj - -2029 0 obj -<< - /Type /StructElem - /S /Span - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4905 0 R ->> -endobj - -2030 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2031 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2033 0 R 2032 0 R] ->> -endobj - -2032 0 obj -<< - /Type /StructElem - /S /Span - /P 2031 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40] - /Pg 4905 0 R ->> -endobj - -2033 0 obj -<< - /Type /StructElem - /S /Div - /P 2031 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [] ->> -endobj - -2034 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2039 0 R 2038 0 R 2037 0 R 2036 0 R 2035 0 R] ->> -endobj - -2035 0 obj -<< - /Type /StructElem - /S /Span - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [39] - /Pg 4905 0 R ->> -endobj - -2036 0 obj -<< - /Type /StructElem - /S /Formula - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38] - /Pg 4905 0 R ->> -endobj - -2037 0 obj -<< - /Type /StructElem - /S /Span - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37] - /Pg 4905 0 R ->> -endobj - -2038 0 obj -<< - /Type /StructElem - /S /Formula - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4905 0 R ->> -endobj - -2039 0 obj -<< - /Type /StructElem - /S /Span - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35] - /Pg 4905 0 R ->> -endobj - -2040 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2041 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2042 0 R] ->> -endobj - -2042 0 obj -<< - /Type /StructElem - /S /Span - /P 2041 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34] - /Pg 4905 0 R ->> -endobj - -2043 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2046 0 R 2045 0 R 2044 0 R] ->> -endobj - -2044 0 obj -<< - /Type /StructElem - /S /Span - /P 2043 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4905 0 R ->> -endobj - -2045 0 obj -<< - /Type /StructElem - /S /Formula - /P 2043 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4905 0 R ->> -endobj - -2046 0 obj -<< - /Type /StructElem - /S /Span - /P 2043 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4905 0 R ->> -endobj - -2047 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2048 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2049 0 R] ->> -endobj - -2049 0 obj -<< - /Type /StructElem - /S /Span - /P 2048 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4905 0 R ->> -endobj - -2050 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2051 0 R] ->> -endobj - -2051 0 obj -<< - /Type /StructElem - /S /Span - /P 2050 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4905 0 R ->> -endobj - -2052 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2053 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2054 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2055 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2056 0 R] ->> -endobj - -2056 0 obj -<< - /Type /StructElem - /S /Span - /P 2055 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4905 0 R ->> -endobj - -2057 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2061 0 R 2060 0 R 2059 0 R 2058 0 R] ->> -endobj - -2058 0 obj -<< - /Type /StructElem - /S /Formula - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4905 0 R ->> -endobj - -2059 0 obj -<< - /Type /StructElem - /S /Span - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4905 0 R ->> -endobj - -2060 0 obj -<< - /Type /StructElem - /S /Formula - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4905 0 R ->> -endobj - -2061 0 obj -<< - /Type /StructElem - /S /Span - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24] - /Pg 4905 0 R ->> -endobj - -2062 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2063 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2064 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2065 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2066 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2067 0 R] ->> -endobj - -2067 0 obj -<< - /Type /StructElem - /S /Span - /P 2066 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4905 0 R ->> -endobj - -2068 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2071 0 R 2070 0 R 2069 0 R] ->> -endobj - -2069 0 obj -<< - /Type /StructElem - /S /Span - /P 2068 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20 22] - /Pg 4905 0 R ->> -endobj - -2070 0 obj -<< - /Type /StructElem - /S /Strong - /P 2068 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4905 0 R ->> -endobj - -2071 0 obj -<< - /Type /StructElem - /S /Strong - /P 2068 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4905 0 R ->> -endobj - -2072 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2073 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2074 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2075 0 R] ->> -endobj - -2075 0 obj -<< - /Type /StructElem - /S /Span - /P 2074 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4905 0 R ->> -endobj - -2076 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2077 0 R] ->> -endobj - -2077 0 obj -<< - /Type /StructElem - /S /Span - /P 2076 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4905 0 R ->> -endobj - -2078 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2079 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2080 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2081 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2082 0 R] ->> -endobj - -2082 0 obj -<< - /Type /StructElem - /S /Span - /P 2081 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4905 0 R ->> -endobj - -2083 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2085 0 R 2084 0 R] ->> -endobj - -2084 0 obj -<< - /Type /StructElem - /S /Span - /P 2083 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 4905 0 R ->> -endobj - -2085 0 obj -<< - /Type /StructElem - /S /Strong - /P 2083 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4905 0 R ->> -endobj - -2086 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2087 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2088 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2090 0 R 2089 0 R] ->> -endobj - -2089 0 obj -<< - /Type /StructElem - /S /Span - /P 2088 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4905 0 R ->> -endobj - -2090 0 obj -<< - /Type /StructElem - /S /Div - /P 2088 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [] ->> -endobj - -2091 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2093 0 R 2092 0 R] ->> -endobj - -2092 0 obj -<< - /Type /StructElem - /S /Span - /P 2091 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4905 0 R ->> -endobj - -2093 0 obj -<< - /Type /StructElem - /S /Strong - /P 2091 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11] - /Pg 4905 0 R ->> -endobj - -2094 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2095 0 R] ->> -endobj - -2095 0 obj -<< - /Type /StructElem - /S /Span - /P 2094 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4905 0 R ->> -endobj - -2096 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2097 0 obj -<< - /Type /StructElem - /S /P - /P 2010 0 R - /K [2098 0 R 9] - /Pg 4905 0 R ->> -endobj - -2098 0 obj -<< - /Type /StructElem - /S /Strong - /P 2097 0 R - /K [8] - /Pg 4905 0 R ->> -endobj - -2099 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2116 0 R 173 2115 0 R 175 2114 0 R 177 2113 0 R 179 2112 0 R 181 182 2111 0 R 184 2110 0 R 186 2109 0 R 188 2108 0 R 190 191 2107 0 R 193 2106 0 R 195 2105 0 R 197 198 2104 0 R 200 2103 0 R 202 << - /Type /MCR - /MCID 0 - /Pg 4905 0 R - >> 2102 0 R << - /Type /MCR - /MCID 2 - /Pg 4905 0 R - >> 2101 0 R << - /Type /MCR - /MCID 4 - /Pg 4905 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4905 0 R - >> 2100 0 R << - /Type /MCR - /MCID 7 - /Pg 4905 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2100 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [6] - /Pg 4905 0 R ->> -endobj - -2101 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [3] - /Pg 4905 0 R ->> -endobj - -2102 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [1] - /Pg 4905 0 R ->> -endobj - -2103 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [201 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4898 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2104 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [199] - /Pg 4899 0 R ->> -endobj - -2105 0 obj -<< - /Type /StructElem - /S /Em - /P 2099 0 R - /K [196] - /Pg 4899 0 R ->> -endobj - -2106 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [194 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4897 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2107 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [192] - /Pg 4899 0 R ->> -endobj - -2108 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [189] - /Pg 4899 0 R ->> -endobj - -2109 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [187 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4896 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2110 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [185] - /Pg 4899 0 R ->> -endobj - -2111 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [183] - /Pg 4899 0 R ->> -endobj - -2112 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [180] - /Pg 4899 0 R ->> -endobj - -2113 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [178] - /Pg 4899 0 R ->> -endobj - -2114 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [176] - /Pg 4899 0 R ->> -endobj - -2115 0 obj -<< - /Type /StructElem - /S /Em - /P 2099 0 R - /K [174] - /Pg 4899 0 R ->> -endobj - -2116 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [172 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4895 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2117 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [149 2126 0 R 151 2125 0 R 153 2124 0 R 155 2123 0 R 157 158 2122 0 R 160 2121 0 R 162 163 2120 0 R 166 2119 0 R 168 2118 0 R 170 171] - /Pg 4899 0 R ->> -endobj - -2118 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [169] - /Pg 4899 0 R ->> -endobj - -2119 0 obj -<< - /Type /StructElem - /S /Link - /P 2117 0 R - /K [167 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4894 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2120 0 obj -<< - /Type /StructElem - /S /Formula - /P 2117 0 R - /K [164 165] - /Pg 4899 0 R ->> -endobj - -2121 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [161] - /Pg 4899 0 R ->> -endobj - -2122 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [159] - /Pg 4899 0 R ->> -endobj - -2123 0 obj -<< - /Type /StructElem - /S /Link - /P 2117 0 R - /K [156 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4893 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2124 0 obj -<< - /Type /StructElem - /S /Link - /P 2117 0 R - /K [154 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4892 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2125 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [152] - /Pg 4899 0 R ->> -endobj - -2126 0 obj -<< - /Type /StructElem - /S /Em - /P 2117 0 R - /K [150] - /Pg 4899 0 R ->> -endobj - -2127 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Component Lifecycle) - /K [147 148] - /Pg 4899 0 R ->> -endobj - -2128 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2141 0 R 115 116 2140 0 R 118 119 2139 0 R 121 2138 0 R 123 2137 0 R 125 126 2136 0 R 128 2135 0 R 130 131 2134 0 R 133 134 2133 0 R 136 2132 0 R 138 2131 0 R 140 2130 0 R 142 143 2129 0 R 145 146] - /Pg 4899 0 R ->> -endobj - -2129 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [144] - /Pg 4899 0 R ->> -endobj - -2130 0 obj -<< - /Type /StructElem - /S /Link - /P 2128 0 R - /K [141 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4891 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2131 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [139] - /Pg 4899 0 R ->> -endobj - -2132 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [137] - /Pg 4899 0 R ->> -endobj - -2133 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [135] - /Pg 4899 0 R ->> -endobj - -2134 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [132] - /Pg 4899 0 R ->> -endobj - -2135 0 obj -<< - /Type /StructElem - /S /Link - /P 2128 0 R - /K [129 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4890 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2136 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [127] - /Pg 4899 0 R ->> -endobj - -2137 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [124] - /Pg 4899 0 R ->> -endobj - -2138 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [122] - /Pg 4899 0 R ->> -endobj - -2139 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [120] - /Pg 4899 0 R ->> -endobj - -2140 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [117] - /Pg 4899 0 R ->> -endobj - -2141 0 obj -<< - /Type /StructElem - /S /Strong - /P 2128 0 R - /K [114] - /Pg 4899 0 R ->> -endobj - -2142 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2206 0 R 2143 0 R] ->> -endobj - -2143 0 obj -<< - /Type /StructElem - /S /Div - /P 2142 0 R - /K [2205 0 R 2203 0 R 2200 0 R 2198 0 R 2197 0 R 2196 0 R 2191 0 R 2189 0 R 2188 0 R 2187 0 R 2186 0 R 2181 0 R 2179 0 R 2178 0 R 2177 0 R 2176 0 R 2175 0 R 2162 0 R 2160 0 R 2159 0 R 2158 0 R 2157 0 R 2156 0 R 2155 0 R 2153 0 R 2151 0 R 2150 0 R 2149 0 R 2148 0 R 2147 0 R 2145 0 R 2144 0 R] ->> -endobj - -2144 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2145 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2146 0 R] ->> -endobj - -2146 0 obj -<< - /Type /StructElem - /S /Strong - /P 2145 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113] - /Pg 4899 0 R ->> -endobj - -2147 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2148 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2149 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2150 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2151 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2152 0 R] ->> -endobj - -2152 0 obj -<< - /Type /StructElem - /S /Span - /P 2151 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4899 0 R ->> -endobj - -2153 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2154 0 R] ->> -endobj - -2154 0 obj -<< - /Type /StructElem - /S /Span - /P 2153 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4899 0 R ->> -endobj - -2155 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2156 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2157 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2158 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2159 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2160 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2161 0 R] ->> -endobj - -2161 0 obj -<< - /Type /StructElem - /S /Span - /P 2160 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4899 0 R ->> -endobj - -2162 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2174 0 R 2173 0 R 2172 0 R 2171 0 R 2170 0 R 2169 0 R 2168 0 R 2167 0 R 2166 0 R 2165 0 R 2164 0 R 2163 0 R] ->> -endobj - -2163 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [108] - /Pg 4899 0 R ->> -endobj - -2164 0 obj -<< - /Type /StructElem - /S /Strong - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4899 0 R ->> -endobj - -2165 0 obj -<< - /Type /StructElem - /S /Code - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4899 0 R ->> -endobj - -2166 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4899 0 R ->> -endobj - -2167 0 obj -<< - /Type /StructElem - /S /Formula - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4899 0 R ->> -endobj - -2168 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 4899 0 R ->> -endobj - -2169 0 obj -<< - /Type /StructElem - /S /Code - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4899 0 R ->> -endobj - -2170 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100 102] - /Pg 4899 0 R ->> -endobj - -2171 0 obj -<< - /Type /StructElem - /S /Strong - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4899 0 R ->> -endobj - -2172 0 obj -<< - /Type /StructElem - /S /Formula - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4899 0 R ->> -endobj - -2173 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4899 0 R ->> -endobj - -2174 0 obj -<< - /Type /StructElem - /S /Strong - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4899 0 R ->> -endobj - -2175 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2176 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2177 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2178 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2179 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2180 0 R] ->> -endobj - -2180 0 obj -<< - /Type /StructElem - /S /Span - /P 2179 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4899 0 R ->> -endobj - -2181 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2185 0 R 2184 0 R 2183 0 R 2182 0 R] ->> -endobj - -2182 0 obj -<< - /Type /StructElem - /S /Span - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92 94] - /Pg 4899 0 R ->> -endobj - -2183 0 obj -<< - /Type /StructElem - /S /Strong - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4899 0 R ->> -endobj - -2184 0 obj -<< - /Type /StructElem - /S /Strong - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4899 0 R ->> -endobj - -2185 0 obj -<< - /Type /StructElem - /S /Strong - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4899 0 R ->> -endobj - -2186 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2187 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2188 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2189 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2190 0 R] ->> -endobj - -2190 0 obj -<< - /Type /StructElem - /S /Span - /P 2189 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [90] - /Pg 4899 0 R ->> -endobj - -2191 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2195 0 R 2194 0 R 2193 0 R 2192 0 R] ->> -endobj - -2192 0 obj -<< - /Type /StructElem - /S /Span - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 88] - /Pg 4899 0 R ->> -endobj - -2193 0 obj -<< - /Type /StructElem - /S /Strong - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [89] - /Pg 4899 0 R ->> -endobj - -2194 0 obj -<< - /Type /StructElem - /S /Strong - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87] - /Pg 4899 0 R ->> -endobj - -2195 0 obj -<< - /Type /StructElem - /S /Strong - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4899 0 R ->> -endobj - -2196 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2197 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2198 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2199 0 R] ->> -endobj - -2199 0 obj -<< - /Type /StructElem - /S /Span - /P 2198 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4899 0 R ->> -endobj - -2200 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2202 0 R 2201 0 R] ->> -endobj - -2201 0 obj -<< - /Type /StructElem - /S /Span - /P 2200 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4899 0 R ->> -endobj - -2202 0 obj -<< - /Type /StructElem - /S /Strong - /P 2200 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [82] - /Pg 4899 0 R ->> -endobj - -2203 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2204 0 R] ->> -endobj - -2204 0 obj -<< - /Type /StructElem - /S /Span - /P 2203 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [81] - /Pg 4899 0 R ->> -endobj - -2205 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2206 0 obj -<< - /Type /StructElem - /S /P - /P 2142 0 R - /K [2207 0 R 80] - /Pg 4899 0 R ->> -endobj - -2207 0 obj -<< - /Type /StructElem - /S /Strong - /P 2206 0 R - /K [79] - /Pg 4899 0 R ->> -endobj - -2208 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2216 0 R 58 59 2215 0 R 61 62 2214 0 R 64 2213 0 R 66 67 2212 0 R 69 2211 0 R 73 2210 0 R 75 76 2209 0 R 78] - /Pg 4899 0 R ->> -endobj - -2209 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [77 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4889 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2210 0 obj -<< - /Type /StructElem - /S /Code - /P 2208 0 R - /K [74] - /Pg 4899 0 R ->> -endobj - -2211 0 obj -<< - /Type /StructElem - /S /Formula - /P 2208 0 R - /K [70 71 72] - /Pg 4899 0 R ->> -endobj - -2212 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [68 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4888 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2213 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [65 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4887 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2214 0 obj -<< - /Type /StructElem - /S /Code - /P 2208 0 R - /K [63] - /Pg 4899 0 R ->> -endobj - -2215 0 obj -<< - /Type /StructElem - /S /Code - /P 2208 0 R - /K [60] - /Pg 4899 0 R ->> -endobj - -2216 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [57 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4886 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2217 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2320 0 R 2218 0 R] ->> -endobj - -2218 0 obj -<< - /Type /StructElem - /S /Div - /P 2217 0 R - /K [2319 0 R 2317 0 R 2314 0 R 2312 0 R 2311 0 R 2310 0 R 2303 0 R 2301 0 R 2300 0 R 2294 0 R 2292 0 R 2289 0 R 2287 0 R 2286 0 R 2285 0 R 2282 0 R 2280 0 R 2279 0 R 2278 0 R 2277 0 R 2270 0 R 2268 0 R 2267 0 R 2266 0 R 2259 0 R 2257 0 R 2256 0 R 2255 0 R 2253 0 R 2251 0 R 2250 0 R 2249 0 R 2245 0 R 2243 0 R 2242 0 R 2241 0 R 2240 0 R 2239 0 R 2233 0 R 2231 0 R 2230 0 R 2229 0 R 2228 0 R 2226 0 R 2224 0 R 2223 0 R 2220 0 R 2219 0 R] ->> -endobj - -2219 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2220 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2222 0 R 2221 0 R] ->> -endobj - -2221 0 obj -<< - /Type /StructElem - /S /Span - /P 2220 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [56] - /Pg 4899 0 R ->> -endobj - -2222 0 obj -<< - /Type /StructElem - /S /Strong - /P 2220 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [55] - /Pg 4899 0 R ->> -endobj - -2223 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2224 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2225 0 R] ->> -endobj - -2225 0 obj -<< - /Type /StructElem - /S /Span - /P 2224 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [54] - /Pg 4899 0 R ->> -endobj - -2226 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2227 0 R] ->> -endobj - -2227 0 obj -<< - /Type /StructElem - /S /Span - /P 2226 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [53] - /Pg 4899 0 R ->> -endobj - -2228 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2229 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2230 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2231 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2232 0 R] ->> -endobj - -2232 0 obj -<< - /Type /StructElem - /S /Span - /P 2231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52] - /Pg 4899 0 R ->> -endobj - -2233 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2238 0 R 2237 0 R 2236 0 R 2235 0 R 2234 0 R] ->> -endobj - -2234 0 obj -<< - /Type /StructElem - /S /Formula - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46 47 48 49 50 51] - /Pg 4899 0 R ->> -endobj - -2235 0 obj -<< - /Type /StructElem - /S /Span - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44 45] - /Pg 4899 0 R ->> -endobj - -2236 0 obj -<< - /Type /StructElem - /S /Code - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4899 0 R ->> -endobj - -2237 0 obj -<< - /Type /StructElem - /S /Span - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42] - /Pg 4899 0 R ->> -endobj - -2238 0 obj -<< - /Type /StructElem - /S /Strong - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4899 0 R ->> -endobj - -2239 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2240 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2241 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2242 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2243 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2244 0 R] ->> -endobj - -2244 0 obj -<< - /Type /StructElem - /S /Span - /P 2243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40] - /Pg 4899 0 R ->> -endobj - -2245 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2248 0 R 2247 0 R 2246 0 R] ->> -endobj - -2246 0 obj -<< - /Type /StructElem - /S /Span - /P 2245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37 39] - /Pg 4899 0 R ->> -endobj - -2247 0 obj -<< - /Type /StructElem - /S /Strong - /P 2245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38] - /Pg 4899 0 R ->> -endobj - -2248 0 obj -<< - /Type /StructElem - /S /Strong - /P 2245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4899 0 R ->> -endobj - -2249 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2250 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2251 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2252 0 R] ->> -endobj - -2252 0 obj -<< - /Type /StructElem - /S /Span - /P 2251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35] - /Pg 4899 0 R ->> -endobj - -2253 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2254 0 R] ->> -endobj - -2254 0 obj -<< - /Type /StructElem - /S /Span - /P 2253 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34] - /Pg 4899 0 R ->> -endobj - -2255 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2256 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2257 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2258 0 R] ->> -endobj - -2258 0 obj -<< - /Type /StructElem - /S /Span - /P 2257 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4899 0 R ->> -endobj - -2259 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2265 0 R 2264 0 R 2263 0 R 2262 0 R 2261 0 R 2260 0 R] ->> -endobj - -2260 0 obj -<< - /Type /StructElem - /S /Formula - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24 25 26 27 28 29 30 31 32] - /Pg 4899 0 R ->> -endobj - -2261 0 obj -<< - /Type /StructElem - /S /Span - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [22 23] - /Pg 4899 0 R ->> -endobj - -2262 0 obj -<< - /Type /StructElem - /S /Formula - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4899 0 R ->> -endobj - -2263 0 obj -<< - /Type /StructElem - /S /Span - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20] - /Pg 4899 0 R ->> -endobj - -2264 0 obj -<< - /Type /StructElem - /S /Code - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4899 0 R ->> -endobj - -2265 0 obj -<< - /Type /StructElem - /S /Span - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4899 0 R ->> -endobj - -2266 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2267 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2268 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2269 0 R] ->> -endobj - -2269 0 obj -<< - /Type /StructElem - /S /Span - /P 2268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4899 0 R ->> -endobj - -2270 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2276 0 R 2275 0 R 2274 0 R 2273 0 R 2272 0 R 2271 0 R] ->> -endobj - -2271 0 obj -<< - /Type /StructElem - /S /Formula - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13 14 15 16] - /Pg 4899 0 R ->> -endobj - -2272 0 obj -<< - /Type /StructElem - /S /Span - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 12] - /Pg 4899 0 R ->> -endobj - -2273 0 obj -<< - /Type /StructElem - /S /Code - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4899 0 R ->> -endobj - -2274 0 obj -<< - /Type /StructElem - /S /Span - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4899 0 R ->> -endobj - -2275 0 obj -<< - /Type /StructElem - /S /Formula - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4899 0 R ->> -endobj - -2276 0 obj -<< - /Type /StructElem - /S /Span - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4899 0 R ->> -endobj - -2277 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2278 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2279 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2280 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2281 0 R] ->> -endobj - -2281 0 obj -<< - /Type /StructElem - /S /Span - /P 2280 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4899 0 R ->> -endobj - -2282 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2284 0 R 2283 0 R] ->> -endobj - -2283 0 obj -<< - /Type /StructElem - /S /Span - /P 2282 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4899 0 R ->> -endobj - -2284 0 obj -<< - /Type /StructElem - /S /Strong - /P 2282 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4899 0 R ->> -endobj - -2285 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2286 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2287 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2288 0 R] ->> -endobj - -2288 0 obj -<< - /Type /StructElem - /S /Span - /P 2287 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4899 0 R ->> -endobj - -2289 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2291 0 R 2290 0 R] ->> -endobj - -2290 0 obj -<< - /Type /StructElem - /S /Span - /P 2289 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4899 0 R ->> -endobj - -2291 0 obj -<< - /Type /StructElem - /S /Strong - /P 2289 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4899 0 R ->> -endobj - -2292 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2293 0 R] ->> -endobj - -2293 0 obj -<< - /Type /StructElem - /S /Span - /P 2292 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4899 0 R ->> -endobj - -2294 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2299 0 R 2298 0 R 2297 0 R 2296 0 R 2295 0 R] ->> -endobj - -2295 0 obj -<< - /Type /StructElem - /S /Formula - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [248 249 250 251 252 253 254] - /Pg 4884 0 R ->> -endobj - -2296 0 obj -<< - /Type /StructElem - /S /Span - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [246 247] - /Pg 4884 0 R ->> -endobj - -2297 0 obj -<< - /Type /StructElem - /S /Code - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [245] - /Pg 4884 0 R ->> -endobj - -2298 0 obj -<< - /Type /StructElem - /S /Span - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [244] - /Pg 4884 0 R ->> -endobj - -2299 0 obj -<< - /Type /StructElem - /S /Strong - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [243] - /Pg 4884 0 R ->> -endobj - -2300 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2301 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2302 0 R] ->> -endobj - -2302 0 obj -<< - /Type /StructElem - /S /Span - /P 2301 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [242] - /Pg 4884 0 R ->> -endobj - -2303 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2309 0 R 2308 0 R 2307 0 R 2306 0 R 2305 0 R 2304 0 R] ->> -endobj - -2304 0 obj -<< - /Type /StructElem - /S /Formula - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [238 239 240 241] - /Pg 4884 0 R ->> -endobj - -2305 0 obj -<< - /Type /StructElem - /S /Span - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [236 237] - /Pg 4884 0 R ->> -endobj - -2306 0 obj -<< - /Type /StructElem - /S /Code - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [235] - /Pg 4884 0 R ->> -endobj - -2307 0 obj -<< - /Type /StructElem - /S /Span - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [234] - /Pg 4884 0 R ->> -endobj - -2308 0 obj -<< - /Type /StructElem - /S /Formula - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [233] - /Pg 4884 0 R ->> -endobj - -2309 0 obj -<< - /Type /StructElem - /S /Span - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [232] - /Pg 4884 0 R ->> -endobj - -2310 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2311 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2312 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2313 0 R] ->> -endobj - -2313 0 obj -<< - /Type /StructElem - /S /Span - /P 2312 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [231] - /Pg 4884 0 R ->> -endobj - -2314 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2316 0 R 2315 0 R] ->> -endobj - -2315 0 obj -<< - /Type /StructElem - /S /Span - /P 2314 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [230] - /Pg 4884 0 R ->> -endobj - -2316 0 obj -<< - /Type /StructElem - /S /Strong - /P 2314 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [229] - /Pg 4884 0 R ->> -endobj - -2317 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2318 0 R] ->> -endobj - -2318 0 obj -<< - /Type /StructElem - /S /Span - /P 2317 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [228] - /Pg 4884 0 R ->> -endobj - -2319 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2320 0 obj -<< - /Type /StructElem - /S /P - /P 2217 0 R - /K [2321 0 R 227] - /Pg 4884 0 R ->> -endobj - -2321 0 obj -<< - /Type /StructElem - /S /Strong - /P 2320 0 R - /K [226] - /Pg 4884 0 R ->> -endobj - -2322 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2332 0 R 190 2331 0 R 197 2330 0 R 200 2329 0 R 202 203 2328 0 R 205 2327 0 R 207 2326 0 R 209 2325 0 R 216 217 2324 0 R 222 223 2323 0 R 225] - /Pg 4884 0 R ->> -endobj - -2323 0 obj -<< - /Type /StructElem - /S /Code - /P 2322 0 R - /K [224] - /Pg 4884 0 R ->> -endobj - -2324 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [218 219 220 221] - /Pg 4884 0 R ->> -endobj - -2325 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [210 211 212 213 214 215] - /Pg 4884 0 R ->> -endobj - -2326 0 obj -<< - /Type /StructElem - /S /Code - /P 2322 0 R - /K [208] - /Pg 4884 0 R ->> -endobj - -2327 0 obj -<< - /Type /StructElem - /S /Link - /P 2322 0 R - /K [206 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4883 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2328 0 obj -<< - /Type /StructElem - /S /Code - /P 2322 0 R - /K [204] - /Pg 4884 0 R ->> -endobj - -2329 0 obj -<< - /Type /StructElem - /S /Link - /P 2322 0 R - /K [201 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4882 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2330 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [198 199] - /Pg 4884 0 R ->> -endobj - -2331 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [191 192 193 194 195 196] - /Pg 4884 0 R ->> -endobj - -2332 0 obj -<< - /Type /StructElem - /S /Strong - /P 2322 0 R - /K [189] - /Pg 4884 0 R ->> -endobj - -2333 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [140 2344 0 R 155 2343 0 R 157 158 2342 0 R 160 2341 0 R 165 2340 0 R 167 2339 0 R 175 2338 0 R 177 2337 0 R 179 2336 0 R 181 182 2335 0 R 184 185 2334 0 R 188] - /Pg 4884 0 R ->> -endobj - -2334 0 obj -<< - /Type /StructElem - /S /Em - /P 2333 0 R - /K [186 187] - /Pg 4884 0 R ->> -endobj - -2335 0 obj -<< - /Type /StructElem - /S /Em - /P 2333 0 R - /K [183] - /Pg 4884 0 R ->> -endobj - -2336 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [180] - /Pg 4884 0 R ->> -endobj - -2337 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [178] - /Pg 4884 0 R ->> -endobj - -2338 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [176] - /Pg 4884 0 R ->> -endobj - -2339 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [168 169 170 171 172 173 174] - /Pg 4884 0 R ->> -endobj - -2340 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [166] - /Pg 4884 0 R ->> -endobj - -2341 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [161 162 163 164] - /Pg 4884 0 R ->> -endobj - -2342 0 obj -<< - /Type /StructElem - /S /Link - /P 2333 0 R - /K [159 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4881 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2343 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [156] - /Pg 4884 0 R ->> -endobj - -2344 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [141 142 143 144 145 146 147 148 149 150 151 152 153 154] - /Pg 4884 0 R ->> -endobj - -2345 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2356 0 R 2351 0 R 2346 0 R] ->> -endobj - -2346 0 obj -<< - /Type /StructElem - /S /LI - /P 2345 0 R - /K [2350 0 R 2347 0 R] ->> -endobj - -2347 0 obj -<< - /Type /StructElem - /S /LBody - /P 2346 0 R - /K [2349 0 R 128 2348 0 R 139] - /Pg 4884 0 R ->> -endobj - -2348 0 obj -<< - /Type /StructElem - /S /Formula - /P 2347 0 R - /K [129 130 131 132 133 134 135 136 137 138] - /Pg 4884 0 R ->> -endobj - -2349 0 obj -<< - /Type /StructElem - /S /Code - /P 2347 0 R - /K [127] - /Pg 4884 0 R ->> -endobj - -2350 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2346 0 R - /K [126] - /Pg 4884 0 R ->> -endobj - -2351 0 obj -<< - /Type /StructElem - /S /LI - /P 2345 0 R - /K [2355 0 R 2352 0 R] ->> -endobj - -2352 0 obj -<< - /Type /StructElem - /S /LBody - /P 2351 0 R - /K [2354 0 R 116 2353 0 R 125] - /Pg 4884 0 R ->> -endobj - -2353 0 obj -<< - /Type /StructElem - /S /Formula - /P 2352 0 R - /K [117 118 119 120 121 122 123 124] - /Pg 4884 0 R ->> -endobj - -2354 0 obj -<< - /Type /StructElem - /S /Code - /P 2352 0 R - /K [115] - /Pg 4884 0 R ->> -endobj - -2355 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2351 0 R - /K [114] - /Pg 4884 0 R ->> -endobj - -2356 0 obj -<< - /Type /StructElem - /S /LI - /P 2345 0 R - /K [2360 0 R 2357 0 R] ->> -endobj - -2357 0 obj -<< - /Type /StructElem - /S /LBody - /P 2356 0 R - /K [2359 0 R 102 2358 0 R 113] - /Pg 4884 0 R ->> -endobj - -2358 0 obj -<< - /Type /StructElem - /S /Formula - /P 2357 0 R - /K [103 104 105 106 107 108 109 110 111 112] - /Pg 4884 0 R ->> -endobj - -2359 0 obj -<< - /Type /StructElem - /S /Code - /P 2357 0 R - /K [101] - /Pg 4884 0 R ->> -endobj - -2360 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2356 0 R - /K [100] - /Pg 4884 0 R ->> -endobj - -2361 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [96 2362 0 R 98 99] - /Pg 4884 0 R ->> -endobj - -2362 0 obj -<< - /Type /StructElem - /S /Link - /P 2361 0 R - /K [97 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4880 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2363 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Coeffect Operations) - /K [94 95] - /Pg 4884 0 R ->> -endobj - -2364 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2377 0 R 62 2376 0 R 64 65 2375 0 R 67 2374 0 R 69 2373 0 R 71 2372 0 R 73 2371 0 R 75 76 2370 0 R 78 79 2369 0 R 81 82 2368 0 R 86 2367 0 R 88 89 2366 0 R 91 2365 0 R 93] - /Pg 4884 0 R ->> -endobj - -2365 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [92] - /Pg 4884 0 R ->> -endobj - -2366 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [90] - /Pg 4884 0 R ->> -endobj - -2367 0 obj -<< - /Type /StructElem - /S /Link - /P 2364 0 R - /K [87 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4879 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2368 0 obj -<< - /Type /StructElem - /S /Formula - /P 2364 0 R - /K [83 84 85] - /Pg 4884 0 R ->> -endobj - -2369 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [80] - /Pg 4884 0 R ->> -endobj - -2370 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [77] - /Pg 4884 0 R ->> -endobj - -2371 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [74] - /Pg 4884 0 R ->> -endobj - -2372 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [72] - /Pg 4884 0 R ->> -endobj - -2373 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [70] - /Pg 4884 0 R ->> -endobj - -2374 0 obj -<< - /Type /StructElem - /S /Link - /P 2364 0 R - /K [68 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4878 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2375 0 obj -<< - /Type /StructElem - /S /Formula - /P 2364 0 R - /K [66] - /Pg 4884 0 R ->> -endobj - -2376 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [63] - /Pg 4884 0 R ->> -endobj - -2377 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [61] - /Pg 4884 0 R ->> -endobj - -2378 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 2387 0 R 36 2386 0 R 40 2385 0 R 42 43 44 2384 0 R 46 47 2383 0 R 49 2382 0 R 2381 0 R 55 56 2380 0 R 58 2379 0 R 60] - /Pg 4884 0 R ->> -endobj - -2379 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [59] - /Pg 4884 0 R ->> -endobj - -2380 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [57] - /Pg 4884 0 R ->> -endobj - -2381 0 obj -<< - /Type /StructElem - /S /Formula - /P 2378 0 R - /K [51 52 53 54] - /Pg 4884 0 R ->> -endobj - -2382 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [50] - /Pg 4884 0 R ->> -endobj - -2383 0 obj -<< - /Type /StructElem - /S /Link - /P 2378 0 R - /K [48 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4877 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2384 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [45] - /Pg 4884 0 R ->> -endobj - -2385 0 obj -<< - /Type /StructElem - /S /Link - /P 2378 0 R - /K [41 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4876 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2386 0 obj -<< - /Type /StructElem - /S /Formula - /P 2378 0 R - /K [37 38 39] - /Pg 4884 0 R ->> -endobj - -2387 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [35] - /Pg 4884 0 R ->> -endobj - -2388 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2527 0 R 2389 0 R] ->> -endobj - -2389 0 obj -<< - /Type /StructElem - /S /Div - /P 2388 0 R - /K [2526 0 R 2524 0 R 2521 0 R 2519 0 R 2518 0 R 2517 0 R 2513 0 R 2511 0 R 2510 0 R 2506 0 R 2504 0 R 2503 0 R 2500 0 R 2498 0 R 2497 0 R 2496 0 R 2495 0 R 2490 0 R 2488 0 R 2487 0 R 2486 0 R 2480 0 R 2478 0 R 2477 0 R 2476 0 R 2471 0 R 2469 0 R 2468 0 R 2465 0 R 2463 0 R 2460 0 R 2458 0 R 2457 0 R 2456 0 R 2452 0 R 2450 0 R 2449 0 R 2443 0 R 2441 0 R 2440 0 R 2437 0 R 2435 0 R 2434 0 R 2433 0 R 2432 0 R 2427 0 R 2425 0 R 2424 0 R 2423 0 R 2419 0 R 2417 0 R 2416 0 R 2415 0 R 2410 0 R 2408 0 R 2407 0 R 2406 0 R 2404 0 R 2402 0 R 2401 0 R 2397 0 R 2395 0 R 2394 0 R 2391 0 R 2390 0 R] ->> -endobj - -2390 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2391 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2393 0 R 2392 0 R] ->> -endobj - -2392 0 obj -<< - /Type /StructElem - /S /Span - /P 2391 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4884 0 R ->> -endobj - -2393 0 obj -<< - /Type /StructElem - /S /Strong - /P 2391 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4884 0 R ->> -endobj - -2394 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2395 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2396 0 R] ->> -endobj - -2396 0 obj -<< - /Type /StructElem - /S /Span - /P 2395 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4884 0 R ->> -endobj - -2397 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2400 0 R 2399 0 R 2398 0 R] ->> -endobj - -2398 0 obj -<< - /Type /StructElem - /S /Span - /P 2397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4884 0 R ->> -endobj - -2399 0 obj -<< - /Type /StructElem - /S /Formula - /P 2397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4884 0 R ->> -endobj - -2400 0 obj -<< - /Type /StructElem - /S /Span - /P 2397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4884 0 R ->> -endobj - -2401 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2402 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2403 0 R] ->> -endobj - -2403 0 obj -<< - /Type /StructElem - /S /Span - /P 2402 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4884 0 R ->> -endobj - -2404 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2405 0 R] ->> -endobj - -2405 0 obj -<< - /Type /StructElem - /S /Span - /P 2404 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4884 0 R ->> -endobj - -2406 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2407 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2408 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2409 0 R] ->> -endobj - -2409 0 obj -<< - /Type /StructElem - /S /Span - /P 2408 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4884 0 R ->> -endobj - -2410 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2414 0 R 2413 0 R 2412 0 R 2411 0 R] ->> -endobj - -2411 0 obj -<< - /Type /StructElem - /S /Span - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [22 24] - /Pg 4884 0 R ->> -endobj - -2412 0 obj -<< - /Type /StructElem - /S /Strong - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4884 0 R ->> -endobj - -2413 0 obj -<< - /Type /StructElem - /S /Formula - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4884 0 R ->> -endobj - -2414 0 obj -<< - /Type /StructElem - /S /Span - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20] - /Pg 4884 0 R ->> -endobj - -2415 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2416 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2417 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2418 0 R] ->> -endobj - -2418 0 obj -<< - /Type /StructElem - /S /Span - /P 2417 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4884 0 R ->> -endobj - -2419 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2422 0 R 2421 0 R 2420 0 R] ->> -endobj - -2420 0 obj -<< - /Type /StructElem - /S /Span - /P 2419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4884 0 R ->> -endobj - -2421 0 obj -<< - /Type /StructElem - /S /Formula - /P 2419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4884 0 R ->> -endobj - -2422 0 obj -<< - /Type /StructElem - /S /Span - /P 2419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4884 0 R ->> -endobj - -2423 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2424 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2425 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2426 0 R] ->> -endobj - -2426 0 obj -<< - /Type /StructElem - /S /Span - /P 2425 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 4884 0 R ->> -endobj - -2427 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2431 0 R 2430 0 R 2429 0 R 2428 0 R] ->> -endobj - -2428 0 obj -<< - /Type /StructElem - /S /Span - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 13] - /Pg 4884 0 R ->> -endobj - -2429 0 obj -<< - /Type /StructElem - /S /Strong - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4884 0 R ->> -endobj - -2430 0 obj -<< - /Type /StructElem - /S /Strong - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4884 0 R ->> -endobj - -2431 0 obj -<< - /Type /StructElem - /S /Strong - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4884 0 R ->> -endobj - -2432 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2433 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2434 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2435 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2436 0 R] ->> -endobj - -2436 0 obj -<< - /Type /StructElem - /S /Span - /P 2435 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4884 0 R ->> -endobj - -2437 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2439 0 R 2438 0 R] ->> -endobj - -2438 0 obj -<< - /Type /StructElem - /S /Span - /P 2437 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4884 0 R ->> -endobj - -2439 0 obj -<< - /Type /StructElem - /S /Strong - /P 2437 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4884 0 R ->> -endobj - -2440 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2441 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2442 0 R] ->> -endobj - -2442 0 obj -<< - /Type /StructElem - /S /Span - /P 2441 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4884 0 R ->> -endobj - -2443 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2448 0 R 2447 0 R 2446 0 R 2445 0 R 2444 0 R] ->> -endobj - -2444 0 obj -<< - /Type /StructElem - /S /Span - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4884 0 R ->> -endobj - -2445 0 obj -<< - /Type /StructElem - /S /Formula - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4884 0 R ->> -endobj - -2446 0 obj -<< - /Type /StructElem - /S /Span - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4884 0 R ->> -endobj - -2447 0 obj -<< - /Type /StructElem - /S /Formula - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4884 0 R ->> -endobj - -2448 0 obj -<< - /Type /StructElem - /S /Span - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4884 0 R ->> -endobj - -2449 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2450 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2451 0 R] ->> -endobj - -2451 0 obj -<< - /Type /StructElem - /S /Span - /P 2450 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4884 0 R ->> -endobj - -2452 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2455 0 R 2454 0 R 2453 0 R] ->> -endobj - -2453 0 obj -<< - /Type /StructElem - /S /Span - /P 2452 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [195] - /Pg 4874 0 R ->> -endobj - -2454 0 obj -<< - /Type /StructElem - /S /Formula - /P 2452 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [194] - /Pg 4874 0 R ->> -endobj - -2455 0 obj -<< - /Type /StructElem - /S /Span - /P 2452 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [193] - /Pg 4874 0 R ->> -endobj - -2456 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2457 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2458 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2459 0 R] ->> -endobj - -2459 0 obj -<< - /Type /StructElem - /S /Span - /P 2458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [192] - /Pg 4874 0 R ->> -endobj - -2460 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2462 0 R 2461 0 R] ->> -endobj - -2461 0 obj -<< - /Type /StructElem - /S /Span - /P 2460 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191] - /Pg 4874 0 R ->> -endobj - -2462 0 obj -<< - /Type /StructElem - /S /Strong - /P 2460 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [190] - /Pg 4874 0 R ->> -endobj - -2463 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2464 0 R] ->> -endobj - -2464 0 obj -<< - /Type /StructElem - /S /Span - /P 2463 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [189] - /Pg 4874 0 R ->> -endobj - -2465 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2467 0 R 2466 0 R] ->> -endobj - -2466 0 obj -<< - /Type /StructElem - /S /Span - /P 2465 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [188] - /Pg 4874 0 R ->> -endobj - -2467 0 obj -<< - /Type /StructElem - /S /Strong - /P 2465 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [187] - /Pg 4874 0 R ->> -endobj - -2468 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2469 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2470 0 R] ->> -endobj - -2470 0 obj -<< - /Type /StructElem - /S /Span - /P 2469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [186] - /Pg 4874 0 R ->> -endobj - -2471 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2475 0 R 2474 0 R 2473 0 R 2472 0 R] ->> -endobj - -2472 0 obj -<< - /Type /StructElem - /S /Span - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [182 184] - /Pg 4874 0 R ->> -endobj - -2473 0 obj -<< - /Type /StructElem - /S /Strong - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [185] - /Pg 4874 0 R ->> -endobj - -2474 0 obj -<< - /Type /StructElem - /S /Strong - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [183] - /Pg 4874 0 R ->> -endobj - -2475 0 obj -<< - /Type /StructElem - /S /Strong - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [181] - /Pg 4874 0 R ->> -endobj - -2476 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2477 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2478 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2479 0 R] ->> -endobj - -2479 0 obj -<< - /Type /StructElem - /S /Span - /P 2478 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [180] - /Pg 4874 0 R ->> -endobj - -2480 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2485 0 R 2484 0 R 2483 0 R 2482 0 R 2481 0 R] ->> -endobj - -2481 0 obj -<< - /Type /StructElem - /S /Span - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [179] - /Pg 4874 0 R ->> -endobj - -2482 0 obj -<< - /Type /StructElem - /S /Formula - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [178] - /Pg 4874 0 R ->> -endobj - -2483 0 obj -<< - /Type /StructElem - /S /Span - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [175 177] - /Pg 4874 0 R ->> -endobj - -2484 0 obj -<< - /Type /StructElem - /S /Strong - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [176] - /Pg 4874 0 R ->> -endobj - -2485 0 obj -<< - /Type /StructElem - /S /Strong - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [174] - /Pg 4874 0 R ->> -endobj - -2486 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2487 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2488 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2489 0 R] ->> -endobj - -2489 0 obj -<< - /Type /StructElem - /S /Span - /P 2488 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [173] - /Pg 4874 0 R ->> -endobj - -2490 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2494 0 R 2493 0 R 2492 0 R 2491 0 R] ->> -endobj - -2491 0 obj -<< - /Type /StructElem - /S /Span - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170 172] - /Pg 4874 0 R ->> -endobj - -2492 0 obj -<< - /Type /StructElem - /S /Strong - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171] - /Pg 4874 0 R ->> -endobj - -2493 0 obj -<< - /Type /StructElem - /S /Formula - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4874 0 R ->> -endobj - -2494 0 obj -<< - /Type /StructElem - /S /Span - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [168] - /Pg 4874 0 R ->> -endobj - -2495 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2496 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2497 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2498 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2499 0 R] ->> -endobj - -2499 0 obj -<< - /Type /StructElem - /S /Span - /P 2498 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167] - /Pg 4874 0 R ->> -endobj - -2500 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2502 0 R 2501 0 R] ->> -endobj - -2501 0 obj -<< - /Type /StructElem - /S /Span - /P 2500 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4874 0 R ->> -endobj - -2502 0 obj -<< - /Type /StructElem - /S /Strong - /P 2500 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165] - /Pg 4874 0 R ->> -endobj - -2503 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2504 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2505 0 R] ->> -endobj - -2505 0 obj -<< - /Type /StructElem - /S /Span - /P 2504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4874 0 R ->> -endobj - -2506 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2509 0 R 2508 0 R 2507 0 R] ->> -endobj - -2507 0 obj -<< - /Type /StructElem - /S /Span - /P 2506 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4874 0 R ->> -endobj - -2508 0 obj -<< - /Type /StructElem - /S /Formula - /P 2506 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4874 0 R ->> -endobj - -2509 0 obj -<< - /Type /StructElem - /S /Span - /P 2506 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161] - /Pg 4874 0 R ->> -endobj - -2510 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2511 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2512 0 R] ->> -endobj - -2512 0 obj -<< - /Type /StructElem - /S /Span - /P 2511 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4874 0 R ->> -endobj - -2513 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2516 0 R 2515 0 R 2514 0 R] ->> -endobj - -2514 0 obj -<< - /Type /StructElem - /S /Span - /P 2513 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159] - /Pg 4874 0 R ->> -endobj - -2515 0 obj -<< - /Type /StructElem - /S /Formula - /P 2513 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158] - /Pg 4874 0 R ->> -endobj - -2516 0 obj -<< - /Type /StructElem - /S /Span - /P 2513 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4874 0 R ->> -endobj - -2517 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2518 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2519 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2520 0 R] ->> -endobj - -2520 0 obj -<< - /Type /StructElem - /S /Span - /P 2519 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4874 0 R ->> -endobj - -2521 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2523 0 R 2522 0 R] ->> -endobj - -2522 0 obj -<< - /Type /StructElem - /S /Span - /P 2521 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155] - /Pg 4874 0 R ->> -endobj - -2523 0 obj -<< - /Type /StructElem - /S /Strong - /P 2521 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4874 0 R ->> -endobj - -2524 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2525 0 R] ->> -endobj - -2525 0 obj -<< - /Type /StructElem - /S /Span - /P 2524 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153] - /Pg 4874 0 R ->> -endobj - -2526 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2527 0 obj -<< - /Type /StructElem - /S /P - /P 2388 0 R - /K [2528 0 R 152] - /Pg 4874 0 R ->> -endobj - -2528 0 obj -<< - /Type /StructElem - /S /Strong - /P 2527 0 R - /K [151] - /Pg 4874 0 R ->> -endobj - -2529 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2535 0 R 138 2534 0 R 140 2533 0 R 144 2532 0 R 146 2531 0 R 148 2530 0 R 150] - /Pg 4874 0 R ->> -endobj - -2530 0 obj -<< - /Type /StructElem - /S /Code - /P 2529 0 R - /K [149] - /Pg 4874 0 R ->> -endobj - -2531 0 obj -<< - /Type /StructElem - /S /Formula - /P 2529 0 R - /K [147] - /Pg 4874 0 R ->> -endobj - -2532 0 obj -<< - /Type /StructElem - /S /Formula - /P 2529 0 R - /K [145] - /Pg 4874 0 R ->> -endobj - -2533 0 obj -<< - /Type /StructElem - /S /Formula - /P 2529 0 R - /K [141 142 143] - /Pg 4874 0 R ->> -endobj - -2534 0 obj -<< - /Type /StructElem - /S /Code - /P 2529 0 R - /K [139] - /Pg 4874 0 R ->> -endobj - -2535 0 obj -<< - /Type /StructElem - /S /Link - /P 2529 0 R - /K [137 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4873 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2536 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [98 2546 0 R 100 101 2545 0 R 103 104 2544 0 R 106 107 108 2543 0 R 110 2542 0 R 114 2541 0 R 116 117 2540 0 R 121 2539 0 R 126 127 2538 0 R 130 2537 0 R 134 135 136] - /Pg 4874 0 R ->> -endobj - -2537 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [131 132 133] - /Pg 4874 0 R ->> -endobj - -2538 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [128 129] - /Pg 4874 0 R ->> -endobj - -2539 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [122 123 124 125] - /Pg 4874 0 R ->> -endobj - -2540 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [118 119 120] - /Pg 4874 0 R ->> -endobj - -2541 0 obj -<< - /Type /StructElem - /S /Link - /P 2536 0 R - /K [115 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4872 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2542 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [111 112 113] - /Pg 4874 0 R ->> -endobj - -2543 0 obj -<< - /Type /StructElem - /S /Code - /P 2536 0 R - /K [109] - /Pg 4874 0 R ->> -endobj - -2544 0 obj -<< - /Type /StructElem - /S /Code - /P 2536 0 R - /K [105] - /Pg 4874 0 R ->> -endobj - -2545 0 obj -<< - /Type /StructElem - /S /Code - /P 2536 0 R - /K [102] - /Pg 4874 0 R ->> -endobj - -2546 0 obj -<< - /Type /StructElem - /S /Link - /P 2536 0 R - /K [99 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4871 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2547 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Effect Tracking) - /K [96 97] - /Pg 4874 0 R ->> -endobj - -2548 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [85 2552 0 R 87 88 2551 0 R 90 91 2550 0 R 93 2549 0 R 95] - /Pg 4874 0 R ->> -endobj - -2549 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [94 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4870 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2550 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [92 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4869 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2551 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [89 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4868 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2552 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [86 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4867 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2553 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2641 0 R 2554 0 R] ->> -endobj - -2554 0 obj -<< - /Type /StructElem - /S /Div - /P 2553 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2555 0 R] ->> -endobj - -2555 0 obj -<< - /Type /StructElem - /S /Table - /P 2554 0 R - /K [2638 0 R 2629 0 R 2556 0 R] ->> -endobj - -2556 0 obj -<< - /Type /StructElem - /S /TBody - /P 2555 0 R - /K [2627 0 R 2625 0 R 2620 0 R 2615 0 R 2610 0 R 2601 0 R 2594 0 R 2589 0 R 2584 0 R 2579 0 R 2574 0 R 2569 0 R 2564 0 R 2559 0 R 2557 0 R] ->> -endobj - -2557 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2558 0 R] ->> -endobj - -2558 0 obj -<< - /Type /StructElem - /S /TD - /P 2557 0 R - /A [<< - /O /Table - /Headers [(U1x0y1) (U1x1y1)] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/None /Solid /None /None] - /BorderThickness [0 0.8 0 0] - >>] - /K [] ->> -endobj - -2559 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2562 0 R 2560 0 R] ->> -endobj - -2560 0 obj -<< - /Type /StructElem - /S /TD - /P 2559 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2561 0 R 83] - /Pg 4874 0 R ->> -endobj - -2561 0 obj -<< - /Type /StructElem - /S /Code - /P 2560 0 R - /K [82] - /Pg 4874 0 R ->> -endobj - -2562 0 obj -<< - /Type /StructElem - /S /TD - /P 2559 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2563 0 R] ->> -endobj - -2563 0 obj -<< - /Type /StructElem - /S /Formula - /P 2562 0 R - /K [81] - /Pg 4874 0 R ->> -endobj - -2564 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2567 0 R 2565 0 R] ->> -endobj - -2565 0 obj -<< - /Type /StructElem - /S /TD - /P 2564 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2566 0 R] ->> -endobj - -2566 0 obj -<< - /Type /StructElem - /S /Code - /P 2565 0 R - /K [80] - /Pg 4874 0 R ->> -endobj - -2567 0 obj -<< - /Type /StructElem - /S /TD - /P 2564 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2568 0 R] ->> -endobj - -2568 0 obj -<< - /Type /StructElem - /S /Formula - /P 2567 0 R - /K [75 76 77 78 79] - /Pg 4874 0 R ->> -endobj - -2569 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2572 0 R 2570 0 R] ->> -endobj - -2570 0 obj -<< - /Type /StructElem - /S /TD - /P 2569 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2571 0 R] ->> -endobj - -2571 0 obj -<< - /Type /StructElem - /S /Code - /P 2570 0 R - /K [74] - /Pg 4874 0 R ->> -endobj - -2572 0 obj -<< - /Type /StructElem - /S /TD - /P 2569 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2573 0 R] ->> -endobj - -2573 0 obj -<< - /Type /StructElem - /S /Formula - /P 2572 0 R - /K [70 71 72 73] - /Pg 4874 0 R ->> -endobj - -2574 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2577 0 R 2575 0 R] ->> -endobj - -2575 0 obj -<< - /Type /StructElem - /S /TD - /P 2574 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2576 0 R] ->> -endobj - -2576 0 obj -<< - /Type /StructElem - /S /Code - /P 2575 0 R - /K [69] - /Pg 4874 0 R ->> -endobj - -2577 0 obj -<< - /Type /StructElem - /S /TD - /P 2574 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2578 0 R] ->> -endobj - -2578 0 obj -<< - /Type /StructElem - /S /Formula - /P 2577 0 R - /K [65 66 67 68] - /Pg 4874 0 R ->> -endobj - -2579 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2582 0 R 2580 0 R] ->> -endobj - -2580 0 obj -<< - /Type /StructElem - /S /TD - /P 2579 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2581 0 R 64] - /Pg 4874 0 R ->> -endobj - -2581 0 obj -<< - /Type /StructElem - /S /Code - /P 2580 0 R - /K [63] - /Pg 4874 0 R ->> -endobj - -2582 0 obj -<< - /Type /StructElem - /S /TD - /P 2579 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2583 0 R] ->> -endobj - -2583 0 obj -<< - /Type /StructElem - /S /Formula - /P 2582 0 R - /K [61 62] - /Pg 4874 0 R ->> -endobj - -2584 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2587 0 R 2585 0 R] ->> -endobj - -2585 0 obj -<< - /Type /StructElem - /S /TD - /P 2584 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2586 0 R] ->> -endobj - -2586 0 obj -<< - /Type /StructElem - /S /Code - /P 2585 0 R - /K [60] - /Pg 4874 0 R ->> -endobj - -2587 0 obj -<< - /Type /StructElem - /S /TD - /P 2584 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2588 0 R] ->> -endobj - -2588 0 obj -<< - /Type /StructElem - /S /Formula - /P 2587 0 R - /K [54 55 56 57 58 59] - /Pg 4874 0 R ->> -endobj - -2589 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2592 0 R 2590 0 R] ->> -endobj - -2590 0 obj -<< - /Type /StructElem - /S /TD - /P 2589 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2591 0 R] ->> -endobj - -2591 0 obj -<< - /Type /StructElem - /S /Code - /P 2590 0 R - /K [53] - /Pg 4874 0 R ->> -endobj - -2592 0 obj -<< - /Type /StructElem - /S /TD - /P 2589 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2593 0 R] ->> -endobj - -2593 0 obj -<< - /Type /StructElem - /S /Formula - /P 2592 0 R - /K [47 48 49 50 51 52] - /Pg 4874 0 R ->> -endobj - -2594 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2598 0 R 2595 0 R] ->> -endobj - -2595 0 obj -<< - /Type /StructElem - /S /TD - /P 2594 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2597 0 R 45 2596 0 R] - /Pg 4874 0 R ->> -endobj - -2596 0 obj -<< - /Type /StructElem - /S /Code - /P 2595 0 R - /K [46] - /Pg 4874 0 R ->> -endobj - -2597 0 obj -<< - /Type /StructElem - /S /Code - /P 2595 0 R - /K [44] - /Pg 4874 0 R ->> -endobj - -2598 0 obj -<< - /Type /StructElem - /S /TD - /P 2594 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2600 0 R 37 2599 0 R] - /Pg 4874 0 R ->> -endobj - -2599 0 obj -<< - /Type /StructElem - /S /Formula - /P 2598 0 R - /K [38 39 40 41 42 43] - /Pg 4874 0 R ->> -endobj - -2600 0 obj -<< - /Type /StructElem - /S /Formula - /P 2598 0 R - /K [33 34 35 36] - /Pg 4874 0 R ->> -endobj - -2601 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2606 0 R 2602 0 R] ->> -endobj - -2602 0 obj -<< - /Type /StructElem - /S /TD - /P 2601 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2605 0 R 29 2604 0 R 31 2603 0 R] - /Pg 4874 0 R ->> -endobj - -2603 0 obj -<< - /Type /StructElem - /S /Code - /P 2602 0 R - /K [32] - /Pg 4874 0 R ->> -endobj - -2604 0 obj -<< - /Type /StructElem - /S /Code - /P 2602 0 R - /K [30] - /Pg 4874 0 R ->> -endobj - -2605 0 obj -<< - /Type /StructElem - /S /Code - /P 2602 0 R - /K [28] - /Pg 4874 0 R ->> -endobj - -2606 0 obj -<< - /Type /StructElem - /S /TD - /P 2601 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2609 0 R 22 2608 0 R 25 2607 0 R] - /Pg 4874 0 R ->> -endobj - -2607 0 obj -<< - /Type /StructElem - /S /Formula - /P 2606 0 R - /K [26 27] - /Pg 4874 0 R ->> -endobj - -2608 0 obj -<< - /Type /StructElem - /S /Formula - /P 2606 0 R - /K [23 24] - /Pg 4874 0 R ->> -endobj - -2609 0 obj -<< - /Type /StructElem - /S /Formula - /P 2606 0 R - /K [21] - /Pg 4874 0 R ->> -endobj - -2610 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2613 0 R 2611 0 R] ->> -endobj - -2611 0 obj -<< - /Type /StructElem - /S /TD - /P 2610 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2612 0 R] ->> -endobj - -2612 0 obj -<< - /Type /StructElem - /S /Code - /P 2611 0 R - /K [20] - /Pg 4874 0 R ->> -endobj - -2613 0 obj -<< - /Type /StructElem - /S /TD - /P 2610 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2614 0 R] ->> -endobj - -2614 0 obj -<< - /Type /StructElem - /S /Formula - /P 2613 0 R - /K [15 16 17 18 19] - /Pg 4874 0 R ->> -endobj - -2615 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2617 0 R 2616 0 R] ->> -endobj - -2616 0 obj -<< - /Type /StructElem - /S /TD - /P 2615 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [14] - /Pg 4874 0 R ->> -endobj - -2617 0 obj -<< - /Type /StructElem - /S /TD - /P 2615 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2619 0 R 10 2618 0 R] - /Pg 4874 0 R ->> -endobj - -2618 0 obj -<< - /Type /StructElem - /S /Formula - /P 2617 0 R - /K [11 12 13] - /Pg 4874 0 R ->> -endobj - -2619 0 obj -<< - /Type /StructElem - /S /Formula - /P 2617 0 R - /K [8 9] - /Pg 4874 0 R ->> -endobj - -2620 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2623 0 R 2621 0 R] ->> -endobj - -2621 0 obj -<< - /Type /StructElem - /S /TD - /P 2620 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2622 0 R 7] - /Pg 4874 0 R ->> -endobj - -2622 0 obj -<< - /Type /StructElem - /S /Code - /P 2621 0 R - /K [6] - /Pg 4874 0 R ->> -endobj - -2623 0 obj -<< - /Type /StructElem - /S /TD - /P 2620 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2624 0 R] ->> -endobj - -2624 0 obj -<< - /Type /StructElem - /S /Formula - /P 2623 0 R - /K [4 5] - /Pg 4874 0 R ->> -endobj - -2625 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2626 0 R] ->> -endobj - -2626 0 obj -<< - /Type /StructElem - /S /TD - /P 2625 0 R - /A [<< - /O /Table - /Headers [(U1x0y1) (U1x1y1)] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/Solid /None /None /None] - /BorderThickness [0.4 0 0 0] - >>] - /K [] ->> -endobj - -2627 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2628 0 R] ->> -endobj - -2628 0 obj -<< - /Type /StructElem - /S /TD - /P 2627 0 R - /A [<< - /O /Table - /Headers [(U1x0y1) (U1x1y1)] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/None /Solid /None /None] - /BorderThickness [0 0.4 0 0] - >>] - /K [] ->> -endobj - -2629 0 obj -<< - /Type /StructElem - /S /TBody - /P 2555 0 R - /K [2630 0 R] ->> -endobj - -2630 0 obj -<< - /Type /StructElem - /S /TR - /P 2629 0 R - /K [2633 0 R 2631 0 R] ->> -endobj - -2631 0 obj -<< - /Type /StructElem - /S /TH - /P 2630 0 R - /ID (U1x1y1) - /A [<< - /O /Table - /Scope /Column - /Headers [] - >>] - /K [2632 0 R] ->> -endobj - -2632 0 obj -<< - /Type /StructElem - /S /Strong - /P 2631 0 R - /K [3] - /Pg 4874 0 R ->> -endobj - -2633 0 obj -<< - /Type /StructElem - /S /TH - /P 2630 0 R - /ID (U1x0y1) - /A [<< - /O /Table - /Scope /Column - /Headers [] - >>] - /K [2637 0 R 2635 0 R 2634 0 R] ->> -endobj - -2634 0 obj -<< - /Type /StructElem - /S /Strong - /P 2633 0 R - /K [2] - /Pg 4874 0 R ->> -endobj - -2635 0 obj -<< - /Type /StructElem - /S /Link - /P 2633 0 R - /K [2636 0 R << - /Type /OBJR - /Pg 4874 0 R - /Obj 4866 0 R - >>] ->> -endobj - -2636 0 obj -<< - /Type /StructElem - /S /Strong - /P 2635 0 R - /K [1] - /Pg 4874 0 R ->> -endobj - -2637 0 obj -<< - /Type /StructElem - /S /Strong - /P 2633 0 R - /K [0] - /Pg 4874 0 R ->> -endobj - -2638 0 obj -<< - /Type /StructElem - /S /TBody - /P 2555 0 R - /K [2639 0 R] ->> -endobj - -2639 0 obj -<< - /Type /StructElem - /S /TR - /P 2638 0 R - /K [2640 0 R] ->> -endobj - -2640 0 obj -<< - /Type /StructElem - /S /TD - /P 2639 0 R - /A [<< - /O /Table - /Headers [] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/Solid /None /None /None] - /BorderThickness [0.8 0 0 0] - >>] - /K [] ->> -endobj - -2641 0 obj -<< - /Type /StructElem - /S /Caption - /P 2553 0 R - /K [2642 0 R] ->> -endobj - -2642 0 obj -<< - /Type /StructElem - /S /Span - /P 2641 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4874 0 R ->> -endobj - -2643 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [62 2660 0 R 64 65 2659 0 R 67 68 69 2658 0 R 71 2657 0 R 73 2656 0 R 75 2655 0 R 77 78 2654 0 R 80 2653 0 R 82 83 2652 0 R 85 86 87 2651 0 R 89 2650 0 R 91 2649 0 R 93 94 2648 0 R 100 2647 0 R 102 2646 0 R 104 2645 0 R 106 2644 0 R 108 109] - /Pg 4864 0 R ->> -endobj - -2644 0 obj -<< - /Type /StructElem - /S /Link - /P 2643 0 R - /K [107 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4863 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2645 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [105] - /Pg 4864 0 R ->> -endobj - -2646 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [103] - /Pg 4864 0 R ->> -endobj - -2647 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [101] - /Pg 4864 0 R ->> -endobj - -2648 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [95 96 97 98 99] - /Pg 4864 0 R ->> -endobj - -2649 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [92] - /Pg 4864 0 R ->> -endobj - -2650 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [90] - /Pg 4864 0 R ->> -endobj - -2651 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [88] - /Pg 4864 0 R ->> -endobj - -2652 0 obj -<< - /Type /StructElem - /S /Link - /P 2643 0 R - /K [84 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4862 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2653 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [81] - /Pg 4864 0 R ->> -endobj - -2654 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [79] - /Pg 4864 0 R ->> -endobj - -2655 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [76] - /Pg 4864 0 R ->> -endobj - -2656 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [74] - /Pg 4864 0 R ->> -endobj - -2657 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [72] - /Pg 4864 0 R ->> -endobj - -2658 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [70] - /Pg 4864 0 R ->> -endobj - -2659 0 obj -<< - /Type /StructElem - /S /Link - /P 2643 0 R - /K [66 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4861 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2660 0 obj -<< - /Type /StructElem - /S /Em - /P 2643 0 R - /K [63] - /Pg 4864 0 R ->> -endobj - -2661 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2664 0 R 53 54 55 2663 0 R 57 58 2662 0 R 60 61] - /Pg 4864 0 R ->> -endobj - -2662 0 obj -<< - /Type /StructElem - /S /Code - /P 2661 0 R - /K [59] - /Pg 4864 0 R ->> -endobj - -2663 0 obj -<< - /Type /StructElem - /S /Code - /P 2661 0 R - /K [56] - /Pg 4864 0 R ->> -endobj - -2664 0 obj -<< - /Type /StructElem - /S /Link - /P 2661 0 R - /K [52 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4860 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2665 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Core Library) - /K [50 51] - /Pg 4864 0 R ->> -endobj - -2666 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [22 2675 0 R 24 2674 0 R 26 27 2673 0 R 29 30 31 32 33 2672 0 R 35 2671 0 R 37 38 2670 0 R 40 2669 0 R 42 43 44 2668 0 R 46 2667 0 R 48 49] - /Pg 4864 0 R ->> -endobj - -2667 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [47 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4859 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2668 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [45] - /Pg 4864 0 R ->> -endobj - -2669 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [41 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4858 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2670 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [39] - /Pg 4864 0 R ->> -endobj - -2671 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [36 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4857 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2672 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [34] - /Pg 4864 0 R ->> -endobj - -2673 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [28] - /Pg 4864 0 R ->> -endobj - -2674 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [25 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4856 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2675 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [23] - /Pg 4864 0 R ->> -endobj - -2676 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Implementation and Case Study) - /K [20 21] - /Pg 4864 0 R ->> -endobj - -2677 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [6 7 8 9 10 2679 0 R 12 13 14 2678 0 R 16 17 18 19] - /Pg 4864 0 R ->> -endobj - -2678 0 obj -<< - /Type /StructElem - /S /Link - /P 2677 0 R - /K [15 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4855 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2679 0 obj -<< - /Type /StructElem - /S /Link - /P 2677 0 R - /K [11 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4854 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2680 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3 4 5] - /Pg 4864 0 R ->> -endobj - -2681 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2685 0 R 89 90 91 92 2684 0 R 94 95 96 97 98 2683 0 R 100 101 102 2682 0 R 104 << - /Type /MCR - /MCID 0 - /Pg 4864 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4864 0 R - >>] - /Pg 4852 0 R ->> -endobj - -2682 0 obj -<< - /Type /StructElem - /S /Code - /P 2681 0 R - /K [103] - /Pg 4852 0 R ->> -endobj - -2683 0 obj -<< - /Type /StructElem - /S /Code - /P 2681 0 R - /K [99] - /Pg 4852 0 R ->> -endobj - -2684 0 obj -<< - /Type /StructElem - /S /Code - /P 2681 0 R - /K [93] - /Pg 4852 0 R ->> -endobj - -2685 0 obj -<< - /Type /StructElem - /S /Strong - /P 2681 0 R - /K [88] - /Pg 4852 0 R ->> -endobj - -2686 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2690 0 R 66 67 68 2689 0 R 70 2688 0 R 78 79 2687 0 R 81 82 83 84 85 86 87] - /Pg 4852 0 R ->> -endobj - -2687 0 obj -<< - /Type /StructElem - /S /Link - /P 2686 0 R - /K [80 << - /Type /OBJR - /Pg 4852 0 R - /Obj 4851 0 R - >>] - /Pg 4852 0 R ->> -endobj - -2688 0 obj -<< - /Type /StructElem - /S /Formula - /P 2686 0 R - /K [71 72 73 74 75 76 77] - /Pg 4852 0 R ->> -endobj - -2689 0 obj -<< - /Type /StructElem - /S /Code - /P 2686 0 R - /K [69] - /Pg 4852 0 R ->> -endobj - -2690 0 obj -<< - /Type /StructElem - /S /Strong - /P 2686 0 R - /K [65] - /Pg 4852 0 R ->> -endobj - -2691 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [63 64] - /Pg 4852 0 R ->> -endobj - -2692 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Situating the Context Paradigm) - /K [61 62] - /Pg 4852 0 R ->> -endobj - -2693 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [57 58 2694 0 R 60] - /Pg 4852 0 R ->> -endobj - -2694 0 obj -<< - /Type /StructElem - /S /Link - /P 2693 0 R - /K [59 << - /Type /OBJR - /Pg 4852 0 R - /Obj 4850 0 R - >>] - /Pg 4852 0 R ->> -endobj - -2695 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2706 0 R 2696 0 R] ->> -endobj - -2696 0 obj -<< - /Type /StructElem - /S /L - /P 2695 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2702 0 R 2697 0 R] ->> -endobj - -2697 0 obj -<< - /Type /StructElem - /S /LI - /P 2696 0 R - /K [2701 0 R 2698 0 R] ->> -endobj - -2698 0 obj -<< - /Type /StructElem - /S /LBody - /P 2697 0 R - /K [2700 0 R 52 53 2699 0 R 56] - /Pg 4852 0 R ->> -endobj - -2699 0 obj -<< - /Type /StructElem - /S /Formula - /P 2698 0 R - /K [54 55] - /Pg 4852 0 R ->> -endobj - -2700 0 obj -<< - /Type /StructElem - /S /Em - /P 2698 0 R - /K [51] - /Pg 4852 0 R ->> -endobj - -2701 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2697 0 R - /K [50] - /Pg 4852 0 R ->> -endobj - -2702 0 obj -<< - /Type /StructElem - /S /LI - /P 2696 0 R - /K [2705 0 R 2703 0 R] ->> -endobj - -2703 0 obj -<< - /Type /StructElem - /S /LBody - /P 2702 0 R - /K [2704 0 R 48 49] - /Pg 4852 0 R ->> -endobj - -2704 0 obj -<< - /Type /StructElem - /S /Em - /P 2703 0 R - /K [47] - /Pg 4852 0 R ->> -endobj - -2705 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2702 0 R - /K [46] - /Pg 4852 0 R ->> -endobj - -2706 0 obj -<< - /Type /StructElem - /S /P - /P 2695 0 R - /K [2709 0 R 37 2708 0 R 43 2707 0 R 45] - /Pg 4852 0 R ->> -endobj - -2707 0 obj -<< - /Type /StructElem - /S /Em - /P 2706 0 R - /K [44] - /Pg 4852 0 R ->> -endobj - -2708 0 obj -<< - /Type /StructElem - /S /Formula - /P 2706 0 R - /K [38 39 40 41 42] - /Pg 4852 0 R ->> -endobj - -2709 0 obj -<< - /Type /StructElem - /S /Strong - /P 2706 0 R - /K [34 35 36] - /Pg 4852 0 R ->> -endobj - -2710 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2714 0 R 24 2713 0 R 27 2712 0 R 29 30 2711 0 R 32 33] - /Pg 4852 0 R ->> -endobj - -2711 0 obj -<< - /Type /StructElem - /S /Em - /P 2710 0 R - /K [31] - /Pg 4852 0 R ->> -endobj - -2712 0 obj -<< - /Type /StructElem - /S /Em - /P 2710 0 R - /K [28] - /Pg 4852 0 R ->> -endobj - -2713 0 obj -<< - /Type /StructElem - /S /Formula - /P 2710 0 R - /K [25 26] - /Pg 4852 0 R ->> -endobj - -2714 0 obj -<< - /Type /StructElem - /S /Strong - /P 2710 0 R - /K [23] - /Pg 4852 0 R ->> -endobj - -2715 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2722 0 R 2719 0 R 2716 0 R] ->> -endobj - -2716 0 obj -<< - /Type /StructElem - /S /LI - /P 2715 0 R - /K [2718 0 R 2717 0 R] ->> -endobj - -2717 0 obj -<< - /Type /StructElem - /S /LBody - /P 2716 0 R - /K [19 20 21 22] - /Pg 4852 0 R ->> -endobj - -2718 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2716 0 R - /K [18] - /Pg 4852 0 R ->> -endobj - -2719 0 obj -<< - /Type /StructElem - /S /LI - /P 2715 0 R - /K [2721 0 R 2720 0 R] ->> -endobj - -2720 0 obj -<< - /Type /StructElem - /S /LBody - /P 2719 0 R - /K [16 17] - /Pg 4852 0 R ->> -endobj - -2721 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2719 0 R - /K [15] - /Pg 4852 0 R ->> -endobj - -2722 0 obj -<< - /Type /StructElem - /S /LI - /P 2715 0 R - /K [2724 0 R 2723 0 R] ->> -endobj - -2723 0 obj -<< - /Type /StructElem - /S /LBody - /P 2722 0 R - /K [14] - /Pg 4852 0 R ->> -endobj - -2724 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2722 0 R - /K [13] - /Pg 4852 0 R ->> -endobj - -2725 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2728 0 R 3 2727 0 R 6 7 8 2726 0 R 10 11 12] - /Pg 4852 0 R ->> -endobj - -2726 0 obj -<< - /Type /StructElem - /S /Formula - /P 2725 0 R - /K [9] - /Pg 4852 0 R ->> -endobj - -2727 0 obj -<< - /Type /StructElem - /S /Formula - /P 2725 0 R - /K [4 5] - /Pg 4852 0 R ->> -endobj - -2728 0 obj -<< - /Type /StructElem - /S /Strong - /P 2725 0 R - /K [2] - /Pg 4852 0 R ->> -endobj - -2729 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [107 2739 0 R 109 2738 0 R 112 2737 0 R 114 115 2736 0 R 117 118 119 2735 0 R 121 2734 0 R 123 2733 0 R 125 126 2732 0 R 128 2731 0 R 130 131 132 2730 0 R 134 << - /Type /MCR - /MCID 0 - /Pg 4852 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4852 0 R - >>] - /Pg 4848 0 R ->> -endobj - -2730 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [133] - /Pg 4848 0 R ->> -endobj - -2731 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [129] - /Pg 4848 0 R ->> -endobj - -2732 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [127] - /Pg 4848 0 R ->> -endobj - -2733 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [124] - /Pg 4848 0 R ->> -endobj - -2734 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [122] - /Pg 4848 0 R ->> -endobj - -2735 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [120] - /Pg 4848 0 R ->> -endobj - -2736 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [116] - /Pg 4848 0 R ->> -endobj - -2737 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [113] - /Pg 4848 0 R ->> -endobj - -2738 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [110 111] - /Pg 4848 0 R ->> -endobj - -2739 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [108] - /Pg 4848 0 R ->> -endobj - -2740 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2756 0 R 2755 0 R 2754 0 R 2741 0 R] ->> -endobj - -2741 0 obj -<< - /Type /StructElem - /S /L - /P 2740 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2750 0 R 2746 0 R 2742 0 R] ->> -endobj - -2742 0 obj -<< - /Type /StructElem - /S /LI - /P 2741 0 R - /K [2745 0 R 2743 0 R] ->> -endobj - -2743 0 obj -<< - /Type /StructElem - /S /LBody - /P 2742 0 R - /K [2744 0 R 106] - /Pg 4848 0 R ->> -endobj - -2744 0 obj -<< - /Type /StructElem - /S /Formula - /P 2743 0 R - /K [105] - /Pg 4848 0 R ->> -endobj - -2745 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2742 0 R - /K [104] - /Pg 4848 0 R ->> -endobj - -2746 0 obj -<< - /Type /StructElem - /S /LI - /P 2741 0 R - /K [2749 0 R 2747 0 R] ->> -endobj - -2747 0 obj -<< - /Type /StructElem - /S /LBody - /P 2746 0 R - /K [2748 0 R 103] - /Pg 4848 0 R ->> -endobj - -2748 0 obj -<< - /Type /StructElem - /S /Formula - /P 2747 0 R - /K [100 101 102] - /Pg 4848 0 R ->> -endobj - -2749 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2746 0 R - /K [99] - /Pg 4848 0 R ->> -endobj - -2750 0 obj -<< - /Type /StructElem - /S /LI - /P 2741 0 R - /K [2753 0 R 2751 0 R] ->> -endobj - -2751 0 obj -<< - /Type /StructElem - /S /LBody - /P 2750 0 R - /K [2752 0 R 98] - /Pg 4848 0 R ->> -endobj - -2752 0 obj -<< - /Type /StructElem - /S /Formula - /P 2751 0 R - /K [97] - /Pg 4848 0 R ->> -endobj - -2753 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2750 0 R - /K [96] - /Pg 4848 0 R ->> -endobj - -2754 0 obj -<< - /Type /StructElem - /S /P - /P 2740 0 R - /K [95] - /Pg 4848 0 R ->> -endobj - -2755 0 obj -<< - /Type /StructElem - /S /Formula - /P 2740 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94] - /Pg 4848 0 R ->> -endobj - -2756 0 obj -<< - /Type /StructElem - /S /P - /P 2740 0 R - /K [2758 0 R 75 2757 0 R 78] - /Pg 4848 0 R ->> -endobj - -2757 0 obj -<< - /Type /StructElem - /S /Formula - /P 2756 0 R - /K [76 77] - /Pg 4848 0 R ->> -endobj - -2758 0 obj -<< - /Type /StructElem - /S /Strong - /P 2756 0 R - /K [72 73 74] - /Pg 4848 0 R ->> -endobj - -2759 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [60 2763 0 R 62 2762 0 R 65 2761 0 R 67 68 69 2760 0 R 71] - /Pg 4848 0 R ->> -endobj - -2760 0 obj -<< - /Type /StructElem - /S /Formula - /P 2759 0 R - /K [70] - /Pg 4848 0 R ->> -endobj - -2761 0 obj -<< - /Type /StructElem - /S /Link - /P 2759 0 R - /K [66 << - /Type /OBJR - /Pg 4848 0 R - /Obj 4847 0 R - >>] - /Pg 4848 0 R ->> -endobj - -2762 0 obj -<< - /Type /StructElem - /S /Formula - /P 2759 0 R - /K [63 64] - /Pg 4848 0 R ->> -endobj - -2763 0 obj -<< - /Type /StructElem - /S /Formula - /P 2759 0 R - /K [61] - /Pg 4848 0 R ->> -endobj - -2764 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Unified Context) - /K [58 59] - /Pg 4848 0 R ->> -endobj - -2765 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [50 2767 0 R 52 2766 0 R 54 55 56 57] - /Pg 4848 0 R ->> -endobj - -2766 0 obj -<< - /Type /StructElem - /S /Formula - /P 2765 0 R - /K [53] - /Pg 4848 0 R ->> -endobj - -2767 0 obj -<< - /Type /StructElem - /S /Link - /P 2765 0 R - /K [51 << - /Type /OBJR - /Pg 4848 0 R - /Obj 4846 0 R - >>] - /Pg 4848 0 R ->> -endobj - -2768 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (The Context Paradigm) - /K [48 49] - /Pg 4848 0 R ->> -endobj - -2769 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [44 45 46 47] - /Pg 4848 0 R ->> -endobj - -2770 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2783 0 R 2774 0 R 2771 0 R] ->> -endobj - -2771 0 obj -<< - /Type /StructElem - /S /LI - /P 2770 0 R - /K [2773 0 R 2772 0 R] ->> -endobj - -2772 0 obj -<< - /Type /StructElem - /S /LBody - /P 2771 0 R - /K [42 43] - /Pg 4848 0 R ->> -endobj - -2773 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2771 0 R - /K [41] - /Pg 4848 0 R ->> -endobj - -2774 0 obj -<< - /Type /StructElem - /S /LI - /P 2770 0 R - /K [2782 0 R 2775 0 R] ->> -endobj - -2775 0 obj -<< - /Type /StructElem - /S /LBody - /P 2774 0 R - /K [25 2781 0 R 27 2780 0 R 29 2779 0 R 31 32 33 2778 0 R 35 2777 0 R 37 38 2776 0 R 40] - /Pg 4848 0 R ->> -endobj - -2776 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [39] - /Pg 4848 0 R ->> -endobj - -2777 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [36] - /Pg 4848 0 R ->> -endobj - -2778 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [34] - /Pg 4848 0 R ->> -endobj - -2779 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [30] - /Pg 4848 0 R ->> -endobj - -2780 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [28] - /Pg 4848 0 R ->> -endobj - -2781 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [26] - /Pg 4848 0 R ->> -endobj - -2782 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2774 0 R - /K [24] - /Pg 4848 0 R ->> -endobj - -2783 0 obj -<< - /Type /StructElem - /S /LI - /P 2770 0 R - /K [2792 0 R 2784 0 R] ->> -endobj - -2784 0 obj -<< - /Type /StructElem - /S /LBody - /P 2783 0 R - /K [7 2791 0 R 9 2790 0 R 11 2789 0 R 13 14 2788 0 R 16 2787 0 R 18 2786 0 R 20 21 2785 0 R 23] - /Pg 4848 0 R ->> -endobj - -2785 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [22] - /Pg 4848 0 R ->> -endobj - -2786 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [19] - /Pg 4848 0 R ->> -endobj - -2787 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [17] - /Pg 4848 0 R ->> -endobj - -2788 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [15] - /Pg 4848 0 R ->> -endobj - -2789 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [12] - /Pg 4848 0 R ->> -endobj - -2790 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [10] - /Pg 4848 0 R ->> -endobj - -2791 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [8] - /Pg 4848 0 R ->> -endobj - -2792 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2783 0 R - /K [6] - /Pg 4848 0 R ->> -endobj - -2793 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [5] - /Pg 4848 0 R ->> -endobj - -2794 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2801 0 R 2795 0 R] ->> -endobj - -2795 0 obj -<< - /Type /StructElem - /S /Div - /P 2794 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2796 0 R] ->> -endobj - -2796 0 obj -<< - /Type /StructElem - /S /P - /P 2795 0 R - /K [2800 0 R 2799 0 R 2798 0 R 2797 0 R] ->> -endobj - -2797 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [3] - /Pg 4848 0 R ->> -endobj - -2798 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [2] - /Pg 4848 0 R ->> -endobj - -2799 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [1] - /Pg 4848 0 R ->> -endobj - -2800 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [0] - /Pg 4848 0 R ->> -endobj - -2801 0 obj -<< - /Type /StructElem - /S /Caption - /P 2794 0 R - /K [2802 0 R] ->> -endobj - -2802 0 obj -<< - /Type /StructElem - /S /Span - /P 2801 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4848 0 R ->> -endobj - -2803 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [172 2810 0 R 174 2809 0 R 176 177 2808 0 R 179 180 181 2807 0 R 183 2806 0 R 185 186 187 2805 0 R 189 190 2804 0 R 192] - /Pg 4844 0 R ->> -endobj - -2804 0 obj -<< - /Type /StructElem - /S /Link - /P 2803 0 R - /K [191 << - /Type /OBJR - /Pg 4844 0 R - /Obj 4843 0 R - >>] - /Pg 4844 0 R ->> -endobj - -2805 0 obj -<< - /Type /StructElem - /S /Em - /P 2803 0 R - /K [188] - /Pg 4844 0 R ->> -endobj - -2806 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [184] - /Pg 4844 0 R ->> -endobj - -2807 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [182] - /Pg 4844 0 R ->> -endobj - -2808 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [178] - /Pg 4844 0 R ->> -endobj - -2809 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [175] - /Pg 4844 0 R ->> -endobj - -2810 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [173] - /Pg 4844 0 R ->> -endobj - -2811 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [159 160 161 2813 0 R 166 167 2812 0 R 169 170 171] - /Pg 4844 0 R ->> -endobj - -2812 0 obj -<< - /Type /StructElem - /S /Formula - /P 2811 0 R - /K [168] - /Pg 4844 0 R ->> -endobj - -2813 0 obj -<< - /Type /StructElem - /S /Formula - /P 2811 0 R - /K [162 163 164 165] - /Pg 4844 0 R ->> -endobj - -2814 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Asynchrony) - /K [157 158] - /Pg 4844 0 R ->> -endobj - -2815 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2832 0 R 2816 0 R] ->> -endobj - -2816 0 obj -<< - /Type /StructElem - /S /Div - /P 2815 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2817 0 R] ->> -endobj - -2817 0 obj -<< - /Type /StructElem - /S /P - /P 2816 0 R - /K [2831 0 R 2830 0 R 2829 0 R 2828 0 R 2827 0 R 2826 0 R 2825 0 R 2824 0 R 2823 0 R 2822 0 R 2821 0 R 2820 0 R 2819 0 R 2818 0 R] ->> -endobj - -2818 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [147 148 149 150 151 152 153 154 155] - /Pg 4844 0 R ->> -endobj - -2819 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [146] - /Pg 4844 0 R ->> -endobj - -2820 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [137 138 139 140 141 142 143 144 145] - /Pg 4844 0 R ->> -endobj - -2821 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [136] - /Pg 4844 0 R ->> -endobj - -2822 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [127 128 129 130 131 132 133 134 135] - /Pg 4844 0 R ->> -endobj - -2823 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [126] - /Pg 4844 0 R ->> -endobj - -2824 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [117 118 119 120 121 122 123 124 125] - /Pg 4844 0 R ->> -endobj - -2825 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [116] - /Pg 4844 0 R ->> -endobj - -2826 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [107 108 109 110 111 112 113 114 115] - /Pg 4844 0 R ->> -endobj - -2827 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [106] - /Pg 4844 0 R ->> -endobj - -2828 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [97 98 99 100 101 102 103 104 105] - /Pg 4844 0 R ->> -endobj - -2829 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [96] - /Pg 4844 0 R ->> -endobj - -2830 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [95] - /Pg 4844 0 R ->> -endobj - -2831 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [94] - /Pg 4844 0 R ->> -endobj - -2832 0 obj -<< - /Type /StructElem - /S /Caption - /P 2815 0 R - /K [2833 0 R] ->> -endobj - -2833 0 obj -<< - /Type /StructElem - /S /Span - /P 2832 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4844 0 R ->> -endobj - -2834 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [81 2839 0 R 83 2838 0 R 85 86 87 2837 0 R 89 2836 0 R 91 2835 0 R 93] - /Pg 4844 0 R ->> -endobj - -2835 0 obj -<< - /Type /StructElem - /S /Link - /P 2834 0 R - /K [92 << - /Type /OBJR - /Pg 4844 0 R - /Obj 4842 0 R - >>] - /Pg 4844 0 R ->> -endobj - -2836 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [90] - /Pg 4844 0 R ->> -endobj - -2837 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [88] - /Pg 4844 0 R ->> -endobj - -2838 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [84] - /Pg 4844 0 R ->> -endobj - -2839 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [82] - /Pg 4844 0 R ->> -endobj - -2840 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [65 2844 0 R 68 2843 0 R 71 72 2842 0 R 75 2841 0 R 78 79 80] - /Pg 4844 0 R ->> -endobj - -2841 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [76 77] - /Pg 4844 0 R ->> -endobj - -2842 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [73 74] - /Pg 4844 0 R ->> -endobj - -2843 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [69 70] - /Pg 4844 0 R ->> -endobj - -2844 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [66 67] - /Pg 4844 0 R ->> -endobj - -2845 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [30 2848 0 R 59 2847 0 R 61 2846 0 R 64] - /Pg 4844 0 R ->> -endobj - -2846 0 obj -<< - /Type /StructElem - /S /Formula - /P 2845 0 R - /K [62 63] - /Pg 4844 0 R ->> -endobj - -2847 0 obj -<< - /Type /StructElem - /S /Code - /P 2845 0 R - /K [60] - /Pg 4844 0 R ->> -endobj - -2848 0 obj -<< - /Type /StructElem - /S /Formula - /P 2845 0 R - /K [31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58] - /Pg 4844 0 R ->> -endobj - -2849 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29] - /Pg 4844 0 R ->> -endobj - -2850 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [0 2853 0 R 2 3 2852 0 R 10 2851 0 R 12] - /Pg 4844 0 R ->> -endobj - -2851 0 obj -<< - /Type /StructElem - /S /Formula - /P 2850 0 R - /K [11] - /Pg 4844 0 R ->> -endobj - -2852 0 obj -<< - /Type /StructElem - /S /Formula - /P 2850 0 R - /K [4 5 6 7 8 9] - /Pg 4844 0 R ->> -endobj - -2853 0 obj -<< - /Type /StructElem - /S /Em - /P 2850 0 R - /K [1] - /Pg 4844 0 R ->> -endobj - -2854 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [226 2866 0 R 228 2865 0 R 230 2864 0 R 232 2863 0 R 234 2862 0 R 236 2861 0 R 238 2860 0 R 240 241 2859 0 R 243 2858 0 R 245 2857 0 R 247 2856 0 R 249 2855 0 R 251] - /Pg 4840 0 R ->> -endobj - -2855 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [250] - /Pg 4840 0 R ->> -endobj - -2856 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [248] - /Pg 4840 0 R ->> -endobj - -2857 0 obj -<< - /Type /StructElem - /S /Formula - /P 2854 0 R - /K [246] - /Pg 4840 0 R ->> -endobj - -2858 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [244] - /Pg 4840 0 R ->> -endobj - -2859 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [242] - /Pg 4840 0 R ->> -endobj - -2860 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [239] - /Pg 4840 0 R ->> -endobj - -2861 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [237] - /Pg 4840 0 R ->> -endobj - -2862 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [235] - /Pg 4840 0 R ->> -endobj - -2863 0 obj -<< - /Type /StructElem - /S /Formula - /P 2854 0 R - /K [233] - /Pg 4840 0 R ->> -endobj - -2864 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [231] - /Pg 4840 0 R ->> -endobj - -2865 0 obj -<< - /Type /StructElem - /S /Formula - /P 2854 0 R - /K [229] - /Pg 4840 0 R ->> -endobj - -2866 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [227] - /Pg 4840 0 R ->> -endobj - -2867 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Coherence) - /K [224 225] - /Pg 4840 0 R ->> -endobj - -2868 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [178 2876 0 R 182 183 2875 0 R 185 2874 0 R 203 204 2873 0 R 212 2872 0 R 214 2871 0 R 216 2870 0 R 218 2869 0 R 220 221 222 223] - /Pg 4840 0 R ->> -endobj - -2869 0 obj -<< - /Type /StructElem - /S /Code - /P 2868 0 R - /K [219] - /Pg 4840 0 R ->> -endobj - -2870 0 obj -<< - /Type /StructElem - /S /Code - /P 2868 0 R - /K [217] - /Pg 4840 0 R ->> -endobj - -2871 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [215] - /Pg 4840 0 R ->> -endobj - -2872 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [213] - /Pg 4840 0 R ->> -endobj - -2873 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [205 206 207 208 209 210 211] - /Pg 4840 0 R ->> -endobj - -2874 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202] - /Pg 4840 0 R ->> -endobj - -2875 0 obj -<< - /Type /StructElem - /S /Em - /P 2868 0 R - /K [184] - /Pg 4840 0 R ->> -endobj - -2876 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [179 180 181] - /Pg 4840 0 R ->> -endobj - -2877 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [170 2879 0 R 173 2878 0 R 175 176 177] - /Pg 4840 0 R ->> -endobj - -2878 0 obj -<< - /Type /StructElem - /S /Code - /P 2877 0 R - /K [174] - /Pg 4840 0 R ->> -endobj - -2879 0 obj -<< - /Type /StructElem - /S /Formula - /P 2877 0 R - /K [171 172] - /Pg 4840 0 R ->> -endobj - -2880 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2887 0 R 2881 0 R] ->> -endobj - -2881 0 obj -<< - /Type /StructElem - /S /Div - /P 2880 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2882 0 R] ->> -endobj - -2882 0 obj -<< - /Type /StructElem - /S /P - /P 2881 0 R - /K [2886 0 R 2885 0 R 2884 0 R 2883 0 R] ->> -endobj - -2883 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [168] - /Pg 4840 0 R ->> -endobj - -2884 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [167] - /Pg 4840 0 R ->> -endobj - -2885 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [166] - /Pg 4840 0 R ->> -endobj - -2886 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [165] - /Pg 4840 0 R ->> -endobj - -2887 0 obj -<< - /Type /StructElem - /S /Caption - /P 2880 0 R - /K [2888 0 R] ->> -endobj - -2888 0 obj -<< - /Type /StructElem - /S /Span - /P 2887 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4840 0 R ->> -endobj - -2889 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [141 2895 0 R 143 144 145 2894 0 R 2893 0 R 151 152 2892 0 R 154 155 156 2891 0 R 158 159 2890 0 R 161 162 163 164] - /Pg 4840 0 R ->> -endobj - -2890 0 obj -<< - /Type /StructElem - /S /Link - /P 2889 0 R - /K [160 << - /Type /OBJR - /Pg 4840 0 R - /Obj 4839 0 R - >>] - /Pg 4840 0 R ->> -endobj - -2891 0 obj -<< - /Type /StructElem - /S /Code - /P 2889 0 R - /K [157] - /Pg 4840 0 R ->> -endobj - -2892 0 obj -<< - /Type /StructElem - /S /Link - /P 2889 0 R - /K [153 << - /Type /OBJR - /Pg 4840 0 R - /Obj 4838 0 R - >>] - /Pg 4840 0 R ->> -endobj - -2893 0 obj -<< - /Type /StructElem - /S /Formula - /P 2889 0 R - /K [147 148 149 150] - /Pg 4840 0 R ->> -endobj - -2894 0 obj -<< - /Type /StructElem - /S /Code - /P 2889 0 R - /K [146] - /Pg 4840 0 R ->> -endobj - -2895 0 obj -<< - /Type /StructElem - /S /Em - /P 2889 0 R - /K [142] - /Pg 4840 0 R ->> -endobj - -2896 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [124 2899 0 R 126 2898 0 R 128 129 130 2897 0 R 140] - /Pg 4840 0 R ->> -endobj - -2897 0 obj -<< - /Type /StructElem - /S /Formula - /P 2896 0 R - /K [131 132 133 134 135 136 137 138 139] - /Pg 4840 0 R ->> -endobj - -2898 0 obj -<< - /Type /StructElem - /S /Formula - /P 2896 0 R - /K [127] - /Pg 4840 0 R ->> -endobj - -2899 0 obj -<< - /Type /StructElem - /S /Formula - /P 2896 0 R - /K [125] - /Pg 4840 0 R ->> -endobj - -2900 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2934 0 R 2901 0 R] ->> -endobj - -2901 0 obj -<< - /Type /StructElem - /S /Div - /P 2900 0 R - /K [2932 0 R 2930 0 R 2928 0 R 2926 0 R 2924 0 R 2922 0 R 2920 0 R 2918 0 R 2916 0 R 2914 0 R 2912 0 R 2910 0 R 2908 0 R 2902 0 R] ->> -endobj - -2902 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2907 0 R 2906 0 R 2905 0 R 2904 0 R 2903 0 R] ->> -endobj - -2903 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113 114 115 116 117 118 119 120 121 122 123] - /Pg 4840 0 R ->> -endobj - -2904 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112] - /Pg 4840 0 R ->> -endobj - -2905 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85] - /Pg 4840 0 R ->> -endobj - -2906 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66 67] - /Pg 4840 0 R ->> -endobj - -2907 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52 53 54 55 56 57 58 59 60 61 62 63 64 65] - /Pg 4840 0 R ->> -endobj - -2908 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2909 0 R] ->> -endobj - -2909 0 obj -<< - /Type /StructElem - /S /Formula - /P 2908 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [51] - /Pg 4840 0 R ->> -endobj - -2910 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2911 0 R] ->> -endobj - -2911 0 obj -<< - /Type /StructElem - /S /Formula - /P 2910 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46 47 48 49 50] - /Pg 4840 0 R ->> -endobj - -2912 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2913 0 R] ->> -endobj - -2913 0 obj -<< - /Type /StructElem - /S /Formula - /P 2912 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45] - /Pg 4840 0 R ->> -endobj - -2914 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2915 0 R] ->> -endobj - -2915 0 obj -<< - /Type /StructElem - /S /Formula - /P 2914 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 4840 0 R ->> -endobj - -2916 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2917 0 R] ->> -endobj - -2917 0 obj -<< - /Type /StructElem - /S /Formula - /P 2916 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4840 0 R ->> -endobj - -2918 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2919 0 R] ->> -endobj - -2919 0 obj -<< - /Type /StructElem - /S /Formula - /P 2918 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40 41 42] - /Pg 4840 0 R ->> -endobj - -2920 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2921 0 R] ->> -endobj - -2921 0 obj -<< - /Type /StructElem - /S /Formula - /P 2920 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37 38 39] - /Pg 4840 0 R ->> -endobj - -2922 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2923 0 R] ->> -endobj - -2923 0 obj -<< - /Type /StructElem - /S /Formula - /P 2922 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4840 0 R ->> -endobj - -2924 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2925 0 R] ->> -endobj - -2925 0 obj -<< - /Type /StructElem - /S /Formula - /P 2924 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34 35] - /Pg 4840 0 R ->> -endobj - -2926 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2927 0 R] ->> -endobj - -2927 0 obj -<< - /Type /StructElem - /S /Formula - /P 2926 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4840 0 R ->> -endobj - -2928 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2929 0 R] ->> -endobj - -2929 0 obj -<< - /Type /StructElem - /S /Formula - /P 2928 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30 31 32] - /Pg 4840 0 R ->> -endobj - -2930 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2931 0 R] ->> -endobj - -2931 0 obj -<< - /Type /StructElem - /S /Formula - /P 2930 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4840 0 R ->> -endobj - -2932 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2933 0 R] ->> -endobj - -2933 0 obj -<< - /Type /StructElem - /S /Formula - /P 2932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26 27 28] - /Pg 4840 0 R ->> -endobj - -2934 0 obj -<< - /Type /StructElem - /S /P - /P 2900 0 R - /K [2936 0 R 21 2935 0 R 25] - /Pg 4840 0 R ->> -endobj - -2935 0 obj -<< - /Type /StructElem - /S /Formula - /P 2934 0 R - /K [22 23 24] - /Pg 4840 0 R ->> -endobj - -2936 0 obj -<< - /Type /StructElem - /S /Strong - /P 2934 0 R - /K [18 19 20] - /Pg 4840 0 R ->> -endobj - -2937 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [9 2939 0 R 13 2938 0 R 16 17] - /Pg 4840 0 R ->> -endobj - -2938 0 obj -<< - /Type /StructElem - /S /Formula - /P 2937 0 R - /K [14 15] - /Pg 4840 0 R ->> -endobj - -2939 0 obj -<< - /Type /StructElem - /S /Formula - /P 2937 0 R - /K [10 11 12] - /Pg 4840 0 R ->> -endobj - -2940 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2968 0 R 2967 0 R 2964 0 R 2941 0 R] ->> -endobj - -2941 0 obj -<< - /Type /StructElem - /S /L - /P 2940 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2960 0 R 2956 0 R 2951 0 R 2942 0 R] ->> -endobj - -2942 0 obj -<< - /Type /StructElem - /S /L - /P 2941 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2947 0 R 2943 0 R] ->> -endobj - -2943 0 obj -<< - /Type /StructElem - /S /LI - /P 2942 0 R - /K [2946 0 R 2944 0 R] ->> -endobj - -2944 0 obj -<< - /Type /StructElem - /S /LBody - /P 2943 0 R - /K [2945 0 R 8] - /Pg 4840 0 R ->> -endobj - -2945 0 obj -<< - /Type /StructElem - /S /Formula - /P 2944 0 R - /K [4 5 6 7] - /Pg 4840 0 R ->> -endobj - -2946 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2943 0 R - /K [3] - /Pg 4840 0 R ->> -endobj - -2947 0 obj -<< - /Type /StructElem - /S /LI - /P 2942 0 R - /K [2950 0 R 2948 0 R] ->> -endobj - -2948 0 obj -<< - /Type /StructElem - /S /LBody - /P 2947 0 R - /K [2949 0 R 2] - /Pg 4840 0 R ->> -endobj - -2949 0 obj -<< - /Type /StructElem - /S /Formula - /P 2948 0 R - /K [1] - /Pg 4840 0 R ->> -endobj - -2950 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2947 0 R - /K [0] - /Pg 4840 0 R ->> -endobj - -2951 0 obj -<< - /Type /StructElem - /S /LI - /P 2941 0 R - /K [2955 0 R 2952 0 R] ->> -endobj - -2952 0 obj -<< - /Type /StructElem - /S /LBody - /P 2951 0 R - /K [2953 0 R] ->> -endobj - -2953 0 obj -<< - /Type /StructElem - /S /P - /P 2952 0 R - /K [2954 0 R 341] - /Pg 4836 0 R ->> -endobj - -2954 0 obj -<< - /Type /StructElem - /S /Formula - /P 2953 0 R - /K [340] - /Pg 4836 0 R ->> -endobj - -2955 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2951 0 R - /K [339] - /Pg 4836 0 R ->> -endobj - -2956 0 obj -<< - /Type /StructElem - /S /LI - /P 2941 0 R - /K [2959 0 R 2957 0 R] ->> -endobj - -2957 0 obj -<< - /Type /StructElem - /S /LBody - /P 2956 0 R - /K [2958 0 R 338] - /Pg 4836 0 R ->> -endobj - -2958 0 obj -<< - /Type /StructElem - /S /Formula - /P 2957 0 R - /K [337] - /Pg 4836 0 R ->> -endobj - -2959 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2956 0 R - /K [336] - /Pg 4836 0 R ->> -endobj - -2960 0 obj -<< - /Type /StructElem - /S /LI - /P 2941 0 R - /K [2963 0 R 2961 0 R] ->> -endobj - -2961 0 obj -<< - /Type /StructElem - /S /LBody - /P 2960 0 R - /K [2962 0 R 335] - /Pg 4836 0 R ->> -endobj - -2962 0 obj -<< - /Type /StructElem - /S /Formula - /P 2961 0 R - /K [334] - /Pg 4836 0 R ->> -endobj - -2963 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2960 0 R - /K [333] - /Pg 4836 0 R ->> -endobj - -2964 0 obj -<< - /Type /StructElem - /S /P - /P 2940 0 R - /K [319 2966 0 R 324 2965 0 R 332] - /Pg 4836 0 R ->> -endobj - -2965 0 obj -<< - /Type /StructElem - /S /Formula - /P 2964 0 R - /K [325 326 327 328 329 330 331] - /Pg 4836 0 R ->> -endobj - -2966 0 obj -<< - /Type /StructElem - /S /Formula - /P 2964 0 R - /K [320 321 322 323] - /Pg 4836 0 R ->> -endobj - -2967 0 obj -<< - /Type /StructElem - /S /Formula - /P 2940 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318] - /Pg 4836 0 R ->> -endobj - -2968 0 obj -<< - /Type /StructElem - /S /P - /P 2940 0 R - /K [2971 0 R 229 2970 0 R 233 2969 0 R 238 239] - /Pg 4836 0 R ->> -endobj - -2969 0 obj -<< - /Type /StructElem - /S /Formula - /P 2968 0 R - /K [234 235 236 237] - /Pg 4836 0 R ->> -endobj - -2970 0 obj -<< - /Type /StructElem - /S /Formula - /P 2968 0 R - /K [230 231 232] - /Pg 4836 0 R ->> -endobj - -2971 0 obj -<< - /Type /StructElem - /S /Strong - /P 2968 0 R - /K [226 227 228] - /Pg 4836 0 R ->> -endobj - -2972 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [217 2975 0 R 219 2974 0 R 221 222 2973 0 R 224 225] - /Pg 4836 0 R ->> -endobj - -2973 0 obj -<< - /Type /StructElem - /S /Em - /P 2972 0 R - /K [223] - /Pg 4836 0 R ->> -endobj - -2974 0 obj -<< - /Type /StructElem - /S /Code - /P 2972 0 R - /K [220] - /Pg 4836 0 R ->> -endobj - -2975 0 obj -<< - /Type /StructElem - /S /Code - /P 2972 0 R - /K [218] - /Pg 4836 0 R ->> -endobj - -2976 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Iteration) - /K [215 216] - /Pg 4836 0 R ->> -endobj - -2977 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [209 2979 0 R 211 212 2978 0 R 214] - /Pg 4836 0 R ->> -endobj - -2978 0 obj -<< - /Type /StructElem - /S /Link - /P 2977 0 R - /K [213 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4835 0 R - >>] - /Pg 4836 0 R ->> -endobj - -2979 0 obj -<< - /Type /StructElem - /S /Formula - /P 2977 0 R - /K [210] - /Pg 4836 0 R ->> -endobj - -2980 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [3008 0 R 3006 0 R 3004 0 R 3002 0 R 3000 0 R 2998 0 R 2996 0 R 2994 0 R 2992 0 R 2990 0 R 2988 0 R 2986 0 R 2984 0 R 2981 0 R] ->> -endobj - -2981 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2983 0 R 2982 0 R] ->> -endobj - -2982 0 obj -<< - /Type /StructElem - /S /Formula - /P 2981 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208] - /Pg 4836 0 R ->> -endobj - -2983 0 obj -<< - /Type /StructElem - /S /Formula - /P 2981 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [179 180 181 182 183 184 185 186 187 188 189 190] - /Pg 4836 0 R ->> -endobj - -2984 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2985 0 R] ->> -endobj - -2985 0 obj -<< - /Type /StructElem - /S /Formula - /P 2984 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [178] - /Pg 4836 0 R ->> -endobj - -2986 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2987 0 R] ->> -endobj - -2987 0 obj -<< - /Type /StructElem - /S /Formula - /P 2986 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [173 174 175 176 177] - /Pg 4836 0 R ->> -endobj - -2988 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2989 0 R] ->> -endobj - -2989 0 obj -<< - /Type /StructElem - /S /Formula - /P 2988 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [172] - /Pg 4836 0 R ->> -endobj - -2990 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2991 0 R] ->> -endobj - -2991 0 obj -<< - /Type /StructElem - /S /Formula - /P 2990 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171] - /Pg 4836 0 R ->> -endobj - -2992 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2993 0 R] ->> -endobj - -2993 0 obj -<< - /Type /StructElem - /S /Formula - /P 2992 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170] - /Pg 4836 0 R ->> -endobj - -2994 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2995 0 R] ->> -endobj - -2995 0 obj -<< - /Type /StructElem - /S /Formula - /P 2994 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167 168 169] - /Pg 4836 0 R ->> -endobj - -2996 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2997 0 R] ->> -endobj - -2997 0 obj -<< - /Type /StructElem - /S /Formula - /P 2996 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164 165 166] - /Pg 4836 0 R ->> -endobj - -2998 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2999 0 R] ->> -endobj - -2999 0 obj -<< - /Type /StructElem - /S /Formula - /P 2998 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4836 0 R ->> -endobj - -3000 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3001 0 R] ->> -endobj - -3001 0 obj -<< - /Type /StructElem - /S /Formula - /P 3000 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161 162] - /Pg 4836 0 R ->> -endobj - -3002 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3003 0 R] ->> -endobj - -3003 0 obj -<< - /Type /StructElem - /S /Formula - /P 3002 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4836 0 R ->> -endobj - -3004 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3005 0 R] ->> -endobj - -3005 0 obj -<< - /Type /StructElem - /S /Formula - /P 3004 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158 159] - /Pg 4836 0 R ->> -endobj - -3006 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3007 0 R] ->> -endobj - -3007 0 obj -<< - /Type /StructElem - /S /Formula - /P 3006 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4836 0 R ->> -endobj - -3008 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3009 0 R] ->> -endobj - -3009 0 obj -<< - /Type /StructElem - /S /Formula - /P 3008 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154 155 156] - /Pg 4836 0 R ->> -endobj - -3010 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [132 3016 0 R 135 3015 0 R 137 138 3014 0 R 144 3013 0 R 146 147 3012 0 R 151 3011 0 R 153] - /Pg 4836 0 R ->> -endobj - -3011 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [152] - /Pg 4836 0 R ->> -endobj - -3012 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [148 149 150] - /Pg 4836 0 R ->> -endobj - -3013 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [145] - /Pg 4836 0 R ->> -endobj - -3014 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [139 140 141 142 143] - /Pg 4836 0 R ->> -endobj - -3015 0 obj -<< - /Type /StructElem - /S /Link - /P 3010 0 R - /K [136 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4834 0 R - >>] - /Pg 4836 0 R ->> -endobj - -3016 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [133 134] - /Pg 4836 0 R ->> -endobj - -3017 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3024 0 R 3023 0 R 3018 0 R] ->> -endobj - -3018 0 obj -<< - /Type /StructElem - /S /P - /P 3017 0 R - /K [118 3022 0 R 120 121 3021 0 R 124 3020 0 R 128 3019 0 R 131] - /Pg 4836 0 R ->> -endobj - -3019 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [129 130] - /Pg 4836 0 R ->> -endobj - -3020 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [125 126 127] - /Pg 4836 0 R ->> -endobj - -3021 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [122 123] - /Pg 4836 0 R ->> -endobj - -3022 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [119] - /Pg 4836 0 R ->> -endobj - -3023 0 obj -<< - /Type /StructElem - /S /Formula - /P 3017 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117] - /Pg 4836 0 R ->> -endobj - -3024 0 obj -<< - /Type /StructElem - /S /P - /P 3017 0 R - /K [3031 0 R 51 3030 0 R 53 3029 0 R 67 3028 0 R 70 71 72 3027 0 R 74 3026 0 R 76 77 3025 0 R 79] - /Pg 4836 0 R ->> -endobj - -3025 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [78] - /Pg 4836 0 R ->> -endobj - -3026 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [75] - /Pg 4836 0 R ->> -endobj - -3027 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [73] - /Pg 4836 0 R ->> -endobj - -3028 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [68 69] - /Pg 4836 0 R ->> -endobj - -3029 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [54 55 56 57 58 59 60 61 62 63 64 65 66] - /Pg 4836 0 R ->> -endobj - -3030 0 obj -<< - /Type /StructElem - /S /Em - /P 3024 0 R - /K [52] - /Pg 4836 0 R ->> -endobj - -3031 0 obj -<< - /Type /StructElem - /S /Strong - /P 3024 0 R - /K [48 49 50] - /Pg 4836 0 R ->> -endobj - -3032 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [29 3038 0 R 31 32 3037 0 R 34 35 3036 0 R 37 38 3035 0 R 40 41 42 43 3034 0 R 45 3033 0 R 47] - /Pg 4836 0 R ->> -endobj - -3033 0 obj -<< - /Type /StructElem - /S /Code - /P 3032 0 R - /K [46] - /Pg 4836 0 R ->> -endobj - -3034 0 obj -<< - /Type /StructElem - /S /Code - /P 3032 0 R - /K [44] - /Pg 4836 0 R ->> -endobj - -3035 0 obj -<< - /Type /StructElem - /S /Link - /P 3032 0 R - /K [39 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4833 0 R - >>] - /Pg 4836 0 R ->> -endobj - -3036 0 obj -<< - /Type /StructElem - /S /Em - /P 3032 0 R - /K [36] - /Pg 4836 0 R ->> -endobj - -3037 0 obj -<< - /Type /StructElem - /S /Formula - /P 3032 0 R - /K [33] - /Pg 4836 0 R ->> -endobj - -3038 0 obj -<< - /Type /StructElem - /S /Em - /P 3032 0 R - /K [30] - /Pg 4836 0 R ->> -endobj - -3039 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [323 3051 0 R 325 326 3050 0 R 328 3049 0 R << - /Type /MCR - /MCID 1 - /Pg 4836 0 R - >> 3048 0 R << - /Type /MCR - /MCID 3 - /Pg 4836 0 R - >> 3047 0 R << - /Type /MCR - /MCID 6 - /Pg 4836 0 R - >> 3046 0 R << - /Type /MCR - /MCID 8 - /Pg 4836 0 R - >> 3045 0 R << - /Type /MCR - /MCID 10 - /Pg 4836 0 R - >> << - /Type /MCR - /MCID 11 - /Pg 4836 0 R - >> 3044 0 R << - /Type /MCR - /MCID 13 - /Pg 4836 0 R - >> 3043 0 R << - /Type /MCR - /MCID 20 - /Pg 4836 0 R - >> 3042 0 R << - /Type /MCR - /MCID 22 - /Pg 4836 0 R - >> << - /Type /MCR - /MCID 23 - /Pg 4836 0 R - >> 3041 0 R << - /Type /MCR - /MCID 25 - /Pg 4836 0 R - >> << - /Type /MCR - /MCID 26 - /Pg 4836 0 R - >> 3040 0 R << - /Type /MCR - /MCID 28 - /Pg 4836 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3040 0 obj -<< - /Type /StructElem - /S /Em - /P 3039 0 R - /K [27] - /Pg 4836 0 R ->> -endobj - -3041 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [24] - /Pg 4836 0 R ->> -endobj - -3042 0 obj -<< - /Type /StructElem - /S /Link - /P 3039 0 R - /K [21 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4832 0 R - >>] - /Pg 4836 0 R ->> -endobj - -3043 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [14 15 16 17 18 19] - /Pg 4836 0 R ->> -endobj - -3044 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [12] - /Pg 4836 0 R ->> -endobj - -3045 0 obj -<< - /Type /StructElem - /S /Em - /P 3039 0 R - /K [9] - /Pg 4836 0 R ->> -endobj - -3046 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [7] - /Pg 4836 0 R ->> -endobj - -3047 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [4 5] - /Pg 4836 0 R ->> -endobj - -3048 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [2] - /Pg 4836 0 R ->> -endobj - -3049 0 obj -<< - /Type /StructElem - /S /Link - /P 3039 0 R - /K [329 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4827 0 R - >> 330 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4828 0 R - >> << - /Type /MCR - /MCID 0 - /Pg 4836 0 R - >> << - /Type /OBJR - /Pg 4836 0 R - /Obj 4831 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3050 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [327] - /Pg 4829 0 R ->> -endobj - -3051 0 obj -<< - /Type /StructElem - /S /Code - /P 3039 0 R - /K [324] - /Pg 4829 0 R ->> -endobj - -3052 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Idempotent Recovery) - /K [321 322] - /Pg 4829 0 R ->> -endobj - -3053 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [3060 0 R 3054 0 R] ->> -endobj - -3054 0 obj -<< - /Type /StructElem - /S /Div - /P 3053 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3055 0 R] ->> -endobj - -3055 0 obj -<< - /Type /StructElem - /S /P - /P 3054 0 R - /K [3059 0 R 3058 0 R 3057 0 R 3056 0 R] ->> -endobj - -3056 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [319] - /Pg 4829 0 R ->> -endobj - -3057 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [318] - /Pg 4829 0 R ->> -endobj - -3058 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [317] - /Pg 4829 0 R ->> -endobj - -3059 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [316] - /Pg 4829 0 R ->> -endobj - -3060 0 obj -<< - /Type /StructElem - /S /Caption - /P 3053 0 R - /K [3061 0 R] ->> -endobj - -3061 0 obj -<< - /Type /StructElem - /S /Span - /P 3060 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [320] - /Pg 4829 0 R ->> -endobj - -3062 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [284 3072 0 R 286 287 288 3071 0 R 290 291 292 3070 0 R 296 3069 0 R 298 3068 0 R 300 301 3067 0 R 303 3066 0 R 305 306 3065 0 R 308 3064 0 R 310 311 312 3063 0 R 314 315] - /Pg 4829 0 R ->> -endobj - -3063 0 obj -<< - /Type /StructElem - /S /Link - /P 3062 0 R - /K [313 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4826 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3064 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [309] - /Pg 4829 0 R ->> -endobj - -3065 0 obj -<< - /Type /StructElem - /S /Formula - /P 3062 0 R - /K [307] - /Pg 4829 0 R ->> -endobj - -3066 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [304] - /Pg 4829 0 R ->> -endobj - -3067 0 obj -<< - /Type /StructElem - /S /Em - /P 3062 0 R - /K [302] - /Pg 4829 0 R ->> -endobj - -3068 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [299] - /Pg 4829 0 R ->> -endobj - -3069 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [297] - /Pg 4829 0 R ->> -endobj - -3070 0 obj -<< - /Type /StructElem - /S /Formula - /P 3062 0 R - /K [293 294 295] - /Pg 4829 0 R ->> -endobj - -3071 0 obj -<< - /Type /StructElem - /S /Em - /P 3062 0 R - /K [289] - /Pg 4829 0 R ->> -endobj - -3072 0 obj -<< - /Type /StructElem - /S /Em - /P 3062 0 R - /K [285] - /Pg 4829 0 R ->> -endobj - -3073 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3086 0 R 3085 0 R 3083 0 R 3074 0 R] ->> -endobj - -3074 0 obj -<< - /Type /StructElem - /S /L - /P 3073 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3079 0 R 3075 0 R] ->> -endobj - -3075 0 obj -<< - /Type /StructElem - /S /LI - /P 3074 0 R - /K [3078 0 R 3076 0 R] ->> -endobj - -3076 0 obj -<< - /Type /StructElem - /S /LBody - /P 3075 0 R - /K [3077 0 R 283] - /Pg 4829 0 R ->> -endobj - -3077 0 obj -<< - /Type /StructElem - /S /Formula - /P 3076 0 R - /K [279 280 281 282] - /Pg 4829 0 R ->> -endobj - -3078 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3075 0 R - /K [278] - /Pg 4829 0 R ->> -endobj - -3079 0 obj -<< - /Type /StructElem - /S /LI - /P 3074 0 R - /K [3082 0 R 3080 0 R] ->> -endobj - -3080 0 obj -<< - /Type /StructElem - /S /LBody - /P 3079 0 R - /K [3081 0 R 275 276 277] - /Pg 4829 0 R ->> -endobj - -3081 0 obj -<< - /Type /StructElem - /S /Formula - /P 3080 0 R - /K [271 272 273 274] - /Pg 4829 0 R ->> -endobj - -3082 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3079 0 R - /K [270] - /Pg 4829 0 R ->> -endobj - -3083 0 obj -<< - /Type /StructElem - /S /P - /P 3073 0 R - /K [263 3084 0 R 269] - /Pg 4829 0 R ->> -endobj - -3084 0 obj -<< - /Type /StructElem - /S /Formula - /P 3083 0 R - /K [264 265 266 267 268] - /Pg 4829 0 R ->> -endobj - -3085 0 obj -<< - /Type /StructElem - /S /Formula - /P 3073 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [254 255 256 257 258 259 260 261 262] - /Pg 4829 0 R ->> -endobj - -3086 0 obj -<< - /Type /StructElem - /S /P - /P 3073 0 R - /K [3089 0 R 249 3088 0 R 251 3087 0 R 253] - /Pg 4829 0 R ->> -endobj - -3087 0 obj -<< - /Type /StructElem - /S /Formula - /P 3086 0 R - /K [252] - /Pg 4829 0 R ->> -endobj - -3088 0 obj -<< - /Type /StructElem - /S /Em - /P 3086 0 R - /K [250] - /Pg 4829 0 R ->> -endobj - -3089 0 obj -<< - /Type /StructElem - /S /Strong - /P 3086 0 R - /K [246 247 248] - /Pg 4829 0 R ->> -endobj - -3090 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [236 237 238 3093 0 R 240 3092 0 R 242 243 3091 0 R 245] - /Pg 4829 0 R ->> -endobj - -3091 0 obj -<< - /Type /StructElem - /S /Link - /P 3090 0 R - /K [244 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4825 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3092 0 obj -<< - /Type /StructElem - /S /Formula - /P 3090 0 R - /K [241] - /Pg 4829 0 R ->> -endobj - -3093 0 obj -<< - /Type /StructElem - /S /Em - /P 3090 0 R - /K [239] - /Pg 4829 0 R ->> -endobj - -3094 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Component Lifecycle) - /K [234 235] - /Pg 4829 0 R ->> -endobj - -3095 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [198 3101 0 R 200 3100 0 R 202 3099 0 R 219 3098 0 R 221 222 223 3097 0 R 228 229 230 231 3096 0 R 233] - /Pg 4829 0 R ->> -endobj - -3096 0 obj -<< - /Type /StructElem - /S /Link - /P 3095 0 R - /K [232 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4824 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3097 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [224 225 226 227] - /Pg 4829 0 R ->> -endobj - -3098 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [220] - /Pg 4829 0 R ->> -endobj - -3099 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218] - /Pg 4829 0 R ->> -endobj - -3100 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [201] - /Pg 4829 0 R ->> -endobj - -3101 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [199] - /Pg 4829 0 R ->> -endobj - -3102 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3188 0 R 3103 0 R] ->> -endobj - -3103 0 obj -<< - /Type /StructElem - /S /Div - /P 3102 0 R - /K [3186 0 R 3184 0 R 3182 0 R 3180 0 R 3178 0 R 3176 0 R 3174 0 R 3172 0 R 3170 0 R 3168 0 R 3166 0 R 3164 0 R 3162 0 R 3160 0 R 3158 0 R 3156 0 R 3154 0 R 3152 0 R 3150 0 R 3148 0 R 3146 0 R 3144 0 R 3142 0 R 3140 0 R 3138 0 R 3136 0 R 3134 0 R 3132 0 R 3130 0 R 3128 0 R 3126 0 R 3124 0 R 3122 0 R 3120 0 R 3118 0 R 3116 0 R 3114 0 R 3112 0 R 3110 0 R 3108 0 R 3106 0 R 3104 0 R] ->> -endobj - -3104 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3105 0 R] ->> -endobj - -3105 0 obj -<< - /Type /StructElem - /S /Formula - /P 3104 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197] - /Pg 4829 0 R ->> -endobj - -3106 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3107 0 R] ->> -endobj - -3107 0 obj -<< - /Type /StructElem - /S /Formula - /P 3106 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4829 0 R ->> -endobj - -3108 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3109 0 R] ->> -endobj - -3109 0 obj -<< - /Type /StructElem - /S /Formula - /P 3108 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149 150 151 152 153] - /Pg 4829 0 R ->> -endobj - -3110 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3111 0 R] ->> -endobj - -3111 0 obj -<< - /Type /StructElem - /S /Formula - /P 3110 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4829 0 R ->> -endobj - -3112 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3113 0 R] ->> -endobj - -3113 0 obj -<< - /Type /StructElem - /S /Formula - /P 3112 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143 144 145 146 147] - /Pg 4829 0 R ->> -endobj - -3114 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3115 0 R] ->> -endobj - -3115 0 obj -<< - /Type /StructElem - /S /Formula - /P 3114 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4829 0 R ->> -endobj - -3116 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3117 0 R] ->> -endobj - -3117 0 obj -<< - /Type /StructElem - /S /Formula - /P 3116 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4829 0 R ->> -endobj - -3118 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3119 0 R] ->> -endobj - -3119 0 obj -<< - /Type /StructElem - /S /Formula - /P 3118 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131 132 133 134 135 136 137 138 139 140] - /Pg 4829 0 R ->> -endobj - -3120 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3121 0 R] ->> -endobj - -3121 0 obj -<< - /Type /StructElem - /S /Formula - /P 3120 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4829 0 R ->> -endobj - -3122 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3123 0 R] ->> -endobj - -3123 0 obj -<< - /Type /StructElem - /S /Formula - /P 3122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128 129] - /Pg 4829 0 R ->> -endobj - -3124 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3125 0 R] ->> -endobj - -3125 0 obj -<< - /Type /StructElem - /S /Formula - /P 3124 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4829 0 R ->> -endobj - -3126 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3127 0 R] ->> -endobj - -3127 0 obj -<< - /Type /StructElem - /S /Formula - /P 3126 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119 120 121 122 123 124 125 126] - /Pg 4829 0 R ->> -endobj - -3128 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3129 0 R] ->> -endobj - -3129 0 obj -<< - /Type /StructElem - /S /Formula - /P 3128 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4829 0 R ->> -endobj - -3130 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3131 0 R] ->> -endobj - -3131 0 obj -<< - /Type /StructElem - /S /Formula - /P 3130 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [117] - /Pg 4829 0 R ->> -endobj - -3132 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3133 0 R] ->> -endobj - -3133 0 obj -<< - /Type /StructElem - /S /Formula - /P 3132 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116] - /Pg 4829 0 R ->> -endobj - -3134 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3135 0 R] ->> -endobj - -3135 0 obj -<< - /Type /StructElem - /S /Formula - /P 3134 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4829 0 R ->> -endobj - -3136 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3137 0 R] ->> -endobj - -3137 0 obj -<< - /Type /StructElem - /S /Formula - /P 3136 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80 81 82 83 84] - /Pg 4829 0 R ->> -endobj - -3138 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3139 0 R] ->> -endobj - -3139 0 obj -<< - /Type /StructElem - /S /Formula - /P 3138 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79] - /Pg 4829 0 R ->> -endobj - -3140 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3141 0 R] ->> -endobj - -3141 0 obj -<< - /Type /StructElem - /S /Formula - /P 3140 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74 75 76 77 78] - /Pg 4829 0 R ->> -endobj - -3142 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3143 0 R] ->> -endobj - -3143 0 obj -<< - /Type /StructElem - /S /Formula - /P 3142 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 4829 0 R ->> -endobj - -3144 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3145 0 R] ->> -endobj - -3145 0 obj -<< - /Type /StructElem - /S /Formula - /P 3144 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 4829 0 R ->> -endobj - -3146 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3147 0 R] ->> -endobj - -3147 0 obj -<< - /Type /StructElem - /S /Formula - /P 3146 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [62 63 64 65 66 67 68 69 70 71] - /Pg 4829 0 R ->> -endobj - -3148 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3149 0 R] ->> -endobj - -3149 0 obj -<< - /Type /StructElem - /S /Formula - /P 3148 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [61] - /Pg 4829 0 R ->> -endobj - -3150 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3151 0 R] ->> -endobj - -3151 0 obj -<< - /Type /StructElem - /S /Formula - /P 3150 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59 60] - /Pg 4829 0 R ->> -endobj - -3152 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3153 0 R] ->> -endobj - -3153 0 obj -<< - /Type /StructElem - /S /Formula - /P 3152 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [58] - /Pg 4829 0 R ->> -endobj - -3154 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3155 0 R] ->> -endobj - -3155 0 obj -<< - /Type /StructElem - /S /Formula - /P 3154 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45 46 47 48 49 50 51 52 53 54 55 56 57] - /Pg 4829 0 R ->> -endobj - -3156 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3157 0 R] ->> -endobj - -3157 0 obj -<< - /Type /StructElem - /S /Formula - /P 3156 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 4829 0 R ->> -endobj - -3158 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3159 0 R] ->> -endobj - -3159 0 obj -<< - /Type /StructElem - /S /Formula - /P 3158 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4829 0 R ->> -endobj - -3160 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3161 0 R] ->> -endobj - -3161 0 obj -<< - /Type /StructElem - /S /Formula - /P 3160 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30 31 32 33 34 35 36 37 38 39 40 41 42] - /Pg 4829 0 R ->> -endobj - -3162 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3163 0 R] ->> -endobj - -3163 0 obj -<< - /Type /StructElem - /S /Formula - /P 3162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4829 0 R ->> -endobj - -3164 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3165 0 R] ->> -endobj - -3165 0 obj -<< - /Type /StructElem - /S /Formula - /P 3164 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24 25 26 27 28] - /Pg 4829 0 R ->> -endobj - -3166 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3167 0 R] ->> -endobj - -3167 0 obj -<< - /Type /StructElem - /S /Formula - /P 3166 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4829 0 R ->> -endobj - -3168 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3169 0 R] ->> -endobj - -3169 0 obj -<< - /Type /StructElem - /S /Formula - /P 3168 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18 19 20 21 22] - /Pg 4829 0 R ->> -endobj - -3170 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3171 0 R] ->> -endobj - -3171 0 obj -<< - /Type /StructElem - /S /Formula - /P 3170 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4829 0 R ->> -endobj - -3172 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3173 0 R] ->> -endobj - -3173 0 obj -<< - /Type /StructElem - /S /Formula - /P 3172 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4829 0 R ->> -endobj - -3174 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3175 0 R] ->> -endobj - -3175 0 obj -<< - /Type /StructElem - /S /Formula - /P 3174 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14 15] - /Pg 4829 0 R ->> -endobj - -3176 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3177 0 R] ->> -endobj - -3177 0 obj -<< - /Type /StructElem - /S /Formula - /P 3176 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4829 0 R ->> -endobj - -3178 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3179 0 R] ->> -endobj - -3179 0 obj -<< - /Type /StructElem - /S /Formula - /P 3178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 12] - /Pg 4829 0 R ->> -endobj - -3180 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3181 0 R] ->> -endobj - -3181 0 obj -<< - /Type /StructElem - /S /Formula - /P 3180 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4829 0 R ->> -endobj - -3182 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3183 0 R] ->> -endobj - -3183 0 obj -<< - /Type /StructElem - /S /Formula - /P 3182 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2 3 4 5 6 7 8 9] - /Pg 4829 0 R ->> -endobj - -3184 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3185 0 R] ->> -endobj - -3185 0 obj -<< - /Type /StructElem - /S /Formula - /P 3184 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4829 0 R ->> -endobj - -3186 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3187 0 R] ->> -endobj - -3187 0 obj -<< - /Type /StructElem - /S /Formula - /P 3186 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4829 0 R ->> -endobj - -3188 0 obj -<< - /Type /StructElem - /S /P - /P 3102 0 R - /K [3193 0 R 400 3192 0 R 402 3191 0 R 404 3190 0 R 406 3189 0 R 409] - /Pg 4822 0 R ->> -endobj - -3189 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [407 408] - /Pg 4822 0 R ->> -endobj - -3190 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [405] - /Pg 4822 0 R ->> -endobj - -3191 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [403] - /Pg 4822 0 R ->> -endobj - -3192 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [401] - /Pg 4822 0 R ->> -endobj - -3193 0 obj -<< - /Type /StructElem - /S /Strong - /P 3188 0 R - /K [397 398 399] - /Pg 4822 0 R ->> -endobj - -3194 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3214 0 R 3213 0 R 3195 0 R] ->> -endobj - -3195 0 obj -<< - /Type /StructElem - /S /P - /P 3194 0 R - /K [331 3212 0 R 334 3211 0 R 340 3210 0 R 342 3209 0 R 344 345 3208 0 R 348 3207 0 R 350 3206 0 R 352 3205 0 R 354 3204 0 R 357 3203 0 R 360 3202 0 R 365 3201 0 R 367 368 3200 0 R 373 3199 0 R 378 379 3198 0 R 390 3197 0 R 393 3196 0 R 396] - /Pg 4822 0 R ->> -endobj - -3196 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [394 395] - /Pg 4822 0 R ->> -endobj - -3197 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [391 392] - /Pg 4822 0 R ->> -endobj - -3198 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [380 381 382 383 384 385 386 387 388 389] - /Pg 4822 0 R ->> -endobj - -3199 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [374 375 376 377] - /Pg 4822 0 R ->> -endobj - -3200 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [369 370 371 372] - /Pg 4822 0 R ->> -endobj - -3201 0 obj -<< - /Type /StructElem - /S /Em - /P 3195 0 R - /K [366] - /Pg 4822 0 R ->> -endobj - -3202 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [361 362 363 364] - /Pg 4822 0 R ->> -endobj - -3203 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [358 359] - /Pg 4822 0 R ->> -endobj - -3204 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [355 356] - /Pg 4822 0 R ->> -endobj - -3205 0 obj -<< - /Type /StructElem - /S /Em - /P 3195 0 R - /K [353] - /Pg 4822 0 R ->> -endobj - -3206 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [351] - /Pg 4822 0 R ->> -endobj - -3207 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [349] - /Pg 4822 0 R ->> -endobj - -3208 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [346 347] - /Pg 4822 0 R ->> -endobj - -3209 0 obj -<< - /Type /StructElem - /S /Em - /P 3195 0 R - /K [343] - /Pg 4822 0 R ->> -endobj - -3210 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [341] - /Pg 4822 0 R ->> -endobj - -3211 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [335 336 337 338 339] - /Pg 4822 0 R ->> -endobj - -3212 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [332 333] - /Pg 4822 0 R ->> -endobj - -3213 0 obj -<< - /Type /StructElem - /S /Formula - /P 3194 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330] - /Pg 4822 0 R ->> -endobj - -3214 0 obj -<< - /Type /StructElem - /S /P - /P 3194 0 R - /K [3215 0 R 289] - /Pg 4822 0 R ->> -endobj - -3215 0 obj -<< - /Type /StructElem - /S /Strong - /P 3214 0 R - /K [286 287 288] - /Pg 4822 0 R ->> -endobj - -3216 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3218 0 R 280 3217 0 R 282 283 284 285] - /Pg 4822 0 R ->> -endobj - -3217 0 obj -<< - /Type /StructElem - /S /Em - /P 3216 0 R - /K [281] - /Pg 4822 0 R ->> -endobj - -3218 0 obj -<< - /Type /StructElem - /S /Strong - /P 3216 0 R - /K [279] - /Pg 4822 0 R ->> -endobj - -3219 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [269 270 271 272 273 274 3220 0 R 278] - /Pg 4822 0 R ->> -endobj - -3220 0 obj -<< - /Type /StructElem - /S /Formula - /P 3219 0 R - /K [275 276 277] - /Pg 4822 0 R ->> -endobj - -3221 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3307 0 R 3222 0 R] ->> -endobj - -3222 0 obj -<< - /Type /StructElem - /S /Div - /P 3221 0 R - /K [3305 0 R 3303 0 R 3301 0 R 3299 0 R 3297 0 R 3295 0 R 3293 0 R 3291 0 R 3289 0 R 3287 0 R 3285 0 R 3283 0 R 3281 0 R 3279 0 R 3277 0 R 3275 0 R 3273 0 R 3271 0 R 3269 0 R 3267 0 R 3265 0 R 3263 0 R 3261 0 R 3259 0 R 3257 0 R 3255 0 R 3253 0 R 3251 0 R 3249 0 R 3247 0 R 3245 0 R 3243 0 R 3241 0 R 3239 0 R 3237 0 R 3235 0 R 3233 0 R 3231 0 R 3229 0 R 3227 0 R 3225 0 R 3223 0 R] ->> -endobj - -3223 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3224 0 R] ->> -endobj - -3224 0 obj -<< - /Type /StructElem - /S /Formula - /P 3223 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268] - /Pg 4822 0 R ->> -endobj - -3225 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3226 0 R] ->> -endobj - -3226 0 obj -<< - /Type /StructElem - /S /Formula - /P 3225 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [237] - /Pg 4822 0 R ->> -endobj - -3227 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3228 0 R] ->> -endobj - -3228 0 obj -<< - /Type /StructElem - /S /Formula - /P 3227 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [232 233 234 235 236] - /Pg 4822 0 R ->> -endobj - -3229 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3230 0 R] ->> -endobj - -3230 0 obj -<< - /Type /StructElem - /S /Formula - /P 3229 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [231] - /Pg 4822 0 R ->> -endobj - -3231 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3232 0 R] ->> -endobj - -3232 0 obj -<< - /Type /StructElem - /S /Formula - /P 3231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [226 227 228 229 230] - /Pg 4822 0 R ->> -endobj - -3233 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3234 0 R] ->> -endobj - -3234 0 obj -<< - /Type /StructElem - /S /Formula - /P 3233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [225] - /Pg 4822 0 R ->> -endobj - -3235 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3236 0 R] ->> -endobj - -3236 0 obj -<< - /Type /StructElem - /S /Formula - /P 3235 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [224] - /Pg 4822 0 R ->> -endobj - -3237 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3238 0 R] ->> -endobj - -3238 0 obj -<< - /Type /StructElem - /S /Formula - /P 3237 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [214 215 216 217 218 219 220 221 222 223] - /Pg 4822 0 R ->> -endobj - -3239 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3240 0 R] ->> -endobj - -3240 0 obj -<< - /Type /StructElem - /S /Formula - /P 3239 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [213] - /Pg 4822 0 R ->> -endobj - -3241 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3242 0 R] ->> -endobj - -3242 0 obj -<< - /Type /StructElem - /S /Formula - /P 3241 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [211 212] - /Pg 4822 0 R ->> -endobj - -3243 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3244 0 R] ->> -endobj - -3244 0 obj -<< - /Type /StructElem - /S /Formula - /P 3243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [210] - /Pg 4822 0 R ->> -endobj - -3245 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3246 0 R] ->> -endobj - -3246 0 obj -<< - /Type /StructElem - /S /Formula - /P 3245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [207 208 209] - /Pg 4822 0 R ->> -endobj - -3247 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3248 0 R] ->> -endobj - -3248 0 obj -<< - /Type /StructElem - /S /Formula - /P 3247 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [206] - /Pg 4822 0 R ->> -endobj - -3249 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3250 0 R] ->> -endobj - -3250 0 obj -<< - /Type /StructElem - /S /Formula - /P 3249 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [205] - /Pg 4822 0 R ->> -endobj - -3251 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3252 0 R] ->> -endobj - -3252 0 obj -<< - /Type /StructElem - /S /Formula - /P 3251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204] - /Pg 4822 0 R ->> -endobj - -3253 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3254 0 R] ->> -endobj - -3254 0 obj -<< - /Type /StructElem - /S /Formula - /P 3253 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4822 0 R ->> -endobj - -3255 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3256 0 R] ->> -endobj - -3256 0 obj -<< - /Type /StructElem - /S /Formula - /P 3255 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161 162 163 164 165] - /Pg 4822 0 R ->> -endobj - -3257 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3258 0 R] ->> -endobj - -3258 0 obj -<< - /Type /StructElem - /S /Formula - /P 3257 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4822 0 R ->> -endobj - -3259 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3260 0 R] ->> -endobj - -3260 0 obj -<< - /Type /StructElem - /S /Formula - /P 3259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155 156 157 158 159] - /Pg 4822 0 R ->> -endobj - -3261 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3262 0 R] ->> -endobj - -3262 0 obj -<< - /Type /StructElem - /S /Formula - /P 3261 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4822 0 R ->> -endobj - -3263 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3264 0 R] ->> -endobj - -3264 0 obj -<< - /Type /StructElem - /S /Formula - /P 3263 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153] - /Pg 4822 0 R ->> -endobj - -3265 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3266 0 R] ->> -endobj - -3266 0 obj -<< - /Type /StructElem - /S /Formula - /P 3265 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143 144 145 146 147 148 149 150 151 152] - /Pg 4822 0 R ->> -endobj - -3267 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3268 0 R] ->> -endobj - -3268 0 obj -<< - /Type /StructElem - /S /Formula - /P 3267 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4822 0 R ->> -endobj - -3269 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3270 0 R] ->> -endobj - -3270 0 obj -<< - /Type /StructElem - /S /Formula - /P 3269 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140 141] - /Pg 4822 0 R ->> -endobj - -3271 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3272 0 R] ->> -endobj - -3272 0 obj -<< - /Type /StructElem - /S /Formula - /P 3271 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4822 0 R ->> -endobj - -3273 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3274 0 R] ->> -endobj - -3274 0 obj -<< - /Type /StructElem - /S /Formula - /P 3273 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128 129 130 131 132 133 134 135 136 137 138] - /Pg 4822 0 R ->> -endobj - -3275 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3276 0 R] ->> -endobj - -3276 0 obj -<< - /Type /StructElem - /S /Formula - /P 3275 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4822 0 R ->> -endobj - -3277 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3278 0 R] ->> -endobj - -3278 0 obj -<< - /Type /StructElem - /S /Formula - /P 3277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4822 0 R ->> -endobj - -3279 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3280 0 R] ->> -endobj - -3280 0 obj -<< - /Type /StructElem - /S /Formula - /P 3279 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119 120 121 122 123 124 125] - /Pg 4822 0 R ->> -endobj - -3281 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3282 0 R] ->> -endobj - -3282 0 obj -<< - /Type /StructElem - /S /Formula - /P 3281 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4822 0 R ->> -endobj - -3283 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3284 0 R] ->> -endobj - -3284 0 obj -<< - /Type /StructElem - /S /Formula - /P 3283 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113 114 115 116 117] - /Pg 4822 0 R ->> -endobj - -3285 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3286 0 R] ->> -endobj - -3286 0 obj -<< - /Type /StructElem - /S /Formula - /P 3285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4822 0 R ->> -endobj - -3287 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3288 0 R] ->> -endobj - -3288 0 obj -<< - /Type /StructElem - /S /Formula - /P 3287 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4822 0 R ->> -endobj - -3289 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3290 0 R] ->> -endobj - -3290 0 obj -<< - /Type /StructElem - /S /Formula - /P 3289 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4822 0 R ->> -endobj - -3291 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3292 0 R] ->> -endobj - -3292 0 obj -<< - /Type /StructElem - /S /Formula - /P 3291 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4822 0 R ->> -endobj - -3293 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3294 0 R] ->> -endobj - -3294 0 obj -<< - /Type /StructElem - /S /Formula - /P 3293 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104 105 106 107 108] - /Pg 4822 0 R ->> -endobj - -3295 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3296 0 R] ->> -endobj - -3296 0 obj -<< - /Type /StructElem - /S /Formula - /P 3295 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4822 0 R ->> -endobj - -3297 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3298 0 R] ->> -endobj - -3298 0 obj -<< - /Type /StructElem - /S /Formula - /P 3297 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101 102] - /Pg 4822 0 R ->> -endobj - -3299 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3300 0 R] ->> -endobj - -3300 0 obj -<< - /Type /StructElem - /S /Formula - /P 3299 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4822 0 R ->> -endobj - -3301 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3302 0 R] ->> -endobj - -3302 0 obj -<< - /Type /StructElem - /S /Formula - /P 3301 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95 96 97 98 99] - /Pg 4822 0 R ->> -endobj - -3303 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3304 0 R] ->> -endobj - -3304 0 obj -<< - /Type /StructElem - /S /Formula - /P 3303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4822 0 R ->> -endobj - -3305 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3306 0 R] ->> -endobj - -3306 0 obj -<< - /Type /StructElem - /S /Formula - /P 3305 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4822 0 R ->> -endobj - -3307 0 obj -<< - /Type /StructElem - /S /P - /P 3221 0 R - /K [3312 0 R 83 3311 0 R 85 3310 0 R 87 3309 0 R 89 3308 0 R 92] - /Pg 4822 0 R ->> -endobj - -3308 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [90 91] - /Pg 4822 0 R ->> -endobj - -3309 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [88] - /Pg 4822 0 R ->> -endobj - -3310 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [86] - /Pg 4822 0 R ->> -endobj - -3311 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [84] - /Pg 4822 0 R ->> -endobj - -3312 0 obj -<< - /Type /StructElem - /S /Strong - /P 3307 0 R - /K [80 81 82] - /Pg 4822 0 R ->> -endobj - -3313 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [63 64 3317 0 R 66 3316 0 R 71 72 3315 0 R 74 3314 0 R 79] - /Pg 4822 0 R ->> -endobj - -3314 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [75 76 77 78] - /Pg 4822 0 R ->> -endobj - -3315 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [73] - /Pg 4822 0 R ->> -endobj - -3316 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [67 68 69 70] - /Pg 4822 0 R ->> -endobj - -3317 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [65] - /Pg 4822 0 R ->> -endobj - -3318 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3331 0 R 3330 0 R 3328 0 R 3319 0 R] ->> -endobj - -3319 0 obj -<< - /Type /StructElem - /S /L - /P 3318 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3324 0 R 3320 0 R] ->> -endobj - -3320 0 obj -<< - /Type /StructElem - /S /LI - /P 3319 0 R - /K [3323 0 R 3321 0 R] ->> -endobj - -3321 0 obj -<< - /Type /StructElem - /S /LBody - /P 3320 0 R - /K [3322 0 R 60 61 62] - /Pg 4822 0 R ->> -endobj - -3322 0 obj -<< - /Type /StructElem - /S /Formula - /P 3321 0 R - /K [50 51 52 53 54 55 56 57 58 59] - /Pg 4822 0 R ->> -endobj - -3323 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3320 0 R - /K [49] - /Pg 4822 0 R ->> -endobj - -3324 0 obj -<< - /Type /StructElem - /S /LI - /P 3319 0 R - /K [3327 0 R 3325 0 R] ->> -endobj - -3325 0 obj -<< - /Type /StructElem - /S /LBody - /P 3324 0 R - /K [3326 0 R 48] - /Pg 4822 0 R ->> -endobj - -3326 0 obj -<< - /Type /StructElem - /S /Formula - /P 3325 0 R - /K [40 41 42 43 44 45 46 47] - /Pg 4822 0 R ->> -endobj - -3327 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3324 0 R - /K [39] - /Pg 4822 0 R ->> -endobj - -3328 0 obj -<< - /Type /StructElem - /S /P - /P 3318 0 R - /K [32 3329 0 R 38] - /Pg 4822 0 R ->> -endobj - -3329 0 obj -<< - /Type /StructElem - /S /Formula - /P 3328 0 R - /K [33 34 35 36 37] - /Pg 4822 0 R ->> -endobj - -3330 0 obj -<< - /Type /StructElem - /S /Formula - /P 3318 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31] - /Pg 4822 0 R ->> -endobj - -3331 0 obj -<< - /Type /StructElem - /S /P - /P 3318 0 R - /K [3332 0 R 10] - /Pg 4822 0 R ->> -endobj - -3332 0 obj -<< - /Type /StructElem - /S /Strong - /P 3331 0 R - /K [7 8 9] - /Pg 4822 0 R ->> -endobj - -3333 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3335 0 R 1 3334 0 R 3 4 5 6] - /Pg 4822 0 R ->> -endobj - -3334 0 obj -<< - /Type /StructElem - /S /Em - /P 3333 0 R - /K [2] - /Pg 4822 0 R ->> -endobj - -3335 0 obj -<< - /Type /StructElem - /S /Strong - /P 3333 0 R - /K [0] - /Pg 4822 0 R ->> -endobj - -3336 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [193 3339 0 R 195 196 197 3338 0 R 199 200 3337 0 R 202 203] - /Pg 4820 0 R ->> -endobj - -3337 0 obj -<< - /Type /StructElem - /S /Em - /P 3336 0 R - /K [201] - /Pg 4820 0 R ->> -endobj - -3338 0 obj -<< - /Type /StructElem - /S /Em - /P 3336 0 R - /K [198] - /Pg 4820 0 R ->> -endobj - -3339 0 obj -<< - /Type /StructElem - /S /Formula - /P 3336 0 R - /K [194] - /Pg 4820 0 R ->> -endobj - -3340 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Isolation and Interception) - /K [191 192] - /Pg 4820 0 R ->> -endobj - -3341 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [131 3359 0 R 133 3358 0 R 135 3357 0 R 137 138 3356 0 R 140 3355 0 R 147 3354 0 R 149 3353 0 R 154 3352 0 R 156 3351 0 R 158 3350 0 R 160 3349 0 R 165 3348 0 R 172 3347 0 R 174 3346 0 R 176 3345 0 R 181 3344 0 R 183 3343 0 R 185 186 3342 0 R 188 189 190] - /Pg 4820 0 R ->> -endobj - -3342 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [187] - /Pg 4820 0 R ->> -endobj - -3343 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [184] - /Pg 4820 0 R ->> -endobj - -3344 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [182] - /Pg 4820 0 R ->> -endobj - -3345 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [177 178 179 180] - /Pg 4820 0 R ->> -endobj - -3346 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [175] - /Pg 4820 0 R ->> -endobj - -3347 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [173] - /Pg 4820 0 R ->> -endobj - -3348 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [166 167 168 169 170 171] - /Pg 4820 0 R ->> -endobj - -3349 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [161 162 163 164] - /Pg 4820 0 R ->> -endobj - -3350 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [159] - /Pg 4820 0 R ->> -endobj - -3351 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [157] - /Pg 4820 0 R ->> -endobj - -3352 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [155] - /Pg 4820 0 R ->> -endobj - -3353 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [150 151 152 153] - /Pg 4820 0 R ->> -endobj - -3354 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [148] - /Pg 4820 0 R ->> -endobj - -3355 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [141 142 143 144 145 146] - /Pg 4820 0 R ->> -endobj - -3356 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [139] - /Pg 4820 0 R ->> -endobj - -3357 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [136] - /Pg 4820 0 R ->> -endobj - -3358 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [134] - /Pg 4820 0 R ->> -endobj - -3359 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [132] - /Pg 4820 0 R ->> -endobj - -3360 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [120 3362 0 R 124 125 126 127 128 3361 0 R 130] - /Pg 4820 0 R ->> -endobj - -3361 0 obj -<< - /Type /StructElem - /S /Link - /P 3360 0 R - /K [129 << - /Type /OBJR - /Pg 4820 0 R - /Obj 4819 0 R - >>] - /Pg 4820 0 R ->> -endobj - -3362 0 obj -<< - /Type /StructElem - /S /Formula - /P 3360 0 R - /K [121 122 123] - /Pg 4820 0 R ->> -endobj - -3363 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3365 0 R 3364 0 R] ->> -endobj - -3364 0 obj -<< - /Type /StructElem - /S /Formula - /P 3363 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119] - /Pg 4820 0 R ->> -endobj - -3365 0 obj -<< - /Type /StructElem - /S /P - /P 3363 0 R - /K [3368 0 R 75 3367 0 R 79 3366 0 R 86] - /Pg 4820 0 R ->> -endobj - -3366 0 obj -<< - /Type /StructElem - /S /Formula - /P 3365 0 R - /K [80 81 82 83 84 85] - /Pg 4820 0 R ->> -endobj - -3367 0 obj -<< - /Type /StructElem - /S /Formula - /P 3365 0 R - /K [76 77 78] - /Pg 4820 0 R ->> -endobj - -3368 0 obj -<< - /Type /StructElem - /S /Strong - /P 3365 0 R - /K [72 73 74] - /Pg 4820 0 R ->> -endobj - -3369 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [56 57 3373 0 R 59 3372 0 R 62 3371 0 R 67 3370 0 R 69 70 71] - /Pg 4820 0 R ->> -endobj - -3370 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [68] - /Pg 4820 0 R ->> -endobj - -3371 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [63 64 65 66] - /Pg 4820 0 R ->> -endobj - -3372 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [60 61] - /Pg 4820 0 R ->> -endobj - -3373 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [58] - /Pg 4820 0 R ->> -endobj - -3374 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3377 0 R 3376 0 R 3375 0 R] ->> -endobj - -3375 0 obj -<< - /Type /StructElem - /S /P - /P 3374 0 R - /K [55] - /Pg 4820 0 R ->> -endobj - -3376 0 obj -<< - /Type /StructElem - /S /Formula - /P 3374 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [47 48 49 50 51 52 53 54] - /Pg 4820 0 R ->> -endobj - -3377 0 obj -<< - /Type /StructElem - /S /P - /P 3374 0 R - /K [3379 0 R 44 3378 0 R 46] - /Pg 4820 0 R ->> -endobj - -3378 0 obj -<< - /Type /StructElem - /S /Em - /P 3377 0 R - /K [45] - /Pg 4820 0 R ->> -endobj - -3379 0 obj -<< - /Type /StructElem - /S /Strong - /P 3377 0 R - /K [41 42 43] - /Pg 4820 0 R ->> -endobj - -3380 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [30 3382 0 R 35 3381 0 R 37 38 39 40] - /Pg 4820 0 R ->> -endobj - -3381 0 obj -<< - /Type /StructElem - /S /Formula - /P 3380 0 R - /K [36] - /Pg 4820 0 R ->> -endobj - -3382 0 obj -<< - /Type /StructElem - /S /Formula - /P 3380 0 R - /K [31 32 33 34] - /Pg 4820 0 R ->> -endobj - -3383 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29] - /Pg 4820 0 R ->> -endobj - -3384 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [265 266 << - /Type /MCR - /MCID 0 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4820 0 R - >> 3387 0 R << - /Type /MCR - /MCID 6 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4820 0 R - >> 3386 0 R << - /Type /MCR - /MCID 11 - /Pg 4820 0 R - >> 3385 0 R << - /Type /MCR - /MCID 13 - /Pg 4820 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3385 0 obj -<< - /Type /StructElem - /S /Em - /P 3384 0 R - /K [12] - /Pg 4820 0 R ->> -endobj - -3386 0 obj -<< - /Type /StructElem - /S /Formula - /P 3384 0 R - /K [8 9 10] - /Pg 4820 0 R ->> -endobj - -3387 0 obj -<< - /Type /StructElem - /S /Formula - /P 3384 0 R - /K [5] - /Pg 4820 0 R ->> -endobj - -3388 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Specification and Notification) - /K [263 264] - /Pg 4817 0 R ->> -endobj - -3389 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [243 3393 0 R 250 3392 0 R 253 254 3391 0 R 256 3390 0 R 259 260 261 262] - /Pg 4817 0 R ->> -endobj - -3390 0 obj -<< - /Type /StructElem - /S /Formula - /P 3389 0 R - /K [257 258] - /Pg 4817 0 R ->> -endobj - -3391 0 obj -<< - /Type /StructElem - /S /Link - /P 3389 0 R - /K [255 << - /Type /OBJR - /Pg 4817 0 R - /Obj 4816 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3392 0 obj -<< - /Type /StructElem - /S /Formula - /P 3389 0 R - /K [251 252] - /Pg 4817 0 R ->> -endobj - -3393 0 obj -<< - /Type /StructElem - /S /Formula - /P 3389 0 R - /K [244 245 246 247 248 249] - /Pg 4817 0 R ->> -endobj - -3394 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3457 0 R 3400 0 R 3395 0 R] ->> -endobj - -3395 0 obj -<< - /Type /StructElem - /S /P - /P 3394 0 R - /K [216 3399 0 R 221 3398 0 R 228 3397 0 R 235 3396 0 R 242] - /Pg 4817 0 R ->> -endobj - -3396 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [236 237 238 239 240 241] - /Pg 4817 0 R ->> -endobj - -3397 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [229 230 231 232 233 234] - /Pg 4817 0 R ->> -endobj - -3398 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [222 223 224 225 226 227] - /Pg 4817 0 R ->> -endobj - -3399 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [217 218 219 220] - /Pg 4817 0 R ->> -endobj - -3400 0 obj -<< - /Type /StructElem - /S /Div - /P 3394 0 R - /K [3455 0 R 3453 0 R 3451 0 R 3449 0 R 3447 0 R 3445 0 R 3443 0 R 3441 0 R 3439 0 R 3437 0 R 3435 0 R 3433 0 R 3431 0 R 3429 0 R 3427 0 R 3425 0 R 3423 0 R 3421 0 R 3419 0 R 3417 0 R 3415 0 R 3413 0 R 3411 0 R 3409 0 R 3407 0 R 3405 0 R 3403 0 R 3401 0 R] ->> -endobj - -3401 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3402 0 R] ->> -endobj - -3402 0 obj -<< - /Type /StructElem - /S /Formula - /P 3401 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215] - /Pg 4817 0 R ->> -endobj - -3403 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3404 0 R] ->> -endobj - -3404 0 obj -<< - /Type /StructElem - /S /Formula - /P 3403 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [198] - /Pg 4817 0 R ->> -endobj - -3405 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3406 0 R] ->> -endobj - -3406 0 obj -<< - /Type /StructElem - /S /Formula - /P 3405 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [197] - /Pg 4817 0 R ->> -endobj - -3407 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3408 0 R] ->> -endobj - -3408 0 obj -<< - /Type /StructElem - /S /Formula - /P 3407 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [196] - /Pg 4817 0 R ->> -endobj - -3409 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3410 0 R] ->> -endobj - -3410 0 obj -<< - /Type /StructElem - /S /Formula - /P 3409 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191 192 193 194 195] - /Pg 4817 0 R ->> -endobj - -3411 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3412 0 R] ->> -endobj - -3412 0 obj -<< - /Type /StructElem - /S /Formula - /P 3411 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [190] - /Pg 4817 0 R ->> -endobj - -3413 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3414 0 R] ->> -endobj - -3414 0 obj -<< - /Type /StructElem - /S /Formula - /P 3413 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [189] - /Pg 4817 0 R ->> -endobj - -3415 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3416 0 R] ->> -endobj - -3416 0 obj -<< - /Type /StructElem - /S /Formula - /P 3415 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [182 183 184 185 186 187 188] - /Pg 4817 0 R ->> -endobj - -3417 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3418 0 R] ->> -endobj - -3418 0 obj -<< - /Type /StructElem - /S /Formula - /P 3417 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [181] - /Pg 4817 0 R ->> -endobj - -3419 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3420 0 R] ->> -endobj - -3420 0 obj -<< - /Type /StructElem - /S /Formula - /P 3419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [180] - /Pg 4817 0 R ->> -endobj - -3421 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3422 0 R] ->> -endobj - -3422 0 obj -<< - /Type /StructElem - /S /Formula - /P 3421 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [179] - /Pg 4817 0 R ->> -endobj - -3423 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3424 0 R] ->> -endobj - -3424 0 obj -<< - /Type /StructElem - /S /Formula - /P 3423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171 172 173 174 175 176 177 178] - /Pg 4817 0 R ->> -endobj - -3425 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3426 0 R] ->> -endobj - -3426 0 obj -<< - /Type /StructElem - /S /Formula - /P 3425 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170] - /Pg 4817 0 R ->> -endobj - -3427 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3428 0 R] ->> -endobj - -3428 0 obj -<< - /Type /StructElem - /S /Formula - /P 3427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4817 0 R ->> -endobj - -3429 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3430 0 R] ->> -endobj - -3430 0 obj -<< - /Type /StructElem - /S /Formula - /P 3429 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165 166 167 168] - /Pg 4817 0 R ->> -endobj - -3431 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3432 0 R] ->> -endobj - -3432 0 obj -<< - /Type /StructElem - /S /Formula - /P 3431 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4817 0 R ->> -endobj - -3433 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3434 0 R] ->> -endobj - -3434 0 obj -<< - /Type /StructElem - /S /Formula - /P 3433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4817 0 R ->> -endobj - -3435 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3436 0 R] ->> -endobj - -3436 0 obj -<< - /Type /StructElem - /S /Formula - /P 3435 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4817 0 R ->> -endobj - -3437 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3438 0 R] ->> -endobj - -3438 0 obj -<< - /Type /StructElem - /S /Formula - /P 3437 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161] - /Pg 4817 0 R ->> -endobj - -3439 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3440 0 R] ->> -endobj - -3440 0 obj -<< - /Type /StructElem - /S /Formula - /P 3439 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4817 0 R ->> -endobj - -3441 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3442 0 R] ->> -endobj - -3442 0 obj -<< - /Type /StructElem - /S /Formula - /P 3441 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159] - /Pg 4817 0 R ->> -endobj - -3443 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3444 0 R] ->> -endobj - -3444 0 obj -<< - /Type /StructElem - /S /Formula - /P 3443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157 158] - /Pg 4817 0 R ->> -endobj - -3445 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3446 0 R] ->> -endobj - -3446 0 obj -<< - /Type /StructElem - /S /Formula - /P 3445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4817 0 R ->> -endobj - -3447 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3448 0 R] ->> -endobj - -3448 0 obj -<< - /Type /StructElem - /S /Formula - /P 3447 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155] - /Pg 4817 0 R ->> -endobj - -3449 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3450 0 R] ->> -endobj - -3450 0 obj -<< - /Type /StructElem - /S /Formula - /P 3449 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4817 0 R ->> -endobj - -3451 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3452 0 R] ->> -endobj - -3452 0 obj -<< - /Type /StructElem - /S /Formula - /P 3451 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149 150 151 152 153] - /Pg 4817 0 R ->> -endobj - -3453 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3454 0 R] ->> -endobj - -3454 0 obj -<< - /Type /StructElem - /S /Formula - /P 3453 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4817 0 R ->> -endobj - -3455 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3456 0 R] ->> -endobj - -3456 0 obj -<< - /Type /StructElem - /S /Formula - /P 3455 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [147] - /Pg 4817 0 R ->> -endobj - -3457 0 obj -<< - /Type /StructElem - /S /P - /P 3394 0 R - /K [3461 0 R 140 3460 0 R 142 3459 0 R 144 3458 0 R 146] - /Pg 4817 0 R ->> -endobj - -3458 0 obj -<< - /Type /StructElem - /S /Formula - /P 3457 0 R - /K [145] - /Pg 4817 0 R ->> -endobj - -3459 0 obj -<< - /Type /StructElem - /S /Formula - /P 3457 0 R - /K [143] - /Pg 4817 0 R ->> -endobj - -3460 0 obj -<< - /Type /StructElem - /S /Formula - /P 3457 0 R - /K [141] - /Pg 4817 0 R ->> -endobj - -3461 0 obj -<< - /Type /StructElem - /S /Strong - /P 3457 0 R - /K [137 138 139] - /Pg 4817 0 R ->> -endobj - -3462 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [112 3467 0 R 114 3466 0 R 116 117 3465 0 R 120 121 122 3464 0 R 129 3463 0 R 136] - /Pg 4817 0 R ->> -endobj - -3463 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [130 131 132 133 134 135] - /Pg 4817 0 R ->> -endobj - -3464 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [123 124 125 126 127 128] - /Pg 4817 0 R ->> -endobj - -3465 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [118 119] - /Pg 4817 0 R ->> -endobj - -3466 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [115] - /Pg 4817 0 R ->> -endobj - -3467 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [113] - /Pg 4817 0 R ->> -endobj - -3468 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3494 0 R 3493 0 R 3489 0 R 3469 0 R] ->> -endobj - -3469 0 obj -<< - /Type /StructElem - /S /L - /P 3468 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3484 0 R 3479 0 R 3474 0 R 3470 0 R] ->> -endobj - -3470 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3473 0 R 3471 0 R] ->> -endobj - -3471 0 obj -<< - /Type /StructElem - /S /LBody - /P 3470 0 R - /K [3472 0 R 111] - /Pg 4817 0 R ->> -endobj - -3472 0 obj -<< - /Type /StructElem - /S /Formula - /P 3471 0 R - /K [105 106 107 108 109 110] - /Pg 4817 0 R ->> -endobj - -3473 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3470 0 R - /K [104] - /Pg 4817 0 R ->> -endobj - -3474 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3478 0 R 3475 0 R] ->> -endobj - -3475 0 obj -<< - /Type /StructElem - /S /LBody - /P 3474 0 R - /K [3477 0 R 96 3476 0 R 103] - /Pg 4817 0 R ->> -endobj - -3476 0 obj -<< - /Type /StructElem - /S /Formula - /P 3475 0 R - /K [97 98 99 100 101 102] - /Pg 4817 0 R ->> -endobj - -3477 0 obj -<< - /Type /StructElem - /S /Formula - /P 3475 0 R - /K [93 94 95] - /Pg 4817 0 R ->> -endobj - -3478 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3474 0 R - /K [92] - /Pg 4817 0 R ->> -endobj - -3479 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3483 0 R 3480 0 R] ->> -endobj - -3480 0 obj -<< - /Type /StructElem - /S /LBody - /P 3479 0 R - /K [3482 0 R 84 3481 0 R 91] - /Pg 4817 0 R ->> -endobj - -3481 0 obj -<< - /Type /StructElem - /S /Formula - /P 3480 0 R - /K [85 86 87 88 89 90] - /Pg 4817 0 R ->> -endobj - -3482 0 obj -<< - /Type /StructElem - /S /Formula - /P 3480 0 R - /K [78 79 80 81 82 83] - /Pg 4817 0 R ->> -endobj - -3483 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3479 0 R - /K [77] - /Pg 4817 0 R ->> -endobj - -3484 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3488 0 R 3485 0 R] ->> -endobj - -3485 0 obj -<< - /Type /StructElem - /S /LBody - /P 3484 0 R - /K [3487 0 R 69 3486 0 R 76] - /Pg 4817 0 R ->> -endobj - -3486 0 obj -<< - /Type /StructElem - /S /Formula - /P 3485 0 R - /K [70 71 72 73 74 75] - /Pg 4817 0 R ->> -endobj - -3487 0 obj -<< - /Type /StructElem - /S /Formula - /P 3485 0 R - /K [65 66 67 68] - /Pg 4817 0 R ->> -endobj - -3488 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3484 0 R - /K [64] - /Pg 4817 0 R ->> -endobj - -3489 0 obj -<< - /Type /StructElem - /S /P - /P 3468 0 R - /K [46 3492 0 R 50 3491 0 R 59 3490 0 R 62 63] - /Pg 4817 0 R ->> -endobj - -3490 0 obj -<< - /Type /StructElem - /S /Formula - /P 3489 0 R - /K [60 61] - /Pg 4817 0 R ->> -endobj - -3491 0 obj -<< - /Type /StructElem - /S /Formula - /P 3489 0 R - /K [51 52 53 54 55 56 57 58] - /Pg 4817 0 R ->> -endobj - -3492 0 obj -<< - /Type /StructElem - /S /Formula - /P 3489 0 R - /K [47 48 49] - /Pg 4817 0 R ->> -endobj - -3493 0 obj -<< - /Type /StructElem - /S /Formula - /P 3468 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35 36 37 38 39 40 41 42 43 44 45] - /Pg 4817 0 R ->> -endobj - -3494 0 obj -<< - /Type /StructElem - /S /P - /P 3468 0 R - /K [3497 0 R 25 3496 0 R 31 3495 0 R 33 34] - /Pg 4817 0 R ->> -endobj - -3495 0 obj -<< - /Type /StructElem - /S /Em - /P 3494 0 R - /K [32] - /Pg 4817 0 R ->> -endobj - -3496 0 obj -<< - /Type /StructElem - /S /Formula - /P 3494 0 R - /K [26 27 28 29 30] - /Pg 4817 0 R ->> -endobj - -3497 0 obj -<< - /Type /StructElem - /S /Strong - /P 3494 0 R - /K [22 23 24] - /Pg 4817 0 R ->> -endobj - -3498 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [13 14 3500 0 R 16 3499 0 R 18 19 20 21] - /Pg 4817 0 R ->> -endobj - -3499 0 obj -<< - /Type /StructElem - /S /Link - /P 3498 0 R - /K [17 << - /Type /OBJR - /Pg 4817 0 R - /Obj 4815 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3500 0 obj -<< - /Type /StructElem - /S /Link - /P 3498 0 R - /K [15 << - /Type /OBJR - /Pg 4817 0 R - /Obj 4814 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3501 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Coeffect Context) - /K [11 12] - /Pg 4817 0 R ->> -endobj - -3502 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3504 0 R 239 240 241 << - /Type /MCR - /MCID 0 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4817 0 R - >> 3503 0 R << - /Type /MCR - /MCID 7 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 8 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 9 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 10 - /Pg 4817 0 R - >>] - /Pg 4812 0 R ->> -endobj - -3503 0 obj -<< - /Type /StructElem - /S /Em - /P 3502 0 R - /K [6] - /Pg 4817 0 R ->> -endobj - -3504 0 obj -<< - /Type /StructElem - /S /Em - /P 3502 0 R - /K [238] - /Pg 4812 0 R ->> -endobj - -3505 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Reactive Coeffects) - /K [236 237] - /Pg 4812 0 R ->> -endobj - -3506 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [213 3512 0 R 215 3511 0 R 223 3510 0 R 225 3509 0 R 227 228 229 230 3508 0 R 232 233 3507 0 R 235] - /Pg 4812 0 R ->> -endobj - -3507 0 obj -<< - /Type /StructElem - /S /Link - /P 3506 0 R - /K [234 << - /Type /OBJR - /Pg 4812 0 R - /Obj 4811 0 R - >>] - /Pg 4812 0 R ->> -endobj - -3508 0 obj -<< - /Type /StructElem - /S /Link - /P 3506 0 R - /K [231 << - /Type /OBJR - /Pg 4812 0 R - /Obj 4810 0 R - >>] - /Pg 4812 0 R ->> -endobj - -3509 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [226] - /Pg 4812 0 R ->> -endobj - -3510 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [224] - /Pg 4812 0 R ->> -endobj - -3511 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [216 217 218 219 220 221 222] - /Pg 4812 0 R ->> -endobj - -3512 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [214] - /Pg 4812 0 R ->> -endobj - -3513 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [190 3520 0 R 192 3519 0 R 196 197 3518 0 R 199 3517 0 R 202 3516 0 R 204 205 206 207 3515 0 R 209 3514 0 R 211 212] - /Pg 4812 0 R ->> -endobj - -3514 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [210] - /Pg 4812 0 R ->> -endobj - -3515 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [208] - /Pg 4812 0 R ->> -endobj - -3516 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [203] - /Pg 4812 0 R ->> -endobj - -3517 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [200 201] - /Pg 4812 0 R ->> -endobj - -3518 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [198] - /Pg 4812 0 R ->> -endobj - -3519 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [193 194 195] - /Pg 4812 0 R ->> -endobj - -3520 0 obj -<< - /Type /StructElem - /S /Em - /P 3513 0 R - /K [191] - /Pg 4812 0 R ->> -endobj - -3521 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3523 0 R 3522 0 R] ->> -endobj - -3522 0 obj -<< - /Type /StructElem - /S /Formula - /P 3521 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189] - /Pg 4812 0 R ->> -endobj - -3523 0 obj -<< - /Type /StructElem - /S /P - /P 3521 0 R - /K [3527 0 R 157 3526 0 R 159 3525 0 R 161 3524 0 R 169] - /Pg 4812 0 R ->> -endobj - -3524 0 obj -<< - /Type /StructElem - /S /Formula - /P 3523 0 R - /K [162 163 164 165 166 167 168] - /Pg 4812 0 R ->> -endobj - -3525 0 obj -<< - /Type /StructElem - /S /Formula - /P 3523 0 R - /K [160] - /Pg 4812 0 R ->> -endobj - -3526 0 obj -<< - /Type /StructElem - /S /Formula - /P 3523 0 R - /K [158] - /Pg 4812 0 R ->> -endobj - -3527 0 obj -<< - /Type /StructElem - /S /Strong - /P 3523 0 R - /K [154 155 156] - /Pg 4812 0 R ->> -endobj - -3528 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [151 3529 0 R 153] - /Pg 4812 0 R ->> -endobj - -3529 0 obj -<< - /Type /StructElem - /S /Formula - /P 3528 0 R - /K [152] - /Pg 4812 0 R ->> -endobj - -3530 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3538 0 R 3537 0 R 3536 0 R 3535 0 R 3534 0 R 3533 0 R 3532 0 R 3531 0 R] ->> -endobj - -3531 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [150] - /Pg 4812 0 R ->> -endobj - -3532 0 obj -<< - /Type /StructElem - /S /Formula - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149] - /Pg 4812 0 R ->> -endobj - -3533 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133] - /Pg 4812 0 R ->> -endobj - -3534 0 obj -<< - /Type /StructElem - /S /Formula - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131 132] - /Pg 4812 0 R ->> -endobj - -3535 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4812 0 R ->> -endobj - -3536 0 obj -<< - /Type /StructElem - /S /Formula - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4812 0 R ->> -endobj - -3537 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4812 0 R ->> -endobj - -3538 0 obj -<< - /Type /StructElem - /S /Strong - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125 126 127] - /Pg 4812 0 R ->> -endobj - -3539 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3563 0 R 3540 0 R] ->> -endobj - -3540 0 obj -<< - /Type /StructElem - /S /Div - /P 3539 0 R - /K [3561 0 R 3559 0 R 3557 0 R 3555 0 R 3553 0 R 3551 0 R 3549 0 R 3547 0 R 3545 0 R 3541 0 R] ->> -endobj - -3541 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3544 0 R 3543 0 R 3542 0 R] ->> -endobj - -3542 0 obj -<< - /Type /StructElem - /S /Formula - /P 3541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118 119 120 121 122 123 124] - /Pg 4812 0 R ->> -endobj - -3543 0 obj -<< - /Type /StructElem - /S /Formula - /P 3541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106 107 108 109 110 111 112 113 114 115 116 117] - /Pg 4812 0 R ->> -endobj - -3544 0 obj -<< - /Type /StructElem - /S /Formula - /P 3541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94 95 96 97 98 99 100 101 102 103 104 105] - /Pg 4812 0 R ->> -endobj - -3545 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3546 0 R] ->> -endobj - -3546 0 obj -<< - /Type /StructElem - /S /Formula - /P 3545 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4812 0 R ->> -endobj - -3547 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3548 0 R] ->> -endobj - -3548 0 obj -<< - /Type /StructElem - /S /Formula - /P 3547 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4812 0 R ->> -endobj - -3549 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3550 0 R] ->> -endobj - -3550 0 obj -<< - /Type /StructElem - /S /Formula - /P 3549 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4812 0 R ->> -endobj - -3551 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3552 0 R] ->> -endobj - -3552 0 obj -<< - /Type /StructElem - /S /Formula - /P 3551 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [88 89 90] - /Pg 4812 0 R ->> -endobj - -3553 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3554 0 R] ->> -endobj - -3554 0 obj -<< - /Type /StructElem - /S /Formula - /P 3553 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 87] - /Pg 4812 0 R ->> -endobj - -3555 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3556 0 R] ->> -endobj - -3556 0 obj -<< - /Type /StructElem - /S /Formula - /P 3555 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4812 0 R ->> -endobj - -3557 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3558 0 R] ->> -endobj - -3558 0 obj -<< - /Type /StructElem - /S /Formula - /P 3557 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4812 0 R ->> -endobj - -3559 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3560 0 R] ->> -endobj - -3560 0 obj -<< - /Type /StructElem - /S /Formula - /P 3559 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4812 0 R ->> -endobj - -3561 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3562 0 R] ->> -endobj - -3562 0 obj -<< - /Type /StructElem - /S /Formula - /P 3561 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80 81 82] - /Pg 4812 0 R ->> -endobj - -3563 0 obj -<< - /Type /StructElem - /S /P - /P 3539 0 R - /K [3566 0 R 68 3565 0 R 75 3564 0 R 79] - /Pg 4812 0 R ->> -endobj - -3564 0 obj -<< - /Type /StructElem - /S /Formula - /P 3563 0 R - /K [76 77 78] - /Pg 4812 0 R ->> -endobj - -3565 0 obj -<< - /Type /StructElem - /S /Formula - /P 3563 0 R - /K [69 70 71 72 73 74] - /Pg 4812 0 R ->> -endobj - -3566 0 obj -<< - /Type /StructElem - /S /Strong - /P 3563 0 R - /K [65 66 67] - /Pg 4812 0 R ->> -endobj - -3567 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [60 3568 0 R 63 64] - /Pg 4812 0 R ->> -endobj - -3568 0 obj -<< - /Type /StructElem - /S /Formula - /P 3567 0 R - /K [61 62] - /Pg 4812 0 R ->> -endobj - -3569 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3577 0 R 3576 0 R 3575 0 R 3574 0 R 3573 0 R 3572 0 R 3571 0 R 3570 0 R] ->> -endobj - -3570 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4812 0 R ->> -endobj - -3571 0 obj -<< - /Type /StructElem - /S /Formula - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58] - /Pg 4812 0 R ->> -endobj - -3572 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4812 0 R ->> -endobj - -3573 0 obj -<< - /Type /StructElem - /S /Formula - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [39 40] - /Pg 4812 0 R ->> -endobj - -3574 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38] - /Pg 4812 0 R ->> -endobj - -3575 0 obj -<< - /Type /StructElem - /S /Formula - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37] - /Pg 4812 0 R ->> -endobj - -3576 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4812 0 R ->> -endobj - -3577 0 obj -<< - /Type /StructElem - /S /Strong - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33 34 35] - /Pg 4812 0 R ->> -endobj - -3578 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3594 0 R 3593 0 R 3592 0 R 3591 0 R 3590 0 R 3589 0 R 3588 0 R 3587 0 R 3586 0 R 3585 0 R 3584 0 R 23 3583 0 R 3582 0 R 3581 0 R 3580 0 R 3579 0 R] - /Pg 4812 0 R ->> -endobj - -3579 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [30 31 32] - /Pg 4812 0 R ->> -endobj - -3580 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [28 29] - /Pg 4812 0 R ->> -endobj - -3581 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [26 27] - /Pg 4812 0 R ->> -endobj - -3582 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [25] - /Pg 4812 0 R ->> -endobj - -3583 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [24] - /Pg 4812 0 R ->> -endobj - -3584 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [21 22] - /Pg 4812 0 R ->> -endobj - -3585 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [19 20] - /Pg 4812 0 R ->> -endobj - -3586 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [17 18] - /Pg 4812 0 R ->> -endobj - -3587 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [15 16] - /Pg 4812 0 R ->> -endobj - -3588 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [13 14] - /Pg 4812 0 R ->> -endobj - -3589 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [11 12] - /Pg 4812 0 R ->> -endobj - -3590 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [10] - /Pg 4812 0 R ->> -endobj - -3591 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [6 7 8 9] - /Pg 4812 0 R ->> -endobj - -3592 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [3 4 5] - /Pg 4812 0 R ->> -endobj - -3593 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [1 2] - /Pg 4812 0 R ->> -endobj - -3594 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [0] - /Pg 4812 0 R ->> -endobj - -3595 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [263 3597 0 R 266 3596 0 R 270 271] - /Pg 4808 0 R ->> -endobj - -3596 0 obj -<< - /Type /StructElem - /S /Formula - /P 3595 0 R - /K [267 268 269] - /Pg 4808 0 R ->> -endobj - -3597 0 obj -<< - /Type /StructElem - /S /Formula - /P 3595 0 R - /K [264 265] - /Pg 4808 0 R ->> -endobj - -3598 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3629 0 R 3599 0 R] ->> -endobj - -3599 0 obj -<< - /Type /StructElem - /S /Div - /P 3598 0 R - /K [3627 0 R 3625 0 R 3623 0 R 3621 0 R 3619 0 R 3617 0 R 3615 0 R 3613 0 R 3611 0 R 3609 0 R 3607 0 R 3605 0 R 3603 0 R 3600 0 R] ->> -endobj - -3600 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3602 0 R 3601 0 R] ->> -endobj - -3601 0 obj -<< - /Type /StructElem - /S /Formula - /P 3600 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [248 249 250 251 252 253 254 255 256 257 258 259 260 261 262] - /Pg 4808 0 R ->> -endobj - -3602 0 obj -<< - /Type /StructElem - /S /Formula - /P 3600 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [236 237 238 239 240 241 242 243 244 245 246 247] - /Pg 4808 0 R ->> -endobj - -3603 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3604 0 R] ->> -endobj - -3604 0 obj -<< - /Type /StructElem - /S /Formula - /P 3603 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [235] - /Pg 4808 0 R ->> -endobj - -3605 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3606 0 R] ->> -endobj - -3606 0 obj -<< - /Type /StructElem - /S /Formula - /P 3605 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [230 231 232 233 234] - /Pg 4808 0 R ->> -endobj - -3607 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3608 0 R] ->> -endobj - -3608 0 obj -<< - /Type /StructElem - /S /Formula - /P 3607 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [229] - /Pg 4808 0 R ->> -endobj - -3609 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3610 0 R] ->> -endobj - -3610 0 obj -<< - /Type /StructElem - /S /Formula - /P 3609 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [228] - /Pg 4808 0 R ->> -endobj - -3611 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3612 0 R] ->> -endobj - -3612 0 obj -<< - /Type /StructElem - /S /Formula - /P 3611 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [227] - /Pg 4808 0 R ->> -endobj - -3613 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3614 0 R] ->> -endobj - -3614 0 obj -<< - /Type /StructElem - /S /Formula - /P 3613 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [225 226] - /Pg 4808 0 R ->> -endobj - -3615 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3616 0 R] ->> -endobj - -3616 0 obj -<< - /Type /StructElem - /S /Formula - /P 3615 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [222 223 224] - /Pg 4808 0 R ->> -endobj - -3617 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3618 0 R] ->> -endobj - -3618 0 obj -<< - /Type /StructElem - /S /Formula - /P 3617 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [221] - /Pg 4808 0 R ->> -endobj - -3619 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3620 0 R] ->> -endobj - -3620 0 obj -<< - /Type /StructElem - /S /Formula - /P 3619 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [219 220] - /Pg 4808 0 R ->> -endobj - -3621 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3622 0 R] ->> -endobj - -3622 0 obj -<< - /Type /StructElem - /S /Formula - /P 3621 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [218] - /Pg 4808 0 R ->> -endobj - -3623 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3624 0 R] ->> -endobj - -3624 0 obj -<< - /Type /StructElem - /S /Formula - /P 3623 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [216 217] - /Pg 4808 0 R ->> -endobj - -3625 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3626 0 R] ->> -endobj - -3626 0 obj -<< - /Type /StructElem - /S /Formula - /P 3625 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [215] - /Pg 4808 0 R ->> -endobj - -3627 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3628 0 R] ->> -endobj - -3628 0 obj -<< - /Type /StructElem - /S /Formula - /P 3627 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [213 214] - /Pg 4808 0 R ->> -endobj - -3629 0 obj -<< - /Type /StructElem - /S /P - /P 3598 0 R - /K [3631 0 R 209 3630 0 R 212] - /Pg 4808 0 R ->> -endobj - -3630 0 obj -<< - /Type /StructElem - /S /Formula - /P 3629 0 R - /K [210 211] - /Pg 4808 0 R ->> -endobj - -3631 0 obj -<< - /Type /StructElem - /S /Strong - /P 3629 0 R - /K [206 207 208] - /Pg 4808 0 R ->> -endobj - -3632 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [191 3636 0 R 194 3635 0 R 198 3634 0 R 201 3633 0 R 205] - /Pg 4808 0 R ->> -endobj - -3633 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [202 203 204] - /Pg 4808 0 R ->> -endobj - -3634 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [199 200] - /Pg 4808 0 R ->> -endobj - -3635 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [195 196 197] - /Pg 4808 0 R ->> -endobj - -3636 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [192 193] - /Pg 4808 0 R ->> -endobj - -3637 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3645 0 R 3644 0 R 3643 0 R 3642 0 R 3641 0 R 3640 0 R 3639 0 R 3638 0 R] ->> -endobj - -3638 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [189 190] - /Pg 4808 0 R ->> -endobj - -3639 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [188] - /Pg 4808 0 R ->> -endobj - -3640 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [187] - /Pg 4808 0 R ->> -endobj - -3641 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [185 186] - /Pg 4808 0 R ->> -endobj - -3642 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [183 184] - /Pg 4808 0 R ->> -endobj - -3643 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [182] - /Pg 4808 0 R ->> -endobj - -3644 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [179 180 181] - /Pg 4808 0 R ->> -endobj - -3645 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [178] - /Pg 4808 0 R ->> -endobj - -3646 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [167 3647 0 R 174 175 176 177] - /Pg 4808 0 R ->> -endobj - -3647 0 obj -<< - /Type /StructElem - /S /Formula - /P 3646 0 R - /K [168 169 170 171 172 173] - /Pg 4808 0 R ->> -endobj - -3648 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3662 0 R 3661 0 R 3658 0 R 3649 0 R] ->> -endobj - -3649 0 obj -<< - /Type /StructElem - /S /L - /P 3648 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3654 0 R 3650 0 R] ->> -endobj - -3650 0 obj -<< - /Type /StructElem - /S /LI - /P 3649 0 R - /K [3653 0 R 3651 0 R] ->> -endobj - -3651 0 obj -<< - /Type /StructElem - /S /LBody - /P 3650 0 R - /K [3652 0 R 166] - /Pg 4808 0 R ->> -endobj - -3652 0 obj -<< - /Type /StructElem - /S /Formula - /P 3651 0 R - /K [161 162 163 164 165] - /Pg 4808 0 R ->> -endobj - -3653 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3650 0 R - /K [160] - /Pg 4808 0 R ->> -endobj - -3654 0 obj -<< - /Type /StructElem - /S /LI - /P 3649 0 R - /K [3657 0 R 3655 0 R] ->> -endobj - -3655 0 obj -<< - /Type /StructElem - /S /LBody - /P 3654 0 R - /K [3656 0 R 159] - /Pg 4808 0 R ->> -endobj - -3656 0 obj -<< - /Type /StructElem - /S /Formula - /P 3655 0 R - /K [156 157 158] - /Pg 4808 0 R ->> -endobj - -3657 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3654 0 R - /K [155] - /Pg 4808 0 R ->> -endobj - -3658 0 obj -<< - /Type /StructElem - /S /P - /P 3648 0 R - /K [143 3660 0 R 148 3659 0 R 154] - /Pg 4808 0 R ->> -endobj - -3659 0 obj -<< - /Type /StructElem - /S /Formula - /P 3658 0 R - /K [149 150 151 152 153] - /Pg 4808 0 R ->> -endobj - -3660 0 obj -<< - /Type /StructElem - /S /Formula - /P 3658 0 R - /K [144 145 146 147] - /Pg 4808 0 R ->> -endobj - -3661 0 obj -<< - /Type /StructElem - /S /Formula - /P 3648 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142] - /Pg 4808 0 R ->> -endobj - -3662 0 obj -<< - /Type /StructElem - /S /P - /P 3648 0 R - /K [3665 0 R 76 3664 0 R 79 3663 0 R 83] - /Pg 4808 0 R ->> -endobj - -3663 0 obj -<< - /Type /StructElem - /S /Formula - /P 3662 0 R - /K [80 81 82] - /Pg 4808 0 R ->> -endobj - -3664 0 obj -<< - /Type /StructElem - /S /Formula - /P 3662 0 R - /K [77 78] - /Pg 4808 0 R ->> -endobj - -3665 0 obj -<< - /Type /StructElem - /S /Strong - /P 3662 0 R - /K [73 74 75] - /Pg 4808 0 R ->> -endobj - -3666 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [60 61 62 3669 0 R 65 3668 0 R 68 3667 0 R 72] - /Pg 4808 0 R ->> -endobj - -3667 0 obj -<< - /Type /StructElem - /S /Formula - /P 3666 0 R - /K [69 70 71] - /Pg 4808 0 R ->> -endobj - -3668 0 obj -<< - /Type /StructElem - /S /Formula - /P 3666 0 R - /K [66 67] - /Pg 4808 0 R ->> -endobj - -3669 0 obj -<< - /Type /StructElem - /S /Formula - /P 3666 0 R - /K [63 64] - /Pg 4808 0 R ->> -endobj - -3670 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [3677 0 R 3671 0 R] ->> -endobj - -3671 0 obj -<< - /Type /StructElem - /S /LI - /P 3670 0 R - /K [3676 0 R 3672 0 R] ->> -endobj - -3672 0 obj -<< - /Type /StructElem - /S /LBody - /P 3671 0 R - /K [34 3675 0 R 37 38 3674 0 R 52 3673 0 R 59] - /Pg 4808 0 R ->> -endobj - -3673 0 obj -<< - /Type /StructElem - /S /Formula - /P 3672 0 R - /K [53 54 55 56 57 58] - /Pg 4808 0 R ->> -endobj - -3674 0 obj -<< - /Type /StructElem - /S /Formula - /P 3672 0 R - /K [39 40 41 42 43 44 45 46 47 48 49 50 51] - /Pg 4808 0 R ->> -endobj - -3675 0 obj -<< - /Type /StructElem - /S /Formula - /P 3672 0 R - /K [35 36] - /Pg 4808 0 R ->> -endobj - -3676 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3671 0 R - /K [33] - /Pg 4808 0 R ->> -endobj - -3677 0 obj -<< - /Type /StructElem - /S /LI - /P 3670 0 R - /K [3682 0 R 3678 0 R] ->> -endobj - -3678 0 obj -<< - /Type /StructElem - /S /LBody - /P 3677 0 R - /K [14 3681 0 R 16 17 3680 0 R 27 3679 0 R 32] - /Pg 4808 0 R ->> -endobj - -3679 0 obj -<< - /Type /StructElem - /S /Formula - /P 3678 0 R - /K [28 29 30 31] - /Pg 4808 0 R ->> -endobj - -3680 0 obj -<< - /Type /StructElem - /S /Formula - /P 3678 0 R - /K [18 19 20 21 22 23 24 25 26] - /Pg 4808 0 R ->> -endobj - -3681 0 obj -<< - /Type /StructElem - /S /Formula - /P 3678 0 R - /K [15] - /Pg 4808 0 R ->> -endobj - -3682 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3677 0 R - /K [13] - /Pg 4808 0 R ->> -endobj - -3683 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3686 0 R 4 3685 0 R 6 7 8 3684 0 R 10 11 12] - /Pg 4808 0 R ->> -endobj - -3684 0 obj -<< - /Type /StructElem - /S /Formula - /P 3683 0 R - /K [9] - /Pg 4808 0 R ->> -endobj - -3685 0 obj -<< - /Type /StructElem - /S /Formula - /P 3683 0 R - /K [5] - /Pg 4808 0 R ->> -endobj - -3686 0 obj -<< - /Type /StructElem - /S /Formula - /P 3683 0 R - /K [3] - /Pg 4808 0 R ->> -endobj - -3687 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Revertible Effect Functions) - /K [0 1] - /Pg 4808 0 R ->> -endobj - -3688 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3704 0 R 3703 0 R 3702 0 R 3701 0 R 3700 0 R 3699 0 R 3698 0 R 3697 0 R 3696 0 R 3695 0 R 3694 0 R 3693 0 R 3692 0 R 3691 0 R 3690 0 R 3689 0 R] ->> -endobj - -3689 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [342 343] - /Pg 4806 0 R ->> -endobj - -3690 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [340 341] - /Pg 4806 0 R ->> -endobj - -3691 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [338 339] - /Pg 4806 0 R ->> -endobj - -3692 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [336 337] - /Pg 4806 0 R ->> -endobj - -3693 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [335] - /Pg 4806 0 R ->> -endobj - -3694 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [334] - /Pg 4806 0 R ->> -endobj - -3695 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [333] - /Pg 4806 0 R ->> -endobj - -3696 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [332] - /Pg 4806 0 R ->> -endobj - -3697 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [331] - /Pg 4806 0 R ->> -endobj - -3698 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [330] - /Pg 4806 0 R ->> -endobj - -3699 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [329] - /Pg 4806 0 R ->> -endobj - -3700 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [328] - /Pg 4806 0 R ->> -endobj - -3701 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [325 326 327] - /Pg 4806 0 R ->> -endobj - -3702 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [322 323 324] - /Pg 4806 0 R ->> -endobj - -3703 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [320 321] - /Pg 4806 0 R ->> -endobj - -3704 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [318 319] - /Pg 4806 0 R ->> -endobj - -3705 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [287 3712 0 R 289 3711 0 R 291 3710 0 R 293 294 3709 0 R 296 3708 0 R 298 299 3707 0 R 313 314 3706 0 R 317] - /Pg 4806 0 R ->> -endobj - -3706 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [315 316] - /Pg 4806 0 R ->> -endobj - -3707 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [300 301 302 303 304 305 306 307 308 309 310 311 312] - /Pg 4806 0 R ->> -endobj - -3708 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [297] - /Pg 4806 0 R ->> -endobj - -3709 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [295] - /Pg 4806 0 R ->> -endobj - -3710 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [292] - /Pg 4806 0 R ->> -endobj - -3711 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [290] - /Pg 4806 0 R ->> -endobj - -3712 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [288] - /Pg 4806 0 R ->> -endobj - -3713 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3735 0 R 3714 0 R] ->> -endobj - -3714 0 obj -<< - /Type /StructElem - /S /Div - /P 3713 0 R - /K [3733 0 R 3731 0 R 3729 0 R 3727 0 R 3725 0 R 3723 0 R 3721 0 R 3719 0 R 3717 0 R 3715 0 R] ->> -endobj - -3715 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3716 0 R] ->> -endobj - -3716 0 obj -<< - /Type /StructElem - /S /Formula - /P 3715 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [278 279 280 281 282 283 284 285 286] - /Pg 4806 0 R ->> -endobj - -3717 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3718 0 R] ->> -endobj - -3718 0 obj -<< - /Type /StructElem - /S /Formula - /P 3717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [277] - /Pg 4806 0 R ->> -endobj - -3719 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3720 0 R] ->> -endobj - -3720 0 obj -<< - /Type /StructElem - /S /Formula - /P 3719 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [272 273 274 275 276] - /Pg 4806 0 R ->> -endobj - -3721 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3722 0 R] ->> -endobj - -3722 0 obj -<< - /Type /StructElem - /S /Formula - /P 3721 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [271] - /Pg 4806 0 R ->> -endobj - -3723 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3724 0 R] ->> -endobj - -3724 0 obj -<< - /Type /StructElem - /S /Formula - /P 3723 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [269 270] - /Pg 4806 0 R ->> -endobj - -3725 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3726 0 R] ->> -endobj - -3726 0 obj -<< - /Type /StructElem - /S /Formula - /P 3725 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [267 268] - /Pg 4806 0 R ->> -endobj - -3727 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3728 0 R] ->> -endobj - -3728 0 obj -<< - /Type /StructElem - /S /Formula - /P 3727 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [266] - /Pg 4806 0 R ->> -endobj - -3729 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3730 0 R] ->> -endobj - -3730 0 obj -<< - /Type /StructElem - /S /Formula - /P 3729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [264 265] - /Pg 4806 0 R ->> -endobj - -3731 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3732 0 R] ->> -endobj - -3732 0 obj -<< - /Type /StructElem - /S /Formula - /P 3731 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [263] - /Pg 4806 0 R ->> -endobj - -3733 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3734 0 R] ->> -endobj - -3734 0 obj -<< - /Type /StructElem - /S /Formula - /P 3733 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [261 262] - /Pg 4806 0 R ->> -endobj - -3735 0 obj -<< - /Type /StructElem - /S /P - /P 3713 0 R - /K [3738 0 R 254 3737 0 R 257 3736 0 R 260] - /Pg 4806 0 R ->> -endobj - -3736 0 obj -<< - /Type /StructElem - /S /Formula - /P 3735 0 R - /K [258 259] - /Pg 4806 0 R ->> -endobj - -3737 0 obj -<< - /Type /StructElem - /S /Formula - /P 3735 0 R - /K [255 256] - /Pg 4806 0 R ->> -endobj - -3738 0 obj -<< - /Type /StructElem - /S /Strong - /P 3735 0 R - /K [251 252 253] - /Pg 4806 0 R ->> -endobj - -3739 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [241 3742 0 R 244 3741 0 R 246 247 3740 0 R 250] - /Pg 4806 0 R ->> -endobj - -3740 0 obj -<< - /Type /StructElem - /S /Formula - /P 3739 0 R - /K [248 249] - /Pg 4806 0 R ->> -endobj - -3741 0 obj -<< - /Type /StructElem - /S /Formula - /P 3739 0 R - /K [245] - /Pg 4806 0 R ->> -endobj - -3742 0 obj -<< - /Type /StructElem - /S /Formula - /P 3739 0 R - /K [242 243] - /Pg 4806 0 R ->> -endobj - -3743 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3745 0 R 3744 0 R] ->> -endobj - -3744 0 obj -<< - /Type /StructElem - /S /Formula - /P 3743 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240] - /Pg 4806 0 R ->> -endobj - -3745 0 obj -<< - /Type /StructElem - /S /P - /P 3743 0 R - /K [3749 0 R 208 3748 0 R 210 3747 0 R 212 3746 0 R 220] - /Pg 4806 0 R ->> -endobj - -3746 0 obj -<< - /Type /StructElem - /S /Formula - /P 3745 0 R - /K [213 214 215 216 217 218 219] - /Pg 4806 0 R ->> -endobj - -3747 0 obj -<< - /Type /StructElem - /S /Formula - /P 3745 0 R - /K [211] - /Pg 4806 0 R ->> -endobj - -3748 0 obj -<< - /Type /StructElem - /S /Formula - /P 3745 0 R - /K [209] - /Pg 4806 0 R ->> -endobj - -3749 0 obj -<< - /Type /StructElem - /S /Strong - /P 3745 0 R - /K [205 206 207] - /Pg 4806 0 R ->> -endobj - -3750 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3759 0 R 3758 0 R 3757 0 R 3756 0 R 3755 0 R 3754 0 R 3753 0 R 3752 0 R 3751 0 R] ->> -endobj - -3751 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [203 204] - /Pg 4806 0 R ->> -endobj - -3752 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [201 202] - /Pg 4806 0 R ->> -endobj - -3753 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [200] - /Pg 4806 0 R ->> -endobj - -3754 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [199] - /Pg 4806 0 R ->> -endobj - -3755 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [198] - /Pg 4806 0 R ->> -endobj - -3756 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [196 197] - /Pg 4806 0 R ->> -endobj - -3757 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [194 195] - /Pg 4806 0 R ->> -endobj - -3758 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [192 193] - /Pg 4806 0 R ->> -endobj - -3759 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [191] - /Pg 4806 0 R ->> -endobj - -3760 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3764 0 R 3763 0 R 3762 0 R 3761 0 R] ->> -endobj - -3761 0 obj -<< - /Type /StructElem - /S /Span - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [190] - /Pg 4806 0 R ->> -endobj - -3762 0 obj -<< - /Type /StructElem - /S /Formula - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189] - /Pg 4806 0 R ->> -endobj - -3763 0 obj -<< - /Type /StructElem - /S /Span - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170] - /Pg 4806 0 R ->> -endobj - -3764 0 obj -<< - /Type /StructElem - /S /Strong - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167 168 169] - /Pg 4806 0 R ->> -endobj - -3765 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [78 3781 0 R 83 3780 0 R 85 86 3779 0 R 89 3778 0 R 95 3777 0 R 101 3776 0 R 103 3775 0 R 105 3774 0 R 107 3773 0 R 113 3772 0 R 116 117 3771 0 R 140 3770 0 R 143 144 3769 0 R 155 3768 0 R 157 3767 0 R 163 3766 0 R 166] - /Pg 4806 0 R ->> -endobj - -3766 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [164 165] - /Pg 4806 0 R ->> -endobj - -3767 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [158 159 160 161 162] - /Pg 4806 0 R ->> -endobj - -3768 0 obj -<< - /Type /StructElem - /S /Link - /P 3765 0 R - /K [156 << - /Type /OBJR - /Pg 4806 0 R - /Obj 4805 0 R - >>] - /Pg 4806 0 R ->> -endobj - -3769 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [145 146 147 148 149 150 151 152 153 154] - /Pg 4806 0 R ->> -endobj - -3770 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [141 142] - /Pg 4806 0 R ->> -endobj - -3771 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139] - /Pg 4806 0 R ->> -endobj - -3772 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [114 115] - /Pg 4806 0 R ->> -endobj - -3773 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [108 109 110 111 112] - /Pg 4806 0 R ->> -endobj - -3774 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [106] - /Pg 4806 0 R ->> -endobj - -3775 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [104] - /Pg 4806 0 R ->> -endobj - -3776 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [102] - /Pg 4806 0 R ->> -endobj - -3777 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [96 97 98 99 100] - /Pg 4806 0 R ->> -endobj - -3778 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [90 91 92 93 94] - /Pg 4806 0 R ->> -endobj - -3779 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [87 88] - /Pg 4806 0 R ->> -endobj - -3780 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [84] - /Pg 4806 0 R ->> -endobj - -3781 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [79 80 81 82] - /Pg 4806 0 R ->> -endobj - -3782 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3812 0 R 3783 0 R] ->> -endobj - -3783 0 obj -<< - /Type /StructElem - /S /Div - /P 3782 0 R - /K [3810 0 R 3808 0 R 3806 0 R 3804 0 R 3802 0 R 3800 0 R 3798 0 R 3796 0 R 3794 0 R 3792 0 R 3790 0 R 3788 0 R 3786 0 R 3784 0 R] ->> -endobj - -3784 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3785 0 R] ->> -endobj - -3785 0 obj -<< - /Type /StructElem - /S /Formula - /P 3784 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66 67 68 69 70 71 72 73 74 75 76 77] - /Pg 4806 0 R ->> -endobj - -3786 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3787 0 R] ->> -endobj - -3787 0 obj -<< - /Type /StructElem - /S /Formula - /P 3786 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [65] - /Pg 4806 0 R ->> -endobj - -3788 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3789 0 R] ->> -endobj - -3789 0 obj -<< - /Type /StructElem - /S /Formula - /P 3788 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [60 61 62 63 64] - /Pg 4806 0 R ->> -endobj - -3790 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3791 0 R] ->> -endobj - -3791 0 obj -<< - /Type /StructElem - /S /Formula - /P 3790 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4806 0 R ->> -endobj - -3792 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3793 0 R] ->> -endobj - -3793 0 obj -<< - /Type /StructElem - /S /Formula - /P 3792 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [58] - /Pg 4806 0 R ->> -endobj - -3794 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3795 0 R] ->> -endobj - -3795 0 obj -<< - /Type /StructElem - /S /Formula - /P 3794 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [57] - /Pg 4806 0 R ->> -endobj - -3796 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3797 0 R] ->> -endobj - -3797 0 obj -<< - /Type /StructElem - /S /Formula - /P 3796 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [55 56] - /Pg 4806 0 R ->> -endobj - -3798 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3799 0 R] ->> -endobj - -3799 0 obj -<< - /Type /StructElem - /S /Formula - /P 3798 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [53 54] - /Pg 4806 0 R ->> -endobj - -3800 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3801 0 R] ->> -endobj - -3801 0 obj -<< - /Type /StructElem - /S /Formula - /P 3800 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52] - /Pg 4806 0 R ->> -endobj - -3802 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3803 0 R] ->> -endobj - -3803 0 obj -<< - /Type /StructElem - /S /Formula - /P 3802 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [50 51] - /Pg 4806 0 R ->> -endobj - -3804 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3805 0 R] ->> -endobj - -3805 0 obj -<< - /Type /StructElem - /S /Formula - /P 3804 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [49] - /Pg 4806 0 R ->> -endobj - -3806 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3807 0 R] ->> -endobj - -3807 0 obj -<< - /Type /StructElem - /S /Formula - /P 3806 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44 45 46 47 48] - /Pg 4806 0 R ->> -endobj - -3808 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3809 0 R] ->> -endobj - -3809 0 obj -<< - /Type /StructElem - /S /Formula - /P 3808 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4806 0 R ->> -endobj - -3810 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3811 0 R] ->> -endobj - -3811 0 obj -<< - /Type /StructElem - /S /Formula - /P 3810 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41 42] - /Pg 4806 0 R ->> -endobj - -3812 0 obj -<< - /Type /StructElem - /S /P - /P 3782 0 R - /K [3816 0 R 30 3815 0 R 33 3814 0 R 36 3813 0 R 40] - /Pg 4806 0 R ->> -endobj - -3813 0 obj -<< - /Type /StructElem - /S /Formula - /P 3812 0 R - /K [37 38 39] - /Pg 4806 0 R ->> -endobj - -3814 0 obj -<< - /Type /StructElem - /S /Formula - /P 3812 0 R - /K [34 35] - /Pg 4806 0 R ->> -endobj - -3815 0 obj -<< - /Type /StructElem - /S /Formula - /P 3812 0 R - /K [31 32] - /Pg 4806 0 R ->> -endobj - -3816 0 obj -<< - /Type /StructElem - /S /Strong - /P 3812 0 R - /K [27 28 29] - /Pg 4806 0 R ->> -endobj - -3817 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [20 3819 0 R 22 3818 0 R 25 26] - /Pg 4806 0 R ->> -endobj - -3818 0 obj -<< - /Type /StructElem - /S /Formula - /P 3817 0 R - /K [23 24] - /Pg 4806 0 R ->> -endobj - -3819 0 obj -<< - /Type /StructElem - /S /Formula - /P 3817 0 R - /K [21] - /Pg 4806 0 R ->> -endobj - -3820 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3835 0 R 3834 0 R 3832 0 R 3823 0 R 3821 0 R] ->> -endobj - -3821 0 obj -<< - /Type /StructElem - /S /P - /P 3820 0 R - /K [11 3822 0 R 19] - /Pg 4806 0 R ->> -endobj - -3822 0 obj -<< - /Type /StructElem - /S /Formula - /P 3821 0 R - /K [12 13 14 15 16 17 18] - /Pg 4806 0 R ->> -endobj - -3823 0 obj -<< - /Type /StructElem - /S /L - /P 3820 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3828 0 R 3824 0 R] ->> -endobj - -3824 0 obj -<< - /Type /StructElem - /S /LI - /P 3823 0 R - /K [3827 0 R 3825 0 R] ->> -endobj - -3825 0 obj -<< - /Type /StructElem - /S /LBody - /P 3824 0 R - /K [3826 0 R 10] - /Pg 4806 0 R ->> -endobj - -3826 0 obj -<< - /Type /StructElem - /S /Formula - /P 3825 0 R - /K [6 7 8 9] - /Pg 4806 0 R ->> -endobj - -3827 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3824 0 R - /K [5] - /Pg 4806 0 R ->> -endobj - -3828 0 obj -<< - /Type /StructElem - /S /LI - /P 3823 0 R - /K [3831 0 R 3829 0 R] ->> -endobj - -3829 0 obj -<< - /Type /StructElem - /S /LBody - /P 3828 0 R - /K [3830 0 R 4] - /Pg 4806 0 R ->> -endobj - -3830 0 obj -<< - /Type /StructElem - /S /Formula - /P 3829 0 R - /K [1 2 3] - /Pg 4806 0 R ->> -endobj - -3831 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3828 0 R - /K [0] - /Pg 4806 0 R ->> -endobj - -3832 0 obj -<< - /Type /StructElem - /S /P - /P 3820 0 R - /K [164 3833 0 R 170] - /Pg 4803 0 R ->> -endobj - -3833 0 obj -<< - /Type /StructElem - /S /Formula - /P 3832 0 R - /K [165 166 167 168 169] - /Pg 4803 0 R ->> -endobj - -3834 0 obj -<< - /Type /StructElem - /S /Formula - /P 3820 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156 157 158 159 160 161 162 163] - /Pg 4803 0 R ->> -endobj - -3835 0 obj -<< - /Type /StructElem - /S /P - /P 3820 0 R - /K [3838 0 R 151 3837 0 R 153 3836 0 R 155] - /Pg 4803 0 R ->> -endobj - -3836 0 obj -<< - /Type /StructElem - /S /Em - /P 3835 0 R - /K [154] - /Pg 4803 0 R ->> -endobj - -3837 0 obj -<< - /Type /StructElem - /S /Formula - /P 3835 0 R - /K [152] - /Pg 4803 0 R ->> -endobj - -3838 0 obj -<< - /Type /StructElem - /S /Strong - /P 3835 0 R - /K [148 149 150] - /Pg 4803 0 R ->> -endobj - -3839 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [147] - /Pg 4803 0 R ->> -endobj - -3840 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [128 3845 0 R 130 131 132 133 3844 0 R 135 3843 0 R 138 3842 0 R 141 142 143 3841 0 R 145 146] - /Pg 4803 0 R ->> -endobj - -3841 0 obj -<< - /Type /StructElem - /S /Link - /P 3840 0 R - /K [144 << - /Type /OBJR - /Pg 4803 0 R - /Obj 4802 0 R - >>] - /Pg 4803 0 R ->> -endobj - -3842 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [139 140] - /Pg 4803 0 R ->> -endobj - -3843 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [136 137] - /Pg 4803 0 R ->> -endobj - -3844 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [134] - /Pg 4803 0 R ->> -endobj - -3845 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [129] - /Pg 4803 0 R ->> -endobj - -3846 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3859 0 R 3853 0 R 3847 0 R] ->> -endobj - -3847 0 obj -<< - /Type /StructElem - /S /LI - /P 3846 0 R - /K [3852 0 R 3848 0 R] ->> -endobj - -3848 0 obj -<< - /Type /StructElem - /S /LBody - /P 3847 0 R - /K [3851 0 R 113 3850 0 R 118 3849 0 R 125 126 127] - /Pg 4803 0 R ->> -endobj - -3849 0 obj -<< - /Type /StructElem - /S /Formula - /P 3848 0 R - /K [119 120 121 122 123 124] - /Pg 4803 0 R ->> -endobj - -3850 0 obj -<< - /Type /StructElem - /S /Formula - /P 3848 0 R - /K [114 115 116 117] - /Pg 4803 0 R ->> -endobj - -3851 0 obj -<< - /Type /StructElem - /S /Em - /P 3848 0 R - /K [112] - /Pg 4803 0 R ->> -endobj - -3852 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3847 0 R - /K [111] - /Pg 4803 0 R ->> -endobj - -3853 0 obj -<< - /Type /StructElem - /S /LI - /P 3846 0 R - /K [3858 0 R 3854 0 R] ->> -endobj - -3854 0 obj -<< - /Type /StructElem - /S /LBody - /P 3853 0 R - /K [3857 0 R 105 3856 0 R 108 3855 0 R 110] - /Pg 4803 0 R ->> -endobj - -3855 0 obj -<< - /Type /StructElem - /S /Formula - /P 3854 0 R - /K [109] - /Pg 4803 0 R ->> -endobj - -3856 0 obj -<< - /Type /StructElem - /S /Formula - /P 3854 0 R - /K [106 107] - /Pg 4803 0 R ->> -endobj - -3857 0 obj -<< - /Type /StructElem - /S /Em - /P 3854 0 R - /K [104] - /Pg 4803 0 R ->> -endobj - -3858 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3853 0 R - /K [103] - /Pg 4803 0 R ->> -endobj - -3859 0 obj -<< - /Type /StructElem - /S /LI - /P 3846 0 R - /K [3862 0 R 3860 0 R] ->> -endobj - -3860 0 obj -<< - /Type /StructElem - /S /LBody - /P 3859 0 R - /K [3861 0 R 102] - /Pg 4803 0 R ->> -endobj - -3861 0 obj -<< - /Type /StructElem - /S /Em - /P 3860 0 R - /K [101] - /Pg 4803 0 R ->> -endobj - -3862 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3859 0 R - /K [100] - /Pg 4803 0 R ->> -endobj - -3863 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [44 3873 0 R 51 3872 0 R 61 3871 0 R 63 64 3870 0 R 66 3869 0 R 70 3868 0 R 83 3867 0 R 85 86 3866 0 R 88 3865 0 R 96 97 3864 0 R 99] - /Pg 4803 0 R ->> -endobj - -3864 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [98] - /Pg 4803 0 R ->> -endobj - -3865 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [89 90 91 92 93 94 95] - /Pg 4803 0 R ->> -endobj - -3866 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [87] - /Pg 4803 0 R ->> -endobj - -3867 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [84] - /Pg 4803 0 R ->> -endobj - -3868 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [71 72 73 74 75 76 77 78 79 80 81 82] - /Pg 4803 0 R ->> -endobj - -3869 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [67 68 69] - /Pg 4803 0 R ->> -endobj - -3870 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [65] - /Pg 4803 0 R ->> -endobj - -3871 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [62] - /Pg 4803 0 R ->> -endobj - -3872 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [52 53 54 55 56 57 58 59 60] - /Pg 4803 0 R ->> -endobj - -3873 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [45 46 47 48 49 50] - /Pg 4803 0 R ->> -endobj - -3874 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Effect Context) - /K [42 43] - /Pg 4803 0 R ->> -endobj - -3875 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3878 0 R 22 23 24 25 3877 0 R 35 36 37 38 3876 0 R 40 41] - /Pg 4803 0 R ->> -endobj - -3876 0 obj -<< - /Type /StructElem - /S /Em - /P 3875 0 R - /K [39] - /Pg 4803 0 R ->> -endobj - -3877 0 obj -<< - /Type /StructElem - /S /Formula - /P 3875 0 R - /K [26 27 28 29 30 31 32 33 34] - /Pg 4803 0 R ->> -endobj - -3878 0 obj -<< - /Type /StructElem - /S /Em - /P 3875 0 R - /K [21] - /Pg 4803 0 R ->> -endobj - -3879 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Revertible Effects) - /K [19 20] - /Pg 4803 0 R ->> -endobj - -3880 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3883 0 R 4 5 6 3882 0 R 8 9 3881 0 R 11 12 13 14 15 16 17 18] - /Pg 4803 0 R ->> -endobj - -3881 0 obj -<< - /Type /StructElem - /S /Em - /P 3880 0 R - /K [10] - /Pg 4803 0 R ->> -endobj - -3882 0 obj -<< - /Type /StructElem - /S /Em - /P 3880 0 R - /K [7] - /Pg 4803 0 R ->> -endobj - -3883 0 obj -<< - /Type /StructElem - /S /Link - /P 3880 0 R - /K [3 << - /Type /OBJR - /Pg 4803 0 R - /Obj 4801 0 R - >>] - /Pg 4803 0 R ->> -endobj - -3884 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Revertible Effects and Reactive Coeffects) - /K [0 1] - /Pg 4803 0 R ->> -endobj - -3885 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [167 168 169 170 171 3886 0 R 173] - /Pg 4799 0 R ->> -endobj - -3886 0 obj -<< - /Type /StructElem - /S /Link - /P 3885 0 R - /K [172 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4798 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3887 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [160 161 162 163 164 165 166] - /Pg 4799 0 R ->> -endobj - -3888 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3893 0 R 3889 0 R] ->> -endobj - -3889 0 obj -<< - /Type /StructElem - /S /LI - /P 3888 0 R - /K [3892 0 R 3890 0 R] ->> -endobj - -3890 0 obj -<< - /Type /StructElem - /S /LBody - /P 3889 0 R - /K [3891 0 R 156 157 158 159] - /Pg 4799 0 R ->> -endobj - -3891 0 obj -<< - /Type /StructElem - /S /Strong - /P 3890 0 R - /K [155] - /Pg 4799 0 R ->> -endobj - -3892 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3889 0 R - /K [154] - /Pg 4799 0 R ->> -endobj - -3893 0 obj -<< - /Type /StructElem - /S /LI - /P 3888 0 R - /K [3896 0 R 3894 0 R] ->> -endobj - -3894 0 obj -<< - /Type /StructElem - /S /LBody - /P 3893 0 R - /K [3895 0 R 149 150 151 152 153] - /Pg 4799 0 R ->> -endobj - -3895 0 obj -<< - /Type /StructElem - /S /Strong - /P 3894 0 R - /K [148] - /Pg 4799 0 R ->> -endobj - -3896 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3893 0 R - /K [147] - /Pg 4799 0 R ->> -endobj - -3897 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [136 137 3900 0 R 139 140 3899 0 R 142 143 144 3898 0 R 146] - /Pg 4799 0 R ->> -endobj - -3898 0 obj -<< - /Type /StructElem - /S /Link - /P 3897 0 R - /K [145 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4797 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3899 0 obj -<< - /Type /StructElem - /S /Em - /P 3897 0 R - /K [141] - /Pg 4799 0 R ->> -endobj - -3900 0 obj -<< - /Type /StructElem - /S /Em - /P 3897 0 R - /K [138] - /Pg 4799 0 R ->> -endobj - -3901 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Relationship to Dynamic Composability) - /K [134 135] - /Pg 4799 0 R ->> -endobj - -3902 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3918 0 R 72 3917 0 R 74 75 3916 0 R 91 92 3915 0 R 94 95 96 97 3914 0 R 99 100 3913 0 R 102 103 3912 0 R 105 3911 0 R 107 3910 0 R 109 3909 0 R 111 112 3908 0 R 114 3907 0 R 116 117 118 3906 0 R 120 121 122 3905 0 R 124 3904 0 R 126 127 128 129 130 3903 0 R 132 133] - /Pg 4799 0 R ->> -endobj - -3903 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [131 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4796 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3904 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [125 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4795 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3905 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [123 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4794 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3906 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [119 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4793 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3907 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [115] - /Pg 4799 0 R ->> -endobj - -3908 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [113] - /Pg 4799 0 R ->> -endobj - -3909 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [110] - /Pg 4799 0 R ->> -endobj - -3910 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [108] - /Pg 4799 0 R ->> -endobj - -3911 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [106] - /Pg 4799 0 R ->> -endobj - -3912 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [104] - /Pg 4799 0 R ->> -endobj - -3913 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [101] - /Pg 4799 0 R ->> -endobj - -3914 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [98 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4792 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3915 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [93 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4791 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3916 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [76 77 78 79 80 81 82 83 84 85 86 87 88 89 90] - /Pg 4799 0 R ->> -endobj - -3917 0 obj -<< - /Type /StructElem - /S /Em - /P 3902 0 R - /K [73] - /Pg 4799 0 R ->> -endobj - -3918 0 obj -<< - /Type /StructElem - /S /Strong - /P 3902 0 R - /K [71] - /Pg 4799 0 R ->> -endobj - -3919 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3928 0 R 3 4 5 3927 0 R 7 8 9 10 11 3926 0 R 13 14 15 3925 0 R 23 24 3924 0 R 33 34 35 3923 0 R 50 3922 0 R 59 3921 0 R 61 3920 0 R 70] - /Pg 4799 0 R ->> -endobj - -3920 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [62 63 64 65 66 67 68 69] - /Pg 4799 0 R ->> -endobj - -3921 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [60] - /Pg 4799 0 R ->> -endobj - -3922 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [51 52 53 54 55 56 57 58] - /Pg 4799 0 R ->> -endobj - -3923 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [36 37 38 39 40 41 42 43 44 45 46 47 48 49] - /Pg 4799 0 R ->> -endobj - -3924 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [25 26 27 28 29 30 31 32] - /Pg 4799 0 R ->> -endobj - -3925 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [16 17 18 19 20 21 22] - /Pg 4799 0 R ->> -endobj - -3926 0 obj -<< - /Type /StructElem - /S /Link - /P 3919 0 R - /K [12 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4790 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3927 0 obj -<< - /Type /StructElem - /S /Link - /P 3919 0 R - /K [6 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4789 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3928 0 obj -<< - /Type /StructElem - /S /Strong - /P 3919 0 R - /K [2] - /Pg 4799 0 R ->> -endobj - -3929 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [198 199 << - /Type /MCR - /MCID 0 - /Pg 4799 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4799 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3930 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191 192 193 194 195 196 197] - /Pg 4787 0 R ->> -endobj - -3931 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [181 3934 0 R 183 184 3933 0 R 186 3932 0 R 188 189 190] - /Pg 4787 0 R ->> -endobj - -3932 0 obj -<< - /Type /StructElem - /S /Link - /P 3931 0 R - /K [187 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4786 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3933 0 obj -<< - /Type /StructElem - /S /Link - /P 3931 0 R - /K [185 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4785 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3934 0 obj -<< - /Type /StructElem - /S /Em - /P 3931 0 R - /K [182] - /Pg 4787 0 R ->> -endobj - -3935 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Coeffects) - /K [179 180] - /Pg 4787 0 R ->> -endobj - -3936 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [153 3943 0 R 155 3942 0 R 157 158 159 160 3941 0 R 162 163 164 3940 0 R 166 3939 0 R 168 169 170 3938 0 R 172 173 174 3937 0 R 176 177 178] - /Pg 4787 0 R ->> -endobj - -3937 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [175 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4784 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3938 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [171 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4783 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3939 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [167 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4782 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3940 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [165 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4781 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3941 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [161 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4780 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3942 0 obj -<< - /Type /StructElem - /S /Formula - /P 3936 0 R - /K [156] - /Pg 4787 0 R ->> -endobj - -3943 0 obj -<< - /Type /StructElem - /S /Formula - /P 3936 0 R - /K [154] - /Pg 4787 0 R ->> -endobj - -3944 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139 140 141 142 143 144 145 146 147 148 149 150 151 152] - /Pg 4787 0 R ->> -endobj - -3945 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3953 0 R 104 105 3952 0 R 107 3951 0 R 109 110 111 112 113 3950 0 R 115 3949 0 R 122 3948 0 R 129 130 131 132 3947 0 R 134 135 3946 0 R 137 138] - /Pg 4787 0 R ->> -endobj - -3946 0 obj -<< - /Type /StructElem - /S /Em - /P 3945 0 R - /K [136] - /Pg 4787 0 R ->> -endobj - -3947 0 obj -<< - /Type /StructElem - /S /Link - /P 3945 0 R - /K [133 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4779 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3948 0 obj -<< - /Type /StructElem - /S /Formula - /P 3945 0 R - /K [123 124 125 126 127 128] - /Pg 4787 0 R ->> -endobj - -3949 0 obj -<< - /Type /StructElem - /S /Formula - /P 3945 0 R - /K [116 117 118 119 120 121] - /Pg 4787 0 R ->> -endobj - -3950 0 obj -<< - /Type /StructElem - /S /Formula - /P 3945 0 R - /K [114] - /Pg 4787 0 R ->> -endobj - -3951 0 obj -<< - /Type /StructElem - /S /Link - /P 3945 0 R - /K [108 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4778 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3952 0 obj -<< - /Type /StructElem - /S /Link - /P 3945 0 R - /K [106 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4777 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3953 0 obj -<< - /Type /StructElem - /S /Strong - /P 3945 0 R - /K [103] - /Pg 4787 0 R ->> -endobj - -3954 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3962 0 R 50 51 3961 0 R 53 54 55 56 3960 0 R 58 59 3959 0 R 67 3958 0 R 69 70 71 3957 0 R 76 3956 0 R 85 86 3955 0 R 101 102] - /Pg 4787 0 R ->> -endobj - -3955 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [87 88 89 90 91 92 93 94 95 96 97 98 99 100] - /Pg 4787 0 R ->> -endobj - -3956 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [77 78 79 80 81 82 83 84] - /Pg 4787 0 R ->> -endobj - -3957 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [72 73 74 75] - /Pg 4787 0 R ->> -endobj - -3958 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [68] - /Pg 4787 0 R ->> -endobj - -3959 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [60 61 62 63 64 65 66] - /Pg 4787 0 R ->> -endobj - -3960 0 obj -<< - /Type /StructElem - /S /Link - /P 3954 0 R - /K [57 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4776 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3961 0 obj -<< - /Type /StructElem - /S /Link - /P 3954 0 R - /K [52 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4775 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3962 0 obj -<< - /Type /StructElem - /S /Strong - /P 3954 0 R - /K [49] - /Pg 4787 0 R ->> -endobj - -3963 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [40 41 42 43 3964 0 R 45 46 47 48] - /Pg 4787 0 R ->> -endobj - -3964 0 obj -<< - /Type /StructElem - /S /Link - /P 3963 0 R - /K [44 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4774 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3965 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33 34 35 36 37 38 39] - /Pg 4787 0 R ->> -endobj - -3966 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [10 11 3973 0 R 13 3972 0 R 15 16 3971 0 R 22 23 3970 0 R 25 3969 0 R 27 3968 0 R 29 3967 0 R 31 32] - /Pg 4787 0 R ->> -endobj - -3967 0 obj -<< - /Type /StructElem - /S /Em - /P 3966 0 R - /K [30] - /Pg 4787 0 R ->> -endobj - -3968 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [28] - /Pg 4787 0 R ->> -endobj - -3969 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [26] - /Pg 4787 0 R ->> -endobj - -3970 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [24] - /Pg 4787 0 R ->> -endobj - -3971 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [17 18 19 20 21] - /Pg 4787 0 R ->> -endobj - -3972 0 obj -<< - /Type /StructElem - /S /Link - /P 3966 0 R - /K [14 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4773 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3973 0 obj -<< - /Type /StructElem - /S /Link - /P 3966 0 R - /K [12 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4772 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3974 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Effects) - /K [8 9] - /Pg 4787 0 R ->> -endobj - -3975 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3 4 3976 0 R 6 7] - /Pg 4787 0 R ->> -endobj - -3976 0 obj -<< - /Type /StructElem - /S /Link - /P 3975 0 R - /K [5 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4771 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3977 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Preliminaries) - /K [0 1] - /Pg 4787 0 R ->> -endobj - -3978 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [3996 0 R 3991 0 R 3984 0 R 3979 0 R] ->> -endobj - -3979 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [3983 0 R 3980 0 R] ->> -endobj - -3980 0 obj -<< - /Type /StructElem - /S /LBody - /P 3979 0 R - /K [95 3982 0 R 97 3981 0 R 99 100 101 102 103 104] - /Pg 4769 0 R ->> -endobj - -3981 0 obj -<< - /Type /StructElem - /S /Link - /P 3980 0 R - /K [98 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4768 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3982 0 obj -<< - /Type /StructElem - /S /Strong - /P 3980 0 R - /K [96] - /Pg 4769 0 R ->> -endobj - -3983 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3979 0 R - /K [94] - /Pg 4769 0 R ->> -endobj - -3984 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [3990 0 R 3985 0 R] ->> -endobj - -3985 0 obj -<< - /Type /StructElem - /S /LBody - /P 3984 0 R - /K [81 3989 0 R 83 3988 0 R 85 86 87 88 3987 0 R 90 3986 0 R 92 93] - /Pg 4769 0 R ->> -endobj - -3986 0 obj -<< - /Type /StructElem - /S /Link - /P 3985 0 R - /K [91 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4767 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3987 0 obj -<< - /Type /StructElem - /S /Strong - /P 3985 0 R - /K [89] - /Pg 4769 0 R ->> -endobj - -3988 0 obj -<< - /Type /StructElem - /S /Link - /P 3985 0 R - /K [84 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4766 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3989 0 obj -<< - /Type /StructElem - /S /Strong - /P 3985 0 R - /K [82] - /Pg 4769 0 R ->> -endobj - -3990 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3984 0 R - /K [80] - /Pg 4769 0 R ->> -endobj - -3991 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [3995 0 R 3992 0 R] ->> -endobj - -3992 0 obj -<< - /Type /StructElem - /S /LBody - /P 3991 0 R - /K [71 3994 0 R 73 3993 0 R 75 76 77 78 79] - /Pg 4769 0 R ->> -endobj - -3993 0 obj -<< - /Type /StructElem - /S /Link - /P 3992 0 R - /K [74 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4765 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3994 0 obj -<< - /Type /StructElem - /S /Strong - /P 3992 0 R - /K [72] - /Pg 4769 0 R ->> -endobj - -3995 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3991 0 R - /K [70] - /Pg 4769 0 R ->> -endobj - -3996 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [4001 0 R 3997 0 R] ->> -endobj - -3997 0 obj -<< - /Type /StructElem - /S /LBody - /P 3996 0 R - /K [58 4000 0 R 60 3999 0 R 62 63 64 3998 0 R 66 67 68 69] - /Pg 4769 0 R ->> -endobj - -3998 0 obj -<< - /Type /StructElem - /S /Em - /P 3997 0 R - /K [65] - /Pg 4769 0 R ->> -endobj - -3999 0 obj -<< - /Type /StructElem - /S /Link - /P 3997 0 R - /K [61 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4764 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4000 0 obj -<< - /Type /StructElem - /S /Strong - /P 3997 0 R - /K [59] - /Pg 4769 0 R ->> -endobj - -4001 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3996 0 R - /K [57] - /Pg 4769 0 R ->> -endobj - -4002 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [26 4010 0 R 28 29 4009 0 R 31 4008 0 R 34 35 4007 0 R 37 4006 0 R 39 40 4005 0 R 42 43 4004 0 R 45 4003 0 R 47 48 49 50 51 52 53 54 55 56] - /Pg 4769 0 R ->> -endobj - -4003 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [46 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4763 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4004 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [44 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4762 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4005 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [41] - /Pg 4769 0 R ->> -endobj - -4006 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [38 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4761 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4007 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [36 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4760 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4008 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [32 33] - /Pg 4769 0 R ->> -endobj - -4009 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [30] - /Pg 4769 0 R ->> -endobj - -4010 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [27] - /Pg 4769 0 R ->> -endobj - -4011 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Contributions) - /K [24 25] - /Pg 4769 0 R ->> -endobj - -4012 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [8 9 10 11 12 4013 0 R 14 15 16 17 18 19 20 21 22 23] - /Pg 4769 0 R ->> -endobj - -4013 0 obj -<< - /Type /StructElem - /S /Link - /P 4012 0 R - /K [13 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4759 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4014 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [88 89 90 91 << - /Type /MCR - /MCID 0 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4769 0 R - >> 4015 0 R << - /Type /MCR - /MCID 3 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4769 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4015 0 obj -<< - /Type /StructElem - /S /Link - /P 4014 0 R - /K [2 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4758 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4016 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (The Coarse-Grained Workaround) - /K [86 87] - /Pg 4756 0 R ->> -endobj - -4017 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [77 78 79 80 81 82 83 84 85] - /Pg 4756 0 R ->> -endobj - -4018 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [45 46 4024 0 R 48 4023 0 R 50 51 52 53 4022 0 R 55 56 57 58 4021 0 R 60 61 62 63 64 4020 0 R 66 67 68 69 70 71 72 4019 0 R 74 75 76] - /Pg 4756 0 R ->> -endobj - -4019 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [73 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4754 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4020 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [65 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4753 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4021 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [59 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4752 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4022 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [54 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4751 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4023 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [49 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4750 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4024 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [47 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4749 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4025 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Self-Evolving Agent Harnesses) - /K [43 44] - /Pg 4756 0 R ->> -endobj - -4026 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [36 37 4028 0 R 39 4027 0 R 41 42] - /Pg 4756 0 R ->> -endobj - -4027 0 obj -<< - /Type /StructElem - /S /Link - /P 4026 0 R - /K [40 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4748 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4028 0 obj -<< - /Type /StructElem - /S /Link - /P 4026 0 R - /K [38 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4747 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4029 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [4037 0 R 13 4036 0 R 15 16 17 18 4035 0 R 20 4032 0 R 22 23 24 25 26 27 28 4031 0 R 30 31 4030 0 R 33 34 35] - /Pg 4756 0 R ->> -endobj - -4030 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [32] - /Pg 4756 0 R ->> -endobj - -4031 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [29] - /Pg 4756 0 R ->> -endobj - -4032 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4029 0 R - /K [4033 0 R] ->> -endobj - -4033 0 obj -<< - /Type /StructElem - /S /Link - /P 4032 0 R - /K [<< - /Type /OBJR - /Pg 4756 0 R - /Obj 4746 0 R - >> 4034 0 R] ->> -endobj - -4034 0 obj -<< - /Type /StructElem - /S /Span - /P 4033 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [21] - /Pg 4756 0 R ->> -endobj - -4035 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [19] - /Pg 4756 0 R ->> -endobj - -4036 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [14] - /Pg 4756 0 R ->> -endobj - -4037 0 obj -<< - /Type /StructElem - /S /Strong - /P 4029 0 R - /K [12] - /Pg 4756 0 R ->> -endobj - -4038 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [4049 0 R 72 73 74 4048 0 R 76 77 78 << - /Type /MCR - /MCID 0 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4756 0 R - >> 4045 0 R 4041 0 R << - /Type /MCR - /MCID 3 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4756 0 R - >> 4040 0 R << - /Type /MCR - /MCID 6 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 8 - /Pg 4756 0 R - >> 4039 0 R << - /Type /MCR - /MCID 10 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 11 - /Pg 4756 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4039 0 obj -<< - /Type /StructElem - /S /Code - /P 4038 0 R - /K [9] - /Pg 4756 0 R ->> -endobj - -4040 0 obj -<< - /Type /StructElem - /S /Code - /P 4038 0 R - /K [5] - /Pg 4756 0 R ->> -endobj - -4041 0 obj -<< - /Type /StructElem - /S /Note - /P 4038 0 R - /ID (Note 1) - /K [4042 0 R 93] - /Pg 4756 0 R ->> -endobj - -4042 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4041 0 R - /K [4043 0 R] ->> -endobj - -4043 0 obj -<< - /Type /StructElem - /S /Link - /P 4042 0 R - /K [<< - /Type /OBJR - /Pg 4756 0 R - /Obj 4755 0 R - >> 4044 0 R] ->> -endobj - -4044 0 obj -<< - /Type /StructElem - /S /Span - /P 4043 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [92] - /Pg 4756 0 R ->> -endobj - -4045 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4038 0 R - /K [4046 0 R] ->> -endobj - -4046 0 obj -<< - /Type /StructElem - /S /Link - /P 4045 0 R - /K [<< - /Type /OBJR - /Pg 4756 0 R - /Obj 4745 0 R - >> 4047 0 R] ->> -endobj - -4047 0 obj -<< - /Type /StructElem - /S /Span - /P 4046 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [2] - /Pg 4756 0 R ->> -endobj - -4048 0 obj -<< - /Type /StructElem - /S /Code - /P 4038 0 R - /K [75] - /Pg 4743 0 R ->> -endobj - -4049 0 obj -<< - /Type /StructElem - /S /Strong - /P 4038 0 R - /K [71] - /Pg 4743 0 R ->> -endobj - -4050 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [69 70] - /Pg 4743 0 R ->> -endobj - -4051 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Plugin Systems) - /K [67 68] - /Pg 4743 0 R ->> -endobj - -4052 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Motivating Examples) - /K [65 66] - /Pg 4743 0 R ->> -endobj - -4053 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [51 52 4055 0 R 54 55 56 57 4054 0 R 59 60 61 62 63 64] - /Pg 4743 0 R ->> -endobj - -4054 0 obj -<< - /Type /StructElem - /S /Link - /P 4053 0 R - /K [58 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4742 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4055 0 obj -<< - /Type /StructElem - /S /Link - /P 4053 0 R - /K [53 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4741 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4056 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [4062 0 R 4057 0 R] ->> -endobj - -4057 0 obj -<< - /Type /StructElem - /S /LI - /P 4056 0 R - /K [4061 0 R 4058 0 R] ->> -endobj - -4058 0 obj -<< - /Type /StructElem - /S /LBody - /P 4057 0 R - /K [4060 0 R 44 4059 0 R 46 47 48 49 50] - /Pg 4743 0 R ->> -endobj - -4059 0 obj -<< - /Type /StructElem - /S /Em - /P 4058 0 R - /K [45] - /Pg 4743 0 R ->> -endobj - -4060 0 obj -<< - /Type /StructElem - /S /Strong - /P 4058 0 R - /K [43] - /Pg 4743 0 R ->> -endobj - -4061 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4057 0 R - /K [42] - /Pg 4743 0 R ->> -endobj - -4062 0 obj -<< - /Type /StructElem - /S /LI - /P 4056 0 R - /K [4066 0 R 4063 0 R] ->> -endobj - -4063 0 obj -<< - /Type /StructElem - /S /LBody - /P 4062 0 R - /K [4065 0 R 35 4064 0 R 37 38 39 40 41] - /Pg 4743 0 R ->> -endobj - -4064 0 obj -<< - /Type /StructElem - /S /Em - /P 4063 0 R - /K [36] - /Pg 4743 0 R ->> -endobj - -4065 0 obj -<< - /Type /StructElem - /S /Strong - /P 4063 0 R - /K [34] - /Pg 4743 0 R ->> -endobj - -4066 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4062 0 R - /K [33] - /Pg 4743 0 R ->> -endobj - -4067 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [30 31 32] - /Pg 4743 0 R ->> -endobj - -4068 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Dimensions of Composability) - /K [28 29] - /Pg 4743 0 R ->> -endobj - -4069 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3 4 4074 0 R 6 7 4073 0 R 9 10 11 4072 0 R 13 14 15 4071 0 R 17 18 19 20 21 4070 0 R 23 24 25 26 27] - /Pg 4743 0 R ->> -endobj - -4070 0 obj -<< - /Type /StructElem - /S /Link - /P 4069 0 R - /K [22 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4740 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4071 0 obj -<< - /Type /StructElem - /S /Link - /P 4069 0 R - /K [16 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4739 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4072 0 obj -<< - /Type /StructElem - /S /Em - /P 4069 0 R - /K [12] - /Pg 4743 0 R ->> -endobj - -4073 0 obj -<< - /Type /StructElem - /S /Em - /P 4069 0 R - /K [8] - /Pg 4743 0 R ->> -endobj - -4074 0 obj -<< - /Type /StructElem - /S /Link - /P 4069 0 R - /K [5 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4738 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4075 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Introduction) - /K [0 1] - /Pg 4743 0 R ->> -endobj - -4076 0 obj -<< - /Type /StructElem - /S /TOC - /P 103 0 R - /K [4285 0 R 4259 0 R 4255 0 R 4242 0 R 4238 0 R 4173 0 R 4169 0 R 4130 0 R 4126 0 R 4105 0 R 4101 0 R 4084 0 R 4080 0 R 4077 0 R] ->> -endobj - -4077 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4078 0 R] ->> -endobj - -4078 0 obj -<< - /Type /StructElem - /S /Reference - /P 4077 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4079 0 R] ->> -endobj - -4079 0 obj -<< - /Type /StructElem - /S /Link - /P 4078 0 R - /K [54 55 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4735 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4080 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4081 0 R] ->> -endobj - -4081 0 obj -<< - /Type /StructElem - /S /Reference - /P 4080 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4082 0 R] ->> -endobj - -4082 0 obj -<< - /Type /StructElem - /S /Link - /P 4081 0 R - /K [4083 0 R 52 53 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4734 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4083 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4082 0 R - /K [51] - /Pg 4736 0 R ->> -endobj - -4084 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4097 0 R 4093 0 R 4089 0 R 4085 0 R] ->> -endobj - -4085 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4086 0 R] ->> -endobj - -4086 0 obj -<< - /Type /StructElem - /S /Reference - /P 4085 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4087 0 R] ->> -endobj - -4087 0 obj -<< - /Type /StructElem - /S /Link - /P 4086 0 R - /K [4088 0 R 49 50 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4733 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4088 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4087 0 R - /K [48] - /Pg 4736 0 R ->> -endobj - -4089 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4090 0 R] ->> -endobj - -4090 0 obj -<< - /Type /StructElem - /S /Reference - /P 4089 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4091 0 R] ->> -endobj - -4091 0 obj -<< - /Type /StructElem - /S /Link - /P 4090 0 R - /K [4092 0 R 46 47 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4732 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4092 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4091 0 R - /K [45] - /Pg 4736 0 R ->> -endobj - -4093 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4094 0 R] ->> -endobj - -4094 0 obj -<< - /Type /StructElem - /S /Reference - /P 4093 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4095 0 R] ->> -endobj - -4095 0 obj -<< - /Type /StructElem - /S /Link - /P 4094 0 R - /K [4096 0 R 43 44 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4731 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4096 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4095 0 R - /K [42] - /Pg 4736 0 R ->> -endobj - -4097 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4098 0 R] ->> -endobj - -4098 0 obj -<< - /Type /StructElem - /S /Reference - /P 4097 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4099 0 R] ->> -endobj - -4099 0 obj -<< - /Type /StructElem - /S /Link - /P 4098 0 R - /K [4100 0 R 40 41 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4730 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4100 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4099 0 R - /K [39] - /Pg 4736 0 R ->> -endobj - -4101 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4102 0 R] ->> -endobj - -4102 0 obj -<< - /Type /StructElem - /S /Reference - /P 4101 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4103 0 R] ->> -endobj - -4103 0 obj -<< - /Type /StructElem - /S /Link - /P 4102 0 R - /K [4104 0 R 37 38 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4729 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4104 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4103 0 R - /K [36] - /Pg 4736 0 R ->> -endobj - -4105 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4122 0 R 4118 0 R 4114 0 R 4110 0 R 4106 0 R] ->> -endobj - -4106 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4107 0 R] ->> -endobj - -4107 0 obj -<< - /Type /StructElem - /S /Reference - /P 4106 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4108 0 R] ->> -endobj - -4108 0 obj -<< - /Type /StructElem - /S /Link - /P 4107 0 R - /K [4109 0 R 34 35 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4728 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4109 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4108 0 R - /K [33] - /Pg 4736 0 R ->> -endobj - -4110 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4111 0 R] ->> -endobj - -4111 0 obj -<< - /Type /StructElem - /S /Reference - /P 4110 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4112 0 R] ->> -endobj - -4112 0 obj -<< - /Type /StructElem - /S /Link - /P 4111 0 R - /K [4113 0 R 31 32 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4727 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4113 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4112 0 R - /K [30] - /Pg 4736 0 R ->> -endobj - -4114 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4115 0 R] ->> -endobj - -4115 0 obj -<< - /Type /StructElem - /S /Reference - /P 4114 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4116 0 R] ->> -endobj - -4116 0 obj -<< - /Type /StructElem - /S /Link - /P 4115 0 R - /K [4117 0 R 28 29 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4726 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4117 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4116 0 R - /K [27] - /Pg 4736 0 R ->> -endobj - -4118 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4119 0 R] ->> -endobj - -4119 0 obj -<< - /Type /StructElem - /S /Reference - /P 4118 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4120 0 R] ->> -endobj - -4120 0 obj -<< - /Type /StructElem - /S /Link - /P 4119 0 R - /K [4121 0 R 25 26 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4725 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4121 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4120 0 R - /K [24] - /Pg 4736 0 R ->> -endobj - -4122 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4123 0 R] ->> -endobj - -4123 0 obj -<< - /Type /StructElem - /S /Reference - /P 4122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4124 0 R] ->> -endobj - -4124 0 obj -<< - /Type /StructElem - /S /Link - /P 4123 0 R - /K [4125 0 R 22 23 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4724 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4125 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4124 0 R - /K [21] - /Pg 4736 0 R ->> -endobj - -4126 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4127 0 R] ->> -endobj - -4127 0 obj -<< - /Type /StructElem - /S /Reference - /P 4126 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4128 0 R] ->> -endobj - -4128 0 obj -<< - /Type /StructElem - /S /Link - /P 4127 0 R - /K [4129 0 R 19 20 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4723 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4129 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4128 0 R - /K [18] - /Pg 4736 0 R ->> -endobj - -4130 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4165 0 R 4148 0 R 4144 0 R 4135 0 R 4131 0 R] ->> -endobj - -4131 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4130 0 R - /K [4132 0 R] ->> -endobj - -4132 0 obj -<< - /Type /StructElem - /S /Reference - /P 4131 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4133 0 R] ->> -endobj - -4133 0 obj -<< - /Type /StructElem - /S /Link - /P 4132 0 R - /K [4134 0 R 16 17 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4722 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4134 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4133 0 R - /K [15] - /Pg 4736 0 R ->> -endobj - -4135 0 obj -<< - /Type /StructElem - /S /TOC - /P 4130 0 R - /K [4140 0 R 4136 0 R] ->> -endobj - -4136 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4135 0 R - /K [4137 0 R] ->> -endobj - -4137 0 obj -<< - /Type /StructElem - /S /Reference - /P 4136 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4138 0 R] ->> -endobj - -4138 0 obj -<< - /Type /StructElem - /S /Link - /P 4137 0 R - /K [4139 0 R 13 14 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4721 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4139 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4138 0 R - /K [12] - /Pg 4736 0 R ->> -endobj - -4140 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4135 0 R - /K [4141 0 R] ->> -endobj - -4141 0 obj -<< - /Type /StructElem - /S /Reference - /P 4140 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4142 0 R] ->> -endobj - -4142 0 obj -<< - /Type /StructElem - /S /Link - /P 4141 0 R - /K [4143 0 R 10 11 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4720 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4143 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4142 0 R - /K [9] - /Pg 4736 0 R ->> -endobj - -4144 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4130 0 R - /K [4145 0 R] ->> -endobj - -4145 0 obj -<< - /Type /StructElem - /S /Reference - /P 4144 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4146 0 R] ->> -endobj - -4146 0 obj -<< - /Type /StructElem - /S /Link - /P 4145 0 R - /K [4147 0 R 7 8 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4719 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4147 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4146 0 R - /K [6] - /Pg 4736 0 R ->> -endobj - -4148 0 obj -<< - /Type /StructElem - /S /TOC - /P 4130 0 R - /K [4161 0 R 4157 0 R 4153 0 R 4149 0 R] ->> -endobj - -4149 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4150 0 R] ->> -endobj - -4150 0 obj -<< - /Type /StructElem - /S /Reference - /P 4149 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4151 0 R] ->> -endobj - -4151 0 obj -<< - /Type /StructElem - /S /Link - /P 4150 0 R - /K [4152 0 R 4 5 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4718 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4152 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4151 0 R - /K [3] - /Pg 4736 0 R ->> -endobj - -4153 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4154 0 R] ->> -endobj - -4154 0 obj -<< - /Type /StructElem - /S /Reference - /P 4153 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4155 0 R] ->> -endobj - -4155 0 obj -<< - /Type /StructElem - /S /Link - /P 4154 0 R - /K [<< - /Type /OBJR - /Pg 4715 0 R - /Obj 4714 0 R - >> 4156 0 R 1 2 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4717 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4156 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4155 0 R - /K [0] - /Pg 4736 0 R ->> -endobj - -4157 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4158 0 R] ->> -endobj - -4158 0 obj -<< - /Type /StructElem - /S /Reference - /P 4157 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4159 0 R] ->> -endobj - -4159 0 obj -<< - /Type /StructElem - /S /Link - /P 4158 0 R - /K [4160 0 R 92 93 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4713 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4160 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4159 0 R - /K [91] - /Pg 4715 0 R ->> -endobj - -4161 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4162 0 R] ->> -endobj - -4162 0 obj -<< - /Type /StructElem - /S /Reference - /P 4161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4163 0 R] ->> -endobj - -4163 0 obj -<< - /Type /StructElem - /S /Link - /P 4162 0 R - /K [4164 0 R 89 90 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4712 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4164 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4163 0 R - /K [88] - /Pg 4715 0 R ->> -endobj - -4165 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4130 0 R - /K [4166 0 R] ->> -endobj - -4166 0 obj -<< - /Type /StructElem - /S /Reference - /P 4165 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4167 0 R] ->> -endobj - -4167 0 obj -<< - /Type /StructElem - /S /Link - /P 4166 0 R - /K [4168 0 R 86 87 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4711 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4168 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4167 0 R - /K [85] - /Pg 4715 0 R ->> -endobj - -4169 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4170 0 R] ->> -endobj - -4170 0 obj -<< - /Type /StructElem - /S /Reference - /P 4169 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4171 0 R] ->> -endobj - -4171 0 obj -<< - /Type /StructElem - /S /Link - /P 4170 0 R - /K [4172 0 R 83 84 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4710 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4172 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4171 0 R - /K [82] - /Pg 4715 0 R ->> -endobj - -4173 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4234 0 R 4225 0 R 4221 0 R 4208 0 R 4204 0 R 4187 0 R 4183 0 R 4174 0 R] ->> -endobj - -4174 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4179 0 R 4175 0 R] ->> -endobj - -4175 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4174 0 R - /K [4176 0 R] ->> -endobj - -4176 0 obj -<< - /Type /StructElem - /S /Reference - /P 4175 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4177 0 R] ->> -endobj - -4177 0 obj -<< - /Type /StructElem - /S /Link - /P 4176 0 R - /K [4178 0 R 80 81 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4709 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4178 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4177 0 R - /K [79] - /Pg 4715 0 R ->> -endobj - -4179 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4174 0 R - /K [4180 0 R] ->> -endobj - -4180 0 obj -<< - /Type /StructElem - /S /Reference - /P 4179 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4181 0 R] ->> -endobj - -4181 0 obj -<< - /Type /StructElem - /S /Link - /P 4180 0 R - /K [4182 0 R 77 78 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4708 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4182 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4181 0 R - /K [76] - /Pg 4715 0 R ->> -endobj - -4183 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4184 0 R] ->> -endobj - -4184 0 obj -<< - /Type /StructElem - /S /Reference - /P 4183 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4185 0 R] ->> -endobj - -4185 0 obj -<< - /Type /StructElem - /S /Link - /P 4184 0 R - /K [4186 0 R 74 75 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4707 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4186 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4185 0 R - /K [73] - /Pg 4715 0 R ->> -endobj - -4187 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4200 0 R 4196 0 R 4192 0 R 4188 0 R] ->> -endobj - -4188 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4189 0 R] ->> -endobj - -4189 0 obj -<< - /Type /StructElem - /S /Reference - /P 4188 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4190 0 R] ->> -endobj - -4190 0 obj -<< - /Type /StructElem - /S /Link - /P 4189 0 R - /K [4191 0 R 71 72 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4706 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4191 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4190 0 R - /K [70] - /Pg 4715 0 R ->> -endobj - -4192 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4193 0 R] ->> -endobj - -4193 0 obj -<< - /Type /StructElem - /S /Reference - /P 4192 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4194 0 R] ->> -endobj - -4194 0 obj -<< - /Type /StructElem - /S /Link - /P 4193 0 R - /K [4195 0 R 68 69 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4705 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4195 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4194 0 R - /K [67] - /Pg 4715 0 R ->> -endobj - -4196 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4197 0 R] ->> -endobj - -4197 0 obj -<< - /Type /StructElem - /S /Reference - /P 4196 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4198 0 R] ->> -endobj - -4198 0 obj -<< - /Type /StructElem - /S /Link - /P 4197 0 R - /K [4199 0 R 65 66 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4704 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4199 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4198 0 R - /K [64] - /Pg 4715 0 R ->> -endobj - -4200 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4201 0 R] ->> -endobj - -4201 0 obj -<< - /Type /StructElem - /S /Reference - /P 4200 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4202 0 R] ->> -endobj - -4202 0 obj -<< - /Type /StructElem - /S /Link - /P 4201 0 R - /K [4203 0 R 62 63 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4703 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4203 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4202 0 R - /K [61] - /Pg 4715 0 R ->> -endobj - -4204 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4205 0 R] ->> -endobj - -4205 0 obj -<< - /Type /StructElem - /S /Reference - /P 4204 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4206 0 R] ->> -endobj - -4206 0 obj -<< - /Type /StructElem - /S /Link - /P 4205 0 R - /K [4207 0 R 59 60 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4702 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4207 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4206 0 R - /K [58] - /Pg 4715 0 R ->> -endobj - -4208 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4217 0 R 4213 0 R 4209 0 R] ->> -endobj - -4209 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4208 0 R - /K [4210 0 R] ->> -endobj - -4210 0 obj -<< - /Type /StructElem - /S /Reference - /P 4209 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4211 0 R] ->> -endobj - -4211 0 obj -<< - /Type /StructElem - /S /Link - /P 4210 0 R - /K [4212 0 R 56 57 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4701 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4212 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4211 0 R - /K [55] - /Pg 4715 0 R ->> -endobj - -4213 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4208 0 R - /K [4214 0 R] ->> -endobj - -4214 0 obj -<< - /Type /StructElem - /S /Reference - /P 4213 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4215 0 R] ->> -endobj - -4215 0 obj -<< - /Type /StructElem - /S /Link - /P 4214 0 R - /K [4216 0 R 53 54 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4700 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4216 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4215 0 R - /K [52] - /Pg 4715 0 R ->> -endobj - -4217 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4208 0 R - /K [4218 0 R] ->> -endobj - -4218 0 obj -<< - /Type /StructElem - /S /Reference - /P 4217 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4219 0 R] ->> -endobj - -4219 0 obj -<< - /Type /StructElem - /S /Link - /P 4218 0 R - /K [4220 0 R 50 51 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4699 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4220 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4219 0 R - /K [49] - /Pg 4715 0 R ->> -endobj - -4221 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4222 0 R] ->> -endobj - -4222 0 obj -<< - /Type /StructElem - /S /Reference - /P 4221 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4223 0 R] ->> -endobj - -4223 0 obj -<< - /Type /StructElem - /S /Link - /P 4222 0 R - /K [4224 0 R 47 48 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4698 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4224 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4223 0 R - /K [46] - /Pg 4715 0 R ->> -endobj - -4225 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4230 0 R 4226 0 R] ->> -endobj - -4226 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4225 0 R - /K [4227 0 R] ->> -endobj - -4227 0 obj -<< - /Type /StructElem - /S /Reference - /P 4226 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4228 0 R] ->> -endobj - -4228 0 obj -<< - /Type /StructElem - /S /Link - /P 4227 0 R - /K [4229 0 R 44 45 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4697 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4229 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4228 0 R - /K [43] - /Pg 4715 0 R ->> -endobj - -4230 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4225 0 R - /K [4231 0 R] ->> -endobj - -4231 0 obj -<< - /Type /StructElem - /S /Reference - /P 4230 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4232 0 R] ->> -endobj - -4232 0 obj -<< - /Type /StructElem - /S /Link - /P 4231 0 R - /K [4233 0 R 41 42 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4696 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4233 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4232 0 R - /K [40] - /Pg 4715 0 R ->> -endobj - -4234 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4235 0 R] ->> -endobj - -4235 0 obj -<< - /Type /StructElem - /S /Reference - /P 4234 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4236 0 R] ->> -endobj - -4236 0 obj -<< - /Type /StructElem - /S /Link - /P 4235 0 R - /K [4237 0 R 38 39 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4695 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4237 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4236 0 R - /K [37] - /Pg 4715 0 R ->> -endobj - -4238 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4239 0 R] ->> -endobj - -4239 0 obj -<< - /Type /StructElem - /S /Reference - /P 4238 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4240 0 R] ->> -endobj - -4240 0 obj -<< - /Type /StructElem - /S /Link - /P 4239 0 R - /K [4241 0 R 35 36 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4694 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4241 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4240 0 R - /K [34] - /Pg 4715 0 R ->> -endobj - -4242 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4251 0 R 4247 0 R 4243 0 R] ->> -endobj - -4243 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4242 0 R - /K [4244 0 R] ->> -endobj - -4244 0 obj -<< - /Type /StructElem - /S /Reference - /P 4243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4245 0 R] ->> -endobj - -4245 0 obj -<< - /Type /StructElem - /S /Link - /P 4244 0 R - /K [4246 0 R 32 33 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4693 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4246 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4245 0 R - /K [31] - /Pg 4715 0 R ->> -endobj - -4247 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4242 0 R - /K [4248 0 R] ->> -endobj - -4248 0 obj -<< - /Type /StructElem - /S /Reference - /P 4247 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4249 0 R] ->> -endobj - -4249 0 obj -<< - /Type /StructElem - /S /Link - /P 4248 0 R - /K [4250 0 R 29 30 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4692 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4250 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4249 0 R - /K [28] - /Pg 4715 0 R ->> -endobj - -4251 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4242 0 R - /K [4252 0 R] ->> -endobj - -4252 0 obj -<< - /Type /StructElem - /S /Reference - /P 4251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4253 0 R] ->> -endobj - -4253 0 obj -<< - /Type /StructElem - /S /Link - /P 4252 0 R - /K [4254 0 R 26 27 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4691 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4254 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4253 0 R - /K [25] - /Pg 4715 0 R ->> -endobj - -4255 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4256 0 R] ->> -endobj - -4256 0 obj -<< - /Type /StructElem - /S /Reference - /P 4255 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4257 0 R] ->> -endobj - -4257 0 obj -<< - /Type /StructElem - /S /Link - /P 4256 0 R - /K [4258 0 R 23 24 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4690 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4258 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4257 0 R - /K [22] - /Pg 4715 0 R ->> -endobj - -4259 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4281 0 R 4277 0 R 4264 0 R 4260 0 R] ->> -endobj - -4260 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4259 0 R - /K [4261 0 R] ->> -endobj - -4261 0 obj -<< - /Type /StructElem - /S /Reference - /P 4260 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4262 0 R] ->> -endobj - -4262 0 obj -<< - /Type /StructElem - /S /Link - /P 4261 0 R - /K [4263 0 R 20 21 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4689 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4263 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4262 0 R - /K [19] - /Pg 4715 0 R ->> -endobj - -4264 0 obj -<< - /Type /StructElem - /S /TOC - /P 4259 0 R - /K [4273 0 R 4269 0 R 4265 0 R] ->> -endobj - -4265 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4264 0 R - /K [4266 0 R] ->> -endobj - -4266 0 obj -<< - /Type /StructElem - /S /Reference - /P 4265 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4267 0 R] ->> -endobj - -4267 0 obj -<< - /Type /StructElem - /S /Link - /P 4266 0 R - /K [4268 0 R 17 18 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4688 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4268 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4267 0 R - /K [16] - /Pg 4715 0 R ->> -endobj - -4269 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4264 0 R - /K [4270 0 R] ->> -endobj - -4270 0 obj -<< - /Type /StructElem - /S /Reference - /P 4269 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4271 0 R] ->> -endobj - -4271 0 obj -<< - /Type /StructElem - /S /Link - /P 4270 0 R - /K [4272 0 R 14 15 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4687 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4272 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4271 0 R - /K [13] - /Pg 4715 0 R ->> -endobj - -4273 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4264 0 R - /K [4274 0 R] ->> -endobj - -4274 0 obj -<< - /Type /StructElem - /S /Reference - /P 4273 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4275 0 R] ->> -endobj - -4275 0 obj -<< - /Type /StructElem - /S /Link - /P 4274 0 R - /K [4276 0 R 11 12 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4686 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4276 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4275 0 R - /K [10] - /Pg 4715 0 R ->> -endobj - -4277 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4259 0 R - /K [4278 0 R] ->> -endobj - -4278 0 obj -<< - /Type /StructElem - /S /Reference - /P 4277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4279 0 R] ->> -endobj - -4279 0 obj -<< - /Type /StructElem - /S /Link - /P 4278 0 R - /K [4280 0 R 8 9 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4685 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4280 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4279 0 R - /K [7] - /Pg 4715 0 R ->> -endobj - -4281 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4259 0 R - /K [4282 0 R] ->> -endobj - -4282 0 obj -<< - /Type /StructElem - /S /Reference - /P 4281 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4283 0 R] ->> -endobj - -4283 0 obj -<< - /Type /StructElem - /S /Link - /P 4282 0 R - /K [4284 0 R 5 6 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4684 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4284 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4283 0 R - /K [4] - /Pg 4715 0 R ->> -endobj - -4285 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4286 0 R] ->> -endobj - -4286 0 obj -<< - /Type /StructElem - /S /Reference - /P 4285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4287 0 R] ->> -endobj - -4287 0 obj -<< - /Type /StructElem - /S /Link - /P 4286 0 R - /K [4288 0 R 2 3 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4683 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4288 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4287 0 R - /K [1] - /Pg 4715 0 R ->> -endobj - -4289 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Contents) - /K [0] - /Pg 4715 0 R ->> -endobj - -4290 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [12 13 4296 0 R 15 16 4295 0 R 18 19 4294 0 R 21 22 23 4293 0 R 25 26 27 4292 0 R 29 30 31 32 33 34 35 4291 0 R 37 38 39] - /Pg 4681 0 R ->> -endobj - -4291 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [36] - /Pg 4681 0 R ->> -endobj - -4292 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [28] - /Pg 4681 0 R ->> -endobj - -4293 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [24] - /Pg 4681 0 R ->> -endobj - -4294 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [20] - /Pg 4681 0 R ->> -endobj - -4295 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [17] - /Pg 4681 0 R ->> -endobj - -4296 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [14] - /Pg 4681 0 R ->> -endobj - -4297 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [11] - /Pg 4681 0 R ->> -endobj - -4298 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [4300 0 R 8 4299 0 R 10] - /Pg 4681 0 R ->> -endobj - -4299 0 obj -<< - /Type /StructElem - /S /Span - /P 4298 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [9] - /Pg 4681 0 R ->> -endobj - -4300 0 obj -<< - /Type /StructElem - /S /Span - /P 4298 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [7] - /Pg 4681 0 R ->> -endobj - -4301 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1 4304 0 R 3 4303 0 R 5 4302 0 R] - /Pg 4681 0 R ->> -endobj - -4302 0 obj -<< - /Type /StructElem - /S /Span - /P 4301 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [6] - /Pg 4681 0 R ->> -endobj - -4303 0 obj -<< - /Type /StructElem - /S /Span - /P 4301 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [4] - /Pg 4681 0 R ->> -endobj - -4304 0 obj -<< - /Type /StructElem - /S /Span - /P 4301 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [2] - /Pg 4681 0 R ->> -endobj - -4305 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [0] - /Pg 4681 0 R ->> -endobj - -4306 0 obj -<< - /Type /PageLabel - /S /D - /St 1 ->> -endobj - -4307 0 obj -<< - /Type /PageLabel - /S /D - /St 2 ->> -endobj - -4308 0 obj -<< - /Type /PageLabel - /S /D - /St 3 ->> -endobj - -4309 0 obj -<< - /Type /PageLabel - /S /D - /St 4 ->> -endobj - -4310 0 obj -<< - /Type /PageLabel - /S /D - /St 5 ->> -endobj - -4311 0 obj -<< - /Type /PageLabel - /S /D - /St 6 ->> -endobj - -4312 0 obj -<< - /Type /PageLabel - /S /D - /St 7 ->> -endobj - -4313 0 obj -<< - /Type /PageLabel - /S /D - /St 8 ->> -endobj - -4314 0 obj -<< - /Type /PageLabel - /S /D - /St 9 ->> -endobj - -4315 0 obj -<< - /Type /PageLabel - /S /D - /St 10 ->> -endobj - -4316 0 obj -<< - /Type /PageLabel - /S /D - /St 11 ->> -endobj - -4317 0 obj -<< - /Type /PageLabel - /S /D - /St 12 ->> -endobj - -4318 0 obj -<< - /Type /PageLabel - /S /D - /St 13 ->> -endobj - -4319 0 obj -<< - /Type /PageLabel - /S /D - /St 14 ->> -endobj - -4320 0 obj -<< - /Type /PageLabel - /S /D - /St 15 ->> -endobj - -4321 0 obj -<< - /Type /PageLabel - /S /D - /St 16 ->> -endobj - -4322 0 obj -<< - /Type /PageLabel - /S /D - /St 17 ->> -endobj - -4323 0 obj -<< - /Type /PageLabel - /S /D - /St 18 ->> -endobj - -4324 0 obj -<< - /Type /PageLabel - /S /D - /St 19 ->> -endobj - -4325 0 obj -<< - /Type /PageLabel - /S /D - /St 20 ->> -endobj - -4326 0 obj -<< - /Type /PageLabel - /S /D - /St 21 ->> -endobj - -4327 0 obj -<< - /Type /PageLabel - /S /D - /St 22 ->> -endobj - -4328 0 obj -<< - /Type /PageLabel - /S /D - /St 23 ->> -endobj - -4329 0 obj -<< - /Type /PageLabel - /S /D - /St 24 ->> -endobj - -4330 0 obj -<< - /Type /PageLabel - /S /D - /St 25 ->> -endobj - -4331 0 obj -<< - /Type /PageLabel - /S /D - /St 26 ->> -endobj - -4332 0 obj -<< - /Type /PageLabel - /S /D - /St 27 ->> -endobj - -4333 0 obj -<< - /Type /PageLabel - /S /D - /St 28 ->> -endobj - -4334 0 obj -<< - /Type /PageLabel - /S /D - /St 29 ->> -endobj - -4335 0 obj -<< - /Type /PageLabel - /S /D - /St 30 ->> -endobj - -4336 0 obj -<< - /Type /PageLabel - /S /D - /St 31 ->> -endobj - -4337 0 obj -<< - /Type /PageLabel - /S /D - /St 32 ->> -endobj - -4338 0 obj -<< - /Type /PageLabel - /S /D - /St 33 ->> -endobj - -4339 0 obj -<< - /Type /PageLabel - /S /D - /St 34 ->> -endobj - -4340 0 obj -<< - /Type /PageLabel - /S /D - /St 35 ->> -endobj - -4341 0 obj -<< - /Type /PageLabel - /S /D - /St 36 ->> -endobj - -4342 0 obj -<< - /Type /PageLabel - /S /D - /St 37 ->> -endobj - -4343 0 obj -<< - /Type /PageLabel - /S /D - /St 38 ->> -endobj - -4344 0 obj -<< - /Type /PageLabel - /S /D - /St 39 ->> -endobj - -4345 0 obj -<< - /Type /PageLabel - /S /D - /St 40 ->> -endobj - -4346 0 obj -<< - /Type /PageLabel - /S /D - /St 41 ->> -endobj - -4347 0 obj -<< - /Type /PageLabel - /S /D - /St 42 ->> -endobj - -4348 0 obj -<< - /Type /PageLabel - /S /D - /St 43 ->> -endobj - -4349 0 obj -<< - /Type /PageLabel - /S /D - /St 44 ->> -endobj - -4350 0 obj -<< - /Type /PageLabel - /S /D - /St 45 ->> -endobj - -4351 0 obj -<< - /Type /PageLabel - /S /D - /St 46 ->> -endobj - -4352 0 obj -<< - /Type /PageLabel - /S /D - /St 47 ->> -endobj - -4353 0 obj -<< - /Type /PageLabel - /S /D - /St 48 ->> -endobj - -4354 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /PGOLQH+TeXGyrePagella-Bold-Identity-H - /Encoding /Identity-H - /DescendantFonts [4355 0 R] - /ToUnicode 4358 0 R ->> -endobj - -4355 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /PGOLQH+TeXGyrePagella-Bold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4357 0 R - /DW 0 - /W [0 0 500 1 1 778 2 2 250 3 3 611 4 4 389 5 6 556 7 7 500 8 8 889 9 9 333 10 11 611 12 12 389 13 14 611 15 15 333 16 16 500 17 17 333 18 18 722 19 19 444 20 20 611 21 21 556 22 22 500 23 23 611 24 24 778 25 25 556 26 26 500 27 27 833 28 28 333 29 29 389 30 30 444 31 31 250 32 32 611 33 35 500 36 36 722 37 37 611 38 38 709 39 41 500 42 42 1000 43 43 667 44 44 1000 45 45 500 46 46 833 47 48 611 49 50 500 51 51 611 52 52 833 53 53 500 54 55 490 56 56 510.99997 57 57 833 58 58 250 59 59 833 60 60 250 61 62 778] ->> -endobj - -4356 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x # -endstream -endobj - -4357 0 obj -<< - /Type /FontDescriptor - /FontName /PGOLQH+TeXGyrePagella-Bold - /Flags 131076 - /FontBBox [10 -266 988 747] - /ItalicAngle 0 - /Ascent 720 - /Descent -258 - /CapHeight 681 - /StemV 168.6 - /CIDSet 4356 0 R - /FontFile3 4359 0 R ->> -endobj - -4358 0 obj -<< - /Length 1482 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -62 beginbfchar -<0001> <0041> -<0002> <0020> -<0003> <0050> -<0004> <0072> -<0005> <006F> -<0006> <0067> -<0007> <0061> -<0008> <006D> -<0009> <0069> -<000A> <006E> -<000B> <0064> -<000C> <0066> -<000D> <0053> -<000E> <0070> -<000F> <0074> -<0010> <0065> -<0011> <006C> -<0012> <0043> -<0013> <0073> -<0014> <0062> -<0015> <0079> -<0016> <0031> -<0017> <006B> -<0018> <0055> -<0019> <0076> -<001A> <0032> -<001B> <0044> -<001C> <002D> -<001D> <0049> -<001E> <0063> -<001F> <002E> -<0020> <0075> -<0021> <0034> -<0022> <0037> -<0023> <0033> -<0024> <0052> -<0025> <0045> -<0026> <00660066> -<0027> <0039> -<0028> <0035> -<0029> <0036> -<002A> <0057> -<002B> <0054> -<002C> <004D> -<002D> <0078> -<002E> <0047> -<002F> <0068> -<0030> <00660069> -<0031> <0038> -<0032> <0030> -<0033> <004C> -<0034> <0048> -<0035> <007A> -<0036> <0028> -<0037> <0029> -<0038> <002F> -<0039> <004F> -<003A> <00A0> -<003B> <0077> -<003C> <003A> -<003D> <004B> -<003E> <0056> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4359 0 obj -<< - /Length 6443 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xY TS׺N74OQVm8kE<"3$0Ϩ FAԶõRZǷy}u>}_1cBpe]l|<0U!^0ZDf*X<)czT@h3幩-6KfJl"Lڶ+d|<8/2vuHhlod;C­.VB1VY7yYm4#<Y - + -qۭoqܺyVN~` y#3Ra-[yxyɽLy#Wn;O xJ ,5*&ǔ4 ֘Bl(ߒْq_3 $>}<^ΕysL7B~0KKD];vh܆q>%nl~y>ugӞ5wson3wj| ]M|o N/|5ysMqrt{SMyUg'Á>QƘf}#ky PpŐqIRh hEbZQ58}|w:)OLGhIHVB[l[?٧A -?l"q.TaSW+yqyi&CCwZeUPXA+tȓD^$G8C@rbc*.9ԦVBJ"eqǍS p -zQFlG ~y_Ź?f؂ Nړ4acu3dRfpݳݸ~0ϼUGj6_N86ɮ`33 ]R*>*8L*pp{{]]aA gΑ1} -]Mە` ޅa)Mt#$EA4)IaJ[+*p$Y ־lki]KNRюrQ%kBd]XJ>_Ն.8C6T|m0d]DTRSQU5-cDj2 -~[f+II`mmڡ>>]Av1]KyJQZC崫8FATB+vlI݃)ʇ`NUP dIAGKel3S4P cЩ:f!?iuyY2+?K;@6Sk!1|'\tt_tD06wFQ*j|xK]Хz<0 -cH<9VN+tƳ6`54ȃ|d҅rJʿ"]8k'cZMApJKؑ;!"kCچqw^7Ǟe͝h(Nt`Ϧ_cO3V(0g~>◾-πRe%V -LCBC)qt.b ^htⲬ)(NvXvLv]>XMvӐ0ul"O*JU8^:3QErnA(Ψ%pe%kCD&M3-쨻8,6:?Bu*iJw['?0?mëh>שUt~{V5efdeE@-K'{ntŶxS~q;8;{f7sY'6 hAᡸ@p^u6} VdM҅,߀_.i6ݣ,?qUG\f^&(*?tY?/eק';QKtɠ$գH ~$y'jh(m:ܽo֯*}CgTt(e+ :ͧgRITr"%8U9 \h{͝Q*a~+ضVƝ7~1$<ZEEo+2_ P5ܭm͐RUw2v# 7{\En;4|ao=@͸]d(o=(bK=ZO;;jrUv90 Àק=WNM3Lu-33&Lm&j)~ 뚳98&&uebM T[-SA h'Fs6ݧ{fNqEY&>/2 %×vꋁֵͬ!])叁FGk!pQpFT}}J̞F -\˰K _h]YԠ+*9K-\ t1L;;MXnš)=Ecs8+U .jgYE*%)UŖSF>RҕWUPCqCZZkZe*_`Z%)RA -$*l #UŐy9b5m7-]GnZz?45`N⺪ka - 554SG6U\8oomi,[lPOrj`K)c)Z(F\Wk 4 "I愺_/\^-~rNU1 % -;\#85k o|O WjKԇ^׮=,u5pUg)a >'74Ӕ<$7?я$B6pF/eM^[Kve4pZ3m>x'S{xЀѱYdX-p!ΐ!N#~ 2r'n<~βZ4{K39]C1VHvDeB"s u - t! {p43O8 M1-:[Lzf폲Ȯ(gI$ߘ >;wN tHR'hhJlK0=;VSzf&/e3d8;[ʷn#Ɲƚq< -(qܽ˗.9$8 E/g,!(>f }k}>Q@@Hwrg`맃:-Vڈ!J'#Mǀw|mekwJ3w 878KyX\~wPeS -h-kn W r WEKjj_&VêTHdU"5Ʒ&6FM6} 9UB)7aMG<m -kch¢Wv9mEm3ű#1fRx?+bO[DsM۔s t 3%6RT?8,N՛`A%nY -ܢ`|F"H=Ѭ;+p^JYHD/\Phdm2[xB<*OO r"AEi9PmιW79>D-4@YBzMaO1+~pI߰ZSjRUKlq64Źwь5 jj+f6SF.)+Ө-Щӯ=dރVh{< yl:&˾k(* 9QܡܡK*Jҡ,N0&]b݁Wy5_Y^ḓΔm\]"Pl ,P%=Y,)'b8ХDMf6 ]$u@jcv['UFqx>]'3ve"=ynŵ ~ez]$I)/7Z=~bOqe~GkpWh.}U{K)7|k/ZD2Xs])w5unN(_ tdNh ɖSvoG|7SNި ; -Mll'l@ :DԀ<8;gKHP' >pj{*X[omMX -LJQr|*DP8 -%~E6-&L7D| -p6x`!UzOZ^HLuN1퉗`%j7L ;0M4|BLf<$vي#1 f!"5m?V >` ^(MznmmNG2IDW5F Er11MB&ql -2/ǣ7l=2asuї.;YhAo-%@t]>]fs؜Ye`siD1?>;SOקҳpι/d,|9i飯L`%`N ,-7lPS.B(THlv<: Q}`qCƻCB!o٢g8q8 -0CDY`d+هyFWWkKY&AǺ9^d34Sǁ&w)Ep(4.*/9'<2:>|!Φ8}@vӑXH - -ԴZ)U~j?SaI -Le*Tԇr /퀅ٞ=*K:Z/zLӹ)Tnn&Ƴcho<::^LC5ƇϏv:0rI*> e* P$ C]Be;#?Kn -?aI|T)KbPLx HaC~cQ=E/c)/,<!D(('ʬOƉ$h r rԴ4Qr'pV;Il HK -endstream -endobj - -4360 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /HRSIWM+TeXGyrePagella-Regular-Identity-H - /Encoding /Identity-H - /DescendantFonts [4361 0 R] - /ToUnicode 4364 0 R ->> -endobj - -4361 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /HRSIWM+TeXGyrePagella-Regular - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4363 0 R - /DW 0 - /W [0 0 500 1 1 667 2 2 287 3 3 333 4 4 500 5 5 582 6 6 250 7 7 525 8 8 582 9 9 500 10 10 250 11 11 500 12 12 1000 13 13 479 14 14 667 15 15 556 16 16 613 17 17 556 18 18 709 19 19 603 20 20 946 21 21 546 22 22 611 23 23 395 24 24 424 25 25 326 26 26 834 27 27 1000 28 28 883 29 29 601 30 30 291 31 31 333 32 32 565 33 33 444 34 34 560 35 35 250 36 36 553 37 37 250 38 38 278 39 39 623 40 40 500 41 41 516 42 42 556 43 43 778 44 44 608 45 45 605 46 46 774 47 47 500 48 48 611 49 49 604 50 50 832 51 52 500 53 53 763 54 55 500 56 56 668 57 58 500 59 59 556 60 60 831 61 61 337 62 62 611 63 63 500 64 64 778 65 65 786 66 66 726 67 67 722 68 69 428 70 70 560 71 72 456 73 73 250 74 74 897 75 75 500 76 76 611 77 77 333 78 78 250 79 79 234 80 80 486 81 82 500 83 83 208 84 84 480 85 85 500 86 87 441 88 88 500 89 89 278 90 90 208 91 91 786 92 92 667 93 93 444 94 94 486 95 95 278 96 96 747 97 97 371 98 98 500 99 99 479 100 100 603] ->> -endobj - -4362 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x~Z -endstream -endobj - -4363 0 obj -<< - /Type /FontDescriptor - /FontName /HRSIWM+TeXGyrePagella-Regular - /Flags 131076 - /FontBBox [-40 -283 1000 750] - /ItalicAngle 0 - /Ascent 726 - /Descent -281 - /CapHeight 692 - /StemV 95.4 - /CIDSet 4362 0 R - /FontFile3 4365 0 R ->> -endobj - -4364 0 obj -<< - /Length 2027 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -100 beginbfchar -<0001> <0059> -<0002> <0069> -<0003> <0066> -<0004> <0061> -<0005> <006E> -<0006> <0020> -<0007> <0053> -<0008> <0068> -<0009> <0031> -<000A> <002C> -<000B> <0032> -<000C> <0057> -<000D> <0065> -<000E> <005A> -<000F> <0067> -<0010> <0054> -<0011> <0079> -<0012> <0043> -<0013> <0075> -<0014> <004D> -<0015> <006F> -<0016> <0064> -<0017> <0072> -<0018> <0073> -<0019> <0074> -<001A> <0077> -<001B> <2014> -<001C> <006D> -<001D> <0070> -<001E> <006C> -<001F> <002D> -<0020> <0076> -<0021> <0063> -<0022> <0071> -<0023> <002E> -<0024> <0062> -<0025> <003A> -<0026> <2019> -<0027> <00660066> -<0028> <007A> -<0029> <0078> -<002A> <006B> -<002B> <0041> -<002C> <0066006C> -<002D> <00660069> -<002E> <0044> -<002F> <0034> -<0030> <0045> -<0031> <0050> -<0032> <0048> -<0033> <0035> -<0034> <0033> -<0035> <0047> -<0036> <0036> -<0037> <0037> -<0038> <0052> -<0039> <0038> -<003A> <0039> -<003B> <0046> -<003C> <004E> -<003D> <0049> -<003E> <004C> -<003F> <0030> -<0040> <0055> -<0041> <004F> -<0042> <004B> -<0043> <0056> -<0044> <005B> -<0045> <005D> -<0046> <2022> -<0047> <0028> -<0048> <0029> -<0049> <003B> -<004A> <006600660069> -<004B> <2013> -<004C> <0042> -<004D> <004A> -<004E> <00A0> -<004F> <006A> -<0050> <002F> -<0051> <201C> -<0052> <201D> -<0053> <007C> -<0054> <2218> -<0055> <005F> -<0056> <007B> -<0057> <007D> -<0058> <00E4> -<0059> <2018> -<005A> <0027> -<005B> <0051> -<005C> <0058> -<005D> <003F> -<005E> <005C> -<005F> <0021> -<0060> <0040> -<0061> <0022> -<0062> <00E1> -<0063> <00E9> -<0064> <00FC> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4365 0 obj -<< - /Length 8677 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xz tSwc8QC^e( <-PsKG:#$MZZ:mNt3DdEox[fݛ3[`6h@ xaEa]__`i -?2~@%X+ 'W #3]cafGncLu)bqﳕL}nNYV\Af\qYAǰwh$^Z€2q[)ӆF[oM~)PH4&hFUiZQdcȆHW+jH_bɂE\賓[Ǥ>r1?X./y>v[a_;0zEQJ7qPlS9F Ç2ȍ/{pFk RGz~/`Bl6FӘG.R<$a s@%򼠾Kf+g5g 8Bl,4Ȅ H+[p)ڐh|m;rh%هKp\abcK?{͘*bR^\IqT?:L-k8_ϳ+-m\ N( _k.'=PC+`$JxCl > -Ҥؽ+QNًl:H!GR㪩yȊp{[2eCةq Ӕk)dZQrGpT;%l7U*AU,,E?),ϴ1۞>Pژ[^QidkP6X -6~UacOCt:S?lr -e -MuI-0`_sY;TAiT4_XL  -;6:* W?T , ?~[%u $~Id{(+~'Ϥr+xaqSGxՠ?Ce(n[(;" >JV`Fێj/l{|k{J&qy9r86w.\_=e^Zi4i**;!_W@@Ic6*؁lt -ܯ|`%ߺlp}ݻ" r#-$2. )F -- )iHꃖ=k(˩ZrvW˥k[j]7mJb-% FUPRСB8tznbn -H@ @qSh'L UHUY@MCʼ- \>\ W/UEFL$^lqm ԝY4 - oWvbuRt=Hy 5h@*/oJ&pYBvve8ܧɫ:$\U" n*xMʼ-6e_ù{36p^(m`pnhO.+D余'ẽ0=d 3_jWdfGxsCf/ri2K ޹>uB 4dГpLm熕n;" -\W x_zx^dv|죀H0[a{(@a+5SԩT &1; y7|IH5P\K]~{$QO4k ]?n_Vy&6r? g*t0ۈ`vbVuP !gV *bUa%HP2ƎˮVKQwWNcÙhw/dn⇷ GoAo),[Lj߶O uW 8jJԥ` -OȖz?&D)[Zy0~[%E!& rOQ&R宨 umtoYK kT;SoT7B;GH{R '(m 2ۋn0\xuK6NeG^˿SeQ#.0pW;[_PW$Q=}JΌl|h5d][, "au6= Ûг5,;Tη Wjyj:e>"Xs1 ~U^eEPӧ -%<ph6"4i$0'{G -> 7B/5(A]3?NT)Z+dfjhɑlWzvRo7yj%iP"&f a"l&2lJ,'F]Nr1 E.*gpZa 5?"%巤f/:MA :);zv[@C]E~o)D7,ذp:g:Ttp|cRUڈq]wC'?b˷T,=5"cXe| C>;YPv -'(:c.\7QpOo`)Ed3r(w1ߎ.-zpui -cĔ;>{?~6z}&vaKuƓ:m - V+IJDqnN `)W -x+T ^jo5*I|QǑ+{I!PaAXnRʵl?Kˢ+(λ/<>hД Ъkܽ׹# 6úU *a HC~p[,6){4"+TzD˓+bjԭjcEpL_SGCƢmi<"b;6d%0~OO:~]55e 2pD`TP| )+H' -OvK}+ eF?L†EwOK'z[aDx!{t -а4ػ4 쫬>s [.l~4g_2rs 9@{YAfO~e}1 Rቇ?X/k1[Ђ-i֮}NV_QK6G%~+ӿE'PB|CfFk#<ÃvpdN߈x# -_5M0;G.M 5iTaHRcH0ʭ0fU "@qy ?O*a3sCeUi@Ę?9@JQzGKlUbkn5$ZE٫GD40Ü a %(𬦌 M@IrQil> Q 40NaUĿdD{SrpOM&h{6;JLGPD7ǫ2 |ḑ(-Kj'Zl7k\FoY -^Mz/4@㽠%ڨȆNj8D$19 -b!&<>@I<M|OF | j+X{%i-^T[L-i$zmQޑ!߄ S*% /)e{r ͕Zzu]'y&mMD/HQPbe,fk .Q]{>ʆh r=X ԫ֒Y -#vVbWsn*D5@o\>2"4;Ri;)NT\EGg]\ ka%R4Պ- -ҢH>pA$8^aXlkkс2M64(Ȇ2%5!6"KmvSkSفlVۙ{ NP -Q9eQN).|<9S.Zei=^f8 gt$0s Q+(ntÉ:Q bkH\$h ģ4l$O mme@]̘pR&MtWD"o՘r"L]Y_]~ץ+SB\i9x1gAɽ$ 7(un3&E`y3eC* Iz?Om]8-XFۦ$<]Pׯm߰^xVp1Fyy&»-_ؚt]'pNg:DP֤%tR98L:(wB +@etR|L%@m */.r- Wj[!.}[&ܸ{&PccYD^b\P$D=(a7np-<7Rq -n9d|Øjs -ۊہ~ѵ7m$7}I!5B!z,%(;^㺒2EQ \G582 -%Ū`T&ޕHLQ$BafS&sx0jn^Lq9FR)TA1F6\C;ȡN8 ח``Vʵ5 ->@~g9}j 0 e#Nzf?53;ñ&8J/}px${vQ2XTZН1!Un(wL>/o=B{~uv`CY]ٴGZr-g>oV>UXҙ>@"(c*Jc@`"d<z y>9V44M}Jr?GU*u| _BMiNLA zuIHϞw2%;|ޣikAy/ -ckjaa#Y9hٻW__Q?3O)_s 25>3|U`(ٹ\΄܂pbӓ }.b#-arA*9mySK`])07&={8эY,U/[+Wt0f7=&Y(.4?:O;R)UA! -MCB4$B]N a<)+.(U& r|W#ABp*X1vW}7{@k/Nb,iwlOUU Rt0#+WCݕ*wpwi -REzP߇mIbfjv2vPګ&)i~ !Dž8i`ԫR R)z5{׉֟nfqWMIPC<īk 0㳷1\žz1Jg&Qcab&9e&GIMeoɴd'Yerq"8#w'"\619QK)Ld7M -LzK -].QM@z L}`2)>I -wM6MdL/*RUl6/ҿC/դ]L !_C@ej#`<8ܯ07d Iaͅ l-)9kv L;vA4BQl}>m:Ts ->.yks{݆!o-w箑AZ}Qz&MVnHU[*T8dQ7DT4"!mno ۰Gb~=ILUB*R}8e* n@}; zL5׏~} - kvŋM-'e|`MS$a+)mK6U>Z?!EkSpT\TYj膋+t^izkaeSEo{̓=pjlɯK5M:^sGGiK>==}i+XTxe2>)6w ;6wyΕ]h߲|z<-F^6;?D~kT͖KfwnJgqwC}oP+)WP[-hhQh^,(44Rr;u)C+6dJc6:RI4Cb.n%51 qU,lY3W9.Ԧ7gqlX@+[)?807e -ޔMEm:4uJ#r S!s rT9bk#!%bu Cj"IBdddic`El(ztP]DNhe#5;ZXYj=š̓m`$3:&XAw2D|  Qx;7KIzYEV |] üV/]8<'3J 2Ix^BdCUFϿ>ogkrWë)ɤh{#cubMd-."}bCMoI'9-P%x5PHKs-,^)ۄ$t]ފU+JKw pg`#?.7ik6f0ne$ya HA@͞b:efw~))>2S5>V26¶Yb{R(9[VV_WP N1d]Ovpɿ,gpɰF*Ր6K|O -RR!"vB}]}11>茺zf׭{'돊ob]faߐ -endstream -endobj - -4366 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /VHGYFM+TeXGyrePagella-Italic-Identity-H - /Encoding /Identity-H - /DescendantFonts [4367 0 R] - /ToUnicode 4370 0 R ->> -endobj - -4367 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /VHGYFM+TeXGyrePagella-Italic - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4369 0 R - /DW 0 - /W [0 2 500 3 3 556 4 4 444 5 5 778 6 6 278 7 7 407 8 8 250 9 9 444 10 10 500 11 11 389 12 12 333 13 14 389 15 15 278 16 16 463 17 17 500 18 18 518 19 19 667 20 20 278 21 21 556 22 23 500 24 24 528 25 25 500 26 26 611 27 27 333 28 28 556 29 29 333 30 30 444 31 31 778 32 32 722 33 33 444 34 34 667 35 35 841 36 36 545 37 37 611 38 38 278 39 39 556 40 40 463 41 41 667 42 42 722 43 43 944 44 44 778 45 45 760 46 46 611 47 47 722 48 48 778 49 51 500 52 52 250 53 53 611 54 54 778 55 55 250 56 56 556 57 57 333 58 58 500 59 59 250 60 60 722 61 61 500 62 63 456 64 68 500 69 69 944 70 70 486 71 71 778 72 72 722 73 73 233 74 74 1000] ->> -endobj - -4368 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x -6 -endstream -endobj - -4369 0 obj -<< - /Type /FontDescriptor - /FontName /VHGYFM+TeXGyrePagella-Italic - /Flags 131140 - /FontBBox [-162 -276 1010 744] - /ItalicAngle -10 - /Ascent 733 - /Descent -276 - /CapHeight 692 - /StemV 95.4 - /CIDSet 4368 0 R - /FontFile3 4371 0 R ->> -endobj - -4370 0 obj -<< - /Length 1654 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -74 beginbfchar -<0001> <0064> -<0002> <0079> -<0003> <006E> -<0004> <0061> -<0005> <006D> -<0006> <0069> -<0007> <0063> -<0008> <0020> -<0009> <006F> -<000A> <0070> -<000B> <0073> -<000C> <0074> -<000D> <0065> -<000E> <0072> -<000F> <006C> -<0010> <0062> -<0011> <0076> -<0012> <00660066> -<0013> <0043> -<0014> <0066> -<0015> <0075> -<0016> <0068> -<0017> <0067> -<0018> <00660069> -<0019> <0078> -<001A> <0054> -<001B> <0049> -<001C> <0053> -<001D> <002D> -<001E> <007A> -<001F> <0044> -<0020> <0077> -<0021> <006B> -<0022> <004B> -<0023> <25B7> -<0024> <0066006C> -<0025> <0045> -<0026> <006A> -<0027> <004C> -<0028> <0071> -<0029> <0052> -<002A> <0041> -<002B> <004D> -<002C> <0051> -<002D> <002B> -<002E> <0050> -<002F> <0047> -<0030> <004E> -<0031> <0032> -<0032> <0030> -<0033> <0031> -<0034> <003A> -<0035> <0042> -<0036> <004F> -<0037> <002E> -<0038> <0046> -<0039> <004A> -<003A> <0034> -<003B> <002C> -<003C> <0056> -<003D> <0035> -<003E> <0028> -<003F> <0029> -<0040> <0039> -<0041> <0033> -<0042> <0038> -<0043> <0036> -<0044> <0037> -<0045> <0057> -<0046> <002F> -<0047> <0055> -<0048> <0058> -<0049> <0027> -<004A> <2014> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4371 0 obj -<< - /Length 8773 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xwX! Udi6qW$^`b!@G{Hlvc8&iFCzpf߶~~Ctt=GϹ}K3fxxzz> ܔ% -%$-ٜ| 溟>1ZCI3ϢG[̛HKLVpH^RZlZ[,AltLﲥKW.Yw}_^/_^f/)5 ["ž[^0,yK Kx~o8/&,!ʗ5=Ͼݴg]{}w,/-), EBɋd$_LXR xxzlv+Nn+YR3i>e{&{JA3᱕\ -b -&*|<2s|&ޙ:cdq463|Yg]+U~{'g<7ȓxO&۟\?=_o;%7F>'J4'N>HEonHS&ʌ%CH] ,Wz޽FINx9܏q*QFQ" QjvCF|]sLX d)3d8A(E*A-V}yK*RQRfX^XAOY)@\9b!F.^ ?6MNV ]P%+ADY~`xꮐWt86nU5uh6Rd!̹`.K -rE|H* MP:RZa9. EfꒁByr޶De C*āsī}IGfڶ#0%q Պ/V9Wݩѱz'A'<ɠgo᜷˥UCeni襐8) h*| #] LP.@vn;sp#'O"]`@" -3oLS -E`B2؏YS+ sdoe`APfIBUqzK 9t \fΆt݇$#(ͩi n"?.vq?9Y3N -^5 ݁c0X9ڇd" z/;BR'܄63QUQcjך:o}鼱\+(30s`Ŭ=Ilwh,'qrTߞ0V}T/ _gNP>OjA, 8 MaN_Q57!^ڿV/ -S0wP#=EV\Lo8Ͳ#G:`%֕Pi,.: } ڳʒ}EWg=i v$:,@4m#l!|#%,c7#"VŃϬCǰ ^B2RYt{5R27 -:?elwH VScpە\Wk~g` !vă 7lG86TvVX\. !Bbf_z0L'z~?<JGsUuv%ި}H޺j(ܚKfj.^A!Rcõ髍vC}qQXvWk=ImMbmבE OOŠ913p -ڮӜQn4|~yc./-0E -2~n`r\ bu!~zj%Ɂfp vv75u lX%ncD>{WH9v_ǩnd,:l -2VK{aa?^߅z/6\.}DJW4ݗ - f" 5+Ky^^$,,@>4Oɇpׅk)R,ǹ<̢7ҮOn;Fc>6z%]1KVc T]FkL&L^^@D;7fJJ47fW\RK0"v[4@>tC=ԉJSE缍MITCRH#-5==?Q笢_F - -e)?F<#HWڃs?w8-#Z; uρl2g9n8{<?a)_[^ٯz Pj/K?~UIOx5 \-S6z$tȁҬJ8 WdQ|T P0{ߧ 'U<-F@T[lI M};)x׋RPJ5V}->AH[)bɦq#JnfIϓt_,Q| Y]#E7B4ҁHHa4l#fd7@9TK vm _CFdz]6p6~GO9]#~`I8]y -x˳ KM(!1,jm3rPv-6) _ T태ZY`0 2C%/`XJp $FqIZA(*3#!+@{EKc]mUH) 菶%C=ݧ_7pxU.⓮ mذ#<:KBϒˇ"12|3W^NmwG}G\aRټ܂M bjb˗KvSd)fILϤRMW_ TCȒܯ4مF&!W)Ud6M/=6IK,ɽ|#fS*+SAt8m݈JVVGB547PԆAER).u8_go2(EDW7JR/(AĮ*u@Lw.4Auxغ=b; -};6"Tz,v -xW+RG-wzk8.(c`4 m X1UDKT*h@3H @{]ZBILPgᫀރV6_+d%X ud5ZZ^K` ۏEtNF%[MuC7t)(Y#5B%)3Co։TF9- }%"b!tɐ BejYUPT1U]ZeTY!m>O~~۩] yyo+0d=ZKN|N -|ΎW&ؤT+#Z*xiL9&7q2j+cv}-ZW=7}oCo`Vv*wαlPAS5ZiX,ط`%?FHCHm>>Cn緡ۭs++2:GBQ>JHOEs#E'B uI u}1 yC n ]Dq̒v2}͗M5P (\YJ(0HcΥ$tt0*W(ː͇Ͱz []eo ytNέ,Vrz5T/tAIރ?$aCJy^kOG/kS\*\/¢ZL(#Rnf*]iN{%$\Qr8dl/ ͟GpBEY-ا ]etPE$"ԊH.tH٠*pKP, ܙʴvc#& b -O щ7 2M>H)U_ّ߰JewX-9M}\;^99J|+Ç txZmɐIcLzNdj)=@f"> P6OaQM Ct|9]RJLtM*k~j?#?~0 20~Z~Yy!o7cZ^_o9y:!y oU)Lj]Pa+ $y\e^4%C‬Ӳ Ř))!u̍ CJbYUt_jeY]e"T2ksщ\JM#XB@)Ft@á4Fjlj -͊ݘFh*j=0 -W8<:Oѝ*wSt} gӦiڠZ-~pO6k3 ŕ-::QRJrI*>tR]ӷ\EAz/D05{(fofN tD."9H h6u+0kLHSd;<;u'BdeG?*G*~na'(|ԧ~(-fZ*LuY\ܮ:_W|*/3V~W_BGHBu~S$ -cm:^enл?{~w#,do跹~J]Za_)%ÎS%  %aFh,PK$~J')k!N.b.m͔Qk÷9@WQzE[j(y(㭗^B}T $J 0l׋c`e0ʟټџ@<O)GGF<_:a&uz'O յr]HU*c;yiEb n4hjQ*LJzSU¬TT:)+S nܹYoguFxL{+j;=.P4L'zgEh&heX;a0|F6t6 nR%Z1CxU[ -  -)C.g!:n9X.*Hr Q=$A'qui8SnM ߋV-JM~JR%O7)Z ij? g# i{0F ԢS~Q -a-8yChSHY@vs }ڍ_=T&|qI'w=K?@dabIȓѨ85 -0er JJPUZG -U*\x߽G(?j8l DLo8FIK1wobi$YB -Q[]09rh;}+ɷTIQOoCY?܄lH̏p.*֔4=oI1. sy9$;R¥ZN?4w@Y@" r\/+Jͥ@/m:cPz^k p@OO|YJs WYO?J¦٧@/¯z.z1ͦ٘%$cFD5H8 }%R'Ym^]a-\ܾ.'0o܏3hoz3|= }ueD!Ξp -F7n^½֬?r7Oڈϰt|C&`|W) K!01u4bv+pcR[ف4[^u9{4tF^xe\JDgQkq}0|p<ؑ3"ٵpX A]p,YzwOi_"k/ݭQʱdAć S2#9z+56^ܞC3A ޳w+*`'^w#zr8r}dGy#jߛA8ֆkS:db$ '0ξ5D8c'^;i*A"Jx$n_[sn\VeՊ4 DDx -xybgk4޵͡w 5=G/C%bJok򛄍 6QGó,_j4i9 Sz5i-w's*TKnSo"f!*,ih$ͽ̘zXGXƺLֺuP^ZT$NqG3ӡB.u r!OUESJ/s_΂z6DҒF fW1DQTL 7&8&b7&ۏ8'T%S3H)vɰɇ>_n;sa2A(֩"]idAe1V8:& .Ldk\T=v2PS4RCh {D}R ܃*T6+݈ݶ/@e54JR'B"$R~Li%2:LE<]6Stf -$ +P Tj uX4}?VmhP6ϘZ2FR-Z v2onx7PX K1\@!iLPTlg(DuX! -(E(LnAT%+k*Gd;^d;SVQzc{---3+"'H氧drG -endstream -endobj - -4372 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /AINDEB+TeXGyrePagella-BoldItalic-Identity-H - /Encoding /Identity-H - /DescendantFonts [4373 0 R] - /ToUnicode 4376 0 R ->> -endobj - -4373 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /AINDEB+TeXGyrePagella-BoldItalic - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4375 0 R - /DW 0 - /W [0 1 500 2 2 250 3 3 500 4 4 250 5 5 667 6 6 333 7 7 556 8 8 500 9 9 333 10 12 556 13 13 444 14 14 389 15 15 444 16 16 833 17 17 333 18 18 389 19 19 611 20 21 556 22 22 722 23 23 778 24 24 556 25 25 389 26 26 500 27 27 611 28 28 556 29 29 685 30 30 778 31 31 556 32 32 1000 33 33 556 34 34 593 35 35 444 36 36 500 37 37 722 38 38 537 39 40 556 41 41 611 42 42 778 43 43 389 44 44 500 45 45 778 46 46 833 47 47 611 48 48 778 49 49 944] ->> -endobj - -4374 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x -endstream -endobj - -4375 0 obj -<< - /Type /FontDescriptor - /FontName /AINDEB+TeXGyrePagella-BoldItalic - /Flags 131140 - /FontBBox [-130 -271 1073 726] - /ItalicAngle -10 - /Ascent 726 - /Descent -271 - /CapHeight 681 - /StemV 168.6 - /CIDSet 4374 0 R - /FontFile3 4377 0 R ->> -endobj - -4376 0 obj -<< - /Length 1300 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -49 beginbfchar -<0001> <0031> -<0002> <002E> -<0003> <0032> -<0004> <0020> -<0005> <0050> -<0006> <006C> -<0007> <0075> -<0008> <0067> -<0009> <0069> -<000A> <006E> -<000B> <0053> -<000C> <0079> -<000D> <0073> -<000E> <0074> -<000F> <0065> -<0010> <006D> -<0011> <0066> -<0012> <002D> -<0013> <0045> -<0014> <0076> -<0015> <006F> -<0016> <0041> -<0017> <0048> -<0018> <0061> -<0019> <0072> -<001A> <0033> -<001B> <0054> -<001C> <0068> -<001D> <0043> -<001E> <0047> -<001F> <0064> -<0020> <0057> -<0021> <006B> -<0022> <00660066> -<0023> <0063> -<0024> <0078> -<0025> <0052> -<0026> <0062> -<0027> <0046> -<0028> <0070> -<0029> <00660069> -<002A> <004E> -<002B> <0049> -<002C> <0034> -<002D> <0055> -<002E> <004F> -<002F> <004C> -<0030> <0044> -<0031> <004D> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4377 0 obj -<< - /Length 6617 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xyyxSպ~cYe%jqhgPT 2R,:Oi6iMm8k/z( ؝pCv-%р@';zrNbAhuNnQ>?- ŋ_Z^Kۖ', E aEa ې#fmxf3as$ Igž%'d|'*Ȱu[F>Lv~J !;ET/ 䧄%$'$y3A-=%l[z 8}W$` bav@ۣ <94c|`rZ]s+ҟStH 9wq(Z6:3{ۇ$Cp/cs#^s޻F.{::}Rܻޏk\G?XP r`"p^= hbz;Ϸ^0FԊJ1HaΝ's 8ԉ1(V/@ * CR+)&^,,hU.0-Ew* 8FR3N%5izS2v;_ٗ!¥z+1<\=Op{ksb y$>yN¿z (H,Nőm*g#=䞀0W{؅EhbԞ_ )::⴩5uX""L*2P vCsU' U6_WgTjWd/j̫۷ @F@!VW: 񅻳0`{|g$~og1$<˙oCas[?~(*R95AWSUkwZq]ejEՄƺFl}S- +1iqXm?Y!AU.Z8[s$|H_x0}8>݆2kD߉H~ȡcd> 8&kkۚS7fE=nSlN ur_iHZB5yjT rJjDH"A8n胱O; z[r(]$+Sڏ8]Q.F5 -nWA[7WI2/#hm.ffg$B9KMՐ9r;Qi jPdl(RzGo=cKr88\% SGcr&;K tyM:*3.mHPP+*L3X:8و>S8+)]o^ ӷS+[i2d+i2lksvh -g` -v.Bwq_G$TOV&> -ntRl;ŷpE(sY>/&cϷiEUX =+!ڛϝeGI%c~YF85s栮fg cEVQ -0o‰2>sHFf\dڔHzDɉ4DhxVLCT㰋A1scLlK@ -Z\U'+1(6I)o*tNД0!˧_DENQҎ4ȶ)~8b`/IT萡pSZ>Q˭#4&W-)t`48# wP^ͣ DyO8j6wFp@I-\m>8i>5sLceadFສZc`T;f{B Q ٗDuIl~zFҨ[k+1g˒i*UʳiC#8S9].^ Ez]DhQfX -/ G8GZt=r/|ebYa #apBT@&D -_ooMɎx(聓0`p#gpQe9j!:RVYU`t>'ADLxMD: -dӡqpG|CMx,)ixeO]-50~]\^x!?G ; kcnG4 %t=!8Ǡl} Pct9 -Ygh?ecH\gá;AZӃW܈nz4JE2EiDZH ) WYx1v#x~k3~QVR9,>ˎA?E=.xt WZk9HjExV+&:B×W8}i -~FϵK`&;Ο6 6kkq ,]u"S$H%L%Oߖ΃AoދgZZ<.YsELJ@e5P7S_{9d.AuϑՈj.3 y]6!u~$`8lr~es(ԀS)v2N) z%@\#.v_R?2փ{T6Yh.Ŧ|GDuJr{;Yydz, pFFn4;Uu]Ҵ,2x 3 -ILeTUZ|Ln45r]Xmd9Fʍ7h}՚M]%oJBȑ[2F7j=_ao}4엪 -(²ۘMZ1OgID"i -" -aq4K-^_"cwf4[t>X>35΢THO.LP ݁SbGR_o/m -;VQ)Zp#`g""N&O.ei3n@1sk"kU0tu?|@B}ou~@(tjZYH`% "M<"oSl~FR4t3TÁZ@]Eo .D REPJTc.9^+R9}soF}44//Ti% 9!^]3D_?C#4 BW#'|LmCtѪ# t#xxrV. J:VS_m?d?Zio]gQjaxa`?nWJQAIگEcxy;޴\`֫qTl1rq[ _FzS_c>}%OOT]+y_i[G9zPWӥ}/zSbIO8$wv;x/~!t -&dΧXنoO pWюAhVeG6#;U_29{Bc$@fbL6_P+]Vϴ/s,2V* -=2 zYb,"ԭ6;wV(GPB)Zvy|l+NCm}-`[sapb2 5'i޸)(eiC#$P\(Ө@QJ -JpC)r5u64Rlq BD$ߥ -V NW%2Þ_#5wׁ5n|o>;hȓ%Nξ~֖jF/f:tf몟hp?k ^x# ̟.NDT?z9nU0mF_M<:GkY'ۀ<wnU3=5W%?:OntJ^bu -ar#ڎ_<>M>%%3 bo'{C|Ԉ7?tjDn[V!<L~ɴ: >UTF_m`W1hs:yS3ئ%ʥZO#&潄`^U9r zʭZzHGzZL^[@o_>99D;Tag*]ظ<>r5TZKK7SBQ'`kt[y< { -..]e\>]/N٧Aw{UqOo|CݜG#ήeqm(|Bk;w`PweAT Ifp_ -/}c6u.kf_7Uhee]3S4@%THsZT.ZQi_ڌ`;-35鞛A{8Io3 :s] NXsx,[>3yIB|=Toͣr*s(}JLp@N_c B#7=&/dt:2v[.UzOC!I(5Eς+?B\ox@XH7Y X~s w'H+!/''~} jU4-*ܗ퍀%dzܫofr@h\bnΓp -hb A4䕖o#ydΒɰ/"+U` -Y_#n](@2m-Ґ*{/c7踸}dSklf)::>BQZ b(jfN@ʴB'Ј,DN_ -endstream -endobj - -4378 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /FKQCWC+DejaVuSansMono - /Encoding /Identity-H - /DescendantFonts [4379 0 R] - /ToUnicode 4382 0 R ->> -endobj - -4379 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /FKQCWC+DejaVuSansMono - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4381 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 52 602.0508] ->> -endobj - -4380 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x~ -endstream -endobj - -4381 0 obj -<< - /Type /FontDescriptor - /FontName /FKQCWC+DejaVuSansMono - /Flags 131077 - /FontBBox [0 -235.83984 602.0508 765.1367] - /ItalicAngle 0 - /Ascent 759.7656 - /Descent -240.23438 - /CapHeight 759.7656 - /StemV 95.4 - /CIDSet 4380 0 R - /FontFile2 4383 0 R ->> -endobj - -4382 0 obj -<< - /Length 1334 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -52 beginbfchar -<0001> <0061> -<0002> <0063> -<0003> <0074> -<0004> <0069> -<0005> <0076> -<0006> <0065> -<0007> <0064> -<0008> <0078> -<0009> <006E> -<000A> <0073> -<000B> <006F> -<000C> <0044> -<000D> <0070> -<000E> <002E> -<000F> <0067> -<0010> <0045> -<0011> <0028> -<0012> <0029> -<0013> <0072> -<0014> <0079> -<0015> <0041> -<0016> <0043> -<0017> <0054> -<0018> <0049> -<0019> <0056> -<001A> <004E> -<001B> <0052> -<001C> <004C> -<001D> <004F> -<001E> <0055> -<001F> <006D> -<0020> <004D> -<0021> <0062> -<0022> <006C> -<0023> <0068> -<0024> <0053> -<0025> <0075> -<0026> <0066> -<0027> <0042> -<0028> <0040> -<0029> <005B> -<002A> <005D> -<002B> <006A> -<002C> <006B> -<002D> <002C> -<002E> <0020> -<002F> <005F> -<0030> <0050> -<0031> <002F> -<0032> <0046> -<0033> <0071> -<0034> <0033> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4383 0 obj -<< - /Length 9557 - /Filter /FlateDecode ->> -stream -x{ xTչ3df2!!$!@r,AABD̡9KтEjQFRh+Z)0Yg=y?qfwy -A޹.P JU}(~/.Xr~t'@O]%f7w̛miTT ()]Ppwŋ~c1B~/R~FM.Q -/-+_}^Ptټ=}z4͞D#hZ(8P}8[^qBDZ_14&8x -:S83˨e<\tpTMZp(|([\A,oQ,^vs%Kx@7QI씁.ve)cqPI43ZMRW)Y'xA:m>[2~+~ -uۍ GCߠRIQl74^V&|zۍ:]sm5xRl:h<RQrq?P7؍HiRirخg5SmP|tQ^< -U]*) {=nZBz[;='te|㧪]=JQg{?5E -54רS(i -$=)E K?ZwۜM+]PPjX _eͶm8)T4>lyzy`_2>;/zY䙛J`9I =VXJYֽQȬe[1a'E\U)4h -08)E(ԝQRyQN_i{S>YȢ\IVlfx尤Y!X:+0^ -*oS@WRIVcݨEcZm({#6))]H E]ݜ-q.p^:Ew+"vhln:5p_L=TȽx_zFu/:k_ޫii,3;?žA9ݚNtቭuxj- &Thp;$([vt΋CcGq99ّ0wJRF3_y[EغꚚutR)?`.wyNy_p4V|#xkj*SE) - -jc#Ħ[tkŢtJpYBrseXy6vmqVBARt-–MW',3LdeIVce}5F5XOj!)#h= ED8z1d?lcV-dyٟ!1e+@=e JrDJV46f=_}#}ֵg=kkqNJ +qۢtuW#PCѵ.6У-{h"]$p^n祳S\e`cǗD'x뫟_z>zݖ3gZ}xGEX: -e|uo.Ehuf)۞9ngL2>.gJB+^ƍ7b6 nqru6~}ExT<%[Mb:I4b8׵= r 7"ylÝϷqrz0ӽ <؊e77Kk۰Soovϴ}÷@e܇ -);L帒؅@e*FRcq]R EֆQMqaGz35}v't@7 tH#7u!ܣt@SŠ͡kW}n#k/usv yj]K?yF%{8Ňe_F{,,,'x> -cyիJ=Y_f347K߅˒|[').S^-Űݭvx_QF(´An 6?[SiJv5kwo\ϋ~"?Ȏ|k+JmK: Zu8F͉tGx=;f4wTYbGgg7γHy5j%\ MúM`q;O7e19-ٷy}N8xr^>6sx69$ґ5.zq`Zqj=:D9䁡DLVW_ah#T!XQD+ 3* r:Bâgx(Zq8 w0\6FMqϾ,wݺ"s"KJ?7c3}AbqY1GJX?W=-63+\YeUɡ&flŸ#l4~T.;v}fZlɀ"o F2셒'sUK\&͒L6l# -@z=Cj5c(L[Cp>oS2_N6uP(*UYcԒdD WWرKZ,>ɓZUŵ4V-*jnS% FSKz:gۑycel kͰW^qVaX{w{S_(ٓmaKг牁>oG@GWC|C>8O%? $WBZ.ҏ4޲Z O3}jFHی,k8}v#:Ăm1(~GX-o}ݻ&<@}@h_Od $? 0,_^&M%dr 7Yډ(%'Ũ+bt]]VlBWbUWgv3s\yƛTߝ';@kksXTxe4٩%d}%iʹog;2?|O(oxv򙙭y˟|@zV{*O 8}v( 5g/#@1oֲ[悊R[d-a ȶѲݹцa:''iMnmXaS_^:rXxU4OY +*CeUM7Ωy /*P>ŅŹ8x%y4*qy-#.+j1fMa+'Oy(!fް/=0_HO3c?fb(AuԌR@-S+RaVUG.a.c:\a1Xט]&9/c4jkҽS#ơ~ Wv~0Hox}ý{5x^7dP䠨Aуb2n⪨JUZ^eV٪B"bbuVf2ŰN]l‘k˞6y#{.a“/+?i}DY}iTg0hb2-ˢ)60 ` nI٦ijM7Ԍce ˈ3;fbebi򨏥a6tɌɒ+i2s0,쀸 [Z-7xjK -'(xCך!mRm6!˶ã۩N --dUh̆H^v9Ƚ޻WğGl˿pm3Ό33̈YcH4kH~ w@cFL ݻ"x\t-q怘%ϑ=yHwӀhv1öע ;,++Lv j1%ə93^]O!M`Eo4xrЏ&7oPܒw^i8=+>ٴw[e#n,i&YM=9w [-iq/y^0.I'6v5}I1YXW]!1- -#.gwͲ"M0ņ1# Q"9!;2£醹z2lGkVo#k|fͦUkr+]KW=P7'Ď'xCXvGl9.Q_]w2-*YiZ;4bC3임4{zF)4;Th$lgiybfSrx*Bc3o;Q2>}:zLwZhEjH^3S{*>d#<|Md') m[mⳲAC:xamo~x6&jc`VhW}x y:,o7FڗnB#yhdArW6.[-@jwƒ-,-ȑ0Zn>jI@e3yێS[gb]]a9=ESXC#1pwuw>G|n>dr%kׯ^Ħ7;v72Wd[r "Yu^5p}%p_OGjB5'm"^ĥ8(ڽ3YpK[G37%gl.3g޽OoZǦ5u}_q,6zGϼRle~6 -[U:M 7Y7饢߮oM?L=T`/QJ`=֣]@%l%HF 2q yAC6vjpG ] 6ό?(AHv|bX}x]ʟi=AoNq-_vj-dGK>yPkzɶĶ>!BbW>{B{ ]64UH"hPDDOa.pƿSo5C5sPfdtE|7z!J/+io[,mJƶi)o5 3{Jf/5>;?cXi;vMH}߳KsmM.tYSRiҞ~I.&^Xl|H>+]BSXlhSSڙSW|IMo/Kr3[q&K NRM+w)_Mtۮ{f[ZE󝔸 -Cbvo}Bo͌ѷYdް%DyxX*&_V':ߔ#FQޓA%Spyu3‰ۯ$dӘ9vq{{.VXI٬ҫX_+2Quq~;R#Phda) ƽ"LD1,0כ'K6!;(2I%azlÂ60%!o=Рc aBPBCDC011#0ɐBr)O2cpe\5%\wPsi!yh6N48b0ƴm)=~R"CCICޓ(J&dJnƋɣ͎-ނo[grIxJL L2kBI-;}`A'|gr -WW_. [6]З[poqwCb8}~.giWAvO_D8FG[ς>3#qccͧ!%N :N -\DW}$--t&cw~+7n ͂:, A6CzNM>L*d~p&5APc`}ukPio1A{KAVOA/ -v zy!ws\E?{6l=N?S3v$(C?vhm[C6A[C Ж-u zdz"jy`z|cCC&SI .Z/hvU?:V z*Uqo*T+¨Nn*= h%yZRڃ/H=hEtTr *4wN+h|N4K7=砙4wt~4AS=4EdAtd$AMt*/h -AШ4(KECܼ(FFq40;@4tKC -\|4*>U- \TШgU|p nd|V7}5*UdAv|b.AY:x߃ -x^1ˊFQ_A}=Q{o,*ق=<+єa(W8OPz"rxp%ݢݙiw&SO%CP0J,ɅtG% J ㉂y*O(UuԵK * K --(*G ȈtY@'H'r -[sW9¸EN0Q#vr؅ڭkttX#+O7)Y -endstream -endobj - -4384 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /GPMDBV+NewCMMath-Book-Identity-H - /Encoding /Identity-H - /DescendantFonts [4385 0 R] - /ToUnicode 4388 0 R ->> -endobj - -4385 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /GPMDBV+NewCMMath-Book - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4387 0 R - /DW 0 - /W [0 0 500 1 1 625 2 2 611 3 3 361 4 4 278 5 5 584 6 6 444 7 7 306 8 8 444 9 10 389 11 11 500 12 12 389 13 13 278 14 14 497 15 15 603 16 16 654 17 17 750 18 18 1000 19 19 722 20 20 500 21 21 613 22 24 556 25 25 500 26 27 556 28 28 278 29 29 466 30 30 722 31 31 278 32 33 500 34 34 485 35 35 576 36 36 977 37 37 837 38 40 500 41 41 828 42 42 466 43 43 444 44 44 828 45 45 778 46 46 738 47 47 778 48 48 722 49 49 625 50 51 778 52 52 500 53 53 600 54 54 1000 55 55 490 56 56 833 57 57 392 58 58 581 59 59 572 60 60 518 61 61 569 62 62 611 63 63 706 64 64 556 65 65 528 66 66 412 67 67 667 68 68 778 69 69 531 70 70 906 71 71 500 72 72 654 73 73 569 74 74 528 75 75 610 76 77 422 78 78 407 79 79 666 80 80 477 81 81 500 82 82 528 83 83 776 84 84 706 85 85 569 86 86 662 87 87 500 88 88 319 89 89 527 90 90 447 91 91 319 92 92 639 93 94 500 95 95 469 96 96 500 97 97 710 98 98 849 99 99 722 100 100 521 101 101 1000 102 102 607 103 103 500 104 104 571 105 105 778 106 107 278 108 108 667 109 109 568 110 110 394 111 111 583 112 112 278 113 113 816 114 114 520 115 115 445 116 116 500 117 117 831 118 118 595 119 122 902 123 123 732 124 124 667 125 125 759 126 126 863 127 127 917 128 128 759 129 129 451 130 130 530 131 131 517 132 132 593 133 133 1149 134 134 354 135 135 406 136 136 782 137 137 651 138 138 494 139 139 612 140 140 576 141 141 750 142 142 554 143 143 556 144 144 485 145 145 750 146 146 514 147 147 345 148 148 958 149 149 559 150 150 510.99997 151 151 639 152 152 278 153 153 1000 154 154 503.00003 155 156 389 157 157 1000 158 158 778 159 159 839 160 160 529 161 161 429 162 162 653 163 163 1139 164 164 1361 165 165 1000 166 166 778 167 167 500 168 169 667 170 170 642] ->> -endobj - -4386 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x x -endstream -endobj - -4387 0 obj -<< - /Type /FontDescriptor - /FontName /GPMDBV+NewCMMath-Book - /Flags 131076 - /FontBBox [-32 -950 1236 1500] - /ItalicAngle 0 - /Ascent 806 - /Descent -194 - /CapHeight 683 - /StemV 95.4 - /CIDSet 4386 0 R - /FontFile3 4389 0 R ->> -endobj - -4388 0 obj -<< - /Length 3246 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -100 beginbfchar -<0001> <0393> -<0002> <22A2> -<0003> -<0004> <003A> -<0005> -<0006> <0065> -<0007> <0066> -<0008> <0063> -<0009> <0074> -<000A> <0028> -<000B> <0031> -<000C> <0029> -<000D> <002C> -<000E> -<000F> -<0010> -<0011> -<0012> <2192> -<0013> <03A3> -<0014> <0067> -<0015> -<0016> <0070> -<0017> <0075> -<0018> <0068> -<0019> <0061> -<001A> <006E> -<001B> <0064> -<001C> <006C> -<001D> -<001E> <0077> -<001F> <0069> -<0020> <007B> -<0021> <006F> -<0022> -<0023> -<0024> <21A6> -<0025> <2026> -<0026> <007D> -<0027> <0032> -<0028> <0033> -<0029> -<002A> -<002B> -<002C> -<002D> <003D> -<002E> -<002F> <00D7> -<0030> <2115> -<0031> -<0032> <2264> -<0033> <002B> -<0034> <0030> -<0035> -<0036> <221E> -<0037> -<0038> <006D> -<0039> <0072> -<003A> -<003B> -<003C> -<003D> <0031> -<003E> -<003F> <0393> -<0040> <0053> -<0041> <0079> -<0042> <2218> -<0043> <2208> -<0044> <2212> -<0045> -<0046> <2254> -<0047> <0034> -<0048> -<0049> <0030> -<004A> <006B> -<004B> -<004C> <0028> -<004D> <0029> -<004E> <2032> -<004F> <2200> -<0050> -<0051> <0035> -<0052> <0076> -<0053> <22EF> -<0054> -<0055> <0032> -<0056> -<0057> <2217> -<0058> -<0059> -<005A> -<005B> -<005C> -<005D> <0036> -<005E> <22C4> -<005F> -<0060> <0037> -<0061> -<0062> -<0063> <0054> -<0064> -endbfchar -67 beginbfchar -<0065> <21C0> -<0066> -<0067> <0038> -<0068> -<0069> <2286> -<006A> <005B> -<006B> <005D> -<006C> <2209> -<006D> <2216> -<006E> <0073> -<006F> -<0070> <002E> -<0071> <03A3> -<0072> -<0073> <22A7> -<0074> <0039> -<0075> -<0076> -<0077> <007B> -<007B> <22AD> -<007C> <2227> -<007D> -<007E> -<007F> <004D> -<0080> -<0081> -<0082> -<0083> -<0084> -<0085> <2133FE00> -<0086> -<0087> -<0088> <2295> -<0089> -<008A> -<008B> <212D> -<008C> <210E> -<008D> <007B> -<008E> <2111> -<008F> <0062> -<0090> -<0091> <004E> -<0092> <004A> -<0093> -<0094> -<0095> -<0096> -<0097> -<0098> <007C> -<0099> <21D2> -<009A> -<009B> <27E8> -<009C> <27E9> -<009D> <21D4> -<009E> <22A5> -<009F> -<00A0> -<00A1> -<00A2> <0046> -<00A3> <221E> -<00A4> <221E> -<00A5> <2190> -<00A6> <2260> -<00A7> <2205> -<00A8> <222A> -<00A9> <2229> -<00AA> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4389 0 obj -<< - /Length 21370 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -x| XU6H_r2#1΢&㸌vEot@!d!aJhU;y7_wy99>}DG͙ קsZV\Oœ]hQ\ >]|ψY<}<mQ1ѱ̎陫32ǖ?>g[>ܥEܲ[ˊ seOϽckNn\a1/nn\^fAfZYfL\~Nܕ۶l_\ğ.wofQYܧ[97/ygO*.=S0{N3eOoܰuaOEYż܂n -M%.o"{qctsǜwn΁;b뮁;uflZ;&*:***1m\T'rG]m#u&Dl cd=;ww/3WJ}{0ne{}uC.w=;q~˹=;WPCϻ_G~Gzlcŏ_㉹O|J{GOv|ݛ׏nxu}j6 $lۚmmcG·wEJKT&~7ɜt={HN{9͓C'W޿>a{Ulr5>4l0U89ۦŞaqSa0ݔxuAnh:ڦ6@0BST+]V[u(EKg;H? -/a2Hƞ^bvqBQ׌*csQo׻. Ii!S1}%Cfp^m0/u -U)ʢ~r^ ubeg~{vWe j Tj4wAzz"Tc7ף x:6cI xދD] J[ P(P[Saro 5WYSwAWjet kZ\T*pѣkz&t^@^Ycqw@Qnuf"|?9DLlm6 k|r)\Жs)*PԢrַ -V䤃:=[ -:B6Q\k@fQ6re$kw^u\&gi'No qq.ַ ƌUר9G6:SpCᖮfGNEQZN[ )/:c3b&_Y+ϒEǚ-MN?@IBL T?Vm}_y.u+ԛ ik\20D "y 0*-J>S 86M'V(A -ʫv]Xܿv'' :62$p]{0͈a*hUmyU2O8L@Eޟ[WKC>b˞tayn~,kcy"e)b VݤEESM Ԑ#jnQz \&UpD @ά5H{Ӓw]m{ӡ7LF3]kEz굺ɻV?2 "5. |v&IoĜa)|Z ߍMSO6 -`MfZiɈm16a}s3), -n>Yg-cE'bR:? x ޡkZ:qTk 1jLڃ{Vw<ս -Z/~dQiwjtЂܢvL1w8&/o/ĭZÁ - *h@fV;@E*%sT]@5]mb_`WIvHNNH<YZ*.V0 mj(X(JA B |P5,W5]'j9l-&{xtA}9X+T"jnBЫA MੳCn!,~S#xbJr@L$H.FwCNylz&UJDJޒn~kov k;a,`Gr(-H39~wX՝7=/@1ټ]7~8ᎎ^*IW17}X3=1~*^N ^wۂTȉ,Q2$:+Q\=5R؉`$48+"ʠuFR;?_'=FarW@= -ԜUR/O!~}n!fb?BoG?M8lvCe N MkbAi6ۖ)"JfUrmS34m# ^[*PiT&CAZ.DݘL[+ Uz8d1yNS@0IK/d lҴ>;`qhP>u+@U -E%נ=?iAKp$v쉯@vE= v GL|;#>26Q$UMٔC2!ǡ/jոLV:V Q8Kxt:xWG@t\<*a t i/O>^*.}cCRNE -jt::ʇ*zsl "z߆7XC7`j SxZnE< G/0  -*aRZ4vt4AKQx$) -ABٮKxX*m qX-U\WÊ@Dj{ ww}66}zOHdƒca'ff 8NnPB&MxZ4_H 3&@`PfM-~T)=|=d_3R IZQO4kn3[b&Jq8mm76%\.)rahJă=zB߳c$' 0* -wmo~]eW%GrƢחq& -Z\Io#\? 3K"Iff뻴>ɔE ^htS5Ѵ"|5\aΓqj;~&od IR@XУiU6}%]]]\.wЩ5<ƫM5"ĪZU - P,U"pgp8C-Khlϋ:94eSəݣ\$c՞-XY՜#܏Hę?>q/YFuTX' -qk( ɻlOmVy*OKнI"㳽Gam a{yjJjJ627np"0r;=L$ R J$H|Nk!of:dEV~1tȆ򙾡 H`MMeS\l6 UWęA\0z*6_c6-]A/,z]-60s d@,Cxg +_q{&çZRI/NA -w"ly{}8vgsv|?z* -Ȯ  Q-Ջ dzAWih>z -{ CoaB}!݄2=W&U^a u,`Dƙ9ڙ=MZeW8vŃTa+]`3mvl`VD8Yn8-ܝӟNX*3b :4 c%5It_K=o62u;hw1qbGs[&[zNtY,.j!M%J*A uSIjԢv9C+ Fݺrc\ 1xˍ.eSOwBjEVvV( v^G5UhA:op4\gX|Dmr`"D2`}īPTjun+ 9qGCE68{;Ja+}߁Q8PWjfQQF˩!D=mفdH~F0RQ^)Ɂ.QCgP4Edw|=Tj# 9Xִs_,Xv7 [[uZr3t$6e KF%(E"}Q8KϾGL\aoĿƐgcR}ԥnj0UqAW턺\& -}rN u\ny8xz^c~G= -@;wJXZSX)(AcP&0m&7MZ.awx.!knvƐKP+q - vפdA -鼔D؄^M]]H[S g]5hoOd>(4,[f ¾HC] h6sB]&hn!yKSiZy<N=vSt}H衁ş!v\=9IcȝSOpVw3eRjm /{gyZd:r}EaQ~_Oxt9I?bGlw^+Z"Mt G&;N 4ez2&*X[LL3vsxkj 6i+A bv7kk\% YjQt\y`4NXo .EeX[H& RQ%s#PE#ʠVQkSʶj+r9Mr ^8n&Yv;3Dʌ5Qm87N~畮z^"J] - U{L64YTZĆΠń'Z!UTp5a:17}vq]!@B[ :5HΐZN5%]i*4>9uG'l:ڂd<",l9%NFT2Ʉڢ6*A2H@iT[ Z%H27bXd¢l4Od8|aj%zjj)z8WsƥlҵMf~jJ"D[6sĮ7rO^WM UإeJAMmyP+vXz\&ד AԮնpY"r\?i08lF>Ú`Z=2yPt̾e6 }wXſcCR묵Smzv(1 ˔jtb*tWKp j;wx78Vw5zGAe(ll y tA%1UkIJa* hܺZB6Rvy-M]@uoNxrsٟZ*(>^oC^(KbX+R 4UUZhyJ$I96HԳPf4݁d*U^GBV+@ -RҩF{qfvq$ߢ~&X0MFLmml˨~OX܏!e+MPt:АzbS[?-.9dm1J+Y{7$P5mw|l:irL4{j}V/MEW/s ?/ۛNgMY8"Ia,MߎôwT"PRvU/dbKfdz7ovGni%TBKľq@Ҳ7l7X^a\0&2qGBSC,L>}cރpWKjN4qGQ>RuV"VфF ˲rTɻkO_XQ8[D@̯AO :F-|TTH L -Ogpyxp^φp{b4D CH֮t:*f֗ipDLA\]C_#_Ɛf'qC^"utgKhMO X6B KdUA 5fRN*q,@wv5v~t Di8d!wqu?9uNztk\eUR9ab/ W}'cV#fN?*݃rVpfk*T}|O5X gYwϵ+uʽ_X#ddZ28;!tOigA+wKxM? O0 b{k1l -d2u TrړS$$V(4T5\ŕ"DSBkY&nz"PhrxT1s,2kΡ Za&u0) j"f"_#Q(h_ zь18-֢6 - Bڤ3`C=KfՊDkks,~Cbz@JA ;b@̼,.Nɗ:YWfvhJ`'rɂќNH"j Z;6t= P\U - 1I-uq3y1>tF}ɽ0Αp]k2!%~ Ae# A~VG0ԁ[R#֕4?2~G*kSxCAL,XA%ZUΚgvSwjސ*?Zt9oiyI9PvcރvGR WrPbPw z7yn9#87 5#SOS -8c^/V3@Wh5jij+Xo+5Ib+ZU.Yo @Ì6ôRDpqcK>zYT _Mڒ:8!iٌDP]Y~AKiP W`2t@AeH܀("⯥! bo;KDE!DE1 -:۪Zl7]]H'WAm|GSQ,bބoDoa5{Ł`}= A>:cj0P +5?mƯk Ď[p3~3qF;raE'¦Nulz8 4Ch !@VPbޖe@Eß_* -9 ֕sck@_Vc=Gˤ*C%2DcDHʉp}} UGJ%:cp91&J gѾOc0A'` -Kɗ @qP7Kb?Ozx)5r$%y;Ϫ7:aj(L(qƺ\-DZіuP=3a,.4SP($0m_#{ & `'•+.<ڵq4/Ɋ%$=:JKN2Oa8E/f6#ɑ҃ӈ|}X;zth4 09F%ľ M80YޭnXh:ʞ>VI$VY#>tת\B.siy/9?˺> -`y 16|#qHWoLYaUhxX Y̎s 5t#NyYpD88-V.~nRIVu!Q=T3։glHߙ VCf@-\n]?pt_(KۖqU0c; oΑsӵtXeWxdLt8U9G?pix#XGiKAWP u6wp(WXliy0u,F1l9(*9&3 ,$nY&E<@ؠqp -N>Ca#D33 =_28p*mfl'9$xV*%u/rZz`z^B5pnFWfVʌ ʋJ6l)wVZvR/N9㕑P7~`C\|g.5t5kwٰp놤 ՠi@y1f s:ҽ7do8p#tl-|(RmԽ@=|SI*?m)DbەeqMEaFTj,5꺪j `p: =^WiD L_ɐi(0LOIeQ@wt 7E>v8\.U'G{qQ_ZOcL_-(CeU͝mmԸ̝#cM'Xs!G\殞Ű 62QBfF`$Gדёѓ2Q|wvb;=lয়z3 slްm!)a=-7\mmg?al,ALj-FbMjAΤ5m\̽Yx{>~}s⑈d4e?^[kPSEnceЙfq]bQc_|5W'!}5m-ڨ5i,~{^_*H-ZN YLmK%gBŒX7.YK+⿒!6F)!j%Q Tʇ 1ގ=e:e!|'¸n(|>϶lFB ]%t -{ĥ\A*U}Io4~B\]M?EYܓpihxhN±@,* y36Ww6X&:lNo$I3@#ݧ6j @r\ĥF7pgulPzR JⷰG&8uϣ>! [k j1#e`wSCce* nzvTyReVW6U C\TSyD[ zkZh7Y~GQ;fk5Z-BMe3Eoe -¶0mAWԁKiRT+eHs3@5dG=׽gF: "[{ Ԟ:![#q,&}uI.bw67wrW24? V 29'/%jIQ |gxSR-mD-=wԡc#=mu3 BNKM] [!*=?5|l09̣eWK[q}5kɆ;|-mN*MBk9b}jOBQ"aqM5Α@p9\Zz 7kщ & -}N&B?kZ6|స\nz5B()+b΢grQ%ؚ!xSFXn=J hvSr<<BAFJ^aB/Q|eoJϦUnRV)5(o3u_QP9+e}-ŒCNP4HŒoMuzUvDwwh[e^o "^(DL* c10#ãO`MR+ 8e $`˽q^"ĿgSXc0j ·!1UǒzIc1%2}(i'ce~Yf8 ~dv?$Ų&>e_s?.y{%Scgg)&b}'eP>N?7u~n`ݜ$o#9=99=9N'evܧ7X*cY]$uX=GaɊّMlAV`í6GB+@JQ!/hdP ج]|k -5Ti0@ -EPj4Ann' !/1瑅m1`Ϊ6!*Zʨ}':QT:TQe"LV`5,K_x)?ǜwq3g}G.`ܱRD%B(=⠺IU ~ʠB! axVD-wI6?/{żpSH[ Bt \e6 qd w!hyxH8 \<|.C/cb&0Qx0+Z֦sȥrpx Q"^{_u?ʨuuœ O6!.Խ7#}#/NbgAW+[Ԅ1rԛfЈ*7IV$f''Kڭҷ}8%hGIICC;!8okyPG!  ud^ԭ&ʨkU/Cv1v?]G:abT"V$wM]iMS*+4X^CPk-4;U.R*}5t 8,qzC: zLKinX(a#lf)QeBΐM^=ގPElHQ Eg֛NOfsZgV5ii[;{;s댹-Ni "]}hh/@ Z%Wm'#6dclnO;ߖI݅7HMiBY%K5zN1Iv_Cq#ګ vhЉP=]5-dЗrA`oqϴ(_do -y];EEA}a=O[PjkjuI9ThHrqXRgԦ1V p%juqi^izoO.EBwDQҐٛXPa[9;c4zɸ^s)oڇaE!N -l/Z)%5W # F@Jz*ԩy@ Ar7%ږH%̸PV[-PO>uw6c$GURԃzob}v2- - eu4pU G - --pdb/uEA~OQ.tA -$x3*TV䀤*Kg XLv[CB,eS CI.=W DroVaQ>E+ `1:Ƣ)=D5 d]:CmQN+}N5RHTRCG0ٽ梢`9al ыޜM7'rԨƥj:0!_RbgyR3i=G8f;XUc5q⌧Gxf=F}_4| [IcI;2\,+.&Q$PGb_U -S lrXWҩٳm - ^OnC: [%mO=H]쳈B=(5N^[ H$,`- -s>0C3]+,njW ˋkx8 nװkj991jʿVqy7AG36VKV(sYKѿ\bUKs"4}'"d٦3#FN:@LeRe1Ssq={Ƈ96Fx=a4`P1(@Q+;*8kXjЛ9f'PVO>kr'LK`2'Gb Bv=x<D)7 KajQ7 V zpbv \B6&,t= a|8q_|lJK?}nھ/ ܐAg[FZ2Eb‰ƣaĺy:Io:zg:_RnYMNaZZnZnRN@N`% %uovSҳҳ+W15 j b# &vAH+8j뷬Ϧl/ݚєK|.Hm:=:#zd:BZ2vfJ!Ydbݼ顷羻dkuz#|X3jָ)늓[i'}IMI$816`1H!$ & 1vpl8nW Mi\|q֕vZJ蜳>})1ى -ƷI,%иX+s=!DH*J&ĖD?*CQ -dHW8d2_HXvg}cP߄pwX"cѼo^yAHfjV٠7;.@nEV>ԪBDgMЙ(!kW/n,e{dnB.xz[fv~㉐`dC>BU>-` VT/ s[1ȸ|.ZeAmTbciQ>Xhf Rz@SWׄčYx?2e,<Ë'^[&;"ۧUgO1RxT[Q\.)b(6.aM3a!хdì=.i(\j -!8 }l50R;Μ+l_gǃvSwc)=H)Ίrg3S^οMޔV}U6`i0 WkADhGfjMJL\./sv99/3Ե)@GvDC|Ijbu"1[ MRnaRejGuz .h4:;?kYA-u& -ͪBienF/z@=n A4[ ( 00wڻu‡T#;r@~5WPl4TtEEQ C]ΊlWۗZz]K @.jP{/zOE1q(ZCF4|*Xr{cdϛ]x EO]yj]txF{:-vJnebe$G"@)y !ԨX)r"{gL rſzӺ7uɺ|MKm#sa*,*@UIl'`. !aQ!*+%j A5\Ҏ77/KQg:2j2m =`k5vm|@1Q' ~zϋߩޕ^sL/RعEά$HL~ ?1oGg:* soq(;+ "UVe[I u>a3}o ⇤xc1g 7@k`&@,84w)HdRiJd\i,+R@dy%.,SJp~`${9JI ;-zQ^ƩPEL7}7p- vn4Xz+e@*ā-}.y*;2^[/L_eJݎ,{-ʖg~vDɗ㳞?kj%zAb;`o]r]E v,0ubũUP &X\x3&QW`c~|,X-zhDwR7#"  8(HL͌Ij IRs\4DGA߸}ÎGvq9%[dbP@Q zQҬ`}wGoD, -Ο/P܂_ u$ͻgHIedDzAvWt+B\f+et%&Zg;Gz ¹]pvbkuR3ϏK=j M8 z@(T1SY)P~ -k,^!}~q/\sgϺ='"xk{֢>h531RGzz=3oql~5^g1e2e- b 4# ~` IkAub ~x^ S D$Ek64{ažV)) -M;.%*xG9v_ނeœ7\{1@I(VT% ~u(.X^G 'A64rr1 hQ3^]VW ub⳿/;Ȫ1B Ꚍann}҈p"DW"k[體P4TŌg1@gF(A,_ Z bgZGeE?UwQ\w(sdd;=u0 {2 2{80j;'4zhnD lu.mGEQGh(eNE޾L[os5<q :^ kv%þ${{C7 -ׄd 9~Xp?eZ3YC17HR|Wd vP+JQHqٛb2a[;u,$!_BbN,~1ѣ hAi8/8{0bWf;)IW@?~bhK?Yl5E$ i6sqCtpӉR{@VU]oEW!YAlm<-[KClA.3jo:l?F&877jQj_mo -dSTq@]-!.,ZF/A4I#QPC8'aM8ؗF/IGj}kE/<8֒ƚ~}_P(( *7-IQ#{q7Ӹ462@亰 nd|IcD>rFiKMBk%eЍo1X}VNV^ZqZf%_ :g59^^Xv-G3t8bL\/ʵGZ ZKȲ5i !0m^ld C2RٳSK6ugT<;Tt҄g|TV -|ZvYhV[hcNxb2:D露x'I8BYSk~` fkʠ40=WqTQӠY|k;׸ε̍+2t K( MZL`˴aa ndҤɾy2lg mF u~$(cڙ(nBbZX0jL4DYKi{^f1A ЂNU'9 dwMN}{&KJS2hٗڕ6C],\wK{IzZ-fo^Xvk B}Yqڨ'mZ=NZQ+ceiu\)W -j3TJ*ն8tuV$t:h~|RITUrQna:Pŋ=›+K}i*T13D"["uF_\T(kerJTW&!E_ @'c0l"~qsBEMAAazkZYkzԊ_Zp_Caޖz;\B'p ocL8NJka%zn !5D]Bt%qe> -endobj - -4391 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /ZXCGTT+LibertinusSerif-Regular - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4393 0 R - /DW 0 - /W [0 0 500 1 1 375] ->> -endobj - -4392 0 obj -<< - /Length 9 - /Filter /FlateDecode ->> -stream -x; -endstream -endobj - -4393 0 obj -<< - /Type /FontDescriptor - /FontName /ZXCGTT+LibertinusSerif-Regular - /Flags 131078 - /FontBBox [0 0 500 698] - /ItalicAngle 0 - /Ascent 894 - /Descent -246 - /CapHeight 658 - /StemV 95.4 - /CIDSet 4392 0 R - /FontFile3 4395 0 R ->> -endobj - -4394 0 obj -<< - /Length 619 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -1 beginbfchar -<0001> <2023> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4395 0 obj -<< - /Length 344 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xcd`aa`ddLJ-*+-N-L JM/I,ɹ!#CAAB<=EFBOVY \ (>񨀨W< ̌l|ގ)I)y%%E% -BHFY -EY% -%Ez L 8Θ;u3VNe4]yn\oMOQ4@!!&FFߔ?^cCe/s7ˏ~:nn}wߓX+ -bW}c3wOd{||95~Rl; -endstream -endobj - -4396 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /LCCCWY+DejaVuSansMono-Bold - /Encoding /Identity-H - /DescendantFonts [4397 0 R] - /ToUnicode 4400 0 R ->> -endobj - -4397 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /LCCCWY+DejaVuSansMono-Bold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4399 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 8 602.0508] ->> -endobj - -4398 0 obj -<< - /Length 10 - /Filter /FlateDecode ->> -stream -x -endstream -endobj - -4399 0 obj -<< - /Type /FontDescriptor - /FontName /LCCCWY+DejaVuSansMono-Bold - /Flags 131077 - /FontBBox [16.113281 -176.75781 602.0508 742.1875] - /ItalicAngle 0 - /Ascent 759.7656 - /Descent -240.23438 - /CapHeight 759.7656 - /StemV 168.6 - /CIDSet 4398 0 R - /FontFile2 4401 0 R ->> -endobj - -4400 0 obj -<< - /Length 717 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -8 beginbfchar -<0001> <0052> -<0002> <0045> -<0003> <004C> -<0004> <004F> -<0005> <0041> -<0006> <0044> -<0007> <0055> -<0008> <004E> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4401 0 obj -<< - /Length 4326 - /Filter /FlateDecode ->> -stream -xXypTǙ^ϥc B\bFBpY⑑YB 4#Fd#&)qd ^(En[8*d7HȘVvf~0)nߛ/oYR Ђ~}U hC 7l Xis"}wv Ζ&뿋hӾnUh960Xg, uXW8V@ Я,e'pj c\62,`9j-Y. +{Hz*ѧe40N칪>NBc)hx g3qcylc,Wb6qp?g`q|2>>ȟ)>Ua:Yך+<;O-Dl.XZg+6 .3ŋSx Ϡ\u| gh)?,V`ɯ$c?zʒΊ|8>u -|~-2ܰFaKG]~͛u[<[{:/Tm]QnV3-!VX\fs|bcDi=*R0 Kl -bΎ)]Yv's\#C#"^H:,ve.,s ~[DtE"7evFLgvƈqό?> bG}#ƣ>v׃wAu+-Ah ras#d)dv"WpdUS8qHpdNc 8EVXKlV0C_Vh+KmqudO~k'Tmƾe\fo\Ƴgx!cz>ܘ=b.rӲxR|PL@+?)3_w>kc+Y׸`|x_{>fV9FxQoV>73 -f9,;SfkN9pMY++w4Ov]lkƟͥ#ءC1>Rob^1|v4gZ4Ւg!0϶c# PԌKiycl{0ե1e -;ŽY؞+{*Ӎ;>{߃8k=ԯ\'̶Mw^KDG.K`P;QcwFu~I"%!"8Wp1"1,=ZPδkX0,BPXp'A`l3plk?6a>5zR#̶lٶ!՘`1ΘtDjt"Bv"n0-(A Çf ݈] QJtE hXqyFatAB(GЄ- )G$}hC|hGZCIMi(a=:сN܋N#|#7KqAc8/* -ݦbBnİ(F zP8:у. ,vIEЁ0& -P"RFF ŨfюN|EZV67@_LEcYvÇN~)YċJlT6)?*{ãTU6nb33^YD3NӗSfd1>Ǜ"E3b2),׏,ɑsCWމO` z(k>hCF9Yk_^3υ1MĝЉz$16!遈X#С(J2"rwʈx(?Q=RÂ舶e,c73~}'zPm{)*ϔṇRYHVgvQh"S'M\* aH<5&9]2!m4qs9 ;X 1n !pEǍMؤ{@&3O1i+FQ߸Qع](&Eo5^+9b?]qUgتK(QA'%uLDsZMr@V碪';{*-8[GZ -i5(b 6b P/*PZlF%Qr2#sj܂JXMKaԣLb7'EZ#P˹*mTA֢^bGQ)mQM(UjP+bIVdz ֣XufoE5]3sɴLj$jlBw7uES lkkPoR!H(FQ:4k% ai9R\oȬV]Ŭ֌haSo FV -T GqV"JM?Rz(0DPQY=:>)*"e2n/<4LIm|t&ˎ%&P -HJjS[^8n&s›Z!*e$Ƣ/"nUE?DY *QRzQ6qdgbL7dPX #(:)j'#\wU`bNǪ iM.VN7vW{I&;ODnl\djhUΏDTbH}m-u`gs|j QWbnXrsHV1O(uaܯ=.<#9h@ v_0yy0dx-?w~ z=D} n:AA?2̫i0F$ŠW_~$ܫ|R#O ANM_X_4Ło/<__XKϗss}ߠ 3]w/e7 [Ơa?y:Oe҉']tOcGc==OG{#Gӑ<:F;>zԠG.Hzeʠ`@Z=v?f}!kЃux<.Q5RguDyDUt_e*3h05{:elfY3 /kîO3h44Mpڢgyije3hr. 3 +䂇Lʝ)lNM)NM)NrmTnsMyh85CnvnqeԹCpiiIK#g:|-_] -endstream -endobj - -4402 0 obj -[/ICCBased 4404 0 R] -endobj - -4403 0 obj -[/ICCBased 4405 0 R] -endobj - -4404 0 obj -<< - /Length 258 - /N 1 - /Range [0 1] - /Filter /FlateDecode ->> -stream -xuJPFOUvDD@`]\ -FMkIRB|&إnऋ(HrTų9` ըa&ʺ:l -3Ŭ*ުnh)&C|>b纝黓AvCƫ+ y') -̵8+/> -stream -x}Kq?UX 94%MQKSN#ԦQvBˡhFk ! -ՠZP~xx^ޗQx"^P c!H0 - 0l+ߣy7;׫;Q?V._tF3LEK)y z80eIPkT/%[p:8+%d"G `d_{ٹ֖gzm\8rSif1\CU` S] @o _ -endstream -endobj - -4406 0 obj -[4743 0 R /XYZ 70.86614 563.1574 0] -endobj - -4407 0 obj -[4743 0 R /XYZ 70.86614 227.6214 0] -endobj - -4408 0 obj -[4756 0 R /XYZ 70.86614 473.5624 0] -endobj - -4409 0 obj -[4756 0 R /XYZ 70.86614 189.85742 0] -endobj - -4410 0 obj -[4743 0 R /XYZ 70.86614 270.0724 0] -endobj - -4411 0 obj -[4769 0 R /XYZ 70.86614 546.0924 0] -endobj - -4412 0 obj -[4743 0 R /XYZ 70.86614 751.3704 0] -endobj - -4413 0 obj -[4787 0 R /XYZ 70.86614 660.6094 0] -endobj - -4414 0 obj -[4787 0 R /XYZ 70.86614 224.9267 0] -endobj - -4415 0 obj -[4799 0 R /XYZ 70.86614 484.6444 0] -endobj - -4416 0 obj -[4787 0 R /XYZ 70.86614 766.8504 0] -endobj - -4417 0 obj -[4803 0 R /XYZ 70.86614 438.3524 0] -endobj - -4418 0 obj -[4808 0 R /XYZ 70.86614 766.8504 0] -endobj - -4419 0 obj -[4803 0 R /XYZ 70.86614 592.29944 0] -endobj - -4420 0 obj -[4817 0 R /XYZ 70.86614 651.1064 0] -endobj - -4421 0 obj -[4817 0 R /XYZ 70.86614 149.31738 0] -endobj - -4422 0 obj -[4820 0 R /XYZ 70.86614 212.80957 0] -endobj - -4423 0 obj -[4812 0 R /XYZ 70.86614 162.83142 0] -endobj - -4424 0 obj -[4829 0 R /XYZ 70.86614 141.41962 0] -endobj - -4425 0 obj -[4836 0 R /XYZ 70.86614 326.0504 0] -endobj - -4426 0 obj -[4840 0 R /XYZ 70.86614 193.52795 0] -endobj - -4427 0 obj -[4844 0 R /XYZ 70.86614 367.3716 0] -endobj - -4428 0 obj -[4829 0 R /XYZ 70.86614 554.3584 0] -endobj - -4429 0 obj -[4848 0 R /XYZ 70.86614 358.31302 0] -endobj - -4430 0 obj -[4852 0 R /XYZ 70.86614 403.732 0] -endobj - -4431 0 obj -[4848 0 R /XYZ 70.86614 443.95 0] -endobj - -4432 0 obj -[4803 0 R /XYZ 70.86614 766.8504 0] -endobj - -4433 0 obj -[4874 0 R /XYZ 70.86614 461.0124 0] -endobj - -4434 0 obj -[4884 0 R /XYZ 70.86614 442.8364 0] -endobj - -4435 0 obj -[4899 0 R /XYZ 70.86614 266.8504 0] -endobj - -4436 0 obj -[4917 0 R /XYZ 70.86614 483.2844 0] -endobj - -4437 0 obj -[4864 0 R /XYZ 70.86614 344.5394 0] -endobj - -4438 0 obj -[4921 0 R /XYZ 70.86614 562.8894 0] -endobj - -4439 0 obj -[4925 0 R /XYZ 70.86614 644.3064 0] -endobj - -4440 0 obj -[4921 0 R /XYZ 70.86614 703.17444 0] -endobj - -4441 0 obj -[4941 0 R /XYZ 70.86614 614.0324 0] -endobj - -4442 0 obj -[4864 0 R /XYZ 70.86614 519.0904 0] -endobj - -4443 0 obj -[4947 0 R /XYZ 70.86614 460.6354 0] -endobj - -4444 0 obj -[4956 0 R /XYZ 70.86614 573.4164 0] -endobj - -4445 0 obj -[4973 0 R /XYZ 70.86614 703.17444 0] -endobj - -4446 0 obj -[4976 0 R /XYZ 70.86614 689.5124 0] -endobj - -4447 0 obj -[4976 0 R /XYZ 70.86614 171.0354 0] -endobj - -4448 0 obj -[4947 0 R /XYZ 70.86614 566.8764 0] -endobj - -4449 0 obj -[4998 0 R /XYZ 70.86614 687.9334 0] -endobj - -4450 0 obj -[5009 0 R /XYZ 70.86614 716.8364 0] -endobj - -4451 0 obj -[5009 0 R /XYZ 70.86614 150.51141 0] -endobj - -4452 0 obj -[5053 0 R /XYZ 70.86614 593.8784 0] -endobj - -4453 0 obj -[4998 0 R /XYZ 70.86614 766.8504 0] -endobj - -4454 0 obj -[5066 0 R /XYZ 70.86614 682.9724 0] -endobj - -4455 0 obj -[5066 0 R /XYZ 70.86614 331.1374 0] -endobj - -4456 0 obj -[5066 0 R /XYZ 70.86614 302.23438 0] -endobj - -4457 0 obj -[5066 0 R /XYZ 70.86614 268.1104 0] -endobj - -4458 0 obj -[5066 0 R /XYZ 70.86614 233.98639 0] -endobj - -4459 0 obj -[5066 0 R /XYZ 70.86614 199.86243 0] -endobj - -4460 0 obj -[5066 0 R /XYZ 70.86614 179.40039 0] -endobj - -4461 0 obj -[4756 0 R /XYZ 70.86614 101.267395 0] -endobj - -4462 0 obj -[5066 0 R /XYZ 70.86614 117.95239 0] -endobj - -4463 0 obj -[5095 0 R /XYZ 70.86614 766.8504 0] -endobj - -4464 0 obj -[5095 0 R /XYZ 70.86614 684.9404 0] -endobj - -4465 0 obj -[5095 0 R /XYZ 70.86614 650.8164 0] -endobj - -4466 0 obj -[5095 0 R /XYZ 70.86614 616.6924 0] -endobj - -4467 0 obj -[5095 0 R /XYZ 70.86614 582.56836 0] -endobj - -4468 0 obj -[5095 0 R /XYZ 70.86614 534.7824 0] -endobj - -4469 0 obj -[4756 0 R /XYZ 188.99736 745.5764 0] -endobj - -4470 0 obj -[5095 0 R /XYZ 70.86614 486.9964 0] -endobj - -4471 0 obj -[5095 0 R /XYZ 70.86614 452.8724 0] -endobj - -4472 0 obj -[5095 0 R /XYZ 70.86614 418.7484 0] -endobj - -4473 0 obj -[5095 0 R /XYZ 70.86614 370.9624 0] -endobj - -4474 0 obj -[5095 0 R /XYZ 70.86614 309.5144 0] -endobj - -4475 0 obj -[5095 0 R /XYZ 70.86614 248.0664 0] -endobj - -4476 0 obj -[5095 0 R /XYZ 70.86614 213.94238 0] -endobj - -4477 0 obj -[5095 0 R /XYZ 70.86614 193.48041 0] -endobj - -4478 0 obj -[5095 0 R /XYZ 70.86614 132.03241 0] -endobj - -4479 0 obj -[5127 0 R /XYZ 70.86614 766.8504 0] -endobj - -4480 0 obj -[5127 0 R /XYZ 70.86614 719.0644 0] -endobj - -4481 0 obj -[5127 0 R /XYZ 70.86614 671.2784 0] -endobj - -4482 0 obj -[5127 0 R /XYZ 70.86614 623.49243 0] -endobj - -4483 0 obj -[5127 0 R /XYZ 70.86614 575.7064 0] -endobj - -4484 0 obj -[5127 0 R /XYZ 70.86614 514.2584 0] -endobj - -4485 0 obj -[5127 0 R /XYZ 70.86614 466.4724 0] -endobj - -4486 0 obj -[5127 0 R /XYZ 70.86614 432.3484 0] -endobj - -4487 0 obj -[5127 0 R /XYZ 70.86614 370.9004 0] -endobj - -4488 0 obj -[5127 0 R /XYZ 70.86614 336.7764 0] -endobj - -4489 0 obj -[5127 0 R /XYZ 70.86614 275.32843 0] -endobj - -4490 0 obj -[5127 0 R /XYZ 70.86614 227.54242 0] -endobj - -4491 0 obj -[5127 0 R /XYZ 70.86614 166.09442 0] -endobj - -4492 0 obj -[5127 0 R /XYZ 70.86614 131.9704 0] -endobj - -4493 0 obj -[5155 0 R /XYZ 70.86614 766.8504 0] -endobj - -4494 0 obj -[4806 0 R /XYZ 70.86614 408.4204 0] -endobj - -4495 0 obj -[5155 0 R /XYZ 70.86614 719.0644 0] -endobj - -4496 0 obj -[5155 0 R /XYZ 70.86614 684.9404 0] -endobj - -4497 0 obj -[4829 0 R /XYZ 70.86614 211.88239 0] -endobj - -4498 0 obj -[4806 0 R /XYZ 70.86614 322.02838 0] -endobj - -4499 0 obj -[4808 0 R /XYZ 70.86614 259.5064 0] -endobj - -4500 0 obj -[5155 0 R /XYZ 70.86614 650.8164 0] -endobj - -4501 0 obj -[4840 0 R /XYZ 70.86614 436.0584 0] -endobj - -4502 0 obj -[5155 0 R /XYZ 70.86614 589.3684 0] -endobj - -4503 0 obj -[4844 0 R /XYZ 70.86614 551.676 0] -endobj - -4504 0 obj -[4848 0 R /XYZ 70.86614 766.8504 0] -endobj - -4505 0 obj -[4874 0 R /XYZ 70.86614 766.8504 0] -endobj - -4506 0 obj -[4852 0 R /XYZ 70.86614 530.7204 0] -endobj - -4507 0 obj -[4840 0 R /XYZ 70.86614 690.6024 0] -endobj - -4508 0 obj -[4874 0 R /XYZ 70.86614 273.1394 0] -endobj - -4509 0 obj -[4836 0 R /XYZ 70.86614 249.72339 0] -endobj - -4510 0 obj -[4836 0 R /XYZ 70.86614 626.2924 0] -endobj - -4511 0 obj -[4884 0 R /XYZ 70.86614 166.1914 0] -endobj - -4512 0 obj -[4899 0 R /XYZ 70.86614 531.0484 0] -endobj - -4513 0 obj -[4820 0 R /XYZ 70.86614 481.9704 0] -endobj - -4514 0 obj -[4822 0 R /XYZ 70.86614 552.6725 0] -endobj - -4515 0 obj -[4822 0 R /XYZ 70.86614 114.11548 0] -endobj - -4516 0 obj -[4905 0 R /XYZ 70.86614 733.27637 0] -endobj - -4517 0 obj -[4905 0 R /XYZ 84.86614 575.9684 0] -endobj - -4518 0 obj -[4905 0 R /XYZ 84.86614 676.9084 0] -endobj - -4519 0 obj -[4905 0 R /XYZ 70.86614 397.0664 0] -endobj - -4520 0 obj -[4905 0 R /XYZ 70.86614 133.45135 0] -endobj - -4521 0 obj -[4905 0 R /XYZ 460.86523 491.3384 0] -endobj - -4522 0 obj -[4917 0 R /XYZ 70.86614 356.8594 0] -endobj - -4523 0 obj -[5155 0 R /XYZ 70.86614 541.5824 0] -endobj - -4524 0 obj -[5155 0 R /XYZ 70.86614 507.4584 0] -endobj - -4525 0 obj -[4929 0 R /XYZ 70.86614 111.99536 0] -endobj - -4526 0 obj -[4929 0 R /XYZ 215.36813 305.1084 0] -endobj - -4527 0 obj -[4941 0 R /XYZ 70.86614 123.72339 0] -endobj - -4528 0 obj -[4941 0 R /XYZ 70.86614 101.267395 0] -endobj - -4529 0 obj -[4941 0 R /XYZ 424.47882 581.8794 0] -endobj - -4530 0 obj -[4941 0 R /XYZ 448.44293 568.2174 0] -endobj - -4531 0 obj -[5155 0 R /XYZ 70.86614 486.9964 0] -endobj - -4532 0 obj -[5155 0 R /XYZ 70.86614 466.5344 0] -endobj - -4533 0 obj -[5155 0 R /XYZ 70.86614 418.7484 0] -endobj - -4534 0 obj -[5155 0 R /XYZ 70.86614 370.9624 0] -endobj - -4535 0 obj -[5155 0 R /XYZ 70.86614 309.5144 0] -endobj - -4536 0 obj -[5155 0 R /XYZ 70.86614 241.26642 0] -endobj - -4537 0 obj -[4822 0 R /XYZ 70.86614 260.2793 0] -endobj - -4538 0 obj -[5155 0 R /XYZ 70.86614 207.1424 0] -endobj - -4539 0 obj -[5155 0 R /XYZ 70.86614 159.35638 0] -endobj - -4540 0 obj -[4973 0 R /XYZ 70.86614 111.99536 0] -endobj - -4541 0 obj -[5189 0 R /XYZ 70.86614 766.8504 0] -endobj - -4542 0 obj -[5189 0 R /XYZ 70.86614 732.7264 0] -endobj - -4543 0 obj -[5189 0 R /XYZ 70.86614 684.9404 0] -endobj - -4544 0 obj -[5189 0 R /XYZ 70.86614 650.8164 0] -endobj - -4545 0 obj -[5189 0 R /XYZ 70.86614 603.0304 0] -endobj - -4546 0 obj -[5189 0 R /XYZ 70.86614 568.9064 0] -endobj - -4547 0 obj -[5189 0 R /XYZ 70.86614 521.12036 0] -endobj - -4548 0 obj -[5189 0 R /XYZ 70.86614 486.9964 0] -endobj - -4549 0 obj -[5189 0 R /XYZ 70.86614 439.2104 0] -endobj - -4550 0 obj -[5189 0 R /XYZ 70.86614 377.7624 0] -endobj - -4551 0 obj -[4973 0 R /XYZ 246.03696 507.1394 0] -endobj - -4552 0 obj -[5189 0 R /XYZ 70.86614 329.9764 0] -endobj - -4553 0 obj -[5189 0 R /XYZ 70.86614 295.85242 0] -endobj - -4554 0 obj -[5189 0 R /XYZ 70.86614 248.0664 0] -endobj - -4555 0 obj -[5189 0 R /XYZ 70.86614 186.61841 0] -endobj - -4556 0 obj -[5189 0 R /XYZ 70.86614 138.8324 0] -endobj - -4557 0 obj -[5221 0 R /XYZ 70.86614 766.8504 0] -endobj - -4558 0 obj -[5221 0 R /XYZ 70.86614 732.7264 0] -endobj - -4559 0 obj -[5221 0 R /XYZ 70.86614 698.6024 0] -endobj - -4560 0 obj -[5221 0 R /XYZ 70.86614 650.8164 0] -endobj - -4561 0 obj -[5221 0 R /XYZ 70.86614 603.0304 0] -endobj - -4562 0 obj -[5221 0 R /XYZ 70.86614 568.9064 0] -endobj - -4563 0 obj -[5221 0 R /XYZ 70.86614 507.4584 0] -endobj - -4564 0 obj -[5221 0 R /XYZ 70.86614 459.6724 0] -endobj - -4565 0 obj -[5221 0 R /XYZ 70.86614 411.8864 0] -endobj - -4566 0 obj -[5221 0 R /XYZ 70.86614 364.1004 0] -endobj - -4567 0 obj -[5221 0 R /XYZ 70.86614 316.3144 0] -endobj - -4568 0 obj -[5221 0 R /XYZ 70.86614 282.19043 0] -endobj - -4569 0 obj -[5221 0 R /XYZ 70.86614 234.40442 0] -endobj - -4570 0 obj -[5221 0 R /XYZ 70.86614 186.61841 0] -endobj - -4571 0 obj -[5221 0 R /XYZ 70.86614 138.8324 0] -endobj - -4572 0 obj -[5251 0 R /XYZ 70.86614 732.7264 0] -endobj - -4573 0 obj -[5251 0 R /XYZ 70.86614 684.9404 0] -endobj - -4574 0 obj -[5251 0 R /XYZ 70.86614 637.1544 0] -endobj - -4575 0 obj -[5251 0 R /XYZ 70.86614 589.3684 0] -endobj - -4576 0 obj -[5251 0 R /XYZ 70.86614 527.9204 0] -endobj - -4577 0 obj -[5251 0 R /XYZ 70.86614 480.1344 0] -endobj - -4578 0 obj -[5251 0 R /XYZ 70.86614 432.3484 0] -endobj - -4579 0 obj -[5251 0 R /XYZ 70.86614 398.2244 0] -endobj - -4580 0 obj -[5251 0 R /XYZ 70.86614 364.1004 0] -endobj - -4581 0 obj -[5251 0 R /XYZ 70.86614 343.6384 0] -endobj - -4582 0 obj -[5251 0 R /XYZ 70.86614 309.5144 0] -endobj - -4583 0 obj -[5251 0 R /XYZ 70.86614 261.7284 0] -endobj - -4584 0 obj -[5251 0 R /XYZ 70.86614 213.94238 0] -endobj - -4585 0 obj -[5251 0 R /XYZ 70.86614 166.15637 0] -endobj - -4586 0 obj -[5251 0 R /XYZ 70.86614 132.03241 0] -endobj - -4587 0 obj -[5270 0 R /XYZ 70.86614 766.8504 0] -endobj - -4588 0 obj -[5270 0 R /XYZ 70.86614 705.4024 0] -endobj - -4589 0 obj -[5270 0 R /XYZ 70.86614 684.9404 0] -endobj - -4590 0 obj -[5270 0 R /XYZ 70.86614 664.4784 0] -endobj - -4591 0 obj -[5270 0 R /XYZ 70.86614 616.6924 0] -endobj - -4592 0 obj -[5270 0 R /XYZ 70.86614 568.9064 0] -endobj - -4593 0 obj -[5270 0 R /XYZ 70.86614 521.12036 0] -endobj - -4594 0 obj -[5270 0 R /XYZ 70.86614 473.3344 0] -endobj - -4595 0 obj -[5270 0 R /XYZ 70.86614 425.5484 0] -endobj - -4596 0 obj -[4743 0 R /XYZ 178.1254 701.1934 0] -endobj - -4597 0 obj -[4743 0 R /XYZ 423.09903 660.2074 0] -endobj - -4598 0 obj -[4743 0 R /XYZ 382.28867 632.8834 0] -endobj - -4599 0 obj -[4743 0 R /XYZ 508.94345 367.1224 0] -endobj - -4600 0 obj -[4743 0 R /XYZ 153.22902 353.4604 0] -endobj - -4601 0 obj -[4756 0 R /XYZ 524.4094 513.3844 0] -endobj - -4602 0 obj -[4756 0 R /XYZ 317.62296 441.4094 0] -endobj - -4603 0 obj -[4756 0 R /XYZ 125.0658 427.7474 0] -endobj - -4604 0 obj -[4756 0 R /XYZ 465.35275 414.0854 0] -endobj - -4605 0 obj -[4756 0 R /XYZ 278.04752 400.4234 0] -endobj - -4606 0 obj -[4756 0 R /XYZ 238.44057 359.4374 0] -endobj - -4607 0 obj -[4769 0 R /XYZ 219.96544 670.46643 0] -endobj - -4608 0 obj -[4769 0 R /XYZ 107.44759 486.6154 0] -endobj - -4609 0 obj -[4769 0 R /XYZ 237.97284 486.6154 0] -endobj - -4610 0 obj -[4787 0 R /XYZ 293.1822 628.4564 0] -endobj - -4611 0 obj -[4787 0 R /XYZ 408.30182 530.1707 0] -endobj - -4612 0 obj -[4787 0 R /XYZ 108.7478 468.7227 0] -endobj - -4613 0 obj -[4787 0 R /XYZ 270.1342 407.2747 0] -endobj - -4614 0 obj -[4787 0 R /XYZ 167.72777 352.6267 0] -endobj - -4615 0 obj -[4787 0 R /XYZ 210.38522 267.32867 0] -endobj - -4616 0 obj -[4787 0 R /XYZ 355.5598 267.32867 0] -endobj - -4617 0 obj -[4787 0 R /XYZ 412.81937 267.32867 0] -endobj - -4618 0 obj -[4787 0 R /XYZ 503.99344 267.32867 0] -endobj - -4619 0 obj -[4787 0 R /XYZ 235.28406 192.77368 0] -endobj - -4620 0 obj -[4799 0 R /XYZ 363.59082 711.4524 0] -endobj - -4621 0 obj -[4799 0 R /XYZ 322.45868 581.6944 0] -endobj - -4622 0 obj -[4799 0 R /XYZ 211.09238 527.0464 0] -endobj - -4623 0 obj -[4799 0 R /XYZ 381.96036 527.0464 0] -endobj - -4624 0 obj -[4799 0 R /XYZ 153.25615 513.3844 0] -endobj - -4625 0 obj -[4803 0 R /XYZ 317.83813 194.46942 0] -endobj - -4626 0 obj -[4817 0 R /XYZ 317.01538 618.95337 0] -endobj - -4627 0 obj -[4836 0 R /XYZ 168.51923 670.46643 0] -endobj - -4628 0 obj -[4840 0 R /XYZ 292.8334 462.5704 0] -endobj - -4629 0 obj -[4925 0 R /XYZ 355.30414 530.1814 0] -endobj - -4630 0 obj -[4925 0 R /XYZ 414.00015 530.1814 0] -endobj - -4631 0 obj -[4947 0 R /XYZ 291.5864 428.4824 0] -endobj - -4632 0 obj -[4947 0 R /XYZ 168.92632 107.51837 0] -endobj - -4633 0 obj -[4956 0 R /XYZ 524.4094 684.1284 0] -endobj - -4634 0 obj -[4956 0 R /XYZ 321.3684 425.1674 0] -endobj - -4635 0 obj -[4956 0 R /XYZ 145.59686 124.665405 0] -endobj - -4636 0 obj -[4956 0 R /XYZ 120.04367 111.00342 0] -endobj - -4637 0 obj -[4973 0 R /XYZ 310.54578 479.8154 0] -endobj - -4638 0 obj -[4973 0 R /XYZ 481.62567 302.27142 0] -endobj - -4639 0 obj -[4973 0 R /XYZ 136.55405 288.60938 0] -endobj - -4640 0 obj -[4973 0 R /XYZ 246.84358 274.9474 0] -endobj - -4641 0 obj -[4973 0 R /XYZ 443.16983 274.9474 0] -endobj - -4642 0 obj -[4973 0 R /XYZ 393.09418 199.8374 0] -endobj - -4643 0 obj -[4973 0 R /XYZ 162.6677 186.17542 0] -endobj - -4644 0 obj -[4973 0 R /XYZ 395.751 186.17542 0] -endobj - -4645 0 obj -[4973 0 R /XYZ 178.73436 138.3894 0] -endobj - -4646 0 obj -[4976 0 R /XYZ 238.37125 745.5764 0] -endobj - -4647 0 obj -[4985 0 R /XYZ 209.40015 656.8044 0] -endobj - -4648 0 obj -[4985 0 R /XYZ 443.829 533.9084 0] -endobj - -4649 0 obj -[4985 0 R /XYZ 209.55678 411.0124 0] -endobj - -4650 0 obj -[4985 0 R /XYZ 122.979576 226.60638 0] -endobj - -4651 0 obj -[4985 0 R /XYZ 292.35217 185.62042 0] -endobj - -4652 0 obj -[4985 0 R /XYZ 398.23715 171.95837 0] -endobj - -4653 0 obj -[4998 0 R /XYZ 334.1413 567.0084 0] -endobj - -4654 0 obj -[4998 0 R /XYZ 414.36783 539.6844 0] -endobj - -4655 0 obj -[4998 0 R /XYZ 240.69826 355.2784 0] -endobj - -4656 0 obj -[4998 0 R /XYZ 390.9383 211.8584 0] -endobj - -4657 0 obj -[4998 0 R /XYZ 355.56662 157.21039 0] -endobj - -4658 0 obj -[4998 0 R /XYZ 524.4094 157.21039 0] -endobj - -4659 0 obj -[5009 0 R /XYZ 283.5666 636.8974 0] -endobj - -4660 0 obj -[5009 0 R /XYZ 111.38758 595.9114 0] -endobj - -4661 0 obj -[5009 0 R /XYZ 272.62112 397.8434 0] -endobj - -4662 0 obj -[5009 0 R /XYZ 219.68813 206.57538 0] -endobj - -4663 0 obj -[5029 0 R /XYZ 239.16399 615.8184 0] -endobj - -4664 0 obj -[5029 0 R /XYZ 112.72849 602.1564 0] -endobj - -4665 0 obj -[5029 0 R /XYZ 276.56262 602.1564 0] -endobj - -4666 0 obj -[5029 0 R /XYZ 503.99344 574.8324 0] -endobj - -4667 0 obj -[5029 0 R /XYZ 306.7424 335.7784 0] -endobj - -4668 0 obj -[5029 0 R /XYZ 177.65485 294.79242 0] -endobj - -4669 0 obj -[5029 0 R /XYZ 298.93057 294.79242 0] -endobj - -4670 0 obj -[5029 0 R /XYZ 334.41858 253.8064 0] -endobj - -4671 0 obj -[5053 0 R /XYZ 485.22726 745.5764 0] -endobj - -4672 0 obj -[5053 0 R /XYZ 308.39426 731.9144 0] -endobj - -4673 0 obj -[5053 0 R /XYZ 486.7188 704.5904 0] -endobj - -4674 0 obj -[5053 0 R /XYZ 263.03928 690.9284 0] -endobj - -4675 0 obj -[5053 0 R /XYZ 289.94495 677.2664 0] -endobj - -4676 0 obj -[5053 0 R /XYZ 497.94345 486.6154 0] -endobj - -4677 0 obj -[5053 0 R /XYZ 399.76514 343.1954 0] -endobj - -4678 0 obj -[5053 0 R /XYZ 394.7261 145.12738 0] -endobj - -4679 0 obj -[5053 0 R /XYZ 172.12447 131.4654 0] -endobj - -4680 0 obj -[5053 0 R /XYZ 275.54834 104.14142 0] -endobj - -4681 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /XObject << - /x0 5272 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 0 - /Parent 1 0 R - /Contents 4682 0 R ->> -endobj - -4682 0 obj -<< - /Length 2833 - /Filter /FlateDecode ->> -stream -x\[o\~?֛VlFE-΃Hxl6@=r8% xp8o<{jpse/^t]nosG~=fqݽ|^~{ FH Nqeyހfw߀y~ӄ p2Շރ pN0sFa՟ݷW/7qcﯾ~`atYpgN(=vK엻uv. ˮ#_W=ծ؅09=o_O0S0Sq$5*4Ѹ(=XDg7f3RSgvۙ^g(e4HK*DK܍G]ӽY F -^;ϬԪ`7 QpSz$6D mFf#{~^Q;3[0gYBɝ?P&#%wVۇ^m-{w޼W|mtF#g EFk%'(y<߲jb@ޝ+m)-R8]q /۹Cr틈}.HuZ) Tԕ#jW8n(ub ŬUF -`ɶRaE&(<&QPi#7~oچEB]\Hh_D-P8ZD5k@ܩ㺪E'9R -TvOfHES*ilq~vK6{2Qk -y+ĭGEϭ\n2?ѣ1CswNrJjҷ;ڽq|?H9RӄJo[fjPdQ}Zh༓-6f6޴ǩr"k]26ѤӖrRTxyW @(=Y2۵Y;:|"dfe/׭h pT5bɟ](Uo|.wcjcd9.e#vu"&t/ -ҏ&F˕z%Ww|'+&z4\ Ňs|]citaBz;\ЇvLjυkzJL3LqdE#\ [@؜>q}ݻm' 5~a{aL $} -endstream -endobj - -4683 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 689.9764 524.4094 697.4674] - /Border [0 0 0] - /Dest (sec:introduction) - /F 4 - /StructParent 1 - /Contents ->> -endobj - -4684 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 671.3144 524.4094 678.9264] - /Border [0 0 0] - /Dest (subsec:composability) - /F 4 - /StructParent 2 - /Contents ->> -endobj - -4685 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 652.6524 524.4094 660.2644] - /Border [0 0 0] - /Dest (subsec:motivation) - /F 4 - /StructParent 3 - /Contents ->> -endobj - -4686 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 633.9904 524.4094 641.6024] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 4 - /Contents ->> -endobj - -4687 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 615.32837 524.4094 622.9404] - /Border [0 0 0] - /Dest (subsubsec:motivation-harnesses) - /F 4 - /StructParent 5 - /Contents ->> -endobj - -4688 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 596.6664 524.4094 604.2784] - /Border [0 0 0] - /Dest (subsubsec:motivation-workaround) - /F 4 - /StructParent 6 - /Contents ->> -endobj - -4689 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 578.0044 524.4094 585.6164] - /Border [0 0 0] - /Dest (subsec:contributions) - /F 4 - /StructParent 7 - /Contents ->> -endobj - -4690 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 549.4634 524.4094 556.9544] - /Border [0 0 0] - /Dest (sec:preliminary) - /F 4 - /StructParent 8 - /Contents ->> -endobj - -4691 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 530.8014 524.4094 538.4134] - /Border [0 0 0] - /Dest (subsec:effects) - /F 4 - /StructParent 9 - /Contents ->> -endobj - -4692 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 512.1394 524.4094 519.7514] - /Border [0 0 0] - /Dest (subsec:coeffects) - /F 4 - /StructParent 10 - /Contents ->> -endobj - -4693 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 493.4774 524.4094 501.0894] - /Border [0 0 0] - /Dest 4415 0 R - /F 4 - /StructParent 11 - /Contents ->> -endobj - -4694 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 464.9364 524.4094 472.4274] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 12 - /Contents ->> -endobj - -4695 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 446.2744 524.4094 453.8864] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 13 - /Contents ->> -endobj - -4696 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 427.6124 524.4094 435.2244] - /Border [0 0 0] - /Dest (subsubsec:eff-formalization) - /F 4 - /StructParent 14 - /Contents ->> -endobj - -4697 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 408.9504 524.4094 416.5624] - /Border [0 0 0] - /Dest (subsubsec:eff-composition) - /F 4 - /StructParent 15 - /Contents ->> -endobj - -4698 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 390.2884 524.4094 397.9004] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 16 - /Contents ->> -endobj - -4699 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 371.6264 524.4094 379.2384] - /Border [0 0 0] - /Dest (subsubsec:coeff-context) - /F 4 - /StructParent 17 - /Contents ->> -endobj - -4700 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 352.9644 524.4094 360.5764] - /Border [0 0 0] - /Dest (subsubsec:coeff-reactive) - /F 4 - /StructParent 18 - /Contents ->> -endobj - -4701 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 334.3024 524.4094 341.9144] - /Border [0 0 0] - /Dest (subsubsec:coeff-isolate-intercept) - /F 4 - /StructParent 19 - /Contents ->> -endobj - -4702 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 315.64038 524.4094 323.25238] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 20 - /Contents ->> -endobj - -4703 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 296.9784 524.4094 304.5904] - /Border [0 0 0] - /Dest (subsubsec:eff-idempotent) - /F 4 - /StructParent 21 - /Contents ->> -endobj - -4704 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 278.3164 524.4094 285.9284] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-iteration) - /F 4 - /StructParent 22 - /Contents ->> -endobj - -4705 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 259.65442 524.4094 267.26642] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-coherence) - /F 4 - /StructParent 23 - /Contents ->> -endobj - -4706 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 240.99237 524.4094 248.60437] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 24 - /Contents ->> -endobj - -4707 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 222.33038 524.4094 229.94238] - /Border [0 0 0] - /Dest (subsec:context-paradigm) - /F 4 - /StructParent 25 - /Contents ->> -endobj - -4708 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 203.6684 524.4094 211.2804] - /Border [0 0 0] - /Dest (subsubsec:unified-context) - /F 4 - /StructParent 26 - /Contents ->> -endobj - -4709 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 185.00641 524.4094 192.61841] - /Border [0 0 0] - /Dest (subsubsec:context-situating) - /F 4 - /StructParent 27 - /Contents ->> -endobj - -4710 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 156.4654 524.4094 163.95642] - /Border [0 0 0] - /Dest (sec:system) - /F 4 - /StructParent 28 - /Contents ->> -endobj - -4711 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 137.8034 524.4094 145.4154] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 29 - /Contents ->> -endobj - -4712 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 119.14142 524.4094 126.75342] - /Border [0 0 0] - /Dest (subsubsec:effect-api) - /F 4 - /StructParent 30 - /Contents ->> -endobj - -4713 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 100.47937 524.4094 108.09143] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 31 - /Contents ->> -endobj - -4714 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 89.42938 524.4094 89.42938] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 32 - /Contents ->> -endobj - -4715 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 33 - /Tabs /S - /Parent 1 0 R - /Contents 4716 0 R - /Annots [4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R] ->> -endobj - -4716 0 obj -<< - /Length 16038 - /Filter /FlateDecode ->> -stream -xݽ]smq$޿hkLzժıv"ơ~Ф:s\Ч./_}{ʪo쫻o_~w7_o_?{|w~ꗿW_W_ݿ|=Onݭ_]-L-w篾ͺj|_~պuv?}c|柿֯ޗ+.Һ]w_7_ׯZo]uTrz+W]RJ-6K _$k7`Q˿}a4[>Çwg!fƤDt2DLfĭv)ZJӉ$gZLI1^&jͤhދ@mkqZ9[%ݕJқ8n[[a.RS7M+h&γ;D0(YTq[ϐ!kl-٥|d%gSQ5&aF],dPL>)5A۶T&N -I+e~]8AxQUӖIж ]RjmdRuSZ;!ͨb{eq"hgi+U˒ɜeKeJb|zIu7s"&3T|de"lZ7זS<3X皢`%QbDQ?ň+VI[ -Uĉ}KV;5TvŮ}ؿ?Ro~ʧkN2G'Ok%qzt{]<Ϳ$|<#??{~Bſ○)^my>ŸfdV<g,M,rQH-Z~PBH%sGeT2S̑=.b! A(F7xuY8[9{lu~m7S茇ޗ+~$U -?Ky/W)B$F~nEĮpK%yH)Ѕg#&FZE{ƤgH-R6(L2ir%k"y|Uh! m^bJwi]F{d7Ńoѵ6-av*rO\!$ܓCz/h\»54]'y_dёK&b35I)chH횂^<~jH-S82_Mh7_h+nj%cq_ѷU7_ղ;>i -+ -~o1) kQY8^Ek;>9 --߉ k/SĚLK* ޲!S2r#Tt9k_eJG.;F> -Wў01;$jC*?7(.$,V*GK&D{ҀO s#2yØX*H%5P"7SrxrȁJ;C.^)x-9|32c\n%gw"ERz9+Ӷs z8 ߈M;C9Up$q"GHcxs*G-yrevd E=pW!WF Q|?oQzXIdf$Z^S.k^HLmA/TTzߗΛzF$8|AG$|čprcm>Fͷ-I6 -pފ DoPTH.1 #ݷN'$}IE%'\`۔ࣾp̓GXi ~9b" 1Ybb,Bx~>>BZQ\lӦ&VӦ}y11 !YMGL̵iO:zjb(>~H57o⇚1#q\CK-7 >)GKS{F‡qZ|3̀PyG8#6hn8g6 -$xNx)%' Xeq ?$h$QZI.N~a?J _0"Mf HHP|2֒!%B_\)_DcH? ]7JV5v[ķ_0 =ȅÝ?>槲)>w9">`>TFև_|/E//^ȅZ1El3,#l*"h8`K"PC6-hIN"D^ĞD`*ˑDpc%t;X;ea!꜏>Χ Q|PLťر#E"@35$|D5qfbt:M$Du#E̅ H5%ޟrX"aRrtXȱkOYHK(b$ĥQ˂G EXڏ+i@ՄDGB6{c|شBa c8G 8];W>"nOz+"HP'qBZ ΀"@>#$8;_@-D^|y3Ryҗu3J[@4#>}SO`ECd>{pׯW KOψV{ߌ\i-;ѯ+|%ʂ -,u$ ͵4b;rn7/6mcKGM6RN2e[ӞZSCр ֜vweU)m% blɠ\S59B\QV+.i`MAp?RA* %˝r!59 cC{|Cu],BtYkH͓b<: KiUː5N?ȴ#5FH*pJiڬUgM 'z2c=׷B8"sHTZ3b{& a|ECdˎ"?MsÖZ#>ۍEO<%qxz"4Aԃu{m&?ŏ76 _uӮbTpz]4|&7x8qqC PI)h!JG:vl=8*t)޴o!I.,| )%I?DoJ?uDXȔ6>H7m|PEC[N^KQ EG : O r*v姂 \9C% Jd>Z%H !MothmxNЂ.@/hR6Ě/ECt2 z_,YXYvS*D;\Jzr=B?eBaLiK2Iєц %=B0T&V>VS)-A u_D;Pҳ7? =;_x,jI瑏}n zE>{U)Vӥ>wp_](>↸"|fmH3k+$+Ϭ5I|fMe d (Ay;4g'GQR'+`́"%5Q8HNZN}d} 4pG6ZJɐҔfI3WRr[)6xE/i5e$^|]R{#EG>?h5'-S]~s]IX#mxbIBG\(NY<?L4M/Iuھ+Ñ#xO-åm:^HHR:^v1gT1ۛ6L!SY@'bO(ڡ'J;1GA:sHFmR9v# ġ}?~mDS-/1sqa'cr%v8|J-->\9xW封W\'5c%k2Lx?u3#O“Մ[eWs2vNۯE=I#Yo؛Y !PI!zdLH$e|`_R4o _yQE>Z -^Kl6IEc$ _MRm;H-qD - ?!o(6lI!*5ߗR$i9ra=3 V@[O&iB<#c G$Hj["R {:I{Q!S|}?\0R᣾!ԑG|MEi-e|ۨE/YwXnf ?D[>wwJtr}3͗_-]ItYï==;}`q~*| OE2I/.9_[_\ggv Dl7ܠWB7dHffᣀxwц?\z2Ȟo/5$8-ݭYmoʡ@'i6B~lxs#]CG*GT͝#DF!G3 i @Z^NCV*ݵ; 7B,ӫE[w -t8ah"|LGh-O|Љh/ֲxmF6x£ Z>£4 ?&YSωO %צ.dw[[?Vk3]ȗClq/Sr^0?~[Y#懮Nx$ I >ի~hP} ?+PNdƽnzK(lҳ{3)HR?c HcPՈw<6N-C(1!2Jfs|Ite8`o[^-#En\(JtGxEF$"F#Σ@“C#QG1'1J*C^D -x1mĥ!q8QCV3)Ky hݖǀc`Wh!Jdh}2dHOk+ -^D E.6/]D@0U2;@ım,ZmtQQ gcl&qB$ش? %ՊHޮJɅ[$VYI!nFiO֡J;ߒDGt0 Uاy2zT~mC!/)KکJ틄?YQSA;Cn9-ڏ:釡.ڡ8:!ߑ9Or`E/T>|,iӂbN6Kw#T~:Ւ$|hԻ[fvl$uqn*7%Kt"j85lL(_3R{õ"ң>Qu?.Y.mA IsMqF d->pMua"ᇴ&%8JCw=4 , 8aE{OoU~#|FODTV&$MtOUi݁= 5uDy|I,C]uh4#+*w|q'&97$Ǥ$]H-?mbÒj&618hbpaSX/aS7 ?d7{Z, q=x5 T%`C-,ǡqhE]7Z,4Ʃ\'74|@:ذ^݋A#mUvumT;oqv[h·6~[|f̣b\۝ty5SRĉ|na2jGܱ(qQu:y[|: g6I%$+ ->$O‡Dpqךh8 szA#ӊow^$q礼?$H)i?TTO~Hu|.YG"D$\HHIy9ҠmL ^SoMΛ$|4āMp3AƉunI#iS6& {-5p>:(v*|sɚ%lCޗnsVnw>Zy}$|hDK/=eGOXjࣦKz*sH#3h0(t"K -+:&p.= wkj\;oF"fwK#u7͗ti2ƹ7o̷ lz+ m ^7K~*mY(1o*w ߥ,i&>4xXc!آ t&[a˂xl }79m- wIH]S។PMn8dzb[5Xʼn$|uQC [+Y0X!+W[]~tv҆?[v͝%+6UNJ9 Uw=6@q$ %Y,|t! -c 'ykt}SEGګr,KDwUH?]bieIo?TȗQKl"Q~x;GLQ Infǖ8DG^T1Orkbw]Nh_R}C+3~Jo:\5:\+:\;6|(s[27(sianvanq~^ \.xKt9xUޮ0AC1-[yktTڅkk.6U!M|1"ZRs{~}O.N_ >[Cf/|pތ1;Ni#0$!LCoYokcN#9]H -{R|Ȭ ,$| ?lgJ4b7`-9hoQܞ{z8f&(!`ƧZ\hQl(H5^9I!$t8w٦២Fj: 6 #B;'IchlZ0KrIq2h#}z8H%( -9`/C{wk|JE9}ܞQC6pvv]qū-c7vW9n,d|Ջ^ܟ?7{޷yߨou߲xڨCʩ26~7S\O tbq$%~TwK,?& $:3 -<"zٽS2ۓ*j *p7q F$|=<{dm̈$mn@ɦ]$62i33,(mfF<)'B̋? g=p6 R7,MTrz79^G5.$ ^3$؛65͌Ӧfq/&|G T a~EfD{mnFD<\I#UJnmIht09 d.䌈An":|4;BxD7I~ xЦѷMO"=\#7J_ >78vofnwyЃY<̿y}ٓi[?ܝJvԒ6Q/NƁՑ76N&AndmKdKx,XR"A,1eTUE0TD&EЂ,VHei("At ,żt56`DWpl6mXhlY$|EuQ@d'l&./f'ے -t!E0$fDEв oih@", M<,".VK5rJY.Y`D7zE$RхEв&@7Y)pRD8h(!`P@5`-& -ܨ] Ի2(}o'Oj N ?h%q#o?MD5˒نDP}`bIo}q`HNŸz$%\W"QW%\[?%*>ެ#5˹}We7ky|iB;r`?y&FÝ?T|'AweoJl"2O~ύ4B^WK -zO#KR}Ƨźt6n+i3& ]5< ~b*5e'RI{IXڍ6 ~$o.4f7*Ք57@Y N,c"+TfoOX6V(jCJ5 hssr+YbeڢNN&..6$WOϢPƗ^]bu.ھ:)hl[ >>%zxv[hD%cF]-x#h A‡޼U'Xnћ_+sU4 Y.R$㣲V#8"l q8O0v{}8me?3|Ijˇެ'2%UM$D \4P,oIݼ jQ8tGs>H0Xl?7l9El,mC[ُp\"CqH$(HΦ-$g$,Gƛ<: $Nt$Csh8/޴siМ6As֤l\a{4gZ@"9o"9/~μ-9ߠ)I[%p9hm͗+_?"-?k̍8oʨ[ix,%HAȌ"DK2K(68AAY|H%m N`\%B&r^g55G=-k-oHi0ch,0I0{E(~ɲ<h!>I{ &K P4ZEАi/q{; e<,F%Z$Ž6K8c, {$7lxo^ȸ$p1 .䟒:'Ep2B*5EסUy6N.B"8~츽@&uS \2<ݫmE"ݫ-xp^z -&~>,K#Y 1Bۍ5u@"8^Tx\HuxzbzX0{%.e앇z=y,G ks[Sy51mUt:/] c'iO -?YumPOqS\Я2#g:'G#h4aP,CbAbh'"$_~{ Ȋ#ZAq~n{ IJGPz  `{\BYy⍛W500g7 hkY -T5.by$${, -\ܣ5m ̒`x@T`D"r,֣ʒ\)/}P iEV) 5AH8:JbZ-)S"hpI$(6yG覭Ë2d /ȑ"0L)%M==t -.űDG +vjzWk]Q&F/DR4LAjRK[˾lyϾw壍uszɚ07tRA#%n4A6X("!,SVJ"-Z'ŞEǜ ] +u$| %u$͈OC"JAwcI!$' ?d,Gx!g z"AF~T*F{#} \*O`2 $d:Ảrø7F#(O8EHBB#,vAKG~6&;w)ɪE#eu]8LW" bUHmLE ),|mڞf7 -=E(LޘcKO#ɱZTpK 'w)&׹B"_l^\QX#kVZ<.塸rHëJXޮgAW~QG'un35-OZݣ&6uYVobA$FàL_bC7B ~lK/JW [B O8Lo4hH4YޒK<Rbś|5?5HGO > -Gz5IuzSj>J!юc~F؈ t;NS~À|7ݡ?2brt(҅9X^iK4 ?%*J| T[N>h;S4gGnuJ\yk*x!鴈ۥ^X.6R9[Rœɽu1oKr7iH2]WWE^7E_ݯ֪kڶn~==u~X7+l1A!q)xiJ$H1Es^Ryqe F#xHsU~KȟؼGi*<WdгrI_bԌ"9RėUėeSiy/1yx/1"r{hJ2XpG 8Jju`)"=ZFķG3F8M$h 75GXo:M>he [ ,D|oqH7yZf`RG"}azK#x'ތi~5CZy8Lf܊Keu\ksI}ղKcTzA_=Nxg!ՏϢ߽3Co=~ sP쨮֖ ֏۩eR47qQmƤ(ѥ8s(J%R5) D^j"Ҳc*".9Pb - d*4&R}*#BUrPMH@_^ʆ9P{I 6Իm誶wXZ@kZԛ*}*)T.'D%ojMq#7,pQǞV?ۍ9 ێ)'pMh8#_CGR_S{/#syH%xjH0F@ sNZt: ON4_7x)o`JMf ]|;$|؎9hxٮq؎,quG&:&U> ->th!i94|Eb& [`GC&M]ҵX h6,J-P7ml<$#i"tm]~ -EI4q7x*{hg"fD '|ly3g)Eް&ݛ%;'hO'{9G ~Eֺpߠ%.WmI#q!rv{ŝʿ?p*?'}߾fZkd~G)̙8,(?u,!D`zr- -HdX.܃EVpf!w PH(X%k2HćBƏN"@ -P,,ۅ-`Llkp*o1~! n iJ,5;y{I!&"YF4M֒Zbxoo4=CF> v , $T.E> І n,HPGxu(%v{IHQR<!8tLͤ:U9$Ӛ:(l7̧I 4pQD"@m9o&=5v2H W^crX# -JgiZR!HH^7":VhbOAH.b :8B8{H ݅6:O,x#UjmOK;״:V,~n3ٷ7_Je-/O~ve4Zhp;`oNt(*!JB Ŷ+ ?ToBДw !D.똘џlDP[{.|q"J ,_fI d z{FbQTM*t,DI-FAo !"Q["7 RtC&ےE2 No&3&h>eOb!g_h1y4zh;x.=[F̠)ۤ3Zg fQ#4%+@G=Z,E7 d7@HJ O'VCmS4G"VbMaDZE2\,bI"%xP -q,5B )j#E⾐"@R>/ :$|],xYn¼;5?u/#5/0DjzGݖnT?ݿ}7~o}sϿۏwWQ O4׈sjޡbA -endstream -endobj - -4717 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 749.2384 524.4094 756.8504] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 34 - /Contents ->> -endobj - -4718 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 730.5764 524.4094 738.1884] - /Border [0 0 0] - /Dest (subsubsec:context-access) - /F 4 - /StructParent 35 - /Contents ->> -endobj - -4719 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 711.9144 524.4094 719.52637] - /Border [0 0 0] - /Dest (subsec:loader-hmr) - /F 4 - /StructParent 36 - /Contents ->> -endobj - -4720 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 693.2524 524.4094 700.8644] - /Border [0 0 0] - /Dest (subsubsec:config-layer) - /F 4 - /StructParent 37 - /Contents ->> -endobj - -4721 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 674.5904 524.4094 682.2024] - /Border [0 0 0] - /Dest (subsubsec:hmr) - /F 4 - /StructParent 38 - /Contents ->> -endobj - -4722 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 655.9284 524.4094 663.5404] - /Border [0 0 0] - /Dest (subsec:koishi) - /F 4 - /StructParent 39 - /Contents ->> -endobj - -4723 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 627.3874 524.4094 634.8784] - /Border [0 0 0] - /Dest (sec:discussion) - /F 4 - /StructParent 40 - /Contents ->> -endobj - -4724 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 608.7254 524.4094 616.3374] - /Border [0 0 0] - /Dest (subsec:scaling) - /F 4 - /StructParent 41 - /Contents ->> -endobj - -4725 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 590.0634 524.4094 597.6754] - /Border [0 0 0] - /Dest (subsec:capabilities) - /F 4 - /StructParent 42 - /Contents ->> -endobj - -4726 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 571.40137 524.4094 579.0134] - /Border [0 0 0] - /Dest (subsec:language) - /F 4 - /StructParent 43 - /Contents ->> -endobj - -4727 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 552.7394 524.4094 560.35144] - /Border [0 0 0] - /Dest (subsec:granularity) - /F 4 - /StructParent 44 - /Contents ->> -endobj - -4728 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 534.0774 524.4094 541.6894] - /Border [0 0 0] - /Dest (subsec:versioning) - /F 4 - /StructParent 45 - /Contents ->> -endobj - -4729 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 505.5364 524.4094 513.0274] - /Border [0 0 0] - /Dest (sec:related) - /F 4 - /StructParent 46 - /Contents ->> -endobj - -4730 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.8744 524.4094 494.4864] - /Border [0 0 0] - /Dest (subsec:rw-effects) - /F 4 - /StructParent 47 - /Contents ->> -endobj - -4731 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 468.2124 524.4094 475.8244] - /Border [0 0 0] - /Dest (subsec:rw-paradigms) - /F 4 - /StructParent 48 - /Contents ->> -endobj - -4732 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 449.5504 524.4094 457.1624] - /Border [0 0 0] - /Dest (subsec:rw-temporal) - /F 4 - /StructParent 49 - /Contents ->> -endobj - -4733 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 430.8884 524.4094 438.5004] - /Border [0 0 0] - /Dest (subsec:rw-spatial) - /F 4 - /StructParent 50 - /Contents ->> -endobj - -4734 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 402.3474 524.4094 409.8384] - /Border [0 0 0] - /Dest (sec:conclusion) - /F 4 - /StructParent 51 - /Contents ->> -endobj - -4735 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 373.8064 524.4094 381.2974] - /Border [0 0 0] - /Dest 4455 0 R - /F 4 - /StructParent 52 - /Contents ->> -endobj - -4736 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 53 - /Tabs /S - /Parent 1 0 R - /Contents 4737 0 R - /Annots [4717 0 R 4718 0 R 4719 0 R 4720 0 R 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R] ->> -endobj - -4737 0 obj -<< - /Length 9777 - /Filter /FlateDecode ->> -stream -x}]Ǒ=xA,\ -6l$ ;Vu- d}pz>83Cii⩞~駻9U~?/_߿z?_߾?˫woG>zӟ^~旿św_ݠ7j]쫽LsUZ{틯7o޼?~};~o|G~To~_^麺['~onqxn0+Yk-뛿|$z̋ڈoټ۫un;ߢ*i%K >MOZ( Ƣ\R3?i&SM/if,QQӦRܓok2z[GچvQ[ҕ,7ڻkZٷ-9,Ei$cm|ȊS /4S%_b:k^UHhD7mI;[,}ēv*)额}hd}xe?E;7hM6זmc&xӆ[shmX=|"d UӤǚel c}[TrrXF5cXkц!x~%hfZc^cXլ*')}b;sC|{~.]~z1C=3_?PxalïbY[\s#,KGmssM}Wfl={p5{ɞ~Ow)]]wGV -6dj T|#!HO=]bKRȆscMwIdU҆&'hϒI)_ >Â-:fE)K,8w R[d:тK@ABYi7u{^:;i7u{vSw$2V@TG&ÛvU U^ж$2Ti'r{N7{$ɽ ?-rKTWn,WOZ#":ɱn?VB" D戃8vb>v~̹~r Ơ+P,|up $JNز */|H-n9頺y-)́_VOl5$NI)/,D+x{w Rmh k؂>]jfs6/~L4eQb >Vڧ|jI&2$x/?z6Grb8xߖ)Q[,xpE;68i.7VqH#ItVA1|}@+dV1QCFApcN p6$dJ}(Zq q{y\HNu-9 -}@,F6+RJÿc_I~/3Z sϖ@|e׊gޅ" eRAG&opiACGW> ~B-G͛~z%U > z|X_: =%[V ?$YV-6;HGkzNތoKۿbJgqR\<Y{,}^|* SU0G۴~>o% )Ť2鸔\SBǁ[  -̓uIj,?9 ӓ|,[8r]ԆxP) 7~l4o~ȴ)_GSP7##s -҂臺B^2 ΅RP r^Z(ɂGX4$out@헃L!>%gi4۲C FZ.VI-5i'Lt$BReE9m⇑ג+PɎ?h -GVPJ~h 堏L1"*&P矅:$t$ mYLBO2@>C-*=zؓMQm%X.*=1c(@HSKN'[G'bzʁ]鉖 GhӼZ]&4/4kSp×Auie|~T{ d}0@t|x?vq^6f`wr9^[2Z\RBRdy!F2 2Z)NdBG#9^2TH@#Z]Kz17(]v(B B@ #ZroUPX@pAHB8q$ /I`DYZp,Bd6h/@I _N + cDaPEZs1;^<^D Z7QSXx!J"]FhGI:Zܲ5!z^dލhf^d/6E=AJed "^@9H(x!Ff T5-Fe?ϰ[zfCb<^-luy䅀ܖ2d;!1<;A|S(Dy`̥RFЉ ([G RL@2+_8rSZY HD)5ZTHHSj'u . I.IBj}Kt_t/$v񽻄^ƿt@0?l'ffUa)o5zT\m8o}sƂk -vq0e @C /Yyz]BOO~t۰ Nx8b`$4>bk ៶prbc8I.6+N8c:ZI b ->YG4_$oN"ᣅkG1͈?bN{P̺W"76T6J3B}p&l݃.'ZymW$B01[ܛl4|ϖ>#< ,| NQHBUA?:jAłz_@qGOVڑ!#HГGcC;e?(=-Dwl8KOGsюҲ=ujR|Բ}vd;TE!v4sd9 ?%,G88m;q{Tѷ@quw*mwu|oÿzǷd~^6sKj7 ?d e|GaD;>ZJ" 5 -9F~X"i#~,|u=紓Tb"ᣝdWƉ ~"ᣟd)/-O4Th({O"*7q]AQ։~E;v;t~Pp2;sv;sv;s" 7=&Y3&hG7I:%vC4 ;+@ɔq)M 8(;ԩCG%r%Nv$SćzC|w W tn.gL/RKQں2 85D>*cjryT~:WPv,/ɇ&. ?6?X0m~/{WQRR۫}~bj)>=zs}&}C Z`JY3F~89׬NO19ӍGI.>́% 8{^lhul^uњ&6킵٦hښ9$6CA[ʹco9ؼgs҆h‡e9Y;۵8]🾨PzYO9z]Fz /ˮn7_off}ۿu1ف_G]TS/;wJmAA_$#'Lkߖ'ҚdXv8$BΓ/[YPWqC"~sݑߠ=]oIϤ*4`Á-w~BDGtc2GF_$vY<OE?*G8H/M;6@UVX4/V$?I!k%$7:x5pexRlBZ>tISC@|[#Yn}o)F<Bβs Q=h!qv" -.8y!BlG1H:-f~33PJM}x!JNZPYz -}B/E 8uf5Αvef PAG'Qy!D $ya A/DJde!x{oh3vk/.C ]% \9ϴ3O0s0˥3 QIJr'3 eڋ[:“own6V;l/DI!i!JEke%yJcv66U -}i!A5͎鱆N66mc5S} nSDJ 疽)!y6r\-6=2mzByKzT Ti3)9լ=sfMYt.^Y@5>`YڊvǢA[78ryQ#CL;# Ÿх?Z E[ո(mu6 #K -FQHLS4wZ) ?dI. -AqaBݞp6O1-=t6 dۦmf(  ?P&y 6O1lQmcuLgy<3NV[(d *p:ߗʂCTsClR)Z.XLÍuU}Q (;{ѶNpJC:)4mDS_:ӤLod@_*yjH mx{gop!hFGRމBy#kPaZ)꒱҅48qXBAXA,DZJyUzx;S-ǴE㇬L+l.K)G=>M6?+$m~`XZ̓JX+. AR -H)‡ci!CGP?20aX -ڄ]i-|JN{saWiïC ?%&i1,4 >AvO}vaX1|K%̓GmGFw~JZ6fXxgcX!֨g Ò 3$nm0, Z!)ïd1ïԛ1-|J5`U9+)8W^VҤmǮT1 R9mo>v%+ρ[7nکڮA %cWJ8#î{/JYpWۜWJگz,|xsJ:4_ە5Ҧm~EۛK4Q H,ْ~ bKsXzx>TXzȄWE hE24|7*>z6Kv2q|(fu]&i#V%p! hX!v  D]< ?eJwV"Ꮨ. aI -̓xm,4 *~\[#9PG4$bz[ YP hi% I !DٸskfWXJ#3t~H-?,1>ei -<6ޱuo!>wKE;2øO .$N;U_2 )ho1kT% z  %s!ZhGfkۚ@ >4䠃\{w;Ў̇] އ UYf#ajCvE¿c^I'evBO];t{Ί֒f-EK]M77ѳu ɺ._eX}_=$ ؇fOҏe6)GvЎ$-Ddlȼ'2-Dy!Re{q h!zx bPqv,e̟bJN1VpNL)uBlqZ8VBh3nU.œ%Ê 2̷[rC 0nut*Xy!܇h!-l?ER芇r iS_lFF aF(*6nUCmZY2ZG=!|3R +-G[ #l(ŋP' (Cgb9#Ǎ\ 1 a82UC4Z\O=Qule?3[3DAI [3DP G.Qʇ8/J}d%RH ҍFP؎3V3J -Br-s'o. "(d͘KVQwV3DJ.'YEލ!nr2'\4pu'h!~,Яzu&B棈tuFiQl.)"dG(Y0CɴRl$hދdOu1.S-pRV-Z{:sB`IZGb -E,z\=EݙKeeз)p.Rbh`Q5B!,@[m(2\2ش.b#` $. -l.Vr3?_߾ǟ/xݯ>;O_}O_\WN:,x.֧O" -endstream -endobj - -4738 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [182.8334 688.1684 188.3334 701.8304] - /Border [0 0 0] - /Dest 4456 0 R - /F 4 - /StructParent 54 - /Contents (1) ->> -endobj - -4739 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [427.80704 647.1824 433.30704 660.8444] - /Border [0 0 0] - /Dest 4457 0 R - /F 4 - /StructParent 55 - /Contents (2) ->> -endobj - -4740 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [386.99667 619.8584 392.49667 633.5204] - /Border [0 0 0] - /Dest 4458 0 R - /F 4 - /StructParent 56 - /Contents (3) ->> -endobj - -4741 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [513.6514 354.0974 519.1514 367.7594] - /Border [0 0 0] - /Dest 4459 0 R - /F 4 - /StructParent 57 - /Contents (4) ->> -endobj - -4742 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [157.93703 340.4354 163.43703 354.0974] - /Border [0 0 0] - /Dest 4460 0 R - /F 4 - /StructParent 58 - /Contents (5) ->> -endobj - -4743 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - /f3 4372 0 R - /f4 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 59 - /Tabs /S - /Parent 1 0 R - /Contents 4744 0 R - /Annots [4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R] ->> -endobj - -4744 0 obj -<< - /Length 4497 - /Filter /FlateDecode ->> -stream -xks$8KXޏ*G Hop,KUݙZfg||9jZVwۇ]gg]wbwﻫo~_]?{Ǜwg_|}o^]}훗_D;]qsJ2#~=og3]oϮx'Tw0=~=Uncwg1&1!V„#&fI+]20Ik捡&:!H&+$>J;9Dy7B@ǿaﳔ\ȑӁ9;y޲#Ì Cy\NWQǏbYar}E#|ް+:;޸+ -KfÊ}||,v"J DVGdLvQV4P z>lCZƕ9EkI'y--sdM1Ϩ2Z8'j6i[QbmQ5 ^>Z>Ta6Dy'$#7'^tzmLU&&FM -MjbóD06DO%oGnqݣtJm@ Pu,ڂmt@X?6uY#d44m`ʖv>꤀'Y0CΛR% vUD - j ?:i`!톉7e\ -;6gE^dܮp3N"14 g5 qSO`Krl ,!Y6ybD|qjjYP&QKもHG`4'˕eF/n $.: -G=7f9dE&80 Z.$|G]O -ppqa[78j>ࡖ(vK&GvQ -NHRZ)Iɼ_ ӒŦSD W7p)XFPr` ",cT)AR1UnRґvh - -awdT6 (+c1%[l1 (oYvumzqUbs UpLrmrEBE㑗*nV6, Ngq,+Xc~CqB/V.b -fjrXŔȀbJdC -2n $Mز(a)3 -mؐ@vS}VOU3K5)B -B.閒t 3}TAPPθs?{"B| z;0잤l()&Ȅ  H={ңnoĒ5HaY LQp&tOҋɊt$ 'G| ~>-e7ޅtT ΋*xaJh+a Cm$ʼ?uQBp$S& t<./T[ɐq -3ōGeqdgha_ΒSa s53HVtavnkL0(қ8f$Qͳӭ,`)`He0V^J8 DB9<5ޒA39-~N"yJh&vж Y8Wz%ÜIl"cWܙ< bREA-m,S{Uk80%8+ #diA;k 6nUvU٣X0V)[B&VrS@J Fڰ_4a8CHajNv~)qC bĹ9Ѹּ"gi/bw7O>|TOO l Z3>jNPk|X!0#/ֱYJXOr'drlJU# Qk:q?gsI)UjC2R=/ZSL*ԤSҩ$jQ m_RM4iI`g=] FLJbi8@DPvDE*l*,8W 4]pѦpLM mW8$A^4Vb{mn v</k\Hu5 |Q%> h"Y$JoV0pxpZrr]TӀX:5Q myʦB-ʨ,W5E(NoLˊ}Bi"&dT^!-Q,[qa,!nz 'dI }9cciQ\&ڱǓ#"YrGsMT0एKukmn9Ԥ,P ',33V[`1= ZiDD.RʣL&0~XɈP VOdbڱ ZJ+XͳZ1WӾxE5Px(&er ]dsq,(k[*פb m_e5c32R3%0ZTB'qN$8;N|Nkm Ax;Rl"̄Exru* k`OLYb!]V{0~ tBE0Fc&rFzԒ -myVDFIf/ĢeB-*wS?X~Pi1xy | ;)gQHJ;)f 6{o$'SZn:2DUuU|ng]/Kj<㱈xdN[|f=qrT!oF=3;Bh|< -Du}`]eg竌l mR+ga.(d|Zzϼʯ`zg`UM0Oew\xub9º{M^g&d -WbΪ~ukv ڧ6&!ZxywZāYy.U,4}P\9,Է -h07,,$HHoJ Tԣ9&ߘ?K= o~<.w!auDuűدO-+YehctA]m"Gj$ x`Gc4jc_ƺ墲^" ъ; |Acg}_1*Sۖ)_n 콆ѵ?kiq㝡Q3 Ӝ@57%u(lNIpJF uPi{|X^DuXT6A4s*#z-ɕx jCpClwvaR)D{ j8gxPY/I".C,cUjS/PD)x$ȼS :n`J8iu%Z[zsۡQ*Mily&^S/}Dtf926)/V. N{Aa}Z07FAI|giNHiLm_f4jB)B6j/h0 <_kyWy;Ȣ%5YlPV#-^t&x -2KJf%87,`^;*,σa]2C E$VzuLaj{ -x:^ XO$;^Ӛ6"rKe6X-F|okݿ@ (`N|kaz0x֋HE6CRևfh nj꼕"%3-0(\q^U,Nfk. /7wv/v~ow޼{_]?{Ǜwmw3aLXKԨT -endstream -endobj - -4745 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [188.99736 732.5514 192.29736 746.2134] - /Border [0 0 0] - /Dest 4461 0 R - /F 4 - /StructParent 60 - /Contents (Footnote 1) ->> -endobj - -4746 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [395.27713 630.11743 398.57712 643.7794] - /Border [0 0 0] - /Dest 4461 0 R - /F 4 - /StructParent 61 - /Contents (Footnote 1) ->> -endobj - -4747 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.57414 486.6974 81.07414 500.3594] - /Border [0 0 0] - /Dest 4457 0 R - /F 4 - /StructParent 62 - /Contents (2) ->> -endobj - -4748 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [86.57414 486.6974 92.07414 500.3594] - /Border [0 0 0] - /Dest 4462 0 R - /F 4 - /StructParent 63 - /Contents (6) ->> -endobj - -4749 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.33093 428.3844 327.83093 442.0464] - /Border [0 0 0] - /Dest 4463 0 R - /F 4 - /StructParent 64 - /Contents (7) ->> -endobj - -4750 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [333.33093 428.3844 338.83093 442.0464] - /Border [0 0 0] - /Dest 4464 0 R - /F 4 - /StructParent 65 - /Contents (9) ->> -endobj - -4751 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [129.7738 414.7224 140.7738 428.3844] - /Border [0 0 0] - /Dest 4465 0 R - /F 4 - /StructParent 66 - /Contents (10) ->> -endobj - -4752 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [470.06073 401.0604 481.06073 414.7224] - /Border [0 0 0] - /Dest 4466 0 R - /F 4 - /StructParent 67 - /Contents (11) ->> -endobj - -4753 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [282.75552 387.3984 293.75552 401.0604] - /Border [0 0 0] - /Dest 4467 0 R - /F 4 - /StructParent 68 - /Contents (12) ->> -endobj - -4754 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [243.14856 346.4124 254.14856 360.0744] - /Border [0 0 0] - /Dest 4468 0 R - /F 4 - /StructParent 69 - /Contents (13) ->> -endobj - -4755 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 82.78937 82.56614 93.517395] - /Border [0 0 0] - /Dest 4469 0 R - /F 4 - /StructParent 70 - /Contents (1) ->> -endobj - -4756 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4354 0 R - /f3 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 71 - /Tabs /S - /Parent 1 0 R - /Contents 4757 0 R - /Annots [4745 0 R 4746 0 R 4747 0 R 4748 0 R 4749 0 R 4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R] ->> -endobj - -4757 0 obj -<< - /Length 5456 - /Filter /FlateDecode ->> -stream -x=]+z#嬵o&;e;%qbr}Z]#f\wi ZU`v Awoovݧnnw{oի_}wnwݻw_|bWn^NFuݕ{e`{Mϛ;s#m7_ldw~+;7?{-Zjwχ__vWN g1?ZJ{L!G_ЏPCga>jwiw]vV?{-!@Rˮ?~ D.}s8l82Ed!?Nˌ:z9Β`22{Oӯ:N-egNh+v4{M$Q8aʉ r skiNBd3Q?1?t7|u/ZS(VS'\i -@ڿFx)c\3=g0ɺ>dgZvzw۟gK*F.X)u<%)"x7Ї[W^^f\fz(R.\ƧLP3̇2jãs)WBcOߓGpD`Ao''Y'x"hA4-ִ ËL1Zf -BgkriJ[ dD`gUB::.ji':~\:*xRE߾ZC~~|ij )E\"pvh+j [U3EՁzCM0JKn\O8jPg.Y&QhfF'>#dVl6⭐4)hK]m+P$ -J$T0f]|ϩH@V2g0`෧B jIץ7Z9{+\/[tKb6+@K6`s~t˂GN yF!H ] NACZ)o2:5=5FI4m䣙g6vp@thOdͶXլ8DW&vΓ9J ˆ| 0۹ͮAcgäqҍS` )\Kޟh[zWre6 WlAÒz)0k5=bFdwDN1 FsER+^)sXvvݧ_R>r4C ]6Q6.Ut@GUy5jH+&0tqŠ@A+U&W> @$a?܋no!M/#tzјdlr; vIc-E!l' 3O!ӒނberV)7[0lq~ ,.NLa(=όYANR):PZ(;CP& -#V+hM" AG :~TEE0"u©%% U/l\#lE/] -^ƕШbx`) >[$;i*A繠%-"uzPa5IJ*͋(K -wԌ͋. j޺ͺ-qk׽kjXkO1FT<ߦ:'ɦY&JX. pڈS]T'sN "LW WÁH9Ў8뜂eʡ' NTtM''v4~S\Y*ptVP@uRamif0Czsu66'6Z6|r[Y'f눅İJgp)d[r#!85-A›9-{l{#!I]cVM̿:kvVYBSD4NxHD.5`Vzq -dU.lIQKF} UYkٛCizʰ1:)MO60fCazG0q/f5™دpB_Z HUR&D|8c*0Bx;z 1^ e=]#; Ŗwҡ4t/B0qJNi@u:]Bmc:aZ45`^܉:(ImB t@\kd-hu"I5Uq䡱bV5J\4^Һ$|XIZ![Zr Bgsyn\iw; nR;9&γI$aO`&$PCa % Ug -P RH/YA]/2Y!`ۊG5)F'a sD1{+QOs*9?ġJφ3M/զЯ9?ݞ pN!D΋#4ǧ~D) YY^]YBt ;T)@Oy!:jk>QCƪD7|o1Se(7ά@*29{p$ՠkQ"< 8ޯ96 /T"jGM X4`V`Xv O,&+?$M8_@KUf!R@Z:4 "4ӴdҴm}@xئ9K̰5 155Ml/8@p*89M\Y[jT}JQ6{N6u +ti]נR&gfe]O6l{t[&$2{!ګQ֘l(YE(mg )*gY G= H8_ -C=*)X5Mr}l2`iZj%ɪN$ev$$EJp-Xdj%[H縴΁^Rur笛*i L$reSjgi-!<<݋ 6EU A9b%!&zag1 VM4ȎFYf#,/$keځuکgKwUP-W|[Ʋ AI׳aAKO;(B8X-jqTV}2{zP!tbia޳ZEOh* :A3z,$egKGs`K*U/|h "=);CAT pC+mxx*(ShJbʶ>,UNXyB_ -'X] ~NsioW >V%f;hTmQyY?1@)\ԓ0itF%,7ޭxf[ qO\#(*p1;orETyk \u1g{csPwqSK&NjMIN֗-P6 >O%Om%:a9)ߺTbpʶB+[$L5MAO"=XA&P -iuK'ԕB7aɒ7D167y", d*)= -Tۉ*W2۴롾!3 geiTKmdRe?oI{PcCP> -endobj - -4759 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [224.67343 657.4414 235.67343 671.1034] - /Border [0 0 0] - /Dest 4470 0 R - /F 4 - /StructParent 73 - /Contents (14) ->> -endobj - -4760 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [112.155594 473.5904 123.155594 487.2524] - /Border [0 0 0] - /Dest 4471 0 R - /F 4 - /StructParent 74 - /Contents (15) ->> -endobj - -4761 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [128.25504 473.5904 139.25504 487.2524] - /Border [0 0 0] - /Dest 4472 0 R - /F 4 - /StructParent 75 - /Contents (16) ->> -endobj - -4762 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [242.68085 473.5904 253.68085 487.2524] - /Border [0 0 0] - /Dest 4473 0 R - /F 4 - /StructParent 76 - /Contents (17) ->> -endobj - -4763 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [258.7803 473.5904 269.7803 487.2524] - /Border [0 0 0] - /Dest 4474 0 R - /F 4 - /StructParent 77 - /Contents (18) ->> -endobj - -4764 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.2438 357.49442 316.85895 371.1564] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 78 - /Contents (Section 3.1) ->> -endobj - -4765 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [267.97797 302.84637 321.2902 316.50842] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 79 - /Contents (Section 3.2) ->> -endobj - -4766 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [313.2113 248.19843 364.57465 261.8604] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 80 - /Contents (Section 3.3) ->> -endobj - -4767 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [394.14352 220.87439 446.3582 234.53638] - /Border [0 0 0] - /Dest (subsec:context-paradigm) - /F 4 - /StructParent 81 - /Contents (Section 3.4) ->> -endobj - -4768 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [289.3024 193.55042 333.3956 207.2124] - /Border [0 0 0] - /Dest (sec:system) - /F 4 - /StructParent 82 - /Contents (Section 4) ->> -endobj - -4769 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 83 - /Tabs /S - /Parent 1 0 R - /Contents 4770 0 R - /Annots [4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R] ->> -endobj - -4770 0 obj -<< - /Length 5367 - /Filter /FlateDecode ->> -stream -x]o$7r_Qfpn/8Xo$Y ͍tYU,[by%H_^><>꺻_꾿ïq_7?=_mo>/˫~}؞}埾׿]NvU]^.(mݓ~%?mߞ;?~ON:+~7"t>IyL{#v+?/`0AI~]SG)d+n+rt'*]k)òя\\bF󧿞~ɐh/}P3c78UtoA4Ŭ͜\teJW!m_PQAӷYΤhW0h:&[n=Rb׹Q~*v˱ J($|]SK=k'Y(Ԕ'{J˃IMgy1զ;Sflc0gJq`֔mn3!-}҈־cߤrPn6M,84*\)ͩ[ZDTv=|k˗vBK,謙DgK}^J1"h{" wMqqOi255E%& yܴҥFn1xZn')-NTA7\呝ÇHkH*YC,ZWBNPz2 IOJphaz - Yd/nA翿JWPAFYL 6ĊNZ}[.ݎRTøiqj@nJSZ)Og|7Rp ;Kn+^ -5KRƽ7Ngdgb2ir3l918Wdx5QbZEv)(V`YCz| ƭ0p]m0,ßZ dLLQ -Eߥ`4$8; :P% - -ɰ 'j#5Stn֋^.њsl>C >rWn"`#qy".eXr]pܣ\`-A F ڶe0&k23)n,orݸ,;3ɋ3Bk"DrV)v,-A:iıpY@-LILpyaXr -LAå(1\q 5NN̐e5H/)F6>0t]n^2(LRQ~=Ϛ[cTY@%Dk$)\r_:lS7.\29$HwUbU1IZH LъB`i.ĭH.XQ&&x+z{"E&;gf=*,0 /,qUs&.S zʼnMv/wsI16}=ST 9iD4q/Id nmIcA4q)ck94EJ -?xzt-%~ƽ)gH /܁E)_MH۟OBEm4wjQ]3E.3! hmeUMVXqmBONzlA6 -AۜadM*L g2b1[X(yʐOF=0# -&axAjs 7D:< rei8ו{gMuM+B*c -Z9i ڄ5x[bEԔh=ec-Oa~P %Wֵ,aeAX\\*:耈U+D0ŋdZ:f -EtfW -0blL`Ep^ -&it|/-pΥR%Ǒo̥/Pi>Q6g2{ZU365ZKGX+DuXսh|<)8N& N&C*%)- 4Gf.hepXlR=ܦC3^fR̡-w"e>/$͉ B'64ZO!SҜbO&Oml_~;B:ӄSzWAI5Ć~Jli],fCI,ck-ÒҠB<}ђSRC`}<%ĵp -J|oW-aGq"o^T,KAW`!P!UpZ}c'dѝ aXx[<\[>"/> -endobj - -4772 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [297.8902 615.4314 308.8902 629.0934] - /Border [0 0 0] - /Dest 4475 0 R - /F 4 - /StructParent 85 - /Contents (19) ->> -endobj - -4773 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [314.86404 615.4314 325.86404 629.0934] - /Border [0 0 0] - /Dest 4476 0 R - /F 4 - /StructParent 86 - /Contents (20) ->> -endobj - -4774 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [413.00983 517.1457 424.00983 530.80774] - /Border [0 0 0] - /Dest 4477 0 R - /F 4 - /StructParent 87 - /Contents (21) ->> -endobj - -4775 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [210.92213 469.3597 221.92213 483.0217] - /Border [0 0 0] - /Dest 4471 0 R - /F 4 - /StructParent 88 - /Contents (15) ->> -endobj - -4776 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [113.4558 455.6977 124.4558 469.3597] - /Border [0 0 0] - /Dest 4478 0 R - /F 4 - /StructParent 89 - /Contents (22) ->> -endobj - -4777 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [274.8422 394.2497 285.8422 407.9117] - /Border [0 0 0] - /Dest 4472 0 R - /F 4 - /StructParent 90 - /Contents (16) ->> -endobj - -4778 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [291.6684 394.2497 302.6684 407.9117] - /Border [0 0 0] - /Dest 4479 0 R - /F 4 - /StructParent 91 - /Contents (23) ->> -endobj - -4779 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [172.43578 339.6017 183.43578 353.2637] - /Border [0 0 0] - /Dest 4480 0 R - /F 4 - /StructParent 92 - /Contents (24) ->> -endobj - -4780 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.09322 254.30371 226.09322 267.9657] - /Border [0 0 0] - /Dest 4481 0 R - /F 4 - /StructParent 93 - /Contents (25) ->> -endobj - -4781 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [360.26782 254.30371 371.26782 267.9657] - /Border [0 0 0] - /Dest 4482 0 R - /F 4 - /StructParent 94 - /Contents (26) ->> -endobj - -4782 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [376.27432 254.30371 387.27432 267.9657] - /Border [0 0 0] - /Dest 4483 0 R - /F 4 - /StructParent 95 - /Contents (27) ->> -endobj - -4783 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [417.52737 254.30371 428.52737 267.9657] - /Border [0 0 0] - /Dest 4484 0 R - /F 4 - /StructParent 96 - /Contents (28) ->> -endobj - -4784 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 254.30371 519.7015 267.9657] - /Border [0 0 0] - /Dest 4485 0 R - /F 4 - /StructParent 97 - /Contents (29) ->> -endobj - -4785 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [239.99207 179.74872 250.99207 193.4107] - /Border [0 0 0] - /Dest 4473 0 R - /F 4 - /StructParent 98 - /Contents (17) ->> -endobj - -4786 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [257.33554 179.74872 268.33554 193.4107] - /Border [0 0 0] - /Dest 4486 0 R - /F 4 - /StructParent 99 - /Contents (30) ->> -endobj - -4787 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4384 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 100 - /Tabs /S - /Parent 1 0 R - /Contents 4788 0 R - /Annots [4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R] ->> -endobj - -4788 0 obj -<< - /Length 5807 - /Filter /FlateDecode ->> -stream -x=ra$^稉)G)INo(Yt)Or.fy^ h }իw7oO>W7oừ0~꫷7?<{w]|gWrswϾ|ӯA bxE=8 7?_\Û^o.>խP ׷}{~!Aq#HS'?^ />Z= e*¥Lm8 ֖yuhuO;0贱5Lޏ^xi@_Wi2'ߴUԯ|ksD=m%V/~7LIayG(2zPvt*fnw;xk~&\ς;IdLO4-a*‚u'NI&#ƒ2(T$H_-n>Yզ30k>yVv7 L"YGt\Be%F`X}\YJEMD$n -VKMY)HNN3U?dR(/[@e.Jx-pL9 X;)ʐSIpL(%Fk+;AjG\]-F9c(CˠePwqLQ:lxQh:O_{RBB$hvIY#{ OQcT 9z*VvBj4K+5Ÿ"JۂUm2C딖8U Q)JD[_Ay=l2,l iia-SH%VS-%Is:U}ߎ OB2c L\?IL|V9fJ;@U &0fIHѮדW_莕,(C2/y:b=,YSM= -4uԨ@U?[f;{dΞ45u҃C "5(?FeY5 Fq1$ZGpKa@+'Ð,h9k׼n? B6[d太ML=oحRr27!jR9e,MﺚRNm{4Hfu$7JǤ\`NUoU="%ůjNo7H!hʛm5m-n 嫘(%a̾ NaAFճ&͐ɝ( H7:M6dDb?M6!#%҂Ub,PT"-$:E}H 4֐@t!Gh[ jwInTqTqbxp y\fXK AdR=@92 -hcfONc AAiuT ejD@B[3.tj-NW>^fbf%T2%>d(xna;l-exmPχ-e))g7s0^^ 0|>Ȃu8ȒA86,1ΝMxS %~|n ,iqRZo@RpCx(]lOHQzTGy#%8u1՛_o~_'_~B4p?g5hx sK+)c1b-Q#}K(G9/.įúPz&;{_Lɞq k~8Rp#D" 0@f 8rW |Tf樘Eݟ75!48ڂ|\ -f.<{ $HF+.+ۓuلe,;E j41-<'l?'!* 1OF(Ħŷf+GY`>hbN75cV-PBGB5́FI#ck.ɶKt2B`b)n*/Ϗs[:1aWuԵW|Ix -|L)YJ\&\B/x2;?_ շ%jd$3 - vR௚R%Q\IQ7v%zZ"hKi/dkX4 -T&%9SZD }t5iKV2\}e)PکpUcگmYKGmQdӗSorrXY>m+YYjeK5t-| 9^H?ʀ hfbB$d85X" -mndHl0?f:m|Kԏ,tv)@[dF4.-6`<.tv%/nۮ<`n!ytv#APBq;lۙlkT0|9R#mҵ7 O£dt=^z'/ci }7K*uIDr,}\ORX/Y蕻Co5E= ] uq#;M\sZd,bKA::q5DZOMDG˶?-ʎq_GZ,0-Qab-#ܬ's=kI8߿cSH sԪo'~M)@+W9oڽU˅LaoZ !u/#1՝ڵ6 YGduW#w}+_e$=_#~a˞d8?Wݒ6]QB)_N$v,Y(䬗W?O^46VTItNd57Dѿ:ѭw:3pZ,. ]QC_LnX̐BFcfb*/~E0j'D3ȾVEa' `%vj]?JZ@>c'kWki4=xdĤfӓQc t huvN[vzY_D-_j$&k+%'j#NBS3=e}DD8C*"~Ck .=aJj -[Pfto/iDgyZ!CN4>JveCЪm#jdTДZzK1/<we/ɱziol~uW"֚${(I8T?zHLyC.9:"  -2[L3qTæUtvy.Ɓ'>E*sԕM<nIM{hn~cs協];!;J4  m TIe7ų"EOv{.$Pf_2觑CQMg9yL0 )ȟ<&X:%7l9|:[2IՖh+BɆʻ @i -+ /v_RlQǠ u7uMqA&J(mtCJTFM݈M~72o.inPr!m2)Ao{j!ek S%vߒJ6\%Zֆ7cnFZ8alQ;GUqs&\~%NɘIã.'CBj3TG9ҿY. s7{[R7n[~MS֟ɰ>s_ gzamCJnWDqjCkAy'|FKS[颡-¿VB6? -#># Lw,^ kr -nzE6q1b;@d'ٽB9<d7̀#J@heR+B\h'q-PSR -bEhteЗnb?c.!i,S-;@OẀ zBj(e qTGhi@N9SC%"ijB)Lw 5m] DLa6ckJfJx2w"0-@`C)3&0 d[%>,Z:}-!R0QZ{O\qj&~T=ΚFR=9G[sԦlW4F> -endobj - -4790 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [389.9495 671.1034 400.9495 684.7654] - /Border [0 0 0] - /Dest 4473 0 R - /F 4 - /StructParent 102 - /Contents (17) ->> -endobj - -4791 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [327.1667 568.66943 338.1667 582.3314] - /Border [0 0 0] - /Dest 4488 0 R - /F 4 - /StructParent 103 - /Contents (32) ->> -endobj - -4792 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [202.81924 555.0074 213.81924 568.66943] - /Border [0 0 0] - /Dest 4474 0 R - /F 4 - /StructParent 104 - /Contents (18) ->> -endobj - -4793 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.80038 514.02136 226.80038 527.6834] - /Border [0 0 0] - /Dest 4489 0 R - /F 4 - /StructParent 105 - /Contents (33) ->> -endobj - -4794 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [386.66837 514.02136 397.66837 527.6834] - /Border [0 0 0] - /Dest 4490 0 R - /F 4 - /StructParent 106 - /Contents (34) ->> -endobj - -4795 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [403.2961 514.02136 414.2961 527.6834] - /Border [0 0 0] - /Dest 4491 0 R - /F 4 - /StructParent 107 - /Contents (35) ->> -endobj - -4796 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [157.96414 500.3594 168.96414 514.02136] - /Border [0 0 0] - /Dest 4492 0 R - /F 4 - /StructParent 108 - /Contents (36) ->> -endobj - -4797 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [289.38113 398.4804 332.71014 412.1424] - /Border [0 0 0] - /Dest (sec:introduction) - /F 4 - /StructParent 109 - /Contents (Section 1) ->> -endobj - -4798 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [98.00314 132.16443 141.33214 145.82642] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 110 - /Contents (Section 3) ->> -endobj - -4799 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 111 - /Tabs /S - /Parent 1 0 R - /Contents 4800 0 R - /Annots [4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R] ->> -endobj - -4800 0 obj -<< - /Length 5926 - /Filter /FlateDecode ->> -stream -x=]s 7*.ɲ|+)KRg٬]h4Y*/IbFݸyپwf;|0ܼnO7~qo曷w?݌统?mx˯^^|ˋ{x~5A b ֢ Û_.nވ/7_^vsqN ?\BBݿO] R ? 9l9#!8܀VPx54Xiy'a1w^2C{k"vQ!6!C`&f&4;4W w5`6] B~;30 ~Z#^G%tF{#ZCyg4OC?}Y~ gSqY*Xi'ҜΥDy;r>\iD͝6VN[8~.fQ&+kؐ̿wA8r?P E/kBJ -.pGsH0OhP2}\?l,9ز`O{E0i7WW pGkoBeAy:fKl0B*%p T=y*Q:4=KM?Pڰ6Qb/܇,_# 4(6jɆڴ!PY&/{(pWW_-W䶆GAB?; S{ BXߏHioBX%l:ZPhzX;pvMrM*Y+}Zq:vDmzox:+apV kdF̭|TIљdlDhJVU]_S~Bϙoڬև*=λ2AmZ3pYuPvyw()y2iFyp,Kj!e cڟırG(%žeyELB2hl <@pv膢IwC~€5n \?]5Ҋ˹! xT5B04Zu:< N  -֛>}tr-M -NOsjE͟@o'cIb@M3en1GF)?'q1-%gP7H[0(kɯjLu|+U[u#M 5BW -U?V֗bnD`>%жjSP _@)EFj"…ZC:EGKHP Py`A 5[+,h9FβPDz VU'r'8^jDRDޡĩЈ/$VP8Q(A51SE)m5HK[w-(yh Ǽ淔3INIԹ8.dZs/|wՄ -J)Yorol_}/bMPnO߽=J,FZC?% -51̶lKU D)!`{Q(Y2,V,DAZ#|5Y)QZzE!.AMkJժ50PƚL+sk|FŧA7`i(k,_㝆^ nP[AAXUE -NĨ9u.][6$t/iApŽNoj듖2 z -# iٶ| E[B+&<&+)SS٨ȇutZzt:|-̴v̌3_CK:3ݘږ[+׉}oq%9٤ĩ4p~in䧠XŹ%ӟ]8;O<5ƒY5qn)jvVXUvnynH -ɫ8*׽xR4Fe9 ' ۖK$#vaCӆM{lKsasAԘ~rE,$I\:N?_JRD:ЖQUy|pM"*qwDtRR@f$fGQ/~ʖ+=3Q5"UhAITMjeޢlQq>VҟJ-H@ˎMp3&nlN_ 3c#! -(rSÀC-`Հ> V;kivi8^;ڧ`ƬwJ|, ZZC -t_S=)ݭ -׷OAwdWX}: *)3=X`tTzitDO|}dTh0Ny:*F~5(#_*h X17c_kbtm!H/@IyauNPo•Nr)2Rjo̤Z~T_=r6ӠKW(dO~RxpƸK9zbNrg[hFp iDA*sM>I${[U4]`9%._R!@O|lt*R -*nŬjIo _zioHAS!n8E!۠)oڱa:妎2rZ`aRPR"Kq!1 Y>_nZiqmlpvP;b|Gv|,P̪4 -hzƵ~kh8@W~0ڸs v_Vg;xjyQnb{岵ɶ^AcQ`o&,~adK7ا]1BM q{q=8' hX?6KFk :W4HAx&bݥ&QLH˓b 99]L/R%+4 DkqMۜ >ud,}Hv;Y HTlk <&ĥca˴^V,OxfSᡝhX_ܷJ^(7ōj!Z#d$I7:Mk0`6r &OCRHED~jE<^V?'ptޛWxAnGD-ة^Ra`1gϷ9ݤ[x;_*t K*Ov^2Qy)|+%E˞&yJ?'\J$2@fz۠8gw>>{b Jh̬aId+G2/p~x#=GTk8^A'sc'w?&3cKhuWU+lw}xj|Vw)3 ǀW&E~+`ӌLlj}S'eh$CJQH~Y_bIzsêo0;`-y᳞dB -&loJ^ME8@4 ?AvJ>04Fe+Z:0贱˜Myᐣg3ur]SJқ~V{{]0oxDśrHG93JP|>jbdS9LKwQ%GWب 5ʇ<(I-Z{FYh Q#Gr5J}J<جH4^<;HՇΙE(݌4MOvgm|@ ᗆ?3I!URwYOZP3RI"/Lm(-ƞT>¾w1PS/Gc}rⴭKxu53Gv,vDt)"nØl9O~G3lZ r~x<%≤Ǐ`©vp8]'d2B:b,IUJhZU N.$9:R:W/&]̏J ߒKHDU"?XF ]IR1Ms۱ɢi&gV%O%mL7p3?5}*/q0QwOztʟLΒXފ{5wQBؚXz|tͼһxss5z7t{ʫ@IPe䅿jLdreQFs-GVRLOx`qddLq."+;@#mK gQmZ̶A>Juie۪VOM|»c 9v(vx؅5k*̴=+䵓TyYNNc"";2~)UR^@N8xʁJcTȵS୔ SdD}>ŷ!o3t윀ex9CO]ǟwN;iH(M3PĞRHiyhYSU+,6ju2Hm}8!|ZО]&sV{־86S>D)l]rkM@ 1fr |>W\&*q=-B --%q5 53U77`eܕjuT.̵+#{+Ĩ1QE[#3 yKrd$0 :>[|lvi~-7ސJPXyOCUf<|V9֕״R~JSن0[܁:e1&JڍI&F{#G[#N$̴(LOlå.ږ^YD>E1229b4cp'vZ#X"6s@,y ʼnYg%T̙K{:. -nr#qTH SGH!=`!E%&}Ccz -/pײYàf -5 -d٧PC*` Uo! \V ZTDmRe5% (EWf.jhu />BD1e^f9O 6a\dG!tl*CW۲j ̓jOpP&A)qOmKmeF@ tjzh_lݽNh{? ?|aˏo~_7>|ؾ݌统?mx({C@cN9CT/g -endstream -endobj - -4801 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [391.98032 717.3104 434.9935 730.9724] - /Border [0 0 0] - /Dest (sec:preliminary) - /F 4 - /StructParent 112 - /Contents (Section 2) ->> -endobj - -4802 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.54614 181.4444 333.54614 195.10638] - /Border [0 0 0] - /Dest 4493 0 R - /F 4 - /StructParent 113 - /Contents (37) ->> -endobj - -4803 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - /f3 4384 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 114 - /Tabs /S - /Parent 1 0 R - /Contents 4804 0 R - /Annots [4801 0 R 4802 0 R] ->> -endobj - -4804 0 obj -<< - /Length 5927 - /Filter /FlateDecode ->> -stream -x=r\7rH]:K5k;Ne7,z);sfg0C'/8@;_>lݾL}t1M/77y_~?כvonww/>d.gr{ϟ}$LrLN -o-i'Bpzz9녜ӛ 9<\\ p;|?R>.n⋛ Ix%@N).'eJ}9]~ nf7H*?~-by|nP>'4[L͋Y3TMRRR :d9{9)/ wg3f2\46;,G2Oل'_?@{V csRge6dF7j GKX^Z  NA;/,kbqS `EۋьA9-,/Ô!0e41ͯ}7G_~Rybt_[ڦpVXCjhIHaC@zi/7LNA'拌X{!_E< 7\YQ'B|Wg -^>nQy`0-,/f5Q<=6mdQ(ZCSٓ!/o?Mx{Iik U/ }M8>w:݂aJB0$7RCKvڀB/;gy3%K^]AJJz壏e ™E)9vQhJ v/@Y*h<'0SwCnx\-* i&oS %>1Cn/f<ܽlc5} ^0sӴ u@7'vkZ Ʋ_^RVIk;^AEauWgH.o+K4^Zz,h[-"9c&Im`̲`9*U׃O?FEnHPGC I^`SX#o:z{KS:4Br^]T~O9 "WL|Z̔7cY6qnߓ]%q38XKmC!zZTWn\ƦH̉F Ƽ PhU}Z" 8RX#[FRgop"XzHĬSJ -<0$0$+6K&u8n)b)ME/ЎyDߥ]aZѪ+Gq#qy$OzdU6}I!)]\EGL׾c"8]*$ S^I+\m4+NĢFH)HLI⤛k c mq +eDF>h7|iB)Au6M[H&a3Pz6`.›>é=K~x9fP8-Lt$ԩȢH܌-ځHV=ry]W/QLhtx37#:c Iv,RH DۅȞLrD6D1Q IYʴY CJߥ"~*r?s2Ja8 -:nr @B{=hhdDx˞xI;54O@DKRsly͙u*-a߳r:vېAu` -Mu$ 쩁Q|ʋk<֞]%>aN @Dt`zM'>nN&3{/xv_ڱS#.y_WЖ4N1e+xܞ}iWUR33A<ݜn.+8rgx3u%Rǯ->(Aa W'&’HXb"Q&TF2I$1+wh@thCDC׵ ڛY) ֧ѡp= "@S!ez.'AY`'lx-O]ZzcAOsOagE[qgvN^63 t0B?\Cr\BٕfՒL;ec -dCO:ϑHc`PѫUVN(N߲ANIV|rjLvHN/MVclh£=EJA55RP&X"5<|Zl]g3}.*jS=7zff^gpghrqqo[Y8. N Dm|pvEYdgg=J&"A -PX }Wzq9A@ /L]LQqA.`†P@4ik~IS2gs;1̀.rha` @E -+CqbV'h*ժ5Kq4HzeɭYUW3WYNA,Gk@'ue\lyry5mlBΙv:[ b&*ԗ\h -Pqy7pM"gwKA 3Xzm#2 FaaȭNXASuRvRzV' dt˧ԹKZ)01] bKZ—QuݶR5 -姡mP XB02eb#fЗ%5]@8X6ԵINd7iA$O]LNm6z% J40B}~גhi8ӒS0:ǒfJAOF;ҍKc\?6ǒ^|/˜vbE$W2 |yHbߑ4|bgfrS߶ ƚϯ6-nmz@XPd7AHgl򛤟\e?xo) -;`Џp$i4A !֑RB[l &ڭߪ us!-ՀçwZ`xd'z|fd=Akp6cnCu/B'\#S6b ̃F,xuY&$SOf}O{)2xӓ[&_{R2اX}7],3ȇhlb޾`IOW -QKĽm6\ -lГpN(ݹzExW ra'?!_,G3M$oLNGy_vWoNWw^$3Ji4Z#2y5Z|]mJ/: f -j #]Tdw%7e!Zͩ64tA/ɷ/ƹYIM[FmG+CR0O҉`C]۪7M -Xg_Kމ4|Qi-58yʊ14xp5Q&F5=斧l c d>sa@&-E??^?1CMMU@-1 ` ITz'HmT`@M1H  ٛ:)D{>3y5Քz.'J++FLG`Ju>cOίjQQHy} -e_ ;VsaȏZmo vNCLyB4$⭇]^9 -u뷏ŬCo=\\Ђ%_RFh4woy0􅡋czED=b=ʹ\lM4I!ȃl+  5W}ML%V+lj.hE{b4>jO2=ACU~~ue8\̇2_2U}tԛϫgyh\ykb_O]V4)e6f!hd0jek䣹GooP cgk ZY˖\_wWL4lPWB/Ne]~%^Rl%1d| / CuGݞ_uwZ4YY>P3[ʆr#lF,_U^ -^-B0ݜ=ރS"NYIz>5錹v[uDu?t!BMu<6r1tڸHG [:Q:,D$3˿*䗽Ta%0Zh.S$ G>FB_XVN>ۏ&bHaf'o^N>& -&U2egWV@DJ|ؼ}K+67y7?ݯ7tG7{ӻͻODcl7wƾmm -endstream -endobj - -4805 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [259.9224 538.3174 311.83884 551.9794] - /Border [0 0 0] - /Dest 4494 0 R - /F 4 - /StructParent 115 - /Contents (Theorem 4) ->> -endobj - -4806 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 116 - /Tabs /S - /Parent 1 0 R - /Contents 4807 0 R - /Annots [4805 0 R] ->> -endobj - -4807 0 obj -<< - /Length 6944 - /Filter /FlateDecode ->> -stream -x]Yq~_00&*:"(<eQ7 Jt ¡ޝ;f{vndvUVfV_>ݏ?z}7|0<뿾~w?k?zo߼{z߾ۛ_ro~7_÷}_ a! acD 20Mg/o€8aaO7}Bn~>qtO*!!GQ Ib7oB -1@ -CS;x'bua<oQ{B|t| >uDG}ar _~;dMqSgOedB<%%v1fn꿬P/ y $_Աg DP޾U'dӶ9ebjscUqce08jpdnzp;Ȇjbwa0o8޶ żv~FR AM[^BA\1!zv ^k"n"136ruGV냃/vǷ=M`:| -SNv݁voH?oóP½f)__޼(-9H|֍D܅=uwOw/kT}\{ D -YM*?$!/O8)Vqϰ\MsM) -̨M [';.窱nk.Nuh.9^T2f^RU G-(cSffME-2fE7k* \"79FfPB-}7"rφp -?Q$ - 3V)e$1#'q"YZ[xړD@cZ9)G US8bGJ rak쁺 -20riRO?27/&`Lzcn/PŸNdƫByIhc8k#1Ab]FAl2RFՍ!h:n K?k_ZeT̝Atb@Z|-]ՈHEI;J)ׯyq@DB\_k"h-b'We.W;ѽ1Ge|!Ǽ׎~/ (~MR%^zy -ByW %Տ^F1"*|ExuE#X/BF>hQ(}<ڶBv8FL- S:ɋP /{w&O?r>Hg눗sn.DDM' ޾Ϯ5"̩ Z(w~Yn\.\n8jډmK ~hd`"CAͫmqednlFVV5}JuF5HkʺۑDMonK鷜6/MrF7=G:umޫ2;(qV%Gz[VʸXd4q׾FoTbN2h*枋[˒hvB ͱ&,h?5߭)֌@TYZ0I֬!EԳNܧk1dq;Fh Q\<äy Qq#wBRb?Z{U*zRp/Kʐ"/qʍ`收C+ 1F1xfBX!D䭮$!,@Hζ۠>GX-kbo= 1p$.w5ٻ0ݾrL}z_:&|M%Z"@Z`Ƴ~8^)Q۱L~U8s4_z2i;{1z*Vv&qШPdMb3C.h:܀9&Ni-RKЯj>BɐR\ɇ&[q\_>4'ٔ?VD$qR7VP C-.be Q5t'rZdYi֙S`rh:pJ+3p -{5]QJg"_|RRGUVIvPq#P 4ٽU<@o c-eMi3P+CG@TnS]Hn) Яze=^U !!FMKpPABB9AE(oAD )@IdyXL@7Y֜gq}[v'`N"~|^R(Ļxnڻ?D ,w}\J$nݎo q#rw$&JgX tUC&|^J#!`ı8]趟#%ș9C$+Z s.nap {P;ᶟ*`( {w(ܾtLVyL9nk:fKU/unN"vc1 -.P-Kܼv2؁=LRĦў^?fч>xW\ڋn;iB;h}tѪ͞>C9/F9<#3q?Ycp⦆m %ۂ|ju^D#b^7^_(`I T]u_~н  ,@!.BU †^D6wuJ[B89t rl}N M Dz VŗE@>v ZˣgJ\ -Ao;8ucv3d6:K 7  ؽ4VG9nke>ß,ʄ\Itܱj> r<1>H=vֿ6iYǪX_%U~]j R7Z5QA)^UBKp"fP#XbKp@)5\G3ZGѿi$݉j3@@,޹̚h 61$ lA7@pH\a %Qp"Lm\4@9z_z4C`kw'5At%+t[%eӋuv@VnO:pJ.WGy_܄ yw7n 40͋Z35AYJ i$`b1`TH!0efdGhx}g6QsjgmGEBL!A(ӝkBPR1$8A -ډ -cZPđ(5 a$4 "em&q=!qFOTHzy )y50AmM&e4$!(.B7-,PKJ=mz {ݓS_R=ىQRdkvv}ܱw/;BSBf:nIe5 鹶߇̰飥AK7[IB^Bj9>aib^QXQ t5a!&3(l d8ؤWK-kP9I%ĺI"AL9*#ÿ).1p1AF@q@-(V4gzW\nlR*a!>?9pZִ1T KtZxu#>`ru1<OB gbS .*8&/@5@AW_]]bGZmr C~Z_ -o+o𬺜o/7 _r!;r <̆A*<5kZrQ;P"#vɸE8}T{8Cۚp^ !P{Wp\Ԫn6bYfG4!eջC ?P#Vvl<] reGkNf Un9\ P=.!$t??0SHa;#UV5&Kێf6(Ndrn'Ƹpkr1iw!:S㪔QL#&1J0(>Tv] @B8gow -}g,'OG -?:#oOGjoO!!v ť@(Mk⏨P4ys߅%(tag(+oóhJ"vhPv^ɼI\ }XqKd!U jorWBveSK()gY 4M%t?pw>yw NosJ,UMUv؊4$]]NTa3W% zF2B +;o~|j3Cˊ( - -Թs ߮mlJ. sq ZbVkڳEm%H(֪^?K.l I&ޫ& -s zjf,'-Y% .N! p@TթR(7mBWcLxt"쩌hԼp9 lqT/T[z簶Y61sP6x$@ \x_r9I=2P|'#б{ip719fךX.fHxw19(^] ؒwq7X*~w55]AlĢL݆ `S(VF(9SXE)Y -沬$!Y֚iVIPreoSanN"MlW?y~?xTub͏$kjN<͸On<+ Bi -ѡEH{熋&cեuuQJ I7E[}哉Q"y9&W8].a <|ި*aCyXچ,l?S.0huƏ)vs> -A(1sujG? rUx=^&Z9dߟSnveV&W r)n'rv-YǥGc@BO.Dvq3᎞#0Eշ'Nx~>||)y7ew΃ONTEၣʧ3vX9cXtEKᔬU.ʆkZ[] Ic7J vE-1ehc.8 <.ĈaJ_j䋃[01K3GhxΊד_:]`4Wf]0s(]'Rv96ΪޛD1(Qhw#[՛ ens-}9i!6 B!QbD]. -1[,] Wt?,B_a >k.G]%lk:>ͭcѷ?>0ZqQA*c>q8})}>ylK8D( -HG9|o*ONRiG#n!%<0`5T3 -NY2hkv1>6xzf?5GUg -@f۞3qu| 2KS5~&C GlQ%s:S*+S P(EOBʌ޺V\]{F|6-_xs4V ul&i<-)LxRZ&i<)5<W 3Q)}X Ķ'%f*>fg!C.M~+mjomP<"hjWD !kmz6 9y Đd)q;l1m)Z6&+EB&Tr!I q*55cfp>)f./f4?%@ɗ=%t]5!ΜS'Bdۗs ט%Cɉc׸Q| z$dn#KGMX5j5e.IGyd&.4vKbo=ҒwEWY9P.'#ݽz7_?ݻww7ݽyo?z9OWw?{;&Hj~;_<_:@] -endstream -endobj - -4808 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4372 0 R - /f1 4360 0 R - /f2 4384 0 R - /f3 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 117 - /Parent 1 0 R - /Contents 4809 0 R ->> -endobj - -4809 0 obj -<< - /Length 6139 - /Filter /FlateDecode ->> -stream -x][m~_14؛A\Z%+%QRYJM*aI2SRWߧ0gef0ӽsF*끫=;gFgn޾zu}E=՟^?~=_|=?=ꇷW7o__|iO.|o_t\Pv)r]tg׽zwvr_^]_|.{ewy/Px?i{ŗ/~osJH+N~|=bn?ߎ.Gr3w/ o숼@?>__vr=}x$R^|vr\($2xf/Wbp'5\2W~ ~SY -H#LE^=c^v{3\@_{<py.(XL)Qt=!/_ڏN5Nw9".t/B[_س[.*-}O^~E{;'y` DwΑ-ws{a K\, ,={<@0qs'sWиhى7H|{xZv=ʳ_.SUoG__G{w`n |L]}Y¿քx?8_NNjwb,:%9`2 ޺8eE϶?{9QHKV#e E'3.s!ihuՏ~hGVخ0kԬ%7#qݷu{29so7~b5/ wqVr]ܩ=\x;.l2檬Y &uo,FeD63 D&i8GBW؎Iͩ uXm?^b2ÇFொpBl/sdFn޲wem~i8إٚؓdfL-qI=åWN}qif'#ƫ>_$EJemG>P>=@\rwK,a9u; ID,Fra_zACS׏gXSSKϱ>,rafTh6>Y-]1nI'_:D&z4,wƹohr>Uqq!R6Vv\0UۭA8}]nKbo w36`#s{)Ҟeq' UR׸lCXԺ#v;Zc(rYyp[?IY=WϴS}"_3͆ -E< - 0`+F!:a πAEDC iuٓ@FIro '!v8Mqfp-‚9|x}dn:qx5N -V,|qee4]pV _1bN R^~]"$kMh:# -&2b c޸{n Y"O7 +s*Sءq9hObz0%b&,NBP>Š| țVfDD %-[WLBA{"qmLH~Rm3CnL3bH+Ό% =3cc/@)jXr)0Cc!rel0fh2@)5̽AG_JM8sw+d+ma."6ZfK@i -2İ -f دbJoFy ʙoL#8gέ0tA g\c(e4]Ȍ,YoSldTbv %ur -w,-7mfQufz 8XLL=,)I^oϮ@9q}maа,TY_i2ATR/8|=M ZFTG$ ķт u뇬4cfu=MuB;:&O1x<#O͖ۘ8)a-zӰX?Ė<0=1g ?m KEt]TWes s{L=pedX] Z;WM-ÅWbZ^^[lԱ1O}b0DIIglP~&82 &F^"([ [Ƒ] -2(d8\+T_yf9d,Z3-0[fLn#%,!gNsXt.'rs)KQ+P|PK~Q+ "4 E/`AP]a; ,P2(kPlD:X(bBz)m` fZA --1s[Gs_< ́i3MtRJ,G:KQ`- G!`@]cR4XXgS3R4a;XgoAߴ!%\A零P[(bh@_6 -XGEvkQfTe=- Eh8)99~u ʏ6v&e@G460v{s^=5ѴcZAEw`ǨHhi y\4vn1-٩PklG7tFEҔL'54m5mvH2S r*E{ -0z?p羪lvf{/ü4{%\5^(C pv޽ XE?*8z7^SN(RLY$if͆b Z(ofG1@r~f5;^V_^ufyaW]unI}B/5*Nufr΀\Iq:|Ҕ}+5Swnѳ_blDFXBuݤ ?Np7UXj=mr< }]\$˝NP3[$fsqɷaLI@k|E~ ʸv3h \X('~2Q֙1>:mPoVbt<;(ӗo0 W&$1!  HkފR0r@`N5bh4K -+/?vs&jf5]A;CpR3de4^v>4/&= UXupY &/=,L/Lti ӛB>5t{nCQZgD(cFxwܒ#Rm-_bmܼ}sJ0%s'('.{_.\uO/B"'AwY89zldSJ%2)0v S!SsPM 'p}5׌uA:8r8A( K_0U3'N?bxkfwCR'(Z]їcLj:e9,ID8\o&^}k=yǀ'R[fQn!BFF꿭Pߓ =@NK$96(^%K?R՞=2{wDQGsnޢStMFUzwV"Sҥ&%:$l=M.Qix:R0"_Ӷ3Ɯg-(f  9wABr\ͨ}[ -ĀYXUz1PωS$zɘb;I[r&g5ِ+9KkЯN9("St031m6b1D>"ì0ɏ0r_V_'&[2az{+Ll=*QvMiG%=r!6%H>KTd_7Q3C()dtG ?M.!aV坌N}qv5.cŸk88e~ƆM3-f -h' 9xT ČXPC5ts_.v3conO?_ћof\&/6DlWLbA(}R<ݔ95``}C1:9}QBYT;DQ IL8i/d:gF:յ14ɪm$NcmU[$R634 fyTHneb>)1dhb)&|Ťg:L$?4Cm=x.{9DM!'J_ ,~meb",=+;82!/Gu -gb!%Ims5w>4et+QeC@?څPaf(KvYR> -endobj - -4811 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [186.94914 178.54639 238.52814 192.20837] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 119 - /Contents (Section 3.2) ->> -endobj - -4812 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - /c1 4403 0 R - >> - /Font << - /f0 4384 0 R - /f1 4354 0 R - /f2 4360 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 120 - /Tabs /S - /Parent 1 0 R - /Contents 4813 0 R - /Annots [4810 0 R 4811 0 R] ->> -endobj - -4813 0 obj -<< - /Length 6514 - /Filter /FlateDecode ->> -stream -x=k#qW"u8 TcʼntK$V*RJߧz\r= ͠@wxoy~oG/_O߿~ׯWǿ޽_bn~鳛#~鳛!qxj IaPP4WqxM>M ~sc)9D 874dP@$B\R%qxsC3 -F4q DF}jϿyYO/]}1D̃rw+7q㫻ۛO^vx_7z^[%DhR>j/$6np(3 )F`΁5!n8z ԨyHB -t]Y+h bɃRi/ -hRۯ68Pj<,Qq* Qm4rM+|9`0s<<~Y-lݰbLx,k_D#!ҟz4.;s`n5/lKL@4(Q x#i0) -9HPt.& kj;cHXpEEWѵrB%⠠A -횳A"P+A'I -v:Bf_"a9u:QG*ə3G]\o,ʊd~IO\XG$Y dN[!v6 $1'Sm* ATF9R{ ɡ)9_h>uJn-,FbC&?޽ v |7V8͘.⸝䪦\-?bQ 7w5\ᬽ9|ٯO^:j 9%A -XhM |~<8Q6<ͷXS/k\9K TS :2/"';Mt\G! -ޡXJSSgit  Ol7oLzor>D:M8KvZ>{ [<3X2ò0|*.Կg*6"` ZٷP[K~IH9G!Anՠ{b04+)5Xɍ!?]8qx[ι&n?c(1x,F <ߓ$,}%ndsrciA[P2R\/-#ŕ3(".'!ŕYr'xW@ZeIUNUwc x=yb/ǃA6SAo_[7 p XX?\'tމ6$۽Q3jgE5 !B˪uqkrA2e k\bZ9 6Mnu}hz7qݧV->%>B]=stء!S_Δ/ѧ3& { {/N;[*.["xF&&>ͺ%]djV!}dr6x$/iNީJE3ޤ>R7foLv#SNw{q29 -;;A;Gߩ{,U;(z'E>Nbsm6-R-AXf3NǵsUOy:qip'K4b}jns{]Al#U%Z{-mn=okl0[X/=)l)/k[PAlJ6YU`s݉G:UޕӴEҨ}a 9-w/l/i;f|yAy&6̉WU{1VՁwQE;s{ר"-bvF 5 # j`?$,K"[ dԒ_)u VSr2ʀ^5P _ŕ ! Pr(jY^J@P0K?j]g1aj?v761>TBů1vY + -wj?7YnQL+t4D714d~M -AJleQkB !FK_8A3JlU'0ĥV @?7ҳQňƋj tLG,q# JyPDU~UF Dv*`ˎD3F`]UPpEuZ(L܏B3HD) z4=r8`4 fGؚ~ *CV5Ћ@M3JǪ++굱?ѐ8PON lA&;c5as,@UeՊxLw"P{Z hqR#N\[֍BU`{bn#j产{5UO x,@51raV֘d S>VӀ``H 3/~;K]-~r~|q2eb2d7;T{Jֵ2kw@~{XO^UY[]QV_bb 7Txn0I -dq'Z&RPkyqqVrE NRP 咉-lQĒn-eki VRY -ʈ[B|ywox+^[43~&;^'Cpqw+k̡3MnV>V1X{~uK+peW1/\Lr_0'W9ʷtevMrbi ́B͚_BNiJġLtoyG l$z:4 7{(P֫ϐ)6]jwu`rwΡz[)[ $ZPN pk![9%h{^'wpr1iF7 p&nUh4|>n:ssn:s|¢m;gd)g_\$eTmDpPݒJvV_ -Hsdit!``pKsUkĨA%Ih2]~s/V4VUd ݛ`\ĢҳR  v?+w#P~"s>T~͢$r7Uu-!1'yxNm͢It ^qj59c7cխ쳎v ]W>~YQtk,Qb.U$1ݸsVq-v!]U@J`w -|cůL -R/kb+ -7ΖxQJ|$c:AƐnE/J3th~Gl :bu7'1n郷zsECñݼ贖)]8&<% -<n+m foF2OB0sk3$P}ij)'a?|LoPMRKOww<`?mFR~H-+pbk;!؋jXCn'P:[kvesF+=_-쫓ɐyƖgnډ 9W=. oiv`cx{(mwf5lޯ\LqK`ޯ~Ja_G2FfDXTDB[hYuBK;wcm st:' ?O'sn~CtknRnCߙK\]tVlO}K]ck]3ѭek5͟r:[̾;T-KyւቨFI8D͆]"ݫ'›G'%̅4K̇}!v0LwN,e3ۡ\ t^ <ݵ9VO9v"Sjuiխ87%eMS`F'VT\n2bjRcvUR\J,ԒmPB@-ݮivؙ 6M*JJrpk`,ppEF{ 6i[3͓G+ϴFgXsg^TA?.텫N$h"eb#5h匦"8r]1T8[.l4tz׸xxkz8st}nJ?y4ʫeWcCٕGLc] ;/XG1c tfW6{"򘕸2/u*ߋ4^7O^+;?Z%Y<rK<1 {g"/yꕪd&yY9ݞ)d-g:EbXJx~<>#rN }b(}ěqvS)+IW'zu24fq [;QޮL)*2Ѯ`Nco_%]rױ ۴(F3-t*<[ -mˌꚳ㓶P۞yGl=ߏJυأ hroeTܪ;琘[s{}M `rs Afsc%n9έ\L+C,y''Kg Zn_vjBt_]W -hZ59|f惞|0R+R%YHՙ?̮gxT`is(WSCoAusN.E R_ll .d/i@/Yߛo_ [E:AWsk6Z1]t.K4Sฤm﯎t8Mߑh& - -ɴB!k#];:p8m'rƨ%fj̷Vdnnmj Vhe,k39-awaqO<ҋd79y,1͞e7Wxӏ͗߿wݿ~k_={fy4HG\N? -endstream -endobj - -4814 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [321.7234 605.9284 332.7234 619.5904] - /Border [0 0 0] - /Dest 4495 0 R - /F 4 - /StructParent 121 - /Contents (38) ->> -endobj - -4815 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [340.1572 605.9284 351.1572 619.5904] - /Border [0 0 0] - /Dest 4496 0 R - /F 4 - /StructParent 122 - /Contents (39) ->> -endobj - -4816 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [330.0642 189.77643 383.65222 203.43842] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 123 - /Contents (Section 3.1) ->> -endobj - -4817 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - /f2 4372 0 R - /f3 4354 0 R - /f4 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 124 - /Tabs /S - /Parent 1 0 R - /Contents 4818 0 R - /Annots [4814 0 R 4815 0 R 4816 0 R] ->> -endobj - -4818 0 obj -<< - /Length 6211 - /Filter /FlateDecode ->> -stream -x]Y$~_XaVK B}+`df*f驪LF0H/7om>/7ۻyqW_z__~?>xO>ӫ_rkOlP_v 8f&`^ܩWj'7WjyzF ͛W[{o_mRӷJW}Rw>PfB$U *MWޛ8o]dSmm5_{9-V3o2`!8g#w=蝴ء:tM Nq.9#pW\XX5uzx9cz@~VM:1]2gw%Ø21:F)>|s=ku81]әpQ$s}r{Ij?5u˸smx|w*LZϧ0gY%aSuBDmsm;^O\!F4E6QˏĄ~2o+4ŋvⳅ^p1Йξ{Qgm&=5}*_-Z[ ,&)d"zU(A)RPRGkdyvyC,u^j-E˒Yp1Ku"QG,G/w@&oL3<ܽقeJ3sgd1$èK!VU´w_of^) c/U=u̬/ بWUQh|6;{$O|u0W^5;(mJilIF1ˮ-?di$"gJؔ;ŋ1USy;qGԒKeoBq-ud\}vP9?a5Z3(ԑ`P(2K F$21OƥfgflֹVU߽<9)u'-Xj_aug9互Օq-f k[~Fdfv6b\-.Ɲ3Zt:PSĭބp7108MdˤRp%^1 ⶣ)DW}LG2Svj3&R5gTh=+SMT;XjK D--lwqinf@T,~m{"KT)// y%4zPhu8cw>2}.W ^cގ⊢Džx!'\ ֒\pҤ|"m-gBI>V Ӌ"K'l߽B.wom̪_hU0S3SAb(&Nr"0nmkO-њ/3 XKtgIe.\ʑM-r\4T*EsȱX|L@{.c9\HMfP}\$ P l@p4@Km!6~l Zf<>,ъR!Q._.C?[=b',oZD`4=%IJ)AnJYsxT[P$#ƈ`U#!:-^Z[E}73gf93gTGno%3c%r6hb:NM_4Ξ[gl9n:f)5P;N}[ `H݁rԷ% F y&4=9ًᩏ#&g#)/8#(jޥ+Dcz鋖!N` -| LJ8YCsG|G^})/:<ĶaQbg^s6.؞3UJ9|8^|hU˧ӑEGƳ;& '[jle}3 -ƶ_Me.Z4  =8|7$쩣g'%TؤI$Pn#7o׫~n@q4^HhLD=N*{4t)) ѫIjqUaW6"9lbMsq "Rի0l:v!"W!SfW阁yZx&/&0)t؟AѤcL4[#[xPV.>lO:VM^ -#[kcP*_RJSCj@OP<\p}fP<m#CUO\딂NjY=T̵LK'SPk "k{8O+lm<0 w&Bz ZE`Akc -_y"3@ |?A1?vLY4Rt:Mΰѝ YnzT:XղŋB\0ZkOYJkT0k!wtjʝ6(/`LDҖ7^NhJ}7·e9SI4,ҋ>DwTi-)yV)1Ӱ 1  ~> o{HHaJf!a: N:V^-T-p}dcu:4 ;{^$WΛi,ٚv9{-IN!Κh"/s\?ip F*:v]lluq@JYesiBx%lZ*guecJ'(Y%8yUeCSثZ($ڪ$~^d!| -B/`=6"{ZA/@X -H15M^d`HfbdaVP迨YT m [|r1W4Z2\cn] Cjw2}k.DAshC9բ]ARnrzݎaU -PX̞thX"|1RR4J,4R`ρXt8@ P~:9tN37~`qq0D@L&H\I=z -HEB$S]C鳺1(M_̃6I)Y 8Jx*ETK_OXT(WXtz]ly\QQ 5kkƋ, ia`TJ,GA7T җJjO3|uMW!͂40-hW/K_vEyO ~ -@tYJuti<`Y cҿd9F-+ F-,1jy)HS՘EoF -1RńIn34- =Bӌ*JDD3u?X\e +fQ-_:xaBP[ 'T̀:YP"c9FW4NQm0kHaȢE -"W& 2ɥr &xc21L)@R[* rD+pV%c@Ŏ7Gb0ePz9x'2M`@*IŔشtHY рQ P[ 0z0.Y]~ X,?tLgVX( T;ykc3M' Eg8TvN$k_|&X۳ -$` tS)@xgH71(@DH ̞F#42:Aq2Q:>H )4/!d$TA;nO9CII '=RG g)!zH&bq<:UF._VMIJ~w?G=1IiѡUls=G3@*@ZAQ{c6}/bK V_oK06{f Uw3 a{z`480WNǦu{BJT$eH`O+c:2x07{ꀗJʁqZ0ג̠F -M ҭu]NNZ;{܌!?d WglL kg@te~owvm 4ZJ0D\< II(`/%W)IFt U -^TA?+۳p£,hz|FTc[3/۞ -7k /{KL]0^3FsS6ZC=mHnBT[1e|qrpȕ$xa3tD9C2Ur^yUs\kɟ %ZO0ğ谑Rqr׭BcKLA 3r@cs iך=2܊:pO+24~ң1B2 ڀvZcba6)0*Ls,ZֽH:YU↲!.W3-A^+j/3[p4\S>?3/vu,wu?m۟n>zWJ}Â!P}i*c -})B? %ݲAx)3 S^ -Կ9<0mm:rbE8N}U>Ud-gef[k(\Uw~zb㋻$s6Kج[~EYTeI갧Ctaq/`s`IEt--|s@`^f~~8Y8,0r!9$fW"5uTrG?mћRd:%eGUZ% tmMNꊫZ65XE?\z'1EHRY^*fŇw?PaNͳ`d:lR-+'(7O愦 Y?K7d:e䗗RHYhb4wxyn6ۻyɻߥo柿/^{L_݌rۇwlQ 0tfڎv.vP -endstream -endobj - -4819 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [350.45316 328.3786 402.03214 342.0406] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 125 - /Contents (Section 3.3) ->> -endobj - -4820 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4366 0 R - /f3 4354 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 126 - /Tabs /S - /Parent 1 0 R - /Contents 4821 0 R - /Annots [4819 0 R] ->> -endobj - -4821 0 obj -<< - /Length 5900 - /Filter /FlateDecode ->> -stream -x][s7r~rbW-4"d|@ɒTLidMS8<3gqfAƇFᣏ.ŏ/yrwW_|ۗÓ/_~>f?v|ooӯ>?_ 1< ֢ Ë.Ë/󋻋On.psWǏ㏛.[!ķB -p=(1$&A@thT?վWl%5ʦ? -89?;oL̇}`MCfsMI|33~fpWU/8 -. A6O Mw܏ 7x?0L)Y*L{zbݼnϿB}WBZCIj 1[l/NzihbmZDi 2Gɒaוy 3q/4 :AI"5ŞM+ѺidOCn6Ή=Nnz\-huj}Qy^fX3`[ 늣T,5JcXCjD]|l7Sυ뒭پGɰ&e oO>riEZf x̧G O6h0A/ͫiq*2C LיUnfc xE('g f:ùha "?ؕ+@eHzh%&!5SIAKi?SV<d3dl1}{CǙ~da55ŠY'E2$dCJg2Ujov#&`$##C]|s\+cYG-w \M{j{GJJW)0xN#GVhe&3GTMn"uK@KStvBv#G:s&=C\RԦrS@ȫORo%uˑ O~)Sj OI.,KIr;*l&#OADcr$k;PwA#@.F hudP$}gEh@mq$?ݷ,sǤ|8nhjY5aDQtI|pDQt }hEހwzsHH-:@ڦbx3՞7W>r:*KmƂm'Z#O,.젓O>&WK!'swqr>I(W -tN]"5uwښuء4`[g6,dGQ)U'<^* #/?PdX4-ܬb.bfIgzG+r)eB$(mmrycw_8| -QB,F'sH}8{{Ӑ.`)uTXE2%Tvsdt^  kL -ˍޖniE7Ɓp2aZ`զڙjEWZ1ТԶϔ7M2ӮeBLɔxqi=aK6!RZTY}ؚKѠ8|l'JiDPœv[~M^d˗y5e~|b˫g茾$ÇYCj!Ȅe]bZa=gMOά1հr#$hߗZs,x'#2gJF=?.TkT -6mrNz!]R82Yn,K{ׁБנ?p)cTUv$FQydOg q$@\\F'+'e&Pz-\%#c.ђ@:ϞjX2f:plgӰdȢCޠ xB!I6;Zj74:nKQ0(~GQǩTΡ_U2-;>Q+RE95Q{^Et+>QK T+kvvsYA7rSl;,Vʙam.Lo;E֑N%o@ؘ#ѮɑwԹ$YG'p2&6EL]Mk^Nĥ_96Vw+YP*&$u+#"\˛w1=A[[LuJ4AuS'5o(xvk 2) F@i-ܠi'fxБxm|#vbԏtct jsl/س@MhD,O@f^) Zɴ+!a$ ̺ͪ\dǑ_6*oAA,ZJ2s[2.6US e.Ik $&A.YMj+&Ϟd6ltgQ,&M |mo*FO,&ݔX貇 9RNK(rUDYZda磜UJ=\:X:;Dެrnt|VG)˞!SS6qZ^=ܯͶh_#r@tχ7$̗ %N4Y&m'Ը*%frG?nPP.:O.I}7]Ym*Oneϲ+r%7@4R}8Sbc RxLNEA: -btڷ>RZ~@D[0qf+,Wa.j$%DL'jG O 1dTE928mr'ʉsi-EqG˩9[8KSMOpm{9Io|+P1.t -R $-Em5DPY'td1r-$%~ -W,}4La%|TF}IiE-S_ʯU͸ž׵ؒЯ$ܒo&eNd%m6Evӊ!Y]:__c/˹l7eL5j0VgH|Z1ߧW]/1󂲤˘\D;uo3Rm#`R(#TP Q(Qz0ըgnr:YqR q Vr/>$kʼnftQi)=ӪF FT1#&8$ JX_qYZ}H$kוcw@6R,zX^Mٛ U wg -F[av]O8n^ -wt.gb,gh:2Y OUƂyɊy1҄ːTzȂuGZX-,8!0qU酿w3'|Uhg^6WܩVkcRu6 ɥYzvӺ)8Kɘ-e,J3!l69$ G{: jqEa -? HG`Hq@VtXk[,`W8Fn@* -Y.%!HXnXEu1=܎hNd9P +k+  -٬{r]~z`O|$™-<) 5wOOORANz9*xL|L>U }cM}ekI)Gg6+TxߴjBUG:Kb.I}N(b"yՉ|> ɏ1;4BبfN=?;ܡUhB-+)B8׵TpR~n-Q:k}=2TrO_N=nh!ؾHMAΉÆQUyBQ;1{:q*nAHזbfR~ms)jtJk}[y7fA1Kdj1]-~;"螼|Tydr ί87BϳjЉw3 -\-1@PAⴎsQ$+Y:&]+>wq."bFioke7XD6@MvaJ-%u,qM0;M ^_tbJAnub~5d1e!~(dD}8fI۟lվoUQw"[ҟ^CnzQ}@6Il#K6zbK:x0{GPy6}qdԫ4io(䳪F֯vi:LOVPG]HL<1[J\iSD(k #DήH "gEb6rzօ5ZKf|f{Lk'>礵YccQl.>Xd?]\e[]ϔ9s̴GZ,UаЂaZz9^lsاׯn_v?~'ov7?}/w}9<͛t7wdT!͓t | -endstream -endobj - -4822 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - /f3 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 127 - /Parent 1 0 R - /Contents 4823 0 R ->> -endobj - -4823 0 obj -<< - /Length 7941 - /Filter /FlateDecode ->> -stream -x]Y~ׯ8EZ$ "KIgW50z=njKb^|vWo|pxë7{/^/}˷y{_e?w}OO~ϟN~}pO{u/=;'xpwxC@9D@'/޸Û>q{Oˏ=/v}툎??OفP24рx{04F|xOK *@r5@.W2&v ̧od:"YT 䄼O5!3'jnyz8 Ot - <`JW9 x:n?P(P`̓4#uluI{׿_>}=:s7"C8Z9-!E<Ā(>{ë}|/p_z˿w4btTТ͆?e牞Mm9-ZEB Z}gpd%YkA%<&U:1Xr*(WR`?OsUCx!}x!FZ!V3Gw|j_B$!D;,MĖ4F! -!f~qQgt*OMh=b&#_X^$Xi;0Ƒ?t Il$Y4S;6bUpoTĹ>59@8qvc+dpHӒ 2>n0rY@"3 -d QBYCj*=Zk -Ca+59x>O63l?Ϫq ~4w_ -v]?pߙyZ|nzo~`v2t]u {kF_$caDŽX1RۇU}r:|K B5VoZ̅5jļQm_$wa5_՜[zAvU *go9*F][&5Dy-|M{"{(sҞiO6T=ES,+LoO'zO'2EӞ|N>ҞiO RujQJnQt0ΣJ/8r^!d9hĞzWC}?uMoaԅJxs+牸L|@n /_M֖oT!7O_q+4+ur]>ɫ%EJHd%3P&n^u_y|uW.*v[~&_<6L^|?NO@~;7SPC)׭& IpI\!8~9Ql --\Yz4zn\ly")c>t~QVWi,HeɘVt^>DbhEإOWk^ըK3)S(bԢid9~)2a1:|הfsQRS(}%_pfx?4KN~>@m[X=[WFdNOf`Fժ3cJ~=*D* f=VX 1#jz¢Cxa} -9?1"Fyrxȫ2%sqĺ}3| m"5lKcEK \K2o5XU0mMJՋ:B/E'PMzyqqСC~W_'fSΡM/iC5frTcY^%Y _U4 ՛18Q;;*^ DPmGVo!;Neg~I_%AB`B:)a#\B"8 -@dR֝{.!vٹS}ԑPSSɒeW"˔A㮄7}B?9*rvjGdSTo#p)U/>o;)leMA^2LR\̩cbQ.k爀)HӫjQ˹yzDxށOi>`81wrQW'jgfp7xtqWG)A )Ο@İq7r*S1~Mc@VS⊋_yU Af܇\g -. LEh *GP[ BoDr ɷbT0 6`a`+oIS  -U<Z7: #ȡ^C%u< -S+5HH;gC}:A HO05AymW#F7]ji5Pr|ү["oy^rasW9C1Vc+H@j%Lě@`;5620 yo7^S_FZ1\v_S~ك+ -gHGQLj55vZkH_)A7`%ZRj%K^Nf@v%SyziEZrM -j3Mz?kRP; VXzkRpq^am XIA{,'+~9)h] IA[+ -8DjYK/)hIA{KZK -ᜪ.vEw%++)G,Gb2ׄiJ"L4H\萬ڞ1@.a󥦗ŤHk0rӐ^"vn'C^|/5*/8#(/=Z/BmoHz\kP#k6դ.2=_5({¸jE 1XTaHoeːZ¥Iq+߼~) 򯗽.Pɛ_zK޸x+S"A/_r 8SA%.CPjM '%F-ԪVLRYX´WW;dknڕNwb.LԂAɼPUe05!ĔVlp!pDR V2` -PU5^U:@W)2+"R 34n'AjɊx$ PbEԀjɊ+XlՊ@UFxKVzA՚KK.),#k=~~S=f'=b^c*F.v{)J0w`q,3h7fazkՎXj%O+& =cuyצXA+>x,'D{ziU봤I~_pLʔ +6  ^rKƷG6PgڻnG)e|AjzW(}ݟxHK{tCm}ժҤvz+%|"]9'w+|ng/'ūm]%4Mlj0+7-7,mzÖ<WSnq}8խJTG^ʷK݅vP:++_ >TK'q뼱&{9jvHz[}>׋zsq2/e)۹,P1<&T9}'g~lnvIUw  ufW׿ڲ;کmSiwDsMڅM44lsY<#FsSix0Z^ U/:!AsK -UH8WbVӡ3F?fV)7M.(K6'^!zrl==U*\NkcB.yq ;.فgCf_ߴ0 ^:-к8,ZjGsScA\+?&n-gz8y{wotQ9IV4Xw9,Q0S?NZ_~nIZ}D3!>u{t~H4b6*<~(H Hwr¼FrcrI)X twaԾ `?٫jK\g9G@dš#[ȺF %6W`xO -M";aZD"'U\~T!${pGUiz~%K;.V3dLL+ȈyA Nsdn`G%p]K;, VQ, r*PX *Xf UK"1p Z}"TLK K|zsyT1- :q7hԔVȝPfBVӈyHơg&yv2AZCg=nVjCJ\헖6A-{\dp-aa yb^M!~l"fiySLbGfe(2P*jVNNպ,d`?*J+b_a/ݞ 8>.Ku/?\[ xC!Ǻsf:$JjtgB –0Ѱhu ֎;~64]36o[So);pAxý- -f#AHjiT1AͤMx̞ך\k,^.b41>_JDSbm,:fi t'1q UN ,?ҪfӢ%˳!!@p\@橛_2Ho⸴ĒPÀ"`G'|[2MPQG+RA1ݐC;^T"S;fW],@@@$~8Ƕ -LXB.ձ~~t*U6*&_S0kh(v -Ҩ`#}MA1ɬ1M›{iżh@c),c)|D0BG$ )b2im*_3B$f ? -K L̎VQ!r:8oC2AH;lf Dqm17` sG۠@\a`0+ n -SC -;Gda+\P*%g^&#l:4d$%[v| zxtct4p9.xThӘ2G>|~Sa8%pGmS3.;w=mr)sB -mtsJ9sGZa9MVGj 2NW -jLA0QA,T,O --9]b1#(WYu6kIYcYG7须"kZE(QdZ jVUY|)<>"W6馡ͦȮ( V[&:ss 9C&:G`p.ʪ g߾{Dg7?~x^|O/_{;5c9G}C(0 -endstream -endobj - -4824 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [461.69614 570.07336 513.27515 583.7354] - /Border [0 0 0] - /Dest (subsec:capabilities) - /F 4 - /StructParent 128 - /Contents (Section 5.2) ->> -endobj - -4825 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 454.5324 122.445145 468.1944] - /Border [0 0 0] - /Dest (subsec:context-paradigm) - /F 4 - /StructParent 129 - /Contents (Section 3.4) ->> -endobj - -4826 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [201.28658 225.36938 241.48993 239.03137] - /Border [0 0 0] - /Dest 4497 0 R - /F 4 - /StructParent 130 - /Contents (Figure 1) ->> -endobj - -4827 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [495.9211 82.57959 522.7611 96.24158] - /Border [0 0 0] - /Dest 4498 0 R - /F 4 - /StructParent 131 - /Contents (Definition 5) ->> -endobj - -4828 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [522.7611 82.57959 526.4241 96.24158] - /Border [0 0 0] - /Dest 4498 0 R - /F 4 - /StructParent 132 - /Contents (Definition 5) ->> -endobj - -4829 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4384 0 R - /f1 4360 0 R - /f2 4354 0 R - /f3 4366 0 R - /f4 4378 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 133 - /Tabs /S - /Parent 1 0 R - /Contents 4830 0 R - /Annots [4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R] ->> -endobj - -4830 0 obj -<< - /Length 7277 - /Filter /FlateDecode ->> -stream -x=]Fn+Hj48%+˹D~X%kUj lirɻKhw?}v{۫w]Oo~}ߧ_~}=ӛܦ_Տ?\f'ݧ=}_n_{:uS` (( -V~{zvf髝^UWv;wJ{}ϻ_|PGʒkAh2W- 9lg4X膃` ^E6tA xρV[ <0J+'eRoq 7qjk -Ǯt("D\e(Zj.~#N!g] %NI*z3#8g}!N퀨 xNR_! 6zS{"/{ "k;5_79_ƔS!4lhСwZ1$4Я_kM2.W)\ֈ5"(xqCZfRoĉ-,C'q3+ZHe_bHH˺ڀzRu~uR)F,Yv,S,Fe ۳DZrL}x փʺx9AZϩN_|pw%[.{Y',(%Y7;5ƧʇgpAkry!G`[=S T =_c)V*V_r=_c U/ea<낇ԧ '( -.gh!ՋEJ~l/%a*7c#@p~l/e)7`K% ɂq/!#@ m_8GƁ;/gI΋lzB]_uFh7~f^WcnDo>>n?:/v=Ty/KeU֨|Tˋ6oųygtSzF+p>s[s8ݞl5)PV8D̓!Chw~Br+v?4 -ll@g1l-lOIƯ!g[REl!ېe[N#vNj?(-^[NacNL2z@A\USK1zV?Pjp-BIemFA<=6qm*C'%x (HuZiI naUem/%T:jTJ!߫2ԺRhAUe(ir&߮rY6 -f\H%V*f.!e(fJE3밅CL+|j^e3WK3ġT9sḃf@3δRHA$]2lͨ|zdCc6A+& k"`oA $﵉ԦuͶkmKGd[mF6?ksicf[mF6?k3iD@ ²6o*nۆhr6'@1K 濑}4paKE'ȶFv6ېB -o-l; 4mg_fCo;+E1)9YR [=l E .ͷBсkl[iͺ ~Ԍ3k B>4S.Wߪp1Î. |; x܉g\ ipz[+ %YT';:_l1|m.&칿Ϧ>ᱵ6巽Ͷ:ms1f{|j0)c]L@P^gFZee[]LT@z?b"*s˓mv11MFm?vBmWlËU.u7@NYTҗM/943&5}-|;JHӒ|=TTNn[}>s2;/u&JXO*qϯ #|daY()g˶ io RUA~admHב<86~}-4h́Jc-4۽:VcH.T#)0$ ! 3fKjL80zn9=hP:@!oT@֣n8orb&O<VY'mZY%xpu=D۴b* ?I+Y>&ͥJƢE2@MH]ZcT$oBOiM+;wel7j^+K -eg;iX|Q\>"Tlbh81hK]C|t ACŘw8j#a Q -j}5c} NI449t*X=ɖ3)۾NLfT|(Hd]<3р -;tAN;eHF<;@}@ynv} EFM:Hu}*d-9Sm;x4JKQUCSs'Qƃ>u'1$p7}Z}BR -US {@?QsPQs(Fkr-Cq!Q޴دFw'M]2L_\\g'*qgrc{<'hwD.9P+cU܇XT;|Y8C2cf;0nJGGL8GꦂEf!gŮn3_h*n4ۨoр&#Ͷ[IZ+vtm}PŦ!l#c:kά\,)QʈjQdOg4iX<V3?H攐;,&N1*7ELHGo'BxOM-s:ψG;æbQ_^/> }uZWrx^D4*f 3xd{UK+2tjz4Wa3@UAsG*":H[LlCv珝Ӓ2]\I|k"y|ʊ@{}PFRñ{1 Qֈzq>6um;4{vQG)䊌C Z%m0* `JI(gOTsP 3 7&=;3sL n;{| HS0f5QaGI%(^N G79|i;-h) bKY" qb(d{>\FC'+>3=:UF`麼'ń9ZR9aDz94'+t yfh?g0'qCqwa[x@ЇaeRr!'GL͏<(uP~;6^/Ljm42A]:pKN\!8Cj""@˰>8Gkž,&9-~]w95ɻ}wϳWh%'.B)N3! Yc.j1_ʙ;0xx-b9~{R8?A_pw /5[WvO۴#Zq-3- `!I3[иpYS^N< -VN)Z1mYĽk&N2'@!Dx0ajnFbfnPJqmbBPVmvףE-he>"iHDA ҿUoeD -x}`n0 :VT+wqdU&U,凫q]Ϗ`NC̎ou/Rt,O.vvNVHF -F"{W|H7'x۲"|BҞ# 5]CcߊNۻ~r>KПj`4`͂t,0O=v`=R`|KM19Y,l!ضT1=0QhL -{̀#Kc ,;l]hm3b9;m`i0EVD60t(UY̠:TZD,.q0TI- 6MBuoG5`#`HOs_:\.gܰNq'B:0 .;7FP|ag - n0AfNM{ *v/Afm:]m0>O/۠O\FJ&4搼x,O&}m2d ^N+C}iO} -zvpꦤ4n,L\D2LTH#|}NFA+mA<+٩؈J9[.=;uʐkm]GƂaɎFRɘ* -TAckX3~t xYrxm6}mNGl0>CVvW:&<{,,!j?ԁ%2&WTsbL2 Wbr#|]wGҋh'lUF礁^1uLOc#}@&{1U@ XGzq`kA|gy.Y 勞HYa8'P%tj}* ssd̻"*#]CL=FYE;,0]5ȑKQ9YU7:nu`5L; 3b) Ne6r#3BU .D+f+<сW-M%)4) --ڰ$2oH;i=14yU_!T"-N/C4MfMs9K[Җ?j̚Pq^K ?Y Du PF\VۗR@/)v{]R` ){[R`W¯qooTCpG)0y^l)y^6c^$ѩm)fxt`X5O-k|V4iM}-Y}.O,=(%O:bSxmnVյ^!-ܮxkۥD'א"Eb0a)‡mg+'Nyn$˚B(d͝ -A57{IQs ʶeNMDR g/4QΪCiL,t!?6{v>R{*o{aT"Y56_M6;wcslۉU{v"vˉ1|m“]{ XNl˾*&O}CiĄΆ㍖tgf;ytmVXX[MtUՑ6ȃ4->|SnyP8#!׼QZګ1/Q-޼Pzv\*n؊Mh xj o6?yZ6wY&_vrZՋw_/`Pd^"sfTqj:&ykv82j]pŭwip=p^ 0]ogw?>}ͷApC5cN绗Ͽٙ?қvveRA:p AP6 -w;*&ٍv -5ׄ^@jAݱsw4:زwETuigZpL۳]Ͻ -^.4(tSD;J/K[6lAvfHeaEФmoFB"ݞ.DЦ -Զ%B:xx`;N/?ưw.!KgtfOOO5UUkL2nbI/A}v.vz;W,`o:5a|꣍eYΒO/?|Z"߭^HfJ1:F[53udf?8绨`]{N4 4 Btlkl9^1 -ɵmKYLlß\E~g;vD0Fkwټ|vI_.^LkO7scRK'hpk;m&ڶOQ f$ΥGb!\'(4!bLIX&3è6 &OV_0 ='zGS/!7{K˩,Sg>*-OTTGO>@pJV=iQx81fܒ?;!G{*5_""`H/"u>Oo~}O}뻿{wonӯ^?ǟo~~mZQ.6N; -endstream -endobj - -4831 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 101.63025 759.87537] - /Border [0 0 0] - /Dest 4498 0 R - /F 4 - /StructParent 134 - /Contents (Definition 5) ->> -endobj - -4832 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [426.6189 732.5514 483.94568 746.2134] - /Border [0 0 0] - /Dest 4499 0 R - /F 4 - /StructParent 135 - /Contents (Definition 7) ->> -endobj - -4833 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [173.22722 657.4414 184.22722 671.1034] - /Border [0 0 0] - /Dest 4500 0 R - /F 4 - /StructParent 136 - /Contents (40) ->> -endobj - -4834 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [260.59808 453.1714 318.8676 466.8334] - /Border [0 0 0] - /Dest 4499 0 R - /F 4 - /StructParent 137 - /Contents (Definition 7) ->> -endobj - -4835 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [118.39714 339.1854 178.22614 352.8474] - /Border [0 0 0] - /Dest (subsubsec:eff-composition) - /F 4 - /StructParent 138 - /Contents (Section 3.1.2) ->> -endobj - -4836 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4366 0 R - /f3 4378 0 R - /f4 4354 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 139 - /Tabs /S - /Parent 1 0 R - /Contents 4837 0 R - /Annots [4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R] ->> -endobj - -4837 0 obj -<< - /Length 7328 - /Filter /FlateDecode ->> -stream -x]Y~h-%#yPȡ[r>&eyCx>Bmh4êB"3HG?yqO6=>||۟+߾O7Ͽ|ʟ^l~'~O|O__?ܼxx n6/ޜ^.?^7EOo%Ef}y'x;rR('$W!=̩9n>짅hcMBp-v O{v|wv[y.GkjL"~ -4NЃpУ[[r>ִ 仇, -4N 65`м(ɥ(0%G$1Cܡ7kAb766ػ6 -η[[݆eaMޡe+t|SZkRfl)s4L!ˑ<T=&:sQw'f?<$Af7y,{چ}bO??;CY ":G:6~sq8ylп(WN ƖwCxpU@sEBd:ΗFW:4d/z]~+12"#QS9s(J>Bb[cyv QM,6\ӓ0̓L#Ӣ 6q*o(盻M8|yq}~3Kymvn/?A|&iY F褥͢#Cv/oZx_i'Osޒ]G [RúKn#2;{c9WfwZ>KO o.pqszp"\"[)l9 #84GS>/+:T}hTϜx:|K+1;ӘɎ>TglN 6\|2ifOlQ ZF\Bt@ܕq;*5` D i@L$gzjE%2P"5 8->J##B$ "VX{j]Uk129nvz da1MUgBgYNOp+4sZj. I2D@JL=LRV`9X!1BJM 23>QtcσIKsZ^BD6ބh, - ṞQu~^+tMPr+єasjdJ3f8_ȋB[QhKHII,NFGu"`'GfX^l=#E Ǔ¥M< p__9{-}NMj$I BZT}$q`$m5D=s7G鿞ӕkH2NQ*g Zo9ӪRI4jEX^R]9sJ=[ݣtմzr]y%6s's˩be UӸfDé. i AhQ#ӚѲgXʒj~cZԢ5LipĐK9*G dEXԪUszsuV$=Ygߓ-!U3βE$07dG -u1Kډˑ'Ye6ǘ&dHb?aq!P2DHAS#9`l]pSowXcƤ8.mfk;]=lx580Rjez -g*%74"A`l/f]L%`obϣf]mr,UxvU_:)|1j K&_|E|5T\VQ%g%Ҟ.n )jlѫ},lWSX[\֬k|RMD >8R#`r;Y\!u0&6,T O>4v)5"8 ÷dUs;bVK}Ԛ=0?%h2x?veֶ34wA+^;k0[2 U03yĐig*j&C)qHlҪ1V7KH Re%۴³"W;+<Nۮي>҇=' MD"ήO;'r"(L.+{Ix&39ݞŲ?>Atƕئ{&Z[#p / e*i͓^tK]m!Ф"6%/k 7~ pfo -br?WPXʮ֫Y_?mjV(i1i ˘+,]=qoMΨ{U>@7[:5P!ʚ+gZëy*$=j秆vf5GD;.,dVsT {xsj2obVCdu- -5Ɛ}-v9/!19Ls7]^_ |@__UW*[1WM_ikp UC1kBfĒPQ y%Q桅PA[lJ]tyҐ{]0םa9> AAE\؆j{<0T8<`'>ppPz=srCnO9utC|= ÐcPviJI )eYT_ B6|S}$`0` Fu z2t97b;ѕ8}|Knuc9:|KJ8lG|)SgPqntkגh2@*d@@Uj;"祺 -M.Ƙm18%)/#K1!@ͩ`.9q:U&&cpio,P9ȍB}/Lrp F%PR׺Aǂ/e-e`F'6 -LQhǐT0MDBrֺ :vcRH ܍tA1hEe0} -SYԓx@VևD=j8*Zfxc!05q_V3)-`xye\2NYlQqϪi))k25fi&"x -[1}n^<كN%vnZ8|ѾYk`ݮ侻pۍ۲g > -*u-i%b2#"-s=igղ#O&N5Ŕ2Z|NZjɜĄ) ee -vsmrgf\/bZnO?CU `ʪQr|{j)Yj&cT{]ha{lkzJ#$CxE؅.4TR `ʑGCf̔[gtm hW*O:Q4K}̛D)aytKIC_jͮ#/_ t}\eŢW5rI0}Rj_TRͳ1\Z65*J)Fr EؼLZur{|sTA2"m_T3-3*Ӱ/kٵxv^k&}{Mf~?{T+89D߯bǣo=xyV,w[B63v6kԮ31?AJH@bCH/9zk*x2Z:x"0=}5'GEVs\^w*kCL˧LҢ]>!pC (JMՂ L_,,-!=7[m_v Su=^ڙ*8QLio6tǝ$ -ry%$NiŞtX:ibIjj[G3o7fodV"v_uSiԱ-gh( lޫ=jU-'Ou!R̜l^Чy RE3D&]>>,ML/RstI 9:ςXNwvjq7poGpMo%c)=ӦNᅩ&x}uԋXQsG׳2դ= -V (oxȜ@W -Ӎ@Npjn'O_~s9"~=Ƙk?es6 bJGS/XnP5A}Fw{_N]7,;m鹁se*$+,*@s.]ߖĜrZ_ *Q.]06elf8msm9_XVMB[V'KIR5A4[g hՠ+EMSS*-#7X(zZTB4u?LHq7Y '5.}xuPJ5]A@IQs[4_ʸooRtx@oYS^jKZH*p< s !rOǠaU񹓆rgƅ 1yyو klev"ìb9mw]^MسJEd[U mQ)xL!/ݳi̺EC0frXkع1~HosD Z^Qzјxa/PߗிaPB(7 @+U -1mr#Z"B\\ >t{V)P(k;( 7^x+[!V W=LZս*J[ӭV1<nuLCxpnj`!}? &4/y0د@J-z K: 7჎+YVɁg.ثR(.IA(x^n:C,^܆ :eBI@R^,AMo}\y}DzmD뢣}/ 2iUKD΁')P$!Go~[/ j)PA?X``/ pK GcT -4 -sXs=.Z ǐ\L!.孿Aٰdpq@݀j(ĕj7 P W! <VU,Ճd,O f4%Q=p"iCD JBgۣa lyDࢿ"*G%ޅ*"|7QC9>΂h*&Qc t]T $3dEQ$'`7E\#qz3Mک(BiE]%6q[ h&ѣU(bK.48~4P*LR\Ppg(:c\`RyH%\s!Ւ!uX`.#V F zzRD\ -jB=z#53XPWKsKg= *X`XOR?_vЕ~¼6 F2.`MG]PHBu-ѸKWnS4̎QҎPaO=X9r}F*~` k钾K(ÎcNl U !iHjH}X+]d -ɹ)\^ !q -\zY^P֯MߵczwIgb36 =<=g?z||Oo?ǿzo_??ۗ?xǷj$'{,ζ9i;Zc -endstream -endobj - -4838 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [468.37003 476.86942 508.41824 490.5314] - /Border [0 0 0] - /Dest 4501 0 R - /F 4 - /StructParent 140 - /Contents (Figure 2) ->> -endobj - -4839 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [297.5414 449.5454 308.5414 463.2074] - /Border [0 0 0] - /Dest 4502 0 R - /F 4 - /StructParent 141 - /Contents (41) ->> -endobj - -4840 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4390 0 R - /f1 4384 0 R - /f2 4360 0 R - /f3 4354 0 R - /f4 4366 0 R - /f5 4378 0 R - /f6 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 142 - /Tabs /S - /Parent 1 0 R - /Contents 4841 0 R - /Annots [4838 0 R 4839 0 R] ->> -endobj - -4841 0 obj -<< - /Length 6945 - /Filter /FlateDecode ->> -stream -x=kqW C9`D$p@&H" u"eQ@޽ٙ驙ݞ=2nog۟^>hu޾o?wO~y=^Mz?t77O>~o>=~ˋѾwu?;uD,;27__cwv=}Wu_ o_>#"}|:!,a Z@ۏ#!2!bDH_ D2|=j-rcZVOw)?~l~=ϷO:݇4}{O4#~01AfUΐb!Z$Cu ֻ#Sj V T)P©#6J$B' -8 msU{P{בzml:۹]x[@(m~?~(+Wv<ӑX QYA^*iYFlW#v87w9wN$U7H[C/ǑcdAk]ZBt 18k*:mE<5g' B\Ӄ_CTݎыEx/ dkֿ45h!H~M2ioОugQ)/"`{Ċ 6y+.ћ˭|A.?xQupeQ=u#b:I}t/v43LO\9!Wz;j<84UB!_\3ĸjH\fOanM;z$lJc,b%n`u< U?DXAA?,S<L$B~4֔.qȎlrQ60QV5#o -Ur@?V zM u28cv< -YpV( f"xd-@m4ܲGQX@T3@7Kճ ;) $ƄץCTt$dmO?.aI]&|3kBـ;Mq %x6@~k:.-k[J5(g0~>(n -!w. ᒪQŨ ?__=G%'Qk_se;ȀLUxn5/^(Mv2Y0TNfϛLm &<9 x޿@ |Jժ*ƁqNřߪ'΂ {A HgJ"7)ƙ6TUoJU52&߁i~iZU FxntUD#>A$mO?*$ࣵ/ @aD {8Mpx%>OVT_A]/NuY˼_Z@mз{,X:|[?AfEOCaI-9yTлE:z(AW5Qz]JfR.$8NJyUJH|u!"/f^x>ruFi_284ZSԹ zݷ7Xu碀3_P^^9l8{*A<7/ P4`cbФa EX4)\1{V$㥴״gdxdA5R T xP2*c`%ZHL4ѵNFvfm6A\mp\د[,up1ph-!/+Wռ)q) oZQPCg$ԓr 9M>VI~We*% 0r\a;յ/~~o/|I?p DdET -xk4U#HSQ`i\IGѱ?d̼61bPC61!X A5'/eę7 -K=#/mL?-m0y )! 6V^<.Bk0<!.MJ1%BPKXE* "bs\CeGE,u]2hZpzƐw9njBC]8g< Ƙ\Ʀg'iJf6eW4k|,XsVxfu~ʴvJU4@ -3kQ;.+JlDq5Lhjojd ͖܌<)J }TʹVp%\<,5k =vBOuC]*\5ӿ.z!J/"O΁Hܙy{W))8p;a)FJ-uMmI_V*$Fwu5S33u aeMn -ɣB!Ds0; -i&5U >NEHm4˓|OiZ 9V!Cו?8 .vZEL.CvM&iԌ;h&"nB;(o[wp^Պ=):!T__M XkRdNܳ=/4DXHsm֟Z6%#IJbkb:eu-Y2M"Y=O`TK*9,Mŕ9WaL}Uףnz^-UgBzގbjW 1:[J%Yr8Gv AiWQHГ`M2RˤO#Nnv>Y8FՕ+܅WgW'+qf)bpF,L; Y,x@56z'jͼ@V ɪ^Mf\tMzt>\M&CgRNwݳO37;aGCwJp -Dؽޥl":L%1xk?k rDw} -VIF5@g`GS)؆ Ӗ(qX%Z[zMX{גl[ 'b"l*n$Q Xk -᝴DJ'u+ -W#p P*}8U,r{#8لbC v)Quz7||e%몈A.a+sG(Q -:`.LyB`ψ zqL40Tb hVNdW"͘ ~9C !ثJ@4 -Hy\0 -as; { ȀH -/؏ jx=j/~$;8 '"6Ąd -AR'=+-z^ .DvI`GЇT)8 2ޙ82Gр.դO0v&1~?{zʖTxt*%{$h̸:zqvG"ٱԯ_{WT^đKdb~Ӂ$"/id/c[Z,`.VVxoELEQD,3Y Hd C`' "K-]%[EYK}Ȉ>R]$:&>>C#N9>\%䷌*"Kmi"I=$.28pΛ!p([Nßë~mjO)`|ۢh#X=n߁E0їkLY1{azTuR% FQ?(YJE; 6YM5I!T7S|mZơrfN? h*믐fOv<Tf/g -QCcZ`m^u:A: -؞oլx"U4#B., T~xv^nB AE*rFy5pHNY{KpJ<uLϾxek!>2tY'= Gf >+-أFQsBkRccct-Rbg%S3? -U'tggWY9w[) &"ON}=iXWCGmwtTowT%Ij,eVUoHh_dS22D*ff"2f9ZkKd#Tuz -C'۩Ιw\œu{zL]ls5 -: S j$t$`BM -^`Oz]1i7Y&r,L^mR{+J3 Rj{@&dua^%gniF -e>0銥3c.űZRٱ>e=jd_$bnU\d(5d"U!6A#UDiQ[t$,/I}RԤ."ip4z>:+fQ Dn0 -r6]yOگ3p)u' -:MJ52H[PVv&ݒsRf+ -Նs֧a{A Iy//>}\%QC!"ԾQ:Xi1@6HچӦn9&6eutDT1.MEL6/bXm9X?ڪɪ).5eߩL]HՖ?I 0R/l+kҘ$ L m@ @p7az>)n50WR@J6Բ[D@#s-(PjPDUFLȜ+~PQ}n@dmfD)*1Р\cI,Wm^}3ɑ[Y8sswnӪf6J]xIqeU@Ij?ً__7n&X,϶ƥ`r_$M!gAQUdp$^ת7UGgk/Vmz"7*֙P8mUfM`&f'a$ pGUwht`8;" WDznEqp$솃p-Xf7oVhݥ%InUeCt%g5"іoF@ZSibsO+T)=QTg59UK՛FY/z"Ֆl B FQ^B`Y@&*s>X2RB˔[wV)N"Y\FV}im%B9]7( xطk"X>_Q`WEBf_f%520;9&>54I0/y&ʸ,-ÝkNwqy -gwz+Wr9 - 0/] -aCSY?mSr^ 1O qhڥdKpv~ثƜEsO\HyjHjlpy^xf=)L=ՀD AF=`V.>V;e`-n/*ȴŵ# x)r ZJ/Y~#F:P> -endobj - -4843 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [467.11914 178.77362 506.78516 192.43561] - /Border [0 0 0] - /Dest 4504 0 R - /F 4 - /StructParent 144 - /Contents (Figure 4) ->> -endobj - -4844 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 145 - /Tabs /S - /Parent 1 0 R - /Contents 4845 0 R - /Annots [4842 0 R 4843 0 R] ->> -endobj - -4845 0 obj -<< - /Length 5807 - /Filter /FlateDecode ->> -stream -x=]7n+g;u"GI*wuvҾٮz-NI+go}uS Mrgz;"<~zۇ6]O~y|W/竛^ǯ绛m<}|ŗ7_rs;Q(kIwN`uwvۿnuׯǗ뷛o>EƫD{= -mv~I+mQ:2ç~h& w% |~H>Ri̲8NE{]wכ9oݕ xd[q?Cw0U|Y@Qq$> s~1.JWݣ) ͹gnǰMV|Jܖ"vqʦ-:r!S3 =$&鷽Jb.1VN0-BF1^v^u[n$4{2S ބ2tn*fz+߃7V ި@@+  `n5PNyĆ2i^^LwT eO co% 6Sѝx4FJIjګ((Y\BVQB)?ERH5x;G+Iu`4;%QLOۻ|Q›:0S (߭TٿŻS_[PAEz<ó'e,`/=K>|Ϣ;kIiv}tGmS|IiE`U u%]yy<ӒFr`zU$EP_ $~^-J=ӾhQy+eV^z.u()_I1v|o$gЃо*$ Oxnkyu쫌/ɼ`i}90$Ajua$Z(f:^x!Q(Z%e92q8y1?$K>J RZJ%bA+мn'Fk8!4xMZ##5b`),͏iK9Mc_uj<')1-GjMVYW WiVHOFXV~+:FNleo 9 3XMQ,Us*\N[㑙tScqy^HihN $[4qThbU3+GTc#x NoS:=R5P;PX35/=5eL>=5wIL@׈$1UdIN2M<")X Uo͎LUe"' P-)>VQx2_ځ5ht/ 龤d$ѢE Y͏2 4ju]Vfh^)+JO %-kE\'?DZ9@e"tƚȉ'}Ɓsw]d#7t-x"_a1&:4:~q?.eѪf|CXbj?u9UvMODXY5]hTp39u5V -CIqXVMNL.JCy>?yti?HKօ [G0HN„y6>̀!"0<nؓA''ƳԊ_>_= 25R)J\a z*(@pp>;-9ʀGyy#E\ )>(*̲Dt7 HDG.Ě_tijG0Wa;rڳ/+ :m:Q/7vu/ݗq -;Thnpo6/<ۤlǓ7Xs19gG앱ʺn{PKt Y)m\G`ɑ#!`awۀӀtP`!U/Ru8x !eu =mT6A6^ A c!Fe4h|EG6F b.7E༵?l]M`;CX*xV8\ hڙ<Vs5ÛPU L?pu4kbSmkjX/.7x"1/DbgfDd}L-Q8T`83Wcb4Tq1%CX2>J0dՙ aQϬ_U4eM~9TcATV7q*뛵PU8TT8aY'U :g4hU: -jS9b;+ĶvgeY8bWǿgCbS.ڈs~Vkܟ~]N賻6rwsAFn`N^طMᲢy|.k;7\T5gwnk.bӪs -΍*k;7r.e١:R T:b ?'<;TPY <E9m=;T7YYԈ]*( 8TEبb_ PW8b -Fi+٠pVnp.b4v$8-iEPu:Gl;JA^ D]L Be&D핎{\¡wv!zw/D_T=C^ 1,iwɓ![!jT9F Џ=ۗfLo~zM7[#0PѱZMąAkr1t8bK|3c8BUn JK憮䟕TL>Ka"nOPgjfLJ%rJ/vFsl*akm2Ty^cV~m֬uVE>^Bjn^a@:-y߄XZ8ҫj3vH`5UN+eY$8N}y -gxeu꟥.K!jԸ)Nf]]( ,"t쏨"P)6FXYr9eU3s~luSispb,Ys45Mg]&lV&W| -ݰ6Mh^cҞ+32sT5u< 0%PD&e$EԺNqgiBH6r:mt'71>Ĉb O>b%6EhHUX:%˟n4v]vUpbFj-OIlN6LZ/'EoV+m4UKl M r@ ֊Ӧ=m,>$=5]eqPwZH\5Gwʋ>ѩEHϟ]@aA]˺adq,q@"}5~9-/^_m~z$ŬC0W_|T&¡;Y(Ad:sPڧĦCxЯǴװODqG7[|v;DGI&Jի6瞵OJ1Q<'XU1tRo4^K^^ Gah2CDd1&,6drx%cd71vOZDF Օ-g7^\KzΞeIY-Cd\a486`#?/)C'al1#,`ɌGj7t_xӸxy|܂!ٙ[kaf,C|ђ|~ZnߎbQcqxAAl&NK8j- GGUqGdJv`B!DN9݅]<ޓ߿gXOoRߠƮ* -󜞤VD&}IB"N۫ Kr\ӌw%J:i ges,(2R9L;or^mܟNȩ؀̞m\Ե{%/sq]l&^&ƋCHX6"wQDžBCb]t1u \[j>vw -'V1@퉨{@sto=-jO8$_yo-j_=ܮV@`m7DB7cT6ؓ$ovڱ7o _#TTJbCGOl8A>t!y9_<ߋ${2\-A::^Gπ>d2ҭ*kIbQxzYƩz"&2%^LMV NE^ %xەJys(/a=5VAQ89:;cЂ1i lo{x7{xx_//޽{xu~ǟn~~w'v%}9m&SVGM O4 -endstream -endobj - -4846 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [213.19614 398.77203 265.11087 412.43402] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 146 - /Contents (Section 3.3) ->> -endobj - -4847 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [249.16646 313.135 300.0526 326.797] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 147 - /Contents (Section 3.1) ->> -endobj - -4848 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - /c1 4403 0 R - >> - /Font << - /f0 4378 0 R - /f1 4396 0 R - /f2 4360 0 R - /f3 4354 0 R - /f4 4384 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 148 - /Tabs /S - /Parent 1 0 R - /Contents 4849 0 R - /Annots [4846 0 R 4847 0 R] ->> -endobj - -4849 0 obj -<< - /Length 5170 - /Filter /FlateDecode ->> -stream -x]ݓ7nU]KHe*j-JI+eo\)L&N*v # x~]\=onySO?^zOoo>t}}}e绯Z|l.o! RխlIalv~w1͇lPgЃ/M6WV$/ Cy_%l>  VJT@xD)&5(U£NS {4$4O )u`VEɃYgS/-FQs-yW6VګAaX2xO~zbkE q'jaIFaHM7:ràZP$+(; fqC@WCW|5P pu;麃R]ct X e Cy{^YޑCpHL AN_Yf0CfJѭʯ~tTr0N|l)*v*u-qC Y#^@' G4z)ȢV>(g* &B+uPp(ΊWl[e|]I`Zj P ۿ.%x#]ۻI}×tـl rΡDhv@ZI a_A}zꛐ>_vXn~y~ٺC^Z'"Ƃa恋Ϯw]ko>%|%I>iN6yNˋ?. -"#zr$9mNʈZO@_ q(ZU35 A"O ' N'I3$1e(,J3 $Gz.DA(n3J1Rob iJA|#Nj)R-j1'4<'64E%{KE#^Ij{| 9% ;<[նV]7Ս]_쐠5[4d eA%Rb]V9X!DC|s7%ÇFdJYp"}V -%-a/.n޽~RQ]4pl_>eNj(oɴOAw,sOkt-K C}gC6z5[˖%R=GBwn垘vf&J!a<IeLB9ۘ,'a_LN -cF3QϹv -IHmr(A4t"V30. {f + 濔z`q_e AN`%'e+g ha%jXF?2u5ǓpyϯZZCohTBj!GТidHh6p7Z<(jřv@h7-[Y6ʐ t._&5vzm. -!iB)we֏Jފ  -Li$ A䘋RPA!m6(Pk -?~B6dZ!Dž\B['3VGkbKuJ:eAWZfX_ 8ƯLl,K1GOOC/]BRMA~V{HXPPRHP<{?c 4 MbEbFu -68HG3>3,i\N7Ztv#=GM3~T==_1at4]4g:loVU (qM4 gj<7&lz:n$ŚgfJ,G)O\ґA6[jqjDv7pԧ@uU^.jҜ9oB *cj%KM>a.e=08d4qjԲN_XwɁM9 -iJh?i)q#. YaIև[!h.)E,3iJ:%Z,G ψ\!ڊ'X Xi<4MbB-uHuvRS.~15U9T@]/F-q ͒5U V\ "(Tp1h(m)Ƨ$[xSփlqrU’"뽃t.o)+"sIg=7rN%Y"nP"30eJn^蝡RS ,xIdH%7hdNjG^h󮪭s jܟ|:+sn\1`M$Yߏ -V{- Zo3oTN9 NYO>wo|v&pg}%Ox#ƌk C4J;RzF:Ĥp?YJ8AH(%öV{9Tw"v&n`D"іe:9(* u &`5e*]4wZ";{a8aֿ0 *$7S% I) Yx( %yq @͇W(Jj|XxS^1lCՂN<>j_0N[̼&"m)^^\,x,%alp'IHMG,O27yKHPޭP76T{3xwҲl`5b@8~~fֈey[! s:}*8)F4+ΪjC^ؘ*+Z>7х59ŜKrQc930ƣ#|ԇ,S͕nLqn] -l;TBk_T!'Z(bJh)|4o"Q -dSł7wJ [!6ôrDhg-bRi4Zhe1H*E@"+ٟIG>$zF:i((CpHzs0#8Amcr4|!S?[}2IaS3eƖ%ҡ + 9r"= CɽIٱ*ʇj׳t@MR -5E"y@BZ e6W~ >g#m4ðոBZOU{>[pD[Ra Yzp0W$ H#ARw%Ш6!mN%R{T4j ޜԡJ8 XABWtL~Rq,>v_'x&\l4`rYmtZ qHZɁ#>8rofa"P} a)Hi(fH'6ƛ$MlfA0[2p.Ze3+uWU,{b{sі۽Ź2[u"zYHrg)4- ƭu{ IJ{)ٲR't[T,_}@6;CگcbR\y<[YuE_ gbdq+!lQH:8Hcpݶkݤen?ȴd&-.2(EƮ @rpSm׆BQ Y}6wWB!q`Ƶecg(Uu;VfW.dָ\R`oR!v"M%؉ӶꄂjXxdGD +νNfUOG$qǹ'O'O4K lPEk^ -Vզ> $MSc8Ouc|~@TMV6tj؋ **YIV{k -CmAo5!YU}#A9I`w[{٫: iaY#e JQ-u.mĻJÔfyep.T̵H54)0gU-[}npd9RQX% -ܹ%$v\]-#xQ}foLlªaǚU7E&:'l8'@έZd:|)5%{\wFQxf׃a*+x܅#6z' М(Oo 0Y]1;E{ZW|sơE2mkG-EpHϓ3{ %ЦM2:74Z0~D Mnح'Q^O2JBnvF[ա0Z32>m=Kj>m-1*VO)Hkkx~ g] U+wr:B܆4n{*S̷SEI!~_)0l;N+ ԾXh>qV7ۛ}> -endobj - -4851 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [107.86602 297.10602 118.86602 310.768] - /Border [0 0 0] - /Dest 4478 0 R - /F 4 - /StructParent 150 - /Contents (22) ->> -endobj - -4852 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4366 0 R - /f4 4372 0 R - /f5 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 151 - /Tabs /S - /Parent 1 0 R - /Contents 4853 0 R - /Annots [4850 0 R 4851 0 R] ->> -endobj - -4853 0 obj -<< - /Length 5365 - /Filter /FlateDecode ->> -stream -x=ks+G QSN~9ĬbEKR畏YW]n0w1@/kn_>߿w|ru//?_}?y~ǷWw~ŋ?.n~7g?^NvQ]"zllD=|q \O.dwxqNvJuwNw?_|凜Kǿ%6￑WOQ2 -eaugAnRjUbZs(8i&ig '–{ob em&c;=.1 ,:^)>G{|#Xd4/+_ 襱+ -5pMB:/t4k4k N;v=1J$l1ӛIRgY ްZT/w+)_~bA¸p4ÿVb6X*d޽ h NPGn. Ͽ _ <0%_4X*cXMi9K^xg<_1W<]2SR\HW/ʐAilD&SFғv8ʀ{efrl32f̯y{ {eL 4v,G8#RڧOrՏ',R>n…u=V_XwṄƐaslY>%ʱS\Ⱥ;n|nj`8$i/]<:F8f~.w75Zߐy(#)>ʧljOAk5Z8ɘTW 6:κM#! l:W,i Ӕc.MiфhHYC!TJvMpoq֊1֬VqW.*^&NA Tc_"Mrwt8ojw'T6H{ -w<崉|hW csu":K3dFvdfRgi:>a2%tXӵgh̥!:Mp'FDJ)H"eiŲyz%nI٬AGrwyǜgVvf íf{O;P!TyCs"XT&=\jꪗ;TH L ~an{iQvguk, IڬrE%CǵߟBdbH@1C{$=Y6+\2P4Fqo1j[jnP/tėb`6qJxg.*T$_ -DE̚ORC4XdϯOa;i͝ڒZאQ߂0Z.U kc9V=m\d35T HnqQ gFGX< Kf*N&h 9k)qGQ":F==̌V }Xz/B,f!jR7< -ay)LRj7[j](p;e-gAhT؎ Tsj T_,Ӳ8L(cUxF"IE yw2a18.aBteX֟2+CfcCɨGfc)^(`T͑[D*S0XNO&]V2RA{[P/ -Zί)SAhw~8ŠSݲ rtއ_A5#YMZ -Go!H;θkA^)8Q+[jIZ-=\0ʈ\āW Q4I3s^x)tejX#:lΕ3S n8[r#ZWuE-c vHxSpML(bb ԹÀFD4 -n@;J-iL쳿ǀ2W+A@_CGN(6Y`] 0iD47AKh{6'|Lۀ3)RGۋ˦%4h|A\z=3G4 Cω+ןrs#&s W$GYaT8IߌuZ!3ښ,wYhH)u[dA -)$5^ZVN;퍖"i$}OèVO'UN[t4M.k) I;̇dX`fYд46x\ja M)VsE$:hr#Bs W NbTH(Ifsd?OE~qR8 ڗ顠EE) - V֪gNRp̑G`ز 8XSs+o+oyDsHRS_!O"D/ժ* -l"vX7$aD#XM#8 1 \̙m5!o}.X#±0tUk O -넍:I)GVM5F(m>ejE3(p\%bUDHFގ1f$ML8'5.x-v/`|k -y9F0ʩqrxc ђ6D{NydžVM -ճxl - ,_\)Lۖ4Vo20mI\<"upEV@ýz+`7g2B -;a0 ⾬EK$A a[FJPSx)rkS;s yNX:βც=6Vҭ`J&s5"P`o8TN& -K[XF0an C{VOR|*G\Y#][6D@RAS10;0"fiaF7E#&my@5JR҇E y` L-uLeA?̻] k'N}: {1Z3əشbMY8`eVyӞI)y9xYlOSOvQ}H߸aـfQ}2B'*ɩxx|p%̞D~dqѣn+k෧)IqAtD].HO&Le4d/> -endobj - -4855 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [467.71432 582.3314 518.84344 595.9934] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 153 - /Contents (Section 3.2) ->> -endobj - -4856 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [407.13937 469.5504 452.5994 483.2124] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 154 - /Contents (Section 3) ->> -endobj - -4857 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [468.31793 414.9024 519.39343 428.5644] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 155 - /Contents (Section 4.1) ->> -endobj - -4858 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [465.84985 401.2404 519.39343 414.9024] - /Border [0 0 0] - /Dest (subsec:loader-hmr) - /F 4 - /StructParent 156 - /Contents (Section 4.2) ->> -endobj - -4859 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [213.6029 373.9164 267.18137 387.5784] - /Border [0 0 0] - /Dest (subsec:koishi) - /F 4 - /StructParent 157 - /Contents (Section 4.3) ->> -endobj - -4860 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 299.3614 107.09487 313.02338] - /Border [0 0 0] - /Dest 4505 0 R - /F 4 - /StructParent 158 - /Contents (Table 1) ->> -endobj - -4861 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [184.06622 210.58942 235.26276 224.2514] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 159 - /Contents (Section 3.3) ->> -endobj - -4862 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [218.00346 155.9414 281.07553 169.6034] - /Border [0 0 0] - /Dest 4506 0 R - /F 4 - /StructParent 160 - /Contents (Definition 25) ->> -endobj - -4863 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [489.91193 128.61737 524.4094 142.27942] - /Border [0 0 0] - /Dest 4505 0 R - /F 4 - /StructParent 161 - /Contents (Table 1) ->> -endobj - -4864 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - /f4 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 162 - /Tabs /S - /Parent 1 0 R - /Contents 4865 0 R - /Annots [4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R] ->> -endobj - -4865 0 obj -<< - /Length 5456 - /Filter /FlateDecode ->> -stream -xr_14eǫ "ۺRv|@ҤTL):}j;3@ < -I }qnj=yrug϶ۋ=;WzuwW?}ۋ훷GOv}>?:~>ELJHtݩgZ;磳+]rĻ_n>;? o>8qiL7T%&2G %6ݩ0/~t\vMA禡e>d() LGL5 ^w7#먔#E 15)ǥ8ݦtRlqRG6)TM=(o8S(Qh[s$Zu+f5ɉQ9(,18kKr"0A"O).6rEL5jA 13˹'qNfwW"tC4=~7 ؟B'>ƦZnHF'I@HL̺O G5TFA uՔZ |nP$% J Ngi=՞m:8"JQyV .0rZVSM)_d7`>~Db>]vrnI 0b[){<8 Uɷ`⩅pDdBr \4/Et5sUbfI$ǰ >:ʪ|CkvAx~'&>Cl3#}3:+j ɖA j0j)oZi2EWsXL\4&Ea3.PtGW3Η>2a-S!?뎴e37a\r@rJYDX?Q,8!`c!@ d$*%Sc`+c!>G/@3W=)2ĒJ)D3W+̌ge҅1$?ӤfH.L` -e8viA Ğ-|H:^Gfaa,G 2 uX$b@FG2j HɜTLϮ^ɋ/^p싧1mHjɢ +$~I s2- WpŌ gc=%>(~rY$p]?wpo)뽬0`5 [ j ڔk =ꆰV)i\WUi2Y̜z-29hB`\xEXv5 |{ p:O"ql<㌷g`&KB`W5KIu[`9IQ ";4`|YŎak`1FϿ]T1 Ȥ)cy?Xh<ǔpu oxTfİ7YDX`^_  WɔffPt(BQ7԰9\E(6"K U!23^C@c6N0G"8G ՀL98GvP$΋KժTCV(Y_ s&ԩ*q-cBG&R#b DIqpE{{@6[ .|LGMqI}n.P*%Et$3άvA1'tJDপdNpݧ׷ &-5DM4g I\Kҥ^}_'b1Qʮ=, h'J>]hā;&TPn ?(5vVRK,Ƞd&UW 0_8JڢP &#x`$Y - -qřGjhz -Xv8c^Q72F7#iboT kRyܠ4jObI |?OѐP1k0;X.A*UL+̻>HCn4܋%} FQHWA`Z**miОQdq=N^^=t}W6!lI4&`PHp:-*sV>O,aIuKgf**pr'8qx ۺd7ޚ {h%aE'9*1Ds&J#0 -M 7hc!K Fv+&AS*PUg 5xϬ>-[+_-X3]Lk'KaD>=e843̑KrQ=- -RQ 0S&Km'.@l 0fTQ]-G^\~)hu+N@_Nܫ j!ʻI?qk f8'\VQ ƍr ]Ѷ -)ZC*]ͨAWX4͈TPz M"R~\3i>Wӷi(<oy U\}Ri,ͨEoC -/UPSY&)mlc͠s\ ]E2!T0F*X߬a^oVPHi7;=5mMZ*pf5$ -)&tp8|FDr~NAWB:^`C`MF\JA%kS{Ip"gXGqviLΫץ' ֎dSh/}fk'Ng۾Bɐph40'v- {,d3HW=. <(R(f @ub:UtuLxΠO(sK5ٽ s[2 wVeE~5f>=d-ﵱLWe)pGQ1jI!}]dJAc, N^"l0%ȵB*qa"l8TfJ(t_I4Wqɔ_΃F]vH[ 1{+n\e_Wo$d`p%o˖] HDLenI}UI˞T[6`6}l7ska1_x͸RC0ҍ (äή(ؓ\lD9ڒ.bdPeo̩1Q-Z깪[ט CлIRMInMOC 36k)}$x&V{-Cf<V޺Ԧ!&}҇GNRSS dMEt?j/;b<4 NYٲJdG="ߝ}mGXHMό"A{n3?Tu)$oM TʯU+ŒB2掠ˑ򪈙J r.Qk]Bim}wqj;TNB~0|$NX.z}Z ̫Q3i̹IAx{3BF#?3esv3^˵ -Z^=j;L! ZжT`v>{]bqItkL:=WKgE9ͪbI#W&dt=;ZV>~%,KWG_6t%QcB.u%T{[yPr&H_=QU;=\i؄SWYB]yKLc^'G5vK>%saJg/Tf3baV,p57rJUμ:֑!ZyІ)08?Z-}? ʮ.lvX )--3J6i7# d(WQ%a;as׌a$\!ĿU0ѧgV>ֻ}ycHCzI?S>$PZ& kb/U+񂢮,H6P^ /C -%nj:Zdc{d$qmùMXեgA- sS[ةur-z3 -T[;B]Q8.G +&l6ZGv3Kpi :0yoĸh{d ^;9|ԫCua9Irk%bӣ1-L8"õ -^E; $7M@utlYz ߲K> DPkd KU;Is`a -N=bI#{: s_{[A ^=EO=K6Sm\\m0v{qݷgn}o~;{__b-ߐL(;#XƄ5xtU]4 -endstream -endobj - -4866 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [180.62326 741.2904 222.00327 753.6004] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 163 - /Contents (Section 3) ->> -endobj - -4867 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [463.0277 515.1334 524.4094 528.7954] - /Border [0 0 0] - /Dest (subsubsec:effect-api) - /F 4 - /StructParent 164 - /Contents (Section 4.1.1) ->> -endobj - -4868 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [464.3611 501.4714 524.4094 515.1334] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 165 - /Contents (Section 4.1.2) ->> -endobj - -4869 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [229.18156 487.8094 288.63504 501.4714] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 166 - /Contents (Section 4.1.3) ->> -endobj - -4870 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 474.1474 130.69514 487.8094] - /Border [0 0 0] - /Dest (subsubsec:context-access) - /F 4 - /StructParent 167 - /Contents (Section 4.1.4) ->> -endobj - -4871 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [263.94278 415.8344 316.6733 429.4964] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 168 - /Contents (Section 3.1) ->> -endobj - -4872 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [346.99957 361.1864 411.01254 374.8484] - /Border [0 0 0] - /Dest 4507 0 R - /F 4 - /StructParent 169 - /Contents (Definition 23) ->> -endobj - -4873 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 286.07642 146.54327 299.7384] - /Border [0 0 0] - /Dest 4508 0 R - /F 4 - /StructParent 170 - /Contents (Algorithm 1) ->> -endobj - -4874 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4384 0 R - /f2 4378 0 R - /f3 4360 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 171 - /Tabs /S - /Parent 1 0 R - /Contents 4875 0 R - /Annots [4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R] ->> -endobj - -4875 0 obj -<< - /Length 5323 - /Filter /FlateDecode ->> -stream -x]K(ZW-97`k i[ԮLEaH7ġvܲ~]]ThR<̰{DC\=?y}|i/|}ͻ_]_5WO_~>~usonoy'<{[|vJJ)Q7/^bzwN7v; hl~]`qƂ7$?P0ƀ)\|{w'_|n tHZ#`+>=asszۏ#U%ќ~}Ps2fb#Xy?OV-!]#m _J +77[`Eh 'VT/\*E"ɧNUtFA^[QsDސ h0(n)-GLۖZH[64~N# 1ʪwR <)Q:|1#Ow0IURp@ݽn}IZlY<2Be k0H\B%{$'@ D|k]EȸzNVŷa1;ףV(j+ijcŔCmrggÁ'?I6zijy^Fks9!>07]] $9;E"5An ->(wS[ -d\t hCFnyj.pX4圠mi{<8-s -KzsՓ#޹ 0v[2;.s 12=X[Q&jtbv RfIɬ+z>+2Δ1T{kqsJ8._ĕd7Vtciw"MN+3d|^!`6%LR >Xc+^)%ǔs2y~*SXk!`JULB3jO.̰ MDՋnyU{(謯 &y`QyCkܩr3*3/&[2_&F %F TXN=z:qR -ôžhy3'QnNLtOA))gc&(:e (h Վ -=q\F-l? I6 l<\D/h,¬WM ٬@͈'qII]]ьXPU:ƺJ dѳ˟ Uâ*kJX׳mO_5A!14;h{T8 _tle``Ն`A l*0ܜ$R-sii48k1:oQT?. tEtsST{.\m61{a?KF`Z, eRyճ=qXk -VCl~0'YRKZ=11z`f:)KAHjB,6D;F*vg89 -BװG  뇱wE̜{YNO 3s#$9qy+k/Dj_#kQY{+y, Qփ&9E&F%@ bɣ +l|W*m!`z<g&D{Ӗγ yAlXhΙCLAyQS1~zd -.'HBDNh*#}#0o,f6h7X/x)wpDR OV6dK~ѠBn1 -:%ME@DSٽ3{"vRߢ$¤;`3ԙKq@N:rŜW}B-eUy5 8ACpYkLQr5!}G65B\GZ~"} ;j*ULATKt"y"4J6}{<ƈR9L-c S՛w S^ /&چő[ds')3@0ۗf+rjGx '1V*1Hmn+@keTQ!KȆN5qH?m,OKCJ6R/'͒TSɷ+*Kanؑ:ֵ@Vxkko#]tԸFU0S@0J5|o&I&_@v /ʐ>@b}J^<YЈ.72'2s+grJu^[sSaǮ'縷8 *pxl .PeS[KBo{`ycD\W%fZRr1LʖG_}|{w_^^ǯnͻ;2=S> -endobj - -4877 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [311.19995 572.0674 370.8978 585.7294] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-iteration) - /F 4 - /StructParent 173 - /Contents (Section 3.3.2) ->> -endobj - -4878 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [197.09962 524.2814 261.27277 537.94336] - /Border [0 0 0] - /Dest 4510 0 R - /F 4 - /StructParent 174 - /Contents (Definition 21) ->> -endobj - -4879 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [408.45615 469.6334 468.06592 483.2954] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 175 - /Contents (Section 4.1.3) ->> -endobj - -4880 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [258.05804 397.6584 309.11444 411.3204] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 176 - /Contents (Section 3.2) ->> -endobj - -4881 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 308.8864 134.90927 322.5484] - /Border [0 0 0] - /Dest 4511 0 R - /F 4 - /StructParent 177 - /Contents (Algorithm 2) ->> -endobj - -4882 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [363.2142 220.11438 415.47824 233.77643] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 178 - /Contents (Section 3.1) ->> -endobj - -4883 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [402.55 206.4524 463.17172 220.11438] - /Border [0 0 0] - /Dest 4511 0 R - /F 4 - /StructParent 179 - /Contents (Algorithm 2) ->> -endobj - -4884 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4354 0 R - /f3 4378 0 R - /f4 4372 0 R - /f5 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 180 - /Tabs /S - /Parent 1 0 R - /Contents 4885 0 R - /Annots [4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R] ->> -endobj - -4885 0 obj -<< - /Length 6976 - /Filter /FlateDecode ->> -stream -x=]s$5i)#bx c`a޸*UR*yUR*ߙJ]vwO/?~H_~7w髗/vCO/|zO/z;թJw^ApNS筃`u^\V]owS{{o~#k1/VA5*p{;F㉇oUiEDj -^< A{h ׋8LJWN`5P;ُcOo׌ bo^v;_ѩxtzF//TVu{y{z7x⻏WJ}^|+B3@h=ljY(*>Tt~Wt|g,:mk }g˿&7br 9vy &jnO~r١:ϿY4jܑ=d\rqKt7ehc -?P抜jtO}s'2 -%D)S^O -?oE RՒ Nqo+c'?1H4H4V!Q;(d́dL5-$s":Q{dV6'BFjq, U:ҜbDMu%tK8P,MP;pj5Jyب4<[dl}'g(3YI %XKeF='5v6UU#/2=KxXX}B|Qnz * -3!2ф=™"qY}!W(Af^YvX\h:24$!ͰkCĺZ1-cK^[0[ꉋklගo"Q\ {82vkc~T5CHEW٥b2>h* -=,e9;R`:ԑz+%pF2QqFcyl;d 3,h.i_\Q;]QByf IUHm%RjV\ErZOՠq5zo$p؊ztSa`s܉~_bNWkPiE@>mvvF6 -ַl'|uPmo/W9FOXCU"R[/:ST+O֙Yxq7tla3T0ՖlY8F)P=υ -0=vwn8BXxzƁ ) ?3xTL#FC,mbCF5eVVmƆ>\$ -Vd#΃Vl Rfg@)9͛WwlebtN:`C=@eT),n}"a>H6Xv\*nI PG)E.RF6ЮŔQN,n'gΏ͙w6'y5QB0?61g`̹,jIT -:HyBUo c+^pxa|m$Ɉd\t>[{h1%y8CWO ^OlK//<)!]vfKf>l a5Q٤*WѳYfFKn &Z".LuF0xYlܺ+zoǢ  6/ycwBA 4V(K]b8QA޹}hMl(v(F\ Duj\2&?M [< -te7W/Y7qf.D] ld֤AK%=m.9 k,(<,pFy@X-'ں&NjUH(K!iێ#=?l@iRy)H"An BuI\TWr&ʌ2gz2C3nqh<RȦnC³ -H>T\結 ؾgB;-1+ovOeڈ9c8tǭ]l{&c!PJlЕYSfJSBIw%}ɳawK@7s;6EJ rj!rƥ:%[ws!JַA -=zpC:l*rT ﱕyJ%6ʖ&΋Nɉ J $y΋Wb;X' )>X㺲SJ5Gg1@/|gq y -5x)~Ɉ !:xe?4,@`c|&ַ`C|&큲M{RAKk۷=_^[D6NzfE4oqD3]܈sr}v[!D V_נx;?d#cj C/g )v`56 ڈ#O$ M6A -ֵG>aŵ;#~/^4.%N;iDxg*/[0hlA`t`b[~eKސU={1IՓeéz^?G7&CG1>K3zbWctJ-5)h@湺ؤ.b[ e{be#{z VG4-W 48> g;78Y*r摶`OD.( & -{EDꨧ`~YKW>@ S YC / 1~d7 (kPcW Ş5VeqDi+ܪ{,ӿ?{E$B.  6]+^js쫚3 ׭wh2).Ke'ogJCD,c="6faEʶ_K%LH-c̦ی$r@4n&*@e -X :;Q F5)dR`Q-(j.[11!2N? -!- m!bE!d }MBbDV[ Ȋ MӱT@6J2-tIFr -I6{$kC T {ˤ7dƵH@*YÃ3"ns(ƥ>Zp._yB5sY[⡌KVBtapRUͶM#GoQ<>ε\vf5q -QdSMʓm.IM]swONVʓހb`$&9-˙1|Y@ٔD* ŧ0z wI,f⪲Xtzܛv]$(֡ǐqlMiB* NG@!VmgCRșǐlGG1)$IɔajGDg؆jVVҨA l3[`<`&&½ZWN_a4f,Ĵk9O4q.QXsF(Ӯ+KH8+]ޞ+zL鮈qWڻyw܊1&rf5Wz(Ж.8˞:eQl*&_,-O}H +ss֩HJMV57kp[YI'т -9\Ek +/ߞxcf[z dۭ.k_L:SUslN & 8?ۧ(xiGI;4O̹BR%/7MyJ݀b.YD2˧ӏ1!Y!}v38ぶYl; m:?hQPQ#*%=E3hWdn摎"/?Y&,|jNJͥ|DRb@^P&PLK 1D'.}$n}B!(碝Da;Mǧq>x8d%blHdz%e.+ >kbz*/x|=i>4z&R{LbͷQ\~h!hmvOqew)+?=5g-^9ȶ{;[*Z?6غ -j^&^*Dl#"`L7XT#Ӻtd%U~;>l+})!\wdYGɫ6َ)vf7>X[t&A=)z7x}[Vtٹg ,c%ТE}5M%'IgFWGnz4ƥ:0ZږldjdLD4b[j -Qe-Ju -fjA9]I݌K^ݜhBAa}E8*Tl[4_~clK*w0N" O4T 0w9lgY6*BҮlޓr!~i? 7q6ɤCZ#+\澬pIcS$9Cd6s]MK*DU5kW /Tj|vw |fhnUmBuW~FրMg_?|q0#{;j ,sK|$)7V\QEVYt`}75{bB~$j MI_&NŅ^Spn*#eXPo`|N/oO|Dnc^Zkbjmv+ - kEZѩŜr-t@,lmORiȮg^Ӷ Ϥ6vvudP2nXK#PtO d|{C)4=+zk21R!ͬ`*vdb}O+)0cۄc걳1;a6:ҝ"&)ՂqS~Y' 4jAP*vT}Q/Ϙ@bd!Xv|֬(Yfv~FK@aS@dvN7*%vNJyX:aVSl_#nQݡ;zS|C2|v7?v]ҷ/?wƇΦiƆHA_OeШӵ -endstream -endobj - -4886 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 598.6334 147.40263 612.2954] - /Border [0 0 0] - /Dest 4512 0 R - /F 4 - /StructParent 181 - /Contents (Algorithm 3) ->> -endobj - -4887 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [140.40207 571.3094 200.47287 584.97144] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 182 - /Contents (Section 4.1.3) ->> -endobj - -4888 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [149.96503 557.6474 213.69797 571.3094] - /Border [0 0 0] - /Dest 4513 0 R - /F 4 - /StructParent 183 - /Contents (Definition 15) ->> -endobj - -4889 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [276.43414 530.32336 336.26315 543.9854] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 184 - /Contents (Section 4.1.3) ->> -endobj - -4890 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [259.87186 334.6334 325.1928 348.2954] - /Border [0 0 0] - /Dest 4514 0 R - /F 4 - /StructParent 185 - /Contents (Definition 17) ->> -endobj - -4891 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [383.5707 307.3094 446.11862 320.97137] - /Border [0 0 0] - /Dest 4515 0 R - /F 4 - /StructParent 186 - /Contents (Definition 19) ->> -endobj - -4892 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 208.01038 122.27716 221.67242] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 187 - /Contents (Section 4.1) ->> -endobj - -4893 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [382.14737 208.01038 441.80838 221.67242] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 188 - /Contents (Section 3.3.4) ->> -endobj - -4894 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [270.15045 180.6864 330.23697 194.34839] - /Border [0 0 0] - /Dest (subsubsec:unified-context) - /F 4 - /StructParent 189 - /Contents (Section 3.4.1) ->> -endobj - -4895 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 146.56238 148.84537 160.22443] - /Border [0 0 0] - /Dest 4516 0 R - /F 4 - /StructParent 190 - /Contents (Algorithm 4) ->> -endobj - -4896 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [260.3851 119.2384 290.7564 132.90039] - /Border [0 0 0] - /Dest 4517 0 R - /F 4 - /StructParent 191 - /Contents (Line 9) ->> -endobj - -4897 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [277.53036 105.576416 306.98016 119.2384] - /Border [0 0 0] - /Dest 4518 0 R - /F 4 - /StructParent 192 - /Contents (Line 2) ->> -endobj - -4898 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [362.92276 91.91443 422.8277 105.576416] - /Border [0 0 0] - /Dest 4519 0 R - /F 4 - /StructParent 193 - /Contents (Algorithm 5) ->> -endobj - -4899 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4366 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 194 - /Tabs /S - /Parent 1 0 R - /Contents 4900 0 R - /Annots [4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R] ->> -endobj - -4900 0 obj -<< - /Length 6217 - /Filter /FlateDecode ->> -stream -x=]s#SIW쓜:'$Kћʿt,:= h77v߽z>nv>}wmwޥ^Տo_˯\|퓋q/}r?U)yDto>\ܼݛ_.d˛ Ip!?f/tւ0RwoO<~#ˏRR i' zB -'0ݷ A=v " `@HŜ H!5ُ;m~g@?̈́=1 FϯnoyHP/.dBng/7W݋]|b[OW q$=3FI *v݋?5`\ l+<>˗wT4`˫*MSYJ~:=#1z $,˓ Ke(Rjj1j>eY ^;R /{pߍtGk;([+#l\Bt8 0^ڐ74!zMi ^xs$8 ` e0(r+(Z05 - LCqStM"ӧ&m"P~k$'QnAHI&E^N C*ԃzMPNX#cFI*4g  -2z*@ŹwjQ4O\'Fm((Piа68:0aQ@$,`Vm+LC"mA)Yi-!&wBgvp|BI` FHSp4c).8aO&7M%-nk>2"ν9$%cKt86JH#ZӆxEяhFyk\u0IY hg4b(yΊ瞣UVo0/g0@ wR4'NA(;ru" -NnK+$aA}$狷` 3aG?Ҡּ"dFZs9# {-\1'@İ>X= !kd*U/wѠn+" )nMs/ VT򏙫_,P)kp=&MzBMzT ߣ6|HZ]u#MJf!T/ׯnm`Xްa *p2ki 5@†2Wb>fz-6=_J [|845Cָ)gJY:ئvO&1knL f0ݲDW1[s4p3"9`Li2fixt&xۂX -mWvkBn"QD4ɥ!G8^mW81o8įp{{02ѧ ps:15MƣZȂ`yk{_'4 t4#D ?%BXL7nH#Wq#x,3ۡ3B6XڳE7Rh!Ms?E*gx{ӴR/\[=L1h-LÂ`2/ ZбǔʆMo* -'ZM1:&Ј))-MQs"J|ů#QDgbڗb2{QJɦE+{؈x_N(p?1.x0l)MNʮYMd#K{XPBb_uE!2")O(dEod3ڒH60*P2a`-*mxl/ojIM>.^D@~nqE4]J!%U"+Ha!Wd- 0 -y5`][%Ձُ;'c1N8ߍL0P5r@sO1*X㧷?f?>nؕQ50Rz厈M leƆ=>22 0R 䇽I氅fNp:G#%y (i~23 ($))pyzEID( crz`qK*?H#6ݣX:KmVUwak-*=ZNe̽1oDoLyix4IG@B#akM F@_H+!& *i a'gȒaNYF潡'T TƨMQt.@_H]:LZ$UQH2BWsDX-oV p_ 4 G6g'CP"⦌&e`Ow@غjI^H}m!RL[eoIŤz\I綤BYJ!fPhMuS~z.x_$Mchm%C: --9SE=W\h'fm=7Zj>P_dR l^QQ9`}7t0^nY~eL+S d~f -_VDPr̻aP g)zpӳ"9?o]P]LӪˉ\|hfx'V(C_ո$+kL)n>ZyffA8r -Ax[^޻lʇ2fť!F\AOu^\οq(S1U9yNq]<cX@ԅhQkz!&2O8BK'k"`FmD|z;^ ЛZ?M,Rn y ̣u팈T–BLIIh;U?{h|wr%W ވZ~ -M?΋ <ƣT"y'D/5 -XΩOعmKME}h -O}i@ai-o0QN,X }*S N6#x "~v-h{گ-[69w;#I༉T*d+?;HƈO9wHUmlP[r;eÊoJD k{8A-n闔#xWBEWGc#szkPW(f,AΪk2b$1B:wSBS%}W/^ջjUe#fn抂<',o ԋRP6ngSo0Q3'wN,ڞƂFUa栴$G$\[j,g-k2)<Hieap{*;$Z&!jG&m)( /̃ʸzIhWp2nɲ0q_d Ip$ |& -ZXN+BTf ׅ8Tp~aϊJhe-Բ,Yy;$tK{Ctd1NjgNFdGY7rK̛ gPgXA&HZDyқ8 ̣+eƬ塪bɰtVS6eR;)AXx喕Z8D4q -5 Ԅ^I1l%~/ yRU)cU}IJ(؄9cs*(A)hHѻsR ->j9 oJ_j=4*F&Uqm/>JmWꂘCCZ EK qRաސPs!ز hSYjqb9_b9`Ssńur萄P΃gA*fHwmN`]2j(YJ JO!bhq2IY -o7 -~LiBY^z}(8G;N)b4&t^] /3BGP@;MjK!M@GstpolP-zU ^2 EUM^~aKG*0X&gFXj(kgVxI'+A"&`7&Ϡ*zl}WxV\c:$!LJ1Ʀ2Izϓb -mQUFE\^⍦CB>g;oJ#ʒDp0Y =vUP"vE}lɁ, -K>743"j]GZֈ%4f\P h1. v @ n0sp1hs!HͻBqÒPMxpIi:!+#t(N (8HXo a^`jD&]*K ]<;d6so}CZX!E z7gnj'TT9̙uOT" ؔ\L8 gBY +\YڣN+/38TzdO[(5R} z=-G 63"Wؖp@P~cr՛}wӷzv7]E__[4nB6h䤲v J -endstream -endobj - -4901 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 519.29944 146.85141 532.9614] - /Border [0 0 0] - /Dest 4519 0 R - /F 4 - /StructParent 195 - /Contents (Algorithm 5) ->> -endobj - -4902 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [326.38528 519.29944 386.20056 532.9614] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 196 - /Contents (Section 3.3.4) ->> -endobj - -4903 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [460.86523 478.31342 464.16522 491.9754] - /Border [0 0 0] - /Dest 4520 0 R - /F 4 - /StructParent 197 - /Contents (Footnote 2) ->> -endobj - -4904 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 114.97339 82.56614 125.701355] - /Border [0 0 0] - /Dest 4521 0 R - /F 4 - /StructParent 198 - /Contents (2) ->> -endobj - -4905 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4378 0 R - /f3 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 199 - /Tabs /S - /Parent 1 0 R - /Contents 4906 0 R - /Annots [4901 0 R 4902 0 R 4903 0 R 4904 0 R] ->> -endobj - -4906 0 obj -<< - /Length 5213 - /Filter /FlateDecode ->> -stream -x]mqb3mxGȡ(˲哨T(Rb<*u\)Ac'ZUFxpCg~z8ܾ77~6|ӛś܇nwwwv}W_?]~e: t3g *τt{~ww_^~wwq~'88twM ܟw3oߒ |7}+{Źs}'4{zu N1tn~fl2 S8_}Ost.bIYg)t*;wNxg'K̀Ę`,d D瘛g#?ɖg"Qa$zϤڶ ..js?(d49 9X`ʄG%$i0Z~ #_ 9GH.*{eϩdH&9V9 -dQ9`44_P8v0h1T$9YΔBBf8x7n 3Mƫ4t֩jU@umHgr rKgWQZgVf Ah5FyK8l [Z&bܺZ<'LZN9 e 3- Q {W%\Z^L|DB)ڜE؊\ Y͵pcYkG?:J7owl%G,cmXռYNظ '=kR\ΨP/5ˌTHgs -(:-RR뀫YǾ-P(© qvu"yM*Q?z9ycbH_T~y?x,"mD{}+C{=(EnCN)i>) ]!TY|TFKjLAuTڵk߶ ޠ芺Tq&us_41ˡ2ɪL9n}qC-0kX3]Af-B̺c0V0-ihsX'BhtZeG)hV -xW+;q!MӀ[ewEff%o~VRIErPԀ0Ϝrhd .fJ ewT8qmlel\fn묞84 (YnIC&#M`]b0 ‡=]ڼCau+xDOЎm$O}"K(})Ax:mv%]LArLqve/Bj.\u@p|͜[9Ȍ Y[$XC&=bgd7LpSp>W)%|Wz!D@j~$ӽptaNz}ԗy@P8U,!Y裝sd:dN16ճ.0Y/S֚eg\`Z385e4?5:׸<`#C-`6kpLvQ!-sf -*cL;7xo xR"m~N8\" -NvaeVbyęAm̊ZP[:3+;0e{*6s(q]L ^Gb\ 8mظdm"6h-Sp9 <ɔ1@85#iW7P4lI5: <5^0ƶ"H֞yfS~Ѯc*k))6|/pIpcicP{ NEI˭r* yHat+-Y3CY3Nѣn`VDZKB˵_`!gBcS۬6^0KݘaH#ܸ4l7~sat[`_cNJ/ 0{4?TYBԕ duYtFECY* 5 #`4 -IЋ& -#SGS0*פ0{& -TޘT2k$r!,)0;(QhVj xғRiޤfkuiL*bGQgRJ5sC k2.,3&Q,qtv_z&)z\3[ S"ą&; >6x5}*ÕArϼ;+ߌJQgPy% JJ+n108-2"iU$x%,ak:VX|q/qJ"3qEbfl0&[W{ :~0n&K)=iē/)]֋dByabf\zitWk<{^)cF( (dʝ,~%T:IYZns*+Q*kݙ ~'{z8ܾ7_|8>6|ӛ7>܇nwwwВ@Zi`&v('ddq?+ -endstream -endobj - -4907 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [210.73615 585.1914 270.70114 598.8534] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-coherence) - /F 4 - /StructParent 200 - /Contents (Section 3.3.3) ->> -endobj - -4908 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [349.41644 585.1914 409.38144 598.8534] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 201 - /Contents (Section 4.1.2) ->> -endobj - -4909 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [304.4633 523.7434 363.29776 537.4054] - /Border [0 0 0] - /Dest 4508 0 R - /F 4 - /StructParent 202 - /Contents (Algorithm 1) ->> -endobj - -4910 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [411.42615 496.4194 471.25513 510.0814] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-coherence) - /F 4 - /StructParent 203 - /Contents (Section 3.3.3) ->> -endobj - -4911 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [210.50237 438.1064 273.43668 451.7684] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 204 - /Contents (Section 4.1.2) ->> -endobj - -4912 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [298.89136 369.7964 357.71567 383.4584] - /Border [0 0 0] - /Dest 4522 0 R - /F 4 - /StructParent 205 - /Contents (Algorithm 6) ->> -endobj - -4913 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [301.9643 356.1344 361.79327 369.7964] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 206 - /Contents (Section 4.1.2) ->> -endobj - -4914 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 215.0924 146.8631 228.7544] - /Border [0 0 0] - /Dest 4522 0 R - /F 4 - /StructParent 207 - /Contents (Algorithm 6) ->> -endobj - -4915 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [458.63428 201.43042 517.46844 215.0924] - /Border [0 0 0] - /Dest 4511 0 R - /F 4 - /StructParent 208 - /Contents (Algorithm 2) ->> -endobj - -4916 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 119.458374 135.71114 133.12042] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 209 - /Contents (Section 4.1.3) ->> -endobj - -4917 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4366 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 210 - /Tabs /S - /Parent 1 0 R - /Contents 4918 0 R - /Annots [4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R 4913 0 R 4914 0 R 4915 0 R 4916 0 R] ->> -endobj - -4918 0 obj -<< - /Length 5497 - /Filter /FlateDecode ->> -stream -x=kqW sLo$R-KNYS|HSR9+ =hcO1?pfFht|~O]w}wsW/?n~sÛm~|w{xx??|8 }y7yɅNf| uM[S0XJdQbJLLR0{L}{qJFk}Zۭ$ LDt݉Ǒd@UgJ"T&aO/)񜿿I$j[ Zl0M8$Ji̥54h\@ULmQ\`V6Mj7cA4 "˥I%BF8=W!9Ѹ9?u7s&Ka -A Lă̹Z$&[lݳAߜ فBU$!U4sTІmшVͨ4 7ejKCJJ2fBT$~T" >jHVcl!vƽ!:fA.εpu݊ Ǝ.9svss`:O2/ӆ%}&1pgdޘ|Kh"N /A` !@U؉"HLsd) ?q݂a`oMo$[S2(AeO2EaQԬ)Mn lyBGȀt3dzk`G"5:I#]&/,N\R~>ts(pm6+6Wa6ά k-:9Q?-סFC"\fQ ˙ }7(} )>Y-gVM됝cd|rcWMTA)1!rRy(o&rz(f+tv# -yUeZM6kB$Za2Xt}0D -1&ZI1UdZ]f\wbY/=1 8H;="I_ּ5A:o0 ._m*%6ŸWYh jBkt=5ҕcb&){-(-j-VJ$^<.([QC| : !/9$2hd1ȓoCm`&4-B ׂ9%x楁PC/F Gc(Ja}G\զQ)7jc=ݻ4MXz+tPɓ1b@ mrT/ U%bٕ̾KU\Ć@^LOfcV!5x^.jw5Ye -LOdtUHp1Y jiBuSf!]bx g -Th0 *#^O[K=:2lr`21WNrŔr -d7idNLxk"_)l3BX$gFZݰ)36#iS& jJo_4FT6[1ꀗ4ۍ|iUjyUV@cQhDYO2PQ6c.gƸrbHZ-Dj\HOrMxx\yԖ{so]k_g:Nx0b^k(B3KxN?- -qΦtŁS"o&5狫5"Rk<"_ F3emv]Eo3N8s8eMX:N刂 _ϗcqxOۣ '܊Q} 5SH1b&1GpmDJYV:e`^)ieyFp$ATudC5 *Ӳ`22NN 'ڇ*2Rzt@%\>52e#, jc"놶LDmT2쬄!/b;PHXpZUn -@ ȂuZwm,0\5!0/s̮|󯾲`֟P E0iDnWJ٭Ey.6;˕N&ҾJ7 J:bDq8F͐QsqRM$j6 +r( 2NmN_*lA2lj[rDRQ)J1cXzȉ:J# j^ Ij2&r3$:5J0q^E>+v8Ԉ8=?\d#j-Ⴔ欅H1*Y}Li˄g[ؖ0#}<~rN?'(}Phm1OS ɜjy5) -Y3PZm=lH.dVą^D'Ӓ[ܰgn*TBT| ȤE(xXHfT(@RYS) 2bx= U{-PCtkDʔ)'Go~f Gv6򰟭:\5L_h0z[kgǪ% -@e "eeаgUe(&KG|j,$nD~0}w g{osk>'#y]'j{%e%` !Pٸ-lTĩEHZ-sΦ@u 2, -UmQZNCDlxzyRFHb13v{`,&эiѱZ\j׶V޽Dj#9COcC=fbh zmhk_(M{1"Xo}c77 pm, 4lZYii[x;۩מvSKذ5a,>OMfWiZ/j/Ltf^BQak 7s(90<ڪt pW:nY)ًdWBWK6aj.i=.i3|7-!k,Z7*o^?UQ[T/=/jd-ziո}q;z:݌]oܦٻlVE㗦j~6}tQ7uښp4GF3 Ǚu~QT@G 8Zx%l'@q -Ug'\|/. #IIHbxڻG -ϬjzR_v'QR-m-`փtkɨ \'$5LD0#~ߥ8nъR2ZR֣rjdv5[XYFp.\XQsXQPzR%6U%k!ItCn@Ck^U-b}_ux!n'O}'󂣵;7h[*ݒJERi9h?`bZQl?j2q YH<߸G/5"jgqkZCseޅk|0ZVLcva3`{肆l׎y~(i@֋fy6G#ԸhľHB22 v+gJmD8Mb6Y5e5ĝIܡC|4g,Vd˘Z[LoG'G4Di&x>%wS4HzT'Nkzp[jf̿i>Sͧ^Q-`,1%7;9WF57‘N.ca2N= 5~mQ6"zgy? *p<.8:04ه0ks|QlE(cODS{&;$`+MDFqk -R njwjwfJN)y>T6ׅv:zGxHGe#7@Cx6@/n(Ȃ+VY}HE=k9fY ,ŕXXQdowgPR3#w3@{u* L`]FEdcF*цG.#h'Of5җc;}V[ݛna$5vĭ6e6c~>b5|>[\Q#]u.^ -1hj0Q0W8ulX j)),n7 $R;;y &;RxP/ZeRxͮǵB2em۽ 4d7iù܁֚wSRA2ۥX4Cv~yXCŷOPV.G>af^iɖ4>RO@w+dyCΧ^ƆWh((ޚC*U›zzhmY.mxy `1 PbaυZpYؙ(e$5p']J8īTYZ^mMT֕ oҋC#N^;tV]RLʇ -Y[Z3U5TsܩC(\T9^ ϰ&t#r9> -endobj - -4920 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [184.48878 504.0494 243.92665 517.7114] - /Border [0 0 0] - /Dest (subsubsec:unified-context) - /F 4 - /StructParent 212 - /Contents (Section 3.4.1) ->> -endobj - -4921 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4384 0 R - /f3 4354 0 R - /f4 4366 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 213 - /Tabs /S - /Parent 1 0 R - /Contents 4922 0 R - /Annots [4919 0 R 4920 0 R] ->> -endobj - -4922 0 obj -<< - /Length 5034 - /Filter /FlateDecode ->> -stream -xے}m`kuʡb S8!ž˚80TOttttC^vm.~g׷Ӌ|_˫~o75_]ttu?^߼^|i/xwl\7y"ǙVIus-onͯۋϮ.xs|!ݯ_.\o7\{w4OeV -mGF KA-!] x& ? ?s3 ⋫l2Fd3Vpl Tڱvsur9yPxnM# +ėᨁ2i o+~N/TBeNxk+3=l}iEսdKq.>B`ͦ!v%Mj^" `N2%]L./rK!r8."1R3E"@:IuTW0p'CIG8М2i\Os'/M@u\IQ\EX2/?Pm 蠴g};`MÎz{R=\llkM .4skarU84GhdkebUH1[D ڤ&0`fǬ `#%bi)b0E,(?+Zژ[ʵ+{FNލnp 2r}O!4؇߯{LE$%D0."}VĎ"0Gz9Z,3%Q9:jQD(@ƃ3\y!r -UnHS'̇5R2g)_w<}ŋ?~:G9]C -eAȲ$fkncGA \( -ohk1/64W<J.wp:⨴l3g㉻F Ү <"X)9ƕ4;>%f*Jp~e;u..;-)aX`GH!d-hajgNW!h`ĠwƾMxtQ5*ln?c1U*xz|{zb1B:&$;ahp Zp5$.:'o?H2NJ%g4!?N -f:j*8Orl -F t !y,ܙ}HDX<=+ mKθ2gN@sŔ oyɻpΓqh]9":K[R,RiNm{?qQed E{d(u"~y*%w"̕D01'I8E}VD,GS$y)K9\1m&hI^JbG -y* U{5PT;CatiG)0*d;eO`E$p8m }DA[֑01*/;쏰?@("$M+bț!(b\8Te8EqXnZpθXg=hyH xާ>NM$h\qz0eB+BWd 9sjAglLh.;^0kzXk)G5S8OU~T^%êNN8F:I`W`tK4fh2'NFwnG1 <51,#d.t2 a(y<_hxʹίYw)E/G}/ -ЊZh_{@M pԒջ"v"єY&TH_M8t9̛t a,1͉0rm HGVӘ&=Ը,(nB.g&8ɜNOg fA&9ZIQ=Zx.d&DsMg$5&̪q  ;f(o\\+2X]˜vf0 -Xbcc~ ] ž d#TX&aFNs-]ܖm%v0ONɶre ( ճxD+w/Ƽsf0g4E( -2Nۊ0l(P+`E$`U҂Y9+yދ?aE2.+W/ק+45.xˬr("F2DW:0*Iī t U2"+6H@QTr~PLgR>> -2G% 1$.JH88L5SǁOZr$ˢXVM@I -8D{EXIGY+K5(+x~| -iUθb=hq͆|H'S -VRf MLqy>0$kWEG9=7jLhxofYa^exȩӱԺᡢ,ȇR~eset$CrάcHO2dyZ(Ĩ+k33"e{co)rwT gg\)U޲1V^}Kh61۾¢K? -(->rD\hif4'?19,bڶVTr }/@\UQc Z̓-gVυB)j&U6 o%qdHaS|!IkIaX^vAc ] B#Z0-K@VH#{]wm- \E:43_ꕘgJ: -ҖlLl'f6x2UkTo\|2j*ea EɌz B|Y : )U̹JSjE#?GoxCa!8Ĉd=+g%;i,=gFk0A󉑌k+\]x(LST/!F*җ&id42ClKzGy:| JvyVzd!8댉~ҏBՠ--B6E@e;,iNjqfO4,b> K1#  aʪ=zMrk&[=C?&p_/ -.M|l<\TV_* ,aA3Z4O8*֒j;$/1"b&z}XVߙ.ĸIV,f ΀l+ސ]5 mK gf5yEo"qjD>>d] -C5 3wqy<׈b,E,X ,5Dtoi:Ips֒0I"eXXNWhAHd ,[-#cE\­XYs8Si.2pH;aA[)Vf,GJ řZu5qG2Q d+K!,Vja&fUO# 9Ic"i,ec4㟂%'.zbcOD/o]Uӓא{% d1!7Wڈ -,ar!HWբ^ Ƀk/L5S4_U4 -#%uљKdAq!ҙ'Br ԕ1Agőc9b׊9'FToRKB I)Zc3D9 -c$7^nŐ".35 W qXcd-g2iEkZ2P3nTgBf 5 KW_iob1j-)[A Ɇ94CMxۿy}}?߳w?5_~vˏ_f۷]zeC DZa̒ۑx;P -endstream -endobj - -4923 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [360.01215 517.1564 371.01215 530.81836] - /Border [0 0 0] - /Dest 4523 0 R - /F 4 - /StructParent 214 - /Contents (42) ->> -endobj - -4924 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [418.70813 517.1564 429.70813 530.81836] - /Border [0 0 0] - /Dest 4524 0 R - /F 4 - /StructParent 215 - /Contents (43) ->> -endobj - -4925 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4372 0 R - /f3 4366 0 R - /f4 4354 0 R - /f5 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 216 - /Tabs /S - /Parent 1 0 R - /Contents 4926 0 R - /Annots [4923 0 R 4924 0 R] ->> -endobj - -4926 0 obj -<< - /Length 5049 - /Filter /FlateDecode ->> -stream -x]ݓq߿bhNCQ"错rAÑILG弪}jfw0A_7OnﯯGv]wdzӻ..?}WwŋwW?t9\=~}ݷ/.^rus?~A;ޝC=€LHvoy/;.ow׼..?55__YwL !~u?>w{ցpۄ>lmI}։YǏm'od}]ݿ -Ⱦ -#7R1WqK"0ZdF{)7SGߢ G%FM -$Vū4?:hĞ'LG=Ht/YaR3m'au&[Ϥ^ -+pd8gݹFoU09U caҘ>lp֝V}'2cc:9ΣE6%2 Y#^bS=+䎍:P璖 xUU<52)QSAAAb B{AJqQ,\Qze/$A(h2ipDŽ`YwߕMCd#t= obFҎEHLb JA^b5iF JnMQPRI%lʄt?&LјE8ˬDjH7X$#N'΄[1F̈́}Cf:vR+||br)O#  -HxE u"` S`/q7USS%QPK'&Iupw?+oӥ64$:TU ĊT4#5IHMBG"y(mLVRGWdϳW}R| Bs5I{ڐ]]$zNޜ1IF4<&P1!\* Ù2FU J#n9*9փxUf I<ߒ4"P܉>[\B % sk*^T7w1~'R9 Y0e "_s G>Z$ -᥇|cKlo?K#@ˠ* W?_{g8q䖆98<|Z#2(HFR8B:Q4iVާzDJDH܏]&5r5׸OebjukM!0l*!.>~x\<|[ϵ̩2gӘ_*JMq+:qUynO4r"A>+>s?YT_1+unxid?kMB2)*3p2QQANO=nH" B4aAOn^)Z>L0VFtB V{Z3: t~C4 -3WP*@GŁ I>` -ia=!R|jfEBZ|=OuiKXT+’r1 -܁Kd(Q & IQ `3 喛lސ֪gVϏ KpLKFN9;OӏsjRILLqe܎ڷВ,y2vD(kZ9lzZ|k1N%j g k6CE/rA*h9ׄ`f#XA"(L -z&mDR|QxȂPg,Q%I91=T"7P pv4`RYmԗȣ#"'Biƍ0eRm!6BERS{]=UޙCuRV>NĊN)N)pLk[6j9[53@#5﫠^XKg%)VTh*FdH_0a4~ >r7Y.P<ӘRx1^=E?RJ٫K/*2 GX^!-m45F'snq Z=)ޯKp h+{Pba֔Uy^i`^=Z031CUZtKH܃0rmӊO z{^etNgדd˅a -hZX;P'Zi戁YFÏCTpARh+z!.êR,+B^_v\UW1au7*zN,XB'r5,Za[9*GZ(gN'kiǴ9_,\=#Nyɽf& %b?_$IBYPߵ W^ yfC趥txٛ[5(lbP#^)(T.Hc;dB5~z] G 8~-TƻTl)Zί$p/ $6!8ϳL+)?iw0 }b|(lLP% -IIW š^YBJ5?yq0Sq]Z( iָ*1$+qݩe/s,+j|j*M<3vhw3i&˄ӽ,b)1Lɦ a }ge7` J3tM3HìY68 3Z'Xɇlrv#ز3.xpncL+ 3K7]bts3^2ۨs3SS\PNᇚBݺA%Z4YA:rgz*ÏupSVV̪F۬"{=K<_oXHxrVcْK@{,_P5 -KPrEoHFcVvIv0 uG?я Y0{{ -Iީ*dN=EOׁ%uTTZC8;M*ԡ@7n -HUA(=Sd^P uʾQ|'Y0bR )_@Z `f:7-o*hb+,D-eL܃>IBQ/JXsrHչ%AifF ݷUZ3[3dd^26bn(I2_bLR -̡ -\4QrLC ʟ|qw fof<0L_= )?m5\V/w= -q(]@Dn -"(wYμZf'F/2Cj7 9:/ -*ow1QXqr8<4PRZU9`NTZ6OMTz?=-z~7p-V|82ܰ56ޣ n_gB -:cS 5OzpOz:b/ z4WeppKޕ 4+, bAh?eX)|@S!H驟AB& sV HJ3)5# # :B9&֛rp,? -' I6f'[Ѩ &iX~ _ Co -i1 1@`HǴ,=Ms`%e ->_$`,7,`M2E2I{#u@5Lܹ /W*B1@Vhm8+ WH'ߧ_s-]~D}saS -.~]q='ZK&3Hu&i+zۧlkX:!FX2C;.C/ \Tx8KFEFPpɡB\zO0-Y SV=e+Jq?n+wؗ ̟ILe XAN/ jUs}B{nz:N\%uhm~%<4fC[J&b a1ճ7@#'&Zv[x]jf֮+Ỹc8ō-Z)n܂ww7*Y-nDoy호WՂq үZ;KfR2q#zA7,ejܸ+&Iˌ;k=ORQq#MjB2)VV~OQ/GEW (z'n;7ZZ.1zJof~Mֱ ~ǖU{ihoƮ7KIcݣ=`Tgi6 yxm[ʌho^쩛ډp5.\Sr%hVLVړShz)Ϗtq?e ԯrq0Sd#ٿLu~mDK,v ~w?t]|q~}/ﺋg?~Տo?ޠ݆uH% o~ -endstream -endobj - -4927 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.36813 292.08337 218.66814 305.74542] - /Border [0 0 0] - /Dest 4525 0 R - /F 4 - /StructParent 217 - /Contents (Footnote 3) ->> -endobj - -4928 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 93.517395 82.56614 104.24536] - /Border [0 0 0] - /Dest 4526 0 R - /F 4 - /StructParent 218 - /Contents (3) ->> -endobj - -4929 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4378 0 R - /f3 4366 0 R - /f4 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 219 - /Tabs /S - /Parent 1 0 R - /Contents 4930 0 R - /Annots [4927 0 R 4928 0 R] ->> -endobj - -4930 0 obj -<< - /Length 4465 - /Filter /FlateDecode ->> -stream -x][~?bpU! I )/668r>s\$5hZ}Swكݛ/w9{]wg.='.~xu.77.7<˧6g݈>g oxs˙3TcaNsռ|9{ɛlx o8yͽo?~SZ2/izϥ$tg6o 3׶SUW1<"ѳ gfm=F5Oőͳax%UÇ_y)O}E[ly)@79ڜk_φo7}slno%-%o -cw]\~ -~φMKrHTrX~>RAWRo4s _^Cqy'.?u>ᇳ.ee~@v@U"Nkz -kXoB*@ɞEvXޕ]Ū3J2.g3Z;9k%%wЄԪBIt5V+- *RΞGQoLxkYpi5/vrD_vwECpś[o -[axª-"4OSۄ 񌫵T)ru-i$jlRU\%Lg+bRA8f`J ʖWThCw;M|AZ4/M-#QρI*E;"8Uiҳ/Zȁ~xC48VM- -VKM' V-,ίk4Gb*+joKj2j9Y:QLu5{Nax_fWdCڗܡ%KKxCËUv^z)Lpi&< etoce#'+]erSbhOVWoWRVkSܭ xpǺOvn?r%4 ӳa'WEZ3, f) jhViY9%9E\7K5B5OYQPşQ;% 꾹<Тyh -*].4p:#ԦUܭ-ø&n.s[N8?V}3uBf]ѢefV -Ib9G Z@=P Q$}Kz}3֏mNŶ50dB/5#rq -D5z~tL2pτc!t SoWB'i/Vࢡ"0or6[ o^ӣgFEjڣ>[&a-,$w)t62?lɁptU1%& m^_h۝ +Ukǖ vU;ZEWE`<t -7m -ro3%D‘țP9n+$lgvm z\5LtNä'jOdQhb5!5 `d(Xk4Ɛ؉2_n4_A* J*lF!Y5;EGb5_h-8`5[($쫬\*kQbH}zޣPE i>z:f -CbIfHRZ2Ԫ3CU<"=j{,$ 3 G1k@2{ÌS'Gmc2L~lMRB 9nu=-O&{3:Z>hiℸaVx5 g@>8m9ǣ~@"ҌԁfҸPIk+03;pPMp"\2nOI\̝8Me|ؓuz;b,[O!Fafy޻/J;cODhv}~DHbME ԯVLOR'g>*7\3Z'hEZIGù}HӃSgZqVQ\C}}"fluvw84hӣ = mnup:4h8+ bUI"HTj~ǿ,B[&) 7;3PYmL]U'V|jEECI9 Sp{\f׾'8njN@]D }Ny;$Mts-8~ g;B!::o#U -ubPց\FRm8+a*I- -p$W) tQE`l$d3aD[*~#`sfǔ(USĨ5c'j("ρ¿NkH3u[)iY Ds22 jd'Ssʼ7p˔'w؋FxO#c|9"&LQd^'Yc/ƏyژÖs5v/wzўQ#{9ȳ1D2@.U")s2실]WS[>|B-e&MG9lڵF{z]ҡ&-NU1`W+>]<~4NfwiiWG$ d^Ll쥪37g2_2u+ܭt*Y}t4nwW?4ߝ=|۽{}޿jUt\^޼H'=hM -=8{V$}{E -endstream -endobj - -4931 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [424.47882 568.8544 427.7788 582.51636] - /Border [0 0 0] - /Dest 4527 0 R - /F 4 - /StructParent 220 - /Contents (Footnote 4) ->> -endobj - -4932 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [448.44293 555.1924 451.74295 568.8544] - /Border [0 0 0] - /Dest 4528 0 R - /F 4 - /StructParent 221 - /Contents (Footnote 5) ->> -endobj - -4933 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [436.5668 480.0824 488.00662 493.74442] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 222 - /Contents (Section 4.1) ->> -endobj - -4934 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [448.2978 425.4344 492.196 439.0964] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 223 - /Contents (Section 3) ->> -endobj - -4935 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 336.6624 131.14336 350.3244] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 224 - /Contents (Section 1.2.1) ->> -endobj - -4936 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [123.86342 254.69043 176.0907 268.35242] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 225 - /Contents (Section 3.1) ->> -endobj - -4937 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [146.12852 227.3664 206.04572 241.02838] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 226 - /Contents (Section 1.2.1) ->> -endobj - -4938 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 179.58038 130.88567 193.24237] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 227 - /Contents (Section 1.2.1) ->> -endobj - -4939 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 105.24536 82.56614 115.97339] - /Border [0 0 0] - /Dest 4529 0 R - /F 4 - /StructParent 228 - /Contents (4) ->> -endobj - -4940 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 82.78937 82.56614 93.517395] - /Border [0 0 0] - /Dest 4530 0 R - /F 4 - /StructParent 229 - /Contents (5) ->> -endobj - -4941 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 230 - /Tabs /S - /Parent 1 0 R - /Contents 4942 0 R - /Annots [4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R] ->> -endobj - -4942 0 obj -<< - /Length 5550 - /Filter /FlateDecode ->> -stream -x=rHJLXvJmɩI5;3@\wqnt7nn<}igO?4]^_o徹|u_o~|ٿ}|E^\#>bhxÛ 8μB7X ݻo?p&MnÛ~bF+~poKAy|V<ߡW,jÙ=sՋo7y@#ϛ)˴_Jt8̴UwkDZu8g­:\y'WlO"7_6`f?pLHr owa~ 7_]E?ll>ߞ#5DSt7snN%L#`q,.LoΛ azcnKp"meVU"Qs[Ic`x˸[\f$ZOKOeJ50500+ǢE@qy2| ,0^0˖qjiOZQ8a&o_ NI}~eU*\aKW;DK/ DKS+$̋qr|Q60{;zrpP5 -zV% 7ֵT&|_Y!,cۼU 2Z,\"jm9{GGYye]rs_}Vdcb{W^"|N1g|PA*vq=o.\i}ұ#1j`H( -1ƨ2FPobbOrEz aO kbֻhkt+RO`I |y^µ[ ֳK,'f2 @-۵3ZDC0Rpkzo\Eppay9/GQl`@BVCN#Ssb~U&@IgcԆZ=wl%ȯ;3"Jt\Ic'ĭbUzr 0NH<\Uv-5=]l^̃m˼׬j<#L^"V?' v㗿~|ZDԥoY++0ZI;Q3fA'^+:,72Z!*ll-cP90%>B%c &&0=+t+:ֲUjżTIa69-[|^JՅ\n&=][Sw@ )<,C]n-sh|֔!A?0B"_vK\7a\ b®lj#yCֽ_gǧ9~@4*Ɛl6nr^cK$ⳐP7sؕM,fR9k ؄&súp)ǎlzB#Kh l .=B-K˭M@{_M2 -ɬ--nAK,gR8TBϑb -5'«FSC<8Vq:ǎb&U&mmp%q5*ړ# -+ˌ~ 1PhʾcnC5&Gh؏ -B0gq2:v`DUffF.v/.@zj"C%TJ +ة00L)=< -eT}vDUFIPJ#, zUɫgO/Z\Zc#,JZPE, ǹU`$ȕ+,Qpݸ D/ZT`dyBzBM,0-)Rˡr -r#=fc!Q>^3Q!#I $SvAThvHΕ&mh;aAކ [mhYpQyM(e-B;ݰm23Ƈ%Aޙ^3z@LJ^ŷLn^o>6BYƭlۆ7?ojk|azKKwyŸ8LӭQ]{-ʵq T;u '>kXՖݧLJ 'G?*.-98)TV43k|9PhI諺q228ŢoBwʳb<>כnooor{|ck199u7)_l& -endstream -endobj - -4943 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 732.5514 126.86732 746.2134] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 231 - /Contents (Section 3.2) ->> -endobj - -4944 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [296.2944 415.4574 307.2944 429.11942] - /Border [0 0 0] - /Dest 4531 0 R - /F 4 - /StructParent 232 - /Contents (44) ->> -endobj - -4945 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [173.63432 94.49341 184.63432 108.155396] - /Border [0 0 0] - /Dest 4532 0 R - /F 4 - /StructParent 233 - /Contents (45) ->> -endobj - -4946 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [191.8974 94.49341 202.8974 108.155396] - /Border [0 0 0] - /Dest 4533 0 R - /F 4 - /StructParent 234 - /Contents (46) ->> -endobj - -4947 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 235 - /Tabs /S - /Parent 1 0 R - /Contents 4948 0 R - /Annots [4943 0 R 4944 0 R 4945 0 R 4946 0 R] ->> -endobj - -4948 0 obj -<< - /Length 5092 - /Filter /FlateDecode ->> -stream -x=k$qWf& 9X7YV{ќ27zvU,ُanEXU7_>>>ӟ辻x?}˛_~z~0x㏻O>o>7~Y'_JuݝvFMod+iÕWoeTOWR?JN^ɽ)?i8T@:ET;O%- ݸ]86Ni9_e&N^7(DdJ7}xA 7gD2 }0zuB%` eQ3eh$#$VCmx˚xzfw9 2RN@l]7 DL{֝ {/`QՂ ӆ9Ls1]QWh{W .;&:7,®}Z -3iq{ț Vh73o =4vsnt/s7<\WiAb7̈]cH'y}<3߀T&a -?l?},RK:mE8V^hW)#)Ny炐HGJWŏDW(WV7lJu<!{@Q;plX90$s2N9i 1ϟs.匎rQzAb/;a>hV%S4)s-Q.> N >^cE=A!z2r:y3xضX1οu&縕(a ꙽v)8KȤe^Wy+fGZ3$xn\ŋ5Aߑwy庝VwrlR9Cia("/ Mh~~GPpy`/K¿sO]0y3QX夶^k1\,(g@m#&HՄ*{bge8ܡRsYer5[&e{:Gf3c`ĺK`3!Šʇ`%*%P%PAA^U-=<}_|!>!NySnl[/z L[$;{Nc(,,PfBu9XexpKyX9/kՄ lMlm-gb6K3 ߃Q%%rNsQvzFI DX -J  1oQaXQ -G$7#:eY5 QX+:QӁdQR)@+/g R^)l7tXl}P3̎f0 ,Lo*ƒ%'v4jb}Yn &wI]ؔ/&*&|+| -gBcmkO}~ZV^hm9n}H&̲RQW.QUA%0zSٞ9\5UlꂋZ(&e+I יڰ _*@Ǻhl@V% 7:NS^O0 -%-oQC'QOr mj(6l/6Mu0PTTBVr!2ˀ7bku+=T-gׁPNbL(L/)$drw a*8R*89f~7.~8a+zZF\sEUG|m%uy~kY^װg>T.hO!JN tI0d-v*-^!-M5,>7v]PpEacpS"M>xiH͚}i꺁CfE%N+t -1cD, &NC\yI3Vc1) I:0hDϧbudQK&**.I޿GfÉ6Da[9Pzmkf#ΚŭnzUNS~Ԩ7[*"2쮻K@BL ǎoHy.rh5"zaiPRRhg / 293yyKf1aS$s 3hAϿHErA~Yܛr腎v;WQ@J qZ5PQZ!n5 - -tP&.6!Qeq5̺V${ Y˴^Ȇ#ҵ@K ? (Lf=i W/e^ߑVzUN2"rw"HٗiP2)It 1ZѤ+C5+, -h?(*U6sNR3tk&+ I -n#AaʭȔ_f8.fILw)A>qkׁJ:8}MŴ(,Ʋdt܏@]خa`~:ȓ*xNզ"?SEz{f-(5ƹ˼&'،*qU),֘9-*g\ \/ѵtߌm#K?C)UE':nq4X'"Mc+סfbo4ԛ $Eb ҠWa hcD!C嫰: -M4[qQǩ9!B=*?t!-p4ވoe(Zn RƖu<.fLBrsŐ%?!hdۉ50w ̧ _nEdO:&XLyjѿ֥CXxdnl9FAƛPakT[=T{W>j ق7KÝ#)"j>RWeu/[?`>뗀 n2 -WԟF_mf'1|+SvEdd/~ől/#󯗤 zTlJvڴ85zadS+b/YC~zn `-fџ/@w|CZZ\WnE)3r(id_i!_6⾅f-[b]U:y᳠B~G2HePJDZ:>Lo \` -@ --(-9X/bgsWV!o&uX ۲+FF+\%Ko9xe1hE/.y3dE Hi\5CJ(UڵG_ٔ!B, fۧka=;Nh/AP73H=r̈́Kbؤ4pzB$T)*7xKC%@$9._4ZԂS=+f3nNqc*O.wgky]QulҚ^Սx} [e!HkDm՞ɼ=4YlG\ŇAR6MRQq/n]4%_~*uy5g#MBKio6м~KY/1U ;afaxBc -%aٴ mr*97>`'i4r$2K )i?( -/2clj[ -lvV8ӛ:$>Z2U'ݒ& O]\yNS|C6ku؅[Th8td~XE-@L\rrGNBohcej-V/ګ(YUCdEW슫T]<U!ND{g^c $PkOE{186@k)L8t"`5jku9QDQUevӝRH-c4FE%L֨ E3]o3^cLhy[6\ڳ(o_]k8N.@$3-6IG)GԅH̷AR:UR{ŔBƪJD ІMʖ7PaA\1YX#iя6Q| zN&6 7{fSs%F<n>lLj|( ' C19o!sȃl5fvT~D?ȢE?dK?ゴ|`Vh,Eux/t~\ޱ)A "/oqm[k eh+ %bsVgR,Tofu6`(ʎ'*Sv(N<B iS* D6=M[V2}:>UKɿPv8&¥_M{^[[$k2jb#P #(#TJ -LeֳmdZ&5Jf/ 3.=DՁ,>I"յ{~ǻ~oAeۓScc -\S'1FO >ڸ&,4v<^?籌z0nw~\ OwR+CPxv2EE ѧdk?խ_1bA85W2¶Ky)t?Ԟ7W?B)jo5d+]7}ڰ&PۭVޖ>POc^ Kgzpl]B ~Pwӕt2jҧ)>& Ӕf-3JĶwo;,ӟ辻7ǿ0x,aBwN[yn7\R -endstream -endobj - -4949 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.57414 657.4414 86.57414 671.1034] - /Border [0 0 0] - /Dest 4534 0 R - /F 4 - /StructParent 236 - /Contents (47) ->> -endobj - -4950 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [455.87366 453.1284 519.39343 466.7904] - /Border [0 0 0] - /Dest (subsubsec:context-access) - /F 4 - /StructParent 237 - /Contents (Section 4.1.4) ->> -endobj - -4951 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [326.0764 412.1424 337.0764 425.8044] - /Border [0 0 0] - /Dest 4535 0 R - /F 4 - /StructParent 238 - /Contents (48) ->> -endobj - -4952 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [342.5764 412.1424 353.5764 425.8044] - /Border [0 0 0] - /Dest 4536 0 R - /F 4 - /StructParent 239 - /Contents (50) ->> -endobj - -4953 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [456.27435 309.70837 518.84344 323.37042] - /Border [0 0 0] - /Dest 4537 0 R - /F 4 - /StructParent 240 - /Contents (Definition 18) ->> -endobj - -4954 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [150.30486 111.64038 161.30486 125.30243] - /Border [0 0 0] - /Dest 4538 0 R - /F 4 - /StructParent 241 - /Contents (51) ->> -endobj - -4955 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [124.75167 97.97839 135.75166 111.64038] - /Border [0 0 0] - /Dest 4539 0 R - /F 4 - /StructParent 242 - /Contents (52) ->> -endobj - -4956 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 243 - /Tabs /S - /Parent 1 0 R - /Contents 4957 0 R - /Annots [4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R] ->> -endobj - -4957 0 obj -<< - /Length 5393 - /Filter /FlateDecode ->> -stream -x=]s䶑T\"dW]_z ZgYd\uW@wFwм{?{th>i^O/? ܽ~~y?{OO?o>7{V566m~{?/dϧŧ_ܽRy{)RӟJ}Өڝfo[jms\vJ=טp"Ga!/oƱ, )2A>S?iqI,3ic}<7ҺUӉc2&PڊΘ@w<;?IZ#s,6dYrV4z13SUv ew(`a2#hf$vzRF)PIb4D4BPvbg]4/GqbrWWq̻lX5 yρkjpn4 U4,#3:13tvvJVi-e):,ޡN Xmhy0BEw$c;nJC$|n1Bm@D$w9r+2y X)6Lr_UU*u0ː6oV*::%yΠNAe ^&m?+8bn?NÉUns>HFq36K+2V(cN< xoC*p<2i%紘]!֛mN;xN; -=+S]f|M. om-:˕w -F7rܑ[9?1Bيg2uvL+ZZdG5 UsBŢfl ]Lc1HD4R,Q'F ?6J9}TE뷅m6:a+6IڐyQM UD5S$G)92Zhݏϫ>9no3\DPuosxK2A9) Qɔ `86S"EԤѢ~ -X#ЇN ;\ZV H':UL Zrh9h"¼H 1vrLzXN[LX--1 "cP)[6T EI<(/hi:''B2pcYh4 (8bW&)V<;^9UhRvpTny*6evy)nvs]iM%3zb3 H1BK FhV {ύ0[b(Y _I^E,6-W5Ŧq`xP_d -{AS/XfQA>jl)f» Y 7~3>~F֬&+fos}ۡ#iSs,(*0xOլ_SOq0?Ll%,V\f-PN*SX,9e]9iDo7|INض. -_Vk*dQ"AG0SUf04*rA7>)+`B"\j [7`{)tֽ xGJAɠ7RO -Ңj5EM*[?|@ p=x´v 6~~AT1W۝JKh'ͦmW"X7M?;ey٤,~,9%! D8b6`dqx1K}D9]DQ=2٢hQAJ3i焔U%RR['FnxUYT%eJQ)ڡz}#k^ l -*; kZ-l3qje5_$-!#M~zQĴGPv i --@7(ā긏LUsNuy7hv"\( "*m &'lNt"<ȺZA.[Հ.0T'=,om9/Δ 4 - $U0ڡUHqr&6rB8ݟ( el Pd7PSEq!# dUl_'p q]ځ(7Z *+zi^ȡ[5>K*raL[ʑ6VU(%Ng(zj(иNnvtli9oR< 5b9( fk@三-R '+B_@W 򢗢:֗"AHlX{.*' ϰRDʅ@N 9]:kK?mLCX% =hEU+³(xhR .]i$ *`֨7]+:[P wڊVvv̉@F4:vKŶd/EQ_#JCwrG^\.a%/-[ evP&ykgZ:;<%b, ,4u- Ưĭ Sf%IrUi;t\~pK -T|Ğ-r2^ -J ɺ^NzwFNH*G%AAӎA -qa%+CoۤNyf4Z'ǦFD 8f)$6,e'&z2lZ0K)Sey礌.4%bs{qcy+([xf=Wk6M_tfW]/\udۛInaSa+h.t^- RvVїlͭ=lRo1Ś"{n‹ 銢% )(-ZS*!D?cEQE"YGR56)$ơO7HūB}IjpH^ ^5BC5˧an" r;j(RLܱ`||olw2@JFA `[ׁ)˿lZdIUl 7 -\Gn+VruDk[mՅ6 oh[ٚ% P)@@ga p^-#ũ/\P Akp+tUB%OrY=c3uBvn0WTV8e~(Z5ebbf`#]*L_{M)ځ;tʎ>t0Aۜ~aSZau݋_>i[IcҮf<%UQ([P^YNVEpFg{1zH^x?PI{bշKG$Mlſ~YfaV3)D}k -2SuWM,U9^S܇YV->|rNxb(a^}+A^yK'nUήib!F%_b5qk Z&N%kZVTbKً$DzoWV T;P:JBSD(>➂ts0T@N -ȟ Ě3{KkaoXZțgh>\}ӕU8+kT26+'G%Gk }Fqhu{Nr~8L}idw ?)щotNJ-&V[%}6=>TxtÈ&^#Ed[B*HQoROe6H[@ЛCTu?"E9=M!<ۂ9w,QL-kRys UIC1ˈEoHrT!xqgirnɒ]'%ge__*51L%ӃHK۔BZ۪}) -)mET*4> -endobj - -4959 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [246.03696 494.1144 249.33694 507.7764] - /Border [0 0 0] - /Dest 4540 0 R - /F 4 - /StructParent 245 - /Contents (Footnote 6) ->> -endobj - -4960 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [315.25378 466.7904 326.25378 480.4524] - /Border [0 0 0] - /Dest 4541 0 R - /F 4 - /StructParent 246 - /Contents (53) ->> -endobj - -4961 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [311.1513 350.6944 322.1513 364.3564] - /Border [0 0 0] - /Dest 4496 0 R - /F 4 - /StructParent 247 - /Contents (39) ->> -endobj - -4962 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [140.36269 289.2464 201.18646 302.9084] - /Border [0 0 0] - /Dest (subsubsec:coeff-context) - /F 4 - /StructParent 248 - /Contents (Section 3.2.1) ->> -endobj - -4963 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [486.33368 289.2464 497.33368 302.9084] - /Border [0 0 0] - /Dest 4542 0 R - /F 4 - /StructParent 249 - /Contents (54) ->> -endobj - -4964 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [141.26205 275.5844 152.26205 289.2464] - /Border [0 0 0] - /Dest 4543 0 R - /F 4 - /StructParent 250 - /Contents (55) ->> -endobj - -4965 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [251.55157 261.92242 262.55157 275.5844] - /Border [0 0 0] - /Dest 4544 0 R - /F 4 - /StructParent 251 - /Contents (56) ->> -endobj - -4966 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [447.87784 261.92242 458.87784 275.5844] - /Border [0 0 0] - /Dest 4545 0 R - /F 4 - /StructParent 252 - /Contents (57) ->> -endobj - -4967 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [397.8022 186.81238 408.8022 200.47443] - /Border [0 0 0] - /Dest 4546 0 R - /F 4 - /StructParent 253 - /Contents (58) ->> -endobj - -4968 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [167.3757 173.15039 178.3757 186.81238] - /Border [0 0 0] - /Dest 4547 0 R - /F 4 - /StructParent 254 - /Contents (59) ->> -endobj - -4969 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [400.45898 173.15039 411.45898 186.81238] - /Border [0 0 0] - /Dest 4548 0 R - /F 4 - /StructParent 255 - /Contents (60) ->> -endobj - -4970 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [416.3656 173.15039 427.3656 186.81238] - /Border [0 0 0] - /Dest 4549 0 R - /F 4 - /StructParent 256 - /Contents (61) ->> -endobj - -4971 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [183.44235 125.36438 194.44235 139.02643] - /Border [0 0 0] - /Dest 4550 0 R - /F 4 - /StructParent 257 - /Contents (62) ->> -endobj - -4972 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 93.517395 82.56614 104.24536] - /Border [0 0 0] - /Dest 4551 0 R - /F 4 - /StructParent 258 - /Contents (6) ->> -endobj - -4973 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 259 - /Tabs /S - /Parent 1 0 R - /Contents 4974 0 R - /Annots [4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R] ->> -endobj - -4974 0 obj -<< - /Length 5950 - /Filter /FlateDecode ->> -stream -x=]q+|T3CH)N(J627IG銎\){f0 {Fwqw_ w~͛O??>??>|tw _|W/.n^|{wՋ] 9`xyxŷNJD]NHu׃>u,Ҝ8 -3HύWo."@oxP ˖)a3W6(b?J9a?1p=<%%:qSr<<3V"O,Nsf,4i-Ԃ-:QKbgbz>I zPӆH] -ki+w]d93%hK ;8@v ur#)-lpF3zF.SNWrsM,gY*QSIӏ ͒Vҭ&<ƂwJ<ų*UR -DW`BJ") n(13XHO|hu\Z܀kbX;_8%En)"QSzPhz{U? V9h/xE9bQQ')=1(/': :m.NC !]7%̩Diu]$<Tf4]#) -Ό_'y͠PJ0Zsi$S6Vfq9 7XiU˳%WfQQiȉƦɞ 8k3c%\?I‰fo*Ҷ) SGnlU ҳ[!Be9{h -'5 "h?]SuQpJt6FKiYzcrrgA]]Av ܀xD5Ama'7< E+SHBx~7# - 5g&LGQXYן^|}vʋ|Rg>ƽzNɳ3M#{1b{=Q5F%7jw9 .Tc>Aef3+ϣai1z,NN7j"l8: tu/@Mrkd 6XnxKH_i-60.Ĩ>7e/YoR/j0Rrr+;wUO|;(`x{d*긐.,T_E$45y5XPJ! f=y}+_F0D淤;| (yǒ9[ -nXQi,S̛Bd~i\ fgqd冲VEc -&vT9\BJ).l>?k48bhd>-X1![p4lP%H0S^rNl;'kH, -1Ў3 ӅF¬SִeLex 5Mgk'u!Ʃ0I'9L~egOt_"NӢp܏xU߳9jz286پd,j!琌̉1\n A87W{ϴ:, $#dvSp#9"C]ƌҖHIG4\rr&ܼcӲ,UaYDxW~SNQ ։eA v F6䵫ksi\KOLұd@m1S=+m rj1Ёaps#–j"i_<]!$|&|.NyDWLҪ0p$lb wі*]q4Q/^lnZooo;])Q)Usm).J%d:?]o-R& -]2'DK>bWy,1$z4 +IAHL̎* Uhج!0DWK蚐d.iJ/d&9D(")0=H,qO:!bLI5aFK#HʡBBpղJ - 0V -!4_%1鳞HOMpX7[r J4atD`JYt#9:"-ֆe\.I]6N1 ՂA5TS*86h-D<3sH`;lhISP9ȧ}P{&8w -ۨ`s[Ņ3y_6 -%iC7f}Y,2` -gq@:FPVE|Uu[i-Et +8vevgs.TJg]fiK -)5.x -(Ԑ͐4 }mxa [c02Tz/%Yj02@\1M'˜Z;I5!2*X+:l -mȻ4U-̨M yW0kUE'^H7JW" -paO" xH n@śi n<]"^HWza9k:4TecqB1ѭ%cB~ZG\OCoXQAh5M : -hg" ~|5H"sOReu;JRc3͉%dQQ [d kҁH v3jy?\>B}%C43#9b}`.˚|DGL%pdU2&yãdY#qepP|)+sߣgNVȼ&N4Z_"GCP,C 3fdLBV[iα{OD]VǕD -!Z YG 6 d-r8f+ SMoS,t!MO NWJ?m -C"ؠb -U`8~7V-UqHG8Tq@kI]PRk(k͖c 1%)v%l4 5-j&fy*BĘ -hR4s,J*TN&,[\]%튛NVrj,-bsXK.o;O'y$L4$,HW'/vn|FH -C5 7P*('V{MqV8*@wJ-I[W3rV6jq.2j*1TR'zŲfUmvpf3e] `9su\őORCdP]*fT[ ^6lydeMkg`@By :.bUm^Wѱ-c:lLP-.6[ܳdWݞKݫI6"6GFK Jx*R^ܨ #E>׹h.B!H53Ic?bĨӷH{Ҋ,;ϔ`|Vv]xZ mxY)lӡw޲W*o>g{b @ش;E#W6isK*N}k\2WQ j50ڀY!]P9e#v1c sZ󲱣#Ja{/j"Ht%k+O$L)ʠRMG[80>Vr>XST2٤9A!I)|N6L;cZkvT@Y -Jh:TB;iQqRƺbɨCW$b~ %BBE!)˰v¡zNXk@PʩS}Q -X2]@ƫXL -Ы=_uaԾ Jɢ 9l~}Y -@m*4s?nz lދrFD:l",Br0,F3HzeढEռlQ+9f2Yc8[ -aNҏ0Q ɤw 4F`|mV^0چԄO Aʂl4 uD!T*DO@yl;#RzķkJvƄlL9uzsV@(Y-ŠuE>pZ AU4S N ;?֕Fc, %f`,{ɨv,Rf)s71~;HЧݵ+"(jkʂiMZGbd`pJ< Y|\n6lG]=62xJ[ul$' -2P-Fj ^>AM\M,mKq)i6#'|l|xSR2ᶥJMqlSd93T5js)hV"2J&/Kcŀhjq9n$KC п|::#?)@>fTBy0gQ}Шv?e}+d5]oYFZA*Q* H\D2C}zF>D:Ig.|+lf+Kep;vEMQJ!R|8"nM0Λ1cJP(kVΡ9(+AQN ZH7$Ʋ$c~8 HDп&~|#h! -Wzz&'MxzRa^󚚅ҠwxZH6;WAҢ&HZHhy`Q-.nh$upB;I=/$|:9RVB!GdǼYGY5YLq>[4ŐP-y*(+1 S$nT`4ӐT.nAΉ F iøxLY#TIdm^Qe޵|H 鳔rvhdl+XyG[S|Ǫ%HZ_ )ƽ"\9]2! - tF["=\uYN#f#(`_2jk3J1ہ&`?>iyB$o%Fӿ6q(b`eI,I~10G.ߟ*beGt.p֟mb2ܐE6q;nMeVmcûsukn= _*wGv%x}!/t! .>?]yҩ92UU8O.E#C+Lr3(vἎ]@d$=?>|tGVUƗ-n2v|MzB -endstream -endobj - -4975 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [243.07924 732.5514 254.07924 746.2134] - /Border [0 0 0] - /Dest 4552 0 R - /F 4 - /StructParent 260 - /Contents (63) ->> -endobj - -4976 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 261 - /Tabs /S - /Parent 1 0 R - /Contents 4977 0 R - /Annots [4975 0 R] ->> -endobj - -4977 0 obj -<< - /Length 4873 - /Filter /FlateDecode ->> -stream -x]~\nNOH) E-|N\4kwbvfE4;v_vwDQIK'w7櫯Κv{s7?5Wnmwfgg/yvvǛ7Ͼ~F6Tk[eoЦ/gWL6ޮϞ^zsvN6J5?׿}?lvvJJwTJ ep=$)5eԪQrU;nl>PMC|gxz@q;LG*FZ@9K:.U}xiYSaڈ;cKW8Ŭ}u"~:?[5怗Ə^\cŊqvg{N气 ۘ"Z`hcMtϨkdn;Ѧ+l솚!} 0ƎDK!|$v8(ww^dC6$^gC\dX57{M2 h3o E~1&ؓE+ -,.UZVueh41 -eB^A;2hv! O1R=TyyFXsM7B$~i+l:/wuV\Z5 )4KG:8aX*9i'v^f<jdNY-C,ta{5 -6V#8#`Bᄌ*QR)!jdJ8nM15( Z8T[ܫ6P`RPA33 WЌv|D/*b]']UfEOqt3t['MF?IJJ( l@Uilti? ]}rvlBY;HQ^[_TA׵ҸKD6Ⱥ٫%E2ꐮR2r):עuF -mXuRYÅ`h0a3Occ;%]I~%F2e&[72Ō3h FE#xz`<^-"{?t. qv4z`qA!!tUKelf~NO EНjIop/Ŋؙ GwdQދs%`9I!2 `Y2BdzUQy)^Ac>Iۉ[w{T܄ɼ Zxf<#*0&K%_8r y@SnT"~Z -kB`G8".#˩Rv/<1Y)Aӊ#.A煹) g%R:8%2Y(_-B#;\ɟ 0f MTMȔA{Rxfʁe}-{ F.tOUA&drōfsuu3( 7 -ig& 0ї -4A(lE~N]2萈VQJ YlqK P{9~Y -:6MY ${ٚgz^\Fx-CWx{\F&8F/Ȫ?8ATH6=`E:6jbUL!d03^Tz_C$HT49aX16J֜R˖vO*cnu*" "74*JH3nT1,pBH4Z, c#{)q΢Ke. #7.sVK%oGҞ*-p2?9[z+oZ'fd\ZK4-J OUS{_~98𗸀97̥&rAj߰uŇ.̥l+,vs U$6S]9Y[KpG#C{pL[ ~JC tg:6sf4 jfnOUW[-.\ -r>ieů5;0:iPd=#G\NWRE+@ֶ͐'iKY0%uZ5'o0l5Nz^p#"\wHqnyUՠ'IOg!￯= -DrBA=O)eZa8'޷)%xi UiyAL<}~rRGN4qiiJiՄ:T;)ًc -l543&"5d|X-D#C\} 3V-بA -g"Do13Yfǀs'wߤ!5ȶ @eZf s --gL[W0.(u&T9UitsvwDʁv~*Rt?Ptn4m$ƸjY!čV cɛsUr]3VM[`7QQA˸+{~e7#"깚EڿDYy3V"ltwMaS3(X-Pq | ֕#cK[}5A"VM,{#S[+^[>؇j\HIIX -P>Fo%GT̖ͥldߐK%RTRThM@.u>RIrL9 V%Ixc+;[ple6G۪ORڡ =5տ4% "JSĐH~M$,W*s>фKL N6ہ@p@V+4lG`ѝ|b9B`Aխsb4Mk~Q ['L曖Q{sXI45HЧLgC:d geo*/WMm<b%|M9 ,N8,hHj'ֽ E)}2.5J\.,vA_"RvO6nnCym_~7?5W/?|mwfÚjPwS"(w+2 -endstream -endobj - -4978 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [214.10814 643.7794 225.10814 657.4414] - /Border [0 0 0] - /Dest 4553 0 R - /F 4 - /StructParent 262 - /Contents (64) ->> -endobj - -4979 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [448.53702 520.8834 459.53702 534.5454] - /Border [0 0 0] - /Dest 4554 0 R - /F 4 - /StructParent 263 - /Contents (65) ->> -endobj - -4980 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [214.26477 397.9874 225.26477 411.6494] - /Border [0 0 0] - /Dest 4555 0 R - /F 4 - /StructParent 264 - /Contents (66) ->> -endobj - -4981 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [127.68758 213.58142 138.68758 227.24341] - /Border [0 0 0] - /Dest 4556 0 R - /F 4 - /StructParent 265 - /Contents (67) ->> -endobj - -4982 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [297.06018 172.5954 308.06018 186.25739] - /Border [0 0 0] - /Dest 4557 0 R - /F 4 - /StructParent 266 - /Contents (68) ->> -endobj - -4983 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [418.09393 172.5954 429.09393 186.25739] - /Border [0 0 0] - /Dest 4477 0 R - /F 4 - /StructParent 267 - /Contents (21) ->> -endobj - -4984 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [402.94513 158.93341 413.94513 172.5954] - /Border [0 0 0] - /Dest 4558 0 R - /F 4 - /StructParent 268 - /Contents (69) ->> -endobj - -4985 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 269 - /Tabs /S - /Parent 1 0 R - /Contents 4986 0 R - /Annots [4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R] ->> -endobj - -4986 0 obj -<< - /Length 5815 - /Filter /FlateDecode ->> -stream -x][[~_q\mb_ -רRdߒ<׉FN7 -H:Gp8ijv^,Dp8f8x~yf3<}z6 7n]\~opo~|ڼ>{lg/~qv/W=_|_{&>\ 3oЃӁIp n~=ï7/pywvB Ǐ˟Ͼ{\Y o}r3˹ڃR5LM L̤ J?91\B-gj AOWU3ޥ<;3 *h_DȴiM#úɸlcbY2{|EmvD,U=?bJ㙰]0\~u_Vg{4n^z;_!yqP*"GyEV5$, YZIM[pPe## ׿$:sqSvפT -Yډ0LM~{"L׫|w1y"WùJ Ldt.(WBX#dF8-ZxS]6_?a2qPZ* ';)]ȶh3(\5QܤZjTTR- ēux=h,9\ 2mF#dJ" n] &7hI}-׸dΤK#u(N@h?։~F΋Ԩ҅1c7)e#/[Y&5hśvf:\ xUTAκ6ٕ@V-,vy2 ,+BYhb*l4N EFLzck!Hɜ\17߮syW8ųpeOp; R%;Q^0]JJ& GMHJ55!MNGaPRgѲf qXϥR46&&AχLd*OOnu*:#`Md:청`Y0-RsN3!0`%JerİLͧYHov6J+b[/[<.HDE.R-ҷ#ynEy঄eJ-{wy5OvS1\/3_׸LIeZycm>f)#Z/::\#?~b#+Cf ClXj/)U]Y%rժ1=!yNM -"s!6#ZPd6Zu!v&D08B2 -'GcA8슁ݬF -Id[؂qoQ <i?ߓ.0Cwv5@#opѨl40h),u@>:#/ [$kX4F=VYI"GowWZ͡_pI TrMC SjHA<k)GyI%cMv"EfF{Jq]v#噗_"z5g1qʍk47#Zr=AD\ySEe"]s~p;6j!)( 01+#FGd+,+tbE` "-&  DP})ByyJ+x>b`ZdžO+EnW]ڮ0ʀWip?ԡg3^K^7]>WQ#EN5]FjQJS3n O9U(zRٮ@tܩù[a5z 7bh(%UP8xfߜBfт&e ۹K(gmT]jZ C:R5s~EJ*j1w9kX9ő:F(mH=#fΑT,pfxd[5oIvdž5)V0C j2"Mb"&9jH(Q歑\1}|5KərR%/TdE$ſNߊD+!FXlrm*NB t ,jZ+e -:Ҫpq(edmY,@.ߋ#^wa/&K"Ks[v5֓c7Nۨ7#>rZ7z/8URxTk${lt_~q}xhJ />NpE.E<3ib+,@tT-C -y}!9ƍ}duj2n@ &C, U9.0-YD:RiD B۩'oeR#ZkGNJKeZf^7 lمYʏЪZ]ʠYw SΟ?Vi#+7. +kRbZ5X&?29!+)#bK汪6$eBE.rޝk䈽zQKz"=_7:s |g9ߴUtԧ>ʤf{<l{{%LV2mn5;!7\V:nȩVX<,X Wl+D @oKdTz O;UIws^9o%60fJM%|F/#(ɳ-$foa2TFWzĥN!}wVCӯVB3x܉L evlRnBInt=kxuJ&fp/Z8vo6s;c<eEnk.} vX!Eח.̢)Rx`X{1bM!MڹIp M#' ī;괕23'jFfc`pZ.ˎ2c?Ee쩮 Uh'ћNf6Ő͂F"=@Đx9lJ:ڛ(/cK3{jC\1a-rYX@o nur yz!oka2"G(68zrYJ(H+j~jhthI{U гk誇P?pJ~(aQxyHFXYNYW:M4{Q:󰲜qi 8AXHutvr;)ySlE~|9)N -^P91~h*%G6Ee_ -TST2er8}ro oc=NHMoIRbe۸G s#:OR{@j iMK_z*˦ 8ʝ!f 38:8Cj% -n$:FbE95粔ly)\l+w3 -z=$d9\̮UO?LvIci58,i㌣qqBNAlxU9'#+ܧ=tma;%pPo2(pv8`z} -:=pL@&,ځz#TvQ߮[7/r=caICa9Me+1WTYjüHi)l s%ωÔ!HF`c9ߊz ,%]2DCpf*:_d1W"FJWrr0 [ЍHv72NݖxУCl4/+k"8>HEΏOM+߳\ :&Kr㭆9{,c&t<ԕZc*ԜF+3 -V<+C 5x:ha}W(h%H3&۪tz4⡅MaҀ qtƟ0eډBF쑡0B/$%ɻMZA.EYR1$(OzV,(ukľͤ?fΨ=Ѳy&gNImTv]{YEθu3 (`ώ;+vM{^0W_zXܣgis`j@GA6I%`3J>QId }sq]W$*)/@Iř^OcQCT'`^ʦ)})?¾,g/]I+g[k8i!B%XTᅠL8YnŸARXfEA⧤=/da47lPY_9ntq/fVL)Z=2"/!d! ]NZ#Ǎ1=9$ e-!rܶM+O _`^foNM8ϡtt}aR*.¢rL?JR2ޱv*MWc :ӲnfkV*.q-WN?elLޖ%}|&ԢZ`g^5N~ZT*rBh{ST%RIXIf2ܐ A9S}0zS$O]Jbܤ0DH6UHTԀdbN@eh8 V+қn.·oOĦSQr)MPzL)\$4Ac q˅_@ uFp@?@1pD,]emx+9/⛑cp}@( c-J~nNZ(عR+<aMECBlր$$GT&ˍ#ᤛn~2 -(/TPP7'R8r YzX!}4ЇgAȃrNl0&/ -I钰6](0Bo$#"e@j~A>d)/`:@J,Ax1#V8DdV"?k 43%B+#2r~\~_R6OĢ3y&@3"0Mfƴ?"y~twz;0e30|ލ_]n&,cɢ:~m -endstream -endobj - -4987 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 642.7554 114.800316 656.4174] - /Border [0 0 0] - /Dest (sec:preliminary) - /F 4 - /StructParent 270 - /Contents (Section 2) ->> -endobj - -4988 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [348.7979 581.3074 402.13605 594.9694] - /Border [0 0 0] - /Dest (subsec:effects) - /F 4 - /StructParent 271 - /Contents (Section 2.1) ->> -endobj - -4989 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [338.8493 553.9834 349.8493 567.6454] - /Border [0 0 0] - /Dest 4559 0 R - /F 4 - /StructParent 272 - /Contents (70) ->> -endobj - -4990 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [355.08704 553.9834 366.08704 567.6454] - /Border [0 0 0] - /Dest 4560 0 R - /F 4 - /StructParent 273 - /Contents (71) ->> -endobj - -4991 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [419.0758 526.6594 430.0758 540.3214] - /Border [0 0 0] - /Dest 4561 0 R - /F 4 - /StructParent 274 - /Contents (72) ->> -endobj - -4992 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [245.40627 342.2534 256.40625 355.9154] - /Border [0 0 0] - /Dest 4562 0 R - /F 4 - /StructParent 275 - /Contents (73) ->> -endobj - -4993 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [193.23015 219.29541 244.80914 232.9574] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 276 - /Contents (Section 3.1) ->> -endobj - -4994 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [395.6463 198.83337 406.6463 212.49542] - /Border [0 0 0] - /Dest 4563 0 R - /F 4 - /StructParent 277 - /Contents (74) ->> -endobj - -4995 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [360.2746 144.18542 371.2746 157.84741] - /Border [0 0 0] - /Dest 4564 0 R - /F 4 - /StructParent 278 - /Contents (75) ->> -endobj - -4996 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [378.12582 144.18542 389.12582 157.84741] - /Border [0 0 0] - /Dest 4565 0 R - /F 4 - /StructParent 279 - /Contents (76) ->> -endobj - -4997 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.57414 130.52338 86.57414 144.18542] - /Border [0 0 0] - /Dest 4566 0 R - /F 4 - /StructParent 280 - /Contents (77) ->> -endobj - -4998 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 281 - /Tabs /S - /Parent 1 0 R - /Contents 4999 0 R - /Annots [4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R 4997 0 R] ->> -endobj - -4999 0 obj -<< - /Length 5610 - /Filter /FlateDecode ->> -stream -x][d~_qfgMOjݥ8^o"! gR:$t.=/SUPEQ'䓫}s8?ۻ8|o~t~?޽]}i_}Wz;|׿_NvQ]"zll}lq%<>^*~w?H)>+M/Bӡ:bJmCzS;: *+6sSҝs85o-1*SMG_w7Zhٻ?s}c;= 8L{yv4|VDKqZY&EΎzԅ" C5|idZs$)cbˉ S駋8^X;95iuXKm.L$,Ũf*PB&ֲaײ|-)К*䒑w.Tzd4TjőyHEg62B];uS郍L\=_kV.[w`V楼N} )Օ X G:OG?imW ꩵ,X)N(3#^s8'`q81R7(oqJL3R;8lX?,DZYҹۤ[TmCSd:MQ,emNrS2i!1!/;ם6Mak+Wȱ/sNeN+ 8hT\|[m8ћ^l^S ri}P:YFzǾ}Y`Krf (Ϗ]o -&dS1>q|{`=CE83BJ&{$`Owxd 7*(?Q>0l u:+c܉Vjnf -l~]MYn8gBT6Ia? XFd3 Q;⹢yObNX)wY[8VG`#2gS`1"\ *B&T5D6fHЂΜGH$8瞞w.)q++獵mDZyst]۝ҙ6xxzE5Y5cYG-εHn)FBw:Ӿ5(?1Jxg_#ey+Uf5_Tzؘ(W~WD!7""5Bq0~aGդz2T|Y 6Aл-QJכ^&cV򒶕ڷ'hƳ,/o[#vĵA reֽ=102@su Y C>4ȑrgfQժu9:ufCjSTj:g N/"AZ>8m7u/|\ f1uT^()KbS_P? Xe{")df۸5 ++5\wQ vvOF>MHg@E\[*+ѬYm7uⰪ2~]֓t4٘:wXcEf.,- ^',k~TF:^y! -B[F^[܈:NEp!QK*IX*mW7(0vh츮$C`LHV~?әmfl ˚N`998V;mA8 -+T_ -fXuu(pf(D3A->1d!@IGVf3AW)v5=4GaC5-1 -߯hwEwzG3a -%Q Ii`J@&[`MԕֈԑQ!Jf1vlo-JX!,M!GidOPBm؛{68!* 5fhs![a|z.LKwj|ya~/PђT0]q:fS6C H{>5FĚ`J+a/ [l)ʨfy0ExI*̷Q6 -^JI8\ -0(=<WbC_wDV̩[b1䈑ڪPc3dq&692j -n DmXg V-ғ׶p:Rkjlzۛ7A {L3+L DQMIoB @VPtSM4qZބqh귄Ln\fGz 72ZѪXPק໡\1Է%ON lbj2< U3M-Z64D!%EpFI3Mv16n0](U BC˸K59vΕ. g|'&82zpSY(;Jѯ`OvF?sY'l0^B"Pf)2jPԨ'N *J5m^"-: -GڄH+l=s* <:!3m$N 6 W(oؓ\˩bJm$Erl$imLl9$ Q[.SOT0E8GA 4$m$㱐?%M"s E$/xۣS+$& -H8"VG-^2r5r*,j_7`FF&4iZtC|62@7Ln*el@5`?s(h!0 1Qp)gA]C$= 5 +e@jN< N2`ZK<+ ;@nIqֿ`=E[:C`x{eCZE׀0`j`C:* Rhe]*w ^g'0>`Ԍ RJr'IiFrjf.9* -Vz֋qm5>pPȴn^ 9v(1]PfJ{mO -L*ۋii{ı~cϩ8uF%NzE;.e_[E0+j5gA+#Ae \ :̴mmY#(KKѐ5텷֪5>̕eP2<`OJrm+6M@0q0Tíi5+'d4.-Y#Ɬ@}_w>g4 q_U1F٣GP붋Zq tRyDEߊySX;Z$wl-.m$vMM۬2:p!/f,d_k-^,=_[B,·[1 7B!SH&'֊(Md;>6r@wXS3C%O2Q))kk6b/(%ysp[v:o0x5v5-"фzjr4 H;f2,t ߀臄f+o * (p}-M@@ѭR¸Ϫh*z;\e5<8B:«L_8a -ǜW'KI(TY'L[&˜aUtc, 6RT BENR KMA -< B[:@[Y,P`8ysQ754 mwN1 )AxoFv'#\o{mSZӶ<~O򫯤|ŧcmo ޷sZpƮ5Hbx /d֙/ʻluZi*TqdT-'='j'\zOC5)[?D4-!z%t[ Y'MY*c%i*Ľ}!Xb5Gs(..E+]=Gff\ENP*^l;9вg4 34@zaa2_5J"56~$Ekk+8%kxu675v7}.}Mj2KxS - R ]bC#!hB+XNJbPXv  -ѕԖAsZ[kV&g6W儲Yrf 8kUrQeA,9]/t!;03hHюۊkQ)yN.ϯ uYe
- {open && ( -
+
+ {open && anchor !== undefined && ( +
{t('panel.title')}
@@ -458,7 +486,7 @@ export function CordisPanel({ aria-expanded={open} onClick={() => { setOpen(value => !value) }} > - + {wide && ( <> {t('panel.trigger')} From f0a875e8e9dfa68f2fcf0eb151450e51d9d30684 Mon Sep 17 00:00:00 2001 From: pku-xht Date: Thu, 13 Aug 2026 19:38:19 +0800 Subject: [PATCH 083/103] docs(subagent): clarify preset tool row references --- packages/subagent/subagent-claude-code/README.i18n.yaml | 4 ++-- packages/subagent/subagent-claude-code/README.md | 2 +- packages/subagent/subagent-claude-code/README.zh.md | 2 +- packages/subagent/subagent-codex/README.i18n.yaml | 4 ++-- packages/subagent/subagent-codex/README.md | 2 +- packages/subagent/subagent-codex/README.zh.md | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/subagent/subagent-claude-code/README.i18n.yaml b/packages/subagent/subagent-claude-code/README.i18n.yaml index 08f4300d94..a165540575 100644 --- a/packages/subagent/subagent-claude-code/README.i18n.yaml +++ b/packages/subagent/subagent-claude-code/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-claude-code/README.md -README.md: 123d84a11dc0457472d742488eba72588e668152 -README.zh.md: 2fe9cfb78a52cc98077be8931daddc1f869fc310 +README.md: 1a0d6e32b8610769dcc5d8342a4fe88d0c884085 +README.zh.md: 78dab14e5eaddc06ccd07b69dc952a09380e0428 diff --git a/packages/subagent/subagent-claude-code/README.md b/packages/subagent/subagent-claude-code/README.md index 123d84a11d..1a0d6e32b8 100644 --- a/packages/subagent/subagent-claude-code/README.md +++ b/packages/subagent/subagent-claude-code/README.md @@ -31,7 +31,7 @@ The provider advertises no optional start-time capabilities and reports `inherit Production resolves `claude` from the subprocess execution world's credential-scrubbed `PATH`, with explicit `env` entries applied, and passes the resulting path to the SDK as `pathToClaudeCodeExecutable`. On Windows, a resolved `.cmd` or `.bat` path is carried as a quoted, per-spawn environment value that `cmd.exe /v:off` expands once, so valid path metacharacters remain data. The pinned SDK's fixed flags then occupy cmd's command tail and contain no cmd metacharacters; they are not ordinary Windows argv. Native settings and authentication remain authoritative. The plugin does not install another CLI, select a model, create a product home, log in, or probe an account. Credential-shaped ambient variables are removed before the explicit `env` overlay is applied, so an API key or token intended for the child must be supplied there. Non-credential endpoint variables such as `ANTHROPIC_BASE_URL`, along with ordinary ambient values such as `PATH` and `HOME`, remain inherited unless overridden. -Production `dsh` does not install or mount this optional provider. A Profile that opts in must install `@deepseek-ai/dsh-subagent-claude-code` and mount it once on the host plane; loading the provider starts no Claude process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_claude_code` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. The base host and full presets already provide the generic Job registry and controls. +Production `dsh` does not install or mount this optional provider. A Profile that opts in must install `@deepseek-ai/dsh-subagent-claude-code` and mount it once on the host plane; loading the provider starts no Claude process until a tool call. Full Agent Presets carry a matching product tool row with `disabled: true`; copy a preset and remove that field to expose `subagent_claude_code` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. The base host and full presets already provide the generic Job registry and controls. The standalone composition below shows the complete explicit capability. A Profile based on `@deepseek-ai/dsh-base` keeps its existing Job rows, adds the product provider row, and enables the preset tool row instead of mounting duplicate Job services. diff --git a/packages/subagent/subagent-claude-code/README.zh.md b/packages/subagent/subagent-claude-code/README.zh.md index 2fe9cfb78a..78dab14e5e 100644 --- a/packages/subagent/subagent-claude-code/README.zh.md +++ b/packages/subagent/subagent-claude-code/README.zh.md @@ -31,7 +31,7 @@ SDK 接收由文本块原样拼接成的任务。提供方会完整迭代 SDK 生产环境从子进程执行世界清除凭证后的 `PATH` 解析 `claude`,再应用显式 `env` 条目,并把所得路径作为 `pathToClaudeCodeExecutable` 交给 SDK。在 Windows 上,解析到的 `.cmd` 或 `.bat` 路径会作为带引号、仅供本次 spawn 使用的环境值交给 `cmd.exe /v:off` 展开一次,因此合法路径中的元字符仍只是数据。锁定版本的 SDK 随后把固定命令行选项放在 cmd 的命令尾部;这些选项不含 cmd 元字符,也并不是普通的 Windows argv。原生设置与身份验证继续是权威来源。本插件不安装另一份 CLI、不选择模型、不创建产品主目录、不执行登录,也不探测账户。具有凭证特征的环境变量会在显式 `env` 覆盖生效前被清除,因此供子进程使用的 API 密钥或 token 必须在该配置中显式提供。除非被覆盖,`ANTHROPIC_BASE_URL` 等非凭证端点变量以及 `PATH` 和 `HOME` 等普通环境变量仍会被继承。 -生产 `dsh` 不会安装或挂载这个可选提供方。选择启用它的 Profile 必须安装 `@deepseek-ai/dsh-subagent-claude-code`,并在 host plane(宿主平面)挂载一次;加载提供方本身不会在工具调用前启动 Claude 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_claude_code`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。base host(基础宿主)与完整 preset 已提供通用作业注册表和控制工具。 +生产 `dsh` 不会安装或挂载这个可选提供方。选择启用它的 Profile 必须安装 `@deepseek-ai/dsh-subagent-claude-code`,并在 host plane(宿主平面)挂载一次;加载提供方本身不会在工具调用前启动 Claude 进程。完整 Agent Preset 携带对应的产品工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_claude_code`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。base host(基础宿主)与完整 preset 已提供通用作业注册表和控制工具。 下列独立组装展示完整的显式能力。基于 `@deepseek-ai/dsh-base` 的 Profile 保留已有 Job 行,只新增产品提供方行并启用 preset 工具行,禁止重复挂载 Job 服务。 diff --git a/packages/subagent/subagent-codex/README.i18n.yaml b/packages/subagent/subagent-codex/README.i18n.yaml index c9b162e79a..da14b8ff30 100644 --- a/packages/subagent/subagent-codex/README.i18n.yaml +++ b/packages/subagent/subagent-codex/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/subagent/subagent-codex/README.md -README.md: 2ea06a57fc9da80cdb2dd5edc4cf7107ab50dd73 -README.zh.md: a79bd08872ad14c9b847c77e608c2b47fb54c8bf +README.md: 848d170585710b682fa4ce331010fce7080de673 +README.zh.md: 34e9105e6a78bc16f16997c7df89d4f6412eb50c diff --git a/packages/subagent/subagent-codex/README.md b/packages/subagent/subagent-codex/README.md index 2ea06a57fc..848d170585 100644 --- a/packages/subagent/subagent-codex/README.md +++ b/packages/subagent/subagent-codex/README.md @@ -27,7 +27,7 @@ The provider advertises no optional start-time capabilities and reports `inherit Production resolves `codex` from `PATH` and uses the host's native Codex configuration and authentication. The plugin does not install Codex, select a model, create `CODEX_HOME`, log in, or probe a version. Credential-shaped ambient variables are removed by the subprocess seam, so an API key intended for the child must be supplied explicitly in `env`; ordinary ambient values such as `PATH` and `HOME` remain available unless overridden. -Production `dsh` does not install or mount this optional provider. A Profile that opts in must install `@deepseek-ai/dsh-subagent-codex` and mount it once on the host plane; loading the provider starts no Codex process until a tool call. Full Agent Presets carry the tool row below with `disabled: true`; copy a preset and remove that field to expose `subagent_codex` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. The base host and full presets already provide the generic Job registry and controls. +Production `dsh` does not install or mount this optional provider. A Profile that opts in must install `@deepseek-ai/dsh-subagent-codex` and mount it once on the host plane; loading the provider starts no Codex process until a tool call. Full Agent Presets carry a matching product tool row with `disabled: true`; copy a preset and remove that field to expose `subagent_codex` only to agents composed from the copy. Its `one-shot` policy keeps omitted or `false` `run_in_background` calls in the foreground, while explicit `true` returns a parent-owned Job id for `job_output` or `job_kill`. The base host and full presets already provide the generic Job registry and controls. The standalone composition below shows the complete explicit capability. A Profile based on `@deepseek-ai/dsh-base` keeps its existing Job rows, adds the product provider row, and enables the preset tool row instead of mounting duplicate Job services. diff --git a/packages/subagent/subagent-codex/README.zh.md b/packages/subagent/subagent-codex/README.zh.md index a79bd08872..34e9105e6a 100644 --- a/packages/subagent/subagent-codex/README.zh.md +++ b/packages/subagent/subagent-codex/README.zh.md @@ -27,7 +27,7 @@ 生产环境会从 `PATH` 中解析 `codex`,并使用宿主机原生的 Codex 配置与身份验证。本插件不安装 Codex、不选择模型、不创建 `CODEX_HOME`、不执行登录,也不探测版本。子进程 seam 会移除具有凭证特征的环境变量,因此供子进程使用的 API 密钥必须在 `env` 中显式提供;除非被覆盖,`PATH` 和 `HOME` 等普通环境变量值仍然可用。 -生产 `dsh` 不会安装或挂载这个可选提供方。选择启用它的 Profile 必须安装 `@deepseek-ai/dsh-subagent-codex`,并在 host plane(宿主平面)挂载一次;加载提供方本身不会在工具调用前启动 Codex 进程。完整 Agent Preset 携带下列工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_codex`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。base host(基础宿主)与完整 preset 已提供通用作业注册表和控制工具。 +生产 `dsh` 不会安装或挂载这个可选提供方。选择启用它的 Profile 必须安装 `@deepseek-ai/dsh-subagent-codex`,并在 host plane(宿主平面)挂载一次;加载提供方本身不会在工具调用前启动 Codex 进程。完整 Agent Preset 携带对应的产品工具行并设置 `disabled: true`;复制一个 preset 后删除该字段,即可只向由该副本组装的 agent 暴露 `subagent_codex`。其 `one-shot` 策略会让省略 `run_in_background` 或传入 `false` 的调用继续在前台等待,而显式传入 `true` 会返回由父 agent 拥有的 Job ID,供 `job_output` 或 `job_kill` 使用。base host(基础宿主)与完整 preset 已提供通用作业注册表和控制工具。 下列独立组装展示完整的显式能力。基于 `@deepseek-ai/dsh-base` 的 Profile 保留已有 Job 行,只新增产品提供方行并启用 preset 工具行,禁止重复挂载 Job 服务。 From b5deda1f05044edd4dfec53c862bbe16e154508a Mon Sep 17 00:00:00 2001 From: Yif <877193178@qq.com> Date: Thu, 13 Aug 2026 19:39:10 +0800 Subject: [PATCH 084/103] refactor(client): share the outside-pointer dismissal hook The jobs list and the Cordis panel carried identical outside-pointerdown close effects, which the duplication gate rejects; both now use useDismissOnOutsidePointer from ui-primitives. Refs #2526 --- .../ui-jobs/src/client/JobListAction.tsx | 13 ++------- packages/client/ui-primitives/src/index.ts | 1 + .../src/useDismissOnOutsidePointer.ts | 29 +++++++++++++++++++ .../ui-cordis/src/client/CordisPanel.tsx | 13 ++------- 4 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts diff --git a/packages/client/ui-jobs/src/client/JobListAction.tsx b/packages/client/ui-jobs/src/client/JobListAction.tsx index b4cd08c56d..8834abf82b 100644 --- a/packages/client/ui-jobs/src/client/JobListAction.tsx +++ b/packages/client/ui-jobs/src/client/JobListAction.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react' import type { JobView } from '@deepseek-ai/dsh-client-runtime/client' -import { IconChevronDownOutline14, StateDot, type StateDotState } from '@deepseek-ai/dsh-client-ui-primitives' +import { IconChevronDownOutline14, StateDot, useDismissOnOutsidePointer, type StateDotState } from '@deepseek-ai/dsh-client-ui-primitives' import type { PropsLocale, PropsRuntime, TranslateNS } from '@deepseek-ai/dsh-client-ui-slots' import { NS } from './locales.ts' import type {} from '@deepseek-ai/dsh-client-ui-conversation/client' @@ -101,16 +101,7 @@ export function JobListAction({ sessionId, useSessions, t }: JobListActionProps) const rows = useMemo(() => ordered(jobs), [jobs]) const liveCount = useMemo(() => jobs.filter(isLive).length, [jobs]) - useEffect(() => { - if (!open) return - const closeOutside = (event: PointerEvent): void => { - if (event.target instanceof Node && !rootRef.current?.contains(event.target)) { - setOpen(false) - } - } - document.addEventListener('pointerdown', closeOutside) - return () => { document.removeEventListener('pointerdown', closeOutside) } - }, [open]) + useDismissOnOutsidePointer(rootRef, open, setOpen) // The clock only runs while an open list is showing something that moves. useEffect(() => { diff --git a/packages/client/ui-primitives/src/index.ts b/packages/client/ui-primitives/src/index.ts index 05baf26f8d..1e8c3e576d 100644 --- a/packages/client/ui-primitives/src/index.ts +++ b/packages/client/ui-primitives/src/index.ts @@ -13,6 +13,7 @@ export { Input } from './Input.tsx' export { Menu } from './Menu.tsx' export type { MenuEntry, MenuItem, MenuSeparator, MenuLabel } from './Menu.tsx' export { useAnchoredMaxHeight } from './useAnchoredMaxHeight.ts' +export { useDismissOnOutsidePointer } from './useDismissOnOutsidePointer.ts' export { HoverCard } from './HoverCard.tsx' export { Modal } from './Modal.tsx' export { OnboardingSurface } from './OnboardingSurface.tsx' diff --git a/packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts b/packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts new file mode 100644 index 0000000000..3706d13bfc --- /dev/null +++ b/packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts @@ -0,0 +1,29 @@ +/** + * Outside-pointer dismissal for trigger-owned popovers (jobs list, Cordis + * panel): while the surface is open, a pointerdown outside the root closes it. + */ +import { useEffect } from 'react' +import type { RefObject } from 'react' + +/** + * Close an open popover when a pointerdown lands outside its root element. + * @param root - element containing both the trigger and the open surface. + * @param open - whether the surface is showing; false detaches the listener. + * @param setOpen - state setter invoked with false on an outside pointerdown. + */ +export function useDismissOnOutsidePointer( + root: RefObject, + open: boolean, + setOpen: (open: boolean) => void, +): void { + useEffect(() => { + if (!open) return + const closeOutside = (event: PointerEvent): void => { + if (event.target instanceof Node && !root.current?.contains(event.target)) { + setOpen(false) + } + } + document.addEventListener('pointerdown', closeOutside) + return () => { document.removeEventListener('pointerdown', closeOutside) } + }, [root, open, setOpen]) +} diff --git a/packages/extensions/ui-cordis/src/client/CordisPanel.tsx b/packages/extensions/ui-cordis/src/client/CordisPanel.tsx index 42f1586dae..4e96d15c94 100644 --- a/packages/extensions/ui-cordis/src/client/CordisPanel.tsx +++ b/packages/extensions/ui-cordis/src/client/CordisPanel.tsx @@ -4,7 +4,7 @@ import { useEffect, useLayoutEffect, useRef, useState } from 'react' import type { ButtonHTMLAttributes, ReactNode } from 'react' import { IconCheckOutline16, IconCloseOutline16, IconCordisPluginOutline14, IconPlayOutline16, - IconStopFill16, IconTrashOutline16, Tooltip, + IconStopFill16, IconTrashOutline16, Tooltip, useDismissOnOutsidePointer, } from '@deepseek-ai/dsh-client-ui-primitives' import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' import type {} from '@deepseek-ai/dsh-client-ui-sidebar/client' @@ -137,16 +137,7 @@ export function CordisPanel({ return () => { window.removeEventListener('resize', place) } }, [open]) - useEffect(() => { - if (!open) return - const closeOutside = (event: PointerEvent): void => { - if (event.target instanceof Node && !rootRef.current?.contains(event.target)) { - setOpen(false) - } - } - document.addEventListener('pointerdown', closeOutside) - return () => { document.removeEventListener('pointerdown', closeOutside) } - }, [open]) + useDismissOnOutsidePointer(rootRef, open, setOpen) useEffect(() => { const now = new Set() From c91cfc3ec2e8424bcb73c23a958490b4583051b7 Mon Sep 17 00:00:00 2001 From: imccyu Date: Thu, 13 Aug 2026 19:44:14 +0800 Subject: [PATCH 085/103] fix: SessionPersistenceCorruptionError --- packages/session-query/session-query/src/corpus.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/session-query/session-query/src/corpus.ts b/packages/session-query/session-query/src/corpus.ts index 717b2b5190..05b4292127 100644 --- a/packages/session-query/session-query/src/corpus.ts +++ b/packages/session-query/session-query/src/corpus.ts @@ -2,7 +2,8 @@ import type { Context, Fiber } from '@deepseek-ai/cordis' import type { Session, SessionEvent, SessionHeader, SessionId } from '@deepseek-ai/dsh-session' -import SessionPersistence, { SessionPersistenceCorruptionError } from '@deepseek-ai/dsh-session-persistence' +import type SessionPersistence from '@deepseek-ai/dsh-session-persistence' +import type { SessionPersistenceCorruptionError } from '@deepseek-ai/dsh-session-persistence' import type { SessionRecord } from './types.ts' import { SessionQueryError } from './config.ts' import { assertSessionHeadersCompatible } from './sources.ts' @@ -274,7 +275,7 @@ async function inspectPersisted( return await persistence.inspect(sessionId, signal) } catch (error: unknown) { if (signal?.aborted) signal.throwIfAborted() - if (error instanceof SessionPersistenceCorruptionError) { + if ((error as SessionPersistenceCorruptionError).name === 'SessionPersistenceCorruptionError') { throw new SessionQueryError( `stored session "${sessionId}" is corrupt: ${errorMessage(error)}`, 'SESSION_QUERY_CORRUPT_SESSION', From c1d26018a4da5c4902eb1f82c51131f0c2e5f1e7 Mon Sep 17 00:00:00 2001 From: imccyu Date: Thu, 13 Aug 2026 19:49:27 +0800 Subject: [PATCH 086/103] fix: lint --- packages/session-query/session-query/src/corpus.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/session-query/session-query/src/corpus.ts b/packages/session-query/session-query/src/corpus.ts index 05b4292127..69fbc8a1a9 100644 --- a/packages/session-query/session-query/src/corpus.ts +++ b/packages/session-query/session-query/src/corpus.ts @@ -3,7 +3,6 @@ import type { Context, Fiber } from '@deepseek-ai/cordis' import type { Session, SessionEvent, SessionHeader, SessionId } from '@deepseek-ai/dsh-session' import type SessionPersistence from '@deepseek-ai/dsh-session-persistence' -import type { SessionPersistenceCorruptionError } from '@deepseek-ai/dsh-session-persistence' import type { SessionRecord } from './types.ts' import { SessionQueryError } from './config.ts' import { assertSessionHeadersCompatible } from './sources.ts' @@ -275,7 +274,7 @@ async function inspectPersisted( return await persistence.inspect(sessionId, signal) } catch (error: unknown) { if (signal?.aborted) signal.throwIfAborted() - if ((error as SessionPersistenceCorruptionError).name === 'SessionPersistenceCorruptionError') { + if (error instanceof Error && error.name === 'SessionPersistenceCorruptionError') { throw new SessionQueryError( `stored session "${sessionId}" is corrupt: ${errorMessage(error)}`, 'SESSION_QUERY_CORRUPT_SESSION', From 15148dbd9a1d1f1ef1a26e5749b32af0cd663935 Mon Sep 17 00:00:00 2001 From: imccyu Date: Thu, 13 Aug 2026 19:52:05 +0800 Subject: [PATCH 087/103] release(dsh): 0.1.0-rc.6 --- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package.json | 2 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- packages/attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- packages/client/ui-directory-picker-browse/package.json | 2 +- packages/client/ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- packages/client/ui-message-feedback/package.json | 2 +- packages/client/ui-model-selection/package.json | 2 +- packages/client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- packages/client/ui-settings-general/package.json | 2 +- packages/client/ui-settings-models/package.json | 2 +- packages/client/ui-settings-plugin-inventory/package.json | 2 +- packages/client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- packages/client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- packages/code-runtime/code-runtime-worker-thread/package.json | 2 +- packages/code-runtime/code-runtime/package.json | 2 +- packages/compaction/command-compact/package.json | 2 +- packages/compaction/compaction-basic/package.json | 2 +- packages/compaction/compaction-tool-result-pruner/package.json | 2 +- packages/compaction/compaction/package.json | 2 +- packages/context/agent-instructions/package.json | 2 +- packages/context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- packages/core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- packages/core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- packages/credentials/credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- packages/examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- packages/extensions/cordis-client-runner/package.json | 2 +- packages/extensions/cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- packages/feedback/command-feedback/package.json | 2 +- packages/feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- packages/fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- packages/fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- packages/guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- packages/host/directory-picker-auto/package.json | 2 +- packages/host/directory-picker-browse/package.json | 2 +- packages/host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- packages/identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- packages/interaction/permission-presets/package.json | 2 +- packages/interaction/tool-ask-user/package.json | 2 +- packages/interaction/user-approval/package.json | 2 +- packages/interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- packages/runtime-diagnostics/invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- packages/sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- packages/session-query/session-log-export/package.json | 2 +- packages/session-query/session-query-sqlite/package.json | 2 +- packages/session-query/session-query/package.json | 2 +- packages/session-query/tool-session-query/package.json | 2 +- packages/session/session-checkpoint-policy/package.json | 2 +- packages/session/session-persistence-jsonl/package.json | 2 +- packages/session/session-persistence-sqlite/package.json | 2 +- packages/session/session-persistence/package.json | 2 +- packages/session/session-projection-cache/package.json | 2 +- packages/session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- packages/session/session-telemetry-otel/package.json | 2 +- packages/session/session-telemetry/package.json | 2 +- packages/session/session-title-all-prompts-llm/package.json | 2 +- packages/session/session-title-first-prompt-llm/package.json | 2 +- packages/session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- packages/shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- packages/subagent/subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- packages/subagent/subagent-dsh-sdk/package.json | 2 +- packages/subagent/subagent-fork-in-process/package.json | 2 +- packages/subagent/subagent-in-process-driver/package.json | 2 +- packages/subagent/subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- packages/subagent/tool-subagent-control/package.json | 2 +- packages/subagent/tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- packages/subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- packages/test-support/acp-snapshot/package.json | 2 +- packages/test-support/agent-loop-testkit/package.json | 2 +- packages/test-support/client-runtime/package.json | 2 +- packages/test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- packages/test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- packages/web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- packages/workflow/workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- 222 files changed, 222 insertions(+), 222 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index fdd4740b3c..a5f7913c2f 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/apps/web/package.json b/apps/web/package.json index 830cc355cb..fc990f684c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/package.json b/package.json index 81cedbbb42..1fd63bae9a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "license": "MIT", "private": true, "type": "module", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index f60beda285..d5f08d2028 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index e4588cd1a5..9d128595d8 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index 42a7d14070..edc6d65704 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly and Host Agent/Session lookup policy", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index 9b20bc9906..844479fc40 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index e9a3a20a59..3f11676e71 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index edc7e05b01..c602dc9399 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index d591304af1..a91d6b8cd2 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 706ee3202a..9351c491a9 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 20aba2780a..886fdc593e 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index ca4709a2a9..13ca525731 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index b5056de3e8..00d4e6da21 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index 5224f69cbe..f1ab0c4044 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 68162768da..0184f72d18 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index 5083799d2f..dd45276a7a 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index adde82d0a1..1da3ac6428 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-runtime", "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index 83db55d0a4..e8e3a0228a 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-schema-form", "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index 05dd7841f4..f705158d1e 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 274ca6d8ef..c257166e2a 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index ef8f5807af..cf80e20f3f 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 04f7d633f2..2fc12605c1 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index f7b20a8a11..ac7f264f62 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Produced-files turn tail and clickable final-response file references for Web", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index 04ec43ce8b..0cc14700fc 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 1de41a34de..74b8e7845b 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index 73974fe414..6076aab741 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index 52999c2c0e..a4ca2afe84 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index f5fc5f7dab..a59d064dda 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list: live registry state mirrored from session/jobs frames", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index 4d488d78b8..d3ab329297 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 76a33892f9..481d02aa03 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 1c1da45e9f..298fd8b133 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection: the /model popupSelect over session.models / session.selectModel", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 949ec37e92..62f03cbd07 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 41bd833a18..233a8a72fe 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index b6870a6353..b6e01b4f5a 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index b21eea4944..c5207dfc9d 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index e6edb56fc1..423755475c 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 3fbd5c2ea2..95af8a15fa 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index aec7abc069..a9fd7b8e9d 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index e97d297c00..485092d2b9 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index ff0601331b..cfda6d55fc 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index 41c03f8b01..b2026095f2 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index a31091aeae..351daf442b 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index d748ce54dd..0e0b7aadae 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 792c2de2e9..6f320cd92f 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 04ba9ee671..80bc4f2586 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index ccac2b0860..375053ba7c 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index e1cc90e28b..95fb02b0f3 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-user-questions", "description": "Web ask_user_question feature: host tool mount plus composer-takeover question UI", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index d5359d46a4..e5b71cf942 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workflow-run", "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index 335bd22797..b6a711b873 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workspace", "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index 89f4ceb021..75bf6877ad 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web-react", "description": "Shell-side React glue: createSlotRenderer, SessionProvider, bindSnapshotSelector (uSES bridge), useInvoke", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/client/web/package.json b/packages/client/web/package.json index ded9257be0..9e4e9481e0 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web", "description": "Web shell kernel: bootWebShell (module system holding + seed table + two-stage boot + AppRoot gate + app-shell assembly entry), consumed by the apps/web vite entry", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index 84bf579b24..d5223dba99 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime-worker-thread", "description": "Worker-thread implementation of the DeepSeek Harness code-execution seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index 51f4e126f0..fafd5ae387 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime", "description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index 16611fcb9b..8255fdf8f7 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-compact", "description": "Human-facing slash command for explicit session compaction", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 5af4d6ddbf..8c77c3ae0f 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-basic", "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index 997666dab6..95cf293f17 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-tool-result-pruner", "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index 982b333fc4..af29cf7cf9 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction", "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index 6fb1f33eaf..8d5368da29 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-instructions", "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index dea094f057..8d3e0ec487 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-reference", "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 40893e119d..d603c28c23 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-time-context", "description": "Opt-in durable per-step context with the current time and elapsed time", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 6caf938eff..a52753965a 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tmux-context", "description": "Opt-in durable per-step context with this agent's tmux pane and window location", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index 3ae412c342..713fdda02d 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-default-model", "description": "Default model selection shared by Agent entry points", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index 5517fd2159..64e9f4c5ef 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop", "description": "The concrete agent loop plugin for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index ff4e8920ab..db3aea959d 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-tool-presentation", "description": "Agent-plane presentation selector: composes one agent's tools as Code Mode, native, or both", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index 13abdcd5f7..9940ba4eb9 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent", "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index b972a560b5..c08d5feb57 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-scope", "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/session/package.json b/packages/core/session/package.json index bb8f24a70e..cb6d44d59b 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session", "description": "Event-sourced session store for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index d104c30742..5bf096b478 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-system-prompt", "description": "System prompt assembly registry for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index 91400a3e75..ba3b3a8a7c 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tools", "description": "Tool registry and execution pipeline for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index e77e5e2416..8a9f9248e1 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials-local", "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index fb7450985f..02011bf876 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials", "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index 53e00da0fd..7af9fc15f0 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-e2b", "description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index e9b7faa46a..bcfad85d39 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-e2b", "description": "E2B filesystem implementation for DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index 1116249ba3..c63a05ccf9 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-e2b", "description": "E2B subprocess implementation for DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index f42acbd2f0..ba1c541973 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-demo", "description": "ACP automation server app: agent spine + JSONL persistence + ACP transport, with a JSON-RPC stdio bin", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index 75af09b242..193258b7a6 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-spine-demo", "description": "The default executor-less/UI-less agent spine with fallback session titles, provider-routed retry, and optional persisted goals", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index 4dbcef5660..761e22159a 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-demo", "description": "Bin that boots an external Cordis config for the stdio JSON-RPC SDK runtime", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index c34402c9d6..74f7970bbc 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-client-runner", "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 1d6afc5113..8c558bee1d 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-host-runner", "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index 66f6d70ff0..f98404a113 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-cordis", "description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index c7e73b0cfc..cacd075a58 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-cordis", "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index f662d34a0b..0d587392a7 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-feedback", "description": "Log-only session feedback producer and human-facing slash command", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index 64d5180fb7..d7f2ea911f 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-message-feedback", "description": "Lifecycle-bound per-message rating and note sidecar for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index 40bdf26d82..647a74a123 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-local", "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index a23fa86cb6..f7a5db5af1 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-observation-policy", "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 0bab7bf7cd..3b301a50b6 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-sandbox", "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index f597838622..9a8008262a 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs", "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index 0ff873ea8c..ba306fa020 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs-search", "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index de5171cae7..2f7c26b6da 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs", "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index 8325bdbf6a..3de08fa940 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-str-replace-editor", "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index e4455295ba..8cb103c4c2 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-goal", "description": "Human-facing slash command for persisted same-session goals", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index 49567951cd..ccbc49b6ed 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal-round-driver", "description": "Race-fenced same-session goal-round driver", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index 0bd113350b..e2cc73214b 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal", "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index 0a79357935..eaefde65b4 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-goal", "description": "Model-facing same-session goal tools with execution-time authority checks", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 06c8475477..697a0e0078 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-repeat-tool-reminder", "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index 17994af840..46557d200c 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-call-timeout-policy", "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 86f9b9b3be..82f46da1ce 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index 30b054c9b3..1966226c8b 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 66945a0f65..503a1afdbc 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index ba83efedb5..e822fd5fe4 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-apiproxy", "description": "API gateway: the ApiProxy contract (api/), the fetch carrier pair (fetch/), and the host-side gateway plugin providing ctx.apiProxy", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index cf4c769d1a..3724d97578 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-auto", "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index a5aac7733a..252c010126 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-browse", "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index ef81234169..664e1466ce 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-native", "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index 3d855f813a..b54b0cab66 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker", "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 129c961913..2c62c310d0 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-frontend-static", "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving the built frontend with index-tap injection, traversal rejection, and SPA index fallback", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 0f020b372c..5887a6f70c 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-plugin-inventory", "description": "Read-only Remote projection of current Cordis Loader plugin state", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index eb9563a37d..ad624f8c2a 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-webserver", "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index 506a3d7f05..d3621f4deb 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-anonymous-user-id", "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 61fabbf14c..59322d8de9 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-commands", "description": "Plugin-owned human command registry for DeepSeek Harness UIs", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index 410eb22b93..42d2f08aff 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-permission-presets", "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index e70068346b..673ddc9625 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ask-user", "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index d343f3045a..9f9d13f051 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-approval", "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index be1068b35e..f2dd1ac8c6 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-questions", "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 04b352c633..6b4c6fb474 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs-local", "description": "Process-local implementation of the DeepSeek Harness background job registry seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index 36f2fcf0f2..237b3cbfa9 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs", "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index b5d52245ab..808185e12f 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-jobs", "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index cbd0365c38..218f744d61 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-deepseek", "description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 118eb4632d..59d38779c0 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-pi-ai", "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index c5c004b36f..c439843e18 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-retry", "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index c33f115a6b..7fd91eb819 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm", "description": "Provider-neutral LLM service interface for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index daecda3e72..cd51129cab 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-token-meter", "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index aa7e36b30b..b968692931 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp-stdio", "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index d3640349af..3fd076ae18 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp", "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index bd09e385ef..008014844f 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-lsp", "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index d3f8faabb4..3730838ae5 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-client", "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index fe28de8ba6..60369141fb 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plan-mode", "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index 728645d3d2..60c818de78 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-presets", "description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index b59a66f409..dc06a859d3 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-persona", "description": "Composition-authored deployment persona section for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index 5ff3b8e873..67f00d14fc 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-invariants", "description": "Registry service for package-owned DeepSeek Harness runtime invariants", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index 7389cfeed0..17c5f3ba4c 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-local", "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index 9c8f262cca..ef1d57be97 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-policy", "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index 7c2b945ae1..447d43e511 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-windows-acl", "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index 4da48c01e6..dc09171354 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox", "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index a54468001f..9d47982958 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-schedule", "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index f45ba5d7b1..f53672fe8b 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-client", "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index 36922c34d2..855c44d9c6 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-protocol", "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index e5c1639800..b2f95436a8 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-server", "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index 1d9532bda1..b84dede798 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, "repository": { "type": "git", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index f60ef209bf..4fcfe04863 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query-sqlite", "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index 29f375c053..6e0e97b532 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query", "description": "Combined session query service contract with concrete reads, traces, and filters", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index ee2e6ecd1a..e5338ac52c 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-session-query", "description": "Workspace-authorized model-facing session history search, trace, and event read tools", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index 52eeda76e3..a41739103f 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-checkpoint-policy", "description": "Semantic session durability checkpoints before model requests and tool side effects", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index f19c1d7ec3..e4e9b575a6 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-jsonl", "description": "JSONL durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index 23a2e43a69..dd8c71d3eb 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-sqlite", "description": "SQLite durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index 1ff1d185b6..3916e0b5e4 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence", "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index bc35f858e0..bf86685372 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection-cache", "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session projection checkpoints over the domain data form, throttled write-behind, and the cold-read ladder (cache row + persistence tail replay)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index 19f3391aec..bb83ee2b28 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection", "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index 6f97337bed..43b2a55c2f 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-stats", "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 96889660f1..2734cea997 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry-otel", "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index a0c93b0263..7136878fc7 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry", "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 2ad7d2cdc8..6d95d95687 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 189107520c..4e7ee22703 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-first-prompt-llm", "description": "First-message LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index 074545874d..59f410535b 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-llm", "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index 9c9ba29113..cc5d4f135d 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title", "description": "Log-backed session title service and provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index 85b912e495..3d19880d0a 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings-file", "description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 936b5b3ddc..b4c25a9290 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings", "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index 3c66b15851..e0a1828d6b 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-local", "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index d1497aedd1..80b193d9f9 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index b48873f248..59ac15ac16 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-local", "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index c8d025c2a2..9a8e012614 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index 9da8ed0a72..dd115709ea 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell-env", "description": "Tool-independent managed DSH_* shell environment registry", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index 33fb1a95e2..a52b7da707 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell", "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index 09257d78e3..7bbccc58e9 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash-persistent", "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index f3402e5c3a..66bedc106a 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash", "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index e92403eeb7..5cf0a2aa1f 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh", "description": "Model-facing pwsh tool over the bash executor seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index 4e7bd709d1..94e45d7baf 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 426696c4ef..165a62c647 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-filesystem", "description": "Local filesystem skill provider for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index b5ee04ffeb..24620a4563 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill", "description": "Agent skill provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index 9c878c5e9b..ad93077ed4 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-skill", "description": "Model-facing skill loading tool for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index 0b3856396a..01ed5f1a6a 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-local", "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index 22b4949f8f..db4964b478 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-policy", "description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index 7acbbca750..4a5d840afc 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill", "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index a1c7459ac6..ee8e16006f 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-domain", "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index 80ca5ffd9d..bdef47fa1a 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-json", "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 7de92e060f..a40a487984 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-sqlite", "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index 27f1d7c120..547505a9e1 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage", "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index afb777473e..3d4c4802a9 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-acp", "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index d58fa39170..a6d8ef2fb4 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-claude-code", "description": "One-shot Claude Code subagent provider over the official Agent SDK", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index d431f5ee28..0256ee8e21 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-codex", "description": "One-shot Codex subagent provider over the official app-server protocol", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 238630aa52..658baa1e6e 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-dsh-sdk", "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index adecaf2a57..c0b5be501a 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-fork-in-process", "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index 98fedc87fa..4fdd7950e9 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-in-process-driver", "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index 24d560d177..0517fbbfda 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-spawn-in-process", "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 156e3374a1..2c4e8cff09 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent", "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index b364ce31ae..5817e4570b 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-control", "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index 1df4de7e96..5a521442aa 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-report", "description": "Child-scoped report tool over ctx.subagents continuations", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index 65dec59652..47f336e438 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent", "description": "Model-facing subagent delegation tool over the ctx.subagents seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index d871666d15..67e955e747 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-local", "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 6bac49a247..7dae5402ad 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess", "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index 39c0005f85..7034244946 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal-bash", "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index 24eb4fd9fb..02022966c1 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal", "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index f5c8036d59..9af627fefb 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index 8e442f1381..2ddbb313b7 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-snapshot", "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index 33a6e4a8f3..eaddaeeb8c 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop-testkit", "description": "Shared prerequisite mounting for tests that exercise the concrete agent loop", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index ab31405d8e..596ec1ed73 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-test-runtime", "description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + web-react renderer with test-owned session/workspace doubles for feature specs", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index edbafb3df7..7862460b09 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-mock-server", "description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 5da35de12a..3ef733bca1 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-replay", "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index 6d591f8137..68c67dd08b 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-loader-smoke", "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index e284a61e86..b95b969da2 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-todo", "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index 66360e0260..0f7d210f16 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-generator", "description": "TypeScript project analyzer and model-driven Typert artifact generator", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index 2efddc661f..2642890fdb 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-loader", "description": "Loader integration for generated Typert package contributions", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 469a22e31c..d7d5294a60 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-protocol", "description": "Compiler-independent Remote metadata and Typert provider protocols", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index e8d294e5d1..84d3987011 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-registry", "description": "Runtime registry for generated package reflection and Zod schemas", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index 78340d428c..572d4abad8 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-atomic-write", "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index 6c06636a17..74277b61e7 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-brand", "description": "Type-only Branded nominal-typing primitive for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index 497f8dc061..1844f8801e 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-home-paths", "description": "Shared filesystem path helpers for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index f3e4fa0e3f..53be293855 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-launch-environment", "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index 9dfc5f9b10..973335b0fd 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-native-command", "description": "Zero-dependency no-shell execFile runner for host-native OS integrations: utf8 stdio capture, abort propagation, Windows hide", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index fc441ebb7d..53bf55133c 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-output-retention", "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index 91daad0c80..8bb6893518 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-timeout", "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index 9bc1c41fd5..84ca7bd0d7 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-web", "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index 9200d4655c..82d44a1f65 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-fetch-http", "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index d92342d542..7b6145ee97 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-deepseek", "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 9a92956533..28583b7a23 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-exa", "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 52ec2a7d0d..503b588fa3 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-perplexity", "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 36e911261c..05826f6ad4 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web", "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index 7a055c40fa..a8e83c3394 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index 028c1cb8f3..b400c22fdb 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workflow", "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index 53ea1347b3..fad0c9ec6a 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow-worker-thread", "description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index cfc49cf0ea..ec20881488 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow", "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index c513141e74..2e0ed5a0b4 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace", "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", - "version": "0.1.0-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { "access": "public" }, From f33f8583b51f17e10d77707b2525f6e45f758a8f Mon Sep 17 00:00:00 2001 From: Yichen Jiang Date: Thu, 13 Aug 2026 21:20:28 +0800 Subject: [PATCH 088/103] fix(docs): point source links at public master --- .github/workflows/docs-pages.yml | 3 +++ scripts/project-doc-site.spec.ts | 12 +++++++++++- scripts/project-doc-site.ts | 12 +++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml index 6336089a41..78bdafdf5b 100644 --- a/.github/workflows/docs-pages.yml +++ b/.github/workflows/docs-pages.yml @@ -23,6 +23,9 @@ permissions: env: PRIMARY_NODE_VERSION: '24' + # Projected source links target the public repository, whose history can + # differ from this workflow's source repository. + DOCS_REPOSITORY_REF: master # CI runs must never report to the production telemetry endpoint baked # into apps/cli/cordis.yml (AppCLIEntry disables the row when set). DSH_TELEMETRY_DISABLED: '1' diff --git a/scripts/project-doc-site.spec.ts b/scripts/project-doc-site.spec.ts index b5f5218de7..bacb6996ec 100644 --- a/scripts/project-doc-site.spec.ts +++ b/scripts/project-doc-site.spec.ts @@ -7,7 +7,7 @@ import { basename, join, resolve } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' import { docsPages, landingLink, routeLink, sectionSpec, type DocsPage } from '../website/docs.ts' import { - addProjectionFrontmatter, projectedPageContent, publishableImage, rewriteMarkdown, + addProjectionFrontmatter, projectedPageContent, publishableImage, resolveRepositoryRef, rewriteMarkdown, } from './project-doc-site.ts' const roots: string[] = [] @@ -91,6 +91,16 @@ describe('publishableImage', () => { }) }) +describe('resolveRepositoryRef', () => { + it('defaults to public master instead of a private workflow SHA', () => { + expect(resolveRepositoryRef({ GITHUB_SHA: 'private-sha' })).toBe('master') + }) + + it('accepts an explicit public repository ref', () => { + expect(resolveRepositoryRef({ DOCS_REPOSITORY_REF: 'public-sha' })).toBe('public-sha') + }) +}) + describe('rewriteMarkdown', () => { it('maps published pages and pins unpublished source links', () => { const { root, pages } = fixture() diff --git a/scripts/project-doc-site.ts b/scripts/project-doc-site.ts index 1d0ea9072a..9150780c14 100644 --- a/scripts/project-doc-site.ts +++ b/scripts/project-doc-site.ts @@ -19,6 +19,16 @@ const REPOSITORY_URL = 'https://github.com/deepseek-ai/deepseek-harness' const root = resolve(import.meta.dirname, '..') const generatedRoot = resolve(root, 'website/.generated') +/** + * Resolve the public repository ref used by projected source links. + * + * @param environment Build environment containing an optional explicit public ref. + * @returns The configured public ref, or `master`. + */ +export function resolveRepositoryRef(environment: NodeJS.ProcessEnv): string { + return environment.DOCS_REPOSITORY_REF ?? 'master' +} + interface Replacement { start: number end: number @@ -400,7 +410,7 @@ export function projectDocs(): void { const routes = new Set() /** Projected path to the repository file that claimed it, pages and images alike. */ const claimed = new Map() - const repositoryRef = process.env.GITHUB_SHA ?? 'master' + const repositoryRef = resolveRepositoryRef(process.env) rmSync(generatedRoot, { recursive: true, force: true }) /** Reserve one projected path, refusing a second source for it. */ From 226600147e4a14e61bacfe3804d51b2125292df4 Mon Sep 17 00:00:00 2001 From: Yichen Jiang Date: Fri, 14 Aug 2026 11:47:59 +0800 Subject: [PATCH 089/103] feat(llm-deepseek): support low reasoning effort --- ...r-owned-reasoning-effort-capabilities.i18n.yaml | 4 ++-- ...-adapter-owned-reasoning-effort-capabilities.md | 2 +- ...apter-owned-reasoning-effort-capabilities.zh.md | 2 +- docs/config-catalog.i18n.yaml | 4 ++-- docs/config-catalog.md | 2 +- docs/config-catalog.zh.md | 2 +- .../tests/fs-diff-bound.cordis.snapshot.yml | 2 +- .../tests/fixtures/deepseek-defaults.cordis.yml | 3 ++- examples/headless-agent/tests/headless.snapshot.ts | 3 ++- .../tests/components.client.spec.tsx | 2 +- .../tests/onboarding-dialog.client.spec.tsx | 2 +- packages/llm/llm-deepseek/README.i18n.yaml | 4 ++-- packages/llm/llm-deepseek/README.md | 6 +++--- packages/llm/llm-deepseek/README.zh.md | 6 +++--- packages/llm/llm-deepseek/src/adapter.ts | 10 +++++++--- packages/llm/llm-deepseek/src/index.ts | 4 ++-- packages/llm/llm-deepseek/src/serialize.ts | 12 ++++++------ packages/llm/llm-deepseek/src/types.ts | 4 ++-- packages/llm/llm-deepseek/tests/adapter.e2e.ts | 6 +++--- packages/llm/llm-deepseek/tests/adapter.spec.ts | 14 ++++++++------ packages/llm/llm-deepseek/tests/serialize.spec.ts | 6 +++--- 21 files changed, 54 insertions(+), 46 deletions(-) diff --git a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml index 7e8eb5c17d..48967a6faa 100644 --- a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md -2026-07-24-adapter-owned-reasoning-effort-capabilities.md: f71a15626b97090a89f071e552a12b1f89173620 -2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md: 6e8c99f98107e2855aa7cb7ea759544013d0ea8a +2026-07-24-adapter-owned-reasoning-effort-capabilities.md: f59e5d351970e785e6ade32797f1c1a5dd9e2591 +2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md: 6e657a90e8ef3cd400a3e252f728bb1aadd9f4f2 diff --git a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md index f71a15626b..f59e5d3519 100644 --- a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md +++ b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md @@ -14,7 +14,7 @@ Reasoning strength was adapter configuration only, so a conversation could not d `LlmCallConfig` and `GenerateOptions` carry the optional effort. The agent loop prepares the post-`agent/request` config under the active turn signal before writing `request/header`, so defaults and dynamic changes are model-visible only after becoming durable facts. The prepared call retains the exact adapter registration across asynchronous exact-model resolution, durable header logging, and dispatch; direct `LlmRuntime.stream()` calls likewise capture their final registration before awaiting resolution. A route with no registered adapter retains its proposed config so an `llm/stream` middleware can own and short-circuit it; terminal dispatch still rejects an unhandled route. A resumed loop retains the logged effort only when its initial provider/model route is unchanged; a route change discards the previous model's opaque id. -The native DeepSeek adapter advertises `off`, `high`, and `max` when deployment policy permits thinking, and defaults to the configured effort or `high`. Its adapter-owned `off` maps to `thinking.type: disabled` with no `reasoning_effort`; `high` and `max` enable thinking and carry their official wire effort. A `thinking: disabled` deployment publishes only `off` and rejects attempts to enable thinking before provider I/O. The pi-ai adapter publishes each exact model's `getSupportedThinkingLevels()` result unchanged, including `off`, preserves an absent profile default as a provider default, and leaves provider wire-value mapping inside pi-ai. Its common stream options represent `off` by omitting `reasoning`, as required by pi-ai's own API. +The native DeepSeek adapter advertises `off`, `low`, `high`, and `max` when deployment policy permits thinking, and defaults to the configured effort or `high`. Its adapter-owned `off` maps to `thinking.type: disabled` with no `reasoning_effort`; `low`, `high`, and `max` enable thinking and carry their same-named official wire effort. A `thinking: disabled` deployment publishes only `off` and rejects attempts to enable thinking before provider I/O. The pi-ai adapter publishes each exact model's `getSupportedThinkingLevels()` result unchanged, including `off`, preserves an absent profile default as a provider default, and leaves provider wire-value mapping inside pi-ai. Its common stream options represent `off` by omitting `reasoning`, as required by pi-ai's own API. ## Alternatives considered diff --git a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md index 6e8c99f981..6e657a90e8 100644 --- a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md @@ -14,7 +14,7 @@ Status: implemented `LlmCallConfig` 和 `GenerateOptions` 携带可选的推理强度。agent loop 在活跃轮次信号的控制下准备 `agent/request` 处理完成后的配置,再写入 `request/header`,因此默认值和动态变更只有成为持久化事实后才对模型可见。准备完成的调用在异步确切模型解析、请求头持久记录和分派全程保留同一项确切的适配器注册;直接调用 `LlmRuntime.stream()` 时,也会在等待解析前捕获最终的适配器注册。没有已注册适配器的路由会保留原定配置,使 `llm/stream` 中间件可以接管并短路该请求;若仍未得到处理,最终分发会拒绝该路由。恢复后的 agent loop 仅在初始提供方/模型路由未变时保留日志中记录的推理强度;如果路由发生变化,则丢弃上一模型的不透明 ID。 -当部署策略允许思考时,原生 DeepSeek 适配器声明 `off`、`high` 和 `max`,默认使用配置指定的推理强度,若未配置则使用 `high`。由适配器持有的 `off` 映射为 `thinking.type: disabled`,且不带 `reasoning_effort`;`high` 和 `max` 会启用思考并携带各自的官方协议强度值。配置为 `thinking: disabled` 的部署仅声明 `off`,并会在提供方 I/O 前拒绝启用思考的尝试。pi-ai 适配器原样发布每个确切模型的 `getSupportedThinkingLevels()` 结果,其中包括 `off`;profile 未指定默认值时保留提供方默认行为,并将提供方协议值的映射留在 pi-ai 内部。按照 pi-ai 自身 API 的要求,其通用流选项通过省略 `reasoning` 来表示 `off`。 +当部署策略允许思考时,原生 DeepSeek 适配器声明 `off`、`low`、`high` 和 `max`,默认使用配置指定的推理强度,若未配置则使用 `high`。由适配器持有的 `off` 映射为 `thinking.type: disabled`,且不带 `reasoning_effort`;`low`、`high` 和 `max` 会启用思考并携带各自的同名官方协议强度值。配置为 `thinking: disabled` 的部署仅声明 `off`,并会在提供方 I/O 前拒绝启用思考的尝试。pi-ai 适配器原样发布每个确切模型的 `getSupportedThinkingLevels()` 结果,其中包括 `off`;profile 未指定默认值时保留提供方默认行为,并将提供方协议值的映射留在 pi-ai 内部。按照 pi-ai 自身 API 的要求,其通用流选项通过省略 `reasoning` 来表示 `off`。 ## 备选方案 diff --git a/docs/config-catalog.i18n.yaml b/docs/config-catalog.i18n.yaml index f5a845ad5f..ef4931f765 100644 --- a/docs/config-catalog.i18n.yaml +++ b/docs/config-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/config-catalog.md -config-catalog.md: 20919b3fdc5ab26255465949d72bdce8d356a529 -config-catalog.zh.md: 8dfb49df5e3f5906af859a4de83ebc44f315a0bd +config-catalog.md: 82f6d26c79d32c6952f3bc11c96fa1c2ddceecdc +config-catalog.zh.md: 958d3115447db37de248bbf30b0744308ff8dbb8 diff --git a/docs/config-catalog.md b/docs/config-catalog.md index 20919b3fdc..82f6d26c79 100644 --- a/docs/config-catalog.md +++ b/docs/config-catalog.md @@ -859,7 +859,7 @@ export interface Config { /** Deployment thinking policy; `disabled` limits every conversation request to `off`. */ thinking?: 'enabled' | 'disabled' /** Default thinking effort (default `high`); `off` disables thinking per request. */ - reasoningEffort?: 'off' | 'high' | 'max' + reasoningEffort?: 'off' | 'low' | 'high' | 'max' /** Default per-request output cap (default 256,000); a model's own cap and explicit request values win. */ maxTokens?: number /** Positive context capacity used when the selected model has no exact value (default 1,000,000). */ diff --git a/docs/config-catalog.zh.md b/docs/config-catalog.zh.md index 8dfb49df5e..958d311544 100644 --- a/docs/config-catalog.zh.md +++ b/docs/config-catalog.zh.md @@ -861,7 +861,7 @@ export interface Config { /** Deployment thinking policy; `disabled` limits every conversation request to `off`. */ thinking?: 'enabled' | 'disabled' /** Default thinking effort (default `high`); `off` disables thinking per request. */ - reasoningEffort?: 'off' | 'high' | 'max' + reasoningEffort?: 'off' | 'low' | 'high' | 'max' /** Default per-request output cap (default 256,000); a model's own cap and explicit request values win. */ maxTokens?: number /** Positive context capacity used when the selected model has no exact value (default 1,000,000). */ diff --git a/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml b/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml index 4cc6ba1f3e..ac89b962eb 100644 --- a/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml +++ b/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml @@ -41,6 +41,6 @@ - id: deepseek-v4-flash contextWindow: 1000000 defaultMaxTokens: 256000 - reasoningEfforts: ['off', 'high', 'max'] + reasoningEfforts: ['off', 'low', 'high', 'max'] defaultReasoningEffort: max - id: deepseek-v4-pro diff --git a/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml b/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml index fab8ae1b7b..7f1c0b3e9e 100644 --- a/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml +++ b/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml @@ -6,7 +6,8 @@ - id: llm-deepseek config: baseURL: !!js process.env.DSH_SNAPSHOT_BASE_URL - thinking: disabled + thinking: enabled + reasoningEffort: low streamIdleTimeoutMs: 150 - id: agent-spine config: diff --git a/examples/headless-agent/tests/headless.snapshot.ts b/examples/headless-agent/tests/headless.snapshot.ts index 4f2eb28d40..d22a48a7ab 100644 --- a/examples/headless-agent/tests/headless.snapshot.ts +++ b/examples/headless-agent/tests/headless.snapshot.ts @@ -541,6 +541,7 @@ describe('headless stream-json snapshots', () => { expect(result.stderr).toBe('') expect(server.requests).toHaveLength(1) expect(server.requests[0]?.max_tokens).toBe(256_000) + expect(server.requests[0]?.reasoning_effort).toBe('low') const header = (parseJsonl(result.stdout) .map(record => record.event) .find((event): event is JsonObject => ( @@ -555,7 +556,7 @@ describe('headless stream-json snapshots', () => { "maxTokens": 256000, "model": "deepseek-v4-flash", "provider": "deepseek-official", - "reasoningEffort": "off", + "reasoningEffort": "low", } `) expect(header?.adapterDefaults).toEqual({ diff --git a/packages/client/ui-settings-models/tests/components.client.spec.tsx b/packages/client/ui-settings-models/tests/components.client.spec.tsx index d7643522dd..66ba8d33a4 100644 --- a/packages/client/ui-settings-models/tests/components.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/components.client.spec.tsx @@ -48,7 +48,7 @@ const PiAiConfig = Schema.object({ const DeepSeekConfig = Schema.object({ apiKeyEnv: Schema.string().role('credential-ref'), baseURL: Schema.string().pattern(/^https:\/\//), - reasoningEffort: Schema.union(['off', 'high', 'max']), + reasoningEffort: Schema.union(['off', 'low', 'high', 'max']), defaultContextWindow: Schema.number().step(1).min(1), models: Schema.array(Schema.object({ id: Schema.string().required(), diff --git a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx index 192b57bf50..ebb5992cfe 100644 --- a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx @@ -29,7 +29,7 @@ function fail(message: string): RpcResponse { const DeepSeekConfig = Schema.object({ apiKeyEnv: Schema.string().role('credential-ref'), baseURL: Schema.string().pattern(/^https:\/\//), - reasoningEffort: Schema.union(['off', 'high', 'max']), + reasoningEffort: Schema.union(['off', 'low', 'high', 'max']), defaultContextWindow: Schema.number().step(1).min(1), models: Schema.array(Schema.object({ id: Schema.string().required(), diff --git a/packages/llm/llm-deepseek/README.i18n.yaml b/packages/llm/llm-deepseek/README.i18n.yaml index 9f1f57ef90..4ac4cf4ed0 100644 --- a/packages/llm/llm-deepseek/README.i18n.yaml +++ b/packages/llm/llm-deepseek/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/llm/llm-deepseek/README.md -README.md: 1923be694c20149fe5387bd7bb4dac5da32a63a4 -README.zh.md: bdce7f2b2fdff0e1542deb3e7fae5c5e7139d13b +README.md: af89e7ee3bab6ec209349d047f81308eb6e87cef +README.zh.md: e9ce3206027ffeee9bc49eb7a2ed76ddcbe7bfc8 diff --git a/packages/llm/llm-deepseek/README.md b/packages/llm/llm-deepseek/README.md index 1923be694c..af89e7ee3b 100644 --- a/packages/llm/llm-deepseek/README.md +++ b/packages/llm/llm-deepseek/README.md @@ -17,7 +17,7 @@ The package root exposes the Cordis plugin contract and `DeepSeekAdapter`; wire apiKeyEnv: DEEPSEEK_API_KEY # default; resolved per request via ctx.credentials, then the environment baseURL: https://api.deepseek.com # optional; $DEEPSEEK_BASE_URL then the public API when omitted thinking: enabled # optional; provider default is enabled - reasoningEffort: high # optional; off | high | max — omitted ⇒ high + reasoningEffort: high # optional; off | low | high | max — omitted ⇒ high maxTokens: 256000 # optional positive per-request output cap; this is the default streamIdleTimeoutMs: 300000 # optional; positive finite Node timer delay; five-minute default retryPolicy: # optional; omission uses bounded normal defaults @@ -41,9 +41,9 @@ The plugin registers the single provider route `deepseek-official` together with `maxTokens` is the adapter-configured output cap for conversation requests and defaults to 256,000. A catalog entry may carry its own `maxTokens`, which wins for that model; an entry without one, and any unlisted pass-through id, resolve to the profile value, so adding a per-model cap changes one model rather than the route. Exact-model resolution exposes the winner as `defaultMaxTokens`; `LlmRuntime` materializes that value into `GenerateOptions.maxTokens` before the agent loop writes `request/header`, so the wire request remains reconstructable. An explicit request or `AgentOptions.maxTokens` value wins and is serialized as `max_tokens`. The adapter does not clamp this request budget against `contextWindow`; deployments with a smaller context or provider output limit must configure a compatible `maxTokens`. -The same exact-model result exposes ordered `off`, `high`, and `max` efforts under `reasoning` for every pass-through model when deployment policy permits thinking. `reasoningEffort` selects the deployment default and falls back to `high` when omitted. `agent/request` can replace it on each conversation step; the resolved value is logged in `request/header`. `high` and `max` enable thinking and serialize as the official top-level `reasoning_effort`; adapter-owned `off` instead serializes `thinking.type: disabled` and omits `reasoning_effort`. An unsupported value fails with `UNSUPPORTED_REASONING_EFFORT` before network I/O. +The same exact-model result exposes ordered `off`, `low`, `high`, and `max` efforts under `reasoning` for every pass-through model when deployment policy permits thinking. `reasoningEffort` selects the deployment default and falls back to `high` when omitted. `agent/request` can replace it on each conversation step; the resolved value is logged in `request/header`. `low`, `high`, and `max` enable thinking and serialize as the same official top-level `reasoning_effort` value; adapter-owned `off` instead serializes `thinking.type: disabled` and omits `reasoning_effort`. An unsupported value fails with `UNSUPPORTED_REASONING_EFFORT` before network I/O. -`thinking: disabled` is a deployment lock that publishes only `off` with `off` as its default. Omitting `reasoningEffort` or configuring it as `off` is valid; configuring `high` or `max` fails plugin loading, and a direct per-request attempt to enable thinking fails before network I/O. A request with `GenerateOptions.purpose: 'session-title'` also forces thinking disabled and omits the already-resolved effort, reserving its bounded output for visible title text without changing conversation or compaction defaults. +`thinking: disabled` is a deployment lock that publishes only `off` with `off` as its default. Omitting `reasoningEffort` or configuring it as `off` is valid; configuring `low`, `high`, or `max` fails plugin loading, and a direct per-request attempt to enable thinking fails before network I/O. A request with `GenerateOptions.purpose: 'session-title'` also forces thinking disabled and omits the already-resolved effort, reserving its bounded output for visible title text without changing conversation or compaction defaults. `streamIdleTimeoutMs` bounds each outstanding provider read, including the initial `fetch`, without counting time the consumer spends between chunks. DeepSeek SSE comments rearm an outstanding read as transport activity but never become `StreamChunk` values or session-log events. One stable abort signal reaches the request and body reader for the whole call; expiry stops the transport and throws `LlmError('TIMEOUT')`, while an earlier caller abort throws `LlmError('ABORTED')`. The adapter makes exactly one provider request per `stream()` call; it registers the configured policy as provider metadata, and `dsh-llm-retry` separately executes it at durable agent-step boundaries. diff --git a/packages/llm/llm-deepseek/README.zh.md b/packages/llm/llm-deepseek/README.zh.md index bdce7f2b2f..e9ce320602 100644 --- a/packages/llm/llm-deepseek/README.zh.md +++ b/packages/llm/llm-deepseek/README.zh.md @@ -17,7 +17,7 @@ harness LLM(大语言模型)seam 的 DeepSeek chat-completions 适配器: apiKeyEnv: DEEPSEEK_API_KEY # default; resolved per request via ctx.credentials, then the environment baseURL: https://api.deepseek.com # optional; $DEEPSEEK_BASE_URL then the public API when omitted thinking: enabled # optional; provider default is enabled - reasoningEffort: high # optional; off | high | max — omitted ⇒ high + reasoningEffort: high # optional; off | low | high | max — omitted ⇒ high maxTokens: 256000 # optional positive per-request output cap; this is the default streamIdleTimeoutMs: 300000 # optional; positive finite Node timer delay; five-minute default retryPolicy: # optional; omission uses bounded normal defaults @@ -41,9 +41,9 @@ harness LLM(大语言模型)seam 的 DeepSeek chat-completions 适配器: `maxTokens` 是适配器为对话请求配置的输出上限,默认值为 256,000。Catalog 配置项可以自带 `maxTokens`,它对该模型胜出;不含该上限的配置项以及任何未列出原样传递 id 都解析为 profile 值,因此新增按模型的上限只改变一个模型,而非整条路由。确切模型解析会将胜出值公开为 `defaultMaxTokens`;`LlmRuntime` 会在 agent loop(智能体循环)写入 `request/header` 前,将该值填入 `GenerateOptions.maxTokens`,从而仍可根据持久记录重建协议请求。显式的请求值或 `AgentOptions.maxTokens` 值优先,并会序列化为 `max_tokens`。适配器不会根据 `contextWindow` 自动调低该请求预算;上下文或提供方输出上限较小的部署必须配置与其相容的 `maxTokens`。 -同一确切模型结果会在部署策略允许思考时,为每个原样传递模型在 `reasoning` 下公开有序的 `off`、`high` 和 `max` 推理(reasoning)强度。`reasoningEffort` 选择部署默认值,省略时回退为 `high`。`agent/request` 可以在每个会话步骤替换它;解析后的值会记录在 `request/header`。`high` 和 `max` 会启用思考,并序列化为官方顶层 `reasoning_effort`;适配器持有的 `off` 则序列化为 `thinking.type: disabled`,且省略 `reasoning_effort`。不支持的值会在网络 I/O 前以 `UNSUPPORTED_REASONING_EFFORT` 失败。 +同一确切模型结果会在部署策略允许思考时,为每个原样传递模型在 `reasoning` 下公开有序的 `off`、`low`、`high` 和 `max` 推理(reasoning)强度。`reasoningEffort` 选择部署默认值,省略时回退为 `high`。`agent/request` 可以在每个会话步骤替换它;解析后的值会记录在 `request/header`。`low`、`high` 和 `max` 会启用思考,并以同名值序列化为官方顶层 `reasoning_effort`;适配器持有的 `off` 则序列化为 `thinking.type: disabled`,且省略 `reasoning_effort`。不支持的值会在网络 I/O 前以 `UNSUPPORTED_REASONING_EFFORT` 失败。 -`thinking: disabled` 是部署锁定:它只公布 `off`,并以 `off` 为默认值。省略 `reasoningEffort` 或将其配置为 `off` 均有效;配置 `high` 或 `max` 会使插件加载失败,直接按请求启用思考也会在网络 I/O 前失败。携带 `GenerateOptions.purpose: 'session-title'` 的请求也会强制禁用思考并省略已解析的推理强度,将有界输出保留给可见标题文本,不改变会话或压缩(compaction)默认值。 +`thinking: disabled` 是部署锁定:它只公布 `off`,并以 `off` 为默认值。省略 `reasoningEffort` 或将其配置为 `off` 均有效;配置 `low`、`high` 或 `max` 会使插件加载失败,直接按请求启用思考也会在网络 I/O 前失败。携带 `GenerateOptions.purpose: 'session-title'` 的请求也会强制禁用思考并省略已解析的推理强度,将有界输出保留给可见标题文本,不改变会话或压缩(compaction)默认值。 `streamIdleTimeoutMs` 会限制每次未完成提供方读取,包括初始 `fetch`,但不计入消费方在分片间花费的时间。DeepSeek SSE 注释会作为传输活动使尚未完成的读取重新布防,但绝不会成为 `StreamChunk` 值或会话日志事件。同一个稳定的 abort 信号会在整个调用期间传递给请求与 body reader;过期会停止传输并抛出 `LlmError('TIMEOUT')`,较早的调用方 abort 则抛出 `LlmError('ABORTED')`。适配器每次 `stream()` 调用恰好发起一次提供方请求;它把已配置策略注册为提供方元数据,再由 `dsh-llm-retry` 在持久化的 agent(智能体)步骤边界单独执行该策略。 diff --git a/packages/llm/llm-deepseek/src/adapter.ts b/packages/llm/llm-deepseek/src/adapter.ts index 5fa62d30ff..bc30d46c3b 100644 --- a/packages/llm/llm-deepseek/src/adapter.ts +++ b/packages/llm/llm-deepseek/src/adapter.ts @@ -93,10 +93,12 @@ export const DEFAULT_CONTEXT_WINDOW = 1_000_000 export const DEFAULT_MAX_TOKENS = 256_000 const STREAM_IDLE_TIMEOUT_CODE = 'LLM_STREAM_IDLE_TIMEOUT' const OFF_REASONING_EFFORT = ReasoningEffortId('off') +const LOW_REASONING_EFFORT = ReasoningEffortId('low') const HIGH_REASONING_EFFORT = ReasoningEffortId('high') const MAX_REASONING_EFFORT = ReasoningEffortId('max') const REASONING_EFFORTS = [ { id: OFF_REASONING_EFFORT, name: 'Off' }, + { id: LOW_REASONING_EFFORT, name: 'Low' }, { id: HIGH_REASONING_EFFORT, name: 'High' }, { id: MAX_REASONING_EFFORT, name: 'Max' }, ] as const @@ -203,9 +205,11 @@ export class DeepSeekAdapter extends LlmAdapter { efforts: REASONING_EFFORTS, defaultEffort: connection.defaults.reasoningEffort === 'off' ? OFF_REASONING_EFFORT - : connection.defaults.reasoningEffort === 'max' - ? MAX_REASONING_EFFORT - : HIGH_REASONING_EFFORT, + : connection.defaults.reasoningEffort === 'low' + ? LOW_REASONING_EFFORT + : connection.defaults.reasoningEffort === 'max' + ? MAX_REASONING_EFFORT + : HIGH_REASONING_EFFORT, }, }, }) diff --git a/packages/llm/llm-deepseek/src/index.ts b/packages/llm/llm-deepseek/src/index.ts index 8d01d9d6bc..a7b22ddd88 100644 --- a/packages/llm/llm-deepseek/src/index.ts +++ b/packages/llm/llm-deepseek/src/index.ts @@ -67,7 +67,7 @@ export interface Config { /** Deployment thinking policy; `disabled` limits every conversation request to `off`. */ thinking?: 'enabled' | 'disabled' /** Default thinking effort (default `high`); `off` disables thinking per request. */ - reasoningEffort?: 'off' | 'high' | 'max' + reasoningEffort?: 'off' | 'low' | 'high' | 'max' /** Default per-request output cap (default 256,000); a model's own cap and explicit request values win. */ maxTokens?: number /** Positive context capacity used when the selected model has no exact value (default 1,000,000). */ @@ -92,7 +92,7 @@ export const Config: z = z.object({ apiKeyEnv: z.string().role('credential-ref').default(DEFAULT_API_KEY_ENV), baseURL: z.string(), thinking: z.union(['enabled', 'disabled']), - reasoningEffort: z.union(['off', 'high', 'max']), + reasoningEffort: z.union(['off', 'low', 'high', 'max']), maxTokens: z.number().step(1).min(1).max(Number.MAX_SAFE_INTEGER).default(DEFAULT_MAX_TOKENS), defaultContextWindow: z.number().step(1).min(1).default(DEFAULT_CONTEXT_WINDOW), models: z.array(catalogModel).default(DEFAULT_MODELS), diff --git a/packages/llm/llm-deepseek/src/serialize.ts b/packages/llm/llm-deepseek/src/serialize.ts index 34fa214bb9..f51ef23031 100644 --- a/packages/llm/llm-deepseek/src/serialize.ts +++ b/packages/llm/llm-deepseek/src/serialize.ts @@ -14,18 +14,18 @@ import type { WireMessage, WireRequest, WireTool } from './types.ts' /** Adapter-level request defaults (from plugin config). */ export interface RequestDefaults { thinking?: 'enabled' | 'disabled' | undefined - reasoningEffort?: 'off' | 'high' | 'max' | undefined + reasoningEffort?: 'off' | 'low' | 'high' | 'max' | undefined } interface ResolvedThinking { thinking?: 'enabled' | 'disabled' - reasoningEffort?: 'high' | 'max' + reasoningEffort?: 'low' | 'high' | 'max' } /** Validate the adapter-owned effort before resolving its DeepSeek wire fields. */ -function reasoningEffort(effort: NonNullable): 'off' | 'high' | 'max' { - if (effort === 'off' || effort === 'high' || effort === 'max') { - return effort as 'off' | 'high' | 'max' +function reasoningEffort(effort: NonNullable): 'off' | 'low' | 'high' | 'max' { + if (effort === 'off' || effort === 'low' || effort === 'high' || effort === 'max') { + return effort as 'off' | 'low' | 'high' | 'max' } throw new LlmError( `DeepSeek does not support reasoning effort "${effort}"`, @@ -46,7 +46,7 @@ function resolveThinking(options: GenerateOptions, defaults: RequestDefaults): R ) } if (effort === 'off') return { thinking: 'disabled' } - if (effort === 'high' || effort === 'max') { + if (effort === 'low' || effort === 'high' || effort === 'max') { return { thinking: 'enabled', reasoningEffort: effort } } return defaults.thinking === undefined ? {} : { thinking: defaults.thinking } diff --git a/packages/llm/llm-deepseek/src/types.ts b/packages/llm/llm-deepseek/src/types.ts index a9d7403a35..ec3f28cbf4 100644 --- a/packages/llm/llm-deepseek/src/types.ts +++ b/packages/llm/llm-deepseek/src/types.ts @@ -17,8 +17,8 @@ export interface WireRequest { stream_options: { include_usage: true } /** Thinking-mode toggle (top level, NOT inside extra_body on the wire). */ thinking?: { type: 'enabled' | 'disabled' } - /** Thinking effort (official levels; low/medium map to high server-side). */ - reasoning_effort?: 'high' | 'max' + /** Thinking effort (official levels). */ + reasoning_effort?: 'low' | 'high' | 'max' tools?: WireTool[] temperature?: number max_tokens?: number diff --git a/packages/llm/llm-deepseek/tests/adapter.e2e.ts b/packages/llm/llm-deepseek/tests/adapter.e2e.ts index 269169c73a..19ce411406 100644 --- a/packages/llm/llm-deepseek/tests/adapter.e2e.ts +++ b/packages/llm/llm-deepseek/tests/adapter.e2e.ts @@ -12,7 +12,7 @@ import { assemble, type AssembledResult } from './assemble.ts' /** * Real-API e2e for the direct-fetch adapter: V4 Flash + V4 Pro across - * thinking modes and both official effort levels. Key-gated — skips + * thinking modes and all official effort levels. Key-gated — skips * entirely without $DEEPSEEK_API_KEY (see vitest.e2e.config.ts). */ @@ -95,7 +95,7 @@ describe.skipIf(!process.env.DEEPSEEK_API_KEY)('llm-deepseek e2e (real API)', () } }) - it('flash dynamically switches from off to high', async () => { + it('flash dynamically switches from off to low', async () => { const ctx = await harness(FLASH, { reasoningEffort: 'off' }) const withoutThinking = await assemble(ctx,{ model: FLASH, @@ -110,7 +110,7 @@ describe.skipIf(!process.env.DEEPSEEK_API_KEY)('llm-deepseek e2e (real API)', () const withThinking = await assemble(ctx,{ model: FLASH, - reasoningEffort: ReasoningEffortId('high'), + reasoningEffort: ReasoningEffortId('low'), messages: ask('Which is larger, 9.11 or 9.8? Answer with just the number.'), maxTokens: 2000, }) diff --git a/packages/llm/llm-deepseek/tests/adapter.spec.ts b/packages/llm/llm-deepseek/tests/adapter.spec.ts index 387abf583f..ce56635ee7 100644 --- a/packages/llm/llm-deepseek/tests/adapter.spec.ts +++ b/packages/llm/llm-deepseek/tests/adapter.spec.ts @@ -141,13 +141,13 @@ describe('DeepSeekAdapter against a mock server', () => { expect(server.headers[0]?.['x-deepseek-harness-compact']).toBe('1') }) - it('switches dynamically from the configured high default through off to max', async () => { + it('switches dynamically from the configured low default through off to max', async () => { const server = await mockServer([ { kind: 'sse', events: textEvents }, { kind: 'sse', events: textEvents }, { kind: 'sse', events: textEvents }, ]) - const ctx = await harness(server.url, { thinking: 'enabled', reasoningEffort: 'high' }) + const ctx = await harness(server.url, { thinking: 'enabled', reasoningEffort: 'low' }) await assemble(ctx,{ model: 'deepseek-v4-flash', @@ -174,7 +174,7 @@ describe('DeepSeekAdapter against a mock server', () => { }) expect(server.requests[0]).toMatchObject({ thinking: { type: 'enabled' }, - reasoning_effort: 'high', + reasoning_effort: 'low', }) expect(server.requests[1]).toMatchObject({ thinking: { type: 'disabled' }, @@ -671,6 +671,7 @@ describe('plugin registration and config', () => { reasoning: { efforts: [ { id: ReasoningEffortId('off'), name: 'Off' }, + { id: ReasoningEffortId('low'), name: 'Low' }, { id: ReasoningEffortId('high'), name: 'High' }, { id: ReasoningEffortId('max'), name: 'Max' }, ], @@ -679,7 +680,7 @@ describe('plugin registration and config', () => { }) }) - it.each(['off', 'max'] as const)('uses the configured %s reasoning default', async (effort) => { + it.each(['off', 'low', 'max'] as const)('uses the configured %s reasoning default', async (effort) => { const ctx = new Context() await ctx.plugin(LlmRuntime) await ctx.plugin(LlmDeepSeek, { @@ -691,6 +692,7 @@ describe('plugin registration and config', () => { reasoning: { efforts: [ { id: ReasoningEffortId('off'), name: 'Off' }, + { id: ReasoningEffortId('low'), name: 'Low' }, { id: ReasoningEffortId('high'), name: 'High' }, { id: ReasoningEffortId('max'), name: 'Max' }, ], @@ -716,7 +718,7 @@ describe('plugin registration and config', () => { }) }) - it.each(['high', 'max'] as const)( + it.each(['low', 'high', 'max'] as const)( 'rejects configured reasoning effort %s when thinking is disabled', async (reasoningEffort) => { const ctx = new Context() @@ -730,7 +732,7 @@ describe('plugin registration and config', () => { }, ) - it.each(['high', 'max'] as const)( + it.each(['low', 'high', 'max'] as const)( 'rejects disabled-thinking effort %s at the resolver boundary', (reasoningEffort) => { expect(() => resolveAdapterOptions({ thinking: 'disabled', reasoningEffort })) diff --git a/packages/llm/llm-deepseek/tests/serialize.spec.ts b/packages/llm/llm-deepseek/tests/serialize.spec.ts index e7e95703fb..714cfc5d27 100644 --- a/packages/llm/llm-deepseek/tests/serialize.spec.ts +++ b/packages/llm/llm-deepseek/tests/serialize.spec.ts @@ -203,13 +203,13 @@ describe('serializeRequest', () => { expect(wire.tools).toBeUndefined() }) - it('maps adapter-default thinking and the request reasoning effort', () => { + it.each(['low', 'high', 'max'] as const)('maps adapter-default thinking and request effort %s', (effort) => { const wire = serializeRequest( - request({ messages: history, reasoningEffort: ReasoningEffortId('max') }), + request({ messages: history, reasoningEffort: ReasoningEffortId(effort) }), { thinking: 'enabled', reasoningEffort: 'high' }, ) expect(wire.thinking).toEqual({ type: 'enabled' }) - expect(wire.reasoning_effort).toBe('max') + expect(wire.reasoning_effort).toBe(effort) }) it('maps off to disabled thinking without a wire reasoning effort', () => { From 47399764c5e245f1066a68f87bd5a65206d75d7f Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 11:27:13 +0800 Subject: [PATCH 090/103] fix(release): order publication by every installed dependency section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Publish order exists to make a partial publication self-consistent: an interrupted run should leave a prefix whose packages never point at a version absent from the registry. It read only dependencies and optionalDependencies, so peer declarations — how sibling harness packages reference each other, 1088 edges in the dsh family — constrained nothing. Peer edges now order the publication too. devDependencies still do not: a dev dependency is absent from the published package. Peers cannot constrain it absolutely. Sibling packages declare each other as peers, which is what closes the two cycles here, and npm treats an unmet peer as a warning rather than a resolution failure. Install edges therefore win: a peer edge is dropped where the peer installs the member declaring it, or where following it would revisit a member already being visited. One peer edge is dropped in the dsh family and two in the vendored family; every install edge is honoured. A cycle among install edges stays a defect rather than something to order around, and release:verify now reports it before the build instead of letting it surface once pack is already writing tarballs. Install-edge acyclicity is checked on its own graph, because a peer edge leading into an install edge otherwise reads as a cycle where the install edges are perfectly orderable. --- scripts/release/families.spec.ts | 62 +++++++++++++++++++ scripts/release/families.ts | 103 ++++++++++++++++++++++++------- scripts/release/verify.ts | 11 +++- 3 files changed, 154 insertions(+), 22 deletions(-) diff --git a/scripts/release/families.spec.ts b/scripts/release/families.spec.ts index 369fc62b16..2c872d4487 100644 --- a/scripts/release/families.spec.ts +++ b/scripts/release/families.spec.ts @@ -74,6 +74,68 @@ describe('release families', () => { expect(() => { dsh.publishOrder(members) }).toThrow(/dependency cycle/) }) + it('publishes a peer before its consumer', () => { + const dsh = releaseFamily('dsh') + const members = [ + member('packages/a/consumer', '@deepseek-ai/dsh-consumer', { peerDependencies: { '@deepseek-ai/dsh-zebra': 'workspace:^' } }), + member('packages/a/zebra', '@deepseek-ai/dsh-zebra'), + ] + + // Name order alone would place the consumer first; the peer edge moves it. + expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + '@deepseek-ai/dsh-zebra', + '@deepseek-ai/dsh-consumer', + ]) + }) + + it('orders around a peer cycle rather than refusing to publish', () => { + const dsh = releaseFamily('dsh') + const members = [ + member('packages/a/left', '@deepseek-ai/dsh-left', { peerDependencies: { '@deepseek-ai/dsh-right': 'workspace:^' } }), + member('packages/a/right', '@deepseek-ai/dsh-right', { peerDependencies: { '@deepseek-ai/dsh-left': 'workspace:^' } }), + ] + + // Sibling packages declare each other as peers, and npm treats an unmet peer + // as a warning, so this pair has to publish rather than fail the release. + expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + '@deepseek-ai/dsh-right', + '@deepseek-ai/dsh-left', + ]) + }) + + it('honours an install edge even when a peer cycle surrounds it', () => { + const dsh = releaseFamily('dsh') + const members = [ + member('packages/a/base', '@deepseek-ai/dsh-base', { peerDependencies: { '@deepseek-ai/dsh-consumer': 'workspace:^' } }), + member('packages/a/consumer', '@deepseek-ai/dsh-consumer', { + dependencies: { '@deepseek-ai/dsh-base': 'workspace:^' }, + peerDependencies: { '@deepseek-ai/dsh-base': 'workspace:^' }, + }), + ] + + // The install edge is absolute: base publishes first, and the peer edge that + // would reverse it is the one dropped. + expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + '@deepseek-ai/dsh-base', + '@deepseek-ai/dsh-consumer', + ]) + }) + + it('ignores devDependencies when ordering', () => { + const dsh = releaseFamily('dsh') + const members = [ + member('packages/a/alpha', '@deepseek-ai/dsh-alpha', { devDependencies: { '@deepseek-ai/dsh-zebra': 'workspace:^' } }), + member('packages/a/zebra', '@deepseek-ai/dsh-zebra'), + ] + + // A dev dependency is absent from the published package, so it must not move + // the consumer behind it. + expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + '@deepseek-ai/dsh-alpha', + '@deepseek-ai/dsh-zebra', + ]) + }) + it('applies the harness payload policy to dsh and keeps upstream payloads for vendored packages', () => { const dsh = releaseFamily('dsh') const vendor = releaseFamily('vendor') diff --git a/scripts/release/families.ts b/scripts/release/families.ts index d39552636d..2135920047 100644 --- a/scripts/release/families.ts +++ b/scripts/release/families.ts @@ -13,8 +13,21 @@ import { globSync, readFileSync } from 'node:fs' import { resolve } from 'node:path' import { validateTarballPayload } from '../publication-payload.ts' -/** Dependency sections that constrain publish order: a consumer must publish after its dependency. */ -const ORDER_SECTIONS = ['dependencies', 'optionalDependencies'] as const +/** + * Dependency sections a consumer must publish after, because npm resolves them + * when the package is installed: publishing a consumer first would leave a + * window where its own tree cannot be assembled. + */ +const INSTALL_SECTIONS = ['dependencies', 'optionalDependencies'] as const + +/** + * Peer declarations also order the publication, but they cannot constrain it. + * npm never installs a peer on the package's behalf — an unmet peer is a + * warning, not a resolution failure — and sibling packages legitimately declare + * each other as peers, which makes these edges the ones that close cycles. They + * order what they can and are dropped where they would deadlock. + */ +const PEER_SECTIONS = ['peerDependencies'] as const /** The workspace root manifest, which is never a release member. */ const WORKSPACE_ROOT_PACKAGE = '@deepseek-ai/dsh-root' @@ -107,45 +120,93 @@ export abstract class ReleaseFamily { } /** - * Order members so every package publishes after the family members it depends on. + * Order members so every package publishes after the family members it + * depends on, which is what makes a partial publication self-consistent: an + * interrupted run leaves a prefix whose packages never point at something + * absent from the registry. + * + * Install edges are honoured absolutely — a cycle among them is a defect this + * reports rather than works around. Peer edges order what they can and are + * dropped where honouring one would deadlock: sibling packages declare each + * other as peers, and npm treats an unmet peer as a warning rather than a + * resolution failure ([rationale](../../.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md)). * @param members - this family's members. * @returns The same members in publish order; ties break by name for determinism. */ publishOrder(members: readonly ReleaseMember[]): ReleaseMember[] { const byName = new Map(members.map(member => [member.name, member])) - const ordered: ReleaseMember[] = [] - const placed = new Set() - const visiting = new Set() + const byNameSorted = [...members].sort((left, right) => left.name.localeCompare(right.name)) + const edges = (member: ReleaseMember, sections: readonly string[]): ReleaseMember[] => + this.orderEdges(member, byName, sections) - const visit = (member: ReleaseMember, path: readonly string[]): void => { - if (placed.has(member.name)) return - if (visiting.has(member.name)) { + // Install edges alone must be acyclic, and that is checked on its own graph: + // a peer edge leading into an install edge would otherwise read as a cycle + // where the install edges are perfectly orderable. + const installVisiting = new Set() + const installDone = new Set() + const checkInstall = (member: ReleaseMember, path: readonly string[]): void => { + if (installDone.has(member.name)) return + if (installVisiting.has(member.name)) { throw new Error(`dependency cycle in release family ${this.id}: ${[...path, member.name].join(' -> ')}`) } - visiting.add(member.name) - for (const dependency of this.orderEdges(member, byName)) { - visit(dependency, [...path, member.name]) + installVisiting.add(member.name) + for (const dependency of edges(member, INSTALL_SECTIONS)) checkInstall(dependency, [...path, member.name]) + installVisiting.delete(member.name) + installDone.add(member.name) + } + for (const member of byNameSorted) checkInstall(member, []) + + // Emit the order over both kinds of edge. A node already on the stack is a + // cycle only peer edges can form, and skipping it drops just that edge. + const ordered: ReleaseMember[] = [] + const placed = new Set() + const onStack = new Set() + // Members reachable from one member through install edges. A peer edge is + // dropped when the peer installs the member declaring it: honouring it would + // emit a package before something it installs, and the install edge wins. + const installClosure = (member: ReleaseMember): Set => { + const reached = new Set() + const walk = (current: ReleaseMember): void => { + for (const dependency of edges(current, INSTALL_SECTIONS)) { + if (reached.has(dependency.name)) continue + reached.add(dependency.name) + walk(dependency) + } } - visiting.delete(member.name) + walk(member) + return reached + } + const visit = (member: ReleaseMember): void => { + if (placed.has(member.name) || onStack.has(member.name)) return + onStack.add(member.name) + for (const dependency of edges(member, INSTALL_SECTIONS)) visit(dependency) + for (const peer of edges(member, PEER_SECTIONS)) { + if (installClosure(peer).has(member.name)) continue + visit(peer) + } + onStack.delete(member.name) + if (placed.has(member.name)) return placed.add(member.name) ordered.push(member) } - - for (const member of [...members].sort((left, right) => left.name.localeCompare(right.name))) { - visit(member, []) - } + for (const member of byNameSorted) visit(member) return ordered } /** - * The family members one member depends on at runtime. + * The family members one member declares in the given sections. * @param member - the dependent member. * @param byName - every family member by package name. - * @returns Dependencies inside this family, sorted by name. + * @param sections - manifest sections to read. + * @returns Members of this family named there, sorted by name. */ - private orderEdges(member: ReleaseMember, byName: ReadonlyMap): ReleaseMember[] { + private orderEdges( + member: ReleaseMember, + byName: ReadonlyMap, + sections: readonly string[], + ): ReleaseMember[] { const edges: ReleaseMember[] = [] - for (const section of ORDER_SECTIONS) { + for (const section of sections) { const dependencies = member.manifest[section] if (dependencies === null || typeof dependencies !== 'object' || Array.isArray(dependencies)) continue for (const name of Object.keys(dependencies)) { diff --git a/scripts/release/verify.ts b/scripts/release/verify.ts index 1bd74c84d6..bd906bcc9e 100644 --- a/scripts/release/verify.ts +++ b/scripts/release/verify.ts @@ -55,6 +55,15 @@ function main(): void { const family = releaseFamily(values.family) const members = family.members(process.cwd()) family.verifyVersions(members) + // Resolve the publish order here, before the build: an install-edge cycle + // makes the order unrepresentable, and that has to surface at the first gate + // rather than when pack is already writing tarballs. + const ordered = family.publishOrder(members) + if (ordered.length !== members.length) { + throw new Error( + `release family ${family.id}: publish order covers ${String(ordered.length)} of ${String(members.length)} members`, + ) + } const publishing = process.env.RELEASE_PUBLISH === 'true' if (publishing) { @@ -64,7 +73,7 @@ function main(): void { const versions = [...new Set(members.map(member => member.version))] const summary = versions.length === 1 ? versions[0] : `${String(versions.length)} versions` - console.log(`release verify: family ${family.id}, ${String(members.length)} member(s), ${summary}${publishing ? ', publish gates passed' : ''}`) + console.log(`release verify: family ${family.id}, ${String(members.length)} member(s), ${summary}, publish order resolved${publishing ? ', publish gates passed' : ''}`) } if (isEntry(import.meta.url)) main() From 70eb76eaecb73b3cd953ce9b4fcbbf78d1f6cc6d Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 11:27:14 +0800 Subject: [PATCH 091/103] fix(release): keep npm's own output in the publish log Retry classification needs npm's failure text, so the publish call captured its streams instead of inheriting them. That silenced npm on the success path: the log lost the tarball contents, the notices, and the '+ name@version' confirmation for every package. Pipe the streams and echo them, so the log shows what npm reported and the caller still gets the text it classifies. The registry probe behind it keeps its streams captured, since its JSON and its E404 are internal queries rather than progress. --- scripts/release/process.ts | 26 ++++++++++++++++++++++++++ scripts/release/publish.ts | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/scripts/release/process.ts b/scripts/release/process.ts index 746f24ac36..acec98feae 100644 --- a/scripts/release/process.ts +++ b/scripts/release/process.ts @@ -38,6 +38,32 @@ export function attempt(command: string, args: readonly string[], options: RunOp return { status: result.status, stdout: result.stdout, stderr: result.stderr } } +/** + * Run a command, letting its output reach the log while also returning it. + * + * A step that both shows progress and classifies its own failure needs both: the + * output has to appear in the workflow log as the command produces it, and the + * caller has to read it to decide whether a failure is worth retrying. + * @param command - executable name. + * @param args - command arguments. + * @param options - working directory and environment. + * @returns The exit status and captured streams. + */ +export function attemptStreaming(command: string, args: readonly string[], options: RunOptions = {}): CommandResult { + const result = spawnSync(command, [...args], { + cwd: options.cwd, + env: options.env, + encoding: 'utf8', + // 'inherit' would leave nothing to capture, so the streams are piped and + // echoed instead. + stdio: ['inherit', 'pipe', 'pipe'], + }) + if (result.error !== undefined) throw result.error + if (result.stdout !== '') process.stdout.write(result.stdout) + if (result.stderr !== '') process.stderr.write(result.stderr) + return { status: result.status, stdout: result.stdout, stderr: result.stderr } +} + /** * Run a command, capture its standard output, and fail on a non-zero exit. * @param command - executable name. diff --git a/scripts/release/publish.ts b/scripts/release/publish.ts index 11ad01173c..f861da18c2 100644 --- a/scripts/release/publish.ts +++ b/scripts/release/publish.ts @@ -18,7 +18,7 @@ import { join, resolve } from 'node:path' import { setTimeout as sleep } from 'node:timers/promises' import { parseArgs } from 'node:util' import { releaseFamily } from './families.ts' -import { attempt, isEntry } from './process.ts' +import { attempt, attemptStreaming, isEntry } from './process.ts' import { packedIdentity, readPublishOrder } from './tarball.ts' /** @@ -102,7 +102,7 @@ async function publishTarball(tarball: string, name: string, version: string): P // command-line flag could not serve both and would override the manifest // that does. Each packed manifest decides, and // check-workspace-constraints holds every manifest to its sequence's level. - const result = attempt('npm', ['publish', tarball, ...tagArgs]) + const result = attemptStreaming('npm', ['publish', tarball, ...tagArgs]) const output = `${result.stdout}${result.stderr}` if (result.status === 0) return From 9fa0575ccc05970974a4cdbb29b096fc70848cba Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:38:35 +0800 Subject: [PATCH 092/103] fix(release): print the publish order and the peer edges it drops The verify step resolved the publish order and said only that it had: the order a release actually follows, and the ordering it could not honour, stayed invisible until a publication was already running. publishOrder now returns that order together with the peer edges it dropped, verify prints both, and pack reads the order off the plan. The dropped edges are part of the result rather than a detail of forming it: the dsh family drops one (dsh-api-remotes -> dsh-api-gateway) and the vendored family drops two (cordis-plugin-include and cordis-plugin-loader, which cordis declares as peers in return), and only whoever reads the log can judge whether a newly dropped edge is expected. Because pack runs on every pull request and master push, a change to the order is now reviewable there rather than observable only at publish time. The order is also checked against the edges it exists to honour. A cycle mixing peer and dependency declarations can put a dependency on the traversal stack, where it is skipped like a peer edge, emitting a consumer before something it installs; no later step can detect that, and it would surface as an unresolvable install for a consumer of the published packages. No family has that shape today, and the new test pins the three-package case that would. --- ...2026-08-10-npm-release-sequences.i18n.yaml | 4 +- .../2026-08-10-npm-release-sequences.md | 4 +- .../2026-08-10-npm-release-sequences.zh.md | 4 +- scripts/release/families.spec.ts | 36 ++++++++++-- scripts/release/families.ts | 57 +++++++++++++++++-- scripts/release/pack.ts | 2 +- scripts/release/verify.ts | 41 +++++++++++-- 7 files changed, 126 insertions(+), 22 deletions(-) diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml index 59b51bbe6b..4b14d3b8aa 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-10-npm-release-sequences.md -2026-08-10-npm-release-sequences.md: e74a4ac8f2aadd8665ec0db198c6a317a0c201bc -2026-08-10-npm-release-sequences.zh.md: e152163976f945224f2524fccd7f831ba98e8161 +2026-08-10-npm-release-sequences.md: 2c46fb9b3e3fb8ddd90131e3c3113166580608d4 +2026-08-10-npm-release-sequences.zh.md: edbb2a8884f658b6c87ceb5762c01551a81a249d diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md index e74a4ac8f2..2c46fb9b3e 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md @@ -88,9 +88,9 @@ The entity in this domain is a **release family**: a set of packages sharing one |---|---| | `ReleaseFamily` | a family's identity: member discovery, version baseline, tag prefix, packed-payload rule, installed entry | | `ReleaseMember` | one publishable package: directory, name, version, manifest | -| `publishOrder` | topological order over runtime dependencies, ties broken by package name; a cycle is reported rather than resolved arbitrarily | +| `publishOrder` | topological order over the sections npm installs plus peer declarations, ties broken by package name; a cycle among installed dependencies is reported rather than resolved arbitrarily, and a peer edge no order can honour is dropped and named | | `pack` | packs a whole family into one directory and records the upload order | -| `verify` | the family's version baseline, and — when publishing — that the run comes from that family's tag and its members are publishable | +| `verify` | the family's version baseline, the publish order it prints in full, and — when publishing — that the run comes from that family's tag and its members are publishable | | `verify-packed-install` | installs the tarballs of one or more pack directories into a throwaway consumer and drives the installed executable | | `publish` | the three registry states above | | `process` / `tarball` | the one home for spawning commands and for reading a packed tarball, including the entry guard that keeps every script importable | diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md index e152163976..edbb2a8884 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md @@ -88,9 +88,9 @@ registry 的两个行为决定了「怎么尝试一次发布」。写入之间 |---|---| | `ReleaseFamily` | 一族的身份:成员发现、版本基线、tag 前缀、打包 payload 规则、已安装入口 | | `ReleaseMember` | 一个可发布包:目录、包名、版本、manifest | -| `publishOrder` | 按运行时依赖的拓扑序,同层按包名排;遇到环是报错而不是随意定序 | +| `publishOrder` | 按 npm 会安装的依赖段加 peer 声明做拓扑序,同层按包名排;安装依赖成环是报错而不是随意定序,任何排不进去的 peer 边被丢弃并点名 | | `pack` | 把整族打进一个目录并记录上传顺序 | -| `verify` | 族的版本基线;发布时还要求本次运行来自该族的 tag、且成员可发布 | +| `verify` | 族的版本基线、完整打印出来的发布顺序;发布时还要求本次运行来自该族的 tag、且成员可发布 | | `verify-packed-install` | 把一个或多个 pack 目录的 tarball 装进一次性 consumer,并驱动已安装的可执行入口 | | `publish` | 上面那三态 | | `process` / `tarball` | 启动命令、读取打包 tarball 的唯一正家,其中的入口守卫让每个脚本都可被 import | diff --git a/scripts/release/families.spec.ts b/scripts/release/families.spec.ts index 2c872d4487..66c3daf83f 100644 --- a/scripts/release/families.spec.ts +++ b/scripts/release/families.spec.ts @@ -57,7 +57,7 @@ describe('release families', () => { member('packages/a/zebra', '@deepseek-ai/dsh-zebra'), ] - expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + expect(dsh.publishOrder(members).order.map(entry => entry.name)).toEqual([ '@deepseek-ai/dsh-library', '@deepseek-ai/dsh-consumer', '@deepseek-ai/dsh-zebra', @@ -82,13 +82,13 @@ describe('release families', () => { ] // Name order alone would place the consumer first; the peer edge moves it. - expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + expect(dsh.publishOrder(members).order.map(entry => entry.name)).toEqual([ '@deepseek-ai/dsh-zebra', '@deepseek-ai/dsh-consumer', ]) }) - it('orders around a peer cycle rather than refusing to publish', () => { + it('orders around a peer cycle rather than refusing to publish, and reports the edge it dropped', () => { const dsh = releaseFamily('dsh') const members = [ member('packages/a/left', '@deepseek-ai/dsh-left', { peerDependencies: { '@deepseek-ai/dsh-right': 'workspace:^' } }), @@ -97,10 +97,15 @@ describe('release families', () => { // Sibling packages declare each other as peers, and npm treats an unmet peer // as a warning, so this pair has to publish rather than fail the release. - expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + const plan = dsh.publishOrder(members) + expect(plan.order.map(entry => entry.name)).toEqual([ '@deepseek-ai/dsh-right', '@deepseek-ai/dsh-left', ]) + // One of the two edges has to give, and which one it is belongs in the log. + expect(plan.droppedPeerEdges).toEqual([ + { consumer: '@deepseek-ai/dsh-right', peer: '@deepseek-ai/dsh-left' }, + ]) }) it('honours an install edge even when a peer cycle surrounds it', () => { @@ -115,10 +120,29 @@ describe('release families', () => { // The install edge is absolute: base publishes first, and the peer edge that // would reverse it is the one dropped. - expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + const plan = dsh.publishOrder(members) + expect(plan.order.map(entry => entry.name)).toEqual([ '@deepseek-ai/dsh-base', '@deepseek-ai/dsh-consumer', ]) + expect(plan.droppedPeerEdges).toEqual([ + { consumer: '@deepseek-ai/dsh-base', peer: '@deepseek-ai/dsh-consumer' }, + ]) + }) + + it('refuses an order that would publish a consumer before a dependency it installs', () => { + const dsh = releaseFamily('dsh') + const members = [ + member('packages/a/alpha', '@deepseek-ai/dsh-alpha', { peerDependencies: { '@deepseek-ai/dsh-bravo': 'workspace:^' } }), + member('packages/a/bravo', '@deepseek-ai/dsh-bravo', { peerDependencies: { '@deepseek-ai/dsh-charlie': 'workspace:^' } }), + member('packages/a/charlie', '@deepseek-ai/dsh-charlie', { dependencies: { '@deepseek-ai/dsh-alpha': 'workspace:^' } }), + ] + + // A cycle of two peer edges closed by one install edge: dropping a peer edge + // would order this, and the traversal drops the install edge instead. That + // order would publish charlie before the alpha it installs, so it is refused + // here rather than published. + expect(() => { dsh.publishOrder(members) }).toThrow(/no publish order honours @deepseek-ai\/dsh-charlie -> @deepseek-ai\/dsh-alpha/) }) it('ignores devDependencies when ordering', () => { @@ -130,7 +154,7 @@ describe('release families', () => { // A dev dependency is absent from the published package, so it must not move // the consumer behind it. - expect(dsh.publishOrder(members).map(entry => entry.name)).toEqual([ + expect(dsh.publishOrder(members).order.map(entry => entry.name)).toEqual([ '@deepseek-ai/dsh-alpha', '@deepseek-ai/dsh-zebra', ]) diff --git a/scripts/release/families.ts b/scripts/release/families.ts index 2135920047..09acbe2da9 100644 --- a/scripts/release/families.ts +++ b/scripts/release/families.ts @@ -32,6 +32,28 @@ const PEER_SECTIONS = ['peerDependencies'] as const /** The workspace root manifest, which is never a release member. */ const WORKSPACE_ROOT_PACKAGE = '@deepseek-ai/dsh-root' +/** One peer declaration the publish order leaves unordered. */ +interface DroppedPeerEdge { + /** Package declaring the peer. */ + readonly consumer: string + /** The declared peer, which publishes after `consumer` or alongside it in a cycle. */ + readonly peer: string +} + +/** + * A family's publish order together with the ordering it could not honour. + * + * The dropped edges are part of the result rather than a detail of forming it: + * a release drops real ordering constraints, and the operator reading the pack + * log is the only one who can judge whether a newly dropped edge is expected. + */ +export interface PublishPlan { + /** Members in publish order. */ + readonly order: readonly ReleaseMember[] + /** Peer declarations left unordered, in the order the traversal reached them. */ + readonly droppedPeerEdges: readonly DroppedPeerEdge[] +} + /** One publishable package of a release family. */ export interface ReleaseMember { /** Repository-relative package directory, for example `packages/core/session`. */ @@ -130,10 +152,12 @@ export abstract class ReleaseFamily { * dropped where honouring one would deadlock: sibling packages declare each * other as peers, and npm treats an unmet peer as a warning rather than a * resolution failure ([rationale](../../.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md)). + * Every dropped edge is reported, because dropping one is a decision about a + * real release rather than an implementation detail. * @param members - this family's members. - * @returns The same members in publish order; ties break by name for determinism. + * @returns The order, ties broken by name for determinism, and the peer edges it left unordered. */ - publishOrder(members: readonly ReleaseMember[]): ReleaseMember[] { + publishOrder(members: readonly ReleaseMember[]): PublishPlan { const byName = new Map(members.map(member => [member.name, member])) const byNameSorted = [...members].sort((left, right) => left.name.localeCompare(right.name)) const edges = (member: ReleaseMember, sections: readonly string[]): ReleaseMember[] => @@ -159,6 +183,7 @@ export abstract class ReleaseFamily { // Emit the order over both kinds of edge. A node already on the stack is a // cycle only peer edges can form, and skipping it drops just that edge. const ordered: ReleaseMember[] = [] + const droppedPeerEdges: DroppedPeerEdge[] = [] const placed = new Set() const onStack = new Set() // Members reachable from one member through install edges. A peer edge is @@ -181,7 +206,13 @@ export abstract class ReleaseFamily { onStack.add(member.name) for (const dependency of edges(member, INSTALL_SECTIONS)) visit(dependency) for (const peer of edges(member, PEER_SECTIONS)) { - if (installClosure(peer).has(member.name)) continue + if (installClosure(peer).has(member.name)) { + droppedPeerEdges.push({ consumer: member.name, peer: peer.name }) + continue + } + // A peer already on the stack is an ancestor, so it publishes after this + // member rather than before it: the edge is dropped, not honoured. + if (onStack.has(peer.name)) droppedPeerEdges.push({ consumer: member.name, peer: peer.name }) visit(peer) } onStack.delete(member.name) @@ -190,7 +221,25 @@ export abstract class ReleaseFamily { ordered.push(member) } for (const member of byNameSorted) visit(member) - return ordered + + // A cycle mixing both kinds of edge can put an install edge's target on the + // stack, where the traversal skips it like a peer edge and emits a consumer + // before something it installs. Nothing downstream can detect that, and it + // would only surface as an unresolvable install for whoever consumes the + // published packages, so the emitted order is checked against the edges it + // exists to honour. + const position = new Map(ordered.map((entry, index) => [entry.name, index])) + for (const [index, member] of ordered.entries()) { + for (const dependency of edges(member, INSTALL_SECTIONS)) { + const dependencyIndex = position.get(dependency.name) + if (dependencyIndex !== undefined && dependencyIndex < index) continue + throw new Error( + `release family ${this.id}: no publish order honours ${member.name} -> ${dependency.name};` + + ' a cycle mixing peer and dependency declarations reaches this dependency through a peer edge', + ) + } + } + return { order: ordered, droppedPeerEdges } } /** diff --git a/scripts/release/pack.ts b/scripts/release/pack.ts index 47a33a26ac..5d2b9b4e64 100644 --- a/scripts/release/pack.ts +++ b/scripts/release/pack.ts @@ -45,7 +45,7 @@ function main(): void { const family = releaseFamily(values.family) const root = process.cwd() const destination = resolve(root, values.out ?? DEFAULT_OUTPUT) - const members = family.publishOrder(family.members(root)) + const members = family.publishOrder(family.members(root)).order family.verifyVersions(members) rmSync(destination, { recursive: true, force: true }) diff --git a/scripts/release/verify.ts b/scripts/release/verify.ts index bd906bcc9e..5829087f97 100644 --- a/scripts/release/verify.ts +++ b/scripts/release/verify.ts @@ -9,7 +9,33 @@ import { parseArgs } from 'node:util' import { isEntry } from './process.ts' -import { releaseFamily, type ReleaseFamily, type ReleaseMember } from './families.ts' +import { releaseFamily, type PublishPlan, type ReleaseFamily, type ReleaseMember } from './families.ts' + +/** + * Print the publish order the release will follow, and the peer declarations it + * leaves unordered. + * + * The order is the release's own plan: an interrupted publication leaves exactly + * a prefix of it, so reading it is how anyone judges what a partial run left on + * the registry, and printing it on every pull request is what makes a change to + * the order reviewable rather than only observable during a publication. + * @param family - the release family. + * @param plan - the resolved order and its dropped edges. + */ +function reportPublishOrder(family: ReleaseFamily, plan: PublishPlan): void { + console.log(`release verify: publish order for family ${family.id}, ${String(plan.order.length)} member(s):`) + const width = String(plan.order.length).length + for (const [index, member] of plan.order.entries()) { + console.log(` ${String(index + 1).padStart(width, ' ')} ${member.name}@${member.version}`) + } + if (plan.droppedPeerEdges.length === 0) return + console.log( + `release verify: ${String(plan.droppedPeerEdges.length)} peer declaration(s) publish unordered,` + + ' because the peer cannot precede the package declaring it without contradicting a dependency edge' + + ' or its own cycle. npm treats an unmet peer as a warning, so this orders nothing and blocks nothing:', + ) + for (const edge of plan.droppedPeerEdges) console.log(` ${edge.consumer} -> ${edge.peer}`) +} /** * Assert every member may be published: npm refuses a `private` package. @@ -58,12 +84,13 @@ function main(): void { // Resolve the publish order here, before the build: an install-edge cycle // makes the order unrepresentable, and that has to surface at the first gate // rather than when pack is already writing tarballs. - const ordered = family.publishOrder(members) - if (ordered.length !== members.length) { + const plan = family.publishOrder(members) + if (plan.order.length !== members.length) { throw new Error( - `release family ${family.id}: publish order covers ${String(ordered.length)} of ${String(members.length)} members`, + `release family ${family.id}: publish order covers ${String(plan.order.length)} of ${String(members.length)} members`, ) } + reportPublishOrder(family, plan) const publishing = process.env.RELEASE_PUBLISH === 'true' if (publishing) { @@ -73,7 +100,11 @@ function main(): void { const versions = [...new Set(members.map(member => member.version))] const summary = versions.length === 1 ? versions[0] : `${String(versions.length)} versions` - console.log(`release verify: family ${family.id}, ${String(members.length)} member(s), ${summary}, publish order resolved${publishing ? ', publish gates passed' : ''}`) + console.log( + `release verify: family ${family.id}, ${String(members.length)} member(s), ${summary},` + + ` publish order resolved, ${String(plan.droppedPeerEdges.length)} peer declaration(s) unordered` + + (publishing ? ', publish gates passed' : ''), + ) } if (isEntry(import.meta.url)) main() From 7b973e27c807b4e4ece13329e74a5390d091d45e Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:08:01 +0800 Subject: [PATCH 093/103] feat(release): reject a module-scope load of an optional dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A dependency in optionalDependencies, or a peer carrying peerDependenciesMeta..optional, may be absent from an installed tree — that absence is the whole promise of "optional". A static import is evaluated when the importing module loads, so one absent package stops being "this capability is unavailable" and becomes a load failure for everything that reaches the importing module. Nothing checked it, and nothing here could: the failure needs an installed tree missing that package, and a workspace install always has every package, so the unit tests, the snapshots, and the packed-install probe all pass while the published package is broken for the consumer who declined the optional peer. verify-optional-dependency-imports reads each package's own manifest for what it allows to be absent, then scans the files that ship across both compiler faces. Value-versus-type is decided against a bound Program rather than the import syntax, because verbatimModuleSyntax is off: the compiler already erases an import whose bindings resolve to types, so a syntactic rule would report four forms that emit nothing. Only the type phase erases an import — `import defer` still resolves and links its module, deferring evaluation alone — which is what phaseModifier expresses and the deprecated isTypeOnly cannot. A violation names the package, the declaration that made it optional, and the way out in order: import it as a type, or restructure so module scope does not need it. A dynamic import() only moves the failure to first use, so the gate does not offer it as the remedy. The gate runs in ci-static and ci-primary through ciSharedStaticGates and locally in hygiene; it needs no build. TypeScriptProject gained a face parameter so a repository-wide gate can seed the client aggregate, which was previously unreachable; the constraint it was built with is unchanged, a face config and never the root solution. The tree has no violation today, so this guards the rule rather than fixing a defect. The spec pins all seven import forms against what tsc emits, including the four a syntactic rule would misreport. --- ...2026-08-10-npm-release-sequences.i18n.yaml | 4 +- .../2026-08-10-npm-release-sequences.md | 8 + .../2026-08-10-npm-release-sequences.zh.md | 8 + package.json | 3 +- scripts/run-gates.ts | 6 + scripts/ts-project.ts | 20 +- ...verify-optional-dependency-imports.spec.ts | 130 +++++++++++ scripts/verify-optional-dependency-imports.ts | 214 ++++++++++++++++++ 8 files changed, 385 insertions(+), 8 deletions(-) create mode 100644 scripts/verify-optional-dependency-imports.spec.ts create mode 100644 scripts/verify-optional-dependency-imports.ts diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml index 4b14d3b8aa..851f0e9d2d 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-10-npm-release-sequences.md -2026-08-10-npm-release-sequences.md: 2c46fb9b3e3fb8ddd90131e3c3113166580608d4 -2026-08-10-npm-release-sequences.zh.md: edbb2a8884f658b6c87ceb5762c01551a81a249d +2026-08-10-npm-release-sequences.md: d8495f158482d5d6e06a1752a096d1e9200b6070 +2026-08-10-npm-release-sequences.zh.md: 24b466f6b7b10d31ac2e025da6e12ec3c91c7548 diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md index 2c46fb9b3e..d8495f1584 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md @@ -80,6 +80,14 @@ Every reference to a workspace member uses `workspace:^`, so `pnpm pack` substit `scripts/check-workspace-constraints.ts` requires the protocol, so a new package cannot reintroduce a hand-written range; the invariant-companion rule requires `workspace:^` for `@deepseek-ai/dsh-invariants` for the same reason. +### An optional dependency is never loaded at module scope + +A dependency in `optionalDependencies`, or a peer carrying `peerDependenciesMeta..optional`, may be absent from an installed tree — that absence is the whole promise of "optional". A static import is evaluated when the importing module loads, so one absent package stops being "this capability is unavailable" and becomes a load failure for everything that reaches the importing module. The failure appears only in an installed tree missing that package, and no test here constructs one: a workspace install always has every package, so the unit tests, the snapshots, and the packed-install probe all pass while the published package is broken for the consumer who declined the optional peer. + +[`verify-optional-dependency-imports`](../../../../scripts/verify-optional-dependency-imports.ts) closes that hole. It reads each package's own manifest for what that package allows to be absent, then scans the files that ship — `packages/*/*/src/` and `apps/*/src/` — across both compiler faces. `vendor/` is out of scope, as pinned upstream source under the [vendoring policy](../../../../vendor/README.md). Value-versus-type is decided against a bound Program rather than the import syntax, because `verbatimModuleSyntax` is off: the compiler already erases an import whose bindings resolve to types, so `import type {}`, `import {}`, an inline `type` specifier, and a named binding that resolves to a type all emit nothing and are allowed, while a bare import, a value binding, and a star re-export are kept and rejected. Only the type phase erases an import: `import defer` still resolves and links its module, deferring evaluation alone, so the gate counts it as a load. + +A violation names the package, the declaration that made it optional, and the way out in order — import it as a type, which is all that declaration merging needs, or restructure so module scope does not need the package. A dynamic `import()` only moves the failure to first use, so it belongs to a caller that genuinely requires the package and handles its absence; reaching for it is a sign the dependency is not optional, and the gate does not offer it as the remedy. + ### Release family objects The entity in this domain is a **release family**: a set of packages sharing one version baseline and tag naming that publishes as a unit. Adding a family means adding a subclass and a workflow lane, not changing the core. diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md index edbb2a8884..24b466f6b7 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md @@ -80,6 +80,14 @@ registry 的两个行为决定了「怎么尝试一次发布」。写入之间 `scripts/check-workspace-constraints.ts` 要求这个协议,所以新包无法再引入硬写的范围;同理,invariant companion 规则要求 `@deepseek-ai/dsh-invariants` 用 `workspace:^`。 +### optional 依赖绝不在模块作用域被加载 + +`optionalDependencies` 里的依赖,或带 `peerDependenciesMeta..optional` 的 peer,在安装出来的树里可以不存在——这份「可以不存在」正是 optional 的全部承诺。而静态 import 在引入方模块加载时就求值,于是一个缺失的包不再表现为「这个能力不可用」,而是变成所有能走到该模块的代码的加载失败。这种失败只在「缺了该包的安装树」里出现,而本仓没有任何测试构造这种树:workspace 安装总是把每个包都装上,所以单测、快照、打包安装探针全都会过,而那个拒绝了这个 optional peer 的消费者拿到的却是坏的包。 + +[`verify-optional-dependency-imports`](../../../../scripts/verify-optional-dependency-imports.ts) 堵掉这个洞。它从每个包自己的 manifest 读取「这个包允许谁缺失」,再扫描会发布出去的文件——`packages/*/*/src/` 与 `apps/*/src/`——且两个编译门面各扫一遍。`vendor/` 不在范围内,那是[受 vendoring 政策管辖](../../../../vendor/README.md)的固定上游源码。值与类型的判定对着绑定好的 Program 做,而不是看 import 写法,因为 `verbatimModuleSyntax` 是关的:编译器本来就会消除绑定解析为类型的 import,所以 `import type {}`、`import {}`、内联 `type` 说明符、以及解析为类型的具名绑定都不产生产物、一律放行,而裸 import、值绑定、星号 re-export 会被保留、一律报错。只有 type 相位会消除 import:`import defer` 仍然解析并链接它的模块,只推迟求值,所以门禁把它算作一次加载。 + +报错会点名这个包、点名是哪条声明把它标成 optional 的,并按顺序给出出路——把它作为类型引入(声明合并需要的仅此而已),或者调整写法让模块作用域不再需要这个包。动态 `import()` 只是把失败推迟到首次使用,它属于那种确实需要这个包、并且自己处理缺失的调用方;会想到它,往往说明这个依赖并不 optional,所以门禁不把它作为解法给出。 + ### 发布族对象 这个领域里的实体是**发布族**:一组共享版本基线与 tag 命名、可整体发布的包。新增一族等于加一个子类和一条 workflow lane,不改核心。 diff --git a/package.json b/package.json index 1fd63bae9a..517d0c56d1 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,7 @@ "website:build": "pnpm run docs:build", "verify-package-readme-limitations": "tsx scripts/verify-package-readme-limitations.ts", "verify-node-next-types": "tsx scripts/verify-node-next-types.ts", + "verify-optional-dependency-imports": "tsx scripts/verify-optional-dependency-imports.ts", "verify-runtime-closure": "tsx scripts/verify-runtime-closure.ts", "verify-vendored-links": "tsx scripts/verify-vendored-links.ts", "verify-cordis-config": "tsx scripts/verify-cordis-config.ts", @@ -125,7 +126,7 @@ "verify-module-graph": "tsx scripts/gen-module-graph.ts --check", "constraints": "tsx scripts/check-workspace-constraints.ts", "doc-sync": "tsx scripts/run-gates.ts doc-sync", - "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", + "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-optional-dependency-imports && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", "publish:npm-baseline": "tsx scripts/publish-npm-baseline.ts", "release:dsh": "tsx scripts/release/bump.ts --family dsh", "release:vendor": "tsx scripts/release/bump.ts --family vendor", diff --git a/scripts/run-gates.ts b/scripts/run-gates.ts index 27664fab5e..6b775c9bf1 100644 --- a/scripts/run-gates.ts +++ b/scripts/run-gates.ts @@ -249,6 +249,9 @@ function ciSharedStaticGates(): Gate[] { pnpmScript('dsh-package-licenses', 'verify-dsh-package-licenses', { label: 'DSH package licenses' }), pnpmScript('package-invariants', 'verify-package-invariants', { label: 'package invariants' }), pnpmScript('cordis-config', 'verify-cordis-config', { label: 'Cordis config' }), + pnpmScript('optional-dependency-imports', 'verify-optional-dependency-imports', { + label: 'optional dependency imports', + }), pnpmScript('issue-management', 'test:issue-management', { label: 'Issue management policy' }), ] } @@ -565,6 +568,9 @@ function hygieneLeafGates(options: { artifactNeeds?: string[] } = {}): Gate[] { label: 'node-next types', ...artifactOptions, }), + pnpmScript('optional-dependency-imports', 'verify-optional-dependency-imports', { + label: 'optional dependency imports', + }), ] } diff --git a/scripts/ts-project.ts b/scripts/ts-project.ts index 9a0400a39d..53b100ceb0 100644 --- a/scripts/ts-project.ts +++ b/scripts/ts-project.ts @@ -11,6 +11,12 @@ interface ProjectGraph { options: ts.CompilerOptions } +/** + * A compiler face: the two aggregates a repository-wide program may seed from. + * The root solution is never one of them. + */ +export type CompilerFace = 'host' | 'client' + /** TypeScript config host shared by repository scripts. */ export const repositoryConfigHost: ts.ParseConfigFileHost = { useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames, @@ -24,12 +30,12 @@ export const repositoryConfigHost: ts.ParseConfigFileHost = { } /** - * Parse the host aggregate tsconfig and flatten all referenced projects into one + * Parse one face aggregate tsconfig and flatten all referenced projects into one * semantic graph. Never seed the root solution: flattening host+client into one * program collides the cordis Context merges. */ -function loadProjectGraph(projectRoot: string): ProjectGraph { - const rootConfigPath = resolve(projectRoot, 'tsconfig.host.json') +function loadProjectGraph(projectRoot: string, face: CompilerFace): ProjectGraph { + const rootConfigPath = resolve(projectRoot, `tsconfig.${face}.json`) const rootConfig = parseConfig(rootConfigPath) const rootNames = new Set() const visited = new Set() @@ -81,8 +87,12 @@ export class TypeScriptProject { /** The checker shared by every semantic query in this project. */ readonly checker: ts.TypeChecker - constructor(private readonly projectRoot: string) { - const graph = loadProjectGraph(projectRoot) + /** + * @param projectRoot - repository root the program is seeded and reported from. + * @param face - which compiler face aggregate to flatten. + */ + constructor(readonly projectRoot: string, face: CompilerFace = 'host') { + const graph = loadProjectGraph(projectRoot, face) this.program = ts.createProgram(graph.rootNames, semanticCompilerOptions(graph.options)) this.checker = this.program.getTypeChecker() } diff --git a/scripts/verify-optional-dependency-imports.spec.ts b/scripts/verify-optional-dependency-imports.spec.ts new file mode 100644 index 0000000000..3bb857050f --- /dev/null +++ b/scripts/verify-optional-dependency-imports.spec.ts @@ -0,0 +1,130 @@ +/** + * Tests for the optional-dependency load gate: which import and re-export forms + * survive emit, and therefore load a package the installed tree may not carry. + * + * The expectations here match what `tsc` emits with `verbatimModuleSyntax` off: + * `import type`, `import {}`, an inline `type` specifier, and a named binding + * that resolves to a type all disappear; a bare import, a value binding, and a + * star re-export remain. + */ + +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { afterAll, describe, expect, it } from 'vitest' +import { TypeScriptProject } from './ts-project.ts' +import { collectOptionalImportViolations } from './verify-optional-dependency-imports.ts' + +const FIXTURE: Record = { + 'tsconfig.host.json': JSON.stringify({ + compilerOptions: { + target: 'es2022', + module: 'esnext', + moduleResolution: 'bundler', + noEmit: true, + skipLibCheck: true, + types: [], + paths: { + '@f/opt': ['./packages/f/opt/src/index.ts'], + '@f/hard': ['./packages/f/hard/src/index.ts'], + }, + }, + include: ['packages/**/*.ts'], + }), + + 'packages/f/opt/package.json': JSON.stringify({ name: '@f/opt', version: '0.0.1' }), + 'packages/f/opt/src/index.ts': [ + 'export interface Shape { a: number }', + 'export const runtimeValue = 1', + '', + ].join('\n'), + + 'packages/f/hard/package.json': JSON.stringify({ name: '@f/hard', version: '0.0.1' }), + 'packages/f/hard/src/index.ts': 'export const hardValue = 2\n', + + // The consumer allows @f/opt to be absent and requires @f/hard. + 'packages/f/consumer/package.json': JSON.stringify({ + name: '@f/consumer', + version: '0.0.1', + dependencies: { '@f/hard': '*' }, + peerDependencies: { '@f/opt': '*' }, + peerDependenciesMeta: { '@f/opt': { optional: true } }, + }), + + // Elided by the compiler, so each of these is allowed. + 'packages/f/consumer/src/allowed-type-only.ts': [ + "import type {} from '@f/opt'", + 'export const a = 1', + '', + ].join('\n'), + 'packages/f/consumer/src/allowed-empty.ts': [ + "import {} from '@f/opt'", + 'export const b = 1', + '', + ].join('\n'), + 'packages/f/consumer/src/allowed-inline-type.ts': [ + "import { type Shape } from '@f/opt'", + 'export const c: Shape = { a: 1 }', + '', + ].join('\n'), + 'packages/f/consumer/src/allowed-type-binding.ts': [ + "import { Shape } from '@f/opt'", + 'export const d: Shape = { a: 1 }', + '', + ].join('\n'), + 'packages/f/consumer/src/allowed-type-reexport.ts': [ + "export type { Shape } from '@f/opt'", + '', + ].join('\n'), + // A hard dependency may be loaded at module scope; only optional ones may not. + 'packages/f/consumer/src/allowed-hard-dependency.ts': [ + "import { hardValue } from '@f/hard'", + 'export const e = hardValue', + '', + ].join('\n'), + + // Kept by the compiler, so each of these loads a package that may be absent. + 'packages/f/consumer/src/rejected-bare.ts': [ + "import '@f/opt'", + 'export const f = 1', + '', + ].join('\n'), + 'packages/f/consumer/src/rejected-value.ts': [ + "import { runtimeValue } from '@f/opt'", + 'export const g = runtimeValue', + '', + ].join('\n'), + 'packages/f/consumer/src/rejected-star-reexport.ts': [ + "export * from '@f/opt'", + '', + ].join('\n'), +} + +const root = mkdtempSync(join(tmpdir(), 'optional-imports-')) +for (const [rel, content] of Object.entries(FIXTURE)) { + mkdirSync(dirname(join(root, rel)), { recursive: true }) + writeFileSync(join(root, rel), content) +} +const violations = collectOptionalImportViolations(new TypeScriptProject(root)) + +afterAll(() => { + rmSync(root, { recursive: true, force: true }) +}) + +describe('optional dependency loads', () => { + it('reports every form the compiler keeps, and nothing else', () => { + expect(violations.map(violation => violation.split(' loads ')[0])).toEqual([ + 'packages/f/consumer/src/rejected-bare.ts:1', + 'packages/f/consumer/src/rejected-star-reexport.ts:1', + 'packages/f/consumer/src/rejected-value.ts:1', + ]) + }) + + it('names the package, the declaration that made it optional, and the way out', () => { + expect(violations[0]).toBe( + 'packages/f/consumer/src/rejected-bare.ts:1 loads @f/opt at module scope,' + + ' declared optional in peerDependenciesMeta; import it as a type,' + + ' or restructure so module scope does not need it', + ) + }) +}) diff --git a/scripts/verify-optional-dependency-imports.ts b/scripts/verify-optional-dependency-imports.ts new file mode 100644 index 0000000000..e7e16d7aab --- /dev/null +++ b/scripts/verify-optional-dependency-imports.ts @@ -0,0 +1,214 @@ +/** + * Reject a static value import of an optional dependency. + * + * A dependency declared in `optionalDependencies`, or as a peer carrying + * `peerDependenciesMeta..optional`, may be absent from an installed tree — + * that absence is what "optional" promises a consumer. A static import is + * evaluated when the importing module loads, so one absent package turns + * "this capability is unavailable" into a load failure for everything that + * reaches the importing module. + * + * The way out, in order: import it as a type, which emits nothing and is all + * that declaration merging needs; or restructure so nothing at module scope + * needs the package. A dynamic `import()` only moves the failure to first use, + * so it belongs to a caller that genuinely requires the package and handles its + * absence — it is a last resort, not the default answer, and reaching for it is + * a sign the dependency is not optional. + * + * Value-vs-type is decided against a bound Program rather than the import + * syntax, because `verbatimModuleSyntax` is off: a named import used only in + * type positions is elided and does not load anything. The decision is + * deliberately conservative in one direction — a value binding the compiler + * would elide because nothing references it in a value position is still + * reported, and the fix it asks for (`import type`, or dropping the binding) is + * what the published package wants regardless. Both compiler faces are scanned, + * and only files that ship — a published package's `src` — are subject. + */ + +import { existsSync, readFileSync } from 'node:fs' +import { resolve } from 'node:path' +import ts from 'typescript' +import { TypeScriptProject, type CompilerFace } from './ts-project.ts' + +const root = resolve(import.meta.dirname, '..') + +/** Directories whose `src` ships as a published package. */ +const PUBLISHED_SOURCE = /^(?:packages\/[^/]+\/[^/]+|apps\/[^/]+)\/src\// + +/** How a manifest marked a dependency optional, for the violation message. */ +type OptionalKind = 'optionalDependencies' | 'peerDependenciesMeta' + +/** + * The package name a module specifier resolves to. + * @param specifier - an import specifier, possibly a subpath. + * @returns The bare package name, keeping a leading scope. + */ +function packageOf(specifier: string): string { + const parts = specifier.split('/') + return specifier.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0] ?? specifier +} + +/** + * Read a manifest field as a record. + * @param manifest - parsed manifest. + * @param field - field name. + * @returns The field value, or an empty record. + */ +function record(manifest: Record, field: string): Record { + const value = manifest[field] + if (value === null || typeof value !== 'object' || Array.isArray(value)) return {} + return value as Record +} + +/** + * The dependencies one manifest allows to be absent. + * @param manifest - parsed manifest. + * @returns Each optional package name and how it was marked. + */ +function optionalDependencies(manifest: Record): Map { + const optional = new Map() + for (const name of Object.keys(record(manifest, 'optionalDependencies'))) { + optional.set(name, 'optionalDependencies') + } + const peers = record(manifest, 'peerDependencies') + for (const [name, meta] of Object.entries(record(manifest, 'peerDependenciesMeta'))) { + if (meta === null || typeof meta !== 'object') continue + if ((meta as Record).optional !== true) continue + // A meta entry for an undeclared peer is check-workspace-constraints' business. + if (!(name in peers)) continue + optional.set(name, 'peerDependenciesMeta') + } + return optional +} + +/** One package directory's optional dependencies, resolved once per directory. */ +const optionalByDirectory = new Map>() + +/** + * The optional dependencies of the package owning a source file. + * @param projectRoot - root the relative path is resolved against. + * @param relativePath - repository-relative path of a source file. + * @returns That package's optional dependencies, empty when it declares none. + */ +function optionalFor(projectRoot: string, relativePath: string): Map { + const directory = resolve(projectRoot, relativePath.slice(0, relativePath.indexOf('/src/'))) + const cached = optionalByDirectory.get(directory) + if (cached !== undefined) return cached + const manifestPath = resolve(directory, 'package.json') + const parsed: unknown = existsSync(manifestPath) ? JSON.parse(readFileSync(manifestPath, 'utf8')) : {} + const manifest = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed) + ? parsed as Record + : {} + const optional = optionalDependencies(manifest) + optionalByDirectory.set(directory, optional) + return optional +} + +/** + * Whether one binding of an import or re-export names a value. + * @param name - the local binding name node. + * @param checker - the program's checker. + * @returns True when the binding carries value meaning, and on an unresolved + * symbol, so an unresolvable binding fails closed. + */ +function bindsValue(name: ts.Identifier | ts.StringLiteral, checker: ts.TypeChecker): boolean { + const symbol = checker.getSymbolAtLocation(name) + if (symbol === undefined) return true + const target = (symbol.flags & ts.SymbolFlags.Alias) === 0 ? symbol : checker.getAliasedSymbol(symbol) + return (target.flags & ts.SymbolFlags.Value) !== 0 +} + +/** + * Whether an import declaration loads its module at run time. + * @param declaration - the import declaration. + * @param checker - the program's checker. + * @returns True when the emitted module keeps the import. + */ +function importLoadsModule(declaration: ts.ImportDeclaration, checker: ts.TypeChecker): boolean { + const clause = declaration.importClause + // A bare `import 'x'` is kept for its side effects. + if (clause === undefined) return true + // Only the type phase erases the import. `import defer` still resolves and + // links the module, deferring evaluation alone, so an absent package fails + // exactly as it would without the modifier. + if (clause.phaseModifier === ts.SyntaxKind.TypeKeyword) return false + if (clause.name !== undefined) return true + const bindings = clause.namedBindings + if (bindings === undefined || ts.isNamespaceImport(bindings)) return true + return bindings.elements.some(element => !element.isTypeOnly && bindsValue(element.name, checker)) +} + +/** + * Whether a re-export loads its module at run time. + * @param declaration - the export declaration, which carries a module specifier. + * @param checker - the program's checker. + * @returns True when the emitted module keeps the re-export. + */ +function exportLoadsModule(declaration: ts.ExportDeclaration, checker: ts.TypeChecker): boolean { + if (declaration.isTypeOnly) return false + const clause = declaration.exportClause + // `export * from 'x'` re-exports whatever values the module has. + if (clause === undefined || ts.isNamespaceExport(clause)) return true + return clause.elements.some(element => !element.isTypeOnly && bindsValue(element.name, checker)) +} + +/** + * Collect every static value import of an optional dependency in one face. + * @param project - a bound repository project. + * @returns One message per violation, sorted by location. + */ +export function collectOptionalImportViolations(project: TypeScriptProject): string[] { + const checker = project.checker + const violations: string[] = [] + for (const sourceFile of project.sourceFiles()) { + if (sourceFile.isDeclarationFile) continue + const relativePath = project.relativePath(sourceFile) + if (!PUBLISHED_SOURCE.test(relativePath)) continue + const optional = optionalFor(project.projectRoot, relativePath) + if (optional.size === 0) continue + + for (const statement of sourceFile.statements) { + const isImport = ts.isImportDeclaration(statement) + if (!isImport && !ts.isExportDeclaration(statement)) continue + const specifierNode = statement.moduleSpecifier + if (specifierNode === undefined || !ts.isStringLiteral(specifierNode)) continue + const kind = optional.get(packageOf(specifierNode.text)) + if (kind === undefined) continue + const loads = isImport + ? importLoadsModule(statement, checker) + : exportLoadsModule(statement, checker) + if (!loads) continue + const { line } = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile)) + violations.push( + `${relativePath}:${String(line + 1)} loads ${specifierNode.text} at module scope,` + + ` declared optional in ${kind}; import it as a type, or restructure so module scope does not need it`, + ) + } + } + return violations.sort((left, right) => left.localeCompare(right)) +} + +/** CLI entry: list every violation and exit 1, or confirm the invariant holds. */ +function main(): void { + const faces: readonly CompilerFace[] = ['host', 'client'] + const violations = new Set() + for (const face of faces) { + for (const violation of collectOptionalImportViolations(new TypeScriptProject(root, face))) { + violations.add(violation) + } + } + if (violations.size === 0) { + console.log('verify-optional-dependency-imports: no optional dependency is loaded at module scope.') + return + } + console.error(`verify-optional-dependency-imports: ${String(violations.size)} optional dependency load(s) at module scope:`) + for (const violation of [...violations].sort((left, right) => left.localeCompare(right))) { + console.error(` ${violation}`) + } + process.exit(1) +} + +// Run only when invoked as a script, not when imported by a test. +if (process.argv[1] && import.meta.filename === resolve(process.argv[1])) { + main() +} From 0e50fa290c6a21fb0e4f3b5fd3e4a7807ffcaae4 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:14:16 +0800 Subject: [PATCH 094/103] fix(release): state what the echo helper does, and drop two dead claims MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three corrections from review, none of which change behaviour. attemptStreaming promised output "as the command produces it", which spawnSync cannot do: it returns only after the child exits, and the two streams are echoed one after the other, so their interleaving is lost. For an npm publish that is visible — notices go to stderr while the `+ name@version` confirmation goes to stdout, so the confirmation prints first. The helper is now attemptEchoed and its contract says buffered, echoed after exit, stdout before stderr; live progress would need an asynchronous spawn with data listeners. The traversal comment claimed a node on the stack is a cycle only peer edges can form, and that skipping it drops just that edge. The cycle does carry a peer edge, because the install edges were proved acyclic a moment earlier, but the back edge that reaches the stacked node need not be the peer one — which is what the post-condition exists to catch, so the comment now points at it instead of asserting an invariant the traversal does not have. The `if (placed.has(member.name)) return` after leaving the stack was unreachable: a re-entrant visit returns at the top guard while the member is on the stack, so it can never be placed by the time the recursion unwinds. --- scripts/release/families.ts | 8 +++++--- scripts/release/process.ts | 18 +++++++++++++----- scripts/release/publish.ts | 4 ++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/scripts/release/families.ts b/scripts/release/families.ts index 09acbe2da9..f43939f17d 100644 --- a/scripts/release/families.ts +++ b/scripts/release/families.ts @@ -180,8 +180,11 @@ export abstract class ReleaseFamily { } for (const member of byNameSorted) checkInstall(member, []) - // Emit the order over both kinds of edge. A node already on the stack is a - // cycle only peer edges can form, and skipping it drops just that edge. + // Emit the order over both kinds of edge. A node already on the stack closes + // a cycle, and that cycle carries at least one peer edge because the install + // edges were just proved acyclic — but the back edge that reaches the stacked + // node is not necessarily the peer one, so the post-condition below decides + // whether the emitted order survived. const ordered: ReleaseMember[] = [] const droppedPeerEdges: DroppedPeerEdge[] = [] const placed = new Set() @@ -216,7 +219,6 @@ export abstract class ReleaseFamily { visit(peer) } onStack.delete(member.name) - if (placed.has(member.name)) return placed.add(member.name) ordered.push(member) } diff --git a/scripts/release/process.ts b/scripts/release/process.ts index acec98feae..392a6cab66 100644 --- a/scripts/release/process.ts +++ b/scripts/release/process.ts @@ -39,17 +39,25 @@ export function attempt(command: string, args: readonly string[], options: RunOp } /** - * Run a command, letting its output reach the log while also returning it. + * Run a command, capture its output, and echo it once the command exits. * - * A step that both shows progress and classifies its own failure needs both: the - * output has to appear in the workflow log as the command produces it, and the - * caller has to read it to decide whether a failure is worth retrying. + * A step that both shows what a command said and classifies its own failure + * needs both halves: the output has to reach the workflow log, and the caller has + * to read it to decide whether a failure is worth retrying. + * + * This is not live progress. `spawnSync` returns only after the child exits, so + * nothing appears while the command runs, and the two streams are echoed one + * after the other — all of stdout, then all of stderr — which loses their + * interleaving. For an npm publish that matters in one visible way: `npm notice` + * lines go to stderr while the `+ name@version` confirmation goes to stdout, so + * the log shows the confirmation first. Live progress would need an + * asynchronous spawn with data listeners. * @param command - executable name. * @param args - command arguments. * @param options - working directory and environment. * @returns The exit status and captured streams. */ -export function attemptStreaming(command: string, args: readonly string[], options: RunOptions = {}): CommandResult { +export function attemptEchoed(command: string, args: readonly string[], options: RunOptions = {}): CommandResult { const result = spawnSync(command, [...args], { cwd: options.cwd, env: options.env, diff --git a/scripts/release/publish.ts b/scripts/release/publish.ts index f861da18c2..6301241ed7 100644 --- a/scripts/release/publish.ts +++ b/scripts/release/publish.ts @@ -18,7 +18,7 @@ import { join, resolve } from 'node:path' import { setTimeout as sleep } from 'node:timers/promises' import { parseArgs } from 'node:util' import { releaseFamily } from './families.ts' -import { attempt, attemptStreaming, isEntry } from './process.ts' +import { attempt, attemptEchoed, isEntry } from './process.ts' import { packedIdentity, readPublishOrder } from './tarball.ts' /** @@ -102,7 +102,7 @@ async function publishTarball(tarball: string, name: string, version: string): P // command-line flag could not serve both and would override the manifest // that does. Each packed manifest decides, and // check-workspace-constraints holds every manifest to its sequence's level. - const result = attemptStreaming('npm', ['publish', tarball, ...tagArgs]) + const result = attemptEchoed('npm', ['publish', tarball, ...tagArgs]) const output = `${result.stdout}${result.stderr}` if (result.status === 0) return From d5be1d62c9e565399b44e07ac0caf4500a817439 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:19:02 +0800 Subject: [PATCH 095/103] feat(release): count publish progress against the whole release set A dsh publication uploads 221 packages one at a time, spaced apart, and the log gave no way to tell how far along a run was: every line named a package, none said where that package sat in the set. Each per-package line now carries [n/total]. Every entry in the order settles as either published or already present, so the counter is both "packages settled" and "position in the publish order", and the closing summary names the member count alongside the published and skipped totals. --- scripts/release/publish.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/scripts/release/publish.ts b/scripts/release/publish.ts index 6301241ed7..2590e96e52 100644 --- a/scripts/release/publish.ts +++ b/scripts/release/publish.ts @@ -136,9 +136,15 @@ async function main(): Promise { const family = releaseFamily(values.family) const directory = resolve(process.cwd(), values.from) + // Every entry in the order settles as either published or already present, so + // one counter answers "how far along is this run" for whoever is watching a + // release that takes minutes per family. + const order = readPublishOrder(directory) + const total = String(order.length) let published = 0 let skipped = 0 - for (const filename of readPublishOrder(directory)) { + for (const [index, filename] of order.entries()) { + const progress = `[${String(index + 1)}/${total}]` const tarball = join(directory, filename) const { name, version } = packedIdentity(tarball) const state = registryState(name, version) @@ -151,7 +157,7 @@ async function main(): Promise { + '\nBump the version, or investigate why the build is not reproducible.', ) } - console.log(`release publish: ${name}@${version} already published, skipping`) + console.log(`release publish: ${progress} ${name}@${version} already published, skipping`) skipped += 1 continue } @@ -159,11 +165,14 @@ async function main(): Promise { // only skips does not wait at all. if (published > 0) await sleep(PUBLISH_SPACING_MS) await publishTarball(tarball, name, version) - console.log(`release publish: ${name}@${version} published`) + console.log(`release publish: ${progress} ${name}@${version} published`) published += 1 } - console.log(`release publish: family ${family.id}, ${String(published)} published, ${String(skipped)} already present`) + console.log( + `release publish: family ${family.id}, ${total} member(s),` + + ` ${String(published)} published, ${String(skipped)} already present`, + ) } if (isEntry(import.meta.url)) await main() From 48d14b4a7cd8eaec7f8f0795cd8c069f98de98c4 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 20:17:50 +0800 Subject: [PATCH 096/103] docs(client): state where a browser-only dependency is declared Browser artifacts resolve nothing on a user's machine: tsdown inlines every non-platform specifier, the shell dist answers the rest from its frozen module table, and Vite inlines the shell's own imports into the published dist. Record the resulting declaration rule, and the Agent Note behind it. --- ...026-08-14-client-build-time-deps.i18n.yaml | 6 ++ .../2026-08-14-client-build-time-deps.md | 100 ++++++++++++++++++ .../2026-08-14-client-build-time-deps.zh.md | 100 ++++++++++++++++++ packages/client/AGENTS.md | 11 +- 4 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 .agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml create mode 100644 .agents/notes/proposed/process/2026-08-14-client-build-time-deps.md create mode 100644 .agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md diff --git a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml new file mode 100644 index 0000000000..4c98962ba9 --- /dev/null +++ b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/proposed/process/2026-08-14-client-build-time-deps.md +2026-08-14-client-build-time-deps.md: 0605225a70a16fed9004acfe26adba9b6166f201 +2026-08-14-client-build-time-deps.zh.md: 5caed3422288711532c40cd767f72c97693e68b4 diff --git a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.md b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.md new file mode 100644 index 0000000000..0605225a70 --- /dev/null +++ b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.md @@ -0,0 +1,100 @@ +# Agent Note: Client build-time dependencies stay out of the install face + +Status: proposed + +English | [中文](2026-08-14-client-build-time-deps.zh.md) + +## Problem + +A browser artifact resolves nothing on the user's machine: + +- A `ui-*` plugin package's browser artifact is `lib/client.js`, where tsdown inlines every non-platform specifier (`noExternal` in `packages/client/tsdown.client.ts`). The specifiers that survive are answered by the loader's frozen module table, because `require` inside that bundle is a parameter the loader injects, not Node's. +- Platform modules (`PLATFORM_MODULES`) come from the shell `dist`, never from Node resolution. +- The shell's own imports are inlined by Vite into `@deepseek-ai/dsh-web-frontend`'s published `dist`; that package ships `dist` alone and has no `.` export. + +Every browser code path is therefore a build product, served as an asset or baked into `dist`. Yet the packages those artifacts are built from — react, react-dom, shiki, katex, clsx, the micromark and mdast families — sit in `dependencies` and non-optional `peerDependencies`, which npm installs for every consumer of the published package. Across the repository that is 79 such external declarations in 38 packages, downloaded by users who never load them. + +## Proposal + +### The rule + +**An external package only a browser artifact reaches belongs in `devDependencies`.** Two deliberate omissions are as much part of the rule: + +- **External packages only.** A `@deepseek-ai/*` name stays where its manifest puts it. Such a declaration also states which package supplies an injected service, which Remote contribution an assembly mounts, or which Loader row must resolve; [verify-runtime-closure](../../../../scripts/verify-runtime-closure.ts) and the Loader read it, and the app installs the package regardless — so moving one removes meaning without removing a download. +- **Anything the node half reaches stays**, an erased type import included. + +Faces are walked from the entries a manifest publishes, not by a directory rule, so a module under `src/` that only the browser entry reaches counts as browser source: + +| kind | test | host face entries | +| --- | --- | --- | +| `bundle-half` | has a `./client` export | every export target except `./client` | +| `browser-library` | under `packages/client/` with no `./client` export | `src/invariant.ts` alone — the companion the host mounts; `.` is browser code | +| `prebuilt-dist` | no `.` export, ships a `dist` | none: the package offers Node no entry | + +### The gate: `scripts/verify-client-runtime-deps.ts` + +Wired into `pnpm run hygiene`, about 35 seconds — the cost of two bound Programs, the same order as `verify-optional-dependency-imports` in that lane. It reuses the repository's tooling rather than growing its own: `TypeScriptProject` (`scripts/ts-project.ts`) binds the host and client compiler faces separately (that file states why the two cannot share one program — the cordis Context merges collide), `ts.resolveModuleName` resolves relative specifiers, and the walk stops at the package boundary. + +Three findings decided the mechanism, after a first pass that scanned string literals: + +1. A package name must match as a name: the `react` substring inside `'@deepseek-ai/dsh-client-web-react'` silently swallowed react. +2. Whether `./client` is the tsdown browser bundle is keyed on the **artifact path** (`./lib/client.js`), not the subpath name — `dsh-goal` publishes `./client` as `./lib/types/client.js`, a plain tsc-emitted browser-shared module. +3. `require`, `require.resolve`, and dynamic `import()` on a literal each reach a package; `require.resolve('@deepseek-ai/dsh-web-frontend/dist/index.html')` is a real host resolution path. + +Two classes, both reported per entry: + +| class | count | test | +| --- | --- | --- | +| `browser` | 74 | only a browser artifact reaches it | +| `nothing` | 5 | no reference names it: `client-runtime`'s `react` (which contradicts its own React-free layering red line), the peer `react` of `ui-settings` and `ui-theme`, `ui-trajectory`'s peer `react-dom`, and `ui-primitives`' `@types/mdast` | + +Each conservative rule below answers a false report or a semantic loss observed while building it: + +- **A type reference from the node half keeps its declaration.** `import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'` in `src/invariant.ts` is erased at run time, yet it states which package supplies the service that companion registers — `verify-runtime-closure`'s relation. +- **A package publishing a Node entry with no source counterpart is skipped whole, and named in the output.** `dsh-goal`'s `./typert -> ./lib/typert.host.js` is emitted by the typert generator and carries its own `import { z } from 'zod'`, which no source states. Getting this test right removed four false reports, among them `api-gateway`'s `typert-registry`. +- A `cordis*.yml` the package owns counts as host face: a Loader row names its plugin instead of importing it. +- `@deepseek-ai/cordis` is exempt — check-workspace-constraints requires it as both peer and dev everywhere. + +`--json` output feeds the bulk edit and the install measurement. + +### What leaves an install + +Measured against a real `npm install` of the published CLI, with tarball bytes read from an isolated cache: 103 external tarballs stop being downloaded, 6.05 MB in total. + +| group | packages | saved | +| --- | --- | --- | +| syntax highlighting and math (shiki family, oniguruma family, katex) | 16 | 3.93 MB | +| react and view libraries (react, react-dom, scheduler, immer, zustand, `@tanstack/*`, clsx, use-sync-external-store) | 11 | 1.47 MB | +| markdown and ansi pipeline plus odds and ends (micromark, mdast, hast families, anser, a few `@types/*`) | 76 | 0.65 MB | + +Our own six browser-library packages (ui-primitives, ui-slots, web-react, ui-attachment, schema-form, client-web — 0.20 MB together) stay installed: code names them, and the rule above leaves those declarations alone. + +### How it lands, split by nature + +1. **Documentation first**: a declaration section in `packages/client/AGENTS.md`, and one clause in the new-plugin-package checklist. +2. **The gate**: `scripts/verify-client-runtime-deps.ts`, its `package.json` script, its place in `hygiene`, and a counterexample spec. +3. **The manifests**: 79 entries in 38 packages. 50 need a new `devDependencies` entry; the rest already carry one, so the change is a deleted line. +4. **Re-measure after the next release** with the same method, confirming the 103 tarballs stay gone. + +## Alternatives considered + +- **Scanning string literals**: the first implementation, rejected by the three findings above — the react-inside-web-react substring had already produced a silent miss. +- **Reading built artifacts (`lib/**/*.js`) instead of source**: that is Node's own view, but the gate would then depend on `pnpm run build`, and it still cannot judge a browser-library's `lib/index.js` (node platform, browser content), so the face test stays either way. +- **Asking the checker whether a binding is used in a value position** (what `verify-optional-dependency-imports` does): tried, and it also judged 83 node-face type-only declarations movable — no download saved for a real loss of meaning, 53 of them `dsh-invariants`. This gate needs to know whether a reference exists, not whether it is a value. +- **Also clearing our own six browser-library packages from the install face**, on the test that no install loads one: another 0.20 MB, at the price of deleting 74 workspace declarations that code genuinely names. Ruled out (2026-08-14): keep what the code names. The cleaner end state is to stop publishing those six packages, which is its own proposal. +- **`peerDependenciesMeta.optional` instead of `devDependencies`**: npm does skip an optional peer, but the meaning is "a consumer may supply this", and there is no run-time consumer at all. The repository must install it to build, which is what `devDependencies` says. +- **Leaving it to knip**: out of scope for knip, which reports a declared package nothing imports. These specifiers are imported; a bundler inlines them. The evidence is that they persisted on master with knip green. Only the five `nothing` entries overlap. +- **`optionalDependencies`**: wrong meaning — it says "skip this if it cannot be installed". + +## Acceptance criteria + +- `pnpm run hygiene` includes `verify-client-runtime-deps` and passes; a counterexample spec proves one `dependencies.react` is rejected. +- `pnpm run build`, `pnpm run test:gui`, and `DSH_SNAPSHOT=replay pnpm run test:web` pass — the move changes no build input, so artifacts stay byte-identical. +- A real install after the next release no longer downloads the 103 tarballs above. + +## Risks + +- **The six browser-library packages that stay installed carry bare imports nothing resolves**: `ui-primitives/lib/index.js` is a rolldown artifact and still reads `from "anser"`, while anser is now dev-only. It is inert — only our Vite build reads that file, and no loader exists for it on a user's machine (verified: only browser code imports those packages, never the host). Retiring their publication is the way to erase it; see Alternatives. +- **`@types/*` go unreported**: source never names them, so the rule cannot see them. `@types/mdast` was caught only because nothing referenced it either. They belong in dev regardless, and closing that gap is follow-up work. +- **A skipped package is unprotected**: `dsh-goal` is skipped whole for its generated entry, so its browser-side declarations are now nobody's business. Reading a generated artifact's own run-time imports is what would let the exemption be withdrawn. +- **A false report would delete a declaration something needs at run time**: three defenses hold that line — literal arguments to `require`, `require.resolve`, and dynamic `import()` count as references; a package's own `cordis*.yml` counts as host face; and no `@deepseek-ai/*` name is subject at all. diff --git a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md new file mode 100644 index 0000000000..5caed34222 --- /dev/null +++ b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md @@ -0,0 +1,100 @@ +# Agent Note: 客户端构建期依赖不进安装面 + +Status: proposed + +[English](2026-08-14-client-build-time-deps.md) | 中文 + +## Problem + +浏览器产物不在用户机上解析任何 specifier: + +- `ui-*` 插件包的浏览器产物是 `lib/client.js`,tsdown 把每个非平台 specifier 直接内联(`packages/client/tsdown.client.ts` 的 `noExternal`)。留下来的 specifier 由 loader 的冻结模块表应答——那个 bundle 里的 `require` 是 loader 注入的形参,不是 Node 的。 +- 平台模块(`PLATFORM_MODULES`)由 shell `dist` 提供,不走 Node 解析。 +- shell 自身的 import 由 Vite 内联进 `@deepseek-ai/dsh-web-frontend` 已发布的 `dist`;该包只发 `dist`,连 `.` 导出都没有。 + +所以浏览器的每条代码路径都是构建产物,或作为静态资源下发,或烤进 `dist`。但这些产物的构建输入——react、react-dom、shiki、katex、clsx、micromark 与 mdast 全族——现在写在 `dependencies` 和非 optional `peerDependencies` 里,而 npm 对每个消费者都会安装这两个区段。全仓 38 个包共 79 处这样的外部依赖声明,装给了永远不会加载它们的用户。 + +## Proposal + +### 规则 + +**只被浏览器产物触及的外部包落 `devDependencies`。** 两条留白同样是规则的一部分: + +- **只管外部依赖**。`@deepseek-ai/*` 一律留在原处:那些声明还表达「谁提供我注入的服务」「这个 assembly 挂载了谁的 Remote」「哪个 Loader 行必须能解析」,[verify-runtime-closure](../../../../scripts/verify-runtime-closure.ts) 与 Loader 都读它,而 app 无论如何都会装那个包——移走只是删掉语义,并没有减少下载。 +- **node 面触及的一律不动**,包括被擦除的类型引用。 + +face 从 manifest 真正发布的入口走图,不用目录规则,所以 `src/` 下只被浏览器入口触及的模块就算浏览器代码: + +| kind | 判据 | host face 入口 | +| --- | --- | --- | +| `bundle-half` | 有 `./client` 导出 | 除 `./client` 外的每个导出目标 | +| `browser-library` | `packages/client/` 下且无 `./client` 导出 | 只有 `src/invariant.ts`——宿主唯一能挂载的伴生模块;`.` 面是浏览器代码 | +| `prebuilt-dist` | 无 `.` 导出、发布 `dist` | 没有:这个包不给 Node 提供任何入口 | + +### 门禁:`scripts/verify-client-runtime-deps.ts` + +接入 `pnpm run hygiene`,约 35 秒——两个绑定 Program 的开销,与同 lane 的 `verify-optional-dependency-imports` 同量级。复用仓内既有工具而不自造一套:`TypeScriptProject`(`scripts/ts-project.ts`)分别绑定 host 与 client 两个编译面(该文件写明两者不能合进一个 program——cordis Context merge 会撞),相对 specifier 交给 `ts.resolveModuleName` 解析,遍历到包边界即停。 + +判据要害有三条,都是起手那版扫字符串字面量踩出来的: + +1. 包名必须按名匹配:`'@deepseek-ai/dsh-client-web-react'` 里的 `react` 子串会静默吞掉 react。 +2. `./client` 是不是 tsdown 浏览器 bundle,看的是**产物路径**(`./lib/client.js`)而不是子路径名——`dsh-goal` 的 `./client` 是 `./lib/types/client.js`,一个 tsc 直出的浏览器共享模块。 +3. `require`、`require.resolve`、动态 `import()` 的字面量实参都能触及一个包;`require.resolve('@deepseek-ai/dsh-web-frontend/dist/index.html')` 就是真实存在的宿主解析路径。 + +两类判定,逐条报告: + +| 类 | 数量 | 判据 | +| --- | --- | --- | +| `browser` | 74 | 只有浏览器产物触及 | +| `nothing` | 5 | 没有任何引用具名它:`client-runtime` 的 `react`(与它自己「零 React 引用」的分层红线矛盾)、`ui-settings` 与 `ui-theme` 的 peer `react`、`ui-trajectory` 的 peer `react-dom`、`ui-primitives` 的 `@types/mdast` | + +下面每条保守规则都对应一次实测到的误报或语义损失: + +- **node 面的类型引用保留声明。** `src/invariant.ts` 里的 `import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'` 运行期被擦除,但它声明了谁提供这个伴生插件要注册的服务——归 `verify-runtime-closure` 管的关系。 +- **发布了没有源码对应文件的 Node 入口的包整包跳过,并在输出里点名。** `dsh-goal` 的 `./typert -> ./lib/typert.host.js` 由 typert 生成器直出,自带 `import { z } from 'zod'`,没有任何源码陈述这件事。把这条判据修对,消掉了四处误报,其中包括 `api-gateway` 的 `typert-registry`。 +- 包自带的 `cordis*.yml` 算 host face:Loader 行是具名它的插件而不是 import 它。 +- `@deepseek-ai/cordis` 豁免——check-workspace-constraints 要求它在每个包里同时是 peer 和 dev。 + +`--json` 输出供批量改写与安装体积实测复用。 + +### 安装面少掉什么 + +对已发布 CLI 真装一遍实测,tarball 字节从独立 cache 读出:103 个外部 tarball 不再下载,合计 6.05 MB。 + +| 组 | 包数 | 省 | +| --- | --- | --- | +| 语法高亮与数学(shiki 族、oniguruma 族、katex) | 16 | 3.93 MB | +| react 与视图库(react、react-dom、scheduler、immer、zustand、`@tanstack/*`、clsx、use-sync-external-store) | 11 | 1.47 MB | +| markdown 与 ansi 管线及零碎(micromark、mdast、hast 全族、anser、若干 `@types/*`) | 76 | 0.65 MB | + +我们自己的 6 个浏览器库包(ui-primitives、ui-slots、web-react、ui-attachment、schema-form、client-web,合计 0.20 MB)仍留在安装面:代码确实具名它们,上面的规则不动那些声明。 + +### 分刀落地 + +1. **文档住顶刀**:`packages/client/AGENTS.md` 的依赖声明节,加新插件包 checklist 里的一句。 +2. **门禁**:`scripts/verify-client-runtime-deps.ts`、它的 `package.json` 脚本、它在 `hygiene` 里的位置,以及一条反例 spec。 +3. **manifest**:38 个包 79 处。其中 50 处需要新增 `devDependencies` 条目,其余包已有同名条目,改动就是删掉一行。 +4. **发版后按同一方法复测**,确认这 103 个 tarball 没有回来。 + +## Alternatives considered + +- **扫字符串字面量**:起手就是这么实现的,被上面三条要害否掉——react-in-web-react 的子串已经造成过一次静默漏报。 +- **读构建产物(`lib/**/*.js`)而不是源码**:那是 Node 自己的视角,但门禁从此依赖 `pnpm run build`,而且它照样判不了浏览器库包的 `lib/index.js`(platform 是 node、内容是浏览器代码),face 判据两种走法都得有。 +- **用 checker 判绑定是否用在值位置**(`verify-optional-dependency-imports` 就是这么做的):试过,它把 83 处 node 面纯类型声明也判成可移出——没省下任何下载,却实打实损失语义,其中 53 处是 `dsh-invariants`。本门禁要知道的是引用是否存在,而不是它是值还是类型。 +- **顺带把我们自己的 6 个浏览器库包也清出安装面**,判据是任何安装都不加载它们:再省 0.20 MB,代价是删掉 74 处代码确实具名的 workspace 声明。已否(2026-08-14):代码用到的就保留。更干净的终态是这 6 个包不再发布,那是另一个提案。 +- **用 `peerDependenciesMeta.optional` 而不是 `devDependencies`**:npm 确实会跳过 optional peer,但那个语义是「消费者可以自行提供」,而这里根本没有运行期消费者。仓内必须装一份才能构建,这正是 `devDependencies` 的意思。 +- **交给 knip**:不属于 knip 的范畴,它报的是「声明了但没人 import」。这些 specifier 确实被 import,只是被打包器内联了。实证就是它们在 master 上长期存在而 knip 全绿。只有 `nothing` 那 5 条与它重叠。 +- **用 `optionalDependencies`**:语义错,它说的是「装不上就跳过」。 + +## Acceptance criteria + +- `pnpm run hygiene` 包含 `verify-client-runtime-deps` 并通过;一条反例 spec 证明一处 `dependencies.react` 会被拒。 +- `pnpm run build`、`pnpm run test:gui`、`DSH_SNAPSHOT=replay pnpm run test:web` 通过——这次迁移不改任何构建输入,产物应逐字节等价。 +- 发版后真装一遍,上面那 103 个 tarball 不再被下载。 + +## Risks + +- **留在安装面的 6 个浏览器库包会带着解析不了的 bare import**:`ui-primitives/lib/index.js` 是 rolldown 产物,仍写着 `from "anser"`,而 anser 已经只在 dev。它是惰性的——只有我们的 Vite 构建会读这个文件,用户机上没有任何加载者(已实证:只有浏览器代码 import 它们,宿主从不)。要彻底消掉就让这些包不再发布,见 Alternatives。 +- **`@types/*` 报不出来**:源码从不具名它们,规则看不见。`@types/mdast` 被抓到只是因为恰好也没有任何引用。它们本来就该在 dev,补这个缺口是后续的事。 +- **被跳过的包没人管**:`dsh-goal` 因生成入口整包跳过,它浏览器侧的声明现在没有门禁看着。能读到生成产物自身的运行期 import,这条豁免才能收回。 +- **误报会删掉运行期真需要的声明**:三层兜底守住这条线——`require`、`require.resolve`、动态 `import()` 的字面量实参都算引用;包自带的 `cordis*.yml` 算 host face;`@deepseek-ai/*` 整体不在判据范围内。 diff --git a/packages/client/AGENTS.md b/packages/client/AGENTS.md index 1928f30a3c..14965fd495 100644 --- a/packages/client/AGENTS.md +++ b/packages/client/AGENTS.md @@ -35,6 +35,15 @@ The `/client` entrypoint of a UI plugin package is its public browser API, not a 2. **Same-package tests import internals directly** — relative `../src/client/xxx.ts` from package tests, or the `./src/*` subpath where a spec lives outside the package. Never widen the public API to make a test compile. 3. **Cross-package imports of another plugin's symbols are in principle forbidden.** The sanctioned routes are the slot system (register/renderSlot) and ctx services. If neither fits, stop and escalate — do not add an export to unblock yourself. +## Dependency declaration + +A browser artifact resolves nothing on the user's machine: tsdown inlines every non-platform specifier into `lib/client.js`, the shell `dist` answers `PLATFORM_MODULES` from its frozen module table, and Vite inlines the shell's own imports into the published `dist`. + +- **An external package only browser code reaches belongs in `devDependencies`.** npm installs `dependencies` and non-optional `peerDependencies` for every consumer, so react, shiki, katex, or clsx declared there ships to users who never load it. +- **A workspace name stays where it is.** Such a declaration also states which package supplies an injected service or a mounted Remote contribution — [verify-runtime-closure](../../scripts/verify-runtime-closure.ts) and the Loader read it, and the app installs the package regardless. +- **The node half decides.** Anything its published entries reach — an erased type import, a `require.resolve`, and a Loader row in the package's own `cordis*.yml` included — stays declared as it is. +- `pnpm run verify-client-runtime-deps` (inside `hygiene`) names each offending entry; knip owns whether the surviving declaration is used at all. + ## ctx discipline (components never see ctx) `ctx` belongs to the apply world only: the plugin body and the inject factories closed over it. Components — every `.tsx` under a feature domain — receive all data and callbacks **through the four props shares**; they never call a hook that reaches ctx, never import a service class to poke it, never read a React context (business components see zero contexts — `BindingContext` and its kin are renderer-internal). If a component needs something new, the answer is a prop threaded from its share's source (owner site, store declaration, or inject face), not a hook. @@ -91,7 +100,7 @@ If `test:gui` is red on code you did not touch, neither silently fix nor ignore Bringing up a new `packages/client/` plugin package (ui-workspace is a complete example; ui-sidebar/ui-user-questions are minimal skeletons): -1. **Package skeleton**: `package.json` (`@deepseek-ai/dsh-client-`, exports `.`/`./invariant`/`./client`/`./src/*`/`./package.json`, `dsh.client` manifest, `files` list), `tsconfig.json` (extends `tsconfig.base.client.json`, one `references` entry per workspace dependency plus `runtime-diagnostics/invariants`), `tsdown.config.ts` (`clientBundle(id, ['lib/types/index.js', 'lib/types/invariant.js'])`), `src/index.ts` (empty node-half apply), `src/invariant.ts` (companion with a real reason), `src/css-modules.d.ts` when using CSS Modules, `README.md` with the Model Experience section. +1. **Package skeleton**: `package.json` (`@deepseek-ai/dsh-client-`, exports `.`/`./invariant`/`./client`/`./src/*`/`./package.json`, `dsh.client` manifest, `files` list, and every browser-side external package under `devDependencies` per the [declaration rules](#dependency-declaration)), `tsconfig.json` (extends `tsconfig.base.client.json`, one `references` entry per workspace dependency plus `runtime-diagnostics/invariants`), `tsdown.config.ts` (`clientBundle(id, ['lib/types/index.js', 'lib/types/invariant.js'])`), `src/index.ts` (empty node-half apply), `src/invariant.ts` (companion with a real reason), `src/css-modules.d.ts` when using CSS Modules, `README.md` with the Model Experience section. 2. **Three registration surfaces, all required** (missing any one fails at a different, later point): the `tsconfig.client.json` aggregate `references` entry; a `dsh.client` row in `packages/bundle/web-app/cordis.patch.yml`; a `packages/bundle/web-app/package.json` dependency (profile boots resolve bare row names through the healed `$DSH_HOME/profiles/node_modules` fallback, which mirrors the app's and each bundle's declared dependencies — a row whose package no manifest declares fails to import). `pnpm-workspace.yaml` already globs `packages/*/*`. 3. **dsh.client manifest semantics**: `platform: 'web'` always; `immediately: true` only for stage-one-prefetch infrastructure rows. `inject` lists package-name dependency edges — they are **informational only** (preflight display, HMR diffing); they do not sequence entry activation or apply order. Activation order is cordis fiber inject waiting on *services*, nothing else. 4. **Registering into another package's slot**: apply order is unconstrained, and a business service is not a declaration barrier. Use `ctx.slots.inject(name, () => ctx.slots.register(...))`; it waits on the actual declaration, removes the contribution when that declaration collapses, reruns after redeclaration, and leaves with the caller's plugin fiber. Return a generator yielding each registration when several contributions must install and roll back atomically. A bare `slots.register` into an undeclared slot remains an error; keep service edges only for services the contribution actually reads. From 6e77499326e225d53d856a793ce0cb8e27879fde Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 20:18:35 +0800 Subject: [PATCH 097/103] feat(scripts): gate browser-only dependencies out of the install face verify-client-runtime-deps walks each package's host and browser faces from the entries its manifest publishes, over the bound host and client Programs, and reports an external package no host-face reference reaches. Wired into hygiene. A workspace name is out of scope: it also states which package supplies an injected service or a mounted Remote contribution, and the app installs it either way. A package whose published Node entry has no source counterpart is skipped and named, because a generated artifact carries imports no source states. --- package.json | 3 +- scripts/verify-client-runtime-deps.ts | 368 ++++++++++++++++++++++++++ 2 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 scripts/verify-client-runtime-deps.ts diff --git a/package.json b/package.json index 517d0c56d1..6f2346e2e6 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,7 @@ "rescope-vendor": "tsx scripts/rescope-vendor.ts", "rescope-vendor:check": "tsx scripts/rescope-vendor.ts --check", "verify-client-domain-graph": "tsx scripts/verify-client-domain-graph.ts", + "verify-client-runtime-deps": "tsx scripts/verify-client-runtime-deps.ts", "gen-cordis-catalog": "tsx scripts/gen-cordis-catalog.ts", "verify-cordis-catalog": "tsx scripts/gen-cordis-catalog.ts --check", "gen-cordis-api": "tsx scripts/gen-cordis-api.ts", @@ -126,7 +127,7 @@ "verify-module-graph": "tsx scripts/gen-module-graph.ts --check", "constraints": "tsx scripts/check-workspace-constraints.ts", "doc-sync": "tsx scripts/run-gates.ts doc-sync", - "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-optional-dependency-imports && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", + "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-optional-dependency-imports && pnpm run verify-runtime-closure && pnpm run verify-client-runtime-deps && pnpm run verify-vendored-links", "publish:npm-baseline": "tsx scripts/publish-npm-baseline.ts", "release:dsh": "tsx scripts/release/bump.ts --family dsh", "release:vendor": "tsx scripts/release/bump.ts --family vendor", diff --git a/scripts/verify-client-runtime-deps.ts b/scripts/verify-client-runtime-deps.ts new file mode 100644 index 0000000000..0d42f8c135 --- /dev/null +++ b/scripts/verify-client-runtime-deps.ts @@ -0,0 +1,368 @@ +/** + * Keep browser-only external packages out of installed dependency sections. + * + * A browser artifact resolves nothing on the user's machine: tsdown inlines + * every non-platform specifier into `lib/client.js`, the shell `dist` answers + * `PLATFORM_MODULES` from its frozen module table, and Vite inlines the shell's + * own imports into that published `dist`. A specifier only browser source + * reaches is therefore a build-time input and belongs in `devDependencies`, + * because npm installs `dependencies` and non-optional `peerDependencies` for + * every consumer of the published package. + * + * Each face is walked from the entries the manifest publishes, not by a + * directory rule, so a module under `src/` that only the browser entry reaches + * counts as browser source: + * + * `./client` is `lib/client.js` host: the other export targets; browser: the bundle + * `packages/client/*` with no browser-only library: host is `src/invariant.ts`, + * `./client` export the companion the host mounts; `.` is browser code + * no `.` export, ships a `dist` prebuilt browser bundle: no host face at all + * + * Only external packages are subject: they are what an install downloads. A + * workspace name stays where its manifest puts it, because that declaration also + * states which package supplies an injected service or a mounted Remote + * contribution, and the app installs it either way. A reference from the host + * face, an erased type import included, likewise keeps a declaration in place. + * + * Run: pnpm exec tsx scripts/verify-client-runtime-deps.ts [--json] + */ + +import { existsSync, globSync, readFileSync } from 'node:fs' +import { dirname, join, resolve } from 'node:path' +import ts from 'typescript' +import { TypeScriptProject, type CompilerFace } from './ts-project.ts' + +const root = resolve(import.meta.dirname, '..') + +/** + * `@deepseek-ai/cordis` placement belongs to check-workspace-constraints, which + * requires it as a peerDependency plus devDependency of every harness package + * regardless of face. + */ +const PLACEMENT_OWNED_ELSEWHERE = new Set(['@deepseek-ai/cordis']) + +/** Dependency sections npm installs for a consumer of the published package. */ +const INSTALLED_SECTIONS = ['dependencies', 'peerDependencies'] as const + +type Section = (typeof INSTALLED_SECTIONS)[number] + +interface Manifest { + name?: string + files?: string[] + exports?: Record + dependencies?: Record + peerDependencies?: Record + peerDependenciesMeta?: Record +} + +/** How a package reaches the browser, which fixes the entries Node can load. */ +type Kind = 'bundle-half' | 'browser-library' | 'prebuilt-dist' + +/** What settles an external specifier as build-time only. */ +type Reached = 'browser' | 'nothing' + +interface Violation { + readonly section: Section + readonly dep: string + readonly reached: Reached + /** Whether the browser face names it, which decides dev-move versus deletion. */ + readonly browserReferenced: boolean +} + +interface Offender { + readonly name: string + readonly dir: string + readonly kind: Kind + readonly violations: Violation[] +} + +/** Why each class needs no install, for the failure report. */ +const REASON: Record = { + browser: 'only a browser artifact reaches it, and that resolves nothing on the user machine', + nothing: 'no reference names it at all', +} + +/** + * Classify a package by the browser artifact it produces. + * @param dir - repository-relative package directory. + * @param manifest - the package manifest. + * @returns the package kind, or undefined when the package has no browser face. + */ +function kindOf(dir: string, manifest: Manifest): Kind | undefined { + if (manifest.exports?.['./client'] !== undefined) return 'bundle-half' + if (dir.startsWith('packages/client/')) return 'browser-library' + const shipsDist = (manifest.files ?? []).some(entry => entry === 'dist' || entry.startsWith('dist/')) + if (shipsDist && manifest.exports?.['.'] === undefined) return 'prebuilt-dist' + return undefined +} + +/** The bare package name a specifier names, keeping a leading scope. */ +function packageOf(specifier: string): string { + const parts = specifier.split('/') + return specifier.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0] ?? specifier +} + +/** One compiler face's bound program plus its module resolution state. */ +interface Face { + readonly project: TypeScriptProject + readonly host: ts.CompilerHost + readonly cache: ts.ModuleResolutionCache +} + +const faces = new Map() +for (const face of ['host', 'client'] as const) { + const project = new TypeScriptProject(root, face) + const options = project.program.getCompilerOptions() + faces.set(face, { + project, + host: ts.createCompilerHost(options, false), + cache: ts.createModuleResolutionCache(root, fileName => fileName, options), + }) +} + +/** Which face's program bound each workspace module, keyed by absolute path. */ +const boundIn = new Map() +for (const [face, { project }] of faces) { + for (const sourceFile of project.sourceFiles()) { + if (sourceFile.isDeclarationFile) continue + if (!boundIn.has(sourceFile.fileName)) boundIn.set(sourceFile.fileName, face) + } +} + +/** + * Read every module specifier one source file names. + * + * An import clause is not the only way to reach a package: `require`, + * `require.resolve`, and a dynamic `import()` on a literal each name one, and a + * type-only import still names a package the build must resolve. + * @param sourceFile - a bound source file. + * @returns every specifier, relative ones included. + */ +function specifiersOf(sourceFile: ts.SourceFile): string[] { + const specifiers: string[] = [] + const visit = (node: ts.Node): void => { + if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node) || ts.isImportEqualsDeclaration(node)) { + const specifier = ts.isImportEqualsDeclaration(node) + ? (ts.isExternalModuleReference(node.moduleReference) ? node.moduleReference.expression : undefined) + : node.moduleSpecifier + if (specifier !== undefined && ts.isStringLiteralLike(specifier)) specifiers.push(specifier.text) + } else if (ts.isCallExpression(node)) { + const target = node.expression + const isRequire = ts.isIdentifier(target) && target.text === 'require' + const isRequireResolve = ts.isPropertyAccessExpression(target) + && ts.isIdentifier(target.expression) && target.expression.text === 'require' + && target.name.text === 'resolve' + const argument = node.arguments[0] + if ((isRequire || isRequireResolve || target.kind === ts.SyntaxKind.ImportKeyword) + && argument !== undefined && ts.isStringLiteralLike(argument)) { + specifiers.push(argument.text) + } + } + ts.forEachChild(node, visit) + } + visit(sourceFile) + return specifiers +} + +/** + * Walk one face from its entries and collect the packages it names. + * @param entries - absolute entry module paths. + * @param packageDir - absolute package directory; the walk stops at its edge. + * @returns package names the walk reaches. + */ +function walk(entries: readonly string[], packageDir: string): Set { + const found = new Set() + const seen = new Set() + const queue = entries.filter(entry => boundIn.has(entry)) + while (queue.length > 0) { + const file = queue.pop() + if (file === undefined || seen.has(file)) continue + seen.add(file) + const faceName = boundIn.get(file) + const face = faceName === undefined ? undefined : faces.get(faceName) + const sourceFile = face?.project.program.getSourceFile(file) + if (face === undefined || sourceFile === undefined) continue + + for (const specifier of specifiersOf(sourceFile)) { + if (!specifier.startsWith('.')) { + if (!specifier.startsWith('node:')) found.add(packageOf(specifier)) + continue + } + const resolved = ts.resolveModuleName( + specifier, file, face.project.program.getCompilerOptions(), face.host, face.cache, + ).resolvedModule?.resolvedFileName + // A relative specifier resolving outside the package is a packaging error + // verify-package-paths owns; either way it is not this package's own module. + if (resolved !== undefined && resolved.startsWith(`${packageDir}/`)) queue.push(resolved) + } + } + return found +} + +/** + * The source module behind one published JavaScript export target. + * + * `lib/` holds the tsdown bundles and `lib/types/` the tsc emit, so both + * prefixes lead back to one `src` module. + * @param dir - absolute package directory. + * @param emitted - the export target, as written in the manifest. + * @returns the absolute source path, or undefined when nothing in `src` emits it. + */ +function sourceBehind(dir: string, emitted: string): string | undefined { + const stem = emitted.replace(/^\.\/lib\/types\//, '').replace(/^\.\/lib\//, '').replace(/\.js$/, '') + return [`src/${stem}.ts`, `src/${stem}.tsx`, `src/${stem}/index.ts`, `src/${stem}/index.tsx`] + .map(candidate => join(dir, candidate)) + .find(candidate => existsSync(candidate)) +} + +interface Entries { + readonly host: string[] + readonly browser: string[] + /** + * Published JavaScript entries no `src` module emits — a generated artifact + * such as `lib/typert.host.js`, whose own runtime imports are invisible here. + */ + readonly generated: string[] +} + +/** + * The entry modules of each face, derived from what the manifest publishes. + * @param dir - absolute package directory. + * @param manifest - the package manifest. + * @param kind - the package kind. + * @returns absolute entry module paths per face, plus unmapped published entries. + */ +function faceEntries(dir: string, manifest: Manifest, kind: Kind): Entries { + if (kind === 'prebuilt-dist') return { host: [], browser: [], generated: [] } + if (kind === 'browser-library') { + return { host: [join(dir, 'src/invariant.ts')], browser: [join(dir, 'src/index.ts')], generated: [] } + } + const host = [join(dir, 'src/index.ts'), join(dir, 'src/invariant.ts')] + const browser: string[] = [] + const generated: string[] = [] + for (const [key, target] of Object.entries(manifest.exports ?? {})) { + if (key === '.' || key === './package.json' || key.includes('*')) continue + const emitted = typeof target === 'string' ? target : (target as { default?: unknown }).default + if (typeof emitted !== 'string' || !emitted.endsWith('.js')) continue + // Keyed on the artifact path, not the subpath name: `./client` is the tsdown + // browser bundle only when it resolves to lib/client.js, while other packages + // publish a plain browser-shared module under the same subpath. + const source = emitted === './lib/client.js' + ? sourceBehind(dir, './lib/client/index.js') + : sourceBehind(dir, emitted) + if (source === undefined) generated.push(`${key} -> ${emitted}`) + else if (key === './client') browser.push(source) + else host.push(source) + } + return { host, browser, generated } +} + +/** Every installed dependency of a manifest, paired with its section. */ +function installedDeps(manifest: Manifest): { section: Section; dep: string }[] { + const deps: { section: Section; dep: string }[] = [] + for (const section of INSTALLED_SECTIONS) { + for (const dep of Object.keys(manifest[section] ?? {})) { + if (section === 'peerDependencies' && manifest.peerDependenciesMeta?.[dep]?.optional === true) continue + if (PLACEMENT_OWNED_ELSEWHERE.has(dep)) continue + deps.push({ section, dep }) + } + } + return deps +} + +/** + * Test whether a Loader config names a package as a whole word. + * @param text - raw config text. + * @param dep - package name to look for. + * @returns true when the name appears outside a longer specifier. + */ +function namesPackage(text: string, dep: string): boolean { + const escaped = dep.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + return new RegExp(`(^|[^\\w@/.-])${escaped}(?![\\w.-])`).test(text) +} + +interface Candidate { + readonly name: string + readonly relativeDir: string + readonly manifest: Manifest + readonly kind: Kind +} + +const candidates: Candidate[] = [] +for (const path of [ + ...globSync('packages/*/*/package.json', { cwd: root }), + ...globSync('apps/*/package.json', { cwd: root }), +].sort()) { + const relativeDir = dirname(path) + const manifest = JSON.parse(readFileSync(join(root, path), 'utf8')) as Manifest + if (manifest.name === undefined) continue + const kind = kindOf(relativeDir, manifest) + if (kind !== undefined) candidates.push({ name: manifest.name, relativeDir, manifest, kind }) +} + +const offenders: Offender[] = [] +const unchecked: string[] = [] +for (const { name, relativeDir, manifest, kind } of candidates) { + const dir = join(root, relativeDir) + const entries = faceEntries(dir, manifest, kind) + // A generated Node entry carries runtime imports of its own that no source + // states, so this package's declarations cannot be judged from `src` alone. + if (entries.generated.length > 0) { + unchecked.push(`${name}: generated entry ${entries.generated.join(', ')}`) + continue + } + const host = walk(entries.host, dir) + const browser = walk(entries.browser, dir) + // A Loader row names its plugin package instead of importing it, so a config + // the package owns is part of its host face. YAML keys carry no quotes, so + // these are matched as whole names against the raw text. + const configs = globSync('cordis*.yml', { cwd: dir }).map(config => readFileSync(join(dir, config), 'utf8')) + + const violations = installedDeps(manifest) + // A workspace name stays where the manifest puts it. Such a declaration also + // states which package supplies an injected service, which Remote contribution + // an assembly mounts, or which Loader row must resolve; the app installs the + // package regardless, so moving one saves no download while deleting what + // verify-runtime-closure and the Loader read. External packages are the + // download, and this gate is about the download. + .filter(({ dep }) => !dep.startsWith('@deepseek-ai/')) + .filter(({ dep }) => !host.has(dep) && !configs.some(text => namesPackage(text, dep))) + .map(({ section, dep }) => ({ + section, + dep, + browserReferenced: browser.has(dep), + // A prebuilt bundle publishes no Node entry, so everything it declares is + // build-time by construction, named in its Vite graph rather than in src. + reached: kind === 'prebuilt-dist' || browser.has(dep) ? 'browser' as const : 'nothing' as const, + })) + if (violations.length > 0) offenders.push({ name, dir: relativeDir, kind, violations }) +} + +if (process.argv.includes('--json')) { + console.log(JSON.stringify(offenders, null, 2)) + process.exit(0) +} + +if (unchecked.length > 0) { + console.log(`verify-client-runtime-deps: ${String(unchecked.length)} package(s) not checked, no source states their entry's imports:`) + for (const entry of unchecked) console.log(` ${entry}`) +} + +if (offenders.length > 0) { + const all = offenders.flatMap(offender => offender.violations) + console.error(`verify-client-runtime-deps: ${String(all.length)} build-time specifier(s) in installed sections:`) + for (const { name, dir, kind, violations } of offenders) { + console.error(` ${name} (${dir}, ${kind})`) + for (const { section, dep, reached } of violations) { + console.error(` ${section}.${dep} -> devDependencies [${reached}]`) + } + } + console.error('') + for (const reached of ['browser', 'nothing'] as const) { + const count = all.filter(violation => violation.reached === reached).length + if (count > 0) console.error(` ${String(count).padStart(4)} ${reached}: ${REASON[reached]}`) + } + console.error('\nDeclaration rules: packages/client/AGENTS.md.') + process.exit(1) +} +console.log(`verify-client-runtime-deps: browser-face specifiers are dev-only across ${String(candidates.length)} browser-facing packages.`) From 93a95e838da235c1c519ee8c6bf8f5ac1778394e Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 20:18:39 +0800 Subject: [PATCH 098/103] fix(client): declare browser-only externals as devDependencies react, react-dom, shiki, katex, clsx, the micromark and mdast families and nine more reach only browser artifacts, which resolve nothing on a user's machine. Moving 79 declarations out of dependencies and non-optional peerDependencies drops 103 tarballs and 6.05 MB from an install of the published CLI. --- apps/web/package.json | 8 +- packages/client/locale/package.json | 3 +- packages/client/runtime/package.json | 10 +- packages/client/ui-agent-preset/package.json | 3 +- packages/client/ui-attachment/package.json | 10 +- packages/client/ui-commands/package.json | 9 +- packages/client/ui-conversation/package.json | 7 +- packages/client/ui-deliverables/package.json | 6 +- .../ui-directory-picker-browse/package.json | 9 +- .../ui-directory-picker-native/package.json | 3 +- packages/client/ui-goal/package.json | 3 +- packages/client/ui-input-trigger/package.json | 9 +- packages/client/ui-jobs/package.json | 6 +- packages/client/ui-layout/package.json | 3 +- .../client/ui-message-feedback/package.json | 3 +- .../client/ui-model-selection/package.json | 4 +- .../client/ui-permission-presets/package.json | 3 +- packages/client/ui-plan/package.json | 3 +- packages/client/ui-primitives/package.json | 12 +- .../client/ui-settings-general/package.json | 9 +- .../client/ui-settings-models/package.json | 3 +- .../ui-settings-plugin-inventory/package.json | 3 +- .../client/ui-settings-plugins/package.json | 9 +- packages/client/ui-settings/package.json | 3 +- packages/client/ui-sidebar/package.json | 9 +- packages/client/ui-skill/package.json | 3 +- packages/client/ui-subagent/package.json | 6 +- packages/client/ui-theme/package.json | 5 +- packages/client/ui-tool/package.json | 7 +- packages/client/ui-trajectory/package.json | 12 +- .../client/ui-user-questions/package.json | 8 +- packages/client/ui-workflow-run/package.json | 6 +- packages/client/ui-workspace/package.json | 9 +- packages/client/web-react/package.json | 8 +- packages/client/web/package.json | 8 +- .../cordis-client-runner/package.json | 3 +- packages/extensions/ui-cordis/package.json | 3 +- .../session-log-export/package.json | 34 ++- pnpm-lock.yaml | 215 ++++++++---------- 39 files changed, 214 insertions(+), 263 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index fc990f684c..5e6dc8152b 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -26,9 +26,7 @@ }, "license": "MIT", "dependencies": { - "@deepseek-ai/dsh-client-web": "workspace:^", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@deepseek-ai/dsh-client-web": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis-plugin-group": "workspace:^", @@ -46,6 +44,8 @@ "typescript": "^6.0.3", "vite": "^6.0.0", "vitest": "^4.1.8", - "fflate": "^0.8.2" + "fflate": "^0.8.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 0184f72d18..3f4f408854 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -50,8 +50,7 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 1da3ac6428..cc610a925d 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -53,10 +53,7 @@ "@deepseek-ai/dsh-session": "workspace:^", "@deepseek-ai/dsh-session-projection": "workspace:^", "@deepseek-ai/dsh-session-title": "workspace:^", - "@deepseek-ai/dsh-tools": "workspace:^", - "immer": "^10.1.1", - "react": "^18.2.0", - "zustand": "~4.4.7" + "@deepseek-ai/dsh-tools": "workspace:^" }, "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -72,7 +69,10 @@ "@deepseek-ai/dsh-timeout": "workspace:^", "@deepseek-ai/dsh-typert-protocol": "workspace:^", "@deepseek-ai/dsh-typert-registry": "workspace:^", - "@types/react": "~18.3.1" + "@types/react": "~18.3.1", + "immer": "^10.1.1", + "react": "^18.2.0", + "zustand": "~4.4.7" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index f705158d1e..b2c447b17e 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -58,8 +58,7 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index c257166e2a..4d40c870a7 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -28,16 +28,16 @@ "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", - "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", - "clsx": "^2.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@deepseek-ai/dsh-client-ui-primitives": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "@types/react-dom": "~18.3.0" + "@types/react-dom": "~18.3.0", + "clsx": "^2.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index cf80e20f3f..a0445a32e2 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -46,9 +46,6 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -59,8 +56,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -76,7 +72,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "react": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 2fc12605c1..096c5280af 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -49,7 +49,6 @@ "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", - "clsx": "^2.0.0", "@deepseek-ai/schemastery": "workspace:^" }, "peerDependencies": { @@ -72,8 +71,7 @@ "@deepseek-ai/dsh-llm-retry": "workspace:^", "@deepseek-ai/dsh-session-stats": "workspace:^", "@deepseek-ai/dsh-token-meter": "workspace:^", - "@deepseek-ai/dsh-tools": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-tools": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -104,7 +102,8 @@ "@deepseek-ai/dsh-tool-todo": "workspace:^", "@deepseek-ai/dsh-tools": "workspace:^", "@types/react": "~18.3.1", - "react": "^18.2.0" + "react": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index ac7f264f62..da627c207b 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -45,9 +45,6 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "react": "^18.2.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-connection": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -68,7 +65,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-system-prompt": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index 0cc14700fc..028a46e290 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -44,9 +44,6 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -54,8 +51,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-workspace": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -69,7 +65,8 @@ "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 74b8e7845b..5fe8d80cc7 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -48,8 +48,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-workspace": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-runtime": "workspace:^", diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index 6076aab741..56b9a23472 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -55,8 +55,7 @@ "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-goal": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index a4ca2afe84..f933031f82 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -43,17 +43,13 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -64,7 +60,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "react": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index a59d064dda..0855cc486d 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -45,9 +45,6 @@ "publishConfig": { "access": "public" }, - "dependencies": { - "react": "^18.2.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -66,7 +63,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index d3ab329297..0753bd9367 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -48,8 +48,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 481d02aa03..3d2480b05e 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -56,8 +56,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-message-feedback": "workspace:^", "@deepseek-ai/dsh-typert-protocol": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 298fd8b133..dd74f2c764 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -56,9 +56,7 @@ "@deepseek-ai/dsh-client-ui-input-trigger": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "clsx": "^2.1.1", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 62f03cbd07..159700431b 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -60,8 +60,7 @@ "@deepseek-ai/dsh-client-ui-input-trigger": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/dsh-permission-presets": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-permission-presets": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 233a8a72fe..58b8d4430a 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -53,8 +53,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-plan-mode": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index b6e01b4f5a..5bb934f474 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -26,7 +26,11 @@ "./package.json": "./package.json" }, "license": "MIT", - "dependencies": { + "devDependencies": { + "@deepseek-ai/dsh-invariants": "workspace:^", + "@types/react": "~18.3.1", + "@types/react-dom": "~18.3.0", + "@deepseek-ai/cordis": "workspace:^", "@shikijs/langs": "^4.3.1", "@types/mdast": "^4.0.4", "anser": "^2.3.5", @@ -48,12 +52,6 @@ "react-dom": "^18.2.0", "shiki": "^4.3.1" }, - "devDependencies": { - "@deepseek-ai/dsh-invariants": "workspace:^", - "@types/react": "~18.3.1", - "@types/react-dom": "~18.3.0", - "@deepseek-ai/cordis": "workspace:^" - }, "files": [ "lib/index.js", "lib/invariant.js", diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index c5207dfc9d..3727a03ee9 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -49,8 +49,7 @@ "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", - "@deepseek-ai/schemastery": "workspace:^", - "clsx": "^2.0.0" + "@deepseek-ai/schemastery": "workspace:^" }, "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -63,8 +62,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -80,7 +78,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^", "@types/react": "~18.3.1", - "react": "^18.2.0" + "react": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 423755475c..b6dc52fc4d 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -54,8 +54,7 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 95af8a15fa..8d04e40581 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -53,8 +53,7 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index a9fd7b8e9d..936d2df19e 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -56,8 +56,7 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -72,6 +71,7 @@ "@deepseek-ai/dsh-client-web-react": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", + "clsx": "^2.0.0", "react": "^18.2.0" }, "files": [ @@ -79,8 +79,5 @@ "lib/invariant.js", "lib/client.js", "lib/types/**/*.d.ts" - ], - "dependencies": { - "clsx": "^2.0.0" - } + ] } diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index 485092d2b9..46e269a3a3 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -52,8 +52,7 @@ "@deepseek-ai/dsh-client-schema-form": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/dsh-settings": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-settings": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index cfda6d55fc..bad27010aa 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -44,17 +44,13 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -66,7 +62,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "react": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index b2026095f2..b979880e83 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -56,8 +56,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-tool": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 0e0b7aadae..327fc66442 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -46,9 +46,6 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "react": "^18.2.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -73,7 +70,8 @@ "@deepseek-ai/dsh-subagent": "workspace:^", "@deepseek-ai/dsh-token-meter": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 6f320cd92f..efea7f3e47 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -54,8 +54,7 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-host-webserver": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -69,6 +68,7 @@ "@deepseek-ai/dsh-host-webserver": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", + "clsx": "^2.0.0", "react": "^18.2.0" }, "files": [ @@ -84,7 +84,6 @@ }, "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", - "clsx": "^2.0.0", "@deepseek-ai/schemastery": "workspace:^" } } diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 80bc4f2586..05e5f7fd28 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -44,9 +44,6 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -55,8 +52,7 @@ "@deepseek-ai/dsh-client-ui-conversation": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -72,6 +68,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@testing-library/react": "^16.1.0", "@types/react": "~18.3.1", + "clsx": "^2.0.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 375053ba7c..bd90aba857 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -44,10 +44,6 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "@tanstack/react-virtual": "^3.14.9", - "diff": "^9.0.0" - }, "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -56,9 +52,7 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-compaction": "workspace:^", - "@deepseek-ai/dsh-tools": "workspace:^", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@deepseek-ai/dsh-tools": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", @@ -75,7 +69,9 @@ "@types/react-dom": "~18.3.0", "@deepseek-ai/cordis": "workspace:^", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "@tanstack/react-virtual": "^3.14.9", + "diff": "^9.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index 95fb02b0f3..ddd64ed2cb 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -48,9 +48,7 @@ "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-conversation": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", - "@deepseek-ai/dsh-client-ui-slots": "workspace:^", - "clsx": "^2.0.0", - "react": "^18.2.0" + "@deepseek-ai/dsh-client-ui-slots": "workspace:^" }, "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -67,7 +65,9 @@ "@deepseek-ai/dsh-system-prompt": "workspace:^", "@deepseek-ai/dsh-tools": "workspace:^", "@deepseek-ai/dsh-user-questions": "workspace:^", - "@types/react": "~18.3.1" + "@types/react": "~18.3.1", + "clsx": "^2.0.0", + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index e5b71cf942..62e8dcc803 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -50,9 +50,6 @@ "lib/types/**/*.d.ts" ], "license": "MIT", - "dependencies": { - "react": "^18.2.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -77,6 +74,7 @@ "@deepseek-ai/dsh-tool-workflow": "workspace:^", "@deepseek-ai/dsh-workflow": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" } } diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index b6a711b873..cd85838b3b 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -45,17 +45,13 @@ "watch": "tsdown --watch" }, "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -68,7 +64,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "react": "^18.2.0", + "clsx": "^2.0.0" }, "files": [ "lib/index.js", diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index 75bf6877ad..e884bc9fa1 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -27,9 +27,7 @@ }, "license": "MIT", "dependencies": { - "@deepseek-ai/dsh-client-ui-slots": "workspace:^", - "react": "^18.2.0", - "use-sync-external-store": "1.2.0" + "@deepseek-ai/dsh-client-ui-slots": "workspace:^" }, "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", @@ -38,7 +36,9 @@ "devDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0", + "use-sync-external-store": "1.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/web/package.json b/packages/client/web/package.json index 9e4e9481e0..d128b3219d 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -33,9 +33,7 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^", - "@deepseek-ai/dsh-client-web-react": "workspace:^", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@deepseek-ai/dsh-client-web-react": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", @@ -45,7 +43,9 @@ "@types/react": "~18.3.1", "@types/react-dom": "~18.3.0", "@deepseek-ai/cordis": "workspace:^", - "typescript": "^6.0.3" + "typescript": "^6.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "peerDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index 74f7970bbc..ecc0bca76d 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -54,8 +54,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index cacd075a58..7bcb487bf1 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -61,8 +61,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-tool": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index b84dede798..1ff514d0ae 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -2,7 +2,9 @@ "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", "version": "0.1.0-rc.6", - "publishConfig": { "access": "public" }, + "publishConfig": { + "access": "public" + }, "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", @@ -12,14 +14,31 @@ "main": "lib/index.js", "types": "lib/types/index.d.ts", "exports": { - ".": { "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, - "./invariant": { "types": "./lib/types/invariant.d.ts", "default": "./lib/invariant.js" }, - "./client": { "types": "./lib/types/client/index.d.ts", "default": "./lib/client.js" }, + ".": { + "types": "./lib/types/index.d.ts", + "default": "./lib/index.js" + }, + "./invariant": { + "types": "./lib/types/invariant.d.ts", + "default": "./lib/invariant.js" + }, + "./client": { + "types": "./lib/types/client/index.d.ts", + "default": "./lib/client.js" + }, "./src/*": "./src/*", "./package.json": "./package.json" }, - "files": ["lib/index.js", "lib/invariant.js", "lib/client.js", "lib/types/**/*.d.ts"], - "scripts": { "bundle": "tsdown", "watch": "tsdown --watch" }, + "files": [ + "lib/index.js", + "lib/invariant.js", + "lib/client.js", + "lib/types/**/*.d.ts" + ], + "scripts": { + "bundle": "tsdown", + "watch": "tsdown --watch" + }, "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -30,8 +49,7 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/dsh-invariants": "workspace:^" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1490a0f9f7..f7974b33ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -358,12 +358,6 @@ importers: '@deepseek-ai/dsh-client-web': specifier: workspace:^ version: link:../../packages/client/web - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) devDependencies: '@deepseek-ai/cordis-plugin-group': specifier: workspace:^ @@ -404,6 +398,12 @@ importers: playwright: specifier: ^1.49.0 version: 1.61.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1607,15 +1607,6 @@ importers: '@deepseek-ai/dsh-tools': specifier: workspace:^ version: link:../../core/tools - immer: - specifier: ^10.1.1 - version: 10.2.0 - react: - specifier: ^18.2.0 - version: 18.3.1 - zustand: - specifier: ~4.4.7 - version: 4.4.7(@types/react@18.3.31)(immer@10.2.0)(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1638,6 +1629,15 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + immer: + specifier: ^10.1.1 + version: 10.2.0 + react: + specifier: ^18.2.0 + version: 18.3.1 + zustand: + specifier: ~4.4.7 + version: 4.4.7(@types/react@18.3.31)(immer@10.2.0)(react@18.3.1) packages/client/schema-form: dependencies: @@ -1705,15 +1705,6 @@ importers: '@deepseek-ai/dsh-client-ui-primitives': specifier: workspace:^ version: link:../ui-primitives - clsx: - specifier: ^2.0.0 - version: 2.1.1 - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1727,12 +1718,17 @@ importers: '@types/react-dom': specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.31) - - packages/client/ui-commands: - dependencies: clsx: specifier: ^2.0.0 version: 2.1.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + + packages/client/ui-commands: devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1773,6 +1769,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -1785,9 +1784,6 @@ importers: '@deepseek-ai/schemastery': specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1873,15 +1869,14 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-deliverables: - dependencies: - react: - specifier: ^18.2.0 - version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1913,12 +1908,11 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + react: + specifier: ^18.2.0 + version: 18.3.1 packages/client/ui-directory-picker-browse: - dependencies: - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1950,6 +1944,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2036,10 +2033,6 @@ importers: version: 18.3.1(react@18.3.1) packages/client/ui-input-trigger: - dependencies: - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2065,15 +2058,14 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-jobs: - dependencies: - react: - specifier: ^18.2.0 - version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2102,6 +2094,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + react: + specifier: ^18.2.0 + version: 18.3.1 packages/client/ui-layout: devDependencies: @@ -2326,13 +2321,25 @@ importers: version: 18.3.1 packages/client/ui-primitives: - dependencies: + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:^ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-invariants': + specifier: workspace:^ + version: link:../../runtime-diagnostics/invariants '@shikijs/langs': specifier: ^4.3.1 version: 4.3.1 '@types/mdast': specifier: ^4.0.4 version: 4.0.4 + '@types/react': + specifier: ~18.3.1 + version: 18.3.31 + '@types/react-dom': + specifier: ~18.3.0 + version: 18.3.7(@types/react@18.3.31) anser: specifier: ^2.3.5 version: 2.3.5 @@ -2387,19 +2394,6 @@ importers: shiki: specifier: ^4.3.1 version: 4.3.1 - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:^ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-invariants': - specifier: workspace:^ - version: link:../../runtime-diagnostics/invariants - '@types/react': - specifier: ~18.3.1 - version: 18.3.31 - '@types/react-dom': - specifier: ~18.3.0 - version: 18.3.7(@types/react@18.3.31) packages/client/ui-settings: dependencies: @@ -2446,9 +2440,6 @@ importers: '@deepseek-ai/schemastery': specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2489,6 +2480,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2581,10 +2575,6 @@ importers: version: 18.3.1(react@18.3.1) packages/client/ui-settings-plugins: - dependencies: - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2622,15 +2612,14 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-sidebar: - dependencies: - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2659,6 +2648,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2724,10 +2716,6 @@ importers: version: 18.3.31 packages/client/ui-subagent: - dependencies: - react: - specifier: ^18.2.0 - version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2765,6 +2753,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + react: + specifier: ^18.2.0 + version: 18.3.1 packages/client/ui-theme: dependencies: @@ -2777,9 +2768,6 @@ importers: '@deepseek-ai/schemastery': specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2814,15 +2802,14 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-tool: - dependencies: - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2863,6 +2850,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2871,13 +2861,6 @@ importers: version: 18.3.1(react@18.3.1) packages/client/ui-trajectory: - dependencies: - '@tanstack/react-virtual': - specifier: ^3.14.9 - version: 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - diff: - specifier: ^9.0.0 - version: 9.0.0 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2912,12 +2895,18 @@ importers: '@deepseek-ai/dsh-tools': specifier: workspace:^ version: link:../../core/tools + '@tanstack/react-virtual': + specifier: ^3.14.9 + version: 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': specifier: ~18.3.1 version: 18.3.31 '@types/react-dom': specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.31) + diff: + specifier: ^9.0.0 + version: 9.0.0 react: specifier: ^18.2.0 version: 18.3.1 @@ -2942,12 +2931,6 @@ importers: '@deepseek-ai/dsh-client-ui-slots': specifier: workspace:^ version: link:../ui-slots - clsx: - specifier: ^2.0.0 - version: 2.1.1 - react: - specifier: ^18.2.0 - version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2976,12 +2959,14 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - - packages/client/ui-workflow-run: - dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 + + packages/client/ui-workflow-run: devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3019,12 +3004,11 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + react: + specifier: ^18.2.0 + version: 18.3.1 packages/client/ui-workspace: - dependencies: - clsx: - specifier: ^2.0.0 - version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3056,6 +3040,9 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + clsx: + specifier: ^2.0.0 + version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -3083,12 +3070,6 @@ importers: '@deepseek-ai/dsh-client-web-react': specifier: workspace:^ version: link:../web-react - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3111,6 +3092,12 @@ importers: '@types/react-dom': specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.31) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -3120,12 +3107,6 @@ importers: '@deepseek-ai/dsh-client-ui-slots': specifier: workspace:^ version: link:../ui-slots - react: - specifier: ^18.2.0 - version: 18.3.1 - use-sync-external-store: - specifier: 1.2.0 - version: 1.2.0(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3136,6 +3117,12 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 + react: + specifier: ^18.2.0 + version: 18.3.1 + use-sync-external-store: + specifier: 1.2.0 + version: 1.2.0(react@18.3.1) packages/code-runtime/code-runtime: devDependencies: From 7d59006fd18c738007dd89b0e2e8b1caf7143151 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 22:24:23 +0800 Subject: [PATCH 099/103] docs(notes): record how the notices tier learns what ships A package a published browser artifact carries is a runtime disclosure whatever section declares it, and the build answers which ones those are. Record that clause, the dry run behind it, why a bundler's virtual module is not a shipped package, why a types-only package is not either, and the generator run cost the dry run adds. --- .../2026-07-30-generated-third-party-notices.i18n.yaml | 4 ++-- .../process/2026-07-30-generated-third-party-notices.md | 4 +++- .../process/2026-07-30-generated-third-party-notices.zh.md | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml index 821e829c52..dfbdf76bec 100644 --- a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md -2026-07-30-generated-third-party-notices.md: 9ca24c9634b0410f9b7cc255902344cd6014bb90 -2026-07-30-generated-third-party-notices.zh.md: b49e60565bbae62cf17026db17babc1ba7a408dc +2026-07-30-generated-third-party-notices.md: 2128537b09f9d5d68cb1175b1ecb195fa50e1865 +2026-07-30-generated-third-party-notices.zh.md: 906f5ed5b9a11f3ddd68491686b460c5d9f4a682 diff --git a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md index 9ca24c9634..2128537b09 100644 --- a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md +++ b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md @@ -26,6 +26,8 @@ The runtime tier deliberately covers **every mountable plugin**, not just what t The manifest set is derived from the `packages:` members the root `pnpm-workspace.yaml` declares, including the Landlock workspace and its public packages, so a new member area is read the day it is declared rather than the day someone remembers to extend a list. License and repository metadata come from the root workspace's installed pnpm store and package-local link farms, so the generator requires an installed tree and fails loud when a package resolves to neither, rather than emitting an empty cell. `OVERRIDES` carries the packages whose published manifest cannot answer — Rust-built npm bins that omit `license`, and the `modelcontextprotocol/servers` packages whose repository is mid MIT→Apache-2.0 relicensing, so their effective terms are per-contribution. A runtime dependency whose license is not on the permissive list is a hard error: shipping copyleft is a distribution decision, not something a regenerated table may absorb silently. Vendored packages are cross-checked against `vendor/README.md` and rejected if any is not MIT, and `pnpm-workspace.yaml`'s `patchedDependencies` are listed under the runtime table because pnpm applies those patches at install time — shipped artifacts carry modified copies of `@earendil-works/pi-tui` and `node-pty`, and the patch files are the record of what changed. +**A package a published artifact carries is runtime whatever section declares it.** The browser side is built, not resolved: tsdown inlines every non-platform specifier into a plugin's `lib/client.js`, and Vite inlines the shell's imports into `@deepseek-ai/dsh-web-frontend`'s `dist`. Those packages are therefore declared as `devDependencies` — [the client build-time dependency note](../../proposed/process/2026-08-14-client-build-time-deps.md) owns that placement rule — while a copy of each is redistributed, so react, shiki, katex, and the markdown pipeline must stay in the runtime tier. [`scripts/browser-bundled-externals.ts`](../../../../scripts/browser-bundled-externals.ts) answers which ones those are from the build itself: it drives each client bundle through that package's own `tsdown.config.ts` and the shell through `apps/web`'s Vite config, with a recording plugin that resolves every bare specifier as external and notes it. The pass walks this repository's own source and stops at the package boundary, which costs about three seconds and yields exactly the direct-dependency granularity this file discloses. A specifier counts only once the host resolves it to a file inside a package, so a bundler's own virtual module is not mistaken for a shipped one: `vite/modulepreload-polyfill` is generated by a Vite plugin rather than published as a file, which makes the polyfill in the `dist` build glue of the same kind as an emitted TypeScript helper. Using the real configurations rather than a hand-kept list buys two properties no list has: an erased type import never appears, because the transform drops it before resolution, and a package stops being disclosed as shipped the moment its last browser import is gone. Workspace names are followed only on the Vite side, where the shell's aliases map them to source — that is how a browser-only library's own imports, `ui-primitives`' katex and shiki among them, become visible. A package that ships only type declarations is development-only however a shipped package names it: it contributes no redistributed code, and the dry run cannot see an erased type import anyway, because the transform drops it before resolution. `@types/mdast` and `micromark-util-types` moved to that tier for exactly this reason. + The project owner separately authorizes distribution of every official `@anthropic-ai/claude-agent-sdk` version and the official Claude Code CLI/platform payloads that version declares through `optionalDependencies`. The generator represents this as one exact direct-package identity exception, not as a permissive-license override: `SEE LICENSE IN README.md` and `SEE LICENSE IN LICENSE.md` remain non-permissive classifications, and every unrelated non-permissive runtime still fails closed. When the SDK is present, the generator reads its installed manifest, rejects optional identities outside the official SDK payload prefix, derives the current SDK, CLI, and payload versions, verifies the installed host payload's identity, version, and declared-license field, and renders the complete SDK-declared payload set in a separate notices section. Version, declared-license, and payload-set changes do not require new identity authorization, but they still require ordinary dependency, lockfile, compatibility, terms, and notices review. ## Testing @@ -52,7 +54,7 @@ The Claude distribution tests prove that only the exact direct SDK identity bypa ## Consequences -A dependency edit now carries a regenerated notices file into the same commit. Contributors pay one generator run — about a second — on commits that touch a manifest, and nothing on any other commit. Committing with hooks disabled defers the cost to a test-lane failure that names the command. +A dependency edit now carries a regenerated notices file into the same commit. Contributors pay one generator run on commits that touch a manifest, and nothing on any other commit. It costs a few seconds rather than one, because learning what the browser artifacts carry drives the real client and shell bundlers; a broken client source therefore fails the hook, as the staged lint job already would. Committing with hooks disabled defers the cost to a test-lane failure that names the command. The generator needs an installed tree, which makes it heavier than a pure-source generator, and a new package with unusable published metadata needs an `OVERRIDES` entry rather than silently rendering a blank license. Both failures are loud and name the remedy. diff --git a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md index b49e60565b..906f5ed5b9 100644 --- a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md +++ b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md @@ -26,6 +26,8 @@ Status: implemented manifest 集合由根 `pnpm-workspace.yaml` 声明的 `packages:` 成员派生,其中包括 Landlock 工作区及其公开包,因此新增成员区域在声明当天就会被读取,而不必等谁想起来去补一份列表。许可证与仓库地址取自根工作区已安装的 pnpm store 和包本地链接场;某个包两处都解析不到时直接失败,而不是留下空单元格。`OVERRIDES` 收录已发布 manifest 答不上来的包:用 Rust 构建、发布时省略 `license` 字段的 npm 可执行包,以及 `modelcontextprotocol/servers` 系列——该仓库正处在 MIT 向 Apache-2.0 的重新许可过程中,实际条款按贡献逐条而定。运行时依赖的许可证若不在宽松清单内即为硬失败:交付 copyleft 是一项分发决策,不该被一次重新生成悄悄吸收。被源码收编的包会与 `vendor/README.md` 交叉核对,出现非 MIT 即报错;`pnpm-workspace.yaml` 的 `patchedDependencies` 列入运行时表格,因为 pnpm 在安装期就会打上这些补丁——交付产物携带的是改动过的 `@earendil-works/pi-tui` 与 `node-pty`,补丁文件本身就是改动的完整记录。 +**被已发布产物带上的包,无论由哪个区段声明都算 runtime。** 浏览器侧是构建出来的,不是解析出来的:tsdown 把每个非平台 specifier 内联进插件的 `lib/client.js`,Vite 把 shell 的 import 内联进 `@deepseek-ai/dsh-web-frontend` 的 `dist`。因此这些包声明在 `devDependencies`——落位规则归 [客户端构建期依赖那篇](../../proposed/process/2026-08-14-client-build-time-deps.md)——但它们各自都有一份副本被分发出去,所以 react、shiki、katex 与整条 markdown 管线必须留在 runtime 档。到底是哪些包,由 [`scripts/browser-bundled-externals.ts`](../../../../scripts/browser-bundled-externals.ts) 从构建本身取答案:它用各包自己的 `tsdown.config.ts` 驱动每个 client bundle,用 `apps/web` 的 Vite 配置驱动 shell,挂一个记录用插件把每个 bare specifier 解析成 external 并记下来。这一趟只走本仓自己的源码、到包边界即停,约三秒,且给出的正是本文件披露的「直接依赖」粒度。一个 specifier 只有在宿主把它解析到某个包内的文件之后才被计入,所以打包器自己的虚拟模块不会被误当成随产物分发的包:`vite/modulepreload-polyfill` 由 Vite 插件生成而非作为文件发布,因此 `dist` 里那段 polyfill 与 TypeScript 生成的辅助代码同类,属于构建胶水。用真配置而不是一张人工名单,白拿两个手写名单没有的性质:被擦除的类型 import 永远不会出现,因为 transform 在解析前就删了它;某个包最后一处浏览器 import 消失时,它也立刻不再被披露成随产物分发。workspace 名字只在 Vite 那侧继续走,因为 shell 的 alias 会把它们映射到源码——浏览器库包自己的 import,比如 `ui-primitives` 的 katex 与 shiki,正是这样才可见的。 只发布类型声明的包一律算 development-only,无论哪个已发布包具名了它:它不贡献任何被分发的代码,而 dry-run 本来也看不见被擦除的类型 import——transform 在解析前就删了它。`@types/mdast` 与 `micromark-util-types` 正是因此落到该档。 + 项目所有者另行授权分发每个官方 `@anthropic-ai/claude-agent-sdk` 版本,以及该版本通过 `optionalDependencies` 声明的官方 Claude Code CLI 与平台载荷。生成器将其表示为一项精确匹配直接包身份的例外,而非宽松许可证覆盖项:`SEE LICENSE IN README.md` 与 `SEE LICENSE IN LICENSE.md` 仍归类为非宽松,所有无关的非宽松运行时依赖仍以默认拒绝方式失败。存在该 SDK 时,生成器会读取其已安装 manifest,拒绝不符合官方 SDK 载荷前缀的可选包身份,推导当前 SDK、CLI 与载荷版本,核验已安装宿主载荷的身份、版本和声明许可证字段,并在单独的声明章节中渲染 SDK 声明的完整载荷集合。版本、声明许可证和载荷集合发生变化时无需新的身份授权,但仍须经过常规的依赖、锁文件、兼容性、条款和声明评审。 ## 测试 @@ -52,7 +54,7 @@ Claude 分发测试证明:只有精确匹配的直接 SDK 身份会绕过通 ## 后果 -此后改动依赖时,重新生成的披露文件会随同一个提交入库。触及 manifest 的提交多付一次生成器运行——约一秒;其余提交不受影响。若禁用钩子提交,代价推迟为一次测试 lane 失败,其报错会指明补救命令。 +此后改动依赖时,重新生成的披露文件会随同一个提交入库。触及 manifest 的提交多付一次生成器运行;其余提交不受影响。这次运行从约一秒变成几秒,因为要弄清浏览器产物带了什么就得驱动真实的 client 与 shell 打包器;因此客户端源码坏掉会让这个 hook 失败,而暂存区的 lint job 本来也会失败。若禁用钩子提交,代价推迟为一次测试 lane 失败,其报错会指明补救命令。 生成器需要已安装的依赖树,因此比纯源码生成器更重;发布元数据不可用的新包需要补一条 `OVERRIDES`,而不是默默渲染出空白许可证。这两类失败都会明确报错并指出补救方式。 From 1fae5dc40ec3cf7e559550a80ba88d5f029f87b0 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 22:24:23 +0800 Subject: [PATCH 100/103] fix(scripts): disclose browser-bundled packages as shipped MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moving react, shiki, katex and the markdown pipeline to devDependencies took them out of the notices runtime tier, which tiers by declaring section — yet their code is inside lib/client.js and the shell dist. The generator now learns what the browser artifacts carry from the real build configs: each client bundle through its own tsdown config, the shell through apps/web's Vite config, with a recorder that resolves each bare specifier, notes the package behind it, and stops there. About three seconds, and only packages a resolved file backs, so a bundler's virtual module is not mistaken for a shipped one. Net effect on the file: the type-only packages @types/mdast and micromark-util-types move to the development tier, because neither ships code. --- THIRD_PARTY_NOTICES.md | 8 +- lefthook.yml | 2 +- scripts/browser-bundled-externals.ts | 177 ++++++++++++++++++++++++ scripts/gen-third-party-notices.spec.ts | 24 +++- scripts/gen-third-party-notices.ts | 47 ++++--- 5 files changed, 234 insertions(+), 24 deletions(-) create mode 100644 scripts/browser-bundled-externals.ts diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 92b218ff33..482d0ea1ce 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -27,7 +27,7 @@ The Cordis framework and its foundation libraries are source-vendored into this ## Runtime npm dependencies -External packages that a workspace package resolves at runtime. The tier covers every plugin a user can mount from `cordis.yml` — not only what the `dsh` CLI, Web UI, and Python SDK runtime load by default. +External packages that reach a user: a workspace package resolves them at runtime, or a published browser artifact carries a copy of their code. The tier covers every plugin a user can mount from `cordis.yml` — not only what the `dsh` CLI, Web UI, and Python SDK runtime load by default — and the packages the client build inlines into a plugin bundle or the shell `dist`, which are declared as `devDependencies` because nothing on a user's machine resolves their specifiers. | Package | License | | --- | --- | @@ -48,7 +48,6 @@ External packages that a workspace package resolves at runtime. The tier covers | [`@shikijs/langs`](https://github.com/shikijs/shiki) | MIT | | [`@standard-schema/spec`](https://github.com/standard-schema/standard-schema) | MIT | | [`@tanstack/react-virtual`](https://github.com/TanStack/virtual) | MIT | -| [`@types/mdast`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@vscode/ripgrep`](https://github.com/microsoft/vscode-ripgrep) | MIT | | [`anser`](https://github.com/IonicaBizau/anser) | MIT | | [`chokidar`](https://github.com/paulmillr/chokidar) | MIT | @@ -73,7 +72,6 @@ External packages that a workspace package resolves at runtime. The tier covers | [`micromark-util-classify-character`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-classify-character) | MIT | | [`micromark-util-sanitize-uri`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-sanitize-uri) | MIT | | [`micromark-util-symbol`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-symbol) | MIT | -| [`micromark-util-types`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-types) | MIT | | [`node-addon-require-builtin`](https://www.npmjs.com/package/node-addon-require-builtin) | MIT | | [`node-pty`](https://github.com/microsoft/node-pty) | MIT | | [`picomatch`](https://github.com/micromatch/picomatch) | MIT | @@ -115,7 +113,7 @@ The installed SDK 0.3.220 declares the following optional platform packages. Eac ## Development-only npm dependencies -External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — `pnpm-lock.yaml` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. +External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace, and carried by no published artifact. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — `pnpm-lock.yaml` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. | Package | License | | --- | --- | @@ -129,6 +127,7 @@ External packages **directly declared** only by repository tooling, test infrast | [`@types/babel__code-frame`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/js-yaml`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/jsdom`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | +| [`@types/mdast`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/node`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/picomatch`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/react`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | @@ -154,6 +153,7 @@ External packages **directly declared** only by repository tooling, test infrast | [`lefthook`](https://github.com/evilmartians/lefthook) | MIT | | [`lightningcss`](https://github.com/parcel-bundler/lightningcss) | MPL-2.0 | | [`mermaid`](https://github.com/mermaid-js/mermaid) | MIT | +| [`micromark-util-types`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-types) | MIT | | [`oxlint`](https://github.com/oxc-project/oxc) | MIT | | [`oxlint-tsgolint`](https://github.com/oxc-project/tsgolint) | MIT | | [`playwright`](https://github.com/microsoft/playwright) | Apache-2.0 | diff --git a/lefthook.yml b/lefthook.yml index 1c2a693c88..01c4a5b519 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -28,7 +28,7 @@ pre-commit: # lefthook only inspects files present on disk — so that one case still # falls through to the freshness assertion in the test lane. - name: third-party notices (staged) - glob: '{package.json,*/package.json,*/*/package.json,*/*/*/package.json,*/*/*/*/package.json,pnpm-workspace.yaml,*/*/pnpm-workspace.yaml,pnpm-lock.yaml,vendor/README.md,python/*/pyproject.toml,scripts/gen-third-party-notices.ts,scripts/build-exe-for-python-sdk.ts}' + glob: '{package.json,*/package.json,*/*/package.json,*/*/*/package.json,*/*/*/*/package.json,pnpm-workspace.yaml,*/*/pnpm-workspace.yaml,pnpm-lock.yaml,vendor/README.md,python/*/pyproject.toml,scripts/gen-third-party-notices.ts,scripts/browser-bundled-externals.ts,packages/client/tsdown.client.ts,scripts/build-exe-for-python-sdk.ts}' run: node_modules/.bin/tsx scripts/gen-third-party-notices.ts && git add THIRD_PARTY_NOTICES.md - name: whitespace (staged) diff --git a/scripts/browser-bundled-externals.ts b/scripts/browser-bundled-externals.ts new file mode 100644 index 0000000000..4ab572f544 --- /dev/null +++ b/scripts/browser-bundled-externals.ts @@ -0,0 +1,177 @@ +/** + * The external packages a published browser artifact carries a copy of. + * + * Read from the real build configurations rather than declared by hand: each + * `lib/client.js` plugin bundle is driven through its own `tsdown.config.ts`, and + * the shell `dist` through `apps/web`'s Vite config. A recording plugin resolves + * every bare specifier as external and notes it, so the pass walks our own source + * and stops at the package boundary — which is both fast (about two seconds for + * the whole repository) and exactly the direct-dependency granularity + * THIRD_PARTY_NOTICES.md discloses. Erased type imports never appear, because the + * transform drops them before resolution. + * + * Workspace names are followed only on the Vite side, where the shell's aliases + * map them to source: that is how a browser-only library's own third-party + * imports — katex and shiki through `ui-primitives`, for one — become visible. A + * plugin bundle keeps them external, matching the frozen module table it is built + * against; the wire layers it inlines are host packages that declare their own + * dependencies, so nothing goes undisclosed. + * + * A specifier is recorded only once the host resolves it to a file inside a + * package. A bundler's own virtual module has no package behind it — + * `vite/modulepreload-polyfill` is generated by a Vite plugin rather than shipped + * as a file, so the polyfill in the published `dist` is build glue in the same + * category as an emitted TypeScript helper, not a redistributed copy of Vite. + * + * rolldown is resolved through tsdown deliberately: the dry run must use the + * exact bundler the real build uses, which a separate root pin could drift from. + */ + +import { globSync, readFileSync } from 'node:fs' +import { createRequire } from 'node:module' +import { dirname, join } from 'node:path' + +/** The plugin-context member the recorder needs to resolve before recording. */ +interface ResolveContext { + resolve: ( + source: string, + importer: string, + options: { skipSelf: boolean }, + ) => Promise<{ id: string } | null> +} + +/** A rolldown/Vite plugin shape, narrowed to what the recorder needs. */ +interface RecorderPlugin { + name: string + enforce?: 'pre' + resolveId: ( + this: ResolveContext, + source: string, + importer: string | undefined, + ) => Promise<{ id: string; external: true } | null> +} + +/** + * The package a resolved module file belongs to. + * @param file - absolute path of a resolved module. + * @returns the package name, or undefined when the file is not inside a package. + */ +function packageOfFile(file: string): string | undefined { + const marker = file.lastIndexOf('node_modules/') + if (marker < 0) return undefined + const rest = file.slice(marker + 'node_modules/'.length) + const parts = rest.split('/') + return rest.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0] +} + +/** + * Build the plugin that records bare specifiers and stops the walk at them. + * @param seen - set the recorder adds package names to. + * @param followWorkspace - leave `@deepseek-ai/*` to the host resolver instead of + * externalizing it, so the walk continues into our own source. + * @returns the recording plugin. + */ +function recorder(seen: Set, followWorkspace: boolean): RecorderPlugin { + return { + name: 'dsh-record-direct-externals', + enforce: 'pre', + async resolveId(source, importer) { + if (importer === undefined) return null // the entry itself + if (source.startsWith('.') || source.startsWith('/') || source.startsWith('\0')) return null + if (source.startsWith('virtual:') || source.includes('?')) return null + if (followWorkspace && source.startsWith('@deepseek-ai/')) return null + if (source.startsWith('node:')) return { id: source, external: true } + if (!source.startsWith('@deepseek-ai/')) { + const resolved = await this.resolve(source, importer, { skipSelf: true }) + const name = resolved === null ? undefined : packageOfFile(resolved.id) + if (name !== undefined) seen.add(name) + } + return { id: source, external: true } + }, + } +} + +interface Manifest { + exports?: Record + files?: string[] +} + +/** Read one workspace manifest. */ +function manifestOf(dir: string): Manifest { + return JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as Manifest +} + +/** Whether a manifest publishes a tsdown browser bundle at `lib/client.js`. */ +function publishesClientBundle(manifest: Manifest): boolean { + const target = manifest.exports?.['./client'] + return typeof target === 'object' && target !== null && target.default === './lib/client.js' +} + +/** + * Record every external package the plugin client bundles carry. + * @param root - repository root. + * @param seen - set the recorder adds package names to. + */ +async function collectFromClientBundles(root: string, seen: Set): Promise { + const requireFromTsdown = createRequire(createRequire(import.meta.url).resolve('tsdown')) + const { rolldown } = await import(requireFromTsdown.resolve('rolldown')) as { + rolldown: (options: Record) => Promise<{ + generate: (output: Record) => Promise + close: () => Promise + }> + } + + for (const relative of globSync('packages/*/*/tsdown.config.ts', { cwd: root }).sort()) { + const dir = join(root, dirname(relative)) + if (!publishesClientBundle(manifestOf(dir))) continue + const loaded = await import(join(root, relative)) as { default: unknown } + const factory = loaded.default + const configs = (typeof factory === 'function' + ? (factory as (inline: { env: Record }) => unknown[])({ env: {} }) + : [factory]) as { name?: string; entry?: unknown; plugins?: unknown[] }[] + // The `/client` config is the browser bundle; its siblings emit the node half. + const client = configs.find(config => config.name?.endsWith('/client') === true) + if (client === undefined) continue + const bundle = await rolldown({ + cwd: dir, + input: client.entry, + plugins: [recorder(seen, false), ...(client.plugins ?? [])], + platform: 'browser', + }) + await bundle.generate({ format: 'cjs', minify: false, sourcemap: false }) + await bundle.close() + } +} + +/** + * Record every external package the prebuilt shell bundle carries. + * @param root - repository root. + * @param seen - set the recorder adds package names to. + */ +async function collectFromShellBundle(root: string, seen: Set): Promise { + for (const relative of globSync('apps/*/vite.config.ts', { cwd: root }).sort()) { + const dir = join(root, dirname(relative)) + // Vite belongs to the app that builds with it, so it resolves from there. + const { build } = await import(createRequire(join(dir, 'package.json')).resolve('vite')) as { + build: (options: Record) => Promise + } + await build({ + root: dir, + logLevel: 'error', + plugins: [recorder(seen, true)], + build: { write: false, minify: false, sourcemap: false, reportCompressedSize: false }, + }) + } +} + +/** + * The external packages a published browser artifact carries a copy of. + * @param root - repository root. + * @returns package names, workspace names excluded. + */ +export async function browserBundledExternals(root: string): Promise> { + const seen = new Set() + await collectFromClientBundles(root, seen) + await collectFromShellBundle(root, seen) + return seen +} diff --git a/scripts/gen-third-party-notices.spec.ts b/scripts/gen-third-party-notices.spec.ts index 479a2f13b1..5cd4f6b7fa 100644 --- a/scripts/gen-third-party-notices.spec.ts +++ b/scripts/gen-third-party-notices.spec.ts @@ -24,11 +24,12 @@ describe('THIRD_PARTY_NOTICES.md', () => { // already runs in the test lane, so the check costs no extra CI process. // Pre-commit regenerates the file whenever a manifest is staged, so reaching // this assertion means the notices were committed without that hook. - it('matches what the generator produces from the current manifests', () => { - const generated = render() + it('matches what the generator produces from the current manifests', async () => { + const generated = await render() expect(generated).toContain('It depends on the third-party software listed below.') expect(readFileSync(resolve(root, 'THIRD_PARTY_NOTICES.md'), 'utf8'), 'stale notices — run `pnpm run gen-third-party-notices`').toBe(generated) - }) + // Driving the two real bundlers to learn what ships costs a few seconds. + }, 60_000) }) /** Build the (manifests, names) pair `tierExternalDeps` consumes. */ @@ -67,6 +68,23 @@ describe('tierExternalDeps', () => { ])) }) + it('keeps a devDependency runtime when a published browser artifact carries it', () => { + const { manifests, names } = workspace({ + // The client build inlines these, so a copy ships even though no manifest + // resolves the specifier at run time. + 'packages/client/ui-primitives/package.json': { + name: '@deepseek-ai/dsh-client-ui-primitives', + devDependencies: { katex: '^0.16', 'test-only-helper': '^1' }, + }, + }) + + expect(tierExternalDeps(manifests, names, new Set(['katex']))).toEqual(new Map([ + ['tsx', true], + ['katex', true], + ['test-only-helper', false], + ])) + }) + it('keeps a package runtime when any shipping area declares it, and excludes workspace links', () => { const { manifests, names } = workspace({ 'package.json': { devDependencies: { shared: '^1' } }, diff --git a/scripts/gen-third-party-notices.ts b/scripts/gen-third-party-notices.ts index f2411f5eff..1762e2d125 100644 --- a/scripts/gen-third-party-notices.ts +++ b/scripts/gen-third-party-notices.ts @@ -13,6 +13,7 @@ import { resolve } from 'node:path' import * as yaml from 'js-yaml' import { parse as parseToml, type TomlTableWithoutBigInt, type TomlValueWithoutBigInt } from 'smol-toml' import parseSpdx from 'spdx-expression-parse' +import { browserBundledExternals } from './browser-bundled-externals.ts' const root = resolve(import.meta.dirname, '..') const OUT = 'THIRD_PARTY_NOTICES.md' @@ -347,15 +348,17 @@ function normalizeRepo(raw: string | undefined): string | undefined { } /** - * External npm dependencies, tiered by which workspace area declares them at - * runtime: a package is runtime when any manifest outside `DEV_ONLY_AREAS` - * names it in `dependencies`/`optionalDependencies`. A package declared only - * by tooling, test infrastructure, the website, or the demo leaves — whatever - * the declaring section is called — is development-only. + * External npm dependencies, tiered by what reaches a user: a package is runtime + * when any manifest outside `DEV_ONLY_AREAS` names it in + * `dependencies`/`optionalDependencies`, or when a published browser artifact + * carries a copy of it. A package declared only by tooling, test infrastructure, + * the website, or the demo leaves — whatever the declaring section is called, and + * with no shipped artifact carrying it — is development-only. + * @returns every external dependency with its tier and metadata. */ -function collectNpmDeps(): ExternalDep[] { +async function collectNpmDeps(): Promise { const { manifests, names } = loadWorkspaceManifests() - return [...tierExternalDeps(manifests, names)] + return [...tierExternalDeps(manifests, names, await browserBundledExternals(root))] .filter(([name]) => !FIRST_PARTY.has(name)) .sort(([a], [b]) => a.localeCompare(b)) .map(([name, runtime]) => ({ name, ...installedMetadata(name), runtime })) @@ -363,11 +366,23 @@ function collectNpmDeps(): ExternalDep[] { /** * Tier every external dependency the workspace declares. + * + * A package a published browser artifact carries is runtime whatever section + * declares it: the client build inlines its code, or the shell `dist` answers it + * from the frozen module table, so a copy is redistributed even though nothing on + * a user's machine resolves the specifier. Those packages are declared as + * `devDependencies` — `verify-client-runtime-deps` owns that rule — and tiering + * them by section alone would understate the notice. * @param manifests - workspace manifests keyed by repository-relative path. * @param names - every workspace package name, which never counts as external. + * @param bundled - external packages a published browser artifact carries. * @returns each external package mapped to whether it is a runtime dependency. */ -export function tierExternalDeps(manifests: Map, names: Set): Map { +export function tierExternalDeps( + manifests: Map, + names: Set, + bundled: ReadonlySet = new Set(), +): Map { const tiers = new Map() // `tsx` is runtime by fiat: the root source-run scripts execute through its ESM hook. tiers.set('tsx', true) @@ -376,7 +391,7 @@ export function tierExternalDeps(manifests: Map, names: Set { verifyBuildTimePins() - const npm = collectNpmDeps() + const npm = await collectNpmDeps() const runtimeDeps = npm.filter(dep => dep.runtime) const devDeps = npm.filter(dep => !dep.runtime) const vendored = collectVendored() @@ -707,7 +722,7 @@ ${vendored.map(row => `| \`${row.npmName}\` | \`${row.upstreamName}\` | [${row.u ## Runtime npm dependencies -External packages that a workspace package resolves at runtime. The tier covers every plugin a user can mount from \`cordis.yml\` — not only what the \`dsh\` CLI, Web UI, and Python SDK runtime load by default. +External packages that reach a user: a workspace package resolves them at runtime, or a published browser artifact carries a copy of their code. The tier covers every plugin a user can mount from \`cordis.yml\` — not only what the \`dsh\` CLI, Web UI, and Python SDK runtime load by default — and the packages the client build inlines into a plugin bundle or the shell \`dist\`, which are declared as \`devDependencies\` because nothing on a user's machine resolves their specifiers. ${renderNpmTable(runtimeDeps)} @@ -718,7 +733,7 @@ ${renderClaudeDistribution(claudeDistribution)} ## Development-only npm dependencies -External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — \`pnpm-lock.yaml\` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. +External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace, and carried by no published artifact. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — \`pnpm-lock.yaml\` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. ${renderNpmTable(devDeps)} ${renderNonPermissiveNote(nonPermissiveDev)} @@ -746,8 +761,8 @@ ${BUILD_TIME_TOOLS.map(tool => `| [\`${tool.name}\`](${tool.repo}) | ${tool.lice /** CLI entry: default writes the notices, `--check` fails if the committed copy * is stale. Guarded behind an entry-point check so importing this module for * tests neither regenerates the committed file nor calls process.exit. */ -function main(): void { - const content = render() +async function main(): Promise { + const content = await render() if (process.argv.includes('--check')) { let committed: string | null = null try { @@ -771,5 +786,5 @@ function main(): void { // Run only when invoked as a script, not when imported by a test. if (process.argv[1] !== undefined && import.meta.filename === resolve(process.argv[1])) { - main() + await main() } From b6d0195d5f04be9c3867cc776ab922c5dbd2f448 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Fri, 14 Aug 2026 22:35:11 +0800 Subject: [PATCH 101/103] fix(scripts): resolve workspace names to source in the notices dry run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shell's Vite config aliases a few workspace packages to source; every other workspace name resolved through node_modules to a lib/ entry the real build has emitted but a clean checkout has not, so the generator only worked on a built tree — and a static gate has to pass on a clean one. The dry run now supplies source aliases for the names the shell leaves out. Aliases rather than the recorder's resolveId hook, because Vite resolves a stylesheet @import through aliases alone, and the theme package publishes its stylesheets from lib/styles/. lib/ is compiled from src/, and the recorded set is identical either way: 24 packages on a built tree and on a clean one. --- scripts/browser-bundled-externals.ts | 71 ++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/scripts/browser-bundled-externals.ts b/scripts/browser-bundled-externals.ts index 4ab572f544..1ed61b1704 100644 --- a/scripts/browser-bundled-externals.ts +++ b/scripts/browser-bundled-externals.ts @@ -23,11 +23,18 @@ * as a file, so the polyfill in the published `dist` is build glue in the same * category as an emitted TypeScript helper, not a redistributed copy of Vite. * + * The pass runs on a clean tree, as a static gate must. The shell's Vite config + * aliases a few workspace packages to source; every other workspace name would + * resolve through `node_modules` to a `lib/` entry the real build has emitted but + * a clean checkout has not, so this module resolves those names to their own + * source instead. `lib/` is compiled from `src/`, so the third-party edges the + * pass records are the same either way. + * * rolldown is resolved through tsdown deliberately: the dry run must use the * exact bundler the real build uses, which a separate root pin could drift from. */ -import { globSync, readFileSync } from 'node:fs' +import { existsSync, globSync, readFileSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join } from 'node:path' @@ -64,14 +71,50 @@ function packageOfFile(file: string): string | undefined { return rest.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0] } +/** + * Source aliases for the workspace packages the shell does not already alias. + * + * A clean checkout has no `lib/`, so a workspace name would otherwise resolve + * through `node_modules` to an entry that does not exist yet. Aliases are the + * right seam rather than a plugin hook, because Vite resolves a stylesheet + * `@import` through them too — the theme package publishes its stylesheets from + * `lib/styles/`. `lib/` is compiled from `src/`, so the third-party edges the + * pass records are the same either way. + * @param root - repository root. + * @param existing - the shell's own alias patterns, whose entry choices win. + * @returns alias entries mapping each remaining workspace name to its source. + */ +function workspaceSourceAliases(root: string, existing: readonly string[]): { find: RegExp | string; replacement: string }[] { + const aliases: { find: RegExp | string; replacement: string }[] = [] + for (const pattern of ['packages/*/*/package.json', 'vendor/*/package.json']) { + for (const relative of globSync(pattern, { cwd: root })) { + const dir = join(root, dirname(relative)) + const manifest = JSON.parse(readFileSync(join(root, relative), 'utf8')) as Manifest & { name?: string } + const name = manifest.name + if (name === undefined || !existsSync(join(dir, 'src'))) continue + if (existing.some(find => find.includes(name))) continue + const root_ = manifest.exports?.['.'] + const target = typeof root_ === 'string' ? root_ : root_?.default + const stem = (target ?? './lib/index.js') + .replace(/^\.\/lib\/types\//, '').replace(/^\.\/lib\//, '').replace(/\.js$/, '') + const entry = [`${stem}.ts`, `${stem}.tsx`, `${stem}/index.ts`, `${stem}/index.tsx`] + .map(candidate => join(dir, 'src', candidate)) + .find(candidate => existsSync(candidate)) + // The subpath prefix carries `./client`, `./types`, and `./styles/*` alike: + // each published subpath mirrors a path under `src/`. + aliases.push({ find: `${name}/`, replacement: `${join(dir, 'src')}/` }) + if (entry !== undefined) aliases.push({ find: new RegExp(`^${name.replaceAll('/', '\\/')}$`), replacement: entry }) + } + } + return aliases +} + /** * Build the plugin that records bare specifiers and stops the walk at them. * @param seen - set the recorder adds package names to. - * @param followWorkspace - leave `@deepseek-ai/*` to the host resolver instead of - * externalizing it, so the walk continues into our own source. * @returns the recording plugin. */ -function recorder(seen: Set, followWorkspace: boolean): RecorderPlugin { +function recorder(seen: Set): RecorderPlugin { return { name: 'dsh-record-direct-externals', enforce: 'pre', @@ -79,7 +122,9 @@ function recorder(seen: Set, followWorkspace: boolean): RecorderPlugin { if (importer === undefined) return null // the entry itself if (source.startsWith('.') || source.startsWith('/') || source.startsWith('\0')) return null if (source.startsWith('virtual:') || source.includes('?')) return null - if (followWorkspace && source.startsWith('@deepseek-ai/')) return null + // A workspace name that reaches here is one no alias mapped to source, so + // nothing of ours is left to walk; it is never a third-party disclosure. + if (source.startsWith('@deepseek-ai/')) return { id: source, external: true } if (source.startsWith('node:')) return { id: source, external: true } if (!source.startsWith('@deepseek-ai/')) { const resolved = await this.resolve(source, importer, { skipSelf: true }) @@ -92,7 +137,7 @@ function recorder(seen: Set, followWorkspace: boolean): RecorderPlugin { } interface Manifest { - exports?: Record + exports?: Record files?: string[] } @@ -135,7 +180,7 @@ async function collectFromClientBundles(root: string, seen: Set): Promis const bundle = await rolldown({ cwd: dir, input: client.entry, - plugins: [recorder(seen, false), ...(client.plugins ?? [])], + plugins: [recorder(seen), ...(client.plugins ?? [])], platform: 'browser', }) await bundle.generate({ format: 'cjs', minify: false, sourcemap: false }) @@ -152,13 +197,21 @@ async function collectFromShellBundle(root: string, seen: Set): Promise< for (const relative of globSync('apps/*/vite.config.ts', { cwd: root }).sort()) { const dir = join(root, dirname(relative)) // Vite belongs to the app that builds with it, so it resolves from there. - const { build } = await import(createRequire(join(dir, 'package.json')).resolve('vite')) as { + const { build, resolveConfig } = await import(createRequire(join(dir, 'package.json')).resolve('vite')) as { build: (options: Record) => Promise + resolveConfig: (options: Record, command: string) => Promise<{ + resolve: { alias: { find: string | RegExp }[] } + }> } + // The shell already aliases some workspace names to source, and its entry + // choices win: a stylesheet `@import` resolves through aliases rather than a + // plugin hook, so only the names it leaves out get one from here. + const resolved = await resolveConfig({ root: dir, logLevel: 'error' }, 'build') await build({ root: dir, logLevel: 'error', - plugins: [recorder(seen, true)], + plugins: [recorder(seen)], + resolve: { alias: workspaceSourceAliases(root, resolved.resolve.alias.map(entry => String(entry.find))) }, build: { write: false, minify: false, sourcemap: false, reportCompressedSize: false }, }) } From ef249da2e989f22749b32fabf3b71e8b5e962368 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Sat, 15 Aug 2026 01:31:37 +0800 Subject: [PATCH 102/103] perf(web): remove the module preload polyfill The preload links stay; browsers that ignore them fetch vendor when index imports it. --- apps/web/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 7b9ef7a15b..2289b6c13a 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -93,6 +93,7 @@ export default defineConfig({ plugins: [rejectStandaloneServe(), react()], build: { sourcemap: true, + modulePreload: { polyfill: false }, rollupOptions: { output: { // Output layout: the two main chunks stay at assets/ root; lazy From f2830fec6ddaf898cf09036043b840e3b9b129ea Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Sat, 15 Aug 2026 02:19:09 +0800 Subject: [PATCH 103/103] Revert "fix(client): declare browser-only externals as devDependencies" --- ...30-generated-third-party-notices.i18n.yaml | 4 +- ...026-07-30-generated-third-party-notices.md | 4 +- ...-07-30-generated-third-party-notices.zh.md | 4 +- ...026-08-14-client-build-time-deps.i18n.yaml | 6 - .../2026-08-14-client-build-time-deps.md | 100 ----- .../2026-08-14-client-build-time-deps.zh.md | 100 ----- THIRD_PARTY_NOTICES.md | 8 +- apps/web/package.json | 8 +- apps/web/vite.config.ts | 1 - lefthook.yml | 2 +- package.json | 3 +- packages/client/AGENTS.md | 11 +- packages/client/locale/package.json | 3 +- packages/client/runtime/package.json | 10 +- packages/client/ui-agent-preset/package.json | 3 +- packages/client/ui-attachment/package.json | 10 +- packages/client/ui-commands/package.json | 9 +- packages/client/ui-conversation/package.json | 7 +- packages/client/ui-deliverables/package.json | 6 +- .../ui-directory-picker-browse/package.json | 9 +- .../ui-directory-picker-native/package.json | 3 +- packages/client/ui-goal/package.json | 3 +- packages/client/ui-input-trigger/package.json | 9 +- packages/client/ui-jobs/package.json | 6 +- packages/client/ui-layout/package.json | 3 +- .../client/ui-message-feedback/package.json | 3 +- .../client/ui-model-selection/package.json | 4 +- .../client/ui-permission-presets/package.json | 3 +- packages/client/ui-plan/package.json | 3 +- packages/client/ui-primitives/package.json | 12 +- .../client/ui-settings-general/package.json | 9 +- .../client/ui-settings-models/package.json | 3 +- .../ui-settings-plugin-inventory/package.json | 3 +- .../client/ui-settings-plugins/package.json | 9 +- packages/client/ui-settings/package.json | 3 +- packages/client/ui-sidebar/package.json | 9 +- packages/client/ui-skill/package.json | 3 +- packages/client/ui-subagent/package.json | 6 +- packages/client/ui-theme/package.json | 5 +- packages/client/ui-tool/package.json | 7 +- packages/client/ui-trajectory/package.json | 12 +- .../client/ui-user-questions/package.json | 8 +- packages/client/ui-workflow-run/package.json | 6 +- packages/client/ui-workspace/package.json | 9 +- packages/client/web-react/package.json | 8 +- packages/client/web/package.json | 8 +- .../cordis-client-runner/package.json | 3 +- packages/extensions/ui-cordis/package.json | 3 +- .../session-log-export/package.json | 34 +- pnpm-lock.yaml | 215 +++++----- scripts/browser-bundled-externals.ts | 230 ----------- scripts/gen-third-party-notices.spec.ts | 24 +- scripts/gen-third-party-notices.ts | 47 +-- scripts/verify-client-runtime-deps.ts | 368 ------------------ 54 files changed, 293 insertions(+), 1096 deletions(-) delete mode 100644 .agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml delete mode 100644 .agents/notes/proposed/process/2026-08-14-client-build-time-deps.md delete mode 100644 .agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md delete mode 100644 scripts/browser-bundled-externals.ts delete mode 100644 scripts/verify-client-runtime-deps.ts diff --git a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml index dfbdf76bec..821e829c52 100644 --- a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md -2026-07-30-generated-third-party-notices.md: 2128537b09f9d5d68cb1175b1ecb195fa50e1865 -2026-07-30-generated-third-party-notices.zh.md: 906f5ed5b9a11f3ddd68491686b460c5d9f4a682 +2026-07-30-generated-third-party-notices.md: 9ca24c9634b0410f9b7cc255902344cd6014bb90 +2026-07-30-generated-third-party-notices.zh.md: b49e60565bbae62cf17026db17babc1ba7a408dc diff --git a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md index 2128537b09..9ca24c9634 100644 --- a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md +++ b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.md @@ -26,8 +26,6 @@ The runtime tier deliberately covers **every mountable plugin**, not just what t The manifest set is derived from the `packages:` members the root `pnpm-workspace.yaml` declares, including the Landlock workspace and its public packages, so a new member area is read the day it is declared rather than the day someone remembers to extend a list. License and repository metadata come from the root workspace's installed pnpm store and package-local link farms, so the generator requires an installed tree and fails loud when a package resolves to neither, rather than emitting an empty cell. `OVERRIDES` carries the packages whose published manifest cannot answer — Rust-built npm bins that omit `license`, and the `modelcontextprotocol/servers` packages whose repository is mid MIT→Apache-2.0 relicensing, so their effective terms are per-contribution. A runtime dependency whose license is not on the permissive list is a hard error: shipping copyleft is a distribution decision, not something a regenerated table may absorb silently. Vendored packages are cross-checked against `vendor/README.md` and rejected if any is not MIT, and `pnpm-workspace.yaml`'s `patchedDependencies` are listed under the runtime table because pnpm applies those patches at install time — shipped artifacts carry modified copies of `@earendil-works/pi-tui` and `node-pty`, and the patch files are the record of what changed. -**A package a published artifact carries is runtime whatever section declares it.** The browser side is built, not resolved: tsdown inlines every non-platform specifier into a plugin's `lib/client.js`, and Vite inlines the shell's imports into `@deepseek-ai/dsh-web-frontend`'s `dist`. Those packages are therefore declared as `devDependencies` — [the client build-time dependency note](../../proposed/process/2026-08-14-client-build-time-deps.md) owns that placement rule — while a copy of each is redistributed, so react, shiki, katex, and the markdown pipeline must stay in the runtime tier. [`scripts/browser-bundled-externals.ts`](../../../../scripts/browser-bundled-externals.ts) answers which ones those are from the build itself: it drives each client bundle through that package's own `tsdown.config.ts` and the shell through `apps/web`'s Vite config, with a recording plugin that resolves every bare specifier as external and notes it. The pass walks this repository's own source and stops at the package boundary, which costs about three seconds and yields exactly the direct-dependency granularity this file discloses. A specifier counts only once the host resolves it to a file inside a package, so a bundler's own virtual module is not mistaken for a shipped one: `vite/modulepreload-polyfill` is generated by a Vite plugin rather than published as a file, which makes the polyfill in the `dist` build glue of the same kind as an emitted TypeScript helper. Using the real configurations rather than a hand-kept list buys two properties no list has: an erased type import never appears, because the transform drops it before resolution, and a package stops being disclosed as shipped the moment its last browser import is gone. Workspace names are followed only on the Vite side, where the shell's aliases map them to source — that is how a browser-only library's own imports, `ui-primitives`' katex and shiki among them, become visible. A package that ships only type declarations is development-only however a shipped package names it: it contributes no redistributed code, and the dry run cannot see an erased type import anyway, because the transform drops it before resolution. `@types/mdast` and `micromark-util-types` moved to that tier for exactly this reason. - The project owner separately authorizes distribution of every official `@anthropic-ai/claude-agent-sdk` version and the official Claude Code CLI/platform payloads that version declares through `optionalDependencies`. The generator represents this as one exact direct-package identity exception, not as a permissive-license override: `SEE LICENSE IN README.md` and `SEE LICENSE IN LICENSE.md` remain non-permissive classifications, and every unrelated non-permissive runtime still fails closed. When the SDK is present, the generator reads its installed manifest, rejects optional identities outside the official SDK payload prefix, derives the current SDK, CLI, and payload versions, verifies the installed host payload's identity, version, and declared-license field, and renders the complete SDK-declared payload set in a separate notices section. Version, declared-license, and payload-set changes do not require new identity authorization, but they still require ordinary dependency, lockfile, compatibility, terms, and notices review. ## Testing @@ -54,7 +52,7 @@ The Claude distribution tests prove that only the exact direct SDK identity bypa ## Consequences -A dependency edit now carries a regenerated notices file into the same commit. Contributors pay one generator run on commits that touch a manifest, and nothing on any other commit. It costs a few seconds rather than one, because learning what the browser artifacts carry drives the real client and shell bundlers; a broken client source therefore fails the hook, as the staged lint job already would. Committing with hooks disabled defers the cost to a test-lane failure that names the command. +A dependency edit now carries a regenerated notices file into the same commit. Contributors pay one generator run — about a second — on commits that touch a manifest, and nothing on any other commit. Committing with hooks disabled defers the cost to a test-lane failure that names the command. The generator needs an installed tree, which makes it heavier than a pure-source generator, and a new package with unusable published metadata needs an `OVERRIDES` entry rather than silently rendering a blank license. Both failures are loud and name the remedy. diff --git a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md index 906f5ed5b9..b49e60565b 100644 --- a/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md +++ b/.agents/notes/implemented/process/2026-07-30-generated-third-party-notices.zh.md @@ -26,8 +26,6 @@ Status: implemented manifest 集合由根 `pnpm-workspace.yaml` 声明的 `packages:` 成员派生,其中包括 Landlock 工作区及其公开包,因此新增成员区域在声明当天就会被读取,而不必等谁想起来去补一份列表。许可证与仓库地址取自根工作区已安装的 pnpm store 和包本地链接场;某个包两处都解析不到时直接失败,而不是留下空单元格。`OVERRIDES` 收录已发布 manifest 答不上来的包:用 Rust 构建、发布时省略 `license` 字段的 npm 可执行包,以及 `modelcontextprotocol/servers` 系列——该仓库正处在 MIT 向 Apache-2.0 的重新许可过程中,实际条款按贡献逐条而定。运行时依赖的许可证若不在宽松清单内即为硬失败:交付 copyleft 是一项分发决策,不该被一次重新生成悄悄吸收。被源码收编的包会与 `vendor/README.md` 交叉核对,出现非 MIT 即报错;`pnpm-workspace.yaml` 的 `patchedDependencies` 列入运行时表格,因为 pnpm 在安装期就会打上这些补丁——交付产物携带的是改动过的 `@earendil-works/pi-tui` 与 `node-pty`,补丁文件本身就是改动的完整记录。 -**被已发布产物带上的包,无论由哪个区段声明都算 runtime。** 浏览器侧是构建出来的,不是解析出来的:tsdown 把每个非平台 specifier 内联进插件的 `lib/client.js`,Vite 把 shell 的 import 内联进 `@deepseek-ai/dsh-web-frontend` 的 `dist`。因此这些包声明在 `devDependencies`——落位规则归 [客户端构建期依赖那篇](../../proposed/process/2026-08-14-client-build-time-deps.md)——但它们各自都有一份副本被分发出去,所以 react、shiki、katex 与整条 markdown 管线必须留在 runtime 档。到底是哪些包,由 [`scripts/browser-bundled-externals.ts`](../../../../scripts/browser-bundled-externals.ts) 从构建本身取答案:它用各包自己的 `tsdown.config.ts` 驱动每个 client bundle,用 `apps/web` 的 Vite 配置驱动 shell,挂一个记录用插件把每个 bare specifier 解析成 external 并记下来。这一趟只走本仓自己的源码、到包边界即停,约三秒,且给出的正是本文件披露的「直接依赖」粒度。一个 specifier 只有在宿主把它解析到某个包内的文件之后才被计入,所以打包器自己的虚拟模块不会被误当成随产物分发的包:`vite/modulepreload-polyfill` 由 Vite 插件生成而非作为文件发布,因此 `dist` 里那段 polyfill 与 TypeScript 生成的辅助代码同类,属于构建胶水。用真配置而不是一张人工名单,白拿两个手写名单没有的性质:被擦除的类型 import 永远不会出现,因为 transform 在解析前就删了它;某个包最后一处浏览器 import 消失时,它也立刻不再被披露成随产物分发。workspace 名字只在 Vite 那侧继续走,因为 shell 的 alias 会把它们映射到源码——浏览器库包自己的 import,比如 `ui-primitives` 的 katex 与 shiki,正是这样才可见的。 只发布类型声明的包一律算 development-only,无论哪个已发布包具名了它:它不贡献任何被分发的代码,而 dry-run 本来也看不见被擦除的类型 import——transform 在解析前就删了它。`@types/mdast` 与 `micromark-util-types` 正是因此落到该档。 - 项目所有者另行授权分发每个官方 `@anthropic-ai/claude-agent-sdk` 版本,以及该版本通过 `optionalDependencies` 声明的官方 Claude Code CLI 与平台载荷。生成器将其表示为一项精确匹配直接包身份的例外,而非宽松许可证覆盖项:`SEE LICENSE IN README.md` 与 `SEE LICENSE IN LICENSE.md` 仍归类为非宽松,所有无关的非宽松运行时依赖仍以默认拒绝方式失败。存在该 SDK 时,生成器会读取其已安装 manifest,拒绝不符合官方 SDK 载荷前缀的可选包身份,推导当前 SDK、CLI 与载荷版本,核验已安装宿主载荷的身份、版本和声明许可证字段,并在单独的声明章节中渲染 SDK 声明的完整载荷集合。版本、声明许可证和载荷集合发生变化时无需新的身份授权,但仍须经过常规的依赖、锁文件、兼容性、条款和声明评审。 ## 测试 @@ -54,7 +52,7 @@ Claude 分发测试证明:只有精确匹配的直接 SDK 身份会绕过通 ## 后果 -此后改动依赖时,重新生成的披露文件会随同一个提交入库。触及 manifest 的提交多付一次生成器运行;其余提交不受影响。这次运行从约一秒变成几秒,因为要弄清浏览器产物带了什么就得驱动真实的 client 与 shell 打包器;因此客户端源码坏掉会让这个 hook 失败,而暂存区的 lint job 本来也会失败。若禁用钩子提交,代价推迟为一次测试 lane 失败,其报错会指明补救命令。 +此后改动依赖时,重新生成的披露文件会随同一个提交入库。触及 manifest 的提交多付一次生成器运行——约一秒;其余提交不受影响。若禁用钩子提交,代价推迟为一次测试 lane 失败,其报错会指明补救命令。 生成器需要已安装的依赖树,因此比纯源码生成器更重;发布元数据不可用的新包需要补一条 `OVERRIDES`,而不是默默渲染出空白许可证。这两类失败都会明确报错并指出补救方式。 diff --git a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml deleted file mode 100644 index 4c98962ba9..0000000000 --- a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.i18n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each -# side as of the last confirmed-consistent state. Both languages carry equal authority; -# after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write .agents/notes/proposed/process/2026-08-14-client-build-time-deps.md -2026-08-14-client-build-time-deps.md: 0605225a70a16fed9004acfe26adba9b6166f201 -2026-08-14-client-build-time-deps.zh.md: 5caed3422288711532c40cd767f72c97693e68b4 diff --git a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.md b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.md deleted file mode 100644 index 0605225a70..0000000000 --- a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.md +++ /dev/null @@ -1,100 +0,0 @@ -# Agent Note: Client build-time dependencies stay out of the install face - -Status: proposed - -English | [中文](2026-08-14-client-build-time-deps.zh.md) - -## Problem - -A browser artifact resolves nothing on the user's machine: - -- A `ui-*` plugin package's browser artifact is `lib/client.js`, where tsdown inlines every non-platform specifier (`noExternal` in `packages/client/tsdown.client.ts`). The specifiers that survive are answered by the loader's frozen module table, because `require` inside that bundle is a parameter the loader injects, not Node's. -- Platform modules (`PLATFORM_MODULES`) come from the shell `dist`, never from Node resolution. -- The shell's own imports are inlined by Vite into `@deepseek-ai/dsh-web-frontend`'s published `dist`; that package ships `dist` alone and has no `.` export. - -Every browser code path is therefore a build product, served as an asset or baked into `dist`. Yet the packages those artifacts are built from — react, react-dom, shiki, katex, clsx, the micromark and mdast families — sit in `dependencies` and non-optional `peerDependencies`, which npm installs for every consumer of the published package. Across the repository that is 79 such external declarations in 38 packages, downloaded by users who never load them. - -## Proposal - -### The rule - -**An external package only a browser artifact reaches belongs in `devDependencies`.** Two deliberate omissions are as much part of the rule: - -- **External packages only.** A `@deepseek-ai/*` name stays where its manifest puts it. Such a declaration also states which package supplies an injected service, which Remote contribution an assembly mounts, or which Loader row must resolve; [verify-runtime-closure](../../../../scripts/verify-runtime-closure.ts) and the Loader read it, and the app installs the package regardless — so moving one removes meaning without removing a download. -- **Anything the node half reaches stays**, an erased type import included. - -Faces are walked from the entries a manifest publishes, not by a directory rule, so a module under `src/` that only the browser entry reaches counts as browser source: - -| kind | test | host face entries | -| --- | --- | --- | -| `bundle-half` | has a `./client` export | every export target except `./client` | -| `browser-library` | under `packages/client/` with no `./client` export | `src/invariant.ts` alone — the companion the host mounts; `.` is browser code | -| `prebuilt-dist` | no `.` export, ships a `dist` | none: the package offers Node no entry | - -### The gate: `scripts/verify-client-runtime-deps.ts` - -Wired into `pnpm run hygiene`, about 35 seconds — the cost of two bound Programs, the same order as `verify-optional-dependency-imports` in that lane. It reuses the repository's tooling rather than growing its own: `TypeScriptProject` (`scripts/ts-project.ts`) binds the host and client compiler faces separately (that file states why the two cannot share one program — the cordis Context merges collide), `ts.resolveModuleName` resolves relative specifiers, and the walk stops at the package boundary. - -Three findings decided the mechanism, after a first pass that scanned string literals: - -1. A package name must match as a name: the `react` substring inside `'@deepseek-ai/dsh-client-web-react'` silently swallowed react. -2. Whether `./client` is the tsdown browser bundle is keyed on the **artifact path** (`./lib/client.js`), not the subpath name — `dsh-goal` publishes `./client` as `./lib/types/client.js`, a plain tsc-emitted browser-shared module. -3. `require`, `require.resolve`, and dynamic `import()` on a literal each reach a package; `require.resolve('@deepseek-ai/dsh-web-frontend/dist/index.html')` is a real host resolution path. - -Two classes, both reported per entry: - -| class | count | test | -| --- | --- | --- | -| `browser` | 74 | only a browser artifact reaches it | -| `nothing` | 5 | no reference names it: `client-runtime`'s `react` (which contradicts its own React-free layering red line), the peer `react` of `ui-settings` and `ui-theme`, `ui-trajectory`'s peer `react-dom`, and `ui-primitives`' `@types/mdast` | - -Each conservative rule below answers a false report or a semantic loss observed while building it: - -- **A type reference from the node half keeps its declaration.** `import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'` in `src/invariant.ts` is erased at run time, yet it states which package supplies the service that companion registers — `verify-runtime-closure`'s relation. -- **A package publishing a Node entry with no source counterpart is skipped whole, and named in the output.** `dsh-goal`'s `./typert -> ./lib/typert.host.js` is emitted by the typert generator and carries its own `import { z } from 'zod'`, which no source states. Getting this test right removed four false reports, among them `api-gateway`'s `typert-registry`. -- A `cordis*.yml` the package owns counts as host face: a Loader row names its plugin instead of importing it. -- `@deepseek-ai/cordis` is exempt — check-workspace-constraints requires it as both peer and dev everywhere. - -`--json` output feeds the bulk edit and the install measurement. - -### What leaves an install - -Measured against a real `npm install` of the published CLI, with tarball bytes read from an isolated cache: 103 external tarballs stop being downloaded, 6.05 MB in total. - -| group | packages | saved | -| --- | --- | --- | -| syntax highlighting and math (shiki family, oniguruma family, katex) | 16 | 3.93 MB | -| react and view libraries (react, react-dom, scheduler, immer, zustand, `@tanstack/*`, clsx, use-sync-external-store) | 11 | 1.47 MB | -| markdown and ansi pipeline plus odds and ends (micromark, mdast, hast families, anser, a few `@types/*`) | 76 | 0.65 MB | - -Our own six browser-library packages (ui-primitives, ui-slots, web-react, ui-attachment, schema-form, client-web — 0.20 MB together) stay installed: code names them, and the rule above leaves those declarations alone. - -### How it lands, split by nature - -1. **Documentation first**: a declaration section in `packages/client/AGENTS.md`, and one clause in the new-plugin-package checklist. -2. **The gate**: `scripts/verify-client-runtime-deps.ts`, its `package.json` script, its place in `hygiene`, and a counterexample spec. -3. **The manifests**: 79 entries in 38 packages. 50 need a new `devDependencies` entry; the rest already carry one, so the change is a deleted line. -4. **Re-measure after the next release** with the same method, confirming the 103 tarballs stay gone. - -## Alternatives considered - -- **Scanning string literals**: the first implementation, rejected by the three findings above — the react-inside-web-react substring had already produced a silent miss. -- **Reading built artifacts (`lib/**/*.js`) instead of source**: that is Node's own view, but the gate would then depend on `pnpm run build`, and it still cannot judge a browser-library's `lib/index.js` (node platform, browser content), so the face test stays either way. -- **Asking the checker whether a binding is used in a value position** (what `verify-optional-dependency-imports` does): tried, and it also judged 83 node-face type-only declarations movable — no download saved for a real loss of meaning, 53 of them `dsh-invariants`. This gate needs to know whether a reference exists, not whether it is a value. -- **Also clearing our own six browser-library packages from the install face**, on the test that no install loads one: another 0.20 MB, at the price of deleting 74 workspace declarations that code genuinely names. Ruled out (2026-08-14): keep what the code names. The cleaner end state is to stop publishing those six packages, which is its own proposal. -- **`peerDependenciesMeta.optional` instead of `devDependencies`**: npm does skip an optional peer, but the meaning is "a consumer may supply this", and there is no run-time consumer at all. The repository must install it to build, which is what `devDependencies` says. -- **Leaving it to knip**: out of scope for knip, which reports a declared package nothing imports. These specifiers are imported; a bundler inlines them. The evidence is that they persisted on master with knip green. Only the five `nothing` entries overlap. -- **`optionalDependencies`**: wrong meaning — it says "skip this if it cannot be installed". - -## Acceptance criteria - -- `pnpm run hygiene` includes `verify-client-runtime-deps` and passes; a counterexample spec proves one `dependencies.react` is rejected. -- `pnpm run build`, `pnpm run test:gui`, and `DSH_SNAPSHOT=replay pnpm run test:web` pass — the move changes no build input, so artifacts stay byte-identical. -- A real install after the next release no longer downloads the 103 tarballs above. - -## Risks - -- **The six browser-library packages that stay installed carry bare imports nothing resolves**: `ui-primitives/lib/index.js` is a rolldown artifact and still reads `from "anser"`, while anser is now dev-only. It is inert — only our Vite build reads that file, and no loader exists for it on a user's machine (verified: only browser code imports those packages, never the host). Retiring their publication is the way to erase it; see Alternatives. -- **`@types/*` go unreported**: source never names them, so the rule cannot see them. `@types/mdast` was caught only because nothing referenced it either. They belong in dev regardless, and closing that gap is follow-up work. -- **A skipped package is unprotected**: `dsh-goal` is skipped whole for its generated entry, so its browser-side declarations are now nobody's business. Reading a generated artifact's own run-time imports is what would let the exemption be withdrawn. -- **A false report would delete a declaration something needs at run time**: three defenses hold that line — literal arguments to `require`, `require.resolve`, and dynamic `import()` count as references; a package's own `cordis*.yml` counts as host face; and no `@deepseek-ai/*` name is subject at all. diff --git a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md b/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md deleted file mode 100644 index 5caed34222..0000000000 --- a/.agents/notes/proposed/process/2026-08-14-client-build-time-deps.zh.md +++ /dev/null @@ -1,100 +0,0 @@ -# Agent Note: 客户端构建期依赖不进安装面 - -Status: proposed - -[English](2026-08-14-client-build-time-deps.md) | 中文 - -## Problem - -浏览器产物不在用户机上解析任何 specifier: - -- `ui-*` 插件包的浏览器产物是 `lib/client.js`,tsdown 把每个非平台 specifier 直接内联(`packages/client/tsdown.client.ts` 的 `noExternal`)。留下来的 specifier 由 loader 的冻结模块表应答——那个 bundle 里的 `require` 是 loader 注入的形参,不是 Node 的。 -- 平台模块(`PLATFORM_MODULES`)由 shell `dist` 提供,不走 Node 解析。 -- shell 自身的 import 由 Vite 内联进 `@deepseek-ai/dsh-web-frontend` 已发布的 `dist`;该包只发 `dist`,连 `.` 导出都没有。 - -所以浏览器的每条代码路径都是构建产物,或作为静态资源下发,或烤进 `dist`。但这些产物的构建输入——react、react-dom、shiki、katex、clsx、micromark 与 mdast 全族——现在写在 `dependencies` 和非 optional `peerDependencies` 里,而 npm 对每个消费者都会安装这两个区段。全仓 38 个包共 79 处这样的外部依赖声明,装给了永远不会加载它们的用户。 - -## Proposal - -### 规则 - -**只被浏览器产物触及的外部包落 `devDependencies`。** 两条留白同样是规则的一部分: - -- **只管外部依赖**。`@deepseek-ai/*` 一律留在原处:那些声明还表达「谁提供我注入的服务」「这个 assembly 挂载了谁的 Remote」「哪个 Loader 行必须能解析」,[verify-runtime-closure](../../../../scripts/verify-runtime-closure.ts) 与 Loader 都读它,而 app 无论如何都会装那个包——移走只是删掉语义,并没有减少下载。 -- **node 面触及的一律不动**,包括被擦除的类型引用。 - -face 从 manifest 真正发布的入口走图,不用目录规则,所以 `src/` 下只被浏览器入口触及的模块就算浏览器代码: - -| kind | 判据 | host face 入口 | -| --- | --- | --- | -| `bundle-half` | 有 `./client` 导出 | 除 `./client` 外的每个导出目标 | -| `browser-library` | `packages/client/` 下且无 `./client` 导出 | 只有 `src/invariant.ts`——宿主唯一能挂载的伴生模块;`.` 面是浏览器代码 | -| `prebuilt-dist` | 无 `.` 导出、发布 `dist` | 没有:这个包不给 Node 提供任何入口 | - -### 门禁:`scripts/verify-client-runtime-deps.ts` - -接入 `pnpm run hygiene`,约 35 秒——两个绑定 Program 的开销,与同 lane 的 `verify-optional-dependency-imports` 同量级。复用仓内既有工具而不自造一套:`TypeScriptProject`(`scripts/ts-project.ts`)分别绑定 host 与 client 两个编译面(该文件写明两者不能合进一个 program——cordis Context merge 会撞),相对 specifier 交给 `ts.resolveModuleName` 解析,遍历到包边界即停。 - -判据要害有三条,都是起手那版扫字符串字面量踩出来的: - -1. 包名必须按名匹配:`'@deepseek-ai/dsh-client-web-react'` 里的 `react` 子串会静默吞掉 react。 -2. `./client` 是不是 tsdown 浏览器 bundle,看的是**产物路径**(`./lib/client.js`)而不是子路径名——`dsh-goal` 的 `./client` 是 `./lib/types/client.js`,一个 tsc 直出的浏览器共享模块。 -3. `require`、`require.resolve`、动态 `import()` 的字面量实参都能触及一个包;`require.resolve('@deepseek-ai/dsh-web-frontend/dist/index.html')` 就是真实存在的宿主解析路径。 - -两类判定,逐条报告: - -| 类 | 数量 | 判据 | -| --- | --- | --- | -| `browser` | 74 | 只有浏览器产物触及 | -| `nothing` | 5 | 没有任何引用具名它:`client-runtime` 的 `react`(与它自己「零 React 引用」的分层红线矛盾)、`ui-settings` 与 `ui-theme` 的 peer `react`、`ui-trajectory` 的 peer `react-dom`、`ui-primitives` 的 `@types/mdast` | - -下面每条保守规则都对应一次实测到的误报或语义损失: - -- **node 面的类型引用保留声明。** `src/invariant.ts` 里的 `import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'` 运行期被擦除,但它声明了谁提供这个伴生插件要注册的服务——归 `verify-runtime-closure` 管的关系。 -- **发布了没有源码对应文件的 Node 入口的包整包跳过,并在输出里点名。** `dsh-goal` 的 `./typert -> ./lib/typert.host.js` 由 typert 生成器直出,自带 `import { z } from 'zod'`,没有任何源码陈述这件事。把这条判据修对,消掉了四处误报,其中包括 `api-gateway` 的 `typert-registry`。 -- 包自带的 `cordis*.yml` 算 host face:Loader 行是具名它的插件而不是 import 它。 -- `@deepseek-ai/cordis` 豁免——check-workspace-constraints 要求它在每个包里同时是 peer 和 dev。 - -`--json` 输出供批量改写与安装体积实测复用。 - -### 安装面少掉什么 - -对已发布 CLI 真装一遍实测,tarball 字节从独立 cache 读出:103 个外部 tarball 不再下载,合计 6.05 MB。 - -| 组 | 包数 | 省 | -| --- | --- | --- | -| 语法高亮与数学(shiki 族、oniguruma 族、katex) | 16 | 3.93 MB | -| react 与视图库(react、react-dom、scheduler、immer、zustand、`@tanstack/*`、clsx、use-sync-external-store) | 11 | 1.47 MB | -| markdown 与 ansi 管线及零碎(micromark、mdast、hast 全族、anser、若干 `@types/*`) | 76 | 0.65 MB | - -我们自己的 6 个浏览器库包(ui-primitives、ui-slots、web-react、ui-attachment、schema-form、client-web,合计 0.20 MB)仍留在安装面:代码确实具名它们,上面的规则不动那些声明。 - -### 分刀落地 - -1. **文档住顶刀**:`packages/client/AGENTS.md` 的依赖声明节,加新插件包 checklist 里的一句。 -2. **门禁**:`scripts/verify-client-runtime-deps.ts`、它的 `package.json` 脚本、它在 `hygiene` 里的位置,以及一条反例 spec。 -3. **manifest**:38 个包 79 处。其中 50 处需要新增 `devDependencies` 条目,其余包已有同名条目,改动就是删掉一行。 -4. **发版后按同一方法复测**,确认这 103 个 tarball 没有回来。 - -## Alternatives considered - -- **扫字符串字面量**:起手就是这么实现的,被上面三条要害否掉——react-in-web-react 的子串已经造成过一次静默漏报。 -- **读构建产物(`lib/**/*.js`)而不是源码**:那是 Node 自己的视角,但门禁从此依赖 `pnpm run build`,而且它照样判不了浏览器库包的 `lib/index.js`(platform 是 node、内容是浏览器代码),face 判据两种走法都得有。 -- **用 checker 判绑定是否用在值位置**(`verify-optional-dependency-imports` 就是这么做的):试过,它把 83 处 node 面纯类型声明也判成可移出——没省下任何下载,却实打实损失语义,其中 53 处是 `dsh-invariants`。本门禁要知道的是引用是否存在,而不是它是值还是类型。 -- **顺带把我们自己的 6 个浏览器库包也清出安装面**,判据是任何安装都不加载它们:再省 0.20 MB,代价是删掉 74 处代码确实具名的 workspace 声明。已否(2026-08-14):代码用到的就保留。更干净的终态是这 6 个包不再发布,那是另一个提案。 -- **用 `peerDependenciesMeta.optional` 而不是 `devDependencies`**:npm 确实会跳过 optional peer,但那个语义是「消费者可以自行提供」,而这里根本没有运行期消费者。仓内必须装一份才能构建,这正是 `devDependencies` 的意思。 -- **交给 knip**:不属于 knip 的范畴,它报的是「声明了但没人 import」。这些 specifier 确实被 import,只是被打包器内联了。实证就是它们在 master 上长期存在而 knip 全绿。只有 `nothing` 那 5 条与它重叠。 -- **用 `optionalDependencies`**:语义错,它说的是「装不上就跳过」。 - -## Acceptance criteria - -- `pnpm run hygiene` 包含 `verify-client-runtime-deps` 并通过;一条反例 spec 证明一处 `dependencies.react` 会被拒。 -- `pnpm run build`、`pnpm run test:gui`、`DSH_SNAPSHOT=replay pnpm run test:web` 通过——这次迁移不改任何构建输入,产物应逐字节等价。 -- 发版后真装一遍,上面那 103 个 tarball 不再被下载。 - -## Risks - -- **留在安装面的 6 个浏览器库包会带着解析不了的 bare import**:`ui-primitives/lib/index.js` 是 rolldown 产物,仍写着 `from "anser"`,而 anser 已经只在 dev。它是惰性的——只有我们的 Vite 构建会读这个文件,用户机上没有任何加载者(已实证:只有浏览器代码 import 它们,宿主从不)。要彻底消掉就让这些包不再发布,见 Alternatives。 -- **`@types/*` 报不出来**:源码从不具名它们,规则看不见。`@types/mdast` 被抓到只是因为恰好也没有任何引用。它们本来就该在 dev,补这个缺口是后续的事。 -- **被跳过的包没人管**:`dsh-goal` 因生成入口整包跳过,它浏览器侧的声明现在没有门禁看着。能读到生成产物自身的运行期 import,这条豁免才能收回。 -- **误报会删掉运行期真需要的声明**:三层兜底守住这条线——`require`、`require.resolve`、动态 `import()` 的字面量实参都算引用;包自带的 `cordis*.yml` 算 host face;`@deepseek-ai/*` 整体不在判据范围内。 diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 482d0ea1ce..92b218ff33 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -27,7 +27,7 @@ The Cordis framework and its foundation libraries are source-vendored into this ## Runtime npm dependencies -External packages that reach a user: a workspace package resolves them at runtime, or a published browser artifact carries a copy of their code. The tier covers every plugin a user can mount from `cordis.yml` — not only what the `dsh` CLI, Web UI, and Python SDK runtime load by default — and the packages the client build inlines into a plugin bundle or the shell `dist`, which are declared as `devDependencies` because nothing on a user's machine resolves their specifiers. +External packages that a workspace package resolves at runtime. The tier covers every plugin a user can mount from `cordis.yml` — not only what the `dsh` CLI, Web UI, and Python SDK runtime load by default. | Package | License | | --- | --- | @@ -48,6 +48,7 @@ External packages that reach a user: a workspace package resolves them at runtim | [`@shikijs/langs`](https://github.com/shikijs/shiki) | MIT | | [`@standard-schema/spec`](https://github.com/standard-schema/standard-schema) | MIT | | [`@tanstack/react-virtual`](https://github.com/TanStack/virtual) | MIT | +| [`@types/mdast`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@vscode/ripgrep`](https://github.com/microsoft/vscode-ripgrep) | MIT | | [`anser`](https://github.com/IonicaBizau/anser) | MIT | | [`chokidar`](https://github.com/paulmillr/chokidar) | MIT | @@ -72,6 +73,7 @@ External packages that reach a user: a workspace package resolves them at runtim | [`micromark-util-classify-character`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-classify-character) | MIT | | [`micromark-util-sanitize-uri`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-sanitize-uri) | MIT | | [`micromark-util-symbol`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-symbol) | MIT | +| [`micromark-util-types`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-types) | MIT | | [`node-addon-require-builtin`](https://www.npmjs.com/package/node-addon-require-builtin) | MIT | | [`node-pty`](https://github.com/microsoft/node-pty) | MIT | | [`picomatch`](https://github.com/micromatch/picomatch) | MIT | @@ -113,7 +115,7 @@ The installed SDK 0.3.220 declares the following optional platform packages. Eac ## Development-only npm dependencies -External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace, and carried by no published artifact. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — `pnpm-lock.yaml` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. +External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — `pnpm-lock.yaml` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. | Package | License | | --- | --- | @@ -127,7 +129,6 @@ External packages **directly declared** only by repository tooling, test infrast | [`@types/babel__code-frame`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/js-yaml`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/jsdom`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | -| [`@types/mdast`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/node`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/picomatch`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | | [`@types/react`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT | @@ -153,7 +154,6 @@ External packages **directly declared** only by repository tooling, test infrast | [`lefthook`](https://github.com/evilmartians/lefthook) | MIT | | [`lightningcss`](https://github.com/parcel-bundler/lightningcss) | MPL-2.0 | | [`mermaid`](https://github.com/mermaid-js/mermaid) | MIT | -| [`micromark-util-types`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-types) | MIT | | [`oxlint`](https://github.com/oxc-project/oxc) | MIT | | [`oxlint-tsgolint`](https://github.com/oxc-project/tsgolint) | MIT | | [`playwright`](https://github.com/microsoft/playwright) | Apache-2.0 | diff --git a/apps/web/package.json b/apps/web/package.json index 5e6dc8152b..fc990f684c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -26,7 +26,9 @@ }, "license": "MIT", "dependencies": { - "@deepseek-ai/dsh-client-web": "workspace:^" + "@deepseek-ai/dsh-client-web": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis-plugin-group": "workspace:^", @@ -44,8 +46,6 @@ "typescript": "^6.0.3", "vite": "^6.0.0", "vitest": "^4.1.8", - "fflate": "^0.8.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "fflate": "^0.8.2" } } diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 2289b6c13a..7b9ef7a15b 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -93,7 +93,6 @@ export default defineConfig({ plugins: [rejectStandaloneServe(), react()], build: { sourcemap: true, - modulePreload: { polyfill: false }, rollupOptions: { output: { // Output layout: the two main chunks stay at assets/ root; lazy diff --git a/lefthook.yml b/lefthook.yml index 01c4a5b519..1c2a693c88 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -28,7 +28,7 @@ pre-commit: # lefthook only inspects files present on disk — so that one case still # falls through to the freshness assertion in the test lane. - name: third-party notices (staged) - glob: '{package.json,*/package.json,*/*/package.json,*/*/*/package.json,*/*/*/*/package.json,pnpm-workspace.yaml,*/*/pnpm-workspace.yaml,pnpm-lock.yaml,vendor/README.md,python/*/pyproject.toml,scripts/gen-third-party-notices.ts,scripts/browser-bundled-externals.ts,packages/client/tsdown.client.ts,scripts/build-exe-for-python-sdk.ts}' + glob: '{package.json,*/package.json,*/*/package.json,*/*/*/package.json,*/*/*/*/package.json,pnpm-workspace.yaml,*/*/pnpm-workspace.yaml,pnpm-lock.yaml,vendor/README.md,python/*/pyproject.toml,scripts/gen-third-party-notices.ts,scripts/build-exe-for-python-sdk.ts}' run: node_modules/.bin/tsx scripts/gen-third-party-notices.ts && git add THIRD_PARTY_NOTICES.md - name: whitespace (staged) diff --git a/package.json b/package.json index 6f2346e2e6..517d0c56d1 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,6 @@ "rescope-vendor": "tsx scripts/rescope-vendor.ts", "rescope-vendor:check": "tsx scripts/rescope-vendor.ts --check", "verify-client-domain-graph": "tsx scripts/verify-client-domain-graph.ts", - "verify-client-runtime-deps": "tsx scripts/verify-client-runtime-deps.ts", "gen-cordis-catalog": "tsx scripts/gen-cordis-catalog.ts", "verify-cordis-catalog": "tsx scripts/gen-cordis-catalog.ts --check", "gen-cordis-api": "tsx scripts/gen-cordis-api.ts", @@ -127,7 +126,7 @@ "verify-module-graph": "tsx scripts/gen-module-graph.ts --check", "constraints": "tsx scripts/check-workspace-constraints.ts", "doc-sync": "tsx scripts/run-gates.ts doc-sync", - "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-optional-dependency-imports && pnpm run verify-runtime-closure && pnpm run verify-client-runtime-deps && pnpm run verify-vendored-links", + "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-optional-dependency-imports && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", "publish:npm-baseline": "tsx scripts/publish-npm-baseline.ts", "release:dsh": "tsx scripts/release/bump.ts --family dsh", "release:vendor": "tsx scripts/release/bump.ts --family vendor", diff --git a/packages/client/AGENTS.md b/packages/client/AGENTS.md index 14965fd495..1928f30a3c 100644 --- a/packages/client/AGENTS.md +++ b/packages/client/AGENTS.md @@ -35,15 +35,6 @@ The `/client` entrypoint of a UI plugin package is its public browser API, not a 2. **Same-package tests import internals directly** — relative `../src/client/xxx.ts` from package tests, or the `./src/*` subpath where a spec lives outside the package. Never widen the public API to make a test compile. 3. **Cross-package imports of another plugin's symbols are in principle forbidden.** The sanctioned routes are the slot system (register/renderSlot) and ctx services. If neither fits, stop and escalate — do not add an export to unblock yourself. -## Dependency declaration - -A browser artifact resolves nothing on the user's machine: tsdown inlines every non-platform specifier into `lib/client.js`, the shell `dist` answers `PLATFORM_MODULES` from its frozen module table, and Vite inlines the shell's own imports into the published `dist`. - -- **An external package only browser code reaches belongs in `devDependencies`.** npm installs `dependencies` and non-optional `peerDependencies` for every consumer, so react, shiki, katex, or clsx declared there ships to users who never load it. -- **A workspace name stays where it is.** Such a declaration also states which package supplies an injected service or a mounted Remote contribution — [verify-runtime-closure](../../scripts/verify-runtime-closure.ts) and the Loader read it, and the app installs the package regardless. -- **The node half decides.** Anything its published entries reach — an erased type import, a `require.resolve`, and a Loader row in the package's own `cordis*.yml` included — stays declared as it is. -- `pnpm run verify-client-runtime-deps` (inside `hygiene`) names each offending entry; knip owns whether the surviving declaration is used at all. - ## ctx discipline (components never see ctx) `ctx` belongs to the apply world only: the plugin body and the inject factories closed over it. Components — every `.tsx` under a feature domain — receive all data and callbacks **through the four props shares**; they never call a hook that reaches ctx, never import a service class to poke it, never read a React context (business components see zero contexts — `BindingContext` and its kin are renderer-internal). If a component needs something new, the answer is a prop threaded from its share's source (owner site, store declaration, or inject face), not a hook. @@ -100,7 +91,7 @@ If `test:gui` is red on code you did not touch, neither silently fix nor ignore Bringing up a new `packages/client/` plugin package (ui-workspace is a complete example; ui-sidebar/ui-user-questions are minimal skeletons): -1. **Package skeleton**: `package.json` (`@deepseek-ai/dsh-client-`, exports `.`/`./invariant`/`./client`/`./src/*`/`./package.json`, `dsh.client` manifest, `files` list, and every browser-side external package under `devDependencies` per the [declaration rules](#dependency-declaration)), `tsconfig.json` (extends `tsconfig.base.client.json`, one `references` entry per workspace dependency plus `runtime-diagnostics/invariants`), `tsdown.config.ts` (`clientBundle(id, ['lib/types/index.js', 'lib/types/invariant.js'])`), `src/index.ts` (empty node-half apply), `src/invariant.ts` (companion with a real reason), `src/css-modules.d.ts` when using CSS Modules, `README.md` with the Model Experience section. +1. **Package skeleton**: `package.json` (`@deepseek-ai/dsh-client-`, exports `.`/`./invariant`/`./client`/`./src/*`/`./package.json`, `dsh.client` manifest, `files` list), `tsconfig.json` (extends `tsconfig.base.client.json`, one `references` entry per workspace dependency plus `runtime-diagnostics/invariants`), `tsdown.config.ts` (`clientBundle(id, ['lib/types/index.js', 'lib/types/invariant.js'])`), `src/index.ts` (empty node-half apply), `src/invariant.ts` (companion with a real reason), `src/css-modules.d.ts` when using CSS Modules, `README.md` with the Model Experience section. 2. **Three registration surfaces, all required** (missing any one fails at a different, later point): the `tsconfig.client.json` aggregate `references` entry; a `dsh.client` row in `packages/bundle/web-app/cordis.patch.yml`; a `packages/bundle/web-app/package.json` dependency (profile boots resolve bare row names through the healed `$DSH_HOME/profiles/node_modules` fallback, which mirrors the app's and each bundle's declared dependencies — a row whose package no manifest declares fails to import). `pnpm-workspace.yaml` already globs `packages/*/*`. 3. **dsh.client manifest semantics**: `platform: 'web'` always; `immediately: true` only for stage-one-prefetch infrastructure rows. `inject` lists package-name dependency edges — they are **informational only** (preflight display, HMR diffing); they do not sequence entry activation or apply order. Activation order is cordis fiber inject waiting on *services*, nothing else. 4. **Registering into another package's slot**: apply order is unconstrained, and a business service is not a declaration barrier. Use `ctx.slots.inject(name, () => ctx.slots.register(...))`; it waits on the actual declaration, removes the contribution when that declaration collapses, reruns after redeclaration, and leaves with the caller's plugin fiber. Return a generator yielding each registration when several contributions must install and roll back atomically. A bare `slots.register` into an undeclared slot remains an error; keep service edges only for services the contribution actually reads. diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 3f4f408854..0184f72d18 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -50,7 +50,8 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index cc610a925d..1da3ac6428 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -53,7 +53,10 @@ "@deepseek-ai/dsh-session": "workspace:^", "@deepseek-ai/dsh-session-projection": "workspace:^", "@deepseek-ai/dsh-session-title": "workspace:^", - "@deepseek-ai/dsh-tools": "workspace:^" + "@deepseek-ai/dsh-tools": "workspace:^", + "immer": "^10.1.1", + "react": "^18.2.0", + "zustand": "~4.4.7" }, "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -69,10 +72,7 @@ "@deepseek-ai/dsh-timeout": "workspace:^", "@deepseek-ai/dsh-typert-protocol": "workspace:^", "@deepseek-ai/dsh-typert-registry": "workspace:^", - "@types/react": "~18.3.1", - "immer": "^10.1.1", - "react": "^18.2.0", - "zustand": "~4.4.7" + "@types/react": "~18.3.1" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index b2c447b17e..f705158d1e 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -58,7 +58,8 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 4d40c870a7..c257166e2a 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -28,16 +28,16 @@ "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", - "@deepseek-ai/dsh-client-ui-primitives": "workspace:^" + "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", + "clsx": "^2.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "@types/react-dom": "~18.3.0", - "clsx": "^2.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@types/react-dom": "~18.3.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index a0445a32e2..cf80e20f3f 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -46,6 +46,9 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -56,7 +59,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -72,8 +76,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0", - "clsx": "^2.0.0" + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 096c5280af..2fc12605c1 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -49,6 +49,7 @@ "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", + "clsx": "^2.0.0", "@deepseek-ai/schemastery": "workspace:^" }, "peerDependencies": { @@ -71,7 +72,8 @@ "@deepseek-ai/dsh-llm-retry": "workspace:^", "@deepseek-ai/dsh-session-stats": "workspace:^", "@deepseek-ai/dsh-token-meter": "workspace:^", - "@deepseek-ai/dsh-tools": "workspace:^" + "@deepseek-ai/dsh-tools": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -102,8 +104,7 @@ "@deepseek-ai/dsh-tool-todo": "workspace:^", "@deepseek-ai/dsh-tools": "workspace:^", "@types/react": "~18.3.1", - "react": "^18.2.0", - "clsx": "^2.0.0" + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index da627c207b..ac7f264f62 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -45,6 +45,9 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "react": "^18.2.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-connection": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -65,8 +68,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-system-prompt": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index 028a46e290..0cc14700fc 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -44,6 +44,9 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -51,7 +54,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-workspace": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -65,8 +69,7 @@ "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", "react": "^18.2.0", - "react-dom": "^18.2.0", - "clsx": "^2.0.0" + "react-dom": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 5fe8d80cc7..74b8e7845b 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -48,7 +48,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-workspace": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-runtime": "workspace:^", diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index 56b9a23472..6076aab741 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -55,7 +55,8 @@ "@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-goal": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index f933031f82..a4ca2afe84 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -43,13 +43,17 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -60,8 +64,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0", - "clsx": "^2.0.0" + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index 0855cc486d..a59d064dda 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -45,6 +45,9 @@ "publishConfig": { "access": "public" }, + "dependencies": { + "react": "^18.2.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -63,8 +66,7 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index 0753bd9367..d3ab329297 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -48,7 +48,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 3d2480b05e..481d02aa03 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -56,7 +56,8 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-message-feedback": "workspace:^", "@deepseek-ai/dsh-typert-protocol": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index dd74f2c764..298fd8b133 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -56,7 +56,9 @@ "@deepseek-ai/dsh-client-ui-input-trigger": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "clsx": "^2.1.1", + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 159700431b..62f03cbd07 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -60,7 +60,8 @@ "@deepseek-ai/dsh-client-ui-input-trigger": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/dsh-permission-presets": "workspace:^" + "@deepseek-ai/dsh-permission-presets": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 58b8d4430a..233a8a72fe 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -53,7 +53,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-plan-mode": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index 5bb934f474..b6e01b4f5a 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -26,11 +26,7 @@ "./package.json": "./package.json" }, "license": "MIT", - "devDependencies": { - "@deepseek-ai/dsh-invariants": "workspace:^", - "@types/react": "~18.3.1", - "@types/react-dom": "~18.3.0", - "@deepseek-ai/cordis": "workspace:^", + "dependencies": { "@shikijs/langs": "^4.3.1", "@types/mdast": "^4.0.4", "anser": "^2.3.5", @@ -52,6 +48,12 @@ "react-dom": "^18.2.0", "shiki": "^4.3.1" }, + "devDependencies": { + "@deepseek-ai/dsh-invariants": "workspace:^", + "@types/react": "~18.3.1", + "@types/react-dom": "~18.3.0", + "@deepseek-ai/cordis": "workspace:^" + }, "files": [ "lib/index.js", "lib/invariant.js", diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 3727a03ee9..c5207dfc9d 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -49,7 +49,8 @@ "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", - "@deepseek-ai/schemastery": "workspace:^" + "@deepseek-ai/schemastery": "workspace:^", + "clsx": "^2.0.0" }, "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -62,7 +63,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -78,8 +80,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/cordis": "workspace:^", "@types/react": "~18.3.1", - "react": "^18.2.0", - "clsx": "^2.0.0" + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index b6dc52fc4d..423755475c 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -54,7 +54,8 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 8d04e40581..95af8a15fa 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -53,7 +53,8 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index 936d2df19e..a9fd7b8e9d 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -56,7 +56,8 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -71,7 +72,6 @@ "@deepseek-ai/dsh-client-web-react": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "clsx": "^2.0.0", "react": "^18.2.0" }, "files": [ @@ -79,5 +79,8 @@ "lib/invariant.js", "lib/client.js", "lib/types/**/*.d.ts" - ] + ], + "dependencies": { + "clsx": "^2.0.0" + } } diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index 46e269a3a3..485092d2b9 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -52,7 +52,8 @@ "@deepseek-ai/dsh-client-schema-form": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/dsh-settings": "workspace:^" + "@deepseek-ai/dsh-settings": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index bad27010aa..cfda6d55fc 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -44,13 +44,17 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -62,8 +66,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0", - "clsx": "^2.0.0" + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index b979880e83..b2026095f2 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -56,7 +56,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-tool": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 327fc66442..0e0b7aadae 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -46,6 +46,9 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "react": "^18.2.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -70,8 +73,7 @@ "@deepseek-ai/dsh-subagent": "workspace:^", "@deepseek-ai/dsh-token-meter": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index efea7f3e47..6f320cd92f 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -54,7 +54,8 @@ "@deepseek-ai/dsh-client-ui-settings": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-host-webserver": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -68,7 +69,6 @@ "@deepseek-ai/dsh-host-webserver": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "clsx": "^2.0.0", "react": "^18.2.0" }, "files": [ @@ -84,6 +84,7 @@ }, "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", + "clsx": "^2.0.0", "@deepseek-ai/schemastery": "workspace:^" } } diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 05e5f7fd28..80bc4f2586 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -44,6 +44,9 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", @@ -52,7 +55,8 @@ "@deepseek-ai/dsh-client-ui-conversation": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -68,7 +72,6 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@testing-library/react": "^16.1.0", "@types/react": "~18.3.1", - "clsx": "^2.0.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index bd90aba857..375053ba7c 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -44,6 +44,10 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "@tanstack/react-virtual": "^3.14.9", + "diff": "^9.0.0" + }, "peerDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -52,7 +56,9 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-compaction": "workspace:^", - "@deepseek-ai/dsh-tools": "workspace:^" + "@deepseek-ai/dsh-tools": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-agent": "workspace:^", @@ -69,9 +75,7 @@ "@types/react-dom": "~18.3.0", "@deepseek-ai/cordis": "workspace:^", "react": "^18.2.0", - "react-dom": "^18.2.0", - "@tanstack/react-virtual": "^3.14.9", - "diff": "^9.0.0" + "react-dom": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index ddd64ed2cb..95fb02b0f3 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -48,7 +48,9 @@ "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-conversation": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", - "@deepseek-ai/dsh-client-ui-slots": "workspace:^" + "@deepseek-ai/dsh-client-ui-slots": "workspace:^", + "clsx": "^2.0.0", + "react": "^18.2.0" }, "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -65,9 +67,7 @@ "@deepseek-ai/dsh-system-prompt": "workspace:^", "@deepseek-ai/dsh-tools": "workspace:^", "@deepseek-ai/dsh-user-questions": "workspace:^", - "@types/react": "~18.3.1", - "clsx": "^2.0.0", - "react": "^18.2.0" + "@types/react": "~18.3.1" }, "files": [ "lib/index.js", diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index 62e8dcc803..e5b71cf942 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -50,6 +50,9 @@ "lib/types/**/*.d.ts" ], "license": "MIT", + "dependencies": { + "react": "^18.2.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", @@ -74,7 +77,6 @@ "@deepseek-ai/dsh-tool-workflow": "workspace:^", "@deepseek-ai/dsh-workflow": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0" + "@deepseek-ai/cordis": "workspace:^" } } diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index cd85838b3b..b6a711b873 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -45,13 +45,17 @@ "watch": "tsdown --watch" }, "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", @@ -64,8 +68,7 @@ "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0", - "clsx": "^2.0.0" + "react": "^18.2.0" }, "files": [ "lib/index.js", diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index e884bc9fa1..75bf6877ad 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -27,7 +27,9 @@ }, "license": "MIT", "dependencies": { - "@deepseek-ai/dsh-client-ui-slots": "workspace:^" + "@deepseek-ai/dsh-client-ui-slots": "workspace:^", + "react": "^18.2.0", + "use-sync-external-store": "1.2.0" }, "peerDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", @@ -36,9 +38,7 @@ "devDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", - "@deepseek-ai/cordis": "workspace:^", - "react": "^18.2.0", - "use-sync-external-store": "1.2.0" + "@deepseek-ai/cordis": "workspace:^" }, "files": [ "lib/index.js", diff --git a/packages/client/web/package.json b/packages/client/web/package.json index d128b3219d..9e4e9481e0 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -33,7 +33,9 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^", - "@deepseek-ai/dsh-client-web-react": "workspace:^" + "@deepseek-ai/dsh-client-web-react": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", @@ -43,9 +45,7 @@ "@types/react": "~18.3.1", "@types/react-dom": "~18.3.0", "@deepseek-ai/cordis": "workspace:^", - "typescript": "^6.0.3", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "typescript": "^6.0.3" }, "peerDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index ecc0bca76d..74f7970bbc 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -54,7 +54,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 7bcb487bf1..cacd075a58 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -61,7 +61,8 @@ "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-tool": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", - "@deepseek-ai/cordis": "workspace:^" + "@deepseek-ai/cordis": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index 1ff514d0ae..b84dede798 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -2,9 +2,7 @@ "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", "version": "0.1.0-rc.6", - "publishConfig": { - "access": "public" - }, + "publishConfig": { "access": "public" }, "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", @@ -14,31 +12,14 @@ "main": "lib/index.js", "types": "lib/types/index.d.ts", "exports": { - ".": { - "types": "./lib/types/index.d.ts", - "default": "./lib/index.js" - }, - "./invariant": { - "types": "./lib/types/invariant.d.ts", - "default": "./lib/invariant.js" - }, - "./client": { - "types": "./lib/types/client/index.d.ts", - "default": "./lib/client.js" - }, + ".": { "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./invariant": { "types": "./lib/types/invariant.d.ts", "default": "./lib/invariant.js" }, + "./client": { "types": "./lib/types/client/index.d.ts", "default": "./lib/client.js" }, "./src/*": "./src/*", "./package.json": "./package.json" }, - "files": [ - "lib/index.js", - "lib/invariant.js", - "lib/client.js", - "lib/types/**/*.d.ts" - ], - "scripts": { - "bundle": "tsdown", - "watch": "tsdown --watch" - }, + "files": ["lib/index.js", "lib/invariant.js", "lib/client.js", "lib/types/**/*.d.ts"], + "scripts": { "bundle": "tsdown", "watch": "tsdown --watch" }, "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", @@ -49,7 +30,8 @@ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^", - "@deepseek-ai/dsh-invariants": "workspace:^" + "@deepseek-ai/dsh-invariants": "workspace:^", + "react": "^18.2.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7974b33ec..1490a0f9f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -358,6 +358,12 @@ importers: '@deepseek-ai/dsh-client-web': specifier: workspace:^ version: link:../../packages/client/web + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) devDependencies: '@deepseek-ai/cordis-plugin-group': specifier: workspace:^ @@ -398,12 +404,6 @@ importers: playwright: specifier: ^1.49.0 version: 1.61.1 - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1607,6 +1607,15 @@ importers: '@deepseek-ai/dsh-tools': specifier: workspace:^ version: link:../../core/tools + immer: + specifier: ^10.1.1 + version: 10.2.0 + react: + specifier: ^18.2.0 + version: 18.3.1 + zustand: + specifier: ~4.4.7 + version: 4.4.7(@types/react@18.3.31)(immer@10.2.0)(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1629,15 +1638,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - immer: - specifier: ^10.1.1 - version: 10.2.0 - react: - specifier: ^18.2.0 - version: 18.3.1 - zustand: - specifier: ~4.4.7 - version: 4.4.7(@types/react@18.3.31)(immer@10.2.0)(react@18.3.1) packages/client/schema-form: dependencies: @@ -1705,6 +1705,15 @@ importers: '@deepseek-ai/dsh-client-ui-primitives': specifier: workspace:^ version: link:../ui-primitives + clsx: + specifier: ^2.0.0 + version: 2.1.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1718,17 +1727,12 @@ importers: '@types/react-dom': specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.31) + + packages/client/ui-commands: + dependencies: clsx: specifier: ^2.0.0 version: 2.1.1 - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - - packages/client/ui-commands: devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1769,9 +1773,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -1784,6 +1785,9 @@ importers: '@deepseek-ai/schemastery': specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1869,14 +1873,15 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-deliverables: + dependencies: + react: + specifier: ^18.2.0 + version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1908,11 +1913,12 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - react: - specifier: ^18.2.0 - version: 18.3.1 packages/client/ui-directory-picker-browse: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -1944,9 +1950,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2033,6 +2036,10 @@ importers: version: 18.3.1(react@18.3.1) packages/client/ui-input-trigger: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2058,14 +2065,15 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-jobs: + dependencies: + react: + specifier: ^18.2.0 + version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2094,9 +2102,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - react: - specifier: ^18.2.0 - version: 18.3.1 packages/client/ui-layout: devDependencies: @@ -2321,25 +2326,13 @@ importers: version: 18.3.1 packages/client/ui-primitives: - devDependencies: - '@deepseek-ai/cordis': - specifier: workspace:^ - version: link:../../../vendor/cordis - '@deepseek-ai/dsh-invariants': - specifier: workspace:^ - version: link:../../runtime-diagnostics/invariants + dependencies: '@shikijs/langs': specifier: ^4.3.1 version: 4.3.1 '@types/mdast': specifier: ^4.0.4 version: 4.0.4 - '@types/react': - specifier: ~18.3.1 - version: 18.3.31 - '@types/react-dom': - specifier: ~18.3.0 - version: 18.3.7(@types/react@18.3.31) anser: specifier: ^2.3.5 version: 2.3.5 @@ -2394,6 +2387,19 @@ importers: shiki: specifier: ^4.3.1 version: 4.3.1 + devDependencies: + '@deepseek-ai/cordis': + specifier: workspace:^ + version: link:../../../vendor/cordis + '@deepseek-ai/dsh-invariants': + specifier: workspace:^ + version: link:../../runtime-diagnostics/invariants + '@types/react': + specifier: ~18.3.1 + version: 18.3.31 + '@types/react-dom': + specifier: ~18.3.0 + version: 18.3.7(@types/react@18.3.31) packages/client/ui-settings: dependencies: @@ -2440,6 +2446,9 @@ importers: '@deepseek-ai/schemastery': specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2480,9 +2489,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2575,6 +2581,10 @@ importers: version: 18.3.1(react@18.3.1) packages/client/ui-settings-plugins: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2612,14 +2622,15 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-sidebar: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2648,9 +2659,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2716,6 +2724,10 @@ importers: version: 18.3.31 packages/client/ui-subagent: + dependencies: + react: + specifier: ^18.2.0 + version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2753,9 +2765,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - react: - specifier: ^18.2.0 - version: 18.3.1 packages/client/ui-theme: dependencies: @@ -2768,6 +2777,9 @@ importers: '@deepseek-ai/schemastery': specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2802,14 +2814,15 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 packages/client/ui-tool: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2850,9 +2863,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -2861,6 +2871,13 @@ importers: version: 18.3.1(react@18.3.1) packages/client/ui-trajectory: + dependencies: + '@tanstack/react-virtual': + specifier: ^3.14.9 + version: 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + diff: + specifier: ^9.0.0 + version: 9.0.0 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2895,18 +2912,12 @@ importers: '@deepseek-ai/dsh-tools': specifier: workspace:^ version: link:../../core/tools - '@tanstack/react-virtual': - specifier: ^3.14.9 - version: 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': specifier: ~18.3.1 version: 18.3.31 '@types/react-dom': specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.31) - diff: - specifier: ^9.0.0 - version: 9.0.0 react: specifier: ^18.2.0 version: 18.3.1 @@ -2931,6 +2942,12 @@ importers: '@deepseek-ai/dsh-client-ui-slots': specifier: workspace:^ version: link:../ui-slots + clsx: + specifier: ^2.0.0 + version: 2.1.1 + react: + specifier: ^18.2.0 + version: 18.3.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -2959,14 +2976,12 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 + + packages/client/ui-workflow-run: + dependencies: react: specifier: ^18.2.0 version: 18.3.1 - - packages/client/ui-workflow-run: devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3004,11 +3019,12 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - react: - specifier: ^18.2.0 - version: 18.3.1 packages/client/ui-workspace: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3040,9 +3056,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - clsx: - specifier: ^2.0.0 - version: 2.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -3070,6 +3083,12 @@ importers: '@deepseek-ai/dsh-client-web-react': specifier: workspace:^ version: link:../web-react + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3092,12 +3111,6 @@ importers: '@types/react-dom': specifier: ~18.3.0 version: 18.3.7(@types/react@18.3.31) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -3107,6 +3120,12 @@ importers: '@deepseek-ai/dsh-client-ui-slots': specifier: workspace:^ version: link:../ui-slots + react: + specifier: ^18.2.0 + version: 18.3.1 + use-sync-external-store: + specifier: 1.2.0 + version: 1.2.0(react@18.3.1) devDependencies: '@deepseek-ai/cordis': specifier: workspace:^ @@ -3117,12 +3136,6 @@ importers: '@types/react': specifier: ~18.3.1 version: 18.3.31 - react: - specifier: ^18.2.0 - version: 18.3.1 - use-sync-external-store: - specifier: 1.2.0 - version: 1.2.0(react@18.3.1) packages/code-runtime/code-runtime: devDependencies: diff --git a/scripts/browser-bundled-externals.ts b/scripts/browser-bundled-externals.ts deleted file mode 100644 index 1ed61b1704..0000000000 --- a/scripts/browser-bundled-externals.ts +++ /dev/null @@ -1,230 +0,0 @@ -/** - * The external packages a published browser artifact carries a copy of. - * - * Read from the real build configurations rather than declared by hand: each - * `lib/client.js` plugin bundle is driven through its own `tsdown.config.ts`, and - * the shell `dist` through `apps/web`'s Vite config. A recording plugin resolves - * every bare specifier as external and notes it, so the pass walks our own source - * and stops at the package boundary — which is both fast (about two seconds for - * the whole repository) and exactly the direct-dependency granularity - * THIRD_PARTY_NOTICES.md discloses. Erased type imports never appear, because the - * transform drops them before resolution. - * - * Workspace names are followed only on the Vite side, where the shell's aliases - * map them to source: that is how a browser-only library's own third-party - * imports — katex and shiki through `ui-primitives`, for one — become visible. A - * plugin bundle keeps them external, matching the frozen module table it is built - * against; the wire layers it inlines are host packages that declare their own - * dependencies, so nothing goes undisclosed. - * - * A specifier is recorded only once the host resolves it to a file inside a - * package. A bundler's own virtual module has no package behind it — - * `vite/modulepreload-polyfill` is generated by a Vite plugin rather than shipped - * as a file, so the polyfill in the published `dist` is build glue in the same - * category as an emitted TypeScript helper, not a redistributed copy of Vite. - * - * The pass runs on a clean tree, as a static gate must. The shell's Vite config - * aliases a few workspace packages to source; every other workspace name would - * resolve through `node_modules` to a `lib/` entry the real build has emitted but - * a clean checkout has not, so this module resolves those names to their own - * source instead. `lib/` is compiled from `src/`, so the third-party edges the - * pass records are the same either way. - * - * rolldown is resolved through tsdown deliberately: the dry run must use the - * exact bundler the real build uses, which a separate root pin could drift from. - */ - -import { existsSync, globSync, readFileSync } from 'node:fs' -import { createRequire } from 'node:module' -import { dirname, join } from 'node:path' - -/** The plugin-context member the recorder needs to resolve before recording. */ -interface ResolveContext { - resolve: ( - source: string, - importer: string, - options: { skipSelf: boolean }, - ) => Promise<{ id: string } | null> -} - -/** A rolldown/Vite plugin shape, narrowed to what the recorder needs. */ -interface RecorderPlugin { - name: string - enforce?: 'pre' - resolveId: ( - this: ResolveContext, - source: string, - importer: string | undefined, - ) => Promise<{ id: string; external: true } | null> -} - -/** - * The package a resolved module file belongs to. - * @param file - absolute path of a resolved module. - * @returns the package name, or undefined when the file is not inside a package. - */ -function packageOfFile(file: string): string | undefined { - const marker = file.lastIndexOf('node_modules/') - if (marker < 0) return undefined - const rest = file.slice(marker + 'node_modules/'.length) - const parts = rest.split('/') - return rest.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0] -} - -/** - * Source aliases for the workspace packages the shell does not already alias. - * - * A clean checkout has no `lib/`, so a workspace name would otherwise resolve - * through `node_modules` to an entry that does not exist yet. Aliases are the - * right seam rather than a plugin hook, because Vite resolves a stylesheet - * `@import` through them too — the theme package publishes its stylesheets from - * `lib/styles/`. `lib/` is compiled from `src/`, so the third-party edges the - * pass records are the same either way. - * @param root - repository root. - * @param existing - the shell's own alias patterns, whose entry choices win. - * @returns alias entries mapping each remaining workspace name to its source. - */ -function workspaceSourceAliases(root: string, existing: readonly string[]): { find: RegExp | string; replacement: string }[] { - const aliases: { find: RegExp | string; replacement: string }[] = [] - for (const pattern of ['packages/*/*/package.json', 'vendor/*/package.json']) { - for (const relative of globSync(pattern, { cwd: root })) { - const dir = join(root, dirname(relative)) - const manifest = JSON.parse(readFileSync(join(root, relative), 'utf8')) as Manifest & { name?: string } - const name = manifest.name - if (name === undefined || !existsSync(join(dir, 'src'))) continue - if (existing.some(find => find.includes(name))) continue - const root_ = manifest.exports?.['.'] - const target = typeof root_ === 'string' ? root_ : root_?.default - const stem = (target ?? './lib/index.js') - .replace(/^\.\/lib\/types\//, '').replace(/^\.\/lib\//, '').replace(/\.js$/, '') - const entry = [`${stem}.ts`, `${stem}.tsx`, `${stem}/index.ts`, `${stem}/index.tsx`] - .map(candidate => join(dir, 'src', candidate)) - .find(candidate => existsSync(candidate)) - // The subpath prefix carries `./client`, `./types`, and `./styles/*` alike: - // each published subpath mirrors a path under `src/`. - aliases.push({ find: `${name}/`, replacement: `${join(dir, 'src')}/` }) - if (entry !== undefined) aliases.push({ find: new RegExp(`^${name.replaceAll('/', '\\/')}$`), replacement: entry }) - } - } - return aliases -} - -/** - * Build the plugin that records bare specifiers and stops the walk at them. - * @param seen - set the recorder adds package names to. - * @returns the recording plugin. - */ -function recorder(seen: Set): RecorderPlugin { - return { - name: 'dsh-record-direct-externals', - enforce: 'pre', - async resolveId(source, importer) { - if (importer === undefined) return null // the entry itself - if (source.startsWith('.') || source.startsWith('/') || source.startsWith('\0')) return null - if (source.startsWith('virtual:') || source.includes('?')) return null - // A workspace name that reaches here is one no alias mapped to source, so - // nothing of ours is left to walk; it is never a third-party disclosure. - if (source.startsWith('@deepseek-ai/')) return { id: source, external: true } - if (source.startsWith('node:')) return { id: source, external: true } - if (!source.startsWith('@deepseek-ai/')) { - const resolved = await this.resolve(source, importer, { skipSelf: true }) - const name = resolved === null ? undefined : packageOfFile(resolved.id) - if (name !== undefined) seen.add(name) - } - return { id: source, external: true } - }, - } -} - -interface Manifest { - exports?: Record - files?: string[] -} - -/** Read one workspace manifest. */ -function manifestOf(dir: string): Manifest { - return JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as Manifest -} - -/** Whether a manifest publishes a tsdown browser bundle at `lib/client.js`. */ -function publishesClientBundle(manifest: Manifest): boolean { - const target = manifest.exports?.['./client'] - return typeof target === 'object' && target !== null && target.default === './lib/client.js' -} - -/** - * Record every external package the plugin client bundles carry. - * @param root - repository root. - * @param seen - set the recorder adds package names to. - */ -async function collectFromClientBundles(root: string, seen: Set): Promise { - const requireFromTsdown = createRequire(createRequire(import.meta.url).resolve('tsdown')) - const { rolldown } = await import(requireFromTsdown.resolve('rolldown')) as { - rolldown: (options: Record) => Promise<{ - generate: (output: Record) => Promise - close: () => Promise - }> - } - - for (const relative of globSync('packages/*/*/tsdown.config.ts', { cwd: root }).sort()) { - const dir = join(root, dirname(relative)) - if (!publishesClientBundle(manifestOf(dir))) continue - const loaded = await import(join(root, relative)) as { default: unknown } - const factory = loaded.default - const configs = (typeof factory === 'function' - ? (factory as (inline: { env: Record }) => unknown[])({ env: {} }) - : [factory]) as { name?: string; entry?: unknown; plugins?: unknown[] }[] - // The `/client` config is the browser bundle; its siblings emit the node half. - const client = configs.find(config => config.name?.endsWith('/client') === true) - if (client === undefined) continue - const bundle = await rolldown({ - cwd: dir, - input: client.entry, - plugins: [recorder(seen), ...(client.plugins ?? [])], - platform: 'browser', - }) - await bundle.generate({ format: 'cjs', minify: false, sourcemap: false }) - await bundle.close() - } -} - -/** - * Record every external package the prebuilt shell bundle carries. - * @param root - repository root. - * @param seen - set the recorder adds package names to. - */ -async function collectFromShellBundle(root: string, seen: Set): Promise { - for (const relative of globSync('apps/*/vite.config.ts', { cwd: root }).sort()) { - const dir = join(root, dirname(relative)) - // Vite belongs to the app that builds with it, so it resolves from there. - const { build, resolveConfig } = await import(createRequire(join(dir, 'package.json')).resolve('vite')) as { - build: (options: Record) => Promise - resolveConfig: (options: Record, command: string) => Promise<{ - resolve: { alias: { find: string | RegExp }[] } - }> - } - // The shell already aliases some workspace names to source, and its entry - // choices win: a stylesheet `@import` resolves through aliases rather than a - // plugin hook, so only the names it leaves out get one from here. - const resolved = await resolveConfig({ root: dir, logLevel: 'error' }, 'build') - await build({ - root: dir, - logLevel: 'error', - plugins: [recorder(seen)], - resolve: { alias: workspaceSourceAliases(root, resolved.resolve.alias.map(entry => String(entry.find))) }, - build: { write: false, minify: false, sourcemap: false, reportCompressedSize: false }, - }) - } -} - -/** - * The external packages a published browser artifact carries a copy of. - * @param root - repository root. - * @returns package names, workspace names excluded. - */ -export async function browserBundledExternals(root: string): Promise> { - const seen = new Set() - await collectFromClientBundles(root, seen) - await collectFromShellBundle(root, seen) - return seen -} diff --git a/scripts/gen-third-party-notices.spec.ts b/scripts/gen-third-party-notices.spec.ts index 5cd4f6b7fa..479a2f13b1 100644 --- a/scripts/gen-third-party-notices.spec.ts +++ b/scripts/gen-third-party-notices.spec.ts @@ -24,12 +24,11 @@ describe('THIRD_PARTY_NOTICES.md', () => { // already runs in the test lane, so the check costs no extra CI process. // Pre-commit regenerates the file whenever a manifest is staged, so reaching // this assertion means the notices were committed without that hook. - it('matches what the generator produces from the current manifests', async () => { - const generated = await render() + it('matches what the generator produces from the current manifests', () => { + const generated = render() expect(generated).toContain('It depends on the third-party software listed below.') expect(readFileSync(resolve(root, 'THIRD_PARTY_NOTICES.md'), 'utf8'), 'stale notices — run `pnpm run gen-third-party-notices`').toBe(generated) - // Driving the two real bundlers to learn what ships costs a few seconds. - }, 60_000) + }) }) /** Build the (manifests, names) pair `tierExternalDeps` consumes. */ @@ -68,23 +67,6 @@ describe('tierExternalDeps', () => { ])) }) - it('keeps a devDependency runtime when a published browser artifact carries it', () => { - const { manifests, names } = workspace({ - // The client build inlines these, so a copy ships even though no manifest - // resolves the specifier at run time. - 'packages/client/ui-primitives/package.json': { - name: '@deepseek-ai/dsh-client-ui-primitives', - devDependencies: { katex: '^0.16', 'test-only-helper': '^1' }, - }, - }) - - expect(tierExternalDeps(manifests, names, new Set(['katex']))).toEqual(new Map([ - ['tsx', true], - ['katex', true], - ['test-only-helper', false], - ])) - }) - it('keeps a package runtime when any shipping area declares it, and excludes workspace links', () => { const { manifests, names } = workspace({ 'package.json': { devDependencies: { shared: '^1' } }, diff --git a/scripts/gen-third-party-notices.ts b/scripts/gen-third-party-notices.ts index 1762e2d125..f2411f5eff 100644 --- a/scripts/gen-third-party-notices.ts +++ b/scripts/gen-third-party-notices.ts @@ -13,7 +13,6 @@ import { resolve } from 'node:path' import * as yaml from 'js-yaml' import { parse as parseToml, type TomlTableWithoutBigInt, type TomlValueWithoutBigInt } from 'smol-toml' import parseSpdx from 'spdx-expression-parse' -import { browserBundledExternals } from './browser-bundled-externals.ts' const root = resolve(import.meta.dirname, '..') const OUT = 'THIRD_PARTY_NOTICES.md' @@ -348,17 +347,15 @@ function normalizeRepo(raw: string | undefined): string | undefined { } /** - * External npm dependencies, tiered by what reaches a user: a package is runtime - * when any manifest outside `DEV_ONLY_AREAS` names it in - * `dependencies`/`optionalDependencies`, or when a published browser artifact - * carries a copy of it. A package declared only by tooling, test infrastructure, - * the website, or the demo leaves — whatever the declaring section is called, and - * with no shipped artifact carrying it — is development-only. - * @returns every external dependency with its tier and metadata. + * External npm dependencies, tiered by which workspace area declares them at + * runtime: a package is runtime when any manifest outside `DEV_ONLY_AREAS` + * names it in `dependencies`/`optionalDependencies`. A package declared only + * by tooling, test infrastructure, the website, or the demo leaves — whatever + * the declaring section is called — is development-only. */ -async function collectNpmDeps(): Promise { +function collectNpmDeps(): ExternalDep[] { const { manifests, names } = loadWorkspaceManifests() - return [...tierExternalDeps(manifests, names, await browserBundledExternals(root))] + return [...tierExternalDeps(manifests, names)] .filter(([name]) => !FIRST_PARTY.has(name)) .sort(([a], [b]) => a.localeCompare(b)) .map(([name, runtime]) => ({ name, ...installedMetadata(name), runtime })) @@ -366,23 +363,11 @@ async function collectNpmDeps(): Promise { /** * Tier every external dependency the workspace declares. - * - * A package a published browser artifact carries is runtime whatever section - * declares it: the client build inlines its code, or the shell `dist` answers it - * from the frozen module table, so a copy is redistributed even though nothing on - * a user's machine resolves the specifier. Those packages are declared as - * `devDependencies` — `verify-client-runtime-deps` owns that rule — and tiering - * them by section alone would understate the notice. * @param manifests - workspace manifests keyed by repository-relative path. * @param names - every workspace package name, which never counts as external. - * @param bundled - external packages a published browser artifact carries. * @returns each external package mapped to whether it is a runtime dependency. */ -export function tierExternalDeps( - manifests: Map, - names: Set, - bundled: ReadonlySet = new Set(), -): Map { +export function tierExternalDeps(manifests: Map, names: Set): Map { const tiers = new Map() // `tsx` is runtime by fiat: the root source-run scripts execute through its ESM hook. tiers.set('tsx', true) @@ -391,7 +376,7 @@ export function tierExternalDeps( for (const kind of ALL_KINDS) { for (const [dep, range] of Object.entries(manifest[kind] ?? {})) { if (names.has(dep) || range.startsWith('workspace:')) continue - const runtime = bundled.has(dep) || (!devOnly && (RUNTIME_KINDS as readonly string[]).includes(kind)) + const runtime = !devOnly && (RUNTIME_KINDS as readonly string[]).includes(kind) tiers.set(dep, (tiers.get(dep) ?? false) || runtime) } } @@ -675,9 +660,9 @@ ${rows.join('\n')} * Render the complete notices document. * @returns the exact bytes `THIRD_PARTY_NOTICES.md` must hold. */ -export async function render(): Promise { +export function render(): string { verifyBuildTimePins() - const npm = await collectNpmDeps() + const npm = collectNpmDeps() const runtimeDeps = npm.filter(dep => dep.runtime) const devDeps = npm.filter(dep => !dep.runtime) const vendored = collectVendored() @@ -722,7 +707,7 @@ ${vendored.map(row => `| \`${row.npmName}\` | \`${row.upstreamName}\` | [${row.u ## Runtime npm dependencies -External packages that reach a user: a workspace package resolves them at runtime, or a published browser artifact carries a copy of their code. The tier covers every plugin a user can mount from \`cordis.yml\` — not only what the \`dsh\` CLI, Web UI, and Python SDK runtime load by default — and the packages the client build inlines into a plugin bundle or the shell \`dist\`, which are declared as \`devDependencies\` because nothing on a user's machine resolves their specifiers. +External packages that a workspace package resolves at runtime. The tier covers every plugin a user can mount from \`cordis.yml\` — not only what the \`dsh\` CLI, Web UI, and Python SDK runtime load by default. ${renderNpmTable(runtimeDeps)} @@ -733,7 +718,7 @@ ${renderClaudeDistribution(claudeDistribution)} ## Development-only npm dependencies -External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace, and carried by no published artifact. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — \`pnpm-lock.yaml\` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. +External packages **directly declared** only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — \`pnpm-lock.yaml\` is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles. ${renderNpmTable(devDeps)} ${renderNonPermissiveNote(nonPermissiveDev)} @@ -761,8 +746,8 @@ ${BUILD_TIME_TOOLS.map(tool => `| [\`${tool.name}\`](${tool.repo}) | ${tool.lice /** CLI entry: default writes the notices, `--check` fails if the committed copy * is stale. Guarded behind an entry-point check so importing this module for * tests neither regenerates the committed file nor calls process.exit. */ -async function main(): Promise { - const content = await render() +function main(): void { + const content = render() if (process.argv.includes('--check')) { let committed: string | null = null try { @@ -786,5 +771,5 @@ async function main(): Promise { // Run only when invoked as a script, not when imported by a test. if (process.argv[1] !== undefined && import.meta.filename === resolve(process.argv[1])) { - await main() + main() } diff --git a/scripts/verify-client-runtime-deps.ts b/scripts/verify-client-runtime-deps.ts deleted file mode 100644 index 0d42f8c135..0000000000 --- a/scripts/verify-client-runtime-deps.ts +++ /dev/null @@ -1,368 +0,0 @@ -/** - * Keep browser-only external packages out of installed dependency sections. - * - * A browser artifact resolves nothing on the user's machine: tsdown inlines - * every non-platform specifier into `lib/client.js`, the shell `dist` answers - * `PLATFORM_MODULES` from its frozen module table, and Vite inlines the shell's - * own imports into that published `dist`. A specifier only browser source - * reaches is therefore a build-time input and belongs in `devDependencies`, - * because npm installs `dependencies` and non-optional `peerDependencies` for - * every consumer of the published package. - * - * Each face is walked from the entries the manifest publishes, not by a - * directory rule, so a module under `src/` that only the browser entry reaches - * counts as browser source: - * - * `./client` is `lib/client.js` host: the other export targets; browser: the bundle - * `packages/client/*` with no browser-only library: host is `src/invariant.ts`, - * `./client` export the companion the host mounts; `.` is browser code - * no `.` export, ships a `dist` prebuilt browser bundle: no host face at all - * - * Only external packages are subject: they are what an install downloads. A - * workspace name stays where its manifest puts it, because that declaration also - * states which package supplies an injected service or a mounted Remote - * contribution, and the app installs it either way. A reference from the host - * face, an erased type import included, likewise keeps a declaration in place. - * - * Run: pnpm exec tsx scripts/verify-client-runtime-deps.ts [--json] - */ - -import { existsSync, globSync, readFileSync } from 'node:fs' -import { dirname, join, resolve } from 'node:path' -import ts from 'typescript' -import { TypeScriptProject, type CompilerFace } from './ts-project.ts' - -const root = resolve(import.meta.dirname, '..') - -/** - * `@deepseek-ai/cordis` placement belongs to check-workspace-constraints, which - * requires it as a peerDependency plus devDependency of every harness package - * regardless of face. - */ -const PLACEMENT_OWNED_ELSEWHERE = new Set(['@deepseek-ai/cordis']) - -/** Dependency sections npm installs for a consumer of the published package. */ -const INSTALLED_SECTIONS = ['dependencies', 'peerDependencies'] as const - -type Section = (typeof INSTALLED_SECTIONS)[number] - -interface Manifest { - name?: string - files?: string[] - exports?: Record - dependencies?: Record - peerDependencies?: Record - peerDependenciesMeta?: Record -} - -/** How a package reaches the browser, which fixes the entries Node can load. */ -type Kind = 'bundle-half' | 'browser-library' | 'prebuilt-dist' - -/** What settles an external specifier as build-time only. */ -type Reached = 'browser' | 'nothing' - -interface Violation { - readonly section: Section - readonly dep: string - readonly reached: Reached - /** Whether the browser face names it, which decides dev-move versus deletion. */ - readonly browserReferenced: boolean -} - -interface Offender { - readonly name: string - readonly dir: string - readonly kind: Kind - readonly violations: Violation[] -} - -/** Why each class needs no install, for the failure report. */ -const REASON: Record = { - browser: 'only a browser artifact reaches it, and that resolves nothing on the user machine', - nothing: 'no reference names it at all', -} - -/** - * Classify a package by the browser artifact it produces. - * @param dir - repository-relative package directory. - * @param manifest - the package manifest. - * @returns the package kind, or undefined when the package has no browser face. - */ -function kindOf(dir: string, manifest: Manifest): Kind | undefined { - if (manifest.exports?.['./client'] !== undefined) return 'bundle-half' - if (dir.startsWith('packages/client/')) return 'browser-library' - const shipsDist = (manifest.files ?? []).some(entry => entry === 'dist' || entry.startsWith('dist/')) - if (shipsDist && manifest.exports?.['.'] === undefined) return 'prebuilt-dist' - return undefined -} - -/** The bare package name a specifier names, keeping a leading scope. */ -function packageOf(specifier: string): string { - const parts = specifier.split('/') - return specifier.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0] ?? specifier -} - -/** One compiler face's bound program plus its module resolution state. */ -interface Face { - readonly project: TypeScriptProject - readonly host: ts.CompilerHost - readonly cache: ts.ModuleResolutionCache -} - -const faces = new Map() -for (const face of ['host', 'client'] as const) { - const project = new TypeScriptProject(root, face) - const options = project.program.getCompilerOptions() - faces.set(face, { - project, - host: ts.createCompilerHost(options, false), - cache: ts.createModuleResolutionCache(root, fileName => fileName, options), - }) -} - -/** Which face's program bound each workspace module, keyed by absolute path. */ -const boundIn = new Map() -for (const [face, { project }] of faces) { - for (const sourceFile of project.sourceFiles()) { - if (sourceFile.isDeclarationFile) continue - if (!boundIn.has(sourceFile.fileName)) boundIn.set(sourceFile.fileName, face) - } -} - -/** - * Read every module specifier one source file names. - * - * An import clause is not the only way to reach a package: `require`, - * `require.resolve`, and a dynamic `import()` on a literal each name one, and a - * type-only import still names a package the build must resolve. - * @param sourceFile - a bound source file. - * @returns every specifier, relative ones included. - */ -function specifiersOf(sourceFile: ts.SourceFile): string[] { - const specifiers: string[] = [] - const visit = (node: ts.Node): void => { - if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node) || ts.isImportEqualsDeclaration(node)) { - const specifier = ts.isImportEqualsDeclaration(node) - ? (ts.isExternalModuleReference(node.moduleReference) ? node.moduleReference.expression : undefined) - : node.moduleSpecifier - if (specifier !== undefined && ts.isStringLiteralLike(specifier)) specifiers.push(specifier.text) - } else if (ts.isCallExpression(node)) { - const target = node.expression - const isRequire = ts.isIdentifier(target) && target.text === 'require' - const isRequireResolve = ts.isPropertyAccessExpression(target) - && ts.isIdentifier(target.expression) && target.expression.text === 'require' - && target.name.text === 'resolve' - const argument = node.arguments[0] - if ((isRequire || isRequireResolve || target.kind === ts.SyntaxKind.ImportKeyword) - && argument !== undefined && ts.isStringLiteralLike(argument)) { - specifiers.push(argument.text) - } - } - ts.forEachChild(node, visit) - } - visit(sourceFile) - return specifiers -} - -/** - * Walk one face from its entries and collect the packages it names. - * @param entries - absolute entry module paths. - * @param packageDir - absolute package directory; the walk stops at its edge. - * @returns package names the walk reaches. - */ -function walk(entries: readonly string[], packageDir: string): Set { - const found = new Set() - const seen = new Set() - const queue = entries.filter(entry => boundIn.has(entry)) - while (queue.length > 0) { - const file = queue.pop() - if (file === undefined || seen.has(file)) continue - seen.add(file) - const faceName = boundIn.get(file) - const face = faceName === undefined ? undefined : faces.get(faceName) - const sourceFile = face?.project.program.getSourceFile(file) - if (face === undefined || sourceFile === undefined) continue - - for (const specifier of specifiersOf(sourceFile)) { - if (!specifier.startsWith('.')) { - if (!specifier.startsWith('node:')) found.add(packageOf(specifier)) - continue - } - const resolved = ts.resolveModuleName( - specifier, file, face.project.program.getCompilerOptions(), face.host, face.cache, - ).resolvedModule?.resolvedFileName - // A relative specifier resolving outside the package is a packaging error - // verify-package-paths owns; either way it is not this package's own module. - if (resolved !== undefined && resolved.startsWith(`${packageDir}/`)) queue.push(resolved) - } - } - return found -} - -/** - * The source module behind one published JavaScript export target. - * - * `lib/` holds the tsdown bundles and `lib/types/` the tsc emit, so both - * prefixes lead back to one `src` module. - * @param dir - absolute package directory. - * @param emitted - the export target, as written in the manifest. - * @returns the absolute source path, or undefined when nothing in `src` emits it. - */ -function sourceBehind(dir: string, emitted: string): string | undefined { - const stem = emitted.replace(/^\.\/lib\/types\//, '').replace(/^\.\/lib\//, '').replace(/\.js$/, '') - return [`src/${stem}.ts`, `src/${stem}.tsx`, `src/${stem}/index.ts`, `src/${stem}/index.tsx`] - .map(candidate => join(dir, candidate)) - .find(candidate => existsSync(candidate)) -} - -interface Entries { - readonly host: string[] - readonly browser: string[] - /** - * Published JavaScript entries no `src` module emits — a generated artifact - * such as `lib/typert.host.js`, whose own runtime imports are invisible here. - */ - readonly generated: string[] -} - -/** - * The entry modules of each face, derived from what the manifest publishes. - * @param dir - absolute package directory. - * @param manifest - the package manifest. - * @param kind - the package kind. - * @returns absolute entry module paths per face, plus unmapped published entries. - */ -function faceEntries(dir: string, manifest: Manifest, kind: Kind): Entries { - if (kind === 'prebuilt-dist') return { host: [], browser: [], generated: [] } - if (kind === 'browser-library') { - return { host: [join(dir, 'src/invariant.ts')], browser: [join(dir, 'src/index.ts')], generated: [] } - } - const host = [join(dir, 'src/index.ts'), join(dir, 'src/invariant.ts')] - const browser: string[] = [] - const generated: string[] = [] - for (const [key, target] of Object.entries(manifest.exports ?? {})) { - if (key === '.' || key === './package.json' || key.includes('*')) continue - const emitted = typeof target === 'string' ? target : (target as { default?: unknown }).default - if (typeof emitted !== 'string' || !emitted.endsWith('.js')) continue - // Keyed on the artifact path, not the subpath name: `./client` is the tsdown - // browser bundle only when it resolves to lib/client.js, while other packages - // publish a plain browser-shared module under the same subpath. - const source = emitted === './lib/client.js' - ? sourceBehind(dir, './lib/client/index.js') - : sourceBehind(dir, emitted) - if (source === undefined) generated.push(`${key} -> ${emitted}`) - else if (key === './client') browser.push(source) - else host.push(source) - } - return { host, browser, generated } -} - -/** Every installed dependency of a manifest, paired with its section. */ -function installedDeps(manifest: Manifest): { section: Section; dep: string }[] { - const deps: { section: Section; dep: string }[] = [] - for (const section of INSTALLED_SECTIONS) { - for (const dep of Object.keys(manifest[section] ?? {})) { - if (section === 'peerDependencies' && manifest.peerDependenciesMeta?.[dep]?.optional === true) continue - if (PLACEMENT_OWNED_ELSEWHERE.has(dep)) continue - deps.push({ section, dep }) - } - } - return deps -} - -/** - * Test whether a Loader config names a package as a whole word. - * @param text - raw config text. - * @param dep - package name to look for. - * @returns true when the name appears outside a longer specifier. - */ -function namesPackage(text: string, dep: string): boolean { - const escaped = dep.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') - return new RegExp(`(^|[^\\w@/.-])${escaped}(?![\\w.-])`).test(text) -} - -interface Candidate { - readonly name: string - readonly relativeDir: string - readonly manifest: Manifest - readonly kind: Kind -} - -const candidates: Candidate[] = [] -for (const path of [ - ...globSync('packages/*/*/package.json', { cwd: root }), - ...globSync('apps/*/package.json', { cwd: root }), -].sort()) { - const relativeDir = dirname(path) - const manifest = JSON.parse(readFileSync(join(root, path), 'utf8')) as Manifest - if (manifest.name === undefined) continue - const kind = kindOf(relativeDir, manifest) - if (kind !== undefined) candidates.push({ name: manifest.name, relativeDir, manifest, kind }) -} - -const offenders: Offender[] = [] -const unchecked: string[] = [] -for (const { name, relativeDir, manifest, kind } of candidates) { - const dir = join(root, relativeDir) - const entries = faceEntries(dir, manifest, kind) - // A generated Node entry carries runtime imports of its own that no source - // states, so this package's declarations cannot be judged from `src` alone. - if (entries.generated.length > 0) { - unchecked.push(`${name}: generated entry ${entries.generated.join(', ')}`) - continue - } - const host = walk(entries.host, dir) - const browser = walk(entries.browser, dir) - // A Loader row names its plugin package instead of importing it, so a config - // the package owns is part of its host face. YAML keys carry no quotes, so - // these are matched as whole names against the raw text. - const configs = globSync('cordis*.yml', { cwd: dir }).map(config => readFileSync(join(dir, config), 'utf8')) - - const violations = installedDeps(manifest) - // A workspace name stays where the manifest puts it. Such a declaration also - // states which package supplies an injected service, which Remote contribution - // an assembly mounts, or which Loader row must resolve; the app installs the - // package regardless, so moving one saves no download while deleting what - // verify-runtime-closure and the Loader read. External packages are the - // download, and this gate is about the download. - .filter(({ dep }) => !dep.startsWith('@deepseek-ai/')) - .filter(({ dep }) => !host.has(dep) && !configs.some(text => namesPackage(text, dep))) - .map(({ section, dep }) => ({ - section, - dep, - browserReferenced: browser.has(dep), - // A prebuilt bundle publishes no Node entry, so everything it declares is - // build-time by construction, named in its Vite graph rather than in src. - reached: kind === 'prebuilt-dist' || browser.has(dep) ? 'browser' as const : 'nothing' as const, - })) - if (violations.length > 0) offenders.push({ name, dir: relativeDir, kind, violations }) -} - -if (process.argv.includes('--json')) { - console.log(JSON.stringify(offenders, null, 2)) - process.exit(0) -} - -if (unchecked.length > 0) { - console.log(`verify-client-runtime-deps: ${String(unchecked.length)} package(s) not checked, no source states their entry's imports:`) - for (const entry of unchecked) console.log(` ${entry}`) -} - -if (offenders.length > 0) { - const all = offenders.flatMap(offender => offender.violations) - console.error(`verify-client-runtime-deps: ${String(all.length)} build-time specifier(s) in installed sections:`) - for (const { name, dir, kind, violations } of offenders) { - console.error(` ${name} (${dir}, ${kind})`) - for (const { section, dep, reached } of violations) { - console.error(` ${section}.${dep} -> devDependencies [${reached}]`) - } - } - console.error('') - for (const reached of ['browser', 'nothing'] as const) { - const count = all.filter(violation => violation.reached === reached).length - if (count > 0) console.error(` ${String(count).padStart(4)} ${reached}: ${REASON[reached]}`) - } - console.error('\nDeclaration rules: packages/client/AGENTS.md.') - process.exit(1) -} -console.log(`verify-client-runtime-deps: browser-face specifiers are dev-only across ${String(candidates.length)} browser-facing packages.`)

> -endobj - -5001 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [288.27457 623.87244 299.27457 637.5344] - /Border [0 0 0] - /Dest 4567 0 R - /F 4 - /StructParent 283 - /Contents (78) ->> -endobj - -5002 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [307.49673 623.87244 318.49673 637.5344] - /Border [0 0 0] - /Dest 4568 0 R - /F 4 - /StructParent 284 - /Contents (79) ->> -endobj - -5003 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [116.09558 582.8864 127.09558 596.5484] - /Border [0 0 0] - /Dest 4569 0 R - /F 4 - /StructParent 285 - /Contents (80) ->> -endobj - -5004 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [467.82358 500.9144 518.84344 514.5764] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 286 - /Contents (Section 3.2) ->> -endobj - -5005 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [277.32913 384.8184 288.32913 398.4804] - /Border [0 0 0] - /Dest 4570 0 R - /F 4 - /StructParent 287 - /Contents (81) ->> -endobj - -5006 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [294.39148 384.8184 305.39148 398.4804] - /Border [0 0 0] - /Dest 4571 0 R - /F 4 - /StructParent 288 - /Contents (82) ->> -endobj - -5007 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [224.39613 193.55042 235.39613 207.2124] - /Border [0 0 0] - /Dest 4572 0 R - /F 4 - /StructParent 289 - /Contents (83) ->> -endobj - -5008 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [240.76514 193.55042 251.76514 207.2124] - /Border [0 0 0] - /Dest 4573 0 R - /F 4 - /StructParent 290 - /Contents (84) ->> -endobj - -5009 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 291 - /Tabs /S - /Parent 1 0 R - /Contents 5010 0 R - /Annots [5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R 5007 0 R 5008 0 R] ->> -endobj - -5010 0 obj -<< - /Length 5477 - /Filter /FlateDecode ->> -stream -x=ْ$7nٞͤCctay֌vV\[< _  ."_>>>i_|w_4_y͡??߽|qg|ͧ7@ӯ?kdݨF6SM^&(imlz#>o>yljގw~凜K-wMtFwҸo5BJ{/A*kQ:$Um:DtrizdQEtRܕK'`jұցVd5~f~5t#Yj]s7Sypg2kа=mm{ -$y_ȄZ?4y͟hX`pP]:j@T/480}< -Q!A76ަ 5`3Ӈ!W(JTN/'s߽((u*{d.45!z3F&3)sR2L4#+*fטA.OChR ԦD*na·f5qP}qQUhK?En٥9biH!M6YG*PnNS3O0S!?7+<)Iz-<4e5d?iϐn)F$F"%ړ)4䃬hՑY U:^ +D(xZj0Dwk2QlyQ͖:NI+bFSk(66:&q>:9[So*3#4L@{@yBX6=DVm5gmDwpZΡjnzgrRb=iY:c^*`j*W J)vK!2={,ƻoE?켋&8=j>|,a,hcXDt{Gr4I/=N ނ{a}Wqh[$m1PXՓuPaXk>ٮynv*V`]XOӾ" (_Ǹ#1<~#=Lծ%^҆IKՑ%9!tWQIb1.6 YC;ʼKuN8/m^ЅMN@U~DJeV 'cE&kE5AڸUKHL#äLX~Ufi -.¯d @dܰ7`o (Mw}XWeЀZפM_3SO n&SU*r(\0kJ:?qiDutB}7}rl5ykQriCN6jt)3-')@E-U3$`iHDWtaMC+ŋ㯏o/> )_q?'+O9tkJɗ\J$90mpйlؐX rSVm GR6uojDϹx)*cĴIդ3ozTćѬ*/'h -_?nvwݡ*d^BEyrq4ɜFYQ^4X׬SWU'JҷF"%F)D9EɥjӥK׋*5J9Պ֚$[$*ƢmBwkUƷbNftjД=?ϑb4Ȁp!P.& .j(_#8f鶸 58/CՆ UWBի(aR׳|df2p - "is?c2 >AOk.>& --*#dҰ)[a`A] gDխLNɦ5iAy֩oZ}jU7k+eZDPC꺲dkTQ-VJ -r:atTf=NWp?fz[m Kv%VlAj:S!#zD%;m4J -@ב[d@%(0;YTWq9]:5XkD{L߷E6AD!s WN(c, 9]D+#yPg2ɞ+N'smTw :9>wkvx«BZD=~tCZH;i5 zȎ/67xGȾF.kq6][+6` B<)}D$`Ђ"-A g55^\JҔzyFmI8zYώzL:цUS_ӮqF! jv$T11A_O}]bC5ŀeGa:&G,\A -;r<CEuR -:d!-fuֹi'.7nxX6ް^Q -׽1I_jP1*_xgAF.jnb zh"@ЖT[%w K@Xa*f!ȡL%ǜ `\JWHuh*`wJ_SAUI vMPӈTNij)JgC^L}LYCۜ%g)uWsTڊ +ephgW9\1IUhİ(FфH W<=),PM$UcQ7Ұޤ>8+f7ʐs֕v@D_~9 +W')EWad!@|H^ 3/A*PVW􄞓(ҐJZ:Դ[/^vQ$ՠڈ6FVWfD N'VAkZ(fcd>eڎ4gBʖ~gT]Tpڂe>JϑvuLϩZIMJxuRd;8:F'GC9'qF\6?]-$flJ12:"i3[G`HKf U…!WtȞL(*Bw=1,lAwHbDlq·2]?!t./XRa~mfh7PhX)w"E4ȗ8UZ8]'!nL &jCgXņ8>eSVWy+zkZE*VMjƀZTLhi}ˊmɩ,|['-ZT[VW$P=U*TS7J3FӔZ(3 -TT6;h˗EveGi_).a&7JLyJ&IT`Kz l\@ +:?Op|{_|w?t~ix}pǟ.lZ()s*c?ߔ -endstream -endobj - -5011 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [406.6614 657.4414 417.6614 671.1034] - /Border [0 0 0] - /Dest 4532 0 R - /F 4 - /StructParent 292 - /Contents (45) ->> -endobj - -5012 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [313.45062 643.7794 324.45062 657.4414] - /Border [0 0 0] - /Dest 4533 0 R - /F 4 - /StructParent 293 - /Contents (46) ->> -endobj - -5013 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [468.4083 643.7794 519.39343 657.4414] - /Border [0 0 0] - /Dest (subsec:scaling) - /F 4 - /StructParent 294 - /Contents (Section 5.1) ->> -endobj - -5014 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [243.872 602.7934 254.872 616.4554] - /Border [0 0 0] - /Dest 4574 0 R - /F 4 - /StructParent 295 - /Contents (85) ->> -endobj - -5015 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [117.43649 589.1314 128.4365 602.7934] - /Border [0 0 0] - /Dest 4575 0 R - /F 4 - /StructParent 296 - /Contents (86) ->> -endobj - -5016 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [281.27063 589.1314 292.27063 602.7934] - /Border [0 0 0] - /Dest 4576 0 R - /F 4 - /StructParent 297 - /Contents (87) ->> -endobj - -5017 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 561.8074 519.7015 575.46936] - /Border [0 0 0] - /Dest 4577 0 R - /F 4 - /StructParent 298 - /Contents (88) ->> -endobj - -5018 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [369.36508 534.4834 380.36508 548.1454] - /Border [0 0 0] - /Dest 4470 0 R - /F 4 - /StructParent 299 - /Contents (14) ->> -endobj - -5019 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.61218 493.4974 163.61218 507.1594] - /Border [0 0 0] - /Dest 4523 0 R - /F 4 - /StructParent 300 - /Contents (42) ->> -endobj - -5020 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [204.64723 493.4974 215.64723 507.1594] - /Border [0 0 0] - /Dest 4524 0 R - /F 4 - /StructParent 301 - /Contents (43) ->> -endobj - -5021 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [178.02861 466.1734 229.13483 479.8354] - /Border [0 0 0] - /Dest (subsec:loader-hmr) - /F 4 - /StructParent 302 - /Contents (Section 4.2) ->> -endobj - -5022 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [130.3328 336.4154 141.3328 350.0774] - /Border [0 0 0] - /Dest 4531 0 R - /F 4 - /StructParent 303 - /Contents (44) ->> -endobj - -5023 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [311.4504 322.75342 322.4504 336.4154] - /Border [0 0 0] - /Dest 4578 0 R - /F 4 - /StructParent 304 - /Contents (89) ->> -endobj - -5024 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [339.76633 309.09143 350.76633 322.75342] - /Border [0 0 0] - /Dest 4493 0 R - /F 4 - /StructParent 305 - /Contents (37) ->> -endobj - -5025 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [182.36285 281.7674 193.36285 295.42938] - /Border [0 0 0] - /Dest 4579 0 R - /F 4 - /StructParent 306 - /Contents (90) ->> -endobj - -5026 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [303.63855 281.7674 314.63855 295.42938] - /Border [0 0 0] - /Dest 4580 0 R - /F 4 - /StructParent 307 - /Contents (91) ->> -endobj - -5027 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [143.21643 240.78137 204.36157 254.44342] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 308 - /Contents (Section 1.2.1) ->> -endobj - -5028 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [339.1266 240.78137 350.1266 254.44342] - /Border [0 0 0] - /Dest 4581 0 R - /F 4 - /StructParent 309 - /Contents (92) ->> -endobj - -5029 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 310 - /Tabs /S - /Parent 1 0 R - /Contents 5030 0 R - /Annots [5011 0 R 5012 0 R 5013 0 R 5014 0 R 5015 0 R 5016 0 R 5017 0 R 5018 0 R 5019 0 R 5020 0 R 5021 0 R 5022 0 R 5023 0 R 5024 0 R 5025 0 R 5026 0 R 5027 0 R 5028 0 R] ->> -endobj - -5030 0 obj -<< - /Length 6837 - /Filter /FlateDecode ->> -stream -x=r7vQ(mL -Ľv"7)%eebʙvO܀4yhq=88splw?ݼv_|㟾ǻfw?._M;3&Vj(mb<}-Fy/~K#Lm(>}T{\~Gv~Mmi\n9t`-^i'EW ڙGB>fcۜ-v~Zܾl>%QVZKaDꬫ A}ؽ׋/^^'M1H1\PaS#PGp\-xڸjhPnB-.JUТONZxX{| s_5C)~ 0␝B?8C;QpTyݯ]<]uVZ!Hho{zrLV5*s>,{Gbh7߿4(w܁6+;oЌOO;{bHaIp?K_NPx5M78a#-G@/?5.Hj6`[NC%q9wt{Llj[ MS2Oh>H n3jN\f2T]D4cԐu8#9]!#\a -fyσ"x봔pßHE)~+me!X@VI{{,cr - 'ё:_ --KKK?tRTu.0)s[d<`hLܨ՟ЩhMCQlH*C FUJB4>UPi[&:UHǞ`(qoP/8僎VKH>o}*xY CZ@N:540&o -'"ں0)VZ'_U_:mp6ڤC;ڄ;~(Y*\v~ }J= `ጤ'VUEɼQapN*Ƚ!߸E,? ~?=udL8Ug @^57rY[[H]9{̸Wo +㑰IZ[ Bjψ OZ5Dc˿o}_~?npdu9$4Z C3YǿdvՅ ĨͭX4JA_M[QeNe{<9c3#>>5 a46A%5gDer؆f`a. -CTD:BAwtalZ 6)Z.CmR{-ZTl?F&^|T^G6d7V@@6Rx/U b8L'^P\]-Z5 =Qz) y*jz-_pb<|V9 (> Y$`UM>줉:`̠}/aFblWaPajSħfޥ#tb^(_,~1&- Gv*DRbIFAG-Ʀ8RpɶmׄYrTyHqۀ Ft-;&hf"і<@a[#Zv,Rj=,R^=|J%D6G{e>K)aSCN,'(]+ZDG-oMOT֋ wјpPF &t?""Rɥe 0-5#օUr]iQ^@kJ<]F9oMDIcdOF/ƥ4Cj𾪑xB񏟮}#xb,M1n)jT=V?vg2ef ey\YPzpN|%hR0<u^BtP0r OFX/ jt0 X^ (3txڹzRI7jѹDyK<̳.HS( 24hMV٫Xz&IYo˫ -*ս;[]U7 TdIYDH ܠ bTۑuinAd-T/C&:kO4KmQ0:ּd@JP};pF1XJFFbЃM2K #gcV.6%R<_F( ҥOK—FνB23GRVQ p`J>P"=o6Sj튲Z8 -}%δKh_zh0fYo9|}QQ%Ͱ J%Ca+P2Uch>P//"vozx~1.L›%wGP!Cg7W*HʑAՀ zF2ƙh+PmmBؿ 7"ckDdr1kX#OfBgH8L X]j^4uUƯtDK"fPˢT'E:7oTiJfUX}/BjiT6]BtHj&&;2ҪEv1Yd.[x)5je$EfWцDdkB!̡$ө'Cku]! c*fًa8;?n(dU}5-{P<6RBq# 췪OR5HL,s:%%F/-ΌROjHD* XӕL* n^B;`FfW"z o~tf3nuqQb-JĈN4(mEzlTwpQ>8WWЮ6PjHE(N↠KoI!$hu_\neM:eNA΋Qz+ %WDa2NH'rVHA&H)-¤zL1I]; Wz6cI>ԙ&4JLBS_)۽ sfS3*h$=ŢqTmԥDBCKJ -+OZϰHRO4T V)Y\O] Nyߤ\MAu?nhD׊v :|H_B]Jv0$kh=%p`Kˆ9}v-rH?`o{ڿ"BnK4fW -Wwjpq q܅#%iS!j{U0\y5Er͏, WYn:I(t鯰~ƟN^ܥ"wS)AM=콊)gdۜ1OE[dDyKʸ<ؖi0(\ 2hJ<gpiU<kL=d"T+/mشlSP6j9_x \f6 =Ԑ"^ߊhL6M]Z0QY7lJT/~U"@yV=7F}[jPJVU=Sb{2DQyl),L{k.<2AESϞ]fV+lj|\1ƛE4'2Gj}T}u,'cm*8d&a|rJaw<3= -7%9Iȫ6lL340PRōUlE}I$,m˒*BOO&ɡI[UOCy=l]} ,c羕RojhWB_ $F%%(Jz⡐fůaN J亐/Drd&m|MBP~[a >j %9 dWjiicdAkZK|sxűdt@E"5],gˏ`H'G%5!ՋMv@?2͡"bEYEG66bS=tjShmjۭk3&Bk=mShi$br5 -d:wP1$M:rqI14u@6XGTc47 b17u24|&.'@lRVNEf R\7~4b6)!nB9"j+W2BPZM:eR -s54?eXGW܇\JnR\w0.~eXDk*tN`IKuϜh@ ~"R-rddEo?PZhk *u0(|)K"(>(vvM?T7tJ_7* $|艒M0],<[qxDeIfꌱy!L6 `tC+원Ie1z1'rhdSdYo 0*&z$*ƅvj]6jB,Wrь:aF5ʥ 1dQWhR& =("5i?@lXUO'7)U ޻h:܍r{!mVK H?Z{qY#+$y@|mxVv2՞`_VV{o6_cQ?g3̔-AhG Zs@PKcqNTKғ FP"GC F.@cL:^gDXY0Qi3L(,1oCMĴKvO2`P5lQ0' -WeUY1'tTbX4 z0ۥ,@GA%@S[ !5p52\;Uw*.GsFHIŦF꡴7 -RJ+ -+#,, JR=6Wym pnq-)Kt4BbLJ Z&1NfUNA0ZSQtqx}dxq-2.^f={*jI'/љ#sy6c۩%;nbHFjO.Бa,߯`Y - U%b!m3s٪T>xBs3fMb 3pt,eKm W?j) W3i t͒ځ*f<0yz/L+6ь.g r: x`zB%.?CA4SWRFH+ +TY -۔X'=ղDX X POŸsFuc5Xr$o::H }iPxb l\. y!$M) =7kmeJc8to^Έl9%p ^%b -F?Ntq ,˹ȬVA}II6fu -ib9iemE`K maM~ H=;0U!6V,gR*,c3HXDVh}sFy[1R Z%y;t-۪pV^`הaf &=F芻Syj$ĉ\FʌޓidWB=h.ٌ/ WxVTWtNqnV{4z tKPO5xi(*cHBlFYH E Nz}.|#4 lw{vwwo~}ٻw0oov_{wf?oo~y{{s-9oqC |Q'w -endstream -endobj - -5031 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [489.93527 732.5514 500.93527 746.2134] - /Border [0 0 0] - /Dest 4582 0 R - /F 4 - /StructParent 311 - /Contents (93) ->> -endobj - -5032 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.15146 732.5514 519.1514 746.2134] - /Border [0 0 0] - /Dest 4583 0 R - /F 4 - /StructParent 312 - /Contents (94) ->> -endobj - -5033 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [313.10226 718.8894 324.10226 732.5514] - /Border [0 0 0] - /Dest 4584 0 R - /F 4 - /StructParent 313 - /Contents (95) ->> -endobj - -5034 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [491.42682 691.5654 502.42682 705.2274] - /Border [0 0 0] - /Dest 4585 0 R - /F 4 - /StructParent 314 - /Contents (96) ->> -endobj - -5035 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 691.5654 519.7015 705.2274] - /Border [0 0 0] - /Dest 4586 0 R - /F 4 - /StructParent 315 - /Contents (97) ->> -endobj - -5036 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [267.74725 677.9034 278.74725 691.5654] - /Border [0 0 0] - /Dest 4587 0 R - /F 4 - /StructParent 316 - /Contents (98) ->> -endobj - -5037 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [294.65292 664.2414 305.65292 677.9034] - /Border [0 0 0] - /Dest 4588 0 R - /F 4 - /StructParent 317 - /Contents (99) ->> -endobj - -5038 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [345.86566 664.2414 351.36566 677.9034] - /Border [0 0 0] - /Dest 4459 0 R - /F 4 - /StructParent 318 - /Contents (4) ->> -endobj - -5039 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 664.2414 519.7015 677.9034] - /Border [0 0 0] - /Dest 4543 0 R - /F 4 - /StructParent 319 - /Contents (55) ->> -endobj - -5040 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [409.15625 473.5904 420.15625 487.2524] - /Border [0 0 0] - /Dest 4496 0 R - /F 4 - /StructParent 320 - /Contents (39) ->> -endobj - -5041 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [502.65146 473.5904 519.1514 487.2524] - /Border [0 0 0] - /Dest 4589 0 R - /F 4 - /StructParent 321 - /Contents (100) ->> -endobj - -5042 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [160.42686 377.9564 211.92822 391.6184] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 322 - /Contents (Section 3.2) ->> -endobj - -5043 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [404.4731 330.1704 420.9731 343.8324] - /Border [0 0 0] - /Dest 4590 0 R - /F 4 - /StructParent 323 - /Contents (101) ->> -endobj - -5044 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [426.4229 330.1704 442.9229 343.8324] - /Border [0 0 0] - /Dest 4591 0 R - /F 4 - /StructParent 324 - /Contents (102) ->> -endobj - -5045 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [420.18588 302.84637 436.68588 316.50842] - /Border [0 0 0] - /Dest 4591 0 R - /F 4 - /StructParent 325 - /Contents (102) ->> -endobj - -5046 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [423.9508 275.5224 434.9508 289.1844] - /Border [0 0 0] - /Dest 4534 0 R - /F 4 - /StructParent 326 - /Contents (47) ->> -endobj - -5047 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [216.92166 248.19843 269.61102 261.8604] - /Border [0 0 0] - /Dest (subsec:scaling) - /F 4 - /StructParent 327 - /Contents (Section 5.1) ->> -endobj - -5048 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 152.56439 135.71114 166.22638] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 328 - /Contents (Section 3.3.4) ->> -endobj - -5049 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [399.4341 132.10242 415.9341 145.7644] - /Border [0 0 0] - /Dest 4592 0 R - /F 4 - /StructParent 329 - /Contents (103) ->> -endobj - -5050 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [176.83247 118.44043 193.33247 132.10242] - /Border [0 0 0] - /Dest 4593 0 R - /F 4 - /StructParent 330 - /Contents (104) ->> -endobj - -5051 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [198.4779 118.44043 214.9779 132.10242] - /Border [0 0 0] - /Dest 4594 0 R - /F 4 - /StructParent 331 - /Contents (105) ->> -endobj - -5052 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [280.25635 91.116394 296.75635 104.77838] - /Border [0 0 0] - /Dest 4595 0 R - /F 4 - /StructParent 332 - /Contents (106) ->> -endobj - -5053 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4378 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 333 - /Tabs /S - /Parent 1 0 R - /Contents 5054 0 R - /Annots [5031 0 R 5032 0 R 5033 0 R 5034 0 R 5035 0 R 5036 0 R 5037 0 R 5038 0 R 5039 0 R 5040 0 R 5041 0 R 5042 0 R 5043 0 R 5044 0 R 5045 0 R 5046 0 R 5047 0 R 5048 0 R 5049 0 R 5050 0 R 5051 0 R 5052 0 R] ->> -endobj - -5054 0 obj -<< - /Length 6459 - /Filter /FlateDecode ->> -stream -x=ks+FG.T ޏQNUtѕ]W>f]uW3 4 bVb$h4w/.v{w? ~Wv~z8vۻ?l>n.^o^]|0ۛWjnwi^|wLY+t`Ry=ݿOʦbjFݔIɃ\䇟5 h5B0of-_+|~nۋE '!E`\Apn=v0uؖVZj"XU:QQWxLq~'ލ>0\&'=Ahxhq܌O?n0=oT<> Rr~S33aDxqRIf=ƒ1c,b\dS(aFStf,đ-d؇{t\E$:퇄{~!y3nKrI0O˪g^R1灉XxmJ: t/&h+<0)=L䫫5z`AE - |- ELJظ0 DM_WcKż ZʣU% Bm!2; -t`,{apE*o2$ALkO,1#/G(CqTУ<4 %\-UE)h >Jnܔ*{S؇,[fM`v̔gKTys2'cy漎YZc"I?U#[MJu4KgqÂ2&T),?o``@#4-ީ?? m:[)W}x]u 2Cݢ0[ʝ_L=|TeFLK;9B:dDr|,`쀝:QpWiSGG/pɛ T&xKi0]#sΣ0LPL׵(s7 Ic~ڢp%eNxpm:2f ~~u,kAnˊP+8.Y @ǂ&j&r¤|Ӷ61ѢXD,5a_FJ(pPGۭ2hf 8wG܁nh@LYT?[s4)Dz۵`8{~Q]歱{.`j)1j ;eY酾!qhim!M,*F;@7 KW,y&w/ը0}n ݹzɭ9, -*d+q3+pO,(Mꂬ-jLn6,zUCd ^'B9Ac -_ Xa# -Wq\I= ᗥS_Z-HqF5/ -Fꅱ,x'R1C K#o"6Ġ0k90Hk>脼g )٠e{p3@ ZDw}AoL9BG%0LbAЁi&4W&eOAeĩ2Ƕňgs_}X>.݅P<(hH\"HE~=0FmHX.#j[Ox#RtN --EP,1WcoMEJSW5nd]Wg)9neЩh+}m3mˑ!a I|SyQX{WJ1|wu4$C1cN'6sXWWC8LyYe,Ha bfxs'uT?Z{[ܘM)+01Cm ^:4G=fFki2أZ Mۋh*v*.pzDig)#3缸vL -?KJ? - -%Rl'ݲHn6oS#JAu#rq͖:rVXϢÃ}o2%/'u8JO?HP-Mߡewʲh"~Eq -tBf8ιHEN~;JWDd]Պ/cƦiBwi١T̹P ү,4`*HFh\R0m97c:(mWҟL01"{23m -1mK4 [ -RTV2goBOu8!: Z<7~ J؉vP51d}>=a2ȋ9p&Dsw7lVy~Z8)$%Z1RM'X/J_Eg -ɦWt43RcwJ.D-zL83@@Ev`RKOP5; -bp܌HmF-8i矋D:D<Z>ZP]Z[ͼ7wO3[Зg)u˴y .@1@EIW#kW!!> Diӌ@ rҁ(Hg`B -G8W@6%єut9 iU&RGU_ryc9F5:BhͥM|z,Ha*uJ3D:bՐfnBpΞOpH#mLFuEB=;+|څ+xY0elY%tvpr=قF:!YX*A3ٲwY Η 5iI,ƒGw#GN 8;I`M /z~jWa$&eq?&iѩsXd/0HEzDmT+f0$!0؟M 6l:ͺ^BfQ8eQ66Yxb mqi%k6sꣂ" ΥiU, dFI- cxVGL -`MA6֊z ->萚d PQ 1D5^ -~GrSR $jS18jchusk=C8͓A=\M٢4?fv(YYK -^Ը>JX{ϟ\3JBa´Ԣw.#*7!LXQCcUD 2gRsZس6ۻ abƆ~ykK.eƪФ<4N\$"KüMW年M,f&aNU3j˫xІO,ɺB1{'jbS0DV2hԞWHHB:ҵCyq5;iOhGG`?OcFYubp ՄɦdI0iHgA+|ݞ.1Rzx͜x#ZD]EDsٕ#+-Y-<U:R1TN+.I~2z!iW -) ] %Tr6?W~1g W ;܅LH]l;˼ZbK,EZ45'~UT˧.?)4 {]~r|ƛ at$l | eڹe<'j^`UʆV׼$dm7|c>A,}T-8|zqy4v cR2oy*hղqYG`UTgWO|1Pᯏ ߉zTFnmxMլָ?CQ{%$#l6ˉ «L%#YV᫵̓oz1;IJ'Y@\b(`LhfZHΗGvɖG9Gx4~]5 %d3fW]fO)ͷL -dw02XziPml?2.I*>_GVoC-m@K4:Zi< -_Z?s=O7_~n?~w7?n=퇏B`AsV -endstream -endobj - -5055 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [237.94225 435.3644 299.514 449.0264] - /Border [0 0 0] - /Dest (subsubsec:motivation-harnesses) - /F 4 - /StructParent 334 - /Contents (Section 1.2.2) ->> -endobj - -5056 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 281.5974 85.78214 295.2594] - /Border [0 0 0] - /Dest 4596 0 R - /F 4 - /StructParent 335 - /Contents ([1]) ->> -endobj - -5057 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [413.16415 267.93542 523.01013 281.5974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/361598.361623) - >> - /F 4 - /StructParent 336 - /Contents (https://doi.org/10.1145/361598.361623) ->> -endobj - -5058 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 247.47339 85.78214 261.13538] - /Border [0 0 0] - /Dest 4597 0 R - /F 4 - /StructParent 337 - /Contents ([2]) ->> -endobj - -5059 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 233.8114 290.16214 247.47339] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1053331.1053345) - >> - /F 4 - /StructParent 338 - /Contents (https://doi.org/10.1145/1053331.1053345) ->> -endobj - -5060 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 213.34943 85.78214 227.01141] - /Border [0 0 0] - /Dest 4598 0 R - /F 4 - /StructParent 339 - /Contents ([3]) ->> -endobj - -5061 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [442.35815 199.68738 521.95416 213.34943] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2890784) - >> - /F 4 - /StructParent 340 - /Contents (https://doi.org/10.1145/2890784) ->> -endobj - -5062 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 179.2254 85.78214 192.88739] - /Border [0 0 0] - /Dest 4599 0 R - /F 4 - /StructParent 341 - /Contents ([4]) ->> -endobj - -5063 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 158.76343 85.78214 172.42542] - /Border [0 0 0] - /Dest 4600 0 R - /F 4 - /StructParent 342 - /Contents ([5]) ->> -endobj - -5064 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [275.27914 117.777405 385.12515 131.43939] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/378795.378858) - >> - /F 4 - /StructParent 343 - /Contents (https://doi.org/10.1145/378795.378858) ->> -endobj - -5065 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 97.31543 85.78214 110.97742] - /Border [0 0 0] - /Dest 4601 0 R - /F 4 - /StructParent 344 - /Contents ([6]) ->> -endobj - -5066 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4366 0 R - /f1 4360 0 R - /f2 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 345 - /Tabs /S - /Parent 1 0 R - /Contents 5067 0 R - /Annots [5055 0 R 5056 0 R 5057 0 R 5058 0 R 5059 0 R 5060 0 R 5061 0 R 5062 0 R 5063 0 R 5064 0 R 5065 0 R] ->> -endobj - -5067 0 obj -<< - /Length 5044 - /Filter /FlateDecode ->> -stream -x=[w$&0l,n,,@<&f3iuKRI}<|/ϴ.RT~tzx{j>i_N{?}???4|f폯o~|꓋Ooh_~W cB4͕hgB7NwLV7?]\_ <]\?Fqtqο OoRaw߄;|ӛqcYЦHQCsrjKι?T?9s H6#zFDӃ(;__b++| -_xІqι:?Fx&a?rY7`Pd{6F6BūaDA2Q` mw@7FN%,I 3n:ņK6N(:I1=<<'r%1>4rE|Ƶ?e4uIt;X^08eĉhu6_NlŸRrf/ᕶr@/iւ1]}#IE/s-C+י- 86pKRf7 -l|f*+'-d3)'m΃m"BA+."ZUKSlj[ش9EB̎ 3 ,"AȀh fy(ki+YiU5X0F?zǖ1m.S[#XJ3icޡEE" cTO[ _d_cBjPj5wlx#3A9d]>`N߼\4apUЖbH^zr[0F%)$d`zTKQafLP3O:[Lgv[̮uVhPZ -xew\HiI!찎# rJ! Gj3XYa!o|Zk]l3G;/tIikyE J,X׶x(sj[-ghij0D鞎CT%4>tcGvLkr{Ν3& n!J/=d;nCǒʶL-Ղ(Tc҂Mh^q1 8ZN{F=;`Y i;;نB -Χ|*c:\}'/VEޣ[u J,ˀ4&;8vP -mgfM0y)ɸ[#]ەmʼnҺ >!$ύ ꁧ>$<Ocɇ}BHX}[n7$*$Bs`, VBB <]Z)wV pi^!.t{^`'lna3c`#0i^[~Eovd8J41ݐZNF _iG(ҝ[˄dC!0X%ižJ^Zߕs{%%D yM}Fij֠ǑO7u wxxt`>2ۊ`bѲnI1b.+l飝dFl] nA6EL.f@\ԷW ͯ?D򹆐1[}]"Ē+Zԙdl0$}q]DfbED^[fnzܡi|[ཬO/tL4Q88V KJ4@MT! E5C - -)EVm:R4v[ZôL+-4pA߮ǦmLk5A aq`;D_J@poXslJX4CK@9*R\!"dPe MVzVC*R=kTZh˯<%j!%MFLMJuOu@BvgYr9^],J``zKM3;}||_Kf9jyӼ2{AQ'&]u1Mh)ҙ&O? -Հ"yV0w̯M/)bp4)nO*T2yLxMp0a ):4_FW"?;p&SUiFvdt}N~j88W$Ʈ=6Vb^l&.0@62eժP$I&'6?!ݚ^QT>:-M28f}7ۻQ7T-9OK;^eрyl ;̀,t!gm3g!Irx+9b>|kjrDu$父yκ'9 u$[ (8;ٳfWkWj.1ҙeZl3eI6uQd|4T t:\ESB2}ἎLj];,1Pv#^/jfTj"z59>-VHƜ6}Nɾvhذ҂ /?,<鑨u˔9ve t$_&&!d2K% Ht4 s]"ܔ`e5ǩ]f=ޗy - ]LH3\`"x3WR^8/yO?>#1ܡ2*qY)92㧧T3GOȞgR9xy{bטS -Ŭ*0TP&]PR'1^@#&<58 ]=鐑&5?xIȩȔ6 -YiZ6j^)pXWz>?Ɔbv#R\-Hӓi8]FnDFYk \l3n̗/60 1-4hR.m;&UUFIL2`i+---vBPwlK: YybiI9x"E;)ZeZ` W<Ƿ k0a;-2 "-CWȎ3ae/7J.eimJS |/WH$ d ] PDA` 3Kն'UMlxBݔ/ž`pFO5ci뢍@_ v|A,D61Y|͂:Km$ޓUYW0\2'6.qHS:kVԐcꈎ3eealU&R2oO_3 -#hOWճA .@WMфb0/5Z-R,8!ZɤWҊ -U4{L\yMU)DyIxfa[B@hp Ħ}bDwzFC|k1?uP#ʛc\S|?Gu4Ʈ -/܉J҄؋HOjs"r5'i҂5Sc -FX2JKXo{uV[Ŷ(l +klm/B  U&t 6TL;_KÁPJD%a#jZidJGO/YiHfjThy4;=P:_-Ү`Nr\ ulXqюU3flg]{I -voB@XtB0d1҂)D Sdذw#GcX *_:,U8>[;mWr)ջG2X. Bi'w~{hcF5ƀ4='J0lHƌ\D3ZTA:&[kTbn)ʐ6HLQ H e[~RclC`3+j(7g"@ޒ#Ť Lτ&fޑy㐜\nq Hl\]ʲ/p`<1WXv9 als]w^7h2c+.{0!MoAذ*#3#Li&nnf`<# =qt]{2/"6:j|ǤmZU/Iy͗C'Q@<|);DɿϞż4ѥoQ.v;k^q -lj -6&]smj,!Okuݕ'F|tzx{No?4^tzrwgoޜn_x{zI&k#X'YOH_w -endstream -endobj - -5068 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 85.78214 759.87537] - /Border [0 0 0] - /Dest 4602 0 R - /F 4 - /StructParent 346 - /Contents ([7]) ->> -endobj - -5069 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [183.08813 732.5514 419.91815 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://openai.com/index/harness-engineering/) - >> - /F 4 - /StructParent 347 - /Contents (https://openai.com/index/harness-engineering/) ->> -endobj - -5070 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 85.78214 725.7514] - /Border [0 0 0] - /Dest 4602 0 R - /F 4 - /StructParent 348 - /Contents ([8]) ->> -endobj - -5071 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [242.77809 698.42737 526.4241 712.0894] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.anthropic.com/engineering/harness-design-long-running-apps) - >> - /F 4 - /StructParent 349 - /Contents (https://www.anthropic.com/engineering/harness-design-long-running-apps) ->> -endobj - -5072 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 684.7654 195.93614 698.42737] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.anthropic.com/engineering/harness-design-long-running-apps) - >> - /F 4 - /StructParent 350 - /Contents (https://www.anthropic.com/engineering/harness-design-long-running-apps) ->> -endobj - -5073 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 85.78214 677.9654] - /Border [0 0 0] - /Dest 4602 0 R - /F 4 - /StructParent 351 - /Contents ([9]) ->> -endobj - -5074 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [387.49014 650.6414 521.23914 664.3034] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/s11704-024-40231-1) - >> - /F 4 - /StructParent 352 - /Contents (https://doi.org/10.1007/s11704-024-40231-1) ->> -endobj - -5075 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4603 0 R - /F 4 - /StructParent 353 - /Contents ([10]) ->> -endobj - -5076 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 616.5174 204.91214 630.1794] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3704435) - >> - /F 4 - /StructParent 354 - /Contents (https://doi.org/10.1145/3704435) ->> -endobj - -5077 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 596.0554 91.28214 609.7174] - /Border [0 0 0] - /Dest 4604 0 R - /F 4 - /StructParent 355 - /Contents ([11]) ->> -endobj - -5078 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 561.9314 91.28214 575.5934] - /Border [0 0 0] - /Dest 4605 0 R - /F 4 - /StructParent 356 - /Contents ([12]) ->> -endobj - -5079 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [355.66714 534.6074 467.96616 548.2694] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.24963/ijcai.2024/890) - >> - /F 4 - /StructParent 357 - /Contents (https://doi.org/10.24963/ijcai.2024/890) ->> -endobj - -5080 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 514.1454 91.28214 527.8074] - /Border [0 0 0] - /Dest 4606 0 R - /F 4 - /StructParent 358 - /Contents ([13]) ->> -endobj - -5081 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 466.3594 91.28214 480.0214] - /Border [0 0 0] - /Dest 4607 0 R - /F 4 - /StructParent 359 - /Contents ([14]) ->> -endobj - -5082 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 432.2354 91.28214 445.8974] - /Border [0 0 0] - /Dest 4608 0 R - /F 4 - /StructParent 360 - /Contents ([15]) ->> -endobj - -5083 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [233.44614 418.5734 379.90015 432.2354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/0890-5401(91)90052-4) - >> - /F 4 - /StructParent 361 - /Contents (https://doi.org/10.1016/0890-5401(91)90052-4) ->> -endobj - -5084 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 398.1114 91.28214 411.7734] - /Border [0 0 0] - /Dest 4608 0 R - /F 4 - /StructParent 362 - /Contents ([16]) ->> -endobj - -5085 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 350.3254 91.28214 363.9874] - /Border [0 0 0] - /Dest 4609 0 R - /F 4 - /StructParent 363 - /Contents ([17]) ->> -endobj - -5086 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 309.33942 313.06415 323.0014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-642-39212-2_35) - >> - /F 4 - /StructParent 364 - /Contents (https://doi.org/10.1007/978-3-642-39212-2_35) ->> -endobj - -5087 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 288.87738 91.28214 302.53943] - /Border [0 0 0] - /Dest 4609 0 R - /F 4 - /StructParent 365 - /Contents ([18]) ->> -endobj - -5088 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [310.53415 247.89142 431.38013 261.5534] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2951913.2951939) - >> - /F 4 - /StructParent 366 - /Contents (https://doi.org/10.1145/2951913.2951939) ->> -endobj - -5089 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 227.42938 91.28214 241.09143] - /Border [0 0 0] - /Dest 4610 0 R - /F 4 - /StructParent 367 - /Contents ([19]) ->> -endobj - -5090 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.92813 213.7674 344.52414 227.42938] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.2307/2266170) - >> - /F 4 - /StructParent 368 - /Contents (https://doi.org/10.2307/2266170) ->> -endobj - -5091 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 193.30542 91.28214 206.9674] - /Border [0 0 0] - /Dest 4610 0 R - /F 4 - /StructParent 369 - /Contents ([20]) ->> -endobj - -5092 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 172.84338 91.28214 186.50537] - /Border [0 0 0] - /Dest 4611 0 R - /F 4 - /StructParent 370 - /Contents ([21]) ->> -endobj - -5093 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 131.85742 224.16214 145.51941] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/73560.73564) - >> - /F 4 - /StructParent 371 - /Contents (https://doi.org/10.1145/73560.73564) ->> -endobj - -5094 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 111.395386 91.28214 125.05737] - /Border [0 0 0] - /Dest 4612 0 R - /F 4 - /StructParent 372 - /Contents ([22]) ->> -endobj - -5095 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 373 - /Tabs /S - /Parent 1 0 R - /Contents 5096 0 R - /Annots [5068 0 R 5069 0 R 5070 0 R 5071 0 R 5072 0 R 5073 0 R 5074 0 R 5075 0 R 5076 0 R 5077 0 R 5078 0 R 5079 0 R 5080 0 R 5081 0 R 5082 0 R 5083 0 R 5084 0 R 5085 0 R 5086 0 R 5087 0 R 5088 0 R 5089 0 R 5090 0 R 5091 0 R 5092 0 R 5093 0 R 5094 0 R] ->> -endobj - -5096 0 obj -<< - /Length 5301 - /Filter /FlateDecode ->> -stream -x][s~hR*aJٵTbKL?Ph+9̸* ppf7}rq98}ڧn/ӧ'MspO?S;_Ç/N^~qro/ۆO~"hgB7N{&U_ONxsj77'׼9+w=o}Ԝ8!!DpżBo@J}>.82+ngG*C|}݇롖5O94bjD㋹Y>8sk?=;7k"YHo\ʘ=J5a?R.xi8 {p&NKa -ȋ/WK6.6rť%=ކIsj̹ X|QIwqz۳Y;]#F!)WiUcNɓzQUƝ2gg[PM -.+f%paPmF3$å3Fajd]Bj0aZ; ϱZp0A +|VࢮT4}g:)T y&FrGI"&H瘱Nl0IB~-j/Pe5QɁܭfڹHFG/PZ]9kf4 xn"PU߀!I}{{NVj&h}XfsK+,/Y]M}ɘǍ[ 6z%'fAPo6R(-) -AaF;bK~$,U2l.Z`e&V_zӄap _غђXIX:L K0I/Z6@ -zn$y":z@[T|. .(jTgFvAs<ډr(L43/WP!  }^~gS.&ի4 L۸͝VaCCVSmN0罐̶',*`/-z\q+-j.kQqR`@C -V]`nYfÍPWnMg1W([$pXA_` -Hs]-6 O8P(3f9} !s> >- [ST ZU[qNpX'?ȫP.T*DHz*XSuk FcOrVXY`ѻy:Ab:Aw 019}((e5L4]czg 7h cC2G,A cb}+xGq*(]E\~ FE0)֊UQz!1 ٴXu7ovM2:˱˭֕02)^.K%C^#l$Z@EFRYѽ\$'ADh a.1)tU[4;<2;QCa1AQ~9-7 zZc}rHPWZ3#;5C^)yЯ!%фݵWw:܃/B f{AU q$N6I6+!'Ъ,2tF:+f%B_H^_ΰֶZl+ߪ Sz`HLx@zYwx!eɂ}TJ "sE/T]F樓l7/[PnڂŶO~%??qY5'~%a%ܮOR2<>͈<7bI,0/$ xLWW|w#'P`Z"~cZ>`@t~wΙO`Ǥ!m%xSmFrlFUDɘ$SEzqBhÅwFJ@\IYxT~ᤦ:fx$D&rg'59>.LSzCgP` -y딛&EgkRnM¤'fm+|i\_Ը6u&dRorK UBh%Lڬ} j=a"#E/-e"mU&HYY$ 'EħkPG_I@ Ɛ}Gb]w (8mUqZ;t0p7$Z -h i{2|œ՚ױr Β%HE -Rf5hA: 3khGh"uTwOr }:; \G)bv-Jn/py?7?>x8|~wo>~<~:￿C(^2\0k -#7, -endstream -endobj - -5097 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4613 0 R - /F 4 - /StructParent 374 - /Contents ([23]) ->> -endobj - -5098 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [245.49113 718.8894 369.07614 732.5514] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/3-540-45931-6_24) - >> - /F 4 - /StructParent 375 - /Contents (https://doi.org/10.1007/3-540-45931-6_24) ->> -endobj - -5099 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 698.42737 91.28214 712.0894] - /Border [0 0 0] - /Dest 4614 0 R - /F 4 - /StructParent 376 - /Contents ([24]) ->> -endobj - -5100 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 671.1034 263.56415 684.7654] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-642-00590-9_7) - >> - /F 4 - /StructParent 377 - /Contents (https://doi.org/10.1007/978-3-642-00590-9_7) ->> -endobj - -5101 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 650.6414 91.28214 664.3034] - /Border [0 0 0] - /Dest 4615 0 R - /F 4 - /StructParent 378 - /Contents ([25]) ->> -endobj - -5102 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [483.31345 636.9794 524.4094 650.6414] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2015.12.003) - >> - /F 4 - /StructParent 379 - /Contents (https://doi.org/10.1016/j.entcs.2015.12.003) ->> -endobj - -5103 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 623.3174 191.81114 636.9794] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2015.12.003) - >> - /F 4 - /StructParent 380 - /Contents (https://doi.org/10.1016/j.entcs.2015.12.003) ->> -endobj - -5104 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 602.8554 91.28214 616.5174] - /Border [0 0 0] - /Dest 4616 0 R - /F 4 - /StructParent 381 - /Contents ([26]) ->> -endobj - -5105 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [483.31345 589.1934 524.4094 602.8554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.4204/eptcs.153.8) - >> - /F 4 - /StructParent 382 - /Contents (https://doi.org/10.4204/eptcs.153.8) ->> -endobj - -5106 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 575.5314 156.22614 589.1934] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.4204/eptcs.153.8) - >> - /F 4 - /StructParent 383 - /Contents (https://doi.org/10.4204/eptcs.153.8) ->> -endobj - -5107 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 555.0694 91.28214 568.73145] - /Border [0 0 0] - /Dest 4616 0 R - /F 4 - /StructParent 384 - /Contents ([27]) ->> -endobj - -5108 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 514.0834 224.77814 527.74536] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3009837.3009872) - >> - /F 4 - /StructParent 385 - /Contents (https://doi.org/10.1145/3009837.3009872) ->> -endobj - -5109 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 493.6214 91.28214 507.2834] - /Border [0 0 0] - /Dest 4617 0 R - /F 4 - /StructParent 386 - /Contents ([28]) ->> -endobj - -5110 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 466.2974 235.48114 479.9594] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jlamp.2014.02.001) - >> - /F 4 - /StructParent 387 - /Contents (https://doi.org/10.1016/j.jlamp.2014.02.001) ->> -endobj - -5111 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 445.8354 91.28214 459.4974] - /Border [0 0 0] - /Dest 4618 0 R - /F 4 - /StructParent 388 - /Contents ([29]) ->> -endobj - -5112 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [287.61014 432.1734 367.20615 445.8354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3408995) - >> - /F 4 - /StructParent 389 - /Contents (https://doi.org/10.1145/3408995) ->> -endobj - -5113 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 411.7114 91.28214 425.3734] - /Border [0 0 0] - /Dest 4619 0 R - /F 4 - /StructParent 390 - /Contents ([30]) ->> -endobj - -5114 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [275.27914 370.7254 396.12515 384.3874] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2628136.2628160) - >> - /F 4 - /StructParent 391 - /Contents (https://doi.org/10.1145/2628136.2628160) ->> -endobj - -5115 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 350.2634 91.28214 363.9254] - /Border [0 0 0] - /Dest 4620 0 R - /F 4 - /StructParent 392 - /Contents ([31]) ->> -endobj - -5116 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [394.88446 336.6014 523.85944 350.2634] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2008.05.029) - >> - /F 4 - /StructParent 393 - /Contents (https://doi.org/10.1016/j.entcs.2008.05.029) ->> -endobj - -5117 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 316.1394 91.28214 329.8014] - /Border [0 0 0] - /Dest 4621 0 R - /F 4 - /StructParent 394 - /Contents ([32]) ->> -endobj - -5118 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 275.15338 247.68015 288.81543] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-642-54833-8_19) - >> - /F 4 - /StructParent 395 - /Contents (https://doi.org/10.1007/978-3-642-54833-8_19) ->> -endobj - -5119 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 254.6914 91.28214 268.3534] - /Border [0 0 0] - /Dest 4622 0 R - /F 4 - /StructParent 396 - /Contents ([33]) ->> -endobj - -5120 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 227.36737 224.77814 241.02942] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1932681.1863568) - >> - /F 4 - /StructParent 397 - /Contents (https://doi.org/10.1145/1932681.1863568) ->> -endobj - -5121 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 206.9054 91.28214 220.56738] - /Border [0 0 0] - /Dest 4623 0 R - /F 4 - /StructParent 398 - /Contents ([34]) ->> -endobj - -5122 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.53815 165.91937 325.38416 179.58142] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/292540.292555) - >> - /F 4 - /StructParent 399 - /Contents (https://doi.org/10.1145/292540.292555) ->> -endobj - -5123 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 145.4574 91.28214 159.11938] - /Border [0 0 0] - /Dest 4623 0 R - /F 4 - /StructParent 400 - /Contents ([35]) ->> -endobj - -5124 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [250.87015 131.79541 360.71616 145.4574] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/360051.360056) - >> - /F 4 - /StructParent 401 - /Contents (https://doi.org/10.1145/360051.360056) ->> -endobj - -5125 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 111.333374 91.28214 124.99542] - /Border [0 0 0] - /Dest 4624 0 R - /F 4 - /StructParent 402 - /Contents ([36]) ->> -endobj - -5126 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [332.40213 97.67139 411.99814 111.333374] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3498692) - >> - /F 4 - /StructParent 403 - /Contents (https://doi.org/10.1145/3498692) ->> -endobj - -5127 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 404 - /Tabs /S - /Parent 1 0 R - /Contents 5128 0 R - /Annots [5097 0 R 5098 0 R 5099 0 R 5100 0 R 5101 0 R 5102 0 R 5103 0 R 5104 0 R 5105 0 R 5106 0 R 5107 0 R 5108 0 R 5109 0 R 5110 0 R 5111 0 R 5112 0 R 5113 0 R 5114 0 R 5115 0 R 5116 0 R 5117 0 R 5118 0 R 5119 0 R 5120 0 R 5121 0 R 5122 0 R 5123 0 R 5124 0 R 5125 0 R 5126 0 R] ->> -endobj - -5128 0 obj -<< - /Length 5218 - /Filter /FlateDecode ->> -stream -x]r7}WCV-и k$Kk+l/c)6-/UUK5 ]kv2 kn;{/Oã~n۫oG~yڿ;{{嫳^:XWeG_ucJz쌴^v7mohw3fwvwgwc|2[JßS]Wgo1A -bgr&σCta-ЇO6SR1蘕?U$\'6iө CktSMggDo?O7=uS'&;='$T!7["&i Y׶Bc檖ޥ{"ms'Vaovt6'V^լ]=7i ?ϔ1R>q](I@"E0ϓ$i L{k07c-֪h@pw@ȦP̼%=ih` ;[Ż혙mйwSD~Ԑlù aAWl,tY<LCJF>Lfܼ|GbۯV"(ML91dKzq.oo=ŗϦ ft=1X]8#vԹ[+nBMgAi>g|3|{x,4 D\*"-c]k>Ea̽z<<ο=qY~Qp[@jFF<8d6iPF+i:MVXkX[-(,nDȪض&tPu|co]A4"t|}1|,}lܧPZYbX3F\L<%zApZ4Ю_s_G"dzSm1J<]dQvb,m#2Jb2VMʄ7 bT6#6(w(?/K`'* Lm:,~5u W9'B4XLWF)\7s0Ki`$a j0`jo`5}2>L `+с?)ӜDiTLp.39 Z땀}a c-cxfӱi8an#((9LIWF:tw!R Ay̜Ͱ GF\': ,[4KSJ.Japa&Y "Dqz|czh2[0j2&۱]('63jojm<s8g|Y$yG, ^.. `R@`KU@ƘmUows^\c߱ DSw@=lȁ)Ƀbo1ŗYFzXSg&YI{U𷶉Z < W̘]@2EVX |=(<6MgI0XPtȯ: uZfHH \~āo*QA!,*Ng֚uJ˙iK_-A)Y Nʀ҄6 - JZ):TcQ#7 -JFU3\OAWXYn:L -!>Xy xz9i?F=SysMQbkk!:]ttʞ-8QqPKEuZ$R40>FW3 w&'>QaoG+P{$5B)*$Ykfk:L("L4n -/Uou`Q&B'ى -k,nBL{8q)wA>MXEPyS ^V3@'!M_\$1{ o|t}?0Rb̒QIۙ@gt,j-:fi<-X,q@n&ә+2CKbLϚ:]IפD˵2J]oVs.Q4L>%+6`☹XcKWK]*SD/hʞj[2#[6BL:9}ES W%P4=L(\VV4ED~'PÅ@TIb"u*IQ*NQ.> ӕ~0ŭēr_,*ύD<$,56k?0K#;R["8wO.aBEg8oE:"8 򩃮}ʞz-&Γ:Z`2Z%0nôηr01 e 8%+Z:9DRȬ`Bר̂x(Leb(&9ƾC}?VY;"@zubނMF2Wc&y_FHa'hU"(JlPY>HۈĦ6$<0@ɚ+F`h]ʮqQwo> g*("/~?("yoft!Xh܆HB=G14T#'$FTܠ!gyp@pbyQQ7Iy[.]t z\K '@j9GVO >]<QXoPoMa4_'_΁C(b_r(x1&snBJO8赌PFicمkN(VNvEYIFB -")y H=VE2# Oa;q1-MQ`>Ct6r"Ɔ564JdĘ.ƫ ctm+Zd9*93-'^'/a"DH) HLxY/8&Ϝ ^ud"GdYF^\&,WJ3XֿĨS}eҝbDDw4euc"j"Xu‰D&uU+&+Z_!kӐ׽EYjlmQZEZO/F' -R\^AI t>wY5l*x_){$ATՌglSxS2Azr.iAT$`hQֶoNU_SֶmPXySkSͺnb׽tkP%DqLLuЕ:KE\(qRFX) -LF Eܝ\'!5 7 -+IKWPZN -*x+27R 镭qɆjLK)@G)ĔioTA9b{-; ҥaAMV,\T5:۽3(J=/љB-'wE%@iȈ - Dy4b:z*6 QPEo -鞱 FmpC0C J*)QN( S0 xhc<w 4X׽ڛYqTfd|l.V͒I|'Ӟx!T귧Áy]3EQ$Jrcj$$jQֶx ^[08Ǧi_BޞGiMĔنI0fǞެpfDww;7j݋!jA-%SZ$S < reaz]PV)}E"BJb6ʘ쎅 0'xN*MBao<9K!tpø>"'5w\ -W -,ccgzfn?6R KkȌKIM`M 4F;dBMr<\ٹ[ id?91&uU h܏;P1ƭFn& .0>Ž x{ރr\ɋﳱ[]/nPZA%_+ֽӖ!|.p7hr+L'9G>*LD > aH R=HjTGgUq2H q:Y:[xIM8 @OHU'Ntݎzl b]gV{a ]S ؐW|HMؖ!0g*ۂU ź;Ow/w㲞Mu&QZԲ1UՋ$A&iCA%#FuNYXg:=qڀÏ82q0=YE$ۢ"B+N(/=%fn6$ΐUV`([:"YtIbYyA>OϨmgxWq/nsj8~ ]f [^pC 8.KМ@/;9ӞiDrW 4yuo%kSMmVj[$wL ]5KVjHx?s>CQ`OE}2&lfYT_OȄq( a_tAħxǮ+t;q:ZEou -"]ȁ ql4]40 ACW0Y;c L] -ޛ[=;q '[~|98EÔPS!/Q`F?wītkg[x$[h3 .^xD%%A$^6-=NhA *.Z '=Uj;1G"[`m"=%...QT2H:?kzz€/ȞV 8Q0ǯ|r?%J{ 03Fv;]8tyݏۗ4> -endobj - -5130 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 718.8894 202.77814 732.5514] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/38713.38742) - >> - /F 4 - /StructParent 406 - /Contents (https://doi.org/10.1145/38713.38742) ->> -endobj - -5131 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 698.42737 91.28214 712.0894] - /Border [0 0 0] - /Dest 4626 0 R - /F 4 - /StructParent 407 - /Contents ([38]) ->> -endobj - -5132 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 91.28214 677.9654] - /Border [0 0 0] - /Dest 4626 0 R - /F 4 - /StructParent 408 - /Contents ([39]) ->> -endobj - -5133 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [233.11613 650.6414 470.02313 664.3034] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://martinfowler.com/articles/injection.html) - >> - /F 4 - /StructParent 409 - /Contents (https://martinfowler.com/articles/injection.html) ->> -endobj - -5134 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4627 0 R - /F 4 - /StructParent 410 - /Contents ([40]) ->> -endobj - -5135 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.81815 589.1934 388.24915 602.8554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/3-540-57182-5\\_8) - >> - /F 4 - /StructParent 411 - /Contents (https://doi.org/10.1007/3-540-57182-5\\_8) ->> -endobj - -5136 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 568.73145 91.28214 582.39343] - /Border [0 0 0] - /Dest 4628 0 R - /F 4 - /StructParent 412 - /Contents ([41]) ->> -endobj - -5137 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 520.94543 91.28214 534.6074] - /Border [0 0 0] - /Dest 4629 0 R - /F 4 - /StructParent 413 - /Contents ([42]) ->> -endobj - -5138 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [387.86646 520.94543 524.4094 534.6074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://webpack.js.org/api/hot-module-replacement/) - >> - /F 4 - /StructParent 414 - /Contents (https://webpack.js.org/api/hot-module-replacement/) ->> -endobj - -5139 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 507.2834 230.02515 520.94543] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://webpack.js.org/api/hot-module-replacement/) - >> - /F 4 - /StructParent 415 - /Contents (https://webpack.js.org/api/hot-module-replacement/) ->> -endobj - -5140 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.8214 91.28214 500.4834] - /Border [0 0 0] - /Dest 4630 0 R - /F 4 - /StructParent 416 - /Contents ([43]) ->> -endobj - -5141 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [292.59314 486.8214 447.93515 500.4834] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://vite.dev/guide/api-hmr) - >> - /F 4 - /StructParent 417 - /Contents (https://vite.dev/guide/api-hmr) ->> -endobj - -5142 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 466.3594 91.28214 480.0214] - /Border [0 0 0] - /Dest 4631 0 R - /F 4 - /StructParent 418 - /Contents ([44]) ->> -endobj - -5143 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 445.8974 91.28214 459.5594] - /Border [0 0 0] - /Dest 4632 0 R - /F 4 - /StructParent 419 - /Contents ([45]) ->> -endobj - -5144 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 418.5734 207.66214 432.2354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/32.60317) - >> - /F 4 - /StructParent 420 - /Contents (https://doi.org/10.1109/32.60317) ->> -endobj - -5145 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 398.1114 91.28214 411.7734] - /Border [0 0 0] - /Dest 4632 0 R - /F 4 - /StructParent 421 - /Contents ([46]) ->> -endobj - -5146 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [388.97513 370.7874 498.59015 384.4494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/tse.2007.70733) - >> - /F 4 - /StructParent 422 - /Contents (https://doi.org/10.1109/tse.2007.70733) ->> -endobj - -5147 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 350.3254 91.28214 363.9874] - /Border [0 0 0] - /Dest 4633 0 R - /F 4 - /StructParent 423 - /Contents ([47]) ->> -endobj - -5148 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 309.33942 242.18015 323.0014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-540-76778-7_1) - >> - /F 4 - /StructParent 424 - /Contents (https://doi.org/10.1007/978-3-540-76778-7_1) ->> -endobj - -5149 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 288.87738 91.28214 302.53943] - /Border [0 0 0] - /Dest 4634 0 R - /F 4 - /StructParent 425 - /Contents ([48]) ->> -endobj - -5150 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 254.75342 91.28214 268.4154] - /Border [0 0 0] - /Dest 4634 0 R - /F 4 - /StructParent 426 - /Contents ([49]) ->> -endobj - -5151 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 220.6294 91.28214 234.29138] - /Border [0 0 0] - /Dest 4634 0 R - /F 4 - /StructParent 427 - /Contents ([50]) ->> -endobj - -5152 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 186.50537 91.28214 200.16742] - /Border [0 0 0] - /Dest 4635 0 R - /F 4 - /StructParent 428 - /Contents ([51]) ->> -endobj - -5153 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [266.66614 159.1814 376.51215 172.84338] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/168619.168635) - >> - /F 4 - /StructParent 429 - /Contents (https://doi.org/10.1145/168619.168635) ->> -endobj - -5154 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 138.71942 91.28214 152.38141] - /Border [0 0 0] - /Dest 4636 0 R - /F 4 - /StructParent 430 - /Contents ([52]) ->> -endobj - -5155 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 431 - /Tabs /S - /Parent 1 0 R - /Contents 5156 0 R - /Annots [5129 0 R 5130 0 R 5131 0 R 5132 0 R 5133 0 R 5134 0 R 5135 0 R 5136 0 R 5137 0 R 5138 0 R 5139 0 R 5140 0 R 5141 0 R 5142 0 R 5143 0 R 5144 0 R 5145 0 R 5146 0 R 5147 0 R 5148 0 R 5149 0 R 5150 0 R 5151 0 R 5152 0 R 5153 0 R 5154 0 R] ->> -endobj - -5156 0 obj -<< - /Length 5106 - /Filter /FlateDecode ->> -stream -x=r7q[!7P4uͱRF4ikbr3?QuՖbȮ‘Hqzqpwui<9jӋN/?}_79ݫ?6>Κϟx_Ckyǯ{$hgZ[&G7oq>zzyě;\͕??}{/V79zqyF XGvsjIZnO=~0G|Xx,( ͗~Jmkïux3­a Ȫ_9|"l/Z -Y"JIVf -aH|ya>D% *\9FVn s\Vk=B0.Sikj5&Wgi6M]4 㠛GJ3.F()uo&ٽ=+ 'n)P0 B|drDnL<5. :YJGAD"uprlqPvIyڇ!qJy@ʄ=y]gZMmx(nyRK A"`mޓ#|f~N|=4fzy|>qE"#\2X4~|ǫo]i#U\'f{)<.W/Nh^`nlL\\U?DG؜ )^g[z;ӢxH#γyhM}z'K/0>š={%J/Y+5+̒ёiShb-h$:gʢVKU_7.uݭ﹵p M z~GeTL4OA{5m@΍ȐJG{qQ񘡈%ǸJ"4߿ <aVGR11Nt 7ӮP$s(fQ95M;dz^ib&Zv8"^M1Ljp# -u^y ' &VtWLAnDh>*?\QtNZor} WI@|R ם-p^VZD0)Bbr\kF|ON:xv{a$9_&N LdB -2: ǁs AU -0~.~1$TzuBBX c(cFڀʼn}-Zf |dyje‡,Y)54S@Ʂ%;q]Pp,`Y1٨jLTz}_6Fa$%LX|z++#bRN Wbl_C[C|`7$ yQ6D;ԯQ(' yLCm:JٍYHǤuC#4( ڙ ̔)w6- 4z4 ftLCi#"@L7W(qNL'#6 uji}e5F(L+ M94-ծAuUTՃ%V3/0.%ejFĜ#Ac-,=dnh fgL+zR]AΏLN( 0γK}ǀ~V?H -Эd^*o.ΪBn1se)jT Z3h-8c5飡t;; "SEx.ikՋ="FkBeʇ?1_H4(fTκ@< yCc 3P'.V'}zӵeB׭{m4]0'5l#fq~:,!Q)8S/ƳIupШ*͵oue%zh@=8t1[yh)[L2"?M~F2u&)M@OFNxyHz@9I\-ͶL8Vm4-q ֠ hE癒F%q:'ט䄄 n˭Br.P +h8 <b5RJP\OﶳJui0K]%XYdĵ.i%ܕHނ|";OlĉDK摉:rh}#JހFDŽ -ٸ%"-> -~՘׮l;7/h1KOQl+6TˬZ.Q] GEbـu;8]"Hx чI~~Ia"i2w} 9cT7(Axǥs_O6}cb7a?|d݅ŗqivXô-Tր#Rg?C'&MEeՄT  NQ<&w}K$X|hXt?[ ɔ(6djG 7⦘`:Eu-l%U‘+("[Z~Ҏ4.(+'s (5I -tX!qiN3zUX*uB+BKhIh/bN'DwyUh3L_PFm:MX.G_&$퓌 ia]ND' OTud -J $?fVJZ;*˧r9(:u{ 4ߢ#4b4u)a]yr[Pc01edZxז8d$PYUshNX*%,docb4$Ѯ čeĎi7' :P}+A+Gۅ`J-vͽ<2N7MD99m(72°u%Wjez>rz\Cf%whr:vUˁcn(yOY Y2CF1DɁ!JnqkT}RXeXnոg<^"qĘm"g@? a)B1(\ #&PfבKPE|f.8%.`Y5O򍋼$P.Ms`'7,^򖵭\pK%O݅,yÅ?*}'= LM\ԡ-aY_dHr@& -ϙq362XLjiٰr"f RN.S%&jײn厽Lr2Q9L9l[eF-h -T4FbY Q¬)ɬFXk~<g!=^<CQ9^|(.~iW\? 9Ky{N_q̘yUBD"PeڤL\3[[LH=vMvId2>D+K}@,1&Fbd?P2ax,"b`!9O+  зZpϼ|vt`3ZHX$,<87ei\0sa/AoM ЍB=ŏ)̢Vy޴ksz/TצU> -endobj - -5158 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [392.97916 732.5514 510.96515 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1002/SPE.4380210404) - >> - /F 4 - /StructParent 433 - /Contents (https://doi.org/10.1002/SPE.4380210404) ->> -endobj - -5159 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 91.28214 725.7514] - /Border [0 0 0] - /Dest 4638 0 R - /F 4 - /StructParent 434 - /Contents ([54]) ->> -endobj - -5160 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.68915 684.7654 421.53516 698.42737] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/75277.75283) - >> - /F 4 - /StructParent 435 - /Contents (https://doi.org/10.1145/75277.75283) ->> -endobj - -5161 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 91.28214 677.9654] - /Border [0 0 0] - /Dest 4639 0 R - /F 4 - /StructParent 436 - /Contents ([55]) ->> -endobj - -5162 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4640 0 R - /F 4 - /StructParent 437 - /Contents ([56]) ->> -endobj - -5163 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.68915 602.8554 443.53516 616.5174] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1190216.1190229) - >> - /F 4 - /StructParent 438 - /Contents (https://doi.org/10.1145/1190216.1190229) ->> -endobj - -5164 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 582.39343 91.28214 596.0554] - /Border [0 0 0] - /Dest 4641 0 R - /F 4 - /StructParent 439 - /Contents ([57]) ->> -endobj - -5165 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [386.45844 582.39343 526.60944 596.0554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) - >> - /F 4 - /StructParent 440 - /Contents (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) ->> -endobj - -5166 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 568.73145 332.56714 582.39343] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) - >> - /F 4 - /StructParent 441 - /Contents (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) ->> -endobj - -5167 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 548.2694 91.28214 561.9314] - /Border [0 0 0] - /Dest 4642 0 R - /F 4 - /StructParent 442 - /Contents ([58]) ->> -endobj - -5168 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [204.53815 520.94543 325.38416 534.6074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1869631.1869638) - >> - /F 4 - /StructParent 443 - /Contents (https://doi.org/10.1145/1869631.1869638) ->> -endobj - -5169 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 500.4834 91.28214 514.1454] - /Border [0 0 0] - /Dest 4643 0 R - /F 4 - /StructParent 444 - /Contents ([59]) ->> -endobj - -5170 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [401.79245 500.4834 524.4094 514.1454] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://docs.python.org/3/howto/descriptor.html) - >> - /F 4 - /StructParent 445 - /Contents (https://docs.python.org/3/howto/descriptor.html) ->> -endobj - -5171 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 486.8214 225.16315 500.4834] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://docs.python.org/3/howto/descriptor.html) - >> - /F 4 - /StructParent 446 - /Contents (https://docs.python.org/3/howto/descriptor.html) ->> -endobj - -5172 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 466.3594 91.28214 480.0214] - /Border [0 0 0] - /Dest 4644 0 R - /F 4 - /StructParent 447 - /Contents ([60]) ->> -endobj - -5173 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 439.0354 268.16214 452.6974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/38765.38821) - >> - /F 4 - /StructParent 448 - /Contents (https://doi.org/10.1145/38765.38821) ->> -endobj - -5174 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 418.5734 91.28214 432.2354] - /Border [0 0 0] - /Dest 4644 0 R - /F 4 - /StructParent 449 - /Contents ([61]) ->> -endobj - -5175 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [249.25314 377.5874 370.09915 391.2494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1028976.1029004) - >> - /F 4 - /StructParent 450 - /Contents (https://doi.org/10.1145/1028976.1029004) ->> -endobj - -5176 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 357.1254 91.28214 370.7874] - /Border [0 0 0] - /Dest 4645 0 R - /F 4 - /StructParent 451 - /Contents ([62]) ->> -endobj - -5177 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [483.31345 343.4634 524.4094 357.1254] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/s12243-008-0072-z) - >> - /F 4 - /StructParent 452 - /Contents (https://doi.org/10.1007/s12243-008-0072-z) ->> -endobj - -5178 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 329.8014 191.08514 343.4634] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/s12243-008-0072-z) - >> - /F 4 - /StructParent 453 - /Contents (https://doi.org/10.1007/s12243-008-0072-z) ->> -endobj - -5179 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 309.33942 91.28214 323.0014] - /Border [0 0 0] - /Dest 4646 0 R - /F 4 - /StructParent 454 - /Contents ([63]) ->> -endobj - -5180 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [378.28314 295.67743 499.12915 309.33942] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2489837.2489840) - >> - /F 4 - /StructParent 455 - /Contents (https://doi.org/10.1145/2489837.2489840) ->> -endobj - -5181 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 275.2154 91.28214 288.87738] - /Border [0 0 0] - /Dest 4647 0 R - /F 4 - /StructParent 456 - /Contents ([64]) ->> -endobj - -5182 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [196.81615 247.89142 312.88815 261.5534] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jss.2016.04.008) - >> - /F 4 - /StructParent 457 - /Contents (https://doi.org/10.1016/j.jss.2016.04.008) ->> -endobj - -5183 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 227.42938 91.28214 241.09143] - /Border [0 0 0] - /Dest 4648 0 R - /F 4 - /StructParent 458 - /Contents ([65]) ->> -endobj - -5184 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [147.31615 186.44342 268.16214 200.10541] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3426428.3426922) - >> - /F 4 - /StructParent 459 - /Contents (https://doi.org/10.1145/3426428.3426922) ->> -endobj - -5185 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 165.98138 91.28214 179.64337] - /Border [0 0 0] - /Dest 4649 0 R - /F 4 - /StructParent 460 - /Contents ([66]) ->> -endobj - -5186 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [260.94614 138.65741 377.01813 152.3194] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jss.2012.02.018) - >> - /F 4 - /StructParent 461 - /Contents (https://doi.org/10.1016/j.jss.2012.02.018) ->> -endobj - -5187 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 118.19537 91.28214 131.85742] - /Border [0 0 0] - /Dest 4650 0 R - /F 4 - /StructParent 462 - /Contents ([67]) ->> -endobj - -5188 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [226.07614 90.8714 324.92215 104.53339] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/73560.73566) - >> - /F 4 - /StructParent 463 - /Contents (https://doi.org/10.1145/73560.73566) ->> -endobj - -5189 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 464 - /Tabs /S - /Parent 1 0 R - /Contents 5190 0 R - /Annots [5157 0 R 5158 0 R 5159 0 R 5160 0 R 5161 0 R 5162 0 R 5163 0 R 5164 0 R 5165 0 R 5166 0 R 5167 0 R 5168 0 R 5169 0 R 5170 0 R 5171 0 R 5172 0 R 5173 0 R 5174 0 R 5175 0 R 5176 0 R 5177 0 R 5178 0 R 5179 0 R 5180 0 R 5181 0 R 5182 0 R 5183 0 R 5184 0 R 5185 0 R 5186 0 R 5187 0 R 5188 0 R] ->> -endobj - -5190 0 obj -<< - /Length 5269 - /Filter /FlateDecode ->> -stream -x]Y7r~_Qj.奰U\͓ʳwTuUHU$72G7 -@&/?df]<ٿwf=xpu7ys~>W?>ygvO=={ӳ~j>w'3g]=ͯgoxg'g9x;!wg?|#C ?Ξ_{#WR ]y7}>~u4Nb4&|*%m4xwISWjjHq{uWNI wdv -{[?KSb׉_ EeP)6=(*Wx+_C;do8h:쟗+E˷;bhX}3Kty7vD:6vP5TMx[Pޞ.#:nd|zɭ3d=e4+&>Cd57q%K+ %߉?vwש/8z+_uƤ{m,Xf2pJepZIucA1l*(S-X]Jc i#Ta>3%u gNrfM,,[-z'J =>G JXNk>+ [gW>K2HY$1(f -n@%p1`Fa dH Pˌ]0}v iOWU?!9gR NFA7 )~l­d| ,d:WfrM~yUx*֟$vd^+%pѱPX:_mr݆i)G9cE8}E6 @EyA]9b94^ph6g:Q Qi'0mC -b<XZ9 -d-ioPgx 8;{pg6Τ w68h:g^({,{!{h{L2{ZYsKOW姨$̬.&m g8mо/o!;qbB4W28&j'm+a>op`qfܽá| "gE©9,:W  tE -8P2m&5)vYte3;߉-lP#@h*/M&"5M:8 :znxI:Sjhםq1cSV,9 AݬLz۾oUz} ^*~|.x1W- $3uݲB&0uԒno<>N}Z[|]MIH -ヺ-WRE98E篙p]=ݬy RS: +)3泻2qnçY_.`:mZ,\*\K`KZ(#V`f{ڥTIEzfz'-kb1g}OcIiuQ_#J"{t$9s 93W-?(@r͌rlcQE@S>o(BS4)qMrEx3|R~:{k;/>c; =oh:5`H܏A %S&8pWGZ2AJS;:f5rKk牴NYD޷ͭgNptӝZ;zuP'3(Z$z*R2uLX9%l"Lo|֣׃Nl=N20ͅtJh,nẒ >TqpR}9Ո(7C;.{TS7KGzv 7w3 o|FT B- -nNBջZj36r9s@|D>7e;+ -4mׇ&7L[kM.o|({cC>G<1*udLsΟε#M>@np?ZҰTSɨl$UƖ2#XʉKx2j[EW僌B\\7߯<?{8W\Y zI}Z=fpY:n0-=SM=;2F$qRZ<%ۦ$cFmc@FH+äeCG[AC!eM&-r& ğS5m_ݧ$~ZJy MFj)"h|o%j% qi$G0k󵼊Of)Mj#wuGN(Ԙ2Bv8 _Tl gںapɓ뭺s}l{nJǾ8U bH 4ٵQh~jak [_I)G93[Ⱛ`o&\gO\/~O,˼[?ypHS-h`ɵ~Vqw=+n|7,p< DZS)A|0kkB2 czYڐy ]I^Lojn2@4+t:8#:}(Fb2XjҚYd,(LXsi^hڭir}'Ixۈ{Jvτgvv Y;Ҭk윜7?vz"IaҀm@<li9zĐo@GOٝڠ0{ƅj6L!r̶wk ^ \ݣQjͤ^Yg p^D/^PTP8x]slIr81ަQZu 'kK =dUI3 66'U7a/B\74X .Q*mOgƸ"PV -.0gseo͵=;an:LL6I"8{fuAQe2WŪ\{Ŝ+a:N:&efG!T'߻"-W>~qс^R6GaE3/0kro]7ysœ_>ÇۛWڿpM&LuF0/'APu[m -endstream -endobj - -5191 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4651 0 R - /F 4 - /StructParent 465 - /Contents ([68]) ->> -endobj - -5192 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 732.5514 207.66214 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/2.161279) - >> - /F 4 - /StructParent 466 - /Contents (https://doi.org/10.1109/2.161279) ->> -endobj - -5193 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 91.28214 725.7514] - /Border [0 0 0] - /Dest 4652 0 R - /F 4 - /StructParent 467 - /Contents ([69]) ->> -endobj - -5194 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [266.44614 698.42737 377.49115 712.0894] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1006/inco.1994.1055) - >> - /F 4 - /StructParent 468 - /Contents (https://doi.org/10.1006/inco.1994.1055) ->> -endobj - -5195 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 677.9654 91.28214 691.6274] - /Border [0 0 0] - /Dest 4653 0 R - /F 4 - /StructParent 469 - /Contents ([70]) ->> -endobj - -5196 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.81615 650.6414 232.41214 664.3034] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3428194) - >> - /F 4 - /StructParent 470 - /Contents (https://doi.org/10.1145/3428194) ->> -endobj - -5197 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4653 0 R - /F 4 - /StructParent 471 - /Contents ([71]) ->> -endobj - -5198 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [333.17215 602.8554 412.76813 616.5174] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3527320) - >> - /F 4 - /StructParent 472 - /Contents (https://doi.org/10.1145/3527320) ->> -endobj - -5199 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 582.39343 91.28214 596.0554] - /Border [0 0 0] - /Dest 4654 0 R - /F 4 - /StructParent 473 - /Contents ([72]) ->> -endobj - -5200 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [129.48514 568.73145 238.49515 582.39343] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://effect.website/) - >> - /F 4 - /StructParent 474 - /Contents (https://effect.website/) ->> -endobj - -5201 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 548.2694 91.28214 561.9314] - /Border [0 0 0] - /Dest 4655 0 R - /F 4 - /StructParent 475 - /Contents ([73]) ->> -endobj - -5202 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.53815 507.2834 344.51315 520.94543] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2018.11.009) - >> - /F 4 - /StructParent 476 - /Contents (https://doi.org/10.1016/j.entcs.2018.11.009) ->> -endobj - -5203 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.8214 91.28214 500.4834] - /Border [0 0 0] - /Dest 4656 0 R - /F 4 - /StructParent 477 - /Contents ([74]) ->> -endobj - -5204 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 459.4974 183.52814 473.1594] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3341714) - >> - /F 4 - /StructParent 478 - /Contents (https://doi.org/10.1145/3341714) ->> -endobj - -5205 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 439.0354 91.28214 452.6974] - /Border [0 0 0] - /Dest 4657 0 R - /F 4 - /StructParent 479 - /Contents ([75]) ->> -endobj - -5206 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 411.7114 183.52814 425.3734] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3563319) - >> - /F 4 - /StructParent 480 - /Contents (https://doi.org/10.1145/3563319) ->> -endobj - -5207 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 391.2494 91.28214 404.9114] - /Border [0 0 0] - /Dest 4657 0 R - /F 4 - /StructParent 481 - /Contents ([76]) ->> -endobj - -5208 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [469.68445 377.5874 526.60944 391.2494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) - >> - /F 4 - /StructParent 482 - /Contents (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) ->> -endobj - -5209 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 363.9254 245.68915 377.5874] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) - >> - /F 4 - /StructParent 483 - /Contents (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) ->> -endobj - -5210 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 343.4634 91.28214 357.1254] - /Border [0 0 0] - /Dest 4658 0 R - /F 4 - /StructParent 484 - /Contents ([77]) ->> -endobj - -5211 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.81615 316.1394 232.41214 329.8014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3689750) - >> - /F 4 - /StructParent 485 - /Contents (https://doi.org/10.1145/3689750) ->> -endobj - -5212 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 295.67743 91.28214 309.33942] - /Border [0 0 0] - /Dest 4659 0 R - /F 4 - /StructParent 486 - /Contents ([78]) ->> -endobj - -5213 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [373.59714 282.01538 481.69415 295.67743] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.5381/jot.2008.7.3.a4) - >> - /F 4 - /StructParent 487 - /Contents (https://doi.org/10.5381/jot.2008.7.3.a4) ->> -endobj - -5214 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 261.5534 91.28214 275.2154] - /Border [0 0 0] - /Dest 4659 0 R - /F 4 - /StructParent 488 - /Contents ([79]) ->> -endobj - -5215 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [285.91614 234.22937 406.76215 247.89142] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1146841.1146842) - >> - /F 4 - /StructParent 489 - /Contents (https://doi.org/10.1145/1146841.1146842) ->> -endobj - -5216 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 213.7674 91.28214 227.42938] - /Border [0 0 0] - /Dest 4660 0 R - /F 4 - /StructParent 490 - /Contents ([80]) ->> -endobj - -5217 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.81615 186.44342 268.88815 200.10541] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jss.2012.03.024) - >> - /F 4 - /StructParent 491 - /Contents (https://doi.org/10.1016/j.jss.2012.03.024) ->> -endobj - -5218 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 165.98138 91.28214 179.64337] - /Border [0 0 0] - /Dest 4661 0 R - /F 4 - /StructParent 492 - /Contents ([81]) ->> -endobj - -5219 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.81815 138.65741 363.33414 152.3194] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/BFb0053381) - >> - /F 4 - /StructParent 493 - /Contents (https://doi.org/10.1007/BFb0053381) ->> -endobj - -5220 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 118.19537 91.28214 131.85742] - /Border [0 0 0] - /Dest 4661 0 R - /F 4 - /StructParent 494 - /Contents ([82]) ->> -endobj - -5221 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 495 - /Tabs /S - /Parent 1 0 R - /Contents 5222 0 R - /Annots [5191 0 R 5192 0 R 5193 0 R 5194 0 R 5195 0 R 5196 0 R 5197 0 R 5198 0 R 5199 0 R 5200 0 R 5201 0 R 5202 0 R 5203 0 R 5204 0 R 5205 0 R 5206 0 R 5207 0 R 5208 0 R 5209 0 R 5210 0 R 5211 0 R 5212 0 R 5213 0 R 5214 0 R 5215 0 R 5216 0 R 5217 0 R 5218 0 R 5219 0 R 5220 0 R] ->> -endobj - -5222 0 obj -<< - /Length 5118 - /Filter /FlateDecode ->> -stream -x]Ys7~( -Y:3#HhbMy9툝Quэw_8z]ݍ~hGSJLvF:…ͯGg7yswvGgiXw~]z(/ۣWGoqjB 8\zӝZF$Fww~1563do7cǻRBoR$?Oa#selѦ@946ʧƦq3 c@ﻻe{+/wdΉV,]((v77X7N+E`kMqʶ̒6\fz^vBrصiq`nlnmcW0p` E Im0" |3}4x,_~gWN[lt8FQqjּmTàN6?2d~e*i K(3$8m(%B6 E0m -x;lx^K\=T2, BGSY4Dž tXǠ_?' c]Q+H]JBVL0~s\Ѐyx?/;s4S,YtN"ŀhořUJ䗐;eD**hBY l+xAX*(p Q3>YP=hOJq|,S-îLD8GEYRVU~5: /ict.1 <˂ gҝ&񀢥_QGE -P~S6B4i5p@ &5L!df(uY*Y gQ.amV1O!Fj!fY=:~s.@{@lgڟUak,F XL ;sgV٪̓g2ӄ6i"㗛N.Lm)eZ3%s4ENc:p-;7+gN[@ыc,·j#sH ukؿYsLb4S+ $cXX.>L|V Tqda4U,pj2 O2mS)Q^S^b#_-p5js(~Ȣ -rxs/,7=w҄|"9d"" 8f<C,) A'e֮82OԷ''ԟvH=Eo9?U"*;bq<`Iy'<>ȳJ4\40P. ?!"ZK1O!3HjY8kZͤ{γ["SVԏB Q3DX^ɀ%`dmhO٘0e5& )"Q.5Ӕ]>2\5f,Yq;{Nqy?R6#:址q vGiU&2\Tt3NVz8VrNG ۣ -'13^`_N$/=g\gȰ:^gy7Yͼ/nPTh Lii69QօͽOZNǛ1zL9iVf^͸5,(RZCq-'t!nV{PyԹ>F)dHyˍз)(ӏ|wP Po!SZC 'DЖ;Vsx 2]y1KɪR0ELt<=(] -tTHU$ Z.'BHIm\JmuUQmϪT[Y6D"dO-tl:'3AoK%:%`gG{_G :j_@3`}F-O>jzEGrL6܈}B40r!{uRS(aNv>x c({᜴5l]/,7@>,7,^Xnn[bnTvܐڨܰ[ܰ333QN"T\ K͉9!"C `(Y4 -\JN^vX\A)j. -+g=!t% ji$"-)=6Z S@嚴2`4@@` oQCHnQc QHG)N慝-Ɇx -CxM6DѼk TYSÏM7nzS/8#;Z1Z-4|EAqn ,$'*Bؚ[2IפuG \CÇRUH:W@AGuJ2C?X[ 2@1nmk# b(8pg1_z> );$kbԚ⪁wK/R].2J] K{'s^ 0X1VYZ"Th0P>̜TL6;g(Sd>p%VX}& ;W},&(1֒IGhR# -՘SjGR0[8'FuRMg:$wU-Q5uH۲oWzeqRZpEnahjaVj:ڥ&ҮrTvm -k $\QfZW3Gq`4hl2/L'5Qᶾ+R1Pt9=8gGV JtZS}:;Efet9cIŃB|U2M޾]iO4qmzKr,1*4A2CB9Ʋvnu1-ז8΍Ͷ  -' ptF@'SAH sr`0v; AlNFzyɢ]7"Ыe(Udrg| [SC4 ,cgF 3>$ ȠΏ_L!Ix#5P"OtBՉ(͝쏎r;:6a9pѸs,N - 8Әbt PT5+i\bɭ"T\}_*1 ڻJ) p_ܿ3/:4ʋlB U1! :8*"n̠+,ACS# ʙUmŶo;cx(A.8& KˈvT˲FK]%CDy -[%ք9؊m7(²O -ʧ(x%t֦Z>N%I!DQV1XG'MUnaSqm 91-슱LpmbUra6p|71\y&SG:,Z#09%Ti'@ ->ޥ<fFp3-ci2i Yd -_TZpq*-@`~Pr$jV'ܪR㺌 -vQ5U}q:KCΫ Lx( XM$NO6EL+kr0z8} 2a56C;`=4,q9nG˶~<lLowq -1:"m9D(SY -C9$̦ -^H?`0 }km#3BcJd+WuB[;I.fw ä^ A|IǘRu8 .Ju0lN* yJ^2-o{dHXdO|/ AY5zQ{5]Q:Y؀ٟVFo,-F4]Z- CR-[hIh%*V.tߢЁ]E_QŞX\Luf_u;Q ~,!; 2;[`/PR -glyfԌ3rΆ̀RZF|Fh~ψr*ƷjUDܷVUTW,= u hU~ -WOfݏg?n߯;}_>]m?|V c;ňcJ]CHj -endstream -endobj - -5223 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 732.5514 248.90114 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/3-540-45337-7_18) - >> - /F 4 - /StructParent 496 - /Contents (https://doi.org/10.1007/3-540-45337-7_18) ->> -endobj - -5224 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 91.28214 725.7514] - /Border [0 0 0] - /Dest 4662 0 R - /F 4 - /StructParent 497 - /Contents ([83]) ->> -endobj - -5225 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [382.00113 684.7654 491.84714 698.42737] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/508386.508404) - >> - /F 4 - /StructParent 498 - /Contents (https://doi.org/10.1145/508386.508404) ->> -endobj - -5226 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 91.28214 677.9654] - /Border [0 0 0] - /Dest 4662 0 R - /F 4 - /StructParent 499 - /Contents ([84]) ->> -endobj - -5227 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [401.52615 636.9794 511.37213 650.6414] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/976270.976273) - >> - /F 4 - /StructParent 500 - /Contents (https://doi.org/10.1145/976270.976273) ->> -endobj - -5228 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 616.5174 91.28214 630.1794] - /Border [0 0 0] - /Dest 4663 0 R - /F 4 - /StructParent 501 - /Contents ([85]) ->> -endobj - -5229 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [266.72113 589.1934 376.56714 602.8554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/378795.378798) - >> - /F 4 - /StructParent 502 - /Contents (https://doi.org/10.1145/378795.378798) ->> -endobj - -5230 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 568.73145 91.28214 582.39343] - /Border [0 0 0] - /Dest 4664 0 R - /F 4 - /StructParent 503 - /Contents ([86]) ->> -endobj - -5231 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [147.31615 527.74536 268.16214 541.4074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1040305.1040321) - >> - /F 4 - /StructParent 504 - /Contents (https://doi.org/10.1145/1040305.1040321) ->> -endobj - -5232 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 507.2834 91.28214 520.94543] - /Border [0 0 0] - /Dest 4665 0 R - /F 4 - /StructParent 505 - /Contents ([87]) ->> -endobj - -5233 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 479.9594 204.91214 493.6214] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2629460) - >> - /F 4 - /StructParent 506 - /Contents (https://doi.org/10.1145/2629460) ->> -endobj - -5234 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 459.4974 91.28214 473.1594] - /Border [0 0 0] - /Dest 4666 0 R - /F 4 - /StructParent 507 - /Contents ([88]) ->> -endobj - -5235 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [378.18414 432.1734 522.3831 445.8354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/SANER.2017.7884621) - >> - /F 4 - /StructParent 508 - /Contents (https://doi.org/10.1109/SANER.2017.7884621) ->> -endobj - -5236 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 411.7114 91.28214 425.3734] - /Border [0 0 0] - /Dest 4667 0 R - /F 4 - /StructParent 509 - /Contents ([89]) ->> -endobj - -5237 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 377.5874 91.28214 391.2494] - /Border [0 0 0] - /Dest 4668 0 R - /F 4 - /StructParent 510 - /Contents ([90]) ->> -endobj - -5238 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 343.4634 91.28214 357.1254] - /Border [0 0 0] - /Dest 4669 0 R - /F 4 - /StructParent 511 - /Contents ([91]) ->> -endobj - -5239 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 323.0014 91.28214 336.6634] - /Border [0 0 0] - /Dest 4670 0 R - /F 4 - /StructParent 512 - /Contents ([92]) ->> -endobj - -5240 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [444.26346 309.33942 523.85944 323.0014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3763067) - >> - /F 4 - /StructParent 513 - /Contents (https://doi.org/10.1145/3763067) ->> -endobj - -5241 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 288.87738 91.28214 302.53943] - /Border [0 0 0] - /Dest 4671 0 R - /F 4 - /StructParent 514 - /Contents ([93]) ->> -endobj - -5242 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [188.03815 261.5534 297.88416 275.2154] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/224964.224987) - >> - /F 4 - /StructParent 515 - /Contents (https://doi.org/10.1145/224964.224987) ->> -endobj - -5243 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 241.09143 91.28214 254.75342] - /Border [0 0 0] - /Dest 4671 0 R - /F 4 - /StructParent 516 - /Contents ([94]) ->> -endobj - -5244 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [376.65515 213.7674 497.50113 227.42938] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1065944.1065952) - >> - /F 4 - /StructParent 517 - /Contents (https://doi.org/10.1145/1065944.1065952) ->> -endobj - -5245 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 193.30542 91.28214 206.9674] - /Border [0 0 0] - /Dest 4672 0 R - /F 4 - /StructParent 518 - /Contents ([95]) ->> -endobj - -5246 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [385.25714 165.98138 495.10315 179.64337] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/165123.165164) - >> - /F 4 - /StructParent 519 - /Contents (https://doi.org/10.1145/165123.165164) ->> -endobj - -5247 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 145.51941 91.28214 159.1814] - /Border [0 0 0] - /Dest 4673 0 R - /F 4 - /StructParent 520 - /Contents ([96]) ->> -endobj - -5248 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [428.20114 131.85742 518.6981 145.51941] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1147/rd.53.0183) - >> - /F 4 - /StructParent 521 - /Contents (https://doi.org/10.1147/rd.53.0183) ->> -endobj - -5249 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 111.395386 91.28214 125.05737] - /Border [0 0 0] - /Dest 4673 0 R - /F 4 - /StructParent 522 - /Contents ([97]) ->> -endobj - -5250 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [319.92813 97.7334 415.92514 111.395386] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1147/rd.176.0525) - >> - /F 4 - /StructParent 523 - /Contents (https://doi.org/10.1147/rd.176.0525) ->> -endobj - -5251 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4366 0 R - /f1 4360 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 524 - /Tabs /S - /Parent 1 0 R - /Contents 5252 0 R - /Annots [5223 0 R 5224 0 R 5225 0 R 5226 0 R 5227 0 R 5228 0 R 5229 0 R 5230 0 R 5231 0 R 5232 0 R 5233 0 R 5234 0 R 5235 0 R 5236 0 R 5237 0 R 5238 0 R 5239 0 R 5240 0 R 5241 0 R 5242 0 R 5243 0 R 5244 0 R 5245 0 R 5246 0 R 5247 0 R 5248 0 R 5249 0 R 5250 0 R] ->> -endobj - -5252 0 obj -<< - /Length 5388 - /Filter /FlateDecode ->> -stream -x]YsF~節C֎ ->44lX5[~hɣuiG TUVց( NԑuW_>9tOup}wt?_}=wmjׇgϞu/~yg?~K{?h߫XG;=f8paew nyF^\=~ b<7c;18x6Ss|7Wgxʼnrrwcs80c)=}H$X&ǎfx*`T򑈏DB:>-TM)Snɀc3tP;c'w&ʹ#3fV:3=+NJk+Tg[2awc1߯=^K"r[(rElAz}xafNǣ0&9/_u_"GٺQ]!Jxa$9_M2W׶?ʂ5R~:k`/ g{ks:G+m -}j\.VmȣpV8h<۠i8e'1~}{4Gب'@Y"<>G%Δi4TV|8n @dMx1|j'&gqmd*Ήь_Xz|-_? -nٴz/ ݂2"_ss2M{͏c$:[*h@Yb㬥e0@9&\ӄ4Ecy[޼E1e}5Ep+f"hlTLEU.}afqkl;#_F#*1aW[\ qc oZuؾpmr.b][3dl cgd宓cY:ޗJҁ|3|}^̹D+T _Zy(@\ʔ&8+#8?~aKXN(eLlW}3 Gģj?1&#VִV&KEkCl_Λ S}fu^Gs>51V y\V>o -P%܃ezӓPR}[/oW(ZNaDWR\b٫C7|u6޵ PH݀ (>1بMsHJ(f@'x/N1=ËBx"om"8ńkʈza1GAQ6A ΋P9 -]G IpQ٢6hZ!МHJwp( 1 KH -=kA%c<1J%l"uHI>CήUf\G7GB"9P_B!X@BȸHve\ek-Z (ָ=TkhA+2!'m;&Q6Ia~z5 -DN+H0"_]РD) -j*a-/t!U f漕̻F/MIRآ|%M4>xbk3<˪D(.Um5{Zbʋ_9N8[ㄇl{6O~S٪ ,214ךk׳]hInoѽ_]1h'&Jl-0bB\M`յAM1t "7^C9,RTC - P+̅?Z$zjy5c!o{ywD}}Z%J LqGYKb⬤+/-FTÆA -$TnkJ*e uR5fa q#1/$B#k)T9⌋;tc1r-&=MĆ~/62Z&|L[…pB*Tu$zpHBqoUfzБΊ 9dW S̓l`,4ՇLw *Cu61aUo-=r*QX8b~` 5O!DDdQn)]L@ JYdضũH3ݨZ߄SRz&ْ%7C8>i#݆[]2J[Vӄ[%L ʓjjʘ`v -'8l|'9O Oq].ۄ -8h>~rv؛ݙáa[Sɶ+VF2a3( o|Xf)+$4r"T,3-{vW};WF_<ƓW#Y[ƶ&J)T?0*/aFF#mO)r+(f^ -'r8i .QT~AE[$=xiwwLAQ;HaEeJʖg9qvZYYb.GvG1t[Ġ 8I$K͉⛸Z6GAYTnT[_'zֶ/R%>#EEK{ )ĴʹN{ :oTw"X:W;6VU ZHz0Z^j U -0ډ-sq i U,y+_nPpXQJ(ϪV[qW||քOYxjRE{€ba_ҿ; ` XG9S @i[FiЪޏ-Hs|Ԇ`Nx=hs^0 -d[CK0rn`Gi[`ϰڐG?Ԧ), ^ {~GjwIa,aVn2(|m#똏Jfr+4aUL%$FlG QiuhLh> .UA~Zue -C qi8|^Q,XMj PHnF4xtǬ!2y)aw$ħu- /K"V@jVD갩vɱU&{Qm4@ A,C.Q$XT%g| 󮤱dj= -DEma)l -ܖwbu[ 11L2?kꮸ^5)@4%g_8>^6RM4&HA}զ\9춥QeehLMʓ9tOL$s*oRAV~^ Jsd[hMZ3w`NyuELtd=j@ͮ0|TA}{Yj"Z/'Qb"\ݢ^2Q Α' 2=j/d-;/0pby1>3*y}RVNHVoyX RZ&o\fNcdwR&PT|}i\pw L" 7ET0?'؈Qw;%JWe-h#L#MHr}Ŗ]|F="Z;Û8ڕw/=ZpZȊGxY1O"=ՊB)mRoJC4#RJµzqJ]uD7daMWl"qtelL8nPpQ(MHG:qK(-$Dϒ'b4ٛfGt^R!Ҡ˻IvcT8OJ6CbRW?8E /u1`\ Q閵p_ #R[(g_6ySѓXYp5Hv4ᥗb>. 1K2bqcW$_+S3 $apǜivȀt@bXx6 #TPu-m2MK1 -S -uZc0 εL wX1 Sdd0Ռ<*xXIŵ$R+uX2w -^0}zV6vX+{aE-G^IZ[Eb]ݠBXGwSNq`@S-s,jTP@0 ; (`%nR!c(yDnzHV懐\&e3'&J+*t:.a^ ^ndojUH` ck&,秣T[O4XaMK? ?@Qr]E .7-cLFfdJg|>!o!$r/FX.B%F@wk 0>Paj*@aFQQ[Ď̽!e.TY#Ub3W<zYIzi;WpFd~cS:Cpy~b&4y*Iַؕ%Rj=%|L;{zHu.2L7 L3㷇R[cؔyI2ŀo4ԡ $!\wEδDM*R~|OŞ܇KR1!\522,&Fa, mv#7|>m0K%W[xDkT3' n0އxht([)f@j s?ۏnGW>|Gy?`;ňcJ.!\ -endstream -endobj - -5253 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4674 0 R - /F 4 - /StructParent 525 - /Contents ([98]) ->> -endobj - -5254 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 705.2274 224.77814 718.8894] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1244381.1244404) - >> - /F 4 - /StructParent 526 - /Contents (https://doi.org/10.1145/1244381.1244404) ->> -endobj - -5255 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 684.7654 91.28214 698.42737] - /Border [0 0 0] - /Dest 4675 0 R - /F 4 - /StructParent 527 - /Contents ([99]) ->> -endobj - -5256 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 96.78214 677.9654] - /Border [0 0 0] - /Dest 4676 0 R - /F 4 - /StructParent 528 - /Contents ([100]) ->> -endobj - -5257 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 643.84143 96.78214 657.5034] - /Border [0 0 0] - /Dest 4677 0 R - /F 4 - /StructParent 529 - /Contents ([101]) ->> -endobj - -5258 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [147.31615 616.5174 248.28514 630.1794] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/SCC.2007.74) - >> - /F 4 - /StructParent 530 - /Contents (https://doi.org/10.1109/SCC.2007.74) ->> -endobj - -5259 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 596.0554 96.78214 609.7174] - /Border [0 0 0] - /Dest 4677 0 R - /F 4 - /StructParent 531 - /Contents ([102]) ->> -endobj - -5260 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [391.93414 568.73145 523.03217 582.39343] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/ICSE.2004.1317483) - >> - /F 4 - /StructParent 532 - /Contents (https://doi.org/10.1109/ICSE.2004.1317483) ->> -endobj - -5261 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 548.2694 96.78214 561.9314] - /Border [0 0 0] - /Dest 4678 0 R - /F 4 - /StructParent 533 - /Contents ([103]) ->> -endobj - -5262 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 520.94543 279.16214 534.6074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/258948.258973) - >> - /F 4 - /StructParent 534 - /Contents (https://doi.org/10.1145/258948.258973) ->> -endobj - -5263 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 500.4834 96.78214 514.1454] - /Border [0 0 0] - /Dest 4679 0 R - /F 4 - /StructParent 535 - /Contents ([104]) ->> -endobj - -5264 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [406.43213 473.1594 508.02814 486.8214] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/11693024_20) - >> - /F 4 - /StructParent 536 - /Contents (https://doi.org/10.1007/11693024_20) ->> -endobj - -5265 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 452.6974 96.78214 466.3594] - /Border [0 0 0] - /Dest 4679 0 R - /F 4 - /StructParent 537 - /Contents ([105]) ->> -endobj - -5266 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [391.82645 439.0354 524.4094 452.6974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://infoscience.epfl.ch/record/176887) - >> - /F 4 - /StructParent 538 - /Contents (https://infoscience.epfl.ch/record/176887) ->> -endobj - -5267 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 425.3734 173.68314 439.0354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://infoscience.epfl.ch/record/176887) - >> - /F 4 - /StructParent 539 - /Contents (https://infoscience.epfl.ch/record/176887) ->> -endobj - -5268 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 404.9114 96.78214 418.5734] - /Border [0 0 0] - /Dest 4680 0 R - /F 4 - /StructParent 540 - /Contents ([106]) ->> -endobj - -5269 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 377.5874 224.77814 391.2494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2501654.2501666) - >> - /F 4 - /StructParent 541 - /Contents (https://doi.org/10.1145/2501654.2501666) ->> -endobj - -5270 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 542 - /Tabs /S - /Parent 1 0 R - /Contents 5271 0 R - /Annots [5253 0 R 5254 0 R 5255 0 R 5256 0 R 5257 0 R 5258 0 R 5259 0 R 5260 0 R 5261 0 R 5262 0 R 5263 0 R 5264 0 R 5265 0 R 5266 0 R 5267 0 R 5268 0 R 5269 0 R] ->> -endobj - -5271 0 obj -<< - /Length 3295 - /Filter /FlateDecode ->> -stream -x\ms ~b=r&>;ut%O3V~IH:SKri}g_lОn ><ݾ:6Of|=׻/ӛ~b_ߝ}w:9yqruj;j?+І6Y)ږFKCdsa+qyzqjsEƚ+pqa˃3JQy_L9^ڜ~:>]0F13~(fv0ޢy̸!ǟ(e(Z7c놻TB3]_N(o - 1x_AίOfD@vݰfHw{)2ib8 g龩nXVnx,ec" d_SY Hi%n3+U(tdRr4G$~G#s4EXtG[+~U==U -U5"JN91I$ɤm[Dvv[a LY.MBS9l.Gن׍da(> -7NL_ǖf lEl-HZv$8 kB‘:#4SLTW{ Y55V2VT>}mW>?:+9}`8Ϲq7ΈLHI&CDm;)] -U%^ݓN?X(XgE:DH>ʈ QQ댰k"J %㼝 .b|[JҊ9e7ߊ%b^t\#H)Yn/촡D6ECmY^%7΅V8[p'8I"LO<=EShH"2B~s+g^2}V%Dk,RhH"{AAC05X. JhҊbP,R`Dv\1qgIǟ&IAF45IbHK֑Nq1GUFA"}_X]`Z3rdJ%Ȅkdo QkC]>Au?F`[3ki'1<>(S-iCXۧl-,,Ր -j@YYVNٸ"\VN)ss(CNCCZZ9mߺơ,>GaS7BPk'`7vQҔ {N~KJDr?_rۧӷa.8*GYI!\X^lRtBggGj& -ĝ}m\LUo~ -bD-/0D Gpڒ0c6[gU=%N>K3v)ָFyO#냅-aݢ,gun#Q`; yVqpeT#Ft]kvHanp ޓ?!Qϴ6=hOTmq)M3īDsliG( rѕќύ<$Mņ,e;[{m')D'KK jB0( G3%x;&*e(+ümF BR,p$ŷnr2,suB"D)M8$9$ZuHUTJNh(^}|0 # auqA(guCYk=/yBSG)ߘWw岅17w2oڃ\P0W^Bg=<5:,7U՜{aq,ғ@-F芨HĈ=1/e;JjZ?K/k<1Ĵt*+1*d̿4Djםxu(YFH,QtBh3U bH7d!xo^}X (# @2<#%Ձ0['3 !DhmjRΙѻG 3S5oݨi{"!JSAۣaNH+}h FL+A҈QNyY4JUʋEGI>;ƒ@ -cx߹`6A*&7͇e¯nn G6&tרuhJX -endstream -endobj - -5272 0 obj -<< - /Length 1412 - /Type /XObject - /Subtype /Form - /Filter /FlateDecode - /BBox [0 0 146.25 31.019531] - /Matrix [1 0 0 1 0 0] - /Resources << - /ExtGState << - /a0 << - /CA 1 - /ca 1 - >> - >> - /XObject << - /x6 5273 0 R - >> - >> ->> -stream -xmV;%5 } -]`r.1 -dOҗ&I!I79I߿/~uӧ~k}7ۖN.uOtX.\"[3Eg 泛(KHERXErȸ$}'a$g DFZ,أȹ +O@g@l2$,$(V }hs,zhlIw;7"jny{0ڬGr$[a$ay98*]k,A.j[9$H8ܨ﵅S72Ҹ+`2a OSRg(o-8"[/Mgpb7NZmt:|*EG/@`ESԜ`Pa gy]7*;L5"I8`P6VE8db(=Χ'V8չjDx'YP]q_%!ڞ-n?ljaPi_Z0+q/67f-5 U'XZ"J*,b!!}XZ?3JGyhY:GO} pyRt{7&FrH)0.!E䓵ݑqLFձ7sF[ g@T_Y{wlkt-pCb/w $R|,&"uDӐT"f285kR.ɫNq_Vvj.hDi? b] LH;?jӑs_.vm '_3Lq*0Xs{cM|i -UT:bL;u>zw`&FyHLoim??eX -endstream -endobj - -5273 0 obj -<< - /Length 2113 - /BBox [0 0 147 32] - /Filter /FlateDecode - /Resources 5274 0 R - /Subtype /Form - /Type /XObject ->> -stream -xmXIr,u2~t| G8Kjyh%X|,{ȕ߼\\/_־GW)w_uu,?҈}}^|`tΘ}Y(^.Z3Pq2lN{[q.Pnwkqlz\D h?1V¹6iSqwN_{!L|︨ת:/"\E Q5CE胺^$hc?l fvq_NX @C?kӈ a(ӑ@TV8lۂ\}kTuP H8(Yl-Y5B.)- -Z,9aĬYʝ$;o}9ΐ,yٕ?sfn l%80vq:=qC"̡pjE5<%#i~HX&P8%&iBvb;Y:9/\7(f`M"Xd*u9k*Yd%Κ$H n(' TUiB 0SWfkӎ`Q;kY8ܱ(wq5<`k伈 ָ91kkxi73B7|$qίKF/W22vZ0[_n!ᅧ79SYfҭglNgCf]n;rKԻX_<$Bd3PGYKf6z4](se6\b]^ j;'}F._k){?Nb{Q\>&{PS[-"C:^k6׵J{T y Md!4ڵ8r|> -; 7X}Pif[pRPy0" lF$hҵv> - >> ->> -endobj - -5275 0 obj -<< - /Title (A Programming Paradigm for Spatiotemporal Composability) - /Author (Yifan Shi, Wei Zhang, Tianyi Cui) - /Creator (Typst 0.14.2) - /ModDate (D:20260731154505+08'00) - /CreationDate (D:20260731154505+08'00) ->> -endobj - -5276 0 obj -<< - /Length 1223 - /Type /Metadata - /Subtype /XML ->> -stream -A Programming Paradigm for Spatiotemporal ComposabilityYifan Shi, Wei Zhang, Tianyi CuiTypst 0.14.2en2026-07-31T15:45:05+08:002026-07-31T15:45:05+08:0048application/pdf8/8Hb0n3/ti5Ewx/bKL9Ww==HHwsV4w2OKoHWq5hDV/GeA==proof1.7 -endstream -endobj - -5277 0 obj -<< - /Type /Catalog - /Pages 1 0 R - /Metadata 5276 0 R - /PageLabels 53 0 R - /Lang (en) - /StructTreeRoot 54 0 R - /MarkInfo << - /Marked true - /Suspects false - >> - /ViewerPreferences << - /Direction /L2R - >> - /Outlines 2 0 R - /Names << - /Dests << - /Names [(sec:conclusion) 4454 0 R (sec:discussion) 4448 0 R (sec:introduction) 4412 0 R (sec:preliminary) 4416 0 R (sec:related) 4453 0 R (sec:system) 4442 0 R (sec:theory) 4432 0 R (subsec:capabilities) 4444 0 R (subsec:coeffects) 4414 0 R (subsec:component-lifecycle) 4428 0 R (subsec:composability) 4406 0 R (subsec:context-paradigm) 4431 0 R (subsec:contributions) 4411 0 R (subsec:core-impl) 4437 0 R (subsec:effects) 4413 0 R (subsec:granularity) 4446 0 R (subsec:koishi) 4441 0 R (subsec:language) 4445 0 R (subsec:loader-hmr) 4440 0 R (subsec:motivation) 4410 0 R (subsec:reactive-coeffects) 4423 0 R (subsec:revertible-effects) 4419 0 R (subsec:rw-effects) 4449 0 R (subsec:rw-paradigms) 4450 0 R (subsec:rw-spatial) 4452 0 R (subsec:rw-temporal) 4451 0 R (subsec:scaling) 4443 0 R (subsec:versioning) 4447 0 R (subsubsec:coeff-context) 4420 0 R (subsubsec:coeff-isolate-intercept) 4422 0 R (subsubsec:coeff-reactive) 4421 0 R (subsubsec:coeffect-api) 4434 0 R (subsubsec:component-api) 4435 0 R (subsubsec:config-layer) 4438 0 R (subsubsec:context-access) 4436 0 R (subsubsec:context-situating) 4430 0 R (subsubsec:eff-composition) 4418 0 R (subsubsec:eff-formalization) 4417 0 R (subsubsec:eff-idempotent) 4424 0 R (subsubsec:effect-api) 4433 0 R (subsubsec:hmr) 4439 0 R (subsubsec:lifecycle-asynchrony) 4427 0 R (subsubsec:lifecycle-coherence) 4426 0 R (subsubsec:lifecycle-iteration) 4425 0 R (subsubsec:motivation-harnesses) 4408 0 R (subsubsec:motivation-plugins) 4407 0 R (subsubsec:motivation-workaround) 4409 0 R (subsubsec:unified-context) 4429 0 R] - >> - >> ->> -endobj - -xref -0 5278 -0000000000 65535 f -0000000016 00000 n -0000000507 00000 n -0000000588 00000 n -0000000726 00000 n -0000000839 00000 n -0000000999 00000 n -0000001101 00000 n -0000001232 00000 n -0000001349 00000 n -0000001448 00000 n -0000001604 00000 n -0000001700 00000 n -0000001813 00000 n -0000001939 00000 n -0000002124 00000 n -0000002274 00000 n -0000002379 00000 n -0000002497 00000 n -0000002662 00000 n -0000002769 00000 n -0000002905 00000 n -0000003022 00000 n -0000003188 00000 n -0000003298 00000 n -0000003413 00000 n -0000003528 00000 n -0000003629 00000 n -0000003781 00000 n -0000003887 00000 n -0000004008 00000 n -0000004181 00000 n -0000004325 00000 n -0000004431 00000 n -0000004556 00000 n -0000004681 00000 n -0000004786 00000 n -0000004949 00000 n -0000005071 00000 n -0000005184 00000 n -0000005291 00000 n -0000005445 00000 n -0000005554 00000 n -0000005687 00000 n -0000005826 00000 n -0000005975 00000 n -0000006096 00000 n -0000006252 00000 n -0000006368 00000 n -0000006493 00000 n -0000006619 00000 n -0000006729 00000 n -0000006840 00000 n -0000006933 00000 n -0000007532 00000 n -0000014516 00000 n -0000014895 00000 n -0000015760 00000 n -0000016283 00000 n -0000017013 00000 n -0000017878 00000 n -0000018842 00000 n -0000020661 00000 n -0000022246 00000 n -0000023804 00000 n -0000026919 00000 n -0000029386 00000 n -0000031583 00000 n -0000034005 00000 n -0000035860 00000 n -0000039569 00000 n -0000042567 00000 n -0000045664 00000 n -0000047951 00000 n -0000049707 00000 n -0000050941 00000 n -0000051905 00000 n -0000052914 00000 n -0000054697 00000 n -0000057011 00000 n -0000058857 00000 n -0000060550 00000 n -0000061991 00000 n -0000062973 00000 n -0000064522 00000 n -0000065900 00000 n -0000066648 00000 n -0000067333 00000 n -0000068036 00000 n -0000069120 00000 n -0000069715 00000 n -0000070670 00000 n -0000071433 00000 n -0000072180 00000 n -0000073255 00000 n -0000074402 00000 n -0000075061 00000 n -0000075968 00000 n -0000076875 00000 n -0000077694 00000 n -0000078577 00000 n -0000079485 00000 n -0000080409 00000 n -0000080909 00000 n -0000083583 00000 n -0000084559 00000 n -0000084648 00000 n -0000084732 00000 n -0000084854 00000 n -0000085006 00000 n -0000085097 00000 n -0000085179 00000 n -0000085331 00000 n -0000085420 00000 n -0000085504 00000 n -0000085612 00000 n -0000085826 00000 n -0000085908 00000 n -0000086060 00000 n -0000086149 00000 n -0000086233 00000 n -0000086358 00000 n -0000086510 00000 n -0000086601 00000 n -0000086683 00000 n -0000086835 00000 n -0000086924 00000 n -0000087008 00000 n -0000087130 00000 n -0000087282 00000 n -0000087376 00000 n -0000087458 00000 n -0000087610 00000 n -0000087699 00000 n -0000087783 00000 n -0000087905 00000 n -0000088057 00000 n -0000088151 00000 n -0000088233 00000 n -0000088385 00000 n -0000088474 00000 n -0000088558 00000 n -0000088686 00000 n -0000088838 00000 n -0000088929 00000 n -0000089011 00000 n -0000089163 00000 n -0000089252 00000 n -0000089336 00000 n -0000089444 00000 n -0000089535 00000 n -0000089617 00000 n -0000089769 00000 n -0000089858 00000 n -0000089942 00000 n -0000090039 00000 n -0000090121 00000 n -0000090272 00000 n -0000090361 00000 n -0000090445 00000 n -0000090563 00000 n -0000090714 00000 n -0000090808 00000 n -0000090890 00000 n -0000091041 00000 n -0000091130 00000 n -0000091214 00000 n -0000091336 00000 n -0000091489 00000 n -0000091589 00000 n -0000091671 00000 n -0000091824 00000 n -0000091913 00000 n -0000091997 00000 n -0000092118 00000 n -0000092271 00000 n -0000092370 00000 n -0000092452 00000 n -0000092604 00000 n -0000092693 00000 n -0000092777 00000 n -0000092899 00000 n -0000093051 00000 n -0000093145 00000 n -0000093227 00000 n -0000093379 00000 n -0000093468 00000 n -0000093552 00000 n -0000093677 00000 n -0000093829 00000 n -0000093923 00000 n -0000094005 00000 n -0000094157 00000 n -0000094246 00000 n -0000094330 00000 n -0000094452 00000 n -0000094604 00000 n -0000094701 00000 n -0000094783 00000 n -0000094935 00000 n -0000095024 00000 n -0000095108 00000 n -0000095227 00000 n -0000095379 00000 n -0000095470 00000 n -0000095552 00000 n -0000095704 00000 n -0000095793 00000 n -0000095877 00000 n -0000095974 00000 n -0000096056 00000 n -0000096208 00000 n -0000096297 00000 n -0000096381 00000 n -0000096481 00000 n -0000096563 00000 n -0000096715 00000 n -0000096804 00000 n -0000096888 00000 n -0000096996 00000 n -0000097090 00000 n -0000097172 00000 n -0000097324 00000 n -0000097413 00000 n -0000097497 00000 n -0000097619 00000 n -0000097771 00000 n -0000097865 00000 n -0000097947 00000 n -0000098099 00000 n -0000098188 00000 n -0000098272 00000 n -0000098397 00000 n -0000098549 00000 n -0000098640 00000 n -0000098722 00000 n -0000098874 00000 n -0000098963 00000 n -0000099047 00000 n -0000099172 00000 n -0000099324 00000 n -0000099418 00000 n -0000099500 00000 n -0000099652 00000 n -0000099741 00000 n -0000099825 00000 n -0000099947 00000 n -0000100099 00000 n -0000100193 00000 n -0000100275 00000 n -0000100427 00000 n -0000100516 00000 n -0000100600 00000 n -0000100722 00000 n -0000100874 00000 n -0000100968 00000 n -0000101050 00000 n -0000101202 00000 n -0000101291 00000 n -0000101375 00000 n -0000101497 00000 n -0000101649 00000 n -0000101742 00000 n -0000101824 00000 n -0000101975 00000 n -0000102064 00000 n -0000102148 00000 n -0000102422 00000 n -0000102573 00000 n -0000102717 00000 n -0000102799 00000 n -0000102952 00000 n -0000103041 00000 n -0000103125 00000 n -0000103262 00000 n -0000103415 00000 n -0000103511 00000 n -0000103602 00000 n -0000103684 00000 n -0000103836 00000 n -0000103925 00000 n -0000104009 00000 n -0000104134 00000 n -0000104286 00000 n -0000104377 00000 n -0000104459 00000 n -0000104611 00000 n -0000104700 00000 n -0000104784 00000 n -0000104906 00000 n -0000105058 00000 n -0000105152 00000 n -0000105234 00000 n -0000105386 00000 n -0000105475 00000 n -0000105559 00000 n -0000105678 00000 n -0000105830 00000 n -0000105924 00000 n -0000106006 00000 n -0000106158 00000 n -0000106247 00000 n -0000106331 00000 n -0000106456 00000 n -0000106608 00000 n -0000106699 00000 n -0000106781 00000 n -0000106933 00000 n -0000107022 00000 n -0000107106 00000 n -0000107231 00000 n -0000107445 00000 n -0000107536 00000 n -0000107618 00000 n -0000107770 00000 n -0000107859 00000 n -0000107943 00000 n -0000108065 00000 n -0000108217 00000 n -0000108308 00000 n -0000108390 00000 n -0000108542 00000 n -0000108631 00000 n -0000108715 00000 n -0000108837 00000 n -0000108989 00000 n -0000109080 00000 n -0000109162 00000 n -0000109314 00000 n -0000109403 00000 n -0000109487 00000 n -0000109609 00000 n -0000109761 00000 n -0000109855 00000 n -0000109937 00000 n -0000110089 00000 n -0000110178 00000 n -0000110262 00000 n -0000110373 00000 n -0000110525 00000 n -0000110607 00000 n -0000110759 00000 n -0000110848 00000 n -0000110932 00000 n -0000111054 00000 n -0000111206 00000 n -0000111300 00000 n -0000111382 00000 n -0000111534 00000 n -0000111623 00000 n -0000111707 00000 n -0000111832 00000 n -0000111984 00000 n -0000112075 00000 n -0000112157 00000 n -0000112309 00000 n -0000112398 00000 n -0000112482 00000 n -0000112603 00000 n -0000112755 00000 n -0000112845 00000 n -0000112927 00000 n -0000113078 00000 n -0000113167 00000 n -0000113251 00000 n -0000113369 00000 n -0000113520 00000 n -0000113610 00000 n -0000113692 00000 n -0000113843 00000 n -0000113932 00000 n -0000114016 00000 n -0000114142 00000 n -0000114295 00000 n -0000114391 00000 n -0000114473 00000 n -0000114626 00000 n -0000114715 00000 n -0000114799 00000 n -0000114924 00000 n -0000115076 00000 n -0000115167 00000 n -0000115249 00000 n -0000115401 00000 n -0000115490 00000 n -0000115574 00000 n -0000115699 00000 n -0000115851 00000 n -0000115945 00000 n -0000116027 00000 n -0000116179 00000 n -0000116268 00000 n -0000116352 00000 n -0000116477 00000 n -0000116629 00000 n -0000116720 00000 n -0000116802 00000 n -0000116954 00000 n -0000117043 00000 n -0000117127 00000 n -0000117246 00000 n -0000117398 00000 n -0000117492 00000 n -0000117574 00000 n -0000117726 00000 n -0000117815 00000 n -0000117899 00000 n -0000118021 00000 n -0000118235 00000 n -0000118326 00000 n -0000118408 00000 n -0000118560 00000 n -0000118649 00000 n -0000118733 00000 n -0000118855 00000 n -0000119007 00000 n -0000119107 00000 n -0000119189 00000 n -0000119341 00000 n -0000119430 00000 n -0000119514 00000 n -0000119636 00000 n -0000119788 00000 n -0000119882 00000 n -0000119964 00000 n -0000120116 00000 n -0000120205 00000 n -0000120289 00000 n -0000120394 00000 n -0000120608 00000 n -0000120690 00000 n -0000120842 00000 n -0000120931 00000 n -0000121015 00000 n -0000121140 00000 n -0000121292 00000 n -0000121383 00000 n -0000121465 00000 n -0000121617 00000 n -0000121706 00000 n -0000121790 00000 n -0000121895 00000 n -0000122109 00000 n -0000122191 00000 n -0000122343 00000 n -0000122432 00000 n -0000122516 00000 n -0000122635 00000 n -0000122787 00000 n -0000122881 00000 n -0000122963 00000 n -0000123115 00000 n -0000123204 00000 n -0000123288 00000 n -0000123396 00000 n -0000123490 00000 n -0000123572 00000 n -0000123724 00000 n -0000123813 00000 n -0000123897 00000 n -0000124015 00000 n -0000124167 00000 n -0000124260 00000 n -0000124342 00000 n -0000124493 00000 n -0000124582 00000 n -0000124666 00000 n -0000124782 00000 n -0000124933 00000 n -0000125025 00000 n -0000125107 00000 n -0000125258 00000 n -0000125347 00000 n -0000125431 00000 n -0000125542 00000 n -0000125636 00000 n -0000125718 00000 n -0000125870 00000 n -0000125959 00000 n -0000126043 00000 n -0000126168 00000 n -0000126320 00000 n -0000126411 00000 n -0000126493 00000 n -0000126645 00000 n -0000126734 00000 n -0000126818 00000 n -0000126932 00000 n -0000127023 00000 n -0000127105 00000 n -0000127257 00000 n -0000127346 00000 n -0000127430 00000 n -0000127538 00000 n -0000127632 00000 n -0000127714 00000 n -0000127866 00000 n -0000127955 00000 n -0000128039 00000 n -0000128150 00000 n -0000128241 00000 n -0000128323 00000 n -0000128475 00000 n -0000128564 00000 n -0000128648 00000 n -0000128770 00000 n -0000128922 00000 n -0000129016 00000 n -0000129098 00000 n -0000129250 00000 n -0000129339 00000 n -0000129423 00000 n -0000129545 00000 n -0000129697 00000 n -0000129791 00000 n -0000129873 00000 n -0000130025 00000 n -0000130114 00000 n -0000130198 00000 n -0000130326 00000 n -0000130478 00000 n -0000130569 00000 n -0000130651 00000 n -0000130803 00000 n -0000130892 00000 n -0000130976 00000 n -0000131084 00000 n -0000131175 00000 n -0000131257 00000 n -0000131409 00000 n -0000131498 00000 n -0000131582 00000 n -0000131687 00000 n -0000131839 00000 n -0000131921 00000 n -0000132073 00000 n -0000132162 00000 n -0000132246 00000 n -0000132351 00000 n -0000132565 00000 n -0000132647 00000 n -0000132799 00000 n -0000132888 00000 n -0000132972 00000 n -0000133083 00000 n -0000133180 00000 n -0000133262 00000 n -0000133414 00000 n -0000133503 00000 n -0000133587 00000 n -0000133712 00000 n -0000133864 00000 n -0000133958 00000 n -0000134040 00000 n -0000134192 00000 n -0000134281 00000 n -0000134365 00000 n -0000134476 00000 n -0000134628 00000 n -0000134710 00000 n -0000134862 00000 n -0000134951 00000 n -0000135035 00000 n -0000135142 00000 n -0000135238 00000 n -0000135320 00000 n -0000135471 00000 n -0000135560 00000 n -0000135644 00000 n -0000135760 00000 n -0000135911 00000 n -0000136003 00000 n -0000136085 00000 n -0000136236 00000 n -0000136325 00000 n -0000136409 00000 n -0000136531 00000 n -0000136684 00000 n -0000136780 00000 n -0000136862 00000 n -0000137015 00000 n -0000137104 00000 n -0000137188 00000 n -0000137313 00000 n -0000137466 00000 n -0000137557 00000 n -0000137639 00000 n -0000137791 00000 n -0000137880 00000 n -0000137964 00000 n -0000138086 00000 n -0000138238 00000 n -0000138332 00000 n -0000138414 00000 n -0000138566 00000 n -0000138655 00000 n -0000138739 00000 n -0000138861 00000 n -0000139013 00000 n -0000139104 00000 n -0000139186 00000 n -0000139338 00000 n -0000139427 00000 n -0000139511 00000 n -0000139633 00000 n -0000139785 00000 n -0000139879 00000 n -0000139961 00000 n -0000140113 00000 n -0000140202 00000 n -0000140286 00000 n -0000140405 00000 n -0000140557 00000 n -0000140654 00000 n -0000140736 00000 n -0000140888 00000 n -0000140977 00000 n -0000141061 00000 n -0000141186 00000 n -0000141338 00000 n -0000141432 00000 n -0000141514 00000 n -0000141666 00000 n -0000141755 00000 n -0000141839 00000 n -0000141969 00000 n -0000142121 00000 n -0000142215 00000 n -0000142306 00000 n -0000142388 00000 n -0000142540 00000 n -0000142629 00000 n -0000142713 00000 n -0000142832 00000 n -0000142984 00000 n -0000143078 00000 n -0000143160 00000 n -0000143312 00000 n -0000143401 00000 n -0000143485 00000 n -0000143607 00000 n -0000143759 00000 n -0000143853 00000 n -0000143935 00000 n -0000144087 00000 n -0000144176 00000 n -0000144260 00000 n -0000144379 00000 n -0000144593 00000 n -0000144690 00000 n -0000144772 00000 n -0000144924 00000 n -0000145013 00000 n -0000145097 00000 n -0000145216 00000 n -0000145430 00000 n -0000145521 00000 n -0000145603 00000 n -0000145755 00000 n -0000145844 00000 n -0000145928 00000 n -0000146050 00000 n -0000146202 00000 n -0000146296 00000 n -0000146378 00000 n -0000146529 00000 n -0000146618 00000 n -0000146702 00000 n -0000146822 00000 n -0000146973 00000 n -0000147065 00000 n -0000147147 00000 n -0000147298 00000 n -0000147387 00000 n -0000147471 00000 n -0000147585 00000 n -0000147677 00000 n -0000147759 00000 n -0000147912 00000 n -0000148001 00000 n -0000148085 00000 n -0000148214 00000 n -0000148367 00000 n -0000148462 00000 n -0000148544 00000 n -0000148696 00000 n -0000148785 00000 n -0000148869 00000 n -0000148977 00000 n -0000149068 00000 n -0000149150 00000 n -0000149302 00000 n -0000149391 00000 n -0000149475 00000 n -0000149597 00000 n -0000149749 00000 n -0000149840 00000 n -0000149922 00000 n -0000150074 00000 n -0000150163 00000 n -0000150247 00000 n -0000150375 00000 n -0000150527 00000 n -0000150621 00000 n -0000150703 00000 n -0000150855 00000 n -0000150944 00000 n -0000151028 00000 n -0000151153 00000 n -0000151305 00000 n -0000151399 00000 n -0000151481 00000 n -0000151633 00000 n -0000151722 00000 n -0000151806 00000 n -0000151917 00000 n -0000152011 00000 n -0000152093 00000 n -0000152245 00000 n -0000152334 00000 n -0000152418 00000 n -0000152540 00000 n -0000152692 00000 n -0000152783 00000 n -0000152865 00000 n -0000153017 00000 n -0000153106 00000 n -0000153190 00000 n -0000153290 00000 n -0000153372 00000 n -0000153524 00000 n -0000153613 00000 n -0000153697 00000 n -0000153811 00000 n -0000153902 00000 n -0000153984 00000 n -0000154136 00000 n -0000154225 00000 n -0000154309 00000 n -0000154442 00000 n -0000154594 00000 n -0000154688 00000 n -0000154779 00000 n -0000154861 00000 n -0000155013 00000 n -0000155102 00000 n -0000155186 00000 n -0000155297 00000 n -0000155388 00000 n -0000155470 00000 n -0000155622 00000 n -0000155711 00000 n -0000155795 00000 n -0000155928 00000 n -0000156080 00000 n -0000156171 00000 n -0000156262 00000 n -0000156344 00000 n -0000156496 00000 n -0000156585 00000 n -0000156669 00000 n -0000156799 00000 n -0000156951 00000 n -0000157048 00000 n -0000157139 00000 n -0000157221 00000 n -0000157373 00000 n -0000157462 00000 n -0000157546 00000 n -0000157654 00000 n -0000157867 00000 n -0000157949 00000 n -0000158100 00000 n -0000158189 00000 n -0000158273 00000 n -0000158381 00000 n -0000158532 00000 n -0000158614 00000 n -0000158765 00000 n -0000158854 00000 n -0000158938 00000 n -0000159049 00000 n -0000159140 00000 n -0000159222 00000 n -0000159374 00000 n -0000159463 00000 n -0000159547 00000 n -0000159672 00000 n -0000159824 00000 n -0000159918 00000 n -0000160000 00000 n -0000160152 00000 n -0000160241 00000 n -0000160325 00000 n -0000160433 00000 n -0000160524 00000 n -0000160606 00000 n -0000160758 00000 n -0000160847 00000 n -0000160931 00000 n -0000161056 00000 n -0000161208 00000 n -0000161299 00000 n -0000161381 00000 n -0000161533 00000 n -0000161622 00000 n -0000161706 00000 n -0000161828 00000 n -0000161980 00000 n -0000162071 00000 n -0000162153 00000 n -0000162305 00000 n -0000162394 00000 n -0000162478 00000 n -0000162597 00000 n -0000162749 00000 n -0000162846 00000 n -0000162928 00000 n -0000163080 00000 n -0000163189 00000 n -0000163311 00000 n -0000163463 00000 n -0000163628 00000 n -0000163722 00000 n -0000163813 00000 n -0000163904 00000 n -0000163994 00000 n -0000164104 00000 n -0000164531 00000 n -0000164621 00000 n -0000164713 00000 n -0000164866 00000 n -0000164958 00000 n -0000165111 00000 n -0000165264 00000 n -0000165417 00000 n -0000165513 00000 n -0000165787 00000 n -0000165940 00000 n -0000166034 00000 n -0000166187 00000 n -0000166339 00000 n -0000166432 00000 n -0000166525 00000 n -0000166677 00000 n -0000166829 00000 n -0000166981 00000 n -0000167076 00000 n -0000167271 00000 n -0000167423 00000 n -0000167516 00000 n -0000167609 00000 n -0000167761 00000 n -0000167913 00000 n -0000168008 00000 n -0000168107 00000 n -0000168230 00000 n -0000168492 00000 n -0000168644 00000 n -0000168796 00000 n -0000168948 00000 n -0000169100 00000 n -0000169252 00000 n -0000169404 00000 n -0000169556 00000 n -0000169707 00000 n -0000169858 00000 n -0000169952 00000 n -0000170272 00000 n -0000170425 00000 n -0000170519 00000 n -0000170672 00000 n -0000170825 00000 n -0000170978 00000 n -0000171130 00000 n -0000171223 00000 n -0000171375 00000 n -0000171527 00000 n -0000171622 00000 n -0000172020 00000 n -0000172172 00000 n -0000172265 00000 n -0000172358 00000 n -0000172510 00000 n -0000172662 00000 n -0000172755 00000 n -0000172907 00000 n -0000173059 00000 n -0000173211 00000 n -0000173363 00000 n -0000173515 00000 n -0000173667 00000 n -0000173819 00000 n -0000173910 00000 n -0000174062 00000 n -0000174152 00000 n -0000174246 00000 n -0000174495 00000 n -0000174619 00000 n -0000174887 00000 n -0000175039 00000 n -0000175191 00000 n -0000175282 00000 n -0000175376 00000 n -0000175467 00000 n -0000175558 00000 n -0000175649 00000 n -0000175740 00000 n -0000175892 00000 n -0000176044 00000 n -0000176139 00000 n -0000176365 00000 n -0000176517 00000 n -0000176616 00000 n -0000176768 00000 n -0000176859 00000 n -0000177011 00000 n -0000177163 00000 n -0000177257 00000 n -0000177358 00000 n -0000177509 00000 n -0000177630 00000 n -0000177923 00000 n -0000178075 00000 n -0000178227 00000 n -0000178379 00000 n -0000178473 00000 n -0000178625 00000 n -0000178720 00000 n -0000178898 00000 n -0000179050 00000 n -0000179141 00000 n -0000179232 00000 n -0000179384 00000 n -0000179479 00000 n -0000179711 00000 n -0000179802 00000 n -0000179893 00000 n -0000180045 00000 n -0000180197 00000 n -0000180349 00000 n -0000180440 00000 n -0000180592 00000 n -0000180687 00000 n -0000180791 00000 n -0000180942 00000 n -0000181069 00000 n -0000181160 00000 n -0000181272 00000 n -0000181371 00000 n -0000181586 00000 n -0000181739 00000 n -0000181892 00000 n -0000182045 00000 n -0000182197 00000 n -0000182308 00000 n -0000182403 00000 n -0000182562 00000 n -0000182653 00000 n -0000182805 00000 n -0000182900 00000 n -0000183043 00000 n -0000183139 00000 n -0000183241 00000 n -0000183337 00000 n -0000183432 00000 n -0000183578 00000 n -0000183730 00000 n -0000183821 00000 n -0000183912 00000 n -0000184003 00000 n -0000184127 00000 n -0000184223 00000 n -0000184318 00000 n -0000184479 00000 n -0000184631 00000 n -0000184742 00000 n -0000184837 00000 n -0000184932 00000 n -0000185026 00000 n -0000185256 00000 n -0000185355 00000 n -0000185451 00000 n -0000185547 00000 n -0000185681 00000 n -0000185792 00000 n -0000185934 00000 n -0000186030 00000 n -0000186126 00000 n -0000186249 00000 n -0000186414 00000 n -0000186510 00000 n -0000186606 00000 n -0000186702 00000 n -0000186798 00000 n -0000186894 00000 n -0000186990 00000 n -0000187135 00000 n -0000187622 00000 n -0000187773 00000 n -0000187926 00000 n -0000188128 00000 n -0000188283 00000 n -0000188438 00000 n -0000188592 00000 n -0000188687 00000 n -0000188841 00000 n -0000188936 00000 n -0000189150 00000 n -0000189304 00000 n -0000189458 00000 n -0000189553 00000 n -0000189648 00000 n -0000189802 00000 n -0000189956 00000 n -0000190110 00000 n -0000190261 00000 n -0000190354 00000 n -0000190447 00000 n -0000190601 00000 n -0000190698 00000 n -0000190906 00000 n -0000191060 00000 n -0000191155 00000 n -0000191250 00000 n -0000191345 00000 n -0000191440 00000 n -0000191577 00000 n -0000191673 00000 n -0000191758 00000 n -0000191903 00000 n -0000192076 00000 n -0000192161 00000 n -0000192306 00000 n -0000192478 00000 n -0000192599 00000 n -0000192692 00000 n -0000192789 00000 n -0000192886 00000 n -0000193022 00000 n -0000193396 00000 n -0000193549 00000 n -0000193703 00000 n -0000193857 00000 n -0000193954 00000 n -0000194087 00000 n -0000194241 00000 n -0000194419 00000 n -0000194514 00000 n -0000194668 00000 n -0000194822 00000 n -0000194976 00000 n -0000195073 00000 n -0000195176 00000 n -0000195308 00000 n -0000195442 00000 n -0000195596 00000 n -0000195692 00000 n -0000196146 00000 n -0000196240 00000 n -0000196394 00000 n -0000196548 00000 n -0000196645 00000 n -0000196760 00000 n -0000196857 00000 n -0000196951 00000 n -0000197180 00000 n -0000197273 00000 n -0000197366 00000 n -0000197459 00000 n -0000197554 00000 n -0000197647 00000 n -0000197742 00000 n -0000197835 00000 n -0000197989 00000 n -0000198112 00000 n -0000198215 00000 n -0000198328 00000 n -0000198445 00000 n -0000198541 00000 n -0000199035 00000 n -0000199188 00000 n -0000199342 00000 n -0000199439 00000 n -0000199605 00000 n -0000199759 00000 n -0000199913 00000 n -0000200067 00000 n -0000200164 00000 n -0000200315 00000 n -0000200469 00000 n -0000200623 00000 n -0000200720 00000 n -0000200865 00000 n -0000201008 00000 n -0000201101 00000 n -0000201194 00000 n -0000201279 00000 n -0000201424 00000 n -0000201596 00000 n -0000201681 00000 n -0000201826 00000 n -0000201998 00000 n -0000202120 00000 n -0000202205 00000 n -0000202350 00000 n -0000202522 00000 n -0000202607 00000 n -0000202752 00000 n -0000202924 00000 n -0000203045 00000 n -0000203157 00000 n -0000203252 00000 n -0000203397 00000 n -0000203959 00000 n -0000204036 00000 n -0000204130 00000 n -0000204277 00000 n -0000204426 00000 n -0000204503 00000 n -0000204580 00000 n -0000204665 00000 n -0000204812 00000 n -0000204915 00000 n -0000205062 00000 n -0000205212 00000 n -0000205358 00000 n -0000205435 00000 n -0000205512 00000 n -0000205589 00000 n -0000205674 00000 n -0000205820 00000 n -0000205905 00000 n -0000206051 00000 n -0000206128 00000 n -0000206205 00000 n -0000206282 00000 n -0000206359 00000 n -0000206444 00000 n -0000206590 00000 n -0000206702 00000 n -0000206850 00000 n -0000206998 00000 n -0000207146 00000 n -0000207294 00000 n -0000207371 00000 n -0000207448 00000 n -0000207533 00000 n -0000207679 00000 n -0000207764 00000 n -0000207912 00000 n -0000207989 00000 n -0000208066 00000 n -0000208143 00000 n -0000208228 00000 n -0000208376 00000 n -0000208470 00000 n -0000208618 00000 n -0000208768 00000 n -0000208845 00000 n -0000208930 00000 n -0000209078 00000 n -0000209181 00000 n -0000209329 00000 n -0000209480 00000 n -0000209628 00000 n -0000209705 00000 n -0000209782 00000 n -0000209859 00000 n -0000209944 00000 n -0000210092 00000 n -0000210177 00000 n -0000210325 00000 n -0000210402 00000 n -0000210479 00000 n -0000210556 00000 n -0000210633 00000 n -0000210718 00000 n -0000210866 00000 n -0000210978 00000 n -0000211130 00000 n -0000211280 00000 n -0000211430 00000 n -0000211580 00000 n -0000211657 00000 n -0000211734 00000 n -0000211811 00000 n -0000211896 00000 n -0000212044 00000 n -0000212129 00000 n -0000212279 00000 n -0000212356 00000 n -0000212441 00000 n -0000212589 00000 n -0000212692 00000 n -0000212840 00000 n -0000212991 00000 n -0000213139 00000 n -0000213216 00000 n -0000213293 00000 n -0000213378 00000 n -0000213526 00000 n -0000213620 00000 n -0000213768 00000 n -0000213918 00000 n -0000214003 00000 n -0000214151 00000 n -0000214228 00000 n -0000214330 00000 n -0000214428 00000 n -0000214572 00000 n -0000214668 00000 n -0000214792 00000 n -0000214877 00000 n -0000215022 00000 n -0000215195 00000 n -0000215280 00000 n -0000215425 00000 n -0000215598 00000 n -0000215696 00000 n -0000215814 00000 n -0000215910 00000 n -0000216006 00000 n -0000216151 00000 n -0000216785 00000 n -0000216862 00000 n -0000216956 00000 n -0000217104 00000 n -0000217254 00000 n -0000217331 00000 n -0000217416 00000 n -0000217564 00000 n -0000217685 00000 n -0000217833 00000 n -0000217984 00000 n -0000218132 00000 n -0000218283 00000 n -0000218430 00000 n -0000218507 00000 n -0000218584 00000 n -0000218661 00000 n -0000218746 00000 n -0000218893 00000 n -0000219014 00000 n -0000219161 00000 n -0000219311 00000 n -0000219458 00000 n -0000219608 00000 n -0000219755 00000 n -0000219832 00000 n -0000219909 00000 n -0000219986 00000 n -0000220063 00000 n -0000220148 00000 n -0000220295 00000 n -0000220452 00000 n -0000220599 00000 n -0000220748 00000 n -0000220898 00000 n -0000221045 00000 n -0000221195 00000 n -0000221342 00000 n -0000221492 00000 n -0000221639 00000 n -0000221788 00000 n -0000221865 00000 n -0000221942 00000 n -0000222027 00000 n -0000222174 00000 n -0000222277 00000 n -0000222424 00000 n -0000222574 00000 n -0000222721 00000 n -0000222798 00000 n -0000222875 00000 n -0000222952 00000 n -0000223037 00000 n -0000223184 00000 n -0000223296 00000 n -0000223446 00000 n -0000223595 00000 n -0000223744 00000 n -0000223893 00000 n -0000223970 00000 n -0000224055 00000 n -0000224202 00000 n -0000224314 00000 n -0000224464 00000 n -0000224611 00000 n -0000224761 00000 n -0000224908 00000 n -0000224985 00000 n -0000225062 00000 n -0000225147 00000 n -0000225294 00000 n -0000225388 00000 n -0000225535 00000 n -0000225684 00000 n -0000225769 00000 n -0000225916 00000 n -0000226010 00000 n -0000226157 00000 n -0000226306 00000 n -0000226383 00000 n -0000226468 00000 n -0000226615 00000 n -0000226700 00000 n -0000226847 00000 n -0000226924 00000 n -0000227009 00000 n -0000227156 00000 n -0000227268 00000 n -0000227421 00000 n -0000227570 00000 n -0000227719 00000 n -0000227868 00000 n -0000227945 00000 n -0000228022 00000 n -0000228107 00000 n -0000228254 00000 n -0000228375 00000 n -0000228522 00000 n -0000228672 00000 n -0000228819 00000 n -0000228969 00000 n -0000229116 00000 n -0000229193 00000 n -0000229270 00000 n -0000229355 00000 n -0000229502 00000 n -0000229659 00000 n -0000229809 00000 n -0000229958 00000 n -0000230107 00000 n -0000230257 00000 n -0000230407 00000 n -0000230556 00000 n -0000230706 00000 n -0000230853 00000 n -0000231002 00000 n -0000231079 00000 n -0000231156 00000 n -0000231233 00000 n -0000231318 00000 n -0000231465 00000 n -0000231559 00000 n -0000231706 00000 n -0000231855 00000 n -0000231932 00000 n -0000232017 00000 n -0000232164 00000 n -0000232276 00000 n -0000232426 00000 n -0000232573 00000 n -0000232723 00000 n -0000232870 00000 n -0000232947 00000 n -0000233024 00000 n -0000233109 00000 n -0000233256 00000 n -0000233350 00000 n -0000233497 00000 n -0000233646 00000 n -0000233731 00000 n -0000233878 00000 n -0000233955 00000 n -0000234056 00000 n -0000234153 00000 n -0000234320 00000 n -0000234415 00000 n -0000234510 00000 n -0000234603 00000 n -0000234698 00000 n -0000234792 00000 n -0000234888 00000 n -0000234982 00000 n -0000235127 00000 n -0000236139 00000 n -0000236216 00000 n -0000236310 00000 n -0000236456 00000 n -0000236604 00000 n -0000236681 00000 n -0000236766 00000 n -0000236912 00000 n -0000237033 00000 n -0000237181 00000 n -0000237332 00000 n -0000237480 00000 n -0000237631 00000 n -0000237779 00000 n -0000237856 00000 n -0000237941 00000 n -0000238089 00000 n -0000238183 00000 n -0000238331 00000 n -0000238481 00000 n -0000238558 00000 n -0000238643 00000 n -0000238791 00000 n -0000238948 00000 n -0000239096 00000 n -0000239247 00000 n -0000239395 00000 n -0000239546 00000 n -0000239694 00000 n -0000239845 00000 n -0000239993 00000 n -0000240144 00000 n -0000240292 00000 n -0000240369 00000 n -0000240446 00000 n -0000240523 00000 n -0000240600 00000 n -0000240677 00000 n -0000240762 00000 n -0000240910 00000 n -0000240995 00000 n -0000241145 00000 n -0000241222 00000 n -0000241299 00000 n -0000241376 00000 n -0000241461 00000 n -0000241609 00000 n -0000241712 00000 n -0000241860 00000 n -0000242011 00000 n -0000242159 00000 n -0000242236 00000 n -0000242313 00000 n -0000242390 00000 n -0000242467 00000 n -0000242552 00000 n -0000242700 00000 n -0000242821 00000 n -0000242969 00000 n -0000243120 00000 n -0000243268 00000 n -0000243419 00000 n -0000243567 00000 n -0000243644 00000 n -0000243721 00000 n -0000243798 00000 n -0000243875 00000 n -0000243960 00000 n -0000244108 00000 n -0000244229 00000 n -0000244377 00000 n -0000244528 00000 n -0000244676 00000 n -0000244827 00000 n -0000244975 00000 n -0000245052 00000 n -0000245129 00000 n -0000245206 00000 n -0000245283 00000 n -0000245360 00000 n -0000245445 00000 n -0000245593 00000 n -0000245714 00000 n -0000245862 00000 n -0000246012 00000 n -0000246163 00000 n -0000246311 00000 n -0000246461 00000 n -0000246538 00000 n -0000246615 00000 n -0000246692 00000 n -0000246777 00000 n -0000246925 00000 n -0000247028 00000 n -0000247176 00000 n -0000247327 00000 n -0000247475 00000 n -0000247552 00000 n -0000247629 00000 n -0000247706 00000 n -0000247783 00000 n -0000247868 00000 n -0000248016 00000 n -0000248137 00000 n -0000248285 00000 n -0000248436 00000 n -0000248584 00000 n -0000248735 00000 n -0000248883 00000 n -0000248960 00000 n -0000249037 00000 n -0000249114 00000 n -0000249191 00000 n -0000249276 00000 n -0000249424 00000 n -0000249545 00000 n -0000249693 00000 n -0000249844 00000 n -0000249992 00000 n -0000250143 00000 n -0000250291 00000 n -0000250368 00000 n -0000250445 00000 n -0000250522 00000 n -0000250599 00000 n -0000250676 00000 n -0000250761 00000 n -0000250909 00000 n -0000251066 00000 n -0000251214 00000 n -0000251364 00000 n -0000251515 00000 n -0000251663 00000 n -0000251814 00000 n -0000251962 00000 n -0000252113 00000 n -0000252261 00000 n -0000252411 00000 n -0000252488 00000 n -0000252565 00000 n -0000252642 00000 n -0000252719 00000 n -0000252804 00000 n -0000252952 00000 n -0000253064 00000 n -0000253214 00000 n -0000253364 00000 n -0000253513 00000 n -0000253662 00000 n -0000253739 00000 n -0000253816 00000 n -0000253901 00000 n -0000254048 00000 n -0000254151 00000 n -0000254298 00000 n -0000254448 00000 n -0000254595 00000 n -0000254672 00000 n -0000254749 00000 n -0000254826 00000 n -0000254911 00000 n -0000255058 00000 n -0000255143 00000 n -0000255292 00000 n -0000255369 00000 n -0000255454 00000 n -0000255601 00000 n -0000255758 00000 n -0000255905 00000 n -0000256055 00000 n -0000256202 00000 n -0000256352 00000 n -0000256499 00000 n -0000256649 00000 n -0000256796 00000 n -0000256946 00000 n -0000257093 00000 n -0000257170 00000 n -0000257247 00000 n -0000257324 00000 n -0000257409 00000 n -0000257556 00000 n -0000257668 00000 n -0000257818 00000 n -0000257967 00000 n -0000258116 00000 n -0000258265 00000 n -0000258342 00000 n -0000258427 00000 n -0000258574 00000 n -0000258686 00000 n -0000258836 00000 n -0000258983 00000 n -0000259133 00000 n -0000259280 00000 n -0000259357 00000 n -0000259442 00000 n -0000259589 00000 n -0000259692 00000 n -0000259839 00000 n -0000259989 00000 n -0000260136 00000 n -0000260213 00000 n -0000260298 00000 n -0000260445 00000 n -0000260548 00000 n -0000260695 00000 n -0000260845 00000 n -0000260992 00000 n -0000261069 00000 n -0000261146 00000 n -0000261231 00000 n -0000261378 00000 n -0000261472 00000 n -0000261619 00000 n -0000261768 00000 n -0000261853 00000 n -0000262000 00000 n -0000262077 00000 n -0000262178 00000 n -0000262275 00000 n -0000262456 00000 n -0000262551 00000 n -0000262646 00000 n -0000262741 00000 n -0000262836 00000 n -0000262929 00000 n -0000263022 00000 n -0000263119 00000 n -0000263234 00000 n -0000263327 00000 n -0000263422 00000 n -0000263582 00000 n -0000263736 00000 n -0000263890 00000 n -0000263983 00000 n -0000264108 00000 n -0000264216 00000 n -0000264310 00000 n -0000264483 00000 n -0000264576 00000 n -0000264680 00000 n -0000264774 00000 n -0000264867 00000 n -0000264960 00000 n -0000265317 00000 n -0000265411 00000 n -0000265507 00000 n -0000265603 00000 n -0000265698 00000 n -0000265792 00000 n -0000265885 00000 n -0000265993 00000 n -0000266088 00000 n -0000266182 00000 n -0000266275 00000 n -0000266383 00000 n -0000266478 00000 n -0000266572 00000 n -0000266665 00000 n -0000266782 00000 n -0000266877 00000 n -0000266972 00000 n -0000267066 00000 n -0000267163 00000 n -0000267305 00000 n -0000267400 00000 n -0000267495 00000 n -0000267588 00000 n -0000267742 00000 n -0000267837 00000 n -0000268020 00000 n -0000268113 00000 n -0000268218 00000 n -0000268313 00000 n -0000268407 00000 n -0000268500 00000 n -0000268617 00000 n -0000268712 00000 n -0000268807 00000 n -0000268901 00000 n -0000268994 00000 n -0000269099 00000 n -0000269194 00000 n -0000269288 00000 n -0000269381 00000 n -0000269486 00000 n -0000269581 00000 n -0000269675 00000 n -0000269768 00000 n -0000269873 00000 n -0000269968 00000 n -0000270062 00000 n -0000270155 00000 n -0000270260 00000 n -0000270355 00000 n -0000270449 00000 n -0000270562 00000 n -0000270655 00000 n -0000270758 00000 n -0000270882 00000 n -0000270975 00000 n -0000271129 00000 n -0000271263 00000 n -0000271447 00000 n -0000271540 00000 n -0000271636 00000 n -0000271731 00000 n -0000271826 00000 n -0000271921 00000 n -0000272014 00000 n -0000272132 00000 n -0000272593 00000 n -0000272746 00000 n -0000272843 00000 n -0000272937 00000 n -0000273036 00000 n -0000273130 00000 n -0000273389 00000 n -0000273544 00000 n -0000273640 00000 n -0000273739 00000 n -0000273833 00000 n -0000273929 00000 n -0000274025 00000 n -0000274180 00000 n -0000274276 00000 n -0000274372 00000 n -0000274468 00000 n -0000274623 00000 n -0000274768 00000 n -0000275060 00000 n -0000275137 00000 n -0000275240 00000 n -0000275388 00000 n -0000275539 00000 n -0000275687 00000 n -0000275764 00000 n -0000275841 00000 n -0000275926 00000 n -0000276074 00000 n -0000276213 00000 n -0000276361 00000 n -0000276517 00000 n -0000276667 00000 n -0000276817 00000 n -0000276968 00000 n -0000277116 00000 n -0000277266 00000 n -0000277343 00000 n -0000277420 00000 n -0000277505 00000 n -0000277653 00000 n -0000277783 00000 n -0000277939 00000 n -0000278089 00000 n -0000278239 00000 n -0000278390 00000 n -0000278538 00000 n -0000278688 00000 n -0000278765 00000 n -0000278842 00000 n -0000278919 00000 n -0000279004 00000 n -0000279152 00000 n -0000279237 00000 n -0000279386 00000 n -0000279463 00000 n -0000279548 00000 n -0000279695 00000 n -0000279798 00000 n -0000279945 00000 n -0000280095 00000 n -0000280242 00000 n -0000280319 00000 n -0000280396 00000 n -0000280481 00000 n -0000280628 00000 n -0000280722 00000 n -0000280869 00000 n -0000281018 00000 n -0000281103 00000 n -0000281250 00000 n -0000281327 00000 n -0000281428 00000 n -0000281525 00000 n -0000281763 00000 n -0000281917 00000 n -0000282012 00000 n -0000282166 00000 n -0000282261 00000 n -0000282356 00000 n -0000282451 00000 n -0000282544 00000 n -0000282639 00000 n -0000282734 00000 n -0000282827 00000 n -0000282981 00000 n -0000283098 00000 n -0000283270 00000 n -0000283424 00000 n -0000283578 00000 n -0000283671 00000 n -0000283766 00000 n -0000283861 00000 n -0000283954 00000 n -0000284087 00000 n -0000284241 00000 n -0000284336 00000 n -0000284490 00000 n -0000284635 00000 n -0000285485 00000 n -0000285562 00000 n -0000285665 00000 n -0000285812 00000 n -0000285962 00000 n -0000286109 00000 n -0000286186 00000 n -0000286263 00000 n -0000286340 00000 n -0000286425 00000 n -0000286572 00000 n -0000286657 00000 n -0000286806 00000 n -0000286883 00000 n -0000286968 00000 n -0000287115 00000 n -0000287218 00000 n -0000287365 00000 n -0000287515 00000 n -0000287662 00000 n -0000287739 00000 n -0000287816 00000 n -0000287893 00000 n -0000287978 00000 n -0000288125 00000 n -0000288264 00000 n -0000288411 00000 n -0000288560 00000 n -0000288710 00000 n -0000288857 00000 n -0000289007 00000 n -0000289154 00000 n -0000289303 00000 n -0000289380 00000 n -0000289465 00000 n -0000289612 00000 n -0000289715 00000 n -0000289862 00000 n -0000290012 00000 n -0000290159 00000 n -0000290236 00000 n -0000290321 00000 n -0000290468 00000 n -0000290562 00000 n -0000290709 00000 n -0000290858 00000 n -0000290935 00000 n -0000291012 00000 n -0000291097 00000 n -0000291243 00000 n -0000291337 00000 n -0000291483 00000 n -0000291631 00000 n -0000291716 00000 n -0000291862 00000 n -0000291965 00000 n -0000292111 00000 n -0000292260 00000 n -0000292406 00000 n -0000292483 00000 n -0000292560 00000 n -0000292637 00000 n -0000292722 00000 n -0000292868 00000 n -0000292953 00000 n -0000293101 00000 n -0000293178 00000 n -0000293263 00000 n -0000293409 00000 n -0000293512 00000 n -0000293660 00000 n -0000293811 00000 n -0000293959 00000 n -0000294036 00000 n -0000294113 00000 n -0000294190 00000 n -0000294275 00000 n -0000294423 00000 n -0000294553 00000 n -0000294705 00000 n -0000294855 00000 n -0000295054 00000 n -0000295205 00000 n -0000295353 00000 n -0000295503 00000 n -0000295580 00000 n -0000295665 00000 n -0000295813 00000 n -0000295916 00000 n -0000296064 00000 n -0000296215 00000 n -0000296363 00000 n -0000296440 00000 n -0000296525 00000 n -0000296673 00000 n -0000296830 00000 n -0000296982 00000 n -0000297181 00000 n -0000297332 00000 n -0000297480 00000 n -0000297631 00000 n -0000297783 00000 n -0000297933 00000 n -0000298084 00000 n -0000298232 00000 n -0000298309 00000 n -0000298394 00000 n -0000298542 00000 n -0000298654 00000 n -0000298802 00000 n -0000298953 00000 n -0000299105 00000 n -0000299304 00000 n -0000299381 00000 n -0000299458 00000 n -0000299543 00000 n -0000299691 00000 n -0000299785 00000 n -0000299933 00000 n -0000300083 00000 n -0000300168 00000 n -0000300316 00000 n -0000300419 00000 n -0000300567 00000 n -0000300718 00000 n -0000300866 00000 n -0000300943 00000 n -0000301020 00000 n -0000301097 00000 n -0000301182 00000 n -0000301330 00000 n -0000301415 00000 n -0000301565 00000 n -0000301642 00000 n -0000301727 00000 n -0000301875 00000 n -0000301978 00000 n -0000302126 00000 n -0000302277 00000 n -0000302425 00000 n -0000302502 00000 n -0000302579 00000 n -0000302656 00000 n -0000302741 00000 n -0000302889 00000 n -0000303028 00000 n -0000303176 00000 n -0000303326 00000 n -0000303477 00000 n -0000303625 00000 n -0000303776 00000 n -0000303924 00000 n -0000304074 00000 n -0000304151 00000 n -0000304236 00000 n -0000304384 00000 n -0000304496 00000 n -0000304648 00000 n -0000304798 00000 n -0000304948 00000 n -0000305098 00000 n -0000305175 00000 n -0000305260 00000 n -0000305408 00000 n -0000305511 00000 n -0000305659 00000 n -0000305810 00000 n -0000305958 00000 n -0000306035 00000 n -0000306120 00000 n -0000306268 00000 n -0000306398 00000 n -0000306550 00000 n -0000306700 00000 n -0000306850 00000 n -0000307001 00000 n -0000307149 00000 n -0000307299 00000 n -0000307376 00000 n -0000307461 00000 n -0000307609 00000 n -0000307721 00000 n -0000307888 00000 n -0000308035 00000 n -0000308185 00000 n -0000308332 00000 n -0000308409 00000 n -0000308486 00000 n -0000308571 00000 n -0000308718 00000 n -0000308812 00000 n -0000308959 00000 n -0000309108 00000 n -0000309193 00000 n -0000309340 00000 n -0000309417 00000 n -0000309518 00000 n -0000309615 00000 n -0000309928 00000 n -0000310023 00000 n -0000310118 00000 n -0000310213 00000 n -0000310308 00000 n -0000310406 00000 n -0000310501 00000 n -0000310596 00000 n -0000310691 00000 n -0000310845 00000 n -0000310941 00000 n -0000311037 00000 n -0000311122 00000 n -0000311267 00000 n -0000311440 00000 n -0000311525 00000 n -0000311670 00000 n -0000311842 00000 n -0000311937 00000 n -0000312032 00000 n -0000312127 00000 n -0000312222 00000 n -0000312317 00000 n -0000312471 00000 n -0000312625 00000 n -0000312770 00000 n -0000313233 00000 n -0000313310 00000 n -0000313404 00000 n -0000313551 00000 n -0000313700 00000 n -0000313777 00000 n -0000313862 00000 n -0000314009 00000 n -0000314094 00000 n -0000314241 00000 n -0000314318 00000 n -0000314403 00000 n -0000314550 00000 n -0000314671 00000 n -0000314818 00000 n -0000314968 00000 n -0000315115 00000 n -0000315265 00000 n -0000315412 00000 n -0000315489 00000 n -0000315583 00000 n -0000315730 00000 n -0000315859 00000 n -0000315980 00000 n -0000316127 00000 n -0000316277 00000 n -0000316424 00000 n -0000316574 00000 n -0000316721 00000 n -0000316798 00000 n -0000316883 00000 n -0000317030 00000 n -0000317133 00000 n -0000317280 00000 n -0000317430 00000 n -0000317577 00000 n -0000317654 00000 n -0000317739 00000 n -0000317886 00000 n -0000317971 00000 n -0000318118 00000 n -0000318195 00000 n -0000318272 00000 n -0000318349 00000 n -0000318434 00000 n -0000318581 00000 n -0000318693 00000 n -0000318843 00000 n -0000318990 00000 n -0000319140 00000 n -0000319287 00000 n -0000319364 00000 n -0000319441 00000 n -0000319518 00000 n -0000319595 00000 n -0000319680 00000 n -0000319827 00000 n -0000319930 00000 n -0000320080 00000 n -0000320229 00000 n -0000320378 00000 n -0000320455 00000 n -0000320532 00000 n -0000320617 00000 n -0000320764 00000 n -0000320849 00000 n -0000320996 00000 n -0000321073 00000 n -0000321150 00000 n -0000321227 00000 n -0000321312 00000 n -0000321459 00000 n -0000321553 00000 n -0000321700 00000 n -0000321849 00000 n -0000321926 00000 n -0000322003 00000 n -0000322097 00000 n -0000322244 00000 n -0000322373 00000 n -0000322467 00000 n -0000322614 00000 n -0000322763 00000 n -0000322848 00000 n -0000322995 00000 n -0000323072 00000 n -0000323172 00000 n -0000323268 00000 n -0000323837 00000 n -0000323934 00000 n -0000324028 00000 n -0000324125 00000 n -0000324280 00000 n -0000324376 00000 n -0000324470 00000 n -0000324625 00000 n -0000324721 00000 n -0000324820 00000 n -0000324975 00000 n -0000325071 00000 n -0000325167 00000 n -0000325263 00000 n -0000325362 00000 n -0000325458 00000 n -0000325552 00000 n -0000325707 00000 n -0000325928 00000 n -0000326024 00000 n -0000326179 00000 n -0000326282 00000 n -0000326378 00000 n -0000326474 00000 n -0000326629 00000 n -0000326784 00000 n -0000326880 00000 n -0000326974 00000 n -0000327098 00000 n -0000327383 00000 n -0000327479 00000 n -0000327634 00000 n -0000327733 00000 n -0000327832 00000 n -0000327928 00000 n -0000328024 00000 n -0000328179 00000 n -0000328278 00000 n -0000328374 00000 n -0000328473 00000 n -0000328569 00000 n -0000328665 00000 n -0000328763 00000 n -0000328908 00000 n -0000329272 00000 n -0000329349 00000 n -0000329434 00000 n -0000329584 00000 n -0000329661 00000 n -0000329738 00000 n -0000329815 00000 n -0000329892 00000 n -0000329977 00000 n -0000330125 00000 n -0000330210 00000 n -0000330358 00000 n -0000330435 00000 n -0000330512 00000 n -0000330589 00000 n -0000330666 00000 n -0000330743 00000 n -0000330828 00000 n -0000330976 00000 n -0000331160 00000 n -0000331308 00000 n -0000331458 00000 n -0000331606 00000 n -0000331754 00000 n -0000331905 00000 n -0000332053 00000 n -0000332201 00000 n -0000332353 00000 n -0000332503 00000 n -0000332653 00000 n -0000332800 00000 n -0000332949 00000 n -0000333026 00000 n -0000333103 00000 n -0000333180 00000 n -0000333257 00000 n -0000333342 00000 n -0000333489 00000 n -0000333601 00000 n -0000333751 00000 n -0000333900 00000 n -0000334049 00000 n -0000334198 00000 n -0000334275 00000 n -0000334352 00000 n -0000334429 00000 n -0000334514 00000 n -0000334661 00000 n -0000334773 00000 n -0000334923 00000 n -0000335072 00000 n -0000335221 00000 n -0000335370 00000 n -0000335447 00000 n -0000335524 00000 n -0000335609 00000 n -0000335756 00000 n -0000335850 00000 n -0000335997 00000 n -0000336146 00000 n -0000336231 00000 n -0000336378 00000 n -0000336455 00000 n -0000336556 00000 n -0000336653 00000 n -0000336849 00000 n -0000337003 00000 n -0000337098 00000 n -0000337202 00000 n -0000337356 00000 n -0000337510 00000 n -0000337605 00000 n -0000337700 00000 n -0000337854 00000 n -0000337999 00000 n -0000338507 00000 n -0000338584 00000 n -0000338678 00000 n -0000338825 00000 n -0000338974 00000 n -0000339051 00000 n -0000339136 00000 n -0000339283 00000 n -0000339368 00000 n -0000339515 00000 n -0000339592 00000 n -0000339669 00000 n -0000339746 00000 n -0000339831 00000 n -0000339978 00000 n -0000340099 00000 n -0000340264 00000 n -0000340414 00000 n -0000340561 00000 n -0000340708 00000 n -0000340857 00000 n -0000340934 00000 n -0000341011 00000 n -0000341088 00000 n -0000341165 00000 n -0000341250 00000 n -0000341397 00000 n -0000341500 00000 n -0000341650 00000 n -0000341799 00000 n -0000341948 00000 n -0000342025 00000 n -0000342102 00000 n -0000342187 00000 n -0000342334 00000 n -0000342419 00000 n -0000342566 00000 n -0000342643 00000 n -0000342720 00000 n -0000342805 00000 n -0000342952 00000 n -0000343082 00000 n -0000343256 00000 n -0000343406 00000 n -0000343556 00000 n -0000343703 00000 n -0000343850 00000 n -0000343997 00000 n -0000344074 00000 n -0000344151 00000 n -0000344236 00000 n -0000344383 00000 n -0000344513 00000 n -0000344672 00000 n -0000344822 00000 n -0000344969 00000 n -0000345115 00000 n -0000345264 00000 n -0000345410 00000 n -0000345487 00000 n -0000345564 00000 n -0000345641 00000 n -0000345726 00000 n -0000345872 00000 n -0000345966 00000 n -0000346112 00000 n -0000346260 00000 n -0000346337 00000 n -0000346414 00000 n -0000346499 00000 n -0000346645 00000 n -0000346739 00000 n -0000346885 00000 n -0000347033 00000 n -0000347118 00000 n -0000347264 00000 n -0000347385 00000 n -0000347560 00000 n -0000347712 00000 n -0000347860 00000 n -0000348008 00000 n -0000348158 00000 n -0000348235 00000 n -0000348320 00000 n -0000348468 00000 n -0000348598 00000 n -0000348761 00000 n -0000348913 00000 n -0000349061 00000 n -0000349209 00000 n -0000349360 00000 n -0000349508 00000 n -0000349585 00000 n -0000349662 00000 n -0000349747 00000 n -0000349895 00000 n -0000349989 00000 n -0000350137 00000 n -0000350287 00000 n -0000350372 00000 n -0000350520 00000 n -0000350597 00000 n -0000350699 00000 n -0000350797 00000 n -0000351027 00000 n -0000351123 00000 n -0000351234 00000 n -0000351353 00000 n -0000351449 00000 n -0000351604 00000 n -0000351700 00000 n -0000351855 00000 n -0000351958 00000 n -0000352077 00000 n -0000352175 00000 n -0000352422 00000 n -0000352520 00000 n -0000352614 00000 n -0000352710 00000 n -0000352809 00000 n -0000352905 00000 n -0000353028 00000 n -0000353124 00000 n -0000353235 00000 n -0000353390 00000 n -0000353486 00000 n -0000353637 00000 n -0000353792 00000 n -0000353885 00000 n -0000354004 00000 n -0000354139 00000 n -0000354235 00000 n -0000354330 00000 n -0000354423 00000 n -0000354542 00000 n -0000354669 00000 n -0000354765 00000 n -0000354860 00000 n -0000354953 00000 n -0000355072 00000 n -0000355207 00000 n -0000355303 00000 n -0000355398 00000 n -0000355504 00000 n -0000355658 00000 n -0000355780 00000 n -0000356039 00000 n -0000356134 00000 n -0000356229 00000 n -0000356383 00000 n -0000356487 00000 n -0000356582 00000 n -0000356677 00000 n -0000356772 00000 n -0000356867 00000 n -0000356962 00000 n -0000357116 00000 n -0000357214 00000 n -0000357309 00000 n -0000357404 00000 n -0000357612 00000 n -0000357707 00000 n -0000357802 00000 n -0000357909 00000 n -0000358004 00000 n -0000358158 00000 n -0000358253 00000 n -0000358407 00000 n -0000358511 00000 n -0000358606 00000 n -0000358751 00000 n -0000359412 00000 n -0000359489 00000 n -0000359583 00000 n -0000359730 00000 n -0000359879 00000 n -0000359956 00000 n -0000360041 00000 n -0000360188 00000 n -0000360291 00000 n -0000360438 00000 n -0000360588 00000 n -0000360735 00000 n -0000360812 00000 n -0000360897 00000 n -0000361044 00000 n -0000361129 00000 n -0000361276 00000 n -0000361353 00000 n -0000361430 00000 n -0000361515 00000 n -0000361662 00000 n -0000361774 00000 n -0000361924 00000 n -0000362073 00000 n -0000362223 00000 n -0000362370 00000 n -0000362447 00000 n -0000362524 00000 n -0000362609 00000 n -0000362756 00000 n -0000362859 00000 n -0000363006 00000 n -0000363156 00000 n -0000363303 00000 n -0000363380 00000 n -0000363457 00000 n -0000363542 00000 n -0000363689 00000 n -0000363801 00000 n -0000363951 00000 n -0000364100 00000 n -0000364249 00000 n -0000364398 00000 n -0000364475 00000 n -0000364552 00000 n -0000364629 00000 n -0000364714 00000 n -0000364860 00000 n -0000364954 00000 n -0000365100 00000 n -0000365248 00000 n -0000365325 00000 n -0000365410 00000 n -0000365556 00000 n -0000365677 00000 n -0000365823 00000 n -0000365972 00000 n -0000366118 00000 n -0000366267 00000 n -0000366413 00000 n -0000366490 00000 n -0000366575 00000 n -0000366721 00000 n -0000366824 00000 n -0000366972 00000 n -0000367123 00000 n -0000367271 00000 n -0000367348 00000 n -0000367425 00000 n -0000367510 00000 n -0000367658 00000 n -0000367752 00000 n -0000367900 00000 n -0000368050 00000 n -0000368135 00000 n -0000368283 00000 n -0000368377 00000 n -0000368525 00000 n -0000368675 00000 n -0000368752 00000 n -0000368837 00000 n -0000368985 00000 n -0000369097 00000 n -0000369249 00000 n -0000369399 00000 n -0000369549 00000 n -0000369699 00000 n -0000369776 00000 n -0000369853 00000 n -0000369938 00000 n -0000370086 00000 n -0000370207 00000 n -0000370355 00000 n -0000370506 00000 n -0000370658 00000 n -0000370808 00000 n -0000370958 00000 n -0000371035 00000 n -0000371112 00000 n -0000371197 00000 n -0000371345 00000 n -0000371457 00000 n -0000371609 00000 n -0000371759 00000 n -0000371910 00000 n -0000372058 00000 n -0000372135 00000 n -0000372212 00000 n -0000372289 00000 n -0000372374 00000 n -0000372522 00000 n -0000372616 00000 n -0000372764 00000 n -0000372914 00000 n -0000372991 00000 n -0000373076 00000 n -0000373224 00000 n -0000373327 00000 n -0000373475 00000 n -0000373626 00000 n -0000373774 00000 n -0000373851 00000 n -0000373936 00000 n -0000374084 00000 n -0000374187 00000 n -0000374335 00000 n -0000374486 00000 n -0000374634 00000 n -0000374711 00000 n -0000374788 00000 n -0000374873 00000 n -0000375021 00000 n -0000375115 00000 n -0000375263 00000 n -0000375413 00000 n -0000375498 00000 n -0000375646 00000 n -0000375723 00000 n -0000375825 00000 n -0000375923 00000 n -0000376089 00000 n -0000376185 00000 n -0000376284 00000 n -0000376383 00000 n -0000376490 00000 n -0000376586 00000 n -0000376741 00000 n -0000376994 00000 n -0000377101 00000 n -0000377204 00000 n -0000377315 00000 n -0000377422 00000 n -0000377577 00000 n -0000377684 00000 n -0000377780 00000 n -0000377876 00000 n -0000377972 00000 n -0000378126 00000 n -0000378244 00000 n -0000378389 00000 n -0000378543 00000 n -0000378697 00000 n -0000378851 00000 n -0000379005 00000 n -0000379098 00000 n -0000379235 00000 n -0000379340 00000 n -0000379553 00000 n -0000379637 00000 n -0000379915 00000 n -0000380008 00000 n -0000380163 00000 n -0000380258 00000 n -0000380395 00000 n -0000380493 00000 n -0000380586 00000 n -0000380723 00000 n -0000380818 00000 n -0000380955 00000 n -0000381065 00000 n -0000381158 00000 n -0000381295 00000 n -0000381390 00000 n -0000381527 00000 n -0000381634 00000 n -0000381727 00000 n -0000381864 00000 n -0000381959 00000 n -0000382096 00000 n -0000382203 00000 n -0000382296 00000 n -0000382451 00000 n -0000382546 00000 n -0000382683 00000 n -0000382784 00000 n -0000382877 00000 n -0000383014 00000 n -0000383109 00000 n -0000383246 00000 n -0000383359 00000 n -0000383452 00000 n -0000383589 00000 n -0000383684 00000 n -0000383821 00000 n -0000383934 00000 n -0000384027 00000 n -0000384191 00000 n -0000384286 00000 n -0000384381 00000 n -0000384545 00000 n -0000384658 00000 n -0000384765 00000 n -0000384858 00000 n -0000385034 00000 n -0000385129 00000 n -0000385224 00000 n -0000385319 00000 n -0000385495 00000 n -0000385596 00000 n -0000385697 00000 n -0000385795 00000 n -0000385888 00000 n -0000386025 00000 n -0000386120 00000 n -0000386257 00000 n -0000386367 00000 n -0000386460 00000 n -0000386606 00000 n -0000386770 00000 n -0000386874 00000 n -0000386973 00000 n -0000387066 00000 n -0000387220 00000 n -0000387314 00000 n -0000387451 00000 n -0000387550 00000 n -0000387634 00000 n -0000387912 00000 n -0000387996 00000 n -0000388274 00000 n -0000388361 00000 n -0000388454 00000 n -0000388617 00000 n -0000388713 00000 n -0000388894 00000 n -0000388990 00000 n -0000389135 00000 n -0000389231 00000 n -0000389327 00000 n -0000389414 00000 n -0000389498 00000 n -0000389759 00000 n -0000389848 00000 n -0000389995 00000 n -0000390323 00000 n -0000390478 00000 n -0000390574 00000 n -0000390670 00000 n -0000390769 00000 n -0000390879 00000 n -0000390974 00000 n -0000391072 00000 n -0000391167 00000 n -0000391321 00000 n -0000391416 00000 n -0000391511 00000 n -0000391609 00000 n -0000391704 00000 n -0000391802 00000 n -0000391897 00000 n -0000392051 00000 n -0000392144 00000 n -0000392280 00000 n -0000392375 00000 n -0000392470 00000 n -0000392624 00000 n -0000392739 00000 n -0000392965 00000 n -0000393119 00000 n -0000393212 00000 n -0000393366 00000 n -0000393459 00000 n -0000393613 00000 n -0000393706 00000 n -0000393799 00000 n -0000393953 00000 n -0000394046 00000 n -0000394178 00000 n -0000394316 00000 n -0000394470 00000 n -0000394624 00000 n -0000394720 00000 n -0000394991 00000 n -0000395087 00000 n -0000395182 00000 n -0000395277 00000 n -0000395374 00000 n -0000395537 00000 n -0000395691 00000 n -0000395807 00000 n -0000395902 00000 n -0000395999 00000 n -0000396093 00000 n -0000396226 00000 n -0000396332 00000 n -0000396486 00000 n -0000396631 00000 n -0000396778 00000 n -0000396871 00000 n -0000396991 00000 n -0000397092 00000 n -0000397185 00000 n -0000397279 00000 n -0000397372 00000 n -0000397480 00000 n -0000397573 00000 n -0000397667 00000 n -0000397792 00000 n -0000397885 00000 n -0000397995 00000 n -0000398098 00000 n -0000398240 00000 n -0000398333 00000 n -0000398426 00000 n -0000398527 00000 n -0000398624 00000 n -0000398779 00000 n -0000398872 00000 n -0000398977 00000 n -0000399071 00000 n -0000399164 00000 n -0000399263 00000 n -0000399357 00000 n -0000399450 00000 n -0000399546 00000 n -0000399640 00000 n -0000399772 00000 n -0000399869 00000 n -0000399968 00000 n -0000400064 00000 n -0000400414 00000 n -0000400513 00000 n -0000400612 00000 n -0000400711 00000 n -0000400810 00000 n -0000400909 00000 n -0000401008 00000 n -0000401107 00000 n -0000401206 00000 n -0000401309 00000 n -0000401408 00000 n -0000401571 00000 n -0000401727 00000 n -0000401820 00000 n -0000401926 00000 n -0000402025 00000 n -0000402120 00000 n -0000402213 00000 n -0000402319 00000 n -0000402426 00000 n -0000402520 00000 n -0000402613 00000 n -0000402718 00000 n -0000402816 00000 n -0000402910 00000 n -0000403002 00000 n -0000403197 00000 n -0000403310 00000 n -0000403411 00000 n -0000403514 00000 n -0000403659 00000 n -0000403757 00000 n -0000403911 00000 n -0000404012 00000 n -0000404110 00000 n -0000404228 00000 n -0000404352 00000 n -0000404450 00000 n -0000404604 00000 n -0000404727 00000 n -0000404827 00000 n -0000404982 00000 n -0000405075 00000 n -0000405174 00000 n -0000405268 00000 n -0000405361 00000 n -0000405538 00000 n -0000405633 00000 n -0000405728 00000 n -0000405823 00000 n -0000405918 00000 n -0000406013 00000 n -0000406108 00000 n -0000406202 00000 n -0000406295 00000 n -0000406479 00000 n -0000406574 00000 n -0000406669 00000 n -0000406764 00000 n -0000406859 00000 n -0000406954 00000 n -0000407049 00000 n -0000407143 00000 n -0000407236 00000 n -0000407326 00000 n -0000407419 00000 n -0000407556 00000 n -0000407666 00000 n -0000407760 00000 n -0000407854 00000 n -0000407948 00000 n -0000408042 00000 n -0000408131 00000 n -0000408277 00000 n -0000408484 00000 n -0000408639 00000 n -0000408733 00000 n -0000408829 00000 n -0000408925 00000 n -0000409021 00000 n -0000409117 00000 n -0000409213 00000 n -0000409351 00000 n -0000409450 00000 n -0000409561 00000 n -0000409676 00000 n -0000409769 00000 n -0000409906 00000 n -0000410106 00000 n -0000410237 00000 n -0000410333 00000 n -0000410464 00000 n -0000410560 00000 n -0000410691 00000 n -0000410787 00000 n -0000410918 00000 n -0000411014 00000 n -0000411145 00000 n -0000411241 00000 n -0000411369 00000 n -0000411464 00000 n -0000411562 00000 n -0000411657 00000 n -0000411746 00000 n -0000411894 00000 n -0000412051 00000 n -0000412205 00000 n -0000412300 00000 n -0000412395 00000 n -0000412490 00000 n -0000412585 00000 n -0000412733 00000 n -0000412834 00000 n -0000412935 00000 n -0000413036 00000 n -0000413137 00000 n -0000413264 00000 n -0000413365 00000 n -0000413460 00000 n -0000413639 00000 n -0000413836 00000 n -0000413963 00000 n -0000414061 00000 n -0000414168 00000 n -0000414260 00000 n -0000414512 00000 n -0000414608 00000 n -0000414704 00000 n -0000414803 00000 n -0000414899 00000 n -0000414995 00000 n -0000415091 00000 n -0000415187 00000 n -0000415283 00000 n -0000415382 00000 n -0000415478 00000 n -0000415577 00000 n -0000415673 00000 n -0000415787 00000 n -0000416003 00000 n -0000416099 00000 n -0000416195 00000 n -0000416294 00000 n -0000416393 00000 n -0000416516 00000 n -0000416679 00000 n -0000416773 00000 n -0000416880 00000 n -0000417006 00000 n -0000417102 00000 n -0000417205 00000 n -0000417298 00000 n -0000417435 00000 n -0000417545 00000 n -0000417641 00000 n -0000417737 00000 n -0000417833 00000 n -0000417929 00000 n -0000418018 00000 n -0000418166 00000 n -0000418368 00000 n -0000418523 00000 n -0000418619 00000 n -0000418774 00000 n -0000418885 00000 n -0000418981 00000 n -0000419075 00000 n -0000419214 00000 n -0000419345 00000 n -0000419444 00000 n -0000419543 00000 n -0000419688 00000 n -0000419890 00000 n -0000420011 00000 n -0000420202 00000 n -0000420443 00000 n -0000420644 00000 n -0000420797 00000 n -0000420986 00000 n -0000421071 00000 n -0000421221 00000 n -0000421306 00000 n -0000421468 00000 n -0000421553 00000 n -0000421703 00000 n -0000421788 00000 n -0000421938 00000 n -0000422023 00000 n -0000422173 00000 n -0000422258 00000 n -0000422414 00000 n -0000422499 00000 n -0000422655 00000 n -0000422740 00000 n -0000422890 00000 n -0000422975 00000 n -0000423128 00000 n -0000423213 00000 n -0000423363 00000 n -0000423448 00000 n -0000423604 00000 n -0000423689 00000 n -0000423839 00000 n -0000423924 00000 n -0000424080 00000 n -0000424193 00000 n -0000424297 00000 n -0000424400 00000 n -0000424517 00000 n -0000424618 00000 n -0000424722 00000 n -0000424885 00000 n -0000425050 00000 n -0000425197 00000 n -0000425290 00000 n -0000425394 00000 n -0000425497 00000 n -0000425590 00000 n -0000425683 00000 n -0000425787 00000 n -0000425884 00000 n -0000425977 00000 n -0000426070 00000 n -0000426157 00000 n -0000426259 00000 n -0000426358 00000 n -0000426453 00000 n -0000426546 00000 n -0000426652 00000 n -0000426751 00000 n -0000426846 00000 n -0000426939 00000 n -0000427045 00000 n -0000427144 00000 n -0000427239 00000 n -0000427358 00000 n -0000427481 00000 n -0000427592 00000 n -0000428055 00000 n -0000428187 00000 n -0000428298 00000 n -0000428405 00000 n -0000428511 00000 n -0000428650 00000 n -0000428744 00000 n -0000428840 00000 n -0000428936 00000 n -0000429050 00000 n -0000429172 00000 n -0000429327 00000 n -0000429426 00000 n -0000429627 00000 n -0000429721 00000 n -0000429940 00000 n -0000430135 00000 n -0000430220 00000 n -0000430371 00000 n -0000430456 00000 n -0000430623 00000 n -0000430708 00000 n -0000430859 00000 n -0000430944 00000 n -0000431095 00000 n -0000431180 00000 n -0000431331 00000 n -0000431416 00000 n -0000431575 00000 n -0000431660 00000 n -0000431819 00000 n -0000431904 00000 n -0000432055 00000 n -0000432140 00000 n -0000432295 00000 n -0000432380 00000 n -0000432531 00000 n -0000432616 00000 n -0000432771 00000 n -0000432856 00000 n -0000433007 00000 n -0000433092 00000 n -0000433251 00000 n -0000433429 00000 n -0000433528 00000 n -0000433635 00000 n -0000433734 00000 n -0000433849 00000 n -0000434004 00000 n -0000434107 00000 n -0000434261 00000 n -0000434410 00000 n -0000434513 00000 n -0000434620 00000 n -0000434723 00000 n -0000434822 00000 n -0000435101 00000 n -0000435283 00000 n -0000435381 00000 n -0000435479 00000 n -0000435577 00000 n -0000435678 00000 n -0000435812 00000 n -0000435905 00000 n -0000436008 00000 n -0000436189 00000 n -0000436284 00000 n -0000436379 00000 n -0000436533 00000 n -0000436626 00000 n -0000436724 00000 n -0000436817 00000 n -0000437714 00000 n -0000437807 00000 n -0000437905 00000 n -0000438059 00000 n -0000438172 00000 n -0000438270 00000 n -0000438362 00000 n -0000438459 00000 n -0000438558 00000 n -0000438655 00000 n -0000438984 00000 n -0000439083 00000 n -0000439179 00000 n -0000439303 00000 n -0000439396 00000 n -0000439533 00000 n -0000439643 00000 n -0000439739 00000 n -0000439835 00000 n -0000439931 00000 n -0000440027 00000 n -0000440116 00000 n -0000440264 00000 n -0000440522 00000 n -0000440677 00000 n -0000440773 00000 n -0000440872 00000 n -0000440968 00000 n -0000441062 00000 n -0000441158 00000 n -0000441254 00000 n -0000441361 00000 n -0000441455 00000 n -0000441549 00000 n -0000441712 00000 n -0000441859 00000 n -0000441952 00000 n -0000442058 00000 n -0000442169 00000 n -0000442264 00000 n -0000442357 00000 n -0000442471 00000 n -0000442582 00000 n -0000442677 00000 n -0000442783 00000 n -0000442898 00000 n -0000443081 00000 n -0000443209 00000 n -0000443308 00000 n -0000443402 00000 n -0000443508 00000 n -0000443651 00000 n -0000443806 00000 n -0000443905 00000 n -0000443999 00000 n -0000444123 00000 n -0000444313 00000 n -0000444468 00000 n -0000444579 00000 n -0000444678 00000 n -0000444837 00000 n -0000444936 00000 n -0000445035 00000 n -0000445180 00000 n -0000445634 00000 n -0000445719 00000 n -0000446038 00000 n -0000446123 00000 n -0000446274 00000 n -0000446359 00000 n -0000446526 00000 n -0000446611 00000 n -0000446762 00000 n -0000446847 00000 n -0000447014 00000 n -0000447099 00000 n -0000447250 00000 n -0000447335 00000 n -0000447486 00000 n -0000447571 00000 n -0000447758 00000 n -0000447843 00000 n -0000447994 00000 n -0000448079 00000 n -0000448234 00000 n -0000448319 00000 n -0000448470 00000 n -0000448555 00000 n -0000448734 00000 n -0000448819 00000 n -0000448970 00000 n -0000449055 00000 n -0000449206 00000 n -0000449291 00000 n -0000449548 00000 n -0000449633 00000 n -0000449783 00000 n -0000449868 00000 n -0000450030 00000 n -0000450115 00000 n -0000450265 00000 n -0000450350 00000 n -0000450512 00000 n -0000450597 00000 n -0000450747 00000 n -0000450832 00000 n -0000450982 00000 n -0000451067 00000 n -0000451244 00000 n -0000451329 00000 n -0000451479 00000 n -0000451564 00000 n -0000451717 00000 n -0000451802 00000 n -0000451952 00000 n -0000452037 00000 n -0000452223 00000 n -0000452308 00000 n -0000452458 00000 n -0000452543 00000 n -0000452693 00000 n -0000452778 00000 n -0000452964 00000 n -0000453049 00000 n -0000453199 00000 n -0000453284 00000 n -0000453446 00000 n -0000453531 00000 n -0000453681 00000 n -0000453766 00000 n -0000453928 00000 n -0000454013 00000 n -0000454163 00000 n -0000454248 00000 n -0000454398 00000 n -0000454483 00000 n -0000454636 00000 n -0000454721 00000 n -0000454871 00000 n -0000454956 00000 n -0000455109 00000 n -0000455194 00000 n -0000455344 00000 n -0000455429 00000 n -0000455592 00000 n -0000455677 00000 n -0000455826 00000 n -0000455911 00000 n -0000456060 00000 n -0000456214 00000 n -0000456317 00000 n -0000456416 00000 n -0000456515 00000 n -0000456614 00000 n -0000456720 00000 n -0000456874 00000 n -0000457200 00000 n -0000457303 00000 n -0000457406 00000 n -0000457541 00000 n -0000457652 00000 n -0000457763 00000 n -0000457857 00000 n -0000457968 00000 n -0000458071 00000 n -0000458174 00000 n -0000458268 00000 n -0000458367 00000 n -0000458466 00000 n -0000458569 00000 n -0000458663 00000 n -0000458762 00000 n -0000458877 00000 n -0000458980 00000 n -0000459291 00000 n -0000459393 00000 n -0000459499 00000 n -0000459625 00000 n -0000459719 00000 n -0000459817 00000 n -0000459942 00000 n -0000460049 00000 n -0000460194 00000 n -0000460648 00000 n -0000460733 00000 n -0000461004 00000 n -0000461089 00000 n -0000461240 00000 n -0000461325 00000 n -0000461492 00000 n -0000461577 00000 n -0000461728 00000 n -0000461813 00000 n -0000461980 00000 n -0000462065 00000 n -0000462216 00000 n -0000462301 00000 n -0000462452 00000 n -0000462537 00000 n -0000462724 00000 n -0000462809 00000 n -0000462960 00000 n -0000463045 00000 n -0000463200 00000 n -0000463285 00000 n -0000463436 00000 n -0000463521 00000 n -0000463680 00000 n -0000463765 00000 n -0000463916 00000 n -0000464001 00000 n -0000464152 00000 n -0000464237 00000 n -0000464536 00000 n -0000464621 00000 n -0000464772 00000 n -0000464857 00000 n -0000465024 00000 n -0000465109 00000 n -0000465260 00000 n -0000465345 00000 n -0000465512 00000 n -0000465597 00000 n -0000465748 00000 n -0000465833 00000 n -0000465984 00000 n -0000466069 00000 n -0000466256 00000 n -0000466341 00000 n -0000466492 00000 n -0000466577 00000 n -0000466732 00000 n -0000466817 00000 n -0000466968 00000 n -0000467053 00000 n -0000467244 00000 n -0000467329 00000 n -0000467480 00000 n -0000467565 00000 n -0000467716 00000 n -0000467801 00000 n -0000467976 00000 n -0000468061 00000 n -0000468212 00000 n -0000468297 00000 n -0000468464 00000 n -0000468549 00000 n -0000468700 00000 n -0000468785 00000 n -0000468936 00000 n -0000469021 00000 n -0000469172 00000 n -0000469257 00000 n -0000469408 00000 n -0000469493 00000 n -0000469660 00000 n -0000469745 00000 n -0000469896 00000 n -0000469981 00000 n -0000470136 00000 n -0000470221 00000 n -0000470372 00000 n -0000470457 00000 n -0000470619 00000 n -0000470704 00000 n -0000470854 00000 n -0000470939 00000 n -0000471089 00000 n -0000471238 00000 n -0000471339 00000 n -0000471437 00000 n -0000471535 00000 n -0000471633 00000 n -0000471736 00000 n -0000471881 00000 n -0000471988 00000 n -0000472086 00000 n -0000472193 00000 n -0000472291 00000 n -0000472454 00000 n -0000472601 00000 n -0000472694 00000 n -0000472805 00000 n -0000472930 00000 n -0000473024 00000 n -0000473117 00000 n -0000473222 00000 n -0000473341 00000 n -0000473435 00000 n -0000473539 00000 n -0000473649 00000 n -0000473859 00000 n -0000473960 00000 n -0000474060 00000 n -0000474176 00000 n -0000474268 00000 n -0000474364 00000 n -0000474511 00000 n -0000474605 00000 n -0000474699 00000 n -0000474798 00000 n -0000474929 00000 n -0000475271 00000 n -0000475370 00000 n -0000475469 00000 n -0000475568 00000 n -0000475679 00000 n -0000475778 00000 n -0000475877 00000 n -0000475996 00000 n -0000476107 00000 n -0000476206 00000 n -0000476305 00000 n -0000476404 00000 n -0000476515 00000 n -0000476614 00000 n -0000476733 00000 n -0000476832 00000 n -0000476931 00000 n -0000477030 00000 n -0000477129 00000 n -0000477263 00000 n -0000477418 00000 n -0000477525 00000 n -0000477670 00000 n -0000477936 00000 n -0000478061 00000 n -0000478174 00000 n -0000478278 00000 n -0000478381 00000 n -0000478529 00000 n -0000478627 00000 n -0000478734 00000 n -0000478835 00000 n -0000478933 00000 n -0000479087 00000 n -0000479179 00000 n -0000479350 00000 n -0000479463 00000 n -0000479556 00000 n -0000479659 00000 n -0000479783 00000 n -0000479881 00000 n -0000479988 00000 n -0000480182 00000 n -0000480775 00000 n -0000480868 00000 n -0000480970 00000 n -0000481067 00000 n -0000481202 00000 n -0000481362 00000 n -0000481465 00000 n -0000481620 00000 n -0000481723 00000 n -0000481842 00000 n -0000481996 00000 n -0000482141 00000 n -0000482260 00000 n -0000482379 00000 n -0000482498 00000 n -0000482609 00000 n -0000482937 00000 n -0000483022 00000 n -0000483237 00000 n -0000483322 00000 n -0000483473 00000 n -0000483558 00000 n -0000483709 00000 n -0000483794 00000 n -0000483945 00000 n -0000484030 00000 n -0000484197 00000 n -0000484282 00000 n -0000484433 00000 n -0000484518 00000 n -0000484669 00000 n -0000484754 00000 n -0000484929 00000 n -0000485014 00000 n -0000485165 00000 n -0000485250 00000 n -0000485401 00000 n -0000485486 00000 n -0000485637 00000 n -0000485722 00000 n -0000485901 00000 n -0000485986 00000 n -0000486137 00000 n -0000486222 00000 n -0000486373 00000 n -0000486458 00000 n -0000486621 00000 n -0000486706 00000 n -0000486857 00000 n -0000486942 00000 n -0000487093 00000 n -0000487178 00000 n -0000487329 00000 n -0000487414 00000 n -0000487565 00000 n -0000487650 00000 n -0000487801 00000 n -0000487886 00000 n -0000488037 00000 n -0000488122 00000 n -0000488277 00000 n -0000488362 00000 n -0000488513 00000 n -0000488598 00000 n -0000488749 00000 n -0000488834 00000 n -0000488985 00000 n -0000489070 00000 n -0000489237 00000 n -0000489322 00000 n -0000489473 00000 n -0000489558 00000 n -0000489709 00000 n -0000489850 00000 n -0000489949 00000 n -0000490048 00000 n -0000490147 00000 n -0000490253 00000 n -0000490422 00000 n -0000490541 00000 n -0000490660 00000 n -0000490763 00000 n -0000490862 00000 n -0000490961 00000 n -0000491124 00000 n -0000491289 00000 n -0000491382 00000 n -0000491488 00000 n -0000491607 00000 n -0000491702 00000 n -0000491795 00000 n -0000491913 00000 n -0000492029 00000 n -0000492133 00000 n -0000492227 00000 n -0000492320 00000 n -0000492437 00000 n -0000492550 00000 n -0000492663 00000 n -0000492757 00000 n -0000492850 00000 n -0000492967 00000 n -0000493080 00000 n -0000493187 00000 n -0000493281 00000 n -0000493412 00000 n -0000493513 00000 n -0000493632 00000 n -0000493736 00000 n -0000493916 00000 n -0000494044 00000 n -0000494137 00000 n -0000494247 00000 n -0000494350 00000 n -0000494477 00000 n -0000494631 00000 n -0000494785 00000 n -0000494904 00000 n -0000495543 00000 n -0000495635 00000 n -0000495729 00000 n -0000495852 00000 n -0000496038 00000 n -0000496193 00000 n -0000496348 00000 n -0000496447 00000 n -0000496546 00000 n -0000496669 00000 n -0000496768 00000 n -0000496971 00000 n -0000497070 00000 n -0000497169 00000 n -0000497268 00000 n -0000497371 00000 n -0000497470 00000 n -0000497577 00000 n -0000497671 00000 n -0000497816 00000 n -0000498043 00000 n -0000498184 00000 n -0000498307 00000 n -0000498406 00000 n -0000498505 00000 n -0000498611 00000 n -0000498716 00000 n -0000498815 00000 n -0000499014 00000 n -0000499162 00000 n -0000499373 00000 n -0000499521 00000 n -0000499676 00000 n -0000499824 00000 n -0000499975 00000 n -0000500123 00000 n -0000500281 00000 n -0000500426 00000 n -0000500592 00000 n -0000500695 00000 n -0000500870 00000 n -0000501065 00000 n -0000501254 00000 n -0000501339 00000 n -0000501489 00000 n -0000501574 00000 n -0000501724 00000 n -0000501809 00000 n -0000501959 00000 n -0000502044 00000 n -0000502200 00000 n -0000502285 00000 n -0000502438 00000 n -0000502523 00000 n -0000502673 00000 n -0000502758 00000 n -0000502908 00000 n -0000502993 00000 n -0000503143 00000 n -0000503228 00000 n -0000503384 00000 n -0000503509 00000 n -0000503613 00000 n -0000503726 00000 n -0000503829 00000 n -0000503935 00000 n -0000504036 00000 n -0000504235 00000 n -0000504382 00000 n -0000504580 00000 n -0000504727 00000 n -0000504880 00000 n -0000505027 00000 n -0000505177 00000 n -0000505324 00000 n -0000505479 00000 n -0000505714 00000 n -0000505818 00000 n -0000505919 00000 n -0000506020 00000 n -0000506118 00000 n -0000506216 00000 n -0000506317 00000 n -0000506418 00000 n -0000506519 00000 n -0000506620 00000 n -0000506721 00000 n -0000506822 00000 n -0000506920 00000 n -0000507023 00000 n -0000507124 00000 n -0000507223 00000 n -0000507320 00000 n -0000507442 00000 n -0000507549 00000 n -0000507652 00000 n -0000507797 00000 n -0000507999 00000 n -0000508093 00000 n -0000508300 00000 n -0000508495 00000 n -0000508580 00000 n -0000508731 00000 n -0000508816 00000 n -0000508983 00000 n -0000509068 00000 n -0000509219 00000 n -0000509304 00000 n -0000509455 00000 n -0000509540 00000 n -0000509691 00000 n -0000509776 00000 n -0000509931 00000 n -0000510016 00000 n -0000510175 00000 n -0000510260 00000 n -0000510411 00000 n -0000510496 00000 n -0000510651 00000 n -0000510736 00000 n -0000510887 00000 n -0000510972 00000 n -0000511127 00000 n -0000511212 00000 n -0000511363 00000 n -0000511448 00000 n -0000511603 00000 n -0000511718 00000 n -0000511821 00000 n -0000511927 00000 n -0000512071 00000 n -0000512178 00000 n -0000512281 00000 n -0000512388 00000 n -0000512491 00000 n -0000512636 00000 n -0000512739 00000 n -0000512838 00000 n -0000512937 00000 n -0000513040 00000 n -0000513143 00000 n -0000513242 00000 n -0000513349 00000 n -0000513448 00000 n -0000513565 00000 n -0000513684 00000 n -0000513847 00000 n -0000513994 00000 n -0000514087 00000 n -0000514193 00000 n -0000514308 00000 n -0000514403 00000 n -0000514496 00000 n -0000514602 00000 n -0000514709 00000 n -0000514804 00000 n -0000514923 00000 n -0000515038 00000 n -0000515149 00000 n -0000515516 00000 n -0000515641 00000 n -0000515745 00000 n -0000515846 00000 n -0000515949 00000 n -0000516082 00000 n -0000516186 00000 n -0000516287 00000 n -0000516388 00000 n -0000516535 00000 n -0000516628 00000 n -0000516763 00000 n -0000516876 00000 n -0000517010 00000 n -0000517111 00000 n -0000517205 00000 n -0000517298 00000 n -0000517433 00000 n -0000517540 00000 n -0000517662 00000 n -0000517760 00000 n -0000517854 00000 n -0000517988 00000 n -0000518085 00000 n -0000518182 00000 n -0000518279 00000 n -0000518407 00000 n -0000518624 00000 n -0000518727 00000 n -0000518830 00000 n -0000518933 00000 n -0000519036 00000 n -0000519135 00000 n -0000519234 00000 n -0000519333 00000 n -0000519432 00000 n -0000519531 00000 n -0000519630 00000 n -0000519729 00000 n -0000519828 00000 n -0000519935 00000 n -0000520042 00000 n -0000520145 00000 n -0000520248 00000 n -0000520443 00000 n -0000520546 00000 n -0000520693 00000 n -0000520792 00000 n -0000520891 00000 n -0000520990 00000 n -0000521089 00000 n -0000521188 00000 n -0000521333 00000 n -0000521499 00000 n -0000521584 00000 n -0000521767 00000 n -0000521852 00000 n -0000522003 00000 n -0000522088 00000 n -0000522255 00000 n -0000522340 00000 n -0000522491 00000 n -0000522576 00000 n -0000522731 00000 n -0000522816 00000 n -0000522971 00000 n -0000523056 00000 n -0000523207 00000 n -0000523292 00000 n -0000523447 00000 n -0000523532 00000 n -0000523683 00000 n -0000523768 00000 n -0000523923 00000 n -0000524051 00000 n -0000524154 00000 n -0000524257 00000 n -0000524363 00000 n -0000524498 00000 n -0000524601 00000 n -0000524700 00000 n -0000524803 00000 n -0000524948 00000 n -0000525175 00000 n -0000525316 00000 n -0000525439 00000 n -0000525538 00000 n -0000525637 00000 n -0000525743 00000 n -0000525897 00000 n -0000526000 00000 n -0000526103 00000 n -0000526202 00000 n -0000526301 00000 n -0000526400 00000 n -0000526503 00000 n -0000526606 00000 n -0000526709 00000 n -0000526808 00000 n -0000526971 00000 n -0000527119 00000 n -0000527342 00000 n -0000527490 00000 n -0000527648 00000 n -0000527954 00000 n -0000528057 00000 n -0000528172 00000 n -0000528327 00000 n -0000528462 00000 n -0000528565 00000 n -0000528748 00000 n -0000528851 00000 n -0000528966 00000 n -0000529065 00000 n -0000529164 00000 n -0000529263 00000 n -0000529374 00000 n -0000529484 00000 n -0000529585 00000 n -0000529683 00000 n -0000529790 00000 n -0000529935 00000 n -0000530137 00000 n -0000530222 00000 n -0000530405 00000 n -0000530490 00000 n -0000530640 00000 n -0000530725 00000 n -0000530887 00000 n -0000530972 00000 n -0000531122 00000 n -0000531207 00000 n -0000531357 00000 n -0000531442 00000 n -0000531592 00000 n -0000531677 00000 n -0000531830 00000 n -0000531915 00000 n -0000532068 00000 n -0000532153 00000 n -0000532303 00000 n -0000532388 00000 n -0000532541 00000 n -0000532626 00000 n -0000532776 00000 n -0000532861 00000 n -0000533023 00000 n -0000533108 00000 n -0000533258 00000 n -0000533343 00000 n -0000533496 00000 n -0000533633 00000 n -0000533737 00000 n -0000533838 00000 n -0000533939 00000 n -0000534042 00000 n -0000534160 00000 n -0000534261 00000 n -0000534359 00000 n -0000534531 00000 n -0000534635 00000 n -0000534751 00000 n -0000534898 00000 n -0000534991 00000 n -0000535096 00000 n -0000535199 00000 n -0000535292 00000 n -0000535385 00000 n -0000535489 00000 n -0000535590 00000 n -0000535683 00000 n -0000535789 00000 n -0000535904 00000 n -0000536083 00000 n -0000536211 00000 n -0000536305 00000 n -0000536404 00000 n -0000536510 00000 n -0000536602 00000 n -0000536783 00000 n -0000536938 00000 n -0000537041 00000 n -0000537144 00000 n -0000537243 00000 n -0000537342 00000 n -0000537497 00000 n -0000537590 00000 n -0000537730 00000 n -0000537849 00000 n -0000537960 00000 n -0000538054 00000 n -0000538149 00000 n -0000538242 00000 n -0000538374 00000 n -0000538473 00000 n -0000538576 00000 n -0000538670 00000 n -0000538765 00000 n -0000538858 00000 n -0000538964 00000 n -0000539058 00000 n -0000539153 00000 n -0000539373 00000 n -0000539471 00000 n -0000539587 00000 n -0000539685 00000 n -0000539783 00000 n -0000539914 00000 n -0000540018 00000 n -0000540116 00000 n -0000540214 00000 n -0000540336 00000 n -0000540449 00000 n -0000540566 00000 n -0000540711 00000 n -0000540804 00000 n -0000540926 00000 n -0000541019 00000 n -0000541140 00000 n -0000541291 00000 n -0000541384 00000 n -0000541476 00000 n -0000541629 00000 n -0000541771 00000 n -0000541892 00000 n -0000542047 00000 n -0000542163 00000 n -0000542309 00000 n -0000542402 00000 n -0000542520 00000 n -0000542618 00000 n -0000542713 00000 n -0000542806 00000 n -0000542928 00000 n -0000543026 00000 n -0000543121 00000 n -0000543268 00000 n -0000543423 00000 n -0000543517 00000 n -0000543611 00000 n -0000543753 00000 n -0000544107 00000 n -0000544262 00000 n -0000544417 00000 n -0000544572 00000 n -0000544727 00000 n -0000544826 00000 n -0000544925 00000 n -0000545024 00000 n -0000545123 00000 n -0000545222 00000 n -0000545321 00000 n -0000545420 00000 n -0000545574 00000 n -0000545728 00000 n -0000545868 00000 n -0000545961 00000 n -0000546058 00000 n -0000546281 00000 n -0000546400 00000 n -0000546498 00000 n -0000546617 00000 n -0000546754 00000 n -0000546873 00000 n -0000546989 00000 n -0000547143 00000 n -0000547296 00000 n -0000547392 00000 n -0000547592 00000 n -0000547766 00000 n -0000547909 00000 n -0000548064 00000 n -0000548219 00000 n -0000548313 00000 n -0000548427 00000 n -0000548654 00000 n -0000548809 00000 n -0000548964 00000 n -0000549119 00000 n -0000549274 00000 n -0000549429 00000 n -0000549528 00000 n -0000549627 00000 n -0000549829 00000 n -0000550061 00000 n -0000550155 00000 n -0000550310 00000 n -0000550429 00000 n -0000550548 00000 n -0000550647 00000 n -0000550802 00000 n -0000550957 00000 n -0000551055 00000 n -0000551268 00000 n -0000551406 00000 n -0000551525 00000 n -0000551632 00000 n -0000551730 00000 n -0000551846 00000 n -0000552000 00000 n -0000552154 00000 n -0000552251 00000 n -0000552372 00000 n -0000552526 00000 n -0000552693 00000 n -0000552880 00000 n -0000552973 00000 n -0000553071 00000 n -0000553169 00000 n -0000553267 00000 n -0000553377 00000 n -0000553531 00000 n -0000553685 00000 n -0000553793 00000 n -0000553900 00000 n -0000554053 00000 n -0000554167 00000 n -0000554332 00000 n -0000554425 00000 n -0000554565 00000 n -0000554719 00000 n -0000554816 00000 n -0000554910 00000 n -0000555003 00000 n -0000555159 00000 n -0000555313 00000 n -0000555410 00000 n -0000555564 00000 n -0000555661 00000 n -0000555755 00000 n -0000555848 00000 n -0000555980 00000 n -0000556134 00000 n -0000556231 00000 n -0000556325 00000 n -0000556418 00000 n -0000556565 00000 n -0000556658 00000 n -0000556812 00000 n -0000556909 00000 n -0000557003 00000 n -0000557229 00000 n -0000557383 00000 n -0000557537 00000 n -0000557630 00000 n -0000557784 00000 n -0000557938 00000 n -0000558034 00000 n -0000558127 00000 n -0000558220 00000 n -0000558336 00000 n -0000558476 00000 n -0000558630 00000 n -0000559103 00000 n -0000559256 00000 n -0000559388 00000 n -0000559503 00000 n -0000559723 00000 n -0000559877 00000 n -0000560031 00000 n -0000560185 00000 n -0000560339 00000 n -0000560493 00000 n -0000560647 00000 n -0000560779 00000 n -0000560900 00000 n -0000561054 00000 n -0000561208 00000 n -0000561404 00000 n -0000561499 00000 n -0000561594 00000 n -0000561679 00000 n -0000561824 00000 n -0000561996 00000 n -0000562091 00000 n -0000562186 00000 n -0000562283 00000 n -0000562913 00000 n -0000563007 00000 n -0000563101 00000 n -0000563220 00000 n -0000563305 00000 n -0000563450 00000 n -0000563622 00000 n -0000563707 00000 n -0000563852 00000 n -0000564023 00000 n -0000564118 00000 n -0000564215 00000 n -0000564309 00000 n -0000564426 00000 n -0000564548 00000 n -0000564690 00000 n -0000564844 00000 n -0000564998 00000 n -0000565144 00000 n -0000565237 00000 n -0000565366 00000 n -0000565459 00000 n -0000565556 00000 n -0000565650 00000 n -0000565743 00000 n -0000565872 00000 n -0000565965 00000 n -0000566062 00000 n -0000566156 00000 n -0000566253 00000 n -0000566383 00000 n -0000566573 00000 n -0000566727 00000 n -0000566881 00000 n -0000566974 00000 n -0000567066 00000 n -0000567219 00000 n -0000567332 00000 n -0000567533 00000 n -0000567619 00000 n -0000567762 00000 n -0000567919 00000 n -0000568005 00000 n -0000568148 00000 n -0000568314 00000 n -0000568408 00000 n -0000568520 00000 n -0000568606 00000 n -0000568749 00000 n -0000568915 00000 n -0000569009 00000 n -0000569095 00000 n -0000569238 00000 n -0000569404 00000 n -0000569498 00000 n -0000569584 00000 n -0000569727 00000 n -0000569893 00000 n -0000569987 00000 n -0000570073 00000 n -0000570216 00000 n -0000570382 00000 n -0000570476 00000 n -0000570562 00000 n -0000570705 00000 n -0000570871 00000 n -0000570965 00000 n -0000571086 00000 n -0000571172 00000 n -0000571315 00000 n -0000571481 00000 n -0000571575 00000 n -0000571661 00000 n -0000571804 00000 n -0000571970 00000 n -0000572064 00000 n -0000572150 00000 n -0000572293 00000 n -0000572459 00000 n -0000572553 00000 n -0000572639 00000 n -0000572782 00000 n -0000572948 00000 n -0000573042 00000 n -0000573128 00000 n -0000573271 00000 n -0000573437 00000 n -0000573531 00000 n -0000573617 00000 n -0000573760 00000 n -0000573926 00000 n -0000574020 00000 n -0000574141 00000 n -0000574227 00000 n -0000574370 00000 n -0000574536 00000 n -0000574630 00000 n -0000574724 00000 n -0000574810 00000 n -0000574953 00000 n -0000575119 00000 n -0000575213 00000 n -0000575299 00000 n -0000575442 00000 n -0000575608 00000 n -0000575701 00000 n -0000575787 00000 n -0000575930 00000 n -0000576094 00000 n -0000576187 00000 n -0000576299 00000 n -0000576385 00000 n -0000576528 00000 n -0000576692 00000 n -0000576785 00000 n -0000576871 00000 n -0000577014 00000 n -0000577237 00000 n -0000577330 00000 n -0000577416 00000 n -0000577559 00000 n -0000577725 00000 n -0000577819 00000 n -0000577905 00000 n -0000578048 00000 n -0000578214 00000 n -0000578308 00000 n -0000578394 00000 n -0000578537 00000 n -0000578703 00000 n -0000578797 00000 n -0000578883 00000 n -0000579026 00000 n -0000579192 00000 n -0000579286 00000 n -0000579434 00000 n -0000579528 00000 n -0000579614 00000 n -0000579757 00000 n -0000579923 00000 n -0000580017 00000 n -0000580103 00000 n -0000580246 00000 n -0000580412 00000 n -0000580506 00000 n -0000580592 00000 n -0000580735 00000 n -0000580901 00000 n -0000580995 00000 n -0000581107 00000 n -0000581193 00000 n -0000581336 00000 n -0000581502 00000 n -0000581596 00000 n -0000581682 00000 n -0000581825 00000 n -0000581991 00000 n -0000582085 00000 n -0000582171 00000 n -0000582314 00000 n -0000582480 00000 n -0000582574 00000 n -0000582660 00000 n -0000582803 00000 n -0000582969 00000 n -0000583063 00000 n -0000583149 00000 n -0000583292 00000 n -0000583458 00000 n -0000583552 00000 n -0000583655 00000 n -0000583741 00000 n -0000583884 00000 n -0000584050 00000 n -0000584144 00000 n -0000584230 00000 n -0000584373 00000 n -0000584539 00000 n -0000584633 00000 n -0000584719 00000 n -0000584862 00000 n -0000585028 00000 n -0000585122 00000 n -0000585208 00000 n -0000585351 00000 n -0000585517 00000 n -0000585611 00000 n -0000585705 00000 n -0000585791 00000 n -0000585934 00000 n -0000586100 00000 n -0000586194 00000 n -0000586280 00000 n -0000586423 00000 n -0000586589 00000 n -0000586683 00000 n -0000586769 00000 n -0000586912 00000 n -0000587078 00000 n -0000587172 00000 n -0000587258 00000 n -0000587401 00000 n -0000587567 00000 n -0000587661 00000 n -0000587764 00000 n -0000587850 00000 n -0000587993 00000 n -0000588159 00000 n -0000588253 00000 n -0000588339 00000 n -0000588482 00000 n -0000588648 00000 n -0000588742 00000 n -0000588828 00000 n -0000588971 00000 n -0000589137 00000 n -0000589231 00000 n -0000589317 00000 n -0000589460 00000 n -0000589626 00000 n -0000589720 00000 n -0000589832 00000 n -0000589918 00000 n -0000590061 00000 n -0000590227 00000 n -0000590321 00000 n -0000590424 00000 n -0000590510 00000 n -0000590653 00000 n -0000590819 00000 n -0000590913 00000 n -0000590999 00000 n -0000591142 00000 n -0000591308 00000 n -0000591402 00000 n -0000591488 00000 n -0000591631 00000 n -0000591797 00000 n -0000591891 00000 n -0000591977 00000 n -0000592120 00000 n -0000592284 00000 n -0000592377 00000 n -0000592463 00000 n -0000592606 00000 n -0000592770 00000 n -0000592863 00000 n -0000592949 00000 n -0000593092 00000 n -0000593256 00000 n -0000593349 00000 n -0000593456 00000 n -0000593664 00000 n -0000593757 00000 n -0000593850 00000 n -0000593943 00000 n -0000594036 00000 n -0000594129 00000 n -0000594222 00000 n -0000594313 00000 n -0000594424 00000 n -0000594595 00000 n -0000594766 00000 n -0000594887 00000 n -0000595058 00000 n -0000595229 00000 n -0000595400 00000 n -0000595490 00000 n -0000595550 00000 n -0000595610 00000 n -0000595670 00000 n -0000595730 00000 n -0000595790 00000 n -0000595850 00000 n -0000595910 00000 n -0000595970 00000 n -0000596030 00000 n -0000596091 00000 n -0000596152 00000 n -0000596213 00000 n -0000596274 00000 n -0000596335 00000 n -0000596396 00000 n -0000596457 00000 n -0000596518 00000 n -0000596579 00000 n -0000596640 00000 n -0000596701 00000 n -0000596762 00000 n -0000596823 00000 n -0000596884 00000 n -0000596945 00000 n -0000597006 00000 n -0000597067 00000 n -0000597128 00000 n -0000597189 00000 n -0000597250 00000 n -0000597311 00000 n -0000597372 00000 n -0000597433 00000 n -0000597494 00000 n -0000597555 00000 n -0000597616 00000 n -0000597677 00000 n -0000597738 00000 n -0000597799 00000 n -0000597860 00000 n -0000597921 00000 n -0000597982 00000 n -0000598043 00000 n -0000598104 00000 n -0000598165 00000 n -0000598226 00000 n -0000598287 00000 n -0000598348 00000 n -0000598409 00000 n -0000598593 00000 n -0000599339 00000 n -0000599431 00000 n -0000599686 00000 n -0000601251 00000 n -0000607801 00000 n -0000607988 00000 n -0000609151 00000 n -0000609243 00000 n -0000609502 00000 n -0000611612 00000 n -0000620396 00000 n -0000620582 00000 n -0000621445 00000 n -0000621537 00000 n -0000621798 00000 n -0000623535 00000 n -0000632415 00000 n -0000632605 00000 n -0000633280 00000 n -0000633372 00000 n -0000633638 00000 n -0000635021 00000 n -0000641745 00000 n -0000641913 00000 n -0000642183 00000 n -0000642275 00000 n -0000642555 00000 n -0000643972 00000 n -0000653610 00000 n -0000653789 00000 n -0000655702 00000 n -0000655794 00000 n -0000656046 00000 n -0000659375 00000 n -0000680853 00000 n -0000681041 00000 n -0000681297 00000 n -0000681384 00000 n -0000681638 00000 n -0000682339 00000 n -0000682789 00000 n -0000682962 00000 n -0000683236 00000 n -0000683325 00000 n -0000683619 00000 n -0000684418 00000 n -0000688825 00000 n -0000688865 00000 n -0000688905 00000 n -0000689265 00000 n -0000689689 00000 n -0000689744 00000 n -0000689799 00000 n -0000689854 00000 n -0000689910 00000 n -0000689965 00000 n -0000690020 00000 n -0000690075 00000 n -0000690130 00000 n -0000690185 00000 n -0000690240 00000 n -0000690295 00000 n -0000690350 00000 n -0000690405 00000 n -0000690461 00000 n -0000690516 00000 n -0000690572 00000 n -0000690628 00000 n -0000690684 00000 n -0000690740 00000 n -0000690795 00000 n -0000690851 00000 n -0000690906 00000 n -0000690961 00000 n -0000691017 00000 n -0000691071 00000 n -0000691124 00000 n -0000691179 00000 n -0000691234 00000 n -0000691289 00000 n -0000691344 00000 n -0000691399 00000 n -0000691454 00000 n -0000691509 00000 n -0000691564 00000 n -0000691620 00000 n -0000691675 00000 n -0000691730 00000 n -0000691785 00000 n -0000691840 00000 n -0000691896 00000 n -0000691951 00000 n -0000692006 00000 n -0000692061 00000 n -0000692116 00000 n -0000692171 00000 n -0000692227 00000 n -0000692282 00000 n -0000692337 00000 n -0000692392 00000 n -0000692447 00000 n -0000692503 00000 n -0000692558 00000 n -0000692614 00000 n -0000692670 00000 n -0000692726 00000 n -0000692783 00000 n -0000692839 00000 n -0000692894 00000 n -0000692949 00000 n -0000693004 00000 n -0000693059 00000 n -0000693115 00000 n -0000693170 00000 n -0000693226 00000 n -0000693281 00000 n -0000693336 00000 n -0000693391 00000 n -0000693446 00000 n -0000693501 00000 n -0000693556 00000 n -0000693612 00000 n -0000693668 00000 n -0000693724 00000 n -0000693779 00000 n -0000693834 00000 n -0000693889 00000 n -0000693945 00000 n -0000694000 00000 n -0000694055 00000 n -0000694110 00000 n -0000694165 00000 n -0000694220 00000 n -0000694275 00000 n -0000694331 00000 n -0000694387 00000 n -0000694443 00000 n -0000694498 00000 n -0000694553 00000 n -0000694608 00000 n -0000694663 00000 n -0000694718 00000 n -0000694774 00000 n -0000694830 00000 n -0000694885 00000 n -0000694940 00000 n -0000694995 00000 n -0000695050 00000 n -0000695104 00000 n -0000695159 00000 n -0000695214 00000 n -0000695269 00000 n -0000695324 00000 n -0000695379 00000 n -0000695435 00000 n -0000695490 00000 n -0000695545 00000 n -0000695600 00000 n -0000695655 00000 n -0000695710 00000 n -0000695766 00000 n -0000695822 00000 n -0000695877 00000 n -0000695932 00000 n -0000695987 00000 n -0000696043 00000 n -0000696099 00000 n -0000696154 00000 n -0000696209 00000 n -0000696264 00000 n -0000696320 00000 n -0000696376 00000 n -0000696432 00000 n -0000696489 00000 n -0000696545 00000 n -0000696601 00000 n -0000696656 00000 n -0000696711 00000 n -0000696766 00000 n -0000696821 00000 n -0000696876 00000 n -0000696932 00000 n -0000696987 00000 n -0000697042 00000 n -0000697098 00000 n -0000697154 00000 n -0000697209 00000 n -0000697264 00000 n -0000697319 00000 n -0000697374 00000 n -0000697429 00000 n -0000697484 00000 n -0000697540 00000 n -0000697595 00000 n -0000697650 00000 n -0000697705 00000 n -0000697761 00000 n -0000697816 00000 n -0000697872 00000 n -0000697927 00000 n -0000697983 00000 n -0000698038 00000 n -0000698093 00000 n -0000698148 00000 n -0000698203 00000 n -0000698258 00000 n -0000698313 00000 n -0000698368 00000 n -0000698423 00000 n -0000698478 00000 n -0000698533 00000 n -0000698588 00000 n -0000698643 00000 n -0000698699 00000 n -0000698755 00000 n -0000698811 00000 n -0000698866 00000 n -0000698921 00000 n -0000698976 00000 n -0000699031 00000 n -0000699086 00000 n -0000699141 00000 n -0000699196 00000 n -0000699251 00000 n -0000699306 00000 n -0000699361 00000 n -0000699416 00000 n -0000699471 00000 n -0000699526 00000 n -0000699582 00000 n -0000699638 00000 n -0000699694 00000 n -0000699749 00000 n -0000699804 00000 n -0000699859 00000 n -0000699914 00000 n -0000699969 00000 n -0000700024 00000 n -0000700080 00000 n -0000700135 00000 n -0000700190 00000 n -0000700245 00000 n -0000700301 00000 n -0000700357 00000 n -0000700413 00000 n -0000700469 00000 n -0000700524 00000 n -0000700580 00000 n -0000700635 00000 n -0000700691 00000 n -0000700747 00000 n -0000700803 00000 n -0000700860 00000 n -0000700916 00000 n -0000700972 00000 n -0000701027 00000 n -0000701083 00000 n -0000701138 00000 n -0000701193 00000 n -0000701249 00000 n -0000701306 00000 n -0000701362 00000 n -0000701419 00000 n -0000701476 00000 n -0000701533 00000 n -0000701589 00000 n -0000701645 00000 n -0000701701 00000 n -0000701757 00000 n -0000701813 00000 n -0000701870 00000 n -0000701927 00000 n -0000701984 00000 n -0000702039 00000 n -0000702095 00000 n -0000702151 00000 n -0000702206 00000 n -0000702263 00000 n -0000702318 00000 n -0000702373 00000 n -0000702431 00000 n -0000702488 00000 n -0000702544 00000 n -0000702601 00000 n -0000702658 00000 n -0000702714 00000 n -0000702770 00000 n -0000702826 00000 n -0000702882 00000 n -0000702937 00000 n -0000702993 00000 n -0000703049 00000 n -0000703105 00000 n -0000703159 00000 n -0000703215 00000 n -0000703273 00000 n -0000703330 00000 n -0000703387 00000 n -0000703442 00000 n -0000703498 00000 n -0000703554 00000 n -0000703609 00000 n -0000703666 00000 n -0000703722 00000 n -0000703777 00000 n -0000703833 00000 n -0000703889 00000 n -0000703946 00000 n -0000704002 00000 n -0000704058 00000 n -0000704114 00000 n -0000704170 00000 n -0000704225 00000 n -0000704282 00000 n -0000704339 00000 n -0000704395 00000 n -0000704451 00000 n -0000704507 00000 n -0000704562 00000 n -0000704618 00000 n -0000704674 00000 n -0000704730 00000 n -0000704786 00000 n -0000704842 00000 n -0000704898 00000 n -0000704955 00000 n -0000705313 00000 n -0000708227 00000 n -0000708515 00000 n -0000708875 00000 n -0000709200 00000 n -0000709524 00000 n -0000709911 00000 n -0000710298 00000 n -0000710602 00000 n -0000710893 00000 n -0000711167 00000 n -0000711452 00000 n -0000711839 00000 n -0000712238 00000 n -0000712568 00000 n -0000712892 00000 n -0000713270 00000 n -0000713604 00000 n -0000713936 00000 n -0000714325 00000 n -0000714707 00000 n -0000715048 00000 n -0000715393 00000 n -0000715703 00000 n -0000716015 00000 n -0000716332 00000 n -0000716674 00000 n -0000717004 00000 n -0000717398 00000 n -0000717754 00000 n -0000718055 00000 n -0000718382 00000 n -0000718727 00000 n -0000719071 00000 n -0000719680 00000 n -0000735800 00000 n -0000736144 00000 n -0000736469 00000 n -0000736788 00000 n -0000737179 00000 n -0000737525 00000 n -0000737847 00000 n -0000738130 00000 n -0000738461 00000 n -0000738833 00000 n -0000739226 00000 n -0000739662 00000 n -0000740044 00000 n -0000740332 00000 n -0000740694 00000 n -0000741034 00000 n -0000741377 00000 n -0000741715 00000 n -0000741998 00000 n -0000742265 00000 n -0000742757 00000 n -0000752615 00000 n -0000752795 00000 n -0000752977 00000 n -0000753159 00000 n -0000753339 00000 n -0000753521 00000 n -0000753944 00000 n -0000758522 00000 n -0000758713 00000 n -0000758905 00000 n -0000759085 00000 n -0000759265 00000 n -0000759447 00000 n -0000759629 00000 n -0000759810 00000 n -0000759993 00000 n -0000760176 00000 n -0000760359 00000 n -0000760540 00000 n -0000760998 00000 n -0000766535 00000 n -0000766718 00000 n -0000766901 00000 n -0000767086 00000 n -0000767269 00000 n -0000767452 00000 n -0000767633 00000 n -0000767844 00000 n -0000768056 00000 n -0000768268 00000 n -0000768478 00000 n -0000768671 00000 n -0000769110 00000 n -0000774558 00000 n -0000774752 00000 n -0000774933 00000 n -0000775116 00000 n -0000775300 00000 n -0000775483 00000 n -0000775664 00000 n -0000775845 00000 n -0000776026 00000 n -0000776209 00000 n -0000776393 00000 n -0000776577 00000 n -0000776761 00000 n -0000776945 00000 n -0000777128 00000 n -0000777312 00000 n -0000777496 00000 n -0000778000 00000 n -0000783888 00000 n -0000784073 00000 n -0000784255 00000 n -0000784438 00000 n -0000784623 00000 n -0000784808 00000 n -0000784993 00000 n -0000785176 00000 n -0000785361 00000 n -0000785562 00000 n -0000785758 00000 n -0000786208 00000 n -0000792215 00000 n -0000792414 00000 n -0000792599 00000 n -0000792996 00000 n -0000799004 00000 n -0000799194 00000 n -0000799544 00000 n -0000806569 00000 n -0000806906 00000 n -0000813126 00000 n -0000813340 00000 n -0000813554 00000 n -0000813951 00000 n -0000820546 00000 n -0000820728 00000 n -0000820910 00000 n -0000821123 00000 n -0000821529 00000 n -0000827821 00000 n -0000828034 00000 n -0000828422 00000 n -0000834403 00000 n -0000834740 00000 n -0000842762 00000 n -0000842969 00000 n -0000843179 00000 n -0000843371 00000 n -0000843563 00000 n -0000843755 00000 n -0000844198 00000 n -0000851556 00000 n -0000851750 00000 n -0000851943 00000 n -0000852127 00000 n -0000852320 00000 n -0000852534 00000 n -0000852977 00000 n -0000860386 00000 n -0000860577 00000 n -0000860759 00000 n -0000861194 00000 n -0000868220 00000 n -0000868409 00000 n -0000868601 00000 n -0000868998 00000 n -0000874886 00000 n -0000875101 00000 n -0000875310 00000 n -0000875745 00000 n -0000880996 00000 n -0000881206 00000 n -0000881390 00000 n -0000881806 00000 n -0000887252 00000 n -0000887464 00000 n -0000887676 00000 n -0000887870 00000 n -0000888073 00000 n -0000888277 00000 n -0000888476 00000 n -0000888665 00000 n -0000888879 00000 n -0000889074 00000 n -0000889264 00000 n -0000889733 00000 n -0000895270 00000 n -0000895465 00000 n -0000895672 00000 n -0000895881 00000 n -0000896093 00000 n -0000896305 00000 n -0000896516 00000 n -0000896711 00000 n -0000896904 00000 n -0000897355 00000 n -0000902759 00000 n -0000902953 00000 n -0000903170 00000 n -0000903366 00000 n -0000903578 00000 n -0000903790 00000 n -0000903982 00000 n -0000904195 00000 n -0000904386 00000 n -0000904856 00000 n -0000911913 00000 n -0000912105 00000 n -0000912318 00000 n -0000912513 00000 n -0000912726 00000 n -0000912920 00000 n -0000913115 00000 n -0000913319 00000 n -0000913540 00000 n -0000913755 00000 n -0000913949 00000 n -0000914136 00000 n -0000914326 00000 n -0000914520 00000 n -0000915035 00000 n -0000921333 00000 n -0000921526 00000 n -0000921746 00000 n -0000921939 00000 n -0000922123 00000 n -0000922519 00000 n -0000927813 00000 n -0000928031 00000 n -0000928242 00000 n -0000928434 00000 n -0000928652 00000 n -0000928863 00000 n -0000929056 00000 n -0000929266 00000 n -0000929457 00000 n -0000929651 00000 n -0000929865 00000 n -0000930353 00000 n -0000935931 00000 n -0000936132 00000 n -0000936346 00000 n -0000936762 00000 n -0000941877 00000 n -0000942062 00000 n -0000942247 00000 n -0000942663 00000 n -0000947793 00000 n -0000947987 00000 n -0000948170 00000 n -0000948567 00000 n -0000953113 00000 n -0000953305 00000 n -0000953497 00000 n -0000953700 00000 n -0000953892 00000 n -0000954108 00000 n -0000954321 00000 n -0000954539 00000 n -0000954757 00000 n -0000954940 00000 n -0000955122 00000 n -0000955591 00000 n -0000961222 00000 n -0000961433 00000 n -0000961616 00000 n -0000961802 00000 n -0000961986 00000 n -0000962382 00000 n -0000967555 00000 n -0000967737 00000 n -0000967950 00000 n -0000968132 00000 n -0000968314 00000 n -0000968511 00000 n -0000968697 00000 n -0000968882 00000 n -0000969286 00000 n -0000974760 00000 n -0000974962 00000 n -0000975154 00000 n -0000975338 00000 n -0000975520 00000 n -0000975732 00000 n -0000975916 00000 n -0000976100 00000 n -0000976285 00000 n -0000976470 00000 n -0000976654 00000 n -0000976838 00000 n -0000977024 00000 n -0000977208 00000 n -0000977394 00000 n -0000977577 00000 n -0000978072 00000 n -0000984103 00000 n -0000984287 00000 n -0000984637 00000 n -0000989591 00000 n -0000989775 00000 n -0000989959 00000 n -0000990143 00000 n -0000990329 00000 n -0000990514 00000 n -0000990699 00000 n -0000990884 00000 n -0000991307 00000 n -0000997203 00000 n -0000997403 00000 n -0000997603 00000 n -0000997785 00000 n -0000997969 00000 n -0000998151 00000 n -0000998335 00000 n -0000998548 00000 n -0000998732 00000 n -0000998916 00000 n -0000999102 00000 n -0000999286 00000 n -0000999726 00000 n -0001005417 00000 n -0001005632 00000 n -0001005817 00000 n -0001006002 00000 n -0001006186 00000 n -0001006398 00000 n -0001006582 00000 n -0001006766 00000 n -0001006951 00000 n -0001007136 00000 n -0001007577 00000 n -0001013135 00000 n -0001013317 00000 n -0001013501 00000 n -0001013701 00000 n -0001013881 00000 n -0001014064 00000 n -0001014248 00000 n -0001014432 00000 n -0001014616 00000 n -0001014800 00000 n -0001014984 00000 n -0001015188 00000 n -0001015370 00000 n -0001015553 00000 n -0001015739 00000 n -0001015924 00000 n -0001016109 00000 n -0001016328 00000 n -0001016512 00000 n -0001017034 00000 n -0001023952 00000 n -0001024136 00000 n -0001024319 00000 n -0001024503 00000 n -0001024687 00000 n -0001024870 00000 n -0001025054 00000 n -0001025238 00000 n -0001025421 00000 n -0001025604 00000 n -0001025788 00000 n -0001025972 00000 n -0001026184 00000 n -0001026367 00000 n -0001026550 00000 n -0001026737 00000 n -0001026919 00000 n -0001027121 00000 n -0001027341 00000 n -0001027525 00000 n -0001027712 00000 n -0001027897 00000 n -0001028084 00000 n -0001028642 00000 n -0001035182 00000 n -0001035399 00000 n -0001035582 00000 n -0001035877 00000 n -0001036062 00000 n -0001036361 00000 n -0001036546 00000 n -0001036830 00000 n -0001037014 00000 n -0001037199 00000 n -0001037496 00000 n -0001037680 00000 n -0001038120 00000 n -0001043245 00000 n -0001043429 00000 n -0001043739 00000 n -0001043922 00000 n -0001044282 00000 n -0001044644 00000 n -0001044827 00000 n -0001045131 00000 n -0001045316 00000 n -0001045598 00000 n -0001045782 00000 n -0001045966 00000 n -0001046264 00000 n -0001046448 00000 n -0001046632 00000 n -0001046816 00000 n -0001047124 00000 n -0001047308 00000 n -0001047492 00000 n -0001047801 00000 n -0001047987 00000 n -0001048286 00000 n -0001048472 00000 n -0001048755 00000 n -0001048940 00000 n -0001049126 00000 n -0001049418 00000 n -0001049605 00000 n -0001050170 00000 n -0001055552 00000 n -0001055737 00000 n -0001056037 00000 n -0001056222 00000 n -0001056528 00000 n -0001056712 00000 n -0001057017 00000 n -0001057324 00000 n -0001057508 00000 n -0001057797 00000 n -0001058088 00000 n -0001058273 00000 n -0001058573 00000 n -0001058757 00000 n -0001059064 00000 n -0001059248 00000 n -0001059530 00000 n -0001059714 00000 n -0001060012 00000 n -0001060196 00000 n -0001060502 00000 n -0001060686 00000 n -0001060997 00000 n -0001061181 00000 n -0001061482 00000 n -0001061667 00000 n -0001061963 00000 n -0001062148 00000 n -0001062443 00000 n -0001062630 00000 n -0001062914 00000 n -0001063506 00000 n -0001068805 00000 n -0001068990 00000 n -0001069281 00000 n -0001069466 00000 n -0001069650 00000 n -0001069966 00000 n -0001070151 00000 n -0001070453 00000 n -0001070639 00000 n -0001070824 00000 n -0001071144 00000 n -0001071466 00000 n -0001071650 00000 n -0001071930 00000 n -0001072114 00000 n -0001072298 00000 n -0001072582 00000 n -0001072766 00000 n -0001073062 00000 n -0001073246 00000 n -0001073554 00000 n -0001073740 00000 n -0001073925 00000 n -0001074110 00000 n -0001074296 00000 n -0001074591 00000 n -0001074777 00000 n -0001075333 00000 n -0001080520 00000 n -0001080705 00000 n -0001081001 00000 n -0001081185 00000 n -0001081476 00000 n -0001081660 00000 n -0001081845 00000 n -0001082143 00000 n -0001082328 00000 n -0001082687 00000 n -0001083048 00000 n -0001083232 00000 n -0001083531 00000 n -0001083715 00000 n -0001084028 00000 n -0001084343 00000 n -0001084527 00000 n -0001084817 00000 n -0001085001 00000 n -0001085299 00000 n -0001085483 00000 n -0001085784 00000 n -0001086087 00000 n -0001086272 00000 n -0001086572 00000 n -0001086757 00000 n -0001087060 00000 n -0001087246 00000 n -0001087546 00000 n -0001087732 00000 n -0001088035 00000 n -0001088221 00000 n -0001088511 00000 n -0001089121 00000 n -0001094471 00000 n -0001094656 00000 n -0001094940 00000 n -0001095124 00000 n -0001095421 00000 n -0001095605 00000 n -0001095887 00000 n -0001096072 00000 n -0001096354 00000 n -0001096539 00000 n -0001096807 00000 n -0001096991 00000 n -0001097298 00000 n -0001097482 00000 n -0001097765 00000 n -0001097949 00000 n -0001098232 00000 n -0001098416 00000 n -0001098750 00000 n -0001099085 00000 n -0001099269 00000 n -0001099551 00000 n -0001099737 00000 n -0001100037 00000 n -0001100221 00000 n -0001100521 00000 n -0001100706 00000 n -0001101010 00000 n -0001101196 00000 n -0001101485 00000 n -0001101671 00000 n -0001102263 00000 n -0001107462 00000 n -0001107762 00000 n -0001107946 00000 n -0001108241 00000 n -0001108425 00000 n -0001108719 00000 n -0001108903 00000 n -0001109197 00000 n -0001109383 00000 n -0001109682 00000 n -0001109867 00000 n -0001110149 00000 n -0001110333 00000 n -0001110636 00000 n -0001110820 00000 n -0001111004 00000 n -0001111188 00000 n -0001111372 00000 n -0001111655 00000 n -0001111841 00000 n -0001112135 00000 n -0001112321 00000 n -0001112620 00000 n -0001112805 00000 n -0001113101 00000 n -0001113286 00000 n -0001113575 00000 n -0001113762 00000 n -0001114053 00000 n -0001114627 00000 n -0001120096 00000 n -0001120281 00000 n -0001120580 00000 n -0001120765 00000 n -0001120950 00000 n -0001121136 00000 n -0001121426 00000 n -0001121611 00000 n -0001121915 00000 n -0001122100 00000 n -0001122395 00000 n -0001122580 00000 n -0001122870 00000 n -0001123055 00000 n -0001123356 00000 n -0001123659 00000 n -0001123844 00000 n -0001124143 00000 n -0001124618 00000 n -0001127994 00000 n -0001129714 00000 n -0001131985 00000 n -0001132073 00000 n -0001132313 00000 n -0001133628 00000 n -trailer -<< - /Size 5278 - /Root 5277 0 R - /Info 5275 0 R - /ID [(HHwsV4w2OKoHWq5hDV/GeA==) (8/8Hb0n3/ti5Ewx/bKL9Ww==)] ->> -startxref -1135503 -%%EOF \ No newline at end of file diff --git a/scripts/snapshots/translation-prompt-v4/request-response.expected.json b/scripts/snapshots/translation-prompt-v4/request-response.expected.json index c5f0822791..286c07b62a 100644 --- a/scripts/snapshots/translation-prompt-v4/request-response.expected.json +++ b/scripts/snapshots/translation-prompt-v4/request-response.expected.json @@ -8,11 +8,11 @@ }, { "role": "user", - "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n- Join DeepSeek Harness Discord community.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[MIT](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" + "content": "# DeepSeek Harness\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com).\n\nIt uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis), whose design is described in [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper).\n\n## Developer preview\n\nDeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.**\n\n## Run\n\n### Run from `npm`\n\nInstall `Node.js`, then run:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\nThe command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md).\n\n### Run from source\n\nTo run from a repository checkout:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## Community and support\n\n- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions).\n- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability.\n- Join DeepSeek Harness Discord community.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Development\n\nStart with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md).\n\nFor agents, follow [AGENTS.md](AGENTS.md).\n\n## License\n\n[MIT](LICENSE)\n\nThird-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n" }, { "role": "assistant", - "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 话题,便于被发现。\n- 欢迎加入 DeepSeek Harness 企微群:扫码添加企微小助手并填写入群问卷,完成后小助手会邀请你入群。\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
企微小助手入群问卷微信公众号
\"DeepSeek\"DeepSeek\"DeepSeek
\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[MIT](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" + "content": "# DeepSeek Harness\n\n[English](README.md) | 中文\n\nDeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开发的开源 agent harness(智能体框架)。\n\n它采用**一切皆插件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动,其设计参见论文 [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper)。\n\n## 开发者预览\n\nDeepSeek Harness 目前处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**\n\n## 运行\n\n### 通过 `npm` 运行\n\n安装 `Node.js`,然后运行:\n\n```sh\nnpx @deepseek-ai/dsh web\n```\n\n该命令会启动 Web UI,默认地址为 `http://127.0.0.1:3080`。详见 [Web UI 指南](docs/user/guide/index.md)。\n\n### 从源码运行\n\n如需从仓库源码运行:\n\n```sh\ngit clone https://github.com/deepseek-ai/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n```\n\n## 社区与支持\n\n- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) 提交反馈或 bug 报告。\n- 为你的插件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) 话题,便于被发现。\n- 欢迎加入 DeepSeek Harness 企微群:扫码添加企微小助手并填写入群问卷,完成后小助手会邀请你入群。\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
企微小助手入群问卷微信公众号
\"DeepSeek\"DeepSeek\"DeepSeek
\n\n## 参与贡献\n\n参见 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 开发\n\n请先阅读[开发指南](docs/development.md)与[架构文档](docs/architecture.md)。\n\n面向 agent:请遵循 [AGENTS.md](AGENTS.md)。\n\n## 许可证\n\n[MIT](LICENSE)\n\n第三方依赖及其许可证见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。\n" }, { "role": "user", From 8a954b2eca50e4aa77c928d7ada40c0bff6135eb Mon Sep 17 00:00:00 2001 From: imccyu Date: Thu, 13 Aug 2026 18:39:06 +0800 Subject: [PATCH 079/103] release(dsh): 0.1.0-rc.3 --- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package.json | 2 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- packages/attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- packages/client/ui-directory-picker-browse/package.json | 2 +- packages/client/ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- packages/client/ui-message-feedback/package.json | 2 +- packages/client/ui-model-selection/package.json | 2 +- packages/client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- packages/client/ui-settings-general/package.json | 2 +- packages/client/ui-settings-models/package.json | 2 +- packages/client/ui-settings-plugin-inventory/package.json | 2 +- packages/client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- packages/client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- packages/code-runtime/code-runtime-worker-thread/package.json | 2 +- packages/code-runtime/code-runtime/package.json | 2 +- packages/compaction/command-compact/package.json | 2 +- packages/compaction/compaction-basic/package.json | 2 +- packages/compaction/compaction-tool-result-pruner/package.json | 2 +- packages/compaction/compaction/package.json | 2 +- packages/context/agent-instructions/package.json | 2 +- packages/context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- packages/core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- packages/core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- packages/credentials/credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- packages/examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- packages/extensions/cordis-client-runner/package.json | 2 +- packages/extensions/cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- packages/feedback/command-feedback/package.json | 2 +- packages/feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- packages/fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- packages/fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- packages/guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- packages/host/directory-picker-auto/package.json | 2 +- packages/host/directory-picker-browse/package.json | 2 +- packages/host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- packages/identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- packages/interaction/permission-presets/package.json | 2 +- packages/interaction/tool-ask-user/package.json | 2 +- packages/interaction/user-approval/package.json | 2 +- packages/interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- packages/runtime-diagnostics/invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- packages/sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- packages/session-query/session-log-export/package.json | 2 +- packages/session-query/session-query-sqlite/package.json | 2 +- packages/session-query/session-query/package.json | 2 +- packages/session-query/tool-session-query/package.json | 2 +- packages/session/session-checkpoint-policy/package.json | 2 +- packages/session/session-persistence-jsonl/package.json | 2 +- packages/session/session-persistence-sqlite/package.json | 2 +- packages/session/session-persistence/package.json | 2 +- packages/session/session-projection-cache/package.json | 2 +- packages/session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- packages/session/session-telemetry-otel/package.json | 2 +- packages/session/session-telemetry/package.json | 2 +- packages/session/session-title-all-prompts-llm/package.json | 2 +- packages/session/session-title-first-prompt-llm/package.json | 2 +- packages/session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- packages/shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- packages/subagent/subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- packages/subagent/subagent-dsh-sdk/package.json | 2 +- packages/subagent/subagent-fork-in-process/package.json | 2 +- packages/subagent/subagent-in-process-driver/package.json | 2 +- packages/subagent/subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- packages/subagent/tool-subagent-control/package.json | 2 +- packages/subagent/tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- packages/subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- packages/test-support/acp-snapshot/package.json | 2 +- packages/test-support/agent-loop-testkit/package.json | 2 +- packages/test-support/client-runtime/package.json | 2 +- packages/test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- packages/test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- packages/web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- packages/workflow/workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- 222 files changed, 222 insertions(+), 222 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index eddb8a4ad7..35cf0db4d2 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/apps/web/package.json b/apps/web/package.json index f1f808b55e..e80564061c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/package.json b/package.json index e9a8d4d86c..db7a5906ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "license": "MIT", "private": true, "type": "module", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index da4944efb8..cd8b9f7aff 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index ec0296f7c8..7fab738249 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index a0f43738b5..9e37b93a98 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly and Host Agent/Session lookup policy", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index ddbe0af2e4..646e228e24 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index 792f94011f..06ff35a5f4 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index fde0fb71b7..c6b15efa93 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index a18bcf1169..5654d706a7 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index ce21f68eec..3be7faca39 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 46fb8dd207..f865671c2e 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 660b8fc2a7..1193ebdc5e 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 107d452465..00c4e4192c 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index 3b559386cd..a864242f37 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index e59a558449..db90c32eb9 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index fc9408e807..85ebb312f4 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 82a7bc48fc..c527e93fb3 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-runtime", "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index 4bab5feb6e..348aea9b67 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-schema-form", "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index e841e71c3b..af20fd2fa8 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 1f21f5fe46..862c03dd5e 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index f035e7cc98..8737f3c557 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 96a8c3b33c..a3a2ed8ebb 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index ad76a0d057..0a5fdbfed0 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Produced-files turn tail and clickable final-response file references for Web", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index 141a52d776..f8e8a1cc22 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index d2edd0ef92..0490ee9f60 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index e822e253ea..da15f6ec8a 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index 27bb4435cf..88b182b261 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index d9ca8dd4f8..2ea29ad1d8 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list: live registry state mirrored from session/jobs frames", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index 06ff884982..969a2668b4 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 4dbd57dd1b..dc28b477a7 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 3cfe5e71cd..8eb23d05d7 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection: the /model popupSelect over session.models / session.selectModel", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index e86e3fdbb1..9bd4e5033d 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index aedf12b166..34de2b8ce5 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index bc599663a1..8882d0f20a 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index c79c1882e7..812e1d72ee 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 5660cf6dfc..8ef6eea50b 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 5d486e3fcd..4546499cc9 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index ece83f4239..91964dbe05 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index 8b20beeede..0d8a39a442 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index 7c5eace021..b8846b531f 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index e7b9b82963..068e17ca77 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index 1778a2b500..bed532ef43 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index af795695e3..e23c279d7b 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index fd83879158..83c1910181 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 3095da5315..ddd3711a85 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 70c4ea896f..1b93dd1511 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index a784d45ee2..c2893aeb47 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-user-questions", "description": "Web ask_user_question feature: host tool mount plus composer-takeover question UI", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index 4b483790b1..f1c3b609ab 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workflow-run", "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index d1853e9db0..796f1450d9 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workspace", "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index c510265ecf..e112a1e9c0 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web-react", "description": "Shell-side React glue: createSlotRenderer, SessionProvider, bindSnapshotSelector (uSES bridge), useInvoke", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/client/web/package.json b/packages/client/web/package.json index 4b19398e98..3b676db1b7 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web", "description": "Web shell kernel: bootWebShell (module system holding + seed table + two-stage boot + AppRoot gate + app-shell assembly entry), consumed by the apps/web vite entry", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index 4959fe12be..03d7084062 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime-worker-thread", "description": "Worker-thread implementation of the DeepSeek Harness code-execution seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index 959d21ba51..8233b3aba9 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime", "description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index 8854e8db63..67c0610b52 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-compact", "description": "Human-facing slash command for explicit session compaction", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 236b48e3fe..605b24bb31 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-basic", "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index d89264fdb2..ffe84c4e9c 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-tool-result-pruner", "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index a8610e513d..a2a649a508 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction", "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index ccd3112a31..5472ced4dd 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-instructions", "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index 296757922a..7840b2998e 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-reference", "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 40765701ee..792c55a490 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-time-context", "description": "Opt-in durable per-step context with the current time and elapsed time", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 04697bf3a5..a36b7ba3d2 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tmux-context", "description": "Opt-in durable per-step context with this agent's tmux pane and window location", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index aecd485f17..bf6158f8a8 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-default-model", "description": "Default model selection shared by Agent entry points", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index fa882280ef..077d952604 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop", "description": "The concrete agent loop plugin for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index 2c511c1541..2962be0612 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-tool-presentation", "description": "Agent-plane presentation selector: composes one agent's tools as Code Mode, native, or both", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index 118ac28d1f..22da562364 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent", "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index 168ca36ea9..f3e9196064 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-scope", "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/session/package.json b/packages/core/session/package.json index 8b9e5457a9..ba3d3f76c6 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session", "description": "Event-sourced session store for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index b28b528319..8a7de9b5af 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-system-prompt", "description": "System prompt assembly registry for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index 5f27e77709..220d4008a6 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tools", "description": "Tool registry and execution pipeline for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index 777c251ab4..b2bb85e461 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials-local", "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index 6ff436fca4..dba18e4e56 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials", "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index 0b59ecfba1..55b2da23f5 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-e2b", "description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index 247644144d..9aa5741a13 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-e2b", "description": "E2B filesystem implementation for DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index 2aeaab41ce..b29e21625b 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-e2b", "description": "E2B subprocess implementation for DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index e49e3804a2..0c723466df 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-demo", "description": "ACP automation server app: agent spine + JSONL persistence + ACP transport, with a JSON-RPC stdio bin", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index 6c2bcadc8f..14172e579b 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-spine-demo", "description": "The default executor-less/UI-less agent spine with fallback session titles, provider-routed retry, and optional persisted goals", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index c40abc8c64..c9ee7b3cfb 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-demo", "description": "Bin that boots an external Cordis config for the stdio JSON-RPC SDK runtime", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index ababeff94e..23e1867c17 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-client-runner", "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 5edfc35cb6..5abea4abf2 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-host-runner", "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index 63afbb3c9e..08ef69e353 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-cordis", "description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 8b28ce1999..409109a166 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-cordis", "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index 0993db9df3..f8fd2e0e0b 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-feedback", "description": "Log-only session feedback producer and human-facing slash command", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index a77d665079..64dd9e64ca 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-message-feedback", "description": "Lifecycle-bound per-message rating and note sidecar for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index c0fb7a43da..54f885e3bb 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-local", "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index 88d8db9e90..3819108677 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-observation-policy", "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index a492a10004..01fc46ea7a 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-sandbox", "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index d4bb43ed0c..79b688f5ee 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs", "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index ace193ceca..85d8e37e24 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs-search", "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index 2275cf9133..9ea0b88864 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs", "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index a9628c108b..f2a593e62a 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-str-replace-editor", "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index e6849d82e6..2337a35c2c 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-goal", "description": "Human-facing slash command for persisted same-session goals", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index 3660b717f6..bdce5bdcf2 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal-round-driver", "description": "Race-fenced same-session goal-round driver", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index ddac8fd841..32f3b48708 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal", "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index 3514474923..a085c7f76a 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-goal", "description": "Model-facing same-session goal tools with execution-time authority checks", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 62d46dc385..320d6c43c7 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-repeat-tool-reminder", "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index 1af9607ec3..106cbad2b8 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-call-timeout-policy", "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 93301b0f98..97414e9f46 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index 5d82313f31..37c6c63535 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 594710190b..ee66349c0d 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index 6af3b2ee18..23a1c76174 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-apiproxy", "description": "API gateway: the ApiProxy contract (api/), the fetch carrier pair (fetch/), and the host-side gateway plugin providing ctx.apiProxy", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index 6d4f28ab66..fd9cc0b7b5 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-auto", "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index edac737c8e..fb07cfedaf 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-browse", "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index 75642b724f..8ff37ffc2a 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-native", "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index e9ec712ad8..2f84bed9c8 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker", "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 4aa9d1621d..e1b18222dc 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-frontend-static", "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving the built frontend with index-tap injection, traversal rejection, and SPA index fallback", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 4639d18bc5..6ae5a80a06 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-plugin-inventory", "description": "Read-only Remote projection of current Cordis Loader plugin state", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index f19d959473..f8aa400f8a 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-webserver", "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index 49c286a5ef..3e540a776f 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-anonymous-user-id", "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 3b7079f086..3daba8dba3 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-commands", "description": "Plugin-owned human command registry for DeepSeek Harness UIs", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index d62c3c9d96..ed37d1e7ef 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-permission-presets", "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index 36fb55a70f..aa57ba0489 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ask-user", "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index 38f8597c8a..887aaaa754 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-approval", "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 788be37e70..33a6029fab 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-questions", "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 8e430bec1f..d149405cfa 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs-local", "description": "Process-local implementation of the DeepSeek Harness background job registry seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index 39da6cc9dc..99e9ee9d02 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs", "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index b845ff403e..46742c8938 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-jobs", "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index 5b6a211384..9f8893343a 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-deepseek", "description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 554e21912f..5398d8c6ab 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-pi-ai", "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index 68752af10b..5dccc00233 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-retry", "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index 7761bdb067..eed4acd52f 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm", "description": "Provider-neutral LLM service interface for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index 627843b9a3..05bfb1b6b6 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-token-meter", "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index 391c5e7a59..ad7fee6517 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp-stdio", "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index bca11459ec..d818da7d15 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp", "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index be37fd3338..fa27206e9b 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-lsp", "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index 715809d404..87dc047897 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-client", "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index 1b2ed4025c..61c034f45e 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plan-mode", "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index 8f83bc23dd..c2fb5d8a94 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-presets", "description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index f5e3a6e622..ede7663288 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-persona", "description": "Composition-authored deployment persona section for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index f6454f3f63..4f1f3ac4f2 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-invariants", "description": "Registry service for package-owned DeepSeek Harness runtime invariants", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index e1ee18a333..0c53b6d5f1 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-local", "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index 3daa764872..781176a559 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-policy", "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index b7ce9b118d..55ef73f0d7 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-windows-acl", "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index 2f039e800e..0c432d94dc 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox", "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index baab56db27..4df4700c4f 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-schedule", "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index 220c8dd808..24c1c4fbce 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-client", "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index 62cdcbd3ed..e1670074ec 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-protocol", "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index 3316a70452..e7d6d87131 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-server", "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index d26b8e243b..3ff6f6778e 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, "repository": { "type": "git", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index 96559c1224..acf8da0d1c 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query-sqlite", "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index b96aa1daeb..bf6aff4744 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query", "description": "Combined session query service contract with concrete reads, traces, and filters", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index ee4f69d1ca..82dee299e5 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-session-query", "description": "Workspace-authorized model-facing session history search, trace, and event read tools", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index 54f80e2276..0703e5a094 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-checkpoint-policy", "description": "Semantic session durability checkpoints before model requests and tool side effects", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index f59aa7400c..80307e6b33 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-jsonl", "description": "JSONL durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index 0fe1be4139..68d183b203 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-sqlite", "description": "SQLite durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index 198569e7cf..f8c2958bb0 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence", "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index dc562efc04..d302d91bac 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection-cache", "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session projection checkpoints over the domain data form, throttled write-behind, and the cold-read ladder (cache row + persistence tail replay)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index 53b2de2ee8..f5e4c769ea 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection", "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index 75cafa78d8..43180df5c2 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-stats", "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 7ea1578dcc..228b9466f1 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry-otel", "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index afb4fdd3dd..a44a737344 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry", "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 178d84240a..04c06716ca 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 6a316fd475..8a3ae97227 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-first-prompt-llm", "description": "First-message LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index 6106d524dd..12ccb931b3 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-llm", "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index 5fc6d03262..816f82b128 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title", "description": "Log-backed session title service and provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index 106f052544..1ebaee7306 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings-file", "description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 194d36827a..1d951bf0fb 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings", "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index 936590f662..e076002664 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-local", "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index 19e95626e9..d2e1fc5a76 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index 5e63c99924..2c6573459d 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-local", "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index c62b9aa580..690bd274eb 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index 305f8e3fb5..494eadc19e 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell-env", "description": "Tool-independent managed DSH_* shell environment registry", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index 7792bcedbb..b1857073b9 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell", "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index d37d0db078..f424965e60 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash-persistent", "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index e96bbdc0b1..1e451f1833 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash", "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index 2f46e77898..5233270514 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh", "description": "Model-facing pwsh tool over the bash executor seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index 76bed1278c..da6abceb4c 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 82a6674d49..851f955896 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-filesystem", "description": "Local filesystem skill provider for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index 849fe30585..8bc15021e5 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill", "description": "Agent skill provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index f8de981868..9652462804 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-skill", "description": "Model-facing skill loading tool for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index 6677860f64..de1896225f 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-local", "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index 5e54555275..016fa0fae0 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-policy", "description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index 5cc485a211..489002a09b 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill", "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index ff9f54b4e4..ef1210c8b4 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-domain", "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index d74204fa58..ed71a2f5d2 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-json", "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 6fc0eecfd4..58467e56d6 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-sqlite", "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index d2f8a2edd8..ad172e45b4 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage", "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index 2454b4d49c..6dd8d62f76 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-acp", "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index a65e3b1f0f..a65f657b49 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-claude-code", "description": "One-shot Claude Code subagent provider over the official Agent SDK", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 07c13c74bb..2e586419ad 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-codex", "description": "One-shot Codex subagent provider over the official app-server protocol", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 09bd68a123..a035e63754 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-dsh-sdk", "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index 52b228cb22..793bde04cb 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-fork-in-process", "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index afc521e1be..302485b3ff 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-in-process-driver", "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index c27794a1ea..e09461f8ba 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-spawn-in-process", "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 2d15236c80..5d82109158 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent", "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index 9f55b93434..78cc91691c 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-control", "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index 1e08138c67..63b57647ba 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-report", "description": "Child-scoped report tool over ctx.subagents continuations", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index ad4a75519b..98e0d688df 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent", "description": "Model-facing subagent delegation tool over the ctx.subagents seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index 74b480ae82..2536824f06 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-local", "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 2465543770..36626758b2 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess", "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index f3808f7d2b..ca04644d63 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal-bash", "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index e241e732ad..b816fdf310 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal", "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index 49ac22f6e1..1f021edbbe 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index 859b7d6465..0dde8c3b07 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-snapshot", "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index 6badaa4209..99357186d5 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop-testkit", "description": "Shared prerequisite mounting for tests that exercise the concrete agent loop", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index 414ebfe9f8..55a25618d1 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-test-runtime", "description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + web-react renderer with test-owned session/workspace doubles for feature specs", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index 6e859fe18f..abee2220c6 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-mock-server", "description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 5521dbd452..113196f84d 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-replay", "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index 5614a89df8..f75b81fd7c 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-loader-smoke", "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index 37cd12a4de..25d70c2a47 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-todo", "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index bac004c701..e3f8ef6d8f 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-generator", "description": "TypeScript project analyzer and model-driven Typert artifact generator", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index ad412e2394..c720d44faf 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-loader", "description": "Loader integration for generated Typert package contributions", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 7c4b26d240..412fb42fb1 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-protocol", "description": "Compiler-independent Remote metadata and Typert provider protocols", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index c9c9927246..e42229336c 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-registry", "description": "Runtime registry for generated package reflection and Zod schemas", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index f7945c29c9..ca034b8fac 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-atomic-write", "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index 025fa6b37e..4ce02e0f95 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-brand", "description": "Type-only Branded nominal-typing primitive for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index d3bb01e1dc..ae0bc0a967 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-home-paths", "description": "Shared filesystem path helpers for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index 6957da3460..969380f311 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-launch-environment", "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index af37c74ec6..101eec7b54 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-native-command", "description": "Zero-dependency no-shell execFile runner for host-native OS integrations: utf8 stdio capture, abort propagation, Windows hide", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index 3fdab64947..894735bfb0 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-output-retention", "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index 9d7512feae..bd71474ba3 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-timeout", "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index 59355865b6..d8eef81ffd 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-web", "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index 9dabdaed99..9646f059bf 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-fetch-http", "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index 591059cd1c..b003e20267 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-deepseek", "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 82fc91317a..27f7b1d96a 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-exa", "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 67b13d7699..39f363600f 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-perplexity", "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 46c98ddebd..0911a67b0d 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web", "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index dfcd31d8b7..8eaad6fd9e 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index 6bf75815f9..259e4e054c 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workflow", "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index 4d26500342..1234bc85fd 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow-worker-thread", "description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index 4ffd4ce86c..00d3ccf760 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow", "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index 9206b08dec..2672ae7246 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace", "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.3", "publishConfig": { "access": "restricted" }, From 8c1e8d989070f795c0208794b9498defb4a390a8 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:05:10 +0800 Subject: [PATCH 080/103] build(release): publish the dsh family publicly Every release member now declares publishConfig.access: public, so the scope no longer mixes levels: the 221 packages/*/* and apps/* manifests join the vendored framework and the native packages. check-workspace-constraints drops the per-sequence expectation and holds every release member to public, which is what stops a member from drifting back. Access is a property of the package, not of a version: the dsh packages already published as restricted become world-readable at their next publication. --- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- packages/attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- packages/client/ui-directory-picker-browse/package.json | 2 +- packages/client/ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- packages/client/ui-message-feedback/package.json | 2 +- packages/client/ui-model-selection/package.json | 2 +- packages/client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- packages/client/ui-settings-general/package.json | 2 +- packages/client/ui-settings-models/package.json | 2 +- packages/client/ui-settings-plugin-inventory/package.json | 2 +- packages/client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- packages/client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- .../code-runtime/code-runtime-worker-thread/package.json | 2 +- packages/code-runtime/code-runtime/package.json | 2 +- packages/compaction/command-compact/package.json | 2 +- packages/compaction/compaction-basic/package.json | 2 +- .../compaction/compaction-tool-result-pruner/package.json | 2 +- packages/compaction/compaction/package.json | 2 +- packages/context/agent-instructions/package.json | 2 +- packages/context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- packages/core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- packages/core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- packages/credentials/credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- packages/examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- packages/extensions/cordis-client-runner/package.json | 2 +- packages/extensions/cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- packages/feedback/command-feedback/package.json | 2 +- packages/feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- packages/fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- packages/fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- packages/guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- packages/host/directory-picker-auto/package.json | 2 +- packages/host/directory-picker-browse/package.json | 2 +- packages/host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- packages/identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- packages/interaction/permission-presets/package.json | 2 +- packages/interaction/tool-ask-user/package.json | 2 +- packages/interaction/user-approval/package.json | 2 +- packages/interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- packages/runtime-diagnostics/invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- packages/sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- packages/session-query/session-log-export/package.json | 2 +- packages/session-query/session-query-sqlite/package.json | 2 +- packages/session-query/session-query/package.json | 2 +- packages/session-query/tool-session-query/package.json | 2 +- packages/session/session-checkpoint-policy/package.json | 2 +- packages/session/session-persistence-jsonl/package.json | 2 +- packages/session/session-persistence-sqlite/package.json | 2 +- packages/session/session-persistence/package.json | 2 +- packages/session/session-projection-cache/package.json | 2 +- packages/session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- packages/session/session-telemetry-otel/package.json | 2 +- packages/session/session-telemetry/package.json | 2 +- packages/session/session-title-all-prompts-llm/package.json | 2 +- packages/session/session-title-first-prompt-llm/package.json | 2 +- packages/session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- packages/shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- packages/subagent/subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- packages/subagent/subagent-dsh-sdk/package.json | 2 +- packages/subagent/subagent-fork-in-process/package.json | 2 +- packages/subagent/subagent-in-process-driver/package.json | 2 +- packages/subagent/subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- packages/subagent/tool-subagent-control/package.json | 2 +- packages/subagent/tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- packages/subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- packages/test-support/acp-snapshot/package.json | 2 +- packages/test-support/agent-loop-testkit/package.json | 2 +- packages/test-support/client-runtime/package.json | 2 +- packages/test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- packages/test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- packages/web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- packages/workflow/workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- scripts/check-workspace-constraints.ts | 5 ++--- 222 files changed, 223 insertions(+), 224 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 35cf0db4d2..48869199d5 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -3,7 +3,7 @@ "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/apps/web/package.json b/apps/web/package.json index e80564061c..d5b75e4d63 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -3,7 +3,7 @@ "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index cd8b9f7aff..34b2344992 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -3,7 +3,7 @@ "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index 7fab738249..72debdce2d 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -3,7 +3,7 @@ "description": "Typert Remote Host dispatcher and Client API endpoint", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index 9e37b93a98..b7afbfc396 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -3,7 +3,7 @@ "description": "Remote BFF assembly and Host Agent/Session lookup policy", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index 646e228e24..2bd0b97db0 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -3,7 +3,7 @@ "description": "Private content-addressed DSH_HOME attachment storage", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index 06ff35a5f4..ce6484003d 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -3,7 +3,7 @@ "description": "Durable immutable attachment storage seam for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index c6b15efa93..f2b2eb27df 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -3,7 +3,7 @@ "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index 5654d706a7..37b3c21939 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -3,7 +3,7 @@ "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 3be7faca39..ec6bdc08de 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -3,7 +3,7 @@ "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index f865671c2e..8ffd82b9b3 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -3,7 +3,7 @@ "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 1193ebdc5e..45398b9359 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -3,7 +3,7 @@ "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 00c4e4192c..1a15f1d93e 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -3,7 +3,7 @@ "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index a864242f37..c91c263d93 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -3,7 +3,7 @@ "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index db90c32eb9..930d68024b 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -3,7 +3,7 @@ "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index 85ebb312f4..e6020ad60c 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -3,7 +3,7 @@ "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index c527e93fb3..54a009975c 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -3,7 +3,7 @@ "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index 348aea9b67..ca9f4f11c5 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -3,7 +3,7 @@ "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index af20fd2fa8..c148386798 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -3,7 +3,7 @@ "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 862c03dd5e..c0866b4457 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -3,7 +3,7 @@ "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index 8737f3c557..8b337fb470 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -3,7 +3,7 @@ "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index a3a2ed8ebb..9d5aa90924 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -3,7 +3,7 @@ "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index 0a5fdbfed0..ac1ba0cd69 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -3,7 +3,7 @@ "description": "Produced-files turn tail and clickable final-response file references for Web", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index f8e8a1cc22..accebcb751 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -3,7 +3,7 @@ "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 0490ee9f60..4f7316d895 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -3,7 +3,7 @@ "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index da15f6ec8a..36e9ddf9d5 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -3,7 +3,7 @@ "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index 88b182b261..b0496c4ed6 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -3,7 +3,7 @@ "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index 2ea29ad1d8..5328762317 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -43,7 +43,7 @@ "directory": "packages/client/ui-jobs" }, "publishConfig": { - "access": "restricted" + "access": "public" }, "dependencies": { "react": "^18.2.0" diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index 969a2668b4..14f0965981 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -3,7 +3,7 @@ "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index dc28b477a7..62db69a2a1 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -3,7 +3,7 @@ "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 8eb23d05d7..99d284a97d 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -3,7 +3,7 @@ "description": "Model selection: the /model popupSelect over session.models / session.selectModel", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 9bd4e5033d..3f526027c6 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -3,7 +3,7 @@ "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 34de2b8ce5..84d472faef 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -3,7 +3,7 @@ "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index 8882d0f20a..b78f0273ca 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -3,7 +3,7 @@ "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 812e1d72ee..7ba7b58baa 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -3,7 +3,7 @@ "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 8ef6eea50b..7fc1f0af70 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -3,7 +3,7 @@ "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 4546499cc9..9e349081bf 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -3,7 +3,7 @@ "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index 91964dbe05..81b687cf50 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -3,7 +3,7 @@ "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index 0d8a39a442..b6bf16ab21 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -3,7 +3,7 @@ "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index b8846b531f..549e6ea948 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -3,7 +3,7 @@ "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index 068e17ca77..ee032c33b7 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -3,7 +3,7 @@ "description": "Web skill references and the dedicated skill tool row", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index bed532ef43..9584cbf429 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -3,7 +3,7 @@ "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index e23c279d7b..95570bf2e9 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -3,7 +3,7 @@ "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 83c1910181..598879a91f 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -3,7 +3,7 @@ "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index ddd3711a85..4bad8e7d29 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -3,7 +3,7 @@ "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 1b93dd1511..82918fb8d2 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -3,7 +3,7 @@ "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index c2893aeb47..599c6866f3 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -3,7 +3,7 @@ "description": "Web ask_user_question feature: host tool mount plus composer-takeover question UI", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index f1c3b609ab..d7069a47f2 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -3,7 +3,7 @@ "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index 796f1450d9..1e8c537bdc 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -3,7 +3,7 @@ "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index e112a1e9c0..0e89c09d1e 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -3,7 +3,7 @@ "description": "Shell-side React glue: createSlotRenderer, SessionProvider, bindSnapshotSelector (uSES bridge), useInvoke", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/client/web/package.json b/packages/client/web/package.json index 3b676db1b7..d7be460113 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -3,7 +3,7 @@ "description": "Web shell kernel: bootWebShell (module system holding + seed table + two-stage boot + AppRoot gate + app-shell assembly entry), consumed by the apps/web vite entry", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index 03d7084062..73cd2608f3 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -3,7 +3,7 @@ "description": "Worker-thread implementation of the DeepSeek Harness code-execution seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index 8233b3aba9..496dea1a45 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -3,7 +3,7 @@ "description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index 67c0610b52..b37e405d4e 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -3,7 +3,7 @@ "description": "Human-facing slash command for explicit session compaction", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 605b24bb31..ab64295ea8 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -3,7 +3,7 @@ "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index ffe84c4e9c..2f647a3b61 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -3,7 +3,7 @@ "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index a2a649a508..c86c15c516 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -3,7 +3,7 @@ "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index 5472ced4dd..1aa8650c9a 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -3,7 +3,7 @@ "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index 7840b2998e..0860d44a6a 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -3,7 +3,7 @@ "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 792c55a490..3351f3fd8d 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -3,7 +3,7 @@ "description": "Opt-in durable per-step context with the current time and elapsed time", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index a36b7ba3d2..53c8bb71bc 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -3,7 +3,7 @@ "description": "Opt-in durable per-step context with this agent's tmux pane and window location", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index bf6158f8a8..4430354728 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -3,7 +3,7 @@ "description": "Default model selection shared by Agent entry points", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index 077d952604..1975338845 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -3,7 +3,7 @@ "description": "The concrete agent loop plugin for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index 2962be0612..7c9f6d9983 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -3,7 +3,7 @@ "description": "Agent-plane presentation selector: composes one agent's tools as Code Mode, native, or both", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index 22da562364..bb37580ebe 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -3,7 +3,7 @@ "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index f3e9196064..8c51276427 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -3,7 +3,7 @@ "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/session/package.json b/packages/core/session/package.json index ba3d3f76c6..9972a1d089 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -3,7 +3,7 @@ "description": "Event-sourced session store for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index 8a7de9b5af..6a7a570e6a 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -3,7 +3,7 @@ "description": "System prompt assembly registry for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index 220d4008a6..967e52b32d 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -3,7 +3,7 @@ "description": "Tool registry and execution pipeline for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index b2bb85e461..debdc87429 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -3,7 +3,7 @@ "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index dba18e4e56..586a8bc65d 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -3,7 +3,7 @@ "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index 55b2da23f5..0b4605685b 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -3,7 +3,7 @@ "description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index 9aa5741a13..b0ff95d8e9 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -3,7 +3,7 @@ "description": "E2B filesystem implementation for DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index b29e21625b..db5640bf23 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -3,7 +3,7 @@ "description": "E2B subprocess implementation for DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index 0c723466df..5b0abd60f6 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -3,7 +3,7 @@ "description": "ACP automation server app: agent spine + JSONL persistence + ACP transport, with a JSON-RPC stdio bin", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index 14172e579b..1cf82845f7 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -3,7 +3,7 @@ "description": "The default executor-less/UI-less agent spine with fallback session titles, provider-routed retry, and optional persisted goals", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index c9ee7b3cfb..51ec7506a9 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -3,7 +3,7 @@ "description": "Bin that boots an external Cordis config for the stdio JSON-RPC SDK runtime", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index 23e1867c17..8c39fbefe0 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -3,7 +3,7 @@ "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 5abea4abf2..de481f11a5 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -3,7 +3,7 @@ "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index 08ef69e353..4f19fb8550 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -3,7 +3,7 @@ "description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 409109a166..422a345a34 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -3,7 +3,7 @@ "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index f8fd2e0e0b..281915a176 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -3,7 +3,7 @@ "description": "Log-only session feedback producer and human-facing slash command", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index 64dd9e64ca..c8c2e0930f 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -3,7 +3,7 @@ "description": "Lifecycle-bound per-message rating and note sidecar for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index 54f885e3bb..7a13c103ef 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -3,7 +3,7 @@ "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index 3819108677..76e700484a 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -3,7 +3,7 @@ "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 01fc46ea7a..7ad29c5279 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -3,7 +3,7 @@ "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index 79b688f5ee..7ce6276e37 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -3,7 +3,7 @@ "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index 85d8e37e24..76fa8ed1cd 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -3,7 +3,7 @@ "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index 9ea0b88864..8ee720735c 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -3,7 +3,7 @@ "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index f2a593e62a..68b513e07e 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -3,7 +3,7 @@ "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index 2337a35c2c..85af15e4d2 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -3,7 +3,7 @@ "description": "Human-facing slash command for persisted same-session goals", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index bdce5bdcf2..08eba46bb1 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -3,7 +3,7 @@ "description": "Race-fenced same-session goal-round driver", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index 32f3b48708..a09b2d136f 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -3,7 +3,7 @@ "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index a085c7f76a..fb4a4e918c 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -3,7 +3,7 @@ "description": "Model-facing same-session goal tools with execution-time authority checks", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 320d6c43c7..ec78728259 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -3,7 +3,7 @@ "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index 106cbad2b8..fe57465e56 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -3,7 +3,7 @@ "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 97414e9f46..2439594f00 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -3,7 +3,7 @@ "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index 37c6c63535..ce442062c4 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -3,7 +3,7 @@ "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index ee66349c0d..6e990be8f3 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -3,7 +3,7 @@ "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index 23a1c76174..a13ebe3615 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -3,7 +3,7 @@ "description": "API gateway: the ApiProxy contract (api/), the fetch carrier pair (fetch/), and the host-side gateway plugin providing ctx.apiProxy", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index fd9cc0b7b5..90a650cd42 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -3,7 +3,7 @@ "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index fb07cfedaf..0d2cfc91d6 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -3,7 +3,7 @@ "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index 8ff37ffc2a..02f67ff7ec 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -3,7 +3,7 @@ "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index 2f84bed9c8..b8b59b8199 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -3,7 +3,7 @@ "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index e1b18222dc..8a73033f67 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -3,7 +3,7 @@ "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving the built frontend with index-tap injection, traversal rejection, and SPA index fallback", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 6ae5a80a06..7567ba53eb 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -3,7 +3,7 @@ "description": "Read-only Remote projection of current Cordis Loader plugin state", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index f8aa400f8a..9b097ee95b 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -3,7 +3,7 @@ "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index 3e540a776f..f53735527e 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -3,7 +3,7 @@ "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 3daba8dba3..94c11b0867 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -3,7 +3,7 @@ "description": "Plugin-owned human command registry for DeepSeek Harness UIs", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index ed37d1e7ef..c9c5f7de52 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -3,7 +3,7 @@ "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index aa57ba0489..dc20d458e5 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -3,7 +3,7 @@ "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index 887aaaa754..7479629908 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -3,7 +3,7 @@ "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 33a6029fab..00fee7bc5e 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -3,7 +3,7 @@ "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index d149405cfa..780fe994c6 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -3,7 +3,7 @@ "description": "Process-local implementation of the DeepSeek Harness background job registry seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index 99e9ee9d02..be234da20b 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -3,7 +3,7 @@ "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index 46742c8938..2ffec6a208 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -3,7 +3,7 @@ "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index 9f8893343a..d8565aa0cc 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -3,7 +3,7 @@ "description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 5398d8c6ab..d5d90c703a 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -3,7 +3,7 @@ "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index 5dccc00233..c95679109c 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -3,7 +3,7 @@ "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index eed4acd52f..b4f5b563b8 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -3,7 +3,7 @@ "description": "Provider-neutral LLM service interface for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index 05bfb1b6b6..2bde6bded5 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -3,7 +3,7 @@ "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index ad7fee6517..aacdf5e1c3 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -3,7 +3,7 @@ "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index d818da7d15..d137f0d82b 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -3,7 +3,7 @@ "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index fa27206e9b..2b430e7538 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -3,7 +3,7 @@ "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index 87dc047897..ae78a9ff29 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -3,7 +3,7 @@ "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index 61c034f45e..7b3b03fb7f 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -3,7 +3,7 @@ "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index c2fb5d8a94..3a7349ae7a 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -3,7 +3,7 @@ "description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index ede7663288..8bedadc8b1 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -3,7 +3,7 @@ "description": "Composition-authored deployment persona section for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index 4f1f3ac4f2..67bcec0dab 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -3,7 +3,7 @@ "description": "Registry service for package-owned DeepSeek Harness runtime invariants", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index 0c53b6d5f1..77454be823 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -3,7 +3,7 @@ "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index 781176a559..c168915f80 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -3,7 +3,7 @@ "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index 55ef73f0d7..c554e7e097 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -3,7 +3,7 @@ "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index 0c432d94dc..d25beb7e64 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -3,7 +3,7 @@ "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index 4df4700c4f..bbeea9820c 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -3,7 +3,7 @@ "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index 24c1c4fbce..c937e62969 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -3,7 +3,7 @@ "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index e1670074ec..3cbaa653fd 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -3,7 +3,7 @@ "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index e7d6d87131..458eb0eb4c 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -3,7 +3,7 @@ "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index 3ff6f6778e..8c4322bb2e 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -2,7 +2,7 @@ "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", "version": "0.1.0-rc.3", - "publishConfig": { "access": "restricted" }, + "publishConfig": { "access": "public" }, "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index acf8da0d1c..d6f4e1868a 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -3,7 +3,7 @@ "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index bf6aff4744..254111c207 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -3,7 +3,7 @@ "description": "Combined session query service contract with concrete reads, traces, and filters", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index 82dee299e5..10a23c5388 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -3,7 +3,7 @@ "description": "Workspace-authorized model-facing session history search, trace, and event read tools", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index 0703e5a094..5c08a06a9d 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -3,7 +3,7 @@ "description": "Semantic session durability checkpoints before model requests and tool side effects", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index 80307e6b33..886ab65140 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -3,7 +3,7 @@ "description": "JSONL durable session persistence backend for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index 68d183b203..3b9da0d465 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -3,7 +3,7 @@ "description": "SQLite durable session persistence backend for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index f8c2958bb0..9853ea7d3c 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -3,7 +3,7 @@ "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index d302d91bac..7e94c1a9d4 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -3,7 +3,7 @@ "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session projection checkpoints over the domain data form, throttled write-behind, and the cold-read ladder (cache row + persistence tail replay)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index f5e4c769ea..6f5942e677 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -3,7 +3,7 @@ "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index 43180df5c2..db8a886126 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -3,7 +3,7 @@ "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 228b9466f1..0166ce1e71 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -3,7 +3,7 @@ "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index a44a737344..0faba54876 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -3,7 +3,7 @@ "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 04c06716ca..73c64d696f 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -3,7 +3,7 @@ "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 8a3ae97227..71a74c5ded 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -3,7 +3,7 @@ "description": "First-message LLM provider plugin for DeepSeek Harness session titles", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index 12ccb931b3..27c4268329 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -3,7 +3,7 @@ "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index 816f82b128..7271316afe 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -3,7 +3,7 @@ "description": "Log-backed session title service and provider registry for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index 1ebaee7306..3e0286b9cf 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -3,7 +3,7 @@ "description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 1d951bf0fb..5923cd1ff8 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -3,7 +3,7 @@ "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index e076002664..f31c28c821 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -3,7 +3,7 @@ "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index d2e1fc5a76..173afae7f6 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -3,7 +3,7 @@ "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index 2c6573459d..5fc60d4297 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -3,7 +3,7 @@ "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index 690bd274eb..63826e3818 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -3,7 +3,7 @@ "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index 494eadc19e..7853724584 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -3,7 +3,7 @@ "description": "Tool-independent managed DSH_* shell environment registry", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index b1857073b9..0c1478ece6 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -3,7 +3,7 @@ "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index f424965e60..b86d10f66f 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -3,7 +3,7 @@ "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index 1e451f1833..cc29a0f27e 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -3,7 +3,7 @@ "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index 5233270514..bacd902070 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -3,7 +3,7 @@ "description": "Model-facing pwsh tool over the bash executor seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index da6abceb4c..4582382169 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -3,7 +3,7 @@ "description": "Bundled dsh badge skill provider for DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 851f955896..09de6c073d 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -3,7 +3,7 @@ "description": "Local filesystem skill provider for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index 8bc15021e5..367a2ff1bd 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -3,7 +3,7 @@ "description": "Agent skill provider registry for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index 9652462804..e93b90e772 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -3,7 +3,7 @@ "description": "Model-facing skill loading tool for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index de1896225f..dc85f9f8f2 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -3,7 +3,7 @@ "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index 016fa0fae0..51283307f3 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -3,7 +3,7 @@ "description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index 489002a09b..7e90380eb0 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -3,7 +3,7 @@ "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index ef1210c8b4..352e060581 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -3,7 +3,7 @@ "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index ed71a2f5d2..5aa647cfdf 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -3,7 +3,7 @@ "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 58467e56d6..b6bcb80c7d 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -3,7 +3,7 @@ "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index ad172e45b4..90c60e7c30 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -3,7 +3,7 @@ "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index 6dd8d62f76..2648d07f70 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -3,7 +3,7 @@ "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index a65f657b49..3ebac1b270 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -3,7 +3,7 @@ "description": "One-shot Claude Code subagent provider over the official Agent SDK", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 2e586419ad..7fda872891 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -3,7 +3,7 @@ "description": "One-shot Codex subagent provider over the official app-server protocol", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index a035e63754..771f2a0638 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -3,7 +3,7 @@ "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index 793bde04cb..cf78ebd1d0 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -3,7 +3,7 @@ "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index 302485b3ff..cfb1de74d3 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -3,7 +3,7 @@ "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index e09461f8ba..1a44b8c144 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -3,7 +3,7 @@ "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 5d82109158..4e2f43834b 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -3,7 +3,7 @@ "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index 78cc91691c..8761f3c8b5 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -3,7 +3,7 @@ "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index 63b57647ba..fb58767c7e 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -3,7 +3,7 @@ "description": "Child-scoped report tool over ctx.subagents continuations", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index 98e0d688df..00c037f08d 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -3,7 +3,7 @@ "description": "Model-facing subagent delegation tool over the ctx.subagents seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index 2536824f06..be08694aef 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -3,7 +3,7 @@ "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 36626758b2..a32c331b3b 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -3,7 +3,7 @@ "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index ca04644d63..dcffdd2222 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -3,7 +3,7 @@ "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index b816fdf310..6f1e27bfd5 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -3,7 +3,7 @@ "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index 1f021edbbe..e81b86a866 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -3,7 +3,7 @@ "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index 0dde8c3b07..8b08b373d0 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -3,7 +3,7 @@ "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index 99357186d5..cabc54ed54 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -3,7 +3,7 @@ "description": "Shared prerequisite mounting for tests that exercise the concrete agent loop", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index 55a25618d1..d3536d73a1 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -3,7 +3,7 @@ "description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + web-react renderer with test-owned session/workspace doubles for feature specs", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index abee2220c6..10700b1366 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -3,7 +3,7 @@ "description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 113196f84d..13a4185ae1 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -3,7 +3,7 @@ "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index f75b81fd7c..e3cd9fbc36 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -3,7 +3,7 @@ "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index 25d70c2a47..9653fde0de 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -3,7 +3,7 @@ "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index e3f8ef6d8f..4498d52822 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -3,7 +3,7 @@ "description": "TypeScript project analyzer and model-driven Typert artifact generator", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index c720d44faf..35275205ea 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -3,7 +3,7 @@ "description": "Loader integration for generated Typert package contributions", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 412fb42fb1..48d3ad7455 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -3,7 +3,7 @@ "description": "Compiler-independent Remote metadata and Typert provider protocols", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index e42229336c..dcaf94726a 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -3,7 +3,7 @@ "description": "Runtime registry for generated package reflection and Zod schemas", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index ca034b8fac..1fc30a1d34 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -3,7 +3,7 @@ "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index 4ce02e0f95..d888e9bfb7 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -3,7 +3,7 @@ "description": "Type-only Branded nominal-typing primitive for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index ae0bc0a967..75b9a27a0a 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -3,7 +3,7 @@ "description": "Shared filesystem path helpers for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index 969380f311..55bc6f971a 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -3,7 +3,7 @@ "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index 101eec7b54..f0b9570344 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -3,7 +3,7 @@ "description": "Zero-dependency no-shell execFile runner for host-native OS integrations: utf8 stdio capture, abort propagation, Windows hide", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index 894735bfb0..fe87b66bb2 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -3,7 +3,7 @@ "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index bd71474ba3..81e9c80cfe 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -3,7 +3,7 @@ "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index d8eef81ffd..530f4f529e 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -3,7 +3,7 @@ "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index 9646f059bf..d6e376a8af 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -3,7 +3,7 @@ "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index b003e20267..ab58741b35 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -3,7 +3,7 @@ "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 27f7b1d96a..3b9c353329 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -3,7 +3,7 @@ "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 39f363600f..04f67e9b22 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -3,7 +3,7 @@ "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 0911a67b0d..22288d4be4 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -3,7 +3,7 @@ "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index 8eaad6fd9e..292ce3065e 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -3,7 +3,7 @@ "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index 259e4e054c..d83c8d59a3 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -3,7 +3,7 @@ "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index 1234bc85fd..07b426b436 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -3,7 +3,7 @@ "description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index 00d3ccf760..56a23e24fc 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -3,7 +3,7 @@ "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index 2672ae7246..5a7e61b8c8 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -3,7 +3,7 @@ "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", "version": "0.1.0-rc.3", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", diff --git a/scripts/check-workspace-constraints.ts b/scripts/check-workspace-constraints.ts index ee30778f3e..29742995ee 100644 --- a/scripts/check-workspace-constraints.ts +++ b/scripts/check-workspace-constraints.ts @@ -251,12 +251,11 @@ function checkWorkspace({ dir, manifest }: WorkspaceManifest): string[] { // public. A mixed scope is why no publish path passes `--access` — one flag // cannot serve both, so each packed manifest decides // ([rationale](../.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.md)). - const expectedAccess = dir.startsWith('vendor/') ? 'public' : 'restricted' if (manifest.private === true) { errors.push(`${label}: release member must not set "private": true`) } - if (manifest.publishConfig?.access !== expectedAccess) { - errors.push(`${label}: release member must set publishConfig.access to "${expectedAccess}"`) + if (manifest.publishConfig?.access !== 'public') { + errors.push(`${label}: release member must set publishConfig.access to "public"`) } if (manifest.repository?.type !== 'git' || manifest.repository.url !== publishedRepositoryUrl From abe560f81edebe5f6a5b62706ff502daa0dccd40 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:43:09 +0800 Subject: [PATCH 081/103] release(dsh): 0.1.0-rc.5 --- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package.json | 2 +- packages/acp/acp/package.json | 2 +- packages/api/gateway/package.json | 2 +- packages/api/remotes/package.json | 2 +- packages/attachment/attachment-local/package.json | 2 +- packages/attachment/attachment/package.json | 2 +- packages/boot/app-boot/package.json | 2 +- packages/boot/cmdline/package.json | 2 +- packages/bundle/base/package.json | 2 +- packages/bundle/headless/package.json | 2 +- packages/bundle/web-app/package.json | 2 +- packages/client/connection/package.json | 2 +- packages/client/hmr/package.json | 2 +- packages/client/locale/package.json | 2 +- packages/client/modules/package.json | 2 +- packages/client/runtime/package.json | 2 +- packages/client/schema-form/package.json | 2 +- packages/client/ui-agent-preset/package.json | 2 +- packages/client/ui-attachment/package.json | 2 +- packages/client/ui-commands/package.json | 2 +- packages/client/ui-conversation/package.json | 2 +- packages/client/ui-deliverables/package.json | 2 +- packages/client/ui-directory-picker-browse/package.json | 2 +- packages/client/ui-directory-picker-native/package.json | 2 +- packages/client/ui-goal/package.json | 2 +- packages/client/ui-input-trigger/package.json | 2 +- packages/client/ui-jobs/package.json | 2 +- packages/client/ui-layout/package.json | 2 +- packages/client/ui-message-feedback/package.json | 2 +- packages/client/ui-model-selection/package.json | 2 +- packages/client/ui-permission-presets/package.json | 2 +- packages/client/ui-plan/package.json | 2 +- packages/client/ui-primitives/package.json | 2 +- packages/client/ui-settings-general/package.json | 2 +- packages/client/ui-settings-models/package.json | 2 +- packages/client/ui-settings-plugin-inventory/package.json | 2 +- packages/client/ui-settings-plugins/package.json | 2 +- packages/client/ui-settings/package.json | 2 +- packages/client/ui-sidebar/package.json | 2 +- packages/client/ui-skill/package.json | 2 +- packages/client/ui-slots/package.json | 2 +- packages/client/ui-subagent/package.json | 2 +- packages/client/ui-theme/package.json | 2 +- packages/client/ui-tool/package.json | 2 +- packages/client/ui-trajectory/package.json | 2 +- packages/client/ui-user-questions/package.json | 2 +- packages/client/ui-workflow-run/package.json | 2 +- packages/client/ui-workspace/package.json | 2 +- packages/client/web-react/package.json | 2 +- packages/client/web/package.json | 2 +- packages/code-runtime/code-runtime-worker-thread/package.json | 2 +- packages/code-runtime/code-runtime/package.json | 2 +- packages/compaction/command-compact/package.json | 2 +- packages/compaction/compaction-basic/package.json | 2 +- packages/compaction/compaction-tool-result-pruner/package.json | 2 +- packages/compaction/compaction/package.json | 2 +- packages/context/agent-instructions/package.json | 2 +- packages/context/session-reference/package.json | 2 +- packages/context/time-context/package.json | 2 +- packages/context/tmux-context/package.json | 2 +- packages/core/agent-default-model/package.json | 2 +- packages/core/agent-loop/package.json | 2 +- packages/core/agent-tool-presentation/package.json | 2 +- packages/core/agent/package.json | 2 +- packages/core/scope/package.json | 2 +- packages/core/session/package.json | 2 +- packages/core/system-prompt/package.json | 2 +- packages/core/tools/package.json | 2 +- packages/credentials/credentials-local/package.json | 2 +- packages/credentials/credentials/package.json | 2 +- packages/e2b/e2b/package.json | 2 +- packages/e2b/fs-e2b/package.json | 2 +- packages/e2b/subprocess-e2b/package.json | 2 +- packages/examples/acp-demo/package.json | 2 +- packages/examples/agent-spine-demo/package.json | 2 +- packages/examples/jsonrpc-demo/package.json | 2 +- packages/extensions/cordis-client-runner/package.json | 2 +- packages/extensions/cordis-host-runner/package.json | 2 +- packages/extensions/tool-cordis/package.json | 2 +- packages/extensions/ui-cordis/package.json | 2 +- packages/feedback/command-feedback/package.json | 2 +- packages/feedback/message-feedback/package.json | 2 +- packages/fs/fs-local/package.json | 2 +- packages/fs/fs-observation-policy/package.json | 2 +- packages/fs/fs-sandbox/package.json | 2 +- packages/fs/fs/package.json | 2 +- packages/fs/tool-fs-search/package.json | 2 +- packages/fs/tool-fs/package.json | 2 +- packages/fs/tool-str-replace-editor/package.json | 2 +- packages/goal/command-goal/package.json | 2 +- packages/goal/goal-round-driver/package.json | 2 +- packages/goal/goal/package.json | 2 +- packages/goal/tool-goal/package.json | 2 +- packages/guard/repeat-tool-reminder/package.json | 2 +- packages/guard/timeout-policy/package.json | 2 +- packages/hooks/hook-protocol/package.json | 2 +- packages/hooks/hooks-claude-code/package.json | 2 +- packages/hooks/hooks-codex/package.json | 2 +- packages/host/apiproxy/package.json | 2 +- packages/host/directory-picker-auto/package.json | 2 +- packages/host/directory-picker-browse/package.json | 2 +- packages/host/directory-picker-native/package.json | 2 +- packages/host/directory-picker/package.json | 2 +- packages/host/frontend-static/package.json | 2 +- packages/host/plugin-inventory/package.json | 2 +- packages/host/webserver/package.json | 2 +- packages/identity/anonymous-user-id/package.json | 2 +- packages/interaction/commands/package.json | 2 +- packages/interaction/permission-presets/package.json | 2 +- packages/interaction/tool-ask-user/package.json | 2 +- packages/interaction/user-approval/package.json | 2 +- packages/interaction/user-questions/package.json | 2 +- packages/jobs/jobs-local/package.json | 2 +- packages/jobs/jobs/package.json | 2 +- packages/jobs/tool-jobs/package.json | 2 +- packages/llm/llm-deepseek/package.json | 2 +- packages/llm/llm-pi-ai/package.json | 2 +- packages/llm/llm-retry/package.json | 2 +- packages/llm/llm/package.json | 2 +- packages/llm/token-meter/package.json | 2 +- packages/lsp/lsp-stdio/package.json | 2 +- packages/lsp/lsp/package.json | 2 +- packages/lsp/tool-lsp/package.json | 2 +- packages/mcp/mcp-client/package.json | 2 +- packages/plan/plan-mode/package.json | 2 +- packages/preset/agent-presets/package.json | 2 +- packages/preset/persona/package.json | 2 +- packages/runtime-diagnostics/invariants/package.json | 2 +- packages/sandbox/sandbox-local/package.json | 2 +- packages/sandbox/sandbox-policy/package.json | 2 +- packages/sandbox/sandbox-windows-acl/package.json | 2 +- packages/sandbox/sandbox/package.json | 2 +- packages/schedule/schedule/package.json | 2 +- packages/sdk/client/package.json | 2 +- packages/sdk/protocol/package.json | 2 +- packages/sdk/server/package.json | 2 +- packages/session-query/session-log-export/package.json | 2 +- packages/session-query/session-query-sqlite/package.json | 2 +- packages/session-query/session-query/package.json | 2 +- packages/session-query/tool-session-query/package.json | 2 +- packages/session/session-checkpoint-policy/package.json | 2 +- packages/session/session-persistence-jsonl/package.json | 2 +- packages/session/session-persistence-sqlite/package.json | 2 +- packages/session/session-persistence/package.json | 2 +- packages/session/session-projection-cache/package.json | 2 +- packages/session/session-projection/package.json | 2 +- packages/session/session-stats/package.json | 2 +- packages/session/session-telemetry-otel/package.json | 2 +- packages/session/session-telemetry/package.json | 2 +- packages/session/session-title-all-prompts-llm/package.json | 2 +- packages/session/session-title-first-prompt-llm/package.json | 2 +- packages/session/session-title-llm/package.json | 2 +- packages/session/session-title/package.json | 2 +- packages/settings/settings-file/package.json | 2 +- packages/settings/settings/package.json | 2 +- packages/shell/bash-local/package.json | 2 +- packages/shell/bash-sandbox/package.json | 2 +- packages/shell/pwsh-local/package.json | 2 +- packages/shell/pwsh-sandbox/package.json | 2 +- packages/shell/shell-env/package.json | 2 +- packages/shell/shell/package.json | 2 +- packages/shell/tool-bash-persistent/package.json | 2 +- packages/shell/tool-bash/package.json | 2 +- packages/shell/tool-pwsh/package.json | 2 +- packages/skill/skill-badge/package.json | 2 +- packages/skill/skill-filesystem/package.json | 2 +- packages/skill/skill/package.json | 2 +- packages/skill/tool-skill/package.json | 2 +- packages/spill/spill-local/package.json | 2 +- packages/spill/spill-policy/package.json | 2 +- packages/spill/spill/package.json | 2 +- packages/storage/storage-domain/package.json | 2 +- packages/storage/storage-json/package.json | 2 +- packages/storage/storage-sqlite/package.json | 2 +- packages/storage/storage/package.json | 2 +- packages/subagent/subagent-acp/package.json | 2 +- packages/subagent/subagent-claude-code/package.json | 2 +- packages/subagent/subagent-codex/package.json | 2 +- packages/subagent/subagent-dsh-sdk/package.json | 2 +- packages/subagent/subagent-fork-in-process/package.json | 2 +- packages/subagent/subagent-in-process-driver/package.json | 2 +- packages/subagent/subagent-spawn-in-process/package.json | 2 +- packages/subagent/subagent/package.json | 2 +- packages/subagent/tool-subagent-control/package.json | 2 +- packages/subagent/tool-subagent-report/package.json | 2 +- packages/subagent/tool-subagent/package.json | 2 +- packages/subprocess/subprocess-local/package.json | 2 +- packages/subprocess/subprocess/package.json | 2 +- packages/terminal/terminal-bash/package.json | 2 +- packages/terminal/terminal/package.json | 2 +- packages/terminal/tool-terminal/package.json | 2 +- packages/test-support/acp-snapshot/package.json | 2 +- packages/test-support/agent-loop-testkit/package.json | 2 +- packages/test-support/client-runtime/package.json | 2 +- packages/test-support/llm-mock-server/package.json | 2 +- packages/test-support/llm-replay/package.json | 2 +- packages/test-support/loader-smoke/package.json | 2 +- packages/todo/tool-todo/package.json | 2 +- packages/typert/generator/package.json | 2 +- packages/typert/loader/package.json | 2 +- packages/typert/protocol/package.json | 2 +- packages/typert/registry/package.json | 2 +- packages/util/atomic-write/package.json | 2 +- packages/util/brand/package.json | 2 +- packages/util/home-paths/package.json | 2 +- packages/util/launch-environment/package.json | 2 +- packages/util/native-command/package.json | 2 +- packages/util/output-retention/package.json | 2 +- packages/util/timeout/package.json | 2 +- packages/web/tool-web/package.json | 2 +- packages/web/web-fetch-http/package.json | 2 +- packages/web/web-search-deepseek/package.json | 2 +- packages/web/web-search-exa/package.json | 2 +- packages/web/web-search-perplexity/package.json | 2 +- packages/web/web/package.json | 2 +- packages/workflow/tool-ralph/package.json | 2 +- packages/workflow/tool-workflow/package.json | 2 +- packages/workflow/workflow-worker-thread/package.json | 2 +- packages/workflow/workflow/package.json | 2 +- packages/workspace/workspace/package.json | 2 +- 222 files changed, 222 insertions(+), 222 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 48869199d5..fdd4740b3c 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/apps/web/package.json b/apps/web/package.json index d5b75e4d63..830cc355cb 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/package.json b/package.json index db7a5906ce..81cedbbb42 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "license": "MIT", "private": true, "type": "module", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index 34b2344992..f60beda285 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index 72debdce2d..e4588cd1a5 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index b7afbfc396..42a7d14070 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly and Host Agent/Session lookup policy", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index 2bd0b97db0..9b20bc9906 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index ce6484003d..e9a3a20a59 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index f2b2eb27df..edc7e05b01 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index 37b3c21939..d591304af1 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index ec6bdc08de..706ee3202a 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 8ffd82b9b3..20aba2780a 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 45398b9359..ca4709a2a9 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 1a15f1d93e..b5056de3e8 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index c91c263d93..5224f69cbe 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 930d68024b..68162768da 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index e6020ad60c..5083799d2f 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 54a009975c..adde82d0a1 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-runtime", "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index ca9f4f11c5..83db55d0a4 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-schema-form", "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index c148386798..05dd7841f4 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index c0866b4457..274ca6d8ef 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index 8b337fb470..ef8f5807af 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 9d5aa90924..04f7d633f2 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index ac1ba0cd69..f7b20a8a11 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Produced-files turn tail and clickable final-response file references for Web", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index accebcb751..04ec43ce8b 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 4f7316d895..1de41a34de 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index 36e9ddf9d5..73974fe414 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index b0496c4ed6..52999c2c0e 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index 5328762317..f5fc5f7dab 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list: live registry state mirrored from session/jobs frames", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index 14f0965981..4d488d78b8 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 62db69a2a1..76a33892f9 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 99d284a97d..1c1da45e9f 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection: the /model popupSelect over session.models / session.selectModel", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 3f526027c6..949ec37e92 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index 84d472faef..41bd833a18 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index b78f0273ca..b6870a6353 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 7ba7b58baa..b21eea4944 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 7fc1f0af70..e6edb56fc1 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 9e349081bf..3fbd5c2ea2 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index 81b687cf50..aec7abc069 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index b6bf16ab21..e97d297c00 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index 549e6ea948..ff0601331b 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index ee032c33b7..41c03f8b01 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index 9584cbf429..a31091aeae 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 95570bf2e9..d748ce54dd 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 598879a91f..792c2de2e9 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 4bad8e7d29..04ba9ee671 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 82918fb8d2..ccac2b0860 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index 599c6866f3..e1cc90e28b 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-user-questions", "description": "Web ask_user_question feature: host tool mount plus composer-takeover question UI", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index d7069a47f2..d5359d46a4 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workflow-run", "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index 1e8c537bdc..335bd22797 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workspace", "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/web-react/package.json b/packages/client/web-react/package.json index 0e89c09d1e..89f4ceb021 100644 --- a/packages/client/web-react/package.json +++ b/packages/client/web-react/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web-react", "description": "Shell-side React glue: createSlotRenderer, SessionProvider, bindSnapshotSelector (uSES bridge), useInvoke", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/client/web/package.json b/packages/client/web/package.json index d7be460113..ded9257be0 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web", "description": "Web shell kernel: bootWebShell (module system holding + seed table + two-stage boot + AppRoot gate + app-shell assembly entry), consumed by the apps/web vite entry", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json index 73cd2608f3..84bf579b24 100644 --- a/packages/code-runtime/code-runtime-worker-thread/package.json +++ b/packages/code-runtime/code-runtime-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime-worker-thread", "description": "Worker-thread implementation of the DeepSeek Harness code-execution seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json index 496dea1a45..51f4e126f0 100644 --- a/packages/code-runtime/code-runtime/package.json +++ b/packages/code-runtime/code-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-code-runtime", "description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index b37e405d4e..16611fcb9b 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-compact", "description": "Human-facing slash command for explicit session compaction", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index ab64295ea8..5af4d6ddbf 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-basic", "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index 2f647a3b61..997666dab6 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-tool-result-pruner", "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index c86c15c516..982b333fc4 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction", "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index 1aa8650c9a..6fb1f33eaf 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-instructions", "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index 0860d44a6a..dea094f057 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-reference", "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 3351f3fd8d..40893e119d 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-time-context", "description": "Opt-in durable per-step context with the current time and elapsed time", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 53c8bb71bc..6caf938eff 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tmux-context", "description": "Opt-in durable per-step context with this agent's tmux pane and window location", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index 4430354728..3ae412c342 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-default-model", "description": "Default model selection shared by Agent entry points", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index 1975338845..5517fd2159 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop", "description": "The concrete agent loop plugin for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index 7c9f6d9983..ff4e8920ab 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-tool-presentation", "description": "Agent-plane presentation selector: composes one agent's tools as Code Mode, native, or both", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index bb37580ebe..13abdcd5f7 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent", "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index 8c51276427..b972a560b5 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-scope", "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/session/package.json b/packages/core/session/package.json index 9972a1d089..bb8f24a70e 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session", "description": "Event-sourced session store for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index 6a7a570e6a..d104c30742 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-system-prompt", "description": "System prompt assembly registry for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index 967e52b32d..91400a3e75 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tools", "description": "Tool registry and execution pipeline for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index debdc87429..e77e5e2416 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials-local", "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index 586a8bc65d..fb7450985f 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials", "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json index 0b4605685b..53e00da0fd 100644 --- a/packages/e2b/e2b/package.json +++ b/packages/e2b/e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-e2b", "description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json index b0ff95d8e9..e9b7faa46a 100644 --- a/packages/e2b/fs-e2b/package.json +++ b/packages/e2b/fs-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-e2b", "description": "E2B filesystem implementation for DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json index db5640bf23..1116249ba3 100644 --- a/packages/e2b/subprocess-e2b/package.json +++ b/packages/e2b/subprocess-e2b/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-e2b", "description": "E2B subprocess implementation for DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/examples/acp-demo/package.json b/packages/examples/acp-demo/package.json index 5b0abd60f6..f42acbd2f0 100644 --- a/packages/examples/acp-demo/package.json +++ b/packages/examples/acp-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-demo", "description": "ACP automation server app: agent spine + JSONL persistence + ACP transport, with a JSON-RPC stdio bin", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/examples/agent-spine-demo/package.json b/packages/examples/agent-spine-demo/package.json index 1cf82845f7..75af09b242 100644 --- a/packages/examples/agent-spine-demo/package.json +++ b/packages/examples/agent-spine-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-spine-demo", "description": "The default executor-less/UI-less agent spine with fallback session titles, provider-routed retry, and optional persisted goals", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/examples/jsonrpc-demo/package.json b/packages/examples/jsonrpc-demo/package.json index 51ec7506a9..4dbcef5660 100644 --- a/packages/examples/jsonrpc-demo/package.json +++ b/packages/examples/jsonrpc-demo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-demo", "description": "Bin that boots an external Cordis config for the stdio JSON-RPC SDK runtime", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index 8c39fbefe0..c34402c9d6 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-client-runner", "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index de481f11a5..1d6afc5113 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-host-runner", "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index 4f19fb8550..66f6d70ff0 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-cordis", "description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 422a345a34..c7e73b0cfc 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-cordis", "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index 281915a176..f662d34a0b 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-feedback", "description": "Log-only session feedback producer and human-facing slash command", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index c8c2e0930f..64d5180fb7 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-message-feedback", "description": "Lifecycle-bound per-message rating and note sidecar for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index 7a13c103ef..40bdf26d82 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-local", "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index 76e700484a..a23fa86cb6 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-observation-policy", "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 7ad29c5279..0bab7bf7cd 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-sandbox", "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index 7ce6276e37..f597838622 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs", "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index 76fa8ed1cd..0ff873ea8c 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs-search", "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index 8ee720735c..de5171cae7 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs", "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index 68b513e07e..8325bdbf6a 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-str-replace-editor", "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index 85af15e4d2..e4455295ba 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-goal", "description": "Human-facing slash command for persisted same-session goals", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index 08eba46bb1..49567951cd 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal-round-driver", "description": "Race-fenced same-session goal-round driver", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index a09b2d136f..0bd113350b 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal", "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index fb4a4e918c..0a79357935 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-goal", "description": "Model-facing same-session goal tools with execution-time authority checks", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index ec78728259..06c8475477 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-repeat-tool-reminder", "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index fe57465e56..17994af840 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-call-timeout-policy", "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 2439594f00..86f9b9b3be 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index ce442062c4..30b054c9b3 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 6e990be8f3..66945a0f65 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/apiproxy/package.json b/packages/host/apiproxy/package.json index a13ebe3615..ba83efedb5 100644 --- a/packages/host/apiproxy/package.json +++ b/packages/host/apiproxy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-apiproxy", "description": "API gateway: the ApiProxy contract (api/), the fetch carrier pair (fetch/), and the host-side gateway plugin providing ctx.apiProxy", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index 90a650cd42..cf4c769d1a 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-auto", "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index 0d2cfc91d6..a5aac7733a 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-browse", "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index 02f67ff7ec..ef81234169 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-native", "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index b8b59b8199..3d855f813a 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker", "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 8a73033f67..129c961913 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-frontend-static", "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving the built frontend with index-tap injection, traversal rejection, and SPA index fallback", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index 7567ba53eb..0f020b372c 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-plugin-inventory", "description": "Read-only Remote projection of current Cordis Loader plugin state", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index 9b097ee95b..eb9563a37d 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-webserver", "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index f53735527e..506a3d7f05 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-anonymous-user-id", "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 94c11b0867..61fabbf14c 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-commands", "description": "Plugin-owned human command registry for DeepSeek Harness UIs", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index c9c5f7de52..410eb22b93 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-permission-presets", "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index dc20d458e5..e70068346b 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ask-user", "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index 7479629908..d343f3045a 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-approval", "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 00fee7bc5e..be1068b35e 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-questions", "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 780fe994c6..04b352c633 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs-local", "description": "Process-local implementation of the DeepSeek Harness background job registry seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index be234da20b..36f2fcf0f2 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs", "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index 2ffec6a208..b5d52245ab 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-jobs", "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index d8565aa0cc..cbd0365c38 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-deepseek", "description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index d5d90c703a..118eb4632d 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-pi-ai", "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index c95679109c..c5c004b36f 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-retry", "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index b4f5b563b8..c33f115a6b 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm", "description": "Provider-neutral LLM service interface for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index 2bde6bded5..daecda3e72 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-token-meter", "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index aacdf5e1c3..aa7e36b30b 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp-stdio", "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index d137f0d82b..d3640349af 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp", "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index 2b430e7538..bd09e385ef 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-lsp", "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index ae78a9ff29..d3f8faabb4 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-client", "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index 7b3b03fb7f..fe28de8ba6 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plan-mode", "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json index 3a7349ae7a..728645d3d2 100644 --- a/packages/preset/agent-presets/package.json +++ b/packages/preset/agent-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-presets", "description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index 8bedadc8b1..b59a66f409 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-persona", "description": "Composition-authored deployment persona section for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index 67bcec0dab..5ff3b8e873 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-invariants", "description": "Registry service for package-owned DeepSeek Harness runtime invariants", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index 77454be823..7389cfeed0 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-local", "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index c168915f80..9c8f262cca 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-policy", "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index c554e7e097..7c2b945ae1 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-windows-acl", "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index d25beb7e64..4da48c01e6 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox", "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index bbeea9820c..a54468001f 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-schedule", "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index c937e62969..f45ba5d7b1 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-client", "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index 3cbaa653fd..36922c34d2 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-protocol", "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index 458eb0eb4c..e5c1639800 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-server", "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index 8c4322bb2e..1d9532bda1 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, "repository": { "type": "git", diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index d6f4e1868a..f60ef209bf 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query-sqlite", "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index 254111c207..29f375c053 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query", "description": "Combined session query service contract with concrete reads, traces, and filters", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index 10a23c5388..ee2e6ecd1a 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-session-query", "description": "Workspace-authorized model-facing session history search, trace, and event read tools", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index 5c08a06a9d..52eeda76e3 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-checkpoint-policy", "description": "Semantic session durability checkpoints before model requests and tool side effects", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index 886ab65140..f19c1d7ec3 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-jsonl", "description": "JSONL durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json index 3b9da0d465..23a2e43a69 100644 --- a/packages/session/session-persistence-sqlite/package.json +++ b/packages/session/session-persistence-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-sqlite", "description": "SQLite durable session persistence backend for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index 9853ea7d3c..1ff1d185b6 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence", "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index 7e94c1a9d4..bc35f858e0 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection-cache", "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session projection checkpoints over the domain data form, throttled write-behind, and the cold-read ladder (cache row + persistence tail replay)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index 6f5942e677..19f3391aec 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection", "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index db8a886126..6f97337bed 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-stats", "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 0166ce1e71..96889660f1 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry-otel", "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index 0faba54876..a0c93b0263 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry", "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 73c64d696f..2ad7d2cdc8 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 71a74c5ded..189107520c 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-first-prompt-llm", "description": "First-message LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index 27c4268329..074545874d 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-llm", "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index 7271316afe..9c9ba29113 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title", "description": "Log-backed session title service and provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json index 3e0286b9cf..85b912e495 100644 --- a/packages/settings/settings-file/package.json +++ b/packages/settings/settings-file/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings-file", "description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index 5923cd1ff8..936b5b3ddc 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings", "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index f31c28c821..3c66b15851 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-local", "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index 173afae7f6..d1497aedd1 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index 5fc60d4297..b48873f248 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-local", "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index 63826e3818..c8d025c2a2 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index 7853724584..9da8ed0a72 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell-env", "description": "Tool-independent managed DSH_* shell environment registry", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index 0c1478ece6..33fb1a95e2 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell", "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index b86d10f66f..09257d78e3 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash-persistent", "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index cc29a0f27e..f3402e5c3a 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash", "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index bacd902070..e92403eeb7 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh", "description": "Model-facing pwsh tool over the bash executor seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index 4582382169..4e7bd709d1 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 09de6c073d..426696c4ef 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-filesystem", "description": "Local filesystem skill provider for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index 367a2ff1bd..b5ee04ffeb 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill", "description": "Agent skill provider registry for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index e93b90e772..9c878c5e9b 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-skill", "description": "Model-facing skill loading tool for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index dc85f9f8f2..0b3856396a 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-local", "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index 51283307f3..22b4949f8f 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-policy", "description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index 7e90380eb0..7acbbca750 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill", "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index 352e060581..a1c7459ac6 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-domain", "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index 5aa647cfdf..80ca5ffd9d 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-json", "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index b6bcb80c7d..7de92e060f 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-sqlite", "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index 90c60e7c30..27f1d7c120 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage", "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index 2648d07f70..afb777473e 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-acp", "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index 3ebac1b270..d58fa39170 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-claude-code", "description": "One-shot Claude Code subagent provider over the official Agent SDK", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 7fda872891..d431f5ee28 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-codex", "description": "One-shot Codex subagent provider over the official app-server protocol", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 771f2a0638..238630aa52 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-dsh-sdk", "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index cf78ebd1d0..adecaf2a57 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-fork-in-process", "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index cfb1de74d3..98fedc87fa 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-in-process-driver", "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index 1a44b8c144..24d560d177 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-spawn-in-process", "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index 4e2f43834b..156e3374a1 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent", "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index 8761f3c8b5..b364ce31ae 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-control", "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent-report/package.json b/packages/subagent/tool-subagent-report/package.json index fb58767c7e..1df4de7e96 100644 --- a/packages/subagent/tool-subagent-report/package.json +++ b/packages/subagent/tool-subagent-report/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-report", "description": "Child-scoped report tool over ctx.subagents continuations", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index 00c037f08d..65dec59652 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent", "description": "Model-facing subagent delegation tool over the ctx.subagents seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index be08694aef..d871666d15 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-local", "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index a32c331b3b..6bac49a247 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess", "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index dcffdd2222..39c0005f85 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal-bash", "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index 6f1e27bfd5..24eb4fd9fb 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal", "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index e81b86a866..f5c8036d59 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/acp-snapshot/package.json index 8b08b373d0..8e442f1381 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/acp-snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-snapshot", "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index cabc54ed54..33a6e4a8f3 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop-testkit", "description": "Shared prerequisite mounting for tests that exercise the concrete agent loop", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index d3536d73a1..ab31405d8e 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-test-runtime", "description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + web-react renderer with test-owned session/workspace doubles for feature specs", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index 10700b1366..edbafb3df7 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-mock-server", "description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 13a4185ae1..5da35de12a 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-replay", "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index e3cd9fbc36..6d591f8137 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-loader-smoke", "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index 9653fde0de..e284a61e86 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-todo", "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index 4498d52822..66360e0260 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-generator", "description": "TypeScript project analyzer and model-driven Typert artifact generator", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index 35275205ea..2efddc661f 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-loader", "description": "Loader integration for generated Typert package contributions", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 48d3ad7455..469a22e31c 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-protocol", "description": "Compiler-independent Remote metadata and Typert provider protocols", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index dcaf94726a..e8d294e5d1 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-registry", "description": "Runtime registry for generated package reflection and Zod schemas", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index 1fc30a1d34..78340d428c 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-atomic-write", "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index d888e9bfb7..6c06636a17 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-brand", "description": "Type-only Branded nominal-typing primitive for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index 75b9a27a0a..497f8dc061 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-home-paths", "description": "Shared filesystem path helpers for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index 55bc6f971a..f3e4fa0e3f 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-launch-environment", "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index f0b9570344..9dfc5f9b10 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-native-command", "description": "Zero-dependency no-shell execFile runner for host-native OS integrations: utf8 stdio capture, abort propagation, Windows hide", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index fe87b66bb2..fc441ebb7d 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-output-retention", "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index 81e9c80cfe..91daad0c80 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-timeout", "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index 530f4f529e..9bc1c41fd5 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-web", "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index d6e376a8af..9200d4655c 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-fetch-http", "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index ab58741b35..d92342d542 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-deepseek", "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 3b9c353329..9a92956533 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-exa", "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 04f67e9b22..52ec2a7d0d 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-perplexity", "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 22288d4be4..36e911261c 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web", "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index 292ce3065e..7a055c40fa 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index d83c8d59a3..028c1cb8f3 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workflow", "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json index 07b426b436..53ea1347b3 100644 --- a/packages/workflow/workflow-worker-thread/package.json +++ b/packages/workflow/workflow-worker-thread/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow-worker-thread", "description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index 56a23e24fc..cfc49cf0ea 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow", "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index 5a7e61b8c8..c513141e74 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace", "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", - "version": "0.1.0-rc.3", + "version": "0.1.0-rc.5", "publishConfig": { "access": "public" }, From c5187d38a5e509820d92c998f27021dd1a27abad Mon Sep 17 00:00:00 2001 From: Yif <877193178@qq.com> Date: Thu, 13 Aug 2026 19:09:16 +0800 Subject: [PATCH 082/103] fix(web): align the sidebar Cordis panel with menu and footer conventions The Cordis popup now uses the standard menu surface (layer-3 fill, inverted border, lv3 shadow) so it stays visible in dark mode, closes on outside pointerdown, and anchors to its trigger through a measured fixed position that escapes the sidebar overflow clip. The Cordis and Settings footer triggers share the same 42px row, icon size, padding, and hover fill, and the panel's header, heading, and card spacing is rebalanced. Refs #2526 --- .../src/client/SettingsRoot.module.css | 12 +++--- .../src/client/CordisPanel.module.css | 34 ++++++++--------- .../ui-cordis/src/client/CordisPanel.tsx | 38 ++++++++++++++++--- 3 files changed, 55 insertions(+), 29 deletions(-) diff --git a/packages/client/ui-settings-general/src/client/SettingsRoot.module.css b/packages/client/ui-settings-general/src/client/SettingsRoot.module.css index 060e8d115b..03e0f6372c 100644 --- a/packages/client/ui-settings-general/src/client/SettingsRoot.module.css +++ b/packages/client/ui-settings-general/src/client/SettingsRoot.module.css @@ -1,19 +1,19 @@ /* Settings shell (figma 501:29904 mask context / 501:29947 panel): sidebar foot trigger row + centered 1080x700 modal panel. The trigger uses the - sidebar's 34px compact row / 36px rail circle rhythm; the + sidebar foot's 42px row / 36px rail circle rhythm; the panel is a two-column layout — 188px nav rail + content column with a 54px header and the 24px-padded options area. */ -/* Trigger row: match the other wide sidebar controls' compact vertical rhythm. */ +/* Trigger row: the 42px foot-row box shared with the Cordis footer action. */ .trigger { flex: none; display: flex; align-items: center; gap: 8px; - width: calc(100% + 8px); - height: 34px; - margin: 4px -4px 4px; - padding: 6px 2px 6px 10px; + width: calc(100% + 4px); + height: 42px; + margin: 4px -2px; + padding: 0 10px 0 8px; box-sizing: border-box; border: none; border-radius: 12px; diff --git a/packages/extensions/ui-cordis/src/client/CordisPanel.module.css b/packages/extensions/ui-cordis/src/client/CordisPanel.module.css index bf72bfecec..1a10f07ee3 100644 --- a/packages/extensions/ui-cordis/src/client/CordisPanel.module.css +++ b/packages/extensions/ui-cordis/src/client/CordisPanel.module.css @@ -6,7 +6,7 @@ display: flex; align-items: center; width: 100%; - height: 49px; + height: 42px; margin: 8px 0 0; } @@ -20,9 +20,10 @@ display: inline-flex; align-items: center; gap: 8px; - width: 100%; - height: 49px; - padding: 0 8px 0 6px; + width: calc(100% + 4px); + height: 42px; + margin: 0 -2px; + padding: 0 10px 0 8px; border: none; border-radius: 12px; background: transparent; @@ -34,7 +35,7 @@ } .badge:hover { - background: var(--dsw-alias-interactive-bg-hover-solid); + background: var(--dsw-alias-interactive-bg-hover); } .badge[data-active] { @@ -77,10 +78,10 @@ gap: 2px; } +/* Fixed so the sidebar's overflow clip cannot cut the 420px surface; the + left/bottom offsets are measured from the trigger before paint. */ .panel { position: fixed; - left: 12px; - bottom: 128px; z-index: 30; display: flex; flex-direction: column; @@ -88,10 +89,10 @@ max-width: calc(100vw - 24px); max-height: 60vh; overflow: hidden; - border: 1px solid var(--dsw-alias-border-l1); + border: 1px solid var(--dsw-alias-border-inverted); border-radius: 12px; - background: var(--dsw-alias-bg-base); - box-shadow: var(--dsw-shadow-lv2); + background: var(--dsw-specific-menu); + box-shadow: var(--dsw-shadow-lv3); /* Only `.body` scrolls; the header remains fixed above it. */ --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2); --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2); @@ -105,19 +106,17 @@ min-height: 44px; padding: 10px 12px; box-sizing: border-box; - border-bottom: 1px solid var(--dsw-alias-border-l2); - background: var(--dsw-alias-bg-base); } .body { flex: 1; min-height: 0; overflow-y: auto; - padding: 4px 12px 12px; + padding: 0 12px 12px; } .title { - font-size: 13px; + font-size: 14px; font-weight: 500; line-height: 20px; color: var(--dsw-alias-label-primary); @@ -137,7 +136,7 @@ /* Session headings replace per-row ownership markers. */ .group { - margin: 8px 0 4px; + margin: 8px 0 8px; font-size: 11px; font-weight: 500; line-height: 16px; @@ -159,10 +158,9 @@ display: flex; flex-direction: column; gap: 8px; - padding: 10px 12px; + padding: 14px 12px 10px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 12px; - background: var(--dsw-alias-bg-base); } .row[data-cordis-awaiting] { @@ -252,7 +250,7 @@ padding: 0 8px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 7px; - background: var(--dsw-alias-bg-base); + background: transparent; color: var(--dsw-alias-label-secondary); font: inherit; } diff --git a/packages/extensions/ui-cordis/src/client/CordisPanel.tsx b/packages/extensions/ui-cordis/src/client/CordisPanel.tsx index 946e9d9dfa..42f1586dae 100644 --- a/packages/extensions/ui-cordis/src/client/CordisPanel.tsx +++ b/packages/extensions/ui-cordis/src/client/CordisPanel.tsx @@ -1,6 +1,6 @@ /** Frame-wide dynamic Plugin inventory, approvals, versions, and lifecycle actions. */ -import { useEffect, useRef, useState } from 'react' +import { useEffect, useLayoutEffect, useRef, useState } from 'react' import type { ButtonHTMLAttributes, ReactNode } from 'react' import { IconCheckOutline16, IconCloseOutline16, IconCordisPluginOutline14, IconPlayOutline16, @@ -119,6 +119,34 @@ export function CordisPanel({ const [pending, setPending] = useState>(new Set()) const [actionErrors, setActionErrors] = useState>(new Map()) const visibleRequests = useRef>(new Set()) + const rootRef = useRef(null) + const [anchor, setAnchor] = useState<{ left: number; bottom: number }>() + + // The panel is position: fixed (the sidebar clips overflow), so it hugs the + // trigger through a measured offset instead of document flow. + useLayoutEffect(() => { + if (!open) return + const place = (): void => { + const rect = rootRef.current?.getBoundingClientRect() + if (rect !== undefined) { + setAnchor({ left: rect.left, bottom: window.innerHeight - rect.top + 8 }) + } + } + place() + window.addEventListener('resize', place) + return () => { window.removeEventListener('resize', place) } + }, [open]) + + useEffect(() => { + if (!open) return + const closeOutside = (event: PointerEvent): void => { + if (event.target instanceof Node && !rootRef.current?.contains(event.target)) { + setOpen(false) + } + } + document.addEventListener('pointerdown', closeOutside) + return () => { document.removeEventListener('pointerdown', closeOutside) } + }, [open]) useEffect(() => { const now = new Set() @@ -420,9 +448,9 @@ export function CordisPanel({ } return ( -