pi-maestro-mobile 0.4.0 → 0.5.1

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.
Files changed (176) hide show
  1. package/README.md +62 -11
  2. package/dist/application/application-command-router.d.ts +90 -0
  3. package/dist/application/application-command-router.d.ts.map +1 -0
  4. package/dist/application/application-command-router.js +58 -0
  5. package/dist/application/application-command-router.js.map +1 -0
  6. package/dist/application/monitor-query-service.d.ts +9 -0
  7. package/dist/application/monitor-query-service.d.ts.map +1 -0
  8. package/dist/application/monitor-query-service.js +13 -0
  9. package/dist/application/monitor-query-service.js.map +1 -0
  10. package/dist/application/monitor-read-service.d.ts +21 -0
  11. package/dist/application/monitor-read-service.d.ts.map +1 -0
  12. package/dist/application/monitor-read-service.js +47 -0
  13. package/dist/application/monitor-read-service.js.map +1 -0
  14. package/dist/application/session-command-service.d.ts +33 -0
  15. package/dist/application/session-command-service.d.ts.map +1 -0
  16. package/dist/application/session-command-service.js +80 -0
  17. package/dist/application/session-command-service.js.map +1 -0
  18. package/dist/application/session-query-service.d.ts +47 -0
  19. package/dist/application/session-query-service.d.ts.map +1 -0
  20. package/dist/application/session-query-service.js +373 -0
  21. package/dist/application/session-query-service.js.map +1 -0
  22. package/dist/application/session-visibility.d.ts +11 -0
  23. package/dist/application/session-visibility.d.ts.map +1 -0
  24. package/dist/application/session-visibility.js +32 -0
  25. package/dist/application/session-visibility.js.map +1 -0
  26. package/dist/broker-cli.d.ts +3 -0
  27. package/dist/broker-cli.d.ts.map +1 -0
  28. package/dist/broker-cli.js +79 -0
  29. package/dist/broker-cli.js.map +1 -0
  30. package/dist/cli.js +53 -6
  31. package/dist/cli.js.map +1 -1
  32. package/dist/control/SessionDirectory.d.ts +52 -0
  33. package/dist/control/SessionDirectory.d.ts.map +1 -0
  34. package/dist/control/SessionDirectory.js +235 -0
  35. package/dist/control/SessionDirectory.js.map +1 -0
  36. package/dist/control/desktop-control-gateway.d.ts +27 -0
  37. package/dist/control/desktop-control-gateway.d.ts.map +1 -0
  38. package/dist/control/desktop-control-gateway.js +150 -0
  39. package/dist/control/desktop-control-gateway.js.map +1 -0
  40. package/dist/control/idempotency-ledger.d.ts +28 -0
  41. package/dist/control/idempotency-ledger.d.ts.map +1 -0
  42. package/dist/control/idempotency-ledger.js +53 -0
  43. package/dist/control/idempotency-ledger.js.map +1 -0
  44. package/dist/current-desktop-status.d.ts +37 -0
  45. package/dist/current-desktop-status.d.ts.map +1 -0
  46. package/dist/current-desktop-status.js +75 -0
  47. package/dist/current-desktop-status.js.map +1 -0
  48. package/dist/event-log.d.ts +3 -1
  49. package/dist/event-log.d.ts.map +1 -1
  50. package/dist/event-log.js +16 -6
  51. package/dist/event-log.js.map +1 -1
  52. package/dist/extension.d.ts +9 -0
  53. package/dist/extension.d.ts.map +1 -1
  54. package/dist/extension.js +119 -19
  55. package/dist/extension.js.map +1 -1
  56. package/dist/host-controller.d.ts +86 -32
  57. package/dist/host-controller.d.ts.map +1 -1
  58. package/dist/host-controller.js +613 -69
  59. package/dist/host-controller.js.map +1 -1
  60. package/dist/jsonl-pager.d.ts +1 -0
  61. package/dist/jsonl-pager.d.ts.map +1 -1
  62. package/dist/jsonl-pager.js +22 -1
  63. package/dist/jsonl-pager.js.map +1 -1
  64. package/dist/jsonl-tail-watcher.d.ts +9 -1
  65. package/dist/jsonl-tail-watcher.d.ts.map +1 -1
  66. package/dist/jsonl-tail-watcher.js +77 -13
  67. package/dist/jsonl-tail-watcher.js.map +1 -1
  68. package/dist/monitor-projection.d.ts +17 -6
  69. package/dist/monitor-projection.d.ts.map +1 -1
  70. package/dist/monitor-projection.js +107 -14
  71. package/dist/monitor-projection.js.map +1 -1
  72. package/dist/pi/pi-sdk-runtime.d.ts +2 -0
  73. package/dist/pi/pi-sdk-runtime.d.ts.map +1 -1
  74. package/dist/pi/pi-sdk-runtime.js +5 -1
  75. package/dist/pi/pi-sdk-runtime.js.map +1 -1
  76. package/dist/plugin/ask-response-file.d.ts +4 -0
  77. package/dist/plugin/ask-response-file.d.ts.map +1 -0
  78. package/dist/plugin/ask-response-file.js +30 -0
  79. package/dist/plugin/ask-response-file.js.map +1 -0
  80. package/dist/plugin/desktop-broker-host-ipc.d.ts +94 -0
  81. package/dist/plugin/desktop-broker-host-ipc.d.ts.map +1 -0
  82. package/dist/plugin/desktop-broker-host-ipc.js +532 -0
  83. package/dist/plugin/desktop-broker-host-ipc.js.map +1 -0
  84. package/dist/plugin/desktop-broker-supervisor.d.ts +42 -0
  85. package/dist/plugin/desktop-broker-supervisor.d.ts.map +1 -0
  86. package/dist/plugin/desktop-broker-supervisor.js +394 -0
  87. package/dist/plugin/desktop-broker-supervisor.js.map +1 -0
  88. package/dist/plugin/desktop-broker.d.ts +62 -0
  89. package/dist/plugin/desktop-broker.d.ts.map +1 -0
  90. package/dist/plugin/desktop-broker.js +417 -0
  91. package/dist/plugin/desktop-broker.js.map +1 -0
  92. package/dist/plugin/desktop-flow-ask-adapter.d.ts +38 -0
  93. package/dist/plugin/desktop-flow-ask-adapter.d.ts.map +1 -0
  94. package/dist/plugin/desktop-flow-ask-adapter.js +155 -0
  95. package/dist/plugin/desktop-flow-ask-adapter.js.map +1 -0
  96. package/dist/plugin/desktop-pi-session-adapter.d.ts +45 -0
  97. package/dist/plugin/desktop-pi-session-adapter.d.ts.map +1 -0
  98. package/dist/plugin/desktop-pi-session-adapter.js +128 -0
  99. package/dist/plugin/desktop-pi-session-adapter.js.map +1 -0
  100. package/dist/plugin/desktop-plugin-extension.d.ts +12 -0
  101. package/dist/plugin/desktop-plugin-extension.d.ts.map +1 -0
  102. package/dist/plugin/desktop-plugin-extension.js +556 -0
  103. package/dist/plugin/desktop-plugin-extension.js.map +1 -0
  104. package/dist/plugin/desktop-plugin-ipc.d.ts +106 -0
  105. package/dist/plugin/desktop-plugin-ipc.d.ts.map +1 -0
  106. package/dist/plugin/desktop-plugin-ipc.js +630 -0
  107. package/dist/plugin/desktop-plugin-ipc.js.map +1 -0
  108. package/dist/plugin/desktop-plugin-registry-store.d.ts +31 -0
  109. package/dist/plugin/desktop-plugin-registry-store.d.ts.map +1 -0
  110. package/dist/plugin/desktop-plugin-registry-store.js +79 -0
  111. package/dist/plugin/desktop-plugin-registry-store.js.map +1 -0
  112. package/dist/plugin/desktop-plugin-registry.d.ts +58 -0
  113. package/dist/plugin/desktop-plugin-registry.d.ts.map +1 -0
  114. package/dist/plugin/desktop-plugin-registry.js +164 -0
  115. package/dist/plugin/desktop-plugin-registry.js.map +1 -0
  116. package/dist/plugin/desktop-plugin-runtime-state.d.ts +20 -0
  117. package/dist/plugin/desktop-plugin-runtime-state.d.ts.map +1 -0
  118. package/dist/plugin/desktop-plugin-runtime-state.js +41 -0
  119. package/dist/plugin/desktop-plugin-runtime-state.js.map +1 -0
  120. package/dist/plugin/flow-ask-transport.d.ts +42 -0
  121. package/dist/plugin/flow-ask-transport.d.ts.map +1 -0
  122. package/dist/plugin/flow-ask-transport.js +22 -0
  123. package/dist/plugin/flow-ask-transport.js.map +1 -0
  124. package/dist/server/helpers.d.ts.map +1 -1
  125. package/dist/server/helpers.js +3 -0
  126. package/dist/server/helpers.js.map +1 -1
  127. package/dist/server/mobile-host-server.d.ts +20 -1
  128. package/dist/server/mobile-host-server.d.ts.map +1 -1
  129. package/dist/server/mobile-host-server.js +361 -421
  130. package/dist/server/mobile-host-server.js.map +1 -1
  131. package/dist/session-runner.d.ts +4 -2
  132. package/dist/session-runner.d.ts.map +1 -1
  133. package/dist/session-runner.js +69 -24
  134. package/dist/session-runner.js.map +1 -1
  135. package/dist/types.d.ts +6 -2
  136. package/dist/types.d.ts.map +1 -1
  137. package/dist/vendor/shared/desktop-broker-protocol.d.ts +136 -0
  138. package/dist/vendor/shared/desktop-broker-protocol.d.ts.map +1 -0
  139. package/dist/vendor/shared/desktop-broker-protocol.js +160 -0
  140. package/dist/vendor/shared/desktop-broker-protocol.js.map +1 -0
  141. package/dist/vendor/shared/desktop-plugin-protocol.d.ts +167 -0
  142. package/dist/vendor/shared/desktop-plugin-protocol.d.ts.map +1 -0
  143. package/dist/vendor/shared/desktop-plugin-protocol.js +144 -0
  144. package/dist/vendor/shared/desktop-plugin-protocol.js.map +1 -0
  145. package/dist/vendor/shared/index.d.ts +4 -1
  146. package/dist/vendor/shared/index.d.ts.map +1 -1
  147. package/dist/vendor/shared/index.js +4 -1
  148. package/dist/vendor/shared/index.js.map +1 -1
  149. package/dist/vendor/shared/protocol.d.ts +213 -61
  150. package/dist/vendor/shared/protocol.d.ts.map +1 -1
  151. package/dist/vendor/shared/protocol.js +216 -14
  152. package/dist/vendor/shared/protocol.js.map +1 -1
  153. package/dist/vendor/shared/release.d.ts +11 -0
  154. package/dist/vendor/shared/release.d.ts.map +1 -0
  155. package/dist/vendor/shared/release.js +12 -0
  156. package/dist/vendor/shared/release.js.map +1 -0
  157. package/dist/vendor/shared/validation.d.ts +9 -2
  158. package/dist/vendor/shared/validation.d.ts.map +1 -1
  159. package/dist/vendor/shared/validation.js +48 -12
  160. package/dist/vendor/shared/validation.js.map +1 -1
  161. package/dist/version-detector.d.ts +1 -1
  162. package/dist/version-detector.d.ts.map +1 -1
  163. package/dist/version-detector.js +3 -3
  164. package/dist/version-detector.js.map +1 -1
  165. package/dist/workspace-telemetry.d.ts.map +1 -1
  166. package/dist/workspace-telemetry.js +2 -0
  167. package/dist/workspace-telemetry.js.map +1 -1
  168. package/package.json +5 -3
  169. package/dist/live-sessions.d.ts +0 -47
  170. package/dist/live-sessions.d.ts.map +0 -1
  171. package/dist/live-sessions.js +0 -218
  172. package/dist/live-sessions.js.map +0 -1
  173. package/dist/workspace-peer-injector.d.ts +0 -19
  174. package/dist/workspace-peer-injector.d.ts.map +0 -1
  175. package/dist/workspace-peer-injector.js +0 -63
  176. package/dist/workspace-peer-injector.js.map +0 -1
