dsh-edge 0.11.1 → 0.12.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # last confirmed-consistent state. Both languages carry equal authority.
3
3
  # After editing either side, update both and re-record every pair with:
4
4
  # pnpm run doc-pairs -- --write
5
- README.md: b2b8697453e7e747c1934594b06466263579794b
6
- README.zh.md: 3572c8a13af6280c296c0e7c178a27d913d9c133
5
+ README.md: 6f74df2cfdfd296bd3160bc0c66113c3c8a2147f
6
+ README.zh.md: 6bf1ac6ab667a46d25ce5baa516b0cbe26f2585d
package/README.md CHANGED
@@ -31,6 +31,28 @@ The browser also remains upstream-owned:
31
31
  - Settings → Plugins lists the running composition through the upstream `dsh-host-plugin-inventory` Remote. The Edge-owned `EdgeLoader` answers its `loader` inject from the live host plugin registry and the reviewed Web boot graph, because there is no cordis Loader on Workers.
32
32
  - A small Edge-owned login shell protects the upstream UI and protocol without changing either one.
33
33
 
34
+ ## Main-session runtime queues
35
+
36
+ The owner Durable Object admits one live main session at a time. Ordinary inputs are durably queued before acknowledgement; each residency admits one ordinary input, then returns that session to the ready queue's tail after the upstream loop becomes idle and cleanup completes. Other tabs can submit and observe the same queue. Explicit steering still targets the current run. The Edge browser binds steering/cancellation to the canonical turn it observed, so a delayed control cannot affect a newer run; legacy API callers can opt in with `x-dsh-edge-turn-seq`.
37
+
38
+ The queue accepts up to 128 unsettled inputs and 2 MiB of serialized input data per owner. Capacity exhaustion returns HTTP 429 (`QUEUE_FULL`) or RPC `agent-busy`; retry after pending work drains. Browser RPC retries reuse `requestId` (legacy callers reuse `rpcId`); raw SSE callers can supply an `Idempotency-Key` (up to 128 characters). Reusing an identity with different content fails. Concurrent steering retries share the admission result; a rejected steer remains rejected on retry, including after restart. If an inbox mutation was accepted but its persistence barrier fails, model consumption is blocked and steering capacity is released; a promoted input retains its original accepted receipt. Raw SSE starts with a receipt comment and returns `x-dsh-edge-input-id`; disconnecting a stream does not cancel the queued input. Remove a queued input through `session.updateQueue`.
39
+
40
+ Actual tool dispatch shares two permits, at most 32 waiters, a 30-second queue deadline and a 60-second cooperative execution deadline. The pool deadline is an additional ceiling: a longer configured bash timeout does not extend it, and interactive `ask_user_question` / `exit_plan_mode` calls must also settle within it. A cancelled execution retains its permit until cleanup settles. Upstream parallel/exclusive classifications remain authoritative; nested dispatch inherits the root budget. Background title streams have a separate bounded single permit and retain their upstream timeout. These limits do not make synchronous unbounded code interruptible or give each tool its own memory allocation.
41
+
42
+ Incoming requests and completion events advance the queue immediately. The existing downlink-expiry alarm also checks durable work, with a 30-second active recovery interval; alarm-started work is awaited one residency at a time. Explicit user cancellation ends the current turn and lets queued followups run after cleanup. Each residency receives its own ten-minute deadline, leaving cleanup room within the alarm handler's platform limit. After restart, interrupted work is marked and its pending session inputs are paused; a new user message explicitly resumes pending work. Transient model errors (provider failures, output ceiling) do not pause followups; only crash recovery and residency timeout trigger the pause. Unknown external tool effects are never automatically replayed. Cold history subscriptions release their prepared snapshot after delivery and do not activate an Agent. Agent-scoped commands such as `/plan` temporarily use the same residency budget. Model selection still publishes the upstream durable projection while a session is cold. Subagents and independent cron execution slots are not added.
43
+
44
+ For a local test against promoted artifacts and real browser tabs, run `DSH_EDGE_PLAYWRIGHT_CHANNEL=chrome node tests/runtime-queues.probe.mjs` from this package after `pnpm run bundle:workers`. Set `DSH_EDGE_TEST_RUNTIME_MODE=isolated` for the Dynamic Worker variant. The probe uses a local mock provider, checks actual HTTP concurrency and cancellation, and restarts the Worker with all tabs closed to exercise alarm recovery.
45
+
46
+ ## Scheduled reminders
47
+
48
+ Ask the agent to remind you later, for example “remind me in ten minutes to review the PR.” The published upstream `schedule_create`, `schedule_list`, and `schedule_delete` tools manage reminders belonging to the current session. Supported rules are `after_seconds`, an absolute `at` with an explicit offset or time zone, and fixed-rate `every_seconds` (at least 300 seconds). Calendar cron expressions are not supported. List or delete reminders through the agent; this adapter does not add a separate schedule catalog UI.
49
+
50
+ Edge replaces the upstream live-only timer with a Durable Object alarm. A cold session is resumed automatically when due, including with all browser tabs closed. Reminders enter the existing durable input queue and share the single main-session slot and two-permit short-tool pool. Running work is not cancelled or steered; existing queued messages retain their order. The reminder stays in its original conversation and asks the model to present reminder content, not execute it as a new user instruction. There are no email, push, or external notifications, and no new session is created.
51
+
52
+ A materialized due-time index is maintained with canonical `schedule/change` writes. A dispatch event and its queued reminder commit in the same SQLite transaction; the alarm is armed in that transaction too. One-shot reminders take precedence over a due periodic batch. Missed periodic intervals collapse to each reminder's latest occurrence and advance directly to the next future time. There are at most 128 active reminders per owner and a 4 KiB JSON-encoded prompt budget per reminder. Reminder preparation reserves queue capacity before its dispatch flush; when capacity is unavailable, user work can drain first. Failed reminder admission backs off for 30 seconds per session, with the deadline persisted across restarts. A failed session does not block healthy sessions’ due reminders or queued inputs, even when only paused inputs occupy capacity. A crash-paused session with pending inputs still requires a new user message to resume; reminders do not override that pause or replay interrupted external effects. Dispatch confirms queue admission, not successful model execution or user acknowledgement. Repair of a genuinely malformed log tail rebuilds the affected reminder index atomically; a malformed reminder event or a tail containing a dispatched reminder requires manual recovery rather than risking duplicate delivery.
53
+
54
+ After building, run `DSH_EDGE_PLAYWRIGHT_CHANNEL=chrome node tests/schedule.probe.mjs` from this package to verify busy-session ordering, deletion, and alarm recovery after a Worker restart. Set `DSH_EDGE_TEST_RUNTIME_MODE=isolated` for the Dynamic Worker variant. The browser snapshot suite also creates a reminder through the native composer, closes the page, observes the provider without waking the DO, and reopens the conversation to verify delivery.
55
+
34
56
  ## Find what you need
35
57
 