package/README.md CHANGED
@@ -23,7 +23,17 @@ pi-maestro-mobile --port 4739
23
23
  pi install npm:pi-maestro-mobile
24
24
  ```
25
25
 
26
- (薄扩展入口:`/maestro-host` 命令管理守护进程,规划中;当前版本请用方式一。)
26
+ 安装后可在任意 Pi TUI 中使用薄扩展命令管理独立 Host:
27
+
28
+ ```text
29
+ /maestro-mobile start # 幂等启动
30
+ /maestro-mobile status # 查看状态、版本和 token 摘要
31
+ /maestro-mobile status --current # 比较当前 Pi/Plugin/Broker/Host 四层状态
32
+ /maestro-mobile qr # 生成二维码与 8 位短码
33
+ /maestro-mobile stop # 停止 PID 文件指向的 Host 实例
34
+ ```
35
+
36
+ 扩展只负责启动、探测、配对与停止;Host 是独立常驻进程,不随当前 Pi 会话退出。
27
37
 
28
38
  ### 方式三:Docker(看板模式)
29
39
 
@@ -36,8 +46,7 @@ docker run -d --name maestro-mobile \
36
46
  maestro-mobile
37
47
  ```
38
48
 
39
- 容器模式能力边界:Dashboard / Monitor 看板、会话历史浏览、usage 统计**可用**;
40
- `open_session` / `steer_window` 的会话接管**不可用**(需要容器内安装 pi 及认证上下文)。
49
+ 容器模式能力边界:Dashboard / Monitor 看板、会话历史浏览、usage 统计**可用**;会话控制**不可用**(需要容器内安装 pi 及认证上下文)。
41
50
  详细说明见仓库 `docs/deploy.md`。
42
51
 
43
52
  ## 使用
@@ -54,16 +63,18 @@ pi-maestro-mobile [--port 4739] [--host 0.0.0.0] [--token <secret>] [--project-r
54
63
  | `--project-root` | `MAESTRO_MOBILE_PROJECT_ROOT` | cwd | maestro flow-schedule 读取根 |
55
64
  | `--poll-ms` | `MAESTRO_MOBILE_POLL_MS` | 5000 | telemetry/调度轮询间隔 |
56
65
 
57
- 手机 App 里填 `ws://<PC 局域网 IP>:4739/ws`(有 token 时加 `?token=`)。
66
+ `MAESTRO_MOBILE_ROLLOUT` 可设为 `disabled`、`shadow` 或 `enabled`(默认),用于控制 Protocol v2 rollout。
67
+
68
+ 官方 App 推荐通过 `/maestro-mobile qr` 配对。协议端点格式为 `ws://<PC 局域网 IP>:4739/ws`,token 可使用查询参数或 Bearer header 传递。
58
69
 
59
70
  ## 守护进程
60
71
 
61
72
  **macOS(launchd)**:
62
73
 
63
74
  ```bash
64
- cp deploy/com.maestro-mobile.host.plist ~/Library/LaunchAgents/
75
+ cp deploy/com.maestro-mobile.plist ~/Library/LaunchAgents/
65
76
  # 编辑 plist 里的安装路径、WorkingDirectory、token
66
- launchctl load ~/Library/LaunchAgents/com.maestro-mobile.host.plist
77
+ launchctl load ~/Library/LaunchAgents/com.maestro-mobile.plist
67
78
  ```
68
79
 
69
80
  **Linux(systemd)**:
@@ -75,11 +86,51 @@ sudo systemctl enable --now maestro-mobile
75
86
 
76
87
  ## HTTP 接口速览
77
88
 
89
+ Host CLI 始终启用 token。除 `/api/pair-short` 使用 8 位一次性短码外,下列 HTTP 路由都需要 Bearer 或 `?token=` 鉴权。
90
+
78
91
  | 路由 | 说明 |
79
92
  |---|---|
80
- | `GET /api/health` | 存活检查 |
93
+ | `GET /api/pair-short` | 短码换 token、候选 IP 和端口 |
94
+ | `GET /api/health` | 存活检查;无 token 时 `401` 也表示服务已监听 |
81
95
  | `GET /api/status` | 版本/uptime/sessions(含 pi/flow/CLI 版本探测) |
82
- | `GET /api/workspace-telemetry` | Monitor 窗口 owners(pid/sessionId/agents/contextPressure) |
83
- | `GET /api/maestro` | flow-schedule 调度状态 |
84
- | `GET /api/live-sessions` | 活跃 Pi 会话扫描 |
85
- | `WS /ws` | 实时事件流 + 客户端命令(协议见 `@maestro-mobile/shared`) |
96
+ | `GET /api/desktop/current` | 认证的 Broker link、epoch/revision、projection 和 exact target 诊断 |
97
+ | `GET /api/sessions` | 会话列表(`cwd`/`query`/`limit`/`cursor`/`projectCwds`) |
98
+ | `GET /api/pair-ips` | 配对候选 IP 列表 |
99
+ | `GET /api/workspace-telemetry` | Monitor 窗口投影 |
100
+ | `GET /api/maestro` / `GET /api/maestro-settings` | flow-schedule 调度状态 / 设置总览 |
101
+ | `GET /api/file` | 图片只读预览 |
102
+ | `GET /api/extension-ui/pending` | 兼容占位,固定返回 `pending: 0` |
103
+ | `GET /api/live-sessions` | 已弃用,返回 410(不属于 Protocol v2) |
104
+ | `WS /ws` | 实时事件流 + 客户端命令(协议见 `@maestro-mobile/shared`,摘要见 `docs/protocol.md`) |
105
+
106
+ 真实 Ask 状态通过 WS 的 `extension_ui_request` / `extension_ui_cleared` 事件投影。
107
+
108
+ ## Desktop Plugin 与 Singleton Broker(控制桌面 TUI 会话)
109
+
110
+ | 路径 | owner / 用途 |
111
+ |---|---|
112
+ | `~/.pi/maestro-mobile/ipc/desktop-plugin.sock` | Broker 独占的 Plugin UDS,NDJSON,权限 `0600` |
113
+ | `~/.pi/maestro-mobile/ipc/desktop-broker-host.sock` | Host 独占的 Broker uplink UDS,权限 `0600` |
114
+ | `~/.pi/maestro-mobile-ipc-secret` | Plugin/Broker/Host 共享密钥 |
115
+ | `~/.pi/maestro-mobile/ipc/desktop-plugin-registry.json` | Broker 诊断快照;不是 live authority,不能恢复 transport |
116
+ | `~/.pi/maestro-mobile/desktop-broker.pid` | singleton Broker PID |
117
+
118
+ 行为要点:
119
+
120
+ - Broker 内存 registry 是唯一 live authority;每次 mutation 有单调 revision,Host 只接受同一 epoch 的 contiguous delta。
121
+ - 所有控制与事件都绑定 exact target:`sessionId + endpointId + normalizedCwd + processGeneration`,不做 cwd/名称/PID/时间推断。
122
+ - Host restart 只重建 Broker uplink projection,不应断开 Plugin;Broker crash 后 Plugin 按 bounded reconnect 重连,旧 JSON 不会伪造在线 target。
123
+ - 升级或协议不兼容时,先执行 `/maestro-mobile stop`,更新 npm 包或重新构建后执行 `/maestro-mobile start`;Desktop Plugin v1 必须 reload/restart 使用 v2。
124
+ - 若 `desktop-plugin.sock` 或 `desktop-broker-host.sock` 被其他进程占用,先停止旧 Host/Broker 实例,确认 PID/lock/log 后再启动,不要删除仍被活进程使用的 socket。
125
+ - `/maestro-mobile status --current` 只读比较四层状态,输出 `synced`、`drift`、`target_missing`、`plugin_disconnected`、`broker_host_disconnected`、`host_unreachable` 或 `broker_flapping`。
126
+
127
+ 完整字段见 [`docs/protocol.md`](../../docs/protocol.md#desktop-plugin-协议)。
128
+
129
+
130
+ ## 构建与产物耦合(重要)
131
+
132
+ Host 运行时通过 `@maestro-mobile/shared` 的 **`dist`** 解析协议 validator,而不是 `src`。因此修改 `packages/shared/src` 后:
133
+
134
+ 1. 必须先 `pnpm --filter @maestro-mobile/shared build` 重建 `dist`;
135
+ 2. 否则 Host 会按**旧协议**拒绝新帧(表现为新 operation 返回 `invalid_frame` / `desktop_confirmation_unavailable`,而 `typecheck` 与源码测试可能全绿);
136
+ 3. 验证时必须包含真实运行时探针(真实 UDS + 真实 Host 进程),不能只靠单元测试。
@@ -0,0 +1,90 @@
1
+ import type { MonitorReadSnapshot } from "./monitor-read-service.js";
2
+ import type { MonitorQueryService } from "./monitor-query-service.js";
3
+ import type { SessionCommand, CommandResult, SessionCommandService } from "./session-command-service.js";
4
+ import type { SessionListOptions, QueryResult, SessionQueryService } from "./session-query-service.js";
5
+ import type { SessionSnapshot, HostSessionList, TimelineItem, ExtensionUiResponse } from "../vendor/shared/index.js";
6
+ import type { SessionTargetIdentity } from "../control/SessionDirectory.js";
7
+ import type { UsageTotals } from "../usage-reader.js";
8
+ import type { OpenSessionRequest } from "../types.js";
9
+ export interface ApplicationLifecycle {
10
+ openSession(request: OpenSessionRequest): Promise<{
11
+ id: string;
12
+ }>;
13
+ closeSession(sessionId: string, target?: SessionTargetIdentity): Promise<boolean>;
14
+ respondToExtensionUi(sessionId: string, requestId: string, response: ExtensionUiResponse, target?: SessionTargetIdentity): Promise<boolean>;
15
+ sessionOperation?(operation: SessionOperation): Promise<unknown>;
16
+ readMaestroState?(): Promise<unknown>;
17
+ readSettings?(): Promise<unknown>;
18
+ updateSettings?(patch: Record<string, unknown>): Promise<unknown>;
19
+ }
20
+ export type SessionOperation = {
21
+ kind: "load_more_history";
22
+ target: SessionTargetIdentity;
23
+ count?: number;
24
+ } | {
25
+ kind: "search_history";
26
+ target: SessionTargetIdentity;
27
+ keyword: string;
28
+ maxResults: number;
29
+ previewLength: number;
30
+ } | {
31
+ kind: "list_models";
32
+ target: SessionTargetIdentity;
33
+ } | {
34
+ kind: "list_skills";
35
+ target: SessionTargetIdentity;
36
+ } | {
37
+ kind: "set_model";
38
+ target: SessionTargetIdentity;
39
+ modelId: string;
40
+ provider?: string;
41
+ } | {
42
+ kind: "compact";
43
+ target: SessionTargetIdentity;
44
+ customInstructions?: string;
45
+ } | {
46
+ kind: "rename_session";
47
+ target: SessionTargetIdentity;
48
+ name: string;
49
+ };
50
+ export type ApplicationQuery = {
51
+ kind: "session_list";
52
+ options?: SessionListOptions;
53
+ } | {
54
+ kind: "session_snapshot";
55
+ target: SessionTargetIdentity;
56
+ } | {
57
+ kind: "session_history";
58
+ target: SessionTargetIdentity;
59
+ count?: number;
60
+ } | {
61
+ kind: "session_usage";
62
+ target: SessionTargetIdentity;
63
+ } | {
64
+ kind: "monitor";
65
+ };
66
+ export type ApplicationQueryResult = HostSessionList | QueryResult<SessionSnapshot> | QueryResult<{
67
+ items: TimelineItem[];
68
+ hasMore: boolean;
69
+ totalEntries: number;
70
+ historyAvailable?: boolean;
71
+ }> | QueryResult<UsageTotals> | MonitorReadSnapshot;
72
+ export declare class ApplicationCommandRouter {
73
+ private readonly commands;
74
+ private readonly sessions;
75
+ private readonly monitor;
76
+ private readonly lifecycle?;
77
+ constructor(commands: SessionCommandService, sessions: SessionQueryService, monitor: MonitorQueryService, lifecycle?: ApplicationLifecycle | undefined);
78
+ command(command: SessionCommand): Promise<CommandResult>;
79
+ query(query: ApplicationQuery): Promise<ApplicationQueryResult>;
80
+ openSession(request: OpenSessionRequest): Promise<{
81
+ id: string;
82
+ }>;
83
+ closeSession(sessionId: string, target?: SessionTargetIdentity): Promise<boolean>;
84
+ respondToExtensionUi(sessionId: string, requestId: string, response: ExtensionUiResponse, target?: SessionTargetIdentity): Promise<boolean>;
85
+ sessionOperation(operation: SessionOperation): Promise<unknown>;
86
+ readMaestroState(): Promise<unknown>;
87
+ readSettings(): Promise<unknown>;
88
+ updateSettings(patch: Record<string, unknown>): Promise<unknown>;
89
+ }
90
+ //# sourceMappingURL=application-command-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-command-router.d.ts","sourceRoot":"","sources":["../../src/application/application-command-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export class ApplicationCommandRouter {
2
+ commands;
3
+ sessions;
4
+ monitor;
5
+ lifecycle;
6
+ constructor(commands, sessions, monitor, lifecycle) {
7
+ this.commands = commands;
8
+ this.sessions = sessions;
9
+ this.monitor = monitor;
10
+ this.lifecycle = lifecycle;
11
+ }
12
+ command(command) {
13
+ return this.commands.execute(command);
14
+ }
15
+ query(query) {
16
+ switch (query.kind) {
17
+ case "session_list": return this.sessions.list(query.options);
18
+ case "session_snapshot": return this.sessions.snapshot(query.target);
19
+ case "session_history": return this.sessions.history(query.target, query.count);
20
+ case "session_usage": return this.sessions.usage(query.target);
21
+ case "monitor": return this.monitor.read();
22
+ }
23
+ }
24
+ openSession(request) {
25
+ if (!this.lifecycle)
26
+ return Promise.reject(new Error("session lifecycle unavailable"));
27
+ return this.lifecycle.openSession(request);
28
+ }
29
+ closeSession(sessionId, target) {
30
+ if (!this.lifecycle)
31
+ return Promise.reject(new Error("session lifecycle unavailable"));
32
+ return this.lifecycle.closeSession(sessionId, target);
33
+ }
34
+ respondToExtensionUi(sessionId, requestId, response, target) {
35
+ return this.lifecycle?.respondToExtensionUi(sessionId, requestId, response, target) ?? Promise.resolve(false);
36
+ }
37
+ sessionOperation(operation) {
38
+ if (!this.lifecycle?.sessionOperation)
39
+ return Promise.reject(new Error("session operation unavailable"));
40
+ return this.lifecycle.sessionOperation(operation);
41
+ }
42
+ readMaestroState() {
43
+ if (!this.lifecycle?.readMaestroState)
44
+ return Promise.reject(new Error("maestro state unavailable"));
45
+ return this.lifecycle.readMaestroState();
46
+ }
47
+ readSettings() {
48
+ if (!this.lifecycle?.readSettings)
49
+ return Promise.reject(new Error("settings unavailable"));
50
+ return this.lifecycle.readSettings();
51
+ }
52
+ updateSettings(patch) {
53
+ if (!this.lifecycle?.updateSettings)
54
+ return Promise.reject(new Error("settings unavailable"));
55
+ return this.lifecycle.updateSettings(patch);
56
+ }
57
+ }
58
+ //# sourceMappingURL=application-command-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-command-router.js","sourceRoot":"","sources":["../../src/application/application-command-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MonitorState } from "../vendor/shared/index.js";
2
+ import type { MonitorReadService, MonitorReadSnapshot } from "./monitor-read-service.js";
3
+ export declare class MonitorQueryService {
4
+ private readonly monitor;
5
+ constructor(monitor: MonitorReadService);
6
+ read(): Promise<MonitorReadSnapshot>;
7
+ readState(): Promise<MonitorState>;
8
+ }
9
+ //# sourceMappingURL=monitor-query-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-query-service.d.ts","sourceRoot":"","sources":["../../src/application/monitor-query-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEzF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,kBAAkB;IAExD,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIpC,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAGnC"}
@@ -0,0 +1,13 @@
1
+ export class MonitorQueryService {
2
+ monitor;
3
+ constructor(monitor) {
4
+ this.monitor = monitor;
5
+ }
6
+ read() {
7
+ return this.monitor.read();
8
+ }
9
+ readState() {
10
+ return this.monitor.read().then(({ state }) => state);
11
+ }
12
+ }
13
+ //# sourceMappingURL=monitor-query-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-query-service.js","sourceRoot":"","sources":["../../src/application/monitor-query-service.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;IAAG,CAAC;IAE5D,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { MonitorState, WorkspaceTelemetryState } from "../vendor/shared/index.js";
2
+ import type { WorkspaceTelemetryReader } from "../workspace-telemetry.js";
3
+ export interface MonitorReadSnapshot {
4
+ state: MonitorState;
5
+ stableKey: string;
6
+ revision: number;
7
+ }
8
+ export type MonitorTelemetrySource = Pick<WorkspaceTelemetryReader, "read"> | (() => Promise<WorkspaceTelemetryState>);
9
+ /**
10
+ * Read-only Monitor query service. Both pull and push callers consume the same
11
+ * bounded projection and the same revision/stable-key state machine.
12
+ */
13
+ export declare class MonitorReadService {
14
+ private readonly source;
15
+ private lastStableKey;
16
+ private revision;
17
+ private readChain;
18
+ constructor(source: MonitorTelemetrySource);
19
+ read(): Promise<MonitorReadSnapshot>;
20
+ }
21
+ //# sourceMappingURL=monitor-read-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-read-service.d.ts","sourceRoot":"","sources":["../../src/application/monitor-read-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAEvH;;;GAGG;AACH,qBAAa,kBAAkB;IAMjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAK;IAErB,OAAO,CAAC,SAAS,CAAoC;gBAExB,MAAM,EAAE,sBAAsB;IAErD,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC;CA+B3C"}
@@ -0,0 +1,47 @@
1
+ import { projectMonitorWindows, telemetryStableKeyFromWindows } from "../monitor-projection.js";
2
+ /**
3
+ * Read-only Monitor query service. Both pull and push callers consume the same
4
+ * bounded projection and the same revision/stable-key state machine.
5
+ */
6
+ export class MonitorReadService {
7
+ source;
8
+ lastStableKey;
9
+ revision = 0;
10
+ readChain = Promise.resolve();
11
+ constructor(source) {
12
+ this.source = source;
13
+ }
14
+ async read() {
15
+ let resolveResult;
16
+ let rejectResult;
17
+ const result = new Promise((resolve, reject) => {
18
+ resolveResult = resolve;
19
+ rejectResult = reject;
20
+ });
21
+ const run = this.readChain.then(async () => {
22
+ try {
23
+ const telemetry = typeof this.source === "function"
24
+ ? await this.source()
25
+ : await this.source.read();
26
+ const windows = projectMonitorWindows(telemetry);
27
+ const state = { windows, observedAt: telemetry.observedAt };
28
+ const stableKey = telemetryStableKeyFromWindows(windows);
29
+ if (stableKey !== this.lastStableKey) {
30
+ this.lastStableKey = stableKey;
31
+ this.revision += 1;
32
+ }
33
+ resolveResult({
34
+ state: { ...state, revision: this.revision },
35
+ stableKey,
36
+ revision: this.revision,
37
+ });
38
+ }
39
+ catch (error) {
40
+ rejectResult(error);
41
+ }
42
+ });
43
+ this.readChain = run.then(() => undefined, () => undefined);
44
+ return result;
45
+ }
46
+ }
47
+ //# sourceMappingURL=monitor-read-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-read-service.js","sourceRoot":"","sources":["../../src/application/monitor-read-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAWhG;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAMA;IALrB,aAAa,CAAqB;IAClC,QAAQ,GAAG,CAAC,CAAC;IAEb,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAErD,YAA6B,MAA8B;QAA9B,WAAM,GAAN,MAAM,CAAwB;IAAG,CAAC;IAE/D,KAAK,CAAC,IAAI;QACR,IAAI,aAAoD,CAAC;QACzD,IAAI,YAAyC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClE,aAAa,GAAG,OAAO,CAAC;YACxB,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU;oBACjD,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE;oBACrB,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;gBACzD,IAAI,SAAS,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACrB,CAAC;gBACD,aAAa,CAAC;oBACZ,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;oBAC5C,SAAS;oBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import type { JsonValue, OperationReceipt } from "../vendor/shared/index.js";
2
+ import type { SessionDirectory, SessionTargetIdentity } from "../control/SessionDirectory.js";
3
+ export type SessionCommandKind = "prompt" | "steer" | "follow_up" | "abort" | "set_model" | "set_thinking";
4
+ export interface SessionCommand {
5
+ requestId: string;
6
+ target: SessionTargetIdentity;
7
+ kind: SessionCommandKind;
8
+ message?: string;
9
+ modelId?: string;
10
+ provider?: string;
11
+ level?: string;
12
+ images?: unknown[];
13
+ }
14
+ export interface CommandResult extends OperationReceipt {
15
+ error?: {
16
+ code: string;
17
+ message?: string;
18
+ };
19
+ result?: JsonValue;
20
+ }
21
+ export interface DesktopControlGateway {
22
+ execute(command: SessionCommand): Promise<CommandResult>;
23
+ query(target: SessionTargetIdentity, operation: "list_models" | "list_skills"): Promise<unknown>;
24
+ }
25
+ export declare class SessionCommandService {
26
+ private readonly directory;
27
+ private readonly desktopGateway?;
28
+ private readonly ledger;
29
+ constructor(directory: SessionDirectory, desktopGateway?: DesktopControlGateway | undefined);
30
+ execute(command: SessionCommand): Promise<CommandResult>;
31
+ clearIdempotency(): void;
32
+ }
33
+ //# sourceMappingURL=session-command-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-command-service.d.ts","sourceRoot":"","sources":["../../src/application/session-command-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAmB,MAAM,2BAA2B,CAAC;AAE9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE9F,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,cAAc,CAAC;AAE3G,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzD,KAAK,CAAC,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClG;AAqBD,qBAAa,qBAAqB;IAI9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAJlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;gBAG9C,SAAS,EAAE,gBAAgB,EAC3B,cAAc,CAAC,EAAE,qBAAqB,YAAA;IAGzD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAyCxD,gBAAgB,IAAI,IAAI;CAGzB"}
@@ -0,0 +1,80 @@
1
+ import { IdempotencyLedger } from "../control/idempotency-ledger.js";
2
+ function commandScope(command) {
3
+ return JSON.stringify([command.kind, command.target.sessionId, command.target.endpointId, command.target.normalizedCwd, command.target.processGeneration]);
4
+ }
5
+ function result(command, revision, status, error) {
6
+ return {
7
+ requestId: command.requestId,
8
+ operation: command.kind,
9
+ status,
10
+ revision,
11
+ ...(error ? { error } : {}),
12
+ };
13
+ }
14
+ export class SessionCommandService {
15
+ directory;
16
+ desktopGateway;
17
+ ledger = new IdempotencyLedger();
18
+ constructor(directory, desktopGateway) {
19
+ this.directory = directory;
20
+ this.desktopGateway = desktopGateway;
21
+ }
22
+ execute(command) {
23
+ return this.ledger.run(command.requestId, commandScope(command), async () => {
24
+ const target = this.directory.resolve(command.target, command.kind);
25
+ if (!target)
26
+ return result(command, this.directory.revision, "unknown", { code: "target_unavailable" });
27
+ if (target.kind === "desktop") {
28
+ if (!this.desktopGateway) {
29
+ return result(command, this.directory.revision, "unknown", { code: "desktop_gateway_unavailable" });
30
+ }
31
+ try {
32
+ const response = await this.desktopGateway.execute(command);
33
+ return { ...response, requestId: command.requestId, operation: command.kind, revision: this.directory.revision };
34
+ }
35
+ catch {
36
+ return result(command, this.directory.revision, "unknown", { code: "desktop_confirmation_unavailable" });
37
+ }
38
+ }
39
+ const runner = target.runner;
40
+ if (!runner)
41
+ return result(command, this.directory.revision, "unknown", { code: "host_runner_unavailable" });
42
+ try {
43
+ if (command.kind === "prompt") {
44
+ if (runner.state.runState === "streaming")
45
+ await runner.steer(command.message ?? "");
46
+ else
47
+ await runner.prompt(command.message ?? "", undefined, command.images);
48
+ }
49
+ else if (command.kind === "steer")
50
+ await runner.steer(command.message ?? "");
51
+ else if (command.kind === "follow_up")
52
+ await runner.followUp(command.message ?? "");
53
+ else if (command.kind === "set_model") {
54
+ if (!command.modelId || typeof runner.setModel !== "function")
55
+ throw new Error("model_unavailable");
56
+ const changed = await runner.setModel(command.modelId, command.provider);
57
+ if (!changed.ok)
58
+ return result(command, this.directory.revision, "failed", { code: changed.error ?? "model_change_failed" });
59
+ }
60
+ else if (command.kind === "set_thinking") {
61
+ if (!command.level || typeof runner.setThinking !== "function")
62
+ throw new Error("thinking_unavailable");
63
+ const changed = runner.setThinking(command.level);
64
+ if (!changed.ok)
65
+ return result(command, this.directory.revision, "failed", { code: changed.error ?? "thinking_change_failed" });
66
+ }
67
+ else
68
+ await runner.abort();
69
+ return result(command, this.directory.revision, "observed");
70
+ }
71
+ catch {
72
+ return result(command, this.directory.revision, "failed", { code: "host_command_failed" });
73
+ }
74
+ });
75
+ }
76
+ clearIdempotency() {
77
+ this.ledger.clear();
78
+ }
79
+ }
80
+ //# sourceMappingURL=session-command-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-command-service.js","sourceRoot":"","sources":["../../src/application/session-command-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { HostSessionList, MonitorState, OperationStatus, SessionPresentation, SessionSnapshot, TimelineItem } from "../vendor/shared/index.js";
2
+ import type { SessionDirectory, SessionDirectoryTarget, SessionTargetIdentity } from "../control/SessionDirectory.js";
3
+ import type { UsageTotals } from "../usage-reader.js";
4
+ export interface SessionListSource {
5
+ listSessions(cwd?: string): Promise<unknown[]>;
6
+ }
7
+ export interface SessionListOptions {
8
+ cwd?: string;
9
+ projectCwds?: string[];
10
+ query?: string;
11
+ limit?: number;
12
+ cursor?: string;
13
+ includeMonitor?: boolean;
14
+ sessionIds?: string[];
15
+ latestForCwds?: string[];
16
+ }
17
+ export interface QueryResult<T> {
18
+ ok: boolean;
19
+ value?: T;
20
+ status?: Extract<OperationStatus, "unknown" | "failed">;
21
+ error?: {
22
+ code: string;
23
+ message?: string;
24
+ };
25
+ revision: number;
26
+ }
27
+ export declare class SessionQueryService {
28
+ private readonly source;
29
+ private readonly directory;
30
+ private readonly presentationFor?;
31
+ private readonly now;
32
+ private readonly monitorState?;
33
+ private readonly targetFor?;
34
+ private readonly desktopHistory;
35
+ constructor(source: SessionListSource, directory: SessionDirectory, presentationFor?: ((sessionId: string) => SessionPresentation | undefined) | undefined, now?: () => number, monitorState?: (() => Promise<MonitorState>) | undefined, targetFor?: ((sessionId: string) => SessionDirectoryTarget | undefined) | undefined);
36
+ list(options?: SessionListOptions): Promise<HostSessionList>;
37
+ snapshot(target: SessionTargetIdentity): Promise<QueryResult<SessionSnapshot>>;
38
+ history(target: SessionTargetIdentity, count?: number): Promise<QueryResult<{
39
+ items: TimelineItem[];
40
+ hasMore: boolean;
41
+ totalEntries: number;
42
+ historyAvailable?: boolean;
43
+ }>>;
44
+ usage(target: SessionTargetIdentity): Promise<QueryResult<UsageTotals>>;
45
+ private withPresentation;
46
+ }
47
+ //# sourceMappingURL=session-query-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-query-service.d.ts","sourceRoot":"","sources":["../../src/application/session-query-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAiC,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAwB,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzM,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACtH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IACxD,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyHD,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAR7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+D;gBAG3E,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,gBAAgB,EAC3B,eAAe,CAAC,GAAE,CAAC,SAAS,EAAE,MAAM,KAAK,mBAAmB,GAAG,SAAS,aAAA,EACxE,GAAG,GAAE,MAAM,MAAiB,EAC5B,YAAY,CAAC,GAAE,MAAM,OAAO,CAAC,YAAY,CAAC,aAAA,EAC1C,SAAS,CAAC,GAAE,CAAC,SAAS,EAAE,MAAM,KAAK,sBAAsB,GAAG,SAAS,aAAA;IAGlF,IAAI,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;IAuIhE,QAAQ,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAqD9E,OAAO,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAiB3K,KAAK,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IA2B7E,OAAO,CAAC,gBAAgB;CAMzB"}