36
58
  - [Subsystem wiki with architecture and roadmap](https://github.com/pawaca/dsh-edge/wiki)
package/README.zh.md CHANGED
@@ -31,6 +31,28 @@
31
31
  - Settings → Plugins 通过上游 `dsh-host-plugin-inventory` Remote 列出当前运行的 composition。Workers 上没有 cordis Loader,因此 Edge 自有的 `EdgeLoader` 用实时的 host 插件 registry 和经过评审的 Web boot graph 来回答它注入的 `loader`。
32
32
  - 一个小型 Edge 登录外壳在不修改上游 UI 和协议的前提下保护它们。
33
33
 
34
+ ## 主会话 Runtime 队列
35
+
36
+ owner Durable Object 同一时间只准入一个活跃主会话。普通输入先持久排队再确认收到;每次驻留准入一条普通输入,上游 loop 空闲且清理完成后,有待处理输入的会话回到就绪队尾。其他 tab 可以提交并观察同一份队列。显式 steer 仍指向当前运行。Edge 浏览器把 steer/取消绑定到它观察到的 canonical turn,防止延迟操作影响新运行;旧 API 客户端可通过 `x-dsh-edge-turn-seq` 启用同样的校验。
37
+
38
+ 每个 owner 最多接受 128 条未收尾输入和 2 MiB 的序列化输入数据。容量耗尽返回 HTTP 429(`QUEUE_FULL`)或 RPC `agent-busy`;待积压任务减少后重试。浏览器 RPC 重试复用 `requestId`(旧客户端复用 `rpcId`);原始 SSE 调用可提供最长 128 字符的 `Idempotency-Key`。同一身份携带不同内容会失败。并发 steer 重试共享准入结果;被拒绝的 steer 再次重试仍返回拒绝,重启后也一样。若收件箱已接受变更但持久化屏障失败,则阻止模型消费并释放 steering 容量;从队列提升的输入保留原先已接受的收件状态。原始 SSE 先发送收件注释,并返回 `x-dsh-edge-input-id`;断开流不会取消排队输入,可通过 `session.updateQueue` 移除。
39
+
40
+ 实际工具执行共享两个许可,最多等待 32 项,排队期限 30 秒,合作式执行期限 60 秒。工具池期限是额外的上限:bash 配置更长的超时不会延长它,交互式 `ask_user_question` / `exit_plan_mode` 也必须在此期限内结束。取消后必须等清理结束才归还许可。上游的并行/独占分类继续有效;嵌套调用继承根执行预算。后台标题流单独使用一个有界许可,保留上游超时。这些限制不能中断无界同步代码,也不会为每个工具分配独立内存。
41
+
42
+ 输入请求和完成事件立即推进队列。现有 downlink 过期 alarm 同时检查持久工作;运行中的恢复检查间隔为 30 秒,alarm 每次等待一份驻留执行结束。用户主动取消会结束当前 turn,并在清理完成后继续处理排队输入。每次驻留独立获得十分钟期限,为 alarm 的平台时限留出清理余量。重启后标记中断,暂停该会话的后续输入;用户发送新消息可明确恢复待处理输入。短暂的模型错误(provider 故障、输出上限)不会暂停后续输入;仅崩溃恢复和驻留超时触发暂停。结果未知的外部工具副作用不会自动重放。冷历史订阅在交付快照后释放准备状态,不会激活 Agent。`/plan` 等 Agent 作用域命令临时使用同一个驻留预算。冷会话切换模型仍会发布上游的持久投影。不新增 subagent 或独立的 cron 执行槽。
43
+
44
+ 构建并提升产物(`pnpm run bundle:workers`)后,在本包目录运行 `DSH_EDGE_PLAYWRIGHT_CHANNEL=chrome node tests/runtime-queues.probe.mjs`,可用真实浏览器 tab 本地验证。设置 `DSH_EDGE_TEST_RUNTIME_MODE=isolated` 可验证 Dynamic Worker 模式。探针使用本地模拟 provider,检查实际 HTTP 并发与取消,并关闭所有 tab 后重启 Worker 验证 alarm 恢复。
45
+
46
+ ## 定时提醒
47
+
48
+ 可以要求 Agent “十分钟后提醒我检查 PR”。直接复用已发布上游的 `schedule_create`、`schedule_list` 和 `schedule_delete` 工具,管理属于当前会话的提醒。支持延迟 `after_seconds`、带明确偏移或时区的绝对时间 `at`,以及最短 300 秒的固定间隔 `every_seconds`;不支持日历 cron 表达式。通过 Agent 列出或删除提醒,本适配不新增独立的定时任务目录 UI。
49
+
50
+ Edge 用 Durable Object alarm 替代上游仅在活跃 Agent 中存在的 timer。到期后会自动恢复冷会话,即使所有浏览器 tab 都已关闭。提醒进入现有持久输入队列,共享唯一主会话槽和并发为 2 的短工具池。不取消或 steer 正在执行的任务,已排队消息保持原有顺序。提醒留在原会话中,要求模型呈现提醒内容,而不是把它当作新的用户执行指令;不发送邮件、推送或外部通知,也不创建新 session。
51
+
52
+ 到期时间索引随 canonical `schedule/change` 写入维护。dispatch 事件和提醒入队在同一 SQLite 事务中提交,alarm 也在该事务中设置。到期的一次性提醒优先于周期提醒批次;错过多个周期时,每条周期提醒只呈现最新一次,并直接推进至未来的下一次时间。每个 owner 最多保留 128 条活跃提醒,每条 prompt 的 JSON 编码预算为 4 KiB。提醒准备阶段在 dispatch flush 之前预留队列容量;容量不足时,先让用户任务排空。提醒准入失败后按会话退避 30 秒,重试时间跨重启持久保存。失败会话不会阻塞健康会话的到期提醒或排队输入;即使容量仅被暂停输入占用,也不会高频唤醒。崩溃后有待处理输入且已暂停的会话,仍需用户发送新消息恢复;提醒不会覆盖该暂停状态,也不会重放中断的外部副作用。dispatch 只确认已入队,不表示模型执行成功或用户已读。真正损坏的日志尾部在修复时会原子重建对应提醒索引;若提醒事件本身无法解码或损坏尾部包含已投递提醒,则要求人工恢复,避免重复投递。
53
+
54
+ 构建后,在此包目录运行 `DSH_EDGE_PLAYWRIGHT_CHANNEL=chrome node tests/schedule.probe.mjs`,验证忙时顺序、删除提醒及 Worker 重启后的 alarm 恢复;设置 `DSH_EDGE_TEST_RUNTIME_MODE=isolated` 验证 Dynamic Worker 模式。浏览器快照测试还会通过原生输入框创建提醒、关闭页面、仅观察模型服务而不请求 DO,再打开会话确认投递结果。
55
+
34
56
  ## 快速导航
35
57
 
36
58
  - [子系统 wiki:架构与路线图](https://github.com/pawaca/dsh-edge/wiki)
@@ -35,7 +35,7 @@ SOFTWARE.
35
35
 
36
36
  ## Bundled component inventory
37
37
 
38
- The following 507 package versions form the conservative, platform-neutral production closure used to assemble the Web and Worker artifacts in this distribution. Platform-specific build binaries that are not distributed in those artifacts are excluded; tree shaking can omit additional code. The inventory and legal texts are generated during packaging rather than referring recipients to a source checkout. License expressions are SPDX identifiers supplied by each package. Dependencies installed separately by npm remain declared in this package's `package.json`.
38
+ The following 508 package versions form the conservative, platform-neutral production closure used to assemble the Web and Worker artifacts in this distribution. Platform-specific build binaries that are not distributed in those artifacts are excluded; tree shaking can omit additional code. The inventory and legal texts are generated during packaging rather than referring recipients to a source checkout. License expressions are SPDX identifiers supplied by each package. Dependencies installed separately by npm remain declared in this package's `package.json`.
39
39
 
40
40
  | Component | License |
41
41
  | --- | --- |
@@ -195,6 +195,7 @@ The following 507 package versions form the conservative, platform-neutral produ
195
195
  | `@deepseek-ai/dsh-sandbox-local@0.1.2-rc.1` | `MIT` |
196
196
  | `@deepseek-ai/dsh-sandbox-policy@0.1.2-rc.1` | `MIT` |
197
197
  | `@deepseek-ai/dsh-sandbox-windows-acl@0.1.2-rc.1` | `MIT` |
198
+ | `@deepseek-ai/dsh-schedule@0.1.2-rc.1` | `MIT` |
198
199
  | `@deepseek-ai/dsh-scope@0.1.2-rc.1` | `MIT` |
199
200
  | `@deepseek-ai/dsh-session@0.1.2-rc.1` | `MIT` |
200
201
  | `@deepseek-ai/dsh-session-checkpoint-policy@0.1.2-rc.1` | `MIT` |
@@ -9461,6 +9462,7 @@ Applies to:
9461
9462
  - `@deepseek-ai/dsh-sandbox-local@0.1.2-rc.1` (`LICENSE`)
9462
9463
  - `@deepseek-ai/dsh-sandbox-policy@0.1.2-rc.1` (`LICENSE`)
9463
9464
  - `@deepseek-ai/dsh-sandbox-windows-acl@0.1.2-rc.1` (`LICENSE`)
9465
+ - `@deepseek-ai/dsh-schedule@0.1.2-rc.1` (`LICENSE`)
9464
9466
  - `@deepseek-ai/dsh-scope@0.1.2-rc.1` (`LICENSE`)
9465
9467
  - `@deepseek-ai/dsh-session@0.1.2-rc.1` (`LICENSE`)
9466
9468
  - `@deepseek-ai/dsh-session-checkpoint-policy@0.1.2-rc.1` (`LICENSE`)
package/dist/index.html CHANGED
@@ -41,7 +41,7 @@ window.__ModuleLoader__={
41
41
  return exports.createClientModuleSystem(this,{id:registration.id,exports},options)
42
42
  }
43
43
  }
44
- })()</script><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-typert-registry/client.js?rev=808231ddba7f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-gateway/client.js?rev=2aa328e0c327"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-session-controller/client.js?rev=0f2e3f557f23"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js?rev=19c9dbd06ba0"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-connection/client.js?rev=591fb03319f6"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-remotes/client.js?rev=bd6479168f54"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-theme/client.js?rev=5ecfa6ad2755"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-locale/client.js?rev=375ec21a35c9"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-layout/client.js?rev=8f9e8a153e3d"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js?rev=735cca984913"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-session/client.js?rev=fbb203e48601"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js?rev=5b829a19228a"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings/client.js?rev=d6c4b822ae4e"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js?rev=674e107b1e67"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js?rev=76b0422346fd"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/client.js?rev=cd9231c8a406"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js?rev=994e980e7874"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-approval/client.js?rev=424faf699e01"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-chat/client.js?rev=6f129ca38726"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js?rev=8fb2a6f9caf8"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js?rev=d1b0b5de3c24"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-tool/client.js?rev=8d6c2bf8cd91"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js?rev=d43a5cfaa750"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js?rev=4cbab33b69c8"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js?rev=b3ff9d05d320"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js?rev=f5e66af62586"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-commands/client.js?rev=21882fe9068f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-skill/client.js?rev=2b27527f9954"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js?rev=fe11d0f231df"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-reference/client.js?rev=fdafc37794b4"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js?rev=a9318fb778e0"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js?rev=5654b19b06a3"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-goal/client.js?rev=f49ccb6f80bb"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js?rev=3f4931c00829"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js?rev=d6f4aa47af6f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js?rev=c24e5a1f666b"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js?rev=785e52fbd47f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-plugins/client.js?rev=0b1048b32bba"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-plan/client.js?rev=6406b5e5f238"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js?rev=46d9b6401a1f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js?rev=23e10d2434ae"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-directory-picker-browse/client.js?rev=3f9d3963bc94"><link rel="preload" as="script" href="/plugins/dsh-edge-client-ui/client.js?rev=51e6845c5765"><script src="/plugins/@deepseek-ai/dsh-client-modules/client.js?rev=e3bfba69eef8"></script><script>globalThis["__DSH_BOOT__"] = {"rev":"b2391a9ba83f","entries":[{"id":"@deepseek-ai/dsh-typert-registry","url":"/plugins/@deepseek-ai/dsh-typert-registry/client.js?rev=808231ddba7f","rev":"808231ddba7f","inject":[],"immediately":true},{"id":"@deepseek-ai/dsh-api-gateway","url":"/plugins/@deepseek-ai/dsh-api-gateway/client.js?rev=2aa328e0c327","rev":"2aa328e0c327","inject":["@deepseek-ai/dsh-typert-registry","@deepseek-ai/dsh-client-connection"],"immediately":true},{"id":"@deepseek-ai/dsh-api-session-controller","url":"/plugins/@deepseek-ai/dsh-api-session-controller/client.js?rev=0f2e3f557f23","rev":"0f2e3f557f23","inject":["@deepseek-ai/dsh-api-gateway"],"external":["@deepseek-ai/dsh-api-gateway/client"]},{"id":"@deepseek-ai/dsh-api-workspace-controller","url":"/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js?rev=19c9dbd06ba0","rev":"19c9dbd06ba0","inject":["@deepseek-ai/dsh-api-gateway","@deepseek-ai/dsh-client-connection"],"external":["@deepseek-ai/dsh-api-gateway/client"]},{"id":"@deepseek-ai/dsh-client-modules","url":"/plugins/@deepseek-ai/dsh-client-modules/client.js?rev=e3bfba69eef8","rev":"e3bfba69eef8","inject":[],"immediately":true},{"id":"@deepseek-ai/dsh-client-connection","url":"/plugins/@deepseek-ai/dsh-client-connection/client.js?rev=591fb03319f6","rev":"591fb03319f6","inject":[],"immediately":true},{"id":"@deepseek-ai/dsh-api-remotes","url":"/plugins/@deepseek-ai/dsh-api-remotes/client.js?rev=bd6479168f54","rev":"bd6479168f54","inject":["@deepseek-ai/dsh-api-gateway"],"immediately":true},{"id":"@deepseek-ai/dsh-client-ui-theme","url":"/plugins/@deepseek-ai/dsh-client-ui-theme/client.js?rev=5ecfa6ad2755","rev":"5ecfa6ad2755","inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-api-remotes"],"immediately":true},{"id":"@deepseek-ai/dsh-client-locale","url":"/plugins/@deepseek-ai/dsh-client-locale/client.js?rev=375ec21a35c9","rev":"375ec21a35c9","inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-api-remotes"],"immediately":true},{"id":"@deepseek-ai/dsh-client-ui-layout","url":"/plugins/@deepseek-ai/dsh-client-ui-layout/client.js?rev=8f9e8a153e3d","rev":"8f9e8a153e3d","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-theme"]},{"id":"@deepseek-ai/dsh-client-ui-renderer","url":"/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js?rev=735cca984913","rev":"735cca984913","immediately":true},{"id":"@deepseek-ai/dsh-client-ui-session","url":"/plugins/@deepseek-ai/dsh-client-ui-session/client.js?rev=fbb203e48601","rev":"fbb203e48601","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-sidebar","url":"/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js?rev=5b829a19228a","rev":"5b829a19228a","inject":["@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-workspace","@deepseek-ai/dsh-client-locale"]},{"id":"@deepseek-ai/dsh-client-ui-settings","url":"/plugins/@deepseek-ai/dsh-client-ui-settings/client.js?rev=d6c4b822ae4e","rev":"d6c4b822ae4e","inject":["@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-settings-general","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js?rev=674e107b1e67","rev":"674e107b1e67","inject":["@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-sidebar"]},{"id":"@deepseek-ai/dsh-client-ui-settings-models","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js?rev=76b0422346fd","rev":"76b0422346fd","inject":["@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-settings-plugin-inventory","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/client.js?rev=cd9231c8a406","rev":"cd9231c8a406","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-agent-preset"]},{"id":"@deepseek-ai/dsh-client-ui-conversation","url":"/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js?rev=994e980e7874","rev":"994e980e7874","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-workspace"]},{"id":"@deepseek-ai/dsh-client-ui-approval","url":"/plugins/@deepseek-ai/dsh-client-ui-approval/client.js?rev=424faf699e01","rev":"424faf699e01","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-chat","url":"/plugins/@deepseek-ai/dsh-client-ui-chat/client.js?rev=6f129ca38726","rev":"6f129ca38726","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-workspace"]},{"id":"@deepseek-ai/dsh-client-ui-brand-official","url":"/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js?rev=8fb2a6f9caf8","rev":"8fb2a6f9caf8","inject":["@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-sidebar"]},{"id":"@deepseek-ai/dsh-client-ui-attachment","url":"/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js?rev=d1b0b5de3c24","rev":"d1b0b5de3c24","inject":["@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-trajectory"]},{"id":"@deepseek-ai/dsh-client-ui-tool","url":"/plugins/@deepseek-ai/dsh-client-ui-tool/client.js?rev=8d6c2bf8cd91","rev":"8d6c2bf8cd91","inject":["@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation"]},{"id":"@deepseek-ai/dsh-client-ui-workflow-run","url":"/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js?rev=d43a5cfaa750","rev":"d43a5cfaa750","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-deliverables","url":"/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js?rev=4cbab33b69c8","rev":"4cbab33b69c8","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-workspace","url":"/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js?rev=b3ff9d05d320","rev":"b3ff9d05d320","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-sidebar"]},{"id":"@deepseek-ai/dsh-client-ui-input-trigger","url":"/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js?rev=f5e66af62586","rev":"f5e66af62586","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-commands","url":"/plugins/@deepseek-ai/dsh-client-ui-commands/client.js?rev=21882fe9068f","rev":"21882fe9068f","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-input-trigger","@deepseek-ai/dsh-client-ui-conversation"]},{"id":"@deepseek-ai/dsh-client-ui-skill","url":"/plugins/@deepseek-ai/dsh-client-ui-skill/client.js?rev=2b27527f9954","rev":"2b27527f9954","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-tool","@deepseek-ai/dsh-client-ui-input-trigger","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-subagent","url":"/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js?rev=fe11d0f231df","rev":"fe11d0f231df","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-primitives","@deepseek-ai/dsh-client-ui-input-trigger"]},{"id":"@deepseek-ai/dsh-client-ui-reference","url":"/plugins/@deepseek-ai/dsh-client-ui-reference/client.js?rev=fdafc37794b4","rev":"fdafc37794b4","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-input-trigger"]},{"id":"@deepseek-ai/dsh-client-ui-schedule","url":"/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js?rev=a9318fb778e0","rev":"a9318fb778e0","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-primitives"]},{"id":"@deepseek-ai/dsh-client-ui-jobs","url":"/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js?rev=5654b19b06a3","rev":"5654b19b06a3","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-primitives"]},{"id":"@deepseek-ai/dsh-client-ui-goal","url":"/plugins/@deepseek-ai/dsh-client-ui-goal/client.js?rev=f49ccb6f80bb","rev":"f49ccb6f80bb","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-message-feedback","url":"/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js?rev=3f4931c00829","rev":"3f4931c00829","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-model-selection","url":"/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js?rev=d6f4aa47af6f","rev":"d6f4aa47af6f","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-commands","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-permission-presets","url":"/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js?rev=c24e5a1f666b","rev":"c24e5a1f666b","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-commands","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"]},{"id":"@deepseek-ai/dsh-client-ui-agent-preset","url":"/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js?rev=785e52fbd47f","rev":"785e52fbd47f","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-workspace","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-settings-plugins","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugins/client.js?rev=0b1048b32bba","rev":"0b1048b32bba","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-plan","url":"/plugins/@deepseek-ai/dsh-client-ui-plan/client.js?rev=6406b5e5f238","rev":"6406b5e5f238","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation"]},{"id":"@deepseek-ai/dsh-client-ui-user-questions","url":"/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js?rev=46d9b6401a1f","rev":"46d9b6401a1f","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-trajectory","url":"/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js?rev=23e10d2434ae","rev":"23e10d2434ae","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-directory-picker-browse","url":"/plugins/@deepseek-ai/dsh-client-ui-directory-picker-browse/client.js?rev=3f9d3963bc94","rev":"3f9d3963bc94","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-workspace","@deepseek-ai/dsh-client-locale"]},{"id":"dsh-edge-client-ui","url":"/plugins/dsh-edge-client-ui/client.js?rev=51e6845c5765","rev":"51e6845c5765","inject":["@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale"]}],"batches":[{"phase":"bootstrap","url":"/plugins/@deepseek-ai/dsh-client-modules/client.js?rev=e3bfba69eef8","rev":"e3bfba69eef8","entries":["@deepseek-ai/dsh-client-modules"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-typert-registry/client.js?rev=808231ddba7f","rev":"808231ddba7f","entries":["@deepseek-ai/dsh-typert-registry"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-gateway/client.js?rev=2aa328e0c327","rev":"2aa328e0c327","entries":["@deepseek-ai/dsh-api-gateway"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-session-controller/client.js?rev=0f2e3f557f23","rev":"0f2e3f557f23","entries":["@deepseek-ai/dsh-api-session-controller"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js?rev=19c9dbd06ba0","rev":"19c9dbd06ba0","entries":["@deepseek-ai/dsh-api-workspace-controller"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-connection/client.js?rev=591fb03319f6","rev":"591fb03319f6","entries":["@deepseek-ai/dsh-client-connection"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-remotes/client.js?rev=bd6479168f54","rev":"bd6479168f54","entries":["@deepseek-ai/dsh-api-remotes"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-theme/client.js?rev=5ecfa6ad2755","rev":"5ecfa6ad2755","entries":["@deepseek-ai/dsh-client-ui-theme"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-locale/client.js?rev=375ec21a35c9","rev":"375ec21a35c9","entries":["@deepseek-ai/dsh-client-locale"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-layout/client.js?rev=8f9e8a153e3d","rev":"8f9e8a153e3d","entries":["@deepseek-ai/dsh-client-ui-layout"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js?rev=735cca984913","rev":"735cca984913","entries":["@deepseek-ai/dsh-client-ui-renderer"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-session/client.js?rev=fbb203e48601","rev":"fbb203e48601","entries":["@deepseek-ai/dsh-client-ui-session"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js?rev=5b829a19228a","rev":"5b829a19228a","entries":["@deepseek-ai/dsh-client-ui-sidebar"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings/client.js?rev=d6c4b822ae4e","rev":"d6c4b822ae4e","entries":["@deepseek-ai/dsh-client-ui-settings"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js?rev=674e107b1e67","rev":"674e107b1e67","entries":["@deepseek-ai/dsh-client-ui-settings-general"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js?rev=76b0422346fd","rev":"76b0422346fd","entries":["@deepseek-ai/dsh-client-ui-settings-models"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/client.js?rev=cd9231c8a406","rev":"cd9231c8a406","entries":["@deepseek-ai/dsh-client-ui-settings-plugin-inventory"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js?rev=994e980e7874","rev":"994e980e7874","entries":["@deepseek-ai/dsh-client-ui-conversation"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-approval/client.js?rev=424faf699e01","rev":"424faf699e01","entries":["@deepseek-ai/dsh-client-ui-approval"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-chat/client.js?rev=6f129ca38726","rev":"6f129ca38726","entries":["@deepseek-ai/dsh-client-ui-chat"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js?rev=8fb2a6f9caf8","rev":"8fb2a6f9caf8","entries":["@deepseek-ai/dsh-client-ui-brand-official"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js?rev=d1b0b5de3c24","rev":"d1b0b5de3c24","entries":["@deepseek-ai/dsh-client-ui-attachment"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-tool/client.js?rev=8d6c2bf8cd91","rev":"8d6c2bf8cd91","entries":["@deepseek-ai/dsh-client-ui-tool"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js?rev=d43a5cfaa750","rev":"d43a5cfaa750","entries":["@deepseek-ai/dsh-client-ui-workflow-run"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js?rev=4cbab33b69c8","rev":"4cbab33b69c8","entries":["@deepseek-ai/dsh-client-ui-deliverables"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js?rev=b3ff9d05d320","rev":"b3ff9d05d320","entries":["@deepseek-ai/dsh-client-ui-workspace"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js?rev=f5e66af62586","rev":"f5e66af62586","entries":["@deepseek-ai/dsh-client-ui-input-trigger"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-commands/client.js?rev=21882fe9068f","rev":"21882fe9068f","entries":["@deepseek-ai/dsh-client-ui-commands"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-skill/client.js?rev=2b27527f9954","rev":"2b27527f9954","entries":["@deepseek-ai/dsh-client-ui-skill"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js?rev=fe11d0f231df","rev":"fe11d0f231df","entries":["@deepseek-ai/dsh-client-ui-subagent"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-reference/client.js?rev=fdafc37794b4","rev":"fdafc37794b4","entries":["@deepseek-ai/dsh-client-ui-reference"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js?rev=a9318fb778e0","rev":"a9318fb778e0","entries":["@deepseek-ai/dsh-client-ui-schedule"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js?rev=5654b19b06a3","rev":"5654b19b06a3","entries":["@deepseek-ai/dsh-client-ui-jobs"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-goal/client.js?rev=f49ccb6f80bb","rev":"f49ccb6f80bb","entries":["@deepseek-ai/dsh-client-ui-goal"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js?rev=3f4931c00829","rev":"3f4931c00829","entries":["@deepseek-ai/dsh-client-ui-message-feedback"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js?rev=d6f4aa47af6f","rev":"d6f4aa47af6f","entries":["@deepseek-ai/dsh-client-ui-model-selection"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js?rev=c24e5a1f666b","rev":"c24e5a1f666b","entries":["@deepseek-ai/dsh-client-ui-permission-presets"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js?rev=785e52fbd47f","rev":"785e52fbd47f","entries":["@deepseek-ai/dsh-client-ui-agent-preset"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugins/client.js?rev=0b1048b32bba","rev":"0b1048b32bba","entries":["@deepseek-ai/dsh-client-ui-settings-plugins"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-plan/client.js?rev=6406b5e5f238","rev":"6406b5e5f238","entries":["@deepseek-ai/dsh-client-ui-plan"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js?rev=46d9b6401a1f","rev":"46d9b6401a1f","entries":["@deepseek-ai/dsh-client-ui-user-questions"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js?rev=23e10d2434ae","rev":"23e10d2434ae","entries":["@deepseek-ai/dsh-client-ui-trajectory"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-directory-picker-browse/client.js?rev=3f9d3963bc94","rev":"3f9d3963bc94","entries":["@deepseek-ai/dsh-client-ui-directory-picker-browse"]},{"phase":"application","url":"/plugins/dsh-edge-client-ui/client.js?rev=51e6845c5765","rev":"51e6845c5765","entries":["dsh-edge-client-ui"]}]}</script>
44
+ })()</script><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-typert-registry/client.js?rev=808231ddba7f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-gateway/client.js?rev=2aa328e0c327"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-session-controller/client.js?rev=0f2e3f557f23"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js?rev=19c9dbd06ba0"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-connection/client.js?rev=591fb03319f6"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-api-remotes/client.js?rev=bd6479168f54"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-theme/client.js?rev=5ecfa6ad2755"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-locale/client.js?rev=375ec21a35c9"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-layout/client.js?rev=8f9e8a153e3d"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js?rev=735cca984913"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-session/client.js?rev=fbb203e48601"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js?rev=5b829a19228a"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings/client.js?rev=d6c4b822ae4e"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js?rev=674e107b1e67"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js?rev=76b0422346fd"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/client.js?rev=cd9231c8a406"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js?rev=994e980e7874"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-approval/client.js?rev=424faf699e01"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-chat/client.js?rev=6f129ca38726"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js?rev=8fb2a6f9caf8"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js?rev=d1b0b5de3c24"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-tool/client.js?rev=8d6c2bf8cd91"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js?rev=d43a5cfaa750"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js?rev=4cbab33b69c8"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js?rev=b3ff9d05d320"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js?rev=f5e66af62586"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-commands/client.js?rev=21882fe9068f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-skill/client.js?rev=2b27527f9954"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js?rev=fe11d0f231df"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-reference/client.js?rev=fdafc37794b4"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js?rev=a9318fb778e0"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js?rev=5654b19b06a3"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-goal/client.js?rev=f49ccb6f80bb"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js?rev=3f4931c00829"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js?rev=d6f4aa47af6f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js?rev=c24e5a1f666b"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js?rev=785e52fbd47f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-settings-plugins/client.js?rev=0b1048b32bba"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-plan/client.js?rev=6406b5e5f238"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js?rev=46d9b6401a1f"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js?rev=23e10d2434ae"><link rel="preload" as="script" href="/plugins/@deepseek-ai/dsh-client-ui-directory-picker-browse/client.js?rev=3f9d3963bc94"><link rel="preload" as="script" href="/plugins/dsh-edge-client-ui/client.js?rev=6020b270efcb"><script src="/plugins/@deepseek-ai/dsh-client-modules/client.js?rev=e3bfba69eef8"></script><script>globalThis["__DSH_BOOT__"] = {"rev":"ef31b24ed26c","entries":[{"id":"@deepseek-ai/dsh-typert-registry","url":"/plugins/@deepseek-ai/dsh-typert-registry/client.js?rev=808231ddba7f","rev":"808231ddba7f","inject":[],"immediately":true},{"id":"@deepseek-ai/dsh-api-gateway","url":"/plugins/@deepseek-ai/dsh-api-gateway/client.js?rev=2aa328e0c327","rev":"2aa328e0c327","inject":["@deepseek-ai/dsh-typert-registry","@deepseek-ai/dsh-client-connection"],"immediately":true},{"id":"@deepseek-ai/dsh-api-session-controller","url":"/plugins/@deepseek-ai/dsh-api-session-controller/client.js?rev=0f2e3f557f23","rev":"0f2e3f557f23","inject":["@deepseek-ai/dsh-api-gateway"],"external":["@deepseek-ai/dsh-api-gateway/client"]},{"id":"@deepseek-ai/dsh-api-workspace-controller","url":"/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js?rev=19c9dbd06ba0","rev":"19c9dbd06ba0","inject":["@deepseek-ai/dsh-api-gateway","@deepseek-ai/dsh-client-connection"],"external":["@deepseek-ai/dsh-api-gateway/client"]},{"id":"@deepseek-ai/dsh-client-modules","url":"/plugins/@deepseek-ai/dsh-client-modules/client.js?rev=e3bfba69eef8","rev":"e3bfba69eef8","inject":[],"immediately":true},{"id":"@deepseek-ai/dsh-client-connection","url":"/plugins/@deepseek-ai/dsh-client-connection/client.js?rev=591fb03319f6","rev":"591fb03319f6","inject":[],"immediately":true},{"id":"@deepseek-ai/dsh-api-remotes","url":"/plugins/@deepseek-ai/dsh-api-remotes/client.js?rev=bd6479168f54","rev":"bd6479168f54","inject":["@deepseek-ai/dsh-api-gateway"],"immediately":true},{"id":"@deepseek-ai/dsh-client-ui-theme","url":"/plugins/@deepseek-ai/dsh-client-ui-theme/client.js?rev=5ecfa6ad2755","rev":"5ecfa6ad2755","inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-api-remotes"],"immediately":true},{"id":"@deepseek-ai/dsh-client-locale","url":"/plugins/@deepseek-ai/dsh-client-locale/client.js?rev=375ec21a35c9","rev":"375ec21a35c9","inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-api-remotes"],"immediately":true},{"id":"@deepseek-ai/dsh-client-ui-layout","url":"/plugins/@deepseek-ai/dsh-client-ui-layout/client.js?rev=8f9e8a153e3d","rev":"8f9e8a153e3d","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-theme"]},{"id":"@deepseek-ai/dsh-client-ui-renderer","url":"/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js?rev=735cca984913","rev":"735cca984913","immediately":true},{"id":"@deepseek-ai/dsh-client-ui-session","url":"/plugins/@deepseek-ai/dsh-client-ui-session/client.js?rev=fbb203e48601","rev":"fbb203e48601","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-sidebar","url":"/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js?rev=5b829a19228a","rev":"5b829a19228a","inject":["@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-workspace","@deepseek-ai/dsh-client-locale"]},{"id":"@deepseek-ai/dsh-client-ui-settings","url":"/plugins/@deepseek-ai/dsh-client-ui-settings/client.js?rev=d6c4b822ae4e","rev":"d6c4b822ae4e","inject":["@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-settings-general","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js?rev=674e107b1e67","rev":"674e107b1e67","inject":["@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-sidebar"]},{"id":"@deepseek-ai/dsh-client-ui-settings-models","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js?rev=76b0422346fd","rev":"76b0422346fd","inject":["@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-settings-plugin-inventory","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/client.js?rev=cd9231c8a406","rev":"cd9231c8a406","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-agent-preset"]},{"id":"@deepseek-ai/dsh-client-ui-conversation","url":"/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js?rev=994e980e7874","rev":"994e980e7874","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-workspace"]},{"id":"@deepseek-ai/dsh-client-ui-approval","url":"/plugins/@deepseek-ai/dsh-client-ui-approval/client.js?rev=424faf699e01","rev":"424faf699e01","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-chat","url":"/plugins/@deepseek-ai/dsh-client-ui-chat/client.js?rev=6f129ca38726","rev":"6f129ca38726","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-workspace"]},{"id":"@deepseek-ai/dsh-client-ui-brand-official","url":"/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js?rev=8fb2a6f9caf8","rev":"8fb2a6f9caf8","inject":["@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-sidebar"]},{"id":"@deepseek-ai/dsh-client-ui-attachment","url":"/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js?rev=d1b0b5de3c24","rev":"d1b0b5de3c24","inject":["@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-trajectory"]},{"id":"@deepseek-ai/dsh-client-ui-tool","url":"/plugins/@deepseek-ai/dsh-client-ui-tool/client.js?rev=8d6c2bf8cd91","rev":"8d6c2bf8cd91","inject":["@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation"]},{"id":"@deepseek-ai/dsh-client-ui-workflow-run","url":"/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js?rev=d43a5cfaa750","rev":"d43a5cfaa750","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-deliverables","url":"/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js?rev=4cbab33b69c8","rev":"4cbab33b69c8","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-workspace","url":"/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js?rev=b3ff9d05d320","rev":"b3ff9d05d320","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-sidebar"]},{"id":"@deepseek-ai/dsh-client-ui-input-trigger","url":"/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js?rev=f5e66af62586","rev":"f5e66af62586","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-commands","url":"/plugins/@deepseek-ai/dsh-client-ui-commands/client.js?rev=21882fe9068f","rev":"21882fe9068f","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-input-trigger","@deepseek-ai/dsh-client-ui-conversation"]},{"id":"@deepseek-ai/dsh-client-ui-skill","url":"/plugins/@deepseek-ai/dsh-client-ui-skill/client.js?rev=2b27527f9954","rev":"2b27527f9954","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-tool","@deepseek-ai/dsh-client-ui-input-trigger","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-subagent","url":"/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js?rev=fe11d0f231df","rev":"fe11d0f231df","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-primitives","@deepseek-ai/dsh-client-ui-input-trigger"]},{"id":"@deepseek-ai/dsh-client-ui-reference","url":"/plugins/@deepseek-ai/dsh-client-ui-reference/client.js?rev=fdafc37794b4","rev":"fdafc37794b4","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-input-trigger"]},{"id":"@deepseek-ai/dsh-client-ui-schedule","url":"/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js?rev=a9318fb778e0","rev":"a9318fb778e0","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-primitives"]},{"id":"@deepseek-ai/dsh-client-ui-jobs","url":"/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js?rev=5654b19b06a3","rev":"5654b19b06a3","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-primitives"]},{"id":"@deepseek-ai/dsh-client-ui-goal","url":"/plugins/@deepseek-ai/dsh-client-ui-goal/client.js?rev=f49ccb6f80bb","rev":"f49ccb6f80bb","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-chat","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-message-feedback","url":"/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js?rev=3f4931c00829","rev":"3f4931c00829","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer"]},{"id":"@deepseek-ai/dsh-client-ui-model-selection","url":"/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js?rev=d6f4aa47af6f","rev":"d6f4aa47af6f","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-commands","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-permission-presets","url":"/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js?rev=c24e5a1f666b","rev":"c24e5a1f666b","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-commands","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"]},{"id":"@deepseek-ai/dsh-client-ui-agent-preset","url":"/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js?rev=785e52fbd47f","rev":"785e52fbd47f","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-session","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-workspace","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-settings-plugins","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugins/client.js?rev=0b1048b32bba","rev":"0b1048b32bba","inject":["@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-api-remotes"]},{"id":"@deepseek-ai/dsh-client-ui-plan","url":"/plugins/@deepseek-ai/dsh-client-ui-plan/client.js?rev=6406b5e5f238","rev":"6406b5e5f238","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation"]},{"id":"@deepseek-ai/dsh-client-ui-user-questions","url":"/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js?rev=46d9b6401a1f","rev":"46d9b6401a1f","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-trajectory","url":"/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js?rev=23e10d2434ae","rev":"23e10d2434ae","inject":["@deepseek-ai/dsh-api-session-controller","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-ui-conversation","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-session"]},{"id":"@deepseek-ai/dsh-client-ui-directory-picker-browse","url":"/plugins/@deepseek-ai/dsh-client-ui-directory-picker-browse/client.js?rev=3f9d3963bc94","rev":"3f9d3963bc94","inject":["@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-renderer","@deepseek-ai/dsh-client-ui-workspace","@deepseek-ai/dsh-client-locale"]},{"id":"dsh-edge-client-ui","url":"/plugins/dsh-edge-client-ui/client.js?rev=6020b270efcb","rev":"6020b270efcb","inject":["@deepseek-ai/dsh-api-workspace-controller","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale"]}],"batches":[{"phase":"bootstrap","url":"/plugins/@deepseek-ai/dsh-client-modules/client.js?rev=e3bfba69eef8","rev":"e3bfba69eef8","entries":["@deepseek-ai/dsh-client-modules"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-typert-registry/client.js?rev=808231ddba7f","rev":"808231ddba7f","entries":["@deepseek-ai/dsh-typert-registry"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-gateway/client.js?rev=2aa328e0c327","rev":"2aa328e0c327","entries":["@deepseek-ai/dsh-api-gateway"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-session-controller/client.js?rev=0f2e3f557f23","rev":"0f2e3f557f23","entries":["@deepseek-ai/dsh-api-session-controller"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js?rev=19c9dbd06ba0","rev":"19c9dbd06ba0","entries":["@deepseek-ai/dsh-api-workspace-controller"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-connection/client.js?rev=591fb03319f6","rev":"591fb03319f6","entries":["@deepseek-ai/dsh-client-connection"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-api-remotes/client.js?rev=bd6479168f54","rev":"bd6479168f54","entries":["@deepseek-ai/dsh-api-remotes"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-theme/client.js?rev=5ecfa6ad2755","rev":"5ecfa6ad2755","entries":["@deepseek-ai/dsh-client-ui-theme"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-locale/client.js?rev=375ec21a35c9","rev":"375ec21a35c9","entries":["@deepseek-ai/dsh-client-locale"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-layout/client.js?rev=8f9e8a153e3d","rev":"8f9e8a153e3d","entries":["@deepseek-ai/dsh-client-ui-layout"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js?rev=735cca984913","rev":"735cca984913","entries":["@deepseek-ai/dsh-client-ui-renderer"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-session/client.js?rev=fbb203e48601","rev":"fbb203e48601","entries":["@deepseek-ai/dsh-client-ui-session"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js?rev=5b829a19228a","rev":"5b829a19228a","entries":["@deepseek-ai/dsh-client-ui-sidebar"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings/client.js?rev=d6c4b822ae4e","rev":"d6c4b822ae4e","entries":["@deepseek-ai/dsh-client-ui-settings"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js?rev=674e107b1e67","rev":"674e107b1e67","entries":["@deepseek-ai/dsh-client-ui-settings-general"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js?rev=76b0422346fd","rev":"76b0422346fd","entries":["@deepseek-ai/dsh-client-ui-settings-models"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/client.js?rev=cd9231c8a406","rev":"cd9231c8a406","entries":["@deepseek-ai/dsh-client-ui-settings-plugin-inventory"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js?rev=994e980e7874","rev":"994e980e7874","entries":["@deepseek-ai/dsh-client-ui-conversation"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-approval/client.js?rev=424faf699e01","rev":"424faf699e01","entries":["@deepseek-ai/dsh-client-ui-approval"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-chat/client.js?rev=6f129ca38726","rev":"6f129ca38726","entries":["@deepseek-ai/dsh-client-ui-chat"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js?rev=8fb2a6f9caf8","rev":"8fb2a6f9caf8","entries":["@deepseek-ai/dsh-client-ui-brand-official"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js?rev=d1b0b5de3c24","rev":"d1b0b5de3c24","entries":["@deepseek-ai/dsh-client-ui-attachment"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-tool/client.js?rev=8d6c2bf8cd91","rev":"8d6c2bf8cd91","entries":["@deepseek-ai/dsh-client-ui-tool"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js?rev=d43a5cfaa750","rev":"d43a5cfaa750","entries":["@deepseek-ai/dsh-client-ui-workflow-run"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js?rev=4cbab33b69c8","rev":"4cbab33b69c8","entries":["@deepseek-ai/dsh-client-ui-deliverables"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js?rev=b3ff9d05d320","rev":"b3ff9d05d320","entries":["@deepseek-ai/dsh-client-ui-workspace"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js?rev=f5e66af62586","rev":"f5e66af62586","entries":["@deepseek-ai/dsh-client-ui-input-trigger"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-commands/client.js?rev=21882fe9068f","rev":"21882fe9068f","entries":["@deepseek-ai/dsh-client-ui-commands"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-skill/client.js?rev=2b27527f9954","rev":"2b27527f9954","entries":["@deepseek-ai/dsh-client-ui-skill"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js?rev=fe11d0f231df","rev":"fe11d0f231df","entries":["@deepseek-ai/dsh-client-ui-subagent"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-reference/client.js?rev=fdafc37794b4","rev":"fdafc37794b4","entries":["@deepseek-ai/dsh-client-ui-reference"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js?rev=a9318fb778e0","rev":"a9318fb778e0","entries":["@deepseek-ai/dsh-client-ui-schedule"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js?rev=5654b19b06a3","rev":"5654b19b06a3","entries":["@deepseek-ai/dsh-client-ui-jobs"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-goal/client.js?rev=f49ccb6f80bb","rev":"f49ccb6f80bb","entries":["@deepseek-ai/dsh-client-ui-goal"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js?rev=3f4931c00829","rev":"3f4931c00829","entries":["@deepseek-ai/dsh-client-ui-message-feedback"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js?rev=d6f4aa47af6f","rev":"d6f4aa47af6f","entries":["@deepseek-ai/dsh-client-ui-model-selection"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js?rev=c24e5a1f666b","rev":"c24e5a1f666b","entries":["@deepseek-ai/dsh-client-ui-permission-presets"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js?rev=785e52fbd47f","rev":"785e52fbd47f","entries":["@deepseek-ai/dsh-client-ui-agent-preset"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-settings-plugins/client.js?rev=0b1048b32bba","rev":"0b1048b32bba","entries":["@deepseek-ai/dsh-client-ui-settings-plugins"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-plan/client.js?rev=6406b5e5f238","rev":"6406b5e5f238","entries":["@deepseek-ai/dsh-client-ui-plan"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js?rev=46d9b6401a1f","rev":"46d9b6401a1f","entries":["@deepseek-ai/dsh-client-ui-user-questions"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js?rev=23e10d2434ae","rev":"23e10d2434ae","entries":["@deepseek-ai/dsh-client-ui-trajectory"]},{"phase":"application","url":"/plugins/@deepseek-ai/dsh-client-ui-directory-picker-browse/client.js?rev=3f9d3963bc94","rev":"3f9d3963bc94","entries":["@deepseek-ai/dsh-client-ui-directory-picker-browse"]},{"phase":"application","url":"/plugins/dsh-edge-client-ui/client.js?rev=6020b270efcb","rev":"6020b270efcb","entries":["dsh-edge-client-ui"]}]}</script>
45
45
  <meta charset="utf-8" />
46
46
  <meta name="viewport" content="width=device-width, initial-scale=1" />
47
47
  <link rel="manifest" href="./manifest.webmanifest" />
@@ -11,6 +11,76 @@ window.__ModuleLoader__.load({
11
11
  let react = require("react");
12
12
  let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
13
13
  let react_jsx_runtime = require("react/jsx-runtime");
14
+ //#region ../../../packages/client/ui-edge/src/client/run-guards.ts
15
+ const row = (value) => typeof value === "object" && value !== null ? value : void 0;
16
+ function installRunGuards(session, transport = fetch) {
17
+ const turns = /* @__PURE__ */ new Map();
18
+ const originals = /* @__PURE__ */ new Map();
19
+ const observe = (id, value) => {
20
+ const frame = row(value);
21
+ const events = frame?.type === "snapshot" && Array.isArray(frame.records) ? frame.records : [frame];
22
+ for (const entry of events) {
23
+ const event = row(row(entry)?.event);
24
+ if (event?.type === "turn/start" && typeof event.seq === "number") turns.set(id, Math.max(turns.get(id) ?? -1, event.seq));
25
+ }
26
+ };
27
+ for (const method of [
28
+ "follow",
29
+ "prompt",
30
+ "cancel",
31
+ "updateQueue"
32
+ ]) {
33
+ const descriptor = Object.getOwnPropertyDescriptor(session, method);
34
+ const getter = descriptor?.get?.bind(session);
35
+ if (descriptor === void 0 || getter === void 0) continue;
36
+ originals.set(method, descriptor);
37
+ Object.defineProperty(session, method, {
38
+ configurable: true,
39
+ enumerable: true,
40
+ get: () => {
41
+ const upstream = getter();
42
+ if (method === "follow") return async function* (request, signal) {
43
+ const id = row(request.address)?.sessionId;
44
+ for await (const frame of upstream(request, signal)) {
45
+ if (typeof id === "string") observe(id, frame);
46
+ yield frame;
47
+ }
48
+ };
49
+ return (request, signal) => {
50
+ if (!(method === "cancel" || method === "prompt" && request.mode === "steer" || method === "updateQueue" && row(request.action)?.kind === "steer")) return upstream(request, signal);
51
+ return (async () => {
52
+ const response = await transport(`/api/session.${method}`, {
53
+ method: "POST",
54
+ headers: {
55
+ "content-type": "application/json",
56
+ "x-dsh-edge-turn-seq": String(turns.get(String(request.sessionId)) ?? -1)
57
+ },
58
+ body: JSON.stringify({
59
+ type: "client-request",
60
+ method: `session.${method}`,
61
+ rpcId: crypto.randomUUID(),
62
+ payload: request
63
+ }),
64
+ ...signal === void 0 ? {} : { signal }
65
+ });
66
+ if (!response.ok) return {
67
+ ok: false,
68
+ error: {
69
+ code: "session/busy",
70
+ message: "The observed run has ended. Refresh the session before retrying.",
71
+ details: {}
72
+ }
73
+ };
74
+ return (await response.json()).result;
75
+ })();
76
+ };
77
+ }
78
+ });
79
+ }
80
+ return () => {
81
+ for (const [method, descriptor] of originals) Object.defineProperty(session, method, descriptor);
82
+ };
83
+ }
14
84
  //#endregion
15
85
  //#region ../../../packages/client/ui-edge/src/client/store.ts
16
86
  var import_umd = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -564,6 +634,10 @@ window.__ModuleLoader__.load({
564
634
  inject: injected
565
635
  }, EdgeSettingsSection));
566
636
  ctx.inject(["remote.session"], (scope) => {
637
+ scope.effect(() => {
638
+ const session = scope.get("remote.session");
639
+ return session === void 0 ? () => {} : installRunGuards(session);
640
+ }, "ui-edge: observed run controls");
567
641
  scope.effect(() => {
568
642
  const session = scope.get("remote.session");
569
643
  const descriptor = session === void 0 ? void 0 : Object.getOwnPropertyDescriptor(session, "openWorkspacePath");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-edge",
3
- "version": "0.11.1",
3
+ "version": "0.12.0-alpha.2",
4
4
  "description": "Your DeepSeek Harness, anywhere — deploy a persistent personal coding agent to Cloudflare Workers in one command",
5
5
  "author": "pawaca",
6
6
  "license": "MIT",
@@ -87,6 +87,7 @@
87
87
  "@deepseek-ai/dsh-plan-mode": "0.1.2-rc.1",
88
88
  "@deepseek-ai/dsh-sandbox": "0.1.2-rc.1",
89
89
  "@deepseek-ai/dsh-scope": "0.1.2-rc.1",
90
+ "@deepseek-ai/dsh-schedule": "0.1.2-rc.1",
90
91
  "@deepseek-ai/dsh-session": "0.1.2-rc.1",
91
92
  "@deepseek-ai/dsh-session-persistence": "0.1.2-rc.1",
92
93
  "@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
@@ -1,6 +1,6 @@
1
1
  import { createHash, randomBytes } from 'node:crypto'
2
2
  import { execFile } from 'node:child_process'
3
- import { chmod, mkdtemp, open, rm, writeFile } from 'node:fs/promises'
3
+ import { chmod, mkdtemp, open, realpath, rm, writeFile } from 'node:fs/promises'
4
4
  import { createRequire } from 'node:module'
5
5
  import { tmpdir } from 'node:os'
6
6
  import { join } from 'node:path'
@@ -531,13 +531,31 @@ export async function installEdge({
531
531
  })
532
532
  requireSuccess(auth, 'Cloudflare sign-in failed')
533
533
  profile = LOGIN_PROFILE
534
- const signedIn = await requireAccounts({
535
- runWrangler,
536
- environment: profileEnvironment,
537
- profile,
538
- signal,
539
- })
540
- accounts = signedIn.accounts
534
+ // wrangler whoami rejects --profile; bind the profile to a throwaway
535
+ // directory and read accounts through --cwd instead. Canonicalize the
536
+ // path so the stored binding key matches process.cwd() after --cwd
537
+ // chdir (macOS resolves /var → /private/var on chdir).
538
+ const profileDir = await realpath(await createTemporaryDirectory())
539
+ try {
540
+ const activate = await runWrangler(
541
+ ['auth', 'activate', LOGIN_PROFILE, profileDir],
542
+ { environment: profileEnvironment, signal },
543
+ )
544
+ requireSuccess(activate, 'Could not activate the Cloudflare profile')
545
+ const signedIn = await requireAccounts({
546
+ runWrangler,
547
+ environment: profileEnvironment,
548
+ cwd: profileDir,
549
+ signal,
550
+ })
551
+ accounts = signedIn.accounts
552
+ } finally {
553
+ await runWrangler(
554
+ ['auth', 'deactivate', profileDir],
555
+ { environment: profileEnvironment },
556
+ ).catch(() => {})
557
+ await removePath(profileDir, { recursive: true, force: true }).catch(() => {})
558
+ }
541
559
  accountSelection = await ui.selectAccount(accountChoices(mode, accounts, command)
542
560
  .filter(choice => choice.value.startsWith('account:')))
543
561
  }
@@ -1192,8 +1210,11 @@ async function detectAccounts(options) {
1192
1210
  return parseWhoami(result.stdout)
1193
1211
  }
1194
1212
 
1195
- async function requireAccounts({ runWrangler, environment, profile, signal }) {
1196
- const result = await runWrangler(['whoami', '--json', ...profileArgs(profile)], {
1213
+ async function requireAccounts({ runWrangler, environment, cwd, signal }) {
1214
+ const result = await runWrangler([
1215
+ 'whoami', '--json',
1216
+ ...(cwd !== undefined ? ['--cwd', cwd] : []),
1217
+ ], {
1197
1218
  environment,
1198
1219
  signal,
1199
1220
  })