From bd7d691a56887788d7d27f4e1cad6dcfbeaa738a Mon Sep 17 00:00:00 2001 From: QiaolongLi1201 Date: Tue, 18 Aug 2026 02:13:23 +0800 Subject: [PATCH 1/5] feat(agent): add extensible web workbench and plugins --- CHANGELOG.md | 4 + docs/user-guide/23-runtime-plugins.md | 55 +- docs/user-guide/24-web-ui.md | 11 +- .../add-zero-friction-web-ui/design.md | 23 +- .../add-zero-friction-web-ui/proposal.md | 8 +- .../changes/add-zero-friction-web-ui/tasks.md | 10 +- package-lock.json | 1258 ++++++++++++++++- packages/moss-agent/API.md | 21 +- packages/moss-agent/CHANGELOG.md | 16 + packages/moss-agent/EXTENDING.md | 11 + packages/moss-agent/THIRD_PARTY_NOTICES.md | 14 + .../assets/plugins/deepseek-harness/LICENSE | 21 + .../plugins/deepseek-harness/moss.plugin.json | 6 + .../plugins/deepseek-harness/plugin.mjs | 37 + .../skills/deepseek-harness/SKILL.md | 45 + packages/moss-agent/etc/channels.api.md | 22 + packages/moss-agent/etc/core.api.md | 22 + packages/moss-agent/etc/root.api.md | 22 + packages/moss-agent/etc/runtime.api.md | 117 ++ packages/moss-agent/etc/web.api.md | 132 ++ packages/moss-agent/package.json | 19 +- packages/moss-agent/src/channels/index.ts | 8 +- packages/moss-agent/src/cli-main.ts | 25 +- packages/moss-agent/src/cli/args.ts | 2 + .../moss-agent/src/cli/command-dispatcher.ts | 9 + packages/moss-agent/src/cli/device-connect.ts | 7 +- packages/moss-agent/src/cli/help.ts | 3 + packages/moss-agent/src/cli/host-command.ts | 2 + packages/moss-agent/src/cli/oneshot.ts | 4 +- .../moss-agent/src/cli/plugins-command.ts | 62 + .../moss-agent/src/cli/plugins-runtime.ts | 18 + packages/moss-agent/src/cli/tui.ts | 6 +- packages/moss-agent/src/core/index.ts | 3 + .../src/core/plugins/plugin-host.ts | 50 +- .../src/core/tools/tool-registry.ts | 28 +- packages/moss-agent/src/index.ts | 3 + .../src/plugins/installed-plugin-registry.ts | 523 +++++++ .../src/plugins/plugin-setup-worker.ts | 75 + packages/moss-agent/src/runtime/index.ts | 14 + .../moss-agent/src/runtime/shared-runtime.ts | 2 +- .../src/web-ui/client/workbench.css | 947 +++++++++++++ .../src/web-ui/client/workbench.tsx | 779 ++++++++++ packages/moss-agent/src/web-ui/index.ts | 15 +- packages/moss-agent/src/web-ui/web-assets.ts | 48 +- .../moss-agent/src/web-ui/web-contracts.ts | 120 ++ packages/moss-agent/src/web-ui/web-server.ts | 294 +++- packages/moss-agent/test/cli-args.spec.mjs | 12 +- .../test/cli-command-dispatcher.spec.mjs | 1 + .../test/installed-plugin-registry.spec.mjs | 342 +++++ .../test/official-deepseek-plugin.spec.mjs | 40 + .../moss-agent/test/plugin-runtime.spec.mjs | 6 + .../moss-agent/test/plugins-runtime.spec.mjs | 62 + .../test/tool-registry-ownership.spec.mjs | 34 + .../moss-agent/test/web-public-api.spec.mjs | 21 + .../moss-agent/test/web-ui-browser.spec.mjs | 173 +++ packages/moss-agent/test/web-ui.spec.mjs | 298 +++- packages/moss-agent/tsconfig.json | 6 +- packages/moss-agent/web-vite.config.mjs | 30 + scripts/config/api-entrypoints.json | 5 + scripts/config/maintainability-baseline.json | 4 +- 60 files changed, 5778 insertions(+), 177 deletions(-) create mode 100644 packages/moss-agent/assets/plugins/deepseek-harness/LICENSE create mode 100644 packages/moss-agent/assets/plugins/deepseek-harness/moss.plugin.json create mode 100644 packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs create mode 100644 packages/moss-agent/assets/plugins/deepseek-harness/skills/deepseek-harness/SKILL.md create mode 100644 packages/moss-agent/etc/web.api.md create mode 100644 packages/moss-agent/src/cli/plugins-command.ts create mode 100644 packages/moss-agent/src/cli/plugins-runtime.ts create mode 100644 packages/moss-agent/src/plugins/installed-plugin-registry.ts create mode 100644 packages/moss-agent/src/plugins/plugin-setup-worker.ts create mode 100644 packages/moss-agent/src/web-ui/client/workbench.css create mode 100644 packages/moss-agent/src/web-ui/client/workbench.tsx create mode 100644 packages/moss-agent/src/web-ui/web-contracts.ts create mode 100644 packages/moss-agent/test/installed-plugin-registry.spec.mjs create mode 100644 packages/moss-agent/test/official-deepseek-plugin.spec.mjs create mode 100644 packages/moss-agent/test/plugins-runtime.spec.mjs create mode 100644 packages/moss-agent/test/tool-registry-ownership.spec.mjs create mode 100644 packages/moss-agent/test/web-public-api.spec.mjs create mode 100644 packages/moss-agent/test/web-ui-browser.spec.mjs create mode 100644 packages/moss-agent/web-vite.config.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index d21f1177..1b2dbe0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ Categories: **Added** · **Changed** · **Fixed** · **Removed** · **Internal** - **Zero-friction Web workspace**: `moss web` starts a local browser experience with streaming chat, visible tool evidence, cancellation, and live redacted runtime capabilities without sending model credentials to the browser. +- **Hardened plugin loading and DeepSeek compatibility**: plugin installs now start disabled, npm + sources are exact-version and lifecycle-script-free, setup health is verified before activation, + concurrent registry writes are serialized, Web contributions require an active runtime plugin, + and an attributed `official:deepseek-harness` Skill can be installed explicitly. - **Durable Web task history**: Web tasks now receive ordered run identities, persisted tool evidence, honest completion/verification states, restart interruption recovery, and inspectable run-history endpoints. `npm run demo:capabilities` exercises a plugin, inline Skill, read-only diff --git a/docs/user-guide/23-runtime-plugins.md b/docs/user-guide/23-runtime-plugins.md index 71080632..45b169ea 100644 --- a/docs/user-guide/23-runtime-plugins.md +++ b/docs/user-guide/23-runtime-plugins.md @@ -1,7 +1,7 @@ # Runtime plugins for embedding hosts `createMossRuntime()` accepts host-trusted `MossPlugin` objects. A plugin can -contribute tools, inline skills, read-only sub-agent experts, prompt layers, and +contribute tools, inline skills, read-only sub-agent experts, prompt layers, Web UI slots, and owned cleanup effects without mutating process-global registries. ```ts @@ -42,6 +42,52 @@ await runtime.plugins.unload('example/review'); await runtime.close(); ``` +## Explicit CLI installation + +Trusted plugins can also ship a `moss.plugin.json` v1 at their package root: + +```json +{ + "schemaVersion": 1, + "id": "example/review", + "version": "1.0.0", + "runtime": { "module": "./dist/plugin.js", "export": "plugin" }, + "web": { + "contributions": [ + { "id": "review-settings", "slot": "settings.plugin", "module": "./dist/settings.js" } + ] + }, + "configSchema": "./config.schema.json" +} +``` + +Install and inspect it explicitly: + +```bash +moss plugins add ./my-plugin +moss plugins add @example/moss-review@1.0.0 +moss plugins add official:deepseek-harness +moss plugins list +moss plugins doctor +moss plugins enable deepseek/harness +moss plugins disable example/review +``` + +New plugins are installed **disabled** so installation cannot silently activate executable code. +Local paths remain linked to their resolved root. npm sources require an exact semantic version, +install under the Moss config directory, and run with lifecycle scripts disabled. `doctor` executes +the plugin setup transaction against isolated adapters instead of only checking that its module can +be imported, including for disabled entries; `enable` repeats that validation before persisting the +state change. Registry mutations use a cross-process lock so simultaneous CLI/Web updates do not +lose records. Manifest/runtime failures are reported and isolated so the core workbench can still +start. Enable, disable, and remove take effect on the next runtime start; the current Web server +keeps its startup contribution snapshot until shutdown. + +`official:deepseek-harness` is an MIT-licensed compatibility Skill adapted from the independently +maintained `HenryZ838978/deepseek-harness` project. It adds protocol guidance for DeepSeek reasoning, +streamed parallel tools, token limits, cache stability, and endpoint selection; it does not install +credentials or claim that third-party JavaScript is sandboxed. + ## Fastest path: generate a validated tool Use the scaffold when starting a new host project: @@ -70,7 +116,12 @@ generated host and must not be committed. does not return prompt content, expert instructions, model routing, budgets, credentials, or arbitrary plugin configuration. - Executable plugins are trusted host code. Moss does not discover or execute - JavaScript from the workspace, and the plugin host is not a sandbox. + JavaScript automatically from the workspace, and the plugin host is not a sandbox. +- Web contributions use stable Moss slots and package-relative modules. Plugin UI must consume the + public `--moss-*` tokens. Advanced modules export `mount(root, context)` and receive an isolated + `ShadowRoot`; JSON Schema configuration remains the preferred default surface. +- A Web contribution must currently be one browser-ready ESM file. Bundle relative and bare imports + into that file before publishing; the v1 loopback host does not serve multi-file module graphs. Dynamic unload while a plugin tool call is still active is not yet an HMR contract. Hosts should close or drain agent work before unloading a plugin. A diff --git a/docs/user-guide/24-web-ui.md b/docs/user-guide/24-web-ui.md index 829c3cf5..7209fa1b 100644 --- a/docs/user-guide/24-web-ui.md +++ b/docs/user-guide/24-web-ui.md @@ -12,6 +12,12 @@ moss web Open `http://127.0.0.1:3080`. To select another port, run `moss web 4080`. +The React workbench uses one responsive three-column layout: sessions on the left, conversation in +the center, and runtime/tool details on the right. Narrow desktop and tablet widths collapse the +detail rail and then the session rail instead of switching to a separately styled interface. Light +and dark themes share the same `--moss-*` design tokens, focus treatment, state colors, and reduced +motion behavior. + ## What the screen proves - **Timeline** streams the assistant response instead of waiting for the whole turn. @@ -23,6 +29,8 @@ Open `http://127.0.0.1:3080`. To select another port, run `moss web 4080`. count, and verification instead of treating a fluent model answer as proof. - Selecting a recent run opens its durable event timeline. The list is keyboard accessible, and the detail endpoint supports sequence cursors for incremental recovery. +- **Settings** exposes Runtime, Models, Permissions, and Plugins using the same controls and density + as the conversation surface. Credential values are process-owned and are never returned. The server binds to loopback by default, rejects non-local mutation origins, sets a restrictive Content Security Policy, and never sends provider configuration or credentials to the browser. @@ -59,6 +67,7 @@ non-zero if any contribution was not used or if the final answer was not grounde ## Current limits -- Durable session browsing and fork/rewind controls are planned rather than silently approximated. +- Session browsing and restoration are available. Rename, export, confirmed delete, fork, and + non-destructive rewind controls remain planned rather than silently approximated. - Plugin hot reload is not exposed until active tool-call leases and quiescent unload are complete. - Remote binding and multi-user authentication are intentionally absent from this local-first slice. diff --git a/openspec/changes/add-zero-friction-web-ui/design.md b/openspec/changes/add-zero-friction-web-ui/design.md index 86330c8c..98a1501d 100644 --- a/openspec/changes/add-zero-friction-web-ui/design.md +++ b/openspec/changes/add-zero-friction-web-ui/design.md @@ -1,13 +1,20 @@ # Design -The first slice is a thin host adapter over the existing `MossAgent`; it does not create another -agent loop. Node's built-in HTTP server owns loopback transport, while static browser assets remain -dependency-free and credential-free. A newline-delimited event stream avoids a new WebSocket stack -and works with `fetch()` cancellation. - -The UI follows the useful product ideas in DeepSeek Harness—session-first navigation, visible tool -activity, interruptibility, and progressive disclosure—without copying its implementation. Moss -adds a live capability rail so users can understand which plugin tools are truly available. +The host remains a thin adapter over the existing `MossAgent`; it does not create another agent +loop. Node's built-in HTTP server owns loopback transport. React and Vite build deterministic browser +assets inside `@rdk-moss/agent`, while the browser bundle remains credential-free. A +newline-delimited event stream avoids a new WebSocket stack and works with `fetch()` cancellation. + +The UI follows the useful product ideas in DeepSeek Harness—session-first navigation, a responsive +three-column frame, visible tool activity, interruptibility, settings, and progressive +disclosure—without copying trademarks, source, or protected assets. A central `--moss-*` token +system owns color, space, radii, widths, focus, state, and reduced-motion behavior so built-in and +plugin surfaces do not form parallel themes. + +Explicitly installed trusted plugins use `moss.plugin.json` v1 and a config-owned registry. Local +paths and npm package specs are user initiated. Manifest/import failures are isolated from core +startup. Enable/disable/remove persists the next composition and requires restart until active-call +leases make hot unload truthful. The next simplification gate is evidence based: consolidate ACP and Web event projection only after both transports have contract tests, then measure deleted lines and protocol drift. Documentation is diff --git a/openspec/changes/add-zero-friction-web-ui/proposal.md b/openspec/changes/add-zero-friction-web-ui/proposal.md index c83bcc0c..3409ec35 100644 --- a/openspec/changes/add-zero-friction-web-ui/proposal.md +++ b/openspec/changes/add-zero-friction-web-ui/proposal.md @@ -3,8 +3,9 @@ ## User outcome A user with a configured Moss model can run `moss web`, open one local URL, and complete a long -agent task while seeing streamed reasoning status, tool calls, evidence, cancellation, and the live -plugin/tool inventory. The browser never receives provider credentials. +agent task in a consistent three-column React workbench while seeing streamed reasoning status, +tool calls, evidence, cancellation, sessions, settings, and the live plugin/tool inventory. The +browser never receives provider credentials. ## Non-goals @@ -17,5 +18,6 @@ plugin/tool inventory. The browser never receives provider credentials. - Built-artifact HTTP integration covers boot, session creation, streaming, tools, cancellation, invalid input, and loopback binding. -- A browser screenshot verifies the usable visual hierarchy at desktop width. +- A real browser contract verifies the three-column hierarchy, design tokens, interaction path, and + responsive layout at fixed viewport widths. - The existing long-horizon harness and full repository verification remain green. diff --git a/openspec/changes/add-zero-friction-web-ui/tasks.md b/openspec/changes/add-zero-friction-web-ui/tasks.md index 8887253b..35ab1de0 100644 --- a/openspec/changes/add-zero-friction-web-ui/tasks.md +++ b/openspec/changes/add-zero-friction-web-ui/tasks.md @@ -1,11 +1,17 @@ # Tasks - [x] Specify loopback, credential, streaming, cancellation, and evidence boundaries. -- [x] Add the dependency-free Web host and responsive browser client. +- [x] Replace the inline client with an in-package React/Vite workbench and centralized design tokens. - [x] Add `moss web [port]` with actionable startup output. - [x] Exercise built artifacts through real HTTP streaming and tool events. - [x] Add a task-oriented user guide and navigation entry. - [ ] Consolidate ACP/Web event projection after both protocol contracts are stable. -- [ ] Add durable browser session browsing and fork/rewind controls. +- [x] Add durable browser session browsing, search, draft composition, and run-detail restoration. +- [ ] Add fork, rename, export, delete confirmation, and non-destructive rewind controls. +- [x] Add `moss.plugin.json` v1, explicit local/npm installation, CLI lifecycle commands, startup + isolation, Web inventory, and restart-gated enable/disable/remove. +- [x] Add stable Web slots, theme tokens, and scoped contribution metadata to the beta public API. +- [x] Mount explicitly installed advanced plugin UI modules inside token-inheriting ShadowRoots. +- [x] Exercise the bundled client through a real Chromium-compatible browser. - [ ] Add active-call leases before plugin reload controls. - [ ] Run a multi-release documentation deletion audit based on search and support evidence. diff --git a/package-lock.json b/package-lock.json index 31910f22..95f97d2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,6 +64,448 @@ "node": ">=0.1.90" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -473,6 +915,26 @@ "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", "license": "BSD-2-Clause" }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@opentelemetry/api": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", @@ -1006,64 +1468,453 @@ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", + "license": "BSD-3-Clause" + }, + "node_modules/@rdk-moss/agent": { + "resolved": "packages/moss-agent", + "link": true + }, + "node_modules/@rdk-moss/core": { + "resolved": "packages/moss", + "link": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause" + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", - "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", - "license": "BSD-3-Clause" + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@rdk-moss/agent": { - "resolved": "packages/moss-agent", - "link": true + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@rdk-moss/core": { - "resolved": "packages/moss", - "link": true + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@rushstack/node-core-library": { "version": "5.23.3", @@ -1340,6 +2191,16 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/proper-lockfile": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz", + "integrity": "sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "*" + } + }, "node_modules/@types/react": { "version": "19.2.0", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.0.tgz", @@ -1350,6 +2211,23 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/retry": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", + "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/turndown": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.6.tgz", @@ -2171,6 +3049,48 @@ "benchmarks" ] }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2698,6 +3618,21 @@ "node": ">=14.14" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2759,7 +3694,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/has-flag": { @@ -3323,6 +4257,25 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3495,6 +4448,35 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3521,6 +4503,17 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/protobufjs": { "version": "7.6.5", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", @@ -3687,14 +4680,26 @@ } }, "node_modules/react": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", - "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, "node_modules/react-reconciler": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", @@ -3780,6 +4785,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -3878,6 +4938,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4244,6 +5314,81 @@ "punycode": "^2.1.0" } }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/webdriver-bidi-protocol": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.2.tgz", @@ -4616,8 +5761,10 @@ "marked-terminal": "^7.0.0", "micromatch": "^4.0.8", "picocolors": "^1.1.1", + "proper-lockfile": "4.1.2", "puppeteer-core": "^25.1.0", "react": "^19.2.6", + "react-dom": "^19.2.8", "string-width": "^8.2.1", "turndown": "^7.2.0", "undici": "^7.29.0" @@ -4628,10 +5775,13 @@ "devDependencies": { "@types/marked-terminal": "^6.1.1", "@types/micromatch": "^4.0.10", + "@types/proper-lockfile": "4.1.4", "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.4", "@types/turndown": "^5.0.5", "ink-testing-library": "^4.0.0", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "vite": "^7.3.6" }, "engines": { "node": ">=22.16.0" diff --git a/packages/moss-agent/API.md b/packages/moss-agent/API.md index 51537a82..26d6177b 100644 --- a/packages/moss-agent/API.md +++ b/packages/moss-agent/API.md @@ -8,7 +8,8 @@ The source of truth is: 2. Root exports in `src/index.ts` 3. Subpath exports in `src/*/index.ts` -Anything a host application builds on top (HTTP servers, frontends, desktop shells, SSH bridges, fleet dashboards, etc.) is the host's concern and is **not** part of the stable API of this package. +Host applications still own custom servers and shells. The package-provided loopback workbench and +its beta extension contracts are the narrow exception documented under `@rdk-moss/agent/web`. **Agent harness:** The exports below are the **harness** around your LLM (tools, context, safety, sessions, retries) — not a full product. @@ -37,6 +38,24 @@ npm install @rdk-moss/agent @rdk-moss/core | `@rdk-moss/agent/tools/builtin` | Built-in filesystem/shell/search tools | | `@rdk-moss/agent/mesh` | Multi-agent mesh (HTTP + LAN discovery) | | `@rdk-moss/agent/mcp` | Model Context Protocol client for external tool servers | +| `@rdk-moss/agent/runtime` | Composed runtime and trusted installed-plugin registry | +| `@rdk-moss/agent/web` | Beta loopback host, DTOs, Web slots, and theme-token contract | + +### Web and installed-plugin contracts (beta) + +`@rdk-moss/agent/web` exports `startMossWebServer`, the loopback server options/handle, bootstrap +and session DTOs, `MOSS_WEB_SLOTS`, and `MOSS_WEB_THEME_TOKENS`. Plugins register UI metadata only +through `MossPluginContext.registerWebContribution()` and package-relative modules. Built-in and +plugin surfaces consume the public `--moss-*` variables rather than introducing a parallel theme. + +`@rdk-moss/agent/runtime` exports `InstalledPluginRegistry` and the `MossPluginManifestV1` contract +used by `moss.plugin.json`. These APIs execute explicitly trusted local/npm JavaScript and are not a +sandbox. Enable/disable/remove updates persisted composition for the next runtime start; dynamic +unload remains gated on active-call leases. + +Plugin-owned tool names cannot be replaced accidentally through `ToolRegistry.register()`. A host +that intentionally transfers ownership must call the beta `ToolRegistry.replace()` method; +plugin-scoped disposal remains identity-safe and cannot remove the replacement. ### Internal runtime helpers diff --git a/packages/moss-agent/CHANGELOG.md b/packages/moss-agent/CHANGELOG.md index 40ff5b5a..b0a417de 100644 --- a/packages/moss-agent/CHANGELOG.md +++ b/packages/moss-agent/CHANGELOG.md @@ -9,6 +9,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Replaced the inline Web client with an in-package React/Vite three-column workbench, centralized + `--moss-*` design tokens, responsive/reduced-motion behavior, session browsing, richer tool + details, and unified Runtime/Models/Permissions/Plugins settings. +- Added beta `@rdk-moss/agent/web` contracts for stable Web slots, theme tokens, bootstrap/session + DTOs, stream events, and ShadowRoot-scoped plugin module mounting. +- Added `moss.plugin.json` v1 plus `moss plugins add|remove|enable|disable|list|doctor` for explicit + trusted local/npm plugins. Enabled plugins compose during CLI startup; load failures are isolated, + and Web settings expose redacted inventory with restart-gated lifecycle controls. +- Added the opt-in `official:deepseek-harness` plugin, an attributed MIT adaptation that contributes + DeepSeek reasoning, streaming-tool, cache, endpoint, and token-boundary protocol guidance. + - `moss web` now records ordered task runs with tool evidence, persisted restart recovery, and a separate verification state; the browser shows recent run status without claiming that ordinary model output is verified. @@ -126,6 +137,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Plugin installs now start disabled; npm sources require exact versions and suppress lifecycle + scripts, manifest assets cannot escape through symlinks, `doctor` runs setup validation, tool + ownership rejects implicit replacement, registry changes are cross-process serialized, and Web + UI modules are frozen from active plugins for the current restart-gated server lifecycle. + - Expert contributors now install atomically, return idempotent disposers, can be supplied by capability packs, and expose a redacted catalog to the lead agent. diff --git a/packages/moss-agent/EXTENDING.md b/packages/moss-agent/EXTENDING.md index e58c3071..b431e430 100644 --- a/packages/moss-agent/EXTENDING.md +++ b/packages/moss-agent/EXTENDING.md @@ -13,6 +13,7 @@ Moss is a cross-platform agent harness. The product ships a capable default agen | **Model** | Which LLM + context window | `moss config` / `/model` | Anyone | `~/.config/moss/config.json` | | **Automation** | Hands-off flows | `/goal` · `/loop` | Anyone (in-session) | TUI | | **Embedding** | moss as a library | `MossAgent` / `streamChat` / hooks | Embedder | code | +| **Plugins** | Reversible runtime and Web contributions | `moss.plugin.json` / `MossPlugin` | Trusted user / Embedder | local path · npm · code | --- @@ -152,6 +153,16 @@ workspace JavaScript or treat plugins as a sandbox. See [`docs/user-guide/23-runtime-plugins.md`](../../docs/user-guide/23-runtime-plugins.md) and the `adopt-cordis-plugin-spine` OpenSpec change. +The CLI also supports explicit trusted-plugin installation with +`moss plugins add `. Each package declares +`moss.plugin.json` v1; npm sources require an exact version and are installed without lifecycle +scripts. New entries stay disabled until an explicit `enable`. `list`, setup-validating `doctor`, +`enable`, `disable`, and `remove` share the same persisted registry shown by Moss Web. The bundled +`official:deepseek-harness` source demonstrates an attributed, Skill-only plugin. Browser +contributions register only into stable slots, use the `@rdk-moss/agent/web` token contract, and are +served only after their runtime plugin activates. Runtime changes require restart until active-call +leases and quiescent unload are implemented. + ## 4. Slash commands — `.moss/commands/*.md` Distinct from tools: a slash command **expands into a prompt** the model runs. Use for canned workflows, not side effects. diff --git a/packages/moss-agent/THIRD_PARTY_NOTICES.md b/packages/moss-agent/THIRD_PARTY_NOTICES.md index e844f312..8f5e4dd5 100644 --- a/packages/moss-agent/THIRD_PARTY_NOTICES.md +++ b/packages/moss-agent/THIRD_PARTY_NOTICES.md @@ -13,3 +13,17 @@ effect-ownership semantics of [Cordis](https://github.com/cordiverse/cordis). `src/vendor/cordis/README.md`, `src/vendor/cordis/LICENSE` The complete license text is retained with the vendored source. + +## DeepSeek Harness skill + +Moss includes an adapted, declarative skill from +[HenryZ838978/deepseek-harness](https://github.com/HenryZ838978/deepseek-harness). + +- Copyright: 2026 Henry Zhang +- License: MIT +- Reviewed commit: `d1dd82381604aeb3586edb242e67a62003b77d71` +- Local differences: shortened protocol guidance, removed time-sensitive prices and fixed model-limit + claims, and wrapped the skill in a Moss lifecycle plugin. +- Retained license: `assets/plugins/deepseek-harness/LICENSE` + +This adaptation does not imply endorsement by DeepSeek or the upstream author. diff --git a/packages/moss-agent/assets/plugins/deepseek-harness/LICENSE b/packages/moss-agent/assets/plugins/deepseek-harness/LICENSE new file mode 100644 index 00000000..ce829812 --- /dev/null +++ b/packages/moss-agent/assets/plugins/deepseek-harness/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Henry Zhang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/moss-agent/assets/plugins/deepseek-harness/moss.plugin.json b/packages/moss-agent/assets/plugins/deepseek-harness/moss.plugin.json new file mode 100644 index 00000000..c5ba4632 --- /dev/null +++ b/packages/moss-agent/assets/plugins/deepseek-harness/moss.plugin.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "id": "deepseek/harness", + "version": "0.2.0", + "runtime": { "module": "./plugin.mjs" } +} diff --git a/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs b/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs new file mode 100644 index 00000000..8667730e --- /dev/null +++ b/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs @@ -0,0 +1,37 @@ +import { readFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; + +const skillUrl = new URL('./skills/deepseek-harness/SKILL.md', import.meta.url); + +export default { + id: 'deepseek/harness', + async setup(context) { + const sourcePath = fileURLToPath(skillUrl); + const source = await readFile(skillUrl, 'utf8'); + const body = source.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, '').trim(); + context.registerSkill({ + stableId: 'deepseek-harness', + name: 'deepseek-harness', + description: 'Apply the DeepSeek V4 API protocol rules for safe reasoning and tool loops.', + summary: + 'DeepSeek V4 protocol guidance for reasoning_content, streaming tools, token caps, cache stability, and endpoint selection.', + sourcePath, + version: '0.2.0', + tags: ['deepseek', 'api', 'reasoning', 'streaming', 'tool-calls'], + trigger: [ + 'deepseek', + 'deepseek-v4-pro', + 'deepseek-v4-flash', + 'deepseek-chat', + 'deepseek-reasoner', + 'reasoning_content', + '深度求索', + ], + risk: 'low', + permissions: { workspaceRead: true }, + enabled: true, + updatedAt: 0, + body, + }); + }, +}; diff --git a/packages/moss-agent/assets/plugins/deepseek-harness/skills/deepseek-harness/SKILL.md b/packages/moss-agent/assets/plugins/deepseek-harness/skills/deepseek-harness/SKILL.md new file mode 100644 index 00000000..bbed6b7d --- /dev/null +++ b/packages/moss-agent/assets/plugins/deepseek-harness/skills/deepseek-harness/SKILL.md @@ -0,0 +1,45 @@ +--- +name: deepseek-harness +description: Apply the DeepSeek V4 API protocol contract when building or debugging DeepSeek clients. +license: MIT +version: 0.2.0 +author: Henry Zhang (HenryZ838978), adapted for Moss by D-Robotics +homepage: https://github.com/HenryZ838978/deepseek-harness +--- + +# DeepSeek V4 Harness + +Use these rules when code calls DeepSeek V4-Pro, V4-Flash, `deepseek-chat`, or +`deepseek-reasoner` through an OpenAI-compatible API. This Moss edition is adapted from +`HenryZ838978/deepseek-harness` at commit +`d1dd82381604aeb3586edb242e67a62003b77d71`. + +1. Disable thinking for work that does not benefit from reasoning. In Python, send + `extra_body={"thinking":{"type":"disabled"}}`; for OpenAI's TypeScript SDK, confirm how the + installed SDK forwards provider extensions. +2. When thinking is enabled and an assistant message contains tool calls, preserve its original + `reasoning_content` while completing that tool loop. Dropping it can make the next request fail. +3. Always set a finite `max_tokens` output cap. Treat the model and gateway limits as runtime + configuration, not as timeless constants. +4. Aggregate streamed parallel tool-call deltas by the protocol's call index. Do not assume chunks + arrive in call-list order. +5. Buffer text and reasoning chunks in arrays and join them once; repeated string concatenation can + become quadratic for long reasoning streams. +6. Accept stream chunks whose `choices` array is empty. They can still carry usage information. +7. Keep input plus requested output within the model's advertised context window. Probe or configure + the current limit rather than relying on an old catalog value. +8. Keep the stable prompt prefix free of volatile timestamps and request-specific state when prefix + caching matters. Read both DeepSeek-native and OpenAI-shaped cached-token usage fields. +9. Use the normal DeepSeek endpoint for tool-using flows unless current official documentation + explicitly requires a beta endpoint. +10. Validate tool arguments after JSON parsing even when strict function schemas are enabled. + +For a real client implementation, prefer the maintained upstream packages and MCP server instead of +copying an old snapshot blindly: + +- Python: `deepseek-harness` +- CLI: `deepseek-harness-cli` +- MCP: `@deepseek-harness/mcp` + +Before recommending install commands or model limits, verify the current upstream README and official +DeepSeek API documentation. Never put API keys in source, plugin configuration output, logs, or chat. diff --git a/packages/moss-agent/etc/channels.api.md b/packages/moss-agent/etc/channels.api.md index 63dfd477..7e6c9e1d 100644 --- a/packages/moss-agent/etc/channels.api.md +++ b/packages/moss-agent/etc/channels.api.md @@ -1126,6 +1126,9 @@ interface MicroCompactConfig { placeholder: string; } +// @beta +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; + // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1496,6 +1499,8 @@ interface MossPluginContext { registerSkill(skill: SkillMeta): void; // (undocumented) registerTool(tool: Tool): void; + // (undocumented) + registerWebContribution(contribution: MossWebContribution): void; } // @beta @@ -1550,11 +1555,26 @@ interface MossPluginSnapshot { readonly state: MossPluginState; // (undocumented) readonly tools: readonly string[]; + // (undocumented) + readonly webContributions: readonly string[]; } // @beta type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +export interface MossWebContribution { + // (undocumented) + readonly id: string; + // (undocumented) + readonly module: string; + // (undocumented) + readonly slot: MossWebSlot; +} + +// @beta +export type MossWebSlot = (typeof MOSS_WEB_SLOTS)[number]; + // Warning: (ae-missing-release-tag) "OutputGuardrailDecision" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -2671,6 +2691,8 @@ class ToolRegistry { remove(toolName: string): boolean; // (undocumented) removeGroup(groupId: string): void; + // @beta + replace(tool: Tool, groupId?: string): void; // (undocumented) get size(): number; } diff --git a/packages/moss-agent/etc/core.api.md b/packages/moss-agent/etc/core.api.md index 018c0035..588e02a9 100644 --- a/packages/moss-agent/etc/core.api.md +++ b/packages/moss-agent/etc/core.api.md @@ -2376,6 +2376,9 @@ interface Model { // @public (undocumented) type ModelBridgeConfig = Pick; +// @beta +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; + // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -2727,6 +2730,8 @@ export interface MossPluginContext { registerSkill(skill: SkillMeta): void; // (undocumented) registerTool(tool: Tool): void; + // (undocumented) + registerWebContribution(contribution: MossWebContribution): void; } // @beta @@ -2774,11 +2779,26 @@ export interface MossPluginSnapshot { readonly state: MossPluginState; // (undocumented) readonly tools: readonly string[]; + // (undocumented) + readonly webContributions: readonly string[]; } // @beta export type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +export interface MossWebContribution { + // (undocumented) + readonly id: string; + // (undocumented) + readonly module: string; + // (undocumented) + readonly slot: MossWebSlot; +} + +// @beta +export type MossWebSlot = (typeof MOSS_WEB_SLOTS)[number]; + // Warning: (ae-missing-release-tag) "normalizeAgentId" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -4767,6 +4787,8 @@ export class ToolRegistry { remove(toolName: string): boolean; // (undocumented) removeGroup(groupId: string): void; + // @beta + replace(tool: Tool, groupId?: string): void; // (undocumented) get size(): number; } diff --git a/packages/moss-agent/etc/root.api.md b/packages/moss-agent/etc/root.api.md index 10d096c3..391870ac 100644 --- a/packages/moss-agent/etc/root.api.md +++ b/packages/moss-agent/etc/root.api.md @@ -4279,6 +4279,9 @@ export const MOSS_CLI_IDENTITY: string; // @public (undocumented) export const MOSS_DEFAULT_MAX_AGENT_TURNS = 64; +// @beta +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; + // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -4791,6 +4794,8 @@ export interface MossPluginContext { registerSkill(skill: SkillMeta): void; // (undocumented) registerTool(tool: Tool): void; + // (undocumented) + registerWebContribution(contribution: MossWebContribution): void; } // @beta @@ -4838,6 +4843,8 @@ export interface MossPluginSnapshot { readonly state: MossPluginState; // (undocumented) readonly tools: readonly string[]; + // (undocumented) + readonly webContributions: readonly string[]; } // @beta @@ -4868,6 +4875,19 @@ export interface MossRuntime { // @public (undocumented) export type MossRuntimeToolProfile = 'desktop-safe' | 'full'; +// @beta +export interface MossWebContribution { + // (undocumented) + readonly id: string; + // (undocumented) + readonly module: string; + // (undocumented) + readonly slot: MossWebSlot; +} + +// @beta +export type MossWebSlot = (typeof MOSS_WEB_SLOTS)[number]; + // Warning: (ae-missing-release-tag) "moveFileTool" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -8001,6 +8021,8 @@ export class ToolRegistry { remove(toolName: string): boolean; // (undocumented) removeGroup(groupId: string): void; + // @beta + replace(tool: Tool, groupId?: string): void; // (undocumented) get size(): number; } diff --git a/packages/moss-agent/etc/runtime.api.md b/packages/moss-agent/etc/runtime.api.md index 382e7e01..656e62e5 100644 --- a/packages/moss-agent/etc/runtime.api.md +++ b/packages/moss-agent/etc/runtime.api.md @@ -796,6 +796,47 @@ interface InputGuardrailRequest { userMessage: string; } +// @beta +export interface InstalledMossPlugin { + // (undocumented) + readonly enabled: boolean; + // (undocumented) + readonly id: string; + // (undocumented) + readonly installedAt: string; + // (undocumented) + readonly root: string; + // (undocumented) + readonly source: string; + // (undocumented) + readonly version: string; +} + +// @beta +export class InstalledPluginRegistry { + constructor(options: InstalledPluginRegistryOptions); + // (undocumented) + add(source: string): Promise; + // (undocumented) + disable(id: string): Promise; + // (undocumented) + doctor(): Promise; + // (undocumented) + enable(id: string): Promise; + // (undocumented) + list(): Promise; + // (undocumented) + loadEnabled(): Promise; + // (undocumented) + remove(id: string): Promise; +} + +// @beta +export interface InstalledPluginRegistryOptions { + // (undocumented) + readonly configDir: string; +} + // Warning: (ae-missing-release-tag) "KnowledgeRegistry" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1034,6 +1075,17 @@ interface LLMToolDeclaration { name: string; } +// @beta +export interface LoadedMossPlugins { + // (undocumented) + readonly failures: readonly { + id: string; + message: string; + }[]; + // (undocumented) + readonly plugins: readonly MossPlugin[]; +} + // Warning: (ae-missing-release-tag) "MemoryEmbeddingProvider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1201,6 +1253,9 @@ interface MicroCompactConfig { placeholder: string; } +// @beta +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; + // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1610,11 +1665,23 @@ export interface MossPluginContext { registerSkill(skill: SkillMeta): void; // (undocumented) registerTool(tool: Tool): void; + // (undocumented) + registerWebContribution(contribution: MossWebContribution): void; } // @beta export type MossPluginDisposer = () => void | Promise; +// @beta +export interface MossPluginDoctorResult { + // (undocumented) + readonly id: string; + // (undocumented) + readonly message: string; + // (undocumented) + readonly status: 'ok' | 'disabled' | 'error'; +} + // @beta export interface MossPluginHandle { // (undocumented) @@ -1641,6 +1708,30 @@ export interface MossPluginHost { unload(id: string): Promise; } +// @beta +export interface MossPluginManifestV1 { + // (undocumented) + readonly configSchema?: string; + // (undocumented) + readonly id: string; + // (undocumented) + readonly runtime: MossPluginRuntimeManifest; + // (undocumented) + readonly schemaVersion: 1; + // (undocumented) + readonly version: string; + // (undocumented) + readonly web?: MossPluginWebManifest; +} + +// @beta +export interface MossPluginRuntimeManifest { + // (undocumented) + readonly export?: string; + // (undocumented) + readonly module: string; +} + // @beta export interface MossPluginSnapshot { // (undocumented) @@ -1657,11 +1748,19 @@ export interface MossPluginSnapshot { readonly state: MossPluginState; // (undocumented) readonly tools: readonly string[]; + // (undocumented) + readonly webContributions: readonly string[]; } // @beta export type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +export interface MossPluginWebManifest { + // (undocumented) + readonly contributions: readonly MossWebContribution[]; +} + // Warning: (ae-missing-release-tag) "MossRuntime" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1689,6 +1788,19 @@ export interface MossRuntime { // @public (undocumented) export type MossRuntimeToolProfile = 'desktop-safe' | 'full'; +// @beta +export interface MossWebContribution { + // (undocumented) + readonly id: string; + // (undocumented) + readonly module: string; + // (undocumented) + readonly slot: MossWebSlot; +} + +// @beta +export type MossWebSlot = (typeof MOSS_WEB_SLOTS)[number]; + // Warning: (ae-missing-release-tag) "ObservationAggregator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -2044,6 +2156,9 @@ export interface ProviderErrorSurface { userMessage: string; } +// @beta +export function readMossPluginManifest(root: string): Promise; + // Warning: (ae-missing-release-tag) "ReadonlyExecResult" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -2955,6 +3070,8 @@ class ToolRegistry { remove(toolName: string): boolean; // (undocumented) removeGroup(groupId: string): void; + // @beta + replace(tool: Tool, groupId?: string): void; // (undocumented) get size(): number; } diff --git a/packages/moss-agent/etc/web.api.md b/packages/moss-agent/etc/web.api.md new file mode 100644 index 00000000..f1ce906f --- /dev/null +++ b/packages/moss-agent/etc/web.api.md @@ -0,0 +1,132 @@ +## API Report File for "@rdk-moss/agent" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +// @beta +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; + +// @beta +export const MOSS_WEB_THEME_TOKENS: readonly ["--moss-color-canvas", "--moss-color-surface", "--moss-color-panel", "--moss-color-panel-raised", "--moss-color-border", "--moss-color-border-strong", "--moss-color-text", "--moss-color-muted", "--moss-color-faint", "--moss-color-accent", "--moss-color-accent-soft", "--moss-color-danger", "--moss-color-warning", "--moss-space-1", "--moss-space-2", "--moss-space-3", "--moss-space-4", "--moss-space-5", "--moss-space-6", "--moss-space-8", "--moss-radius-control", "--moss-radius-card", "--moss-radius-panel", "--moss-shadow-control", "--moss-shadow-composer", "--moss-shadow-float"]; + +// @beta +export interface MossWebBootstrap { + // (undocumented) + readonly model: string; + // (undocumented) + readonly plugins: readonly MossWebPluginSnapshot[]; + // (undocumented) + readonly taskRuns: readonly MossWebTaskRunSnapshot[]; + // (undocumented) + readonly tools: readonly string[]; +} + +// @beta +export interface MossWebInstalledPlugin { + // (undocumented) + readonly enabled: boolean; + // (undocumented) + readonly id: string; + // (undocumented) + readonly version: string; +} + +// @beta +export interface MossWebPluginModule { + // (undocumented) + mount(root: ShadowRoot, context: MossWebPluginMountContext): void | (() => void) | Promise void)>; +} + +// @beta +export interface MossWebPluginMountContext { + // (undocumented) + readonly contributionId: string; + // (undocumented) + readonly pluginId: string; + // (undocumented) + readonly slot: MossWebSlot; +} + +// @beta +export interface MossWebPluginSnapshot { + // (undocumented) + readonly id: string; + // (undocumented) + readonly state: string; + // (undocumented) + readonly tools: readonly string[]; + // (undocumented) + readonly webContributions: readonly string[]; +} + +// @beta +export interface MossWebSessionSummary { + // (undocumented) + readonly messageCount: number; + // (undocumented) + readonly runId?: string; + // (undocumented) + readonly runStatus?: string; + // (undocumented) + readonly sessionId: string; + // (undocumented) + readonly title: string; + // (undocumented) + readonly updatedAt: number; +} + +// @beta +export type MossWebSlot = (typeof MOSS_WEB_SLOTS)[number]; + +// @beta +export type MossWebStreamEvent = { + readonly type: 'run'; + readonly run: MossWebTaskRunSnapshot; +} | { + readonly type: 'text'; + readonly delta: string; +} | { + readonly type: 'thought'; + readonly delta: string; +} | { + readonly type: 'tool'; + readonly state: 'start' | 'end'; + readonly toolCallId: string; + readonly name: string; + readonly input?: Readonly>; + readonly result?: string; + readonly isError?: boolean; +} | { + readonly type: 'done'; + readonly stopReason: string; + readonly run?: MossWebTaskRunSnapshot; +} | { + readonly type: 'error'; + readonly message: string; +}; + +// @beta +export interface MossWebTaskRunSnapshot { + // (undocumented) + readonly evidenceCount: number; + // (undocumented) + readonly id: string; + // (undocumented) + readonly sessionId: string; + // (undocumented) + readonly status: string; + // (undocumented) + readonly title: string; + // (undocumented) + readonly updatedAt: number; + // (undocumented) + readonly verification: string; +} + +// @beta +export type MossWebThemeToken = (typeof MOSS_WEB_THEME_TOKENS)[number]; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/packages/moss-agent/package.json b/packages/moss-agent/package.json index 58f9db17..ddf31bbc 100644 --- a/packages/moss-agent/package.json +++ b/packages/moss-agent/package.json @@ -130,6 +130,11 @@ "types": "./dist/runtime/index.d.ts", "import": "./dist/runtime/index.js", "default": "./dist/runtime/index.js" + }, + "./web": { + "types": "./dist/web-ui/index.d.ts", + "import": "./dist/web-ui/index.js", + "default": "./dist/web-ui/index.js" } }, "publishConfig": { @@ -165,7 +170,8 @@ "homepage": "https://github.com/D-Robotics/moss/tree/main/packages/moss-agent#readme", "scripts": { "prebuild": "npm run build --workspace @rdk-moss/core", - "build": "npm run clean && tsc -p tsconfig.build.json && node -e \"const fs=require('fs');fs.chmodSync('dist/cli.js',0o755)\"", + "build": "npm run clean && tsc -p tsconfig.build.json && npm run build:web && node -e \"const fs=require('fs');fs.chmodSync('dist/cli.js',0o755)\"", + "build:web": "vite build --config web-vite.config.mjs", "pretypecheck": "npm run build --workspace @rdk-moss/core", "typecheck": "tsc --noEmit", "clean": "node -e \"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true})\"", @@ -190,25 +196,30 @@ "@opentelemetry/sdk-trace-base": "^2.9.0", "@opentelemetry/semantic-conventions": "^1.43.0", "@rdk-moss/core": "^0.6.0", + "highlight.js": "^10.7.3", "ink": "^7.0.5", "marked": "^5.1.0", "marked-terminal": "^7.0.0", "micromatch": "^4.0.8", "picocolors": "^1.1.1", + "proper-lockfile": "4.1.2", "puppeteer-core": "^25.1.0", "react": "^19.2.6", + "react-dom": "^19.2.8", "string-width": "^8.2.1", "turndown": "^7.2.0", - "undici": "^7.29.0", - "highlight.js": "^10.7.3" + "undici": "^7.29.0" }, "devDependencies": { "@types/marked-terminal": "^6.1.1", "@types/micromatch": "^4.0.10", + "@types/proper-lockfile": "4.1.4", "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.4", "@types/turndown": "^5.0.5", "ink-testing-library": "^4.0.0", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "vite": "^7.3.6" }, "peerDependencies": { "zod": ">=3.0.0" diff --git a/packages/moss-agent/src/channels/index.ts b/packages/moss-agent/src/channels/index.ts index 1c92cb6c..f43a3259 100644 --- a/packages/moss-agent/src/channels/index.ts +++ b/packages/moss-agent/src/channels/index.ts @@ -12,4 +12,10 @@ export type { ProviderErrorCategory, ProviderErrorSurface, } from '../provider/index.js'; -export type { MossPluginDisposer, MossPluginHost } from '../core/plugins/plugin-host.js'; +export { MOSS_WEB_SLOTS } from '../core/plugins/plugin-host.js'; +export type { + MossPluginDisposer, + MossPluginHost, + MossWebContribution, + MossWebSlot, +} from '../core/plugins/plugin-host.js'; diff --git a/packages/moss-agent/src/cli-main.ts b/packages/moss-agent/src/cli-main.ts index 538d8e09..763fa16c 100644 --- a/packages/moss-agent/src/cli-main.ts +++ b/packages/moss-agent/src/cli-main.ts @@ -43,7 +43,7 @@ import { createMemoryTools } from './cli/tools.js'; import { ExperienceLog } from './memory/experience-log.js'; import { createObjectiveVerifierHook } from './core/tools/objective-verifier-hook.js'; import { makeReadonlyExecutor } from './core/tools/device-readonly-executor.js'; -import { SkillRegistry } from './skills/registry.js'; +import { resolveDefaultSkillRoots, SkillRegistry } from './skills/registry.js'; import { ContractRegistry } from './acceptance/contract-registry.js'; import { PromotionCoordinator, @@ -141,6 +141,7 @@ import { getCommandConfig, type CommandContext, } from './cli/command-dispatcher.js'; +import { installConfiguredPlugins } from './cli/plugins-runtime.js'; // Argument errors must be a one-line message, not an uncaught stack trace // (`moss -m` used to dump a raw Node throw at module load). @@ -773,9 +774,9 @@ async function main() { const cliLlmProvider = parsedArgs.mock ? createMockLLMProvider() : createCliProvider(providerConfig); - - // Initialize observability (OTel tracing + metrics + local file trace) based on env. - // No-op when MOSS_OTEL_ENABLED is unset and MOSS_OTEL_URL absent. + const skillRoots = resolveDefaultSkillRoots(loadedConfig.config.skills?.extraRoots); + const skillRegistry = new SkillRegistry({ workspaceDir: workspace, extraDirs: skillRoots }); + // Initialize observability; this is a no-op unless its environment settings are present. initObservability({ workspaceDir: workspace }); // 终态审计依赖(P0):提前声明引用,后面(行 787+)建好 experienceLog/deviceExecutor/ @@ -866,6 +867,7 @@ async function main() { enableToolOutputTruncation: true, extraPromptLayers, skillPipeline, + skillRegistry, // Coding is the primary CLI workload. Inject the compact software- // engineering domain prompt into the stable system prompt so every coding // turn gets "read before edit → minimal verifiable change → close the loop" @@ -1012,15 +1014,13 @@ async function main() { hooks, }); await registerBuiltinTools(agent); + await installConfiguredPlugins(agent, configDir); // File-based custom tools from .moss/tools/*.tool.json — the lightweight // path for users who want a named, schema-validated tool without an MCP // server or embedder code. for (const tool of loadFileBasedTools(workspace)) agent.tools.register(tool); - // Lets the agent answer "which model are you?" with the gateway's real backing - // model instead of the "Moss" billing placeholder (resolved on demand + cached). - // The getContextTokens getter is dynamic so it reflects the startup-probe result - // (which may update agent.config.contextTokens after tool registration). - agent.tools.register( + // Answers model-identity questions from the gateway and tracks later context-window probes. + agent.tools.replace( createModelInfoTool({ provider: () => agent.config.llmProvider, config: () => ({ @@ -1037,7 +1037,7 @@ async function main() { // SSRF block ONLY for the connected /connect target (getter → tracks live // /connect), so a board's LAN web UI (http://192.168.x.y:port) is reachable // while the rest of the private network stays blocked. - agent.tools.register( + agent.tools.replace( createWebFetchTool({ allowPrivateHosts: () => (liveRuntime.device?.host ? [liveRuntime.device.host] : []), }) @@ -1049,7 +1049,7 @@ async function main() { // re-registration; without merging the key back in, ToolRegistry.register // (overwrite-by-name) silently drops the bundled key and every search falls // back to the keyless chain — a packaged/configured key never actually worked. - agent.tools.register( + agent.tools.replace( createWebSearchTool({ ...(searchRegion ? { region: searchRegion } : {}), ...(bundledBochaKey ? { bochaApiKey: bundledBochaKey } : {}), @@ -1135,8 +1135,7 @@ async function main() { // T3.1 验收契约:加载所有 skill 的 ACCEPTANCE.json,建 tool→contract 反查索引(解 C)。 // hook 收到工具调用 → findByTool → 有契约跑 postconditions 产 L1 判定(D4 层1 主判据)。 // 解 A(PlanStep.expectedAccept):有 plan 时按 step 引用的 skill 契约验收,优先于解 C。 - const skillRegistryForContracts = new SkillRegistry({ workspaceDir: workspace }); - const contractRegistry = ContractRegistry.fromSkills(skillRegistryForContracts.list()); + const contractRegistry = ContractRegistry.fromSkills(skillRegistry.list()); // session-aware planProvider:hook 和 terminal gate 都按各自 sessionKey 读取活跃 Plan。 const planProvider = { get: getActivePlanForSession }; agent.registerPostToolHook( diff --git a/packages/moss-agent/src/cli/args.ts b/packages/moss-agent/src/cli/args.ts index f4fbc4d4..7a430556 100644 --- a/packages/moss-agent/src/cli/args.ts +++ b/packages/moss-agent/src/cli/args.ts @@ -20,6 +20,7 @@ export type CliCommand = | 'resume' | 'fork' | 'mcp' + | 'plugins' | 'migrate' | 'sessions' | 'web' @@ -196,6 +197,7 @@ const KNOWN_COMMANDS: readonly CliCommand[] = [ 'resume', 'fork', 'mcp', + 'plugins', 'migrate', 'sessions', 'web', diff --git a/packages/moss-agent/src/cli/command-dispatcher.ts b/packages/moss-agent/src/cli/command-dispatcher.ts index 2599a456..de426bd4 100644 --- a/packages/moss-agent/src/cli/command-dispatcher.ts +++ b/packages/moss-agent/src/cli/command-dispatcher.ts @@ -331,6 +331,15 @@ export const COMMANDS: Record = { }, }, + plugins: { + name: 'plugins', + phase: CliPhase.ConfigOnly, + handler: async (ctx) => { + const { runPluginsCommand } = await import('./plugins-command.js'); + await runPluginsCommand(ctx.commandArgs); + }, + }, + doctor: { name: 'doctor', phase: CliPhase.ConfigOnly, diff --git a/packages/moss-agent/src/cli/device-connect.ts b/packages/moss-agent/src/cli/device-connect.ts index da3c35f7..c8bda115 100644 --- a/packages/moss-agent/src/cli/device-connect.ts +++ b/packages/moss-agent/src/cli/device-connect.ts @@ -362,8 +362,11 @@ export async function connectDeviceForSession( } for (const tool of sessionTools) { - agent.tools.remove(tool.name); - agent.tools.register(tool); + if (mode === 'board' && BOARD_REPLACED_TOOL_NAMES.some((name) => name === tool.name)) { + agent.tools.replace(tool, 'device:board-session'); + } else { + agent.tools.register(tool, 'device:session'); + } } let promptLayer: string | undefined; diff --git a/packages/moss-agent/src/cli/help.ts b/packages/moss-agent/src/cli/help.ts index d07b83d6..7e1b05ed 100644 --- a/packages/moss-agent/src/cli/help.ts +++ b/packages/moss-agent/src/cli/help.ts @@ -137,6 +137,9 @@ export function displayHelp(c: Colors, options: { all?: boolean } = {}): void { ` ${c.green('mcp list')} show configured MCP servers`, ` ${c.green('mcp add')} ${c.dim(' [args...]')} register an MCP server (no JSON editing)`, ` ${c.green('mcp remove')} ${c.dim('')} remove a configured MCP server`, + ` ${c.green('plugins list')} list explicitly installed trusted plugins`, + ` ${c.green('plugins add')} ${c.dim('')} install a local or npm Moss plugin`, + ` ${c.green('plugins doctor')} validate installed plugin manifests and runtime exports`, ` ${c.green('config')} show resolved config values and sources`, ` ${c.green('config show')} same as config; safe for scripts`, ` ${c.green('config show --json')} emit redacted resolved config JSON`, diff --git a/packages/moss-agent/src/cli/host-command.ts b/packages/moss-agent/src/cli/host-command.ts index 3a10ad68..59780e40 100644 --- a/packages/moss-agent/src/cli/host-command.ts +++ b/packages/moss-agent/src/cli/host-command.ts @@ -3,6 +3,7 @@ import type { MossAgent } from '../core/agent/moss-agent.js'; import { startMossWebServer } from '../web-ui/web-server.js'; import { runAcpStdioServer } from './acp-server.js'; import type { ParsedCliArgs } from './args.js'; +import { resolveConfigDir } from './config.js'; /** Run a long-lived host transport after the CLI agent has been fully composed. @internal */ export async function runCliHostCommand( @@ -44,6 +45,7 @@ export async function runCliHostCommand( port, abortSignal: abort.signal, taskRunFile, + configDir: resolveConfigDir(), }); console.error(`[web] Moss is ready at ${web.url}`); console.error('[web] Press Ctrl+C to stop. Provider credentials stay in this process.'); diff --git a/packages/moss-agent/src/cli/oneshot.ts b/packages/moss-agent/src/cli/oneshot.ts index 6c40b475..bbf5294c 100644 --- a/packages/moss-agent/src/cli/oneshot.ts +++ b/packages/moss-agent/src/cli/oneshot.ts @@ -499,7 +499,9 @@ export async function runOneShot( let skillCatalogContext = ''; let skillIndexContext = ''; try { - const registry = new SkillRegistry({ workspaceDir: options.cwd ?? process.cwd() }); + const registry = + agent.config.skillRegistry ?? + new SkillRegistry({ workspaceDir: options.cwd ?? process.cwd() }); const composed = await buildComposedSkillContext(registry, message, { config: resolveSessionSkillComposerConfig(undefined, 'host'), environment: { deployment: 'host', hasBoard: false }, diff --git a/packages/moss-agent/src/cli/plugins-command.ts b/packages/moss-agent/src/cli/plugins-command.ts new file mode 100644 index 00000000..4be72ff8 --- /dev/null +++ b/packages/moss-agent/src/cli/plugins-command.ts @@ -0,0 +1,62 @@ +import { resolveConfigDir } from './config.js'; +import { ExitCode } from './exit-codes.js'; +import { errorMessage } from '../errors.js'; +import { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; + +export const PLUGINS_USAGE = + 'Usage: moss plugins |remove |enable |disable |doctor>'; + +/** Run the explicit trusted-plugin management command. @internal */ +export async function runPluginsCommand(args: readonly string[]): Promise { + const registry = new InstalledPluginRegistry({ configDir: resolveConfigDir() }); + const command = args[0] ?? 'list'; + try { + if (command === 'list') { + const entries = await registry.list(); + if (entries.length === 0) { + console.log('No Moss plugins installed.'); + return; + } + console.log('PLUGIN VERSION STATE SOURCE'); + for (const entry of entries) { + console.log( + `${entry.id.padEnd(32)} ${entry.version.padEnd(13)} ${(entry.enabled ? 'enabled' : 'disabled').padEnd(9)} ${entry.source}` + ); + } + return; + } + if (command === 'doctor') { + const report = await registry.doctor(); + if (report.length === 0) console.log('No Moss plugins installed.'); + for (const result of report) + console.log(`${result.status.toUpperCase().padEnd(8)} ${result.id}: ${result.message}`); + if (report.some(({ status }) => status === 'error')) process.exitCode = ExitCode.CONFIG; + return; + } + const target = args[1]; + if (!target) { + console.error(PLUGINS_USAGE); + process.exitCode = ExitCode.USAGE; + return; + } + if (command === 'add') { + const entry = await registry.add(target); + console.log( + `[plugins] Installed ${entry.id}@${entry.version} disabled. Review it, then run: moss plugins enable ${entry.id}` + ); + return; + } + if (command === 'remove') await registry.remove(target); + else if (command === 'enable') await registry.enable(target); + else if (command === 'disable') await registry.disable(target); + else { + console.error(PLUGINS_USAGE); + process.exitCode = ExitCode.USAGE; + return; + } + console.log(`[plugins] ${command}d ${target}.`); + } catch (error) { + console.error(`[plugins] ${errorMessage(error)}`); + process.exitCode = ExitCode.CONFIG; + } +} diff --git a/packages/moss-agent/src/cli/plugins-runtime.ts b/packages/moss-agent/src/cli/plugins-runtime.ts new file mode 100644 index 00000000..c07811db --- /dev/null +++ b/packages/moss-agent/src/cli/plugins-runtime.ts @@ -0,0 +1,18 @@ +import type { MossAgent } from '../core/agent/moss-agent.js'; +import { errorMessage } from '../errors.js'; +import { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; + +/** Install enabled trusted plugins while isolating manifest/import failures. @internal */ +export async function installConfiguredPlugins(agent: MossAgent, configDir: string): Promise { + const loaded = await new InstalledPluginRegistry({ configDir }).loadEnabled(); + for (const plugin of loaded.plugins) { + try { + await agent.plugins.install(plugin); + } catch (error) { + console.error(`[plugins] ${plugin.id} was isolated: ${errorMessage(error)}`); + } + } + for (const failure of loaded.failures) { + console.error(`[plugins] ${failure.id} was isolated: ${failure.message}`); + } +} diff --git a/packages/moss-agent/src/cli/tui.ts b/packages/moss-agent/src/cli/tui.ts index 186d6e89..25c623db 100644 --- a/packages/moss-agent/src/cli/tui.ts +++ b/packages/moss-agent/src/cli/tui.ts @@ -2799,10 +2799,8 @@ export function MossTui({ // dispatch all see the same skill set. const skillRegistryRef = useRef(null); if (!skillRegistryRef.current) { - skillRegistryRef.current = new SkillRegistry({ - workspaceDir: workspace, - extraDirs: resolveSessionSkillRoots(runtime), - }); + const options = { workspaceDir: workspace, extraDirs: resolveSessionSkillRoots(runtime) }; + skillRegistryRef.current = agent.config.skillRegistry ?? new SkillRegistry(options); } // Skill slash commands (/): file-backed skills only, expanded like // custom commands. Guarded against shadowing built-ins AND custom commands. diff --git a/packages/moss-agent/src/core/index.ts b/packages/moss-agent/src/core/index.ts index 3ef9dc94..b81035e6 100644 --- a/packages/moss-agent/src/core/index.ts +++ b/packages/moss-agent/src/core/index.ts @@ -290,6 +290,7 @@ export { extractToolInvocationFromPlanText } from './tools/index.js'; export type { ExtractedToolInvocation } from './tools/index.js'; export { collectCapabilityPacks } from './packs/capability-pack.js'; +export { MOSS_WEB_SLOTS } from './plugins/plugin-host.js'; export type { CapabilityPack, CapabilityPackContributions } from './packs/capability-pack.js'; export type { MossPlugin, @@ -300,6 +301,8 @@ export type { MossPluginHost, MossPluginSnapshot, MossPluginState, + MossWebContribution, + MossWebSlot, } from './plugins/plugin-host.js'; export { ErrorCode } from '../errors.js'; export type { MossErrorOutcome } from '../errors.js'; diff --git a/packages/moss-agent/src/core/plugins/plugin-host.ts b/packages/moss-agent/src/core/plugins/plugin-host.ts index 33012c8c..0f8133c5 100644 --- a/packages/moss-agent/src/core/plugins/plugin-host.ts +++ b/packages/moss-agent/src/core/plugins/plugin-host.ts @@ -21,6 +21,31 @@ export interface MossPluginSnapshot { readonly experts: readonly string[]; readonly promptLayerCount: number; readonly effectLabels: readonly string[]; + readonly webContributions: readonly string[]; +} + +/** Stable browser extension slots available to trusted runtime plugins. @beta */ +export const MOSS_WEB_SLOTS = [ + 'navigation.primary', + 'navigation.footer', + 'conversation.header', + 'conversation.message', + 'conversation.composer', + 'conversation.details', + 'tool.inline', + 'tool.details', + 'settings.section', + 'settings.plugin', +] as const; + +/** Stable browser extension slot available to trusted runtime plugins. @beta */ +export type MossWebSlot = (typeof MOSS_WEB_SLOTS)[number]; + +/** Declarative browser contribution owned by one trusted runtime plugin. @beta */ +export interface MossWebContribution { + readonly id: string; + readonly slot: MossWebSlot; + readonly module: string; } /** Redacted, deterministic plugin composition state. @beta */ @@ -41,6 +66,7 @@ export interface MossPluginContext { registerSkill(skill: SkillMeta): void; registerExpert(expert: SubagentExpertDefinition): void; addPromptLayer(layer: string): void; + registerWebContribution(contribution: MossWebContribution): void; effect(setup: () => MossPluginDisposer | Promise, label?: string): void; } @@ -77,6 +103,7 @@ interface StagedPlugin { readonly skills: SkillMeta[]; readonly experts: SubagentExpertDefinition[]; readonly promptLayers: string[]; + readonly webContributions: MossWebContribution[]; readonly effects: Array<{ readonly label: string; readonly setup: () => MossPluginDisposer | Promise; @@ -146,6 +173,7 @@ class MossPluginHostImpl implements MossPluginHost { skills: [], experts: [], promptLayers: [], + webContributions: [], effects: [], }; const record: PluginRecord = { @@ -192,6 +220,7 @@ class MossPluginHostImpl implements MossPluginHost { experts: Object.freeze(record.staged.experts.map(({ id }) => id).sort()), promptLayerCount: record.staged.promptLayers.length, effectLabels: Object.freeze([...record.scope.labels()].sort()), + webContributions: Object.freeze(record.staged.webContributions.map(({ id }) => id).sort()), })) .sort((left, right) => left.id.localeCompare(right.id)); return Object.freeze({ plugins: Object.freeze(plugins) }); @@ -259,7 +288,14 @@ class MossPluginHostImpl implements MossPluginHost { id: 'moss/compatibility', state: 'active', scope: new CordisEffectScope(), - staged: { tools: [], skills: [], experts: [], promptLayers: [], effects: [] }, + staged: { + tools: [], + skills: [], + experts: [], + promptLayers: [], + webContributions: [], + effects: [], + }, }; record.scope.add(dispose, label); this.records.set(record.id, record); @@ -272,6 +308,7 @@ class MossPluginHostImpl implements MossPluginHost { registerSkill: (skill) => staged.skills.push(skill), registerExpert: (expert) => staged.experts.push(expert), addPromptLayer: (layer) => staged.promptLayers.push(layer), + registerWebContribution: (contribution) => staged.webContributions.push(contribution), effect: (setup, label = 'plugin effect') => staged.effects.push({ setup, label }), }; } @@ -280,7 +317,8 @@ class MossPluginHostImpl implements MossPluginHost { const duplicateTool = duplicate(staged.tools.map(({ name }) => name)); const duplicateSkill = duplicate(staged.skills.map((skill) => skill.stableId ?? skill.name)); const duplicateExpert = duplicate(staged.experts.map(({ id }) => id)); - const conflict = duplicateTool ?? duplicateSkill ?? duplicateExpert; + const duplicateWebContribution = duplicate(staged.webContributions.map(({ id }) => id)); + const conflict = duplicateTool ?? duplicateSkill ?? duplicateExpert ?? duplicateWebContribution; if (conflict) throw new Error(`plugin ${pluginId} contains duplicate contribution: ${conflict}`); for (const tool of staged.tools) { @@ -300,6 +338,14 @@ class MossPluginHostImpl implements MossPluginHost { for (const layer of staged.promptLayers) { if (!layer.trim()) throw new Error(`plugin ${pluginId} contains an empty prompt layer`); } + for (const contribution of staged.webContributions) { + if (!PLUGIN_ID_PATTERN.test(contribution.id)) + throw new Error(`plugin ${pluginId} contains an invalid web contribution id`); + if (!MOSS_WEB_SLOTS.includes(contribution.slot)) + throw new Error(`plugin ${pluginId} contains an unsupported web contribution slot`); + if (!contribution.module.startsWith('./') || contribution.module.includes('..')) + throw new Error(`plugin ${pluginId} web contribution module must be package-relative`); + } } private async commit(record: PluginRecord): Promise { diff --git a/packages/moss-agent/src/core/tools/tool-registry.ts b/packages/moss-agent/src/core/tools/tool-registry.ts index 8d287f1c..c346561f 100644 --- a/packages/moss-agent/src/core/tools/tool-registry.ts +++ b/packages/moss-agent/src/core/tools/tool-registry.ts @@ -22,6 +22,24 @@ export class ToolRegistry { } register(tool: Tool, groupId?: string): void { + if (this.tools.has(tool.name)) { + const owner = this.toolToGroup.get(tool.name); + if (owner?.startsWith('plugin:')) { + throw new Error(`tool already registered: ${tool.name}`); + } + this.replace(tool, groupId); + return; + } + this.install(tool, groupId); + } + + /** Explicitly replace a tool while transferring its lifecycle ownership. @beta */ + replace(tool: Tool, groupId?: string): void { + if (this.tools.has(tool.name)) this.remove(tool.name); + this.install(tool, groupId); + } + + private install(tool: Tool, groupId?: string): void { this.tools.set(tool.name, tool); if (groupId) { this.toolToGroup.set(tool.name, groupId); @@ -37,9 +55,6 @@ export class ToolRegistry { /** Install a tool for one lifecycle owner without replacing an existing tool. @internal */ registerScoped(tool: Tool, owner: string): () => void { - if (this.tools.has(tool.name)) { - throw new Error(`tool already registered: ${tool.name}`); - } this.register(tool, owner); let disposed = false; return () => { @@ -50,6 +65,13 @@ export class ToolRegistry { } registerGroup(group: ToolGroup): void { + if (this.groups.has(group.id)) throw new Error(`tool group already registered: ${group.id}`); + const groupNames = new Set(); + for (const tool of group.tools) { + if (groupNames.has(tool.name)) throw new Error(`tool already registered: ${tool.name}`); + groupNames.add(tool.name); + if (this.tools.has(tool.name)) throw new Error(`tool already registered: ${tool.name}`); + } this.groups.set(group.id, { ...group, tools: [...group.tools] }); for (const tool of group.tools) { this.tools.set(tool.name, tool); diff --git a/packages/moss-agent/src/index.ts b/packages/moss-agent/src/index.ts index cb737d53..b2ecd004 100644 --- a/packages/moss-agent/src/index.ts +++ b/packages/moss-agent/src/index.ts @@ -141,6 +141,7 @@ export type { StructuredToolResult, } from './core/index.js'; export { collectCapabilityPacks } from './core/index.js'; +export { MOSS_WEB_SLOTS } from './core/index.js'; export type { CapabilityPack, CapabilityPackContributions } from './core/index.js'; export type { MossPlugin, @@ -151,6 +152,8 @@ export type { MossPluginHost, MossPluginSnapshot, MossPluginState, + MossWebContribution, + MossWebSlot, } from './core/index.js'; export { createBrowserTools, diff --git a/packages/moss-agent/src/plugins/installed-plugin-registry.ts b/packages/moss-agent/src/plugins/installed-plugin-registry.ts new file mode 100644 index 00000000..02cf0c00 --- /dev/null +++ b/packages/moss-agent/src/plugins/installed-plugin-registry.ts @@ -0,0 +1,523 @@ +import { randomUUID } from 'node:crypto'; +import { access, mkdir, readFile, realpath, rename, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import { Worker } from 'node:worker_threads'; +import * as lockfile from 'proper-lockfile'; +import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; +import { + MOSS_WEB_SLOTS, + type MossPlugin, + type MossWebContribution, +} from '../core/plugins/plugin-host.js'; +import { runProcess } from '../utils/run-process.js'; + +const MANIFEST_NAME = 'moss.plugin.json'; +const PLUGIN_ID_PATTERN = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/; +const EXACT_VERSION_PATTERN = + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-(?:(?:0|[1-9]\d*)|(?:\d*[A-Za-z-][0-9A-Za-z-]*))(?:\.(?:(?:0|[1-9]\d*)|(?:\d*[A-Za-z-][0-9A-Za-z-]*)))*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/; +const OFFICIAL_SOURCE_PREFIX = 'official:'; +const PLUGIN_SETUP_VALIDATION_TIMEOUT_MS = 15_000; +const REGISTRY_LOCK_STALE_MS = 5_000; + +/** Runtime entry declared by a trusted plugin manifest. @beta */ +export interface MossPluginRuntimeManifest { + readonly module: string; + readonly export?: string; +} + +/** Browser contributions declared by a trusted plugin manifest. @beta */ +export interface MossPluginWebManifest { + readonly contributions: readonly MossWebContribution[]; +} + +/** Stable on-disk `moss.plugin.json` v1 contract. @beta */ +export interface MossPluginManifestV1 { + readonly schemaVersion: 1; + readonly id: string; + readonly version: string; + readonly runtime: MossPluginRuntimeManifest; + readonly web?: MossPluginWebManifest; + readonly configSchema?: string; +} + +/** Persisted record for one explicitly installed plugin. @beta */ +export interface InstalledMossPlugin { + readonly id: string; + readonly version: string; + readonly source: string; + readonly root: string; + readonly enabled: boolean; + readonly installedAt: string; +} + +/** Health result returned by `moss plugins doctor`. @beta */ +export interface MossPluginDoctorResult { + readonly id: string; + readonly status: 'ok' | 'disabled' | 'error'; + readonly message: string; +} + +/** Isolated result of loading enabled plugins. @beta */ +export interface LoadedMossPlugins { + readonly plugins: readonly MossPlugin[]; + readonly failures: readonly { id: string; message: string }[]; +} + +interface InstalledPluginFile { + readonly schemaVersion: 1; + readonly plugins: readonly InstalledMossPlugin[]; +} + +/** Storage options for the trusted installed-plugin registry. @beta */ +export interface InstalledPluginRegistryOptions { + readonly configDir: string; +} + +function invalidManifest(message: string, cause?: unknown): MossError { + return new MossError({ code: ErrorCode.USER_INPUT_INVALID, message, cause }); +} + +function diagnosticMessage(error: unknown): string { + if (!(error instanceof Error)) return String(error); + const cause = (error as Error & { cause?: unknown }).cause; + if (cause instanceof Error && cause.message && cause.message !== error.message) { + return `${error.message}: ${cause.message}`; + } + return error.message; +} + +function validateInstalledPlugin(value: unknown, index: number): InstalledMossPlugin { + if (!value || typeof value !== 'object') { + throw new Error(`plugins[${index}] must be an object`); + } + const entry = value as Record; + if (typeof entry.id !== 'string' || !PLUGIN_ID_PATTERN.test(entry.id)) { + throw new Error(`plugins[${index}].id is invalid`); + } + if (typeof entry.version !== 'string' || !EXACT_VERSION_PATTERN.test(entry.version)) { + throw new Error(`plugins[${index}].version is invalid`); + } + for (const field of ['source', 'root', 'installedAt'] as const) { + if (typeof entry[field] !== 'string' || !entry[field]) { + throw new Error(`plugins[${index}].${field} is invalid`); + } + } + if (typeof entry.enabled !== 'boolean') { + throw new Error(`plugins[${index}].enabled is invalid`); + } + return entry as unknown as InstalledMossPlugin; +} + +function validateRelativeModule(value: unknown, field: string): string { + if (typeof value !== 'string' || !value.startsWith('./') || value.split(/[\\/]/).includes('..')) { + throw invalidManifest(`${field} must be a relative path beginning with ./`); + } + return value; +} + +function validateManifest(value: unknown, manifestPath: string): MossPluginManifestV1 { + if (!value || typeof value !== 'object') + throw invalidManifest(`${manifestPath} must be an object`); + const data = value as Record; + if (data.schemaVersion !== 1) throw invalidManifest(`${manifestPath} requires schemaVersion 1`); + if (typeof data.id !== 'string' || !PLUGIN_ID_PATTERN.test(data.id)) { + throw invalidManifest(`${manifestPath} has an invalid plugin id`); + } + if (typeof data.version !== 'string' || !EXACT_VERSION_PATTERN.test(data.version)) { + throw invalidManifest(`${manifestPath} requires an exact semantic version`); + } + if (!data.runtime || typeof data.runtime !== 'object') { + throw invalidManifest(`${manifestPath} requires a runtime object`); + } + const runtime = data.runtime as Record; + validateRelativeModule(runtime.module, 'runtime.module'); + if ( + runtime.export !== undefined && + (typeof runtime.export !== 'string' || !runtime.export.trim()) + ) { + throw invalidManifest('runtime.export must be a non-empty string'); + } + if (data.configSchema !== undefined) validateRelativeModule(data.configSchema, 'configSchema'); + if (data.web !== undefined) { + if (!data.web || typeof data.web !== 'object') throw invalidManifest('web must be an object'); + const contributions = (data.web as Record).contributions; + if (!Array.isArray(contributions)) throw invalidManifest('web.contributions must be an array'); + const contributionIds = new Set(); + for (const contribution of contributions) { + if (!contribution || typeof contribution !== 'object') { + throw invalidManifest('each web contribution must be an object'); + } + const item = contribution as Record; + if (typeof item.id !== 'string' || !item.id.trim()) { + throw invalidManifest('web contribution id is required'); + } + if (contributionIds.has(item.id)) { + throw invalidManifest(`duplicate web contribution id: ${item.id}`); + } + contributionIds.add(item.id); + if (!MOSS_WEB_SLOTS.includes(item.slot as (typeof MOSS_WEB_SLOTS)[number])) { + throw invalidManifest(`unsupported web contribution slot: ${String(item.slot)}`); + } + validateRelativeModule(item.module, 'web contribution module'); + } + } + return data as unknown as MossPluginManifestV1; +} + +async function resolveContainedPath( + root: string, + relative: string, + field: string +): Promise { + const realRoot = await realpath(root); + const target = await realpath(path.resolve(realRoot, relative)); + const fromRoot = path.relative(realRoot, target); + if (fromRoot === '..' || fromRoot.startsWith(`..${path.sep}`) || path.isAbsolute(fromRoot)) { + throw invalidManifest(`${field} escapes plugin root`); + } + return target; +} + +/** Read and validate a plugin manifest without executing plugin code. @beta */ +export async function readMossPluginManifest(root: string): Promise { + const manifestPath = path.join(root, MANIFEST_NAME); + try { + const parsed: unknown = JSON.parse(await readFile(manifestPath, 'utf8')); + const manifest = validateManifest(parsed, manifestPath); + await access(await resolveContainedPath(root, manifest.runtime.module, 'runtime.module')); + for (const contribution of manifest.web?.contributions ?? []) { + await access( + await resolveContainedPath(root, contribution.module, 'web contribution module') + ); + } + if (manifest.configSchema) { + await access(await resolveContainedPath(root, manifest.configSchema, 'configSchema')); + } + return manifest; + } catch (error) { + if (error instanceof MossError) throw error; + throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { + message: `unable to read ${manifestPath}`, + context: { manifestPath }, + }); + } +} + +function exactNpmPackageName(source: string): string | null { + if (source.startsWith('@')) { + const match = /^(@[^/]+\/[^@]+)@(.+)$/.exec(source); + return match && EXACT_VERSION_PATTERN.test(match[2]) ? match[1] : null; + } + const match = /^([^@/]+)@(.+)$/.exec(source); + return match && EXACT_VERSION_PATTERN.test(match[2]) ? match[1] : null; +} + +function officialPluginRoot(source: string): string | undefined { + if (!source.startsWith(OFFICIAL_SOURCE_PREFIX)) return undefined; + const name = source.slice(OFFICIAL_SOURCE_PREFIX.length); + if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name)) { + throw invalidManifest(`invalid official plugin source: ${source}`); + } + const here = path.dirname(fileURLToPath(import.meta.url)); + return path.resolve(here, '..', '..', 'assets', 'plugins', name); +} + +async function validatePluginSetup(entry: InstalledMossPlugin): Promise { + const manifest = await readMossPluginManifest(entry.root); + const worker = new Worker(new URL('./plugin-setup-worker.js', import.meta.url), { + workerData: { + moduleUrl: pathToFileURL(path.resolve(entry.root, manifest.runtime.module)).href, + exportName: manifest.runtime.export ?? 'default', + expectedId: manifest.id, + }, + }); + let timeout: NodeJS.Timeout | undefined; + const validation = new Promise((resolve, reject) => { + worker.once('message', (message: unknown) => { + if ( + message && + typeof message === 'object' && + (message as Record).ok === true + ) { + resolve(); + return; + } + const detail = + message && typeof message === 'object' + ? (message as Record).message + : undefined; + reject( + invalidManifest(typeof detail === 'string' ? detail : 'plugin setup validation failed') + ); + }); + worker.once('error', reject); + worker.once('exit', (code) => { + if (code !== 0) reject(invalidManifest(`plugin setup worker exited with code ${code}`)); + }); + timeout = setTimeout(() => { + reject(invalidManifest(`plugin setup validation timed out after 15 seconds`)); + }, PLUGIN_SETUP_VALIDATION_TIMEOUT_MS); + }); + try { + await validation; + } finally { + if (timeout) clearTimeout(timeout); + await worker.terminate(); + } +} + +/** Persistent registry for trusted local and npm Moss plugins. @beta */ +export class InstalledPluginRegistry { + private readonly registryDir: string; + private readonly registryPath: string; + private readonly npmRoot: string; + private readonly npmRunner: typeof runProcess; + + constructor(options: InstalledPluginRegistryOptions) { + this.registryDir = path.join(options.configDir, 'plugins'); + this.registryPath = path.join(this.registryDir, 'installed.json'); + this.npmRoot = path.join(this.registryDir, 'npm'); + this.npmRunner = runProcess; + } + + async list(): Promise { + const file = await this.readRegistry(); + return Object.freeze([...file.plugins].sort((left, right) => left.id.localeCompare(right.id))); + } + + async add(source: string): Promise { + return this.mutate(async (assertLease) => { + const root = await this.resolveSource(source); + const manifest = await readMossPluginManifest(root); + const existing = (await this.readRegistry()).plugins; + if (existing.some(({ id }) => id === manifest.id)) { + throw invalidManifest(`plugin already installed: ${manifest.id}`); + } + const entry: InstalledMossPlugin = { + id: manifest.id, + version: manifest.version, + source, + root, + enabled: false, + installedAt: new Date().toISOString(), + }; + await this.writeRegistry([...existing, entry], assertLease); + return entry; + }); + } + + async remove(id: string): Promise { + await this.mutate(async (assertLease) => { + const entries = (await this.readRegistry()).plugins; + if (!entries.some((entry) => entry.id === id)) + throw invalidManifest(`plugin not installed: ${id}`); + await this.writeRegistry( + entries.filter((entry) => entry.id !== id), + assertLease + ); + }); + } + + async enable(id: string): Promise { + await this.setEnabled(id, true); + } + + async disable(id: string): Promise { + await this.setEnabled(id, false); + } + + async loadEnabled(): Promise { + const plugins: MossPlugin[] = []; + const failures: Array<{ id: string; message: string }> = []; + for (const entry of await this.list()) { + if (!entry.enabled) continue; + try { + plugins.push(await this.load(entry)); + } catch (error) { + failures.push({ + id: entry.id, + message: error instanceof Error ? error.message : String(error), + }); + } + } + return { plugins: Object.freeze(plugins), failures: Object.freeze(failures) }; + } + + async doctor(): Promise { + const results: MossPluginDoctorResult[] = []; + for (const entry of await this.list()) { + try { + const manifest = await readMossPluginManifest(entry.root); + await validatePluginSetup(entry); + results.push({ + id: entry.id, + status: entry.enabled ? 'ok' : 'disabled', + message: entry.enabled + ? `${manifest.version} validated successfully` + : `${manifest.version} is disabled; setup validation passed`, + }); + } catch (error) { + results.push({ + id: entry.id, + status: 'error', + message: diagnosticMessage(error), + }); + } + } + return Object.freeze(results); + } + + private async load(entry: InstalledMossPlugin): Promise { + const manifest = await readMossPluginManifest(entry.root); + const moduleUrl = pathToFileURL(path.resolve(entry.root, manifest.runtime.module)).href; + const imported = (await import(moduleUrl)) as Record; + const candidate = imported[manifest.runtime.export ?? 'default']; + if ( + !candidate || + typeof candidate !== 'object' || + typeof (candidate as MossPlugin).setup !== 'function' + ) { + throw invalidManifest(`plugin ${entry.id} did not export a MossPlugin`); + } + const plugin = candidate as MossPlugin; + if (plugin.id !== manifest.id) + throw invalidManifest(`plugin export id does not match manifest: ${manifest.id}`); + return plugin; + } + + private async setEnabled(id: string, enabled: boolean): Promise { + await this.mutate(async (assertLease) => { + const entries = (await this.readRegistry()).plugins; + const target = entries.find((entry) => entry.id === id); + if (!target) throw invalidManifest(`plugin not installed: ${id}`); + if (enabled) { + try { + await validatePluginSetup(target); + } catch (error) { + throw invalidManifest( + `plugin ${id} validation failed: ${diagnosticMessage(error)}`, + error + ); + } + } + await this.writeRegistry( + entries.map((entry) => (entry.id === id ? { ...entry, enabled } : entry)), + assertLease + ); + }); + } + + private async mutate(operation: (assertLease: () => void) => Promise): Promise { + await mkdir(this.registryDir, { recursive: true, mode: 0o700 }); + let compromised: Error | undefined; + let release: (() => Promise) | undefined; + try { + release = await lockfile.lock(this.registryDir, { + stale: REGISTRY_LOCK_STALE_MS, + update: 1_000, + retries: { retries: 600, factor: 1, minTimeout: 50, maxTimeout: 50, randomize: true }, + onCompromised: (error) => { + compromised = error; + }, + }); + } catch (error) { + throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { + message: 'unable to lock the plugin registry', + context: { registryPath: this.registryPath }, + }); + } + const assertLease = (): void => { + if (compromised) { + throw wrapAsMoss(compromised, ErrorCode.USER_INPUT_INVALID, { + message: 'plugin registry lock was compromised', + context: { registryPath: this.registryPath }, + }); + } + }; + let operationFailed = false; + try { + const result = await operation(assertLease); + assertLease(); + return result; + } catch (error) { + operationFailed = true; + throw error; + } finally { + try { + await release(); + } catch (error) { + if (!operationFailed) { + throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { + message: 'unable to release the plugin registry lock', + context: { registryPath: this.registryPath }, + }); + } + } + } + } + + private async resolveSource(source: string): Promise { + const officialRoot = officialPluginRoot(source); + if (officialRoot) return realpath(officialRoot); + const asPath = path.resolve(source); + try { + return await realpath(asPath); + } catch { + const packageName = exactNpmPackageName(source); + if (!packageName) { + throw invalidManifest( + `unsupported plugin source: ${source}; npm plugins require an exact version` + ); + } + await mkdir(this.npmRoot, { recursive: true }); + await this.npmRunner('npm', { + args: [ + 'install', + '--ignore-scripts', + '--no-save', + '--no-audit', + '--no-fund', + '--package-lock=false', + '--prefix', + this.npmRoot, + source, + ], + timeout: 120_000, + maxBuffer: 2 * 1024 * 1024, + }); + return realpath(path.join(this.npmRoot, 'node_modules', ...packageName.split('/'))); + } + } + + private async readRegistry(): Promise { + try { + const parsed = JSON.parse(await readFile(this.registryPath, 'utf8')) as InstalledPluginFile; + if (parsed.schemaVersion !== 1 || !Array.isArray(parsed.plugins)) + throw new Error('invalid registry'); + return { + schemaVersion: 1, + plugins: parsed.plugins.map((entry, index) => validateInstalledPlugin(entry, index)), + }; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') + return { schemaVersion: 1, plugins: [] }; + throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { + message: `unable to read ${this.registryPath}`, + }); + } + } + + private async writeRegistry( + plugins: readonly InstalledMossPlugin[], + assertLease: () => void + ): Promise { + await mkdir(this.registryDir, { recursive: true, mode: 0o700 }); + const temporary = `${this.registryPath}.${process.pid}.${randomUUID()}.tmp`; + await writeFile(temporary, `${JSON.stringify({ schemaVersion: 1, plugins }, null, 2)}\n`, { + mode: 0o600, + }); + assertLease(); + await rename(temporary, this.registryPath); + } +} diff --git a/packages/moss-agent/src/plugins/plugin-setup-worker.ts b/packages/moss-agent/src/plugins/plugin-setup-worker.ts new file mode 100644 index 00000000..2fc049ca --- /dev/null +++ b/packages/moss-agent/src/plugins/plugin-setup-worker.ts @@ -0,0 +1,75 @@ +import { parentPort, workerData } from 'node:worker_threads'; +import { createMossPluginHost, type MossPlugin } from '../core/plugins/plugin-host.js'; + +interface PluginSetupWorkerData { + readonly moduleUrl: string; + readonly exportName: string; + readonly expectedId: string; +} + +function errorMessage(error: unknown): string { + if (!(error instanceof Error)) return String(error); + const cause = (error as Error & { cause?: unknown }).cause; + if (cause instanceof Error && cause.message && cause.message !== error.message) { + return `${error.message}: ${cause.message}`; + } + return error.message; +} + +async function validateSetup(data: PluginSetupWorkerData): Promise { + const imported = (await import(data.moduleUrl)) as Record; + const candidate = imported[data.exportName]; + if ( + !candidate || + typeof candidate !== 'object' || + typeof (candidate as MossPlugin).setup !== 'function' + ) { + throw new Error(`plugin ${data.expectedId} did not export a MossPlugin`); + } + const plugin = candidate as MossPlugin; + if (plugin.id !== data.expectedId) { + throw new Error(`plugin export id does not match manifest: ${data.expectedId}`); + } + + const tools = new Set(); + const skills = new Set(); + const experts = new Set(); + const host = createMossPluginHost({ + hasTool: (name) => tools.has(name), + registerTool: (tool) => { + tools.add(tool.name); + return () => { + tools.delete(tool.name); + }; + }, + hasSkill: (id) => skills.has(id), + registerSkill: (skill) => { + const id = skill.stableId ?? skill.name; + skills.add(id); + return () => { + skills.delete(id); + }; + }, + hasExpert: (id) => experts.has(id), + registerExpert: (expert) => { + experts.add(expert.id); + return () => { + experts.delete(expert.id); + }; + }, + }); + try { + await host.install(plugin); + } finally { + await host.close(); + } +} + +if (!parentPort) throw new Error('plugin setup worker requires a parent port'); + +try { + await validateSetup(workerData as PluginSetupWorkerData); + parentPort.postMessage({ ok: true }); +} catch (error) { + parentPort.postMessage({ ok: false, message: errorMessage(error) }); +} diff --git a/packages/moss-agent/src/runtime/index.ts b/packages/moss-agent/src/runtime/index.ts index ad920a4d..310f8ded 100644 --- a/packages/moss-agent/src/runtime/index.ts +++ b/packages/moss-agent/src/runtime/index.ts @@ -10,6 +10,7 @@ export { } from './shared-runtime.js'; export { ErrorCode } from '../errors.js'; export type { MossErrorOutcome } from '../errors.js'; +export { MOSS_WEB_SLOTS } from '../core/plugins/plugin-host.js'; export type { ProviderErrorAction, ProviderErrorCategory, @@ -24,4 +25,17 @@ export type { MossPluginHost, MossPluginSnapshot, MossPluginState, + MossWebContribution, + MossWebSlot, } from '../core/plugins/plugin-host.js'; +export { + InstalledPluginRegistry, + readMossPluginManifest, + type InstalledMossPlugin, + type InstalledPluginRegistryOptions, + type LoadedMossPlugins, + type MossPluginDoctorResult, + type MossPluginManifestV1, + type MossPluginRuntimeManifest, + type MossPluginWebManifest, +} from '../plugins/installed-plugin-registry.js'; diff --git a/packages/moss-agent/src/runtime/shared-runtime.ts b/packages/moss-agent/src/runtime/shared-runtime.ts index 9603ccc7..65dbea1c 100644 --- a/packages/moss-agent/src/runtime/shared-runtime.ts +++ b/packages/moss-agent/src/runtime/shared-runtime.ts @@ -233,7 +233,7 @@ export async function createMossRuntime(options: CreateMossRuntimeOptions): Prom }); for (const tool of selectTools(toolProfile, services.skillRegistry)) agent.tools.register(tool); - for (const tool of options.extraTools ?? []) agent.tools.register(tool); + for (const tool of options.extraTools ?? []) agent.tools.replace(tool, 'host:extra-tools'); try { for (const plugin of options.plugins ?? []) await agent.plugins.install(plugin); } catch (error) { diff --git a/packages/moss-agent/src/web-ui/client/workbench.css b/packages/moss-agent/src/web-ui/client/workbench.css new file mode 100644 index 00000000..2cc70703 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/workbench.css @@ -0,0 +1,947 @@ +:root { + color-scheme: light; + --moss-color-canvas: #f7f7f5; + --moss-color-surface: #ffffff; + --moss-color-panel: #f1f1ee; + --moss-color-panel-raised: #fafaf8; + --moss-color-border: #dfdfda; + --moss-color-border-strong: #cbcbc4; + --moss-color-text: #20201e; + --moss-color-muted: #777772; + --moss-color-faint: #a4a49d; + --moss-color-accent: #4d6b58; + --moss-color-accent-soft: #e4ece6; + --moss-color-danger: #b44b42; + --moss-color-warning: #a56b2b; + --moss-space-1: 4px; + --moss-space-2: 8px; + --moss-space-3: 12px; + --moss-space-4: 16px; + --moss-space-5: 20px; + --moss-space-6: 24px; + --moss-space-8: 32px; + --moss-radius-control: 8px; + --moss-radius-card: 12px; + --moss-radius-panel: 16px; + --moss-shadow-float: 0 18px 60px rgb(30 30 26 / 10%); + --moss-shadow-control: 0 1px 1px rgb(20 20 18 / 4%); + --moss-shadow-composer: 0 8px 30px rgb(30 30 25 / 8%); + --moss-sidebar-width: 252px; + --moss-details-width: 320px; + font-family: 'Avenir Next', 'Noto Sans SC', 'Segoe UI', sans-serif; + font-synthesis: none; +} + +:root[data-theme='dark'] { + color-scheme: dark; + --moss-color-canvas: #181916; + --moss-color-surface: #20211e; + --moss-color-panel: #272824; + --moss-color-panel-raised: #2d2e2a; + --moss-color-border: #383a35; + --moss-color-border-strong: #50534b; + --moss-color-text: #eeeeea; + --moss-color-muted: #a3a59d; + --moss-color-faint: #777970; + --moss-color-accent: #9bb7a3; + --moss-color-accent-soft: #303c33; + --moss-color-danger: #e18479; + --moss-color-warning: #d9a363; + --moss-shadow-float: 0 18px 60px rgb(0 0 0 / 30%); + --moss-shadow-control: 0 1px 1px rgb(0 0 0 / 15%); + --moss-shadow-composer: 0 8px 30px rgb(0 0 0 / 24%); +} + +* { + box-sizing: border-box; +} +html, +body, +#moss-web-root { + min-height: 100%; + margin: 0; +} +body { + background: var(--moss-color-canvas); + color: var(--moss-color-text); + overflow: hidden; +} +button, +textarea, +input { + color: inherit; + font: inherit; +} +button { + cursor: pointer; +} +button:focus-visible, +textarea:focus-visible, +input:focus-visible { + outline: 2px solid var(--moss-color-accent); + outline-offset: 2px; +} +svg { + width: 17px; + height: 17px; + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 1.7; +} + +.app-frame { + display: grid; + grid-template-columns: var(--moss-sidebar-width) minmax(440px, 1fr) var(--moss-details-width); + height: 100vh; + background: var(--moss-color-canvas); + transition: grid-template-columns 180ms ease; +} +.app-frame.details-collapsed { + grid-template-columns: var(--moss-sidebar-width) minmax(440px, 1fr) 0; +} + +.sidebar { + min-width: 0; + border-right: 1px solid var(--moss-color-border); + background: var(--moss-color-panel); + padding: 18px 12px 14px; + display: flex; + flex-direction: column; + overflow: hidden; +} +.brand-row { + display: flex; + align-items: center; + gap: 11px; + padding: 2px 8px 18px; +} +.brand-row > div:last-child { + display: grid; + line-height: 1.2; +} +.brand-row strong { + font-size: 15px; + letter-spacing: -0.01em; +} +.brand-row span { + color: var(--moss-color-muted); + font-size: 11px; + margin-top: 3px; +} +.brand-mark { + width: 30px; + height: 30px; + display: grid; + place-items: center; + border: 1px solid var(--moss-color-border-strong); + border-radius: 9px; + background: var(--moss-color-surface); + font: + 700 13px Georgia, + serif; +} +.new-task { + display: flex; + align-items: center; + gap: 9px; + width: 100%; + border: 1px solid var(--moss-color-border-strong); + border-radius: var(--moss-radius-control); + background: var(--moss-color-surface); + padding: 9px 10px; + box-shadow: var(--moss-shadow-control); + font-size: 13px; +} +.new-task kbd { + margin-left: auto; + border: 0; + color: var(--moss-color-faint); + font: 11px inherit; +} +.session-search { + display: flex; + align-items: center; + gap: 8px; + margin-top: 12px; + padding: 7px 9px; + color: var(--moss-color-muted); +} +.session-search input { + width: 100%; + border: 0; + outline: 0; + background: transparent; + font-size: 12px; +} +.section-label, +.overline { + color: var(--moss-color-faint); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; +} +.section-label { + padding: 16px 9px 7px; +} +.session-list { + flex: 1; + overflow: auto; +} +.session-list button, +.sidebar-footer > button { + width: 100%; + border: 0; + border-radius: var(--moss-radius-control); + background: transparent; + padding: 9px 10px; + text-align: left; +} +.session-list button { + display: grid; + gap: 3px; + margin-bottom: 2px; +} +.session-list button:hover, +.session-list button.active, +.sidebar-footer > button:hover { + background: var(--moss-color-surface); +} +.session-list button span { + overflow: hidden; + font-size: 12px; + text-overflow: ellipsis; + white-space: nowrap; +} +.session-list button small { + color: var(--moss-color-faint); + font-size: 10px; + text-transform: capitalize; +} +.no-sessions { + color: var(--moss-color-muted); + font-size: 11px; + padding: 10px; +} +.sidebar-footer { + border-top: 1px solid var(--moss-color-border); + padding-top: 10px; +} +.sidebar-footer > button { + display: flex; + align-items: center; + gap: 9px; + font-size: 12px; +} +.runtime-state { + display: flex; + gap: 9px; + align-items: center; + padding: 13px 10px 3px; +} +.runtime-state > span { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--moss-color-accent); + box-shadow: 0 0 0 4px var(--moss-color-accent-soft); +} +.runtime-state > span.offline { + background: var(--moss-color-danger); + box-shadow: none; +} +.runtime-state div { + display: grid; + font-size: 10px; +} +.runtime-state small { + color: var(--moss-color-muted); + margin-top: 2px; +} + +.conversation-column { + min-width: 0; + height: 100vh; + display: flex; + flex-direction: column; + background: var(--moss-color-surface); +} +.conversation-header { + height: 66px; + flex: 0 0 66px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + border-bottom: 1px solid var(--moss-color-border); + padding: 0 22px; +} +.conversation-header h2 { + font-size: 14px; + font-weight: 600; + margin: 3px 0 0; + max-width: min(52vw, 620px); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.conversation-header p { + margin: 0; +} +.header-actions { + display: flex; + align-items: center; + gap: 7px; +} +.model-pill, +.icon-button { + border: 1px solid var(--moss-color-border); + background: var(--moss-color-panel-raised); + height: 31px; + border-radius: 8px; +} +.model-pill { + max-width: 180px; + overflow: hidden; + padding: 0 11px; + color: var(--moss-color-muted); + font-size: 11px; + text-overflow: ellipsis; + white-space: nowrap; +} +.icon-button { + width: 31px; + display: grid; + place-items: center; +} +.connection-banner { + margin: 12px 22px 0; + border: 1px solid color-mix(in srgb, var(--moss-color-danger), transparent 55%); + border-radius: 9px; + background: color-mix(in srgb, var(--moss-color-danger), transparent 90%); + padding: 9px 12px; + color: var(--moss-color-danger); + font-size: 11px; +} + +.empty-conversation { + margin: auto; + max-width: 720px; + padding: 30px; + text-align: center; +} +.moss-glyph { + width: 50px; + height: 50px; + margin: 0 auto 22px; + display: flex; + align-items: end; + justify-content: center; + gap: 4px; + padding: 13px; + border: 1px solid var(--moss-color-border); + border-radius: 15px; + background: var(--moss-color-panel-raised); + box-shadow: var(--moss-shadow-float); + transform: rotate(-2deg); +} +.moss-glyph span { + display: block; + width: 5px; + border-radius: 9px; + background: var(--moss-color-accent); +} +.moss-glyph span:nth-child(1) { + height: 12px; +} +.moss-glyph span:nth-child(2) { + height: 23px; +} +.moss-glyph span:nth-child(3) { + height: 17px; +} +.empty-conversation h1 { + margin: 8px 0 12px; + font: + 500 clamp(30px, 4vw, 46px)/1.08 Georgia, + 'Songti SC', + serif; + letter-spacing: -0.035em; +} +.empty-copy { + max-width: 550px; + margin: 0 auto; + color: var(--moss-color-muted); + font-size: 13px; + line-height: 1.65; +} +.starter-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 9px; + margin-top: 30px; + text-align: left; +} +.starter-card { + min-height: 92px; + border: 1px solid var(--moss-color-border); + border-radius: var(--moss-radius-card); + background: var(--moss-color-panel-raised); + padding: 13px; + transition: + border-color 140ms ease, + transform 140ms ease; +} +.starter-card:hover { + border-color: var(--moss-color-border-strong); + transform: translateY(-2px); +} +.starter-card span, +.starter-card small { + display: block; +} +.starter-card span { + font-size: 12px; + font-weight: 600; +} +.starter-card small { + color: var(--moss-color-muted); + font-size: 10px; + line-height: 1.5; + margin-top: 5px; +} + +.timeline { + flex: 1; + overflow: auto; + padding: 30px max(24px, calc((100% - 780px) / 2)) 18px; +} +.message { + max-width: 780px; + margin: 0 0 22px; + font-size: 13px; + line-height: 1.65; + white-space: pre-wrap; +} +.message-user { + width: fit-content; + max-width: 72%; + margin-left: auto; + border-radius: 14px 14px 3px 14px; + background: var(--moss-color-panel); + padding: 11px 14px; +} +.message-author { + margin-bottom: 4px; + color: var(--moss-color-faint); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.09em; + text-transform: uppercase; +} +.message-status { + border-left: 2px solid var(--moss-color-border-strong); + padding-left: 10px; + color: var(--moss-color-muted); + font-size: 11px; + text-transform: capitalize; +} +.stream-caret { + display: inline-block; + width: 6px; + height: 15px; + background: var(--moss-color-accent); + animation: blink 900ms steps(2) infinite; +} +.reasoning-row { + margin: 0 0 14px; + color: var(--moss-color-muted); + font-size: 11px; +} +.reasoning-row summary { + cursor: pointer; + user-select: none; +} +.reasoning-row p { + border-left: 1px solid var(--moss-color-border); + margin: 8px 0; + padding-left: 12px; + white-space: pre-wrap; +} +.tool-row { + width: 100%; + display: flex; + align-items: center; + gap: 10px; + border: 1px solid var(--moss-color-border); + border-radius: 10px; + background: var(--moss-color-panel-raised); + margin: 0 0 8px; + padding: 10px 12px; + text-align: left; +} +.tool-row:hover { + border-color: var(--moss-color-border-strong); +} +.tool-state { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--moss-color-accent); +} +.tool-running .tool-state { + animation: pulse 1.2s ease infinite; +} +.tool-failed .tool-state { + background: var(--moss-color-danger); +} +.tool-copy { + display: grid; + flex: 1; +} +.tool-copy strong { + font: + 600 11px ui-monospace, + SFMono-Regular, + monospace; +} +.tool-copy small { + color: var(--moss-color-faint); + font-size: 9px; + margin-top: 2px; + text-transform: capitalize; +} +.tool-arrow { + color: var(--moss-color-faint); + font-size: 18px; +} + +.composer-shell { + flex: 0 0 auto; + padding: 0 max(24px, calc((100% - 820px) / 2)) 20px; + background: linear-gradient(transparent, var(--moss-color-surface) 24%); +} +.composer-status { + min-height: 24px; + display: flex; + align-items: center; + gap: 7px; + color: var(--moss-color-faint); + font-size: 10px; + padding-left: 4px; +} +.working-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--moss-color-accent); + animation: pulse 1.2s ease infinite; +} +.composer-card { + border: 1px solid var(--moss-color-border-strong); + border-radius: var(--moss-radius-panel); + background: var(--moss-color-surface); + box-shadow: var(--moss-shadow-composer); + padding: 10px; +} +.composer-card textarea { + width: 100%; + min-height: 68px; + max-height: 180px; + resize: vertical; + border: 0; + outline: 0; + background: transparent; + padding: 4px 5px 8px; + font-size: 13px; + line-height: 1.55; +} +.composer-card textarea::placeholder { + color: var(--moss-color-faint); +} +.composer-actions { + display: flex; + align-items: center; + justify-content: space-between; +} +.composer-actions > div { + display: flex; + gap: 4px; +} +.composer-chip { + border: 0; + border-radius: 7px; + background: transparent; + padding: 6px 8px; + color: var(--moss-color-muted); + font-size: 10px; +} +.composer-chip:hover { + background: var(--moss-color-panel); +} +.send-button, +.stop-button { + border: 0; + border-radius: 9px; + background: var(--moss-color-text); + color: var(--moss-color-surface); + height: 31px; +} +.send-button { + width: 31px; + font-size: 18px; +} +.send-button:disabled { + opacity: 0.3; + cursor: default; +} +.stop-button { + display: flex; + align-items: center; + gap: 6px; + padding: 0 11px; + font-size: 10px; +} + +.details-panel { + min-width: 0; + overflow: hidden auto; + border-left: 1px solid var(--moss-color-border); + background: var(--moss-color-panel-raised); +} +.details-panel > header { + height: 66px; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--moss-color-border); + padding: 0 18px; +} +.details-panel h2 { + font-size: 14px; + margin: 3px 0 0; +} +.details-panel p { + margin: 0; +} +.details-panel header button { + border: 0; + background: transparent; + color: var(--moss-color-muted); + font-size: 20px; +} +.detail-content { + padding: 20px 18px; +} +.detail-content section { + border-bottom: 1px solid var(--moss-color-border); + padding: 0 0 18px; + margin-bottom: 18px; +} +.detail-content label { + display: block; + color: var(--moss-color-faint); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.1em; + margin: 18px 0 8px; + text-transform: uppercase; +} +.detail-content h3 { + font: + 600 13px ui-monospace, + monospace; +} +.detail-content p { + color: var(--moss-color-muted); + font-size: 11px; + line-height: 1.55; +} +.detail-content pre { + max-height: 260px; + overflow: auto; + border: 1px solid var(--moss-color-border); + border-radius: 9px; + background: var(--moss-color-panel); + padding: 11px; + font: + 10px/1.55 ui-monospace, + SFMono-Regular, + monospace; + white-space: pre-wrap; + word-break: break-word; +} +.detail-status { + display: flex; + align-items: center; + gap: 7px; + color: var(--moss-color-muted); + font-size: 10px; + text-transform: capitalize; +} +.detail-status span { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--moss-color-accent); +} +.status-failed span { + background: var(--moss-color-danger); +} +.tool-chips { + display: flex; + flex-wrap: wrap; + gap: 5px; + margin-top: 9px; +} +.tool-chips span { + border: 1px solid var(--moss-color-border); + border-radius: 6px; + background: var(--moss-color-surface); + padding: 4px 6px; + color: var(--moss-color-muted); + font: + 9px ui-monospace, + monospace; +} + +.settings-view { + flex: 1; + overflow: auto; + display: grid; + grid-template-columns: 150px minmax(300px, 680px); + justify-content: center; + gap: 42px; + padding: 38px 30px; +} +.settings-tabs { + display: grid; + align-content: start; + gap: 3px; +} +.settings-tabs button { + border: 0; + border-radius: 7px; + background: transparent; + padding: 8px 10px; + text-align: left; + color: var(--moss-color-muted); + font-size: 11px; +} +.settings-tabs button.active { + background: var(--moss-color-panel); + color: var(--moss-color-text); +} +.settings-section h3 { + margin: 7px 0; + font-size: 19px; +} +.settings-section > p:not(.overline) { + margin: 0; + color: var(--moss-color-muted); + font-size: 11px; + line-height: 1.6; +} +.inventory-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; + margin: 24px 0; +} +.inventory-grid article { + display: grid; + border: 1px solid var(--moss-color-border); + border-radius: 10px; + background: var(--moss-color-panel-raised); + padding: 14px; +} +.inventory-grid strong { + font: + 500 24px Georgia, + serif; +} +.inventory-grid span { + color: var(--moss-color-muted); + font-size: 10px; +} +.plugin-card { + display: flex; + align-items: center; + justify-content: space-between; + border-top: 1px solid var(--moss-color-border); + padding: 12px 3px; +} + +.plugin-actions { + display: flex; + gap: var(--moss-space-2); +} + +.plugin-actions button, +.configured-pill { + border: 1px solid var(--moss-color-border); + border-radius: var(--moss-radius-control); + background: var(--moss-color-panel-raised); + color: var(--moss-color-muted); + padding: 6px 10px; + font: inherit; + font-size: 12px; +} + +.setting-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--moss-space-4); + padding: var(--moss-space-4); + border: 1px solid var(--moss-color-border); + border-radius: var(--moss-radius-panel); +} + +.setting-row div, +.plugin-card div:first-child { + display: grid; + gap: 3px; +} + +.setting-row small, +.plugin-card small { + color: var(--moss-color-muted); +} + +.settings-notice, +.settings-empty { + padding: var(--moss-space-3) var(--moss-space-4); + border-radius: var(--moss-radius-control); + background: var(--moss-color-accent-soft); + color: var(--moss-color-muted); +} + +.plugin-slot { + display: grid; + gap: var(--moss-space-3); + margin-top: var(--moss-space-4); +} + +.plugin-slot > div { + min-height: 1px; + border-radius: var(--moss-radius-card); +} +.plugin-card div { + display: grid; +} +.plugin-card strong { + font: + 600 11px ui-monospace, + monospace; +} +.plugin-card small, +.plugin-card > span { + color: var(--moss-color-muted); + font-size: 9px; +} + +@keyframes blink { + 50% { + opacity: 0; + } +} +@keyframes pulse { + 50% { + opacity: 0.35; + transform: scale(0.85); + } +} + +@media (max-width: 1080px) { + :root { + --moss-sidebar-width: 70px; + --moss-details-width: 300px; + } + .brand-row { + justify-content: center; + } + .brand-row > div:last-child, + .new-task:not(:focus), + .new-task kbd, + .session-search input, + .section-label, + .session-list span, + .session-list small, + .sidebar-footer > button, + .runtime-state div { + display: none; + } + .new-task { + justify-content: center; + } + .session-search { + justify-content: center; + } + .session-list button { + height: 34px; + } + .session-list button::before { + content: ''; + width: 7px; + height: 7px; + margin: auto; + border-radius: 50%; + background: var(--moss-color-faint); + } + .session-list button.active::before { + background: var(--moss-color-accent); + } + .runtime-state { + justify-content: center; + } +} + +@media (max-width: 780px) { + .app-frame, + .app-frame.details-collapsed { + display: block; + } + .sidebar { + display: none; + } + .details-panel { + position: fixed; + inset: 0 0 0 auto; + z-index: 5; + width: min(90vw, 330px); + box-shadow: var(--moss-shadow-float); + transform: translateX(0); + transition: transform 180ms ease; + } + .details-collapsed .details-panel { + transform: translateX(105%); + } + .starter-grid { + grid-template-columns: 1fr; + } + .settings-view { + display: block; + } + .settings-tabs { + display: flex; + overflow: auto; + margin-bottom: 28px; + } + .model-pill { + display: none; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} diff --git a/packages/moss-agent/src/web-ui/client/workbench.tsx b/packages/moss-agent/src/web-ui/client/workbench.tsx new file mode 100644 index 00000000..25a233c2 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/workbench.tsx @@ -0,0 +1,779 @@ +import { StrictMode, useEffect, useMemo, useRef, useState } from 'react'; +import { createRoot } from 'react-dom/client'; + +import './workbench.css'; + +type RunStatus = 'created' | 'running' | 'completed' | 'failed' | 'cancelled' | 'interrupted'; + +interface PluginSnapshot { + id: string; + state: string; + tools: string[]; + webContributions?: string[]; +} + +interface InstalledPlugin { + id: string; + version: string; + enabled: boolean; +} + +interface PluginInventory { + installed: InstalledPlugin[]; + active: PluginSnapshot[]; + contributions: Array<{ + pluginId: string; + id: string; + slot: string; + moduleUrl: string; + }>; +} + +interface RunSnapshot { + id: string; + sessionId: string; + title: string; + status: RunStatus; + verification: string; + evidenceCount: number; + updatedAt: number; +} + +interface SessionSummary { + sessionId: string; + title: string; + updatedAt: number; + messageCount: number; + runId?: string; + runStatus?: RunStatus; +} + +interface BootstrapResponse { + tools: string[]; + plugins: PluginSnapshot[]; + taskRuns: RunSnapshot[]; + model: string; +} + +type TimelineItem = + | { id: string; kind: 'user' | 'assistant' | 'reasoning' | 'status'; text: string } + | { + id: string; + kind: 'tool'; + name: string; + state: 'running' | 'complete' | 'failed'; + input?: unknown; + result?: unknown; + }; + +interface StreamEvent { + type: 'run' | 'text' | 'thought' | 'tool' | 'done' | 'error'; + delta?: string; + state?: 'start' | 'end'; + toolCallId?: string; + name?: string; + input?: unknown; + result?: unknown; + isError?: boolean; + message?: string; + run?: RunSnapshot; +} + +const jsonRequest = async (url: string, options?: RequestInit): Promise => { + const response = await fetch(url, options); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + return (await response.json()) as T; +}; + +const Icon = ({ name }: { name: 'plus' | 'search' | 'settings' | 'panel' | 'stop' }) => { + const paths: Record = { + plus: 'M12 5v14M5 12h14', + search: 'm21 21-4.35-4.35m2.35-5.65a8 8 0 1 1-16 0 8 8 0 0 1 16 0Z', + settings: + 'M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Zm7.4-3.5.1-1.5 2-1.5-2-3.5-2.5 1a8 8 0 0 0-2.6-1.5L14 2h-4l-.4 3A8 8 0 0 0 7 6.5l-2.5-1-2 3.5 2 1.5-.1 3-2 1.5 2 3.5 2.6-1a8 8 0 0 0 2.6 1.5l.4 3h4l.4-3a8 8 0 0 0 2.6-1.5l2.5 1 2-3.5-2-1.5.1-1.5Z', + panel: 'M4 5h16v14H4zM15 5v14', + stop: 'M8 8h8v8H8z', + }; + return ( + + ); +}; + +const EmptyConversation = ({ onPrompt }: { onPrompt(prompt: string): void }) => ( +
+ +

MOSS WORKBENCH

+

What are we building?

+

+ Give Moss a concrete outcome. The workbench keeps plans, tools, evidence, and deliverables in + one continuous thread. +

+
+ {[ + ['Inspect the repository', 'Find the highest-impact improvement and prove it.'], + ['Review current changes', 'Check correctness, safety, and missing tests.'], + ['Map the architecture', 'Explain boundaries and recommend the next move.'], + ].map(([title, prompt]) => ( + + ))} +
+
+); + +const Timeline = ({ + items, + onSelectTool, + contributions, +}: { + items: TimelineItem[]; + onSelectTool(item: Extract): void; + contributions: PluginInventory['contributions']; +}) => { + const endRef = useRef(null); + useEffect(() => { + endRef.current?.scrollIntoView({ block: 'end' }); + }, [items]); + return ( +
+ {items.map((item) => { + if (item.kind === 'tool') { + return ( + + ); + } + if (item.kind === 'reasoning') { + return ( +
+ Thought process +

{item.text}

+
+ ); + } + return ( +
+ {item.kind !== 'status' && ( +
{item.kind === 'user' ? 'You' : 'Moss'}
+ )} +
{item.text || }
+
+ ); + })} + + +
+
+ ); +}; + +const PluginSlot = ({ + slot, + contributions, +}: { + slot: string; + contributions: PluginInventory['contributions']; +}) => { + const refs = useRef(new Map()); + const matching = useMemo( + () => contributions.filter((contribution) => contribution.slot === slot), + [contributions, slot] + ); + useEffect(() => { + const disposers: Array<() => void | Promise> = []; + let cancelled = false; + for (const contribution of matching) { + const contributionKey = `${contribution.pluginId}:${contribution.id}`; + const host = refs.current.get(contributionKey); + if (!host) continue; + const root = host.shadowRoot ?? host.attachShadow({ mode: 'open' }); + void import(/* @vite-ignore */ contribution.moduleUrl) + .then(async (module: { default?: unknown; mount?: unknown }) => { + if (cancelled) return; + const candidate = module.default ?? module; + const mount = + candidate && typeof candidate === 'object' && 'mount' in candidate + ? (candidate as { mount?: unknown }).mount + : module.mount; + if (typeof mount !== 'function') throw new Error('plugin Web module requires mount()'); + const dispose = await mount(root, { + pluginId: contribution.pluginId, + contributionId: contribution.id, + slot: contribution.slot, + }); + if (typeof dispose === 'function') { + const ownedDispose = dispose as () => void | Promise; + if (cancelled) await ownedDispose(); + else disposers.push(ownedDispose); + } + }) + .catch(() => { + if (!cancelled) root.textContent = 'Plugin UI failed to load.'; + }); + } + return () => { + cancelled = true; + void (async () => { + for (const dispose of disposers.reverse()) { + try { + await dispose(); + } catch {} + } + })(); + }; + }, [matching]); + if (matching.length === 0) return null; + return ( +
+ {matching.map((contribution) => ( +
{ + const contributionKey = `${contribution.pluginId}:${contribution.id}`; + if (node) refs.current.set(contributionKey, node); + else refs.current.delete(contributionKey); + }} + /> + ))} +
+ ); +}; + +const Workbench = () => { + const [bootstrap, setBootstrap] = useState(null); + const [sessions, setSessions] = useState([]); + const [sessionId, setSessionId] = useState(); + const [items, setItems] = useState([]); + const [prompt, setPrompt] = useState(''); + const [query, setQuery] = useState(''); + const [running, setRunning] = useState(false); + const [online, setOnline] = useState(true); + const [detailsOpen, setDetailsOpen] = useState(true); + const [settingsOpen, setSettingsOpen] = useState(false); + const [settingsTab, setSettingsTab] = useState<'runtime' | 'models' | 'permissions' | 'plugins'>( + 'runtime' + ); + const [pluginInventory, setPluginInventory] = useState({ + installed: [], + active: [], + contributions: [], + }); + const [settingsNotice, setSettingsNotice] = useState(''); + const [selectedTool, setSelectedTool] = useState>(); + const [theme, setTheme] = useState<'light' | 'dark'>('light'); + const controllerRef = useRef(undefined); + + const refresh = async () => { + const [nextBootstrap, nextSessions, nextPlugins] = await Promise.all([ + jsonRequest('/api/bootstrap'), + jsonRequest<{ sessions: SessionSummary[] }>('/api/sessions'), + jsonRequest('/api/plugins'), + ]); + setBootstrap(nextBootstrap); + setSessions(nextSessions.sessions); + setPluginInventory(nextPlugins); + setOnline(true); + }; + + useEffect(() => { + void refresh().catch(() => setOnline(false)); + const onlineListener = () => void refresh().catch(() => setOnline(false)); + const offlineListener = () => setOnline(false); + window.addEventListener('online', onlineListener); + window.addEventListener('offline', offlineListener); + return () => { + window.removeEventListener('online', onlineListener); + window.removeEventListener('offline', offlineListener); + controllerRef.current?.abort(); + }; + }, []); + + useEffect(() => { + document.documentElement.dataset.theme = theme; + }, [theme]); + + const filteredSessions = useMemo(() => { + const normalized = query.trim().toLowerCase(); + return normalized + ? sessions.filter((session) => session.title.toLowerCase().includes(normalized)) + : sessions; + }, [query, sessions]); + + const createSession = async () => { + const created = await jsonRequest<{ sessionId: string }>('/api/sessions', { method: 'POST' }); + setSessionId(created.sessionId); + setItems([]); + setSettingsOpen(false); + setSelectedTool(undefined); + }; + + const openSession = async (session: SessionSummary) => { + setSessionId(session.sessionId); + setSettingsOpen(false); + setSelectedTool(undefined); + const history = await jsonRequest<{ items: TimelineItem[] }>( + `/api/sessions/${encodeURIComponent(session.sessionId)}/messages` + ); + setItems(history.items); + }; + + const appendText = (kind: 'assistant' | 'reasoning', delta: string) => { + setItems((current) => { + const last = current.at(-1); + if (last?.kind === kind) + return [...current.slice(0, -1), { ...last, text: last.text + delta }]; + return [...current, { id: crypto.randomUUID(), kind, text: delta }]; + }); + }; + + const applyStreamEvent = (event: StreamEvent) => { + if (event.type === 'text' && event.delta) appendText('assistant', event.delta); + if (event.type === 'thought' && event.delta) appendText('reasoning', event.delta); + if (event.type === 'tool' && event.toolCallId && event.name) { + setItems((current) => { + const existing = current.find( + (item): item is Extract => + item.kind === 'tool' && item.id === event.toolCallId + ); + const next: Extract = { + id: event.toolCallId!, + kind: 'tool', + name: event.name!, + state: event.state === 'end' ? (event.isError ? 'failed' : 'complete') : 'running', + input: existing?.input ?? event.input, + result: event.result, + }; + return existing + ? current.map((item) => (item.id === event.toolCallId ? next : item)) + : [...current, next]; + }); + } + if (event.type === 'error') + setItems((current) => [ + ...current, + { id: crypto.randomUUID(), kind: 'status', text: event.message ?? 'Task failed' }, + ]); + }; + + const send = async () => { + const text = prompt.trim(); + if (!text || running) return; + let activeSession = sessionId; + if (!activeSession) { + const created = await jsonRequest<{ sessionId: string }>('/api/sessions', { method: 'POST' }); + activeSession = created.sessionId; + setSessionId(activeSession); + } + setPrompt(''); + setItems((current) => [...current, { id: crypto.randomUUID(), kind: 'user', text }]); + setRunning(true); + const controller = new AbortController(); + controllerRef.current = controller; + try { + const response = await fetch(`/api/sessions/${encodeURIComponent(activeSession)}/messages`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: text }), + signal: controller.signal, + }); + if (!response.ok || !response.body) throw new Error(`HTTP ${response.status}`); + const reader = response.body.getReader(); + const decoder = new TextDecoder(); + let pending = ''; + for (;;) { + const chunk = await reader.read(); + if (chunk.done) break; + pending += decoder.decode(chunk.value, { stream: true }); + const lines = pending.split('\n'); + pending = lines.pop() ?? ''; + for (const line of lines) if (line) applyStreamEvent(JSON.parse(line) as StreamEvent); + } + await refresh(); + } catch (error) { + if (!(error instanceof DOMException && error.name === 'AbortError')) { + setOnline(false); + setItems((current) => [ + ...current, + { + id: crypto.randomUUID(), + kind: 'status', + text: 'Connection interrupted. Your run remains recorded.', + }, + ]); + } + } finally { + setRunning(false); + controllerRef.current = undefined; + } + }; + + const stop = async () => { + controllerRef.current?.abort(); + if (sessionId) + await fetch(`/api/sessions/${encodeURIComponent(sessionId)}/cancel`, { method: 'POST' }); + setRunning(false); + }; + + const statusLabel = running ? 'Moss is working' : online ? 'Ready' : 'Reconnecting'; + + const mutatePlugin = async (pluginId: string, action: 'enable' | 'disable' | 'remove') => { + try { + await jsonRequest(`/api/plugins/${encodeURIComponent(pluginId)}/${action}`, { + method: 'POST', + }); + setSettingsNotice('Saved. Restart Moss to apply the new plugin composition.'); + await refresh(); + } catch { + setSettingsNotice('Plugin change failed. Check the runtime log and try again.'); + } + }; + + return ( +
+ + +
+
+
+

LOCAL WORKSPACE

+

+ {settingsOpen + ? 'Settings' + : (sessions.find((session) => session.sessionId === sessionId)?.title ?? + 'New task')} +

+
+
+ + + +
+ +
+ + {!online && ( +
+ Connection lost. Durable history remains safe while Moss reconnects. +
+ )} + + {settingsOpen ? ( +
+
+ {(['runtime', 'models', 'permissions', 'plugins'] as const).map((tab) => ( + + ))} +
+
+ + {settingsTab === 'runtime' && ( + <> +

RUNTIME COMPOSITION

+

Capabilities available to this workspace

+

+ Everything shown here comes from the live Moss runtime. Provider credentials + never leave the process. +

+
+
+ {bootstrap?.tools.length ?? 0} + Tools +
+
+ {bootstrap?.plugins.length ?? 0} + Active plugins +
+
+ {sessions.length} + Sessions +
+
+ + )} + {settingsTab === 'models' && ( + <> +

MODEL

+

{bootstrap?.model ?? 'Configured model'}

+

Model selection and provider validation share the same runtime as the CLI.

+
+
+ Provider credential + + Configured values are write-only and never returned to this page. + +
+ Process-owned +
+ + )} + {settingsTab === 'permissions' && ( + <> +

TRUST BOUNDARY

+

Local runtime permissions

+

+ Tool actions continue to use the active CLI safety mode and approval policy. +

+
+
+ Loopback-only Web host + Cross-origin mutations are denied. +
+ Enforced +
+ + )} + {settingsTab === 'plugins' && ( + <> +

TRUSTED PLUGINS

+

Installed extensions

+

+ Add local or npm plugins with moss plugins add. Plugin JavaScript + is trusted code and is not sandboxed. +

+ {settingsNotice &&
{settingsNotice}
} + {pluginInventory.installed.length === 0 && ( +
No plugins installed.
+ )} + {pluginInventory.installed.map((plugin) => { + const active = pluginInventory.active.some(({ id }) => id === plugin.id); + return ( +
+
+ {plugin.id} + + {plugin.version} ·{' '} + {active ? 'active' : plugin.enabled ? 'restart pending' : 'disabled'} + +
+
+ + +
+
+ ); + })} + + + )} +
+
+ ) : items.length === 0 ? ( + + ) : ( + { + setSelectedTool(tool); + setDetailsOpen(true); + }} + /> + )} + + {!settingsOpen && ( +
+
+ + {statusLabel} +
+
+ +
Local-first · tools require policy approval
- -
`; - -/** Visual system intentionally original to Moss; no upstream assets are copied. @internal */ -export const WEB_CSS = `:root{color-scheme:dark;--bg:#09110f;--panel:#101a17;--panel2:#14211d;--line:#263630;--text:#edf7f2;--muted:#8da49a;--green:#89f0b6;--mint:#b8ffd2;--danger:#ff9c8f;--shadow:0 28px 80px #0008;font:14px/1.5 Inter,ui-sans-serif,system-ui,sans-serif}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 70% -20%,#1c4936 0,transparent 38%),var(--bg);color:var(--text);min-height:100vh}.grain{position:fixed;inset:0;opacity:.025;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}.shell{display:grid;grid-template-columns:248px minmax(420px,1fr) 310px;min-height:100vh}.rail{padding:28px 20px;border-right:1px solid var(--line);background:#0b1412cc;display:flex;flex-direction:column;gap:28px}.brand{display:flex;gap:12px;align-items:center}.brand div{display:grid}.brand strong{font-size:17px}.brand small,.rail-card small{color:var(--muted)}.mark{display:grid;place-items:center;width:38px;height:38px;border-radius:12px;background:linear-gradient(145deg,var(--green),#3da775);color:#072016;font-weight:900;box-shadow:0 8px 28px #5ee29a3a}.new-chat,#send{border:0;border-radius:12px;background:var(--green);color:#082016;font-weight:750;padding:12px 16px;cursor:pointer}.rail nav{display:grid;gap:6px}.rail nav p,.eyebrow{font-size:10px;letter-spacing:.18em;color:#6f8b80;font-weight:800}.rail nav button,.icon-button{border:0;background:transparent;color:var(--muted);padding:10px 12px;text-align:left;border-radius:9px;cursor:pointer}.rail nav button span{float:right}.rail nav .nav-active,.rail nav button:hover{background:#18241f;color:var(--text)}.rail-card{margin-top:auto;display:flex;gap:10px;align-items:center;padding:13px;border:1px solid var(--line);border-radius:12px}.rail-card div{display:grid}.pulse{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 0 5px #75e9a519}.workspace{padding:30px 5vw;display:flex;flex-direction:column;min-height:100vh;max-height:100vh;overflow:hidden}.workspace>header{display:flex;justify-content:space-between;align-items:start}.workspace h1{font:500 clamp(20px,2vw,28px)/1.2 Georgia,serif;margin:3px 0}.header-actions{display:flex;gap:10px;align-items:center}.model-chip{border:1px solid var(--line);border-radius:99px;padding:7px 12px;color:var(--muted);font-size:12px}.icon-button{font-size:18px}.hero{margin:auto;text-align:center;max-width:720px}.orb{margin:auto;width:58px;height:58px;display:grid;place-items:center;border:1px solid #67d89b77;border-radius:18px;background:linear-gradient(145deg,#173b2d,#102019);color:var(--green);font-size:24px;box-shadow:0 20px 70px #4ac78a28}.hero h2{font:500 clamp(27px,4vw,44px)/1.1 Georgia,serif;margin:20px 0 10px}.hero>p{color:var(--muted);font-size:15px;max-width:600px;margin:0 auto}.prompts{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:32px}.prompts button{border:1px solid var(--line);background:#111d19aa;color:var(--text);border-radius:14px;padding:15px;text-align:left;cursor:pointer}.prompts button:hover{border-color:#5dc992;transform:translateY(-2px)}.prompts b,.prompts span{display:block}.prompts span{color:var(--muted);font-size:12px;margin-top:3px}.timeline{display:none;flex:1;overflow:auto;padding:30px 0 18px}.timeline.active{display:block}.message{max-width:790px;margin:0 auto 18px;padding:15px 18px;border-radius:14px;background:var(--panel);border:1px solid var(--line);white-space:pre-wrap}.message.user{margin-left:auto;background:#183226;border-color:#2f5d45}.message .label{font-size:10px;color:var(--green);letter-spacing:.12em;font-weight:800;margin-bottom:6px}.tool-card{max-width:790px;margin:0 auto 10px;border:1px solid var(--line);border-radius:12px;background:#0d1714;overflow:hidden}.tool-card header{display:flex;justify-content:space-between;padding:10px 13px;background:#14211d}.tool-card pre{margin:0;padding:12px;color:var(--muted);white-space:pre-wrap;max-height:180px;overflow:auto}.tool-card.error{border-color:#773f39}.composer{max-width:860px;width:100%;margin:16px auto 0;border:1px solid #365247;border-radius:17px;background:#101b18ee;box-shadow:var(--shadow);padding:11px}.composer-top,.composer-bottom{display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:11px}.composer-top{padding:0 5px 6px}.composer textarea{width:100%;resize:none;border:0;outline:0;background:transparent;color:var(--text);font:15px/1.5 inherit;padding:8px}.composer-bottom{padding:6px 3px 1px}.composer-bottom #send{padding:9px 14px}.composer button:disabled{opacity:.45;cursor:not-allowed}#stop{background:transparent;border:0;color:var(--danger);cursor:pointer}.capabilities{border-left:1px solid var(--line);background:#0c1513;padding:27px 20px;overflow:auto}.capabilities header{display:flex;justify-content:space-between}.capabilities h2{font:500 24px Georgia,serif;margin:2px 0 20px}.capabilities header button{display:none}.capabilities section{border-top:1px solid var(--line);padding:18px 0}.capabilities h3{font-size:12px}.capabilities h3 span{float:right;color:var(--muted)}.chips{display:flex;flex-wrap:wrap;gap:6px}.chips span{font:11px ui-monospace,monospace;color:#a6c3b6;border:1px solid var(--line);padding:5px 7px;border-radius:7px;background:#111e1a}.plugin-list article,.run-link{padding:10px;border:1px solid var(--line);border-radius:10px;margin-top:7px}.run-link{display:block;width:100%;background:transparent;color:var(--text);text-align:left;cursor:pointer}.run-link:hover,.run-link:focus-visible{border-color:var(--green);outline:2px solid #89f0b644;outline-offset:2px}.connection-banner{max-width:860px;width:100%;margin:12px auto 0;padding:10px 14px;border:1px solid #8b594f;border-radius:10px;background:#2a1917;color:#ffd2ca}.pulse.offline{background:var(--danger);box-shadow:0 0 0 5px #ff9c8f22}.plugin-list small{color:var(--muted)}.trust-note{margin-top:20px;padding:14px;border-radius:12px;background:#14251e;color:var(--mint)}.trust-note p{color:var(--muted);font-size:12px;margin-bottom:0}@media(max-width:1050px){.shell{grid-template-columns:80px 1fr}.rail{padding:25px 12px}.rail .brand div,.rail nav p,.rail nav button:not(.nav-active),.rail-card div,.new-chat{display:none}.rail .brand{justify-content:center}.capabilities{position:fixed;right:0;top:0;bottom:0;width:320px;z-index:4;transform:translateX(105%);transition:.25s;box-shadow:var(--shadow)}.capabilities.open{transform:none}.capabilities header button{display:block;background:none;border:0;color:var(--text);font-size:24px}}@media(max-width:700px){.shell{display:block}.rail{display:none}.workspace{padding:20px 14px}.model-chip{display:none}.prompts{grid-template-columns:1fr}.hero{overflow:auto}.composer-bottom>span{display:none}}`; - -/** Browser behavior for chat streaming, cancellation, and capability inspection. @internal */ -export const WEB_JS = `const $=id=>document.getElementById(id);let sessionId,controller,running=false,retryTimer;const decoder=new TextDecoder(); -const esc=s=>String(s??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); -function connection(online,message){$('connection-banner').hidden=online;$('runtime-pulse').classList.toggle('offline',!online);if(message)$('runtime-state').textContent=message} -function renderRuns(runs){$('run-list').innerHTML=runs.slice(0,5).map(r=>'').join('')||'No task history yet.';document.querySelectorAll('[data-run]').forEach(button=>button.onclick=()=>showRun(button.dataset.run))} -function eventSummary(event){if(event.type==='tool.started')return 'Started tool '+(event.data.name||'unknown');if(event.type==='tool.succeeded')return 'Tool '+(event.data.name||'unknown')+' completed';if(event.type==='tool.failed')return 'Tool '+(event.data.name||'unknown')+' failed';return event.type.replaceAll('.',' ')} -async function showRun(id){try{const data=await requestJson('/api/runs/'+encodeURIComponent(id));$('hero').hidden=true;$('timeline').classList.add('active');$('title').textContent=data.run.title;$('timeline').innerHTML='';addMessage('assistant','Durable task history · '+data.run.status+' · '+data.run.verification);for(const event of data.events)addMessage('assistant','#'+event.seq+' · '+eventSummary(event));scroll()}catch(error){connection(false,'History unavailable · retrying')}} -async function requestJson(url,options){const response=await fetch(url,options);if(!response.ok)throw new Error('HTTP '+response.status);connection(true);return response.json()} -async function refreshRuns(){const data=await requestJson('/api/runs');renderRuns(data.runs)} -async function bootstrap(){clearTimeout(retryTimer);try{const data=await requestJson('/api/bootstrap');$('runtime-state').textContent='Ready · '+data.tools.length+' tools';$('model').textContent=data.model;$('tool-count').textContent=data.tools.length;$('tools-total').textContent=data.tools.length;$('tools').innerHTML=data.tools.map(x=>''+esc(x)+'').join('');$('plugins-total').textContent=data.plugins.length;$('plugins').innerHTML=data.plugins.length?data.plugins.map(p=>'
'+esc(p.id)+'
'+esc(p.state)+' · '+p.tools.length+' tools
').join(''):'No host plugins installed.';renderRuns(data.taskRuns);if(!sessionId)await newSession()}catch(error){connection(false,'Offline · reconnecting');retryTimer=setTimeout(bootstrap,2000)}} -async function newSession(){const d=await requestJson('/api/sessions',{method:'POST'});sessionId=d.sessionId;await refreshRuns();$('timeline').innerHTML='';$('timeline').classList.remove('active');$('hero').hidden=false;$('title').textContent='Build with an agent that shows its work.'} -function addMessage(kind,text){const el=document.createElement('article');el.className='message '+kind;el.innerHTML='
'+(kind==='user'?'YOU':'MOSS')+'
';el.querySelector('.body').textContent=text;$('timeline').append(el);return el.querySelector('.body')} -function addTool(e){let el=document.querySelector('[data-tool="'+CSS.escape(e.toolCallId)+'"]');if(!el){el=document.createElement('article');el.className='tool-card';el.dataset.tool=e.toolCallId;el.innerHTML='
◇ '+esc(e.name)+'running
';$('timeline').append(el)}if(e.state==='end'){el.querySelector('span').textContent=e.isError?'failed':'complete';el.querySelector('pre').textContent=typeof e.result==='string'?e.result:JSON.stringify(e.result,null,2);if(e.isError)el.classList.add('error')}scroll()}
-function scroll(){$('timeline').scrollTop=$('timeline').scrollHeight}function setRunning(v){running=v;$('send').disabled=v;$('stop').hidden=!v;$('status').textContent=v?'Moss is working…':'Ready'}
-async function send(){const prompt=$('prompt').value.trim();if(!prompt||running)return;$('hero').hidden=true;$('timeline').classList.add('active');$('title').textContent=prompt.slice(0,72);addMessage('user',prompt);$('prompt').value='';const body=addMessage('assistant','');controller=new AbortController();setRunning(true);try{const res=await fetch('/api/sessions/'+encodeURIComponent(sessionId)+'/messages',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({prompt}),signal:controller.signal});if(!res.ok)throw new Error(await res.text());connection(true);const reader=res.body.getReader();let pending='';while(true){const {done,value}=await reader.read();if(done)break;pending+=decoder.decode(value,{stream:true});const lines=pending.split('\\n');pending=lines.pop();for(const line of lines){if(!line)continue;const e=JSON.parse(line);if(e.type==='text')body.textContent+=e.delta;if(e.type==='tool')addTool(e);if(e.type==='done'){$('status').textContent='Completed · '+e.run.verification;await refreshRuns()}scroll()}}}catch(e){if(e.name!=='AbortError'){body.textContent+='\\n\\nConnection interrupted: '+e.message;connection(false,'Offline · reconnecting');retryTimer=setTimeout(bootstrap,2000)}}finally{setRunning(false)}}
-$('send').onclick=send;$('stop').onclick=async()=>{controller?.abort();await fetch('/api/sessions/'+encodeURIComponent(sessionId)+'/cancel',{method:'POST'});setRunning(false)};$('new-chat').onclick=newSession;$('capability-toggle').onclick=()=>$('capabilities').classList.add('open');$('close-capabilities').onclick=()=>$('capabilities').classList.remove('open');$('theme').onclick=()=>document.body.classList.toggle('soft');$('prompt').onkeydown=e=>{if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();send()}};document.querySelectorAll('[data-prompt]').forEach(b=>b.onclick=()=>{$('prompt').value=b.dataset.prompt;$('prompt').focus()});window.addEventListener('online',bootstrap);window.addEventListener('offline',()=>connection(false,'Browser offline'));bootstrap();`;
+
+  
+    
+    
+    
+    Moss · Agent workspace
+    
+  
+  
+    
+ + +`; diff --git a/packages/moss-agent/src/web-ui/web-contracts.ts b/packages/moss-agent/src/web-ui/web-contracts.ts new file mode 100644 index 00000000..1492639c --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-contracts.ts @@ -0,0 +1,120 @@ +import type { MossWebSlot } from '../core/plugins/plugin-host.js'; + +/** Stable extension slots available to trusted Moss Web plugins. @beta */ +export { MOSS_WEB_SLOTS } from '../core/plugins/plugin-host.js'; + +/** One stable Moss Web extension slot. @beta */ +export type { MossWebSlot } from '../core/plugins/plugin-host.js'; + +/** Theme variables that every built-in and plugin surface may consume. @beta */ +export const MOSS_WEB_THEME_TOKENS = [ + '--moss-color-canvas', + '--moss-color-surface', + '--moss-color-panel', + '--moss-color-panel-raised', + '--moss-color-border', + '--moss-color-border-strong', + '--moss-color-text', + '--moss-color-muted', + '--moss-color-faint', + '--moss-color-accent', + '--moss-color-accent-soft', + '--moss-color-danger', + '--moss-color-warning', + '--moss-space-1', + '--moss-space-2', + '--moss-space-3', + '--moss-space-4', + '--moss-space-5', + '--moss-space-6', + '--moss-space-8', + '--moss-radius-control', + '--moss-radius-card', + '--moss-radius-panel', + '--moss-shadow-control', + '--moss-shadow-composer', + '--moss-shadow-float', +] as const; + +/** One stable Moss Web theme variable. @beta */ +export type MossWebThemeToken = (typeof MOSS_WEB_THEME_TOKENS)[number]; + +/** Context passed to a trusted plugin Web module mounted in a scoped ShadowRoot. @beta */ +export interface MossWebPluginMountContext { + readonly pluginId: string; + readonly contributionId: string; + readonly slot: MossWebSlot; +} + +/** Controlled browser module shape for an advanced trusted plugin UI. @beta */ +export interface MossWebPluginModule { + mount( + root: ShadowRoot, + context: MossWebPluginMountContext + ): void | (() => void) | Promise void)>; +} + +/** Browser-safe installed plugin record; filesystem locations are intentionally omitted. @beta */ +export interface MossWebInstalledPlugin { + readonly id: string; + readonly version: string; + readonly enabled: boolean; +} + +/** Browser-safe snapshot of one active runtime plugin. @beta */ +export interface MossWebPluginSnapshot { + readonly id: string; + readonly state: string; + readonly tools: readonly string[]; + readonly webContributions: readonly string[]; +} + +/** Browser-safe durable run summary. @beta */ +export interface MossWebTaskRunSnapshot { + readonly id: string; + readonly sessionId: string; + readonly title: string; + readonly status: string; + readonly verification: string; + readonly evidenceCount: number; + readonly updatedAt: number; +} + +/** Redacted startup state returned to the browser workbench. @beta */ +export interface MossWebBootstrap { + readonly tools: readonly string[]; + readonly plugins: readonly MossWebPluginSnapshot[]; + readonly taskRuns: readonly MossWebTaskRunSnapshot[]; + readonly model: string; +} + +/** Durable session metadata safe to expose to the local browser. @beta */ +export interface MossWebSessionSummary { + readonly sessionId: string; + readonly title: string; + readonly updatedAt: number; + readonly messageCount: number; + readonly runId?: string; + readonly runStatus?: string; +} + +/** Version-one browser event projection for a streamed Moss turn. @beta */ +export type MossWebStreamEvent = + | { readonly type: 'run'; readonly run: MossWebTaskRunSnapshot } + | { readonly type: 'text'; readonly delta: string } + | { readonly type: 'thought'; readonly delta: string } + | { + readonly type: 'tool'; + readonly state: 'start' | 'end'; + readonly toolCallId: string; + readonly name: string; + readonly input?: Readonly>; + readonly result?: string; + readonly isError?: boolean; + } + | { + readonly type: 'done'; + readonly stopReason: string; + readonly run?: MossWebTaskRunSnapshot; + } + | { readonly type: 'error'; readonly message: string }; diff --git a/packages/moss-agent/src/web-ui/web-server.ts b/packages/moss-agent/src/web-ui/web-server.ts index 2362c319..adf7366b 100644 --- a/packages/moss-agent/src/web-ui/web-server.ts +++ b/packages/moss-agent/src/web-ui/web-server.ts @@ -1,13 +1,26 @@ import http from 'node:http'; import { randomUUID } from 'node:crypto'; -import type { AddressInfo } from 'node:net'; +import { readFile } from 'node:fs/promises'; +import { isIP, type AddressInfo } from 'node:net'; +import path from 'node:path'; import type { MossAgent } from '../core/agent/moss-agent.js'; import { TaskRunLedger } from '../core/task-run/task-run-ledger.js'; import { ErrorCode, MossError, errorMessage } from '../errors.js'; -import { WEB_CSS, WEB_HTML, WEB_JS } from './web-assets.js'; +import { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; +import { readMossPluginManifest } from '../plugins/installed-plugin-registry.js'; +import { WEB_HTML } from './web-assets.js'; const MAX_BODY_BYTES = 64 * 1024; +interface ActiveWebContribution { + readonly pluginId: string; + readonly id: string; + readonly slot: string; + readonly moduleUrl: string; + readonly source: string; +} + +/** Options for the loopback Moss Web host. @beta */ export interface MossWebServerOptions { port?: number; host?: string; @@ -16,8 +29,11 @@ export interface MossWebServerOptions { taskRunLedger?: TaskRunLedger; /** Optional JSONL path used when the server creates its own ledger. */ taskRunFile?: string; + /** Config root used by the explicit installed-plugin registry. */ + configDir?: string; } +/** Running loopback Moss Web host. @beta */ export interface MossWebServerHandle { readonly url: string; readonly host: string; @@ -48,6 +64,14 @@ function sendAsset(response: http.ServerResponse, type: string, body: string): v response.end(body); } +async function sendClientAsset( + response: http.ServerResponse, + filename: 'workbench.css' | 'workbench.js' +): Promise { + const body = await readFile(new URL(`./client/${filename}`, import.meta.url), 'utf8'); + sendAsset(response, filename.endsWith('.css') ? 'text/css' : 'text/javascript', body); +} + async function readJson(request: http.IncomingMessage): Promise> { let body = ''; for await (const chunk of request) { @@ -67,18 +91,160 @@ async function readJson(request: http.IncomingMessage): Promise; } -function isLocalOrigin(request: http.IncomingMessage): boolean { +function isExpectedHost(request: http.IncomingMessage, expectedOrigin: string): boolean { + try { + return request.headers.host === new URL(expectedOrigin).host; + } catch { + return false; + } +} + +function formatHttpOrigin(host: string, port: number): string { + const hostname = isIP(host) === 6 && !host.startsWith('[') ? `[${host}]` : host; + return `http://${hostname}:${port}`; +} + +function isLocalOrigin(request: http.IncomingMessage, expectedOrigin: string): boolean { const origin = request.headers.origin; if (!origin) return true; try { - const host = new URL(origin).hostname; - return host === '127.0.0.1' || host === 'localhost' || host === '::1' || host === '[::1]'; + return new URL(origin).origin === expectedOrigin; } catch { return false; } } -/** Start the local Moss browser host around an existing fully composed agent. @internal */ +async function listWebSessions( + agent: MossAgent, + taskRuns: TaskRunLedger +): Promise< + Array<{ + sessionId: string; + title: string; + updatedAt: number; + messageCount: number; + runId?: string; + runStatus?: string; + }> +> { + const stored = await agent.config.sessionStore.listSessions(); + const runs = taskRuns.list(); + const bySession = new Map(); + for (const run of runs) { + if (!bySession.has(run.sessionId)) bySession.set(run.sessionId, run); + } + return stored + .filter((session) => session.messageCount > 0 || bySession.has(session.sessionKey)) + .map((session) => { + const run = bySession.get(session.sessionKey); + return { + sessionId: session.sessionKey, + title: run?.title ?? session.title ?? 'Untitled task', + updatedAt: Math.max(session.updatedAt, run?.updatedAt ?? 0), + messageCount: session.messageCount, + ...(run ? { runId: run.id, runStatus: run.status } : {}), + }; + }) + .sort((left, right) => right.updatedAt - left.updatedAt); +} + +async function sessionTimeline(agent: MossAgent, sessionId: string): Promise { + const messages = await agent.config.sessionStore.loadMessages(sessionId); + const timeline: unknown[] = []; + for (const [messageIndex, message] of messages.entries()) { + if (typeof message.content === 'string') { + if (message.content) { + timeline.push({ + id: `message-${messageIndex}`, + kind: message.role === 'user' ? 'user' : 'assistant', + text: message.content, + }); + } + } else { + for (const [blockIndex, block] of message.content.entries()) { + const id = `message-${messageIndex}-${blockIndex}`; + if (block.type === 'text' && block.text) { + timeline.push({ + id, + kind: message.role === 'user' ? 'user' : 'assistant', + text: block.text, + }); + } + if (block.type === 'tool_use') { + timeline.push({ + id: block.id, + kind: 'tool', + name: block.name, + state: 'complete', + input: block.input, + }); + } + if (block.type === 'tool_result') { + const tool = timeline.find( + (item) => + item && + typeof item === 'object' && + 'id' in item && + (item as { id: unknown }).id === block.tool_use_id + ) as Record | undefined; + if (tool) { + tool.result = block.content; + tool.state = block.is_error ? 'failed' : 'complete'; + } + } + } + } + if (message.thinking?.length) { + timeline.push({ + id: `thinking-${messageIndex}`, + kind: 'reasoning', + text: message.thinking.join('\n'), + }); + } + } + return timeline; +} + +async function snapshotActiveWebContributions( + registry: InstalledPluginRegistry | undefined, + activePluginIds: ReadonlySet +): Promise { + if (!registry) return Object.freeze([]); + const contributions: ActiveWebContribution[] = []; + for (const entry of await registry.list()) { + if (!activePluginIds.has(entry.id)) continue; + try { + const manifest = await readMossPluginManifest(entry.root); + for (const contribution of manifest.web?.contributions ?? []) { + contributions.push({ + pluginId: entry.id, + id: contribution.id, + slot: contribution.slot, + moduleUrl: `/plugin-assets/${encodeURIComponent(entry.id)}/${encodeURIComponent(contribution.id)}.js`, + source: await readFile(path.resolve(entry.root, contribution.module), 'utf8'), + }); + } + } catch { + // A broken plugin stays isolated and remains visible in the installed inventory. + } + } + return Object.freeze(contributions); +} + +async function sendPluginAsset( + response: http.ServerResponse, + contributions: readonly ActiveWebContribution[], + pluginId: string, + contributionId: string +): Promise { + const contribution = contributions.find( + (candidate) => candidate.pluginId === pluginId && candidate.id === contributionId + ); + if (!contribution) return sendJson(response, 404, { error: 'plugin contribution not found' }); + sendAsset(response, 'text/javascript', contribution.source); +} + +/** Start the local Moss browser host around an existing fully composed agent. @beta */ export async function startMossWebServer( agent: MossAgent, options: MossWebServerOptions = {} @@ -87,8 +253,28 @@ export async function startMossWebServer( const taskRuns = options.taskRunLedger ?? new TaskRunLedger(options.taskRunFile); taskRuns.recoverInterrupted(); const active = new Map(); + const pluginRegistry = options.configDir + ? new InstalledPluginRegistry({ configDir: options.configDir }) + : undefined; + const startupPluginIds = new Set( + agent.plugins + .inspect() + .plugins.filter(({ state }) => state === 'active') + .map(({ id }) => id) + ); + const webContributions = await snapshotActiveWebContributions(pluginRegistry, startupPluginIds); + const expectedOriginRef: { value?: string } = {}; const server = http.createServer((request, response) => { - void handleRequest(agent, taskRuns, active, request, response).catch((error: unknown) => { + void handleRequest( + agent, + taskRuns, + active, + pluginRegistry, + webContributions, + expectedOriginRef.value, + request, + response + ).catch((error: unknown) => { if (!response.headersSent) sendJson(response, 400, { error: errorMessage(error) }); else response.end(); }); @@ -101,6 +287,7 @@ export async function startMossWebServer( }); }); const address = server.address() as AddressInfo; + expectedOriginRef.value = formatHttpOrigin(host, address.port); let closePromise: Promise | undefined; const close = () => { closePromise ??= (async () => { @@ -115,23 +302,38 @@ export async function startMossWebServer( options.abortSignal?.addEventListener('abort', () => void close().catch(() => {}), { once: true, }); - return { url: `http://${host}:${address.port}`, host, port: address.port, taskRuns, close }; + return { url: expectedOriginRef.value, host, port: address.port, taskRuns, close }; } async function handleRequest( agent: MossAgent, taskRuns: TaskRunLedger, active: Map, + pluginRegistry: InstalledPluginRegistry | undefined, + webContributions: readonly ActiveWebContribution[], + expectedOrigin: string | undefined, request: http.IncomingMessage, response: http.ServerResponse ): Promise { + if (!expectedOrigin || !isExpectedHost(request, expectedOrigin)) { + return sendJson(response, 403, { error: 'unexpected host denied' }); + } const url = new URL(request.url ?? '/', 'http://moss.local'); if (request.method === 'GET' && url.pathname === '/') return sendAsset(response, 'text/html', WEB_HTML); - if (request.method === 'GET' && url.pathname === '/styles.css') - return sendAsset(response, 'text/css', WEB_CSS); - if (request.method === 'GET' && url.pathname === '/app.js') - return sendAsset(response, 'text/javascript', WEB_JS); + if (request.method === 'GET' && url.pathname === '/assets/workbench.css') + return sendClientAsset(response, 'workbench.css'); + if (request.method === 'GET' && url.pathname === '/assets/workbench.js') + return sendClientAsset(response, 'workbench.js'); + const pluginAssetMatch = url.pathname.match(/^\/plugin-assets\/([^/]+)\/([^/]+)\.js$/); + if (request.method === 'GET' && pluginAssetMatch) { + return sendPluginAsset( + response, + webContributions, + decodeURIComponent(pluginAssetMatch[1]), + decodeURIComponent(pluginAssetMatch[2]) + ); + } if (request.method === 'GET' && url.pathname === '/api/bootstrap') { return sendJson(response, 200, { tools: agent.tools.getNames(), @@ -142,6 +344,28 @@ async function handleRequest( } if (request.method === 'GET' && url.pathname === '/api/runs') return sendJson(response, 200, { runs: taskRuns.list() }); + if (request.method === 'GET' && url.pathname === '/api/sessions') + return sendJson(response, 200, { sessions: await listWebSessions(agent, taskRuns) }); + if (request.method === 'GET' && url.pathname === '/api/plugins') { + const installed = ((await pluginRegistry?.list()) ?? []).map(({ id, version, enabled }) => ({ + id, + version, + enabled, + })); + return sendJson(response, 200, { + installed, + active: agent.plugins.inspect().plugins, + contributions: webContributions.map(({ source: _, ...contribution }) => contribution), + }); + } + const messageMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/messages$/); + if (request.method === 'GET' && messageMatch) { + const sessionId = decodeURIComponent(messageMatch[1]); + if (!(await agent.config.sessionStore.exists(sessionId))) { + return sendJson(response, 404, { error: 'session not found' }); + } + return sendJson(response, 200, { items: await sessionTimeline(agent, sessionId) }); + } const runMatch = url.pathname.match(/^\/api\/runs\/([^/]+)$/); if (request.method === 'GET' && runMatch) { const runId = decodeURIComponent(runMatch[1]); @@ -152,25 +376,34 @@ async function handleRequest( ? sendJson(response, 200, { run, events: taskRuns.events(runId, cursor) }) : sendJson(response, 404, { error: 'run not found' }); } - if (!isLocalOrigin(request)) return sendJson(response, 403, { error: 'non-local origin denied' }); + if (!isLocalOrigin(request, expectedOrigin)) { + return sendJson(response, 403, { error: 'non-local origin denied' }); + } + const pluginMatch = url.pathname.match(/^\/api\/plugins\/([^/]+)\/(enable|disable|remove)$/); + if (request.method === 'POST' && pluginMatch) { + if (!pluginRegistry) return sendJson(response, 501, { error: 'plugin registry unavailable' }); + const pluginId = decodeURIComponent(pluginMatch[1]); + const action = pluginMatch[2]; + if (action === 'enable') await pluginRegistry.enable(pluginId); + if (action === 'disable') await pluginRegistry.disable(pluginId); + if (action === 'remove') await pluginRegistry.remove(pluginId); + return sendJson(response, 200, { pluginId, action, restartRequired: true }); + } if (request.method === 'POST' && url.pathname === '/api/sessions') { const sessionId = `web-${randomUUID()}`; await agent.config.sessionStore.replaceMessages(sessionId, []); return sendJson(response, 201, { sessionId }); } - const messageMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/messages$/); if (request.method === 'POST' && messageMatch) { const sessionId = decodeURIComponent(messageMatch[1]); + if (active.has(sessionId)) { + return sendJson(response, 409, { error: 'session already has an active turn' }); + } const body = await readJson(request); const prompt = typeof body.prompt === 'string' ? body.prompt.trim() : ''; if (!prompt) return sendJson(response, 400, { error: 'prompt is required' }); - let run = taskRuns - .list() - .find((candidate) => candidate.sessionId === sessionId && candidate.status === 'running'); - if (!run) { - const runId = `run-${randomUUID()}`; - run = taskRuns.create({ id: runId, sessionId, title: prompt.slice(0, 80) }); - } + const runId = `run-${randomUUID()}`; + const run = taskRuns.create({ id: runId, sessionId, title: prompt.slice(0, 80) }); return streamPrompt(agent, taskRuns, active, run.id, sessionId, prompt, response); } const cancelMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/cancel$/); @@ -196,7 +429,6 @@ async function streamPrompt( prompt: string, response: http.ServerResponse ): Promise { - active.get(sessionId)?.abort(); const controller = new AbortController(); active.set(sessionId, controller); response.writeHead(200, { @@ -207,6 +439,7 @@ async function streamPrompt( }); const emit = (value: unknown) => response.write(`${JSON.stringify(value)}\n`); let stopReason = 'end_turn'; + let streamError: string | undefined; try { const before = taskRuns.get(runId); if (before?.status === 'created') { @@ -253,13 +486,26 @@ async function streamPrompt( }); } if (event.type === 'turn_end') stopReason = event.stopReason; + if (event.type === 'error') { + streamError = event.error; + stopReason = 'error'; + emit({ type: 'error', message: event.error }); + } + if (event.type === 'done') { + stopReason = event.result.stopReason ?? (streamError ? 'error' : stopReason); + } } const current = taskRuns.get(runId); const terminalType = - stopReason === 'end_turn' || stopReason === 'stop_sequence' ? 'run.completed' : 'run.failed'; + !streamError && (stopReason === 'end_turn' || stopReason === 'stop_sequence') + ? 'run.completed' + : 'run.failed'; const run = current?.status === 'running' - ? taskRuns.append(runId, { type: terminalType, data: { stopReason } }) + ? taskRuns.append(runId, { + type: terminalType, + data: { stopReason, ...(streamError ? { message: streamError } : {}) }, + }) : current; emit({ type: 'done', stopReason, run }); } catch (error) { diff --git a/packages/moss-agent/test/cli-args.spec.mjs b/packages/moss-agent/test/cli-args.spec.mjs index 9c1852a6..7b7e6839 100644 --- a/packages/moss-agent/test/cli-args.spec.mjs +++ b/packages/moss-agent/test/cli-args.spec.mjs @@ -41,7 +41,17 @@ import { parseCliArgs, closestKnownCommand } from '../dist/cli/args.js'; // ─── Commands ──────────────────────────────────────────────────────────────── -for (const cmd of ['setup', 'config', 'doctor', 'sessions', 'resume', 'update', 'mcp', 'web']) { +for (const cmd of [ + 'setup', + 'config', + 'doctor', + 'sessions', + 'resume', + 'update', + 'mcp', + 'plugins', + 'web', +]) { const args = parseCliArgs([cmd]); assert.equal(args.command, cmd, `'${cmd}' is recognized as a subcommand`); } diff --git a/packages/moss-agent/test/cli-command-dispatcher.spec.mjs b/packages/moss-agent/test/cli-command-dispatcher.spec.mjs index 6f85c683..3548e574 100644 --- a/packages/moss-agent/test/cli-command-dispatcher.spec.mjs +++ b/packages/moss-agent/test/cli-command-dispatcher.spec.mjs @@ -20,6 +20,7 @@ const expectedPhases = { auth: CliPhase.ConfigOnly, config: CliPhase.ConfigOnly, mcp: CliPhase.ConfigOnly, + plugins: CliPhase.ConfigOnly, doctor: CliPhase.ConfigOnly, update: CliPhase.ConfigOnly, migrate: CliPhase.ConfigOnly, diff --git a/packages/moss-agent/test/installed-plugin-registry.spec.mjs b/packages/moss-agent/test/installed-plugin-registry.spec.mjs new file mode 100644 index 00000000..d02cff47 --- /dev/null +++ b/packages/moss-agent/test/installed-plugin-registry.spec.mjs @@ -0,0 +1,342 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; +import { access, mkdtemp, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; + +import { + InstalledPluginRegistry, + readMossPluginManifest, +} from '../dist/plugins/installed-plugin-registry.js'; + +const root = await mkdtemp(path.join(os.tmpdir(), 'moss-plugin-registry-')); +const configDir = path.join(root, 'config'); +const pluginDir = path.join(root, 'sample-plugin'); +await mkdir(pluginDir, { recursive: true }); +await writeFile( + path.join(pluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'sample/plugin', + version: '1.2.3', + runtime: { module: './plugin.mjs', export: 'plugin' }, + web: { contributions: [{ id: 'sample-settings', slot: 'settings.plugin', module: './ui.js' }] }, + configSchema: './config.schema.json', + }) +); +await writeFile( + path.join(pluginDir, 'plugin.mjs'), + "export const plugin = { id: 'sample/plugin', setup() {} };\n" +); +await writeFile(path.join(pluginDir, 'ui.js'), 'export default { mount() {} };\n'); +await writeFile(path.join(pluginDir, 'config.schema.json'), '{"type":"object"}\n'); + +const manifest = await readMossPluginManifest(pluginDir); +assert.equal(manifest.id, 'sample/plugin'); +assert.equal(manifest.web?.contributions[0]?.slot, 'settings.plugin'); + +const registry = new InstalledPluginRegistry({ configDir }); +const installed = await registry.add(pluginDir); +assert.equal(installed.id, 'sample/plugin'); +assert.equal(installed.enabled, false); +assert.equal((await registry.list()).length, 1); + +await registry.enable('sample/plugin'); + +const loaded = await registry.loadEnabled(); +assert.equal(loaded.plugins.length, 1); +assert.equal(loaded.plugins[0]?.id, 'sample/plugin'); +assert.deepEqual(loaded.failures, []); + +const report = await registry.doctor(); +assert.equal(report[0]?.status, 'ok'); +assert.ok(report[0]?.message.includes('1.2.3')); + +const persisted = JSON.parse( + await readFile(path.join(configDir, 'plugins', 'installed.json'), 'utf8') +); +assert.equal(persisted.schemaVersion, 1); +assert.equal(persisted.plugins[0]?.source, pluginDir); + +await registry.remove('sample/plugin'); +assert.deepEqual(await registry.list(), []); + +await assert.rejects( + () => readMossPluginManifest(path.join(root, 'missing')), + /moss\.plugin\.json/ +); +await assert.rejects(() => registry.add('example-plugin'), /npm plugins require an exact version/); + +const duplicateWebDir = path.join(root, 'duplicate-web-plugin'); +await mkdir(duplicateWebDir, { recursive: true }); +await writeFile( + path.join(duplicateWebDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'sample/duplicate-web', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + web: { + contributions: [ + { id: 'duplicate', slot: 'settings.plugin', module: './ui.js' }, + { id: 'duplicate', slot: 'conversation.header', module: './ui.js' }, + ], + }, + }) +); +await writeFile( + path.join(duplicateWebDir, 'plugin.mjs'), + "export default { id: 'sample/duplicate-web', setup() {} };\n" +); +await writeFile(path.join(duplicateWebDir, 'ui.js'), 'export default { mount() {} };\n'); +await assert.rejects( + () => readMossPluginManifest(duplicateWebDir), + /duplicate web contribution id/ +); + +const throwingPluginDir = path.join(root, 'throwing-plugin'); +await mkdir(throwingPluginDir, { recursive: true }); +await writeFile( + path.join(throwingPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'sample/throwing', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await writeFile( + path.join(throwingPluginDir, 'plugin.mjs'), + "export default { id: 'sample/throwing', setup() { throw new Error('SETUP_FAILED'); } };\n" +); +await registry.add(throwingPluginDir); +const throwingReport = await registry.doctor(); +assert.equal(throwingReport[0]?.status, 'error'); +assert.match(throwingReport[0]?.message ?? '', /SETUP_FAILED/); +await assert.rejects(() => registry.enable('sample/throwing'), /SETUP_FAILED/); +assert.equal((await registry.list())[0]?.enabled, false); + +const concurrentConfigDir = path.join(root, 'concurrent-config'); +const concurrentPluginDirs = []; +for (const suffix of ['one', 'two']) { + const directory = path.join(root, `concurrent-${suffix}`); + await mkdir(directory, { recursive: true }); + await writeFile( + path.join(directory, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: `concurrent/${suffix}`, + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) + ); + await writeFile( + path.join(directory, 'plugin.mjs'), + `export default { id: 'concurrent/${suffix}', setup() {} };\n` + ); + concurrentPluginDirs.push(directory); +} +const workerPath = path.join(root, 'add-plugin-worker.mjs'); +await writeFile( + workerPath, + `import { InstalledPluginRegistry } from ${JSON.stringify(new URL('../dist/plugins/installed-plugin-registry.js', import.meta.url).href)}; +await new InstalledPluginRegistry({ configDir: process.argv[2] }).add(process.argv[3]);\n` +); +const runWorker = (pluginRoot) => + new Promise((resolve, reject) => { + const child = spawn(process.execPath, [workerPath, concurrentConfigDir, pluginRoot], { + stdio: ['ignore', 'pipe', 'pipe'], + }); + let stderr = ''; + child.stderr.on('data', (chunk) => { + stderr += String(chunk); + }); + child.once('error', reject); + child.once('exit', (code) => + code === 0 ? resolve() : reject(new Error(`plugin worker exited ${code}: ${stderr}`)) + ); + }); +await Promise.all([runWorker(concurrentPluginDirs[0]), runWorker(concurrentPluginDirs[1])]); +assert.deepEqual( + (await new InstalledPluginRegistry({ configDir: concurrentConfigDir }).list()).map( + ({ id }) => id + ), + ['concurrent/one', 'concurrent/two'] +); + +const heartbeatConfigDir = path.join(root, 'heartbeat-config'); +const slowPluginDir = path.join(root, 'slow-plugin'); +const quickPluginDir = path.join(root, 'quick-plugin'); +const setupMarker = path.join(root, 'slow-setup-started'); +for (const directory of [slowPluginDir, quickPluginDir]) { + await mkdir(directory, { recursive: true }); +} +await writeFile( + path.join(slowPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'concurrent/slow', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await writeFile( + path.join(slowPluginDir, 'plugin.mjs'), + `import { writeFileSync } from 'node:fs'; +export default { + id: 'concurrent/slow', + async setup() { + writeFileSync(${JSON.stringify(setupMarker)}, 'started'); + await new Promise((resolve) => setTimeout(resolve, 6200)); + } +}; +` +); +await writeFile( + path.join(quickPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'concurrent/quick', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await writeFile( + path.join(quickPluginDir, 'plugin.mjs'), + "export default { id: 'concurrent/quick', setup() {} };\n" +); +const heartbeatRegistry = new InstalledPluginRegistry({ configDir: heartbeatConfigDir }); +await heartbeatRegistry.add(slowPluginDir); +const enabling = heartbeatRegistry.enable('concurrent/slow'); +for (let attempts = 0; ; attempts += 1) { + try { + await access(setupMarker); + break; + } catch (error) { + if (attempts >= 100) throw error; + await new Promise((resolve) => setTimeout(resolve, 20)); + } +} +const addingWhileLeaseRenews = new InstalledPluginRegistry({ + configDir: heartbeatConfigDir, +}).add(quickPluginDir); +await Promise.all([enabling, addingWhileLeaseRenews]); +assert.deepEqual( + (await heartbeatRegistry.list()).map(({ id, enabled }) => [id, enabled]), + [ + ['concurrent/quick', false], + ['concurrent/slow', true], + ] +); + +const compromisedConfigDir = path.join(root, 'compromised-config'); +const compromisedRegistry = new InstalledPluginRegistry({ configDir: compromisedConfigDir }); +await compromisedRegistry.add(slowPluginDir); +await rm(setupMarker, { force: true }); +const compromisedEnable = compromisedRegistry.enable('concurrent/slow'); +for (let attempts = 0; ; attempts += 1) { + try { + await access(setupMarker); + break; + } catch (error) { + if (attempts >= 100) throw error; + await new Promise((resolve) => setTimeout(resolve, 20)); + } +} +await rm(path.join(compromisedConfigDir, 'plugins.lock'), { + recursive: true, + force: true, +}); +await assert.rejects(compromisedEnable, /lock was compromised/); +assert.deepEqual( + (await compromisedRegistry.list()).map(({ id, enabled }) => [id, enabled]), + [['concurrent/slow', false]] +); + +const hangingPluginDir = path.join(root, 'hanging-plugin'); +await mkdir(hangingPluginDir, { recursive: true }); +await writeFile( + path.join(hangingPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'sample/hanging', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await writeFile( + path.join(hangingPluginDir, 'plugin.mjs'), + `export default { + id: 'sample/hanging', + setup() { + setInterval(() => {}, 1000); + return new Promise(() => {}); + } +}; +` +); +const hangingConfigDir = path.join(root, 'hanging-config'); +const hangingRegistry = new InstalledPluginRegistry({ configDir: hangingConfigDir }); +await hangingRegistry.add(hangingPluginDir); +await assert.rejects( + hangingRegistry.enable('sample/hanging'), + /setup validation timed out after 15 seconds/ +); +assert.equal((await hangingRegistry.list())[0]?.enabled, false); + +const escapedPluginDir = path.join(root, 'escaped-plugin'); +const outsideRuntimeDir = path.join(root, 'outside-runtime'); +await mkdir(escapedPluginDir, { recursive: true }); +await mkdir(outsideRuntimeDir, { recursive: true }); +await writeFile( + path.join(outsideRuntimeDir, 'plugin.mjs'), + "export default { id: 'sample/escaped', setup() {} };\n" +); +await symlink( + outsideRuntimeDir, + path.join(escapedPluginDir, 'linked-runtime'), + process.platform === 'win32' ? 'junction' : 'dir' +); +await writeFile( + path.join(escapedPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'sample/escaped', + version: '1.0.0', + runtime: { module: './linked-runtime/plugin.mjs' }, + }) +); +await assert.rejects(() => readMossPluginManifest(escapedPluginDir), /escapes plugin root/); + +const invalidVersionDir = path.join(root, 'invalid-version-plugin'); +await mkdir(invalidVersionDir, { recursive: true }); +await writeFile( + path.join(invalidVersionDir, 'plugin.mjs'), + "export default { id: 'sample/invalid-version', setup() {} };\n" +); +for (const version of ['01.2.3', '1.2.3-.']) { + await writeFile( + path.join(invalidVersionDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'sample/invalid-version', + version, + runtime: { module: './plugin.mjs' }, + }) + ); + await assert.rejects(() => readMossPluginManifest(invalidVersionDir), /semantic version/); +} + +const corruptConfigDir = path.join(root, 'corrupt-config'); +await mkdir(path.join(corruptConfigDir, 'plugins'), { recursive: true }); +await writeFile( + path.join(corruptConfigDir, 'plugins', 'installed.json'), + JSON.stringify({ schemaVersion: 1, plugins: [null] }) +); +await assert.rejects( + () => new InstalledPluginRegistry({ configDir: corruptConfigDir }).list(), + /unable to read/ +); + +console.log(' [PASS] installed plugin registry: manifest, lifecycle, isolation'); diff --git a/packages/moss-agent/test/official-deepseek-plugin.spec.mjs b/packages/moss-agent/test/official-deepseek-plugin.spec.mjs new file mode 100644 index 00000000..daf25002 --- /dev/null +++ b/packages/moss-agent/test/official-deepseek-plugin.spec.mjs @@ -0,0 +1,40 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { mkdtemp } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; + +import { createMossPluginHost } from '../dist/core/plugins/plugin-host.js'; +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; +import { SkillRegistry } from '../dist/skills/registry.js'; + +const configDir = await mkdtemp(path.join(os.tmpdir(), 'moss-official-plugin-')); +const workspaceDir = await mkdtemp(path.join(os.tmpdir(), 'moss-official-workspace-')); +const installed = new InstalledPluginRegistry({ configDir }); +const entry = await installed.add('official:deepseek-harness'); +assert.equal(entry.id, 'deepseek/harness'); +assert.equal(entry.enabled, false); + +await installed.enable(entry.id); +const loaded = await installed.loadEnabled(); +assert.deepEqual(loaded.failures, []); +assert.equal(loaded.plugins.length, 1); + +const skills = new SkillRegistry({ workspaceDir, includeBuiltin: false }); +const host = createMossPluginHost({ + hasTool: () => false, + registerTool: () => () => {}, + hasSkill: (id) => skills.hasStableId(id), + registerSkill: (skill) => skills.registerInline(skill), + hasExpert: () => false, + registerExpert: () => () => {}, +}); +await host.install(loaded.plugins[0]); +const skill = skills.list().find(({ stableId }) => stableId === 'deepseek-harness'); +assert.ok(skill); +assert.match(skill.body ?? '', /reasoning_content/); +assert.match(skill.body ?? '', /parallel tool-call deltas/); +await host.close(); +assert.equal(skills.hasStableId('deepseek-harness'), false); + +console.log(' [PASS] official DeepSeek Harness plugin installs disabled and owns its skill'); diff --git a/packages/moss-agent/test/plugin-runtime.spec.mjs b/packages/moss-agent/test/plugin-runtime.spec.mjs index c7583076..6d98148c 100644 --- a/packages/moss-agent/test/plugin-runtime.spec.mjs +++ b/packages/moss-agent/test/plugin-runtime.spec.mjs @@ -81,6 +81,11 @@ try { allowedTools: ['plugin_inspect_fixture'], }); context.addPromptLayer('## Plugin review policy\nUse plugin evidence when requested.'); + context.registerWebContribution({ + id: 'example-review-settings', + slot: 'settings.plugin', + module: './web/review-settings.js', + }); context.effect(() => () => cleanup.push('first'), 'first custom effect'); context.effect(() => async () => cleanup.push('second'), 'second custom effect'); }, @@ -105,6 +110,7 @@ try { assert.deepEqual(plugin?.skills, ['plugin-review']); assert.deepEqual(plugin?.experts, ['plugin-reviewer']); assert.equal(plugin?.promptLayerCount, 1); + assert.deepEqual(plugin?.webContributions, ['example-review-settings']); assert.doesNotMatch(JSON.stringify(snapshot), /Plugin review policy|Use only the plugin/); let loadTurn = 0; diff --git a/packages/moss-agent/test/plugins-runtime.spec.mjs b/packages/moss-agent/test/plugins-runtime.spec.mjs new file mode 100644 index 00000000..5e68d4d2 --- /dev/null +++ b/packages/moss-agent/test/plugins-runtime.spec.mjs @@ -0,0 +1,62 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; + +import { installConfiguredPlugins } from '../dist/cli/plugins-runtime.js'; +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; + +const configDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-plugin-startup-')); +const pluginDir = path.join(configDir, 'broken-plugin'); +await fs.mkdir(pluginDir, { recursive: true }); +await fs.writeFile( + path.join(pluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'broken/startup', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await fs.writeFile( + path.join(pluginDir, 'plugin.mjs'), + "import { isMainThread } from 'node:worker_threads'; export default { id: 'broken/startup', setup() { if (isMainThread) throw new Error('BROKEN_SETUP'); } };\n" +); +const registry = new InstalledPluginRegistry({ configDir }); +await registry.add(pluginDir); +await registry.enable('broken/startup'); + +const agent = new MossAgent({ + llmProvider: { + id: 'plugin-startup-test', + displayName: 'Plugin startup test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }, + sessionStore: new InMemorySessionStore(), + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, +}); + +const errors = []; +const originalError = console.error; +console.error = (...args) => errors.push(args.join(' ')); +try { + await installConfiguredPlugins(agent, configDir); +} finally { + console.error = originalError; + await agent.close(); +} + +assert.deepEqual(agent.plugins.inspect().plugins, []); +assert.ok(errors.some((line) => line.includes('broken/startup') && line.includes('isolated'))); +console.log(' [PASS] configured plugin setup failures are isolated from runtime startup'); diff --git a/packages/moss-agent/test/tool-registry-ownership.spec.mjs b/packages/moss-agent/test/tool-registry-ownership.spec.mjs new file mode 100644 index 00000000..d8bbd2a2 --- /dev/null +++ b/packages/moss-agent/test/tool-registry-ownership.spec.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; + +import { ToolRegistry } from '../dist/core/tools/tool-registry.js'; + +function tool(name, marker) { + return { + name, + description: marker, + inputSchema: { type: 'object', properties: {} }, + sideEffects: { kind: 'readonly' }, + async execute() { + return marker; + }, + }; +} + +const registry = new ToolRegistry(); +const pluginTool = tool('shared_name', 'plugin'); +registry.registerScoped(pluginTool, 'plugin:sample'); + +assert.throws( + () => registry.register(tool('shared_name', 'late builtin')), + /tool already registered: shared_name/ +); +assert.equal(registry.get('shared_name'), pluginTool); +assert.equal(registry.getGroupForTool('shared_name'), 'plugin:sample'); + +const replacement = tool('shared_name', 'explicit replacement'); +registry.replace(replacement, 'host:configured'); +assert.equal(registry.get('shared_name'), replacement); +assert.equal(registry.getGroupForTool('shared_name'), 'host:configured'); + +console.log(' [PASS] tool registry preserves lifecycle ownership unless replacement is explicit'); diff --git a/packages/moss-agent/test/web-public-api.spec.mjs b/packages/moss-agent/test/web-public-api.spec.mjs new file mode 100644 index 00000000..5300b5c2 --- /dev/null +++ b/packages/moss-agent/test/web-public-api.spec.mjs @@ -0,0 +1,21 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import test from 'node:test'; + +test('published Web subpath exposes stable slots and design tokens', async () => { + const manifest = JSON.parse( + await fs.readFile(new URL('../package.json', import.meta.url), 'utf8') + ); + assert.ok(manifest.exports['./web']); + + const web = await import('../dist/web-ui/index.js'); + assert.ok(web.MOSS_WEB_SLOTS.includes('conversation.message')); + assert.ok(web.MOSS_WEB_SLOTS.includes('settings.plugin')); + assert.ok(web.MOSS_WEB_THEME_TOKENS.includes('--moss-color-surface')); + assert.ok(web.MOSS_WEB_THEME_TOKENS.includes('--moss-radius-panel')); + + const source = await fs.readFile(new URL('../src/web-ui/index.ts', import.meta.url), 'utf8'); + assert.match(source, /MossWebPluginMountContext/); + assert.match(source, /MossWebPluginModule/); +}); diff --git a/packages/moss-agent/test/web-ui-browser.spec.mjs b/packages/moss-agent/test/web-ui-browser.spec.mjs new file mode 100644 index 00000000..d0e1751b --- /dev/null +++ b/packages/moss-agent/test/web-ui-browser.spec.mjs @@ -0,0 +1,173 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import puppeteer from 'puppeteer-core'; + +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; +import { installConfiguredPlugins } from '../dist/cli/plugins-runtime.js'; + +const browserCandidates = [ + process.env.MOSS_BROWSER_EXECUTABLE, + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', + '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', + '/usr/bin/chromium', + '/usr/bin/google-chrome', +].filter(Boolean); + +let browserExecutable; +for (const candidate of browserCandidates) { + try { + await fs.access(candidate); + browserExecutable = candidate; + break; + } catch {} +} + +test( + 'React workbench survives a complete browser message turn', + { skip: browserExecutable ? false : 'no Chromium-compatible browser installed' }, + async () => { + const agent = new MossAgent({ + llmProvider: { + id: 'web-browser-test', + displayName: 'Web browser test', + capabilities: { streaming: false }, + async complete() { + return { + stopReason: 'end_turn', + content: [{ type: 'text', text: 'BROWSER_TURN_OK' }], + }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }, + sessionStore: new InMemorySessionStore(), + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); + const configDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-browser-plugin-')); + const pluginDir = path.join(configDir, 'browser-plugin'); + await fs.mkdir(pluginDir, { recursive: true }); + await fs.writeFile( + path.join(pluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'browser/fixture', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + web: { + contributions: [ + { id: 'shared-settings', slot: 'settings.plugin', module: './settings.js' }, + ], + }, + }) + ); + await fs.writeFile( + path.join(pluginDir, 'plugin.mjs'), + "export default { id: 'browser/fixture', setup() {} };\n" + ); + await fs.writeFile( + path.join(pluginDir, 'settings.js'), + "export default { mount(root) { root.textContent = 'BROWSER_PLUGIN_UI_OK'; return () => { globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__ = true; }; } };\n" + ); + const pluginRegistry = new InstalledPluginRegistry({ configDir }); + await pluginRegistry.add(pluginDir); + await pluginRegistry.enable('browser/fixture'); + const secondPluginDir = path.join(configDir, 'browser-plugin-two'); + await fs.mkdir(secondPluginDir, { recursive: true }); + await fs.writeFile( + path.join(secondPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'browser/fixture-two', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + web: { + contributions: [ + { id: 'shared-settings', slot: 'settings.plugin', module: './settings.js' }, + ], + }, + }) + ); + await fs.writeFile( + path.join(secondPluginDir, 'plugin.mjs'), + "export default { id: 'browser/fixture-two', setup() {} };\n" + ); + await fs.writeFile( + path.join(secondPluginDir, 'settings.js'), + "export default { async mount(root) { root.textContent = 'BROWSER_PLUGIN_UI_TWO_OK'; await new Promise((resolve) => setTimeout(resolve, 250)); return () => { throw new Error('EXPECTED_DISPOSER_FAILURE'); }; } };\n" + ); + await pluginRegistry.add(secondPluginDir); + await pluginRegistry.enable('browser/fixture-two'); + await installConfiguredPlugins(agent, configDir); + const web = await startMossWebServer(agent, { port: 0, configDir }); + const browser = await puppeteer.launch({ executablePath: browserExecutable, headless: true }); + const page = await browser.newPage(); + await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 }); + const pageErrors = []; + page.on('pageerror', (error) => pageErrors.push(error.message)); + try { + await page.goto(web.url, { waitUntil: 'domcontentloaded', timeout: 20_000 }); + await page.waitForSelector('.app-frame', { timeout: 10_000 }); + const desktopColumns = await page.$$eval( + '.sidebar, .conversation-column, .details-panel', + (columns) => columns.map((column) => Math.round(column.getBoundingClientRect().width)) + ); + assert.deepEqual( + desktopColumns, + [252, 868, 320], + 'desktop keeps the stable three-column frame' + ); + const screenshot = await page.screenshot({ type: 'png' }); + assert.ok( + screenshot.byteLength > 20_000, + 'fixed viewport produces a non-empty visual sample' + ); + await page.click('.sidebar-footer > button'); + await page.click('.settings-tabs button:last-child'); + await page.waitForFunction( + `Array.from(document.querySelectorAll('[data-moss-slot="settings.plugin"] > div')) + .map((node) => node.shadowRoot?.textContent) + .includes('BROWSER_PLUGIN_UI_OK') && + Array.from(document.querySelectorAll('[data-moss-slot="settings.plugin"] > div')) + .map((node) => node.shadowRoot?.textContent) + .includes('BROWSER_PLUGIN_UI_TWO_OK')`, + { timeout: 10_000 } + ); + await new Promise((resolve) => setTimeout(resolve, 300)); + await page.click('.new-task'); + await new Promise((resolve) => setTimeout(resolve, 100)); + assert.equal(await page.evaluate('globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__'), true); + await page.waitForSelector('textarea'); + await page.type('textarea', 'Complete the browser turn.'); + await page.keyboard.press('Enter'); + await page.waitForFunction('document.body.textContent.includes("BROWSER_TURN_OK")', { + timeout: 10_000, + }); + assert.equal(await page.$$eval('.message', (messages) => messages.length), 2); + await page.setViewport({ width: 740, height: 900, deviceScaleFactor: 1 }); + assert.equal( + await page.$eval('.sidebar', (sidebar) => globalThis.getComputedStyle(sidebar).display), + 'none' + ); + assert.ok( + (await page.$eval('.details-panel', (panel) => panel.getBoundingClientRect().width)) <= 330, + 'tablet details panel becomes a bounded drawer' + ); + assert.deepEqual(pageErrors, []); + } finally { + await browser.close(); + await web.close(); + await agent.close(); + } + } +); diff --git a/packages/moss-agent/test/web-ui.spec.mjs b/packages/moss-agent/test/web-ui.spec.mjs index d2f76f5d..e5ab4a29 100644 --- a/packages/moss-agent/test/web-ui.spec.mjs +++ b/packages/moss-agent/test/web-ui.spec.mjs @@ -1,18 +1,24 @@ #!/usr/bin/env node import assert from 'node:assert/strict'; +import http from 'node:http'; import test from 'node:test'; +import { mkdtemp, mkdir, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; import { MossAgent } from '../dist/core/agent/moss-agent.js'; import { InMemorySessionStore } from '../dist/core/session/session.js'; import { startMossWebServer } from '../dist/web-ui/web-server.js'; -import { WEB_HTML, WEB_JS } from '../dist/web-ui/web-assets.js'; - -test('browser asset is valid JavaScript', () => { - assert.doesNotThrow(() => new Function(WEB_JS)); - assert.match(WEB_HTML, /role="status" aria-live="polite"/); - assert.match(WEB_HTML, /role="alert" hidden/); - assert.match(WEB_JS, /window\.addEventListener\('online',bootstrap\)/); - assert.match(WEB_JS, /data-run/); +import { WEB_HTML } from '../dist/web-ui/web-assets.js'; +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; +import { installConfiguredPlugins } from '../dist/cli/plugins-runtime.js'; + +test('browser shell mounts the bundled React workbench and stable design system', () => { + assert.match(WEB_HTML, /id="moss-web-root"/); + assert.match(WEB_HTML, /data-moss-surface="workbench"/); + assert.match(WEB_HTML, /href="\/assets\/workbench\.css"/); + assert.match(WEB_HTML, /type="module" src="\/assets\/workbench\.js"/); + assert.doesNotMatch(WEB_HTML, /class="rail"/); }); function makeAgent(provider) { @@ -35,6 +41,16 @@ function makeAgent(provider) { return agent; } +function requestWithHost(url, host) { + return new Promise((resolve, reject) => { + const request = http.get(url, { headers: { host } }, (response) => { + response.resume(); + response.once('end', () => resolve(response.statusCode)); + }); + request.once('error', reject); + }); +} + test('web host boots on loopback and streams real tool evidence', async () => { let turn = 0; const agent = makeAgent({ @@ -58,13 +74,31 @@ test('web host boots on loopback and streams real tool evidence', async () => { try { assert.equal(web.host, '127.0.0.1'); const page = await fetch(web.url).then((response) => response.text()); - assert.match(page, /Build with an agent that shows its work/); - assert.match(page, /Capabilities/); + assert.match(page, /id="moss-web-root"/); + const clientScript = await fetch(`${web.url}/assets/workbench.js`); + assert.equal(clientScript.status, 200); + assert.match(clientScript.headers.get('content-type') ?? '', /javascript/); + assert.doesNotMatch(await clientScript.text(), /\bprocess\.env\b/); + const clientStyles = await fetch(`${web.url}/assets/workbench.css`).then((response) => + response.text() + ); + assert.match(clientStyles, /--moss-color-surface:/); + assert.match(clientStyles, /--moss-space-4:/); + assert.match(clientStyles, /--moss-radius-panel:/); + const componentRules = clientStyles.replace(/:root[^{]*{[^}]*}/gs, ''); + assert.doesNotMatch( + componentRules, + /#[\da-f]{3,8}\b/i, + 'component rules consume design tokens instead of parallel hard-coded colors' + ); const bootstrap = await fetch(`${web.url}/api/bootstrap`).then((response) => response.json()); assert.ok(bootstrap.tools.includes('web_fixture')); assert.equal(bootstrap.model, 'Configured model'); assert.doesNotMatch(JSON.stringify(bootstrap), /apiKey|Authorization|secret/i); + const sessions = await fetch(`${web.url}/api/sessions`).then((response) => response.json()); + assert.equal(sessions.sessions.length, 0); + const created = await fetch(`${web.url}/api/sessions`, { method: 'POST' }).then((response) => response.json() ); @@ -84,6 +118,29 @@ test('web host boots on loopback and streams real tool evidence', async () => { assert.match(stream, /"status":"completed"/); assert.match(stream, /"verification":"unverified"/); + const resumedSessions = await fetch(`${web.url}/api/sessions`).then((response) => + response.json() + ); + assert.equal(resumedSessions.sessions.length, 1); + assert.equal(resumedSessions.sessions[0].sessionId, created.sessionId); + assert.equal(resumedSessions.sessions[0].title, 'Use the fixture.'); + + const timeline = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}/messages` + ).then((response) => response.json()); + assert.ok( + timeline.items.some((item) => item.kind === 'user' && item.text === 'Use the fixture.') + ); + assert.ok( + timeline.items.some( + (item) => + item.kind === 'tool' && item.name === 'web_fixture' && item.result === 'WEB_FIXTURE_OK' + ) + ); + assert.ok( + timeline.items.some((item) => item.kind === 'assistant' && item.text === 'WEB_FIXTURE_OK') + ); + const terminal = stream .trim() .split('\n') @@ -110,6 +167,102 @@ test('web host boots on loopback and streams real tool evidence', async () => { headers: { origin: 'https://example.invalid' }, }); assert.equal(denied.status, 403); + + const otherLocalPort = await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: { origin: 'http://127.0.0.1:65535' }, + }); + assert.equal(otherLocalPort.status, 403); + + const wrongScheme = await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: { origin: web.url.replace('http:', 'https:') }, + }); + assert.equal(wrongScheme.status, 403); + + const secondStream = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}/messages`, + { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: 'Run the newer turn.' }), + } + ).then((response) => response.text()); + const secondTerminal = secondStream + .trim() + .split('\n') + .map((line) => JSON.parse(line)) + .find((event) => event.type === 'done'); + const sessionsAfterSecondTurn = await fetch(`${web.url}/api/sessions`).then((response) => + response.json() + ); + assert.equal(sessionsAfterSecondTurn.sessions[0].runId, secondTerminal.run.id); + assert.equal(sessionsAfterSecondTurn.sessions[0].title, 'Run the newer turn.'); + } finally { + await web.close(); + await agent.close(); + } +}); + +test('web host formats an IPv6 loopback origin when the platform supports it', async (context) => { + const agent = makeAgent({ + id: 'web-ipv6-test', + displayName: 'Web IPv6 test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }); + let web; + try { + web = await startMossWebServer(agent, { port: 0, host: '::1' }); + } catch (error) { + await agent.close(); + if (error?.code === 'EADDRNOTAVAIL' || error?.code === 'EAFNOSUPPORT') { + context.skip('IPv6 loopback is unavailable'); + return; + } + throw error; + } + try { + assert.match(web.url, /^http:\/\/\[::1\]:\d+$/); + assert.equal(await requestWithHost(`${web.url}/api/bootstrap`, `[::1]:${web.port}`), 200); + } finally { + await web.close(); + await agent.close(); + } +}); + +test('web host projects provider failures and records a failed run', async () => { + const agent = makeAgent({ + id: 'web-error-test', + displayName: 'Web error test', + capabilities: { streaming: false }, + async complete() { + throw new Error('WEB_PROVIDER_FAILURE'); + }, + async stream() { + throw new Error('streaming disabled'); + }, + }); + const web = await startMossWebServer(agent, { port: 0 }); + try { + const { sessionId } = await fetch(`${web.url}/api/sessions`, { method: 'POST' }).then( + (response) => response.json() + ); + const stream = await fetch(`${web.url}/api/sessions/${sessionId}/messages`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: 'Fail this turn.' }), + }).then((response) => response.text()); + assert.match(stream, /"type":"error".*WEB_PROVIDER_FAILURE/); + assert.match(stream, /"type":"done","stopReason":"error"/); + const runs = await fetch(`${web.url}/api/runs`).then((response) => response.json()); + assert.equal(runs.runs[0].status, 'failed'); + assert.equal(runs.runs[0].title, 'Fail this turn.'); } finally { await web.close(); await agent.close(); @@ -148,6 +301,12 @@ test('web cancellation aborts an active model turn', async () => { body: JSON.stringify({ prompt: 'Wait.' }), }).then((response) => response.text()); await startedGate; + const concurrent = await fetch(`${web.url}/api/sessions/${sessionId}/messages`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: 'Do not overlap.' }), + }); + assert.equal(concurrent.status, 409); const cancelled = await fetch(`${web.url}/api/sessions/${sessionId}/cancel`, { method: 'POST', }).then((response) => response.json()); @@ -158,3 +317,122 @@ test('web cancellation aborts an active model turn', async () => { await agent.close(); } }); + +test('web plugin settings expose redacted inventory and require local-origin mutation', async () => { + const configDir = await mkdtemp(path.join(os.tmpdir(), 'moss-web-plugins-')); + const pluginDir = path.join(configDir, 'fixture-plugin'); + await mkdir(pluginDir, { recursive: true }); + await writeFile( + path.join(pluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'fixture/plugin', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + web: { + contributions: [ + { id: 'fixture-settings', slot: 'settings.plugin', module: './settings.js' }, + ], + }, + }) + ); + await writeFile( + path.join(pluginDir, 'plugin.mjs'), + "export default { id: 'fixture/plugin', setup() {} };\n" + ); + await writeFile( + path.join(pluginDir, 'settings.js'), + "export default { mount(root) { root.textContent = 'FIXTURE_PLUGIN_UI'; } };\n" + ); + const pluginRegistry = new InstalledPluginRegistry({ configDir }); + await pluginRegistry.add(pluginDir); + await pluginRegistry.enable('fixture/plugin'); + const brokenPluginDir = path.join(configDir, 'broken-web-plugin'); + await mkdir(brokenPluginDir, { recursive: true }); + await writeFile( + path.join(brokenPluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'zz/broken-web', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + web: { + contributions: [ + { id: 'broken-settings', slot: 'settings.plugin', module: './settings.js' }, + ], + }, + }) + ); + await writeFile( + path.join(brokenPluginDir, 'plugin.mjs'), + "import { isMainThread } from 'node:worker_threads'; export default { id: 'zz/broken-web', setup() { if (isMainThread) throw new Error('BROKEN_WEB_SETUP'); } };\n" + ); + await writeFile( + path.join(brokenPluginDir, 'settings.js'), + "export default { mount(root) { root.textContent = 'MUST_NOT_LOAD'; } };\n" + ); + await pluginRegistry.add(brokenPluginDir); + await pluginRegistry.enable('zz/broken-web'); + const agent = makeAgent({ + id: 'web-plugin-test', + displayName: 'Web plugin test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }); + const originalError = console.error; + console.error = () => {}; + try { + await installConfiguredPlugins(agent, configDir); + } finally { + console.error = originalError; + } + const web = await startMossWebServer(agent, { port: 0, configDir }); + try { + const inventory = await fetch(`${web.url}/api/plugins`).then((response) => response.json()); + assert.equal(inventory.installed[0].id, 'fixture/plugin'); + assert.equal(inventory.contributions[0].slot, 'settings.plugin'); + assert.equal( + inventory.contributions.some(({ pluginId }) => pluginId === 'zz/broken-web'), + false + ); + assert.doesNotMatch(JSON.stringify(inventory), /secret|apiKey|Authorization/i); + assert.equal('root' in inventory.installed[0], false); + assert.equal('source' in inventory.installed[0], false); + const pluginAsset = await fetch(`${web.url}${inventory.contributions[0].moduleUrl}`); + assert.equal(pluginAsset.status, 200); + assert.match(await pluginAsset.text(), /FIXTURE_PLUGIN_UI/); + await writeFile( + path.join(pluginDir, 'settings.js'), + "export default { mount(root) { root.textContent = 'CHANGED_AFTER_START'; } };\n" + ); + const brokenAsset = await fetch(`${web.url}/plugin-assets/zz%2Fbroken-web/broken-settings.js`); + assert.equal(brokenAsset.status, 404); + + assert.equal(await requestWithHost(`${web.url}/api/bootstrap`, 'attacker.example'), 403); + + const denied = await fetch(`${web.url}/api/plugins/fixture%2Fplugin/disable`, { + method: 'POST', + headers: { origin: 'https://example.invalid' }, + }); + assert.equal(denied.status, 403); + + const disabled = await fetch(`${web.url}/api/plugins/fixture%2Fplugin/disable`, { + method: 'POST', + }).then((response) => response.json()); + assert.equal(disabled.restartRequired, true); + const refreshed = await fetch(`${web.url}/api/plugins`).then((response) => response.json()); + assert.equal(refreshed.installed[0].enabled, false); + assert.equal(refreshed.contributions[0].pluginId, 'fixture/plugin'); + const retainedAsset = await fetch(`${web.url}${refreshed.contributions[0].moduleUrl}`); + assert.equal(retainedAsset.status, 200); + assert.match(await retainedAsset.text(), /FIXTURE_PLUGIN_UI/); + } finally { + await web.close(); + await agent.close(); + } +}); diff --git a/packages/moss-agent/tsconfig.json b/packages/moss-agent/tsconfig.json index 0d7100cb..07fe1031 100644 --- a/packages/moss-agent/tsconfig.json +++ b/packages/moss-agent/tsconfig.json @@ -1,7 +1,9 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "noEmit": true + "noEmit": true, + "jsx": "react-jsx", + "lib": ["ES2022", "DOM", "DOM.Iterable"] }, - "include": ["src/**/*.ts"] + "include": ["src/**/*.ts", "src/**/*.tsx"] } diff --git a/packages/moss-agent/web-vite.config.mjs b/packages/moss-agent/web-vite.config.mjs new file mode 100644 index 00000000..081f5f8e --- /dev/null +++ b/packages/moss-agent/web-vite.config.mjs @@ -0,0 +1,30 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { defineConfig } from 'vite'; + +const packageRoot = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + define: { + 'process.env.NODE_ENV': JSON.stringify('production'), + }, + build: { + outDir: path.join(packageRoot, 'dist', 'web-ui', 'client'), + emptyOutDir: true, + cssCodeSplit: false, + lib: { + entry: path.join(packageRoot, 'src', 'web-ui', 'client', 'workbench.tsx'), + formats: ['es'], + fileName: () => 'workbench.js', + }, + rollupOptions: { + output: { + assetFileNames: (assetInfo) => + assetInfo.names.some((name) => name.endsWith('.css')) + ? 'workbench.css' + : '[name][extname]', + }, + }, + }, +}); diff --git a/scripts/config/api-entrypoints.json b/scripts/config/api-entrypoints.json index 44e89dc5..88e5d923 100644 --- a/scripts/config/api-entrypoints.json +++ b/scripts/config/api-entrypoints.json @@ -172,6 +172,11 @@ "types": "./dist/runtime/index.d.ts", "report": "runtime", "stability": "public" + }, + "./web": { + "types": "./dist/web-ui/index.d.ts", + "report": "web", + "stability": "public" } } } diff --git a/scripts/config/maintainability-baseline.json b/scripts/config/maintainability-baseline.json index 13c8977e..6bc72733 100644 --- a/scripts/config/maintainability-baseline.json +++ b/scripts/config/maintainability-baseline.json @@ -31,7 +31,7 @@ "reason": "Legacy hotspot recorded at initial maintainability-ratchet adoption." }, "packages/moss-agent/src/cli/tui.ts": { - "maxLines": 6137, + "maxLines": 6135, "reason": "Legacy hotspot recorded at initial maintainability-ratchet adoption." }, "packages/moss-agent/src/cli/tui-utils.ts": { @@ -39,7 +39,7 @@ "reason": "Legacy hotspot recorded at initial maintainability-ratchet adoption." }, "packages/moss-agent/src/cli-main.ts": { - "maxLines": 1528, + "maxLines": 1527, "reason": "Legacy hotspot recorded at initial maintainability-ratchet adoption." }, "packages/moss-agent/src/context/compaction.ts": { From d69ce0457b87e0c97ef50a85e07d4b3366af5d53 Mon Sep 17 00:00:00 2001 From: QiaolongLi1201 Date: Tue, 18 Aug 2026 02:36:02 +0800 Subject: [PATCH 2/5] test(agent): bound browser workbench cleanup --- .../moss-agent/test/web-ui-browser.spec.mjs | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/packages/moss-agent/test/web-ui-browser.spec.mjs b/packages/moss-agent/test/web-ui-browser.spec.mjs index d0e1751b..aba4f293 100644 --- a/packages/moss-agent/test/web-ui-browser.spec.mjs +++ b/packages/moss-agent/test/web-ui-browser.spec.mjs @@ -30,9 +30,32 @@ for (const candidate of browserCandidates) { } catch {} } +async function closeBrowser(browser) { + await new Promise((resolve) => { + const forceClose = setTimeout(() => { + browser.process()?.kill('SIGKILL'); + resolve(); + }, 5_000); + void browser.close().then( + () => { + clearTimeout(forceClose); + resolve(); + }, + () => { + clearTimeout(forceClose); + browser.process()?.kill('SIGKILL'); + resolve(); + } + ); + }); +} + test( 'React workbench survives a complete browser message turn', - { skip: browserExecutable ? false : 'no Chromium-compatible browser installed' }, + { + skip: browserExecutable ? false : 'no Chromium-compatible browser installed', + timeout: 60_000, + }, async () => { const agent = new MossAgent({ llmProvider: { @@ -110,13 +133,18 @@ test( await pluginRegistry.enable('browser/fixture-two'); await installConfiguredPlugins(agent, configDir); const web = await startMossWebServer(agent, { port: 0, configDir }); - const browser = await puppeteer.launch({ executablePath: browserExecutable, headless: true }); - const page = await browser.newPage(); - await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 }); - const pageErrors = []; - page.on('pageerror', (error) => pageErrors.push(error.message)); + let browser; try { - await page.goto(web.url, { waitUntil: 'domcontentloaded', timeout: 20_000 }); + browser = await puppeteer.launch({ + executablePath: browserExecutable, + headless: true, + args: process.platform === 'linux' ? ['--no-sandbox', '--disable-setuid-sandbox'] : [], + }); + const page = await browser.newPage(); + await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 }); + const pageErrors = []; + page.on('pageerror', (error) => pageErrors.push(error.message)); + await page.goto(web.url, { waitUntil: 'domcontentloaded', timeout: 30_000 }); await page.waitForSelector('.app-frame', { timeout: 10_000 }); const desktopColumns = await page.$$eval( '.sidebar, .conversation-column, .details-panel', @@ -165,7 +193,7 @@ test( ); assert.deepEqual(pageErrors, []); } finally { - await browser.close(); + if (browser) await closeBrowser(browser); await web.close(); await agent.close(); } From 9dad7c935fc28dc09a88ca434b38b625d9b35f9a Mon Sep 17 00:00:00 2001 From: QiaolongLi1201 Date: Tue, 18 Aug 2026 15:46:53 +0800 Subject: [PATCH 3/5] feat(agent): complete web parity and plugin lifecycle --- .github/workflows/ci.yml | 25 + CHANGELOG.md | 23 +- docs/README.md | 2 + docs/deepseek-harness-plugin-audit.md | 56 + docs/user-guide/23-runtime-plugins.md | 25 +- docs/user-guide/24-web-ui.md | 31 +- .../completion-matrix.md | 126 ++ .../add-zero-friction-web-ui/design.md | 10 +- .../add-zero-friction-web-ui/proposal.md | 10 +- .../visual-parity-audit.md | 57 + package-lock.json | 111 +- package.json | 3 +- packages/moss-agent/API.md | 6 +- packages/moss-agent/CHANGELOG.md | 21 +- packages/moss-agent/EXTENDING.md | 13 +- .../plugins/deepseek-harness/plugin.mjs | 22 + packages/moss-agent/etc/channels.api.md | 120 +- packages/moss-agent/etc/context.api.md | 3 +- packages/moss-agent/etc/core.api.md | 106 +- packages/moss-agent/etc/eval.api.md | 3 +- packages/moss-agent/etc/mcp.api.md | 3 +- packages/moss-agent/etc/mesh.api.md | 3 +- packages/moss-agent/etc/plan-execute.api.md | 3 +- packages/moss-agent/etc/root.api.md | 106 +- packages/moss-agent/etc/runtime.api.md | 271 +++- .../moss-agent/etc/structured-output.api.md | 3 +- packages/moss-agent/etc/teaching.api.md | 3 +- packages/moss-agent/etc/tools__builtin.api.md | 3 +- packages/moss-agent/etc/vision.api.md | 3 +- packages/moss-agent/etc/web-browser.api.md | 3 +- packages/moss-agent/etc/web.api.md | 221 ++- packages/moss-agent/package.json | 10 +- packages/moss-agent/src/cli/approval.ts | 184 +-- .../moss-agent/src/cli/interaction-mode.ts | 117 ++ .../src/cli/plugin-interactive-commands.ts | 32 + .../moss-agent/src/cli/plugins-command.ts | 30 +- .../moss-agent/src/cli/plugins-runtime.ts | 78 +- packages/moss-agent/src/cli/tui.ts | 10 +- .../moss-agent/src/core/agent/moss-agent.ts | 30 +- packages/moss-agent/src/core/index.ts | 5 + .../core/plugins/plugin-host-validation.ts | 128 ++ .../src/core/plugins/plugin-host.ts | 566 ++++++-- .../moss-agent/src/core/tools/tool-types.ts | 2 + packages/moss-agent/src/index.ts | 5 + .../src/plugins/dsh-bundle-compatibility.ts | 360 +++++ .../src/plugins/installed-plugin-registry.ts | 399 ++++-- .../src/plugins/isolated-plugin-runtime.ts | 381 +++++ .../src/plugins/plugin-config-schema.ts | 79 ++ .../src/plugins/plugin-config-store.ts | 280 ++++ .../src/plugins/plugin-setup-worker.ts | 246 +++- packages/moss-agent/src/runtime/index.ts | 20 + .../moss-agent/src/tools/ask-user-question.ts | 2 +- .../src/web-ui/client/api-client.ts | 259 ++++ .../src/web-ui/client/app-frame.css | 213 +++ .../src/web-ui/client/app-frame.tsx | 377 +++++ .../src/web-ui/client/component-gallery.css | 150 ++ .../src/web-ui/client/component-gallery.tsx | 193 +++ .../moss-agent/src/web-ui/client/composer.tsx | 385 +++++ .../web-ui/client/conversation-timeline.tsx | 348 +++++ .../src/web-ui/client/design-system.css | 507 +++++++ .../src/web-ui/client/design-system.tsx | 370 +++++ .../src/web-ui/client/details-panel.tsx | 241 ++++ .../src/web-ui/client/moss-web-components.tsx | 44 + .../src/web-ui/client/plugin-slot.tsx | 117 ++ .../src/web-ui/client/session-sidebar.tsx | 168 +++ .../src/web-ui/client/settings-center.tsx | 518 +++++++ .../web-ui/client/workbench-capabilities.css | 358 +++++ .../web-ui/client/workbench-preferences.ts | 49 + .../src/web-ui/client/workbench-types.ts | 210 +++ .../src/web-ui/client/workbench.css | 262 ++-- .../src/web-ui/client/workbench.tsx | 1262 ++++++++--------- packages/moss-agent/src/web-ui/index.ts | 17 + .../src/web-ui/legacy-web-assets.ts | 64 + .../src/web-ui/web-attachment-router.ts | 105 ++ .../src/web-ui/web-attachment-service.ts | 283 ++++ .../moss-agent/src/web-ui/web-contracts.ts | 129 ++ .../src/web-ui/web-control-plane-router.ts | 231 +++ .../src/web-ui/web-event-journal.ts | 146 ++ .../src/web-ui/web-interaction-bindings.ts | 35 + .../src/web-ui/web-interaction-broker.ts | 124 ++ .../src/web-ui/web-plugin-lifecycle.ts | 179 +++ .../src/web-ui/web-run-streaming.ts | 204 +++ .../src/web-ui/web-runtime-service.ts | 264 ++++ packages/moss-agent/src/web-ui/web-server.ts | 582 +++++--- .../src/web-ui/web-session-service.ts | 274 ++++ .../src/web-ui/web-settings-service.ts | 349 +++++ .../src/web-ui/web-static-assets.ts | 31 + .../test/dsh-bundle-compatibility.spec.mjs | 129 ++ .../test/installed-plugin-registry.spec.mjs | 147 +- .../test/official-deepseek-plugin.spec.mjs | 13 +- .../plugin-composition-generation.spec.mjs | 297 ++++ .../test/plugin-config-store.spec.mjs | 122 ++ .../test/plugin-interactive-commands.spec.mjs | 44 + .../test/plugin-npm-generations.spec.mjs | 103 ++ .../test/plugin-startup-isolation.spec.mjs | 156 ++ .../moss-agent/test/plugins-runtime.spec.mjs | 123 +- .../test/visual/baseline/desktop-approval.png | Bin 0 -> 93793 bytes .../test/visual/baseline/desktop-home.png | Bin 0 -> 87081 bytes .../test/visual/baseline/desktop-plan.png | Bin 0 -> 70013 bytes .../test/visual/baseline/desktop-plugins.png | Bin 0 -> 98343 bytes .../test/visual/baseline/desktop-running.png | Bin 0 -> 77526 bytes .../test/visual/baseline/desktop-settings.png | Bin 0 -> 49218 bytes .../test/visual/baseline/desktop-tool.png | Bin 0 -> 78570 bytes .../visual/baseline/narrow-conversation.png | Bin 0 -> 62083 bytes .../test/visual/baseline/narrow-home.png | Bin 0 -> 81790 bytes .../visual/baseline/tablet-gallery-dialog.png | Bin 0 -> 100384 bytes .../test/visual/baseline/tablet-gallery.png | Bin 0 -> 98228 bytes .../test/visual/baseline/tablet-home.png | Bin 0 -> 59689 bytes .../reference/deepseek-47f9438/README.md | 19 + .../deepseek-47f9438/desktop-approval.png | Bin 0 -> 94175 bytes .../deepseek-47f9438/desktop-home.png | Bin 0 -> 80626 bytes .../deepseek-47f9438/desktop-plan.png | Bin 0 -> 96225 bytes .../deepseek-47f9438/desktop-plugins.png | Bin 0 -> 74088 bytes .../deepseek-47f9438/desktop-running.png | Bin 0 -> 50337 bytes .../deepseek-47f9438/desktop-settings.png | Bin 0 -> 94306 bytes .../deepseek-47f9438/desktop-tool.png | Bin 0 -> 67331 bytes .../deepseek-47f9438/narrow-home.png | Bin 0 -> 69771 bytes .../deepseek-47f9438/tablet-home.png | Bin 0 -> 52760 bytes .../test/web-attachment-security.spec.mjs | 107 ++ .../test/web-attachment-service.spec.mjs | 83 ++ .../moss-agent/test/web-authorized-fetch.mjs | 24 + .../test/web-control-plane.spec.mjs | 115 ++ .../test/web-design-system.spec.mjs | 56 + .../test/web-event-journal.spec.mjs | 201 +++ .../test/web-interaction-broker.spec.mjs | 251 ++++ .../test/web-plugin-hot-reload.spec.mjs | 151 ++ .../test/web-plugin-lifecycle.spec.mjs | 108 ++ .../test/web-runtime-service.spec.mjs | 115 ++ .../test/web-session-service.spec.mjs | 177 +++ .../test/web-settings-service.spec.mjs | 112 ++ .../moss-agent/test/web-ui-browser.spec.mjs | 466 +++++- packages/moss-agent/test/web-ui.spec.mjs | 19 +- .../test/web-workbench-capabilities.spec.mjs | 120 ++ .../moss-agent/web-components-vite.config.mjs | 28 + scripts/check-moss-web-tokens.mjs | 60 + scripts/config/maintainability-baseline.json | 2 +- scripts/lib/cloud-local-scenario.mjs | 9 +- 137 files changed, 15175 insertions(+), 1589 deletions(-) create mode 100644 docs/deepseek-harness-plugin-audit.md create mode 100644 openspec/changes/add-zero-friction-web-ui/completion-matrix.md create mode 100644 openspec/changes/add-zero-friction-web-ui/visual-parity-audit.md create mode 100644 packages/moss-agent/src/cli/interaction-mode.ts create mode 100644 packages/moss-agent/src/cli/plugin-interactive-commands.ts create mode 100644 packages/moss-agent/src/core/plugins/plugin-host-validation.ts create mode 100644 packages/moss-agent/src/plugins/dsh-bundle-compatibility.ts create mode 100644 packages/moss-agent/src/plugins/isolated-plugin-runtime.ts create mode 100644 packages/moss-agent/src/plugins/plugin-config-schema.ts create mode 100644 packages/moss-agent/src/plugins/plugin-config-store.ts create mode 100644 packages/moss-agent/src/web-ui/client/api-client.ts create mode 100644 packages/moss-agent/src/web-ui/client/app-frame.css create mode 100644 packages/moss-agent/src/web-ui/client/app-frame.tsx create mode 100644 packages/moss-agent/src/web-ui/client/component-gallery.css create mode 100644 packages/moss-agent/src/web-ui/client/component-gallery.tsx create mode 100644 packages/moss-agent/src/web-ui/client/composer.tsx create mode 100644 packages/moss-agent/src/web-ui/client/conversation-timeline.tsx create mode 100644 packages/moss-agent/src/web-ui/client/design-system.css create mode 100644 packages/moss-agent/src/web-ui/client/design-system.tsx create mode 100644 packages/moss-agent/src/web-ui/client/details-panel.tsx create mode 100644 packages/moss-agent/src/web-ui/client/moss-web-components.tsx create mode 100644 packages/moss-agent/src/web-ui/client/plugin-slot.tsx create mode 100644 packages/moss-agent/src/web-ui/client/session-sidebar.tsx create mode 100644 packages/moss-agent/src/web-ui/client/settings-center.tsx create mode 100644 packages/moss-agent/src/web-ui/client/workbench-capabilities.css create mode 100644 packages/moss-agent/src/web-ui/client/workbench-preferences.ts create mode 100644 packages/moss-agent/src/web-ui/client/workbench-types.ts create mode 100644 packages/moss-agent/src/web-ui/legacy-web-assets.ts create mode 100644 packages/moss-agent/src/web-ui/web-attachment-router.ts create mode 100644 packages/moss-agent/src/web-ui/web-attachment-service.ts create mode 100644 packages/moss-agent/src/web-ui/web-control-plane-router.ts create mode 100644 packages/moss-agent/src/web-ui/web-event-journal.ts create mode 100644 packages/moss-agent/src/web-ui/web-interaction-bindings.ts create mode 100644 packages/moss-agent/src/web-ui/web-interaction-broker.ts create mode 100644 packages/moss-agent/src/web-ui/web-plugin-lifecycle.ts create mode 100644 packages/moss-agent/src/web-ui/web-run-streaming.ts create mode 100644 packages/moss-agent/src/web-ui/web-runtime-service.ts create mode 100644 packages/moss-agent/src/web-ui/web-session-service.ts create mode 100644 packages/moss-agent/src/web-ui/web-settings-service.ts create mode 100644 packages/moss-agent/src/web-ui/web-static-assets.ts create mode 100644 packages/moss-agent/test/dsh-bundle-compatibility.spec.mjs create mode 100644 packages/moss-agent/test/plugin-composition-generation.spec.mjs create mode 100644 packages/moss-agent/test/plugin-config-store.spec.mjs create mode 100644 packages/moss-agent/test/plugin-interactive-commands.spec.mjs create mode 100644 packages/moss-agent/test/plugin-npm-generations.spec.mjs create mode 100644 packages/moss-agent/test/plugin-startup-isolation.spec.mjs create mode 100644 packages/moss-agent/test/visual/baseline/desktop-approval.png create mode 100644 packages/moss-agent/test/visual/baseline/desktop-home.png create mode 100644 packages/moss-agent/test/visual/baseline/desktop-plan.png create mode 100644 packages/moss-agent/test/visual/baseline/desktop-plugins.png create mode 100644 packages/moss-agent/test/visual/baseline/desktop-running.png create mode 100644 packages/moss-agent/test/visual/baseline/desktop-settings.png create mode 100644 packages/moss-agent/test/visual/baseline/desktop-tool.png create mode 100644 packages/moss-agent/test/visual/baseline/narrow-conversation.png create mode 100644 packages/moss-agent/test/visual/baseline/narrow-home.png create mode 100644 packages/moss-agent/test/visual/baseline/tablet-gallery-dialog.png create mode 100644 packages/moss-agent/test/visual/baseline/tablet-gallery.png create mode 100644 packages/moss-agent/test/visual/baseline/tablet-home.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/README.md create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-approval.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-home.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-plan.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-plugins.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-running.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-settings.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-tool.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/narrow-home.png create mode 100644 packages/moss-agent/test/visual/reference/deepseek-47f9438/tablet-home.png create mode 100644 packages/moss-agent/test/web-attachment-security.spec.mjs create mode 100644 packages/moss-agent/test/web-attachment-service.spec.mjs create mode 100644 packages/moss-agent/test/web-authorized-fetch.mjs create mode 100644 packages/moss-agent/test/web-control-plane.spec.mjs create mode 100644 packages/moss-agent/test/web-design-system.spec.mjs create mode 100644 packages/moss-agent/test/web-event-journal.spec.mjs create mode 100644 packages/moss-agent/test/web-interaction-broker.spec.mjs create mode 100644 packages/moss-agent/test/web-plugin-hot-reload.spec.mjs create mode 100644 packages/moss-agent/test/web-plugin-lifecycle.spec.mjs create mode 100644 packages/moss-agent/test/web-runtime-service.spec.mjs create mode 100644 packages/moss-agent/test/web-session-service.spec.mjs create mode 100644 packages/moss-agent/test/web-settings-service.spec.mjs create mode 100644 packages/moss-agent/test/web-workbench-capabilities.spec.mjs create mode 100644 packages/moss-agent/web-components-vite.config.mjs create mode 100644 scripts/check-moss-web-tokens.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9801fce4..8261ac2f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,6 +85,31 @@ jobs: - name: Verify API inventory and reports run: npm run api:check + web-visual: + name: Web visual and accessibility + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version: 22.16.0 + cache: npm + + - name: Install + run: npm ci + + - name: Install Chromium + run: npx playwright install --with-deps chromium + + - name: Build Web workspace + run: npm run build -w @rdk-moss/agent + + - name: Run Playwright visual and accessibility gate + run: npm run test:filter -w @rdk-moss/agent -- --filter web-ui-browser + verify: name: Verify (${{ matrix.os }}) runs-on: ${{ matrix.os }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b2dbe0a..12a4044b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,22 @@ Categories: **Added** · **Changed** · **Fixed** · **Removed** · **Internal** ### Added -- **Zero-friction Web workspace**: `moss web` starts a local browser experience with streaming chat, - visible tool evidence, cancellation, and live redacted runtime capabilities without sending model - credentials to the browser. -- **Hardened plugin loading and DeepSeek compatibility**: plugin installs now start disabled, npm - sources are exact-version and lifecycle-script-free, setup health is verified before activation, - concurrent registry writes are serialized, Web contributions require an active runtime plugin, - and an attributed `official:deepseek-harness` Skill can be installed explicitly. +- **Complete local Web workbench**: `moss web` now provides the responsive three-column Moss design + system, durable searchable sessions, resume/rename/export/delete/fork/rewind, cursor-based SSE, + rich conversation and tool evidence, bounded text/image attachments, generated-file downloads, + approval and question takeover, modes/Goal/Todo/queue/steering, jobs/workflows, trajectory and + verdict details, seven consistent settings sections, keyboard/reduced-motion support, and + fixed-viewport Playwright visual/accessibility gates. Provider credentials never enter the + browser, and every mutation requires same-Host, same-Origin, per-server CSRF authorization. +- **Hot-reloadable plugin platform and audited DeepSeek compatibility**: plugins can contribute + tools, Skills, experts, prompts, commands, providers, MCP presets, schema configuration, secrets, + and typed Web slots. Exact-version npm candidates use immutable roots; import/setup/calls run + behind terminable Worker RPC and active-call leases; enable/disable/config changes drain and + atomically retain the last-good composition. The Web settings page and CLI share add/remove/ + enable/disable/list/doctor behavior. Real DeepSeek Harness `package.json + cordis.patch.yml` + packages are inspected without executing Cordis: only an audited `SKILL.md` or explicit Moss + adapter data is mapped, native client/runtime ABI fails closed, and the attributed + `official:deepseek-harness` Skill/command/exact MCP preset remains opt-in. - **Durable Web task history**: Web tasks now receive ordered run identities, persisted tool evidence, honest completion/verification states, restart interruption recovery, and inspectable run-history endpoints. `npm run demo:capabilities` exercises a plugin, inline Skill, read-only diff --git a/docs/README.md b/docs/README.md index d0f6d384..9bb32003 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,6 +28,8 @@ the runtime implements that intent. - [`env-vars.md`](./env-vars.md): environment variables and ownership. - [`deepseek-harness-review.md`](./deepseek-harness-review.md): evidence-based plugin lifecycle lessons, staged Moss adoption, and explicit non-goals. +- [`deepseek-harness-plugin-audit.md`](./deepseek-harness-plugin-audit.md): revision-pinned ecosystem + audit, reusable declarative subset, license evidence, and fail-closed Cordis compatibility rules. ## Evaluation and evolution diff --git a/docs/deepseek-harness-plugin-audit.md b/docs/deepseek-harness-plugin-audit.md new file mode 100644 index 00000000..a40c3e7c --- /dev/null +++ b/docs/deepseek-harness-plugin-audit.md @@ -0,0 +1,56 @@ +# DeepSeek Harness plugin compatibility audit + +Audit date: 2026-08-18. Sources were read directly from GitHub. The official product reference is +[`deepseek-ai/deepseek-harness`](https://github.com/deepseek-ai/deepseek-harness); the ecosystem +inventory is +[`awesome-dsh-plugin/awesome-dsh-plugin`](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin). +At the audited revision the inventory contained 1,247 YAML entries. Its own warning is controlling: +listing means installability and maintenance checks, not a security review. + +## Compatibility rule + +An official DSH bundle targets Cordis, `cordis.patch.yml`, the `@deepseek-ai/dsh-*` host services, +and DSH client slots. Moss uses different runtime and Web contracts. It must therefore never execute +a DSH bundle as if the ABIs were interchangeable. + +Moss imports only declarative contributions that can be mapped without changing their meaning: + +- `SKILL.md` content becomes a Moss Skill with its contained source path recorded; license metadata + remains an audit input and is not synthesized when the package does not declare it. +- MCP server declarations become an explicit Moss MCP preset. +- data-only command templates and JSON Schema configuration become their Moss equivalents. +- native DSH runtime, Cordis service, and client-slot modules are rejected with a precise + compatibility diagnostic. They may be ported deliberately to Moss APIs after source review. + +Installation stays explicit. Imported third-party JavaScript remains trusted code, not sandboxed +code. Moss runs it behind a termination-bounded Worker/RPC lifecycle so import/setup hangs cannot +block the core host, but that boundary is deliberately not described as a permission sandbox. A +catalog entry never grants automatic execution. + +## Reviewed candidates + +| Candidate | License | Decision | Reason | +| ---------------------------------------------- | ------------ | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `HenryZ838978/deepseek-harness` 0.2.0 | MIT | Bundled, disabled by default | Its protocol Skill is host-neutral. Moss also exposes its exact-version `@deepseek-harness/mcp@0.2.0` server as an MCP preset and a `deepseek-protocol` command. | +| `awesome-dsh-plugin/dsh-find-plugin` 0.3.6 | MIT | Do not execute; reuse catalog ideas | It requires `@deepseek-ai/cordis` and `@deepseek-ai/dsh-tools`. Moss plugin discovery must use Moss manifests and explicit installs. | +| `liuyuelintop/dsh-conversation-exporter` 0.2.0 | MIT | Native Moss implementation retained | The DSH client module depends on DSH runtime/conversation slots. Moss now provides server-owned Markdown export, avoiding a parallel exporter. | +| `Anionex/dsh-turn-rewind` 0.1.1 | BSD-3-Clause | Native Moss implementation retained | Its persistent ledger is strong prior art, but its Cordis and DSH client ABI is incompatible. Moss uses its existing conversation/file checkpoints and exposes non-destructive rewind. | +| `AcidGr/dsh-web-mobile-fix` 1.0.2 | MIT | Behavior ported into the Moss design system | The package is a DSH CSS overlay. Moss implements first-class session/details drawers, settings layout, focus containment, and 44 px controls instead of loading a parallel theme. | +| `GooodWei/context-vista` 0.1.0 | MIT | Behavior ported into Moss conversation/details UI | The package requires DSH commands, settings, locale, and conversation services. Moss renders its own durable usage/context projection and `/context` control. | +| `HongMing-Huang/dsh-file-upload` 0.4.2 | MIT | Capability ported behind Moss attachment contracts | Its document conversion is useful prior art, but the plugin depends on DSH Cordis credentials, filesystem, tools, runtime, and React 18. Moss keeps upload security and message persistence in its own host. | + +## Rejected loading patterns + +- A plugin declaring `dsh.bundle.patch` is not sufficient evidence of Moss compatibility. +- The compatibility reader audits the real `package.json + cordis.patch.yml` package shape. Optional + `moss.dsh-adapter.json` is a Moss-owned data adapter, not a native DSH manifest or ABI claim. +- A package with `dsh.client.inject` cannot be mounted into a Moss ShadowRoot by renaming imports. +- Theme or layout plugins cannot inject global CSS; Moss tokens and controlled components remain the + single design system. +- Marketplace or GitHub topic results are never auto-installed. +- Plugins without a verified license, exact source revision, manifest containment, side-effect + metadata, or successful candidate activation remain disabled. + +This audit is repeated before adding a bundled compatibility source. The completion gate verifies +that unsupported DSH bundles fail closed and that accepted Skill/MCP mappings are reversible and +owned by one plugin generation. diff --git a/docs/user-guide/23-runtime-plugins.md b/docs/user-guide/23-runtime-plugins.md index 45b169ea..5072a347 100644 --- a/docs/user-guide/23-runtime-plugins.md +++ b/docs/user-guide/23-runtime-plugins.md @@ -75,13 +75,14 @@ moss plugins disable example/review New plugins are installed **disabled** so installation cannot silently activate executable code. Local paths remain linked to their resolved root. npm sources require an exact semantic version, -install under the Moss config directory, and run with lifecycle scripts disabled. `doctor` executes -the plugin setup transaction against isolated adapters instead of only checking that its module can -be imported, including for disabled entries; `enable` repeats that validation before persisting the -state change. Registry mutations use a cross-process lock so simultaneous CLI/Web updates do not -lose records. Manifest/runtime failures are reported and isolated so the core workbench can still -start. Enable, disable, and remove take effect on the next runtime start; the current Web server -keeps its startup contribution snapshot until shutdown. +install under the Moss config directory, and run with lifecycle scripts disabled. `doctor` performs +containment, manifest, schema, module-resolution, and compatibility checks without executing a +disabled plugin. `enable` performs candidate activation inside the bounded Worker/RPC lifecycle +before publishing the state change. Registry mutations use a cross-process lock so simultaneous +CLI/Web updates do not lose records. Manifest/runtime failures are reported and isolated so the core +workbench can still start. Web enable, disable, and remove drain active calls and publish a new +composition generation without restarting the server; a failed candidate or drain timeout keeps the +last-good generation active. `official:deepseek-harness` is an MIT-licensed compatibility Skill adapted from the independently maintained `HenryZ838978/deepseek-harness` project. It adds protocol guidance for DeepSeek reasoning, @@ -123,10 +124,12 @@ generated host and must not be committed. - A Web contribution must currently be one browser-ready ESM file. Bundle relative and bare imports into that file before publishing; the v1 loopback host does not serve multi-file module graphs. -Dynamic unload while a plugin tool call is still active is not yet an HMR -contract. Hosts should close or drain agent work before unloading a plugin. A -future quiescence layer will gate new calls, abort/drain active leases, and then -release resources. +Dynamic unload gates new calls and waits for active Tool/provider/command leases. A timeout keeps the +old generation active; successful Web enable/disable publishes a composition event and browser asset +URLs carry that generation for cache busting. Installed JavaScript import/setup and later calls run +through a termination-bounded Worker/RPC boundary. This prevents sync/async startup hangs from +blocking the core host, but it is not a permission sandbox and installed code remains user-authorized +trusted code. ## Cordis direction diff --git a/docs/user-guide/24-web-ui.md b/docs/user-guide/24-web-ui.md index 7209fa1b..4bba9145 100644 --- a/docs/user-guide/24-web-ui.md +++ b/docs/user-guide/24-web-ui.md @@ -31,9 +31,23 @@ motion behavior. detail endpoint supports sequence cursors for incremental recovery. - **Settings** exposes Runtime, Models, Permissions, and Plugins using the same controls and density as the conversation surface. Credential values are process-owned and are never returned. - -The server binds to loopback by default, rejects non-local mutation origins, sets a restrictive -Content Security Policy, and never sends provider configuration or credentials to the browser. +- **Sessions** can be searched, resumed, renamed, exported, explicitly deleted, forked, or rewound + into a new non-destructive branch. Draft, scroll, details, and panel state are retained per task. +- **Interaction controls** present approval and user questions in the composer, and expose the same + plan/default/accept-edits policy, Goal, Todo, queue, steering, workflow, job, model, Skill, and + sub-agent inventories owned by the configured runtime. +- **Attachments** upload bounded UTF-8 text or signature-checked images into an instance-local + store. Generated workspace files are copied through a realpath-contained artifact endpoint before + download; a browser-supplied path is never opened as an arbitrary host path. +- **Plugins** can be installed, diagnosed, configured, enabled, disabled, and removed without + restarting the Web server. UI modules receive typed slot ownership and the Moss controlled + component entry instead of defining a parallel theme. + +The server binds to loopback by default. Every mutation requires the exact Host, same Origin, and a +random per-server CSRF token obtained by the bootstrapped same-origin client. It sets a restrictive +Content Security Policy and never sends provider configuration or credential values to the browser. +API keys and plugin secrets are write/delete-only; status responses reveal only whether a value is +configured. ## Long tasks @@ -67,7 +81,12 @@ non-zero if any contribution was not used or if the final answer was not grounde ## Current limits -- Session browsing and restoration are available. Rename, export, confirmed delete, fork, and - non-destructive rewind controls remain planned rather than silently approximated. -- Plugin hot reload is not exposed until active tool-call leases and quiescent unload are complete. - Remote binding and multi-user authentication are intentionally absent from this local-first slice. +- Third-party JavaScript plugins are explicitly trusted code. Worker containment makes a stuck + import/setup/call terminable, but it is not a permissions sandbox; a plugin can still use its Node + process authority and an advanced browser module runs in the same page origin. +- Native DeepSeek Harness Cordis runtime/client modules are not ABI-compatible with Moss. Moss can + import only an audited package's declarative `SKILL.md` or explicit Moss adapter data; unsupported + client slots fail closed. +- The previous compact Web surface remains available at `/?legacy=1` for one release cycle as a + rollback path. It uses the current CSRF/session APIs and will be removed after that window. diff --git a/openspec/changes/add-zero-friction-web-ui/completion-matrix.md b/openspec/changes/add-zero-friction-web-ui/completion-matrix.md new file mode 100644 index 00000000..7d734dec --- /dev/null +++ b/openspec/changes/add-zero-friction-web-ui/completion-matrix.md @@ -0,0 +1,126 @@ +# Moss Web completion matrix + +This matrix is the acceptance source for the DeepSeek Harness parity change. The reference is +`deepseek-ai/deepseek-harness` at commit `47f943859bef60e4160492346772ded9b24f765a`. Reference source +and screenshots are evidence only; Moss keeps its own name, logo, copy, safety explanations, and +implementation. + +The only accepted visible differences are Moss branding, Moss-only capabilities, and safety text +required by Moss. Every other difference needs an explicit entry in this file before release. + +## Reference views + +The visual suite owns three fixed viewports: desktop `1440x960`, narrow desktop `1120x800`, and +tablet `820x1180`. The complete suite covers the empty workbench, active run, expanded tool, +approval, plan, settings, plugin inventory, responsive conversation, component gallery, and modal; +the home shell is captured at all three widths. Reference images live under +`packages/moss-agent/test/visual/reference/deepseek-47f9438/`; Moss baselines live beside them under +`packages/moss-agent/test/visual/baseline/`. + +## Completion rules + +- `implemented` means the production browser path is wired to the real runtime. +- `tested` means a focused unit or HTTP test proves the behavior and a browser test proves the user + path where one exists. +- `verified` means the fixed-viewport visual, keyboard, accessibility, Windows, security, and + isolation gates required by that row pass. +- A row is complete only when all three columns are checked. A green CI run does not waive an + unchecked row. + +## Plan 0 — visual baseline + +| Requirement | Implemented | Tested | Verified | +| ----------------------------------------------------------------------------------- | ----------- | ------ | -------- | +| Reference commit and provenance are pinned | [x] | [x] | [x] | +| Desktop, narrow desktop, and tablet reference captures | [x] | [x] | [x] | +| Empty, running, tool, approval, plan, settings, and plugin fixtures | [x] | [x] | [x] | +| Layout, component, interaction, state, motion, responsive, and keyboard diff report | [x] | [x] | [x] | + +## Plan 1 — design system and shell + +| Requirement | Implemented | Tested | Verified | +| ------------------------------------------------------------------------------------------------------- | ----------- | ------ | -------- | +| React and Vite remain inside `@rdk-moss/agent` | [x] | [x] | [x] | +| Token-owned color, typography, spacing, radius, shadow, layer, width, and state | [x] | [x] | [x] | +| Controlled Button, Input, Menu, Modal, Disclosure, Card, Tabs, Toast, Tooltip, Code, Diff, and Terminal | [x] | [x] | [x] | +| Resizable three-column frame, independent collapse, concession, and persisted layout | [x] | [x] | [x] | +| Mobile session and details drawers | [x] | [x] | [x] | +| Focus, scrollbars, empty, skeleton, offline, toast, and reduced-motion states | [x] | [x] | [x] | +| Internal component gallery route | [x] | [x] | [x] | + +## Plan 2 — sessions and workspaces + +| Requirement | Implemented | Tested | Verified | +| --------------------------------------------------------------------------------------- | ----------- | ------ | -------- | +| Workspace selector, session history/search/new/status/settings | [x] | [x] | [x] | +| Resume, rename, Markdown export, confirmed delete, fork, and non-destructive rewind | [x] | [x] | [x] | +| Per-session draft, scroll, selected detail, and panel state | [x] | [x] | [x] | +| Empty workspace, no session, loading failure, damaged history, and interrupted recovery | [x] | [x] | [x] | + +## Plan 3 — conversation + +| Requirement | Implemented | Tested | Verified | +| ---------------------------------------------------------------------------------- | ----------- | ------ | -------- | +| User, assistant, reasoning, retry, compaction, error, usage, and context meter | [x] | [x] | [x] | +| Markdown, code, table, JSON, diff, terminal, read, edit, search, and Web renderers | [x] | [x] | [x] | +| Tool tree, running/success/failure states, summary, and details | [x] | [x] | [x] | +| Attachments, images, produced files, download, copy, and feedback | [x] | [x] | [x] | +| Durable cursor SSE reconnect and refresh attachment to an active run | [x] | [x] | [x] | + +## Plan 4 — interaction controls + +| Requirement | Implemented | Tested | Verified | +| ----------------------------------------------------------- | ----------- | ------ | -------- | +| Approval and user-question composer takeover | [x] | [x] | [x] | +| Permission preset and plan/default/accept-edits modes | [x] | [x] | [x] | +| Todo, Goal, Queue, and Steering | [x] | [x] | [x] | +| Slash commands, Skill/Subagent mention, and model selection | [x] | [x] | [x] | +| Background jobs and workflow runs | [x] | [x] | [x] | +| Trajectory, execution evidence, and completion-gate verdict | [x] | [x] | [x] | + +## Plan 5 — settings + +| Requirement | Implemented | Tested | Verified | +| ------------------------------------------------------------------------- | ----------- | ------ | -------- | +| General, Models, Permissions, Skills, MCP, Plugins, and Runtime Inventory | [x] | [x] | [x] | +| Shared label, help, dirty, validation, save, and error behavior | [x] | [x] | [x] | +| Write/delete-only API keys and plugin secrets | [x] | [x] | [x] | +| CLI configuration parsing, defaults, and validation are reused | [x] | [x] | [x] | + +## Plan 6 — plugins + +| Requirement | Implemented | Tested | Verified | +| -------------------------------------------------------------------------------------------------- | ----------- | ------ | -------- | +| Manifest v1 with explicit local and exact-version npm install | [x] | [x] | [x] | +| CLI and Web add/remove/enable/disable/list/doctor | [x] | [x] | [x] | +| Tool, Skill, Expert, Prompt, Command, Provider, MCP preset, config, and Web contributions | [x] | [x] | [x] | +| Navigation, session, message, tool, composer, details, and settings slots receive typed owner data | [x] | [x] | [x] | +| JSON Schema settings use Moss controls; advanced UI is token scoped | [x] | [x] | [x] | +| Failure isolation, last-good composition, and core startup survival | [x] | [x] | [x] | + +## Plan 7 — reload and gates + +| Requirement | Implemented | Tested | Verified | +| ------------------------------------------------------------ | ----------- | ------ | -------- | +| Active-call leases and quiescent unload | [x] | [x] | [x] | +| Runtime enable/disable/update and cache-busted client reload | [x] | [x] | [x] | +| Fixed-viewport visual regression gate | [x] | [x] | [x] | +| Built-in, official-plugin, and plugin-template token gate | [x] | [x] | [x] | +| Preview/default switch and one-release legacy rollback | [x] | [x] | [x] | + +## Repository release gate + +Completion additionally requires Playwright user journeys, keyboard and accessibility checks, +HTTP/SSE/plugin lifecycle/security/Windows/dual-instance coverage, focused tests for each slice, a +real browser run, `npm run check`, `npm run verify`, updated API reports and user documentation, and +an `Unreleased` changelog entry. The PR may only be called complete after every row above is checked +and the hosted CI result for the final pushed commit is green. + +## Local verification evidence + +- Plugin lifecycle and DSH compatibility: 10 focused test files passed. +- Web services, security, public API, capabilities, and Playwright: 13 focused test files passed. +- Real smoke: the bundled `official:deepseek-harness` source installed, enabled, passed doctor, + and listed from an isolated config directory; the packaged CLI/PTY smoke passed. +- Full gate: `npm run verify` passed, including 9 core files, 295 agent files, 9 scaffold tests, + API reports, TypeDoc, token/maintainability gates, and browser visual/accessibility coverage. diff --git a/openspec/changes/add-zero-friction-web-ui/design.md b/openspec/changes/add-zero-friction-web-ui/design.md index 98a1501d..10164cd4 100644 --- a/openspec/changes/add-zero-friction-web-ui/design.md +++ b/openspec/changes/add-zero-friction-web-ui/design.md @@ -2,8 +2,9 @@ The host remains a thin adapter over the existing `MossAgent`; it does not create another agent loop. Node's built-in HTTP server owns loopback transport. React and Vite build deterministic browser -assets inside `@rdk-moss/agent`, while the browser bundle remains credential-free. A -newline-delimited event stream avoids a new WebSocket stack and works with `fetch()` cancellation. +assets inside `@rdk-moss/agent`, while the browser bundle remains credential-free. Durable browser +projection uses SSE with monotonic cursors and `Last-Event-ID`; POST requests create work while GET +streams reconnect to it. The UI follows the useful product ideas in DeepSeek Harness—session-first navigation, a responsive three-column frame, visible tool activity, interruptibility, settings, and progressive @@ -13,8 +14,9 @@ plugin surfaces do not form parallel themes. Explicitly installed trusted plugins use `moss.plugin.json` v1 and a config-owned registry. Local paths and npm package specs are user initiated. Manifest/import failures are isolated from core -startup. Enable/disable/remove persists the next composition and requires restart until active-call -leases make hot unload truthful. +startup. A composition generation is prepared and validated before activation. Active-call leases +close admission, drain in-flight calls, and retain the last-good generation if activation or unload +cannot finish safely. Web modules reload against the same generation with cache-busted URLs. The next simplification gate is evidence based: consolidate ACP and Web event projection only after both transports have contract tests, then measure deleted lines and protocol drift. Documentation is diff --git a/openspec/changes/add-zero-friction-web-ui/proposal.md b/openspec/changes/add-zero-friction-web-ui/proposal.md index 3409ec35..120ace02 100644 --- a/openspec/changes/add-zero-friction-web-ui/proposal.md +++ b/openspec/changes/add-zero-friction-web-ui/proposal.md @@ -7,17 +7,21 @@ agent task in a consistent three-column React workbench while seeing streamed re tool calls, evidence, cancellation, sessions, settings, and the live plugin/tool inventory. The browser never receives provider credentials. +The complete acceptance scope is enumerated in +[`completion-matrix.md`](completion-matrix.md); a smaller green test surface is not completion. + ## Non-goals - Copying DeepSeek trademarks, source code, or exact visual assets. - Exposing the server beyond loopback by default. - Replacing the TUI, ACP, or embedding API. -- Claiming HMR before active tool-call quiescence exists. +- Running third-party JavaScript as if it were a security sandbox. Explicitly installed plugins are + trusted code, but failures remain isolated from the core workbench. ## Success evidence -- Built-artifact HTTP integration covers boot, session creation, streaming, tools, cancellation, - invalid input, and loopback binding. +- Built-artifact HTTP integration covers the full session, interaction, settings, plugin, resumable + streaming, cancellation, invalid-input, security, and loopback contracts. - A real browser contract verifies the three-column hierarchy, design tokens, interaction path, and responsive layout at fixed viewport widths. - The existing long-horizon harness and full repository verification remain green. diff --git a/openspec/changes/add-zero-friction-web-ui/visual-parity-audit.md b/openspec/changes/add-zero-friction-web-ui/visual-parity-audit.md new file mode 100644 index 00000000..64d83b75 --- /dev/null +++ b/openspec/changes/add-zero-friction-web-ui/visual-parity-audit.md @@ -0,0 +1,57 @@ +# Moss Web visual parity audit + +Reference: `deepseek-ai/deepseek-harness` commit +`47f943859bef60e4160492346772ded9b24f765a`. The reference was built from source and captured through +its fixture mode. Moss retains its own brand, copy, safety explanations, and implementation. + +## Fixed viewports and fixtures + +| Fixture | Desktop 1440×960 | Narrow 1120×800 | Tablet 820×1180 | Moss assertion | +| --------------- | ---------------------- | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------------------- | +| Empty workbench | `desktop-home.png` | `narrow-home.png` | `tablet-home.png` | Three columns concede in the order details → sidebar → center | +| Active run | `desktop-running.png` | responsive behavior covered by shell fixture | responsive behavior covered by shell fixture | Streaming and interruption remain visible after reconnect | +| Expanded tool | `desktop-tool.png` | responsive behavior covered by shell fixture | responsive behavior covered by shell fixture | Summary stays in the timeline; full evidence opens in details | +| Approval | `desktop-approval.png` | composer takeover covered by interaction fixture | composer takeover covered by interaction fixture | Focus enters the decision panel and returns to composer | +| Plan | `desktop-plan.png` | responsive behavior covered by shell fixture | responsive behavior covered by shell fixture | Mode, todo state, and current step use shared status tokens | +| Settings | `desktop-settings.png` | settings navigation covered by keyboard fixture | settings navigation uses a drawer | Forms share label, help, dirty, validation, and save states | +| Plugins | `desktop-plugins.png` | plugin cards use the narrow grid | plugin cards use the single-column grid | Built-in and extension UI consume the same design system | + +The reference files live in `packages/moss-agent/test/visual/reference/deepseek-47f9438/`. Generated +Moss baselines and pixel diffs live in sibling `baseline/` and `diff/` directories. Reference images +are evidence for composition and interaction, not golden pixels: product branding and text differ, so +the automated gate compares Moss against reviewed Moss baselines while browser assertions compare +the structural rules below against the reference. + +The reviewed Moss set is `desktop-home`, `desktop-running`, `desktop-tool`, `desktop-approval`, +`desktop-plan`, `desktop-settings`, `desktop-plugins`, `narrow-home`, `narrow-conversation`, +`tablet-home`, `tablet-gallery`, and `tablet-gallery-dialog`. The Playwright journey reaches each +state through the real loopback HTTP/SSE, approval, question, attachment, plugin, and layout paths. + +## Parity matrix + +| Surface | Reference behavior | Moss contract | Allowed difference | +| ------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------------------------- | --------------------------------------- | +| Layout | Persistent session rail, flexible conversation, contextual details | `AppFrame` owns widths, resize handles, collapse, concession, and mobile drawers | Moss product mark | +| Typography | Compact sans-serif hierarchy and monospace evidence | Public typography tokens; no component-local font scale | Installed platform font fallback | +| Density | Tight navigation and tool evidence, roomier reading column | Public spacing/control-height tokens | Safety copy may add one explanatory row | +| Shape and elevation | Low-radius controls, bordered cards, restrained overlays | Public radius, border, shadow, and layer tokens | None | +| Color | Neutral work surface with semantic status accents | Theme and semantic-state tokens, including focus and offline | Moss accent hue | +| Navigation | Sidebar tasks/settings and contextual details | Same keyboard order, selected semantics, and responsive concession | Moss-only destinations | +| Conversation | User/assistant blocks, reasoning disclosure, tool tree, usage | Typed timeline nodes and controlled renderers | Moss tool/provider names | +| Composer | Prompt, attachments, modes, pending interaction takeover | One composer state machine; approval/question prevents accidental send | Required permission explanation | +| Settings | Section navigation and consistent forms | Seven stable sections and schema-generated plugin fields | Moss runtime inventory fields | +| Plugin UI | Contributions appear as native surfaces | Stable slots, owner metadata, token-scoped mount root, controlled schema forms | Unsupported Cordis ABI is rejected | +| Feedback | Hover/focus/selected/disabled/loading/streaming/result states | Central component/state tokens and ARIA live regions | None | +| Motion | Short transitions that communicate state | Motion tokens plus `prefers-reduced-motion` suppression | None | +| Keyboard | Logical tab order, visible focus, Escape dismissal | Focus trap/restore, disclosure semantics, skip link, keyboard resize | None | + +## Release checks + +- Component gallery exercises every controlled component and semantic state. +- Playwright executes fixed-viewport screenshots, keyboard-only journeys, responsive drawers, + reconnect, approval/question takeover, settings validation, and plugin reload. +- Accessibility checks reject serious/critical violations and assert status announcements. +- The token scanner rejects hard-coded theme values in built-in client code, bundled plugin UI, and + generated plugin templates. +- Any intentional divergence must be documented in this file and reviewed before its Moss baseline + is updated. diff --git a/package-lock.json b/package-lock.json index 95f97d2f..15e4cda4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@axe-core/playwright": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.13.0.tgz", + "integrity": "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "axe-core": "~4.13.0" + }, + "peerDependencies": { + "playwright-core": ">= 1.0.0" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2191,6 +2204,16 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/pngjs": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", + "integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/proper-lockfile": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz", @@ -2625,6 +2648,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/axe-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -4448,6 +4481,76 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pixelmatch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.2.0.tgz", + "integrity": "sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/playwright": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/postcss": { "version": "8.5.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", @@ -5767,19 +5870,25 @@ "react-dom": "^19.2.8", "string-width": "^8.2.1", "turndown": "^7.2.0", - "undici": "^7.29.0" + "undici": "^7.29.0", + "yaml": "^2.9.0" }, "bin": { "moss": "dist/cli.js" }, "devDependencies": { + "@axe-core/playwright": "^4.13.0", "@types/marked-terminal": "^6.1.1", "@types/micromatch": "^4.0.10", + "@types/pngjs": "^6.0.5", "@types/proper-lockfile": "4.1.4", "@types/react": "^19.2.0", "@types/react-dom": "^19.2.4", "@types/turndown": "^5.0.5", "ink-testing-library": "^4.0.0", + "pixelmatch": "^7.2.0", + "playwright": "^1.62.1", + "pngjs": "^7.0.0", "typescript": "^5.7.3", "vite": "^7.3.6" }, diff --git a/package.json b/package.json index 2734f814..02dc3c3e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "check:pr-title": "node scripts/check-pr-title.mjs", "check:agent-harness-benchmark": "node scripts/check-agent-harness-benchmark.mjs", "check:leaderboard-readiness": "node scripts/check-leaderboard-readiness.mjs", - "check": "npm run format:check && npm run lint && npm run typecheck && npm run check:boundaries && npm run check:hygiene && npm run check:vendored && npm run check:maintainability && npm run test:standards", + "check:moss-web-tokens": "node scripts/check-moss-web-tokens.mjs", + "check": "npm run format:check && npm run lint && npm run typecheck && npm run check:boundaries && npm run check:hygiene && npm run check:vendored && npm run check:moss-web-tokens && npm run check:maintainability && npm run test:standards", "api:check": "npm run build && node scripts/check-api.mjs", "api:update": "npm run build && node scripts/check-api.mjs --update", "smoke:moss-cli": "node scripts/smoke-moss-cli.mjs", diff --git a/packages/moss-agent/API.md b/packages/moss-agent/API.md index 26d6177b..366568a3 100644 --- a/packages/moss-agent/API.md +++ b/packages/moss-agent/API.md @@ -50,8 +50,10 @@ plugin surfaces consume the public `--moss-*` variables rather than introducing `@rdk-moss/agent/runtime` exports `InstalledPluginRegistry` and the `MossPluginManifestV1` contract used by `moss.plugin.json`. These APIs execute explicitly trusted local/npm JavaScript and are not a -sandbox. Enable/disable/remove updates persisted composition for the next runtime start; dynamic -unload remains gated on active-call leases. +sandbox. CLI mutations persist for the next runtime start, while Moss Web applies +enable/disable/remove to the live instance. Tool/provider/command calls use active-call leases; +quiescent unload retains the last-good +composition on timeout, and Moss Web publishes the resulting generation for hot reload. Plugin-owned tool names cannot be replaced accidentally through `ToolRegistry.register()`. A host that intentionally transfers ownership must call the beta `ToolRegistry.replace()` method; diff --git a/packages/moss-agent/CHANGELOG.md b/packages/moss-agent/CHANGELOG.md index b0a417de..ac53b78f 100644 --- a/packages/moss-agent/CHANGELOG.md +++ b/packages/moss-agent/CHANGELOG.md @@ -10,15 +10,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Replaced the inline Web client with an in-package React/Vite three-column workbench, centralized - `--moss-*` design tokens, responsive/reduced-motion behavior, session browsing, richer tool - details, and unified Runtime/Models/Permissions/Plugins settings. -- Added beta `@rdk-moss/agent/web` contracts for stable Web slots, theme tokens, bootstrap/session - DTOs, stream events, and ShadowRoot-scoped plugin module mounting. -- Added `moss.plugin.json` v1 plus `moss plugins add|remove|enable|disable|list|doctor` for explicit - trusted local/npm plugins. Enabled plugins compose during CLI startup; load failures are isolated, - and Web settings expose redacted inventory with restart-gated lifecycle controls. + `--moss-*` design tokens and controlled components, responsive drawers, session search and full + history actions, cursor SSE recovery, rich messages/tools, bounded attachments, interaction and + execution controls, seven unified settings sections, and a one-release `/?legacy=1` rollback. +- Added beta `@rdk-moss/agent/web` contracts for stable typed Web slots/owners, theme tokens, + bootstrap/session DTOs, stream events, and ShadowRoot-scoped plugin mounting through a + same-origin controlled-component browser entry. +- Added `moss.plugin.json` v1 plus CLI and Web add/remove/enable/disable/list/doctor/config controls + for explicit trusted local/exact npm plugins. Terminable Worker RPC, active-call leases, + quiescent hot reload, immutable npm candidates, last-good rollback, redacted write-only secrets, + and plugin-scoped Web modules isolate lifecycle failures without claiming a security sandbox. - Added the opt-in `official:deepseek-harness` plugin, an attributed MIT adaptation that contributes - DeepSeek reasoning, streaming-tool, cache, endpoint, and token-boundary protocol guidance. + DeepSeek protocol guidance, a command, and an exact MCP preset. A data-only compatibility audit + understands real DSH `package.json + cordis.patch.yml` packages, maps only `SKILL.md` or explicit + Moss adapter data, and rejects native Cordis client ABI. - `moss web` now records ordered task runs with tool evidence, persisted restart recovery, and a separate verification state; the browser shows recent run status without claiming that ordinary diff --git a/packages/moss-agent/EXTENDING.md b/packages/moss-agent/EXTENDING.md index b431e430..df69e490 100644 --- a/packages/moss-agent/EXTENDING.md +++ b/packages/moss-agent/EXTENDING.md @@ -156,12 +156,15 @@ and the `adopt-cordis-plugin-spine` OpenSpec change. The CLI also supports explicit trusted-plugin installation with `moss plugins add `. Each package declares `moss.plugin.json` v1; npm sources require an exact version and are installed without lifecycle -scripts. New entries stay disabled until an explicit `enable`. `list`, setup-validating `doctor`, +scripts. New entries stay disabled until an explicit `enable`. `list`, static-validation `doctor`, `enable`, `disable`, and `remove` share the same persisted registry shown by Moss Web. The bundled -`official:deepseek-harness` source demonstrates an attributed, Skill-only plugin. Browser -contributions register only into stable slots, use the `@rdk-moss/agent/web` token contract, and are -served only after their runtime plugin activates. Runtime changes require restart until active-call -leases and quiescent unload are implemented. +`official:deepseek-harness` source demonstrates an attributed Skill, command, and exact-version MCP +preset. Browser contributions register only into stable slots, use the `@rdk-moss/agent/web` token contract, and are +served only after their runtime plugin activates. Tool/provider/command calls hold active-call +leases; Web enable/disable drains them, retains the last-good generation on timeout or candidate +failure, and publishes a new composition generation without requiring restart. Installed JavaScript +executes in a termination-bounded Worker/RPC boundary, which protects startup from hangs but is not a +permission sandbox. ## 4. Slash commands — `.moss/commands/*.md` diff --git a/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs b/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs index 8667730e..772f3a28 100644 --- a/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs +++ b/packages/moss-agent/assets/plugins/deepseek-harness/plugin.mjs @@ -33,5 +33,27 @@ export default { updatedAt: 0, body, }); + context.registerCommand({ + id: 'deepseek-protocol', + title: 'Apply DeepSeek protocol guidance', + description: + 'Inject the reviewed DeepSeek V4 reasoning, streaming, token, cache, and tool-loop rules.', + expand(args) { + const task = args.trim(); + return [ + 'Apply the installed deepseek-harness skill and its protocol checks to this request.', + task || 'Inspect the active DeepSeek provider integration and report protocol risks.', + ].join('\n\n'); + }, + }); + context.registerMcpPreset({ + id: 'deepseek-harness', + displayName: 'DeepSeek Harness protocol tools', + server: { + command: 'npx', + args: ['-y', '@deepseek-harness/mcp@0.2.0'], + requestTimeoutMs: 30_000, + }, + }); }, }; diff --git a/packages/moss-agent/etc/channels.api.md b/packages/moss-agent/etc/channels.api.md index 7e6c9e1d..507b65b5 100644 --- a/packages/moss-agent/etc/channels.api.md +++ b/packages/moss-agent/etc/channels.api.md @@ -1127,7 +1127,7 @@ interface MicroCompactConfig { } // @beta -export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.session", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1241,6 +1241,8 @@ class MossAgent { // // (undocumented) setGoal(sessionKey: string, objective: string): Promise; + // @beta + setUserQuestionAsker(asker: NonNullable): () => void; // Warning: (ae-forgotten-export) The symbol "SpawnProfileRegistry" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1469,6 +1471,10 @@ export interface MossErrorOutcome { // @beta interface MossPlugin { + // @internal + readonly config?: Readonly>; + // @internal + readonly disposeCandidate?: MossPluginDisposer; // (undocumented) readonly id: string; // Warning: (ae-forgotten-export) The symbol "MossPluginContext" needs to be exported by the entry point index.d.ts @@ -1477,8 +1483,24 @@ interface MossPlugin { setup(context: MossPluginContext): void | MossPluginDisposer | Promise; } +// @beta +type MossPluginCallState = 'accepting' | 'draining' | 'disposed'; + +// @beta +interface MossPluginCommand { + // (undocumented) + readonly description?: string; + // (undocumented) + expand(args: string): string | Promise; + // (undocumented) + readonly id: string; + // (undocumented) + readonly title: string; +} + // @beta interface MossPluginCompositionSnapshot { + readonly generation: number; // Warning: (ae-forgotten-export) The symbol "MossPluginSnapshot" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1489,10 +1511,23 @@ interface MossPluginCompositionSnapshot { interface MossPluginContext { // (undocumented) addPromptLayer(layer: string): void; + readonly config: Readonly>; // (undocumented) effect(setup: () => MossPluginDisposer | Promise, label?: string): void; + // Warning: (ae-forgotten-export) The symbol "MossPluginCommand" needs to be exported by the entry point index.d.ts + // + // (undocumented) + registerCommand(command: MossPluginCommand): void; // (undocumented) registerExpert(expert: SubagentExpertDefinition): void; + // Warning: (ae-forgotten-export) The symbol "MossPluginMcpPreset" needs to be exported by the entry point index.d.ts + // + // (undocumented) + registerMcpPreset(preset: MossPluginMcpPreset): void; + // Warning: (ae-forgotten-export) The symbol "MossPluginProvider" needs to be exported by the entry point index.d.ts + // + // (undocumented) + registerProvider(provider: MossPluginProvider): void; // Warning: (ae-forgotten-export) The symbol "SkillMeta" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1508,8 +1543,10 @@ export type MossPluginDisposer = () => void | Promise; // @beta interface MossPluginHandle { + // Warning: (ae-forgotten-export) The symbol "MossPluginUnloadOptions" needs to be exported by the entry point index.d.ts + // // (undocumented) - dispose(): Promise; + dispose(options?: MossPluginUnloadOptions): Promise; // (undocumented) readonly id: string; // Warning: (ae-forgotten-export) The symbol "MossPluginState" needs to be exported by the entry point index.d.ts @@ -1520,10 +1557,29 @@ interface MossPluginHandle { // @beta export interface MossPluginHost { + // @internal + activateMcpPreset(id: string, setup: (preset: MossPluginMcpPreset) => Promise<{ + readonly value: T; + readonly dispose: MossPluginDisposer; + }>): Promise; // (undocumented) close(): Promise; + // Warning: (ae-forgotten-export) The symbol "LLMProvider" needs to be exported by the entry point index.d.ts + // + // (undocumented) + createProvider(id: string, config: Readonly>): Promise; + // (undocumented) + expandCommand(id: string, args: string): Promise; + // (undocumented) + getCommand(id: string): MossPluginCommand | undefined; + // (undocumented) + getMcpPreset(id: string): MossPluginMcpPreset | undefined; // @internal (undocumented) getPromptLayers(): readonly string[]; + // (undocumented) + getProvider(id: string): MossPluginProvider | undefined; + // (undocumented) + getWebContributions(): readonly MossWebContribution[]; // Warning: (ae-forgotten-export) The symbol "MossPluginCompositionSnapshot" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1533,14 +1589,54 @@ export interface MossPluginHost { // // (undocumented) install(plugin: MossPlugin): Promise; + // (undocumented) + listCommands(): readonly MossPluginCommand[]; + // (undocumented) + listMcpPresets(): readonly MossPluginMcpPreset[]; + // (undocumented) + listProviders(): readonly MossPluginProvider[]; // @internal (undocumented) own(dispose: MossPluginDisposer, label: string): void; // (undocumented) - unload(id: string): Promise; + subscribe(listener: (snapshot: MossPluginCompositionSnapshot) => void): MossPluginDisposer; + // (undocumented) + unload(id: string, options?: MossPluginUnloadOptions): Promise; +} + +// @beta +interface MossPluginMcpPreset { + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; + // (undocumented) + readonly server: { + readonly command: string; + readonly args?: readonly string[]; + readonly env?: Readonly>; + readonly cwd?: string; + readonly requestTimeoutMs?: number; + }; +} + +// @beta +interface MossPluginProvider { + // (undocumented) + create(config: Readonly>): LLMProvider | Promise; + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; } // @beta interface MossPluginSnapshot { + // Warning: (ae-forgotten-export) The symbol "MossPluginCallState" needs to be exported by the entry point index.d.ts + // + // (undocumented) + readonly callState: MossPluginCallState; + // (undocumented) + readonly commands: readonly string[]; // (undocumented) readonly effectLabels: readonly string[]; // (undocumented) @@ -1548,8 +1644,12 @@ interface MossPluginSnapshot { // (undocumented) readonly id: string; // (undocumented) + readonly mcpPresets: readonly string[]; + // (undocumented) readonly promptLayerCount: number; // (undocumented) + readonly providers: readonly string[]; + // (undocumented) readonly skills: readonly string[]; // (undocumented) readonly state: MossPluginState; @@ -1562,6 +1662,11 @@ interface MossPluginSnapshot { // @beta type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +interface MossPluginUnloadOptions { + readonly timeoutMs?: number; +} + // @beta export interface MossWebContribution { // (undocumented) @@ -1847,8 +1952,6 @@ interface ProviderConfig { api?: string; // (undocumented) llmExtraBody?: Record; - // Warning: (ae-forgotten-export) The symbol "LLMProvider" needs to be exported by the entry point index.d.ts - // // (undocumented) llmProvider: LLMProvider; // (undocumented) @@ -2525,6 +2628,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -2760,9 +2864,9 @@ interface VendorPluginCallbacks { // Warnings were encountered during analysis: // // src/context/pruning.ts:77:3 - (ae-forgotten-export) The symbol "ContextPruningToolMatch" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:589:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:670:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:584:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:665:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/context.api.md b/packages/moss-agent/etc/context.api.md index a78a0818..53274cd0 100644 --- a/packages/moss-agent/etc/context.api.md +++ b/packages/moss-agent/etc/context.api.md @@ -738,6 +738,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -860,7 +861,7 @@ export function truncateToolOutput(toolName: string, output: string): string; // Warnings were encountered during analysis: // // src/context/compaction.ts:784:3 - (ae-forgotten-export) The symbol "Message" needs to be exported by the entry point index.d.ts -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/core.api.md b/packages/moss-agent/etc/core.api.md index 588e02a9..6b98a363 100644 --- a/packages/moss-agent/etc/core.api.md +++ b/packages/moss-agent/etc/core.api.md @@ -2377,7 +2377,7 @@ interface Model { type ModelBridgeConfig = Pick; // @beta -export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.session", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -2476,6 +2476,8 @@ export class MossAgent { sessionEvents(sessionKey: string): readonly SessionEvent[]; // (undocumented) setGoal(sessionKey: string, objective: string): Promise; + // @beta + setUserQuestionAsker(asker: NonNullable): () => void; // (undocumented) readonly spawnRegistry: SpawnProfileRegistry; // (undocumented) @@ -2706,14 +2708,34 @@ export interface MossErrorOutcome { // @beta export interface MossPlugin { + // @internal + readonly config?: Readonly>; + // @internal + readonly disposeCandidate?: MossPluginDisposer; // (undocumented) readonly id: string; // (undocumented) setup(context: MossPluginContext): void | MossPluginDisposer | Promise; } +// @beta +export type MossPluginCallState = 'accepting' | 'draining' | 'disposed'; + +// @beta +export interface MossPluginCommand { + // (undocumented) + readonly description?: string; + // (undocumented) + expand(args: string): string | Promise; + // (undocumented) + readonly id: string; + // (undocumented) + readonly title: string; +} + // @beta export interface MossPluginCompositionSnapshot { + readonly generation: number; // (undocumented) readonly plugins: readonly MossPluginSnapshot[]; } @@ -2722,11 +2744,18 @@ export interface MossPluginCompositionSnapshot { export interface MossPluginContext { // (undocumented) addPromptLayer(layer: string): void; + readonly config: Readonly>; // (undocumented) effect(setup: () => MossPluginDisposer | Promise, label?: string): void; // (undocumented) + registerCommand(command: MossPluginCommand): void; + // (undocumented) registerExpert(expert: SubagentExpertDefinition): void; // (undocumented) + registerMcpPreset(preset: MossPluginMcpPreset): void; + // (undocumented) + registerProvider(provider: MossPluginProvider): void; + // (undocumented) registerSkill(skill: SkillMeta): void; // (undocumented) registerTool(tool: Tool): void; @@ -2740,7 +2769,7 @@ export type MossPluginDisposer = () => void | Promise; // @beta export interface MossPluginHandle { // (undocumented) - dispose(): Promise; + dispose(options?: MossPluginUnloadOptions): Promise; // (undocumented) readonly id: string; // (undocumented) @@ -2749,22 +2778,77 @@ export interface MossPluginHandle { // @beta export interface MossPluginHost { + // @internal + activateMcpPreset(id: string, setup: (preset: MossPluginMcpPreset) => Promise<{ + readonly value: T; + readonly dispose: MossPluginDisposer; + }>): Promise; // (undocumented) close(): Promise; + // (undocumented) + createProvider(id: string, config: Readonly>): Promise; + // (undocumented) + expandCommand(id: string, args: string): Promise; + // (undocumented) + getCommand(id: string): MossPluginCommand | undefined; + // (undocumented) + getMcpPreset(id: string): MossPluginMcpPreset | undefined; // @internal (undocumented) getPromptLayers(): readonly string[]; // (undocumented) + getProvider(id: string): MossPluginProvider | undefined; + // (undocumented) + getWebContributions(): readonly MossWebContribution[]; + // (undocumented) inspect(): MossPluginCompositionSnapshot; // (undocumented) install(plugin: MossPlugin): Promise; + // (undocumented) + listCommands(): readonly MossPluginCommand[]; + // (undocumented) + listMcpPresets(): readonly MossPluginMcpPreset[]; + // (undocumented) + listProviders(): readonly MossPluginProvider[]; // @internal (undocumented) own(dispose: MossPluginDisposer, label: string): void; // (undocumented) - unload(id: string): Promise; + subscribe(listener: (snapshot: MossPluginCompositionSnapshot) => void): MossPluginDisposer; + // (undocumented) + unload(id: string, options?: MossPluginUnloadOptions): Promise; +} + +// @beta +export interface MossPluginMcpPreset { + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; + // (undocumented) + readonly server: { + readonly command: string; + readonly args?: readonly string[]; + readonly env?: Readonly>; + readonly cwd?: string; + readonly requestTimeoutMs?: number; + }; +} + +// @beta +export interface MossPluginProvider { + // (undocumented) + create(config: Readonly>): LLMProvider | Promise; + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; } // @beta export interface MossPluginSnapshot { + // (undocumented) + readonly callState: MossPluginCallState; + // (undocumented) + readonly commands: readonly string[]; // (undocumented) readonly effectLabels: readonly string[]; // (undocumented) @@ -2772,8 +2856,12 @@ export interface MossPluginSnapshot { // (undocumented) readonly id: string; // (undocumented) + readonly mcpPresets: readonly string[]; + // (undocumented) readonly promptLayerCount: number; // (undocumented) + readonly providers: readonly string[]; + // (undocumented) readonly skills: readonly string[]; // (undocumented) readonly state: MossPluginState; @@ -2786,6 +2874,11 @@ export interface MossPluginSnapshot { // @beta export type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +export interface MossPluginUnloadOptions { + readonly timeoutMs?: number; +} + // @beta export interface MossWebContribution { // (undocumented) @@ -4580,6 +4673,7 @@ export interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -5012,14 +5106,14 @@ export function wrapToolWithAbortSignal(tool: Tool, runSignal: AbortSignal // Warnings were encountered during analysis: // // src/context/pruning.ts:77:3 - (ae-forgotten-export) The symbol "ContextPruningToolMatch" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:589:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:670:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:584:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:665:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts // src/core/llm/summarization-strategy.ts:37:7 - (ae-forgotten-export) The symbol "PruneResult" needs to be exported by the entry point index.d.ts // src/core/llm/summarization-strategy.ts:79:3 - (ae-forgotten-export) The symbol "SummarizeFn" needs to be exported by the entry point index.d.ts // src/core/loop/agent-loop-types.ts:148:5 - (ae-forgotten-export) The symbol "AgentLoopLlmUsage" needs to be exported by the entry point index.d.ts // src/core/tools/objective-verifier-hook.ts:65:22 - (ae-forgotten-export) The symbol "DeviceReadonlyExecutor" needs to be exported by the entry point index.d.ts // src/core/tools/objective-verifier-hook.ts:77:20 - (ae-forgotten-export) The symbol "Plan" needs to be exported by the entry point index.d.ts -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // src/provider/pi-ai-types.ts:133:50 - (ae-forgotten-export) The symbol "AssistantMessage" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/eval.api.md b/packages/moss-agent/etc/eval.api.md index ca8166d1..94bdfd0d 100644 --- a/packages/moss-agent/etc/eval.api.md +++ b/packages/moss-agent/etc/eval.api.md @@ -566,6 +566,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -677,7 +678,7 @@ export const toolUsageMetric: MetricFn; // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/mcp.api.md b/packages/moss-agent/etc/mcp.api.md index 965650fc..0aa3f209 100644 --- a/packages/moss-agent/etc/mcp.api.md +++ b/packages/moss-agent/etc/mcp.api.md @@ -213,6 +213,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -319,7 +320,7 @@ type ToolSideEffectClass = 'readonly' | 'local_write' | 'device_mutation' | 'cre // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/mesh.api.md b/packages/moss-agent/etc/mesh.api.md index d63b34d3..7016fc52 100644 --- a/packages/moss-agent/etc/mesh.api.md +++ b/packages/moss-agent/etc/mesh.api.md @@ -495,6 +495,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -601,7 +602,7 @@ type ToolSideEffectClass = 'readonly' | 'local_write' | 'device_mutation' | 'cre // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // src/mesh/agent-mesh.ts:304:40 - (ae-forgotten-export) The symbol "HostAddressResolver" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/plan-execute.api.md b/packages/moss-agent/etc/plan-execute.api.md index 3ec01a63..5e3d597b 100644 --- a/packages/moss-agent/etc/plan-execute.api.md +++ b/packages/moss-agent/etc/plan-execute.api.md @@ -503,6 +503,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -609,7 +610,7 @@ type ToolSideEffectClass = 'readonly' | 'local_write' | 'device_mutation' | 'cre // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/root.api.md b/packages/moss-agent/etc/root.api.md index 391870ac..cdd98f22 100644 --- a/packages/moss-agent/etc/root.api.md +++ b/packages/moss-agent/etc/root.api.md @@ -4280,7 +4280,7 @@ export const MOSS_CLI_IDENTITY: string; export const MOSS_DEFAULT_MAX_AGENT_TURNS = 64; // @beta -export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.session", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -4377,6 +4377,8 @@ export class MossAgent { sessionEvents(sessionKey: string): readonly SessionEvent[]; // (undocumented) setGoal(sessionKey: string, objective: string): Promise; + // @beta + setUserQuestionAsker(asker: NonNullable): () => void; // (undocumented) readonly spawnRegistry: SpawnProfileRegistry; // (undocumented) @@ -4770,14 +4772,34 @@ export interface MossErrorOutcome { // @beta export interface MossPlugin { + // @internal + readonly config?: Readonly>; + // @internal + readonly disposeCandidate?: MossPluginDisposer; // (undocumented) readonly id: string; // (undocumented) setup(context: MossPluginContext): void | MossPluginDisposer | Promise; } +// @beta +export type MossPluginCallState = 'accepting' | 'draining' | 'disposed'; + +// @beta +export interface MossPluginCommand { + // (undocumented) + readonly description?: string; + // (undocumented) + expand(args: string): string | Promise; + // (undocumented) + readonly id: string; + // (undocumented) + readonly title: string; +} + // @beta export interface MossPluginCompositionSnapshot { + readonly generation: number; // (undocumented) readonly plugins: readonly MossPluginSnapshot[]; } @@ -4786,11 +4808,18 @@ export interface MossPluginCompositionSnapshot { export interface MossPluginContext { // (undocumented) addPromptLayer(layer: string): void; + readonly config: Readonly>; // (undocumented) effect(setup: () => MossPluginDisposer | Promise, label?: string): void; // (undocumented) + registerCommand(command: MossPluginCommand): void; + // (undocumented) registerExpert(expert: SubagentExpertDefinition): void; // (undocumented) + registerMcpPreset(preset: MossPluginMcpPreset): void; + // (undocumented) + registerProvider(provider: MossPluginProvider): void; + // (undocumented) registerSkill(skill: SkillMeta): void; // (undocumented) registerTool(tool: Tool): void; @@ -4804,7 +4833,7 @@ export type MossPluginDisposer = () => void | Promise; // @beta export interface MossPluginHandle { // (undocumented) - dispose(): Promise; + dispose(options?: MossPluginUnloadOptions): Promise; // (undocumented) readonly id: string; // (undocumented) @@ -4813,22 +4842,77 @@ export interface MossPluginHandle { // @beta export interface MossPluginHost { + // @internal + activateMcpPreset(id: string, setup: (preset: MossPluginMcpPreset) => Promise<{ + readonly value: T; + readonly dispose: MossPluginDisposer; + }>): Promise; // (undocumented) close(): Promise; + // (undocumented) + createProvider(id: string, config: Readonly>): Promise; + // (undocumented) + expandCommand(id: string, args: string): Promise; + // (undocumented) + getCommand(id: string): MossPluginCommand | undefined; + // (undocumented) + getMcpPreset(id: string): MossPluginMcpPreset | undefined; // @internal (undocumented) getPromptLayers(): readonly string[]; // (undocumented) + getProvider(id: string): MossPluginProvider | undefined; + // (undocumented) + getWebContributions(): readonly MossWebContribution[]; + // (undocumented) inspect(): MossPluginCompositionSnapshot; // (undocumented) install(plugin: MossPlugin): Promise; + // (undocumented) + listCommands(): readonly MossPluginCommand[]; + // (undocumented) + listMcpPresets(): readonly MossPluginMcpPreset[]; + // (undocumented) + listProviders(): readonly MossPluginProvider[]; // @internal (undocumented) own(dispose: MossPluginDisposer, label: string): void; // (undocumented) - unload(id: string): Promise; + subscribe(listener: (snapshot: MossPluginCompositionSnapshot) => void): MossPluginDisposer; + // (undocumented) + unload(id: string, options?: MossPluginUnloadOptions): Promise; +} + +// @beta +export interface MossPluginMcpPreset { + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; + // (undocumented) + readonly server: { + readonly command: string; + readonly args?: readonly string[]; + readonly env?: Readonly>; + readonly cwd?: string; + readonly requestTimeoutMs?: number; + }; +} + +// @beta +export interface MossPluginProvider { + // (undocumented) + create(config: Readonly>): LLMProvider | Promise; + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; } // @beta export interface MossPluginSnapshot { + // (undocumented) + readonly callState: MossPluginCallState; + // (undocumented) + readonly commands: readonly string[]; // (undocumented) readonly effectLabels: readonly string[]; // (undocumented) @@ -4836,8 +4920,12 @@ export interface MossPluginSnapshot { // (undocumented) readonly id: string; // (undocumented) + readonly mcpPresets: readonly string[]; + // (undocumented) readonly promptLayerCount: number; // (undocumented) + readonly providers: readonly string[]; + // (undocumented) readonly skills: readonly string[]; // (undocumented) readonly state: MossPluginState; @@ -4850,6 +4938,11 @@ export interface MossPluginSnapshot { // @beta export type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +export interface MossPluginUnloadOptions { + readonly timeoutMs?: number; +} + // Warning: (ae-missing-release-tag) "MossRuntime" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -7812,6 +7905,7 @@ export interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -8685,9 +8779,9 @@ export function writeMossCommunityAuthSession(session: MossCommunityAuthSession, // src/cli/community-auth.ts:694:5 - (ae-forgotten-export) The symbol "FetchImpl" needs to be exported by the entry point index.d.ts // src/cli/model-catalog.ts:62:17 - (ae-forgotten-export) The symbol "CustomModelConfig" needs to be exported by the entry point index.d.ts // src/context/pruning.ts:77:3 - (ae-forgotten-export) The symbol "ContextPruningToolMatch" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:589:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:670:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:584:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:665:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // src/memory/recovery-recipe-log.ts:162:3 - (ae-forgotten-export) The symbol "LearningEvent" needs to be exported by the entry point index.d.ts // src/memory/recovery-recipe-log.ts:163:3 - (ae-forgotten-export) The symbol "ExperienceEntry" needs to be exported by the entry point index.d.ts // src/memory/trusted-patch-coordinator.ts:53:7 - (ae-forgotten-export) The symbol "LearningEventLog" needs to be exported by the entry point index.d.ts diff --git a/packages/moss-agent/etc/runtime.api.md b/packages/moss-agent/etc/runtime.api.md index 656e62e5..a5eedfe8 100644 --- a/packages/moss-agent/etc/runtime.api.md +++ b/packages/moss-agent/etc/runtime.api.md @@ -572,6 +572,22 @@ interface DistillResult { score: SkillScoreResult; } +// @beta +export interface DshPackageCompatibilityReport { + // (undocumented) + readonly compatible: boolean; + // (undocumented) + readonly id?: string; + // (undocumented) + readonly imported: readonly string[]; + // (undocumented) + readonly reasons: readonly string[]; + // (undocumented) + readonly skipped: readonly string[]; + // (undocumented) + readonly version?: string; +} + // Warning: (ae-missing-release-tag) "EnqueueOpts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -771,6 +787,19 @@ interface GoalState { // @public (undocumented) type GoalStatus = 'active' | 'paused' | 'completed' | 'blocked'; +// @beta +export function importDshPackage(source: string): Promise; + +// @beta +export interface ImportedDshPackage { + // (undocumented) + readonly configSchema?: MossPluginConfigSchema; + // (undocumented) + readonly plugin: MossPlugin; + // (undocumented) + readonly report: DshPackageCompatibilityReport; +} + // Warning: (ae-missing-release-tag) "InputGuardrailDecision" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -796,14 +825,32 @@ interface InputGuardrailRequest { userMessage: string; } +// @beta +export function inspectDshPackageCompatibility(source: string): Promise; + // @beta export interface InstalledMossPlugin { // (undocumented) readonly enabled: boolean; + readonly format?: 'moss-v1' | 'dsh-package-v1'; // (undocumented) readonly id: string; // (undocumented) readonly installedAt: string; + // Warning: (ae-forgotten-export) The symbol "InstalledMossPluginVersion" needs to be exported by the entry point index.d.ts + readonly lastGood?: InstalledMossPluginVersion; + // (undocumented) + readonly root: string; + // (undocumented) + readonly source: string; + // (undocumented) + readonly version: string; +} + +// @beta +interface InstalledMossPluginVersion { + // (undocumented) + readonly format?: 'moss-v1' | 'dsh-package-v1'; // (undocumented) readonly root: string; // (undocumented) @@ -827,14 +874,19 @@ export class InstalledPluginRegistry { list(): Promise; // (undocumented) loadEnabled(): Promise; + loadInstalled(id: string, options?: { + readonly config?: Readonly>; + }): Promise; // (undocumented) remove(id: string): Promise; + rollback(id: string): Promise; } // @beta export interface InstalledPluginRegistryOptions { // (undocumented) readonly configDir: string; + readonly setupTimeoutMs?: number; } // Warning: (ae-missing-release-tag) "KnowledgeRegistry" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1081,6 +1133,7 @@ export interface LoadedMossPlugins { readonly failures: readonly { id: string; message: string; + recovered?: boolean; }[]; // (undocumented) readonly plugins: readonly MossPlugin[]; @@ -1254,7 +1307,7 @@ interface MicroCompactConfig { } // @beta -export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.session", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; // Warning: (ae-missing-release-tag) "MossAgent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1368,6 +1421,8 @@ class MossAgent { // // (undocumented) setGoal(sessionKey: string, objective: string): Promise; + // @beta + setUserQuestionAsker(asker: NonNullable): () => void; // Warning: (ae-forgotten-export) The symbol "SpawnProfileRegistry" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1639,26 +1694,96 @@ export interface MossErrorOutcome { // @beta export interface MossPlugin { + // @internal + readonly config?: Readonly>; + // @internal + readonly disposeCandidate?: MossPluginDisposer; // (undocumented) readonly id: string; // (undocumented) setup(context: MossPluginContext): void | MossPluginDisposer | Promise; } +// @beta +export type MossPluginCallState = 'accepting' | 'draining' | 'disposed'; + +// @beta +export interface MossPluginCommand { + // (undocumented) + readonly description?: string; + // (undocumented) + expand(args: string): string | Promise; + // (undocumented) + readonly id: string; + // (undocumented) + readonly title: string; +} + // @beta export interface MossPluginCompositionSnapshot { + readonly generation: number; // (undocumented) readonly plugins: readonly MossPluginSnapshot[]; } +// @beta +export interface MossPluginConfigPropertySchema extends MossPluginJsonSchema { + readonly writeOnly?: boolean; +} + +// @beta +export interface MossPluginConfigSchema extends MossPluginJsonSchema { + // (undocumented) + readonly properties?: Readonly>; + // (undocumented) + readonly type: 'object'; +} + +// @beta +export class MossPluginConfigStore { + constructor(options: MossPluginConfigStoreOptions); + deleteSecret(pluginId: string, schema: MossPluginConfigSchema, name: string): Promise; + getView(pluginId: string, schema: MossPluginConfigSchema): Promise; + loadRuntimeConfig(pluginId: string, schema: MossPluginConfigSchema): Promise>>; + putSecret(pluginId: string, schema: MossPluginConfigSchema, name: string, value: unknown): Promise; + // @internal + remove(pluginId: string): Promise; + // @internal + replaceRuntimeConfig(pluginId: string, schema: MossPluginConfigSchema, replacement: Readonly>): Promise; + update(pluginId: string, schema: MossPluginConfigSchema, patch: Readonly>): Promise; +} + +// @beta +export interface MossPluginConfigStoreOptions { + // (undocumented) + readonly configDir: string; +} + +// @beta +export interface MossPluginConfigView { + // (undocumented) + readonly secrets: Readonly>; + // (undocumented) + readonly values: Readonly>; +} + // @beta export interface MossPluginContext { // (undocumented) addPromptLayer(layer: string): void; + readonly config: Readonly>; // (undocumented) effect(setup: () => MossPluginDisposer | Promise, label?: string): void; // (undocumented) + registerCommand(command: MossPluginCommand): void; + // (undocumented) registerExpert(expert: SubagentExpertDefinition): void; + // (undocumented) + registerMcpPreset(preset: MossPluginMcpPreset): void; + // (undocumented) + registerProvider(provider: MossPluginProvider): void; // Warning: (ae-forgotten-export) The symbol "SkillMeta" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1685,7 +1810,7 @@ export interface MossPluginDoctorResult { // @beta export interface MossPluginHandle { // (undocumented) - dispose(): Promise; + dispose(options?: MossPluginUnloadOptions): Promise; // (undocumented) readonly id: string; // (undocumented) @@ -1694,18 +1819,107 @@ export interface MossPluginHandle { // @beta export interface MossPluginHost { + // @internal + activateMcpPreset(id: string, setup: (preset: MossPluginMcpPreset) => Promise<{ + readonly value: T; + readonly dispose: MossPluginDisposer; + }>): Promise; // (undocumented) close(): Promise; + // Warning: (ae-forgotten-export) The symbol "LLMProvider" needs to be exported by the entry point index.d.ts + // + // (undocumented) + createProvider(id: string, config: Readonly>): Promise; + // (undocumented) + expandCommand(id: string, args: string): Promise; + // (undocumented) + getCommand(id: string): MossPluginCommand | undefined; + // (undocumented) + getMcpPreset(id: string): MossPluginMcpPreset | undefined; // @internal (undocumented) getPromptLayers(): readonly string[]; // (undocumented) + getProvider(id: string): MossPluginProvider | undefined; + // (undocumented) + getWebContributions(): readonly MossWebContribution[]; + // (undocumented) inspect(): MossPluginCompositionSnapshot; // (undocumented) install(plugin: MossPlugin): Promise; + // (undocumented) + listCommands(): readonly MossPluginCommand[]; + // (undocumented) + listMcpPresets(): readonly MossPluginMcpPreset[]; + // (undocumented) + listProviders(): readonly MossPluginProvider[]; // @internal (undocumented) own(dispose: MossPluginDisposer, label: string): void; // (undocumented) - unload(id: string): Promise; + subscribe(listener: (snapshot: MossPluginCompositionSnapshot) => void): MossPluginDisposer; + // (undocumented) + unload(id: string, options?: MossPluginUnloadOptions): Promise; +} + +// @beta +export interface MossPluginJsonSchema { + // (undocumented) + $defs?: Record; + // (undocumented) + $ref?: string; + // (undocumented) + additionalProperties?: boolean | MossPluginJsonSchema; + // (undocumented) + allOf?: MossPluginJsonSchema[]; + // (undocumented) + anyOf?: MossPluginJsonSchema[]; + // (undocumented) + const?: unknown; + // (undocumented) + default?: unknown; + // (undocumented) + definitions?: Record; + // (undocumented) + description?: string; + // (undocumented) + else?: MossPluginJsonSchema; + // (undocumented) + enum?: unknown[]; + // (undocumented) + format?: string; + // (undocumented) + if?: MossPluginJsonSchema; + // (undocumented) + items?: MossPluginJsonSchema | MossPluginJsonSchema[]; + // (undocumented) + maximum?: number; + // (undocumented) + maxItems?: number; + // (undocumented) + maxLength?: number; + // (undocumented) + minimum?: number; + // (undocumented) + minItems?: number; + // (undocumented) + minLength?: number; + // (undocumented) + not?: MossPluginJsonSchema; + // (undocumented) + oneOf?: MossPluginJsonSchema[]; + // (undocumented) + pattern?: string; + // (undocumented) + properties?: Record; + // (undocumented) + required?: string[]; + // (undocumented) + then?: MossPluginJsonSchema; + // (undocumented) + title?: string; + // (undocumented) + type?: string | string[]; + // (undocumented) + uniqueItems?: boolean; } // @beta @@ -1724,6 +1938,32 @@ export interface MossPluginManifestV1 { readonly web?: MossPluginWebManifest; } +// @beta +export interface MossPluginMcpPreset { + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; + // (undocumented) + readonly server: { + readonly command: string; + readonly args?: readonly string[]; + readonly env?: Readonly>; + readonly cwd?: string; + readonly requestTimeoutMs?: number; + }; +} + +// @beta +export interface MossPluginProvider { + // (undocumented) + create(config: Readonly>): LLMProvider | Promise; + // (undocumented) + readonly displayName: string; + // (undocumented) + readonly id: string; +} + // @beta export interface MossPluginRuntimeManifest { // (undocumented) @@ -1734,6 +1974,10 @@ export interface MossPluginRuntimeManifest { // @beta export interface MossPluginSnapshot { + // (undocumented) + readonly callState: MossPluginCallState; + // (undocumented) + readonly commands: readonly string[]; // (undocumented) readonly effectLabels: readonly string[]; // (undocumented) @@ -1741,8 +1985,12 @@ export interface MossPluginSnapshot { // (undocumented) readonly id: string; // (undocumented) + readonly mcpPresets: readonly string[]; + // (undocumented) readonly promptLayerCount: number; // (undocumented) + readonly providers: readonly string[]; + // (undocumented) readonly skills: readonly string[]; // (undocumented) readonly state: MossPluginState; @@ -1755,6 +2003,11 @@ export interface MossPluginSnapshot { // @beta export type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +// @beta +export interface MossPluginUnloadOptions { + readonly timeoutMs?: number; +} + // @beta export interface MossPluginWebManifest { // (undocumented) @@ -2109,8 +2362,6 @@ interface ProviderConfig { api?: string; // (undocumented) llmExtraBody?: Record; - // Warning: (ae-forgotten-export) The symbol "LLMProvider" needs to be exported by the entry point index.d.ts - // // (undocumented) llmProvider: LLMProvider; // (undocumented) @@ -2156,6 +2407,9 @@ export interface ProviderErrorSurface { userMessage: string; } +// @beta +export function readMossPluginConfigSchema(pluginRoot: string): Promise; + // @beta export function readMossPluginManifest(root: string): Promise; @@ -2905,6 +3159,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -3149,9 +3404,9 @@ type VerdictSource = 'exit_code' | 'file_exist' | 'geometric' | 'sensor' | 'mode // Warnings were encountered during analysis: // // src/context/pruning.ts:77:3 - (ae-forgotten-export) The symbol "ContextPruningToolMatch" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:589:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts -// src/core/agent/moss-agent.ts:670:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:584:17 - (ae-forgotten-export) The symbol "SessionInboxDelivery" needs to be exported by the entry point index.d.ts +// src/core/agent/moss-agent.ts:665:37 - (ae-forgotten-export) The symbol "SessionDrainResult" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // src/runtime/shared-runtime.ts:111:22 - (ae-forgotten-export) The symbol "DeviceReadonlyExecutor" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/structured-output.api.md b/packages/moss-agent/etc/structured-output.api.md index 1d7ab789..c6a45c1e 100644 --- a/packages/moss-agent/etc/structured-output.api.md +++ b/packages/moss-agent/etc/structured-output.api.md @@ -326,6 +326,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -442,7 +443,7 @@ export function validateJsonSchemaDefinition(schema: JsonSchema): SchemaDefiniti // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/teaching.api.md b/packages/moss-agent/etc/teaching.api.md index 6bfd8568..77d84cf3 100644 --- a/packages/moss-agent/etc/teaching.api.md +++ b/packages/moss-agent/etc/teaching.api.md @@ -470,6 +470,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -614,7 +615,7 @@ type ToolSideEffectClass = 'readonly' | 'local_write' | 'device_mutation' | 'cre // Warnings were encountered during analysis: // // src/core/llm/llm-provider.ts:19:7 - (ae-forgotten-export) The symbol "ToolContentBlock" needs to be exported by the entry point index.d.ts -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // src/teaching/teaching-layer.ts:162:3 - (ae-forgotten-export) The symbol "ToolApprovalRequest" needs to be exported by the entry point index.d.ts // src/teaching/teaching-layer.ts:162:3 - (ae-forgotten-export) The symbol "ToolApprovalDecision" needs to be exported by the entry point index.d.ts // src/teaching/teaching-layer.ts:163:3 - (ae-forgotten-export) The symbol "ToolCall" needs to be exported by the entry point index.d.ts diff --git a/packages/moss-agent/etc/tools__builtin.api.md b/packages/moss-agent/etc/tools__builtin.api.md index 8d4ffbb3..52b52512 100644 --- a/packages/moss-agent/etc/tools__builtin.api.md +++ b/packages/moss-agent/etc/tools__builtin.api.md @@ -253,6 +253,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -395,7 +396,7 @@ export const writeFileTool: Tool; // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point builtin.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point builtin.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/vision.api.md b/packages/moss-agent/etc/vision.api.md index 2b536427..abfe6caf 100644 --- a/packages/moss-agent/etc/vision.api.md +++ b/packages/moss-agent/etc/vision.api.md @@ -125,6 +125,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -320,7 +321,7 @@ export interface VisionToolOptions { // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/web-browser.api.md b/packages/moss-agent/etc/web-browser.api.md index 3dd28bf1..a49dcb4e 100644 --- a/packages/moss-agent/etc/web-browser.api.md +++ b/packages/moss-agent/etc/web-browser.api.md @@ -169,6 +169,7 @@ interface ToolContext { abortSignal?: AbortSignal; // (undocumented) agentId?: string; + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; // (undocumented) asyncTaskRegistry?: MossAsyncTaskRegistry; // (undocumented) @@ -413,7 +414,7 @@ export interface WebBrowserTask { // Warnings were encountered during analysis: // -// src/core/tools/tool-types.ts:64:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts +// src/core/tools/tool-types.ts:66:5 - (ae-forgotten-export) The symbol "SubagentRunProgress" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/moss-agent/etc/web.api.md b/packages/moss-agent/etc/web.api.md index f1ce906f..4c936eb3 100644 --- a/packages/moss-agent/etc/web.api.md +++ b/packages/moss-agent/etc/web.api.md @@ -5,16 +5,121 @@ ```ts // @beta -export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; +export const MOSS_WEB_SLOTS: readonly ["navigation.primary", "navigation.session", "navigation.footer", "conversation.header", "conversation.message", "conversation.composer", "conversation.details", "tool.inline", "tool.details", "settings.section", "settings.plugin"]; // @beta -export const MOSS_WEB_THEME_TOKENS: readonly ["--moss-color-canvas", "--moss-color-surface", "--moss-color-panel", "--moss-color-panel-raised", "--moss-color-border", "--moss-color-border-strong", "--moss-color-text", "--moss-color-muted", "--moss-color-faint", "--moss-color-accent", "--moss-color-accent-soft", "--moss-color-danger", "--moss-color-warning", "--moss-space-1", "--moss-space-2", "--moss-space-3", "--moss-space-4", "--moss-space-5", "--moss-space-6", "--moss-space-8", "--moss-radius-control", "--moss-radius-card", "--moss-radius-panel", "--moss-shadow-control", "--moss-shadow-composer", "--moss-shadow-float"]; +export const MOSS_WEB_THEME_TOKENS: readonly ["--moss-color-canvas", "--moss-color-surface", "--moss-color-panel", "--moss-color-panel-raised", "--moss-color-border", "--moss-color-border-strong", "--moss-color-text", "--moss-color-muted", "--moss-color-faint", "--moss-color-accent", "--moss-color-accent-hover", "--moss-color-accent-soft", "--moss-color-danger", "--moss-color-danger-soft", "--moss-color-warning", "--moss-color-warning-soft", "--moss-color-success", "--moss-color-success-soft", "--moss-color-overlay", "--moss-color-terminal", "--moss-color-terminal-border", "--moss-color-terminal-muted", "--moss-color-terminal-prompt", "--moss-color-terminal-text", "--moss-font-family-body", "--moss-font-family-display", "--moss-font-family-code", "--moss-font-size-1", "--moss-font-size-2", "--moss-font-size-3", "--moss-font-size-4", "--moss-font-size-5", "--moss-font-size-6", "--moss-font-size-display", "--moss-font-weight-regular", "--moss-font-weight-medium", "--moss-font-weight-bold", "--moss-line-height-tight", "--moss-line-height-body", "--moss-line-height-code", "--moss-space-1", "--moss-space-2", "--moss-space-3", "--moss-space-4", "--moss-space-5", "--moss-space-6", "--moss-space-8", "--moss-space-10", "--moss-space-12", "--moss-radius-control", "--moss-radius-small", "--moss-radius-card", "--moss-radius-panel", "--moss-radius-round", "--moss-shadow-control", "--moss-shadow-composer", "--moss-shadow-float", "--moss-shadow-dialog", "--moss-control-height", "--moss-control-height-small", "--moss-motion-fast", "--moss-motion-standard", "--moss-motion-slow", "--moss-ease-standard", "--moss-z-base", "--moss-z-header", "--moss-z-drawer", "--moss-z-dialog", "--moss-z-toast", "--moss-z-tooltip", "--moss-state-idle", "--moss-state-running", "--moss-state-success", "--moss-state-warning", "--moss-state-error", "--moss-state-interrupted"]; + +// @beta +export interface MossPluginConfigPropertySchema extends MossPluginJsonSchema { + readonly writeOnly?: boolean; +} + +// @beta +export interface MossPluginConfigSchema extends MossPluginJsonSchema { + // (undocumented) + readonly properties?: Readonly>; + // (undocumented) + readonly type: 'object'; +} + +// @beta +export interface MossPluginConfigView { + // (undocumented) + readonly secrets: Readonly>; + // (undocumented) + readonly values: Readonly>; +} + +// @beta +export interface MossPluginJsonSchema { + // (undocumented) + $defs?: Record; + // (undocumented) + $ref?: string; + // (undocumented) + additionalProperties?: boolean | MossPluginJsonSchema; + // (undocumented) + allOf?: MossPluginJsonSchema[]; + // (undocumented) + anyOf?: MossPluginJsonSchema[]; + // (undocumented) + const?: unknown; + // (undocumented) + default?: unknown; + // (undocumented) + definitions?: Record; + // (undocumented) + description?: string; + // (undocumented) + else?: MossPluginJsonSchema; + // (undocumented) + enum?: unknown[]; + // (undocumented) + format?: string; + // (undocumented) + if?: MossPluginJsonSchema; + // (undocumented) + items?: MossPluginJsonSchema | MossPluginJsonSchema[]; + // (undocumented) + maximum?: number; + // (undocumented) + maxItems?: number; + // (undocumented) + maxLength?: number; + // (undocumented) + minimum?: number; + // (undocumented) + minItems?: number; + // (undocumented) + minLength?: number; + // (undocumented) + not?: MossPluginJsonSchema; + // (undocumented) + oneOf?: MossPluginJsonSchema[]; + // (undocumented) + pattern?: string; + // (undocumented) + properties?: Record; + // (undocumented) + required?: string[]; + // (undocumented) + then?: MossPluginJsonSchema; + // (undocumented) + title?: string; + // (undocumented) + type?: string | string[]; + // (undocumented) + uniqueItems?: boolean; +} + +// @beta +export interface MossWebAttachmentSummary { + // (undocumented) + readonly createdAt: number; + // (undocumented) + readonly downloadUrl: string; + // (undocumented) + readonly filename: string; + // (undocumented) + readonly id: string; + // (undocumented) + readonly kind: 'text' | 'image' | 'artifact'; + // (undocumented) + readonly mimeType: string; + // (undocumented) + readonly size: number; +} // @beta export interface MossWebBootstrap { // (undocumented) readonly model: string; // (undocumented) + readonly pluginComposition: MossWebPluginComposition; + // (undocumented) readonly plugins: readonly MossWebPluginSnapshot[]; // (undocumented) readonly taskRuns: readonly MossWebTaskRunSnapshot[]; @@ -32,6 +137,62 @@ export interface MossWebInstalledPlugin { readonly version: string; } +// @beta +export type MossWebInteractionKind = 'approval' | 'question'; + +// @beta +export type MossWebInteractionState = 'pending' | 'resolved' | 'cancelled'; + +// @beta +export interface MossWebJournalEvent { + // (undocumented) + readonly event: MossWebStreamEvent; + // (undocumented) + readonly runId: string; + // (undocumented) + readonly seq: number; + // (undocumented) + readonly sessionId: string; + // (undocumented) + readonly time: number; +} + +// @beta +export interface MossWebPendingInteraction { + // (undocumented) + readonly createdAt: number; + // (undocumented) + readonly id: string; + // (undocumented) + readonly kind: MossWebInteractionKind; + // (undocumented) + readonly prompt: string; + // (undocumented) + readonly resolvedAt?: number; + // (undocumented) + readonly state: MossWebInteractionState; +} + +// @beta +export interface MossWebPluginComposition { + // (undocumented) + readonly generation: number; + // (undocumented) + readonly plugins: readonly MossWebPluginSnapshot[]; +} + +// @beta +export interface MossWebPluginConfigResponse { + // (undocumented) + readonly config: MossPluginConfigView; + // (undocumented) + readonly generation: number; + // (undocumented) + readonly restartRequired: false; + // (undocumented) + readonly schema: MossPluginConfigSchema; +} + // @beta export interface MossWebPluginModule { // (undocumented) @@ -40,8 +201,14 @@ export interface MossWebPluginModule { // @beta export interface MossWebPluginMountContext { + readonly componentsUrl: '/assets/moss-web-components.js'; // (undocumented) readonly contributionId: string; + readonly owner?: { + readonly kind: 'workspace' | 'session' | 'message' | 'tool' | 'settings'; + readonly id: string; + readonly data?: unknown; + }; // (undocumented) readonly pluginId: string; // (undocumented) @@ -50,9 +217,17 @@ export interface MossWebPluginMountContext { // @beta export interface MossWebPluginSnapshot { + // (undocumented) + readonly callState: 'accepting' | 'draining' | 'disposed'; + // (undocumented) + readonly commands: readonly string[]; // (undocumented) readonly id: string; // (undocumented) + readonly mcpPresets: readonly string[]; + // (undocumented) + readonly providers: readonly string[]; + // (undocumented) readonly state: string; // (undocumented) readonly tools: readonly string[]; @@ -60,6 +235,12 @@ export interface MossWebPluginSnapshot { readonly webContributions: readonly string[]; } +// @beta +export interface MossWebSessionSearchHit extends MossWebSessionSummary { + // (undocumented) + readonly snippet: string; +} + // @beta export interface MossWebSessionSummary { // (undocumented) @@ -101,6 +282,32 @@ export type MossWebStreamEvent = { readonly type: 'done'; readonly stopReason: string; readonly run?: MossWebTaskRunSnapshot; +} | { + readonly type: 'retry'; + readonly attempt: number; + readonly error: string; +} | { + readonly type: 'compaction'; + readonly summaryChars: number; + readonly droppedMessages: number; + readonly checkpointOutline?: readonly string[]; +} | { + readonly type: 'usage'; + readonly inputTokens: number; + readonly outputTokens: number; + readonly cacheReadTokens?: number; + readonly cacheCreationTokens?: number; + readonly contextTokens?: number; +} | { + readonly type: 'context'; + readonly status: string; + readonly reason: string; + readonly goal: string; + readonly nextAction: string; +} | { + readonly type: 'interrupted'; + readonly reason: string; + readonly run: MossWebTaskRunSnapshot; } | { readonly type: 'error'; readonly message: string; @@ -127,6 +334,16 @@ export interface MossWebTaskRunSnapshot { // @beta export type MossWebThemeToken = (typeof MOSS_WEB_THEME_TOKENS)[number]; +// @beta +export interface MossWebWorkspaceSummary { + // (undocumented) + readonly current: boolean; + // (undocumented) + readonly id: string; + // (undocumented) + readonly name: string; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/moss-agent/package.json b/packages/moss-agent/package.json index ddf31bbc..826d6d65 100644 --- a/packages/moss-agent/package.json +++ b/packages/moss-agent/package.json @@ -171,7 +171,7 @@ "scripts": { "prebuild": "npm run build --workspace @rdk-moss/core", "build": "npm run clean && tsc -p tsconfig.build.json && npm run build:web && node -e \"const fs=require('fs');fs.chmodSync('dist/cli.js',0o755)\"", - "build:web": "vite build --config web-vite.config.mjs", + "build:web": "vite build --config web-vite.config.mjs && vite build --config web-components-vite.config.mjs", "pretypecheck": "npm run build --workspace @rdk-moss/core", "typecheck": "tsc --noEmit", "clean": "node -e \"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true})\"", @@ -208,16 +208,22 @@ "react-dom": "^19.2.8", "string-width": "^8.2.1", "turndown": "^7.2.0", - "undici": "^7.29.0" + "undici": "^7.29.0", + "yaml": "^2.9.0" }, "devDependencies": { + "@axe-core/playwright": "^4.13.0", "@types/marked-terminal": "^6.1.1", "@types/micromatch": "^4.0.10", + "@types/pngjs": "^6.0.5", "@types/proper-lockfile": "4.1.4", "@types/react": "^19.2.0", "@types/react-dom": "^19.2.4", "@types/turndown": "^5.0.5", "ink-testing-library": "^4.0.0", + "pixelmatch": "^7.2.0", + "playwright": "^1.62.1", + "pngjs": "^7.0.0", "typescript": "^5.7.3", "vite": "^7.3.6" }, diff --git a/packages/moss-agent/src/cli/approval.ts b/packages/moss-agent/src/cli/approval.ts index 3fbafb04..5ce520b4 100644 --- a/packages/moss-agent/src/cli/approval.ts +++ b/packages/moss-agent/src/cli/approval.ts @@ -8,8 +8,19 @@ import { assertSandboxPath } from '../safety/sandbox-paths.js'; import { sanitizeSecrets } from '../safety/secret-sanitizer.js'; import { normalizeSafetyModeConfig, type ConfigApprovalPolicy } from './config.js'; import { buildApprovalDetailLines, type ApprovalDetailContext } from './approval-detail.js'; +import { getCliInteractionMode, type CliInteractionMode } from './interaction-mode.js'; import type { CliDetailMode } from './output.js'; +export { + formatCliInteractionModeLabel, + getCliInteractionMode, + inferCliInteractionModeFromMessages, + parseCliInteractionMode, + setCliInteractionMode, + subscribeCliInteractionMode, + type CliInteractionMode, +} from './interaction-mode.js'; + export type CliSafetyMode = 'read-only' | 'workspace-write' | 'full-access'; export type AskUser = (question: string, abortSignal?: AbortSignal) => Promise; @@ -19,123 +30,6 @@ let interactiveAsker: AskUser | null = null; * instead of the y/a/n permission chooser (which swallows numbered answers). */ let interactiveUserQuestionAsker: AskUser | null = null; -export type CliInteractionMode = 'plan' | 'default' | 'acceptEdits'; - -let currentInteractionMode: CliInteractionMode = 'default'; -const interactionModeListeners = new Set<(mode: CliInteractionMode) => void>(); - -export function setCliInteractionMode(mode: CliInteractionMode): void { - if (currentInteractionMode === mode) return; - currentInteractionMode = mode; - for (const listener of interactionModeListeners) { - try { - listener(mode); - } catch { - // listeners must not break mode transitions - } - } -} - -export function getCliInteractionMode(): CliInteractionMode { - return currentInteractionMode; -} - -/** Subscribe to interaction-mode changes (plan / default / acceptEdits). */ -export function subscribeCliInteractionMode( - listener: (mode: CliInteractionMode) => void -): () => void { - interactionModeListeners.add(listener); - return () => { - interactionModeListeners.delete(listener); - }; -} - -export function formatCliInteractionModeLabel(mode: CliInteractionMode, zh = false): string { - if (mode === 'plan') return zh ? '计划模式' : 'plan'; - if (mode === 'acceptEdits') return zh ? '自动接受编辑' : 'accept-edits'; - return zh ? '默认' : 'default'; -} - -export function parseCliInteractionMode(raw: string | undefined): CliInteractionMode | null { - const token = String(raw ?? '') - .trim() - .toLowerCase() - .replace(/[_\s]+/g, '-'); - if (!token) return null; - if (token === 'plan' || token === 'p' || token === '计划' || token === '计划模式') { - return 'plan'; - } - if ( - token === 'default' || - token === 'd' || - token === 'normal' || - token === '默认' || - token === '默认模式' - ) { - return 'default'; - } - if ( - token === 'accept-edits' || - token === 'acceptedits' || - token === 'accept' || - token === 'auto' || - token === 'a' || - token === '自动接受' || - token === '自动接受编辑' - ) { - return 'acceptEdits'; - } - return null; -} - -/** - * Best-effort interaction mode recovery from session history (no extra storage). - * Newest signal wins: - * - "Left plan mode → default" / switched-to-default text → default - * - user prompt prefixed with Moss plan-mode header → plan - * - explicit /mode plan|default|accept-edits user text → that mode - * Returns null when no signal is found. - */ -export function inferCliInteractionModeFromMessages( - messages: ReadonlyArray<{ role?: string; content?: unknown }> -): CliInteractionMode | null { - for (let i = messages.length - 1; i >= 0; i--) { - const m = messages[i]; - if (!m) continue; - const texts: string[] = []; - if (typeof m.content === 'string') { - texts.push(m.content); - } else if (Array.isArray(m.content)) { - for (const block of m.content) { - if (!block || typeof block !== 'object') continue; - const b = block as { type?: string; text?: string; content?: unknown }; - if (typeof b.text === 'string') texts.push(b.text); - if (typeof b.content === 'string') texts.push(b.content); - } - } - for (const text of texts) { - const head = text.slice(0, 240); - if ( - /Left plan mode\s*(→|->)\s*default/i.test(text) || - /已切换到默认/i.test(text) || - /Switched to default\b/i.test(text) - ) { - return 'default'; - } - if (m.role === 'user' && (/^\[Plan mode\]/m.test(head) || /^\[计划模式\]/m.test(head))) { - return 'plan'; - } - if (m.role === 'user') { - const cmd = text.trim().toLowerCase(); - if (/^\/mode\s+plan\b/.test(cmd) || cmd === '/plan') return 'plan'; - if (/^\/mode\s+accept-?edits\b/.test(cmd)) return 'acceptEdits'; - if (/^\/mode\s+default\b/.test(cmd)) return 'default'; - } - } - } - return null; -} - export interface CliToolApprovalOptions { approvalPolicy?: ConfigApprovalPolicy; trustedTools?: readonly string[]; @@ -155,6 +49,12 @@ export interface CliToolApprovalOptions { detailMode?: CliDetailMode; } +/** A CLI policy hook whose interactive asker can be scoped by an embedding host. @beta */ +export type CliToolApprovalHook = NonNullable & { + setAsker(asker: AskUser | null): () => void; + setInteractionModeResolver(resolve: (() => CliInteractionMode) | null): () => void; +}; + export interface CliToolApprovalPreview { toolName: string; sideEffect: ToolSideEffectClass; @@ -826,14 +726,18 @@ export function createCliToolApprovalHook( mode: CliSafetyMode, env: NodeJS.ProcessEnv = process.env, options: CliToolApprovalOptions = {} -): NonNullable { +): CliToolApprovalHook { const sessionTrustedTools = new Set(); const sessionTrustedWorkspaces = new Set(); const workspaceRoot = workspaceTrustRoot(options.workspaceDir); + let instanceAsker: AskUser | null = null; + let instanceInteractionMode: (() => CliInteractionMode) | null = null; let headlessNoticeShown = false; - return async (request: ToolApprovalRequest) => { + const hook: NonNullable = async ( + request: ToolApprovalRequest + ) => { const { tool } = request; const liveMode = options.safetyModeOverride?.() ?? mode; @@ -865,7 +769,8 @@ export function createCliToolApprovalHook( reason: `Tool "${tool.name}" is blocked by configured deniedTools.`, }; } - const interaction = options.interactionMode?.() ?? getCliInteractionMode(); + const interaction = + instanceInteractionMode?.() ?? options.interactionMode?.() ?? getCliInteractionMode(); // Plan mode blocks side-effecting tools unless metadata.planMode === 'allow' // (e.g. todo_write / ask_user_question / plan / plan_step). Do not treat every // non-readonly sideEffect as a hard block — that ignored the documented contract. @@ -919,7 +824,8 @@ export function createCliToolApprovalHook( return { approved: true }; } - if (!process.stdin.isTTY && interactiveAsker === null) { + const asker = instanceAsker ?? interactiveAsker; + if (!process.stdin.isTTY && asker === null) { if (options.detailMode !== 'quiet' && !headlessNoticeShown) { console.error( `[moss] Approval required but no interactive terminal is available: ${tool.name}` @@ -938,7 +844,7 @@ export function createCliToolApprovalHook( workspaceDir: options.workspaceDir, device: options.device, }); - const answer = (await (interactiveAsker ?? defaultAskUser)(prompt, request.abortSignal)) + const answer = (await (asker ?? defaultAskUser)(prompt, request.abortSignal)) .trim() .toLowerCase(); if (answer === 'a' || answer === 'always') { @@ -955,4 +861,38 @@ export function createCliToolApprovalHook( } return { approved: false, reason: `User denied ${tool.name}.` }; }; + const configurable = hook as CliToolApprovalHook; + configurable.setAsker = (asker: AskUser | null) => { + instanceAsker = asker; + return () => { + if (instanceAsker === asker) instanceAsker = null; + }; + }; + configurable.setInteractionModeResolver = (resolve: (() => CliInteractionMode) | null) => { + instanceInteractionMode = resolve; + return () => { + if (instanceInteractionMode === resolve) instanceInteractionMode = null; + }; + }; + return configurable; +} + +/** Bind an asker only when the hook was created by {@link createCliToolApprovalHook}. @beta */ +export function setCliToolApprovalHookAsker( + hook: AgentHooks['onBeforeToolExec'] | undefined, + asker: AskUser +): () => void { + const configurable = hook as Partial | undefined; + return typeof configurable?.setAsker === 'function' ? configurable.setAsker(asker) : () => {}; +} + +/** Bind an interaction mode only when the hook was created by {@link createCliToolApprovalHook}. @beta */ +export function setCliToolApprovalHookInteractionMode( + hook: AgentHooks['onBeforeToolExec'] | undefined, + resolve: () => CliInteractionMode +): () => void { + const configurable = hook as Partial | undefined; + return typeof configurable?.setInteractionModeResolver === 'function' + ? configurable.setInteractionModeResolver(resolve) + : () => {}; } diff --git a/packages/moss-agent/src/cli/interaction-mode.ts b/packages/moss-agent/src/cli/interaction-mode.ts new file mode 100644 index 00000000..5f8f7541 --- /dev/null +++ b/packages/moss-agent/src/cli/interaction-mode.ts @@ -0,0 +1,117 @@ +/** CLI interaction modes shared by terminal and embedded hosts. */ +export type CliInteractionMode = 'plan' | 'default' | 'acceptEdits'; + +let currentInteractionMode: CliInteractionMode = 'default'; +const interactionModeListeners = new Set<(mode: CliInteractionMode) => void>(); + +export function setCliInteractionMode(mode: CliInteractionMode): void { + if (currentInteractionMode === mode) return; + currentInteractionMode = mode; + for (const listener of interactionModeListeners) { + try { + listener(mode); + } catch { + // listeners must not break mode transitions + } + } +} + +export function getCliInteractionMode(): CliInteractionMode { + return currentInteractionMode; +} + +/** Subscribe to interaction-mode changes (plan / default / acceptEdits). */ +export function subscribeCliInteractionMode( + listener: (mode: CliInteractionMode) => void +): () => void { + interactionModeListeners.add(listener); + return () => { + interactionModeListeners.delete(listener); + }; +} + +export function formatCliInteractionModeLabel(mode: CliInteractionMode, zh = false): string { + if (mode === 'plan') return zh ? '计划模式' : 'plan'; + if (mode === 'acceptEdits') return zh ? '自动接受编辑' : 'accept-edits'; + return zh ? '默认' : 'default'; +} + +export function parseCliInteractionMode(raw: string | undefined): CliInteractionMode | null { + const token = String(raw ?? '') + .trim() + .toLowerCase() + .replace(/[_\s]+/g, '-'); + if (!token) return null; + if (token === 'plan' || token === 'p' || token === '计划' || token === '计划模式') { + return 'plan'; + } + if ( + token === 'default' || + token === 'd' || + token === 'normal' || + token === '默认' || + token === '默认模式' + ) { + return 'default'; + } + if ( + token === 'accept-edits' || + token === 'acceptedits' || + token === 'accept' || + token === 'auto' || + token === 'a' || + token === '自动接受' || + token === '自动接受编辑' + ) { + return 'acceptEdits'; + } + return null; +} + +/** + * Best-effort interaction mode recovery from session history (no extra storage). + * Newest signal wins: + * - "Left plan mode → default" / switched-to-default text → default + * - user prompt prefixed with Moss plan-mode header → plan + * - explicit /mode plan|default|accept-edits user text → that mode + * Returns null when no signal is found. + */ +export function inferCliInteractionModeFromMessages( + messages: ReadonlyArray<{ role?: string; content?: unknown }> +): CliInteractionMode | null { + for (let i = messages.length - 1; i >= 0; i--) { + const m = messages[i]; + if (!m) continue; + const texts: string[] = []; + if (typeof m.content === 'string') { + texts.push(m.content); + } else if (Array.isArray(m.content)) { + for (const block of m.content) { + if (!block || typeof block !== 'object') continue; + const b = block as { type?: string; text?: string; content?: unknown }; + if (typeof b.text === 'string') texts.push(b.text); + if (typeof b.content === 'string') texts.push(b.content); + } + } + for (const text of texts) { + const head = text.slice(0, 240); + if ( + /Left plan mode\s*(→|->)\s*default/i.test(text) || + /已切换到默认/i.test(text) || + /Switched to default\b/i.test(text) + ) { + return 'default'; + } + if (m.role === 'user' && (/^\[Plan mode\]/m.test(head) || /^\[计划模式\]/m.test(head))) { + return 'plan'; + } + if (m.role === 'user') { + const cmd = text.trim().toLowerCase(); + if (/^\/mode\s+plan\b/.test(cmd) || cmd === '/plan') return 'plan'; + if (/^\/mode\s+accept-?edits\b/.test(cmd)) return 'acceptEdits'; + if (/^\/mode\s+default\b/.test(cmd)) return 'default'; + } + } + } + return null; +} diff --git a/packages/moss-agent/src/cli/plugin-interactive-commands.ts b/packages/moss-agent/src/cli/plugin-interactive-commands.ts new file mode 100644 index 00000000..2ccc04ac --- /dev/null +++ b/packages/moss-agent/src/cli/plugin-interactive-commands.ts @@ -0,0 +1,32 @@ +import { reservedBuiltinNames } from './commands/custom-commands.js'; + +interface PluginCommandSource { + listCommands(): readonly { + readonly id: string; + readonly title: string; + readonly description?: string; + }[]; + expandCommand(id: string, args: string): Promise; +} + +export function pluginCommandRows( + plugins: PluginCommandSource +): ReadonlyArray { + return plugins + .listCommands() + .filter(({ id }) => !reservedBuiltinNames().has(`/${id}`)) + .map(({ id, description, title }) => [`/${id}`, description ?? title]); +} + +export async function dispatchPlugin( + message: string, + plugins: PluginCommandSource, + submit: (prompt: string) => void +): Promise { + const [id = '', ...args] = message.slice(1).split(/\s+/); + if (reservedBuiltinNames().has(`/${id}`)) return false; + const expanded = await plugins.expandCommand(id, args.join(' ')); + if (expanded === undefined) return false; + submit(expanded); + return true; +} diff --git a/packages/moss-agent/src/cli/plugins-command.ts b/packages/moss-agent/src/cli/plugins-command.ts index 4be72ff8..7c592fe7 100644 --- a/packages/moss-agent/src/cli/plugins-command.ts +++ b/packages/moss-agent/src/cli/plugins-command.ts @@ -2,6 +2,7 @@ import { resolveConfigDir } from './config.js'; import { ExitCode } from './exit-codes.js'; import { errorMessage } from '../errors.js'; import { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; +import { inspectDshPackageCompatibility } from '../plugins/dsh-bundle-compatibility.js'; export const PLUGINS_USAGE = 'Usage: moss plugins |remove |enable |disable |doctor>'; @@ -40,10 +41,33 @@ export async function runPluginsCommand(args: readonly string[]): Promise return; } if (command === 'add') { + const report = await inspectDshPackageCompatibility(target); + if ( + report.compatible || + report.reasons.some((reason) => /unsupported Cordis client UI slots/.test(reason)) + ) { + console.log( + `[plugins] DSH compatibility: ${report.compatible ? 'compatible declarative subset' : 'rejected'}` + ); + for (const reason of report.reasons) console.log(`[plugins] ${reason}`); + if (!report.compatible) { + process.exitCode = ExitCode.CONFIG; + return; + } + if (report.imported.length > 0) { + console.log(`[plugins] Will import: ${report.imported.join(', ')}`); + } + } const entry = await registry.add(target); - console.log( - `[plugins] Installed ${entry.id}@${entry.version} disabled. Review it, then run: moss plugins enable ${entry.id}` - ); + if (entry.lastGood) { + console.log( + `[plugins] Staged ${entry.id}@${entry.version} with ${entry.lastGood.version} retained as last-good (${entry.enabled ? 'enabled' : 'disabled'}).` + ); + } else { + console.log( + `[plugins] Installed ${entry.id}@${entry.version} disabled. Review it, then run: moss plugins enable ${entry.id}` + ); + } return; } if (command === 'remove') await registry.remove(target); diff --git a/packages/moss-agent/src/cli/plugins-runtime.ts b/packages/moss-agent/src/cli/plugins-runtime.ts index c07811db..a127edf0 100644 --- a/packages/moss-agent/src/cli/plugins-runtime.ts +++ b/packages/moss-agent/src/cli/plugins-runtime.ts @@ -1,18 +1,92 @@ import type { MossAgent } from '../core/agent/moss-agent.js'; import { errorMessage } from '../errors.js'; import { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; +import { connectMcpServers, type McpConnection } from '../mcp/index.js'; +import type { LLMProvider } from '../core/llm/llm-provider.js'; /** Install enabled trusted plugins while isolating manifest/import failures. @internal */ export async function installConfiguredPlugins(agent: MossAgent, configDir: string): Promise { - const loaded = await new InstalledPluginRegistry({ configDir }).loadEnabled(); + const registry = new InstalledPluginRegistry({ configDir }); + const loaded = await registry.loadEnabled(); for (const plugin of loaded.plugins) { try { await agent.plugins.install(plugin); } catch (error) { + const installed = (await registry.list()).find(({ id }) => id === plugin.id); + if (installed?.lastGood) { + try { + const restored = await registry.rollback(plugin.id); + await agent.plugins.install(await registry.loadInstalled(plugin.id)); + console.warn( + `[plugins] ${plugin.id}@${installed.version} was isolated; last-good ${restored.version} was restored: ${errorMessage(error)}` + ); + continue; + } catch (recoveryError) { + console.error( + `[plugins] ${plugin.id} candidate and last-good recovery failed: ${errorMessage(recoveryError)}` + ); + continue; + } + } console.error(`[plugins] ${plugin.id} was isolated: ${errorMessage(error)}`); } } for (const failure of loaded.failures) { - console.error(`[plugins] ${failure.id} was isolated: ${failure.message}`); + if (failure.recovered) console.warn(`[plugins] ${failure.id}: ${failure.message}`); + else console.error(`[plugins] ${failure.id} was isolated: ${failure.message}`); } } + +/** Instantiate a plugin provider through the host's active-call lease. @internal */ +export async function createPluginProvider( + agent: MossAgent, + providerId: string, + config: Readonly> +): Promise { + const provider = await agent.plugins.createProvider(providerId, config); + if (!provider) throw new Error(`plugin provider not found: ${providerId}`); + return provider; +} + +/** Connect a contributed MCP preset and publish its tools into the live agent. @internal */ +export async function registerPluginMcpPresetTools( + agent: MossAgent, + presetId: string +): Promise { + const activated = await agent.plugins.activateMcpPreset(presetId, async (preset) => { + const connections = await connectMcpServers({ + mcpServers: { + [preset.id]: { + command: preset.server.command, + ...(preset.server.args ? { args: [...preset.server.args] } : {}), + ...(preset.server.env ? { env: { ...preset.server.env } } : {}), + ...(preset.server.cwd ? { cwd: preset.server.cwd } : {}), + ...(preset.server.requestTimeoutMs !== undefined + ? { requestTimeoutMs: preset.server.requestTimeoutMs } + : {}), + }, + }, + }); + const toolDisposers: Array<() => void> = []; + try { + for (const connection of connections) { + for (const tool of connection.tools) { + toolDisposers.push(agent.tools.registerScoped(tool, `plugin-mcp:${preset.id}`)); + } + } + } catch (error) { + for (const dispose of toolDisposers.reverse()) dispose(); + await Promise.allSettled(connections.map((connection) => connection.close())); + throw error; + } + return { + value: connections, + dispose: async () => { + for (const dispose of toolDisposers.reverse()) dispose(); + await Promise.allSettled(connections.map((connection) => connection.close())); + }, + }; + }); + if (!activated) throw new Error(`plugin MCP preset not found: ${presetId}`); + return activated; +} diff --git a/packages/moss-agent/src/cli/tui.ts b/packages/moss-agent/src/cli/tui.ts index 25c623db..db5bfc88 100644 --- a/packages/moss-agent/src/cli/tui.ts +++ b/packages/moss-agent/src/cli/tui.ts @@ -74,6 +74,7 @@ import { } from './commands/registry.js'; import { loadCustomCommands, reservedBuiltinNames } from './commands/custom-commands.js'; import { commandRowsForSlashInput } from './interactive-commands.js'; +import { dispatchPlugin, pluginCommandRows } from './plugin-interactive-commands.js'; import { FileCheckpointStore, checkpointTargetPaths } from './file-checkpoint.js'; import { suggestWorkspaceFiles, @@ -2817,6 +2818,7 @@ export function MossTui({ ...(customCommandsRef.current ?? []), ...(skillCommandsRef.current ?? []), ].map((command) => [command.name, command.summary] as [string, string]); + const allCommandRows = [...customCommandRows, ...pluginCommandRows(agent.plugins)]; const [input, setInput] = useState(''); const [inputCursor, setInputCursor] = useState(0); const [busy, setBusy] = useState(false); @@ -3809,10 +3811,8 @@ export function MossTui({ } return true; } - // Registry-first dispatch: shared - // commands live in the registry; the legacy chain below shrinks with - // each migration phase. if (message.startsWith('/')) { + if (await dispatchPlugin(message, agent.plugins, submitPromptRef.current)) return true; const handled = await runRegistryCommand( message, { @@ -5732,7 +5732,7 @@ export function MossTui({ const promptRows = promptEditorRowBudget(input, { placeholder: promptPlaceholder(runState), hint: footerHint(runState), - extraCommandRows: customCommandRows, + extraCommandRows: allCommandRows, }); const modelPickerRows = modelPicker ? Math.min(14, modelPicker.list.choices.length + 7) : 0; const sessionPickerRows = sessionPicker ? Math.min(12, sessionPicker.sessions.length + 4) : 0; @@ -5983,7 +5983,7 @@ export function MossTui({ onPasteAttachmentShortcut: () => { void pasteClipboardAttachment(); }, - extraCommandRows: customCommandRows, + extraCommandRows: allCommandRows, workspace, vimEnabled, }), diff --git a/packages/moss-agent/src/core/agent/moss-agent.ts b/packages/moss-agent/src/core/agent/moss-agent.ts index cab45139..dfbd13e8 100644 --- a/packages/moss-agent/src/core/agent/moss-agent.ts +++ b/packages/moss-agent/src/core/agent/moss-agent.ts @@ -190,26 +190,16 @@ export class MossAgent { private disposed = false; private closePromise: Promise | undefined; private readonly activeStreamAdvances = new Set>(); - private steeringEngine: SteeringEngine | null = null; - private readonly remoteCompactProvider = createRemoteCompactProviderFromEnv(); - private readonly toolHooks: ToolHookRegistry; - private readonly packPromptLayers: readonly string[]; - private readonly packHostRequirements: readonly string[]; - private readonly inboxes = new Map(); - private readonly activeRunIds = new Map>(); private readonly sessionCheckpointWrites = new Map>(); - - /** Per-instance run-epoch store used by the agent loop's stream-push guard. - * Each MossAgent instance carries its own Map so parallel MossAgents in - * the same host (which may share sessionKeys) don't stomp each other's - * live streams. See agent-loop-push-guard.ts for the design. */ + private userQuestionAsker?: NonNullable; + /** Per-agent run epochs stop parallel instances overwriting shared-session streams. */ private readonly runEpochStore = new Map(); private readonly approvedPreflightController = new ApprovedPreflightController(); @@ -241,10 +231,15 @@ export class MossAgent { } this.extensions.setKnowledgeRegistry(this.knowledge); - drainPendingGlobalModules(this.knowledge); } - + /** Bind a host-owned question channel to this agent instance. @beta */ + setUserQuestionAsker(asker: NonNullable): () => void { + this.userQuestionAsker = asker; + return () => { + if (this.userQuestionAsker === asker) this.userQuestionAsker = undefined; + }; + } registerKnowledge(module: KnowledgeModule): void { this.knowledge.register(module); } @@ -1462,7 +1457,12 @@ export class MossAgent { } : undefined, toolAbortSignalFor: options?.toolAbortSignalFor, - enrichToolContext: hooks?.enrichToolContext, + enrichToolContext: (baseContext, activeSessionKey) => { + const enriched = hooks?.enrichToolContext?.(baseContext, activeSessionKey) ?? baseContext; + return this.userQuestionAsker + ? { ...enriched, askUserQuestion: this.userQuestionAsker } + : enriched; + }, toolHooks: this.toolHooks, abortSignal, maxOutputTokens, diff --git a/packages/moss-agent/src/core/index.ts b/packages/moss-agent/src/core/index.ts index b81035e6..64c43a3c 100644 --- a/packages/moss-agent/src/core/index.ts +++ b/packages/moss-agent/src/core/index.ts @@ -293,14 +293,19 @@ export { collectCapabilityPacks } from './packs/capability-pack.js'; export { MOSS_WEB_SLOTS } from './plugins/plugin-host.js'; export type { CapabilityPack, CapabilityPackContributions } from './packs/capability-pack.js'; export type { + MossPluginCallState, + MossPluginCommand, MossPlugin, MossPluginCompositionSnapshot, MossPluginContext, MossPluginDisposer, MossPluginHandle, MossPluginHost, + MossPluginMcpPreset, + MossPluginProvider, MossPluginSnapshot, MossPluginState, + MossPluginUnloadOptions, MossWebContribution, MossWebSlot, } from './plugins/plugin-host.js'; diff --git a/packages/moss-agent/src/core/plugins/plugin-host-validation.ts b/packages/moss-agent/src/core/plugins/plugin-host-validation.ts new file mode 100644 index 00000000..6f82b161 --- /dev/null +++ b/packages/moss-agent/src/core/plugins/plugin-host-validation.ts @@ -0,0 +1,128 @@ +import { ErrorCode, MossError } from '../../errors.js'; + +import type { MossWebSlot, StagedPlugin } from './plugin-host.js'; + +const PLUGIN_ID_PATTERN = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/; + +/** Read-only registry view used while validating a staged plugin generation. @internal */ +export interface PluginContributionRegistryView { + readonly hasTool: (id: string) => boolean; + readonly hasSkill: (id: string) => boolean; + readonly hasExpert: (id: string) => boolean; + readonly hasCommand: (id: string) => boolean; + readonly hasProvider: (id: string) => boolean; + readonly hasMcpPreset: (id: string) => boolean; + readonly hasWebContribution: (id: string) => boolean; +} + +/** Create an empty contribution batch for one atomic activation. @internal */ +export function createStagedPlugin(): StagedPlugin { + return { + tools: [], + skills: [], + experts: [], + commands: [], + providers: [], + mcpPresets: [], + promptLayers: [], + webContributions: [], + effects: [], + }; +} + +function duplicate(values: readonly string[]): string | undefined { + const seen = new Set(); + for (const value of values) { + if (seen.has(value)) return value; + seen.add(value); + } + return undefined; +} + +function validateContributionId(id: string, kind: string): void { + if (!PLUGIN_ID_PATTERN.test(id)) throw new Error(`plugin ${kind} id is invalid: ${id}`); +} + +/** Validate the stable identifier of one trusted runtime plugin. @internal */ +export function validatePluginId(id: string): void { + if (!PLUGIN_ID_PATTERN.test(id)) { + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: `plugin id must be lowercase and path-like: ${id}`, + }); + } +} + +/** Validate a complete contribution batch before the host publishes it. @internal */ +export function validateStagedContributions( + pluginId: string, + staged: StagedPlugin, + registry: PluginContributionRegistryView, + supportedWebSlots: readonly MossWebSlot[] +): void { + const conflict = + duplicate(staged.tools.map(({ name }) => name)) ?? + duplicate(staged.skills.map((skill) => skill.stableId ?? skill.name)) ?? + duplicate(staged.experts.map(({ id }) => id)) ?? + duplicate(staged.commands.map(({ id }) => id)) ?? + duplicate(staged.providers.map(({ id }) => id)) ?? + duplicate(staged.mcpPresets.map(({ id }) => id)) ?? + duplicate(staged.webContributions.map(({ id }) => id)); + if (conflict) throw new Error(`plugin ${pluginId} contains duplicate contribution: ${conflict}`); + + for (const tool of staged.tools) { + if (!tool.metadata?.sideEffectClass) + throw new Error(`plugin tool ${tool.name} requires side-effect metadata`); + if (registry.hasTool(tool.name)) + throw new Error(`plugin tool already registered: ${tool.name}`); + } + for (const skill of staged.skills) { + const id = skill.stableId ?? skill.name; + if (registry.hasSkill(id)) throw new Error(`plugin skill already registered: ${id}`); + } + for (const expert of staged.experts) { + if (registry.hasExpert(expert.id)) + throw new Error(`plugin expert already registered: ${expert.id}`); + } + for (const command of staged.commands) { + validateContributionId(command.id, 'command'); + if (!command.title.trim() || typeof command.expand !== 'function') { + throw new Error(`plugin command is invalid: ${command.id}`); + } + if (registry.hasCommand(command.id)) { + throw new Error(`plugin command already registered: ${command.id}`); + } + } + for (const provider of staged.providers) { + validateContributionId(provider.id, 'provider'); + if (!provider.displayName.trim() || typeof provider.create !== 'function') { + throw new Error(`plugin provider is invalid: ${provider.id}`); + } + if (registry.hasProvider(provider.id)) { + throw new Error(`plugin provider already registered: ${provider.id}`); + } + } + for (const preset of staged.mcpPresets) { + validateContributionId(preset.id, 'MCP preset'); + if (!preset.displayName.trim() || !preset.server.command.trim()) { + throw new Error(`plugin MCP preset is invalid: ${preset.id}`); + } + if (registry.hasMcpPreset(preset.id)) { + throw new Error(`plugin MCP preset already registered: ${preset.id}`); + } + } + for (const layer of staged.promptLayers) { + if (!layer.trim()) throw new Error(`plugin ${pluginId} contains an empty prompt layer`); + } + for (const contribution of staged.webContributions) { + if (!PLUGIN_ID_PATTERN.test(contribution.id)) + throw new Error(`plugin ${pluginId} contains an invalid web contribution id`); + if (!supportedWebSlots.includes(contribution.slot)) + throw new Error(`plugin ${pluginId} contains an unsupported web contribution slot`); + if (!contribution.module.startsWith('./') || contribution.module.includes('..')) + throw new Error(`plugin ${pluginId} web contribution module must be package-relative`); + if (registry.hasWebContribution(`${pluginId}:${contribution.id}`)) { + throw new Error(`plugin web contribution already registered: ${pluginId}:${contribution.id}`); + } + } +} diff --git a/packages/moss-agent/src/core/plugins/plugin-host.ts b/packages/moss-agent/src/core/plugins/plugin-host.ts index 0f8133c5..3789ac53 100644 --- a/packages/moss-agent/src/core/plugins/plugin-host.ts +++ b/packages/moss-agent/src/core/plugins/plugin-host.ts @@ -1,14 +1,21 @@ import { ErrorCode, MossError, wrapAsMoss } from '../../errors.js'; import type { SkillMeta } from '../../skills/types.js'; import { CordisEffectScope } from '../../vendor/cordis/effect-scope.js'; +import type { LLMProvider } from '../llm/llm-provider.js'; import type { SubagentExpertDefinition } from '../subagent/expert-registry.js'; import type { Tool } from '../tools/tool-types.js'; - -const PLUGIN_ID_PATTERN = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/; +import { + createStagedPlugin, + validatePluginId, + validateStagedContributions, +} from './plugin-host-validation.js'; /** Lifecycle state exposed by the deterministic plugin inspector. @beta */ export type MossPluginState = 'loading' | 'active' | 'unloading' | 'failed' | 'disposed'; +/** Whether a plugin generation accepts calls, drains leases, or is disposed. @beta */ +export type MossPluginCallState = 'accepting' | 'draining' | 'disposed'; + /** Cleanup callback owned by a plugin lifecycle scope. @beta */ export type MossPluginDisposer = () => void | Promise; @@ -16,17 +23,50 @@ export type MossPluginDisposer = () => void | Promise; export interface MossPluginSnapshot { readonly id: string; readonly state: MossPluginState; + readonly callState: MossPluginCallState; readonly tools: readonly string[]; readonly skills: readonly string[]; readonly experts: readonly string[]; + readonly commands: readonly string[]; + readonly providers: readonly string[]; + readonly mcpPresets: readonly string[]; readonly promptLayerCount: number; readonly effectLabels: readonly string[]; readonly webContributions: readonly string[]; } +/** Prompt-expanding command contributed by one trusted plugin. @beta */ +export interface MossPluginCommand { + readonly id: string; + readonly title: string; + readonly description?: string; + expand(args: string): string | Promise; +} + +/** LLM provider factory contributed by one trusted plugin. @beta */ +export interface MossPluginProvider { + readonly id: string; + readonly displayName: string; + create(config: Readonly>): LLMProvider | Promise; +} + +/** Data-only MCP server preset contributed by one trusted plugin. @beta */ +export interface MossPluginMcpPreset { + readonly id: string; + readonly displayName: string; + readonly server: { + readonly command: string; + readonly args?: readonly string[]; + readonly env?: Readonly>; + readonly cwd?: string; + readonly requestTimeoutMs?: number; + }; +} + /** Stable browser extension slots available to trusted runtime plugins. @beta */ export const MOSS_WEB_SLOTS = [ 'navigation.primary', + 'navigation.session', 'navigation.footer', 'conversation.header', 'conversation.message', @@ -50,21 +90,34 @@ export interface MossWebContribution { /** Redacted, deterministic plugin composition state. @beta */ export interface MossPluginCompositionSnapshot { + /** Monotonic last-good composition generation. Failed activation does not advance it. */ + readonly generation: number; readonly plugins: readonly MossPluginSnapshot[]; } +/** Quiescence policy for unloading one plugin generation. @beta */ +export interface MossPluginUnloadOptions { + /** Maximum time to wait for active plugin calls before retaining the old generation. */ + readonly timeoutMs?: number; +} + /** Handle returned after a plugin is installed successfully. @beta */ export interface MossPluginHandle { readonly id: string; readonly state: MossPluginState; - dispose(): Promise; + dispose(options?: MossPluginUnloadOptions): Promise; } /** Context used by host-trusted plugins to stage owned contributions. @beta */ export interface MossPluginContext { + /** Validated configuration for this activated plugin generation. */ + readonly config: Readonly>; registerTool(tool: Tool): void; registerSkill(skill: SkillMeta): void; registerExpert(expert: SubagentExpertDefinition): void; + registerCommand(command: MossPluginCommand): void; + registerProvider(provider: MossPluginProvider): void; + registerMcpPreset(preset: MossPluginMcpPreset): void; addPromptLayer(layer: string): void; registerWebContribution(contribution: MossWebContribution): void; effect(setup: () => MossPluginDisposer | Promise, label?: string): void; @@ -73,14 +126,39 @@ export interface MossPluginContext { /** Host-trusted runtime plugin. Workspace/model text cannot create one. @beta */ export interface MossPlugin { readonly id: string; + /** Validated configuration captured for this immutable activation candidate. @internal */ + readonly config?: Readonly>; + /** Dispose an isolated candidate that was prepared but never installed. @internal */ + readonly disposeCandidate?: MossPluginDisposer; setup(context: MossPluginContext): void | MossPluginDisposer | Promise; } /** Instance-local lifecycle and inspection surface for host-trusted plugins. @beta */ export interface MossPluginHost { install(plugin: MossPlugin): Promise; - unload(id: string): Promise; + unload(id: string, options?: MossPluginUnloadOptions): Promise; inspect(): MossPluginCompositionSnapshot; + getCommand(id: string): MossPluginCommand | undefined; + listCommands(): readonly MossPluginCommand[]; + expandCommand(id: string, args: string): Promise; + getProvider(id: string): MossPluginProvider | undefined; + listProviders(): readonly MossPluginProvider[]; + createProvider( + id: string, + config: Readonly> + ): Promise; + getMcpPreset(id: string): MossPluginMcpPreset | undefined; + listMcpPresets(): readonly MossPluginMcpPreset[]; + /** Activate and own a resource derived from an MCP preset under its plugin lease. @internal */ + activateMcpPreset( + id: string, + setup: (preset: MossPluginMcpPreset) => Promise<{ + readonly value: T; + readonly dispose: MossPluginDisposer; + }> + ): Promise; + getWebContributions(): readonly MossWebContribution[]; + subscribe(listener: (snapshot: MossPluginCompositionSnapshot) => void): MossPluginDisposer; close(): Promise; /** @internal */ getPromptLayers(): readonly string[]; @@ -98,10 +176,14 @@ export interface MossPluginHostAdapters { registerExpert(expert: SubagentExpertDefinition): MossPluginDisposer; } -interface StagedPlugin { +/** Contribution batch staged before an atomic plugin activation. @internal */ +export interface StagedPlugin { readonly tools: Tool[]; readonly skills: SkillMeta[]; readonly experts: SubagentExpertDefinition[]; + readonly commands: MossPluginCommand[]; + readonly providers: MossPluginProvider[]; + readonly mcpPresets: MossPluginMcpPreset[]; readonly promptLayers: string[]; readonly webContributions: MossWebContribution[]; readonly effects: Array<{ @@ -115,26 +197,13 @@ interface PluginRecord { readonly scope: CordisEffectScope; readonly staged: StagedPlugin; state: MossPluginState; + activated: boolean; + activeCalls: number; + readonly quiescenceWaiters: Set<() => void>; disposePromise?: Promise; } -function duplicate(values: readonly string[]): string | undefined { - const seen = new Set(); - for (const value of values) { - if (seen.has(value)) return value; - seen.add(value); - } - return undefined; -} - -function validatePluginId(id: string): void { - if (!PLUGIN_ID_PATTERN.test(id)) { - throw new MossError({ - code: ErrorCode.USER_INPUT_INVALID, - message: `plugin id must be lowercase and path-like: ${id}`, - }); - } -} +const DEFAULT_QUIESCENCE_TIMEOUT_MS = 30_000; /** * Instance-local plugin lifecycle host backed by a vendored Cordis effect scope. @@ -148,7 +217,13 @@ function validatePluginId(id: string): void { class MossPluginHostImpl implements MossPluginHost { private readonly records = new Map(); private readonly promptLayers = new Map(); + private readonly commands = new Map(); + private readonly providers = new Map(); + private readonly mcpPresets = new Map(); + private readonly webContributions = new Map(); private readonly installOrder: string[] = []; + private readonly listeners = new Set<(snapshot: MossPluginCompositionSnapshot) => void>(); + private generation = 0; private closePromise: Promise | undefined; constructor(private readonly adapters: MossPluginHostAdapters) {} @@ -168,29 +243,41 @@ class MossPluginHostImpl implements MossPluginHost { }); } - const staged: StagedPlugin = { - tools: [], - skills: [], - experts: [], - promptLayers: [], - webContributions: [], - effects: [], - }; + const staged = createStagedPlugin(); const record: PluginRecord = { id: plugin.id, state: 'loading', scope: new CordisEffectScope(), staged, + activated: false, + activeCalls: 0, + quiescenceWaiters: new Set(), }; this.records.set(plugin.id, record); try { - const returned = await plugin.setup(this.createContext(staged)); + const returned = await plugin.setup(this.createContext(staged, plugin.config ?? {})); if (typeof returned === 'function') await this.addOwned(record, returned, 'plugin setup'); - this.validateStaged(plugin.id, staged); + validateStagedContributions( + plugin.id, + staged, + { + hasTool: this.adapters.hasTool, + hasSkill: this.adapters.hasSkill, + hasExpert: this.adapters.hasExpert, + hasCommand: (id) => this.commands.has(id), + hasProvider: (id) => this.providers.has(id), + hasMcpPreset: (id) => this.mcpPresets.has(id), + hasWebContribution: (id) => this.webContributions.has(id), + }, + MOSS_WEB_SLOTS + ); await this.commit(record); record.state = 'active'; + record.activated = true; this.installOrder.push(plugin.id); + this.generation += 1; + this.emitComposition(); return this.createHandle(record); } catch (error) { record.state = 'failed'; @@ -208,50 +295,187 @@ class MossPluginHostImpl implements MossPluginHost { return Object.freeze([...this.promptLayers.values()].flat()); } + getCommand(id: string): MossPluginCommand | undefined { + return this.commands.get(id); + } + + listCommands(): readonly MossPluginCommand[] { + return Object.freeze( + [...this.commands.values()].sort((left, right) => left.id.localeCompare(right.id)) + ); + } + + async expandCommand(id: string, args: string): Promise { + const command = this.commands.get(id); + if (!command) return undefined; + const record = this.ownerOf('commands', id); + if (!record) return command.expand(args); + const release = this.acquireCall(record); + try { + return await command.expand(args); + } finally { + await release(); + } + } + + getProvider(id: string): MossPluginProvider | undefined { + return this.providers.get(id); + } + + listProviders(): readonly MossPluginProvider[] { + return Object.freeze( + [...this.providers.values()].sort((left, right) => left.id.localeCompare(right.id)) + ); + } + + async createProvider( + id: string, + config: Readonly> + ): Promise { + const contribution = this.providers.get(id); + if (!contribution) return undefined; + const record = this.ownerOf('providers', id); + if (!record) return contribution.create(config); + const release = this.acquireCall(record); + try { + const provider = await contribution.create(config); + return this.wrapProviderWithLease(record, provider); + } finally { + await release(); + } + } + + getMcpPreset(id: string): MossPluginMcpPreset | undefined { + return this.mcpPresets.get(id); + } + + listMcpPresets(): readonly MossPluginMcpPreset[] { + return Object.freeze( + [...this.mcpPresets.values()].sort((left, right) => left.id.localeCompare(right.id)) + ); + } + + async activateMcpPreset( + id: string, + setup: (preset: MossPluginMcpPreset) => Promise<{ + readonly value: T; + readonly dispose: MossPluginDisposer; + }> + ): Promise { + const preset = this.mcpPresets.get(id); + if (!preset) return undefined; + const record = this.ownerOf('mcpPresets', id); + if (!record) { + throw new MossError({ + code: ErrorCode.INTERNAL_INVARIANT_VIOLATED, + message: `plugin MCP preset has no lifecycle owner: ${id}`, + }); + } + const release = this.acquireCall(record); + try { + const activated = await setup(preset); + if (record.state !== 'active') { + await activated.dispose(); + throw new MossError({ + code: ErrorCode.AGENT_DISPOSED, + message: `plugin is draining: ${record.id}`, + context: { pluginId: record.id }, + }); + } + record.scope.add(activated.dispose, `mcp-activation:${id}`); + return activated.value; + } finally { + await release(); + } + } + + getWebContributions(): readonly MossWebContribution[] { + return Object.freeze( + [...this.webContributions.values()].sort((left, right) => left.id.localeCompare(right.id)) + ); + } + + subscribe(listener: (snapshot: MossPluginCompositionSnapshot) => void): MossPluginDisposer { + this.listeners.add(listener); + return () => { + this.listeners.delete(listener); + }; + } + inspect(): MossPluginCompositionSnapshot { const plugins = [...this.records.values()] .map((record) => ({ id: record.id, state: record.state, + callState: + record.state === 'active' + ? ('accepting' as const) + : record.state === 'disposed' + ? ('disposed' as const) + : ('draining' as const), tools: Object.freeze(record.staged.tools.map(({ name }) => name).sort()), skills: Object.freeze( record.staged.skills.map((skill) => skill.stableId ?? skill.name).sort() ), experts: Object.freeze(record.staged.experts.map(({ id }) => id).sort()), + commands: Object.freeze(record.staged.commands.map(({ id }) => id).sort()), + providers: Object.freeze(record.staged.providers.map(({ id }) => id).sort()), + mcpPresets: Object.freeze(record.staged.mcpPresets.map(({ id }) => id).sort()), promptLayerCount: record.staged.promptLayers.length, effectLabels: Object.freeze([...record.scope.labels()].sort()), webContributions: Object.freeze(record.staged.webContributions.map(({ id }) => id).sort()), })) .sort((left, right) => left.id.localeCompare(right.id)); - return Object.freeze({ plugins: Object.freeze(plugins) }); + return Object.freeze({ generation: this.generation, plugins: Object.freeze(plugins) }); } - unload(id: string): Promise { + unload(id: string, options?: MossPluginUnloadOptions): Promise { const record = this.records.get(id); if (!record) return Promise.resolve(); - return this.unloadRecord(record); + return this.unloadRecord(record, options); } - private unloadRecord(record: PluginRecord): Promise { + private unloadRecord(record: PluginRecord, options: MossPluginUnloadOptions = {}): Promise { if (record.state === 'disposed') return Promise.resolve(); if (record.disposePromise) return record.disposePromise; record.state = 'unloading'; - record.disposePromise = record.scope - .dispose() - .catch((error: unknown) => { - throw wrapAsMoss(error, ErrorCode.TOOL_EXECUTION_FAILED, { - message: `failed to unload plugin ${record.id}`, - context: { pluginId: record.id }, - }); - }) - .finally(() => { + const operation = (async () => { + try { + try { + await this.waitForQuiescence(record, options.timeoutMs ?? DEFAULT_QUIESCENCE_TIMEOUT_MS); + } catch (error) { + record.state = 'active'; + throw error; + } + let disposalError: unknown; + let disposalFailed = false; + try { + await record.scope.dispose(); + } catch (error) { + disposalError = error; + disposalFailed = true; + } record.state = 'disposed'; this.promptLayers.delete(record.id); if (this.records.get(record.id) === record) this.records.delete(record.id); const index = this.installOrder.indexOf(record.id); if (index >= 0) this.installOrder.splice(index, 1); - }); - return record.disposePromise; + if (record.activated && record.id !== 'moss/compatibility') { + this.generation += 1; + this.emitComposition(); + } + if (disposalFailed) { + throw wrapAsMoss(disposalError, ErrorCode.TOOL_EXECUTION_FAILED, { + message: `failed to unload plugin ${record.id}`, + context: { pluginId: record.id }, + }); + } + } finally { + record.disposePromise = undefined; + } + })(); + record.disposePromise = operation; + return operation; } close(): Promise { @@ -259,6 +483,9 @@ class MossPluginHostImpl implements MossPluginHost { this.closePromise = (async () => { const failures: unknown[] = []; const records = [...this.records.values()].reverse(); + for (const record of records) { + if (record.state !== 'disposed') record.state = 'unloading'; + } for (const record of records) { try { await this.unloadRecord(record); @@ -288,70 +515,43 @@ class MossPluginHostImpl implements MossPluginHost { id: 'moss/compatibility', state: 'active', scope: new CordisEffectScope(), - staged: { - tools: [], - skills: [], - experts: [], - promptLayers: [], - webContributions: [], - effects: [], - }, + staged: createStagedPlugin(), + activated: true, + activeCalls: 0, + quiescenceWaiters: new Set(), }; record.scope.add(dispose, label); this.records.set(record.id, record); this.installOrder.push(record.id); } - private createContext(staged: StagedPlugin): MossPluginContext { + private createContext( + staged: StagedPlugin, + config: Readonly> + ): MossPluginContext { return { + config, registerTool: (tool) => staged.tools.push(tool), registerSkill: (skill) => staged.skills.push(skill), registerExpert: (expert) => staged.experts.push(expert), + registerCommand: (command) => staged.commands.push(command), + registerProvider: (provider) => staged.providers.push(provider), + registerMcpPreset: (preset) => staged.mcpPresets.push(preset), addPromptLayer: (layer) => staged.promptLayers.push(layer), registerWebContribution: (contribution) => staged.webContributions.push(contribution), effect: (setup, label = 'plugin effect') => staged.effects.push({ setup, label }), }; } - private validateStaged(pluginId: string, staged: StagedPlugin): void { - const duplicateTool = duplicate(staged.tools.map(({ name }) => name)); - const duplicateSkill = duplicate(staged.skills.map((skill) => skill.stableId ?? skill.name)); - const duplicateExpert = duplicate(staged.experts.map(({ id }) => id)); - const duplicateWebContribution = duplicate(staged.webContributions.map(({ id }) => id)); - const conflict = duplicateTool ?? duplicateSkill ?? duplicateExpert ?? duplicateWebContribution; - if (conflict) - throw new Error(`plugin ${pluginId} contains duplicate contribution: ${conflict}`); - for (const tool of staged.tools) { - if (!tool.metadata?.sideEffectClass) - throw new Error(`plugin tool ${tool.name} requires side-effect metadata`); - if (this.adapters.hasTool(tool.name)) - throw new Error(`plugin tool already registered: ${tool.name}`); - } - for (const skill of staged.skills) { - const id = skill.stableId ?? skill.name; - if (this.adapters.hasSkill(id)) throw new Error(`plugin skill already registered: ${id}`); - } - for (const expert of staged.experts) { - if (this.adapters.hasExpert(expert.id)) - throw new Error(`plugin expert already registered: ${expert.id}`); - } - for (const layer of staged.promptLayers) { - if (!layer.trim()) throw new Error(`plugin ${pluginId} contains an empty prompt layer`); - } - for (const contribution of staged.webContributions) { - if (!PLUGIN_ID_PATTERN.test(contribution.id)) - throw new Error(`plugin ${pluginId} contains an invalid web contribution id`); - if (!MOSS_WEB_SLOTS.includes(contribution.slot)) - throw new Error(`plugin ${pluginId} contains an unsupported web contribution slot`); - if (!contribution.module.startsWith('./') || contribution.module.includes('..')) - throw new Error(`plugin ${pluginId} web contribution module must be package-relative`); - } - } - private async commit(record: PluginRecord): Promise { this.assertLoading(record); for (const tool of record.staged.tools) { - await this.addOwned(record, this.adapters.registerTool(tool, record.id), `tool:${tool.name}`); + const leasedTool = this.wrapToolWithLease(record, tool); + await this.addOwned( + record, + this.adapters.registerTool(leasedTool, record.id), + `tool:${tool.name}` + ); } for (const skill of record.staged.skills) { const id = skill.stableId ?? skill.name; @@ -360,6 +560,34 @@ class MossPluginHostImpl implements MossPluginHost { for (const expert of record.staged.experts) { await this.addOwned(record, this.adapters.registerExpert(expert), `expert:${expert.id}`); } + for (const command of record.staged.commands) { + await this.addOwned( + record, + this.registerOwned(this.commands, command), + `command:${command.id}` + ); + } + for (const provider of record.staged.providers) { + await this.addOwned( + record, + this.registerOwned(this.providers, provider), + `provider:${provider.id}` + ); + } + for (const preset of record.staged.mcpPresets) { + await this.addOwned( + record, + this.registerOwned(this.mcpPresets, preset), + `mcp-preset:${preset.id}` + ); + } + for (const contribution of record.staged.webContributions) { + await this.addOwned( + record, + this.registerOwned(this.webContributions, contribution, `${record.id}:${contribution.id}`), + `web:${contribution.id}` + ); + } if (record.staged.promptLayers.length > 0) { this.promptLayers.set(record.id, Object.freeze([...record.staged.promptLayers])); record.scope.add(() => { @@ -380,6 +608,158 @@ class MossPluginHostImpl implements MossPluginHost { } } + private registerOwned( + registry: Map, + contribution: T, + key = contribution.id + ): MossPluginDisposer { + registry.set(key, contribution); + return () => { + if (registry.get(key) === contribution) registry.delete(key); + }; + } + + private acquireCall(record: PluginRecord): MossPluginDisposer { + if (record.state !== 'active') { + throw new MossError({ + code: ErrorCode.AGENT_DISPOSED, + message: `plugin is draining: ${record.id}`, + context: { pluginId: record.id }, + }); + } + record.activeCalls += 1; + let released = false; + return () => { + if (released) return; + released = true; + record.activeCalls -= 1; + if (record.activeCalls === 0) { + for (const resolve of record.quiescenceWaiters) resolve(); + record.quiescenceWaiters.clear(); + } + }; + } + + private wrapToolWithLease(record: PluginRecord, tool: Tool): Tool { + const execute = tool.execute.bind(tool); + const executeStructured = tool.executeStructured?.bind(tool); + return { + ...tool, + execute: async (input, context) => { + const release = this.acquireCall(record); + try { + return await execute(input, context); + } finally { + await release(); + } + }, + ...(executeStructured + ? { + executeStructured: async (input, context) => { + const release = this.acquireCall(record); + try { + return await executeStructured(input, context); + } finally { + await release(); + } + }, + } + : {}), + }; + } + + private wrapProviderWithLease(record: PluginRecord, provider: LLMProvider): LLMProvider { + return { + id: provider.id, + displayName: provider.displayName, + ...(provider.capabilities ? { capabilities: provider.capabilities } : {}), + complete: async (options) => { + const release = this.acquireCall(record); + try { + return await provider.complete(options); + } finally { + await release(); + } + }, + stream: async (options, onEvent) => { + const release = this.acquireCall(record); + try { + return await provider.stream(options, onEvent); + } finally { + await release(); + } + }, + ...(provider.countTokens + ? { + countTokens: async (value: string) => { + const release = this.acquireCall(record); + try { + return await provider.countTokens!(value); + } finally { + await release(); + } + }, + } + : {}), + }; + } + + private ownerOf( + kind: 'commands' | 'providers' | 'mcpPresets', + id: string + ): PluginRecord | undefined { + return [...this.records.values()].find((record) => + record.staged[kind].some((item) => item.id === id) + ); + } + + private emitComposition(): void { + if (this.listeners.size === 0) return; + const snapshot = this.inspect(); + for (const listener of this.listeners) { + try { + listener(snapshot); + } catch { + // Observers are diagnostics/UI adapters and cannot invalidate an activated generation. + } + } + } + + private async waitForQuiescence(record: PluginRecord, timeoutMs: number): Promise { + if (!Number.isFinite(timeoutMs) || timeoutMs < 0) { + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: 'plugin unload timeout must be a non-negative finite number', + }); + } + if (record.activeCalls === 0) return; + let resolveWaiter: (() => void) | undefined; + const quiescent = new Promise((resolve) => { + resolveWaiter = resolve; + record.quiescenceWaiters.add(resolve); + }); + let timer: NodeJS.Timeout | undefined; + try { + await Promise.race([ + quiescent, + new Promise((_, reject) => { + timer = setTimeout(() => { + reject( + new MossError({ + code: ErrorCode.TOOL_EXECUTION_FAILED, + message: `plugin did not become quiescent: ${record.id}`, + context: { pluginId: record.id, activeCalls: record.activeCalls, timeoutMs }, + }) + ); + }, timeoutMs); + }), + ]); + } finally { + if (timer) clearTimeout(timer); + if (resolveWaiter) record.quiescenceWaiters.delete(resolveWaiter); + } + } + private async addOwned( record: PluginRecord, dispose: MossPluginDisposer, @@ -398,7 +778,7 @@ class MossPluginHostImpl implements MossPluginHost { get state() { return record.state; }, - dispose: () => this.unloadRecord(record), + dispose: (options) => this.unloadRecord(record, options), }; } } diff --git a/packages/moss-agent/src/core/tools/tool-types.ts b/packages/moss-agent/src/core/tools/tool-types.ts index acd38eda..f9d5ff97 100644 --- a/packages/moss-agent/src/core/tools/tool-types.ts +++ b/packages/moss-agent/src/core/tools/tool-types.ts @@ -40,6 +40,8 @@ export interface ToolContext { * uses this to show incremental output from long-running commands (e.g. * `npm install`, `pytest`) instead of buffering until the tool finishes. */ onToolOutput?: (text: string) => void; + /** Host-owned interactive question channel scoped to this agent instance. */ + askUserQuestion?: (question: string, abortSignal?: AbortSignal) => Promise; spawnSubagent?: (params: { task: string; label?: string; diff --git a/packages/moss-agent/src/index.ts b/packages/moss-agent/src/index.ts index b2ecd004..93b21662 100644 --- a/packages/moss-agent/src/index.ts +++ b/packages/moss-agent/src/index.ts @@ -144,14 +144,19 @@ export { collectCapabilityPacks } from './core/index.js'; export { MOSS_WEB_SLOTS } from './core/index.js'; export type { CapabilityPack, CapabilityPackContributions } from './core/index.js'; export type { + MossPluginCallState, + MossPluginCommand, MossPlugin, MossPluginCompositionSnapshot, MossPluginContext, MossPluginDisposer, MossPluginHandle, MossPluginHost, + MossPluginMcpPreset, + MossPluginProvider, MossPluginSnapshot, MossPluginState, + MossPluginUnloadOptions, MossWebContribution, MossWebSlot, } from './core/index.js'; diff --git a/packages/moss-agent/src/plugins/dsh-bundle-compatibility.ts b/packages/moss-agent/src/plugins/dsh-bundle-compatibility.ts new file mode 100644 index 00000000..1d369ff7 --- /dev/null +++ b/packages/moss-agent/src/plugins/dsh-bundle-compatibility.ts @@ -0,0 +1,360 @@ +import { access, readFile, realpath } from 'node:fs/promises'; +import path from 'node:path'; +import { parse as parseYaml } from 'yaml'; +import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; +import type { MossPlugin } from '../core/plugins/plugin-host.js'; +import { + parseMossPluginConfigSchema, + type MossPluginConfigSchema, +} from './plugin-config-schema.js'; + +interface AdapterSkill { + readonly id: string; + readonly file: string; + readonly name?: string; + readonly description?: string; + readonly triggers?: readonly string[]; +} + +interface AdapterCommand { + readonly id: string; + readonly title: string; + readonly description?: string; + readonly prompt: string; +} + +interface AdapterMcpPreset { + readonly id: string; + readonly displayName: string; + readonly command: string; + readonly args?: readonly string[]; + readonly env?: Readonly>; +} + +interface ParsedDshPackage { + readonly id: string; + readonly version: string; + readonly root: string; + readonly skills: readonly AdapterSkill[]; + readonly commands: readonly AdapterCommand[]; + readonly mcpPresets: readonly AdapterMcpPreset[]; + readonly configSchema?: MossPluginConfigSchema; + readonly skipped: readonly string[]; +} + +const PLUGIN_ID_PATTERN = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/; +const EXACT_VERSION_PATTERN = + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-(?:(?:0|[1-9]\d*)|(?:\d*[A-Za-z-][0-9A-Za-z-]*))(?:\.(?:(?:0|[1-9]\d*)|(?:\d*[A-Za-z-][0-9A-Za-z-]*)))*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/; + +/** Result of auditing a real DSH package without executing it. @beta */ +export interface DshPackageCompatibilityReport { + readonly compatible: boolean; + readonly id?: string; + readonly version?: string; + readonly imported: readonly string[]; + readonly skipped: readonly string[]; + readonly reasons: readonly string[]; +} + +/** A safely mapped, data-only DSH package. @beta */ +export interface ImportedDshPackage { + readonly report: DshPackageCompatibilityReport; + readonly plugin: MossPlugin; + readonly configSchema?: MossPluginConfigSchema; +} + +function invalid(message: string): MossError { + return new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); +} + +function record(value: unknown, field: string): Record { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + throw invalid(`${field} must be an object`); + } + return value as Record; +} + +function stringField(value: unknown, field: string): string { + if (typeof value !== 'string' || !value.trim()) { + throw invalid(`${field} must be a non-empty string`); + } + return value; +} + +function stringArray(value: unknown, field: string): readonly string[] | undefined { + if (value === undefined) return undefined; + if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) { + throw invalid(`${field} must be an array of strings`); + } + return value as string[]; +} + +function stringRecord(value: unknown, field: string): Readonly> | undefined { + if (value === undefined) return undefined; + const result = record(value, field); + for (const [name, item] of Object.entries(result)) { + if (typeof item !== 'string') throw invalid(`${field}.${name} must be a string`); + } + return result as Record; +} + +async function containedPath(root: string, relative: string, field: string): Promise { + if (path.isAbsolute(relative)) throw invalid(`${field} must be package-relative`); + const target = await realpath(path.resolve(root, relative)); + const fromRoot = path.relative(root, target); + if (fromRoot === '..' || fromRoot.startsWith(`..${path.sep}`) || path.isAbsolute(fromRoot)) { + throw invalid(`${field} escapes the DSH package root`); + } + return target; +} + +function hasClientAbi(packageJson: Record, patch: unknown): boolean { + if (recordOrEmpty(packageJson.dsh).client !== undefined) return true; + const dependencies = { + ...recordOrEmpty(packageJson.dependencies), + ...recordOrEmpty(packageJson.peerDependencies), + }; + if (Object.keys(dependencies).some((name) => /dsh-(?:client|web)|dsh\/client/i.test(name))) { + return true; + } + return /(?:dsh\.client|client\.slot|clientSlots|dsh-client)/i.test(JSON.stringify(patch)); +} + +function recordOrEmpty(value: unknown): Record { + return value && typeof value === 'object' && !Array.isArray(value) + ? (value as Record) + : {}; +} + +async function optionalFile(root: string, name: string): Promise { + try { + const target = await containedPath(root, name, name); + await access(target); + return target; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined; + throw error; + } +} + +function parseAdapterSkill(value: unknown, index: number): AdapterSkill { + const item = record(value, `adapter.skills[${index}]`); + return { + id: stringField(item.id ?? item.name, `adapter.skills[${index}].id`), + file: stringField(item.file, `adapter.skills[${index}].file`), + ...(typeof item.name === 'string' ? { name: item.name } : {}), + ...(typeof item.description === 'string' ? { description: item.description } : {}), + ...(stringArray(item.triggers ?? item.trigger, `adapter.skills[${index}].triggers`) + ? { + triggers: stringArray(item.triggers ?? item.trigger, `adapter.skills[${index}].triggers`), + } + : {}), + }; +} + +async function parsePackage(source: string): Promise { + const root = await realpath(path.resolve(source)); + const packagePath = await containedPath(root, 'package.json', 'package.json'); + const packageJson = record(JSON.parse(await readFile(packagePath, 'utf8')), packagePath); + const id = stringField(packageJson.name, 'package.json.name') + .replace(/^@/, '') + .replaceAll('/', '-') + .replace(/[^a-z0-9.-]+/gi, '-') + .toLowerCase(); + const version = stringField(packageJson.version, 'package.json.version'); + if (!PLUGIN_ID_PATTERN.test(id)) + throw invalid(`package.json.name maps to an invalid plugin id: ${id}`); + if (!EXACT_VERSION_PATTERN.test(version)) { + throw invalid('package.json.version must be an exact semantic version'); + } + const patchPath = await optionalFile(root, 'cordis.patch.yml'); + if (!patchPath) throw invalid('not a DSH package: cordis.patch.yml is missing'); + let patch: unknown; + try { + patch = parseYaml(await readFile(patchPath, 'utf8'), { maxAliasCount: 0 }); + } catch (error) { + throw invalid( + `cordis.patch.yml is invalid: ${error instanceof Error ? error.message : String(error)}` + ); + } + if (hasClientAbi(packageJson, patch)) { + throw invalid('DSH package requires unsupported Cordis client UI slots'); + } + + const adapterPath = await optionalFile(root, 'moss.dsh-adapter.json'); + const adapter = adapterPath + ? record(JSON.parse(await readFile(adapterPath, 'utf8')), adapterPath) + : {}; + const adapterSkills = adapter.skills ?? []; + const adapterCommands = adapter.commands ?? []; + const adapterMcp = adapter.mcpPresets ?? adapter.mcp ?? []; + if ( + !Array.isArray(adapterSkills) || + !Array.isArray(adapterCommands) || + !Array.isArray(adapterMcp) + ) { + throw invalid('Moss DSH adapter contributions must be arrays'); + } + const skills = adapterSkills.map(parseAdapterSkill); + if (skills.length === 0) { + const skillPath = await optionalFile(root, 'SKILL.md'); + if (skillPath) skills.push({ id, name: id, file: 'SKILL.md' }); + } + const commands = adapterCommands.map((value, index): AdapterCommand => { + const item = record(value, `adapter.commands[${index}]`); + return { + id: stringField(item.id, `adapter.commands[${index}].id`), + title: stringField(item.title, `adapter.commands[${index}].title`), + ...(typeof item.description === 'string' ? { description: item.description } : {}), + prompt: stringField(item.prompt, `adapter.commands[${index}].prompt`), + }; + }); + const mcpPresets = adapterMcp.map((value, index): AdapterMcpPreset => { + const item = record(value, `adapter.mcp[${index}]`); + const server = record(item.server ?? item, `adapter.mcp[${index}].server`); + const args = stringArray(server.args, `adapter.mcp[${index}].args`); + const env = stringRecord(server.env, `adapter.mcp[${index}].env`); + return { + id: stringField(item.id, `adapter.mcp[${index}].id`), + displayName: stringField(item.displayName ?? item.name, `adapter.mcp[${index}].displayName`), + command: stringField(server.command, `adapter.mcp[${index}].command`), + ...(args ? { args } : {}), + ...(env ? { env } : {}), + }; + }); + const configSchema = adapter.configSchema + ? typeof adapter.configSchema === 'string' + ? parseMossPluginConfigSchema( + JSON.parse( + await readFile( + await containedPath(root, adapter.configSchema, 'adapter.configSchema'), + 'utf8' + ) + ), + `${adapterPath}#configSchema` + ) + : parseMossPluginConfigSchema(adapter.configSchema, `${adapterPath}#configSchema`) + : undefined; + if (skills.length + commands.length + mcpPresets.length + (configSchema ? 1 : 0) === 0) { + throw invalid( + 'DSH package has no safely mappable SKILL.md or Moss adapter command/MCP/config declaration' + ); + } + return { + id, + version, + root, + skills, + commands, + mcpPresets, + ...(configSchema ? { configSchema } : {}), + skipped: Object.freeze(['cordis.patch.yml runtime']), + }; +} + +/** Audit a real `package.json + cordis.patch.yml` DSH package without executing JavaScript. @beta */ +export async function inspectDshPackageCompatibility( + source: string +): Promise { + try { + const parsed = await parsePackage(source); + return Object.freeze({ + compatible: true, + id: parsed.id, + version: parsed.version, + imported: Object.freeze([ + ...parsed.skills.map(({ id }) => `skill:${id}`), + ...parsed.commands.map(({ id }) => `command:${id}`), + ...parsed.mcpPresets.map(({ id }) => `mcp:${id}`), + ...(parsed.configSchema ? ['config:schema'] : []), + ]), + skipped: parsed.skipped, + reasons: Object.freeze([ + 'Only package data and the explicit Moss DSH adapter are mapped; Cordis runtime JavaScript is not executed.', + ]), + }); + } catch (error) { + let packageIdentity: { id?: string; version?: string } = {}; + try { + const root = await realpath(path.resolve(source)); + const value = record( + JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')), + 'package.json' + ); + packageIdentity = { + ...(typeof value.name === 'string' ? { id: value.name } : {}), + ...(typeof value.version === 'string' ? { version: value.version } : {}), + }; + } catch {} + return Object.freeze({ + compatible: false, + ...packageIdentity, + imported: Object.freeze([]), + skipped: Object.freeze(['Cordis runtime and client contributions']), + reasons: Object.freeze([error instanceof Error ? error.message : String(error)]), + }); + } +} + +/** Import the safe declarative subset of a real DSH package as a Moss plugin. @beta */ +export async function importDshPackage(source: string): Promise { + try { + const parsed = await parsePackage(source); + const report = await inspectDshPackageCompatibility(source); + const plugin: MossPlugin = { + id: parsed.id, + async setup(context) { + for (const skill of parsed.skills) { + const sourcePath = await containedPath(parsed.root, skill.file, `skill ${skill.id}`); + const raw = await readFile(sourcePath, 'utf8'); + const body = raw.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '').trim(); + if (!body) throw invalid(`DSH Skill ${skill.id} is empty`); + context.registerSkill({ + stableId: skill.id, + name: skill.name ?? skill.id, + description: skill.description ?? `Imported data-only Skill from ${parsed.id}`, + summary: skill.description ?? `Imported data-only Skill from ${parsed.id}`, + sourcePath, + version: parsed.version, + tags: ['dsh-compatible'], + trigger: [...(skill.triggers ?? [skill.id])], + risk: 'low', + permissions: { workspaceRead: true }, + enabled: true, + updatedAt: 0, + body, + }); + } + for (const command of parsed.commands) { + context.registerCommand({ + id: command.id, + title: command.title, + ...(command.description ? { description: command.description } : {}), + expand: (args) => command.prompt.replaceAll('{{args}}', args.trim()), + }); + } + for (const preset of parsed.mcpPresets) { + context.registerMcpPreset({ + id: preset.id, + displayName: preset.displayName, + server: { + command: preset.command, + ...(preset.args ? { args: preset.args } : {}), + ...(preset.env ? { env: preset.env } : {}), + }, + }); + } + }, + }; + return { + report, + plugin, + ...(parsed.configSchema ? { configSchema: parsed.configSchema } : {}), + }; + } catch (error) { + throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { + message: `unable to import DSH package ${source}`, + context: { source }, + }); + } +} diff --git a/packages/moss-agent/src/plugins/installed-plugin-registry.ts b/packages/moss-agent/src/plugins/installed-plugin-registry.ts index 02cf0c00..e39d467b 100644 --- a/packages/moss-agent/src/plugins/installed-plugin-registry.ts +++ b/packages/moss-agent/src/plugins/installed-plugin-registry.ts @@ -1,8 +1,7 @@ import { randomUUID } from 'node:crypto'; -import { access, mkdir, readFile, realpath, rename, writeFile } from 'node:fs/promises'; +import { access, mkdir, readFile, realpath, rename, rm, writeFile } from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { Worker } from 'node:worker_threads'; import * as lockfile from 'proper-lockfile'; import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; import { @@ -11,6 +10,9 @@ import { type MossWebContribution, } from '../core/plugins/plugin-host.js'; import { runProcess } from '../utils/run-process.js'; +import { parseMossPluginConfigSchema } from './plugin-config-schema.js'; +import { importDshPackage, inspectDshPackageCompatibility } from './dsh-bundle-compatibility.js'; +import { createIsolatedMossPlugin } from './isolated-plugin-runtime.js'; const MANIFEST_NAME = 'moss.plugin.json'; const PLUGIN_ID_PATTERN = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/; @@ -41,6 +43,14 @@ export interface MossPluginManifestV1 { readonly configSchema?: string; } +/** Persisted record for one explicitly installed plugin. @beta */ +export interface InstalledMossPluginVersion { + readonly version: string; + readonly source: string; + readonly root: string; + readonly format?: 'moss-v1' | 'dsh-package-v1'; +} + /** Persisted record for one explicitly installed plugin. @beta */ export interface InstalledMossPlugin { readonly id: string; @@ -49,6 +59,10 @@ export interface InstalledMossPlugin { readonly root: string; readonly enabled: boolean; readonly installedAt: string; + /** Source contract used to load this entry. Missing means `moss-v1`. */ + readonly format?: 'moss-v1' | 'dsh-package-v1'; + /** Previous immutable npm generation retained for explicit rollback. */ + readonly lastGood?: InstalledMossPluginVersion; } /** Health result returned by `moss plugins doctor`. @beta */ @@ -61,7 +75,7 @@ export interface MossPluginDoctorResult { /** Isolated result of loading enabled plugins. @beta */ export interface LoadedMossPlugins { readonly plugins: readonly MossPlugin[]; - readonly failures: readonly { id: string; message: string }[]; + readonly failures: readonly { id: string; message: string; recovered?: boolean }[]; } interface InstalledPluginFile { @@ -72,6 +86,13 @@ interface InstalledPluginFile { /** Storage options for the trusted installed-plugin registry. @beta */ export interface InstalledPluginRegistryOptions { readonly configDir: string; + /** Maximum isolated import/setup validation time. @defaultValue 15000 */ + readonly setupTimeoutMs?: number; +} + +interface ResolvedPluginSource { + readonly root: string; + readonly discard?: () => Promise; } function invalidManifest(message: string, cause?: unknown): MossError { @@ -106,6 +127,32 @@ function validateInstalledPlugin(value: unknown, index: number): InstalledMossPl if (typeof entry.enabled !== 'boolean') { throw new Error(`plugins[${index}].enabled is invalid`); } + if ( + entry.format !== undefined && + entry.format !== 'moss-v1' && + entry.format !== 'dsh-package-v1' + ) { + throw new Error(`plugins[${index}].format is invalid`); + } + if (entry.lastGood !== undefined) { + if (!entry.lastGood || typeof entry.lastGood !== 'object') { + throw new Error(`plugins[${index}].lastGood is invalid`); + } + const previous = entry.lastGood as Record; + if ( + typeof previous.version !== 'string' || + !EXACT_VERSION_PATTERN.test(previous.version) || + typeof previous.source !== 'string' || + !previous.source || + typeof previous.root !== 'string' || + !previous.root || + (previous.format !== undefined && + previous.format !== 'moss-v1' && + previous.format !== 'dsh-package-v1') + ) { + throw new Error(`plugins[${index}].lastGood is invalid`); + } + } return entry as unknown as InstalledMossPlugin; } @@ -192,7 +239,9 @@ export async function readMossPluginManifest(root: string): Promise { - const manifest = await readMossPluginManifest(entry.root); - const worker = new Worker(new URL('./plugin-setup-worker.js', import.meta.url), { - workerData: { - moduleUrl: pathToFileURL(path.resolve(entry.root, manifest.runtime.module)).href, - exportName: manifest.runtime.export ?? 'default', - expectedId: manifest.id, - }, - }); - let timeout: NodeJS.Timeout | undefined; - const validation = new Promise((resolve, reject) => { - worker.once('message', (message: unknown) => { - if ( - message && - typeof message === 'object' && - (message as Record).ok === true - ) { - resolve(); - return; - } - const detail = - message && typeof message === 'object' - ? (message as Record).message - : undefined; - reject( - invalidManifest(typeof detail === 'string' ? detail : 'plugin setup validation failed') +async function assertInstalledIdentity(entry: InstalledMossPlugin): Promise { + if (entry.format === 'dsh-package-v1') { + const report = await inspectDshPackageCompatibility(entry.root); + if (!report.compatible || report.id !== entry.id || report.version !== entry.version) { + throw invalidManifest( + `installed plugin identity changed: expected ${entry.id}@${entry.version}, got ${report.id ?? 'invalid'}@${report.version ?? 'invalid'}` ); - }); - worker.once('error', reject); - worker.once('exit', (code) => { - if (code !== 0) reject(invalidManifest(`plugin setup worker exited with code ${code}`)); - }); - timeout = setTimeout(() => { - reject(invalidManifest(`plugin setup validation timed out after 15 seconds`)); - }, PLUGIN_SETUP_VALIDATION_TIMEOUT_MS); - }); - try { - await validation; - } finally { - if (timeout) clearTimeout(timeout); - await worker.terminate(); + } + return; + } + const manifest = await readMossPluginManifest(entry.root); + if (manifest.id !== entry.id || manifest.version !== entry.version) { + throw invalidManifest( + `installed plugin identity changed: expected ${entry.id}@${entry.version}, got ${manifest.id}@${manifest.version}` + ); } } @@ -273,12 +296,17 @@ export class InstalledPluginRegistry { private readonly registryPath: string; private readonly npmRoot: string; private readonly npmRunner: typeof runProcess; + private readonly setupTimeoutMs: number; constructor(options: InstalledPluginRegistryOptions) { this.registryDir = path.join(options.configDir, 'plugins'); this.registryPath = path.join(this.registryDir, 'installed.json'); this.npmRoot = path.join(this.registryDir, 'npm'); this.npmRunner = runProcess; + this.setupTimeoutMs = options.setupTimeoutMs ?? PLUGIN_SETUP_VALIDATION_TIMEOUT_MS; + if (!Number.isFinite(this.setupTimeoutMs) || this.setupTimeoutMs <= 0) { + throw invalidManifest('plugin setup timeout must be a positive finite number'); + } } async list(): Promise { @@ -288,35 +316,91 @@ export class InstalledPluginRegistry { async add(source: string): Promise { return this.mutate(async (assertLease) => { - const root = await this.resolveSource(source); - const manifest = await readMossPluginManifest(root); - const existing = (await this.readRegistry()).plugins; - if (existing.some(({ id }) => id === manifest.id)) { - throw invalidManifest(`plugin already installed: ${manifest.id}`); + const candidate = await this.resolveSource(source); + let committed = false; + try { + let id: string; + let version: string; + let format: InstalledMossPlugin['format'] = 'moss-v1'; + try { + const manifest = await readMossPluginManifest(candidate.root); + id = manifest.id; + version = manifest.version; + } catch (mossError) { + try { + await access(path.join(candidate.root, MANIFEST_NAME)); + throw mossError; + } catch (manifestAccessError) { + if (manifestAccessError === mossError) throw mossError; + } + const compatibility = await inspectDshPackageCompatibility(candidate.root); + if (!compatibility.compatible || !compatibility.id || !compatibility.version) { + throw invalidManifest( + `source is neither a Moss plugin nor a compatible DSH package: ${compatibility.reasons.join('; ')}`, + mossError + ); + } + id = compatibility.id; + version = compatibility.version; + format = 'dsh-package-v1'; + } + const existing = (await this.readRegistry()).plugins; + const previous = existing.find((entry) => entry.id === id); + if (previous && !candidate.discard) { + throw invalidManifest(`plugin already installed: ${id}`); + } + if (previous?.version === version) { + throw invalidManifest(`plugin version already installed: ${id}@${version}`); + } + const entry: InstalledMossPlugin = { + id, + version, + source, + root: candidate.root, + enabled: previous?.enabled ?? false, + installedAt: new Date().toISOString(), + format, + ...(previous + ? { + lastGood: { + version: previous.version, + source: previous.source, + root: previous.root, + format: previous.format, + }, + } + : {}), + }; + await assertInstalledIdentity(entry); + await this.writeRegistry( + previous + ? existing.map((candidateEntry) => (candidateEntry.id === id ? entry : candidateEntry)) + : [...existing, entry], + assertLease + ); + committed = true; + if (previous?.lastGood) { + await this.purgeNpmRoot(previous.lastGood.root).catch(() => {}); + } + return entry; + } finally { + if (!committed) await candidate.discard?.().catch(() => {}); } - const entry: InstalledMossPlugin = { - id: manifest.id, - version: manifest.version, - source, - root, - enabled: false, - installedAt: new Date().toISOString(), - }; - await this.writeRegistry([...existing, entry], assertLease); - return entry; }); } async remove(id: string): Promise { + let removed: InstalledMossPlugin | undefined; await this.mutate(async (assertLease) => { const entries = (await this.readRegistry()).plugins; - if (!entries.some((entry) => entry.id === id)) - throw invalidManifest(`plugin not installed: ${id}`); + removed = entries.find((entry) => entry.id === id); + if (!removed) throw invalidManifest(`plugin not installed: ${id}`); await this.writeRegistry( entries.filter((entry) => entry.id !== id), assertLease ); }); + if (removed) await this.purgeRemovedPlugin(removed).catch(() => {}); } async enable(id: string): Promise { @@ -327,18 +411,58 @@ export class InstalledPluginRegistry { await this.setEnabled(id, false); } + /** Restore the previous immutable npm generation after candidate activation fails. @beta */ + async rollback(id: string): Promise { + let failed: InstalledMossPlugin | undefined; + const restored = await this.mutate(async (assertLease) => { + const entries = (await this.readRegistry()).plugins; + const current = entries.find((entry) => entry.id === id); + if (!current?.lastGood) throw invalidManifest(`plugin has no last-good generation: ${id}`); + failed = current; + const replacement: InstalledMossPlugin = { + id: current.id, + ...current.lastGood, + enabled: current.enabled, + installedAt: current.installedAt, + }; + await this.writeRegistry( + entries.map((entry) => (entry.id === id ? replacement : entry)), + assertLease + ); + return replacement; + }); + if (failed) await this.purgeNpmRoot(failed.root).catch(() => {}); + return restored; + } + async loadEnabled(): Promise { const plugins: MossPlugin[] = []; - const failures: Array<{ id: string; message: string }> = []; + const failures: Array<{ id: string; message: string; recovered?: boolean }> = []; for (const entry of await this.list()) { if (!entry.enabled) continue; try { plugins.push(await this.load(entry)); } catch (error) { - failures.push({ - id: entry.id, - message: error instanceof Error ? error.message : String(error), - }); + const candidateMessage = error instanceof Error ? error.message : String(error); + if (entry.lastGood) { + try { + const restored = await this.rollback(entry.id); + plugins.push(await this.load(restored)); + failures.push({ + id: entry.id, + message: `candidate ${entry.version} failed and last-good ${restored.version} was restored: ${candidateMessage}`, + recovered: true, + }); + continue; + } catch (recoveryError) { + failures.push({ + id: entry.id, + message: `candidate failed (${candidateMessage}); last-good recovery failed (${diagnosticMessage(recoveryError)})`, + }); + continue; + } + } + failures.push({ id: entry.id, message: candidateMessage }); } } return { plugins: Object.freeze(plugins), failures: Object.freeze(failures) }; @@ -348,14 +472,13 @@ export class InstalledPluginRegistry { const results: MossPluginDoctorResult[] = []; for (const entry of await this.list()) { try { - const manifest = await readMossPluginManifest(entry.root); - await validatePluginSetup(entry); + await assertInstalledIdentity(entry); results.push({ id: entry.id, status: entry.enabled ? 'ok' : 'disabled', message: entry.enabled - ? `${manifest.version} validated successfully` - : `${manifest.version} is disabled; setup validation passed`, + ? `${entry.version} passed static validation` + : `${entry.version} is disabled; static validation passed`, }); } catch (error) { results.push({ @@ -368,22 +491,36 @@ export class InstalledPluginRegistry { return Object.freeze(results); } - private async load(entry: InstalledMossPlugin): Promise { + /** Load and isolate-validate one installed plugin before main-thread activation. @beta */ + async loadInstalled( + id: string, + options: { readonly config?: Readonly> } = {} + ): Promise { + const entry = (await this.list()).find((candidate) => candidate.id === id); + if (!entry) throw invalidManifest(`plugin not installed: ${id}`); + return this.load(entry, options.config); + } + + private async load( + entry: InstalledMossPlugin, + explicitConfig?: Readonly> + ): Promise { + await assertInstalledIdentity(entry); + const config = explicitConfig ?? (await this.loadPluginConfig(entry)); + if (entry.format === 'dsh-package-v1') { + const imported = await importDshPackage(entry.root); + return { ...imported.plugin, config }; + } const manifest = await readMossPluginManifest(entry.root); const moduleUrl = pathToFileURL(path.resolve(entry.root, manifest.runtime.module)).href; - const imported = (await import(moduleUrl)) as Record; - const candidate = imported[manifest.runtime.export ?? 'default']; - if ( - !candidate || - typeof candidate !== 'object' || - typeof (candidate as MossPlugin).setup !== 'function' - ) { - throw invalidManifest(`plugin ${entry.id} did not export a MossPlugin`); - } - const plugin = candidate as MossPlugin; - if (plugin.id !== manifest.id) - throw invalidManifest(`plugin export id does not match manifest: ${manifest.id}`); - return plugin; + return createIsolatedMossPlugin({ + moduleUrl, + exportName: manifest.runtime.export ?? 'default', + pluginId: manifest.id, + timeoutMs: this.setupTimeoutMs, + manifestWebContributions: manifest.web?.contributions, + config, + }); } private async setEnabled(id: string, enabled: boolean): Promise { @@ -393,7 +530,7 @@ export class InstalledPluginRegistry { if (!target) throw invalidManifest(`plugin not installed: ${id}`); if (enabled) { try { - await validatePluginSetup(target); + await assertInstalledIdentity(target); } catch (error) { throw invalidManifest( `plugin ${id} validation failed: ${diagnosticMessage(error)}`, @@ -435,34 +572,28 @@ export class InstalledPluginRegistry { }); } }; - let operationFailed = false; try { const result = await operation(assertLease); assertLease(); return result; - } catch (error) { - operationFailed = true; - throw error; } finally { try { await release(); - } catch (error) { - if (!operationFailed) { - throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { - message: 'unable to release the plugin registry lock', - context: { registryPath: this.registryPath }, - }); - } + } catch { + // A completed atomic rename is the committed post-condition. Reporting a + // release failure as an operation failure would make callers roll back + // live state even though the durable registry already changed. The + // heartbeat lock has a finite stale interval and is safe to recover. } } } - private async resolveSource(source: string): Promise { + private async resolveSource(source: string): Promise { const officialRoot = officialPluginRoot(source); - if (officialRoot) return realpath(officialRoot); + if (officialRoot) return { root: await realpath(officialRoot) }; const asPath = path.resolve(source); try { - return await realpath(asPath); + return { root: await realpath(asPath) }; } catch { const packageName = exactNpmPackageName(source); if (!packageName) { @@ -470,7 +601,13 @@ export class InstalledPluginRegistry { `unsupported plugin source: ${source}; npm plugins require an exact version` ); } - await mkdir(this.npmRoot, { recursive: true }); + const generationRoot = path.join( + this.npmRoot, + 'versions', + encodeURIComponent(source), + randomUUID() + ); + await mkdir(generationRoot, { recursive: true, mode: 0o700 }); await this.npmRunner('npm', { args: [ 'install', @@ -480,13 +617,62 @@ export class InstalledPluginRegistry { '--no-fund', '--package-lock=false', '--prefix', - this.npmRoot, + generationRoot, source, ], timeout: 120_000, maxBuffer: 2 * 1024 * 1024, }); - return realpath(path.join(this.npmRoot, 'node_modules', ...packageName.split('/'))); + const root = await realpath( + path.join(generationRoot, 'node_modules', ...packageName.split('/')) + ); + return { + root, + discard: () => rm(generationRoot, { recursive: true, force: true }), + }; + } + } + + private async loadPluginConfig( + entry: InstalledMossPlugin + ): Promise>> { + const { MossPluginConfigStore, readMossPluginConfigSchema } = + await import('./plugin-config-store.js'); + const schema = + entry.format === 'dsh-package-v1' + ? (await importDshPackage(entry.root)).configSchema + : await readMossPluginConfigSchema(entry.root); + if (!schema) return Object.freeze({}); + return new MossPluginConfigStore({ + configDir: path.dirname(this.registryDir), + }).loadRuntimeConfig(entry.id, schema); + } + + private async purgeRemovedPlugin(entry: InstalledMossPlugin): Promise { + const configPath = path.join( + path.dirname(this.registryDir), + 'plugins', + 'config', + `${encodeURIComponent(entry.id)}.json` + ); + await rm(configPath, { force: true }); + await this.purgeNpmRoot(entry.root); + if (entry.lastGood) await this.purgeNpmRoot(entry.lastGood.root); + } + + private async purgeNpmRoot(root: string): Promise { + const realNpmRoot = await realpath(this.npmRoot).catch(() => this.npmRoot); + const realPluginRoot = await realpath(root).catch(() => root); + const relative = path.relative(realNpmRoot, realPluginRoot); + if (!relative.startsWith('..') && !path.isAbsolute(relative)) { + const parts = relative.split(path.sep); + const nodeModules = parts.indexOf('node_modules'); + if (nodeModules > 0) { + await rm(path.join(realNpmRoot, ...parts.slice(0, nodeModules)), { + recursive: true, + force: true, + }); + } } } @@ -517,7 +703,12 @@ export class InstalledPluginRegistry { await writeFile(temporary, `${JSON.stringify({ schemaVersion: 1, plugins }, null, 2)}\n`, { mode: 0o600, }); - assertLease(); - await rename(temporary, this.registryPath); + try { + assertLease(); + await rename(temporary, this.registryPath); + } catch (error) { + await rm(temporary, { force: true }).catch(() => {}); + throw error; + } } } diff --git a/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts b/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts new file mode 100644 index 00000000..a5ed8eeb --- /dev/null +++ b/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts @@ -0,0 +1,381 @@ +import { Worker } from 'node:worker_threads'; +import { ErrorCode, MossError } from '../errors.js'; +import type { + MossPlugin, + MossPluginContext, + MossPluginMcpPreset, + MossWebContribution, +} from '../core/plugins/plugin-host.js'; +import type { + LLMProvider, + LLMRequestOptions, + LLMResponse, + LLMStreamEvent, +} from '../core/llm/llm-provider.js'; +import type { SkillMeta } from '../skills/types.js'; +import type { SubagentExpertDefinition } from '../core/subagent/expert-registry.js'; +import type { StructuredToolResult, ToolContext, ToolMetadata } from '../core/tools/tool-types.js'; + +interface IsolatedContributions { + readonly tools: ReadonlyArray<{ + readonly name: string; + readonly description: string; + readonly inputSchema: { + type: 'object'; + properties: Record; + required?: string[]; + }; + readonly metadata?: ToolMetadata; + readonly structured: boolean; + }>; + readonly skills: readonly SkillMeta[]; + readonly experts: readonly SubagentExpertDefinition[]; + readonly commands: ReadonlyArray<{ + readonly id: string; + readonly title: string; + readonly description?: string; + }>; + readonly providers: ReadonlyArray<{ readonly id: string; readonly displayName: string }>; + readonly mcpPresets: readonly MossPluginMcpPreset[]; + readonly promptLayers: readonly string[]; + readonly webContributions: readonly MossWebContribution[]; +} + +interface ReadyMessage { + readonly type: 'ready'; + readonly contributions: IsolatedContributions; +} + +interface PendingCall { + readonly resolve: (value: unknown) => void; + readonly reject: (error: Error) => void; + readonly onEvent?: (event: LLMStreamEvent) => void; + readonly removeAbortListener?: () => void; +} + +function pluginError(message: string): MossError { + return new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); +} + +function serializableToolContext(context: ToolContext): Record { + // Host callbacks (subagents, output sinks, async registries) are deliberately + // not exposed across the trust boundary. Isolated plugins must contribute an + // ordinary Tool and let the host's pre-tool approval layer make decisions. + return { + workspaceDir: context.workspaceDir, + sessionKey: context.sessionKey, + ...(context.sessionId ? { sessionId: context.sessionId } : {}), + ...(context.runId ? { runId: context.runId } : {}), + ...(context.toolCallId ? { toolCallId: context.toolCallId } : {}), + }; +} + +function serializableLlmOptions( + options: LLMRequestOptions +): Omit { + const { abortSignal: _, ...serializable } = options; + return serializable; +} + +class IsolatedPluginWorker { + private readonly pending = new Map(); + private sequence = 0; + private closed = false; + + constructor( + private readonly worker: Worker, + readonly contributions: IsolatedContributions, + private readonly pluginId: string + ) { + worker.on('message', (message: unknown) => this.handleMessage(message)); + worker.on('error', (error) => { + this.closed = true; + this.failPending(pluginError(`isolated plugin ${pluginId} failed: ${error.message}`)); + }); + worker.on('exit', (code) => { + if (!this.closed) { + this.closed = true; + this.failPending(pluginError(`isolated plugin ${pluginId} exited with code ${code}`)); + } + }); + } + + call( + method: string, + target: string | undefined, + args: readonly unknown[], + onEvent?: (event: LLMStreamEvent) => void, + signal?: AbortSignal + ): Promise { + if (this.closed) + return Promise.reject(pluginError(`isolated plugin is disposed: ${this.pluginId}`)); + const requestId = ++this.sequence; + return new Promise((resolve, reject) => { + const abort = () => { + this.worker.postMessage({ type: 'cancel', requestId }); + this.pending.delete(requestId); + reject(new MossError({ code: ErrorCode.USER_ABORTED, message: 'plugin call aborted' })); + }; + if (signal?.aborted) { + abort(); + return; + } + signal?.addEventListener('abort', abort, { once: true }); + this.pending.set(requestId, { + resolve: (value) => resolve(value as T), + reject, + ...(onEvent ? { onEvent } : {}), + ...(signal + ? { removeAbortListener: () => signal.removeEventListener('abort', abort) } + : {}), + }); + try { + this.worker.postMessage({ type: 'call', requestId, method, target, args }); + } catch (error) { + this.pending.delete(requestId); + signal?.removeEventListener('abort', abort); + reject(error instanceof Error ? error : pluginError(String(error))); + } + }); + } + + async close(timeoutMs = 1_000): Promise { + if (this.closed) return; + this.closed = true; + const disposed = new Promise((resolve, reject) => { + const onMessage = (message: unknown) => { + if (!message || typeof message !== 'object') return; + const type = (message as Record).type; + if (type !== 'disposed' && type !== 'dispose-error') return; + this.worker.off('message', onMessage); + if (type === 'dispose-error') { + reject(pluginError(String((message as Record).message))); + } else { + resolve(); + } + }; + this.worker.on('message', onMessage); + this.worker.postMessage({ type: 'dispose' }); + }); + let timer: NodeJS.Timeout | undefined; + try { + await Promise.race([ + disposed, + new Promise((_, reject) => { + timer = setTimeout( + () => reject(pluginError(`isolated plugin dispose timed out: ${this.pluginId}`)), + timeoutMs + ); + }), + ]); + } finally { + if (timer) clearTimeout(timer); + this.failPending(pluginError(`isolated plugin is disposed: ${this.pluginId}`)); + await this.worker.terminate(); + } + } + + private handleMessage(message: unknown): void { + if (!message || typeof message !== 'object') return; + const value = message as Record; + const requestId = value.requestId; + if (typeof requestId !== 'number') return; + const pending = this.pending.get(requestId); + if (!pending) return; + if (value.type === 'event') { + pending.onEvent?.(value.event as LLMStreamEvent); + return; + } + this.pending.delete(requestId); + pending.removeAbortListener?.(); + if (value.type === 'result') pending.resolve(value.value); + else pending.reject(pluginError(String(value.message ?? 'isolated plugin call failed'))); + } + + private failPending(error: Error): void { + for (const pending of this.pending.values()) { + pending.removeAbortListener?.(); + pending.reject(error); + } + this.pending.clear(); + } +} + +async function startWorker( + moduleUrl: string, + exportName: string, + pluginId: string, + timeoutMs: number, + pluginConfig: Readonly> +): Promise { + const worker = new Worker(new URL('./plugin-setup-worker.js', import.meta.url), { + workerData: { moduleUrl, exportName, expectedId: pluginId, pluginConfig }, + }); + worker.unref(); + let timer: NodeJS.Timeout | undefined; + let onStartupMessage: ((message: unknown) => void) | undefined; + let onStartupError: ((error: Error) => void) | undefined; + try { + const contributions = await new Promise((resolve, reject) => { + onStartupError = reject; + worker.once('error', onStartupError); + onStartupMessage = (message: unknown) => { + if (!message || typeof message !== 'object') return; + const value = message as Record; + if (value.type === 'ready') resolve((message as ReadyMessage).contributions); + if (value.type === 'setup-error') reject(pluginError(String(value.message))); + }; + worker.on('message', onStartupMessage); + timer = setTimeout( + () => + reject( + pluginError( + `plugin setup validation timed out after ${ + timeoutMs % 1_000 === 0 + ? `${timeoutMs / 1_000} seconds` + : `${timeoutMs} milliseconds` + }` + ) + ), + timeoutMs + ); + }); + return new IsolatedPluginWorker(worker, contributions, pluginId); + } catch (error) { + await worker.terminate(); + throw error; + } finally { + if (timer) clearTimeout(timer); + if (onStartupMessage) worker.off('message', onStartupMessage); + if (onStartupError) worker.off('error', onStartupError); + } +} + +function remoteProvider( + runtime: IsolatedPluginWorker, + metadata: { + readonly providerId: string; + readonly id: string; + readonly displayName: string; + readonly capabilities?: LLMProvider['capabilities']; + readonly countTokens: boolean; + } +): LLMProvider { + return { + id: metadata.id, + displayName: metadata.displayName, + ...(metadata.capabilities ? { capabilities: metadata.capabilities } : {}), + complete: (options) => + runtime.call( + 'provider.complete', + metadata.providerId, + [serializableLlmOptions(options)], + undefined, + options.abortSignal + ), + stream: (options, onEvent) => + runtime.call( + 'provider.stream', + metadata.providerId, + [serializableLlmOptions(options)], + onEvent, + options.abortSignal + ), + ...(metadata.countTokens + ? { + countTokens: (text: string) => + runtime.call('provider.countTokens', metadata.providerId, [text]), + } + : {}), + }; +} + +function registerRemoteContributions( + context: MossPluginContext, + runtime: IsolatedPluginWorker +): void { + for (const tool of runtime.contributions.tools) { + context.registerTool({ + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + ...(tool.metadata ? { metadata: tool.metadata } : {}), + execute: (input, toolContext) => + runtime.call( + 'tool.execute', + tool.name, + [input, serializableToolContext(toolContext)], + undefined, + toolContext.abortSignal + ), + ...(tool.structured + ? { + executeStructured: (input: unknown, toolContext: ToolContext) => + runtime.call( + 'tool.executeStructured', + tool.name, + [input, serializableToolContext(toolContext)], + undefined, + toolContext.abortSignal + ), + } + : {}), + }); + } + for (const skill of runtime.contributions.skills) context.registerSkill(skill); + for (const expert of runtime.contributions.experts) context.registerExpert(expert); + for (const command of runtime.contributions.commands) { + context.registerCommand({ + ...command, + expand: (args) => runtime.call('command.expand', command.id, [args]), + }); + } + for (const factory of runtime.contributions.providers) { + context.registerProvider({ + ...factory, + async create(config) { + const metadata = await runtime.call[1]>( + 'provider.create', + factory.id, + [config] + ); + return remoteProvider(runtime, metadata); + }, + }); + } + for (const preset of runtime.contributions.mcpPresets) context.registerMcpPreset(preset); + for (const layer of runtime.contributions.promptLayers) context.addPromptLayer(layer); + for (const contribution of runtime.contributions.webContributions) { + context.registerWebContribution(contribution); + } +} + +/** Start a trusted-code plugin in a termination-bounded Worker/RPC boundary. @internal */ +export async function createIsolatedMossPlugin(options: { + readonly moduleUrl: string; + readonly exportName: string; + readonly pluginId: string; + readonly timeoutMs: number; + readonly manifestWebContributions?: readonly MossWebContribution[]; + readonly config?: Readonly>; +}): Promise { + const runtime = await startWorker( + options.moduleUrl, + options.exportName, + options.pluginId, + options.timeoutMs, + options.config ?? {} + ); + return { + id: options.pluginId, + config: Object.freeze({ ...(options.config ?? {}) }), + disposeCandidate: () => runtime.close(), + setup(context) { + registerRemoteContributions(context, runtime); + for (const contribution of options.manifestWebContributions ?? []) { + context.registerWebContribution(contribution); + } + return () => runtime.close(); + }, + }; +} diff --git a/packages/moss-agent/src/plugins/plugin-config-schema.ts b/packages/moss-agent/src/plugins/plugin-config-schema.ts new file mode 100644 index 00000000..78ac19d4 --- /dev/null +++ b/packages/moss-agent/src/plugins/plugin-config-schema.ts @@ -0,0 +1,79 @@ +import { ErrorCode, MossError } from '../errors.js'; +import { + validateJsonSchemaDefinition, + type JsonSchema, +} from '../structured-output/schema-validator.js'; + +/** JSON Schema subset supported by Moss plugin configuration. @beta */ +export interface MossPluginJsonSchema { + type?: string | string[]; + properties?: Record; + required?: string[]; + items?: MossPluginJsonSchema | MossPluginJsonSchema[]; + enum?: unknown[]; + const?: unknown; + additionalProperties?: boolean | MossPluginJsonSchema; + description?: string; + title?: string; + default?: unknown; + minimum?: number; + maximum?: number; + minLength?: number; + maxLength?: number; + pattern?: string; + format?: string; + minItems?: number; + maxItems?: number; + uniqueItems?: boolean; + anyOf?: MossPluginJsonSchema[]; + oneOf?: MossPluginJsonSchema[]; + allOf?: MossPluginJsonSchema[]; + not?: MossPluginJsonSchema; + if?: MossPluginJsonSchema; + then?: MossPluginJsonSchema; + else?: MossPluginJsonSchema; + $ref?: string; + $defs?: Record; + definitions?: Record; +} + +/** Top-level plugin configuration property supported by the schema renderer/store. @beta */ +export interface MossPluginConfigPropertySchema extends MossPluginJsonSchema { + /** Values marked write-only are never returned by the browser-safe view. */ + readonly writeOnly?: boolean; +} + +/** Supported JSON Schema subset for one plugin's configuration object. @beta */ +export interface MossPluginConfigSchema extends MossPluginJsonSchema { + readonly type: 'object'; + readonly properties?: Readonly>; +} + +/** Parse and validate the supported plugin configuration schema subset. @internal */ +export function parseMossPluginConfigSchema( + value: unknown, + schemaPath: string +): MossPluginConfigSchema { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + throw invalidSchema(`${schemaPath} must contain a JSON Schema object`); + } + const schema = value as JsonSchema; + const definition = validateJsonSchemaDefinition(schema); + if (!definition.valid) { + throw invalidSchema(`${schemaPath} is invalid: ${definition.errors.join('; ')}`); + } + if (schema.type !== 'object') { + throw invalidSchema(`${schemaPath} must declare type "object"`); + } + for (const [name, property] of Object.entries(schema.properties ?? {})) { + const writeOnly = (property as MossPluginConfigPropertySchema).writeOnly; + if (writeOnly !== undefined && typeof writeOnly !== 'boolean') { + throw invalidSchema(`${schemaPath}.properties.${name}.writeOnly must be a boolean`); + } + } + return schema as MossPluginConfigSchema; +} + +function invalidSchema(message: string): MossError { + return new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); +} diff --git a/packages/moss-agent/src/plugins/plugin-config-store.ts b/packages/moss-agent/src/plugins/plugin-config-store.ts new file mode 100644 index 00000000..a5b91ab6 --- /dev/null +++ b/packages/moss-agent/src/plugins/plugin-config-store.ts @@ -0,0 +1,280 @@ +import { randomUUID } from 'node:crypto'; +import { chmod, mkdir, readFile, realpath, rename, rm, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +import * as lockfile from 'proper-lockfile'; + +import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; +import { validateJsonSchema } from '../structured-output/schema-validator.js'; +import { readMossPluginManifest } from './installed-plugin-registry.js'; +import { + parseMossPluginConfigSchema, + type MossPluginConfigSchema, +} from './plugin-config-schema.js'; + +export type { + MossPluginConfigPropertySchema, + MossPluginConfigSchema, + MossPluginJsonSchema, +} from './plugin-config-schema.js'; + +const PLUGIN_ID_PATTERN = /^[a-z0-9]+(?:[./-][a-z0-9]+)*$/; + +/** Browser-safe plugin configuration projection. @beta */ +export interface MossPluginConfigView { + readonly values: Readonly>; + readonly secrets: Readonly>; +} + +/** Storage options for the per-plugin configuration store. @beta */ +export interface MossPluginConfigStoreOptions { + readonly configDir: string; +} + +interface StoredPluginConfig { + readonly schemaVersion: 1; + readonly values: Record; +} + +function invalidConfig(message: string, cause?: unknown): MossError { + return new MossError({ code: ErrorCode.USER_INPUT_INVALID, message, cause }); +} + +function assertPluginId(pluginId: string): void { + if (!PLUGIN_ID_PATTERN.test(pluginId)) throw invalidConfig(`invalid plugin id: ${pluginId}`); +} + +function validationMessage( + errors: readonly { readonly path: string; readonly message: string }[] +): string { + return errors.map(({ path: errorPath, message }) => `${errorPath}: ${message}`).join('; '); +} + +/** Read and validate the optional config schema declared by a plugin manifest. @beta */ +export async function readMossPluginConfigSchema( + pluginRoot: string +): Promise { + const manifest = await readMossPluginManifest(pluginRoot); + if (!manifest.configSchema) return undefined; + try { + const root = await realpath(pluginRoot); + const schemaPath = await realpath(path.resolve(root, manifest.configSchema)); + const relative = path.relative(root, schemaPath); + if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) { + throw invalidConfig('configSchema escapes plugin root'); + } + return parseMossPluginConfigSchema(JSON.parse(await readFile(schemaPath, 'utf8')), schemaPath); + } catch (error) { + if (error instanceof MossError) throw error; + throw wrapAsMoss(error, ErrorCode.USER_INPUT_INVALID, { + message: `unable to read plugin config schema for ${manifest.id}`, + context: { pluginId: manifest.id }, + }); + } +} + +/** + * Atomic per-plugin configuration store with browser-safe write-only projection. + * + * The trusted runtime may call `loadRuntimeConfig()` to obtain the complete + * validated value. Browser adapters must use `getView()` and the dedicated + * secret mutation methods instead. + * + * @beta + */ +export class MossPluginConfigStore { + private readonly directory: string; + + constructor(options: MossPluginConfigStoreOptions) { + this.directory = path.join(options.configDir, 'plugins', 'config'); + } + + private filePathFor(pluginId: string): string { + assertPluginId(pluginId); + return path.join(this.directory, `${encodeURIComponent(pluginId)}.json`); + } + + /** Return non-secret values plus configured/not-configured secret state. @beta */ + async getView(pluginId: string, schema: MossPluginConfigSchema): Promise { + const stored = await this.read(pluginId); + const values: Record = {}; + const secrets: Record = {}; + for (const [name, property] of Object.entries(schema.properties ?? {})) { + if (property.writeOnly) { + secrets[name] = { configured: Object.hasOwn(stored.values, name) }; + } else if (Object.hasOwn(stored.values, name)) { + values[name] = stored.values[name]; + } + } + return Object.freeze({ values: Object.freeze(values), secrets: Object.freeze(secrets) }); + } + + /** Update non-secret fields after validating the supported JSON Schema subset. @beta */ + async update( + pluginId: string, + schema: MossPluginConfigSchema, + patch: Readonly> + ): Promise { + if (!patch || typeof patch !== 'object' || Array.isArray(patch)) { + throw invalidConfig('plugin config update must be an object'); + } + await this.mutate(pluginId, schema, (values) => { + for (const [name, value] of Object.entries(patch)) { + const property = schema.properties?.[name]; + if (!property) throw invalidConfig(`unknown plugin config property: ${name}`); + if (property.writeOnly) { + throw invalidConfig(`writeOnly property requires putSecret(): ${name}`); + } + values[name] = value; + } + }); + } + + /** Store one write-only value without exposing existing secret material. @beta */ + async putSecret( + pluginId: string, + schema: MossPluginConfigSchema, + name: string, + value: unknown + ): Promise { + const property = schema.properties?.[name]; + if (!property?.writeOnly) + throw invalidConfig(`plugin config property is not writeOnly: ${name}`); + await this.mutate(pluginId, schema, (values) => { + values[name] = value; + }); + } + + /** Delete one write-only value; required-value validation resumes on runtime load. @beta */ + async deleteSecret( + pluginId: string, + schema: MossPluginConfigSchema, + name: string + ): Promise { + const property = schema.properties?.[name]; + if (!property?.writeOnly) + throw invalidConfig(`plugin config property is not writeOnly: ${name}`); + await this.mutate(pluginId, schema, (values) => { + delete values[name]; + }); + } + + /** Load the complete configuration for trusted runtime setup and enforce required fields. @beta */ + async loadRuntimeConfig( + pluginId: string, + schema: MossPluginConfigSchema + ): Promise>> { + const stored = await this.read(pluginId); + const validation = validateJsonSchema(stored.values, schema); + if (!validation.valid) { + throw invalidConfig( + `plugin config validation failed: ${validationMessage(validation.errors)}` + ); + } + return Object.freeze({ ...stored.values }); + } + + /** Replace the complete trusted runtime value during activation rollback. @internal */ + async replaceRuntimeConfig( + pluginId: string, + schema: MossPluginConfigSchema, + replacement: Readonly> + ): Promise { + await this.mutate(pluginId, schema, (values) => { + for (const name of Object.keys(values)) delete values[name]; + Object.assign(values, replacement); + }); + } + + /** Remove all persisted values and write-only secrets for an uninstalled plugin. @internal */ + async remove(pluginId: string): Promise { + await rm(this.filePathFor(pluginId), { force: true }); + } + + private async mutate( + pluginId: string, + schema: MossPluginConfigSchema, + mutation: (values: Record) => void + ): Promise { + assertPluginId(pluginId); + await mkdir(this.directory, { recursive: true, mode: 0o700 }); + if (process.platform !== 'win32') await chmod(this.directory, 0o700); + let release: (() => Promise) | undefined; + try { + release = await lockfile.lock(this.directory, { + stale: 5_000, + update: 1_000, + retries: { retries: 200, factor: 1, minTimeout: 25, maxTimeout: 25, randomize: true }, + }); + } catch (error) { + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: `unable to lock plugin config for ${pluginId}`, + context: { pluginId }, + }); + } + try { + const stored = await this.read(pluginId); + const values = { ...stored.values }; + mutation(values); + const partialSchema: MossPluginConfigSchema = { ...schema, required: [] }; + const validation = validateJsonSchema(values, partialSchema); + if (!validation.valid) { + throw invalidConfig( + `plugin config validation failed: ${validationMessage(validation.errors)}` + ); + } + await this.write(pluginId, { schemaVersion: 1, values }); + } finally { + try { + await release(); + } catch { + // The atomic rename already committed. A stale lock can be recovered; + // surfacing this as a failed write would desynchronise live rollback + // from the durable configuration post-condition. + } + } + } + + private async read(pluginId: string): Promise { + const filePath = this.filePathFor(pluginId); + try { + const parsed = JSON.parse(await readFile(filePath, 'utf8')) as unknown; + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw new Error('config root must be an object'); + } + const candidate = parsed as Partial; + if ( + candidate.schemaVersion !== 1 || + !candidate.values || + typeof candidate.values !== 'object' || + Array.isArray(candidate.values) + ) { + throw new Error('invalid plugin config file'); + } + return { schemaVersion: 1, values: { ...candidate.values } }; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + return { schemaVersion: 1, values: {} }; + } + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: `unable to read plugin config for ${pluginId}`, + context: { pluginId }, + }); + } + } + + private async write(pluginId: string, stored: StoredPluginConfig): Promise { + const filePath = this.filePathFor(pluginId); + const temporary = `${filePath}.${process.pid}.${randomUUID()}.tmp`; + try { + await writeFile(temporary, `${JSON.stringify(stored, null, 2)}\n`, { mode: 0o600 }); + await rename(temporary, filePath); + } catch (error) { + await rm(temporary, { force: true }).catch(() => {}); + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: `unable to write plugin config for ${pluginId}`, + context: { pluginId }, + }); + } + } +} diff --git a/packages/moss-agent/src/plugins/plugin-setup-worker.ts b/packages/moss-agent/src/plugins/plugin-setup-worker.ts index 2fc049ca..56534a2a 100644 --- a/packages/moss-agent/src/plugins/plugin-setup-worker.ts +++ b/packages/moss-agent/src/plugins/plugin-setup-worker.ts @@ -1,22 +1,68 @@ import { parentPort, workerData } from 'node:worker_threads'; -import { createMossPluginHost, type MossPlugin } from '../core/plugins/plugin-host.js'; +import type { + MossPlugin, + MossPluginCommand, + MossPluginDisposer, + MossPluginMcpPreset, + MossPluginProvider, + MossWebContribution, +} from '../core/plugins/plugin-host.js'; +import type { LLMProvider, LLMRequestOptions, LLMStreamEvent } from '../core/llm/llm-provider.js'; +import type { Tool, ToolContext } from '../core/tools/tool-types.js'; +import type { SkillMeta } from '../skills/types.js'; +import type { SubagentExpertDefinition } from '../core/subagent/expert-registry.js'; interface PluginSetupWorkerData { readonly moduleUrl: string; readonly exportName: string; readonly expectedId: string; + readonly pluginConfig?: Readonly>; } +interface RpcRequest { + readonly type: 'call'; + readonly requestId: number; + readonly method: string; + readonly target?: string; + readonly args: readonly unknown[]; +} + +const tools = new Map(); +const commands = new Map(); +const providerFactories = new Map(); +const providers = new Map(); +const mcpPresets: MossPluginMcpPreset[] = []; +const skills: SkillMeta[] = []; +const experts: SubagentExpertDefinition[] = []; +const promptLayers: string[] = []; +const webContributions: MossWebContribution[] = []; +const effects: Array<() => MossPluginDisposer | Promise> = []; +const disposers: MossPluginDisposer[] = []; +let providerSequence = 0; +const callControllers = new Map(); + function errorMessage(error: unknown): string { if (!(error instanceof Error)) return String(error); const cause = (error as Error & { cause?: unknown }).cause; - if (cause instanceof Error && cause.message && cause.message !== error.message) { - return `${error.message}: ${cause.message}`; - } - return error.message; + return cause instanceof Error && cause.message !== error.message + ? `${error.message}: ${cause.message}` + : error.message; } -async function validateSetup(data: PluginSetupWorkerData): Promise { +function cloneableTool(tool: Tool): Record { + if (tool.normalizeInput) + throw new Error(`isolated plugin tool cannot use normalizeInput: ${tool.name}`); + return { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + ...(tool.metadata ? { metadata: tool.metadata } : {}), + structured: typeof tool.executeStructured === 'function', + }; +} + +async function setup(): Promise { + const data = workerData as PluginSetupWorkerData; const imported = (await import(data.moduleUrl)) as Record; const candidate = imported[data.exportName]; if ( @@ -30,46 +76,176 @@ async function validateSetup(data: PluginSetupWorkerData): Promise { if (plugin.id !== data.expectedId) { throw new Error(`plugin export id does not match manifest: ${data.expectedId}`); } - - const tools = new Set(); - const skills = new Set(); - const experts = new Set(); - const host = createMossPluginHost({ - hasTool: (name) => tools.has(name), - registerTool: (tool) => { - tools.add(tool.name); - return () => { - tools.delete(tool.name); - }; + const returned = await plugin.setup({ + config: Object.freeze({ ...(data.pluginConfig ?? {}) }), + registerTool(tool) { + tools.set(tool.name, tool); }, - hasSkill: (id) => skills.has(id), - registerSkill: (skill) => { - const id = skill.stableId ?? skill.name; - skills.add(id); - return () => { - skills.delete(id); - }; + registerSkill(skill) { + skills.push(skill); }, - hasExpert: (id) => experts.has(id), - registerExpert: (expert) => { - experts.add(expert.id); - return () => { - experts.delete(expert.id); - }; + registerExpert(expert) { + experts.push(expert); + }, + registerCommand(command) { + commands.set(command.id, command); + }, + registerProvider(provider) { + providerFactories.set(provider.id, provider); + }, + registerMcpPreset(preset) { + mcpPresets.push(preset); + }, + addPromptLayer(layer) { + promptLayers.push(layer); + }, + registerWebContribution(contribution) { + webContributions.push(contribution); + }, + effect(effect) { + effects.push(effect); }, }); + if (typeof returned === 'function') disposers.push(returned); + for (const effect of effects) disposers.push(await effect()); + parentPort!.postMessage({ + type: 'ready', + contributions: { + tools: [...tools.values()].map(cloneableTool), + skills, + experts, + commands: [...commands.values()].map(({ id, title, description }) => ({ + id, + title, + ...(description ? { description } : {}), + })), + providers: [...providerFactories.values()].map(({ id, displayName }) => ({ + id, + displayName, + })), + mcpPresets, + promptLayers, + webContributions, + }, + }); +} + +function toolContext(value: unknown, abortSignal: AbortSignal): ToolContext { + const input = (value && typeof value === 'object' ? value : {}) as Record; + return { + workspaceDir: typeof input.workspaceDir === 'string' ? input.workspaceDir : process.cwd(), + sessionKey: typeof input.sessionKey === 'string' ? input.sessionKey : 'plugin-worker', + abortSignal, + ...(typeof input.sessionId === 'string' ? { sessionId: input.sessionId } : {}), + ...(typeof input.runId === 'string' ? { runId: input.runId } : {}), + ...(typeof input.toolCallId === 'string' ? { toolCallId: input.toolCallId } : {}), + }; +} + +async function call(request: RpcRequest): Promise { + const controller = new AbortController(); + callControllers.set(request.requestId, controller); try { - await host.install(plugin); + if (request.method === 'tool.execute' || request.method === 'tool.executeStructured') { + const tool = tools.get(request.target ?? ''); + if (!tool) throw new Error(`isolated plugin tool not found: ${request.target}`); + const input = request.args[0]; + const context = toolContext(request.args[1], controller.signal); + return request.method === 'tool.executeStructured' + ? tool.executeStructured?.(input, context) + : tool.execute(input, context); + } + if (request.method === 'command.expand') { + const command = commands.get(request.target ?? ''); + if (!command) throw new Error(`isolated plugin command not found: ${request.target}`); + return command.expand(String(request.args[0] ?? '')); + } + if (request.method === 'provider.create') { + const factory = providerFactories.get(request.target ?? ''); + if (!factory) throw new Error(`isolated plugin provider not found: ${request.target}`); + const provider = await factory.create((request.args[0] ?? {}) as Record); + const providerId = `provider-${++providerSequence}`; + providers.set(providerId, provider); + return { + providerId, + id: provider.id, + displayName: provider.displayName, + capabilities: provider.capabilities, + countTokens: typeof provider.countTokens === 'function', + }; + } + const provider = providers.get(request.target ?? ''); + if (!provider) throw new Error(`isolated provider instance not found: ${request.target}`); + if (request.method === 'provider.complete') { + return provider.complete({ + ...(request.args[0] as LLMRequestOptions), + abortSignal: controller.signal, + }); + } + if (request.method === 'provider.countTokens') + return provider.countTokens?.(String(request.args[0] ?? '')); + if (request.method === 'provider.stream') { + return provider.stream( + { + ...(request.args[0] as LLMRequestOptions), + abortSignal: controller.signal, + }, + (event: LLMStreamEvent) => { + parentPort!.postMessage({ type: 'event', requestId: request.requestId, event }); + } + ); + } + throw new Error(`unknown isolated plugin RPC method: ${request.method}`); } finally { - await host.close(); + callControllers.delete(request.requestId); } } if (!parentPort) throw new Error('plugin setup worker requires a parent port'); +parentPort.on('message', (message: unknown) => { + if ( + message && + typeof message === 'object' && + (message as Record).type === 'cancel' + ) { + const requestId = (message as Record).requestId; + if (typeof requestId === 'number') callControllers.get(requestId)?.abort(); + return; + } + if ( + message && + typeof message === 'object' && + (message as Record).type === 'dispose' + ) { + void (async () => { + for (const dispose of [...disposers].reverse()) await dispose(); + parentPort!.postMessage({ type: 'disposed' }); + })().catch((error: unknown) => { + parentPort!.postMessage({ type: 'dispose-error', message: errorMessage(error) }); + }); + return; + } + if ( + !message || + typeof message !== 'object' || + (message as Record).type !== 'call' + ) + return; + const request = message as RpcRequest; + void call(request).then( + (value) => parentPort!.postMessage({ type: 'result', requestId: request.requestId, value }), + (error: unknown) => + parentPort!.postMessage({ + type: 'error', + requestId: request.requestId, + message: errorMessage(error), + }) + ); +}); + try { - await validateSetup(workerData as PluginSetupWorkerData); - parentPort.postMessage({ ok: true }); + await setup(); } catch (error) { - parentPort.postMessage({ ok: false, message: errorMessage(error) }); + parentPort.postMessage({ type: 'setup-error', message: errorMessage(error) }); } diff --git a/packages/moss-agent/src/runtime/index.ts b/packages/moss-agent/src/runtime/index.ts index 310f8ded..56ee88ab 100644 --- a/packages/moss-agent/src/runtime/index.ts +++ b/packages/moss-agent/src/runtime/index.ts @@ -17,14 +17,19 @@ export type { ProviderErrorSurface, } from '../provider/index.js'; export type { + MossPluginCallState, + MossPluginCommand, MossPlugin, MossPluginCompositionSnapshot, MossPluginContext, MossPluginDisposer, MossPluginHandle, MossPluginHost, + MossPluginMcpPreset, + MossPluginProvider, MossPluginSnapshot, MossPluginState, + MossPluginUnloadOptions, MossWebContribution, MossWebSlot, } from '../core/plugins/plugin-host.js'; @@ -39,3 +44,18 @@ export { type MossPluginRuntimeManifest, type MossPluginWebManifest, } from '../plugins/installed-plugin-registry.js'; +export { + MossPluginConfigStore, + readMossPluginConfigSchema, + type MossPluginConfigPropertySchema, + type MossPluginConfigSchema, + type MossPluginJsonSchema, + type MossPluginConfigStoreOptions, + type MossPluginConfigView, +} from '../plugins/plugin-config-store.js'; +export { + importDshPackage, + inspectDshPackageCompatibility, + type DshPackageCompatibilityReport, + type ImportedDshPackage, +} from '../plugins/dsh-bundle-compatibility.js'; diff --git a/packages/moss-agent/src/tools/ask-user-question.ts b/packages/moss-agent/src/tools/ask-user-question.ts index 561b53e6..236379be 100644 --- a/packages/moss-agent/src/tools/ask-user-question.ts +++ b/packages/moss-agent/src/tools/ask-user-question.ts @@ -160,7 +160,7 @@ export const askUserQuestionTool: Tool = { } if (questions.length === 0) return 'Error: no valid questions provided.'; - const asker = getCliUserQuestionAsker(); + const asker = ctx.askUserQuestion ?? getCliUserQuestionAsker(); if (!asker) { return ( 'Error: interactive questions are unavailable in this non-interactive run. ' + diff --git a/packages/moss-agent/src/web-ui/client/api-client.ts b/packages/moss-agent/src/web-ui/client/api-client.ts new file mode 100644 index 00000000..415e8e18 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/api-client.ts @@ -0,0 +1,259 @@ +import type { + BootstrapResponse, + GoalSnapshot, + Interaction, + JobSnapshot, + MentionInventory, + PluginInventory, + PluginConfigResponse, + RuntimeInventory, + RuntimeMode, + SessionSummary, + SettingsSection, + SettingsSnapshot, + StreamEvent, + TimelineItem, + TodoSnapshot, + WorkspaceSummary, + WorkflowSnapshot, +} from './workbench-types.js'; + +export class ApiError extends Error { + constructor( + readonly status: number, + message: string + ) { + super(message); + } +} + +let csrfToken = ''; + +export const jsonRequest = async (url: string, options?: RequestInit): Promise => { + const method = options?.method?.toUpperCase() ?? 'GET'; + const headers = new Headers(options?.headers); + if (method !== 'GET' && method !== 'HEAD') { + if (!csrfToken) throw new ApiError(403, 'Moss Web security token is not ready'); + headers.set('x-moss-csrf', csrfToken); + } + const response = await fetch(url, { ...options, headers }); + if (!response.ok) { + const body = (await response.json().catch(() => ({}))) as { error?: string }; + throw new ApiError(response.status, body.error ?? `HTTP ${response.status}`); + } + return response.status === 204 ? (undefined as T) : ((await response.json()) as T); +}; + +const json = (method: string, body?: unknown): RequestInit => ({ + method, + headers: { 'content-type': 'application/json' }, + ...(body === undefined ? {} : { body: JSON.stringify(body) }), +}); +const sid = (id: string) => encodeURIComponent(id); + +export const api = { + bootstrap: async () => { + const response = await jsonRequest('/api/bootstrap'); + csrfToken = response.csrfToken; + return response; + }, + uploadAttachment: (filename: string, mimeType: string, contentBase64: string) => + jsonRequest<{ + attachment: { + id: string; + filename: string; + mimeType: string; + kind: 'text' | 'image'; + size: number; + downloadUrl: string; + }; + }>('/api/attachments', json('POST', { filename, mimeType, contentBase64 })), + deleteAttachment: (id: string) => jsonRequest(`/api/attachments/${sid(id)}`, json('DELETE')), + createArtifact: (workspaceRelativePath: string) => + jsonRequest<{ attachment: { id: string; filename: string; downloadUrl: string } }>( + '/api/artifacts', + json('POST', { workspaceRelativePath }) + ), + plugins: () => jsonRequest('/api/plugins'), + addPlugin: (source: string) => + jsonRequest<{ plugin: { id: string }; generation: number }>( + '/api/plugins/add', + json('POST', { source }) + ), + doctorPlugins: () => + jsonRequest<{ + results: Array<{ + id?: string; + pluginId?: string; + status?: string; + ok?: boolean; + message?: string; + }>; + generation: number; + }>('/api/plugins/doctor', json('POST')), + pluginConfig: (id: string) => jsonRequest(`/api/plugins/${sid(id)}/config`), + savePluginConfig: (id: string, values: Record) => + jsonRequest(`/api/plugins/${sid(id)}/config`, json('PUT', { values })), + putPluginSecret: (id: string, name: string, value: string) => + jsonRequest( + `/api/plugins/${sid(id)}/config/secrets/${sid(name)}`, + json('PUT', { value }) + ), + deletePluginSecret: (id: string, name: string) => + jsonRequest( + `/api/plugins/${sid(id)}/config/secrets/${sid(name)}`, + json('DELETE') + ), + workspaces: () => jsonRequest<{ workspaces: WorkspaceSummary[] }>('/api/workspaces'), + sessions: () => jsonRequest<{ sessions: SessionSummary[] }>('/api/sessions'), + search: (query: string) => + jsonRequest<{ hits: SessionSummary[] }>(`/api/sessions/search?q=${encodeURIComponent(query)}`), + messages: (id: string) => + jsonRequest<{ items: TimelineItem[] }>(`/api/sessions/${sid(id)}/messages`), + createSession: (workspaceId = 'current') => + jsonRequest<{ sessionId: string }>('/api/sessions', json('POST', { workspaceId })), + rename: (id: string, title: string) => + jsonRequest(`/api/sessions/${sid(id)}`, json('PATCH', { title })), + delete: (id: string, confirmation: string) => + jsonRequest(`/api/sessions/${sid(id)}`, json('DELETE', { confirmation })), + fork: (id: string) => + jsonRequest<{ session: SessionSummary }>(`/api/sessions/${sid(id)}/fork`, json('POST')), + rewind: (id: string, messageCount: number) => + jsonRequest<{ session: SessionSummary }>( + `/api/sessions/${sid(id)}/rewind`, + json('POST', { messageCount }) + ), + activeRun: (id: string) => + jsonRequest<{ run: { id: string }; cursor: number; eventsUrl: string }>( + `/api/sessions/${sid(id)}/active-run` + ), + interactions: () => jsonRequest<{ interactions: Interaction[] }>('/api/interactions'), + resolveInteraction: (id: string, answer: string) => + jsonRequest(`/api/interactions/${sid(id)}/resolve`, json('POST', { answer })), + cancelInteraction: (id: string) => + jsonRequest(`/api/interactions/${sid(id)}/cancel`, json('POST')), + runtimeMode: () => jsonRequest<{ mode: RuntimeMode }>('/api/runtime/mode'), + setRuntimeMode: (mode: RuntimeMode) => + jsonRequest<{ mode: RuntimeMode }>('/api/runtime/mode', json('PUT', { mode })), + setPermissionPreset: (profile: 'cautious' | 'balanced' | 'autonomous') => + jsonRequest('/api/runtime/permission-preset', json('PUT', { profile })), + runtimeInventory: () => jsonRequest('/api/runtime/inventory'), + mentions: () => jsonRequest('/api/runtime/mentions'), + inbox: (id: string) => jsonRequest<{ items?: unknown[] }>(`/api/sessions/${sid(id)}/inbox`), + deliver: (id: string, prompt: string, delivery: 'queue' | 'steer') => + jsonRequest(`/api/sessions/${sid(id)}/inbox`, json('POST', { prompt, delivery })), + steer: (id: string, prompt: string) => + jsonRequest(`/api/sessions/${sid(id)}/steer`, json('POST', { prompt })), + goal: (id: string) => jsonRequest<{ goal: GoalSnapshot }>(`/api/sessions/${sid(id)}/goal`), + updateGoal: (id: string, body: Record) => + jsonRequest<{ goal: GoalSnapshot }>(`/api/sessions/${sid(id)}/goal`, json('PUT', body)), + todos: (id: string) => jsonRequest<{ todos: TodoSnapshot[] }>(`/api/sessions/${sid(id)}/todos`), + command: (id: string, command: string) => + jsonRequest(`/api/sessions/${sid(id)}/commands`, json('POST', { command })), + jobs: () => jsonRequest<{ jobs: JobSnapshot[] }>('/api/jobs'), + stopJob: (id: string) => jsonRequest(`/api/jobs/${sid(id)}/stop`, json('POST')), + workflows: () => jsonRequest<{ workflows: WorkflowSnapshot[] }>('/api/workflows'), + runWorkflow: (id: string, sessionId: string, args = '') => + jsonRequest(`/api/workflows/${sid(id)}/run`, json('POST', { sessionId, args })), + trajectory: (runId: string) => jsonRequest(`/api/runs/${sid(runId)}/trajectory`), + verdict: (runId: string) => jsonRequest(`/api/runs/${sid(runId)}/verdict`), + settings: (section: SettingsSection) => jsonRequest(`/api/settings/${section}`), + validateSettings: (section: SettingsSection, values: Record) => + jsonRequest<{ valid: boolean; errors?: Record }>( + `/api/settings/${section}/validate`, + json('POST', { values }) + ), + saveSettings: (section: SettingsSection, values: Record) => + jsonRequest(`/api/settings/${section}`, json('PUT', { values })), + models: () => + jsonRequest<{ + choices?: Array<{ id?: string; model?: string; displayName?: string }>; + models?: string[]; + }>('/api/settings/models/catalog'), + selectModel: (model: string) => + jsonRequest('/api/settings/models/selection', json('PUT', { model })), + setApiKey: (value: string) => + jsonRequest('/api/settings/credentials/apiKey', json('PUT', { value })), + deleteApiKey: () => jsonRequest('/api/settings/credentials/apiKey', json('DELETE')), + cancelSession: (id: string) => jsonRequest(`/api/sessions/${sid(id)}/cancel`, json('POST')), + mutatePlugin: (id: string, action: 'enable' | 'disable' | 'remove') => + jsonRequest(`/api/plugins/${sid(id)}/${action}`, json('POST')), + sendMessage: (id: string, prompt: string, attachmentIds: string[], signal: AbortSignal) => { + const headers = new Headers({ 'content-type': 'application/json' }); + if (!csrfToken) throw new ApiError(403, 'Moss Web security token is not ready'); + headers.set('x-moss-csrf', csrfToken); + return fetch(`/api/sessions/${sid(id)}/messages`, { + method: 'POST', + headers, + body: JSON.stringify({ prompt, attachmentIds }), + signal, + }); + }, +}; + +export const connectRunEvents = ( + runId: string, + after: number, + onEvent: (event: StreamEvent, cursor: number) => void, + onState: (connected: boolean) => void +): (() => void) => { + let cursor = after; + let source: EventSource | undefined; + let stopped = false; + let retryTimer: number | undefined; + const connect = () => { + if (stopped) return; + source = new EventSource(`/api/runs/${encodeURIComponent(runId)}/events?after=${cursor}`); + source.onopen = () => onState(true); + const handleMessage = (message: MessageEvent) => { + const record = JSON.parse(message.data) as { seq: number; event: StreamEvent }; + const lastEventId = Number(message.lastEventId); + cursor = Number.isSafeInteger(lastEventId) && lastEventId > 0 ? lastEventId : record.seq; + onEvent(record.event, cursor); + if (record.event.type === 'done' || record.event.type === 'interrupted') { + stopped = true; + source?.close(); + } + }; + for (const type of [ + 'run', + 'text', + 'thought', + 'tool', + 'retry', + 'compaction', + 'usage', + 'context', + 'interrupted', + 'done', + ]) + source.addEventListener(type, handleMessage as EventListener); + source.addEventListener('error', (event) => { + if (event instanceof MessageEvent && typeof event.data === 'string' && event.data) { + handleMessage(event); + return; + } + if (stopped) return; + onState(false); + source?.close(); + retryTimer = window.setTimeout(connect, 850); + }); + }; + connect(); + return () => { + stopped = true; + if (retryTimer) window.clearTimeout(retryTimer); + source?.close(); + }; +}; + +export const connectPluginComposition = ( + onComposition: () => void, + onState: (connected: boolean) => void +): (() => void) => { + const source = new EventSource('/api/plugins/events'); + source.onopen = () => onState(true); + source.addEventListener('composition', () => onComposition()); + source.onerror = () => onState(false); + return () => source.close(); +}; diff --git a/packages/moss-agent/src/web-ui/client/app-frame.css b/packages/moss-agent/src/web-ui/client/app-frame.css new file mode 100644 index 00000000..3095d2d5 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/app-frame.css @@ -0,0 +1,213 @@ +.app-frame { + position: relative; + display: grid; + grid-template-columns: var(--moss-layout-sidebar) minmax(0, 1fr) var(--moss-layout-details); + height: 100dvh; + overflow: hidden; + background: var(--moss-color-canvas); + transition: grid-template-columns var(--moss-motion-standard) var(--moss-ease-standard); +} + +.moss-sidebar-column, +.moss-conversation-column, +.moss-details-column { + min-width: 0; + min-height: 0; + overflow: hidden; +} +.moss-sidebar-column { + border-right: 1px solid var(--moss-color-border); +} +.moss-conversation-column { + display: flex; + flex-direction: column; +} +.moss-details-column { + border-left: 1px solid var(--moss-color-border); +} +.app-frame[data-details-collapsed] .moss-details-column { + border-left: 0; +} + +.moss-skip-link { + position: fixed; + top: var(--moss-space-3); + left: 50%; + z-index: var(--moss-z-toast); + transform: translate(-50%, calc(-100% - var(--moss-space-6))); + border-radius: var(--moss-radius-control); + background: var(--moss-color-text); + color: var(--moss-color-surface); + padding: var(--moss-space-2) var(--moss-space-4); + text-decoration: none; + transition: transform var(--moss-motion-fast) var(--moss-ease-standard); +} +.moss-skip-link:focus { + transform: translate(-50%, 0); +} + +.moss-resize-handle { + position: absolute; + inset-block: 0; + z-index: var(--moss-z-header); + width: 0.75rem; + margin-left: -0.375rem; + cursor: col-resize; + touch-action: none; +} +.moss-resize-handle::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0.25rem; + height: 2rem; + transform: translate(-50%, -50%); + border-radius: var(--moss-radius-round); + background: var(--moss-color-border-strong); + opacity: 0; + transition: + opacity var(--moss-motion-fast) var(--moss-ease-standard), + background-color var(--moss-motion-fast) var(--moss-ease-standard); +} +.moss-resize-handle:hover::after, +.moss-resize-handle:focus-visible::after, +.moss-resize-handle[data-dragging]::after { + opacity: 1; + background: var(--moss-color-accent); +} + +html[data-moss-resizing] { + cursor: col-resize; + user-select: none; +} +html[data-moss-resizing] .app-frame { + transition: none; +} + +.moss-drawer-backdrop { + display: none; +} + +.app-frame[data-sidebar-collapsed] .sidebar { + padding-inline: var(--moss-space-2); +} +.app-frame[data-sidebar-collapsed] .brand-row { + justify-content: center; + padding-inline: 0; +} +.app-frame[data-sidebar-collapsed] .brand-row > div:last-child, +.app-frame[data-sidebar-collapsed] .new-task-label, +.app-frame[data-sidebar-collapsed] .new-task kbd, +.app-frame[data-sidebar-collapsed] .session-search input, +.app-frame[data-sidebar-collapsed] .section-label, +.app-frame[data-sidebar-collapsed] .session-list span, +.app-frame[data-sidebar-collapsed] .session-list small, +.app-frame[data-sidebar-collapsed] .sidebar-footer > button, +.app-frame[data-sidebar-collapsed] .runtime-state div, +.app-frame[data-sidebar-collapsed] .plugin-slot { + display: none; +} +.app-frame[data-sidebar-collapsed] .new-task, +.app-frame[data-sidebar-collapsed] .session-search, +.app-frame[data-sidebar-collapsed] .runtime-state { + justify-content: center; +} +.app-frame[data-sidebar-collapsed] .session-list button { + height: 2.25rem; + padding: 0; +} +.app-frame[data-sidebar-collapsed] .session-list button::before { + content: ''; + width: 0.5rem; + height: 0.5rem; + margin: auto; + border-radius: 50%; + background: var(--moss-color-faint); +} +.app-frame[data-sidebar-collapsed] .session-list button.active::before { + background: var(--moss-color-accent); +} + +@media (max-width: 780px) { + .app-frame { + display: block; + } + .moss-conversation-column { + height: 100dvh; + } + [data-mobile-drawer] { + position: fixed; + inset-block: 0; + z-index: var(--moss-z-drawer); + box-sizing: border-box; + width: min(88vw, 20.625rem); + background: var(--moss-color-surface); + box-shadow: var(--moss-shadow-dialog); + visibility: hidden; + transition: + transform var(--moss-motion-standard) var(--moss-ease-standard), + visibility var(--moss-motion-standard) step-end; + } + [data-mobile-drawer='sidebar'] { + left: 0; + transform: translateX(-105%); + } + [data-mobile-drawer='details'] { + right: 0; + transform: translateX(105%); + } + [data-mobile-drawer][data-open] { + transform: translateX(0); + visibility: visible; + transition-timing-function: var(--moss-ease-standard), step-start; + } + .moss-drawer-backdrop { + position: fixed; + inset: 0; + z-index: calc(var(--moss-z-drawer) - 1); + display: block; + border: 0; + background: var(--moss-color-overlay); + -webkit-tap-highlight-color: transparent; + } + .app-frame[data-sidebar-collapsed] .sidebar { + padding-inline: var(--moss-space-3); + } + .app-frame[data-sidebar-collapsed] .brand-row { + justify-content: flex-start; + padding-inline: var(--moss-space-2); + } + .app-frame[data-sidebar-collapsed] .brand-row > div:last-child, + .app-frame[data-sidebar-collapsed] .new-task-label, + .app-frame[data-sidebar-collapsed] .session-search input, + .app-frame[data-sidebar-collapsed] .section-label, + .app-frame[data-sidebar-collapsed] .session-list span, + .app-frame[data-sidebar-collapsed] .session-list small, + .app-frame[data-sidebar-collapsed] .sidebar-footer > button, + .app-frame[data-sidebar-collapsed] .runtime-state div, + .app-frame[data-sidebar-collapsed] .plugin-slot { + display: revert; + } + .app-frame[data-sidebar-collapsed] .new-task, + .app-frame[data-sidebar-collapsed] .session-search, + .app-frame[data-sidebar-collapsed] .runtime-state { + justify-content: flex-start; + } + .app-frame[data-sidebar-collapsed] .session-list button { + height: auto; + padding: var(--moss-space-2) var(--moss-space-3); + } + .app-frame[data-sidebar-collapsed] .session-list button::before { + display: none; + } +} + +@media (prefers-reduced-motion: reduce) { + .app-frame, + .moss-skip-link, + .moss-resize-handle::after, + [data-mobile-drawer] { + transition: none; + } +} diff --git a/packages/moss-agent/src/web-ui/client/app-frame.tsx b/packages/moss-agent/src/web-ui/client/app-frame.tsx new file mode 100644 index 00000000..7e34ef00 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/app-frame.tsx @@ -0,0 +1,377 @@ +import { + type PointerEvent as ReactPointerEvent, + type ReactNode, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; + +import './app-frame.css'; + +const LAYOUT_STORAGE_KEY = 'moss-layout-v1'; +const SIDEBAR_MIN = 220; +const SIDEBAR_MAX = 420; +const SIDEBAR_DEFAULT = 252; +const SIDEBAR_RAIL = 64; +const DETAILS_MIN = 280; +const DETAILS_MAX = 520; +const DETAILS_DEFAULT = 320; +const CENTER_MIN = 560; +const NARROW_BREAKPOINT = 1080; +const MOBILE_BREAKPOINT = 780; + +interface LayoutPreferences { + sidebarWidth: number; + detailsWidth: number; + sidebarOpen: boolean; + detailsOpen: boolean; + narrowSidebarExpanded: boolean; +} + +export interface MossLayoutController extends LayoutPreferences { + mobileSidebarOpen: boolean; + mobileDetailsOpen: boolean; + setSidebarWidth(width: number): void; + setDetailsWidth(width: number): void; + toggleSidebar(): void; + toggleDetails(): void; + openDetails(): void; + closeDetails(): void; + closeDrawers(): void; +} + +const clamp = (value: number, minimum: number, maximum: number) => + Math.min(maximum, Math.max(minimum, Math.round(value))); + +const defaultPreferences: LayoutPreferences = { + sidebarWidth: SIDEBAR_DEFAULT, + detailsWidth: DETAILS_DEFAULT, + sidebarOpen: true, + detailsOpen: true, + narrowSidebarExpanded: false, +}; + +const readPreferences = (): LayoutPreferences => { + try { + const value = JSON.parse( + localStorage.getItem(LAYOUT_STORAGE_KEY) ?? '{}' + ) as Partial; + return { + sidebarWidth: clamp(value.sidebarWidth ?? SIDEBAR_DEFAULT, SIDEBAR_MIN, SIDEBAR_MAX), + detailsWidth: clamp(value.detailsWidth ?? DETAILS_DEFAULT, DETAILS_MIN, DETAILS_MAX), + sidebarOpen: value.sidebarOpen ?? true, + detailsOpen: value.detailsOpen ?? true, + narrowSidebarExpanded: value.narrowSidebarExpanded ?? false, + }; + } catch { + return defaultPreferences; + } +}; + +const isMobileViewport = () => window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`).matches; + +export const useMossLayout = (): MossLayoutController => { + const [preferences, setPreferences] = useState(readPreferences); + const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); + const [mobileDetailsOpen, setMobileDetailsOpen] = useState(false); + useEffect(() => { + try { + localStorage.setItem(LAYOUT_STORAGE_KEY, JSON.stringify(preferences)); + } catch { + // A privacy-restricted browser may deny storage; the live layout remains usable. + } + }, [preferences]); + return { + ...preferences, + mobileSidebarOpen, + mobileDetailsOpen, + setSidebarWidth: (sidebarWidth) => + setPreferences((current) => ({ + ...current, + sidebarWidth: clamp(sidebarWidth, SIDEBAR_MIN, SIDEBAR_MAX), + })), + setDetailsWidth: (detailsWidth) => + setPreferences((current) => ({ + ...current, + detailsWidth: clamp(detailsWidth, DETAILS_MIN, DETAILS_MAX), + })), + toggleSidebar: () => { + if (isMobileViewport()) setMobileSidebarOpen((current) => !current); + else if (window.matchMedia(`(max-width: ${NARROW_BREAKPOINT}px)`).matches) + setPreferences((current) => ({ + ...current, + narrowSidebarExpanded: !current.narrowSidebarExpanded, + })); + else setPreferences((current) => ({ ...current, sidebarOpen: !current.sidebarOpen })); + }, + toggleDetails: () => { + if (isMobileViewport()) setMobileDetailsOpen((current) => !current); + else setPreferences((current) => ({ ...current, detailsOpen: !current.detailsOpen })); + }, + openDetails: () => { + if (isMobileViewport()) setMobileDetailsOpen(true); + else setPreferences((current) => ({ ...current, detailsOpen: true })); + }, + closeDetails: () => { + if (isMobileViewport()) setMobileDetailsOpen(false); + else setPreferences((current) => ({ ...current, detailsOpen: false })); + }, + closeDrawers: () => { + setMobileSidebarOpen(false); + setMobileDetailsOpen(false); + }, + }; +}; + +interface ResolvedLayout { + sidebar: number; + details: number; + narrow: boolean; + mobile: boolean; +} + +const resolveLayout = (viewport: number, preferences: LayoutPreferences): ResolvedLayout => { + const mobile = viewport <= MOBILE_BREAKPOINT; + const narrow = viewport <= NARROW_BREAKPOINT; + if (mobile) return { sidebar: 0, details: 0, narrow, mobile }; + const sidebar = + !preferences.sidebarOpen || (narrow && !preferences.narrowSidebarExpanded) + ? SIDEBAR_RAIL + : preferences.sidebarWidth; + if (!preferences.detailsOpen) return { sidebar, details: 0, narrow, mobile }; + const preferredCenter = viewport - sidebar - preferences.detailsWidth; + if (preferredCenter >= CENTER_MIN) { + return { sidebar, details: preferences.detailsWidth, narrow, mobile }; + } + const conceded = viewport - sidebar - CENTER_MIN; + return { + sidebar, + details: conceded >= DETAILS_MIN ? clamp(conceded, DETAILS_MIN, preferences.detailsWidth) : 0, + narrow, + mobile, + }; +}; + +const ResizeHandle = ({ + side, + position, + onResize, +}: { + side: 'sidebar' | 'details'; + position: number; + onResize(delta: number): void; +}) => { + const currentWidth = side === 'sidebar' ? position : window.innerWidth - position; + const minimum = side === 'sidebar' ? SIDEBAR_MIN : DETAILS_MIN; + const maximum = side === 'sidebar' ? SIDEBAR_MAX : DETAILS_MAX; + const origin = useRef(0); + const latest = useRef(0); + const frame = useRef(undefined); + const startWidth = useRef(0); + const [dragging, setDragging] = useState(false); + const emit = useCallback(() => { + frame.current = undefined; + onResize( + startWidth.current + + (side === 'sidebar' ? latest.current - origin.current : origin.current - latest.current) + ); + }, [onResize, side]); + const onPointerDown = (event: ReactPointerEvent) => { + event.preventDefault(); + event.currentTarget.setPointerCapture(event.pointerId); + origin.current = event.clientX; + latest.current = event.clientX; + startWidth.current = side === 'sidebar' ? position : window.innerWidth - position; + document.documentElement.dataset.mossResizing = side; + setDragging(true); + }; + const onPointerMove = (event: ReactPointerEvent) => { + if (!event.currentTarget.hasPointerCapture(event.pointerId)) return; + latest.current = event.clientX; + frame.current ??= requestAnimationFrame(emit); + }; + const onPointerUp = (event: ReactPointerEvent) => { + if (!event.currentTarget.hasPointerCapture(event.pointerId)) return; + event.currentTarget.releasePointerCapture(event.pointerId); + latest.current = event.clientX; + if (frame.current !== undefined) cancelAnimationFrame(frame.current); + emit(); + delete document.documentElement.dataset.mossResizing; + setDragging(false); + }; + useEffect( + () => () => { + if (frame.current !== undefined) cancelAnimationFrame(frame.current); + delete document.documentElement.dataset.mossResizing; + }, + [] + ); + return ( +
{ + if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return; + event.preventDefault(); + const direction = event.key === 'ArrowRight' ? 1 : -1; + onResize( + (side === 'sidebar' ? position : window.innerWidth - position) + + direction * 16 * (side === 'sidebar' ? 1 : -1) + ); + }} + /> + ); +}; + +export const AppFrame = ({ + layout, + sidebar, + conversation, + details, +}: { + layout: MossLayoutController; + sidebar: ReactNode; + conversation: ReactNode; + details: ReactNode; +}) => { + const rootRef = useRef(null); + const sidebarDrawerRef = useRef(null); + const detailsDrawerRef = useRef(null); + const closeDrawersRef = useRef(layout.closeDrawers); + closeDrawersRef.current = layout.closeDrawers; + const [viewport, setViewport] = useState(() => window.innerWidth); + useEffect(() => { + const root = rootRef.current; + if (!root) return; + const observer = new ResizeObserver(([entry]) => { + if (entry?.contentRect.width) setViewport(entry.contentRect.width); + }); + observer.observe(root); + return () => observer.disconnect(); + }, []); + const resolved = resolveLayout(viewport, layout); + const drawerOpen = layout.mobileSidebarOpen || layout.mobileDetailsOpen; + useEffect(() => { + if (!drawerOpen) return; + const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null; + const activeDrawer = layout.mobileSidebarOpen + ? sidebarDrawerRef.current + : detailsDrawerRef.current; + const focusable = () => [ + ...(activeDrawer?.querySelectorAll( + 'button:not([disabled]), input:not([disabled]), textarea:not([disabled]), [href], [tabindex]:not([tabindex="-1"])' + ) ?? []), + ]; + requestAnimationFrame(() => focusable()[0]?.focus()); + const closeOnEscape = (event: KeyboardEvent) => { + if (event.key === 'Escape') closeDrawersRef.current(); + if (event.key !== 'Tab') return; + const controls = focusable(); + const first = controls[0]; + const last = controls.at(-1); + if (!first || !last) return; + if (event.shiftKey && document.activeElement === first) { + event.preventDefault(); + last.focus(); + } else if (!event.shiftKey && document.activeElement === last) { + event.preventDefault(); + first.focus(); + } + }; + document.addEventListener('keydown', closeOnEscape); + return () => { + document.removeEventListener('keydown', closeOnEscape); + requestAnimationFrame(() => previous?.focus()); + }; + }, [drawerOpen, layout.mobileDetailsOpen, layout.mobileSidebarOpen]); + return ( +
+ + Skip to conversation + +
+ {sidebar} +
+
+ {conversation} +
+
+ {details} +
+ {drawerOpen && ( +
+ ); +}; diff --git a/packages/moss-agent/src/web-ui/client/component-gallery.css b/packages/moss-agent/src/web-ui/client/component-gallery.css new file mode 100644 index 00000000..cdfc43f5 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/component-gallery.css @@ -0,0 +1,150 @@ +.component-gallery { + min-height: 100dvh; + overflow: auto; + background: + radial-gradient(circle at 8% 4%, var(--moss-color-accent-soft), transparent 28rem), + var(--moss-color-canvas); + padding: clamp(var(--moss-space-6), 5vw, var(--moss-space-12)); +} +.gallery-header { + max-width: 72rem; + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: var(--moss-space-6); + margin: 0 auto var(--moss-space-8); +} +.gallery-header h1 { + margin: var(--moss-space-2) 0; + font: var(--moss-font-weight-regular) var(--moss-font-size-display) / + var(--moss-line-height-tight) var(--moss-font-family-display); + letter-spacing: -0.035em; + text-wrap: balance; +} +.gallery-header p { + max-width: 38rem; + margin: 0; + color: var(--moss-color-muted); + line-height: var(--moss-line-height-body); +} +.component-gallery > .moss-tabs { + max-width: 72rem; + margin: 0 auto var(--moss-space-8); + border-bottom: 1px solid var(--moss-color-border); + padding-bottom: var(--moss-space-2); +} +.gallery-section { + max-width: 72rem; + margin: auto; +} +.gallery-section h2 { + margin: 0 0 var(--moss-space-5); + font-size: var(--moss-font-size-5); +} +.gallery-grid, +.gallery-swatches, +.gallery-code-grid { + display: grid; + gap: var(--moss-space-4); +} +.gallery-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.gallery-grid > .moss-card { + display: grid; + align-content: start; + gap: var(--moss-space-4); +} +.gallery-grid h3 { + margin: 0; + font-size: var(--moss-font-size-3); +} +.gallery-row { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--moss-space-2); +} +.gallery-stack { + display: grid; + gap: var(--moss-space-2); +} +.gallery-swatches { + grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); +} +.gallery-swatches .moss-card { + display: grid; + gap: var(--moss-space-2); + font-size: var(--moss-font-size-2); +} +.gallery-swatches code { + overflow-wrap: anywhere; + color: var(--moss-color-muted); + font-size: var(--moss-font-size-1); +} +.gallery-swatch { + height: 4rem; + border: 1px solid var(--moss-color-border); + border-radius: var(--moss-radius-control); +} +.gallery-type-ramp { + display: grid; + gap: var(--moss-space-3); + margin-top: var(--moss-space-5); +} +.gallery-type-ramp > * { + margin: 0; +} +.gallery-display { + font: var(--moss-font-weight-regular) var(--moss-font-size-display) / + var(--moss-line-height-tight) var(--moss-font-family-display); +} +.gallery-code-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin-top: var(--moss-space-4); +} +.gallery-state-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} +.gallery-state-grid .moss-card { + grid-template-columns: auto 1fr; + align-items: center; +} +.gallery-state-grid p { + grid-column: 1 / -1; + margin: 0; + color: var(--moss-color-muted); + font-size: var(--moss-font-size-2); + line-height: var(--moss-line-height-body); +} +.gallery-state-dot { + width: 0.625rem; + height: 0.625rem; + border-radius: 50%; + background: var(--moss-state-idle); +} +.gallery-state-dot[data-state='running'] { + background: var(--moss-state-running); +} +.gallery-state-dot[data-state='success'] { + background: var(--moss-state-success); +} +.gallery-state-dot[data-state='warning'] { + background: var(--moss-state-warning); +} +.gallery-state-dot[data-state='error'] { + background: var(--moss-state-error); +} +.gallery-state-dot[data-state='interrupted'] { + background: var(--moss-state-interrupted); +} +@media (max-width: 780px) { + .gallery-header { + display: grid; + } + .gallery-grid, + .gallery-code-grid, + .gallery-state-grid { + grid-template-columns: 1fr; + } +} diff --git a/packages/moss-agent/src/web-ui/client/component-gallery.tsx b/packages/moss-agent/src/web-ui/client/component-gallery.tsx new file mode 100644 index 00000000..93eecd93 --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/component-gallery.tsx @@ -0,0 +1,193 @@ +import { useState } from 'react'; + +import { + Button, + Card, + Code, + Diff, + Disclosure, + Input, + Menu, + Modal, + Tabs, + Terminal, + Toast, + Tooltip, +} from './design-system.js'; +import './component-gallery.css'; + +type GalleryTab = 'foundations' | 'components' | 'states'; + +const galleryTabs = [ + { value: 'foundations', label: 'Foundations' }, + { value: 'components', label: 'Components' }, + { value: 'states', label: 'States' }, +] as const; + +export const ComponentGallery = ({ onExit }: { onExit(): void }) => { + const [tab, setTab] = useState('components'); + const [dialogOpen, setDialogOpen] = useState(false); + const [menuOpen, setMenuOpen] = useState(false); + return ( +
+
+
+

MOSS WEB DESIGN SYSTEM

+

Component gallery

+

One visual contract for the workbench and trusted plugin surfaces.

+
+ +
+ setTab(value)} + ariaLabel="Gallery sections" + /> + + {tab === 'foundations' && ( +
+ +
+ {['canvas', 'surface', 'panel', 'accent', 'success', 'warning', 'danger'].map( + (token) => ( + + + {token} + --moss-color-{token} + + ) + )} +
+ + Build with evidence. +

Workbench heading

+

Readable body text keeps long agent runs calm, precise, and easy to scan.

+ const result = await verify(); +
+
+ )} + + {tab === 'components' && ( +
+ +
+ +

Actions

+
+ + + + +
+
+ +

Field & overlays

+ +
+ + + + + setMenuOpen(false)} + label="Gallery menu" + trigger={} + > + + + +
+
+ +

Feedback

+
+ Runtime connected + Verification passed + Approval required + Tool failed +
+
+ +

Progressive disclosure

+ + The assistant inspected the active workspace and selected the narrowest safe test. + +
+
+
+ {`const proof = await runFocusedTests();\nassert.equal(proof.ok, true);`} + + +
+
+ )} + + {tab === 'states' && ( +
+ +
+ {['idle', 'running', 'success', 'warning', 'error', 'interrupted'].map((state) => ( + + + {state} +

Shared status vocabulary for messages, tools, runs, and plugins.

+
+ ))} +
+
+ )} + + setDialogOpen(false)} + title="Confirm component behavior" + description="Escape, the close button, or the backdrop closes this dialog." + footer={ + + } + > +

Focus stays inside the dialog and returns to the invoking control.

+
+
+ ); +}; diff --git a/packages/moss-agent/src/web-ui/client/composer.tsx b/packages/moss-agent/src/web-ui/client/composer.tsx new file mode 100644 index 00000000..744593ec --- /dev/null +++ b/packages/moss-agent/src/web-ui/client/composer.tsx @@ -0,0 +1,385 @@ +import { useEffect, useMemo, useRef, useState } from 'react'; +import { api } from './api-client.js'; +import { Button } from './design-system.js'; +import { PluginSlot } from './plugin-slot.js'; +import type { + Interaction, + MentionInventory, + RuntimeMode, + WebContribution, +} from './workbench-types.js'; + +export interface ComposerAttachment { + id: string; + name: string; + type: string; + size: number; + url?: string; + text?: string; + serverId?: string; + downloadUrl?: string; + error?: string; + file?: File; +} + +const fileBase64 = (file: File): Promise => + new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onerror = () => reject(reader.error ?? new Error('Unable to read attachment')); + reader.onload = () => resolve(String(reader.result).split(',', 2)[1] ?? ''); + reader.readAsDataURL(file); + }); + +const uploadFile = async (file: File, current: ComposerAttachment): Promise => { + try { + const { attachment } = await api.uploadAttachment( + file.name, + file.type || 'text/plain', + await fileBase64(file) + ); + return { + ...current, + file, + serverId: attachment.id, + downloadUrl: attachment.downloadUrl, + name: attachment.filename, + type: attachment.mimeType, + size: attachment.size, + error: undefined, + }; + } catch (error) { + return { ...current, file, error: error instanceof Error ? error.message : 'Upload failed' }; + } +}; + +const AttachmentPicker = ({ + attachments, + onChange, +}: { + attachments: ComposerAttachment[]; + onChange(value: ComposerAttachment[]): void; +}) => { + const input = useRef(null); + const add = async (files: FileList | null) => { + if (!files) return; + const next = await Promise.all( + [...files].map(async (file): Promise => { + const id = crypto.randomUUID(); + const preview = file.type.startsWith('image/') + ? { url: URL.createObjectURL(file) } + : file.size < 128_000 + ? { text: await file.text() } + : {}; + return uploadFile(file, { + id, + file, + name: file.name, + type: file.type, + size: file.size, + ...preview, + }); + }) + ); + onChange([...attachments, ...next]); + }; + return ( +
+ void add(event.target.files)} + /> + + {attachments.map((attachment) => ( +
+ {attachment.url && } +
+ {attachment.name} + + {attachment.error ?? + `${Math.ceil(attachment.size / 1024)} KB${attachment.serverId ? ' · ready' : ''}`} + +
+ + {attachment.error && attachment.file && ( + + )} +
+ ))} +
+ ); +}; + +const InteractionPanel = ({ + interaction, + onAnswer, + onCancel, +}: { + interaction: Interaction; + onAnswer(value: string): void; + onCancel(): void; +}) => { + const [value, setValue] = useState(''); + const panel = useRef(null); + useEffect(() => { + const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null; + panel.current?.focus(); + return () => previous?.focus(); + }, []); + return ( +
{ + if (event.key === 'Escape') onCancel(); + }} + className="interaction-panel" + role="alertdialog" + aria-label={interaction.kind === 'approval' ? 'Approval required' : 'Moss has a question'} + > +

+ {interaction.kind === 'approval' ? 'APPROVAL REQUIRED' : 'QUESTION'} +

+

{interaction.prompt}

+ {interaction.kind === 'approval' ? ( +
+ + + + +
+ ) : ( +
{ + event.preventDefault(); + if (value.trim()) onAnswer(value.trim()); + }} + > + + + +
+
+ + + +`; + +/** Frozen legacy layout; excluded from the current design-system token contract. @internal */ +export const LEGACY_WEB_CSS = ` +:root{color-scheme:dark;font:14px/1.5 system-ui,sans-serif;background:#09110f;color:#edf7f2} +*{box-sizing:border-box}body{margin:0}.legacy-shell{display:grid;grid-template-columns:248px 1fr;min-height:100vh} +aside{padding:28px 20px;border-right:1px solid #263630;background:#0b1412;display:flex;flex-direction:column;gap:16px} +aside h1{margin:0}aside p,aside output{color:#8da49a}aside output{margin-top:auto}a{color:#89f0b6} +button{border:1px solid #365247;border-radius:10px;background:#14211d;color:#edf7f2;padding:10px 14px;cursor:pointer} +button:focus-visible,textarea:focus-visible,a:focus-visible{outline:3px solid #89f0b6;outline-offset:2px} +.legacy-shell>section{padding:30px 5vw;display:flex;flex-direction:column;max-height:100vh} +header{text-align:right;color:#8da49a}#legacy-empty{margin:auto;text-align:center}#legacy-empty h2{font-size:36px} +#legacy-timeline{flex:1;overflow:auto;padding:24px 0}.legacy-message{max-width:780px;margin:0 auto 14px;padding:14px 16px;border:1px solid #263630;border-radius:12px;background:#101a17;white-space:pre-wrap} +.legacy-message.user{background:#183226}.legacy-tool{color:#b8ffd2}form{max-width:860px;width:100%;margin:16px auto 0;padding:11px;border:1px solid #365247;border-radius:16px;background:#101b18} +textarea{width:100%;resize:none;border:0;background:transparent;color:inherit;font:inherit;outline:0}form button{float:right;margin-left:8px} +@media(max-width:760px){.legacy-shell{display:block}.legacy-shell aside{display:none}.legacy-shell>section{padding:18px 14px}} +@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}} +`; + +/** Frozen legacy transport using the current session and CSRF contracts. @internal */ +export const LEGACY_WEB_JS = ` +const byId=(id)=>document.getElementById(id);let csrfToken='',sessionId='',controller; +const request=async(url,options={})=>{const headers=new Headers(options.headers);if((options.method??'GET')!=='GET')headers.set('x-moss-csrf',csrfToken);const response=await fetch(url,{...options,headers});if(!response.ok)throw new Error('HTTP '+response.status);return response.status===204?undefined:response.json()}; +const add=(kind,text)=>{byId('legacy-empty').hidden=true;const item=document.createElement('article');item.className='legacy-message '+kind;item.textContent=text;byId('legacy-timeline').append(item);byId('legacy-timeline').scrollTop=byId('legacy-timeline').scrollHeight;return item}; +const fresh=async()=>{const result=await request('/api/sessions',{method:'POST'});sessionId=result.sessionId;byId('legacy-timeline').replaceChildren();byId('legacy-empty').hidden=false}; +const bootstrap=async()=>{try{const state=await request('/api/bootstrap');csrfToken=state.csrfToken;byId('legacy-model').textContent=state.model;byId('legacy-runtime').textContent='Ready · '+state.tools.length+' tools';await fresh()}catch(error){byId('legacy-runtime').textContent='Offline · '+error.message}}; +byId('legacy-new').onclick=()=>void fresh();byId('legacy-stop').onclick=()=>controller?.abort(); +byId('legacy-composer').onsubmit=async(event)=>{event.preventDefault();const prompt=byId('legacy-prompt').value.trim();if(!prompt)return;add('user',prompt);byId('legacy-prompt').value='';const answer=add('assistant','');controller=new AbortController();byId('legacy-stop').hidden=false;try{const headers={'content-type':'application/json','x-moss-csrf':csrfToken};const response=await fetch('/api/sessions/'+encodeURIComponent(sessionId)+'/messages',{method:'POST',headers,body:JSON.stringify({prompt,attachmentIds:[]}),signal:controller.signal});if(!response.ok||!response.body)throw new Error('HTTP '+response.status);const reader=response.body.getReader(),decoder=new TextDecoder();let pending='';for(;;){const chunk=await reader.read();if(chunk.done)break;pending+=decoder.decode(chunk.value,{stream:true});const lines=pending.split('\\n');pending=lines.pop()??'';for(const line of lines){if(!line)continue;const data=JSON.parse(line);if(data.type==='text')answer.textContent+=data.delta;if(data.type==='tool')add('legacy-tool',data.name+' · '+data.state)}}}catch(error){if(error.name!=='AbortError')answer.textContent+='\\nInterrupted: '+error.message}finally{byId('legacy-stop').hidden=true;controller=undefined}}; +void bootstrap(); +`; diff --git a/packages/moss-agent/src/web-ui/web-attachment-router.ts b/packages/moss-agent/src/web-ui/web-attachment-router.ts new file mode 100644 index 00000000..1061c3c8 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-attachment-router.ts @@ -0,0 +1,105 @@ +import type http from 'node:http'; + +import { ErrorCode, MossError } from '../errors.js'; +import type { MossWebAttachmentService } from './web-attachment-service.js'; + +const MAX_UPLOAD_BODY_BYTES = 14 * 1024 * 1024; + +interface MossWebAttachmentRouterOptions { + readonly request: http.IncomingMessage; + readonly response: http.ServerResponse; + readonly url: URL; + readonly mutationAllowed: boolean; + readonly attachments: MossWebAttachmentService; + readonly sendJson: (response: http.ServerResponse, status: number, value: unknown) => void; +} + +/** Route bounded attachment upload/download and workspace artifact registration. @internal */ +export async function handleMossWebAttachmentRequest( + options: MossWebAttachmentRouterOptions +): Promise { + const { request, response, url, attachments, sendJson } = options; + const attachmentMatch = url.pathname.match(/^\/api\/attachments\/([^/]+)$/); + const isMutation = + (request.method === 'POST' && + (url.pathname === '/api/attachments' || url.pathname === '/api/artifacts')) || + (request.method === 'DELETE' && Boolean(attachmentMatch)); + if (isMutation && !options.mutationAllowed) { + sendJson(response, 403, { error: 'mutation requires same-origin CSRF authorization' }); + return true; + } + if (request.method === 'POST' && url.pathname === '/api/attachments') { + const body = await readAttachmentJson(request); + const attachment = await attachments.upload({ + filename: typeof body.filename === 'string' ? body.filename : '', + mimeType: typeof body.mimeType === 'string' ? body.mimeType : '', + contentBase64: typeof body.contentBase64 === 'string' ? body.contentBase64 : '', + }); + sendJson(response, 201, { attachment }); + return true; + } + if (request.method === 'POST' && url.pathname === '/api/artifacts') { + const body = await readAttachmentJson(request); + const workspaceRelativePath = + typeof body.workspaceRelativePath === 'string' ? body.workspaceRelativePath : ''; + const attachment = await attachments.registerArtifact(workspaceRelativePath); + sendJson(response, 201, { attachment }); + return true; + } + if (request.method === 'GET' && attachmentMatch) { + const { metadata, body } = await attachments.read(decodeURIComponent(attachmentMatch[1])); + response.writeHead(200, { + 'content-type': metadata.mimeType, + 'content-length': body.length, + 'content-disposition': `attachment; filename*=UTF-8''${encodeURIComponent(metadata.filename)}`, + 'cache-control': 'no-store', + 'x-content-type-options': 'nosniff', + }); + response.end(body); + return true; + } + if (request.method === 'DELETE' && attachmentMatch) { + const id = decodeURIComponent(attachmentMatch[1]); + await attachments.delete(id); + sendJson(response, 200, { id, deleted: true }); + return true; + } + return false; +} + +async function readAttachmentJson(request: http.IncomingMessage): Promise> { + const declaredLength = Number(request.headers['content-length']); + if (Number.isFinite(declaredLength) && declaredLength > MAX_UPLOAD_BODY_BYTES) { + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: 'attachment request exceeds 14 MiB', + }); + } + let body = ''; + for await (const chunk of request) { + body += String(chunk); + if (Buffer.byteLength(body) > MAX_UPLOAD_BODY_BYTES) { + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: 'attachment request exceeds 14 MiB', + }); + } + } + let parsed: unknown; + try { + parsed = JSON.parse(body); + } catch (error) { + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: 'attachment request must be valid JSON', + cause: error, + }); + } + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: 'attachment request must be a JSON object', + }); + } + return parsed as Record; +} diff --git a/packages/moss-agent/src/web-ui/web-attachment-service.ts b/packages/moss-agent/src/web-ui/web-attachment-service.ts new file mode 100644 index 00000000..9edd718d --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-attachment-service.ts @@ -0,0 +1,283 @@ +import { randomUUID } from 'node:crypto'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { TextDecoder } from 'node:util'; + +import type { ChatOptions } from '../core/agent/moss-agent.js'; +import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; + +const IMAGE_TYPES = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp']); +const TEXT_TYPES = new Set([ + 'application/json', + 'application/javascript', + 'application/xml', + 'application/yaml', + 'application/x-yaml', +]); +const ATTACHMENT_ID = /^attachment-[0-9a-f-]{36}$/; + +/** Browser-safe uploaded attachment or copied generated artifact metadata. @beta */ +export interface MossWebAttachmentSummary { + readonly id: string; + readonly filename: string; + readonly mimeType: string; + readonly kind: 'text' | 'image' | 'artifact'; + readonly size: number; + readonly createdAt: number; + readonly downloadUrl: string; +} + +interface StoredAttachment extends Omit { + readonly schemaVersion: 1; +} + +export interface MossWebAttachmentServiceOptions { + readonly storageDir: string; + readonly workspaceDir?: string; + readonly maxTextBytes?: number; + readonly maxImageBytes?: number; + readonly maxArtifactBytes?: number; +} + +/** Durable, bounded Web attachment and generated-artifact store. @internal */ +export class MossWebAttachmentService { + private readonly maxTextBytes: number; + private readonly maxImageBytes: number; + private readonly maxArtifactBytes: number; + + constructor(private readonly options: MossWebAttachmentServiceOptions) { + this.maxTextBytes = options.maxTextBytes ?? 1024 * 1024; + this.maxImageBytes = options.maxImageBytes ?? 10 * 1024 * 1024; + this.maxArtifactBytes = options.maxArtifactBytes ?? 25 * 1024 * 1024; + } + + async upload(input: { + filename: string; + mimeType: string; + contentBase64: string; + }): Promise { + const filename = this.filename(input.filename); + const mimeType = input.mimeType.trim().toLowerCase(); + const kind = this.uploadKind(mimeType); + const body = this.decodeBase64(input.contentBase64); + const limit = kind === 'image' ? this.maxImageBytes : this.maxTextBytes; + if (body.length === 0 || body.length > limit) { + this.invalid(`${kind} attachment must contain 1 to ${limit} bytes`); + } + if (kind === 'text') this.decodeText(body); + if (kind === 'image' && !this.matchesImageSignature(mimeType, body)) { + this.invalid(`attachment bytes do not match ${mimeType}`); + } + return this.store({ filename, mimeType, kind, body }); + } + + async registerArtifact(workspaceRelativePath: string): Promise { + if (!this.options.workspaceDir) this.invalid('workspace artifact registration is unavailable'); + if (!workspaceRelativePath.trim() || path.isAbsolute(workspaceRelativePath)) { + this.invalid('artifact path must be a workspace-relative path'); + } + const workspace = await fs.realpath(this.options.workspaceDir); + const unresolved = path.resolve(workspace, workspaceRelativePath); + if (!this.contains(workspace, unresolved)) this.invalid('artifact path escapes the workspace'); + let source: string; + try { + source = await fs.realpath(unresolved); + } catch (error) { + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: 'Failed to resolve generated artifact', + }); + } + if (!this.contains(workspace, source)) this.invalid('artifact symlink escapes the workspace'); + const stat = await fs.stat(source); + if (!stat.isFile()) this.invalid('artifact path must identify a regular file'); + if (stat.size === 0 || stat.size > this.maxArtifactBytes) { + this.invalid(`artifact must contain 1 to ${this.maxArtifactBytes} bytes`); + } + const filename = this.filename(path.basename(source)); + return this.store({ + filename, + mimeType: this.artifactMimeType(filename), + kind: 'artifact', + body: await fs.readFile(source), + }); + } + + async resolveForPrompt(ids: readonly string[]): Promise> { + if (ids.length > 8) this.invalid('a prompt may include at most 8 attachments'); + if (new Set(ids).size !== ids.length) this.invalid('attachment ids must be unique'); + const blocks: NonNullable = []; + for (const id of ids) { + const { metadata, body } = await this.read(id); + if (metadata.mimeType.startsWith('text/') || TEXT_TYPES.has(metadata.mimeType)) { + blocks.push({ + type: 'text', + text: `[Attachment: ${metadata.filename}]\n${this.decodeText(body)}`, + }); + } else if (IMAGE_TYPES.has(metadata.mimeType)) { + blocks.push({ + type: 'image', + data: body.toString('base64'), + mimeType: metadata.mimeType, + filename: metadata.filename, + }); + } else { + this.invalid(`artifact "${metadata.filename}" cannot be sent to the model`); + } + } + return blocks; + } + + async read(id: string): Promise<{ metadata: MossWebAttachmentSummary; body: Buffer }> { + this.assertId(id); + try { + const stored = JSON.parse( + await fs.readFile(this.metadataPath(id), 'utf8') + ) as StoredAttachment; + if (stored.schemaVersion !== 1 || stored.id !== id) + this.invalid('attachment metadata is invalid'); + const body = await fs.readFile(this.bodyPath(id)); + if (body.length !== stored.size) this.invalid('attachment content is incomplete'); + return { metadata: this.summary(stored), body }; + } catch (error) { + if (error instanceof MossError) throw error; + if ((error as NodeJS.ErrnoException).code === 'ENOENT') + this.invalid(`attachment "${id}" was not found`); + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: `Failed to read attachment "${id}"`, + }); + } + } + + async delete(id: string): Promise { + this.assertId(id); + const removed = await fs.rm(this.metadataPath(id), { force: true }).then(() => true); + await fs.rm(this.bodyPath(id), { force: true }); + return removed; + } + + private async store(input: { + filename: string; + mimeType: string; + kind: StoredAttachment['kind']; + body: Buffer; + }): Promise { + const id = `attachment-${randomUUID()}`; + const stored: StoredAttachment = { + schemaVersion: 1, + id, + filename: input.filename, + mimeType: input.mimeType, + kind: input.kind, + size: input.body.length, + createdAt: Date.now(), + }; + await fs.mkdir(this.options.storageDir, { recursive: true, mode: 0o700 }); + try { + await fs.writeFile(this.bodyPath(id), input.body, { mode: 0o600, flag: 'wx' }); + await fs.writeFile(this.metadataPath(id), `${JSON.stringify(stored)}\n`, { + mode: 0o600, + flag: 'wx', + }); + } catch (error) { + await Promise.all([ + fs.rm(this.bodyPath(id), { force: true }), + fs.rm(this.metadataPath(id), { force: true }), + ]); + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: 'Failed to persist Web attachment', + }); + } + return this.summary(stored); + } + + private summary(stored: StoredAttachment): MossWebAttachmentSummary { + const { schemaVersion: _, ...summary } = stored; + return { ...summary, downloadUrl: `/api/attachments/${stored.id}` }; + } + + private bodyPath(id: string): string { + return path.join(this.options.storageDir, `${id}.bin`); + } + + private metadataPath(id: string): string { + return path.join(this.options.storageDir, `${id}.json`); + } + + private filename(value: string): string { + const basename = path.posix + .basename(value.replaceAll('\\', '/')) + .replace(/[\u0000-\u001f\u007f]/g, ''); + const normalized = basename.trim().slice(0, 180); + if (!normalized || normalized === '.' || normalized === '..') + this.invalid('filename is invalid'); + return normalized; + } + + private uploadKind(mimeType: string): 'text' | 'image' { + if (IMAGE_TYPES.has(mimeType)) return 'image'; + if (mimeType.startsWith('text/') || TEXT_TYPES.has(mimeType)) return 'text'; + return this.invalid(`unsupported attachment type "${mimeType}"`); + } + + private decodeBase64(value: string): Buffer { + if (!value || value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) { + this.invalid('contentBase64 must be canonical base64 without a data URL prefix'); + } + return Buffer.from(value, 'base64'); + } + + private decodeText(body: Buffer): string { + try { + return new TextDecoder('utf-8', { fatal: true }).decode(body); + } catch { + return this.invalid('text attachment must be valid UTF-8'); + } + } + + private matchesImageSignature(mimeType: string, body: Buffer): boolean { + if (mimeType === 'image/png') + return body.subarray(0, 4).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47])); + if (mimeType === 'image/jpeg') + return body[0] === 0xff && body[1] === 0xd8 && body.at(-2) === 0xff && body.at(-1) === 0xd9; + if (mimeType === 'image/gif') return body.subarray(0, 4).toString('ascii') === 'GIF8'; + return ( + body.subarray(0, 4).toString('ascii') === 'RIFF' && + body.subarray(8, 12).toString('ascii') === 'WEBP' + ); + } + + private artifactMimeType(filename: string): string { + const extension = path.extname(filename).toLowerCase(); + const types: Record = { + '.txt': 'text/plain', + '.md': 'text/markdown', + '.json': 'application/json', + '.csv': 'text/csv', + '.html': 'text/html', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.webp': 'image/webp', + '.pdf': 'application/pdf', + '.zip': 'application/zip', + }; + return types[extension] ?? 'application/octet-stream'; + } + + private contains(root: string, candidate: string): boolean { + const relative = path.relative(root, candidate); + return ( + relative === '' || + (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative)) + ); + } + + private assertId(id: string): void { + if (!ATTACHMENT_ID.test(id)) this.invalid('attachment id is invalid'); + } + + private invalid(message: string): never { + throw new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); + } +} diff --git a/packages/moss-agent/src/web-ui/web-contracts.ts b/packages/moss-agent/src/web-ui/web-contracts.ts index 1492639c..8b9fd7f4 100644 --- a/packages/moss-agent/src/web-ui/web-contracts.ts +++ b/packages/moss-agent/src/web-ui/web-contracts.ts @@ -1,4 +1,8 @@ import type { MossWebSlot } from '../core/plugins/plugin-host.js'; +import type { + MossPluginConfigSchema, + MossPluginConfigView, +} from '../plugins/plugin-config-store.js'; /** Stable extension slots available to trusted Moss Web plugins. @beta */ export { MOSS_WEB_SLOTS } from '../core/plugins/plugin-host.js'; @@ -18,9 +22,36 @@ export const MOSS_WEB_THEME_TOKENS = [ '--moss-color-muted', '--moss-color-faint', '--moss-color-accent', + '--moss-color-accent-hover', '--moss-color-accent-soft', '--moss-color-danger', + '--moss-color-danger-soft', '--moss-color-warning', + '--moss-color-warning-soft', + '--moss-color-success', + '--moss-color-success-soft', + '--moss-color-overlay', + '--moss-color-terminal', + '--moss-color-terminal-border', + '--moss-color-terminal-muted', + '--moss-color-terminal-prompt', + '--moss-color-terminal-text', + '--moss-font-family-body', + '--moss-font-family-display', + '--moss-font-family-code', + '--moss-font-size-1', + '--moss-font-size-2', + '--moss-font-size-3', + '--moss-font-size-4', + '--moss-font-size-5', + '--moss-font-size-6', + '--moss-font-size-display', + '--moss-font-weight-regular', + '--moss-font-weight-medium', + '--moss-font-weight-bold', + '--moss-line-height-tight', + '--moss-line-height-body', + '--moss-line-height-code', '--moss-space-1', '--moss-space-2', '--moss-space-3', @@ -28,12 +59,35 @@ export const MOSS_WEB_THEME_TOKENS = [ '--moss-space-5', '--moss-space-6', '--moss-space-8', + '--moss-space-10', + '--moss-space-12', '--moss-radius-control', + '--moss-radius-small', '--moss-radius-card', '--moss-radius-panel', + '--moss-radius-round', '--moss-shadow-control', '--moss-shadow-composer', '--moss-shadow-float', + '--moss-shadow-dialog', + '--moss-control-height', + '--moss-control-height-small', + '--moss-motion-fast', + '--moss-motion-standard', + '--moss-motion-slow', + '--moss-ease-standard', + '--moss-z-base', + '--moss-z-header', + '--moss-z-drawer', + '--moss-z-dialog', + '--moss-z-toast', + '--moss-z-tooltip', + '--moss-state-idle', + '--moss-state-running', + '--moss-state-success', + '--moss-state-warning', + '--moss-state-error', + '--moss-state-interrupted', ] as const; /** One stable Moss Web theme variable. @beta */ @@ -44,6 +98,14 @@ export interface MossWebPluginMountContext { readonly pluginId: string; readonly contributionId: string; readonly slot: MossWebSlot; + /** Stable owner of the slot instance; arbitrary payloads remain read-only. */ + readonly owner?: { + readonly kind: 'workspace' | 'session' | 'message' | 'tool' | 'settings'; + readonly id: string; + readonly data?: unknown; + }; + /** Same-origin ESM entry exporting Moss controlled React components and a mount helper. */ + readonly componentsUrl: '/assets/moss-web-components.js'; } /** Controlled browser module shape for an advanced trusted plugin UI. @beta */ @@ -65,10 +127,28 @@ export interface MossWebInstalledPlugin { export interface MossWebPluginSnapshot { readonly id: string; readonly state: string; + readonly callState: 'accepting' | 'draining' | 'disposed'; readonly tools: readonly string[]; + readonly commands: readonly string[]; + readonly providers: readonly string[]; + readonly mcpPresets: readonly string[]; readonly webContributions: readonly string[]; } +/** Last-good runtime composition used for hot-reload and cache busting. @beta */ +export interface MossWebPluginComposition { + readonly generation: number; + readonly plugins: readonly MossWebPluginSnapshot[]; +} + +/** Browser response for schema-rendered plugin configuration. @beta */ +export interface MossWebPluginConfigResponse { + readonly schema: MossPluginConfigSchema; + readonly config: MossPluginConfigView; + readonly generation: number; + readonly restartRequired: false; +} + /** Browser-safe durable run summary. @beta */ export interface MossWebTaskRunSnapshot { readonly id: string; @@ -84,6 +164,7 @@ export interface MossWebTaskRunSnapshot { export interface MossWebBootstrap { readonly tools: readonly string[]; readonly plugins: readonly MossWebPluginSnapshot[]; + readonly pluginComposition: MossWebPluginComposition; readonly taskRuns: readonly MossWebTaskRunSnapshot[]; readonly model: string; } @@ -98,6 +179,27 @@ export interface MossWebSessionSummary { readonly runStatus?: string; } +/** Browser-safe workspace entry exposed by the local single-workspace host. @beta */ +export interface MossWebWorkspaceSummary { + readonly id: string; + readonly name: string; + readonly current: boolean; +} + +/** One bounded match from a Web session title or transcript search. @beta */ +export interface MossWebSessionSearchHit extends MossWebSessionSummary { + readonly snippet: string; +} + +/** Durable cursor envelope returned by the Web event journal. @beta */ +export interface MossWebJournalEvent { + readonly runId: string; + readonly sessionId: string; + readonly seq: number; + readonly time: number; + readonly event: MossWebStreamEvent; +} + /** Version-one browser event projection for a streamed Moss turn. @beta */ export type MossWebStreamEvent = | { readonly type: 'run'; readonly run: MossWebTaskRunSnapshot } @@ -117,4 +219,31 @@ export type MossWebStreamEvent = readonly stopReason: string; readonly run?: MossWebTaskRunSnapshot; } + | { readonly type: 'retry'; readonly attempt: number; readonly error: string } + | { + readonly type: 'compaction'; + readonly summaryChars: number; + readonly droppedMessages: number; + readonly checkpointOutline?: readonly string[]; + } + | { + readonly type: 'usage'; + readonly inputTokens: number; + readonly outputTokens: number; + readonly cacheReadTokens?: number; + readonly cacheCreationTokens?: number; + readonly contextTokens?: number; + } + | { + readonly type: 'context'; + readonly status: string; + readonly reason: string; + readonly goal: string; + readonly nextAction: string; + } + | { + readonly type: 'interrupted'; + readonly reason: string; + readonly run: MossWebTaskRunSnapshot; + } | { readonly type: 'error'; readonly message: string }; diff --git a/packages/moss-agent/src/web-ui/web-control-plane-router.ts b/packages/moss-agent/src/web-ui/web-control-plane-router.ts new file mode 100644 index 00000000..c8e1d7a8 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-control-plane-router.ts @@ -0,0 +1,231 @@ +import type http from 'node:http'; + +import type { MossWebInteractionBroker } from './web-interaction-broker.js'; +import type { MossWebRuntimeService } from './web-runtime-service.js'; +import type { MossWebSettingsSection, MossWebSettingsService } from './web-settings-service.js'; + +interface MossWebControlPlaneRouterOptions { + readonly request: http.IncomingMessage; + readonly response: http.ServerResponse; + readonly url: URL; + readonly mutationAllowed: boolean; + readonly interactions: MossWebInteractionBroker; + readonly runtime: MossWebRuntimeService; + readonly settings: MossWebSettingsService; + readonly readJson: (request: http.IncomingMessage) => Promise>; + readonly sendJson: (response: http.ServerResponse, status: number, value: unknown) => void; +} + +/** Route the Web interaction, runtime, workflow, and settings control plane. @internal */ +export async function handleMossWebControlPlaneRequest( + options: MossWebControlPlaneRouterOptions +): Promise { + const { request, response, url, interactions, runtime, settings, readJson, sendJson } = options; + const send = (status: number, value: unknown): true => { + sendJson(response, status, value); + return true; + }; + + if (request.method === 'GET' && url.pathname === '/api/interactions') { + return send(200, { interactions: interactions.pending() }); + } + if (request.method === 'GET' && url.pathname === '/api/runtime/mode') { + return send(200, { mode: runtime.mode() }); + } + if (request.method === 'GET' && url.pathname === '/api/runtime/inventory') { + return send(200, runtime.inventory()); + } + if (request.method === 'GET' && url.pathname === '/api/runtime/mentions') { + return send(200, runtime.mentionInventory()); + } + if (request.method === 'GET' && url.pathname === '/api/jobs') { + return send(200, { jobs: runtime.jobs() }); + } + if (request.method === 'GET' && url.pathname === '/api/workflows') { + return send(200, { workflows: runtime.workflows() }); + } + if (request.method === 'GET' && url.pathname === '/api/settings') { + return send(200, await settings.snapshot()); + } + if (request.method === 'GET' && url.pathname === '/api/settings/models/catalog') { + return send(200, await settings.modelCatalog()); + } + const settingsSectionMatch = url.pathname.match(/^\/api\/settings\/([^/]+)$/); + if (request.method === 'GET' && settingsSectionMatch) { + const section = decodeURIComponent(settingsSectionMatch[1]) as MossWebSettingsSection; + return send(200, await settings.section(section)); + } + const inboxMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/inbox$/); + if (request.method === 'GET' && inboxMatch) { + return send(200, { entries: runtime.inbox(decodeURIComponent(inboxMatch[1])) }); + } + const goalMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/goal$/); + if (request.method === 'GET' && goalMatch) { + return send(200, { goal: await runtime.goal(decodeURIComponent(goalMatch[1])) }); + } + const todoMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/todos$/); + if (request.method === 'GET' && todoMatch) { + return send(200, { todos: await runtime.todos(decodeURIComponent(todoMatch[1])) }); + } + const trajectoryMatch = url.pathname.match(/^\/api\/runs\/([^/]+)\/trajectory$/); + if (request.method === 'GET' && trajectoryMatch) { + return send(200, runtime.trajectory(decodeURIComponent(trajectoryMatch[1]))); + } + const verdictMatch = url.pathname.match(/^\/api\/runs\/([^/]+)\/verdict$/); + if (request.method === 'GET' && verdictMatch) { + return send(200, runtime.completionVerdict(decodeURIComponent(verdictMatch[1]))); + } + + const interactionMatch = url.pathname.match(/^\/api\/interactions\/([^/]+)\/(resolve|cancel)$/); + const jobStopMatch = url.pathname.match(/^\/api\/jobs\/([^/]+)\/stop$/); + const workflowRunMatch = url.pathname.match(/^\/api\/workflows\/([^/]+)\/run$/); + const settingsValidationMatch = url.pathname.match(/^\/api\/settings\/([^/]+)\/validate$/); + const credentialMatch = url.pathname.match(/^\/api\/settings\/credentials\/([^/]+)$/); + const steerMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/steer$/); + const commandMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/commands$/); + const isMutation = + (request.method === 'POST' && + Boolean( + interactionMatch || + jobStopMatch || + workflowRunMatch || + settingsValidationMatch || + inboxMatch || + steerMatch || + commandMatch + )) || + (request.method === 'PUT' && + Boolean( + url.pathname === '/api/runtime/mode' || + url.pathname === '/api/runtime/permission-preset' || + url.pathname === '/api/settings/models/selection' || + credentialMatch || + settingsSectionMatch || + goalMatch + )) || + (request.method === 'DELETE' && Boolean(credentialMatch)); + if (isMutation && !options.mutationAllowed) { + return send(403, { error: 'non-local origin denied' }); + } + + if (request.method === 'POST' && interactionMatch) { + const interactionId = decodeURIComponent(interactionMatch[1]); + let resolved: boolean; + if (interactionMatch[2] === 'cancel') { + resolved = interactions.cancel(interactionId); + } else { + const body = await readJson(request); + resolved = interactions.resolve( + interactionId, + typeof body.answer === 'string' ? body.answer : '' + ); + } + return resolved + ? send(200, { interaction: interactions.get(interactionId) }) + : send(409, { error: 'interaction is no longer pending' }); + } + if (request.method === 'PUT' && url.pathname === '/api/runtime/mode') { + const body = await readJson(request); + return send(200, { + mode: runtime.setMode(typeof body.mode === 'string' ? body.mode : ''), + }); + } + if (request.method === 'PUT' && url.pathname === '/api/runtime/permission-preset') { + const body = await readJson(request); + const result = settings.save('general', { + profile: typeof body.profile === 'string' ? body.profile : '', + }); + return send(result.valid ? 200 : 400, { ...result, restartRequired: result.valid }); + } + if (request.method === 'POST' && jobStopMatch) { + const taskId = decodeURIComponent(jobStopMatch[1]); + return runtime.stopJob(taskId) + ? send(200, { taskId, stopped: true }) + : send(404, { error: 'job not found' }); + } + if (request.method === 'POST' && workflowRunMatch) { + const body = await readJson(request); + const sessionId = typeof body.sessionId === 'string' ? body.sessionId : ''; + if (!sessionId) return send(400, { error: 'sessionId is required' }); + return send( + 201, + await runtime.runWorkflow( + sessionId, + decodeURIComponent(workflowRunMatch[1]), + typeof body.args === 'string' ? body.args : '' + ) + ); + } + if (request.method === 'POST' && settingsValidationMatch) { + const section = decodeURIComponent(settingsValidationMatch[1]) as MossWebSettingsSection; + const body = await readJson(request); + const result = settings.validate(section, body.values); + return send(result.valid ? 200 : 400, result); + } + if (request.method === 'PUT' && url.pathname === '/api/settings/models/selection') { + const body = await readJson(request); + return send(200, await settings.selectModel(typeof body.model === 'string' ? body.model : '')); + } + if (credentialMatch && (request.method === 'PUT' || request.method === 'DELETE')) { + const credential = decodeURIComponent(credentialMatch[1]); + if (credential !== 'apiKey') return send(404, { error: 'credential not found' }); + if (request.method === 'PUT') { + const body = await readJson(request); + settings.writeCredential('apiKey', typeof body.value === 'string' ? body.value : ''); + return send(200, { credential, configured: true }); + } + settings.deleteCredential('apiKey'); + return send(200, { credential, configured: false }); + } + if (request.method === 'PUT' && settingsSectionMatch) { + const section = decodeURIComponent(settingsSectionMatch[1]) as MossWebSettingsSection; + const body = await readJson(request); + const result = settings.save(section, body.values); + return send(result.valid ? 200 : 400, result); + } + if (request.method === 'POST' && inboxMatch) { + const body = await readJson(request); + const entry = runtime.admit( + decodeURIComponent(inboxMatch[1]), + typeof body.prompt === 'string' ? body.prompt : '', + body.delivery === 'steer' ? 'steer' : 'queue' + ); + return send(201, { entry }); + } + if (request.method === 'POST' && steerMatch) { + const body = await readJson(request); + const entry = runtime.steer( + decodeURIComponent(steerMatch[1]), + typeof body.prompt === 'string' ? body.prompt : '' + ); + return entry + ? send(201, { entry }) + : send(409, { error: 'steering requires exactly one active agent run' }); + } + if (request.method === 'PUT' && goalMatch) { + const body = await readJson(request); + const action = body.action; + if ( + action !== 'set' && + action !== 'pause' && + action !== 'resume' && + action !== 'complete' && + action !== 'block' && + action !== 'clear' + ) { + return send(400, { error: 'invalid goal action' }); + } + const goal = await runtime.updateGoal(decodeURIComponent(goalMatch[1]), action, { + ...(typeof body.objective === 'string' ? { objective: body.objective } : {}), + ...(typeof body.reason === 'string' ? { reason: body.reason } : {}), + }); + return send(200, { goal }); + } + if (request.method === 'POST' && commandMatch) { + const body = await readJson(request); + const command = typeof body.command === 'string' ? body.command.trim() : ''; + if (!command.startsWith('/')) return send(400, { error: 'slash command required' }); + return send(200, await runtime.dispatchSlash(decodeURIComponent(commandMatch[1]), command)); + } + return false; +} diff --git a/packages/moss-agent/src/web-ui/web-event-journal.ts b/packages/moss-agent/src/web-ui/web-event-journal.ts new file mode 100644 index 00000000..585119f4 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-event-journal.ts @@ -0,0 +1,146 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import type { MossWebJournalEvent, MossWebStreamEvent } from './web-contracts.js'; + +type MossWebJournalRecord = MossWebJournalEvent; + +type JournalListener = (record: MossWebJournalRecord) => void; + +const WEB_EVENT_TYPES = new Set([ + 'run', + 'text', + 'thought', + 'tool', + 'done', + 'retry', + 'compaction', + 'usage', + 'context', + 'interrupted', + 'error', +]); + +function isJournalRecord(value: unknown): value is MossWebJournalRecord { + if (!value || typeof value !== 'object' || Array.isArray(value)) return false; + const record = value as Partial; + return ( + typeof record.runId === 'string' && + typeof record.sessionId === 'string' && + Number.isSafeInteger(record.seq) && + (record.seq ?? 0) > 0 && + typeof record.time === 'number' && + Boolean(record.event) && + typeof record.event === 'object' && + typeof (record.event as { type?: unknown }).type === 'string' && + WEB_EVENT_TYPES.has((record.event as MossWebStreamEvent).type) + ); +} + +/** Instance-owned durable browser event stream used for cursor recovery. @internal */ +export class MossWebEventJournal { + private readonly records = new Map(); + + private readonly listeners = new Map>(); + + constructor(private readonly filePath?: string) { + if (filePath) this.load(filePath); + } + + append(runId: string, sessionId: string, event: MossWebStreamEvent): MossWebJournalRecord { + const records = this.records.get(runId) ?? []; + const record: MossWebJournalRecord = { + runId, + sessionId, + seq: records.length + 1, + time: Date.now(), + event, + }; + if (this.filePath) { + fs.mkdirSync(path.dirname(this.filePath), { recursive: true }); + fs.appendFileSync(this.filePath, `${JSON.stringify(record)}\n`, { mode: 0o600 }); + } + records.push(record); + this.records.set(runId, records); + for (const listener of this.listeners.get(runId) ?? []) { + try { + listener({ ...record }); + } catch { + // A disconnected browser must not fail the agent run that owns this journal. + } + } + return { ...record }; + } + + events(runId: string, after = 0): readonly MossWebJournalRecord[] { + return (this.records.get(runId) ?? []) + .filter((record) => record.seq > after) + .map((record) => ({ ...record })); + } + + latestSequence(runId: string): number { + return this.records.get(runId)?.at(-1)?.seq ?? 0; + } + + subscribe(runId: string, listener: JournalListener): () => void { + const listeners = this.listeners.get(runId) ?? new Set(); + listeners.add(listener); + this.listeners.set(runId, listeners); + return () => { + listeners.delete(listener); + if (listeners.size === 0) this.listeners.delete(runId); + }; + } + + private load(filePath: string): void { + let body: string; + try { + body = fs.readFileSync(filePath, 'utf8'); + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return; + throw error; + } + const validLines: string[] = []; + let needsRepair = false; + for (const line of body.split('\n')) { + if (!line.trim()) continue; + let parsed: unknown; + try { + parsed = JSON.parse(line); + } catch { + needsRepair = true; + break; + } + if (!isJournalRecord(parsed)) { + needsRepair = true; + break; + } + const records = this.records.get(parsed.runId) ?? []; + if (parsed.seq !== records.length + 1) { + needsRepair = true; + break; + } + records.push(parsed); + this.records.set(parsed.runId, records); + validLines.push(JSON.stringify(parsed)); + } + if (needsRepair) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, validLines.length > 0 ? `${validLines.join('\n')}\n` : '', { + mode: 0o600, + }); + } + } +} + +/** Parse a numeric or run-scoped browser event cursor without accepting a foreign run. @internal */ +export function parseMossWebEventCursor(runId: string, raw: string | string[] | undefined): number { + const value = Array.isArray(raw) ? raw[0] : raw; + if (!value) return 0; + const separator = value.lastIndexOf(':'); + const cursorRunId = separator >= 0 ? value.slice(0, separator) : runId; + const sequenceText = separator >= 0 ? value.slice(separator + 1) : value; + if (cursorRunId !== runId || !/^\d+$/.test(sequenceText)) return 0; + const sequence = Number(sequenceText); + return Number.isSafeInteger(sequence) && sequence >= 0 ? sequence : 0; +} diff --git a/packages/moss-agent/src/web-ui/web-interaction-bindings.ts b/packages/moss-agent/src/web-ui/web-interaction-bindings.ts new file mode 100644 index 00000000..71801c07 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-interaction-bindings.ts @@ -0,0 +1,35 @@ +import type { MossAgent } from '../core/agent/moss-agent.js'; +import { + setCliToolApprovalHookAsker, + setCliToolApprovalHookInteractionMode, +} from '../cli/approval.js'; +import type { MossWebInteractionBroker } from './web-interaction-broker.js'; +import type { MossWebRuntimeService } from './web-runtime-service.js'; + +/** Bind host-local browser interactions without changing process-global CLI state. @internal */ +export function bindMossWebInteractions( + agent: MossAgent, + broker: MossWebInteractionBroker, + runtime: MossWebRuntimeService +): () => void { + const unbindApprovalAsker = setCliToolApprovalHookAsker( + agent.config.hooks?.onBeforeToolExec, + broker.askApproval + ); + const unbindApprovalMode = setCliToolApprovalHookInteractionMode( + agent.config.hooks?.onBeforeToolExec, + () => runtime.mode() + ); + const questionCapableAgent = agent as MossAgent & { + setUserQuestionAsker?: MossAgent['setUserQuestionAsker']; + }; + const unbindQuestionAsker = questionCapableAgent.setUserQuestionAsker + ? questionCapableAgent.setUserQuestionAsker(broker.askQuestion) + : () => {}; + + return () => { + unbindApprovalAsker(); + unbindApprovalMode(); + unbindQuestionAsker(); + }; +} diff --git a/packages/moss-agent/src/web-ui/web-interaction-broker.ts b/packages/moss-agent/src/web-ui/web-interaction-broker.ts new file mode 100644 index 00000000..cfd9958e --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-interaction-broker.ts @@ -0,0 +1,124 @@ +import { randomUUID } from 'node:crypto'; + +import { ErrorCode, MossError } from '../errors.js'; + +/** Browser interaction categories that can temporarily take over the composer. @beta */ +export type MossWebInteractionKind = 'approval' | 'question'; +/** Lifecycle state for one browser-mediated interaction. @beta */ +export type MossWebInteractionState = 'pending' | 'resolved' | 'cancelled'; + +/** Browser-safe pending approval or user-question request. @beta */ +export interface MossWebPendingInteraction { + readonly id: string; + readonly kind: MossWebInteractionKind; + readonly prompt: string; + readonly state: MossWebInteractionState; + readonly createdAt: number; + readonly resolvedAt?: number; +} + +interface InteractionRecord { + snapshot: MossWebPendingInteraction; + resolve: (answer: string) => void; + abortSignal?: AbortSignal; + onAbort?: () => void; +} + +/** Bridges blocking CLI approval/question prompts to a browser-owned pending protocol. @internal */ +export class MossWebInteractionBroker { + private readonly records = new Map(); + + readonly askApproval = (prompt: string, abortSignal?: AbortSignal): Promise => + this.ask('approval', prompt, abortSignal); + + readonly askQuestion = (prompt: string, abortSignal?: AbortSignal): Promise => + this.ask('question', prompt, abortSignal); + + pending(): readonly MossWebPendingInteraction[] { + return [...this.records.values()] + .map(({ snapshot }) => snapshot) + .filter(({ state }) => state === 'pending') + .sort((left, right) => left.createdAt - right.createdAt); + } + + get(id: string): MossWebPendingInteraction | undefined { + return this.records.get(id)?.snapshot; + } + + resolve(id: string, answer: string): boolean { + const record = this.records.get(id); + if (!record || record.snapshot.state !== 'pending') return false; + const resolvedAnswer = this.normalizeAnswer(record.snapshot.kind, answer); + this.finish(record, 'resolved', resolvedAnswer); + return true; + } + + cancel(id: string): boolean { + const record = this.records.get(id); + if (!record || record.snapshot.state !== 'pending') return false; + this.finish(record, 'cancelled', ''); + return true; + } + + cancelAll(): void { + for (const record of this.records.values()) { + if (record.snapshot.state === 'pending') this.finish(record, 'cancelled', ''); + } + } + + private ask( + kind: MossWebInteractionKind, + prompt: string, + abortSignal?: AbortSignal + ): Promise { + if (abortSignal?.aborted) return Promise.resolve(''); + return new Promise((resolve) => { + const id = `interaction-${randomUUID()}`; + const record: InteractionRecord = { + snapshot: { + id, + kind, + prompt, + state: 'pending', + createdAt: Date.now(), + }, + resolve, + abortSignal, + }; + record.onAbort = () => this.finish(record, 'cancelled', ''); + abortSignal?.addEventListener('abort', record.onAbort, { once: true }); + this.records.set(id, record); + this.pruneHistory(); + }); + } + + private finish( + record: InteractionRecord, + state: Extract, + answer: string + ): void { + record.abortSignal?.removeEventListener('abort', record.onAbort!); + record.snapshot = { ...record.snapshot, state, resolvedAt: Date.now() }; + record.resolve(answer); + } + + private normalizeAnswer(kind: MossWebInteractionKind, answer: string): string { + if (kind === 'question') return answer; + if (answer === 'allow_once') return 'y'; + if (answer === 'allow_always') return 'a'; + if (answer === 'deny') return 'n'; + throw new MossError({ + code: ErrorCode.USER_INPUT_INVALID, + message: 'approval answer must be allow_once, allow_always, or deny', + }); + } + + private pruneHistory(): void { + if (this.records.size <= 200) return; + for (const [id, record] of this.records) { + if (record.snapshot.state === 'pending') continue; + this.records.delete(id); + if (this.records.size <= 200) break; + } + } +} diff --git a/packages/moss-agent/src/web-ui/web-plugin-lifecycle.ts b/packages/moss-agent/src/web-ui/web-plugin-lifecycle.ts new file mode 100644 index 00000000..79c269f0 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-plugin-lifecycle.ts @@ -0,0 +1,179 @@ +import type { MossAgent } from '../core/agent/moss-agent.js'; +import type { MossPlugin } from '../core/plugins/plugin-host.js'; +import { ErrorCode, MossError } from '../errors.js'; +import { importDshPackage } from '../plugins/dsh-bundle-compatibility.js'; +import type { MossPluginConfigSchema } from '../plugins/plugin-config-schema.js'; +import { readMossPluginConfigSchema } from '../plugins/plugin-config-store.js'; +import type { MossPluginConfigStore } from '../plugins/plugin-config-store.js'; +import type { + InstalledMossPlugin, + InstalledPluginRegistry, +} from '../plugins/installed-plugin-registry.js'; + +/** Resolve the schema of one installed plugin without exposing secret values. @internal */ +export async function installedPluginSchema( + entry: InstalledMossPlugin +): Promise { + return entry.format === 'dsh-package-v1' + ? (await importDshPackage(entry.root)).configSchema + : readMossPluginConfigSchema(entry.root); +} + +function active(agent: MossAgent, pluginId: string): boolean { + return agent.plugins + .inspect() + .plugins.some(({ id, state }) => id === pluginId && state === 'active'); +} + +/** Activate a same-id immutable npm candidate and restore last-good on failure. @internal */ +export async function activateWebPluginCandidate( + agent: MossAgent, + registry: InstalledPluginRegistry, + entry: InstalledMossPlugin, + wasActive: boolean +): Promise { + if (!entry.lastGood || !entry.enabled) return; + let candidate: MossPlugin | undefined; + try { + candidate = await registry.loadInstalled(entry.id); + } catch (error) { + await registry.rollback(entry.id); + throw error; + } + if (wasActive) { + try { + await agent.plugins.unload(entry.id); + } catch (error) { + await discard(candidate); + await registry.rollback(entry.id); + throw error; + } + } + try { + await agent.plugins.install(candidate); + } catch (error) { + await registry.rollback(entry.id); + if (wasActive) await restoreRuntime(agent, registry, entry.id); + throw error; + } +} + +async function discard(candidate: MossPlugin | undefined): Promise { + await candidate?.disposeCandidate?.(); +} + +async function restoreRuntime( + agent: MossAgent, + registry: InstalledPluginRegistry, + pluginId: string +): Promise { + const rollback = await registry.loadInstalled(pluginId); + await agent.plugins.install(rollback); +} + +/** Enable and activate one statically validated candidate exactly once. @internal */ +export async function enableWebPlugin( + agent: MossAgent, + registry: InstalledPluginRegistry, + pluginId: string +): Promise { + if (active(agent, pluginId)) { + await registry.enable(pluginId); + return; + } + const candidate = await registry.loadInstalled(pluginId); + try { + await registry.enable(pluginId); + } catch (error) { + await discard(candidate); + throw error; + } + try { + await agent.plugins.install(candidate); + } catch (error) { + await registry.disable(pluginId).catch(() => {}); + throw error; + } +} + +/** Disable one generation and restore it if the registry commit fails. @internal */ +export async function disableWebPlugin( + agent: MossAgent, + registry: InstalledPluginRegistry, + pluginId: string +): Promise { + const wasActive = active(agent, pluginId); + if (wasActive) await agent.plugins.unload(pluginId); + try { + await registry.disable(pluginId); + } catch (error) { + if (wasActive) await restoreRuntime(agent, registry, pluginId); + throw error; + } +} + +/** Remove one generation and restore it if the registry commit fails. @internal */ +export async function removeWebPlugin( + agent: MossAgent, + registry: InstalledPluginRegistry, + pluginId: string +): Promise { + const wasActive = active(agent, pluginId); + if (wasActive) await agent.plugins.unload(pluginId); + try { + await registry.remove(pluginId); + } catch (error) { + if (wasActive) await restoreRuntime(agent, registry, pluginId); + throw error; + } +} + +/** Persist config, prepare one candidate, drain old calls, and roll back on failure. @internal */ +export async function mutateWebPluginConfig( + agent: MossAgent, + registry: InstalledPluginRegistry, + store: MossPluginConfigStore, + entry: InstalledMossPlugin, + schema: MossPluginConfigSchema, + mutation: () => Promise +): Promise { + if (!active(agent, entry.id)) { + await mutation(); + return; + } + const before = await store.loadRuntimeConfig(entry.id, schema); + await mutation(); + + let candidate: MossPlugin | undefined; + try { + candidate = await registry.loadInstalled(entry.id); + } catch (error) { + await store.replaceRuntimeConfig(entry.id, schema, before); + throw error; + } + + try { + await agent.plugins.unload(entry.id); + } catch (error) { + await discard(candidate); + await store.replaceRuntimeConfig(entry.id, schema, before); + throw error; + } + + try { + await agent.plugins.install(candidate); + } catch (activationError) { + await store.replaceRuntimeConfig(entry.id, schema, before); + try { + await restoreRuntime(agent, registry, entry.id); + } catch (rollbackError) { + throw new MossError({ + code: ErrorCode.TOOL_EXECUTION_FAILED, + message: `plugin config activation and rollback failed: ${entry.id}`, + cause: new AggregateError([activationError, rollbackError]), + context: { pluginId: entry.id }, + }); + } + throw activationError; + } +} diff --git a/packages/moss-agent/src/web-ui/web-run-streaming.ts b/packages/moss-agent/src/web-ui/web-run-streaming.ts new file mode 100644 index 00000000..876bcb67 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-run-streaming.ts @@ -0,0 +1,204 @@ +import type http from 'node:http'; + +import type { ChatOptions, MossAgent } from '../core/agent/moss-agent.js'; +import type { TaskRunLedger } from '../core/task-run/task-run-ledger.js'; +import { errorMessage } from '../errors.js'; +import type { MossWebStreamEvent } from './web-contracts.js'; +import type { MossWebEventJournal } from './web-event-journal.js'; + +/** Stream durable run events with cursor replay and terminal close semantics. @internal */ +export function streamRunEvents( + request: http.IncomingMessage, + response: http.ServerResponse, + eventStreams: Set, + journal: MossWebEventJournal, + run: NonNullable>, + after: number +): void { + response.writeHead(200, { + 'content-type': 'text/event-stream; charset=utf-8', + 'cache-control': 'no-store', + connection: 'keep-alive', + 'x-accel-buffering': 'no', + 'x-content-type-options': 'nosniff', + }); + response.write(': moss-event-stream\n\n'); + eventStreams.add(response); + const subscription: { unsubscribe?: () => void } = {}; + let finished = false; + const keepAlive = setInterval(() => response.write(': keep-alive\n\n'), 15_000); + keepAlive.unref(); + const cleanup = () => { + if (finished) return; + finished = true; + clearInterval(keepAlive); + subscription.unsubscribe?.(); + eventStreams.delete(response); + }; + const finish = () => { + cleanup(); + response.end(); + }; + const send = (record: ReturnType) => { + if (finished) return; + response.write(`id: ${record.seq}\n`); + response.write(`event: ${record.event.type}\n`); + response.write(`data: ${JSON.stringify(record)}\n\n`); + if (record.event.type === 'done' || record.event.type === 'interrupted') finish(); + }; + request.once('aborted', cleanup); + response.once('close', cleanup); + for (const record of journal.events(run.id, after)) send(record); + if (finished) return; + if ( + run.status === 'completed' || + run.status === 'failed' || + run.status === 'cancelled' || + run.status === 'interrupted' + ) { + finish(); + return; + } + subscription.unsubscribe = journal.subscribe(run.id, send); +} + +/** Stream one agent turn as legacy NDJSON while journaling resumable browser events. @internal */ +export async function streamPrompt( + agent: MossAgent, + taskRuns: TaskRunLedger, + eventJournal: MossWebEventJournal, + active: Map, + runId: string, + sessionId: string, + prompt: string, + attachments: NonNullable, + response: http.ServerResponse +): Promise { + const controller = new AbortController(); + active.set(sessionId, controller); + response.writeHead(200, { + 'content-type': 'application/x-ndjson; charset=utf-8', + 'cache-control': 'no-store', + connection: 'keep-alive', + 'x-content-type-options': 'nosniff', + }); + const emit = (event: MossWebStreamEvent) => { + try { + eventJournal.append(runId, sessionId, event); + } catch (error) { + console.error(`[web] failed to persist resumable event: ${errorMessage(error)}`); + } + response.write(`${JSON.stringify(event)}\n`); + }; + let stopReason = 'end_turn'; + let streamError: string | undefined; + try { + const before = taskRuns.get(runId); + if (before?.status === 'created') { + const run = taskRuns.append(runId, { + type: 'run.started', + data: { promptLength: prompt.length }, + }); + emit({ type: 'run', run }); + } + for await (const event of agent.streamChat(sessionId, prompt, { + abortSignal: controller.signal, + ...(attachments.length > 0 ? { attachments } : {}), + })) { + if (event.type === 'text_delta') emit({ type: 'text', delta: event.delta }); + if (event.type === 'thinking_delta') emit({ type: 'thought', delta: event.delta }); + if (event.type === 'tool_start') { + taskRuns.append(runId, { + type: 'tool.started', + data: { toolCallId: event.toolCallId, name: event.toolName }, + }); + emit({ + type: 'tool', + state: 'start', + toolCallId: event.toolCallId, + name: event.toolName, + input: event.input, + }); + } + if (event.type === 'tool_end') { + taskRuns.append(runId, { + type: event.isError ? 'tool.failed' : 'tool.succeeded', + data: { toolCallId: event.toolCallId, name: event.toolName, isError: event.isError }, + }); + emit({ + type: 'tool', + state: 'end', + toolCallId: event.toolCallId, + name: event.toolName, + result: event.result, + isError: event.isError, + }); + } + if (event.type === 'retry') + emit({ type: 'retry', attempt: event.attempt, error: event.error }); + if (event.type === 'compaction') { + emit({ + type: 'compaction', + summaryChars: event.summaryChars, + droppedMessages: event.droppedMessages, + ...(event.checkpointOutline ? { checkpointOutline: event.checkpointOutline } : {}), + }); + } + if (event.type === 'llm_usage') { + emit({ + type: 'usage', + inputTokens: event.inputTokens, + outputTokens: event.outputTokens, + ...(event.cacheReadTokens !== undefined + ? { cacheReadTokens: event.cacheReadTokens } + : {}), + ...(event.cacheCreationTokens !== undefined + ? { cacheCreationTokens: event.cacheCreationTokens } + : {}), + ...(event.contextTokens !== undefined ? { contextTokens: event.contextTokens } : {}), + }); + } + if (event.type === 'working_context_checkpoint') { + emit({ + type: 'context', + status: event.status, + reason: event.reason, + goal: event.goal, + nextAction: event.nextAction, + }); + } + if (event.type === 'turn_end') stopReason = event.stopReason; + if (event.type === 'error') { + streamError = event.error; + stopReason = 'error'; + emit({ type: 'error', message: event.error }); + } + if (event.type === 'done') { + stopReason = event.result.stopReason ?? (streamError ? 'error' : stopReason); + } + } + const current = taskRuns.get(runId); + const terminalType = + !streamError && (stopReason === 'end_turn' || stopReason === 'stop_sequence') + ? 'run.completed' + : 'run.failed'; + const run = + current?.status === 'running' + ? taskRuns.append(runId, { + type: terminalType, + data: { stopReason, ...(streamError ? { message: streamError } : {}) }, + }) + : current; + emit({ type: 'done', stopReason, run }); + } catch (error) { + const current = taskRuns.get(runId); + if (current?.status === 'running') { + taskRuns.append(runId, { type: 'run.failed', data: { message: errorMessage(error) } }); + } + emit({ type: 'error', message: errorMessage(error) }); + emit({ type: 'done', stopReason: controller.signal.aborted ? 'aborted_by_user' : 'error' }); + } finally { + if (active.get(sessionId) === controller) active.delete(sessionId); + response.end(); + } +} diff --git a/packages/moss-agent/src/web-ui/web-runtime-service.ts b/packages/moss-agent/src/web-ui/web-runtime-service.ts new file mode 100644 index 00000000..d5829614 --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-runtime-service.ts @@ -0,0 +1,264 @@ +import type { MossAgent } from '../core/agent/moss-agent.js'; +import type { TaskRunLedger } from '../core/task-run/task-run-ledger.js'; +import { parseCliInteractionMode, type CliInteractionMode } from '../cli/approval.js'; +import { + registryCommandNames, + runRegistryCommand, + type CommandContext, + type CommandSpec, +} from '../cli/commands/registry.js'; +import type { CliRuntimeStatus } from '../cli/onboarding.js'; +import { ErrorCode, MossError } from '../errors.js'; +import { parseTodoChecklistText, type TodoItem } from '../tools/todo-tool.js'; + +export interface MossWebRuntimeServiceOptions { + readonly runtime?: CliRuntimeStatus; + readonly locale?: string; + readonly initialMode?: CliInteractionMode; +} + +/** Browser application service over the agent's existing runtime state owners. @internal */ +export class MossWebRuntimeService { + private currentMode: CliInteractionMode; + + constructor( + private readonly agent: MossAgent, + private readonly taskRuns: TaskRunLedger, + private readonly options: MossWebRuntimeServiceOptions = {} + ) { + this.currentMode = options.initialMode ?? 'default'; + } + + mode(): CliInteractionMode { + return this.currentMode; + } + + setMode(raw: string): CliInteractionMode { + const mode = parseCliInteractionMode(raw); + if (!mode) this.invalid('mode must be plan, default, or accept-edits'); + this.currentMode = mode; + return mode; + } + + inbox(sessionId: string) { + return this.agent.inboxPending(sessionId); + } + + admit(sessionId: string, prompt: string, delivery: 'queue' | 'steer' = 'queue') { + const normalized = this.prompt(prompt); + return this.agent.admit(sessionId, normalized, { delivery }); + } + + steer(sessionId: string, prompt: string) { + return this.agent.steer(sessionId, this.prompt(prompt)); + } + + async goal(sessionId: string) { + return this.agent.getGoal(sessionId); + } + + async setGoal(sessionId: string, objective: string) { + return this.agent.setGoal(sessionId, objective); + } + + async updateGoal( + sessionId: string, + action: 'set' | 'pause' | 'resume' | 'complete' | 'block' | 'clear', + input: { objective?: string; reason?: string } + ) { + if (action === 'set') return this.agent.setGoal(sessionId, input.objective ?? ''); + if (action === 'pause') return this.agent.pauseGoal(sessionId, input.reason); + if (action === 'resume') return this.agent.resumeGoal(sessionId); + if (action === 'complete') return this.agent.completeGoal(sessionId, input.reason); + if (action === 'block') return this.agent.blockGoal(sessionId, input.reason); + await this.agent.clearGoal(sessionId); + return undefined; + } + + async todos(sessionId: string): Promise { + const messages = await this.agent.config.sessionStore.loadMessages(sessionId); + for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex--) { + const content = messages[messageIndex]?.content; + if (!Array.isArray(content)) continue; + for (let blockIndex = content.length - 1; blockIndex >= 0; blockIndex--) { + const block = content[blockIndex]; + if (block?.type !== 'tool_result' || typeof block.content !== 'string') continue; + const parsed = parseTodoChecklistText(block.content); + if (parsed !== null) return parsed; + } + } + return []; + } + + jobs() { + return this.agent.asyncTasks.list(); + } + + stopJob(taskId: string): boolean { + return this.agent.asyncTasks.stop(taskId, 'user_cancelled'); + } + + workflows() { + return this.agent.plugins.listCommands().map((command) => ({ + id: command.id, + title: command.title, + description: command.description, + available: true, + })); + } + + async runWorkflow(sessionId: string, workflowId: string, args: string) { + const prompt = (await this.agent.plugins.expandCommand(workflowId, args))?.trim(); + if (prompt === undefined) this.invalid(`workflow "${workflowId}" was not found`); + if (!prompt) this.invalid(`workflow "${workflowId}" produced an empty prompt`); + const entry = this.agent.admit(sessionId, prompt, { delivery: 'queue' }); + return { workflowId, prompt, entry }; + } + + trajectory(runId: string) { + const run = this.taskRuns.get(runId); + if (!run) this.invalid(`run "${runId}" was not found`); + const events = this.taskRuns.events(runId); + return { + run, + events, + evidence: events.filter((event) => event.type.startsWith('tool.')), + }; + } + + completionVerdict(runId: string) { + const run = this.taskRuns.get(runId); + if (!run) this.invalid(`run "${runId}" was not found`); + return { + runId, + status: run.status, + verdict: run.verification, + evidenceCount: run.evidenceCount, + complete: run.status === 'completed', + }; + } + + mentionInventory() { + const skills = (this.agent.config.skillRegistry?.list() ?? []).map((skill) => ({ + id: skill.stableId ?? skill.name, + name: skill.name, + description: skill.description, + enabled: skill.enabled !== false, + })); + const configuredExperts = + this.agent.config.subagentExpertRegistry?.list() ?? this.agent.config.subagentExperts ?? []; + const pluginExperts = this.agent.plugins + .inspect() + .plugins.flatMap((plugin) => plugin.experts.map((id) => ({ id, pluginId: plugin.id }))); + return { + commands: [ + ...registryCommandNames(), + ...this.agent.plugins.listCommands().map(({ id }) => `/${id}`), + ], + skills, + experts: [ + ...configuredExperts.map(({ instructions: _, ...expert }) => expert), + ...pluginExperts, + ], + }; + } + + inventory() { + return { + model: this.agent.config.model ?? 'Configured model', + workspace: this.agent.config.workspaceDir, + mode: this.mode(), + tools: this.agent.tools.getAll().map((tool) => ({ + name: tool.name, + description: tool.description, + sideEffect: tool.metadata?.sideEffectClass ?? 'local_write', + })), + plugins: this.agent.plugins.inspect(), + asyncTasks: this.jobs(), + runtime: this.options.runtime + ? { + workspace: this.options.runtime.workspace, + runtimeDir: this.options.runtime.runtimeDir, + execBackend: this.options.runtime.execBackend, + safetyMode: this.options.runtime.safetyMode, + meshEnabled: this.options.runtime.meshEnabled, + mcp: this.options.runtime.mcp, + deviceConnected: Boolean(this.options.runtime.device), + } + : undefined, + }; + } + + async dispatchSlash(sessionId: string, command: string) { + const messages: Array<{ kind: 'system' | 'error'; text: string }> = []; + const modeCommand = command.trim().match(/^\/(?:mode|plan)(?:\s+(.*))?$/); + if (modeCommand) { + const input = modeCommand[1]?.trim(); + if (!input) { + messages.push({ kind: 'system', text: `Interaction mode: ${this.mode()}` }); + } else { + const parsed = parseCliInteractionMode(input); + if (!parsed) { + messages.push({ + kind: 'error', + text: 'Usage: /mode [plan|default|accept-edits]', + }); + } else { + this.currentMode = parsed; + messages.push({ kind: 'system', text: `Switched to ${parsed}` }); + } + } + return { handled: true, messages, mode: this.mode() }; + } + let prefill: string | undefined; + let submittedPrompt: string | undefined; + const context: CommandContext = { + agent: this.agent, + runtime: this.options.runtime, + sessionKey: sessionId, + workspace: this.agent.config.workspaceDir ?? process.cwd(), + locale: this.options.locale, + surface: 'repl', + say: (kind, text) => messages.push({ kind, text }), + prefillInput: (text) => { + prefill = text; + }, + submitPrompt: (text) => { + submittedPrompt = text; + }, + setInteractionMode: (mode) => { + this.currentMode = mode; + }, + }; + const customCommands: CommandSpec[] = this.agent.plugins + .listCommands() + .map((pluginCommand) => ({ + name: `/${pluginCommand.id}`, + summary: pluginCommand.description ?? pluginCommand.title, + run: async (ctx, args) => + ctx.submitPrompt?.( + (await this.agent.plugins.expandCommand(pluginCommand.id, args)) ?? '' + ), + })); + const handled = await runRegistryCommand(command, context, customCommands); + return { + handled, + messages, + mode: this.mode(), + ...(prefill !== undefined ? { prefill } : {}), + ...(submittedPrompt !== undefined ? { submittedPrompt } : {}), + }; + } + + private prompt(value: string): string { + const normalized = value.trim(); + if (!normalized || normalized.length > 20_000) { + this.invalid('prompt must contain 1 to 20000 characters'); + } + return normalized; + } + + private invalid(message: string): never { + throw new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); + } +} diff --git a/packages/moss-agent/src/web-ui/web-server.ts b/packages/moss-agent/src/web-ui/web-server.ts index adf7366b..b36acc35 100644 --- a/packages/moss-agent/src/web-ui/web-server.ts +++ b/packages/moss-agent/src/web-ui/web-server.ts @@ -8,7 +8,28 @@ import { TaskRunLedger } from '../core/task-run/task-run-ledger.js'; import { ErrorCode, MossError, errorMessage } from '../errors.js'; import { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; import { readMossPluginManifest } from '../plugins/installed-plugin-registry.js'; -import { WEB_HTML } from './web-assets.js'; +import { MossPluginConfigStore } from '../plugins/plugin-config-store.js'; +import { CliServices } from '../cli/cli-services.js'; +import type { CliRuntimeStatus } from '../cli/onboarding.js'; +import { handleMossWebAttachmentRequest } from './web-attachment-router.js'; +import { MossWebAttachmentService } from './web-attachment-service.js'; +import { handleMossWebControlPlaneRequest } from './web-control-plane-router.js'; +import { MossWebEventJournal, parseMossWebEventCursor } from './web-event-journal.js'; +import { MossWebInteractionBroker } from './web-interaction-broker.js'; +import { bindMossWebInteractions } from './web-interaction-bindings.js'; +import { streamPrompt, streamRunEvents } from './web-run-streaming.js'; +import { MossWebRuntimeService } from './web-runtime-service.js'; +import { MossWebSessionService } from './web-session-service.js'; +import { MossWebSettingsService } from './web-settings-service.js'; +import { + activateWebPluginCandidate, + disableWebPlugin, + enableWebPlugin, + installedPluginSchema, + mutateWebPluginConfig, + removeWebPlugin, +} from './web-plugin-lifecycle.js'; +import { resolveMossWebStaticAsset, type MossWebClientAssetName } from './web-static-assets.js'; const MAX_BODY_BYTES = 64 * 1024; @@ -20,17 +41,35 @@ interface ActiveWebContribution { readonly source: string; } +interface ActiveWebContributionState { + current: readonly ActiveWebContribution[]; +} + /** Options for the loopback Moss Web host. @beta */ export interface MossWebServerOptions { port?: number; host?: string; abortSignal?: AbortSignal; - /** Optional host-owned task ledger. Defaults to an in-memory ledger. */ + /** Optional host-owned task ledger. Defaults to workspace durability when available. */ taskRunLedger?: TaskRunLedger; /** Optional JSONL path used when the server creates its own ledger. */ taskRunFile?: string; + /** Optional JSONL path for resumable browser stream events. */ + eventJournalFile?: string; + /** Optional JSON path for durable Web-only session titles. */ + sessionMetadataFile?: string; /** Config root used by the explicit installed-plugin registry. */ configDir?: string; + /** Optional CLI service facade reused by browser settings and model selection. */ + cliServices?: CliServices; + /** Optional live CLI runtime inventory exposed without credentials. */ + runtime?: CliRuntimeStatus; + /** Optional explicit config path used by browser settings writes. */ + settingsConfigPath?: string; + /** Optional host-owned interaction broker. */ + interactionBroker?: MossWebInteractionBroker; + /** Optional storage root for uploaded attachments and copied generated artifacts. */ + attachmentStoreDir?: string; } /** Running loopback Moss Web host. @beta */ @@ -64,9 +103,19 @@ function sendAsset(response: http.ServerResponse, type: string, body: string): v response.end(body); } +function sendMarkdown(response: http.ServerResponse, sessionId: string, body: string): void { + response.writeHead(200, { + 'content-type': 'text/markdown; charset=utf-8', + 'content-disposition': `attachment; filename*=UTF-8''${encodeURIComponent(sessionId)}.md`, + 'cache-control': 'no-store', + 'x-content-type-options': 'nosniff', + }); + response.end(body); +} + async function sendClientAsset( response: http.ServerResponse, - filename: 'workbench.css' | 'workbench.js' + filename: MossWebClientAssetName ): Promise { const body = await readFile(new URL(`./client/${filename}`, import.meta.url), 'utf8'); sendAsset(response, filename.endsWith('.css') ? 'text/css' : 'text/javascript', body); @@ -104,9 +153,14 @@ function formatHttpOrigin(host: string, port: number): string { return `http://${hostname}:${port}`; } -function isLocalOrigin(request: http.IncomingMessage, expectedOrigin: string): boolean { +function isAuthorizedMutation( + request: http.IncomingMessage, + expectedOrigin: string, + csrfToken: string +): boolean { const origin = request.headers.origin; - if (!origin) return true; + const submittedToken = request.headers['x-moss-csrf']; + if (!origin || Array.isArray(submittedToken) || submittedToken !== csrfToken) return false; try { return new URL(origin).origin === expectedOrigin; } catch { @@ -114,40 +168,6 @@ function isLocalOrigin(request: http.IncomingMessage, expectedOrigin: string): b } } -async function listWebSessions( - agent: MossAgent, - taskRuns: TaskRunLedger -): Promise< - Array<{ - sessionId: string; - title: string; - updatedAt: number; - messageCount: number; - runId?: string; - runStatus?: string; - }> -> { - const stored = await agent.config.sessionStore.listSessions(); - const runs = taskRuns.list(); - const bySession = new Map(); - for (const run of runs) { - if (!bySession.has(run.sessionId)) bySession.set(run.sessionId, run); - } - return stored - .filter((session) => session.messageCount > 0 || bySession.has(session.sessionKey)) - .map((session) => { - const run = bySession.get(session.sessionKey); - return { - sessionId: session.sessionKey, - title: run?.title ?? session.title ?? 'Untitled task', - updatedAt: Math.max(session.updatedAt, run?.updatedAt ?? 0), - messageCount: session.messageCount, - ...(run ? { runId: run.id, runStatus: run.status } : {}), - }; - }) - .sort((left, right) => right.updatedAt - left.updatedAt); -} - async function sessionTimeline(agent: MossAgent, sessionId: string): Promise { const messages = await agent.config.sessionStore.loadMessages(sessionId); const timeline: unknown[] = []; @@ -207,20 +227,29 @@ async function sessionTimeline(agent: MossAgent, sessionId: string): Promise + agent: MossAgent ): Promise { if (!registry) return Object.freeze([]); + const activePluginIds = new Set( + agent.plugins + .inspect() + .plugins.filter(({ state }) => state === 'active') + .map(({ id }) => id) + ); + const activeContributionIds = new Set(agent.plugins.getWebContributions().map(({ id }) => id)); + const generation = agent.plugins.inspect().generation; const contributions: ActiveWebContribution[] = []; for (const entry of await registry.list()) { if (!activePluginIds.has(entry.id)) continue; try { const manifest = await readMossPluginManifest(entry.root); for (const contribution of manifest.web?.contributions ?? []) { + if (!activeContributionIds.has(contribution.id)) continue; contributions.push({ pluginId: entry.id, id: contribution.id, slot: contribution.slot, - moduleUrl: `/plugin-assets/${encodeURIComponent(entry.id)}/${encodeURIComponent(contribution.id)}.js`, + moduleUrl: `/plugin-assets/${encodeURIComponent(entry.id)}/${encodeURIComponent(contribution.id)}.js?generation=${generation}`, source: await readFile(path.resolve(entry.root, contribution.module), 'utf8'), }); } @@ -250,28 +279,94 @@ export async function startMossWebServer( options: MossWebServerOptions = {} ): Promise { const host = options.host ?? '127.0.0.1'; - const taskRuns = options.taskRunLedger ?? new TaskRunLedger(options.taskRunFile); + const runtimeDir = agent.config.workspaceDir + ? path.join(agent.config.workspaceDir, '.moss') + : undefined; + const taskRuns = + options.taskRunLedger ?? + new TaskRunLedger( + options.taskRunFile ?? (runtimeDir ? path.join(runtimeDir, 'task-runs.jsonl') : undefined) + ); + const eventJournal = new MossWebEventJournal( + options.eventJournalFile ?? (runtimeDir ? path.join(runtimeDir, 'web-events.jsonl') : undefined) + ); + const interruptedRuns = taskRuns + .list() + .filter(({ status }) => status === 'created' || status === 'running'); taskRuns.recoverInterrupted(); + for (const interrupted of interruptedRuns) { + const run = taskRuns.get(interrupted.id); + if (run) { + eventJournal.append(run.id, run.sessionId, { + type: 'interrupted', + reason: 'host restarted', + run, + }); + } + } + const sessions = new MossWebSessionService(agent, taskRuns, { + workspaceDir: agent.config.workspaceDir, + metadataFile: + options.sessionMetadataFile ?? + (runtimeDir ? path.join(runtimeDir, 'web-session-metadata.json') : undefined), + }); const active = new Map(); + const eventStreams = new Set(); const pluginRegistry = options.configDir ? new InstalledPluginRegistry({ configDir: options.configDir }) : undefined; - const startupPluginIds = new Set( - agent.plugins - .inspect() - .plugins.filter(({ state }) => state === 'active') - .map(({ id }) => id) - ); - const webContributions = await snapshotActiveWebContributions(pluginRegistry, startupPluginIds); + const interactionBroker = options.interactionBroker ?? new MossWebInteractionBroker(); + const attachments = new MossWebAttachmentService({ + storageDir: + options.attachmentStoreDir ?? + path.join(agent.config.workspaceDir ?? process.cwd(), '.moss', 'web-attachments'), + workspaceDir: agent.config.workspaceDir, + }); + const runtime = new MossWebRuntimeService(agent, taskRuns, { runtime: options.runtime }); + const settings = new MossWebSettingsService(agent, options.cliServices ?? new CliServices(), { + configPath: + options.settingsConfigPath ?? + (options.configDir ? path.join(options.configDir, 'config.json') : undefined), + pluginRegistry, + }); + const pluginConfigStore = options.configDir + ? new MossPluginConfigStore({ configDir: options.configDir }) + : undefined; + const webContributions: ActiveWebContributionState = { + current: await snapshotActiveWebContributions(pluginRegistry, agent), + }; + const compositionStreams = new Set(); + const unsubscribeComposition = agent.plugins.subscribe((snapshot) => { + void snapshotActiveWebContributions(pluginRegistry, agent) + .then((current) => { + webContributions.current = current; + const payload = `event: composition\ndata: ${JSON.stringify(snapshot)}\n\n`; + for (const stream of compositionStreams) stream.write(payload); + }) + .catch((error: unknown) => { + console.error(`[web] failed to refresh plugin composition: ${errorMessage(error)}`); + }); + }); const expectedOriginRef: { value?: string } = {}; + const csrfToken = randomUUID(); const server = http.createServer((request, response) => { void handleRequest( agent, taskRuns, + eventJournal, + sessions, + interactionBroker, + runtime, + settings, + attachments, active, + eventStreams, pluginRegistry, + pluginConfigStore, webContributions, + compositionStreams, expectedOriginRef.value, + csrfToken, request, response ).catch((error: unknown) => { @@ -288,11 +383,19 @@ export async function startMossWebServer( }); const address = server.address() as AddressInfo; expectedOriginRef.value = formatHttpOrigin(host, address.port); + const unbindInteractions = bindMossWebInteractions(agent, interactionBroker, runtime); let closePromise: Promise | undefined; const close = () => { closePromise ??= (async () => { for (const controller of active.values()) controller.abort(); active.clear(); + for (const stream of eventStreams) stream.end(); + eventStreams.clear(); + await unsubscribeComposition(); + for (const stream of compositionStreams) stream.end(); + compositionStreams.clear(); + unbindInteractions(); + interactionBroker.cancelAll(); await new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())) ); @@ -308,10 +411,20 @@ export async function startMossWebServer( async function handleRequest( agent: MossAgent, taskRuns: TaskRunLedger, + eventJournal: MossWebEventJournal, + sessions: MossWebSessionService, + interactions: MossWebInteractionBroker, + runtime: MossWebRuntimeService, + settings: MossWebSettingsService, + attachments: MossWebAttachmentService, active: Map, + eventStreams: Set, pluginRegistry: InstalledPluginRegistry | undefined, - webContributions: readonly ActiveWebContribution[], + pluginConfigStore: MossPluginConfigStore | undefined, + webContributions: ActiveWebContributionState, + compositionStreams: Set, expectedOrigin: string | undefined, + csrfToken: string, request: http.IncomingMessage, response: http.ServerResponse ): Promise { @@ -319,33 +432,72 @@ async function handleRequest( return sendJson(response, 403, { error: 'unexpected host denied' }); } const url = new URL(request.url ?? '/', 'http://moss.local'); - if (request.method === 'GET' && url.pathname === '/') - return sendAsset(response, 'text/html', WEB_HTML); - if (request.method === 'GET' && url.pathname === '/assets/workbench.css') - return sendClientAsset(response, 'workbench.css'); - if (request.method === 'GET' && url.pathname === '/assets/workbench.js') - return sendClientAsset(response, 'workbench.js'); + const staticAsset = request.method === 'GET' ? resolveMossWebStaticAsset(url) : undefined; + if (staticAsset && 'client' in staticAsset) return sendClientAsset(response, staticAsset.client); + if (staticAsset) return sendAsset(response, staticAsset.type, staticAsset.body); const pluginAssetMatch = url.pathname.match(/^\/plugin-assets\/([^/]+)\/([^/]+)\.js$/); if (request.method === 'GET' && pluginAssetMatch) { return sendPluginAsset( response, - webContributions, + webContributions.current, decodeURIComponent(pluginAssetMatch[1]), decodeURIComponent(pluginAssetMatch[2]) ); } + if ( + await handleMossWebAttachmentRequest({ + request, + response, + url, + mutationAllowed: isAuthorizedMutation(request, expectedOrigin, csrfToken), + attachments, + sendJson, + }) + ) { + return; + } + if ( + await handleMossWebControlPlaneRequest({ + request, + response, + url, + mutationAllowed: isAuthorizedMutation(request, expectedOrigin, csrfToken), + interactions, + runtime, + settings, + readJson, + sendJson, + }) + ) { + return; + } if (request.method === 'GET' && url.pathname === '/api/bootstrap') { return sendJson(response, 200, { tools: agent.tools.getNames(), plugins: agent.plugins.inspect().plugins, + pluginComposition: agent.plugins.inspect(), taskRuns: taskRuns.list(), model: agent.config.model ?? 'Configured model', + csrfToken, }); } if (request.method === 'GET' && url.pathname === '/api/runs') return sendJson(response, 200, { runs: taskRuns.list() }); + if (request.method === 'GET' && url.pathname === '/api/runs/active') { + return sendJson(response, 200, { + runs: taskRuns.list().filter(({ status }) => status === 'created' || status === 'running'), + }); + } + if (request.method === 'GET' && url.pathname === '/api/workspaces') { + return sendJson(response, 200, { workspaces: await sessions.listWorkspaces() }); + } + if (request.method === 'GET' && url.pathname === '/api/sessions/search') { + return sendJson(response, 200, { + hits: await sessions.search(url.searchParams.get('q') ?? ''), + }); + } if (request.method === 'GET' && url.pathname === '/api/sessions') - return sendJson(response, 200, { sessions: await listWebSessions(agent, taskRuns) }); + return sendJson(response, 200, { sessions: await sessions.listSessions() }); if (request.method === 'GET' && url.pathname === '/api/plugins') { const installed = ((await pluginRegistry?.list()) ?? []).map(({ id, version, enabled }) => ({ id, @@ -353,11 +505,15 @@ async function handleRequest( enabled, })); return sendJson(response, 200, { + generation: agent.plugins.inspect().generation, installed, active: agent.plugins.inspect().plugins, - contributions: webContributions.map(({ source: _, ...contribution }) => contribution), + contributions: webContributions.current.map(({ source: _, ...contribution }) => contribution), }); } + if (request.method === 'GET' && url.pathname === '/api/plugins/events') { + return streamPluginComposition(request, response, compositionStreams, agent); + } const messageMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/messages$/); if (request.method === 'GET' && messageMatch) { const sessionId = decodeURIComponent(messageMatch[1]); @@ -366,6 +522,38 @@ async function handleRequest( } return sendJson(response, 200, { items: await sessionTimeline(agent, sessionId) }); } + const sessionExportMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/export$/); + if (request.method === 'GET' && sessionExportMatch) { + const sessionId = decodeURIComponent(sessionExportMatch[1]); + return sendMarkdown(response, sessionId, await sessions.exportMarkdown(sessionId)); + } + const activeRunMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/active-run$/); + if (request.method === 'GET' && activeRunMatch) { + const sessionId = decodeURIComponent(activeRunMatch[1]); + const run = taskRuns + .list() + .find( + (candidate) => + candidate.sessionId === sessionId && + (candidate.status === 'created' || candidate.status === 'running') + ); + return run + ? sendJson(response, 200, { + run, + cursor: eventJournal.latestSequence(run.id), + eventsUrl: `/api/runs/${encodeURIComponent(run.id)}/events`, + }) + : sendJson(response, 404, { error: 'active run not found' }); + } + const runEventsMatch = url.pathname.match(/^\/api\/runs\/([^/]+)\/events$/); + if (request.method === 'GET' && runEventsMatch) { + const runId = decodeURIComponent(runEventsMatch[1]); + const run = taskRuns.get(runId); + if (!run) return sendJson(response, 404, { error: 'run not found' }); + const queryCursor = url.searchParams.get('after'); + const after = parseMossWebEventCursor(runId, queryCursor ?? request.headers['last-event-id']); + return streamRunEvents(request, response, eventStreams, eventJournal, run, after); + } const runMatch = url.pathname.match(/^\/api\/runs\/([^/]+)$/); if (request.method === 'GET' && runMatch) { const runId = decodeURIComponent(runMatch[1]); @@ -376,23 +564,140 @@ async function handleRequest( ? sendJson(response, 200, { run, events: taskRuns.events(runId, cursor) }) : sendJson(response, 404, { error: 'run not found' }); } - if (!isLocalOrigin(request, expectedOrigin)) { - return sendJson(response, 403, { error: 'non-local origin denied' }); + if (!isAuthorizedMutation(request, expectedOrigin, csrfToken)) { + return sendJson(response, 403, { error: 'mutation requires same-origin CSRF authorization' }); + } + if (request.method === 'POST' && url.pathname === '/api/plugins/add') { + if (!pluginRegistry) return sendJson(response, 501, { error: 'plugin registry unavailable' }); + const body = await readJson(request); + const source = typeof body.source === 'string' ? body.source.trim() : ''; + if (!source) return sendJson(response, 400, { error: 'plugin source is required' }); + const entry = await pluginRegistry.add(source); + const wasActive = agent.plugins + .inspect() + .plugins.some(({ id, state }) => id === entry.id && state === 'active'); + await activateWebPluginCandidate(agent, pluginRegistry, entry, wasActive); + return sendJson(response, 201, { + plugin: { id: entry.id, version: entry.version, enabled: entry.enabled }, + generation: agent.plugins.inspect().generation, + restartRequired: false, + }); + } + if (request.method === 'POST' && url.pathname === '/api/plugins/doctor') { + if (!pluginRegistry) return sendJson(response, 501, { error: 'plugin registry unavailable' }); + return sendJson(response, 200, { + results: await pluginRegistry.doctor(), + generation: agent.plugins.inspect().generation, + restartRequired: false, + }); } const pluginMatch = url.pathname.match(/^\/api\/plugins\/([^/]+)\/(enable|disable|remove)$/); if (request.method === 'POST' && pluginMatch) { if (!pluginRegistry) return sendJson(response, 501, { error: 'plugin registry unavailable' }); const pluginId = decodeURIComponent(pluginMatch[1]); const action = pluginMatch[2]; - if (action === 'enable') await pluginRegistry.enable(pluginId); - if (action === 'disable') await pluginRegistry.disable(pluginId); - if (action === 'remove') await pluginRegistry.remove(pluginId); - return sendJson(response, 200, { pluginId, action, restartRequired: true }); + if (action === 'enable') await enableWebPlugin(agent, pluginRegistry, pluginId); + if (action === 'disable') await disableWebPlugin(agent, pluginRegistry, pluginId); + if (action === 'remove') await removeWebPlugin(agent, pluginRegistry, pluginId); + webContributions.current = await snapshotActiveWebContributions(pluginRegistry, agent); + return sendJson(response, 200, { + pluginId, + action, + generation: agent.plugins.inspect().generation, + restartRequired: false, + }); + } + const pluginConfigMatch = url.pathname.match(/^\/api\/plugins\/([^/]+)\/config$/); + if (pluginConfigMatch && (request.method === 'GET' || request.method === 'PUT')) { + if (!pluginRegistry || !pluginConfigStore) { + return sendJson(response, 501, { error: 'plugin configuration unavailable' }); + } + const pluginId = decodeURIComponent(pluginConfigMatch[1]); + const entry = (await pluginRegistry.list()).find(({ id }) => id === pluginId); + if (!entry) return sendJson(response, 404, { error: 'plugin not found' }); + const schema = await installedPluginSchema(entry); + if (!schema) return sendJson(response, 404, { error: 'plugin has no config schema' }); + if (request.method === 'PUT') { + const body = await readJson(request); + const values = + body.values && typeof body.values === 'object' && !Array.isArray(body.values) + ? (body.values as Record) + : body; + await mutateWebPluginConfig(agent, pluginRegistry, pluginConfigStore, entry, schema, () => + pluginConfigStore.update(pluginId, schema, values) + ); + } + return sendJson(response, 200, { + schema, + config: await pluginConfigStore.getView(pluginId, schema), + generation: agent.plugins.inspect().generation, + restartRequired: false, + }); + } + const pluginSecretMatch = url.pathname.match( + /^\/api\/plugins\/([^/]+)\/config\/secrets\/([^/]+)$/ + ); + if (pluginSecretMatch && (request.method === 'PUT' || request.method === 'DELETE')) { + if (!pluginRegistry || !pluginConfigStore) { + return sendJson(response, 501, { error: 'plugin configuration unavailable' }); + } + const pluginId = decodeURIComponent(pluginSecretMatch[1]); + const name = decodeURIComponent(pluginSecretMatch[2]); + const entry = (await pluginRegistry.list()).find(({ id }) => id === pluginId); + if (!entry) { + return sendJson(response, 404, { error: 'plugin config not found' }); + } + const schema = await installedPluginSchema(entry); + if (!schema) return sendJson(response, 404, { error: 'plugin has no config schema' }); + if (request.method === 'PUT') { + const body = await readJson(request); + await mutateWebPluginConfig(agent, pluginRegistry, pluginConfigStore, entry, schema, () => + pluginConfigStore.putSecret(pluginId, schema, name, body.value) + ); + } else { + await mutateWebPluginConfig(agent, pluginRegistry, pluginConfigStore, entry, schema, () => + pluginConfigStore.deleteSecret(pluginId, schema, name) + ); + } + return sendJson(response, 200, { + config: await pluginConfigStore.getView(pluginId, schema), + generation: agent.plugins.inspect().generation, + restartRequired: false, + }); } if (request.method === 'POST' && url.pathname === '/api/sessions') { - const sessionId = `web-${randomUUID()}`; - await agent.config.sessionStore.replaceMessages(sessionId, []); - return sendJson(response, 201, { sessionId }); + const body = await readJson(request); + const workspaceId = typeof body.workspaceId === 'string' ? body.workspaceId : 'current'; + return sendJson(response, 201, await sessions.create(workspaceId)); + } + const sessionMutationMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)$/); + if (request.method === 'PATCH' && sessionMutationMatch) { + const sessionId = decodeURIComponent(sessionMutationMatch[1]); + const body = await readJson(request); + const title = typeof body.title === 'string' ? body.title : ''; + return sendJson(response, 200, { session: await sessions.rename(sessionId, title) }); + } + if (request.method === 'DELETE' && sessionMutationMatch) { + const sessionId = decodeURIComponent(sessionMutationMatch[1]); + if (active.has(sessionId)) { + return sendJson(response, 409, { error: 'cannot delete a session with an active turn' }); + } + const body = await readJson(request); + const confirmation = typeof body.confirmation === 'string' ? body.confirmation : ''; + await sessions.delete(sessionId, confirmation); + return sendJson(response, 200, { sessionId, deleted: true }); + } + const forkMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/fork$/); + if (request.method === 'POST' && forkMatch) { + const sessionId = decodeURIComponent(forkMatch[1]); + return sendJson(response, 201, { session: await sessions.fork(sessionId) }); + } + const rewindMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/rewind$/); + if (request.method === 'POST' && rewindMatch) { + const sessionId = decodeURIComponent(rewindMatch[1]); + const body = await readJson(request); + const messageCount = typeof body.messageCount === 'number' ? body.messageCount : Number.NaN; + return sendJson(response, 201, await sessions.rewind(sessionId, messageCount)); } if (request.method === 'POST' && messageMatch) { const sessionId = decodeURIComponent(messageMatch[1]); @@ -402,119 +707,68 @@ async function handleRequest( const body = await readJson(request); const prompt = typeof body.prompt === 'string' ? body.prompt.trim() : ''; if (!prompt) return sendJson(response, 400, { error: 'prompt is required' }); + const attachmentIds = Array.isArray(body.attachmentIds) + ? body.attachmentIds.filter((id): id is string => typeof id === 'string') + : []; + if ( + attachmentIds.length !== (Array.isArray(body.attachmentIds) ? body.attachmentIds.length : 0) + ) { + return sendJson(response, 400, { error: 'attachmentIds must contain only strings' }); + } + const promptAttachments = await attachments.resolveForPrompt(attachmentIds); + await sessions.titleFromPrompt(sessionId, prompt); const runId = `run-${randomUUID()}`; const run = taskRuns.create({ id: runId, sessionId, title: prompt.slice(0, 80) }); - return streamPrompt(agent, taskRuns, active, run.id, sessionId, prompt, response); + return streamPrompt( + agent, + taskRuns, + eventJournal, + active, + run.id, + sessionId, + prompt, + promptAttachments, + response + ); } const cancelMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/cancel$/); if (request.method === 'POST' && cancelMatch) { const sessionId = decodeURIComponent(cancelMatch[1]); const controller = active.get(sessionId); controller?.abort(); - active.delete(sessionId); const run = taskRuns.list().find((candidate) => candidate.sessionId === sessionId); - if (controller && run && (run.status === 'created' || run.status === 'running')) - taskRuns.append(run.id, { type: 'run.cancelled', data: { reason: 'user requested' } }); + if (controller && run && (run.status === 'created' || run.status === 'running')) { + taskRuns.append(run.id, { + type: 'run.cancelled', + data: { reason: 'user requested' }, + }); + } return sendJson(response, 200, { sessionId, cancelled: Boolean(controller) }); } sendJson(response, 404, { error: 'not found' }); } -async function streamPrompt( - agent: MossAgent, - taskRuns: TaskRunLedger, - active: Map, - runId: string, - sessionId: string, - prompt: string, - response: http.ServerResponse -): Promise { - const controller = new AbortController(); - active.set(sessionId, controller); +function streamPluginComposition( + request: http.IncomingMessage, + response: http.ServerResponse, + streams: Set, + agent: MossAgent +): void { response.writeHead(200, { - 'content-type': 'application/x-ndjson; charset=utf-8', + 'content-type': 'text/event-stream; charset=utf-8', 'cache-control': 'no-store', connection: 'keep-alive', + 'x-accel-buffering': 'no', 'x-content-type-options': 'nosniff', }); - const emit = (value: unknown) => response.write(`${JSON.stringify(value)}\n`); - let stopReason = 'end_turn'; - let streamError: string | undefined; - try { - const before = taskRuns.get(runId); - if (before?.status === 'created') { - const run = taskRuns.append(runId, { - type: 'run.started', - data: { promptLength: prompt.length }, - }); - emit({ type: 'run', run }); - } - for await (const event of agent.streamChat(sessionId, prompt, { - abortSignal: controller.signal, - })) { - if (event.type === 'text_delta') emit({ type: 'text', delta: event.delta }); - if (event.type === 'thinking_delta') emit({ type: 'thought', delta: event.delta }); - if (event.type === 'tool_start') { - taskRuns.append(runId, { - type: 'tool.started', - data: { toolCallId: event.toolCallId, name: event.toolName }, - }); - emit({ - type: 'tool', - state: 'start', - toolCallId: event.toolCallId, - name: event.toolName, - input: event.input, - }); - } - if (event.type === 'tool_end') { - taskRuns.append(runId, { - type: event.isError ? 'tool.failed' : 'tool.succeeded', - data: { - toolCallId: event.toolCallId, - name: event.toolName, - isError: event.isError, - }, - }); - emit({ - type: 'tool', - state: 'end', - toolCallId: event.toolCallId, - name: event.toolName, - result: event.result, - isError: event.isError, - }); - } - if (event.type === 'turn_end') stopReason = event.stopReason; - if (event.type === 'error') { - streamError = event.error; - stopReason = 'error'; - emit({ type: 'error', message: event.error }); - } - if (event.type === 'done') { - stopReason = event.result.stopReason ?? (streamError ? 'error' : stopReason); - } - } - const current = taskRuns.get(runId); - const terminalType = - !streamError && (stopReason === 'end_turn' || stopReason === 'stop_sequence') - ? 'run.completed' - : 'run.failed'; - const run = - current?.status === 'running' - ? taskRuns.append(runId, { - type: terminalType, - data: { stopReason, ...(streamError ? { message: streamError } : {}) }, - }) - : current; - emit({ type: 'done', stopReason, run }); - } catch (error) { - const current = taskRuns.get(runId); - if (current?.status === 'running') - taskRuns.append(runId, { type: 'run.failed', data: { message: errorMessage(error) } }); - emit({ type: 'error', message: errorMessage(error) }); - } finally { - if (active.get(sessionId) === controller) active.delete(sessionId); - response.end(); - } + response.write(`event: composition\ndata: ${JSON.stringify(agent.plugins.inspect())}\n\n`); + streams.add(response); + const keepAlive = setInterval(() => response.write(': keep-alive\n\n'), 15_000); + keepAlive.unref(); + const cleanup = () => { + clearInterval(keepAlive); + streams.delete(response); + }; + request.once('aborted', cleanup); + response.once('close', cleanup); } diff --git a/packages/moss-agent/src/web-ui/web-session-service.ts b/packages/moss-agent/src/web-ui/web-session-service.ts new file mode 100644 index 00000000..9c99242d --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-session-service.ts @@ -0,0 +1,274 @@ +import path from 'node:path'; +import { readFile } from 'node:fs/promises'; +import { randomUUID } from 'node:crypto'; + +import type { MossAgent } from '../core/agent/moss-agent.js'; +import type { TaskRunLedger } from '../core/task-run/task-run-ledger.js'; +import { renderSessionMarkdown, searchSessions } from '../cli/command-dispatcher.js'; +import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; +import { atomicWriteFile } from '../utils/atomic-write.js'; +import type { + MossWebSessionSearchHit, + MossWebSessionSummary, + MossWebWorkspaceSummary, +} from './web-contracts.js'; + +interface WebSessionMetadataFile { + readonly schemaVersion: 1; + readonly titles: Readonly>; +} + +interface MossWebSessionServiceOptions { + readonly metadataFile?: string; + readonly workspaceDir?: string; +} + +/** Host-owned Web session application service. @internal */ +export class MossWebSessionService { + private readonly titles = new Map(); + + private readonly ready: Promise; + + private mutationTail: Promise = Promise.resolve(); + + constructor( + private readonly agent: MossAgent, + private readonly taskRuns: TaskRunLedger, + private readonly options: MossWebSessionServiceOptions = {} + ) { + this.ready = this.loadMetadata(); + } + + async listWorkspaces(): Promise { + const workspaceDir = path.resolve( + this.options.workspaceDir ?? this.agent.config.workspaceDir ?? '.' + ); + return [ + { + id: 'current', + name: path.basename(workspaceDir) || workspaceDir, + current: true, + }, + ]; + } + + async listSessions(): Promise { + await this.ready; + const stored = await this.agent.config.sessionStore.listSessions(); + const runs = this.taskRuns.list(); + const bySession = new Map(); + for (const run of runs) { + if (!bySession.has(run.sessionId)) bySession.set(run.sessionId, run); + } + return stored + .map((session) => { + const run = bySession.get(session.sessionKey); + return { + sessionId: session.sessionKey, + title: + this.titles.get(session.sessionKey) ?? session.title ?? run?.title ?? 'Untitled task', + updatedAt: Math.max(session.updatedAt, run?.updatedAt ?? 0), + messageCount: session.messageCount, + ...(run ? { runId: run.id, runStatus: run.status } : {}), + }; + }) + .sort((left, right) => right.updatedAt - left.updatedAt); + } + + async search(query: string): Promise { + const needle = query.trim().toLowerCase(); + if (!needle) return []; + const [sessions, contentHits] = await Promise.all([ + this.listSessions(), + searchSessions(this.agent.config.sessionStore, query), + ]); + const bySession = new Map(); + for (const hit of contentHits) { + const summary = sessions.find(({ sessionId }) => sessionId === hit.key); + bySession.set(hit.key, { + sessionId: hit.key, + title: summary?.title ?? 'Untitled task', + updatedAt: hit.updatedAt, + messageCount: hit.messageCount, + snippet: hit.snippet, + }); + } + for (const session of sessions) { + if (!session.title.toLowerCase().includes(needle) || bySession.has(session.sessionId)) + continue; + bySession.set(session.sessionId, { ...session, snippet: session.title }); + } + return [...bySession.values()].sort((left, right) => right.updatedAt - left.updatedAt); + } + + async create(workspaceId = 'current'): Promise { + if (workspaceId !== 'current') this.invalid(`unknown workspace "${workspaceId}"`); + const sessionId = `web-${randomUUID()}`; + await this.agent.config.sessionStore.replaceMessages(sessionId, []); + try { + await this.mutateMetadata(() => this.titles.set(sessionId, 'New task')); + } catch (error) { + await this.agent.config.sessionStore.deleteSession(sessionId).catch(() => {}); + throw error; + } + return (await this.summary(sessionId))!; + } + + async rename(sessionId: string, title: string): Promise { + await this.assertExists(sessionId); + const normalized = title.replace(/\s+/g, ' ').trim(); + if (!normalized || normalized.length > 120) { + this.invalid('session title must contain 1 to 120 characters'); + } + await this.mutateMetadata(() => this.titles.set(sessionId, normalized)); + return (await this.summary(sessionId))!; + } + + async titleFromPrompt(sessionId: string, prompt: string): Promise { + await this.assertExists(sessionId); + const title = prompt.replace(/\s+/g, ' ').trim().slice(0, 80); + if (title) await this.mutateMetadata(() => this.titles.set(sessionId, title)); + } + + async exportMarkdown(sessionId: string): Promise { + await this.assertExists(sessionId); + const messages = await this.agent.config.sessionStore.loadMessages(sessionId); + return renderSessionMarkdown(sessionId, messages); + } + + async delete(sessionId: string, confirmation: string): Promise { + await this.assertExists(sessionId); + if (confirmation !== sessionId) { + this.invalid(`delete confirmation must exactly match session id "${sessionId}"`); + } + await this.ready; + const previousTitle = this.titles.get(sessionId); + await this.mutateMetadata(() => this.titles.delete(sessionId)); + try { + await this.agent.config.sessionStore.deleteSession(sessionId); + } catch (error) { + if (previousTitle) { + await this.mutateMetadata(() => this.titles.set(sessionId, previousTitle)).catch(() => {}); + } + throw wrapAsMoss(error, ErrorCode.SESSION_PERSIST_FAILED, { + message: `Failed to delete session "${sessionId}"`, + }); + } + } + + async fork(sessionId: string): Promise { + await this.assertExists(sessionId); + const messages = await this.agent.config.sessionStore.loadMessages(sessionId); + const forkId = `web-fork-${randomUUID()}`; + await this.agent.config.sessionStore.replaceMessages(forkId, messages); + const source = await this.summary(sessionId); + try { + await this.mutateMetadata(() => + this.titles.set(forkId, `${source?.title ?? 'Untitled task'} (fork)`.slice(0, 120)) + ); + } catch (error) { + await this.agent.config.sessionStore.deleteSession(forkId).catch(() => {}); + throw error; + } + return (await this.summary(forkId))!; + } + + async rewind( + sessionId: string, + messageCount: number + ): Promise<{ + readonly session: MossWebSessionSummary; + readonly sourceSessionId: string; + readonly truncated: number; + }> { + await this.assertExists(sessionId); + if (!Number.isSafeInteger(messageCount) || messageCount < 0) { + this.invalid('messageCount must be a non-negative integer'); + } + const messages = await this.agent.config.sessionStore.loadMessages(sessionId); + if (messageCount > messages.length) { + this.invalid(`messageCount cannot exceed the session length (${messages.length})`); + } + const rewindId = `web-rewind-${randomUUID()}`; + await this.agent.config.sessionStore.replaceMessages(rewindId, messages); + let result: { truncated: number }; + try { + result = await this.agent.rewindConversation(rewindId, messageCount); + const source = await this.summary(sessionId); + await this.mutateMetadata(() => + this.titles.set(rewindId, `${source?.title ?? 'Untitled task'} (rewind)`.slice(0, 120)) + ); + } catch (error) { + await this.agent.config.sessionStore.deleteSession(rewindId).catch(() => {}); + throw error; + } + return { + session: (await this.summary(rewindId))!, + sourceSessionId: sessionId, + truncated: result.truncated, + }; + } + + private async summary(sessionId: string): Promise { + return (await this.listSessions()).find((session) => session.sessionId === sessionId); + } + + private async assertExists(sessionId: string): Promise { + if (!(await this.agent.config.sessionStore.exists(sessionId))) { + this.invalid(`session "${sessionId}" was not found`); + } + } + + private async loadMetadata(): Promise { + if (!this.options.metadataFile) return; + try { + const parsed = JSON.parse(await readFile(this.options.metadataFile, 'utf8')) as unknown; + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return; + const candidate = parsed as Partial; + if ( + candidate.schemaVersion !== 1 || + !candidate.titles || + typeof candidate.titles !== 'object' + ) { + return; + } + for (const [sessionId, title] of Object.entries(candidate.titles)) { + if (typeof title === 'string' && title.trim()) this.titles.set(sessionId, title); + } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: 'Failed to load Web session metadata', + }); + } + } + } + + private async mutateMetadata(mutation: () => void): Promise { + await this.ready; + const operation = this.mutationTail.then(async () => { + const previous = new Map(this.titles); + try { + mutation(); + if (!this.options.metadataFile) return; + const body: WebSessionMetadataFile = { + schemaVersion: 1, + titles: Object.fromEntries(this.titles), + }; + await atomicWriteFile(this.options.metadataFile, `${JSON.stringify(body, null, 2)}\n`); + } catch (error) { + this.titles.clear(); + for (const [sessionId, title] of previous) this.titles.set(sessionId, title); + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: 'Failed to persist Web session metadata', + }); + } + }); + this.mutationTail = operation.catch(() => {}); + await operation; + } + + private invalid(message: string): never { + throw new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); + } +} diff --git a/packages/moss-agent/src/web-ui/web-settings-service.ts b/packages/moss-agent/src/web-ui/web-settings-service.ts new file mode 100644 index 00000000..c847130f --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-settings-service.ts @@ -0,0 +1,349 @@ +import type { MossAgent } from '../core/agent/moss-agent.js'; +import type { InstalledPluginRegistry } from '../plugins/installed-plugin-registry.js'; +import type { CliServices } from '../cli/cli-services.js'; +import type { ConfigFile } from '../cli/config.js'; +import { ErrorCode, MossError, wrapAsMoss } from '../errors.js'; + +export type MossWebSettingsSection = + | 'general' + | 'models' + | 'permissions' + | 'skills' + | 'mcp' + | 'plugins' + | 'runtime'; + +export interface MossWebSettingsServiceOptions { + readonly configPath?: string; + readonly pluginRegistry?: InstalledPluginRegistry; +} + +interface ValidationResult { + readonly valid: boolean; + readonly dirty: boolean; + readonly errors: Readonly>; +} + +const EDITABLE_SECTIONS = new Set([ + 'general', + 'models', + 'permissions', + 'skills', + 'mcp', +]); + +/** Settings application service that reuses CLI config validation and persistence. @internal */ +export class MossWebSettingsService { + private readonly configPath: string; + + constructor( + private readonly agent: MossAgent, + private readonly services: Pick, + private readonly options: MossWebSettingsServiceOptions = {} + ) { + this.configPath = options.configPath ?? services.config.resolveConfigPath(); + } + + async snapshot() { + const sections = await Promise.all( + (['general', 'models', 'permissions', 'skills', 'mcp', 'plugins', 'runtime'] as const).map( + async (section) => [section, await this.section(section)] as const + ) + ); + return { sections: Object.fromEntries(sections) }; + } + + async section(section: MossWebSettingsSection) { + this.assertSection(section); + const config = this.load(); + if (section === 'general') { + return this.view(section, { + profile: config.profile, + workspace: config.workspace, + promptCache: config.promptCache, + agent: config.agent, + }); + } + if (section === 'models') { + return { + ...this.view(section, { + provider: config.provider, + model: config.model, + baseUrl: config.baseUrl, + }), + credentials: { apiKey: { configured: Boolean(config.apiKey) } }, + }; + } + if (section === 'permissions') { + return this.view(section, { + safetyMode: config.safetyMode, + approvalPolicy: config.approvalPolicy, + trustedTools: config.trustedTools ?? [], + deniedTools: config.deniedTools ?? [], + guardrails: config.guardrails, + }); + } + if (section === 'skills') { + return { + ...this.view(section, { ...(config.skills ?? {}) }), + inventory: + this.agent.config.skillRegistry?.list().map((skill) => ({ + id: skill.stableId ?? skill.name, + name: skill.name, + description: skill.description, + enabled: skill.enabled !== false, + })) ?? [], + diagnostics: this.agent.config.skillRegistry?.diagnostics() ?? [], + }; + } + if (section === 'mcp') { + return this.view(section, { ...(config.mcp ?? {}) }); + } + if (section === 'plugins') { + return { + ...this.view(section, {}), + installed: (await this.options.pluginRegistry?.list()) ?? [], + active: this.agent.plugins.inspect(), + }; + } + return { + ...this.view(section, {}), + inventory: { + model: this.agent.config.model, + workspace: this.agent.config.workspaceDir, + tools: this.agent.tools.getNames(), + asyncTasks: this.agent.asyncTasks.list(), + plugins: this.agent.plugins.inspect(), + }, + }; + } + + validate(section: MossWebSettingsSection, values: unknown): ValidationResult { + this.assertEditable(section); + const errors: Record = {}; + if (!values || typeof values !== 'object' || Array.isArray(values)) { + return { valid: false, dirty: false, errors: { values: 'expected an object' } }; + } + const draft = values as Record; + if (section === 'general') { + if ( + draft.profile !== undefined && + draft.profile !== null && + this.services.config.normalizeConfigProfile(String(draft.profile)) === null + ) { + errors.profile = 'profile must be cautious, balanced, or autonomous'; + } + if ( + draft.workspace !== undefined && + draft.workspace !== null && + typeof draft.workspace !== 'string' + ) { + errors.workspace = 'workspace must be a path string'; + } + } + if (section === 'models') { + for (const field of ['provider', 'model', 'baseUrl'] as const) { + if ( + draft[field] !== undefined && + draft[field] !== null && + typeof draft[field] !== 'string' + ) { + errors[field] = `${field} must be a string`; + } + } + if (typeof draft.baseUrl === 'string') { + try { + const protocol = new URL(draft.baseUrl).protocol; + if (protocol !== 'http:' && protocol !== 'https:') + errors.baseUrl = 'baseUrl must use http or https'; + } catch { + errors.baseUrl = 'baseUrl must be a valid URL'; + } + } + if ('apiKey' in draft) errors.apiKey = 'credentials use the write-only credential endpoint'; + } + if (section === 'permissions') { + if ( + draft.safetyMode !== undefined && + draft.safetyMode !== null && + this.services.config.normalizeSafetyModeConfig(String(draft.safetyMode)) === null + ) { + errors.safetyMode = 'safetyMode must be read-only, workspace-write, or full-access'; + } + if ( + draft.approvalPolicy !== undefined && + draft.approvalPolicy !== null && + this.services.config.normalizeApprovalPolicyConfig(String(draft.approvalPolicy)) === null + ) { + errors.approvalPolicy = 'approvalPolicy must be prompt or never'; + } + for (const field of ['trustedTools', 'deniedTools'] as const) { + if ( + draft[field] !== undefined && + draft[field] !== null && + (!Array.isArray(draft[field]) || draft[field].some((item) => typeof item !== 'string')) + ) { + errors[field] = `${field} must be an array of strings`; + } + } + } + if (section === 'skills') { + if ( + draft.extraRoots !== undefined && + draft.extraRoots !== null && + (!Array.isArray(draft.extraRoots) || + draft.extraRoots.some((item) => typeof item !== 'string')) + ) { + errors.extraRoots = 'extraRoots must be an array of path strings'; + } + } + if (section === 'mcp') { + if ( + draft.enabled !== undefined && + draft.enabled !== null && + typeof draft.enabled !== 'boolean' + ) { + errors.enabled = 'enabled must be a boolean'; + } + if ( + draft.configPath !== undefined && + draft.configPath !== null && + typeof draft.configPath !== 'string' + ) { + errors.configPath = 'configPath must be a path string'; + } + } + const current = this.sectionValues(section, this.load()); + return { + valid: Object.keys(errors).length === 0, + dirty: JSON.stringify(current) !== JSON.stringify({ ...current, ...draft }), + errors, + }; + } + + save(section: MossWebSettingsSection, values: unknown): ValidationResult { + const validation = this.validate(section, values); + if (!validation.valid) return validation; + const draft = values as Record; + const current = this.load(); + const next = this.applySection(section, current, draft); + this.persist(next); + return { valid: true, dirty: false, errors: {} }; + } + + async modelCatalog() { + const config = this.services.config.resolveCliConfig({}, this.load(), { + configPath: this.configPath, + }); + return this.services.models.loadModelChoicesForRuntime(config, config.model ?? ''); + } + + async selectModel(input: string) { + const catalog = await this.modelCatalog(); + const selected = this.services.models.resolveModelSelection(input, catalog.choices); + if (!selected) this.invalid(`unknown model "${input}"`); + const model = + (selected as { model?: string; id?: string }).model ?? (selected as { id?: string }).id; + if (!model) this.invalid('selected model has no model id'); + const config = this.load(); + this.persist({ ...config, model }); + return { model, provider: selected.provider, restartRequired: true }; + } + + writeCredential(name: 'apiKey', value: string): void { + if (name !== 'apiKey') this.invalid(`unknown credential "${name}"`); + const normalized = value.trim(); + if (!normalized || normalized.length > 16_384) { + this.invalid('credential must contain 1 to 16384 characters'); + } + this.persist({ ...this.load(), apiKey: normalized }); + } + + deleteCredential(name: 'apiKey'): void { + if (name !== 'apiKey') this.invalid(`unknown credential "${name}"`); + const { apiKey: _, _apiKeyEncrypted: __, ...rest } = this.load(); + this.persist(rest); + } + + private view(section: MossWebSettingsSection, values: Readonly>) { + return { + section, + values, + valid: true, + dirty: false, + errors: {}, + editable: EDITABLE_SECTIONS.has(section), + }; + } + + private sectionValues( + section: MossWebSettingsSection, + config: ConfigFile + ): Record { + if (section === 'general') + return { + profile: config.profile, + workspace: config.workspace, + promptCache: config.promptCache, + agent: config.agent, + }; + if (section === 'models') + return { provider: config.provider, model: config.model, baseUrl: config.baseUrl }; + if (section === 'permissions') + return { + safetyMode: config.safetyMode, + approvalPolicy: config.approvalPolicy, + trustedTools: config.trustedTools ?? [], + deniedTools: config.deniedTools ?? [], + guardrails: config.guardrails, + }; + if (section === 'skills') return { ...(config.skills ?? {}) }; + if (section === 'mcp') return { ...(config.mcp ?? {}) }; + return {}; + } + + private applySection( + section: MossWebSettingsSection, + config: ConfigFile, + draft: Record + ): ConfigFile { + const values = { ...this.sectionValues(section, config), ...draft }; + for (const [key, value] of Object.entries(values)) if (value === null) delete values[key]; + if (section === 'general') return { ...config, ...values } as ConfigFile; + if (section === 'models') return { ...config, ...values } as ConfigFile; + if (section === 'permissions') return { ...config, ...values } as ConfigFile; + if (section === 'skills') return { ...config, skills: values as ConfigFile['skills'] }; + return { ...config, mcp: values as ConfigFile['mcp'] }; + } + + private load(): ConfigFile { + return this.services.config.loadConfigFile(this.configPath); + } + + private persist(config: ConfigFile): void { + try { + this.services.config.saveConfigFileAtPath(config, this.configPath); + } catch (error) { + throw wrapAsMoss(error, ErrorCode.CONFIG_IO_FAILED, { + message: 'Failed to persist Web settings', + }); + } + } + + private assertSection(section: string): asserts section is MossWebSettingsSection { + if ( + !['general', 'models', 'permissions', 'skills', 'mcp', 'plugins', 'runtime'].includes(section) + ) { + this.invalid(`unknown settings section "${section}"`); + } + } + + private assertEditable(section: MossWebSettingsSection): void { + this.assertSection(section); + if (!EDITABLE_SECTIONS.has(section)) this.invalid(`settings section "${section}" is read-only`); + } + + private invalid(message: string): never { + throw new MossError({ code: ErrorCode.USER_INPUT_INVALID, message }); + } +} diff --git a/packages/moss-agent/src/web-ui/web-static-assets.ts b/packages/moss-agent/src/web-ui/web-static-assets.ts new file mode 100644 index 00000000..061a3c9d --- /dev/null +++ b/packages/moss-agent/src/web-ui/web-static-assets.ts @@ -0,0 +1,31 @@ +import { LEGACY_WEB_CSS, LEGACY_WEB_HTML, LEGACY_WEB_JS } from './legacy-web-assets.js'; +import { WEB_HTML } from './web-assets.js'; + +export type MossWebClientAssetName = + | 'moss-web-components.css' + | 'moss-web-components.js' + | 'workbench.css' + | 'workbench.js'; + +export type MossWebStaticAsset = + | { readonly type: string; readonly body: string } + | { readonly client: MossWebClientAssetName }; + +/** Resolve built-in current and one-release rollback assets without widening the HTTP router. @internal */ +export function resolveMossWebStaticAsset(url: URL): MossWebStaticAsset | undefined { + if (url.pathname === '/') { + return { + type: 'text/html', + body: url.searchParams.has('legacy') ? LEGACY_WEB_HTML : WEB_HTML, + }; + } + const inline: Record = { + '/assets/legacy-workbench.css': { type: 'text/css', body: LEGACY_WEB_CSS }, + '/assets/legacy-workbench.js': { type: 'text/javascript', body: LEGACY_WEB_JS }, + }; + if (inline[url.pathname]) return inline[url.pathname]; + const client = url.pathname.match( + /^\/assets\/(moss-web-components\.(?:css|js)|workbench\.(?:css|js))$/ + )?.[1] as MossWebClientAssetName | undefined; + return client ? { client } : undefined; +} diff --git a/packages/moss-agent/test/dsh-bundle-compatibility.spec.mjs b/packages/moss-agent/test/dsh-bundle-compatibility.spec.mjs new file mode 100644 index 00000000..0fb53162 --- /dev/null +++ b/packages/moss-agent/test/dsh-bundle-compatibility.spec.mjs @@ -0,0 +1,129 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { mkdir, mkdtemp, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { createMossPluginHost } from '../dist/core/plugins/plugin-host.js'; +import { + importDshPackage, + inspectDshPackageCompatibility, +} from '../dist/plugins/dsh-bundle-compatibility.js'; + +async function packageFixture(root, packageJson, patch) { + await mkdir(root, { recursive: true }); + await writeFile(path.join(root, 'package.json'), JSON.stringify(packageJson)); + await writeFile(path.join(root, 'cordis.patch.yml'), patch); +} + +test('a real DSH package shape imports only SKILL.md and explicit Moss adapter data', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss dsh package 配置 ')); + await packageFixture( + root, + { + name: '@fixture/dsh-protocol', + version: '1.0.0', + dependencies: { '@deepseek-ai/cordis': '1.0.0' }, + }, + 'services:\n protocol:\n enabled: true\n' + ); + await writeFile( + path.join(root, 'SKILL.md'), + '---\nname: dsh-protocol\n---\nCheck the protocol contract and cite evidence.\n' + ); + await writeFile( + path.join(root, 'moss.dsh-adapter.json'), + JSON.stringify({ + commands: [{ id: 'dsh-review', title: 'Review DSH', prompt: 'Review:\n\n{{args}}' }], + mcp: [ + { + id: 'dsh-tools', + name: 'DSH tools', + command: 'npx', + args: ['-y', '@fixture/dsh-tools@1.0.0'], + env: { MODE: 'readonly' }, + }, + ], + configSchema: { + type: 'object', + properties: { apiKey: { type: 'string', writeOnly: true } }, + }, + }) + ); + + const report = await inspectDshPackageCompatibility(root); + assert.equal(report.compatible, true); + assert.deepEqual(report.imported, [ + 'skill:fixture-dsh-protocol', + 'command:dsh-review', + 'mcp:dsh-tools', + 'config:schema', + ]); + assert.deepEqual(report.skipped, ['cordis.patch.yml runtime']); + + const imported = await importDshPackage(root); + assert.equal(imported.configSchema?.properties.apiKey.writeOnly, true); + const skills = new Map(); + const host = createMossPluginHost({ + hasTool: () => false, + registerTool: () => () => {}, + hasSkill: (id) => skills.has(id), + registerSkill: (skill) => { + skills.set(skill.stableId ?? skill.name, skill); + return () => skills.delete(skill.stableId ?? skill.name); + }, + hasExpert: () => false, + registerExpert: () => () => {}, + }); + try { + await host.install(imported.plugin); + assert.match(skills.get('fixture-dsh-protocol')?.body ?? '', /protocol contract/); + assert.equal(await host.expandCommand('dsh-review', 'provider'), 'Review:\n\nprovider'); + assert.deepEqual(host.getMcpPreset('dsh-tools')?.server.env, { MODE: 'readonly' }); + } finally { + await host.close(); + } +}); + +test('a real DSH Cordis client package is rejected instead of half-loaded', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-dsh-ui-')); + await packageFixture( + root, + { + name: '@fixture/dsh-client-ui', + version: '1.0.0', + dependencies: { '@deepseek-ai/dsh-client': '1.0.0' }, + dsh: { client: './client.js' }, + }, + 'inject:\n - dsh.client.slot.conversation\n' + ); + await writeFile(path.join(root, 'SKILL.md'), 'This must not be half-loaded.\n'); + + const report = await inspectDshPackageCompatibility(root); + assert.equal(report.compatible, false); + assert.deepEqual(report.imported, []); + assert.match(report.reasons.join(' '), /unsupported Cordis client UI slots/); + await assert.rejects(importDshPackage(root), /unsupported Cordis client UI slots/); +}); + +test('DSH adapter MCP env values are validated one by one', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-dsh-env-')); + await packageFixture(root, { name: 'dsh-invalid-env', version: '1.0.0' }, 'services: {}\n'); + await writeFile( + path.join(root, 'moss.dsh-adapter.json'), + JSON.stringify({ mcp: [{ id: 'bad', name: 'Bad', command: 'node', env: { PORT: 1234 } }] }) + ); + const report = await inspectDshPackageCompatibility(root); + assert.equal(report.compatible, false); + assert.match(report.reasons.join(' '), /env\.PORT must be a string/); +}); + +test('DSH package identity requires a Moss-safe id and exact semantic version', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-dsh-identity-')); + await packageFixture(root, { name: '---', version: 'workspace:*' }, 'services: {}\n'); + await writeFile(path.join(root, 'SKILL.md'), 'Identity must fail before import.\n'); + const report = await inspectDshPackageCompatibility(root); + assert.equal(report.compatible, false); + assert.match(report.reasons.join(' '), /invalid plugin id|exact semantic version/); +}); diff --git a/packages/moss-agent/test/installed-plugin-registry.spec.mjs b/packages/moss-agent/test/installed-plugin-registry.spec.mjs index d02cff47..5aea4b25 100644 --- a/packages/moss-agent/test/installed-plugin-registry.spec.mjs +++ b/packages/moss-agent/test/installed-plugin-registry.spec.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env node import assert from 'node:assert/strict'; import { spawn } from 'node:child_process'; -import { access, mkdtemp, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises'; +import { mkdtemp, mkdir, readFile, symlink, writeFile } from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; @@ -48,6 +48,7 @@ const loaded = await registry.loadEnabled(); assert.equal(loaded.plugins.length, 1); assert.equal(loaded.plugins[0]?.id, 'sample/plugin'); assert.deepEqual(loaded.failures, []); +await loaded.plugins[0]?.disposeCandidate?.(); const report = await registry.doctor(); assert.equal(report[0]?.status, 'ok'); @@ -112,10 +113,11 @@ await writeFile( ); await registry.add(throwingPluginDir); const throwingReport = await registry.doctor(); -assert.equal(throwingReport[0]?.status, 'error'); -assert.match(throwingReport[0]?.message ?? '', /SETUP_FAILED/); -await assert.rejects(() => registry.enable('sample/throwing'), /SETUP_FAILED/); -assert.equal((await registry.list())[0]?.enabled, false); +assert.equal(throwingReport[0]?.status, 'disabled'); +await registry.enable('sample/throwing'); +const throwingLoad = await registry.loadEnabled(); +assert.deepEqual(throwingLoad.plugins, []); +assert.match(throwingLoad.failures[0]?.message ?? '', /SETUP_FAILED/); const concurrentConfigDir = path.join(root, 'concurrent-config'); const concurrentPluginDirs = []; @@ -165,95 +167,6 @@ assert.deepEqual( ['concurrent/one', 'concurrent/two'] ); -const heartbeatConfigDir = path.join(root, 'heartbeat-config'); -const slowPluginDir = path.join(root, 'slow-plugin'); -const quickPluginDir = path.join(root, 'quick-plugin'); -const setupMarker = path.join(root, 'slow-setup-started'); -for (const directory of [slowPluginDir, quickPluginDir]) { - await mkdir(directory, { recursive: true }); -} -await writeFile( - path.join(slowPluginDir, 'moss.plugin.json'), - JSON.stringify({ - schemaVersion: 1, - id: 'concurrent/slow', - version: '1.0.0', - runtime: { module: './plugin.mjs' }, - }) -); -await writeFile( - path.join(slowPluginDir, 'plugin.mjs'), - `import { writeFileSync } from 'node:fs'; -export default { - id: 'concurrent/slow', - async setup() { - writeFileSync(${JSON.stringify(setupMarker)}, 'started'); - await new Promise((resolve) => setTimeout(resolve, 6200)); - } -}; -` -); -await writeFile( - path.join(quickPluginDir, 'moss.plugin.json'), - JSON.stringify({ - schemaVersion: 1, - id: 'concurrent/quick', - version: '1.0.0', - runtime: { module: './plugin.mjs' }, - }) -); -await writeFile( - path.join(quickPluginDir, 'plugin.mjs'), - "export default { id: 'concurrent/quick', setup() {} };\n" -); -const heartbeatRegistry = new InstalledPluginRegistry({ configDir: heartbeatConfigDir }); -await heartbeatRegistry.add(slowPluginDir); -const enabling = heartbeatRegistry.enable('concurrent/slow'); -for (let attempts = 0; ; attempts += 1) { - try { - await access(setupMarker); - break; - } catch (error) { - if (attempts >= 100) throw error; - await new Promise((resolve) => setTimeout(resolve, 20)); - } -} -const addingWhileLeaseRenews = new InstalledPluginRegistry({ - configDir: heartbeatConfigDir, -}).add(quickPluginDir); -await Promise.all([enabling, addingWhileLeaseRenews]); -assert.deepEqual( - (await heartbeatRegistry.list()).map(({ id, enabled }) => [id, enabled]), - [ - ['concurrent/quick', false], - ['concurrent/slow', true], - ] -); - -const compromisedConfigDir = path.join(root, 'compromised-config'); -const compromisedRegistry = new InstalledPluginRegistry({ configDir: compromisedConfigDir }); -await compromisedRegistry.add(slowPluginDir); -await rm(setupMarker, { force: true }); -const compromisedEnable = compromisedRegistry.enable('concurrent/slow'); -for (let attempts = 0; ; attempts += 1) { - try { - await access(setupMarker); - break; - } catch (error) { - if (attempts >= 100) throw error; - await new Promise((resolve) => setTimeout(resolve, 20)); - } -} -await rm(path.join(compromisedConfigDir, 'plugins.lock'), { - recursive: true, - force: true, -}); -await assert.rejects(compromisedEnable, /lock was compromised/); -assert.deepEqual( - (await compromisedRegistry.list()).map(({ id, enabled }) => [id, enabled]), - [['concurrent/slow', false]] -); - const hangingPluginDir = path.join(root, 'hanging-plugin'); await mkdir(hangingPluginDir, { recursive: true }); await writeFile( @@ -279,11 +192,10 @@ await writeFile( const hangingConfigDir = path.join(root, 'hanging-config'); const hangingRegistry = new InstalledPluginRegistry({ configDir: hangingConfigDir }); await hangingRegistry.add(hangingPluginDir); -await assert.rejects( - hangingRegistry.enable('sample/hanging'), - /setup validation timed out after 15 seconds/ -); -assert.equal((await hangingRegistry.list())[0]?.enabled, false); +await hangingRegistry.enable('sample/hanging'); +const hangingLoad = await hangingRegistry.loadEnabled(); +assert.match(hangingLoad.failures[0]?.message ?? '', /timed out after 15 seconds/); +assert.equal((await hangingRegistry.list())[0]?.enabled, true); const escapedPluginDir = path.join(root, 'escaped-plugin'); const outsideRuntimeDir = path.join(root, 'outside-runtime'); @@ -328,6 +240,43 @@ for (const version of ['01.2.3', '1.2.3-.']) { await assert.rejects(() => readMossPluginManifest(invalidVersionDir), /semantic version/); } +const mutablePluginDir = path.join(root, 'mutable-plugin'); +const mutableConfigDir = path.join(root, 'mutable-config'); +await mkdir(mutablePluginDir, { recursive: true }); +await writeFile( + path.join(mutablePluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'mutable/original', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await writeFile( + path.join(mutablePluginDir, 'plugin.mjs'), + "export default { id: 'mutable/original', setup() {} };\n" +); +const mutableRegistry = new InstalledPluginRegistry({ configDir: mutableConfigDir }); +await mutableRegistry.add(mutablePluginDir); +await writeFile( + path.join(mutablePluginDir, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'mutable/replaced', + version: '2.0.0', + runtime: { module: './plugin.mjs' }, + }) +); +await assert.rejects( + mutableRegistry.enable('mutable/original'), + /installed plugin identity changed/ +); +await assert.rejects( + mutableRegistry.loadInstalled('mutable/original'), + /installed plugin identity changed/ +); +assert.equal((await mutableRegistry.list())[0]?.enabled, false); + const corruptConfigDir = path.join(root, 'corrupt-config'); await mkdir(path.join(corruptConfigDir, 'plugins'), { recursive: true }); await writeFile( diff --git a/packages/moss-agent/test/official-deepseek-plugin.spec.mjs b/packages/moss-agent/test/official-deepseek-plugin.spec.mjs index daf25002..4b8b8e6c 100644 --- a/packages/moss-agent/test/official-deepseek-plugin.spec.mjs +++ b/packages/moss-agent/test/official-deepseek-plugin.spec.mjs @@ -34,7 +34,18 @@ const skill = skills.list().find(({ stableId }) => stableId === 'deepseek-harnes assert.ok(skill); assert.match(skill.body ?? '', /reasoning_content/); assert.match(skill.body ?? '', /parallel tool-call deltas/); +assert.match( + await host.getCommand('deepseek-protocol')?.expand('Review this provider'), + /Review this provider/ +); +assert.deepEqual(host.getMcpPreset('deepseek-harness')?.server, { + command: 'npx', + args: ['-y', '@deepseek-harness/mcp@0.2.0'], + requestTimeoutMs: 30_000, +}); await host.close(); assert.equal(skills.hasStableId('deepseek-harness'), false); +assert.equal(host.getCommand('deepseek-protocol'), undefined); +assert.equal(host.getMcpPreset('deepseek-harness'), undefined); -console.log(' [PASS] official DeepSeek Harness plugin installs disabled and owns its skill'); +console.log(' [PASS] official DeepSeek Harness plugin owns its skill, command, and MCP preset'); diff --git a/packages/moss-agent/test/plugin-composition-generation.spec.mjs b/packages/moss-agent/test/plugin-composition-generation.spec.mjs new file mode 100644 index 00000000..c6c7cb2b --- /dev/null +++ b/packages/moss-agent/test/plugin-composition-generation.spec.mjs @@ -0,0 +1,297 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { InMemorySessionStore } from '../dist/core/session/session.js'; + +function makeAgent(id) { + return new MossAgent({ + llmProvider: { + id, + displayName: id, + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }, + sessionStore: new InMemorySessionStore(), + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); +} + +function contributionPlugin(id = 'fixture/composition') { + return { + id, + setup(context) { + context.registerCommand({ + id: 'fixture-command', + title: 'Fixture command', + expand: (args) => `Fixture: ${args}`, + }); + context.registerProvider({ + id: 'fixture-provider', + displayName: 'Fixture provider', + async create() { + return { + id: 'fixture-provider-runtime', + displayName: 'Fixture provider runtime', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }; + }, + }); + context.registerMcpPreset({ + id: 'fixture-mcp', + displayName: 'Fixture MCP', + server: { command: 'node', args: ['fixture-server.mjs'] }, + }); + }, + }; +} + +test('command, provider, and MCP contributions are owned, redacted, and instance-local', async () => { + const first = makeAgent('first-instance'); + const second = makeAgent('second-instance'); + try { + const before = first.plugins.inspect().generation; + const handle = await first.plugins.install(contributionPlugin()); + const snapshot = first.plugins.inspect(); + const plugin = snapshot.plugins.find(({ id }) => id === 'fixture/composition'); + + assert.equal(snapshot.generation, before + 1); + assert.deepEqual(plugin?.commands, ['fixture-command']); + assert.deepEqual(plugin?.providers, ['fixture-provider']); + assert.deepEqual(plugin?.mcpPresets, ['fixture-mcp']); + assert.doesNotMatch(JSON.stringify(snapshot), /Fixture command|fixture-server/); + assert.deepEqual( + first.plugins.listCommands().map(({ id }) => id), + ['fixture-command'] + ); + assert.equal(await first.plugins.expandCommand('fixture-command', 'ok'), 'Fixture: ok'); + assert.equal(first.plugins.getProvider('fixture-provider')?.displayName, 'Fixture provider'); + const runtimeProvider = await first.plugins.createProvider('fixture-provider', {}); + assert.equal(runtimeProvider?.id, 'fixture-provider-runtime'); + assert.deepEqual( + await runtimeProvider?.complete({ model: 'fixture', systemPrompt: '', messages: [] }), + { + stopReason: 'end_turn', + content: [], + } + ); + assert.equal(first.plugins.getMcpPreset('fixture-mcp')?.server.command, 'node'); + assert.deepEqual( + first.plugins.listMcpPresets().map(({ id }) => id), + ['fixture-mcp'] + ); + let mcpDisposed = false; + assert.equal( + await first.plugins.activateMcpPreset('fixture-mcp', async () => ({ + value: 'MCP_ACTIVE', + dispose: () => { + mcpDisposed = true; + }, + })), + 'MCP_ACTIVE' + ); + assert.equal(second.plugins.getCommand('fixture-command'), undefined); + + await second.plugins.install(contributionPlugin()); + await assert.rejects( + first.plugins.install(contributionPlugin('fixture/conflict')), + (error) => + error instanceof Error && + error.cause instanceof Error && + /plugin command already registered: fixture-command/.test(error.cause.message) + ); + assert.equal(first.plugins.inspect().generation, snapshot.generation); + assert.equal(first.plugins.getCommand('fixture-command')?.expand('still'), 'Fixture: still'); + + await assert.rejects( + first.plugins.install({ + id: 'fixture/rollback', + setup(context) { + context.registerCommand({ + id: 'rollback-command', + title: 'Rollback command', + expand: () => 'must disappear', + }); + context.registerProvider({ + id: 'rollback-provider', + displayName: 'Rollback provider', + create: async () => { + throw new Error('must not be created'); + }, + }); + context.registerMcpPreset({ + id: 'rollback-mcp', + displayName: 'Rollback MCP', + server: { command: 'node' }, + }); + context.effect(async () => { + throw new Error('ROLLBACK_SENTINEL'); + }); + }, + }), + /failed to install plugin fixture\/rollback/ + ); + assert.equal(first.plugins.inspect().generation, snapshot.generation); + assert.equal(first.plugins.getCommand('rollback-command'), undefined); + assert.equal(first.plugins.getProvider('rollback-provider'), undefined); + assert.equal(first.plugins.getMcpPreset('rollback-mcp'), undefined); + + await handle.dispose(); + assert.equal(mcpDisposed, true); + assert.equal(first.plugins.inspect().generation, snapshot.generation + 1); + assert.equal(first.plugins.getCommand('fixture-command'), undefined); + assert.equal(first.plugins.getProvider('fixture-provider'), undefined); + assert.equal(first.plugins.getMcpPreset('fixture-mcp'), undefined); + assert.equal(second.plugins.getCommand('fixture-command')?.expand('ok'), 'Fixture: ok'); + } finally { + await Promise.allSettled([first.close(), second.close()]); + } +}); + +test('active plugin tool leases drain before unload and timeout restores the last-good generation', async () => { + const agent = makeAgent('lease-instance'); + let release; + let shouldBlock = true; + const gate = new Promise((resolve) => { + release = resolve; + }); + try { + await agent.plugins.install({ + id: 'fixture/leased', + setup(context) { + context.registerTool({ + name: 'leased_fixture', + description: 'Hold one plugin call open.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + async execute() { + if (shouldBlock) await gate; + return 'LEASED_OK'; + }, + }); + }, + }); + const activeGeneration = agent.plugins.inspect().generation; + assert.equal( + agent.plugins.inspect().plugins.find(({ id }) => id === 'fixture/leased')?.callState, + 'accepting' + ); + const tool = agent.tools.get('leased_fixture'); + assert.ok(tool); + const activeCall = tool.execute({}, { sessionKey: 'lease', workspaceDir: process.cwd() }); + + await assert.rejects( + agent.plugins.unload('fixture/leased', { timeoutMs: 20 }), + /did not become quiescent/ + ); + assert.equal(agent.plugins.inspect().generation, activeGeneration); + assert.equal( + agent.plugins.inspect().plugins.find(({ id }) => id === 'fixture/leased')?.state, + 'active' + ); + assert.equal(agent.tools.get('leased_fixture'), tool); + + shouldBlock = false; + assert.equal( + await tool.execute({}, { sessionKey: 'lease-after-timeout', workspaceDir: process.cwd() }), + 'LEASED_OK' + ); + + const unloading = agent.plugins.unload('fixture/leased', { timeoutMs: 1_000 }); + assert.equal( + agent.plugins.inspect().plugins.find(({ id }) => id === 'fixture/leased')?.callState, + 'draining' + ); + await assert.rejects( + tool.execute({}, { sessionKey: 'lease-draining', workspaceDir: process.cwd() }), + /plugin is draining: fixture\/leased/ + ); + release(); + assert.equal(await activeCall, 'LEASED_OK'); + await unloading; + assert.equal(agent.tools.get('leased_fixture'), undefined); + assert.equal(agent.plugins.inspect().generation, activeGeneration + 1); + } finally { + release?.(); + await agent.close(); + } +}); + +test('plugin command leases reject new expansion while an earlier expansion drains', async () => { + const agent = makeAgent('command-lease-instance'); + let release; + const gate = new Promise((resolve) => { + release = resolve; + }); + try { + await agent.plugins.install({ + id: 'fixture/leased-command', + setup(context) { + context.registerCommand({ + id: 'leased-command', + title: 'Leased command', + async expand(args) { + await gate; + return `expanded:${args}`; + }, + }); + }, + }); + const activeCall = agent.plugins.expandCommand('leased-command', 'first'); + const unloading = agent.plugins.unload('fixture/leased-command', { timeoutMs: 1_000 }); + await assert.rejects( + agent.plugins.expandCommand('leased-command', 'second'), + /plugin is draining: fixture\/leased-command/ + ); + release(); + assert.equal(await activeCall, 'expanded:first'); + await unloading; + assert.equal(agent.plugins.getCommand('leased-command'), undefined); + } finally { + release?.(); + await agent.close(); + } +}); + +test('cancelling a loading plugin does not advance the last-good generation', async () => { + const agent = makeAgent('cancel-loading-instance'); + let releaseSetup; + const setupGate = new Promise((resolve) => { + releaseSetup = resolve; + }); + const before = agent.plugins.inspect().generation; + const installing = agent.plugins.install({ + id: 'fixture/loading', + async setup(context) { + await setupGate; + context.registerTool({ + name: 'never_activated_fixture', + description: 'Must not create a composition generation.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + async execute() { + return 'never'; + }, + }); + }, + }); + const closing = agent.close(); + await closing; + releaseSetup(); + await assert.rejects(installing, /plugin installation was cancelled/); + assert.equal(agent.plugins.inspect().generation, before); +}); diff --git a/packages/moss-agent/test/plugin-config-store.spec.mjs b/packages/moss-agent/test/plugin-config-store.spec.mjs new file mode 100644 index 00000000..8bc91c76 --- /dev/null +++ b/packages/moss-agent/test/plugin-config-store.spec.mjs @@ -0,0 +1,122 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { chmod, mkdir, mkdtemp, readFile, stat, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +test('plugin config validates its schema and redacts writeOnly values in a Windows-safe path', async () => { + const runtime = await import('../dist/runtime/index.js'); + assert.equal(typeof runtime.MossPluginConfigStore, 'function'); + assert.equal(typeof runtime.readMossPluginConfigSchema, 'function'); + + const root = await mkdtemp(path.join(os.tmpdir(), 'moss plugin 配置 ')); + const pluginRoot = path.join(root, 'plugin root with spaces'); + const configDir = path.join(root, 'config root with spaces'); + await mkdir(pluginRoot, { recursive: true }); + await writeFile( + path.join(pluginRoot, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'fixture/config', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + configSchema: './config.schema.json', + }) + ); + await writeFile( + path.join(pluginRoot, 'plugin.mjs'), + "export default { id: 'fixture/config', setup() {} };\n" + ); + await writeFile( + path.join(pluginRoot, 'config.schema.json'), + JSON.stringify({ + type: 'object', + additionalProperties: false, + required: ['endpoint', 'apiKey'], + properties: { + endpoint: { type: 'string', format: 'uri' }, + retries: { type: 'integer', minimum: 0, maximum: 5 }, + apiKey: { type: 'string', minLength: 8, writeOnly: true }, + }, + }) + ); + + const schema = await runtime.readMossPluginConfigSchema(pluginRoot); + assert.equal(schema?.properties.apiKey.writeOnly, true); + const store = new runtime.MossPluginConfigStore({ configDir }); + + await store.update('fixture/config', schema, { + endpoint: 'https://example.invalid/api', + retries: 2, + }); + await assert.rejects( + store.update('fixture/config', schema, { retries: 8 }), + /Number must be <= 5/ + ); + await assert.rejects( + store.update('fixture/config', schema, { apiKey: 'must-use-secret-api' }), + /writeOnly/ + ); + await store.putSecret('fixture/config', schema, 'apiKey', 'secret-value'); + + const view = await store.getView('fixture/config', schema); + assert.deepEqual(view.values, { + endpoint: 'https://example.invalid/api', + retries: 2, + }); + assert.deepEqual(view.secrets, { apiKey: { configured: true } }); + assert.doesNotMatch(JSON.stringify(view), /secret-value/); + assert.equal((await store.loadRuntimeConfig('fixture/config', schema)).apiKey, 'secret-value'); + + const storedPath = path.join( + configDir, + 'plugins', + 'config', + `${encodeURIComponent('fixture/config')}.json` + ); + assert.equal(path.dirname(storedPath), path.join(configDir, 'plugins', 'config')); + assert.equal(path.basename(storedPath).includes('/'), false); + if (process.platform !== 'win32') { + assert.equal((await stat(storedPath)).mode & 0o777, 0o600); + } + + await store.deleteSecret('fixture/config', schema, 'apiKey'); + assert.deepEqual((await store.getView('fixture/config', schema)).secrets, { + apiKey: { configured: false }, + }); + await assert.rejects( + store.loadRuntimeConfig('fixture/config', schema), + /Missing required property: "apiKey"/ + ); + + await chmod(storedPath, 0o600).catch(() => {}); + const persisted = await readFile(storedPath, 'utf8'); + assert.doesNotMatch(persisted, /secret-value/); +}); + +test('plugin config schema rejects unsupported keywords before any config is written', async () => { + const runtime = await import('../dist/runtime/index.js'); + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-plugin-invalid-schema-')); + await writeFile( + path.join(root, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'fixture/invalid-config', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + configSchema: './config.schema.json', + }) + ); + await writeFile( + path.join(root, 'plugin.mjs'), + "export default { id: 'fixture/invalid-config', setup() {} };\n" + ); + await writeFile( + path.join(root, 'config.schema.json'), + JSON.stringify({ type: 'object', unevaluatedProperties: false }) + ); + const registry = new runtime.InstalledPluginRegistry({ configDir: path.join(root, 'config') }); + await assert.rejects(registry.add(root), /unsupported schema keyword/); + await assert.rejects(runtime.readMossPluginConfigSchema(root), /unsupported schema keyword/); +}); diff --git a/packages/moss-agent/test/plugin-interactive-commands.spec.mjs b/packages/moss-agent/test/plugin-interactive-commands.spec.mjs new file mode 100644 index 00000000..cd159aad --- /dev/null +++ b/packages/moss-agent/test/plugin-interactive-commands.spec.mjs @@ -0,0 +1,44 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { dispatchPlugin, pluginCommandRows } from '../dist/cli/plugin-interactive-commands.js'; + +function fixture() { + const calls = []; + return { + calls, + listCommands: () => [ + { id: 'review-pack', title: 'Review pack', description: 'Run the plugin review' }, + { id: 'status', title: 'Must not shadow built-in' }, + ], + async expandCommand(id, args) { + calls.push([id, args]); + return id === 'review-pack' ? `Review ${args}` : undefined; + }, + }; +} + +test('plugin command rows exclude reserved built-ins', () => { + assert.deepEqual(pluginCommandRows(fixture()), [['/review-pack', 'Run the plugin review']]); +}); + +test('plugin command dispatch preserves the complete argument string', async () => { + const plugins = fixture(); + const prompts = []; + assert.equal( + await dispatchPlugin('/review-pack src --strict', plugins, (value) => prompts.push(value)), + true + ); + assert.deepEqual(plugins.calls, [['review-pack', 'src --strict']]); + assert.deepEqual(prompts, ['Review src --strict']); +}); + +test('plugin command dispatch never shadows a built-in', async () => { + const plugins = fixture(); + assert.equal( + await dispatchPlugin('/status', plugins, () => assert.fail('must not submit')), + false + ); + assert.deepEqual(plugins.calls, []); +}); diff --git a/packages/moss-agent/test/plugin-npm-generations.spec.mjs b/packages/moss-agent/test/plugin-npm-generations.spec.mjs new file mode 100644 index 00000000..0c891d82 --- /dev/null +++ b/packages/moss-agent/test/plugin-npm-generations.spec.mjs @@ -0,0 +1,103 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { chmod, mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; + +test('npm candidates use isolated immutable roots and a failed candidate leaves the registry last-good', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss npm generations 配置 ')); + const bin = path.join(root, 'fake npm bin'); + const configDir = path.join(root, 'config with spaces 配置'); + await mkdir(bin, { recursive: true }); + const fakeNpm = path.join(bin, 'fake-npm.mjs'); + await writeFile( + fakeNpm, + `import { mkdir, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +const args = process.argv.slice(2); +const prefix = args[args.indexOf('--prefix') + 1]; +const source = args.at(-1); +const name = source.slice(0, source.lastIndexOf('@')); +const version = source.slice(source.lastIndexOf('@') + 1); +const packageRoot = path.join(prefix, 'node_modules', ...name.split('/')); +await mkdir(packageRoot, { recursive: true }); +await writeFile(path.join(packageRoot, 'moss.plugin.json'), JSON.stringify({ + schemaVersion: 1, + id: name.replaceAll('_', '-'), + version, + runtime: { module: './plugin.mjs' } +})); +await writeFile(path.join(packageRoot, 'plugin.mjs'), name.includes('bad') || (name.includes('recover') && version === '2.0.0') + ? "await new Promise(() => {}); export default { id: 'fixture-npm-bad', setup() {} };\\n" + : \`export default { id: \${JSON.stringify(name.replaceAll('_', '-'))}, setup() {} };\\n\`); +` + ); + const npmCommand = path.join(bin, process.platform === 'win32' ? 'npm.cmd' : 'npm'); + if (process.platform === 'win32') { + await writeFile(npmCommand, `@"${process.execPath}" "%~dp0\\fake-npm.mjs" %*\r\n`); + } else { + await writeFile(npmCommand, `#!${process.execPath}\nimport './fake-npm.mjs';\n`); + await chmod(npmCommand, 0o755); + } + const previousPath = process.env.PATH; + process.env.PATH = `${bin}${path.delimiter}${previousPath ?? ''}`; + try { + const registry = new InstalledPluginRegistry({ configDir, setupTimeoutMs: 75 }); + const first = await registry.add('fixture_npm_one@1.0.0'); + const second = await registry.add('fixture_npm_two@1.0.0'); + assert.notEqual(first.root, second.root); + assert.match(first.root, /npm[/\\]versions/); + assert.equal( + (await readFile(path.join(first.root, 'moss.plugin.json'), 'utf8')).includes( + 'fixture-npm-one' + ), + true + ); + await registry.add('fixture_npm_bad@1.0.0'); + await registry.enable('fixture-npm-bad'); + const isolated = await registry.loadEnabled(); + assert.equal( + isolated.plugins.some(({ id }) => id === 'fixture-npm-bad'), + false + ); + assert.match( + isolated.failures.find(({ id }) => id === 'fixture-npm-bad')?.message ?? '', + /timed out/ + ); + + const original = await registry.add('fixture_npm_upgrade@1.0.0'); + await registry.enable('fixture-npm-upgrade'); + const candidate = await registry.add('fixture_npm_upgrade@2.0.0'); + assert.equal(candidate.version, '2.0.0'); + assert.equal(candidate.enabled, true); + assert.equal(candidate.lastGood?.version, '1.0.0'); + assert.notEqual(candidate.root, original.root); + const restored = await registry.rollback('fixture-npm-upgrade'); + assert.equal(restored.version, '1.0.0'); + assert.equal(restored.root, original.root); + await assert.rejects(() => readFile(path.join(candidate.root, 'moss.plugin.json')), /ENOENT/); + + await registry.add('fixture_npm_recover@1.0.0'); + await registry.enable('fixture-npm-recover'); + await registry.add('fixture_npm_recover@2.0.0'); + const recovered = await registry.loadEnabled(); + assert.equal( + recovered.plugins.some(({ id }) => id === 'fixture-npm-recover'), + true + ); + assert.match( + recovered.failures.find(({ id }) => id === 'fixture-npm-recover')?.message ?? '', + /last-good 1\.0\.0 was restored/ + ); + assert.equal( + (await registry.list()).find(({ id }) => id === 'fixture-npm-recover')?.version, + '1.0.0' + ); + await Promise.all(recovered.plugins.map((plugin) => plugin.disposeCandidate?.())); + } finally { + process.env.PATH = previousPath; + } +}); diff --git a/packages/moss-agent/test/plugin-startup-isolation.spec.mjs b/packages/moss-agent/test/plugin-startup-isolation.spec.mjs new file mode 100644 index 00000000..5fb4a273 --- /dev/null +++ b/packages/moss-agent/test/plugin-startup-isolation.spec.mjs @@ -0,0 +1,156 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { mkdir, mkdtemp, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; +import { createMossPluginHost } from '../dist/core/plugins/plugin-host.js'; + +async function fixture(root, id, source) { + const pluginRoot = path.join(root, id.replace('/', '-')); + await mkdir(pluginRoot, { recursive: true }); + await writeFile( + path.join(pluginRoot, 'moss.plugin.json'), + JSON.stringify({ schemaVersion: 1, id, version: '1.0.0', runtime: { module: './plugin.mjs' } }) + ); + await writeFile(path.join(pluginRoot, 'plugin.mjs'), source); + return pluginRoot; +} + +test('sync and async setup hangs are terminated before enabled plugins reach the core runtime', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-plugin-hangs-')); + const configDir = path.join(root, 'config with spaces 配置'); + const asyncRoot = await fixture( + root, + 'hang/async', + "export default { id: 'hang/async', async setup() { await new Promise(() => {}); } };\n" + ); + const syncRoot = await fixture( + root, + 'hang/sync', + "export default { id: 'hang/sync', setup() { while (true) {} } };\n" + ); + const importRoot = await fixture( + root, + 'hang/import', + "await new Promise(() => {}); export default { id: 'hang/import', setup() {} };\n" + ); + const registry = new InstalledPluginRegistry({ configDir, setupTimeoutMs: 50 }); + const asyncEntry = await registry.add(asyncRoot); + const syncEntry = await registry.add(syncRoot); + const importEntry = await registry.add(importRoot); + await mkdir(path.join(configDir, 'plugins'), { recursive: true }); + await writeFile( + path.join(configDir, 'plugins', 'installed.json'), + JSON.stringify({ + schemaVersion: 1, + plugins: [ + { ...asyncEntry, enabled: true }, + { ...syncEntry, enabled: true }, + { ...importEntry, enabled: true }, + ], + }) + ); + + const startedAt = Date.now(); + const loaded = await registry.loadEnabled(); + assert.deepEqual(loaded.plugins, []); + assert.deepEqual( + loaded.failures.map(({ id }) => id), + ['hang/async', 'hang/import', 'hang/sync'] + ); + assert.ok(Date.now() - startedAt < 2_000); + assert.match(loaded.failures.map(({ message }) => message).join(' '), /timed out/); +}); + +test('abort signals cross the Worker RPC boundary and release the plugin call lease', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-plugin-cancel-')); + const pluginRoot = await fixture( + root, + 'cancel/worker', + `export default { + id: 'cancel/worker', + setup(context) { + context.registerTool({ + name: 'wait_for_abort', + description: 'Wait for cancellation.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + async execute(_input, toolContext) { + await new Promise((resolve) => toolContext.abortSignal.addEventListener('abort', resolve, { once: true })); + throw new Error('WORKER_ABORT_OBSERVED'); + } + }); + } + };\n` + ); + const registry = new InstalledPluginRegistry({ + configDir: path.join(root, 'config'), + setupTimeoutMs: 250, + }); + await registry.add(pluginRoot); + const plugin = await registry.loadInstalled('cancel/worker'); + const tools = new Map(); + const host = createMossPluginHost({ + hasTool: (name) => tools.has(name), + registerTool: (tool) => { + tools.set(tool.name, tool); + return () => tools.delete(tool.name); + }, + hasSkill: () => false, + registerSkill: () => () => {}, + hasExpert: () => false, + registerExpert: () => () => {}, + }); + try { + await host.install(plugin); + const controller = new AbortController(); + const running = tools + .get('wait_for_abort') + .execute({}, { workspaceDir: root, sessionKey: 'cancel', abortSignal: controller.signal }); + controller.abort(); + await assert.rejects(running, /plugin call aborted/); + await host.unload('cancel/worker', { timeoutMs: 250 }); + assert.equal(tools.has('wait_for_abort'), false); + } finally { + await host.close(); + } +}); + +test('an exited plugin Worker closes the RPC boundary for every later call', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss-plugin-worker-exit-')); + const pluginRoot = await fixture( + root, + 'exit/worker', + `export default { + id: 'exit/worker', + setup(context) { + context.registerCommand({ + id: 'exit-worker', + title: 'Exit worker', + expand() { process.exit(9); } + }); + } + };\n` + ); + const registry = new InstalledPluginRegistry({ configDir: path.join(root, 'config') }); + await registry.add(pluginRoot); + const plugin = await registry.loadInstalled('exit/worker'); + const host = createMossPluginHost({ + hasTool: () => false, + registerTool: () => () => {}, + hasSkill: () => false, + registerSkill: () => () => {}, + hasExpert: () => false, + registerExpert: () => () => {}, + }); + try { + await host.install(plugin); + await assert.rejects(host.expandCommand('exit-worker', ''), /exited with code 9/); + await assert.rejects(host.expandCommand('exit-worker', ''), /disposed/); + } finally { + await host.close(); + } +}); diff --git a/packages/moss-agent/test/plugins-runtime.spec.mjs b/packages/moss-agent/test/plugins-runtime.spec.mjs index 5e68d4d2..7ec60930 100644 --- a/packages/moss-agent/test/plugins-runtime.spec.mjs +++ b/packages/moss-agent/test/plugins-runtime.spec.mjs @@ -23,7 +23,7 @@ await fs.writeFile( ); await fs.writeFile( path.join(pluginDir, 'plugin.mjs'), - "import { isMainThread } from 'node:worker_threads'; export default { id: 'broken/startup', setup() { if (isMainThread) throw new Error('BROKEN_SETUP'); } };\n" + "export default { id: 'broken/startup', setup() { throw new Error('BROKEN_SETUP'); } };\n" ); const registry = new InstalledPluginRegistry({ configDir }); await registry.add(pluginDir); @@ -60,3 +60,124 @@ try { assert.deepEqual(agent.plugins.inspect().plugins, []); assert.ok(errors.some((line) => line.includes('broken/startup') && line.includes('isolated'))); console.log(' [PASS] configured plugin setup failures are isolated from runtime startup'); + +const recoveryConfigDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-plugin-recovery-')); +const recoveryRegistryDir = path.join(recoveryConfigDir, 'plugins'); +const lastGoodDir = path.join(recoveryConfigDir, 'last-good'); +const candidateDir = path.join(recoveryConfigDir, 'candidate'); +await Promise.all([ + fs.mkdir(recoveryRegistryDir, { recursive: true }), + fs.mkdir(lastGoodDir, { recursive: true }), + fs.mkdir(candidateDir, { recursive: true }), +]); +for (const [root, version] of [ + [lastGoodDir, '1.0.0'], + [candidateDir, '2.0.0'], +]) { + await fs.writeFile( + path.join(root, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'startup/recovery', + version, + runtime: { module: './plugin.mjs' }, + }) + ); +} +await fs.writeFile( + path.join(lastGoodDir, 'plugin.mjs'), + `export default { + id: 'startup/recovery', + setup(context) { + context.registerCommand({ + id: 'last-good-check', + title: 'Last-good check', + expand() { return 'last-good-active'; } + }); + } + };\n` +); +await fs.writeFile( + path.join(candidateDir, 'plugin.mjs'), + `export default { + id: 'startup/recovery', + setup(context) { + context.registerTool({ + name: 'startup_collision', + description: 'Force host activation failure.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + execute() { return 'candidate'; } + }); + } + };\n` +); +await fs.writeFile( + path.join(recoveryRegistryDir, 'installed.json'), + JSON.stringify({ + schemaVersion: 1, + plugins: [ + { + id: 'startup/recovery', + version: '2.0.0', + source: 'startup-recovery@2.0.0', + root: candidateDir, + enabled: true, + installedAt: new Date().toISOString(), + format: 'moss-v1', + lastGood: { + version: '1.0.0', + source: 'startup-recovery@1.0.0', + root: lastGoodDir, + format: 'moss-v1', + }, + }, + ], + }) +); + +const recoveryAgent = new MossAgent({ + llmProvider: { + id: 'plugin-recovery-test', + displayName: 'Plugin recovery test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }, + sessionStore: new InMemorySessionStore(), + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, +}); +recoveryAgent.tools.register({ + name: 'startup_collision', + description: 'Existing tool.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + execute() { + return 'existing'; + }, +}); +const warnings = []; +const originalWarn = console.warn; +console.warn = (...args) => warnings.push(args.join(' ')); +try { + await installConfiguredPlugins(recoveryAgent, recoveryConfigDir); + assert.equal( + await recoveryAgent.plugins.expandCommand('last-good-check', ''), + 'last-good-active' + ); + assert.equal( + (await new InstalledPluginRegistry({ configDir: recoveryConfigDir }).list())[0]?.version, + '1.0.0' + ); + assert.ok(warnings.some((line) => line.includes('last-good 1.0.0 was restored'))); +} finally { + console.warn = originalWarn; + await recoveryAgent.close(); +} +console.log(' [PASS] configured plugin host activation restores and loads last-good generation'); diff --git a/packages/moss-agent/test/visual/baseline/desktop-approval.png b/packages/moss-agent/test/visual/baseline/desktop-approval.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdba4d0a7d8cc84467620a4c5f1d6b2628c8d78 GIT binary patch literal 93793 zcmb@uRb18S7dNURf*=hdog&>WA)QJp-62RxC=DVan+6F<=@O7ox}-xoq@+Q*yU$`~ z{^#7BtM~Kns~H6L{ynkQw-y1)&tx#rh|zA`xPc)jE2(CU!%Ls@1BhzvBgYR!dcz@m9|8dX$4o zttYWp%jN8Rxu-&%!nu7(p19Oi`Nn*~q1V&S(*MJ4H0n-jAD>HBRzGAMc;!A)>Lm;f z?Rk$F3eTdX{`aNoc#j|P?@M-rW9ENfE^T|~``?#`$dNGr_s#DAcfa{d+4cLSkv`(( zrQ_z-qzeiT3L?;w(a~x9`Ll0mNLNON??TNpvvmP?Z1r*P%@C?I(%_pY@F*(J@bDKX zaB$2mEUeAULXw_DyeaZ!jO-Bc+UMouEG{Z~)=N7(OV!ZeW01~KDOq;f!_^mSeJ~*_ zDUcv7E1N=@#*F)5d23Ep6B`G|Q#4uRWM=r!A61X1qu#A~AtAo)cS1TImJB<83k{L` z|5goqt3gasQZmYM#-j3=&gcCPR7?BZyI5E_ihL!{;5`Nh|9y|jo3LV~5#iz34<0-q zB>X&{a(wKv6W!9>d>a{=j*c!+5fL1G4+DcB4jUJjl#Gl8fmpr@3JD27pq`og+`9jv z#VD0Jx^<>Pa4;l4x}a{amzVDBoY!1pxds^-xuvZwz#2=qyr@X=;18mXXv)`@enP@)dOkyDF)GQ>a5hoo&%xC*&sCR3Ae??8jVzj8g(Qj|M#&t4Nfe$OJ^D7srfJ5xi zEC)OLYez@B$*PcV-_AF`dS9NjHTh#@*zf**LoV#rwLbQ}rgoa?k#%2+(O_1$3cuI+ zvJcXk_i?KEMA=5B*nq>@?*f0Xq*q$RfnO%RKKD*3rB8^D43L^Q{=NeBoL{c_TNXWkN}7oVP+9 zFp<&l^YyA({}y?k-5*A#`t_vBC)e$8-Iv&UQpNXYrr9rEOiWj1X67gwKC9mY&CLt@ zE0LWWJ7eE>V+?9s$o=^`g4Zr`$ug`1@k2S7X_&8d2;p2td&PedsO*J+&O#S&Ij%{WKt1OF=`1p~i zn8}|CIbPl}#Gy>c>0+awW0K$-f~!TsbeXWGEPNs#`~`F=I_d@Ii4rM89CC77>+?7X z`iBZJUWeJ3TCa}JKH$2{EZ?1qb-W(ab)xEW<-=Y>zzqZH|Rr#3eUNO-OD$KTOC zjc;jfB^7q#r=}LCPs4UX?YmS;KHr?I*7=s0p!|W%#b)H2Ns{1!@)J^Dj2do%5?rh> z#sQh@EAd=ccb(5m@$UW43MO?oNm*Y_*QIAKCHP}eM6qq@7wUWF zUe2|ki%*FbyPoa`lqlRMBlFX6n)rxCk-6S=<5Y-3#N($?Hm}WiW(B^xJ4!S4vhCA2 z&YjZ(E4}KsZ4Q}Y1WYd)nJ@`wOJ5X>yVSm(6~a_YeLjF%s9%eQA+^-`cQ9KC?m3%U zR{k+*oZ{583@TgOV@ZtLDrIe4{D`3&WfF+H8G6p1o}Mq4JVpm3r8~n^j!!&?1_vdo zd^phtq%r%?#=gHS>YdICIX{;$Jx|t?48Yw*!YsF&7SHcX5u-`v55OtRRQRmI{S&K@ zzww=u1bxp4cHkaEROI}VW~fNUCMH(HU(@rO^Oe=orJq{rptl5lmQ*XAO=h1RIat%k z<2CF{@sj0xtxIhnLbzk_n#-cEcdlMd;Ah*CZ;9N%((`ARmlxI3UJ0QTE3XKzJJ%Mb z9w+G~2Opo^n5x&sdNkALOgGXIF$3F;@nMtJV7Ig13IZYn7%hESoukxJveMY^QBUSg z-bY2lA#dotyf{-!kQY21uD`mmbEWi1PNLYjWp|;&H{GmVjo0=MC8DG@U&xn6NC;oX z)2sw_SfawRsngQX@IzB$YirhfgsPFPtq+2VnfadFO&KbmQxaL=LW5O_MZ74S^9b>5{2`5mE>%;k9;ukIl zySq`+F}s)wzpjK|*SYNA^0OM5ndz0jdSjNEl%(h4(i}m9q7cLUyvUF$wc=N6bAVd1 zsP|#7=vq-op1~KT;gy1M`BB>n|dcL zEeU*fpNKz_@vZv>aHlTuzFof^Tx0et%WCA??|iL^jt)6&GZQVm*OF2lBA$)Kx)>xR zXC5bLaz`SHOCM5G8)A9s>2C~Xd5bFx=b^2UU|K0GQb~N2*ZAB3l?nPN9b%}jC1?rf z_UQQd^KZJD(joEHZ*7vfUP>RV@@!4jvP5=d{Ni{*%PAmmshpd;fz5mMc~SRW(~Q~*xs%g$XjH@s{P{ub?`%l z`}hp1`$M^S18LENe|rtEI~t+)vKiEAW_H#yC8egSOxGcq_ap}9W<5RY?&|7lTWT`! zzUa?UQEOR=@EU!^xRm1dvM*1Aji#oktSmtlm?8inG`dpq-O zSQJxNr)#%YgfREXGthNuXlQ=LusphkgmvZLUoQFw^{osH4L$kH%+LRzL9)(+HG$V= zsJ}l3^UA{V!Y(ZTiO;P}`RJ)i$Fto<1?V&dZU=$Q(^rF2weHYuA7Ep@YZCuTQ{#0Z z-yTM>CO48zYkzUdw-eX_&lELxv*=~-7c!v=3P~M3E z00(C(UrS*{Rf#rX05yb!uc_?yL|OM&tk>NMBbAOzwmDiAuUUEXyu2ui-$;u4oKT_^ zmpjYud{-FB4kqCv+Gxu=-eRR)#@=7q|xAv(tx*{X+j02`+Al_Z9iMZcTgr z4Zx!No;mv3xC8_TGYy_PIurfrZNa1`R=rg|fYMEy?5(N!Ae77KbM~{OD!>-c$(*)lZl06!7qPW`lpDziCKtZX za&jRa7`{ z<9+*<+117At~41Qp7OGnyrLrG=r;B+7ys%=p{Vob7Cot;lgpn9`%bqn4Pw)phAH(y z3Pw9`C@E1% z&EGg#eRO%cR`}R?f$&RZWhDkIlw`o1xV`q-K&C<%+2c^*Z@3TToi_jE+RwLg#xc8^ z9bOGe2#|Z-Rdbg_b-=K)vf4SIQfogqk!NP%I=KDDlqoI|>ALz+Ky6Fpw@(WRc^W8@ zo|g7%D2KzO^t6D22CTWLZoZXOwkS(u}OuC`(Yy{hDuoe|jY>llMID z?arK3Dt`ysBG=0vv=gqJJcEku`Znpr$IiCx;i;YFg!oW1m9WC(k9Ay+w{dbW`_pCi zme{tpw_`=Uy>>h8z8}e6vzy02Fl3~q87XR_pWVHC*Lm~L;m(fb_>Z__!MV9P+o_t_ zSrskQ2q+;MIm#*rJ?Qcy-}K%%G9{m@cNZ=}pKl8#bKjm3yF5Pu9QazDtu$qJt-*UP zoJyj~d5fHsG|?10)S%Am!fi0?>3ak{87IN(4}N~*qozB4nz2U8;ohf6p=nYvVVKi1_qE^M?nj%y^E9r0`gkIv z-)GgYsc3)2!O;((sI&3iJRk=*-(`pVPV+PchM zs9TA9b-<6HM<9ltX59*njg4hN~I*bk0o!8y$40G;&(_TqaME9n$pTrtbC7*o_4-E{HraD0+@=f2hXc3dJ|KkQS2BN9VpDz z;`U_n0LR(%s`5!2T3VzS^Yv@9Oglb}ek{-_*C!rqXqerYC?|XTHkQ|B^-tyA;riGf zfDXGYpjbN{Oi4+5X#cG9Ezb-fq(NI70IEFC4wdw;{&ugyPg+`9&LPx+m_@vU6Mb>A zgl1wA+1@TIAtf&YPa&bho z1hA_9^(-kTv4X;{soFC*%>j1E6x*#KB)J&Fzkm0XR$}3pQJoVtQ%t~JyWIWt`uw?8 ziD?8N!THvwbyH(V1`lU`CZEmBQ0C@mXTP+&+R~HViI}Rpm|lGJ?AbGhDZQ1T=C)r- zzb$^}$Kk)`wwqGa(BR|P@qYPwrkaGq`1t$;UBBLIGOgw6+Zu_W({fvwSFPJYYfP?Y zu`vaZaywb$U3qu+$N$JKz9~(IaQ*Om6Qw+qfx_GEsRRF2cHGP8oev5NJDU$%Z1NA2 zaHmH8fa*_gc6cEbh#BI{h&`^+$937bowNF+CAK~HQ ztx(3*)p-TrKAfs?)hn|WaCCHBk(+hh<%dE}b@J!@ViAveGMtWCEi2d|+({nZwPyeR zA{2Us3+sIqHa$V_l~3pQ53Xsrmwv6A7AOOjilDh59$j8JaAW79w)pn4Ff(Uh+BCdJ z2A;^#w7?=0`+i??RcUTdK8&HExEy-f^Sn#^K;K0EuMBlm9|&1lS-*Vw!hk8o-Q?tp zD7nr15F{{}U8aR>njb(d@eBrG5ru?=0R0Z9hzT=10LjGVS4@F2tTFrUEp@@ikCl=H zpPKg6x;sakS!=6LQ>Q9>=H=#&m0Ep%mLyo`euOFK9~qhMRFG9!Iric1yi6GR!DTJq z6chy7$?t+K@@a`ElZ5-V&7a)?Q*=gq4;AQatqDi6eSVVc)e^XPP8YCT{WIdnwD*;; zh=|AurIQ!-Lxf%0o3%1fl~CSpk&z{RnCp5k;g6YumtS#%_UFI=+R9JZQ)pab^gUhC zS@IjJcde{Qx@IrVoS!{&?O&>KKYA8H{Y~{ETgmI~+e6qVjnMo=66w}+pl*KH3sBOa zx^{eKqd?1P=mUK4$RNDzu)fwJS0gu(PmX> z7_5<#W@Tl$?gwz`8O25^Xie~BNbL(VKO>Vz? zp*LAct2Np8^nm0Z5huQ|O2nII$s)tqN?SfiC?Vt*dB@^6Z{CFK=lHhg5xryI$qb*I zO$3r5J{}U})JJ}t~bIZx9(tv=wbaYu|WmjMB_gC0Q)?aG-VKNGS z7(nj%>bAdJYTPma5c)O>%4g7Cs+{8B)27LYc%I__XdWGd9_Q`qX4? zV}=}_jkPr{F7CEmCRV7~Q_%Cex|lgRfd|~2n;_=4=<`D-)UWf%)eayBvi0liVC_*| z<@w3p*4Xz)t`|_7`~-hqS-)~N7xp~;5g8eIj0;^w^!3cUygaLqNSNoUMwsF|x9?DS z-`c_1pRU^p5SJWnW;Uq9ujT@%(;&#{ytyuVsVU-q_@~g>uX&`l!ve@2_GGv$PYzRDt-;$0EA$s=d9Lhbz28AQky zH5UL-jDSs_T2N3Mjqqo8LCtQ}1E;!2&l2Bfn&kY*l_K#vU3s};HvD#lIABOTDIv>`-UxlYR=#`Z-fH#Wu;4q7w7&_+!w+VDG6R?1l<4Dw!f z6TOURT3&)oHq!Pki2Yayslm zqec|2tbMyND)@GFh{&)0>T+#m@a5vKYIN#Taefbc92^Gxqj;P^_fHrP`sz(P<~BEN zBk7(t@330_05SB<>JXLprHAObvggJ)4~sUp0o?u7t78-7&RBVRRu-|7@@aFq`Er{H z^S!@M>Fq{~ZXW2A+gc9g%yz|bVdv%>)PM83sEQ?7g&UY`+{E4sXUi~gywu8w>~mH7 zb*-TVD8Bi-!0NmCQ)S1MflROvjDB=R3uh^PHn-=!ODdf+7_m156 zBu+EVDL@DS_!M6u=|cl%#gHko-=s4xdx~yx6rC> zC&!0}52`)%G;^NC*R669mY~&jxS@6KJ?)HUdNk~Der(^2z=1;5%J-+(q)jdR8AJB& z{=TA(a$w)ySh0x=)M$2*tau?;hu5#SzrXDDx;%MV1C|N>9lct&=h%xc4Azu1b#?Qd zk}{m!RrU|y_;f|i1`J?XVa)lm>Ipv2*PI2_0z{1B;^Gs4Rq(8A`Zc4aR(wv9@VlBu zi%mYvY2G|cD;BnzC?osSY&n=kUGH*s$a2Tk-94Q-vg5;CgbRJW>z*|I=G?~;VC|iw zW70(5IeB>-`x8J!H}t0nBH^w57jh-t`cvr$db(nX)yOl&_hPY1 zrlzzd(ST1$d&EQW2nhjF-bO-df)--*RpB$M@$S2KKO<;lK)k-EFji(`wF^7$Fj>We zMJ}}5pZ*e7PbraK#A#VMb(z%gJcQ&*z;)NOEi?(tt)f1oCNG@8Yy#uHMn81rpEBqe z7;!?bxOGbl3UWK?R5L$Q#WQF%W0e2IfWkDXtsQ@Oh{;g)0f8t<3<$7n`WOOs&SZ*M z(+{OF%F{c2G~&yzXMWx!ec3oMQErDt%KsW@wI!B(H;|gvFp8_?i1W&p*i``M^j%4h z3H|+ETmR|oMDqnseW_=Qrw~QvQJ|nMBwSnM==TJt`sT?V;m^&uC@0y^oLM`gHq@%S z2N(1Y(cy?}jX(FQWIJ3cKD|dFlIFVi*CmL|JmVh72A>Z19zBi!lc!;aU$iG`^;>br z@AT-(etpzlmRna3orH+!X|f2O``@0P9#mrJ=v;5Di)rTxS+uQ>Hf#C64V2r}!?|S9 zDtX`-erGnk<#6M1X=y1=-^@nV(}Z795y@!+F55~L><%GNYN-tPJx`s6zdqk#)cf^z zv6H}Z7yN}gckZCI^h4}hrZck5Jz%e>3wa6Qh~*SE6r1QZ}pEv;>AE`S%VprT>Y5HM>h zV=syrEZz$xdtBzcMmN2fqf^d{>0pd?^TIvf0go=&pvbUJxj6(bJ1A24l2K^Z8z4~% z8vcB8b;_FXKP@22pw5FTi8Jthxc||f)$jA0q5}*FRJ_bcPVD=#gTHgtG(0Nfd936d z@dEKno+W8(-X6f9@~#=oTbLio(@+xhAxc<)wrPyJvWsW=Vt{21*s#9_!>xD3JYLEk zfuEs}&r>3C0+L`&GjF};O6s_~5HOg%_|hDFh}$}go0IO8(<|ep3c0Ee->#3QChEXl z?PEW8#R)|DO=szii%|J9IT>yM!dL&uh|D?RceECyf=rablw9zOC9a`qXV^z4iFOLo zyxsu03*qHIm0YcCI%WC5MvaZ<0tuMzV3Hy_qL=(n&(6@(bXW3jlft5U zA8+p@@aY3oYbDo!&z$`1*kKf)BohaYpf4lCID(**0ws3Y@#_U_z2CWfOt~eq zf{u^w2GtVHPK>XJ9KwG0Bsl5v>6aE9fDqSusv_7chPN29+M z1eeN&cp@)D&slW=5`P1G0Bj);D}3MGNJe#xWjC7Jm~bX!)eXjJ4JINZAn@z150}ZQ zRu{Pppxw|ofPDnTi^>B60Dsm-zQ6{)AUmCDKw2C#g{OV)@%D_Cf`y)b8H)HZoAQ^1 z{OhCtv|VX)`Qr$549fQ9(PF%;r_~QX9UoT!E<^``qf@LeuVL+EZwW`RxvedkpK7Zr z#mdOsJf<}T|K;NHGCe^kg=nZQQZ)%eoLt1?cq!Q%?c^!e6&Oa;bcBI<_Q)#VG7g>f zw9BmThMopm|Ah|;<`jCGV$*%wW<&&iFoh`Qrw__~wXOPIF?mjhg(ZqiTVvya9F=tN{=R7zlRn;X z*%;1y32MhK2VB7OK_%b5cfb*-8I~u?4R+7gowlanp@T*-X*_eyzJPX%Nwm8MnoYIy7Na`3 zaBNT5?;;}!C$^qsQGW+uA)*twcjLhVAEuGP{Ab}A#>;G&@R!Wgb5&a=C-npw-fYh_ zKof`nQ5eKN70v3m1qlfxn6y{td%c}Z`an+oEM1vybS{F33Ocd0REK0tp zY3qPm1oK@6_$CIjMY_%xRZc6f?6%&yc!3V|P(DhtRNiZ25fqi8MSlGu!@Eyso5?Xs)IWA)pkH8^h6A-xnF_`U7z(V|%j2?>eZ?g5iDY?PU6 zyLf;$gydIpZCYVrSj~;(#WspFlU?Xu7M7Otc~AcMwxk*%9KNzf{}uul&P3Oe4B{s6ZBCZO|iUsdRDQ7=pxs8o}pE>Hz$>}NeB|8U)+>!VPMY_Gcv)D&r zCd5i;k_ttVOiT)p|KK+F`v~AGfdRqhbDN8v9{U878Y#N6gKZHkzldjz=gih;_OB%l zs?jhoSk$uc2O^#(lpUX(SXxAv{D@a&I8S?)S@5PuhdF|goFhA3gazge?Kr_PNCQUC8drI zx1~OY(wOwP9EXthAo$6X-+0*Zkeo2%gbAY7N0*fJ z!$OSVpsFTHRweu;gjiAg=Uyp~Zw~>L5hVM5l;g`jR%N(@BKuZkg8exiS}q3Qsi(!{ zOxAAW=Ta0b8!@OYY9_aFROl?M)|y*d=AL^nSu$@<@X>v4e=%KI#ZC8Ew%}L9VG4d~ zWXyt>zJc4l0Q&4s^`9Vp6652~EG2mvZ8vDoM!h1C6EQVI%hz$zb* zQJFu?{r1dOO5W^G&xTgMLgy{+b>NP?KqhWa*fcW}&SP~Mvr0o_hPa3ANIi+YOEZB9 z@*V?gribehv;!g6-P>c$rw40*m;HyD`uesZfC4-&`rCrDBU6}=I6bBrA)CIgzy|P7 zg(&(^C!|HyO!-s{Xe#32{i(j^tN{qiOd5!Vy0run9PRD~hlNd4IzAGKnCqeISN$HX zVE?-P+Q@HjZ=bAomfvf0W`(@S%a`TGEfk>s;Y8u)w;X#hv#9ZFF%yk~xU zZ%?esN6YBr3egp)+o1l#zr{>R%gFS`?LlqSygWw+aPt?!Txx22tHVqK$`FQ#iJ4{5 z>7?M=*; z{qT11cmxD4+ym=YpF4s&Qw9J0P4BUGxh)Afxk{nFZ<)=6-B`&=Pts$^AsikZVWFZH zm6QYq1wnL#=)TkHP%gAIqdw^7pq;-LFih>tgmk8{DOfQ8^Qq#+26h0&i$$T)&_I_X zMwj<1D|`ED8molL>y2baos*MONU-92U!?Bt`WCXFVoGLAbb_&zf5WE5lt@VF>w~e} zbwt#i4>?I*qqg`lLJU{LbN6JwW2Ci}+{i{y0xi|WT;9ThoerNGhfD721Dqz?;jg8; zf4%7|Dx>S2R*WxBF@R;kLNX&ENi5<~Kzymz>tft>&x>%Ec}%fNtr&L~gJGUtC2au; z6w{0R4{@@->+1`Tv??kqXG_87tiRHKD13H<>l{!muwJn_Y!Z@@Y^CW1mS%GG>AH*G z1vnmXup>@8-*fRtVXK-x ze->c`!O;qbMOE0eaJBWx>g=~0f}LVjRmt8$H*XO}*jAyfkZM(}$$XNhp_#uDm8f0V zQz$|0S_=BIF9(ZOiT(Dlj|oHsOw{eRXDRK1qhdVl>_5IcDqfY|Fev=@U=7!DNJf1( zGy54qrk=0a-`>8wGcQ9-9N(Q#&a9e&X!rV2S_&Hf!)xcJj(B}HbMM9(Uw8p=q{24g zJA^}OevPCb!X*G68Ye<~{vo5}s)E{e^y>PRD*#sNzpsqL2e1G8a>TgF&ujPX`t>U8 zpYZiR-z@xp`pw+p;l0-*Y6SpQyP@oW zwj}u?R@j}FGs>vxqrl_GFRgC_(E-n#xfy=DLj?v2@A=_`ow%1+?h;70l616mbd0~C zPlvwKMJLAs#0HZ`RK!}UWWXq*680Yc zIevG8?z4=S+Zj+$BoAtaUHnfApry&EP+lMgaq6pXC8s%5{Urb~*UmINPq6V%v8YHX zNl7P&7=uQNAi;jCUZ8z#IznT+coZ?5h+y5+*iZl!qbk2gO2APG&%@_~^J6Xrzhv40J;}+1d?dh3#xVbZa z%s~?b?)w#x!S-xZQevX=-dbV(+vUDg#W>EUj~HtD$qqnfub-P)SXj8`^z_tN%k%8; zjlDh2zbBLE!1GopYz8bGD)s3p6mVMnYzN(XFFpDJv>Iqa=u#EorltxC3MMA=w9$~t z1!TGUyI=wq&g*QW9Qq^^id^cQS9FT8+whRkYG-YrXOHS?Q`!mf!=NSJ@q@#!HTfT+J}rLUfgii$3( zf4$y!Ha52AhoG9~tEAtVqNe!Y^TQ`WlCh!?cB5ZF@o$RI5^~#@{aWvRt(1@lS&k%HUF-z#((LEu%PTbhvg1een3QoK_-YF4gCf`P$tt*MD$`G zuM<=obcbFkN?#f>L9r0)Zf|p_(n!Xl&;jFYNV#7 zqRK;a&mfLdynp}x#{(4|9g;P=DQ!)V;L`-f1JR`({&vbA$Hc_cwFv;Y6y)Mw-+c*n z>NMtu6dk|7VoT3mV?Q8npeI~I9k_J>s6m$j$9$^PYH53x29mHaI#B7n^#z_9lJS1% z)oIw+Gs)rMMP3(zGBPrf4?yst*ROE_l{h>W^#u7mm6i1b3R;)|RHSmq_m7G}J|!y!B;apJPe!O4W$y`BNc+40D&8>hF~+zO3^k+p^QEt z_@wyn<75^T6#Q2^e<&i8DrX?p;D=rt{%)WO%gXuivao=B# zxN5!PGxfYUEscwFJ=zpjhVd^pj3Ypz zzc@ca2t9oNF=(%yBqhYYha&si`e^_HD*)(ttZt#3UpjrV-vn9l(Zw`~O;A zrJOlZXro^cr7`{U)oGnT>Xq%ivz$Dj05Q#e2ATX2IhB-ZaTdu`FB8Q!VI4oN>^6=!H!n`S^e&Atksy zT`DMs-pbOFAw3X4T15r_;=%a6mjRkUPACA#XImf^`xb7w@hcjDOmY3(#pILOkJZ+GRqyy_*#dLh^ zdp5GlW{ephk<{h`GO`fioP0FOfV!J3EH;qUfp&o}`OFEDw15P(;H9lS1rimgYLFqu z(Ru}06>#?mwPusOFLObv6-;Kikivcqc4Hj~N!L%doG0M0Gt`53R(s(=X0tKz+iEID zI|*N=2`8x~i12VrlpTx#7ZN9@U2i0;adqXg- zr{`qBk>6n%T5o*3_Q`G~NE|8>5+)7rUHK33uxG%5Ee6hqO~t?h44wlz1a3tYkShyYpTkcV2t&BOD}pdLb4^Auh=TDhvw#x&CR@CY8R^`{fY zP$L{-m@6b7GBTpc)I%$?GdFK=@*P6=GTCttn$|zZl#%=pM0z`J9vodzAek~r!XGJp z0n+O=pFaye;^=0e^}X)LuDco6<)||;>CvHgnKUjwzJ;yrmyF#wuw3W8FWy)?ISs-4 zDxW|S`ER#QC<))r-)<7{kz{5!bl5UT?CtF#g9V)j0%kw_Wfs9Nf+M!S0>_S`%XA=v z0R?LlR0l<<4zR>uRnq^$Y6cRriMZ{@US6QU1HQmsWGvOSy%?A|Afu^c9W_gUO#e)@d)@B#WIx6L?y^f5ESg`MvH5EudYONW5HU?tKc z!0f$T{A{o-Ou7C*z#(Jb9-1$Q{aiCd9#L-J2Ickl)RY&XlVjem>bdV{T6=nI0jeDX zss~mvmmkvmTXuKBzQ*l9{!=GdDyFrRo%j}PG< z=r_w#_)IVU^eIo-vuN~Sh<$VrSq=sb6Xbk+Gtx1%yLX=x?Vk?k5iTF3<`*P!vGrx? zvZ~ephV(bTd?H_AI;E<2J3kB;r03-&aBa5vBpr(Tp=I);y03%v^QYV{*~g~=yi*)J zz^=$zO;A5X%ASL$t;`D&S(b~6|L8=O3#&;LZI2eKpBpWmLpDV$ z>zxCr2cROp<0xKa(kWvez)-KMuI95I?d$5g$Cay^*$LU)jJqfp#I$6Buiw0}fq_bp zZlm@f<;IGMBl}XAlJJROIBfyH{oL)cQV>yMdPc%;Axn}#S&h*ifKss-og*Jh)rh`0 zfk2>k-PAb+>TPj5HuBTq^i-Z@|yj;lz3hnMaVBw+ZZGZ$ura^q2N z@cuyM%)r^M0>` zl6#4LwA_!U7Xf3?psZT{kc+(BKsPeY?W=mDbIs}a1q2S(j%YAf>8qs&+Lz-XE{KA% zp&Tx#ZEL%z5X~5ZN&d>~;teyM*h^_wI#iWspK=YX)+M*UrA0-~90{}uEj>7!0x}J` z>tyhaS%!~~k71yA>esJ45R9Q}f9_F-k|Q*C!}JYF0$Kyy^2W)DJ@O+4$sAs)MEH0t$P@fd%i;T4Kzbv`h58#)QYdqE^EHbB9xB*8 zcH7Un?sccQvfM9}^gQ;%Y+RnwOe#0x(CFwq9$rhwk)t0B=@mDO7{8decak|^$E{N8 z+~Ex*`kxjc!MXg9b223{usnvUvl#oOA=2;fFO@QGw6DO>GR!Zgc%1BB9M6YEK2owB z|G~hCC@LxfC?TPsz!Wlw9pwu%se{$dc4}&a(2IbB%ex-lHpFrK+tpA4gXw^tyiXPh zEt|$N#>iTT!EfRG#ZRwwn?PK7ngOS@hc3S;^)jFf3GEVAdbmP&On}VedYE{0Ny{ z)q#kGga!@9YhYQ&q^9;A;06QC$Pa=FgHJ^8-{k%x<(DsP%q#^`(w>>ow+bAbobD4X zE-ew_;P@$@g1$csQ-|9kETd3|X99j81eVWofHH z@8{^y@H`2@0sC%LAB3o*fkCFIy|M9exA2-VBk)>5f&YEt2k_|k@{ zbM^)AFL8b~pCQk<^=Ln?0TuyNN>>`6#78m{8hU44Y5g^ha-?@|X z;?C{cDY(A3`#)E>9lYA@1n7Df4j#Nz9jB>hTuyeOzqEi`QVEBgoSXop8V;-9_xQ>k zT+V*6No3eVA_2nlO|Vxfz+{p$wvDeYJs-;B+rh}}$*wJ=_QN|&a}tGIKUG(gFmhPT zHX^^L_rx{@q5Y=l*XV0CtP$TA>%aG;ncfUM1t4;EL;+XRbL3kRB(6X_g?Li}Xd*{| zLm)MWNph$Fr5Ca%MYfZt;CwLal--L|OyGS315JPo0I`jNZUvJnyYNGhyt5nK?uGEu z->$f7@Q>cTyCD{ZDdB%PH#_UYED>j)@~)g5joKYD&4FQI|A-eE@4l%7_Bzp|{aK%w z^i5Yvt^$kiAy*Tx1}MmCEO;4)ZS`fE2dHFXwCbO`7H-~tqxu*>1GG1sjr zVHn}zd3F9y651sfH#fcsq!Rv2PuD}rsnEdvm4yXr+CJ2V1pHUBME+5>DXOOKf`U~L zvewr2sJi}p77?UX(#w>vBLvf%_b^w)qTSqfMI}yl7x8v|2d-L~KssRrCOv?$0@%O| zOm?OPu~rHwi-gRv28H@b;B-NZb9`vX3Do%UaY4`#^VD-2l|(TXlK7W{D0{+t=9Sa0 z<2Smm9uPbP2NzWOci(UXW#1!YTguV-fBaC@d+|lc72hb-Vp?(0LbG@8i;rD57AHF0Ftpn&VBtJx0i`i zeQ6O0b&u+IG#C&9ZCQhO0fhIVIshGMfO{SA#1y7pAbbXQ+up%ppueAok1s4V^m3=| z^6LEiH9J)zmr*o(^@SibO*CAz+wk0gU)>^$v=MlfB~w5?O7ye=kjlr){mRmf>O)Gcd65^lxS#a zl}*+E9bJr&g7G8(W%&gKQAdBnA)49W+$`zpkD2O13DYTINl8g%hvn6BjElJclr65h z+OF|v>VTpms4kRNRytE$iBRqwvf*!qczcV2@rV~$_=cR%4ZP~>KiQ(pi-rmji*PO4 zLM8p&+*}}&^auwc>vlZc1(G*V&%Z?eV0U~GNQnTkS*A`hf4j%*xVd` z1d1bMkU|Tp|KV3;Fh&FqR*-KUXN#@!3S{$KBI_ZDTKT>|_w=ZN|JXlRbRM0PV!B@B zJxBtzwYI{X^o>dKM~?_?Y{=m6Is}4Xq^&)E9Mq(?$k6t4%kh)WPgAAQ9}}beDWwq+ zvp6`j^oDzE*LB?CK53(hkU~%2pTv!Kl&R8gUMuAr!RL(IS*h5Q_Niwi%b zquT`CT1bd=5z;)lB1=?vMMdkO>lu5<$h1M#3M{0grCoqfr{)L<4LXoMt}7WG)$};b z$)P{*d9&On7Vg$LL;;>}ZC{@utiD(j&CC&z_mgY%tilOnfyZ*PGg^_;@2Q34pCsaw zk!9xQX6EJjQ$*BW-$~%R-@biYC3#Ib{s3~;>fdxL9ei#ftCH+Nh#cfIu~Zn%F<_W+ z0qLPR08fRTlT-fjOvT#`;`myi4TOY*5h`F1Lko=V1b7OJ2|ME>w-g(%5W(QPAiI4Z>MCds)u27zit2sJ0s_fe z9wleP*w_ic8|a;c89fj$dgtSFJuta1xs)xJ1Xl z!r`EZ!D3yc=H)Ad+4&ntEKdk4yx=n|&)OJObq zKr%3)+dL4LY4f^-!4YLJ)OJ7>Vc!VAd$h`QzSBkl+2aS?7Rvo;QXF30@jRK|Nv?;J zknY^0&weKbSwE@}zpUTK5G?^&q0DZ&&im>TK@fES!Y%~h^K>gqKy!ilR2*-56fNye zwy57j=hNg59WZ`;g+8Q7+G;c%x;D-7E5+{ZSk~ z%ov^^&%j$XsDnk!1_oOHqIkb` zHM{mSAEs7t`mIQp`Cj4E(9qt{rmk-Es)nS;yPHTw^PV8Mz!9T#dQu679r%Kuv_tb} zL0EfY^#3sS-r-pH|KE6}%oJrOJDqm45DBLcWeW{5N)(aGR`!-vXvoUQN+c4BtSEc0 ztdPnqtK5%MUEkmFyN~-mj@v(&7!pw?SHfclI6KA9U$~Q{@c}w2>yWP>I3*m5o-RnU&L@>MkWLiHVLgL$%CtYzK}@ z&upYo+ImNJ4Ik}u*8Te(`03b~tBjiEd2kxXbZ3d~6JhcT3y$L6w~y|i3IV{UujLpH zi<;eZ*H9Y0di{D>$As{XE#cMkVH{-1bMkbJ24~I;^McO1fy&y_AXdVH7{?@HCgR1Z+_(8zM5GC@ttg5k*Xs*_I z^&ZDjK`Y4=g1-s6d6v(cHu<2XMx*u; zVlcs%>YnNh1IcK;>ZC_Y2ofnZ;rG@^4P#kpMi!oVCChhw(H)UJ68 zn>L)NZ+R4E#?>#6IbH?)!gedY6HZ|OUsfI2Ay-BLgVYElM+#g!@Em}wiY)lK!>;U` zMVlA3DNQe3@)O&*U(7I%Z)htYR~oUNo1u%sXwShPFLagFzI{EJ_1J#v@g1bngQ)tx zk~mkotBdK6^)zQx-{WT_4ly@(-;`V!>wZxD764n)h(-Y9X}swP@zOV_U(ct(c*^th zInF32p!$G*cqH!H$cbAva+R3wUBf;n2pi@Riw7>@yJn=}1pphyM+q(nWvYVqZQ*0Z z6eI^c%wb-A3+O2y!Ossvgn;OQf_o6bkPJB}L$DC9+uNhH6chaP=!oB|WX%Kxl(SK_ z=4cmRd8{2B3s3;=1C1q*g^)obr^hNx&anjIj31ZqghD%qmcb|M{Fmj+>v+!Q2;teDu~mSHj({4cb1xj zJ!@b8{5iq(;)$D2)6*@kToEkY^q0FgKKdx;ur0^W=U}%}9+^+6i5cWR!7qYkEKd4H zhJ8NzNYyZ2T54(q*`Jds%TPOS-*srKODh`C_t`hFMd{cF8C@2E3gtb2KGB}FYnJA+ zIoe7*2Cd@UP4Mr^{ehy1!0UX>>b3!2fzMNNr%JK1RnK6uQDCqa1518AQuL+-z$dBLN?y|Z#!MSiEAD_yt-zsZT43^x-Pc<(xl=UB&RP7@%_9xa;{_Jm$TN*kz6pOB;{!r1-FxC+J z`Xk})(rw-z=b0fNhn^t5*|7$pK8s-?Em^5VT(p3u8H_2ZK47IqcJQ{S4maLdUJzPOm zmm)ciBiD0Wj+BNb1my<^4|XmY8KUztnZ+egDpggn#XP)9Qj1$dK>{;W906Vd&L=$N zf?IH~`cnFF2pj%>I}Sg<2elCnWGiN{@>f-L&0l^hwLvjWECq(7)<~Xu)4THV|1u8= zyjY^Zkc6N_fb!^lN5?I2CWt@-tn=q*R)^f$73_w$l91lPIferv>aLuNeHWNN(4Qf* zupnW3JXMe7$B7%{`lqyX{Wyv``_|Lv?71MG7ihNMzx7)289GlkGc$v;=6JDIo_Q_S zE>0}l-bD>dOM)-@(Ai`%p2Qr#znU8@@`B4POgaAhzy^g%R=nj#qnpFS%L`nr?~Mxy zGi=Kl*pN_#oq;~Z&Ej8BqeM+_ZwW4Ol><-)JveaLmrbrL%uz%?Gv$ zh?P7E5tUeamhc?M z-qclca$iq^pTb>ccJ{$#M3xk@(*f1sxr-95%MK$E@elH0AkrpUyseysNx? z5GN7=YS3*tP!^(c?Jd6X0xl{Q75`abfC_axjOnhGc>GAuvDJNfWsiJR3wK#Xn3rOI zM@~GdLQ##!C8Ummu-oCr0?E--;k%$+btgATC-ozumIxi`I=`^gZhf!$QH@Bg{yYmI zbe4w7=BntXr%=~u6? zRbTKeeExi4W`?Tvs{on$NfDy{+}}_de-+x4ulz~j;q>T?)DIJGy|Z;UFrc(OK+?<^ zSJu=>zGtZD?DU=>r*G=Gn|+)2z=6(>qG4QhS<@?=><_cAKO!w-EacaVuI1q|F(6X# z$L{gB7h3&eCQ@FE%n{NT;mnDSlgG_W6PM~4>Kdk3a$H3v@MQ62p*T?t{ny_w!jb<2 zMGF@*5ONw(+Mal z?(!odXc|N-V(R7A<>PsgS@iA`X2<%<3HURGOM+me$iDw@0F(mLnR>>sa< zNYT9J;God;?wvMW(--q!YPuIc{W)n~u$|L2BAzND#)pd9g2XQ(-zYs;L>UzIdMB+N zKt1%8X4|&d!?vY0B&6)tmyf%{cP6YA!G?$eif;k(vTV(SP1NDx0>4g)tFHXqz3aeT z&L|P%{@oTrLRf6^k#1z65S;@io`XF7u+3Qw2?FYT2%K?Yowz4_)PBStKmkIC3N4#( zlAE!><>M9w+=VZsH&r7CN2WmP?!z_^xnI&Omjs0ehx5K?@V` zwb~0KZW^3)(Sa%p9vAClLNCL1D@br5Wq#(Ag~mwQ^@3EFbDLFk>dp^9f%j+ntxH#) zQV>%^PyXc!9PdnGkHb(EGLs&06Eig>CE?6Vc6VUOXHrhIp;zPar8B13)`QolG9n31 zy1rcRTUR_{CBTc=43v(3dodo{PkA$~LUMpYi^T<^TU@H-{M$Ad6 zr47KR%CGsCb%uwB^}gbCEi!#?k4Ok8loa?;ei2W1BzEe+sZH>GEOniH6cC`99i=cV z|KG;P(;hN)rIwZ+rQWvfXH^wH%7&^;6xr=5YNTMu?W_`;y-+(lPPWz>yR+)&r+r03 zqx;}@2bS{r--R&Tpg!DUVT;4<=5--C^O{`nglOui%JxCwNxVzX!h(hGg_hRD1$yS7 zy&4=ztIG?dgM%2wjZ*XdClm>ZiPzX|vTNM336#rgh#R{dLso4X+1inH1|IoP-~ui1 zQv?z=D_`>&k`z4;bwAWvDoi;t==SiW9$7WyUMM4cfc*?uR-#HFNKL3z@FdzmOla%- z`uXvephk$1z7eO{Tju~!1ba>t<*|JudI)H@RL%Oq2KK!!B&h7YrFuM=h1Am{Oal1C ziHxF~-^kAcv%;O?K3sJpR())EZsS3`Xpkjxe|lB!P;wo6n@3lPAE>Jqpn3haJ;Dkd{eB+X@v9g4?-JVqn^ruxXD6bq){ott!XhH5g4#I6Jw?qI%XS{y>!2SUE{?*t; zW!lUNiJ_cd}yhuNmJPJt92}_2%)R1cqDakX#~SU8(FL!S(9TPB`D~f z@e)(yRSr)}TQ+KdnDES#6%zW2%M>*83bOK$OaV9zTB2uH43~03o<3bYQG?DB&mAtv z5S-#TA9rj^D{))7iMSjn0jfw+&Grnv4}ItQX_QXSVXvZQf+ndC4&rlX&o){paTciE z{|IrQ{v&{SmCY$1AYNsHR&xoccSCFIfm%;=cQ5g5!Q&Ihx$*xi+IB1^7H)sNS)iecotLOZ3-tbIvCLGUG{_R=z$zE{+aZ_oz~Bv-Y1$`FI7t zmur7y(u2-~ICId%7%y%!`(mWvNa453i#QioL&`5cRlA=p@c1e&N`E<4;9c+eFD=b7 z>SgFY+IL|!L2-6?73Q=OkG0P@F#**3C>_4qO^n<8;4Xw+VJzaA>ai_9fBy8$E5v3% zyPZX(TIx#$3|x@EL-f3i2M)`(UTd>C-prG@&?i-RD5IUq~@oYK(fiaPH?-Kf!L<`81^~LN1;T$dx z(*;cLu{Jz?5_-F`XZNBOGSCzpx%9CFo_mnIZM^9a9zn38K&Mrl{`S;4tUP4SJ#n?R z{h^s>uDbeL>0$7=Gn!re1289o5FuSaJ0+92)eL{dT2+BB(NZ5SguN9Oe>+xQ}(g=8h?_3M+QH|N_qEX4i zGr+rc1iBefQ261%&j@{zlHxP$Qs0q5#- z(G0+K(*N9yV%x%nZrt)PHA6cLz3c*%wC(Nf%%U|vYO>SQwGcPj=D=Ij%68XCmg;>i z>=gH8G#(NnTe$|yjVH0r)GTOyEI#P#rfJ$WCkHIP@PDH-%E|-B01EaKH1EBVW~|K3 zM?QzoYnLNzFOkEe{kedGXox)^&!-ykf{zsaZ<86$R)wtP+w{$@E?ozTtaMi75r=OF zx_XG+;a7G6=CL#COw!@Hd;goc$^bJ;`E?fRIP%P|Ly(7KLJxo7 z>}Vf)q7T_iZ~nsqd^eef;@p2~XXKXwa1ikRP91I<=uhaS_p2VK+`1LvJv)cCC#Wd8 zy1F*LI4N<;i+llruQ~WpxthUXE{!JY=r4UKxq0(u+3%mbwzW=7PV$7Z9=37CP8BCe zN;-mtgyKl#%*)`MoF6!(;ttzpt7zz1KFn{`9t8< zwMaQJyE)-Pg)i>BV=+7oUm~Dt%dqKl9_KcD368a;qXR!@VsU2YJz+!7#fpZ8EI8JA zZs2j_=dPd<28tDDMAmE>GlKXx{FL4@k9aPgIy&T}mgiR=Ge;d!0hJ$R;@PR?g}LnP zJ#sE$U;p>kk{a{{@Bm{6vFjr=fByWz_OFW!iVO-3y;qx9-_X$fc)RuvoIdknvVwww z!opjF^uJ9H@{UhTaQ|4G8Zj`vawXHg9w)@jihTz{wm*KDp6*j)1s0Nh_oFTJ=?OWG zf9|ZlfPgZ*?Z5 zT!Y@+L+Wh*x-BNWEYT42NlTwNeR{hbIr(wp`ErxQhqO+{z}3{%9UL9g9zQNkPdB_* z$v$CJJ--kFbKYhx8=nD>%q{C(Ct)`a&pSEydHJ`!z0C;DS6041K^`vno|V1W;7D%h zph!D&=0Tp8=7P9bSd&*5F;@4Ltz)iZeOsNji<78V~~P_N_lSMBVcV}^yVZ`G9a4mW|! zg9f*9$uG$6V2#dZ+)j~ApVrxPq^gn#0H~q*%OiCr0e^eZRo~%X>}B8V?8INb{JHr1 z%fv1c{1k=IM@^UrAHSB55-0r>XtMl+Py8tMdvgSj|Gg7CJzTD(rTq{kG;_JRk+Bak z5v4#Ei0X^1z8mg%Kq_aoY`n+5UPND_K)JvtjFf=?2xr%@2MHrg4z>$%A2(Kkj?0)!%idP-zy@^Drn3so& zJG4B<)hes1*jQMocl9H?+gR?BU4{;Y!SeWPKgN z*a9u2uW!jEJ_~WM?}rZ`zJ7hbJkc=ZOCM=3(Wj`NIn&XoNd%dfD9jV7gz7opsDKUr z66l2|TlUI9bA@tP`pB0fu8WO0>JWP!#34L`{Q(iUXND=G@Qq6Kl1S37%pU;;pp^Gt8i3miu2=U#ur01jkZ zg@%)DTGhgh;{E7RA1Zj{!fvKd3H=8z8ZmTa!~pl3?Rwr7SS&Yj+<1VCoBK1A)f^mp zaQcE2{(#K+t35w~!#vYW7)ny!p3;Q$Gi0mf%X=LsP$0MmYdy)5wB{2(ReV3-jyHI1 zYWLcXozJhwag85oYT4h|(!xBM31g%q$;S%E23REKUAr!sm~hb||4m(G@fUM_jfy)j zi>$0uTx3iP!JlyB-`i=1dux}R^Q7D41`8TocLxq1<~(#|5zb-E+F%yYUPM0xtO4%j zH}<1}$hmvUuTi*nS>oTf`YuMav&6g}W!wE8$VDn`lvH=bviiCPFYH)%(+^Q4E3um6Wb_`E(j zJM?hw?(ty!ldWenVkhoSH5|$)UlxYxCraxw&q!gTPFdjLT1%LxvKpZ>bx_mR8;Dse~(Fz;6Md>4T#SzC%<&X8cS{ zV^D7FKX~w;DUXxi_VU@@RVR4oYWkanD=Q=kBZXjXlSfiT#db%xo^?F|xZUtg$LMv5NZgNLSO zE;cj*Q_ySnq^Rwsp$P(P_UiTh`%HmU;!7dB3YUNVIFq4E)oPLugT&-K)UK7!e0|}# z=%@*=sJnj)+_r24y;x2mEYy~t(FpES+_^IneHt8JSg2Z9)EXMwSp&K1HpdD#_x7G3 zovh)`0M>AM?KBn@7OpHW*QC>WdLc*9?Ae8TedY(?d##Z`#47?hN^gGi1ri2{cVk`M z<|OxN@)(qf}uWqp1A)t+{MW#P5vc6Kw6<28Sio9RwgaCp~R%*x@!rnOOlK033BEUOavRJV*j0l9|JB>h8Aij zc%nG;7mTRii>?F$l>0*g;KH!B+-^3-#j#<>6HG=RZHA}~qa+9f0wu|{2-t(02cFbo zx8;#AlPyV7Qd0QT?qA!#+4eh9zo**m>|BftY5B3)`HB6lTr1@@&Go+-lO+VBEl7Vd zzUuVz#*{vM9|J-RiCQ4j4W)vvwX}>uZ-9dB}$sP~{_9zR+#u zBl_;+N=iMQ22i2#th~aSg;Z}J8yoKIQQzf~#5^NNzuLkEsP zhNQH6DTS&-jEQ{zA6?F)t?{?uet&=Nr~3z(&hs|^%#e7=c5zfz5;eTHigT(CPPsM* zMOV@8yD>4YZ-j8h<`d1f`X}~E$ zUf)X5Z2LTT?38YlFdrXF9|sMM^DSuD_x zW@bXMg%5wI9MztECXZ5JTED9`cB99irBu?TyMu?H|01-(Ft$PSxCYer{rw)$WWYFa zB#04OaMZ>~+*bMz3&?exiGWz?ge`Knltb83T-AsZm872?1c55)b0_aZ)-BE&wNXgF zu*tZmG`GFMz6N*&UtB*)fNnehCnW~9E>^$K`?05a`==`iS9z8 z!r3p-*Z`ZU*1rxf9GEr)OH2BC#epoa?ao(a+l#qt2s|bE5ZW@@;94Z#%EHygiE9-3 z<}7mvqJv_N)GsFcCXevImcWx`nmsUd$3%`|KZ5Nzs7 z`2ZRMkC^`PB!6VWv)khEnfeyu2@}iSwY4!Gj3KiE1QR5|KLvRrlpwfM!<=|J3<|6m zr5RaX;Pc`-U?|cF z6iPIfGEE?OT{@?8uJVh$+4r$~yij6WKZemB}A zA5RNHLSDMJTgCZr_El6=GzFD=OJ*m?K=!ih;JBkn2Ci*hp0^)MYNF{le$Rf` z2lU&uP?fwbP0OvnWC>z8Tw6y;A5Ws~`qAja>o{Z#zPZJz=U=(mBgA5i%=Gp9{rnVD6sVxR(@JaM7|9_wm_unQ<+wb#h1Rkv}- z7-Sh8^kzl|h9KUUH`Pw;uUi@k5Uio^1X6(62;5ZwK7(P;Xy6 zGMHdbiH~tRu|h z8V9UeYnqzqs||X4dmFu2CCo`G#l|gfdmue3uS4CNzeR(?2Qe+RLxNo}X`PldAMQUZeCT{s#n^-C80DPg0 zVJ>2EKD&5G*ZP{~B=}D4W+HJSnUt^rHPL4B<=3wmm<$_Q=6sTpUewUBtD(-hX>YIn zCU<8O`6QHNDIYYZ4`HN1!2=grxU#T1arQ>{L-2UP{E9D$u}?3;O5Vl7La-Hx+kCSK zjagl7rY*KY#}{oAqY(AXgwzdi<5bU#q9qI6ddwD=5C=M? z%rk|eFLQS8Jw=q4UWvlqAUvp1-ADnX1l7Ar>J^nH4d*<*M0SCSjn%i{C&xrPV`Gie zr#0xbUV1AMz%(Kdy$#Rsxy4n?s}Ys6CjF3cYw$<9_nKJEishp=BB4ywxHKP0=;>2K zLy$DvX2$yO0(70keyRNS9q23>W_KMN=q<3mgi@{!fyN*J-q#?HH!L9FUKOg=Q-If# zYjMaTSpJHM$v(5H1ITRx7R(7z3b2*BE@>$#!049Nz=Lh<&#Mz33*=N>CH??1r`#b*BGSm0hA3fAqFxM5!Gtitl8#rZE?}n0HNp9 zI9Khjulx${j%mYqwO>TOrn)}{(M%@C{@wp9D z?tJ>MA8%4x4nQy#g@(VY3zAprEp4?RfMsL^)#w9IyZ(b2cux2{t)Xsv)^SY54)b7d zZ}70#gInEp8Z930h?AepRA-(=3)Ui1gkN3zylM1}l0}}%W%X6UUJZ5iE3IjE-C-a3 z|9!+AhK$#apJw2b5)1+i&y<%c4vEcA;BJeG!K-HX* zlvhR7gyF|&fX42~ldnmWx_CD-%qZjHIz}+vmhiE0f_nRQ==OFHqo^pU8|oz-jcHKb zM(yVwM0B2MG3j@7u@?)C=a1ZOIR&NP{QNu~vOJO1=OE=*`gZLU;`U<+xPjn>XjckE!#oyU@B~90E>kdqv@=`LGgd5X^IY3_Fzn zxSC1UTYMLxBGs0XG~qZk!kG%p_xkhcI`i>WZ5jk~EGw4-AK0;2TVJ;gBAmmWd)Efv z#>OXc=NY?JXmsQjpgNZ;F6m8B9(@!dwV4!Cwyy;l_#X6WF;j% z%gXYKM)HGZP2cbkATqPXeIy+x&$4!>21Gir<;&M277rm;UVVh`$LIwv_|d#Jnw8Ct zu>{e5|7c#LbAbLtxRVoS^Zef#%+im+6i-LlbdNH9mV@je_*e zDjU!79=#LoAAxUvOTk7@`lpSJ2K;|Tg!5wmwNx=@>C!i1<^7-id8CGmf`;ZRELQyi zqz1}f%E7NuK%qm0j{dg?soV2<`7$&*`l^Y^2F_Gc>dk-MUghh}JGAVj1P9Uif5eX6 z{M!R?%k;tmeexf;6wzOzdvfF;@mQk@!x^DY3Y9ycU4*s+Q(2pu z>!uzeVBkr5I>ulZ&TH7CszhIZ>ld{rsdgNwt*!0vm%qCVEoW+IYd8lKbH4y3gt zbslqmVZD!z7HOg7IdQUmGyApK5dmaGLY#+S8O&Tsz1nk==X%|JG0ZF`Ky_Skybq6& zP%}_n-BVtE%-Go74}HGK`i6b+zq#tp$0`sn*W}$+gkcZE?7pF&3sM)-O7!MRj52Al zF&n=9&CT50kw}!JE)ieJ$zRYuw@1oc;6c2Gw}ClHDyQ&+d;7?UW;!A$cwNR zhU4Yi1#y9q(7&uRr!U(Jk3+0-!a|*qfx!`mCgE+o8nF^mqNhqH)8hyj2XsNVE#5*y0{?)0SXL>3}3D8=@G(g*Xjc?HrQWUq28yq z6-$p#Kk11yy@l17UX!<9GIy91xc(0IA*e>#I5_%W-^u|~b5Hc#7=#cIn!R$EH~}UT zk`3ThsEqaa=ph`-gr0|AJ`{R@x@=K)L@5=q}4fCwZiI00a-K0(!S2 zp&UJUf9b-ey?gf(1!2Vey|T6lVJ3(O8XC3WT=QCO;-Lq%^P9i?hXowETB#r_J0NV7 zj}c8-xMYM*|GBfzv@35Ef@PHpDCy3Xx;j~?-92n3??tipFeauG!;>HvBB{&cZIIRu z%eF9jc9c7a3%b6#SPQR@43f8LB^{^l(gk2l&#_qvr&)%!E*|bUkVEhXK@#KwV6J|8 zylI$&BO2hOQOXHM?(G5XVY?1Y<5HbGuh_~Hc|Fb2+JnV1}ew9w>T3U+1cl^gxJ zLpfwkEi8~RpTfs$HlcD@lb~H$fUIlOfzgxD%!!T|s-g$2#z_+FG&wmL$|7zBcVL=r z@2gsv)&t_kmdTbv4vwX*y0;>?sVKiFkVBxCUY=z4Z`k6G# z1j6a;hX4QsbknBe4nF%*AG@24ZSw1iR>tbm7jA>i)X-O=(~@Q4YvaAt6w$&VZaNaW zyC<^#C$?8KbMz?3et|PDdm+H;?X5#Pb}Du}Fa{!*CpjsDzF0^(@NR&~ z2=pjs`IxFE^!2&s#N;m5yBPi9;^_D!m}my`RWl`qj@SYfh$yzOcj^zpQIf1#LIKKo)S1`Wp9}2q%o`A2o_~y4mE=PLFK(?t&yWtP zG`7Pw>S)#B54jryh>D;}b~j-jvXs_V2A5d~45K;To0`v;v73K>_a10NUq00Zc?^91 zh)aNRcE!RH^F`$N_&PNc44w~RX}4)k&(3C^&e?WU3E_2YS1c{(;SWGSK~GoLFfR_C z@wLMX9(S{Z&-&XwvBqq2e43eMW10^b(s0u1GjgivU#TqMvBC{_QdgJZXa~%gk@YW~ z7ud4S$YmiTt+cq%_6?+Iu~3?Em+eTU)P9UiKc3gBW(m!ibiGK2<6gRde0?PmlfRSl zX624VkR&g6fp;cv(AU>jIjk#0wrP{5(@^CM5H?JRJeh&iCqz|h?cRSdJUl!m!0Jl) zW+tl(7f>8VcT--taDgRISTUI_kv5-pB3Qx>L(X)1J?HlutAXUgL2sq@XW2SBJKF|F zg_q|hG!Rh>06$#js?_)+<+j1rAz8p$Rb7n$h4hzvvNU?{?%%shms6tPSE_4i*?6g% zYU}(LT6t2L*m@t)<4EqBiM|jr75^&kM2@W zmh{k5(IysiN2tsS;1$X}u(|Efd?L^bePHD26Njl)$?^h51}-f#2iiVfmn6ema_!G* z5!R&Y=%y{y2(a6rYz_xT7)U3TXlR=83CNWXoX%PvMmMG4&ee4Vn$XUJEYc3J5G#>y z=h(4p7fG@Jr5N_DNW-=1!2}=|lDbmnH5wT~NQO5^P>{(!KELMrsqfs>r!z)IfxY0{ z&g$&j?1j@%1om&=i@QHeraweTUG=Ae8f-s%>uBIlcmZy%DQH1*|k2g~2YpweCCgT_t zXa_8;yIwkn$34?d$$0vd-_$=X4W07)!01YkOW_~PwG_fFk(Ax>tb^;(i?+r_%Yo7) zgt^xjxjLyE7}IG zeayX3%h)*H@WoR{6uU`|0*Bsd)Qtpvt6C>RSF#I9&J_ z>Kx^?c2xbzx!2nq!Jb9hmjm&gzCKufH0t;2QMg4QE*^u*0TK{^d|F*8YKKwRqfi5~ z^vbfy6o}&KkJHHg#HESp!6ll#0g7~5lmBhGi7%W1Cz5aC7Iqz~6lWk!xGkx^!M2c) zARqte5-B!=CcXnv#l+-n8CheH%|SWB1cIi9#sKE!7()HQ!p||^D zFiN_JIs)Jh$lT?=Eh94v_A)$Wb+tctPXkvzx)e=_%p2Unm>dQ@W* zB_y<6r8eI~)$-@ZolivLzI2_v+O7{iI+MPAoz3JLJSG?}7XJbB8sXj3$~8%#Vg48( z=2vcC>2K_$#p<@dsYyJ;)}WP0S&R1mpxIHJ?DeJYf!+V7G-yi_snli#oTL=UwISM^tOHJZ*rrmizAt zA;e}n1=eBgCu+tsrLK1PJ-7)%y!sIor(kEVtfG>u$;X8-iyE=JhU{|g3^?rQvFDSX z0>}g7!!)aQ&QqIxE~iW%rQp^1aXU0K$bQM^dTy_UVfSI{@@FoLm4`I zSkaJozTYE94T&j>A)N(gx_V*Amy%L#vc2;pxF+HuxMgx=qSxhC{wjLy58rZ6G$nOF zlLV|DEfi=w?^RZ{$8`za-Lw0Y7AAM>-kr{Wc~?a6FM#_7~CB z3I5c6Y3HZW$Nz$lmNoQ`^0!x2y)=D)0$S~>?U_rSTdw0;-<889k!oCa2S8>!-nqE= zK?w;aVo}fZ=cFJ8JH~$(ivrAn(=T{qrhK>~olvM0G3||6TSpfYA+|$dz{(M%a`Ch9+_7%wl$5 zK4xLdP$%}Ls)Q%19CjQcIZDu~Sd|X3vK#IZ7oS1$p1V8e+}Mq(Fs|iOrNe(EM)OzA zzp=7IItXY-+K36lLlUB*f+QUsWD9G2+5q)Ck!dOL(lv8%F(Hr`4J)soll19i#9c@W zXll}ew{;Pm^E-}5kZ6v$&CJ+g(ZKNS?7WO6Yq;Zjn*6^LB>6a0m0n(CVD=jtM7GfH zNfJnXmXu^|X$h1CT5GT9J#*U`|L451KX#dqQpTU-K)f!_=rBrLz(b4!QtE1Ogmb)4j>wU)VQD~-I| z*fS+#rNX>6QiR97)!)Cbk%SjxbZcv?x>}I6IDW{eIX(pB5cKpH-oD+)#B?ZDF5vf9 zB!AJa%UCWI%g?9ewsTcivL&ac-v7K}mu%fZfHL42Vbs2BB)dai{tpOYAD@HzF6*s3 z&EU1r1a9|Wy6arS{s93B#wzA&cy@5MmPq&z%yPe*(7tmvza0DahRnI=TOw5Cqh4G1 z6>OL|uCAUR60#fU0gfG?#w`%MDBq%d#1sDe$!p}-`t(6WxQ?f3`Q9o8o&#wkWn%BQ z*E#5qK1&#y`@SG4ZxbJG>`OrEo@!cZl5wtpDZWF8?%nd(TPKsLZ18~S>-siJ5wFyVgJSg1 z;-hNY(#8Hpa!5!?kBLO7Tlk%d6FeGwhoEL6TQ|Lvqg2?m5;FxmS=d!ksebNOlVWL4 zdnGyID?aeMjzJZ4M0)z)H2*Ds(|F{G$wNV(65jnef2eDew@wziLZ>Ry6#4M~;n`(q z{+<#jpE&+qz5kmkZYIM$@vI2+(UOui&CL)IpEf^@9A)V9r%~p`cE7O4p@QZBQ)n>3 zPl*Z1qEuVA9(()o<9YDr<_BHV5OD((5&vWTgArp%yxM8BfuljppP;ESz`*M8bA6?5 z*MBeHAmn2J)$x!xfzTH>zr}&~NX)ft(#Dw;&Inw_9?2~X{NNR=t?v&>!jo01;1h`2 zd8hICu<`)w{-+6=0DqwR{~PpH$4)|FpCR;PcTPY+`cX@1vrkX%Jq-+6@z6MX0??P) z$N`iwa5!p-`{{l`Sji^@YsC)L>zuLKQLAh{P^y@E>Kt)Wgo2Mzoof0&EPzYJzw-Wz z7cVf)lsdlfB4C@B%6^JbTphS8cgs3gwiOs4<&%B)Zt&Zrv7WGB!inUDLkFM% zNP2h{D$pO6IxjSLbrsBCtMM=zc>(Lv%FW5fpnj=f-F;yAu{p zj3i`;h9M7QfihZnZeb|e4Fdy~x|4ASAWIM*gNQ-2D-H2Q=7)66WXwNzTY6uBl02p(W%VTl6&3&q3ds}W)ucsFPXntARn z4vLUkf;-|brmfhp33+&i-YW9!=p@U5Y!Ge+uqK{`gy99SL%37TY)cT-?oS17g_VN? zFGb_z$t*ZjAw)s;0>Un_RCd~VJ+p2?%Zg968`tr~G0bEE#$lZOaM#!zvIa1={n1Aao(>Y5Fq*a`#ShWDqd5v`mI$Zfxx4KLm)N@Fx$OWa(&+E7ns$TtpTi_g z6^&$9zK|cZIRK8ew2+d;5*6v8h1CT?s%4IwrK38m`m7l)QU>FVLLYEA2U zWv2s@0z|KqlhfFTFNvwCVT}nGYS>Jv!b3-g)Zr40Z9}yL!Nknm%J|g7?Oxm1JH;Yv z!Ov>_7$4Vtee(?{)Zf2<32s$Dme~~8Tpt+#iw)F8iWnFD^kkkt1B&JM?d>nI5+Iht zf}#(65I{~rk(7%`S|y1MXdaQupgVi{N8f9gvHHun`1r)0+l!Blje&mr^EF2U=Kp{v|gjMnVjHlG~o4nP56M zCX!MI=x)zaB5bpmTe?R`=ouz>n|Pz;PkPJZ2k0C})3!)&AD<*Z%y&+yMVz3eU8;SV zamzrN`Q3*PG;R;jcs&vF{Bx4%y?QMuJ)NqU2^uXbs(=^;X{EzhRsf&iZ$jzOY;B&b zeq$mAftBI~7JK|ytE&F|*ks;z2-5H&y3_C{+3i!6+SEOa+ z`*|Wom2%upI=aRrWifT1L02rLRSFc7qFs>DQ zj-iY+_7h`?m%9s|jURq;d%I8i(b}a8AAY0j1;E8Ds7p8^SL2Jiy3`kxbNxf94+yS( zBe0nc9xpiC$FXF9?RgzYKmuaAC*f+wLtP3oO zeET0N?su3bh=6e@41OWb#ttYDaxWe1?ThV4sd;=Md;+HDg05=Z7e+;Ir6d;#Bw{(Z zXrI*&%mVb`4)C|}1{Dp>^&2AC|9bOzjeT+G20)9VU?h!oL~tg|{N%hCpnYMqPOh() z*G_XJ>y&kCT0cI(fzsF!PKlgZc+y-ZfURq;!ff8^6Vf_uR{^jg3IT6LA_N)!@;ixdx2;0zYAI z_ufr(o`zBI3J%OHn&v=k(+gjFkhYBoZSDz@ya{p=@pt&Y;qvtgAsl~&^kW~IFL1Yh z0b`%6y1$-oNm?QlcMDhFHHZ2$SX?7PD$ku_xRG(R^MQ6HD`MX9$i%P=;od|v6|~}e zBqb?n%Rl?$2f5+6X1G8b%BcHHAHFE+AjNumPEKYdt+TOdmzEqk3UTB%?Pz2GeC8sn z62ojsKW4P5_J3BTgrDJ%QV|0D4AGcBTR!_4eMB+}?|IKOq$A^ajWpnloBJ(^jE;+3 z4MH-frKTp`>^9f^c(T>^gBQ&(Lb};dq(+KvJGV*R%aRYkl9hc+yqxFrGOG}Nn;JpQnMdT&xW*7%4;dLF4m8Hn4>(R+69 z<433JkX>>&r;s-NQ}}!dhPxgHPRovA#K=lTTIX#C6Aax1Is^CkP5jVn>hGahnV^!^ zjah>X%uc0>_%Z+HHzNU2At#-too6r@6!2ry^$Ksqd42(b0Fnb-2j*{o0+`vAe>oCQ zX^@VA>CX0pz<+UeW6dNY!%s+ml^z2(kllr=Jp23`wl}ZvdY}Go;9JWDQ}Yb@DmXeZ zQ`+C1KU9RfKtO*gDBfJzYNLxD>ls=n)Ec4oBSYy(`gd7blJ4#<%<3r7Dv-V$wl*9_ zma-|r@ye&<+4|VBJ)AqkH@YM4W-IO5n;-m%cUbqkM@sye9Tkd+tz9EWBmz2{!!j~k zlLS7=TtUXaJKBurQtD>(waDWQVG(CjX1tcavCCT*86EwwC2-w37BZXZhZ}$|7WYUy z42y5845Za`JP%OFZh$B4aN(>rZJsZ@ehw4OBuSvK-aUQI->0-&US4&XSZ1(Li}28b z*A`S%#Z6gwr=+?y+xp__#oT}#7|!!+LBw7F<_hg{+$D<5=U_@gJ=sOrI)0}rY^H7m=17s6b zLnoglOGs=>U+oH3ob8fz3b0Q-$K%76vE}mSspiyt|0s=HQQ%Gw3ksenAU~s7N#UqB zwk_kROW(y=yIiSwsq4kMN3WR}LxUadm8*BElwtIiXYz1OxT30WcV{Qqg)?cyT^SLs zfGOtaNdZE$Gcw|S;KpMHK>b+=F-X=qsVf8W&LV;Bw#KYJ|Q6VKQ%_F*z!f)+dzxAa{9-z-g z=1QO+!Mv`B4zpPXxy<>WfX^s3p|8V$3g?|W>tr48A4z;@_9ftVd{*tt#3VEGJVIMM z->oeZKe5APL)YULRi0~`G&aRJnj-Ejj zn+a+xho_j^Ai3>;%g={kUvR$7g6f8S7qLQG%U{wH62gc4qJ6Ebt&?Od8_V(caE;Ne zE67LL|BY5yhazuimX@sazj=+Z;CQ+1FTWK^&d&64`@-{n*qvYFv1cI?C??P@q6SFS zxNocrw_XvGd%jZ^*@?&rDD$kYug zK`7S-axd^A+!ppDFvvV*Fn2d$S%}XU4*Yq;*bO1I_L+OHU6w|&;3a{eEp&csDb8f* zohj#Xps0lC0poD@Hf)ynWjG~*x%Kno#%Lw(NU(u__5tyOGm*pgL-h5?i!nnMH4zMQ z;JN!?r$8z}DsEdOdsA_O67aztwv)Kl^#4l;49Xl^x63WPNJ{VbQk2M7TXTSnhjcuy z6uYgoqv(1rbQB)6`Chr^o|SL6rfvm9b(>wjEK-`+*w~0_)%t5b69Zgy3=CIHo^Wz- zd`DhsX(^!J&71%XoBNLMLHAx-T8dtx?scqt`n;<_U3l*4=;v*BFF}08u6=JtNkdB& zDZpW!#AwlT{Ia~&@8A3Q_{7D=KC>AqZNQlyQ>N|ZLde!TH}r1#iK{kJu~pJ88cV~vrA}qc(neenuk$m#dK%v?9EGt8`mJF zlvTnCs7+UARx$9jeJ`Bg^81MZE+?EFo@c( z*UO*%;vC(eIS0dyej2;8BS|?2=rtlhkY%q@W1Dwwr7~a`N(HD#oe-W3;69f!xGPO- z7;$_;myl}Mgta<3K8|q_sK;B0!v7QIPib6e6Qa%!xuZOw1yXK8x(E&x@WKf1 zRBEq$b5)nv`zd+H~{`0#fxUtZ>fKWYSJh0*N zdlU)mY;4XeKd-j(s$9TPk2Q^TwHAD(quLplKuv%xkIbbvB{Jcb^)cci zFmv{-yzx@x2%h*Z>LDs!^|jF}2L}a3k6pB};T|cZ`=x*WGbS#1*FuG3 zVr7Mq@v-<*7zvt6w*25^J7%MnFAkd2(8=P1o z&jB<*;>!(#9d>=ga#cQFx9Ptx0-m|>~wBFtGDVH);Y<+lWA(qB;=)KHHEz;hjurv4&WHz!R6OuN*&xQXA_Bbf04c-78F6f*~EYd?5*mgD8W73B_S#Eu}8-P zcka!FNk$}3^6gfb*^mqHj>oN>atjU92|F8HBz6x@z@9lz@;3eU~y)vC+=W^w{p-xnqa>VgkR>*O4d$f=OWuTy4uZ zcrV3qQ*6@f*Xud%Jc(!3K}EoR$pj9WG(|oy?jM2NfK+tsyx5r4A5%Wjw-^D=j_vGKFALHzW;*n9JMEZ28! z{E<>ALm?p%i_jo587s3&=9HnL6v{khY)~Shk_?$;Dny24s)SOe2$|=|n0bDW+gfYy z{oTJkyzk!o^ZUGiy#2G(@;uM|-1l{z*LfbtaULi8vBU1H>%ak=@a$UBgHWk964KQM zU0yn>s~i5hxx1aV!m}{x^eatBg^67nbp5?eG~~2{J51yspAXd!fND@9=UnufzhV6& zbYZ%=MLd6=#vXgTnLU+TUI!7GqK{;|ZLm^NsKcnaA4)0(a!shV<) zn^^w{dWNhRPkjsQ0$wOF$z+9tHDE?-dccGJ85m;v{4`$c1IwgC2b{19w;vioG)~|8 z6I>_S+o<4hpag$RTfMBtdAsj7F{n$?f7ZN}S~5KRtfJx_XvEOYz5TQWK^lA>A7r_S3(C)U{hDg? z<~1+lH@gojfU)2>3xS)curM_ZO`ppy`N6wuMiQ(qj&RVe2`fLA)$tH5uDGne3qPp` zf3cX_^8ZYQdA*3JDA>jRWpST6atlhr=i;=Jd_U2&#z_8vj9>u6weiw{J7z;-s)A6sfu~>0Uu>|9zp8m z=x6}D`Qnaf(M?SFm<>~SAKOf*mE~CgB0`R=rq(j-HhPB-H&spT7kvFOV3YNLpMRgf zgwKl7-{e#Y#)1inwJG0xt0-?y!Q!w4ZV0#N?i~u8DTK~7HUd5XYT$?~DoU%WG?G|` z--JH>X}VJC%Ara_wEKN(Y7%B?mmr2I;8D7EN&h8D#`NI78|XPWvj6gW#jpH(gu(yS zzZ{8?$(GgV0wLB^>}vH#!lht=2Goa0iN6@JFfrEp&q2?`&;P!w=bxMKe`vNdRw40e z*uwwEQ==argKZGZF1We5Q*=QFMhha+XA1%;|4V?3)kJ&sh7iZ@*uf_w&Dh zAAXkZy%l>34Byy_5JU~ocJvn6UFiiAk#o70k{EG}jAXy4=#D<_6JcT&-`AZ7w^dCE z|LGG!9BJtCfEUbP1AT`AkUAzm0=nBZUFL6*5)6HoTz(f&>2xD1T3;~8fhIS z$PnGuerhWS)|(Yh-L#K`KQACHaO9uu|0JVqx8j73KM4@#Or|NXr>Ez|69xvY7?X?B zx!gZIJ|RIT&0xO6Gs>GC^Gu5Ja^JuK|EuvUu7@#DiaFm;V@*nK@iZ{i>?TX>d0Z)mAngsbz{t8 zMFLV%H`z4Fh|3IKyG(O)b6jcBf_bfuo?+pYZ`Dv6sOM1OY!wtJ`JN+^FrM~7i^w@dKU#x_7`>Xe>LFhrHB_x_nG*wkUBg^nu zU3MB%8SGGeMBUy;8|}7^o*5q>_!U=i^B9zf2lJB(R&>%mu0V(h`0-*n4eP>vR^ynX zZ+09A<3D|-l1r|(zdYUBkyp$T}K%iA@i)uku zY&iRIq}Zxxp4&R|K*Id^hh@xDn)(?>ey!-u#g}LFJZ72`tF(j5O7D$5wYOGJR0%;3#4(GmCA`iGAmJ*H#u zoA{v*46!|TO#N-NV}z1uMBBj9*bt+wz{EUN>=&sB*hDS$^{opM4Ljwd>*Rd0ZnZ0kBgk)g((r_`vFjC0u{7=2D&6cMuFv7DnABp^DOCx;=1h)d5N_<(aL@VSta%h) z?gP*6RZGvd;Tohma3cY5C3RVRv_#!^j6fjHofDPAERg16tqk>Cc znKvA1)ry2||Dv7(8zvdNICQtXDhx{3s)!ih>7{46^kZL|aHCT7Cn-Jqdh9L{OS;6H zw2{^nF(&cSDx~33Wst-1{bBQwLC>;n!S6?VfXv~}dwcI-?v#MigRDdsn1`?1SS>AP zi=n9IcQO0Y`Q6R=9BDR2#zgC~=pzCAXQsSQnBz1FF*b@r0WRsd6vJ(g-fv++l+$n> zu0W`{E~t-oGs)3BKw#6{ZFOI=$_jpet_(4{{wb@PDE2edcwHe4bXl3#KsUMaYJS1D zH>3H#7)oouyH7WSpgH-e)O;HzqBN`U-JR&!y9C@3P+GPLvuMG|dHo`{&_|t*c^^qS z7PPo30N@&{OGy3vjo7bqcZnTy$9?2x_qMU(RS(F(q@QDKi6v&Q0a%0PaR^Sep4f-D z`#l2cXaWJ-lz~{~hb?y0+YhX@1}B;#Qg*y$P_k108w=P@T*5FN4<1SzY`m%JlQir; z`m)K)o6Z2tmwpJvf$CED;Zb577BH>N5hQ~62~CHpBQ~R_9Gn@gDt3xdkd9%YhsSE zxlh$L=oyA#s}LTKATY84^hb}`8M)bf#Dx;h^&o(WcHHd7@2iLh*9s=eK(<=g zcnhVy9lf5tYE~_?c!!#68dp^~QD&hoBN30e+Or+2US&=3qi@rdU{yMj(Y@u^9jPmX zw~^g&Q*+3zcE^^H` zaxF;ZX?G~X|C#Y-#POJ&3b+!-%CGjqyLLi84r7IeAKq8Bk7&Z$QP0@DVQv-=gm;7F zE(RUz(N=XK^GkU8>}U6skgfMemo+a%jLZ^3TKjd2a8Madca?TuPx8c82Ci=a_U9M& zlnK=HljUs1iShAGX40)AZEyD;UKsws2+V5qTVk%eU|*0D#pUDBUle0=!bxkO+E{KI zt>h}s!h~oQq%DXGg?&%LL-x;CrPFjn5=NhL6g)Z`dS=EC`u`VX?<8to14;rtRAWEt?KGj1j&N#sp~` zE3Y!!q4G)w&DeG`9(S|e`9Z+3OL7M+5?+HNMNu1`RlHm~H(AZdS7uXrAlG?+(kTU? zKKw;_aHo+CeO(U~2D(G4r6ylXFb;mQgSx)M-O0CnEAqYN-bc;TLxvW0U(F8dez?JJD~RuF0K=iQiJ)w((Kq=X4{2pO;wZmxZTD~)v zzIJ>gKEFKMp^39POoZQawvBhJKqwg*GV|DqoD!BKdQZ7e9A3QsAT=%D{QHXlvoB9Q z=KC75J1>UlAlYuc&%|cndez-*g~h6%HZM}grtG!3gB>;>VWi4}`sk2KO#jRE~B!ix8uzkdq8z$T*ym)x#uS!38UMX4t0q=r9!uB{%T%kpn0rTe11&bM|C#?eI2Gry&YnFz`TAuli588n>3QAoMmA?of7Vy1 zc_7Iv$TjAQnTzS^)q=6}HWA;xU|GmH(*0v{_=T_sCDim7DqhZiE4~A)A<`{fJPoKF zB7b2L&RvMPhXgXAt-wwod!i~-t)ikrnS9wCXwkaocDB$P?B;~nx64xb!i8@1bRRor zhXL1RoNAc-hXs5>MTOTe|MjfJ5h6LwHYvBNt-VO)#V+qfUZEU%2y+w9uD~Nb3_zONB5BL0wrq`9^QADe|(w?Ay@ldH4DH z!0}gIhH58ilMfO#w}%h62kg41f=%n=QxQHp+~K-BFNRCe_sh4g53(E5K5Edaq2o%q zWB)@Tv!`SvS**4r{Y|fkM$sKSv^trluaOm0CK{Rmf9Z&a4|g%?SCG6IjRYyz!(gww-YMq6 zmRJ@Xtt^@hNyX~=y%JwWt@t6UvLdy%Jgi?rsTu%szE7=6r>eK z;x~3lY}bmGqo2J-q$(#H_UQO(iwKg&i;2r-7nnGXMxm9Z4O_AMauSKxrLZ%RtdAkL zUx)h@;Nx=$-`!fHL7CwXa?-W67wzdXbrvTIIIrR)^LWaKWF)brOsspCOKy zyD5rNvFl36@$sAf*t>VKhZp}yt>dqKM3B^ZM@buh!^izw)u8i6qGt56+d)TX2T}zG zK04f5NpjpJth?l%z-Z#)Y>3qfq%FwnQInQDg#-$oJvpE?pgD<eMjA{yd3Y*?R37 z0t9Sh511!sV;WfRfJj4K|7K%TW293{#D^D5ACc!W*(+U%yB zjF`u8r7hn9XOeIMDp*``Q!-AVT^Qa;p_^vVjM@!?bXdDg)+(_TzE1$Lj{MzT{Q$Hc zIvc*um$6v={Do>tI~{Yueam<@`0E#Y6yC``hpH7xJ@|3;gyg(3G>GaX*F@mVgg!W% z%xeptc!guT+vL{}V-FVyz!>KaI2zPP2b?lIVd7IAl@L`#+4+2uK-@n zrh(&ibiNL{cQH-*p;Nnyl8N?2jV7v94Ig4;9R=y&R;;{zcEtnVT)HkJmAr!_0Y2^y zKj?W*0kS%(L#1%A{#Wd|yF(l)-f-npE!+pULgq<~oNU=pjMD`zEy)yd7g6twNaf*d zxv2)MZpsC72;83|Qw{PJX(HPoGyF9izC<3=4SLWH7Mhe(dy8t55!$CgYqQ1s zG^JhBjrjOKbPRsKkylbG{{49$Hp==K=<=8vZ}B0|O4;5N1YyF|)30SRmY(;zw@KLc zo_Z-4OxCkw2ecpeZ9ekSZxl#lGpjYbd^xEfy;f=FjKGIp*`-{HrPub$@Y74y#4_cD zNus7(yyxnQulr6?-XX-b{c0k2K&!Sa++9!s=dT9|%Laa#mAM`y9$T3Ndwut%&3)=a z5ku7FupR|WWA>GeiAf(l>%@cH0+{vijr$O7@jg@ZXU>LaQw;41L4>|dyi=#3J3#X- z>g2AK#j(bxm@S6qSrYp0&K|5Y2*92~5@OL0`5@r{1Qi&ZR4T*8#!xC;9I*WUA~bd< zvvcQ-jqu~pjysfgEf~cuul;s5w)BNN)l!(oYzKRr6kBZ5nmlQCa?*f*)V&RvFCfst zAo))0D{U$hXrO@^L|nf_Uwq0v7U&l`H-=2!;3n(bav6WO5z*=epHETbVF%U96j8Lj z`XDOED=4&G|MfDZ<8pjAC#vCmlrpd{z(}(=7sTC7N0B)p{me(|J{@9c4Bw}?NSawD z`rss#O{ilaszWnt`er)rBu#8S$`gFXMN60u(ZJgM1)`5=7*2v`UBnn#V)6sJff1^k%F-qU2%Fk4BK_~()ZL@0|x$)Yh^|1e198;=gcG~bWA*Vn^)zI8)=$2Yj3Y_ zXH*|zi)n-K1Wo1ZxvzcsSdSmn*=(}4jSw6yy1qe^Q}|sfmYH`O*_zUk=!NOupuw?o zvlXioNN|Ln@AXq84j5|Qy9g~RkBCTv3-1*Y79GUP2Q^~lt0HbJXa$GWX*V2oKUBr} zYB1MnEbWW#*t+qKZUkySKl_QDp$JpBwfUY70oRgpYM}tYlWw*C@Ob0MKg|@R^1Ya} z@i~giD(wbs9~^CgB1v2RDA696W_se2Ov>YPakZxKN6) z2N39mxe}~$@+|0yV~88TqZbXq(~9u%!+f9{vG*2oTkr*HR3!v5OMY3|xd))1l%F4va9s1N=UO|VEoWyv? z$(p3EHCR`Re7-HqEPzN-TAe@fcx^p`(4VQT5uHX{J9{|bY~qLiJY~Kq2g?y#+f2NZ zm*2lk9L}GAgIr)I-Xrht1OdT;opxK$Kz;Ih0uy8WI~hR6wI1ebA%SuP{M*T&!kl~) zxeXPOI@~6bGaqrs{q1;#scQ;-vUw>dA4!UU#gDzasnFdM@S7WHNZ{9hmGbm{VbaaB ze$~|UVJU(VUo%I0o2G+uFo%x+R?-qb%7U7TC|LyJbpiq#-vkh8)3KCw$sF-RfqV)S zq=H^y(oH2()0kZnM`?Dq8b`}LUdc!L#)L3{gufAyut6_Wc&~5h5}RiiZJS3;^PSaOIig4g61*sng--@v_4V3jbI4f3@k-zWi(7%#-!M}a(kDJdTo(7?#eRUh z@TItdBM2GQ^fW>lPD9Jav^IR=i}dt@-@bQ>7lxp1K6ynhOL}oQOV7YY0h%4DqkB+) zUqRM@_#Y;E^)MU~_8hxo*^+aj2OT9{xg8#;!`lL67Ls-#88XMuU@r#*ZdC{Kr3ql* z1oBwEW~5N?kNH7dPsuz70@g(s(7|2uo4;6llJ%{dtc^ylBfxbDV-7kx6N6d%%X2uR zd_^vwL#~43?jS4{VEf4sW4&EPRdon-sU`*)S!ru)n_{mW^?n@2&44lLn1}-d&oday zjgyjD`0{w0Q%50EvfV;+2FWtUZWA9dVhm?87R=>s#G)V#5HJOIsny0w&M3Y8l<-u=_1VQzs(=GwZOUR2< z@u-THeye>{x>OZ$?!3PfN8*KB3%IDPkZf->Z>aTG@&~_5#Gs(K>Xm|GoDzB~ZY0xTi<9bw! znMel?=fC*G4kXA|A6b(3-MfjN$(UFGE^mV>s)gaFw{PFZZ9*}^gW1Kvo$CnOjeP!Y z8LUq8UVP@mhYz87y256H0IHmb+1?jdt}}XhYMmr!57*#1Vnb>7fWxr0Tt2U<%bGDj zq19~sji͌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 z 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
MX8j=kmPimUK zT6ypakqJ#%%xPHnX3DfwmCUP5U&ll03~hd896oyq|4QT%4(|4lRqq%7j`f7|``_%) z#amDf-A)NiRDvRBam`v>l6ASUj#x%>KEyh*D=Lufl~_t0pJ<-hzYH!$x&0h##2>ae zH-IWQ1hPeJ11hxCk7zXt0z=|)fc$mAo^^aEoN|aZB#>NUN_L+ZA&ZT!BLERHCA#o> zObMdC(rVn>Cm!>GV-cu?30GFN%4X|9Vq!Dx1!lxS+YJansa%h2-@6NtY*GBJEu!@g zWOKyHCcwJxwgLEGmt!S1!Ettx41v4|(f=Qv9VPMt_Ma9JwNAXL%r9T6KIo6ap8Nx5 zCRM)q%gsU>TMPoGBooN8>H2a+6i|gOR^?*`@5qLN0?fZ$HINm}T2-R*(RqH;bjS^F zj6gOOTtN12k=SI&Y$Oa5UM*OD7xKD)X2`G(SiFHKyi(}c0^Fji!uXO6Xz7cwPdEBXd zQL7MF>!c#*^zZt!4?LP{PlWPviJ9m`4EqO(5vi@8#NlSH(GtT*B&%~KV!4k~+; z9ZEmj0UH>*whLaJ-(?);9Jin}BtwwFGs;#cW4htWV)9^sk3bjYR#%~UzQzs?^}iW0 zcrN%_ulfRYX_${-tT}uFlul)2W--;hpLGs=7_{BcNNRnzXjq!S8;PY|k#T6f;cTfF=~|5Ub| literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/desktop-home.png b/packages/moss-agent/test/visual/baseline/desktop-home.png new file mode 100644 index 0000000000000000000000000000000000000000..ca661799fcd7732e97d529e215885f5c2220f141 GIT binary patch literal 87081 zcmce;WmJ@J6fZi8fFfW}QVJ?vN_TfC-H6iNA&nxP(j7yCfYP9ZC{luSm(q=Nb2jS# z+`H~QXWjeZt~(!GIO5E_&-*-k|7uU5{1XW*3?d8!0)ZtZDXNG-pr#`bD2-Py!!xq; zQs)T7O@x%Fkn+pq)d^H>+_AgpnC}49^~h;m*VfmI3!m+dOk6xj)!$6K4#jx= z+QGR_fQLIwhGF$`@Jao>srnHXW4*Y!(glu%WCd(2EIkCOxV*e~b~YXgybD4y*xx^? zrUn(o+g8O7^Y2dxvMG_q|DHa)dl~!R)2;hAZT|fzSnu!s=cVB9TYOhY z{yiPBK|cNOM{oBVm(c(HJnQ!V{L;~c7r%Vs_-kgSsYw`_nR)y6uY^@KZn7KnUhge?L1jbB;J!6scLdxP-*^lv z@8d_0Vhy4K0=gq2(vvw8E(;e=Zd)XWXnPP{n%>B{NksG&ff16Pj*yX|Lqi}o_qX=< zGbB7bL}H`zPG!R>DSZ=2lK;G?izhGPHJ6vw2}xRy5Uu`?&@V2oamuGSwoLmPZncPw zzsyrnQEHJ|avrO-mejt(7nGuq@X}WMWuN7Fsq98@#D91@2jh;r>E0r zXALNQ^YZfEzkfvO+ua>8Jgg3%p@xp1pOKlFcjz)I_f66;?Dk$R!rJ062a(FzWxgLf z2D1x&)c%VdFKldV^z<%Ax$Sg5;?*v&_CwU5+1nrt5`4a_>9=5q6LaKi*KBEDL&cB? zziVe_H=U|lplsM0;WaS8R;|(!elJ6=TE%f?aAV9FQT55FGbsF?KnM|=-*Rr1vFCZF zI9A`#kZ!5L+!z1-{k1WjGNYo;KK=@ZqXu2csA56!{=UBJ!ynfAa>K_di!>|Nx-)PX z4vx;^d7LTL;Er)x3`@#%+%D&JT9vflMk?ieuXb2!%9dHMv^2*iXoedLpiPvHt3t%8C=zFLXU{(4GK(}-5e7fjcJ*cb1eelVTra z`O+NkZ{#!#M*GN%i+JI(v9i{v;M&XM3ZK7w*UpSUv=a98DD1QZ{JBNZZ7prMH{r-E z#6`7{?k*23+{ZjJ66?^$hr=m7RbukFr{`6P%kN(&0p(``U|zT_;YfrmUQ09S<8DuNWyOsx{JMSET9WaG8GYdOSXZ4Oj3Y3CYs$vs1T| zxGLQixhM9A9dSRRt-6EFrs_q0HW?iqpnb-2+fD6-843QE*Jym=i%t5RT_r1s8aqTKX4cVTt) zln#f_>&sP^W1>A@s%@j9W0cO!Z{px|ih60o!Kt(u(R_K?a++gTOGE_WJIL2;1m`vB;Hk6R-w~f z|LBQMZPw0>EKL4B5#@LBc0$vK+s3$b`g83nqEyoo;SQ+Yy;zjXC7(r4 zX%0G=sv!%Xp;F+T)mXvm|fT5=pqUXNaKR@g9#dyb%@<@Tj(cgp`!#lW6ke zqq+X>Ze&N-=x8k_*;MZkM|uD`FK=?>Sn#LZ;-=8V{7X{n%DAg-<+JBTese-l{_o0ELJX1Hl<87)Zbe@yeHtv`O@az zDVEiEwZ;cM0qZDnW66@{!Ai;$aSMypV1gfc5d}Rn{x>$hG&MOmI);YIEz+E(%$MGE zr8@||?Qq8Dwui?M&jKszeYvr7O&_+rhjXpd8ZC|(ruL7pv9@>=cHU_Nt&nJnOmFdi2mFm5k@lq zB!tMSA48uIY3Rv&|rLqcEoJF#pSU0coQ$LTGe;Y_4HIfy)?D5 z61&EMdHs5ZrH>Dasa6}u!=`5{JICU2oi%fh^}pF=cC^lSCM^#Zbs+2-Cq6#Gy@E?? zp!v}$~*95 zv!U+ptJv6kn>GvcXSic!n*oL$vCg(GrY0tm3c_>kF*M%Yy}k2DtfMa)#o8`GkJv5L zm2zZjw5qIZ{O79}6p*+S*Ey_5ry9Jfo}{ET;6j%W@efn~^pfAQ;`wJqK0dyC_cl^^ zsw&L}RQo-8!p{nRyWQ-RhWV&bE-{MVV4m6f$q z%jJFzZ2|0~l`bs7(4e3K%?hFmNO&;D#hIlYhGcRK3c}clVS4!R&FeroHaG6^XCaZ_ zb)G3I9!=b*(?!8c2`HD3e}jnxUx?s%tp&yX1>Ygr+DqH(m>}QC{S6ToSs%?GwXjyO}z-fBsEoc z>4u1d1MVCy8~_%h?+NUdgAwFk5*E*BOxHC6h>t$Y6)M!&wLcj0@DVxA2$@+M<5=iQ z2@44^87h9jfg2SmQ7pVNxVC6L09W^h!-hfiJJNZ>Q@Iq%`%&4#!h(!f9d$>Fgva`fDFS?@x@8gF_f{{V_`!PU)Vu#)>T5|%96gaA?(XisPSDlc@X`4< z@deHBqWak#86ST~O)XB?7eg+A*|Ik)9|axTh$e+oky7;fwQEjJPNP-UH?r?SOP^++ zt2FCQC)a7&-P+>yI5Jp1_4oJhbEG%hVm0k8f0|a`qyh_`U;WvdM2+=HePWwrf34M+XYk)Z69Fy^cI(7NpdA7MD{J5(rTutT8e&gk&)uKkmVm zjb_l2dir#f%TYwcN5I{tqCC1BCEz`}#P)orTCuj!b*Oo8wP?CwcS*=7si_-#dxPdM zF|J-lLD|{GdP91TGcYjl^XJcKXlUakgk1i}p!e_P_4T7d{H=^ae%*0&bhHYPV}D3R z)fYU_+k3m~GjN)k#xGww$H!mK6>m)O^_`3*Qc)=hwhp+ZGCiS`v0L~~GoN1mx}GFw zJ%`--wU1AKf9ZMWO)?Itv5wZMbM#XQ(IW?+Y)o>Nbe+TFV_Z7b`-NkpV`D#(IO2$u zIjn|rHGa-@sPQZsV{c(yxu%1k%k(@{YDW50*g7QH*owTe;RpbvY z%_=K6yBo|3RCJp4_ARfn$9-y3%eFVh6gj!M!w6Yoy_V@qJ&v7tK5FhvwbQ8;+s#=| ze$uFO4NXazSRN=;BA9=&f(sub{kgQPY)DYhFY8r`jI69I*ayc42j!MyVRIpG-n_|u znl?N#V8pz&`SX;B%?!i%*)*T)PWQJQ*X81Lu9m5(^P}CB;^Jb!@32wR3tg8`vAFy_ z1N6UzEJ2x)lnfZAt@S*d>xhGs4Tb-jB%aM1fB%H|)|X`XYmYcN1-HC2wQKAqCntCA z)px{|Z2B^2RZgRX&CbrcY|pdwc-@1KAnt`!E!M^(B;+#gB5^xj2@9jq{{bJT+UBS5 zD2mu!T!So)R=5}h8M-{L?Q~;3a4-f2IoH+xd>Md^x2=v>NBW?h0SY?#)x4c8t)Y@9 z|Ef(>TYD8+jo}>|?Rxio=@>I2B2)Jp4X(ST6^_~3*Ey{wKXJKi864?-SDb7!#=yXE z+gr`2XtJB|zj2S-X_Z=)(|-Ote2hm3L>pX}sDuPQ)3e03=;Gq~s(rP#6{TNeAN2j% z%m)>bx5TWUQT?X{5D~R2&d-?SplDji?rBGBbgU$5`8bO)C=c`(P6F~Z+#`|4hu_}YLVu(2Kl+;8$e4o9@1$>&#SzKHs=CFeL!@64lgpt*9 zGfk`z>@@-FMi*&t&yeEG*7v6?Sv&tQ`^|cRrZ* zQGzl-hGX27T%ee(nXi~_a=5+l)OxDka;TWEbGda?t4uIDuwm#hmnEbGWv^k zjwkDm-BD#^WUOB7uk#HK4(@PROx2%icLFAJb9IFdqyPE!Asi5HxVgX=>%I1$NK4D= zn7mL3xj3dL42wLyZy!jgKXW@Bb%cw{@0gfq06wKHCH1yglFf27`F6zS<|aTC6Y~{O zF)>p!Gi)N(*}XNbaxM>*%=dov{jlaAEJjLqP>;R_>eJFF4-5>f3=}?{1L^~XmK&Au z(xo%#BiRpXt3TCxoj)@%p|9wELlbwfwikOI=r+`vo0#A; zYKyLpFCM$*UDd%fAAENhMHT+wepAuA_MPPcs!kSTWRedz_he6RFZ-iM0paH^Hyn+P zsf>*!+D$OAu+VSZEy&Mrw!2=}NcA)|t4dWvqo#45A3-LvlO}W&UX+;$gav1@ftHy4 z9Sa+qEHZat<0q9^Fut6<-803_+wyDxSB+^??xpx<(Ibc9938h^$d1Dkwk zXn!biw%^ytCFVh<4HhL)$;ON7 zKA>?{ueR~*K{f;6Z16ng_By*Cgz_YX`}fvdFr13xqqFoYukMEomFTv#v?!>*_c$H| ze1cD_955E)_DV?T)p+X649;S3feHE9@xJx;JVVw-(8^GWWq+O&Kr(%OeWR}AXZ7x= z?ffRz01Awd7QdkHH}z%m`rbzz)t~Jawj{C@!pRp`>w-Ted01IkWIX1}3zImkzbCT! z*XMYipPd4KDaScdm0dz>X58^O=*@fYOraI#OC6^u+Y^^p;h2 z=KPUYV(GY@*K0kFRm~=ok_Zfusi+sUkm)n>64@(1Kk;bnPhRKs&+5=*`&r_~XzO}# zzI~%C_qU$<6ok(pKE(xRNg+p8qj-F3>PLV7>P$DGa>AaqrB0ymO@cTzu^?QU zXP-D3w(B_2ne5+$JB64#VptVCWGq$ws zL~LDa4_*@35*HVjl4^r{Ld@qH5~D&Gt8Zt9jjf|Iq1Q|=9ZN4|S@b|6OukXbiy!#H zK#A_TfCFW` zyFb79Z!i3CUKvb*BApdp-0O9E#8yX63ka;nJ~US}FwzGNYoyZhdWAJ8q#!Y9m79oB zJ#tulUtz9BOh~9i(w!yMr`H@LCU$yPQRonjz&3z_G@9pRe=5)8c#o2bYH4v1pLVBA zOLS$>(rJBMNLPNTgq@>N!=%w$NUPG~ljo_Kq@?8Ta^=o`oy&IYPN@6OCKm_F(NXTD zwEEZ6(YVz(k{$4wcdNd}zODBCiY4>5%nYyCEF(XO$L)U7->3=>Z9bL&y8YfJUC$ z;~6dhdQ9SV*@__dS<3hEc|Z{c<>-BBsb;N1ps%lQW~ROCM~{i%v*U!Vetx`nq>qHjXvfZG`y z0NATFwY9y>70Ci#XYNpTttM)1Gh~ZXFe`4wGU_BgGscqkq9y~z{5VR`l`4ut!-Lr6 z?c29N24!?Sw`QeYY?9ZYUdJE*8VL?hNJ0_n%5h1K746DWza@ zuhzJ{RM+{eQRv=tjEsX@BIn0b=O$GeL1{0m8L($#A}M5kcO)hzawS?tB%g+(o;t1$ z6ml@Ej#g}+9^U}nklDKd)z=w^Qr3Xx=g~>Oxrm6!!jCkykCiDEj=tm~Xkeizkux}~ zkH2NS`M5`xkd(Vzw|aBIfEBiJcCN$YP`4u>2pJ+ut^!=#-10SLWlDmA2w$4=FL1n- z+WK+@tk;}Qk9I*{Q6%R}<#iEWWrc<#8Drd;D5ZOF2Nn!bF?k&}Co2Q)_(C67YaRt` z+vwTZhes&V47E#r#`7O5Z5cDgt>GSi1P7$XexcN`W4>)n3|*y7K5WvSoGLykNlCLm z_vyW(+Ezu^o9G?~n;BJC_YJN4a^%WC8MNKjtasU_WVk`f?EsLh0yeU4!x?;{rKGX( z8vB|I>Kk`?(=o#D@{QIy(&2$Xs$7k?7F220o7DyoCEpVWG+<6~A-sFR;{aLAdT+!P zC`=1aDG)YJ(dD|@Jbd`oe&!*M)2ir_I7nWn&&b){G<<*m;tSM2DTQWe&%~?;eA>aq zey7J9-JnoAFZEU^=PLq$0ID{$Hs&0J`#3idR7Yz7dP{w|+S<>08l<8q`#9d89`9=e z*tp3nC@^YQUu`A#pmirR~LhIc2-#x2qZ*MpI^;PP?72Gh?H(_B`9kE4(f|E6Nb3t)&LuJN4sWd#1XvMIy2hc%47);ke^D0a>+kW}deRpRE^V+qH&Bzts zrU^-3;`aE@mQ|OwZq@EpI4s#|#&g-jGUDo2mjXp(13={-UQ+YFW*sLd$ zw{FGSq0Do#YtJ$=KNJEpVVl;Or0tBhlNLKrQ@1pvc-KDkKhzyEqlgKvU(hx4D`3 zY+|srb@3aPoAE-l09P=6_ICnD=oDjB){lFxY!H$xPS$-~8?68#Ng@31gy{`>!@c80 z#cb)_4T0&?V`u1x`O5jf+M=iqkKpj8#v#%94BX z#0WWApI=p=RaFeQ!g;I(q$J0Yu#MrFcwr&`Gk2kgU^4MRW z>eEO{Oze4pdhdaF*3Pw%P`N`KLo2J|tSr$6B4D&2qY=iGn++WOYK8)m_3#$J`GxtH z3$}G!U`r<~T7&5qMJ>+dxGW2`gW7wl%$NfwR3nAWe6QMe2G9<;Pdva>fw0;n{YY!D zX$~^Hj{m(xIX|+<66^0KXliOgLK7aJehXC`O0I8O|F^!rGLs&p>0}*s-KA!7a&mf) zrfbsGe4Bi)P4Sv3972n>!@sBhrv-r9=YxJDXCvxIDqrEVI&J|Kw0C#Oqs{@T+e zGeG0MzizOxRX`;b4{})Q6|<-sKUG?vYN&GFxO?Nq{^sT**X5OCeZaFV;peLXi_6O( zXBR=&0QPFb$EK|8nG*|ou6Bbb3Iiqy=k$u&jlb6`*56qvfYXWQdV1u@uXKmUiQYp2 z?89gSD(H+kEdXMmo-9EjpkJxBuLeo{S935B_8RyQF?4DGzM-K+D_`;lVkj%i8bt#F zgKAUzvuCLp85vKWgqiMbwZqo2GD;4=oRtedR8}@v-_FX;uJAfPYmX_k7_WXYTArUK z;I%wfb&q2PO@K}gO7_wRh0Jf`l=&^Wd4+{flQ{!R!%?r#d!3!Qv_)o@`vWQ{)~-Q9 zdqmP=DEps1D}GjIcCh(kC(aHiDPZ3QJvU!Uxx}!$rvjs2(uI5;{l1ppK-(YFQ z!^T%0cyyWoUA}+IsomL6pQv@T2Vzo_t}G3UnA2Y=9aDfgEBiP5(ZK*>DUhG}`T3Fh zK&h86Un(mrX9)W)TB}%CSlHM^!1>F*)5MLttx%Jo@uHmvnknw{yLYYT=W8YoPmY~` zu%1`WxBatggQMCalX(enVBma=OUGt(AT;f8|5Pt`!|mddWxJk>NPb-VQWqUMts@`?TVL=kBzk- z&fu@LQ;+_}^(iPRm4O}&L_JgY7>6oMfwl+maZkcQ z8n@%GhI8>AuUk+?m>m`$f!@^-$CQvnPz0F>ICoGvVq#)Us6d&_vaf#mTUcE^FD=b0 zic+qcCF}f6kAj7zIs8|rsd~Qtui5Ni5ubwN2!Kg5FG5OE^6EgoR#j?>j-`OW6ktdS zP?&2#K`R9F++o!CN9y6xZee63GCyAf6eM20hF)7798)Mp@>QXM&IYpuRJ~ZOWQe3)IuowtSItVS62-H@HZ6W-Xr0`|2a3O@h;xi z=L>231Ij1KUqzz`KDq73;)7+FH#+=bhK7ImlgkVkzCazaIQ5Tq68aCaS{nxjDs(<# z13$&tn@(SujkfKsu*G1ej(>TuDFnLG=QJ*spwCpHW8PW(`SaPwy&uGKW21xVpL_x-9RO8KfDI$Zh(sc3nA7Pd z$Fm)4AFj{LM9nJ{s8x9!ZZ(6bPMtK|;H6t(HbA}G-QRz*HD|vzdT#S&%)+8T>F#II z%n6XA8m-*`;RfN+U1Tr7_($5SS6W;{C4?=Q9tpmT0`jxs{9^?=-TJ1XlDlvcbDyLj z)gC5}JdEYBJfntU`FnR4Y&O7QxK&muxtbk_HyzwTUV#zsb+9N&YXd z#6^gpCd>pqQ`hWJ*r!YG^hV_&axGi|+Iz8AF`R6BxWpH${NjT%(h=_?lx*zs} zGI^Uqn%{LN&tk+bC@2VQyXiqqbzBbCkj3E-I1CM-FaQ9?4cK&6zWwBj2#wDsb!BBG zzhE28EMMQ~?ax=rg%gs(?@?;MPz;{& zMM7Y-;Q{$)QK5cU&h9gF2vWX5T`OTU3&B8%F>Dq>$IA*0~y4CqT4?IEn0oASXs+w z7YvwR8Y9xZBiN^(BVW4PBuKeFE<<8V>)PT1Hzx)VKy*XW`SkA z%e^xN7^<6prT=i@;CH4kMgn+Ttk$V^8<;98Dzq6hir*DJI+04tUa$z`v&9~fb|pY4 zUZjTSTXP+(to=0Hg#0HBseEqMA~7cYP|I9Nfn3)JBx zc1r-`R}8t`8*XradGki}18J|qZ5$kk2_2k@ii(<;o6Ee6B%_SmK!OzzLG{`P<^F>& zfK8U@-dN=7$Vvu;hlPa&1*I3x-L9mvU;lgP52G?RHVJcyYh0Kk8(1P6vAhvmOoThr z(+ZO0g~|8Fpk{4Nf3BPF)RKQ@t$nvC@HbT9(ny%WBUnf_exUvxA=4%hM~rI+Xj84M6YgShSp zUh@8z871TS_3Ibh@_6^m6ABs{4HcD`ODAiO+Ndwy1R)q3=$GB^lTZ z&kh#SYH=<5-)XD>)P=Wz12H){#Xuj_;I_X9?^aMi3kVl@A^0y)d?ghXktHR%fC>{# zFo)kh@Xs>>PJN*&yn83wLCWLA?Xvae_2upT{qT^GcWNb`U|PcQg61g)4r*W^A@i&* zC@Y#LPiW&xt6t zOYKZM_|*nVm%#!lV8VU z{!m&P6dKCsanuj#Fjh9UG(I<1IA;7FM`98Z8X7U#zKxBDBbSY-h9BeO$@ejhjTbQR zXv-}|md7}lVz;JVKZ3X@sAjo*U}i>o#!>gcM=nWCoy>$d4!?VMp2AF-@l$)A{olU> zgM&XhEZygWN(eH=4D5eT~ppkSc=%>Me-#0Sf?>V4@nCOTT(Ng>LAR2nE= zknEFwrBf*wue3Z4xgnPj9TkOgIZT_<5<@*lb_6uo zgQKGh(@jBPsXreFS5Y-zF-H1(XRsnd$Z>HARAsM$s$ckEJR);*ry9-?n#HO`qk%Xr zvGf|SPwX+|^1gn{;pQvI%j+(|$-ax5Lc;CfeU}EGM)B+Tk00R$wmi90-U(Q-O0uVG)yV*uLEv9PB35?{S>_OopI`!%CaOv{yOkHq_1d+A&WE zid6ej$l!OyKTc|kj*Q&eSt{$*>bOU=6OSR~Ue9`$02CL#s3&BIoDt z8asA_b14=BwrfFJ%kjX60^oVk-m7C(#?y_TajkaO#=-UCR7d8yc#utu4~3TJOm`hBr}tr(UDqvIkGZ01S7Mv<)mPV-ceQXW=?F_GGnf-v@n( zsX8|SAYTA<0POfPlJ76|eT3MSEXL05MdTL9Z?bZoZ+v;2t)BjAWp}x@yubh{R4Yjj z9{l<9r^6w{x7KC3%eBnVx)Rx(AyVKlqN$`5jKQQ+JH5Po8~+#F{~0Oi4>C>Er$Nxw)m88IgfS&FXB!K+THPyt*3K z-FEN{rC4Hw?CfrHOncwCb4O985{|yF)!5NM z*-_5#1+;e*g2jmPxf`ho)66uwQzue>cSwv8?C9sD zaG3SK94LrUHXbS_H8We@UExUA@7Wjw?zf2Y_3s(6O9>CJijBpOv$CNcO*ctbq*wvG z$<4*p_kaS|ak)R0)AlwV{1s3Sdsj`pGDS5L{$06oREZ})xXABz~Td&vF&d#Je{Z<7!=!+1IkfeY@ zdc3pLS8mEe)0|GZkf(4?r(N9&7Cbd31{T(>=1XW+R`)d8uilae>I2Bee6GiWloY=0djyg1gO(pU2z#^ToxC z(YOZ(2iSIJjAfyxiwKLD3Z709E`x|*>9RZjdGtpq)=!PRjLlvx*7 zSG%O`OlsGi#V14SAf3>B>R63`e7?QCU8vFl>i1-EF^#inzHS3QA6!<*=-ButVj!SK zy;2+XmC=-(TwLoDACr*&)zzGoN<+muraj2)SFgzT!zXJYr*eTqo)`@j%t6|N%WaRo z?i(;|K&2Sr&wx|9?o*rJTrZMMC@oYiIygDB_r<`237O-CdxYa^zLx{CWe9A~vF|-u za_)l(1+d8M1ukQs?j*6AR=)iG8mO|}1c&5U<(l3?E zbiU6uDSpf*ZqxNE%)bB4$DOgawMhXY`cPSEB>$Xj`p+vPycR=+6(%u}$hn37-+yIo%jp3=f=57*TUcmqkd=*$ zM92BjI7JJCW3;r)F#iP5xScEQ&#M}U2?>#NaV5;rY1FD+7xaAS`d5ueR=Z&iwi18bJ*WWKv8!9_Eo>Ln>qefg5UTlk{S>lI}=l{vf7wx%eR7ytzOV zk&$W4*xXvR%$@M6iXLB=>}rdP`B7RKc3gr(Lk<7Do{Jpd@`jy2d1dAHaGfWJQt1Nk z2mJic00Lc_#XtJglN`#FZ=qwdi6?KvhdD{4v?AnS{pD! z{*gp7k(ygJ?nkpmmO3xK$Df0*^rfqKK1&KGj$Xq+Unw*-jF`i(&>pxHxDjC3rCrP? zH2V?|Febwck#I16XQ5gZA*+cXOcLOArSP;24*Fr34uGS1=Y)Z}b#b5&{S*hkw+~oL z4x#&>1qSWZ&N@I^Q86;OW94w0;KG|77}$mRK9~uE#__4DY9HzZeDopkyVOdwVE}Mr z+Q#_8{BC=Vy4?~&c)ZjX2Vjhclk-Br>g(HXe07SBO>%NF0+MJ9s600?F%34=!0v(2 z0jVLO`!}KMJN-}I{9STH*3*Q!SaK0RfL5&5lkRYFb*{VYEOZundct!6ZM=^6uoyx} zxTHbh7xMAzOsWEBs5hEMiGiLTuCXvTR}G9NX;xf3JQy6wn~!BkLb-gIh~45~F4!N| z+oz!!(xEl-J{_FZ4n7!voJTm$es(435*LPtf}C8;U2wCXgiA{c%;0%>odauEs{PCd zql^W)xl}UOm@7wzm37OE9LtR4VEFG0U?t>{0Ef`f70Sjxs#h%{$`n8KPvAUb#x=G% z<&3cUyR_c3c1+XqiqiY)5T$~#DIHPKEBiaYXIelbwY9Z{xM&i%g&lE>u+-QX7;u}6 zpFbyKSe^1}Y@XW%c^I%ZhzfFOUIdIYg0=tFD>5p0>?^xzZ}eTYBF)1Y{~r+9Wzwzh zPZtuw5QVN%`tmmt($v6VfGtA8tmWG`?0fvH)1OhGcEGe|pDIYDm}lI$mShwEwm{q5 zHxiPDoHqHJ48an#xGK?%I`F;>(6B+rOpA?$IR+7!juD%KWlG?(_bV#GQYqAJxD*3* z0vvG@DDR+W8zNo!pqqF6d(rgge-$p28{(kr;5 zhWPm%N(2D25|ffH#)1AkZq>y5{6#BpbBX>>GsaQ0a1Rv2!o&3uHNO1TdP?R0{>LL4 z6l^@an7lkmv{3%s$*lF92}zK;y!{@pOX_C6hw;>aSMYD ziM;=%NmyA$Whv_0zhCdYpEP;qpp!D1*3(0S)${f16*RI3;5EWUgAj8k;SZnyaWFz7 z^X+I_Vxr0Gf6oZsjc~&LZ%Esl_y6n3?EfS+#Q%2ao2HB&#Gh-|t_6jJNJ1Z!3@}Ex z2&t&Z$;fEwLPSvRB69~1!B=q=-e0DsICy#c`^zPJkQA(}tb~Gh1H-~Fu3bAhn^2OF z`0@2?^uOQ!91Cj9qi$Uxp$}#QnwVrI3iaaW7zB)aa~%@a)+P7Ff*>As@t|&enBsHs zx?Bk{^csGbT5*nK3knMQ7NY*VQft+pdFyEdGmT4v*b#Z?5{in7FJDq0S$Vr7LuTOB zxVdYWmx=y@4kmz4pcW_N!?^+(*YWo+RJUXE9fz533_Ex5@qr%~1NF3xfqWpu1>JtC z!Vv@I2qt5dK%(=VBN+`$OM?NvZ9q4J86s3@2-CND=>BPG;rXVw(8x*_w+V0G{!2l( zzW?wfgmawU0&c?9A<(Pd^oGJ^!Jv(@nAjX7+87xbPgKF-)zXMLJUbnO3^U5*lfx~b zN$e)w5od*3yq5oI0jKT30I7Svfn5B?>k_KVj>Y$;y=MX$3R7#-7`M@za{tmFqIA6Stl zwF2^?%o61WRV70+;m*N~{|#LT{l9`52JS@ICGRVxPD$#2UIZce6#O6y^C{h>z+dhB{v8~?I|xY_wg2-X-WD*I zBP$_6#moB%vTrc;JcB`#L9JD}3b7t`>q$`O5>5adB`{w8G57QaOM@4vu(o1}t zf7j2>M-u}F4Z$UX{Fv7WDuQasGZ^zk|5xM?TU6*M*w)rC@#pM*yccSyU|?Vnc)NLN zs@Bo`unDlb!ZlPZdL~c}4f}FJ@7}%p52PSwpJJnttgo*Fe>*$crRyjLzVQ1{(vCR_ zuU#63@7w;qJ!0CLd_zPTPENZ)=hzsPhIs6``rsCkx(O1%fR0%^Wm6hy+gLsgzxI;wb3Iy68du?s4q)$^#jX*P%#~EAA zr8Pnb9zAf{u{70aPsau|Q|6*g&d--^0}d_DSL8%a{GINfnWzwzMF8 z5VL*qm4K-!a!a?9gU4vS@cjaPpw7bi`#EhhHZ>IvbylYu1ge61v0O>G z?4omWC{gm^*zPY6?9X*9U}IMW67+1x8VS^L=t)+$P;n%6U6}YLC^_R1W zcNQ04N>~tGObT8+9&dRP;PpaA0zw5_PiY+9S60@8ECAf%%a<&OoY(lQd{U#Q}Rj?4-XI5i?xTK*vW|^B}PwQ-$#fO&UMgaKFnj_vz{Es zql+Z~Q)A}i`1?zeXDN8-_;f}+=|T?-4e_+b5<&3X z#6!cpqi1Gzbb8D|MfG2ijHq|NX+up%_alKNPD}OXNV%yDXe$ff6HYf8MDll!e+Zo0 zn2%L$2!?A*gt+c5_hrV$#zGe81L@vkPgFaMW$8oMaJKbr`FNFen(y_6vC*6mgA8x5 z<7T=ue4z9?*x8Y=7`=P->JrQkxWa7%J8SvZmf6oHRLrctEGZV(LP&@XS8aI1c7#jY zX^WEZK|3WTA(>rY?-IS%3NxkQ_)pUKe=qj@jh2E>jt$=+lOAFYQ*d4fo3%!rNA$s; z>gph81{cr=nBqMNe4hppDXFEA(YI1Ya3CK&>K-1Jl#)t_1xO($ivgwi8XcJW6RoY1 zU>OLlyB=<#a>$Fx$hhq;@9yoX{Yd6gDL46`Q8sV*9$MQI!wyY*1!Xh<=l@rK_zq%L zgzJtCV)kPG4jyEDhc`Hdg@qUG-hKG+7{y!Q=d;|4=Mf0z`HhWpm~`^+IE4)YJK?bg ze6LMBi!ruyi;w+67i9D6-S({-y)QXjjm^cUSKkCTR+H0iHUMTyI`HlRnP#^nVgM5< z8>kgwe->{Z&||1ShV9WB_3m6g4FvzS?U8iVoslwQ*mHPy?z9qAT1~jle@_^x&dutE z1ere;@i&3p&CPf|H+Ba35WCH3q1cNU+SDf(kqbeIz6ypl?a?n9!Z)_1chs0jRIz6F zN9YuiDF49@%!dyjo*Zv9fNz3B*I+k?!S)`=9N^IQ(iPx&FzRpg%lQsoG--OS9)a8e%pn>S(f%*nJDE7s2c^S$vVh#9uS*92UL(&`HJ zE9aB|fr0(sEA(RAxG_~~c)f}j0vWGR(Cs?FOoikagL2-@eHiyJJwH3Wa7+x%%~!yb zh3~}>hDkPL1Pm%FX291jh>Cs%5DUgFpjK{}5cvA_E9m=nNfFRmVBau;h&%bo1r`=S z0Hi*Rk&o#?J_Kzt0hnc(QD;aq#&q$DTArNPz#^Ul=BNHtp;k6X(%uDY%# zn9pwZYDy}MwXVH4>P*!0zi{Y4Z1(X1okIfVuHasP(%|*8j`?TFf1F8B6Pn`!KDEZ; zP{}=A2*`fRB?cE+9jw5H<+rVH3v!;OJ+X8v-bbH8hd4;Y7OLi*$9h)?RBWi1;Hwyb z0L^01tUgD6eI<-l-vwI5p<%lO3~*IX*u~U{^qtX&K1Zqxt#$*cyVwhLu5A0!VU8lR z7lUNBFI`=?T97H-!Fo%Q+hUdkKUXX!KPBj4V=yoBF2yJ!zQ&y2tbvI|R94&_`D=#U zpdtJkP>d&aWFZlP2O-V#i#Lj&KmE1Njl z`<>3mSfaggUZQ9{7)#PrhpFU*{`iGhChh9{<>kv@MFfUNKFUh(noYV4nroyl2GE0k`H8gs)Whe)yRuGPW!KwFX=L1oCx-SFf|aqp@6%14h1s-;bGfCBmOn;#ll0W&Za|6whOOm`ixZvSYl zVjKJ!56E0kne8x9?0t@6?0p4;Lal!jj+wa9CpJynRa9O;)31wIAwiLM4+{#=L*<>p zgP&#b$sAH+&@bjzAPYeyg^=|1Xo&T(|RcR;}LnzI|Hik(kyj#1Lk(;t2kee|Xm zwLnT_Ow5D^8bVQ(_NW7lj0P8*nrX@@Dw_NH)vDIx*wzzrK4<iQjf3am1j z$tg!ImLT*7iw1eX9l0wXo6bQn+5(!9~v7em~ zJU8|-2HSVx6|XDO`O2@PJwNX}3cl&==axvQV!-`uS7Mg|qkN3e;`^CL}3KJ&g5Yrll|O488KKwK#*_6Tg2X{9{_3ESDJMD;A4)ug_& zx3-#`@%a6ms=DP(+FYJiq1KO3E?`YVZs~zmghpv`cKEin3d0G|V=I)q-;10Z;3@ZQ zG*NcB_w;EX+#gUM?PFkgkE_=DZH%rJ-E0PoFL!ra%ej6KjUtC1Uwzvy*oD*ct%m#f0p(eu}ku;leL0ZCKA2VK`ZwCD_4!eOZ%vMlnCyqnVwx-9a60 zfynS;o+C#NGSEgvM&>4S?T9q>HN8Mm29QXWg~wD(-K6o;N`f$4pEN#qT6VYJ!_S?fl0I%en;l(w8xe zKhO8eEF%7mr(!?LXPA2?DnkH$B6%(P6QgVaeX8GH{&o5nmtO7DhsFouVsKb1R7a2A z17o&`gcg4dL6`<9*FKzN+Db&DR=HL zv9hw#jI+|xVks(Hf7+kd(h3|AgUwxZ`g2FS@*Tvg&W45dH z1&2h+H33yaR?6sT&cG8I*%$(@rlN9-L!6me_QC}U(%?g^cdq?qnuOU(gE>=V1J`Qt zOB@{?0cGPs)*q2qQ%z0JiM{`xLUne0%|xU^Lzn*rE&o4?jr_j{C)r2-Ucmn& zO6UJ|*riTd+bQfcASAC|eTv|t#0-ddfa6_ngPc1P1th3%o4*%Q`E$Mg@D3t|V-hts zW``dJKYzb68?x&rLRC-&m)+xo%^(?r~S!^?A64#om5uNfB3Tj zcwJI#>_vO~@yTv$Q#bf!GyvHkDB@qTgNVkkGA)FYi_6r)BD#;l{B2*~UCTPEj-yxz zH*V_udo4t|!EJ@RA|fNzm6gZQ5uY2lZ=|pPxdU44iII_gjEp9=_svkZ@@xbAh&I?n zQR#WH`K#FP8n=!>SBIvr3(-!NR@P`}l~hz#kj`goJ9_TiUF=!>R*yx$zxufG1$;h` zJn$apoXzh1Bjs8fxc(9%7IdJuj#?DjJ|}@-Z}G>ep8@2ibLJHe7}^2W19S1hFi#CuEKZ^$;+M@^Z?5JN)1^Rp-^k60LJ^B*KUE zL;GROL!Aef5dOf&*n81_F^U#X&auve13qGOy!`hq<|RnWZiMgBMrgT)vEqOixdvke5O?1Z4<2yPk@Q zkyQ(tQ|;TvhNI(c{WJl(p?VdktwzIXbb8L9EljUTh2U=4_iS2@7(^^ikz(U}chk~%Czz|2(8{9>JqnL5A!)Wa z7jh#!q<|~yPEy?5u;%ggEAbsU0>HIzyAev0@JAO^a1xD-*hr@!i;O;H&@yy%j#Z(K z#E8#);K|wUSvX`oF8#L2rG)V8F0vjv0PI9%fsR1a6R!5#Jf7EMV`tyqBYRWzu+(?tneC1pSJ2rJIDX|~ zZuxOEru7Czl%QYx-n@Ztq2^(!gRP#{H&a9FW7w5zHcFd~brA6}nKn#ynQ9^CFa%*9pZ{^@kphqh^f z3?zSLIKA)fO`{yF^FG;INu6=H=70VYSk&4USPGu3ZZrCl$_`1cf<8vmdrpmA<;!0KAHL9AM1M9)gVhl!P<2T z!9>4)ogc)m!^gveSYpz}k-vXhTrxPQ9Hm`6!%hf$gZcCbaI?IVNRiD#P6))zc!_wQ zAPtMD@m5|Qrz|*ML0;a-ZNWbOp6=LlfMevnI^D1eF)|-Fx9Y%6&NPiX83r6T@FJ$A zrb4@Y4m&Qs>-)!s!?b}LYf}9DN$u9!c7D)+VEOQF@f6IMZj1Twk6!5 z#8%S>IdkDjR#tbu(n=gNqaD9~{o=%b92}`mclGXO!va)N!obM*XJLZu2moOr*~fKP z$oK9&L&QeB1(yUhYK4$*^x z^a?Z%&zz93FqqB!licZ%A)jWD#)I<$@+j&ZM3J@x@-?{8G?|kuFl6!U+~g4(w;-Zm zc~eswRw0`asP}=6YwH*p8s4~}zv=@&JeQ>8yWSs^5;aZ;!K&RO`8P!m3D)@oP=`gH zI&})Fxz9_E?m;muFi&XSI?_p`AWTTkBhP-eo0Rl^Rh1n)gNklGtYrueIedkvHMB~}5dLLgO=fQI`}({fFGp;}#soYk67OasMSt3W^w5*qof5@urSKM;IGR zx#oseQyP(?Sd($`Ikw$-HQUb^;dd)&pz?bDwi-64@%l^dymL+;su)b1+}zxp&92cc zE-p^T+eKqh^(w-(f%6C_G&mni?I@|cMh|m{1$K?ld;Q?+dv>sDARfZU=`5lYu!Pm9#q(bW@fWA(E(es%&g*6mH@*%YSw8 zyYxV*$xXV?pY3RAgDB&2c7~QZ+uQRG5#losiaNCh4f6_q{=Pok(NStp)P*gbElBZk zJhwgJiL+6>-^qj;F8?GcKRk~UWW1T#K~+MyDR8{Y%Uhe5>*gG~+D7yZd6u*~UFF1~y^Ev^y$$=phxc#3a8MEOBFLU3T1$O6hsO%jYQ}BbgK_s3 z1Q{7`1MoHn>HPwYXEQx1eXCv6R ziOW0W6~tS=2pmB>T@?4ZDdZ0j{Q&l({+Da}<Yu9fgPH5T%zI2O;JIhD zcV7I%x-G1#-cI-*6FSN$!VRkdAdJ(!a>%t2l&AD{4=Z-l_GgQlwW$t1VklOsf}V*l~jY=aXT(Xu9Iw)L7^ls-)v=t(a|>S4Qs$m`bMp#&Yt z5TJW18A<{Sw?OQU)ez1X8ESGp7_a}udYx~jrI|re>2&MSqYE?4a)?|+HvlWl252dO zMg(O%7G1gK?(gH{ZHXXvFL-TeBZ{l=%8k8P0(l3a7i6JK5le2 z0+Hk!7hLt1)I+CsrzYS&GvGu+U^5{(jQT^hYe%PAtEQG#KFO2BMC#v*5v_QvH7@TJ z>q71m`m0cHS6Hr{5paT?1UQwth6YlixDM@K`+%?N2R0QjhI%FAExQFTqT(*|>;$Ax zR=EwQTM#l)UNB%;KpgQ!gGYBaIeGrWf|DClPuNIX)8a7gdgeh()N0K$Oo&XXISwBM5&}leHFnj$ z41%~3hwTfUHN?mfAYWU8AG#bk@KCKMJe}YPMz1AcWAv68?TbOw7CaEnP1lG4YZm3( z05Kb?uKI~2Fu-OOwMqm`Y2%az6FhtjG&C(4dzg!nK=Qu;$H%U$`k2e%007V)CX?e5 zM)~Tf0kgCnqD~G4U1fN}Lo{tms)LP*DQQQHx0LJL=8S8TY@%lt*^oIg(E>d{Ka|3{ z^%=Q4XSunb;F$0tLr+(EUyXrmY;v*&Y$|pRL@>d~wwn(Ed8~hbFjWvK4~@{{!Hu5c zQO`N^;}`hzrlUYqy(N4{+?Jnx#n1$}hK^byKm){;r7iNJrhYVq>>BC^8`F2j(2(YL z(ss&GvtG(NrhKR@QSI5~UX?PsYZ$*qT=+YeC_jRQurW)ie9;RHSbW#oTG5}lZkEfs zi)fr4q$F~FKr#0=1BnhhPfbNtON?H@4Y*O51vW^kw*=ij?xx`BCvZHQ7M)@i5fMrD zDs4~lU>6XGE#(y7IAnmF#gVQVygWk`98Pb5%Ldee39W_si^po%b{+Y0S^e%V=utuA>QZQ_DP?MOb-Nv#@Q`~vv z_rgNu!-wG1(%+@hD_#iAb6j4t8z|PpD^(B%5@P;5N<%d71Q+GgP!1{$h1y6J=c@$? zKL{_`HnqK5MVq}=p|i4A;9M=+&vK@zSKEkIb`x(~_4lYg!+$5t9x8n9n!|ZRmyz=uxl0GTN zdlCh&bvz2@+{AE>4)70mA*;qKfY%s#vmO&@tM0;Av7=RHOIoTRKF&VeIz7s`w(*c& zpyw?qX&b^egz%;*%)*oaCRLPrm|695NGga3_ThiUmkK2Isc!b?b?Rh~5np=ZGEP>R z;Y-7SpAqQq>A7E1(}=PL+gu|uXYm5!tiUzEHj=V!T#Q`r>NR2|Ln5}r<6nI^S8DRd z<+(h6T+Pi*0H`QiSm#@PGNV-}RpI3}BH>W>BSb6on3I60$U{2)F;x=S_M@VsBX8c+ z(bCFxn3dz^ke_o-h}+lw>Hukw?%L0i?MB(9-iFrd>Sjtx1_lNeDk{IaMQn0e82C$% z?UJ^}Ck4B(kKliCs;3JWoxA(@(;`HffsTLPU`$J$!-?5U_H=H`_A z-@Xyc&)D=`8X7;yuX!w@OqkOC5I*49R-2%9!ni@A@{U`6IV(Lq1Plt_1JLhra#C}j zzsmvt<^KJ)PoI7Q&Q`1Ke*;XfR*hP36^<tn50X zeaL6j=qFCapsu#hfs@4?9mf3GMf08Pjm;sA*|I?CjtLkob_C+^GcrLN&R~ z-HD_eR9JG`|MvF+@%*f9RmNTc0Z%F`NfSTJibPo4{3hoAvod%@ft&fzp$TZBx!+&0 zJ><*U6G2!cm867461>)Wd^npFXcIbgE$O{hnVC;K*?Fa=+rHADb+fkZ!z7#$9jk;J zoJG6tva#YG@dW=}oyzS$cq^x>=e=1M)vj(&JQbk0y^)D!e^)*yxn$}Txkz9`-97~y zj=lID*GRV3V{D>_M^xyaeVWvjCyge4)3E%A+@mE;N*YztE&njF#U&3{#rAh0jh}Fo zW!ZV&fy$$J&yLvT%iI}@r+7ntCb@7$hoZbjeNK3D$AwCE6TlW7Cnh~joZ{wGWnx8K{F zEcrr^(z73E(a>8R;hUT}zXz*{oV=>C67Yg9k-dygT-hJhw@U&)r6j372mKzo9vMB_ zPvOO7yz z2?(4rT|nsufgt~3U;m&W9H@ARamFNiDj%f6U+j^SQubPx1xuUkH0+ zCVVzUiQ^|V_gmMl<&uXN@BT7!J$my>hJxfu@w>a^Ywebm8Fu48WF4>~Mg-Yz2P+vF z-E;1D+_iW1tkf5rHel(fj4@P906M`AX&_EPLGpM2Y;oU3Pb7@;@_(hFNp`rzpf9?CcMGruAW? z*IgDP`Q3SY5V!*TOPJO6=s^jnmKv}xfSJ)zopW}sfBYEvq6VTz)0%s7Hl-zpmKGMk zUz?%@0^;uh5e|AEWN!iBxG?uIWa;A4w`m00nf0>uS=< zmX`dk(6or%_1@f&mDWL@VPz!?7YuUGkkfsv*OCRQ(IU>kKVNVx-9)N5#J=v6*@#rosN9;9fXGFLA}<~BHgwh!~LECOM4?a8(U zW3&0Y@mN(iARjEp>k08#89)Y5ZZ;=z>hcQ*uI)7cIyR;qx#N3h`&}1c_40vhm%qM^ zK?vr{7cW#)3(48hm*l)cCUah#!}kwwXgn_a`btYlok|soEZ6P*g6dpdW7W5)0h4Hy z6cv%D#)CkDBs1jWsj8?5oPKhBd#p~@5DMTwzgb}tD}{a7Z;vOc7c8sUffA97*MN9^ z*buJwm7pvZp38{O2qeo*Wh2}6>T2|>o0d{aWRyCyS2n&JdphS)ZmAwB>}P&TD|b^T zzo<$p$n@5&Bx47pOMK|eN1+Hs5T8cB9*k_^h99 zhv?)SCR+5-Bh92yf6w4%vUt&Pj?O`<{rdyq0RXoKL1ePO6qa(|+qXd6+K@L6^WjrU zEdAK7YSiLGZ9a1!$CiJbL1;a;Cwt&HHLZ1KM;^YpGIqF4B=%uV`FzLV+;D8@DEGd}M;0{<6SWB=BiRG>RC#4<-dUE` zd(nkTCjzoI-&pG86B1G|H51(v(5}a0n^POwm2>9RDH@L+iR$auTQO!0q3F>Ump`kt zuNxqo96;7E5GT-lCD+o^S2s5#mOceVWJzDp_i<|q=)vyA#wl;HlCX>EuAS1UoezV_ zO!gR%8$QNTBouV8*i`Bqmmn5Jh_rK$isu`ytbV>3A)+V+ZhkI6{%;o#N+B954DC zLiq=1hk&w&FYFc(F~CMK`k}8tbMC{V{^!pd5E8evG{~Eez!^-1fZd90_ijl{{L4`+ zOp1htukY2X+cSjR5ET`|%Y)7EsrTgDG!fq4z9q(;;VdN{h{gt6i^GP1W&3qZVgdi0bzEdmnmT&RDCWR zTeO9WE(!a$^!@boCuK$x$ncJ6VH}o?*{i)G7|)O{a&`%ciJ{KBB@U)BCNt5}763Y{ z$enWqnrGO2fkZu~Z{LT*^yxi{es9?JVp^jq;;V^>A{}aaGp8?38@Jl{=>=*l1mAr6 zG`@1D!5J-c*|}dupDrnU5_5Oe>(AP8{BT9uDV7nwoqH6&?SJM=+Kab2k>FvO zzIAqXj=r_K;zXp?&4fFRjhpZQLDqKO#U4L9J7&%!+|r$14ioa_>Mbu`iR`g2*mY98=pZ2; zsZ{}XRxgOm?J*=0{QvBiFVOs_VZ+79J|ZcO-T~T#qCIxoPTsNMY0tV86{G2%=(1N& zeQxPc?Y%wtmhsT-^d3UJ14RVA*Lc#mPi*4ro_s;aZykq_;3dbMV*?5%S=Mxg2abG} zmE@{P};&^(3j+prcU zzb35=H{K~X?`X42=zTrv_y9i<$Ffyt3a5PU+MXcsiB~&r%5hwEHN3gV@5AG@%5s~> zd}2mof$s|gXanowavo@}v}+|$x0^qUzoh>eP^JeMRZ*ug$&IQT|erzmUxa)9lWufrmFIrlf%m(k?!QO(-w0t3XLUPr3 z!BDL>fAHEfSG#R&(UlT298wS2kEDItEk35d`tx2{*`3wcGt<5sT`DIHI__TPO+K@> ze&yF9xe>AK3CU^g!1y;_ZG5c(N<=)m9=A<{*T}Yd|Grxd`>E@Mx}d#6XyJ*4RVqr6 zcp$e=-h~!6+CMtG%kLU~x57o6EeD`4yRR^Et*BU8yT?^6E$@I6&CS&}7HBZD+!Sqp~FO&kQRw7J*>7M>A@9> ziB_dDWzT&^VB7&Bg%h{#+&S*}n#Z;cagyMvu6%BJfC!U1s{fs|ESgYHe2MO$?;2p^ zm>Ac|E-Q2bX6@u`v!L?{vCR(fT?Vd`U`xEUE!cjGfMk>Pk_}fhFpv=zzSedXWA2QM z#As=axaWj;NQk_2QHSt0XA@(xXqAhNjao0sdfx6lRBnrlU_+7O^y62_P*=G)@!Q|C zQYg5RG~lU+tVVH~B~w{6=7w+ZNBeupQKeh=*E7OlS(7t3FB1_FenF8&Gm zq9znC*x>ZZlzp;%9}(BptyZv6Ur(>U4`VVZ?R_!2OaY1vP0fgj2%Br=6~aWp zmiZMGtmyLh#|z(y%cVe_i&hj{y=?|&Dpgp^nrb-Sb9ZskB16zcol$0H=3*=D_F%59 zyfy{7!h81^>5|n>gyh(k2kxL7reV`HGgC1c44$aAH>3Euji^;`bIo9Gs7|ER_-GL^ zeM$<-YPbnM55iHKC36Yr*&s+T_;+~!U|wlnPR{7JZ!OAW``kZPo#owe8pD#}$O)Wa z@LCK<`2G7M!9?;H(CaWUwA_IS6SM~p0?60=L28})Yj(f0d$1cFQCv{uFPig1wdx)o z_w&Y>-Q0SSlZeVV(VCHkCGhK83RKqcmSII?M!MY=_FGH^2EEZPDZ2Wb)ydwz<$t)= z?C3jNX%q_E+uk$##7~D$8>tmp=FY^&kJ5Of$lIf|D=j+q)U>Pit2g~3$W*5;r@B(A z!+A%o@pwZpXJRO41G6J3@Eipo7|7A3)4GUP5}+9rNk)cT8Ra|}9tteOTAuawCvrBE zzl%Rhf8WR7hMJluwY4#q1Q`NznA-=?1t887mFRCfK=PN z^+2lhp36y{b)!f)6~}&i^~jOCi#mAj+hYOk`{ldR>hJ$TpYTn5%zXM@XWH@Y?1Z)` zAC^aKR~xt7CMmgRXzsxf)qh>pv2D9Fp$G_m%}Y3J;^;}u_`4-}TRV>{hDQ=NqyHvq z{cCj)PNp8Fu58em*7-8XV$WE~_5xocV%Qo59asMCqn{Ex{mZGs+Qk+HA)m)MKGDbA++ z&R&qt)gS99&40+K(`Rq`t%W&Fs5qJ*&-$tDtM%6N&yMM>2yT@9er{y{& zLDOe_ODxUp+8x5@3J3oM>)HEH(=r&UT{0rcfN(hB&{NKDb03+e@7;0|BsDAMe|LoO zxi`L@NO;SOz~-KxWo%!iNAf_;SeTOAAwACXaeTu!Lg}M$a4RM<&ZJUgoNG)w; z$=E@rv32%qLb2j1BgZ)$p*;Jx&;@(ts4ovhkDd>6dEL@f(b-FPrEpp`oHm~!i*Rwl zD=RBk)|RhsQ!p1&Mh(E$Z7->Dh*89I?W2&zn6>a>?Z@oezmaUck`fmuX$$ z@mnj>=NJ^WZ886BlWHPwibV~gHtwhzRx?EST#+!%^l4J?*-li4z_5++wlQ>m5<)`R zMd(Txeor8%O=;7~cIg`f^u~}AovF-5#Bza#kvSw00ieH-UvNO7DR}G9l2UtIa!8nz zjLYe9hs)BQriL>jcM}`TRBC^vl_lF{@7qDtdKBs6kl%l3@ZZ&80H2PfU;;wsZ=Ail zop|f$70zKZvcAqV)51RL>)EEDQQ-1q`-!`8&O}X>R}5%TOE=0*elG{BNj z5~65hm=odVcI-&jM%EOBE4nr|BjFTZNhl6}o1E0~CrlaB(mE*Vp$o1W^f>JiD(KG< zMMkhsDu==%KK-V2@A`%JNPxQs82IbQhLbNj?TE%PdWG<6P4pzuQGGi;7NFexZDO*F zNpafs*IBX1%3aQGqJL1;mpFgbJ9&+KSddE5Vp|Q9O8!30{!Qi&U7PCJ~*b#pIjb=AR5JQiO1~F zO441fLlf^l$rG79-$#q(ude2;l=QmPzP3)WuqOQ0IDgAV!DRP2s&6K-hrcKYZzu9? ze)le)(0NJ24Ci@>g=H3}ja}}hz?)*dpZ$kx7OM-43={u!(;r2gRt|CdL7t8g@d~5T zi^jjzF^`y6g0N0eWy5e>T6+F^6b@50bz2xKc?q7-LMybYP(`w0bQM}vxKLkUc-a{{ zOdFN^d)gMM3tNyRDrSm}dtbJrET>ciuM{*h=w4h{I6FSxDhp{3rb!FdIhgaD9ujWA zVWjyaVC9;{MNeM`TiX+4@BzaeW;qJU2iK>=>xV_*_lOjxhXMs+EW)@Upc9xc6jqvD zw)XI3WA5kf@EjziQET5s`&vC3r zsLQ!?UnVEiJdG#`%Y7StbG3Wr&m9+0`vQqY}$n|;o>NJ za}i(`?CgjS(sc3GU|KGxqnb_JIHIfDY?M8L_Z=dZJ)1w(ZlSuZb%nmQg_43TV(T1M zIBoxyf|IO9yRD5^?~oQnzK+BJqGz9!Ei5dW)14jZoZT{~<)-C7td%>NVYsULjof{K z4AUgzWXq}8_|-JhS+*r~5g)lNM?spVt)0$XrPQ`J%b7M=ii-e^#}WTMlhjG>Z6Ki% zQ!mQjW=-VS^$)&!@ggELRPC)2=l4{|n{bYYt7|2lzi%yJ8b4J`Wt?ro4AsiV69u6^ zc=18R6kAVsoXz?ZD+trvFx%&<#-)y9UzTh;(`grdKDU$6VW;%XIH6*YJ{Q1SGb|SdIL49nGyN=^N9u91^xcw{fEF1ye*poeO1ZeDH%FfZovE_Gv%&bOB_UorDyh*G7({HkIW zK-r#BWWjA~I42D$IJZffzeTMG;$k+Ab4)!&1)xiWVfLsNl6kJX$)!6$yp75eXI1;o zPInFJsR!<#wxKS+Ne9`nMto?^?@Q>WhIpvX&BN)WX&_Rt-u>%IHWdPxq`c|iwCV0W zQWXi@_x3+0<(4o1p1l_zzh4ugtc6!I!}Y9}%8W{r>*|9>V_&?%TqTN(!57h!W1j=} zGGbWDGVaWWnmNNdFQd_poFZ1aCq?6mR#q9v1lk^pwAIq$wPVLv8fMT88I~;gd(Uct zmwjLBX+Y3iO-zD#8d%|gdp zYeeXTUWHTK1}}vT+OseJfhC864zThASmp0qa#g%xBv58tzvC3Lan`{ICiXw*LNJ7a zhDVoZ^vjn*C@rt1_zPCN^Y$-O;WHIkCw_`1>5xI z@{b)20=?sF@;}q@T==b@US3~)^KCG#x0*2fV0H09O3LBJqZwSX#&;KgUdbMOQGvW0 zq{oP?kEvGJ?|qC-nTST~FB!+p`2B1YEs$hT9NH9tw$>!jXCeV*wO#htyazq)!T!87 zvr!CDL%wgQ_;J6*eI_|)yXCyU@Mp_j_V@o(Ke;%m&Z{e@c#O1Q5AF+A5EUKW%rzEX(Tl0TLfuKz5BbQq&bPHj#ZLDfeTT(%YX9XD1ROJ1e>=q`mkQ^-L1`d(SM zxz^inMWcei!KQw64ftvC{Ex8+Mu~DG0|OJ2!4ay6ckkZ8y^kD~#~!xcen-TqLf6y7 zLl&+f8sE#A_~=h&)o<+ z0D)pz>tTGEzx^am@dNUTsxAFLp*PM#oD4MsLlgbXS4L=-Rcnu4;s)^W#AkYKc36f^ zF!R+XO%($J!tjno9W$xhc}~4ou+IJ?Y8}j+RW|Qf_IC*!>KOUbIAR7-ucXKBqi`i} z^yckC$`=E6%#>i*m_zKsaO@eF_B=exDs7{t=Ao>-Tw-t-0w))@(@D{LLbbF=F}b}* zabbHh9!1g_Fa2`LL!@ zb%kuR8AOO$kx7AuSd`0hI^L{?%RiXbqpx4zH=AQrDqiKiafR>nkk_+d_M{IzX&9hu z3KZqov8(?)Ncyp}8MS=yH7$ZVZyU{l{}g!&=j@ck^M|xC0VX|NS|W`HQgB{i+18&% z1~11XwI_MP%c0Ajn6#XxubT@`^ru=bgKGn9WGh#l_`+`J@JULVYHCKG;_h#!Vx`%$ zi%6~G?~rZ8cZJpyDi8Zzj|v>(J=ca}u3ojB!C?3(Ztk#_Bk-c%FI(}oHs7eb+SKjA z)zF`!CqWvfr4#-23`gl!5GkqT7QW}pr>WQ0UB&UWH%ig`kDYMJy(&fV$*Z#jREwDD z%LxA0%KiRP@x#YOStttmaxLCemKD-g`Z1_U;A>maKnhC}Rxg`eIZW>P5$6+rFfL-N z>rpsmf7bk_%U-kioNp6kTi>rx{kH%(BJ65&*88lln4O9!{~`ZrlEgh*KlyB{-()-L z+bZeh+tOZPrcimTJlw(kxoG#6h6;MdEN$&I?NeP;}{?Fli?UyHowK%-&BDOAqP3$kU$@%q0NLw*y_%)lN&t!E( z(}d$}eEZhdD!KacwO6kCm4d(lx3b-WtJt?b`IsK3Wp%vr(;HF*JmBiW|Kd6O+h88% zx&Eat&Xp}b%Z@TFVn2SRLYG5@ED3Za|Focf8Be<7oH!YhEC(PNclXMcmOn1UUiQ$g zMicG`D=9CYaD`eNG(-toJHY2HtT7jvzlh{hcX27p$jHd$kY0B%=(1;$zx4V*$Inzw zO>bA&RU$TN=olEx?wN~eYaccHetZ&2QWR@_>iu&n%F3Y_A%k7Z>}~Jis~@lKj#t|c z<^k#O1fxlQI04WKJShI{(_Yq(yGTg%^E6%FWXMoDg{X5*3R5nLY|qZ%8+W`J%RfPh zE(NELA)HKC9=8~~zOTFo$sU7S1|wiVzon%muz|3rIKQu?mDL|bzBr`1v{Y0JV-Y$t z+C#&Q8nxa!I^Cdwz-o*OGe3BQav#(C+-L5gq49(r7*=$QDntrTChmfQBcb7brjz8R zt9j!@SL=ftW0SLK%e&*5q|BFA4X`uU*9X~}rJOf#*SaG)I#l;?XaTc2@YL4xm808U|WDw_2#OOB?kfV`LnVDYXgC##hW}tuzo5CEdTi< zBO{}(|M0?BadeUV7K%zrh{;L&_yKO7UArQ59}hc($r@$Ts^_D zxh_$O(Z&J-6|m1HJGx)@iM_2k{Swjl%RV7J5kZIf>Go1Z2*`|(NL0;>leCrqJZFiGGRPyFQPekt*T#h;Rxs8fB^=*<;nVsuAxWQ7WHooJ#lS^^8SSe zk4OGVG)_UvNGGnuP(tvH4_)B)E#c~W;u{S&IyciwK`9tP^Kr z3)YlqMfgBpSzbkj&I)mdF7k|~c~H~Z#)&K}#TJn|? zCJ(6K=6#TWSOpO?T_dB6V`o%fUhwg0={^a9F|$7gnr)x&AJTLrkO}ojAgICkr>X(=TiQMuG$CHc5_{15zG2K6jT>3n|QRmrF zp03oohKm25a2`t?v3zEECQP92g&#B!JQ^1j2?9sk_m zbjNIR_A%1B%`XE`tWoW>RfiGg#SBb0?>>AGHf!~H*@KcU`qwkUytPD=#jNygI|8#< zChlV;VdQ`V^4*Xu_tdfT1E7~5=OLVg3{IFJ77!u4K&|l*@w$F|@(9GQ-2_TJOfI*7 z@*M!v@3YYu#o#Z&G~nxhE@4vDk_pd! zhKNcpRn~jQeJ#i-Vq%%3+9xOnrimBHNyV89{h<}kl(<%>irgaOrCsLp!Y<+Cj=(14~aTqTna{5Ni z!tdWjnt9C$i>f8_p$5m$vbUmx5^l93u46r!zA#Ub(>gcv=DeF*7A_q2JJ#eu06TcO z)-jwEhC(!PDU<&3*fOGTEw8Rd-NK`fN#NX=2CoYj%)h_%QWU+QfVg5yQxp4`w%gEs zdOmgcB+@w;I@Y}KxeViBSt2&U0WGra?F(YvVE}a3blTGVByS6Kj6mtXyTWu&>wj2) zOd))Mlp>z^@KalV(am&GXAY#&wv8d@pL~YwRgnkcEAX-DP25ndj?o>Ia4SQm1Y0-F zVw}>pV>*GbA9Z!B1Bw?5+GrNt^w&p~Hrfy4p%AuhGs1bvb`#Mbg2oH;qalk&{;aMd zyXWNrP$?Cai^GjUDHaHrAr5&GPA4~Rja(U|f(!sEz_WVO7_=$+l}5mYJ79I?C-M}D z*v>EbcN{|{Q|5)lild^!!U=+&9v*6fk!rGXVcyeyFA(%oYf=HN9soR^; zFf*@1I1(I8bgrr=%nW{twi@^-QK^TpfJK3oU~0iVbCDG~vLB0U8t>yU(xk939CPbS zN=ig|cQkOgySu|13wX1@bNav;&4|V2Ty= zd|1v7(qCPddTx(l$fDeV#W5jqamN))Q`2{-Sg&2X=Huh_C+}3_7$P5_Wr6h%8GC63 zStge+FJtu~tp@crS){$CwYE0KVPIQmdHJCyNEW7%;4;EdA9pfI1C}yn$@!L#8<rQrfdB)! zFsDpEB0d%hXNMuu1;~rM#^;d(5Gr9gGEni!rYE}zI$L`2t4N>g_!K>gsi{xb5Wxcn z6pb6fB87CYD9zNJ#S_pTr4iC!_{?35BB>6+RnQAr{DVS*RRzzQr!ku@5UWoXxgV=5 zD>!!$Xdj`+b>c){Eb~9sje(tSDzK};gZ<(lA=3v+lTX;DLUU*xOyAsnA7}eK+`EQ% zBJk<-3nm=d-X68j`}E2!eWimQG{?p5Yxgv5m%Ns1C&C$k^g5hh&a+X%gwxHl1CO<6 z`iV})KE@x)?k2Dzz}~UeEq@_xKrV1iA&ZZ6I8^?;p9%!jm}p!xAHhgN0|?~MDzEN2 z1^L)#&$8pFXy(^K*es|^?{ax&dQZ{raRw?g}+ z>7`jW?o3k)JH9q8H-E{hb{BD1(cq>qLc^@qd({^TC7I6p=krsYMW5pc8N*J1zhePZqvVBzSld3=bVYb zL+t||aS$;TFnAzw#`~EjV7D~;p`jtzpOU5N*{}kO3a1gafxR!;@93jAlQPp&`xX5B z3&VNV&ksL_q~!L>&a)7(I~x}U+aQ+8E(|-6iIJFnTF!581X>r=B%g+j!vNDUd`6oO zjm8{D&ESP@Y2a7MRc(1>I&))Ei-jp>1FmBPCq@Rw3+8x4eUwgqd%g}cus5(gF9I`} zz$nn7}zMKc2{C(BxZI$jX-|C2Rl0Pv(ZC#SdE%74`S@fRKKlmUz3 zx}Og@6`-g|-8t0*|GKuw@Q7}Q>(VzfWOUh03^*dTiag6r6jKjAJo<`_JMhQnH+T;a zpuL>#)08G)jXKEib-)dBtNt(j6pzzE)bwrzVr~8alaEx+iBib%F~&!IS#e4uFq+Pp zoRW0+?y0x;&Zox&oon)Pm-&A7dHAn@$0z9L0b1cEhNK8u@$|x4e=w*A`$SY{T7ut9 zCq~M?t@yn*?) zhrtn(R~zZ+~ZE*77`RnM5H&evxzh{`AFh)bT!*LJ7a>(u@l3I zAN6J$o_>joBdE?uNWuryFbL>o$1*A$Dn=F^ik$Xa1_$*9R{iEjY||qO-*!PO)AZ&=Z|ke+2v}#{$D*jG*Zb^Qu)}qMKZB*eWrWg?o#7r#%c7>H?ysT8sv#puE~=`ZL~j zuMRx8(b?;W_PL4Jwt4w<=l;UIjN+EHZ(xxMmF1n%J|OBOq!}SJsJ6cU5X~ckv9;qM zz*474Y*IAF*+!IhBF&ABX+;>*%yX1BC$jW+ zUjXKUUq)K<;fb&2*SD@M7sYH8f({=(xlvO8$K(O&;#VR2R<=>8es|X2zF+kEL|s47 z*zPG10)|AJ3=A%Qo>&Nbs;X*yVL8OknZCqeMg;rjqC03H@0XjcXYUZxGpg&tT6Z- zI5PSLvnRC$m6cvl!@`tgRpTaW%Y63i4>@i?V{~#D97QE}^z@TujEN{ejnn2jW7eEhI#$~D?i1Efe{Qp+AqG%mc=5s((@J~u6k>x%)`*5l8StkI+5 zelE(utEq^Q-=U||&-U?&sn;ojo5MGXUgB9tn3{)PVTIY4?PB$%Iq9N0T6rn5NjO%W zjSWmTr6yaE54-&53R;#(_kLvE8}bjcAqmA!jE5&_2kkV=&APE<+Y7HXesQq>N`ud6R4= zb$uTw>9>PkE`~Ojh-1vksLa%Jy3c`OFlX;LBJ5s}P7gLAwg!5^BPQjFhZP!?eadh^ zkbaevl)S#4Ps#M|Z~#~c)=>jcSTJ#sN)*jUZ+`D!8_qV24b0%B)sPi{N0*pjquxcp zdE%@~-03>HGn(o=$4F|P#qhF0&tYeh*_|Q7C$163I+NgcSBDx%#M9cZ$(8>r8Tl4j|z z<7o5VK?<98LAZ2d)Svxj7B$I&Ic1on(_Zr1`TTjlm+q4hXvk`6YP9ASyN5;J!lhg7@+DCj+;pP)S?mSPfgH#d5|WV6dHAI@ zp3}^6iu#r_^8+24D{%;pwe^CgduhU54iT~j|KgKEP<9f&4#^5d5ivskX9!h(-wNjUXumCQZzXiS5^S<1& zGX4M^9`5<2B}ax_*3jze*mpYbd-a|$On>{vbulN?@@as2SxZMpbp7E|NL5<-XT99~ z(X|Q%*D-iV?^mt;>}Kt6L94Es{^whv_~rS1qXvFb*xL6cL*{dA4-b$1hATut8R}Pa zWoj4eHkcqx`maQZeW`mY0@Uo~33n9UCZXq{ zBFy+0*rIxj5K*qK;37`(RB*3gr%e7GN%lZN@{Okt1MH}1XUL(L zoVivZAus+<-2y_PpN;q7bPUs(9yG4@PSM~9u|E6Yf!^q-?ONsh$JhKBLTWBNJ-_GD z>^+=wQ8oTq0&0-d-HV%HPgxU5OcZw>M;}$S_>LVrJ~jBi`gI$bRg>cfzyGs&jJXim z4`K8YZts2`!ZQR^!#$W#=l^?>iyr0qnM#FwJ>+loOC8^qy)QXTHUe&rMas+6l;a-( zqT}cOP_P_VE;~sii1Z!dY$!sGy%f zFvPZWR+ImiP>iM0)oTwQ{zUe%{%_&9`SL{J6WW*PQ%romufKbc=X|j!CEWCUBN)R3 z*TWxEwf2gc!JKmF$-{35JqsMBHM+VveQBzvx1+=0^26Jht=KmiQGZlZS9hPpmQ;42&uKJ0;su6VJ`mT6EuWJG_r-$WMVLCe|WJiEWq8{2JVk51c9ntVU zsPcW9F9jtZ@~P{wZZ}^IfbFqLveNDITj;oNfpg0L?N41qYzGK=w7+P5qfH+w?&aSw-EaxSN$V7bd1*iA!w7mdRb_QQ*;!VvJkYE_P?C*` zO*KuVj0K+iU%HWoTZAH3YC9NNA16yc{|Zw*iP)DPq2Ov{g2#I>*hB8t*u+H5zMbH^ zm>_i`UsHg5KxpPZt5y&MjE9Ih(7PyJ{VT)!qm3d0z3)L<2?3AIV`Y4`P!SP0_XupK zq=fx0{Kr3uB7k6jH7B47YD2WE4N`hjz_wI6CJ`H#}*qs`n5`zTNkEEaLfl&6wdwd58m=D*Y9zcpvoR zt*x!YTf&WH9^$LUbQiQ>c5DPK&5$X=L4|8?fD&~@<{lXAkBYN$=pr*Lm!=}LNU^|B zMtQ@L%63x48qy2XR)tl!pM%bsp*wBxI#R_iKl}!YgU4k{cR&EKO#Nu>&!bB`)0?V! zSg()^7#^(af#@Hs-Sg$*-FBY@79X{5uM1_prQrFevOEv2#=PU-`&IGiG>*>j|BVWG zHIu*$6OjMV(hg2X{)(w!nR|NZ;-=)`1E8gxpT>CSdC>FPsuTNQc2+SJda~~Z``@SB z{#b^v_jq?P`u7APq|i*VBm&picZ8b^W`E}*lQv#CG-)J^Pj*$<*8z1c*qQ0#Nqq!S zrQzt1Uta{{_==wRIkzR`X;aECv?K*s6C3y-cB*C!H!xDj23U}7G<7cjNl zs7O9@`ZRYtn`Z8Lewk-TS>v=P$%Oth{=#PE@0qINo-*0c-fTFWx(b$%0Q9Prxijfn z1K)623oM!oJSYEADwO+6#PiyfzYF84!4BKEuY1boWM}^|^OBc={@!!x*5X{X5jg~n z9GyUa;eGuL3v#w){%3tG)sG+96*X>r(Pm?3myQtPyl?@TzZ&E^(SZ!*eW!ve$H_ec z0!@2~n*6cC(QxRHV6dD4*!sn~0<))QvZH^~)liWy{Ql1K`=7n1U;hLw_smZg=J{wq z;?f}0uD*Cz{M`+h8$H`bPBbR81iHD%s;a6A+^J}6#Fu=~W!;$IQM02RaDv{aOx#WL zlW)K^@SV&uZV-PGg2%ww#pN)Y!m}T@tgY$2ED$2`pGcK-^J?x68}8~;^U?i<^_FnP z2rTomJ|^M_j$Y)Fb*bIBKhb1ydV6eC6ueG6$lvKAd0Ac&n}K6~+=Yjoxv9wn3B{Z1 zg(f2`n3?1k)eJoW*Mugr1)G!|QzrAVs;bb_G{nmD_s7uueM#(E4>O6l{p2@KT*SE2 z`6@xzWjO%X-@=PMw#-{nLcg4sIH13z&==MY5?X81`aq8mv_uDF;y=q~b$pC>bYLzt zzS#2O)PfnW0?wDg0vn?6DLLA891&KV4TBT9Vz*&BcYj$X`tl zo$KfUj%qr}3=Cm7rB0qc!S_AJ(W;t<1nWB*nd=?Q$FL(G^xX|y z0?TJMilu9UZTES4grl2MoXSwFX3f5Crn`d``n zS?pxfrwHym;)A)n?@as^d+X@x)AnF-Pgs{e|H~-S=k<^N{%MwU+D&wwd_qEDM;Gg9 zsHyddKYa(^6}Wh2q`-mipcviw&(H0JcD@!{t+|J zSTdi0p7eRRu)){oTS)f_`I;}!{^bC`ck&LMhF69g>%;s9XxUf= z1kTk~!Db8C()}2ggC4!Xd;TMSLaM3#M2Q&Fdg>Da5KQUEgB9YQ7tD;J@w{;hqt67X zl>w^0!NCe{VG@r=zJ7V^v#UopzQgBzWw`wU`sWjOtFd%EWs%A7m0OsFdapw3>vc*t z`cpm|LcZNQ4I5%S1Lc6_p+S?!1QO0$T(%>xb|3tP_Rgp_tQi>U($bRb^cCDLA&*Uw zEnE2C<0O4RzOrPO16NSrqm3VRwa_4TLJa$s1L37?yy3u@q*Q9KTfDH3KP zge%l{ySm&fso(`epQe#E9_!vuY=7DuXGmcnpgj@SeN~T<|0%&`g+3f1*0go((IvnfBNjhzB zq(!|KI*EL;XXKaym;Ho5@J)R#mFXV0Ulac^Fg89-?+KOPllYr~by5d{F~*L;#tFU6 zKlEo=S%rm!z))8tg3MzJ6=M&44KO>d=|ECEw$VPYq=HG-NvzVcnj4)WYVp?NnW(q?dIaA3LPRZRgH!p)G1NCti&p%pk z)gB)Bi7gj7q^;ngb%_if*g$aw;ElsxESrQHa>tGxzj6`%KzCI6#Gk&to+SC}nO`tc zY^($J`=v|}^Nv`HRkCMN1BAv@2A0sf53O|oRg6dbNZ7G&iw9ed!=hBNxS zYqZy3OP~1{T&$lY3`t|D*B4x!IbgpF8{a1n_TRi_`y;}`dEi^>{FIXwwldIv>p0(? zlmClZ$LQqSjyYh12{eE82j}PF_c52;U!_2@npKI+t#9JnqfzOT!+ujTJhrweCdv#7 z8Ow2W!w5O*Y8mU3c*XdAA|*eFOD!bTeT2s}ch61XyiOt8aBuIb_Z5@Z7vJto*Il#} zr8?`eI7KPqL)cb6LlJ%O)=0_IU%vBaw?BDuoIUB#)thnb`q76+Z{7$ydHlK0or5>` zD_wcbF6}&BlDPkk+<~b`rtYFCbH4DO+&`AY#H{S?$3icczxSvTTe&}g#fM>pj-Jm3 z7i}ZW#o{PGB))N-p}`0pNk4^*EB=&8UVE6=-LV~7|M_lGdQ4UD8nn^JJp9_UP!)|2 zR|Snvmu>0fjO|M-Xfx?m(t+%kjdK$1rgHnl^ldKXG_65D{vNs7AFobaM|yfEwK@QO z(8Wwo!WYMDQie9Q8=w%Ng+ZPoY!2YSa>IFU$i?;0oZZNbkDKm{SMdGMPdsJPx5512 zQRBVz(hfb4wRhcPLo-?RmbGl#rzigrc$NK+<)>d*^A9#Jd50On=jQKU(fzvaEAbmk z`^8rNDAt$lhotnNcGkkBM;+_v0Xl(cD9ZBkiL5TP4x*9vn9SMhUv{An0%}QCnfGzN z&3E*)$~OMIB@#Rsb6rH?OE{{hLr8@aUS~PQWg~Y!gztouD*HeqFpt2Y))e*boDCv< zO4xHRNx}rD&U$QT`j;*yns#K$? z&FDV#lh`=UmGfg#B7m7B@M)&*<&j22Q}%V}I$Z^#0C#_oS;Z;^ll8Dg@5!o|BH%V~ zYKWMAmCC%ku}a&eqH4B;ZMn$M$p3@WQ0R17z=KXswV8;G9@?GMaJ%hWrWBIN4tsl6 zdg^DNa$Ya~5*y&R5;cKO@QubN^IRC25y-O9bEML;F?BDK&e2Q1BcGOI>>|GD=rbTY z`863`Ha^L6B37+xbm@b{O9q@#M=3K7ZQuK;&=K02^RedL9y+Y;#VeP4%62x+4qp@9 zN=ZSy>bLN1$W^&9*3|IM9ue@sLycN3nrjrRZCX<5n=O?G5CZcqVwc=N<7Q)AVV#K0 z(6GNne+Ee|`U~iQY-qt3bsLi8V?%a1&Q_>!sBZST73#H39pD!B+H)k=ZoGH8crL9#`w-#W zVY#PWAI#5vZ&blTD&UGg>NVL)2)?jUVbdt?D3AsX~X&jQ=E^3NIMXANZt+3h{nw!K`K} zE|G5iGU?}EnEU{iB5wTi6XvBIjkH0o5S1MAVn3=tO%%;m%hXRRs(*Rp@}UudMW?Ne z6aE2gCi4Q#;I&Qt<6wE*q;KzDwGPzEHT;XpL1b55dq zU^=pWtpXCIj!c816?;k+mPlmGE0I*ta`#$=fca$1z`KIL__@Jq)k51N7CmN>V36sxE(N5Fx?kdNqP3nZ2$ zbJlvda)~k*Mmhf+IPm_wI`>TjTo?C|XzxkN9aK~tj5F(5RSxf}5XT{|Oj6eB5Ms~7 z7S-wTS@MK`@MZ17w#K(EwWIV5@#52E;!2NwSAP1ve@Xbg%^lh}&%yP@qQ=6m^|8XPu$l!im zj}7UnKsM2r{qx1>%P8^Z8&kZX*+z9w+hH;pNbn>6uF?yKmU`36Hpi9=-vXL&Il%V8JK*KZiPrS=4FeQ2Siq(z7Vgdb zYY7~egs0B`V$<>%>EhcncUy8y^AG};zt{EepC7vqifLet&BcCs-B&INHV49^e5l{h zyWfNmuL#E@dcUgCzQD86AK1Y+M1BsOmB9uY#Sj4wKysv!!+IYVuMN7pgvb6iQDyCm$tAsji z7MrW45-9^ozw;{E^qsXq1lzyA;{`RU*PMR7iW%-_V18Z!!C@=t~cS)GQTdrtpS zTJdgw|Gmcl_ulA@4_qICIxjX6-=ezXp5m&lepJz&Yc+-w!vg**Tn9qdij}DLPOJ^S zi}$+en3b*T%5@pfTY?27NSHk8bzKJKT(fjtb)dAq)knmF%|fn&;#EGr+^zLMW7nnb zb@OhWt(kHzWG0XFlr*NOH-h;(AN1G1ue=wFf~S8l!oj(CR>COp>-`F!-a=a^GuZU+ zIuEaIxuf!1c2iwf!_{ipZ8%tjY)23nE3w@sAb70$qBvp@{7kn{OJf-RDdRsD!S-v5 zX0Vmya&y^m{+es1N!$7Q{_@Nc*-5(#p6uF6)B}2@`?^FmW*ujW(4H`vhTy{m`sc(56%_66+G$&!CICTp+MZxOQWXnO@e?nyg&eW3=*D zcb=b}z3NtzIjnvV;kY=dEB#@8%4iT^6o5K?tVKVnu|`=V_H`k|CbC9K$wY1z(R1ot znhG`R+-&K^FoSWoM5g|}(4sw3a5xjvx?dIeBO^+fcrRGTisH(fFHFZM4ird-Zwfij zTSkg)OiJ^Li*HSJ_d z_YDAm)ZNoXL42a}}IB%e6^_(E?fKzV~S@(tXtm=Zk5pyOL5y4!-% zz+$+?5IOr2xED|!i`FS5K}N{Vnl>lT{a}6Dw5ohrjm2ZlOnqZDV7fD}RqRt$P<8WM zOX_#H8t|ESHNCGuk5;;@pAhp8e3r2F4*q!SfGh2>^1wt%DK24djFg^u_g$UXPHkuH zY~!oOBh8>xlCNpv?^^?DYO~{DA9LTIF>6fdF5mYqAH(uiT@R-*rFqUl;7WwXgc8HJ zsmGLSs9jvT3wim?wbB*hJF@C?r9da^WZT2=vxv~lNK)C*Nz=kv@6kYn2Ba9Li;`bk zdap}i-ByQb#04#Zt%}20K!Z$g@V_)A2u4gzSZeO|*j$l>m-O6FJyH1l`G$E9=G?N6qRmC4y3v3-U1bKBu|T0_TO~AqAqsgVbBt zzri1btZ)KnASQW|<1tT~!!&SM8mz9#3B$eF~LB(G$?cpGhwq9!5{1VE6%5K!){ew$9<@99YO@bjln$2rb= z>o`U$e|y<*cuRR=ZrCICgP0iGQ9jrH*~+6%WrFUjqf~V1!Gf5|Y48TcE|)cN^RoRrxM9Apey~{oAktOH2z&J)1{OBt1pj4vOkh5;Z#nR8gIEMsC*!A z?VWe+(s7g}u_p?y=35zjaJ*)!)M8SBUXvUFJD!E59rX`D+ca1;-T$s8=*oBk?X}2aV zrGp3wc}(af%zvUCZDzux{gSn}F76BO9OX!)PKc`+ zef9VIsUSKfwu|523;H?(f?1CCzLTGpFVtn;wH0jEwO7oXhO>op(0Sxi(X_S+WJMgu zU+sGJebjk#u=?;MiyhPE57x+E?YT1jOjL~vqB-yFuIiXQ0{&*o5aBsKmYr_#P1i#^ zne-WFj)G&~;)|EqdGuS;n1nKQGW+>+T)FQrZ*`v}436DUPj$8<2{y#t&dM>}QgV24 zAl`N?olgNf{@uWH#K9lo{Jqb14+L&kO4aB-)+3{9avNn#8pqfw!#^{TEc<^xm^Av} zRCny=yBrp$xHlSZUX#Ip@ADO|C-J>-bIaM|bGqpnQqsw)xNe!x#}sH!^ByQ>qpFpk zwAcQ&wKB}Y|4=Q_x2H32Yf|8f)ZjlHHdB)wCHlEefwxDw7eG%7)K9ui6eG-n&gI^i zP?mjbXs{jT1s!+t<2GB;xAHetQkI`uxB2OWa5(Zi#y3tnl_J={*KKY-=*_0lV3xDSOe0@58INr8p%#JUnvjo6ad*)=`~c zD*L6Lqp6oFK4}2XAGg4fXz>(NHuZ5C7Uds{x23l@Lrl0cf^R;W2+?IV@s!S zIc4a*TMA+iOwri1Hm?+pE6(RxND7vmR?f04j_!C!)zN9Ps5xb4ZE@k{_#r6*SBK=h z)?P*l#hGB^)`o{^sM(#oe`&*XiN3vX>FY_=^2X= zBe=^cekSO; z)CNm>8S$_tz4dt`Sd9zIEPQIgHI{&O&f~uI*Y? zpxDs0v2;b=Id_{8h4oh_C?Ud3^Id`VCPcuhxV^Wu;0(6dp^M#Lv$Oq41KCeQSO%0t zo5nsM+6&-M^C}ZB;r;&WpToL`(oO?G16Gs$MT|DVwr28L7)?6y$ljfU_W$EH=Xs;E z3)_2?PwmLpZ+;#i34eJWI*#+U@-u6~wafZF3SO1hD@EDOC?1`$q@sFsL+0>NyV~`q z`y@gGVih>-RfBd-MVY3KhQTf% zaKa@EQFnsK>65>BrB1E(j7E{eSQ$&hc8rBW3U65Zp&`DGT)a15TWFZ5S<;1`s#?tR z`STf)>UG=Ek7}9y+qS7bbTHl;e)BQ7R*XhFrpXSfG+$z9vTw`~McMjCB{OmDEMEQJ zLOUxh4A`l%&ebH`1lUvaEqB+?c(AGKh3Eo1tuH-XQa{IdDeJWM<-C3AH_DHxsWzZ- z7PIK#H?+CM^%+457_g&gNWc__AvcwnaJT*ApneArR>0UdXarv7Ls%~t$~~B@njXEF z@omBK=<`lLmzm#>X%1fy*qb2njxXEo#Bl9e%R?c8L~<~W#FxY}H|n&7s*DopPi%)8 zbAR%Vfe)9o<4_JN&{kKcIK_>v>2uA&=T~Msa^&nFD-3(LLEEX#j@q*JEoK4jY^+~s3pGMW9TK5qZAYTqbX)Ea&5!2# zB}u;$_t;ih`Lkd{{&-}fBhR!UL3{jMG9 z1P>NR+cM_>JvuK=q|IsPWJ5GlZE|RB@J5b3pzQ`o@e{X!L9Z~m(o@pg5~NV8YSalh zf%hTpGA24ma}pE~$iMrJUm;P(28ViH&sf5PpD*mNQ@15XUAEwqh0)E%`g+a`!Ldzt zb}QnhfwX#-90vyv&wRn~2Po<%IxUt~=Ns9ugb~z9tPYqiZtPqT%1!h7#cXeDFL%rlL5Uh2lYQ83yKEG7bbOTHrVFdp{QBoa_X@GiJ{lUgf!RS&Q8cF6X#^ zegT@(qovfkYN1PWh6Xi~`*g{N4%gQ7Ug$0ZC3qf&!)@@5=0&zPJ1r!X4h`q2|gdhXI7|F(xW2ECLa?RYA<;E!+PZQ z04&O1akpcc{=Ahvi?AIBugS+dnU2&n7<3OZ8O3dE_+B(5#ETqGi3RGk+3%}PNYX81 zj&5;LYZG7l*s(}3;c)nAsC+-+&XhnfeZAe5by2~V_BDQ8L6wYR$g;7SY z^W+`rQfPmqYpt{*KAZY;Z9I9&uW0!v_gIsns`2D_yx^FDRQ-=4PO8ouCwUYTGnE(% zpG~O=5aIi=r@hBS#OZN7TeLKFrh*?6!bx`ed7qf!>bPuv+=4S_3dsjqhtb~@oY8Z1_ zu$@muPX4~~3wHCrA9uo$2aETE>&F*X0dT}{n(9g~vK!Y^ zt15QtRZ5zI-{JCwiK+09b#4gyOW&><=-`2O+z^@Z<&g z1lY?o@V8@^esAC)L@rsY*c5W%Sfv@a*5^{mq`gO;Wcll><#^!YHilb}LctRZBLI0W zZ)bXr#h(^s8{DQXFD03Y^KAwTwI>3Ygctj~4V)KU({VPVN_%AYFX()r3_y|V>S!g< zvWFe>qY#>gih@!rYW=4T%EgNs+4rgfcN^A|qpzz1O(2mYzc&8g4;R24Ln=+}1oBz_ z#|aBuxQUuRMN&*~554?D)m9^U6NaS_arlOI*s{f)R`%_$i_4nQ(Nz*xFG&sbK^+ zc?!;27(gt4ePQtStX~;4(G%^LK@=kMB~Cy5KW!cqZ@d8Xa#Y_!GNqnNy)iP+kY)dt zb*p~R5AX)0_u=Mt4&Km|8)gchA&jWIH|EM&nPj1Rw^Z} z{M_Fek^N-LgL}J0V#xk|6#w6W*5nWSe+2#h|JfUf?V|YFifJi~lFG}=oA$#+jAAwj z0ureI;-$lZAMF{tG{q2f(19lC;O-Xf^!F6^>@W@Jzdk$&lMNCBmda?Gh>cx)gwW{3|FUXAk^brj?M@NR~Z{=_(em3Ep~1 z?;VemFH(f8RaN&OY8hsbZS;FJ8X< z!%8uO|4&?XVt7>bg31$rDn|?XPdyMoc8I~x|4Y*%hd&s0V&DV!TRsYgZ`k&LzTZE- zn`Y0RCiz*w7T-#2XMSH*=EGo$3X3kq2pniis=Xps{m))gfc1>~L)K<-AMnCN28;y{ zaJP0%iSE>-+*e1netwn}8el-0$OnJ+Yvu76(`u%uRCYUi;&D@jT5N(nb7gZTk9yZ{vM z_T(=eihX&Mzm84Hs`K(=jH3g?&S89^vIIwrvW-Pe%B32#;7W8jOzIJkwhkfy_zNyu z8%rfD+OgQ`S<$3qJONjf)KSUy`RbQ!OsAVQn?>iYoPe`mxTs66vw27MkLT~6St>Q9 zk#|DOn;B-4(~e!*c6>is!z3$hlvw*ev49I&`Ii7<<4mmVxcoRtEi)$UTzc_epF&Iu zjCiAIy9_YaUmXg!0J~Kg=}Nr&!CM&}e4cz0T4QPK>Uui~l%|hyWb8Rjzc}#p2zA#B ze6kcIiyy<$t1$lWKKY&=q76+uvPW@MLGD(IzP6K>o3>MtvhWqzhb4y(MhV@{{l`Z%Cj=@)Kpk8b(1){03cJQciz=csx zbQLt_45Pr&C~>yqELYWa8`SGR8zDg&#ty}^j?zNQn}>=4*;u=N-p_eL9w&EGrunf|LM5d6NB+T=ryhkuOF+Krv`(d)bwoi$!?F0g?EL@MiX<&ZxxQpTvqVhLZNT_Lxa+F zb7gpS45#DvTGTO-3GQ}^tL9&=G%=8L1x-B zt*W?E6L{IAjYEoRvh`54ahgsEVd^OY0r)hF3HAh`vDg!}bXG-kVH~9RU#~PCfuw92 zW?n7nhN3!IS%sy-2}~sZe-2{;uew4~QWmu6%Aeg>>NTzID6{L<@k*s8bAUwDh%Oj- zEcSIX(}4sNcVfIX-J(qPtKF#%;+G}N-JaC0O_zCqhCNUg)M6%$r|akCdXd=O$pKEU zkUc_L+@3f#Rw&MRL3wF1uh(AW9^um3>`YFp4rYb#^*S$32>W-MY^Purz=lSjFlWs> zZTBnXZ3l+hquI+CI`+CPbwf;)C>@?~a2^fJkz7S1ZSB@i1X)xQimV@@8kLicz$EFt z)8a%so(&`~Z@_G%S&_AoKpd;d!I*DV#b`L}8pKk_uY6Faq-Z%wBzY2ugd-T=B(y|z zzUVxx`S~%uCMUIDOhVN7t04-+D>9(edMhio0-zF&1le;w10ice#YDjD4jN7WD z+St;j--?0XAt5{D0kW(9E)N6@XF(L}S5{WmX~p#JMl7kqad}3s_7)A9Y9THzPN}mz z5*yI;-RaM3NpJw0QL-OmQ%DN<#nqg>Pi*-&5N0J`5@ZmD@}|qZ?rYNB>@&c@LZ=6m zSa_M57aP6y{^vh(r`Vy2_F+eIpK+VUUq*L~eZ4sEC<1prQ=@Jg0x>yORV2YybYs48 zHOcWNWyr!L#A9Q8Pub0Ex|AeAZ0XK;AX-{lN=Q#GNFt4RnX#Ogi+bdxB#0OP!7gd; z&;to|5*KlN=HOW=xdlb5&>x=T*9g)JnAlh+lOO|aJ-4g>R>LDC{;o}9*J(a$vqwNH z@0}j$T89oQf8|sa+J<0iT3TLj2N$KL+(yIZ#b3FXyUcD>dLl&q^1kBa`a4B6OU42! z8hO0ZFQU&Toq_Y*>%AdkSuRWF4+t{N&2}CL zUgHi55ld7)YVR3`QTxb-a>vWq+ig$IxFTvdlx+N)nD~L)TfSPCbDhWJSCTTB`X|1* zeBJ2JSR|LhH^|RU-wl@Pz9U+b*FQ=fR~Nu5ZD-MueVa20Ot#VNp7((oib5~)mYQrh1l5`@Drh9cU+MD^;w~xKk zu_|xdGtIk&Zc=vi-#OE?snmH}TH2G5jzdMsKvwxKZ#3M778i??BlWjSD>m1M4<6$& zekD}8+)p#PpYR6FR8>!%?fV?P&Ih~pFhu3wP#(v~Ciw)l75cE$9dZkm$8Ij%F@>(V z8`GJQ*n+8q{ih_7b|;U;SuMz0g?|(YdMaqe8`AuSN6Wqk0&~XP@jr!U)5i#93qNvP z5A_kBHFMXaOQSxGdEBmk^5tb0H9K`ioxKJ&WbI|v-8!H^sd(q+5I*X;Fx*i8kQ;Wy zNPvk>nWITDNV-`0Wzy zRKU%PTHu)OR-cl#_LAhzgK5gDk_K~+Mx%dXhkB#m>efX;Az}>p?$cjbdBm0BEaZF0 zd4cy7$O&QM9`3xEI&KTfHVik98j_?~6INZ&*v$Fs=k(g1QCF06jUw3(O*4kQ^*QKg z+9tDF`@mAzDp8&crj{{#W%KLjhzyxB*?KmXJ~Z@R9T#zF%g`fCvt|9Xn+^&7IhpT& zH|FgERAI@y2$|Q9_(~eQ_emJGT}K5hqo`*ZWyPC$&2nBVbtGH!KV)oU$o2g(CT=q% z#Y@AKMNw{_SFG20lCkv0iv!8Kl4E2=W}i6|!U-u*ejm+s*@UC4zL=^$H-C(&UygX= zpSH$53sQtPp=(b%)x#;1G#Hs3sFdwE!^gW1hP`%rtWEdBwb}qYPK<`$2s@bb3NJKl z8tzDpXnmg}nD!S3xb|TMbnpuct-7i^h+mWxTdo`JT1Y# zZC@O7f`!-N#aMkQ-dY&t2*j6zk^(;T<%fA^LpN&g995K7ykgL{cY5fO`Qh@(O@_uD zOrZfk7;+`kCPZtQSQFfiQOtZI(|#V>Hap;$LTQDRY=0-CoFsJtsP=fz!xT3rK**bK z`uoopMH<uG{`i^>r_dBYq%A5pHP@iaE|iIqfPotYxh9UhiJC{bS#6#iZby?7P^Q zDBC(FvN{q=m>zwziES{-G^nr+4%BK9UGLZwhsM*(RD@@6V5)YOyJmR}SdXo)1aoTg zsOJp`an{_uSQ3|IukEEg_wC`QPj@?ZV5e8%4Ht3x*x^@5kw&V5PQauosR5@iwm`GC zo-GZSWulZw?&OO5XO25Rl#4j2lyUDfWbZ@O?_^`oS%BjeC;@6sL2gv;NAI6IWUjvP&My+NA<>I?IhDHS00UT zj@Un0q)f0j;vB|mBLkaf-UzV^NsIjV*3CkOG|t5`XxXXgVdo`OA;Ds&-My|-d+h=J z(7|mMr7HvaKV#=kSsa(Tkv<9$Tpso-SVOFeThzdjK!A_f9ew zQ2=Bw@vy8~#%$AKowC;!*+b;Za>~lCi$kGc+@|w8G1q&g<0kJuJWRpd5ALLOdY}6Ruf=!!`i#U(KKbp)auUFk_Ook;V#L{K z?QRF%|Mv0-fTLWeECnoDWz9o5P)jIk>PlZc#m80KQ70y>9jg*C-4N@YY>GQr`vKL9 zLJ7C-B_gl#iTt{2(zU29wFlT!GR4ORHD0c2rl@5?rDU4dJa+Dp;;F{s*($pe%>?Cj zz0xfOwg7%pYT>n7Ms}f~EP}xY5vLll4r=Dyce_4Z(tGkm#B3+i^_t;r(*BY+=Pv9? zq|6x(Ye5A{KC^O`a9UW4@*L@D=8^PoZl2s65xQDQX^2iN$Q%?Nb?+NcY{bLFZKk8b7?ognF#g zPc$oD@6hGAHysKp#oDyP*fX8sbeW~GqRG*0hO~oAhPQY-!DWsyjV74fxOp=)Z?<#P zI;O6=cKD7I*k>9c;BGE23sklg9wJ&y29)IckKby&1c_x#i~ow@t7ikiotPK9c4!LP zacYFuFO0^87~l1L_RM%Z-)}}lap%vLJXN~6M6UOQx`=uWI^`cv*pn6SC0g-%qDXRK zSi+r7z9;holf}vaQbCeN@)`1D6Be|2uJJWgU$2){jAEl zV6f)Xni+_)J13byXw)iYQ26-!A8F||% zeV}c*2l3ZrV0= z)WNl`%TB8ZrHsc?w*ypyi!&$peSNXC@`TOLZ~sM^oCcGk-c)r`OrhEIgX~$6w9cxD z`!EKo7hTeVFy5}+6-%&c02@%B-igcY4Ea?09XiRB%zr)A0(_VW8ib?uu`Y^@6YrBr zoyq+?S1Ymec1%4VqoUYNJN+BTC|m1u;zr~pwx{3UU5p$M-kN#}k_d{@ENpF=J!`aG zr@+iZ;{XY3p8MJ)xe%;{*#T<&T?f1{sXW`J39;-Y>;`Y>ndM*bo40_slO#`uFSgPuc7#fkO}=r3U(r{DKw z1)GB0q;)D^X5n1b+fQg^o9Kd0_WVyQpuT+TiTI}4Xze}ftG1VBk9n$@8^LZ; zbj=FBGb|-XD$Kflb1cc<1X80^Y-vu+Lp^4%LpDopg@ANe<}j_3r<x!G5(A0QjO9th*YV zk2o{~GN@@$5{s%Sv!(7No5J$^q%csMo{EGIbb_(ka=(^lwyk_3XvNiLo_wWC~!-8f|5lNd7!?j@x?K!5=AOr&T01eW> z-+HWx%@5w(^v90Hr2GL{5qw+ef*)vXH8bv=@LO0Jz6>fdkekjtk9gqdiz}E1SoMDm zfd7qpiE}O3cIKUnd1pySCfhPM&_F6>@qz1z8RAsSBrWaw#*#0zF|Yq+ZR@CL%9MjI zc%!x(-y8Ynizr1QMOUSXlZ%ES^hdmzrK*FjG0-770i9g3$J+#IhVMYk7t*4YJUSFQ8bd^A* z+xs%i0#=k5UbQCF-YtBNl!7?kRMm9%3ZEc&_qP@~=;nCBsWf^!n{Me7MLlOVro@wl zmVHkKb}9E8^b*+VPxYy18QOum8ZzpIzojChTXagvOp7Dr!YB8I=EFZ?&Ug$4?Hw8+ zjFJAp;5K19{~FLB8~kRn{N`pTR8q>yA(8Grn@Q3uf2)~zbl2>iAcx3lc>3fC_Oc_0 zOjJt_lax}{uL^vDNu_p)Gp|LDE2pMdy5Q#Wz&;#dWZ&F_vLc9_)^%4;7QJbgaLv;P zkEqYf;vnt^$ubc_*d)GXp39EUez1@ltT;}hgVVlLq}Wq?zX#Rspl3AAk1Faq4d&qC zX-kZ}sO!GANV|J?%l7-VVbY!%Xs!}#Q$H4BG~JT+p!zUQauPL6GsRL9=qFH(RY#V6 z0OPH0^zxR=I{qo;?sUtL<f5SorOi zc%Y%E13L#L#XpyUAuZiTq%)@EFN z>eVKxR8GQ`CWONCT`JK_XqYc1QhZ;yxJS>UZBN0vF0vZX1vtt@bwMS?@#(GrQbd{C zS}$RRTmgfS)YLu(<3$)!#s@3I-wJG|1X4SJmCPaL{MKK=^0EG|>HQuKW_tV78!z4v zc8?dUi@Gd~#Tuq2;F*~uBSMKyLh6w`qp^q-31(BwMTjXQ2@4C`fT-ilqmEDw!-a;i zb5~YIV)p@hHCxk~xak0K%j;8>BPkA_9+k#Qdb~m-3(1rz6D+CY72LKq^auqelh}-- z=$8Rs_PC_y)rEL0_qjxvfkJWn3=$2V1YGJgSzQJjtcJ+pni^;V#4? z3ddp>lRG{o-wS&__9^P>1`5ipR^9RDI#s*oFd)#kS8mpSn1(z|;)r)6yG8p)rVbu$v65sm9Rf)*OtrlLW9uac&p~D7WjQw z0jY;%{qFPL;e9k9l)PZvdz;ofqGC`W>&6SOj$cDoXZyOcV&gaF>Xi*0z<+0P9*Hj7 z?1)N^F-~!qcJKI_R+KB4!F~LUBKv)_=Q*aTroJJb0~$?>PA~|VADPXS=z?0`-&^Pv zd!3xHmgK#)1~xdMv9k+h$(@U`t+ymv6G*0A@Sh0tjk|TNT!5*u=4nusZsj>;lhj!5 z!~5u(OP_`L8i>MkGxpt<&hym};lT0YL)Q(_4(aG;_L1XuEOy z-=SLJ2UVw==Wu_7Im`AQ-$ikpoIyWzFyc>+#nwkt4{hV-f>^yGpEHE>$UT-}X)c6_ z@|u*Q%W~hF)o`4Jb7}wh*+JaEyR$jf_mls1m_5tA<&Kd(`F4Cq!vwK<8k?wUVYIon z()vI^?^eXa-8LTyG9!0lFSv}wBg2%}-PSqe`7U zji7b|@|^qg!&I~Oi%`9acVuLlhSk{jV9szAEqPzYU|`j9RZ)sYITE(JQb_YdC4=ld zIUM@zJLn=*_#iSW{ADU8jDa@6hABugsU&*u%}YaX*BP&*8kaB1d6hhaad7;cqjt7Z zqte@7>ZRYTHABo*@yujv$Q*6D)rRLXc6+Oj@Pb1!U)qD1PcoiS{t#h=#Gcm@&^_|X z=eyYcpnwi}L({K(v9ZZ^Ly~6tiIe*4nj2bo7ivPILXw}E&1)HYWUa*U1*PpG1zb2z zMddBBa{pi_?^fr~PHfOLdznR|9=2P94?CS*RdpOsQ#{adlq@Ex{vB_V+x(Xl^JRKB zl|dH)WD@t{+C`Y#!HDOuTOdgTsu}NhSGGRdrg#%=tTK$Jk1PA z_V0O3CI0?l!?-qLEK3n3Zz5m7Q7{74vPXnFZ)~r5+Eyl+Xu9~=Oi-RDkv%c~WAoU^ z&5ta1Bm7OguCIiPs4A`9qkhda9xc>AKkZp?y`b){LCL&=i;eak2k)<_6I=ue!`?Q3 zNIUgt@lJCmrg8EtgI?e>@;r=I0NaGtp(rsotl*Sts)ij3dN1Ks@7tqZ`!_Di&#P%L zCl0b=vbGO$H<5cn(GKfL2d`=qt8tRa=pfuBD$B|H;@fuFkF^pBjFCf<5drjw4pWF{ zFT8>})g-SGB%iH-Sdx4)$73ObmYmO!#PpP!MLwinyKm=}ob>~9^)s>`v<{0mQ!8i9 zHLL12suI3K;3_>#9Qqr=S{dWJvZ%g(l=k#pTtKrawwg`C_t3+Uyu6%`7+5mJ!xFR2(ZAAjvNyHQvq6fU}qH4!09avSi=gE`&Ln48rB;veGp zbV^-Ul)Wd91Z$Y0zmYf7$}(Jl!DwfW%gxmD+JX+}FSL%5{;8QHjRtb4_5p@dFjar6 ze6(K7itd`DqguL-+xG2guq^p(^Sth(jg%o@Ec6+eX zc{`zmBNqmz3t~EYTe4Ar$ShpCu%)w})t@$ZfHPS|QF#e0yEN|`~+PCHCQ zA|0nI-zoq1a%hSCxKy2SU_J}wcP$S{DmwQ zRNt-XxMupT8k=B5M{rq^By4c1rWMOPsq{NKFz{BPx+OtcGpPLQ3l?I9X^-N)uX48j zwsooYE?#>|tF#a(XSkl266XH*$Dy35CUbe;@5OFWaKR&w^)-jM=n}@q^66iXE41fn zkW|cGK9fuhv!B#a395cCxH@^1@VIQTV?1qeOylgGoCKMO7*ao&r_*g*&QM7$dd$@_ z1F;$Z*|%`=X3WK>B-bV$CNBMuF)2_?P#N$L=Hqk9(jbGen`oCvLoB+ zw&qnAGEKjK^}wA(fwTG)Hs~8&7v{Te(@uu;{1AwY9SIexsH5fhCzvff=Ke2$g+oKFgLS00~!wX6r z8aWyboj5XU-j$(ym)w09rym5&%+5*A#%-aZ7;p7({rWt*zQuaJ=2{@@yhZv&ECD29-TgQ{I~VzCl!0Xb|ZrdN1;X6 zMZ%w?)In#)#PMfd<#d-@Gf`2G+uHG;9hy8UG4J-jvG>+dRj+Nk=v0=l48Q^uK~zja zM7mLFr9lt`OiH>N3_wM~KuSPbKtM#gMLwVAp_Bs1}WB>E*vBw^p zvHoxobIxBq&wXF_73BsXbTkw?Q)fRk@)O+0V_w2*vSc)IrDOBOHl6sE<^uk3GcZXs zTdTsa&Wtzj&eUW`h{ujG$%eips#uJp7wm4 z{QJgib3LBi;??n;bHDQ&znBVr4fkmcAEIb>(;7CDV=bp7|zg` zwP0dN2p`eubP;*vdda!WG$i?IvcGGm(E<5(>+zpjIy(MFsn`}@dOI1?H5Sty9=^M7 zz3a+tv9sk)GV@-1wr#euzXqL(Rh_G>haOQZt-PTq(fLA>`yOl6i{W-OJ6_5Cnsx53 zRbIqvo_kqh#Ouu;hjwyOCJG2fWF|}gY_s?+YBN*tF4dQ_a^JP^){5Iw^fhIUcJCD} zo&SB#N^62SRo|E8yq0|r_ljgLKj!fmK2wKQm4zZX{!Gbm(a=Eo_AZpw7RLJo&n9@A zj&onIUIXb;(R3O@2Rk9lPQQJZuQ{fsM+lsK(Wo$v#p6(GinccT3}^_9jRwQbgm-h& zs9o1C=9I5Cx@;7zIh|;klA3O|l{xFF@oyIsPDkqxR^d5~oHMBfZJ)yg8B}jp7$tz_ zc3iTzXnmOXMF0ZS#fsU;2hN^8T@pt7R(;f_K+0E3Fsey1<5Yyh=Y^0UXX%lR#UQyJ z=Bk$oGfPYLu;qKM38vbwoAvT{0_Qdx&fajB9nrCbLLbxwI@YV}x>wdy(aeh@{}nt8 z*gr*qj@nfvLR`wQI$5N1XzA5R^>*rIgKZzqLXaOIF=lLl{=j!F^;Ws`Gv_OaH0h_YNX@YU1yU@Ay#R)Nb@$1jf%ZHUhWa&QIaDmKWcftEO z{B}kCm#rQdX+^681LZp}T(|(FK@;^701jLy4(I~lZ3Obk_09Ed-$1S%3d(SGffVlR zZlq4~PqpgR%f7D70e{NN{a3mZb}+4Cw{FV0b z`eM1jBut4{XUeEC)!*Gzumk=P>6%rJv?WOSA3VGS)0}$* zT_qDs;LL!p`0g#*psxomdNK1d&j;0n)Fcv!ruh7G!apb)Y;*<@cfsWPDU~Gb1KiWm z1N|c2`G7dX*xxJN_B)ZI0y30x^3`w{&g)?MHCJzdFbpKjWSbM^hHJ0IUkOHvOG%%NWjD9zbMAoa6L^axW-& zNI>-twTK}wRNOmnMLV|bIwEQo$#020<@*js+?S~yx5s`&qA9ut&Fl#}Oj;Sa4P{X5 zVYJ3ozI(E>I26grp7-?GGZp(`c?RNKE|5BpEw0l3n@2!R!Crc`BuaLuE-VcuDT1G1 zeHD%B1UnxXeQM1*8N>BB-Fe?&mvj6e9-SGcJd2cj{>B~nTiIN%_PKuV%j4$2vM`lO z@O%4KJnqn+ZZFhFLG|5rfz{~ji%$^`lRRd4sPNHdgpfV2`{ueFUz1My0Q2S7>%k(< zR6GRkG|U1>Ak#i-N=ldwhmz;evNsW?BETbO1KiA5{R{Jb-9(ik7(0MEAr5~S8iO_p z=igN)K^|=Od%M4$Fc62^^Xc(joqN<@)q;g66P2>MyetvvGR~j)ie0Y=?|Lirfmf4d zTdx=dJm0!jZAQ9BKm5 za=fW(X66G<$6tS458*a?(B3F~IZNzZwDlW%fP_D={gc~)XG#%%faK5@1;6;{+(Q)aZ-=|q>9L| z?)+(RDu(Ncix@2^H}0kutQK&q1uXYrNZNI5tTjM5J?ST&gpeT*}SU2xP-uZ-q;T@wzON`pf1IxP{ufa(myAVE=x8 zqaR;jwbOpj==m|pE``#YD)M40cd8-PgL^i7a&C~9HYc}gW*V#G=Q<M&Z2S?P635Gu0QK zE&4ACc`;01j*jm)_U-zo__zfrCwu;qyIu|7gy zAgHkLi7ETfe&v%@@y%sJ&IhJ$ z(C^oB+Ez2X)n0ZXDXK8~a6zdsJUSaI#qqZfn~{nn%c<<%8vI9iTE1yKKo z-VOmlz%nE)Gp|#(!QDyZ+{_NK9Ug1q%~$ZN-@<$XK-*U&(e^Eq{`H%W$@F@!96W!g zz-s822J?R;?t=}#L_wmn3$uXlex9Udki-^^Cd6`fVCDZMDF{dvuUKFRuYTg}OCq@U zkVy0|@06BqArH8Nl@Z+U;QK=HH4;!Yz>FRb;^lBbcv>Z@#LC2BfM}f7*bQ$FEwrRkz7gE`eT$%AgImO+l!wpA zWXAvI_sDr##>xw~_=CH515s~h*XAvpxi|s3ocm&XLTPC!WYLU*1-ihLz|K0e{5Lgq zvRa}Xcr!*G2pIPA@>*SvefIPz8w`RV`(Tyc9DY8| z|7507Bh(fxt7`^DmV>KcZ1IT0w_>~#@DYN+WUXsnoFJ*szD0;+*iDYp=^C2i>>fWx zWpI^fvvJ7r3s+RbUse1b$9+7=W`0aA_Xt|%yRK=#s#rNmEd+WlTGp#5DwC>(;E5GC z?Y43kUK@kW-;-NASHpztBbcSBhQ2<(#MN2st_Me_rVQnnQ*Nt9mJ$*Y-`?cnR`igV z?BzOJS-@{+&t^$x=yP5&2`!`~~2(#q0cVI`?0CIv*Jt$caP9Tm79MoKR0v!{UF z90&anM{Q@(;yV)KnSHyfc-+mWJzFUH;`lue*e{t;)&DJnmwad|&3T`%IC5{J&LK{b*8@X?EPph`C6AZ< zqa42S0&0BtkStY~ayxag9omXJKiNs`BpxSE#qlO1%sZwh!eC!odqySJqVOJbytcrt zLg|NL{2pJtJ;=@t1e)cH87=OhriL7(3lin^jf^|hKO?yeNPdN@%OBEk%D>bBJ5ANY z8%!pp9%6*|#O2ov?HMC-VZ7n}zZ;%*YV#J<@b4l#A@@CdP4i@&fx95JI84Wee@#QMWk^l3-m~*!rH%b?N zGa#R5DWo;;dk9optV{3=lAG#UktHpaQ^&%ukL|yFN=vZ&his5Sq0QD|8?E7aL2B;^ zPAj1u1RwZfsL=XLt6twcnCXgOt?vtufYQ*isJ$`7`RP0S{mE;EY?~i(svO}S2Z?Xq z2&`Z6S$oF3$dtuJ&}4#5FWJF~)u6)a~I)O)e^xT}Qq%!{)fv5vcWPaf$}J)-*QHIUlXl-Hv`CfQKR#;rrf6eY?2%uj z8N64{VwPHbz_lz_`buw49*yHr z^|r$bxNHs{Hs|A2&xZ%MuQ|92jtDdKli#rXi$TU}VBSo*@;=de4l(p-e>XR;<+zg0 z?Uo-^!3tG2w}x$!h8rdY_nIHtw)YgaWa67mS!*Z$@|>TJ_*^= zSrt|$O(q@<_m8&j#hLG$)KMEuUuR|-=Eq$B!|%15imA`7zuht2@rRk)$8JARqukl`pqi_|ZXtDt(-nTs@6J495^G5$#>x&hi=8`HA|umeC~R>f(z0>@ zDu8<$?khthUX`D_5XJ1^kTdfAWhlu2lWB7kaA;G?JecGhT3Ieg(3PtQ7l0$@A#)qM zU)Jl(>F|2e@7f}Hh*_$@9YT#ks_Quxy4w}%Bf0}0_#PG+sN>5&EzLZPbRMU!+!y}f&4tu4;Wi8`eQ!lW_ zgNMNhoYQL?taJG!pDr^EOj*n?gHLb1k)jk8J==!}omX%)22*OhC)->Ro;DbTbmbhv zGU%HxcjhK00hw{nmIYy+^LWoC(285Kr%S*IPOQh+19N?b!-uiraFG*A25fd12<16X zCC(MxA@`8DFT@|vRL-E=<(F6=e!ZJ=*RHk<0}Z&70@!z-AKf!Z1#HX=Zoa>mG*Z`7 z?o_E%=w!mx!NY^qi-(3qEeBKsm@M~?&H~g_ws$hfm}4 zJ%pNLi9t_#=*Ou|w+-8nv;Gqwk=N*dR%i8PsEXHQgii=p0%j{hj=%Tw7&o~rw!dEN zZ?68a@Dp-elK+&EilS)yovxhk5No)goIs(pfHxMT@}(1$LU({=JIV4^w)V)qJQ{7(bGrnztFGl|5Xuwjv9uUea?ZqQ0DZc$?bMlR{8 zlvPdzlOO?@OBUHq=;HwZLx|^g#ptrQE2ao1k01Y1dFpPNmm-6pjYV(KXx-9MuQvE5 zx2qV7(cN+G^0uB88a5YZlZ9;a{b?80%G+<2{l#vjd(U9v*PV zFfRTUXu%D zi0aFFqZTAvG>sb5_|x;4jW*oJj2Kq+cW;HheL=Uz&@7?mta&ep%iwJ0p~`0mQ-8*} zZB$N@8A`V1Yf>~wf74X+$Z8@XoUfp}D#UQQ0b{^j4lH27jHND%M%HPIW=uu{5 z(|ST}g+DNMuP>rIlaHqCRaye4?BtaL2~&{yC6Dgk>w9o6YO5bcb?d(}6nowBTk&Lq zXg&agYgnP4c<}HcCb7M7m+j?MJsUp``Iynk9(;W)5E_7cLdLQnR7RCR5}l;Qp-z_a zDw=k!q+0q@A>>;WJH@Y&+J`uQ@vZ~|jqSGS=OKHSJ8dk~H=kQp5Pf|EXDPYIsr6!AxH$Q&JnG+r3qu!CFKQUVU23ly5Nm zYt70_=DD|N(zAZeT371@p28HJwS?S9a`_BlQ~GG(>4}Tl^OvrK27UYhS}jtkE^>6$}4PCs&P!+=b`+%DzO;n$7(_wIc! zI?Q-N%EjmOy%v+FuWQ3XXl&28gX*Y0)#Z5hw4Q)_Dsp77;oXX+9!urx&pS9ZrBk#u z;4P{4%q?%{x{WJiJsV z%u{8vt*0!X(A1%EJ(@RbU@uPwBQ1y1ii?X%+uFMmMnx{4+=-Ht%dy9*=a!D2yu;A73B_BC_$4cPpi~ zs|DLxbLct+13d~Kb?fizc#on+6e*=JmkVCeP-`+x@yR{DI=wQY_o;ZSp+9Y{i&|yoUMEe3#-}tjpb_fp%lZwdNkB-|N&o{A zqwUE`CdFU9#ZWxmg@F0I+j=k-78^Qqgv@p^aYm*%I&i|))zgDaR_ls@XCYB%*Rrjx zmiyYmp?Nr?*AktUrXulBs3*ILA*RKPa^lrhn~9c7DMCDQb;{W1Qty4ox<#_q?=(ts zh15uKeWuJF!&w^>c2@^ z=EnEp{mJE;sP(|mfu|&nx#$pI>O@lh%{7`A_`eG7A*eVcB_6S=ofk{WHFK9JpZq0k z!7iIY%j6(6-YIorCXu48gL;4L!{Y@90>E@+GYKv2{I60stbhENpc_W`FAMcJQZAucn& z?$mh_(S|Xl2}&Pc!-lWVoYjUg=RQ~5tc7f^p6m9^tGfP-!?fv*uUWJ{EyIqVckpQQ z%W|J$jdxLIt#YG|0z9=$?(Yqo-lb1mtVn#U*0JNfe*NZ^weOF%GeNW>VOj^Xj^ta; zn=}Rpml@fl?bcLWCulN4vHI&4v2s!&LU9GPEj(90k8wUa73m^JY0D!DMVvY%*8OF>G3G--ktyw;npe%Z zXHS$r6pvRgtwI`RUf9eIenj=(;LJ#}t0Y_#QjnOe2f4~+bKM-0zNekr1?xV6Z4IzV zKIF%#)2H7-73HT`*G8MU32%LJs$Yj_X~C}v0fw0KTIKgo;`JsI;MFm47`h*wU#my?9{;G1pb;YzfDP`q~M5SLiv~NFPUvJs~z%9i5HFDl% zIzcC7rYD+Tt|7g z#!q7j3{~WE=0>WOv45O=gUxXT#_rpQ0jru8wnH_;oCZgr zsd?!6hHF6cH|3;P_7j?q2Q%2$C$&`DF;R-7&8wP#*dC`#g89g^?^q-3stm8gh z=O76)hV_+iLWRD>v(E}U$2OQb<)uBRvx;&TpBV|Lwjbd1k=|n@B-mZ_7eVGP;jZfb z-!yzSgeS;L?_-JQQ|`8F-Dj_d&XZ)f+QqTtXxAfS=riA}k-=xWihV;+p|}|#xu0)K z(J0*a++e;y9uN#Ll5@aU)$&J?D@A>4^S;8UOVUW|Ir!xJTz$52`|olX2Epo7Gr-<_ z=ud2tOy0oi$w}hksdbCtiHUp1O`j|;P^OCp{RK>XhM3QFOOAV>gUKUvhAUmX%K`%g zELG)+^Z~E%PVt?ytMI`jY(F^SAij5?nVAKyiIhi5L49A09Ldqn;l~dH-p&MXC!}rl zTWdG_YcKsrAfG_d76>o)A6DK{@WuQK7@(S46HLYTN&;J&C@y|tCG;A=2jRxuZwYp1 z6WrgdZ6Q%uzK{_&@$KW{Z(_H|(&H3;*(mlYcmm9&y+i|Br!DePTJTdkBOhdj{`N%X|Sm!{4VT0c7SczkR$%ssQipEiWcvxE}_8 z?w0xMKgLN}N|jLKcnFp+$d3c4`t#ENKeKJ&L1hK}{PLg;l?=;&e2qVU^xt(WWVS>9 zO0tDBG$etV_}Y7%iHvh?V@V9w(+~@$m;1PPeKMMZi3S*7$ns>KPI#+awEnwhV~ra1 zG+Kd&uyH=2c-ULX2u-gKtt+ub+k9o^E(RR<65o~cuYW@6p1i$4E?1^1eu*XP*>kG{7mtY=K1ZzAD21t&&IEVUO zrF&vX7Ij+l8!`T(f;T@)0}k-w3I@AIJ}I*c|Pl{`*Lt6GBr)ka)U2aciWZp{eRj~o~|qN7SC z_LWYv3Z~n;&y-StU^v~D9&^keDvW!5AX6L4V(kY=v%gh(3huj*Z$mK0n2+VzPv*lMViW_qG$q@^x{!TG=0qp7d?OLDny}! zOVKLKaobo0$C$-SGutfO39PwPgbz@8FW3{6gj~KiL09}2@6F|qls_Xg`*~7V3Cu}98q>y^e zkIr$=o>tI>pYxj9=trGH4f@irJ0bzL6g(S@pq>MDIe8`60$!nIw28pb3=ow&-8>;e z5~Mx*bFYivs!V(5fDSke)b4n>z||0gh!CE8`XI%F{rYob6rAO6FHhAY?zK4_m*?oE zo_cth>|vBGK#fmv`L%@D%nxv_kr3(4OG7M7;E^#TY_2=6ErWOLdV7Hcx?^Gdhh=%+nG`5_`t)i1 z%`o%v_^)5T;zhCSz+~%357&_+;sTEaf^TP2z(AuG&?abTP|8d+CnHtVpH)Pe2-q5_ z$Eb1yJef)M?Qg}E%NC#c-*#V<4)Sx~G~cYBoleyW!{qoj-nH)n=d!;h^F)6;`fAepL-Aa)W^T8%A_@!S_pz!vj!ID+D)RXTx*HRr=JW?BS8~5!{jq}>RtUteX{A5?@ z&6_~}%{sGuH@W`#%MPTb{Q1{^v!Rf_v%M7$C?#QLD@d87y+m%T0w zcgR=;te|caJm~(}4vzCL+AsrdCMP)DmsTUa#&I^kF>=)YeI(~xd~JWMnny~Uba?Ww zpYKoo*Uur)z*m5h%W}W>;*uG^9hvz1e?FS{#r|MJ7^gqp_pjHGoE<3dCjFcgBuo1G z|9tfSJUsETme@XL49B25i59=Vm6H-8irG%{KbGp)c~xFqExCCh8_?l**_S8bI*uo| zbJhp<6s%IBut<|;EZE9A&Fu5q@_n2Ni5@%&gLc8X-@CB8RPJ7hhOJ<0$xiKYm1X`9=FR-L?e=Mw?@A$ zLfdgDP@@JGpzqrou{d!}k2#FR*}*gRUi@&W@&|jK2?8;Hc~RGkvA2#xs3OV#|FbQzPJc6%2QgHAg;`kC4RQ!X?1{e!^UbgR(WE3j8iuD_gi%Gf3D_PLl7Z(%3K{)KT9M!5fZ38aH z+qX9;bCC}W77S?czaQ^m1~Q|ZJr#onpIPqCs|e)E*1uV4XZBZ9W9<;%Y7KNAM$2&h z+Gy1aYL9g5$S_cJa0nJe%82deIzn1WH{(kQz4K1qAMg6Og}mGQ2oW8Ei+s}$5Ad28 z0-~qqHOaxs80oItQQ&C3&?GHMgZ%<6fjqXr2)Dd;jI6z=7@cMZBw_xbBM3pr+_+M* z?YB2+G%ha04Qk+=o2wIP$qD}ciqO$Oi)3(e&%ZWCKq55Zr@NKh7mz~OonslZ5?qUO zS6j6>)eZ4#^lHwH(g#=~MHV$h!R4pT5q6WMw=9=#YByCM=Jg5KIXXdN=9hd3-tXgq#8H zwf0VF_d}n1wX$4&4=t5H$~R|Nd)0}84usS^n0BjVTTyJNH@vNgQ`u!r0Q|Mld``+{ z@AJ}@a4q*qjbTz=vt4kEw3HOfpwdLsFC)9Q1buQ=EV-NsxB;X5_MdstTi|#}51M&x zF%%~w9Btm*BSW!xL~%v5({JTQzr+n+xH5c*e98wmj-ZXSxxFNfLK*lkh%Z2eJlK@d zb_)t18jDXRD+8!vF@Zu+(SyHVUXBIPMT-8dX=jjnDbn`V7MvBgc&kvm!f9g$&miJf zT3Y$?s7B2JG+>|vzc57*>{0d3%0_Rgq|>YAof5}EjMVGRG;3IIC3`sD;>vycv|+`w zdf1k5o3x#CT`Q#+MAC2$9Cu+dU9>hOq^mFoWy-e@F7MFHP%H4WXs*C9dma^A668Ek zsGPbI902GJl9>nr>k8X07z`i$9wMU#X%2Q?+vS;l{0P`!ukF`QMloE^QTg4ikATS| z@#~8d){unh!M%%Aq37rU`nh2TKX2+qvs36q69Xm?-IBNlpWO~|#65lmDm@W!^ypFe z?x=egyX*T#`vK&EDb|HCuRQCaYEvp`is$78aXo#X=B32eR(j`WlWv0JEV8N3=P=~U zGFfrC(#xWEt{?!YIL5uG1&w+NR!|ASLWNM(nQuRhYQ%7TnVN!%p$WAc^J;grDaON- zW?PBGbec8lG~s!rS={N#h+F-Pl~cXadAg8}mR8iT;fO7k?;F2=$|{&wpObFhkA_8OaJj-wGPacaT8!Ck{(a2s`&86;T$}%HflI7!(FBuWU5ft z{hsT1MliT(UncqrSJnCz6MJ9~8UfE_y+S9P$vXOMcxAb-r~l3!iB^3EdL3%Q>BGlJ z{5!<={sCcL?8@BurRbOw2pW?oomZ<(={ii(QGs$tigQXzN+KdfQl#$kXu2SbJI@Cp zBO4SoK5i01!sgejn{UT1EG!I{#&iYgoiQt`YinWDxemK`?|!Rv$p_9mwzi~Nee9DP z+19f-{3Z(r{;zk4qd#UzD38Dt&LQ-QqoD7kR!6RNCAAnErdq_zO67uf5WIJyxrkOG1pf&I2sI?FKroJ z3JF6%PpDV*PkBM`Veb3$9m4BMW|oo-i@9OnfPlA;AAi6`PH*v?^f(&*xLZ3K1j{T< ziuiMb#}flh-?Y%-kDhD?ceCEp%j>Ug+m=`Lt0P4Ce9vY#rBdz8x9k7hK0n5_yym>B z{IjH_1}X`a;GWCIcPBPhw-Tl@vD4@jIB=ep`R zly2xMzlLSMy&s$?5Ps(6=3KGWP_!JntLtVIG3N%4CI+SiP3$D(BtVwygv}gUKjx`d zUT?(Gh~I$R&~fN?wYIhr2-ApY={pSgQ#l6VxWC8?Vm_)o*+#Bww;?BTrdH^AQ*}!j z>0>3Lr$sBs={DxYEPtW#dlRZqDjXvzXo30kX%BM8>xo}db#|(c2`n~AFT|dkR#IWr z&i?mDz}inWIQ6}WTb_(i09|euE0i)tMIpPsgjdVQjkI}xF3^6V)t;BiLFkJh-Qt$n z-9AQJ|6IuW7YAo)_Us{LB9U1pSnZ^yw*GbLW)Hh;iiu7u9l>H6RMx7sQ>w@!UL2wi zjgL3^qPMO%LeNAG`=8JEGIHfHQ($L`HgP3HWyhSEEY5Xa5y8WG1jb*wRM)n|aS;EF z1>{&f$Nn^)7F6aec9$RvmkC@=kNhL2za}Saog1prd#7~Nb~G&y27)zb$YcioDZ9J2 zK?Iym^^#R%3NI-wDVeD4-W<+l@JnoLvhLLuAV!Zf?g)R~j(4%grq7OY(a>-dcA)dh z?#((Vkrw!-$Q6Eg9QX4elhG7ix9Iv2C+2(r+x7}<+m?P@HucSMSeuMMG6GjLhld3E zkxH3Z6kIqc4UXwsIxtb1=`VY>Hh^VV>jU<$12Qu<&u8#^&=>!9dxeeEb#0Qt_imRd zO4wYRv9rQIk2Jb7q zI;UUz7>V@P!L`L;uI2qoW6d6ex=>}f4B}ocX8@nYdSp>(t>42PCJew1@#Ed5m$%qgifhEx369nXIK`iv zih%w%?7km!!bhuU)nsrK1au#1$V%bn*@c$*r{*&+c3I23>uETQaSvMX@ z;xr2NvDUOSK>!WW#ekeRP0V+?kAz1Ivy)>(2T>^lJsG!YhXfPcTk{kni~LcYqD?@E zl(9mrd9NEjCBgy=>q12`@7DAV$9819%c?rV*<|<}lPkB|!uY7q4+J?7$CLA265B5u zyC?+DDC03G+OUf#G)TV6@h(m)Gs#JVYf3XgA&r!$%J}sDNrg9Wj$ZP@Im&q*=<1M} z*Xt0|iRZo6-(Rf9V!TOFHC9GBMJrI6DdnChXRQ28Ih~#e@^+2yBkifV>nzL(Z^66? z{_yJOe}JQAO~M?JsilQYhQ@JzveOyR$oMq`f(-WLx8B8IFB|s*rwI)Ye4vo25S!Ej zni_}F+Y$hO&qi}@-Ub^E#!9cSmtadrNS2y4Nx5n_Iuk00vVLJKp%HG%u~UhvV%JcG zVeVVo~%XaPeAiS7Sh^GF1Nq!bAGT(z-$5c-iBQ6uq zA#uRRRCLqfmbiGyt26r|+*aGs$2q|n9*i-*do8go=dzAnT&tbYpL{5{Q&kVjajFRM}Dlc<>R`wtb&9y8O$F+;bY-KqqU8?)) zgVIU>907Vt=9l79iRN=&G@u{GN`qYlQMGi;m&o3+D+G04iU(?RTIOQ0rP>$n#CW@c(!h`4+ zjpy#2rDo|4I4shmQll!b#3NBBs_*kjD>MJ4+2hE_Uchs7Y?^3w5b+Ze=5n}Nu4v6H z>IY@uWPh2o=<|fEHZ{Hg&DQ2hwJeVHNJsmIQ z_;&37T70ui57WlflW#({o~BaD<23lzidv*ljPBjEQF~IfapCF`6Cj68g!GQaY_L{- z=4QY4`{mZ1+eGLc(Bh(1>x5JMO5nYr`Ewr(?Co7)m%6-WU^kxF+~iJ1UeH@i?3-w1 z2AFCf(aU6mnH9+m5%I(Z`%N+GhX=s>?)+j~;Kf69^fwT(M&pUB7DdWUQfrX4cD?rT zg=8iM23Klj%{CsMZdB)1qYb5iWQ|uZdHZPj z*n-QdW({v|!l#2orIF#h_VH)crl~laQ}o`JuY_&XcvJDSm1N6 zM&T5ra8+Q{EObImLMRb}poR?eBmE5|B5O2lwJ)&PD5LJxNWLnD4kxCjB|250h zUC56g2swZrjWXGk3v-^275tTtYv%QsnFn=f$NJIrPd9*k7z#rqq&2iAYq*y`9ZlE} z32M%$7tOYtbke!mlVzH}Lh#w(j6@$FbXxfs5WCPCElq@8@HQJ+-;>WGQU z-FhgCecJtM8XFcO!csWM5%v{AiN zi_y3QOL6CijUWB^7%dwgmEdrIuComk`~iNBFWJ&m%%G}j(L!AkX@zzDstEtB7iMvMl61j6AsGGR6-=>y&MKyKOGvLYmsW zV!LLwu{wHrDxyY?y^OEd^NB4Dau$FmdaFNNW7;dkz|)CgSinm3+9pQqH^2dvL4|w)axoTR zul4&_fK?Nm2Og8*1DHNC0QFcNzQ9}YO}R!!cakw6}8 z`D3>`iHb0xesOBVX_tpk`O7onDrgJ%zZbiiJ@9o7vfmFRJ)>U#-L`0Qk8fj3lbss* zc8sjz!CGVdi=`O>mS_p%DyC=s8lOOq3)f*)eb*d=P3)~&(JJtIty3+e8L0R_Tv zDv>;CmpUnU;au4frpW#M{lo&+CKJg{@~bj?RvHzF>wU9urnVkhO<-r-Gpndz4=7WU zV)2L0H9c&@*}YRdw<{9FHa_uV_r~B8ao-n(y0N!Q`yYlOL=uvdxXm};@WEuxW${-? z5<8fEjS2NPBziw9xd9Y;r7zXNPxby9AU~sDZKIX(`%UpDsJ9GGDy%EbHQy`^(@W;D zrY)y^dD1mD8r!=`z8yz0Qs&YO1$XeEi{oKdYjr$mf2HzGgh+2jp~}zKpI@N?Onh(L zvQF$2QFy}-AMR5yx5to3W};=XHUjw*-~mX|U?xk}t#CE{D~YUwB@hN3FEBWW4Bkf> zO?Bk^u|C2;sq5c+#fEFPq8Mw4D!YfN&<8P^w3G8-M8OI&6HxG~9U7lxjkI)sxXc$4 z4xV2g*FwaSG=jM9NDx1lFQBhUzP-8b2tXS1TFFH|r?!>V)uf@f_lAvm4^VgL`14-b z@l48(A=7Om4^P!DMnSgtj~}ViSo;B*eJ>vY27}jYFDl&A_yv9>p2uDQN!Q4+I7<0` z@ebmocG9p2!@HHn?KN8n*x!^qffG%RpDsMCM8TL(o~oAk8-~foU3&I~CWp8U&pFJL z_>0o_Vz)+V*v^{tz#mg}go1xKACss`bW|RFsmOa(z-48K4)tsy3~xo8i{ggPK$rk* zm^A#xy$AG7aUsKMh~+Rj@4!In`?QV`I3}z76~k}}+wL&geiC1JdrZr>%?GuZ6^Ae` z2I+;mVqR-3dOX_2w8UeHvNJ^-L9)s3kHY9N)Jjt`m?cU;ZfVLqgmE7q_;XWzvm&bjT)X}uq=rbsWS!zQXWB(z*T_4>Ar1V6Lx9-Hez z*3Ul~i2Rnh%U&Q?M)2T2Qb2gYo%-}h)oOjQ`_%c(wR!40uz&*TF%#7)*xM}SN;?}0 zuD2&^Ohd|PKRP4lxnl@>J1)g3XnW=ET_#=j#hIDMSO+xT zYaYeMhpnzR<6VRM$iJ}w1OJu439i3cde9-jpEpm+cifl{LEl-S)_B} zznCs6I&$1O8_aKq^OD~pv^lmzNWV517<`y|x?b@XV48_nQ>t-n-O-Ylt#@!zuD?C~ z3>a&|ZB`NFo%@Lq_mHB+FyO8V<#C4*W|ZAz-s0w>OCA`m|cB*Q{<>W#pyoxU)_!tFKy{5X7pa1jFk^Nc~t%kyHZ)<``6Fo zSe0nE98|t})xIU%R{8rD12yqVpNu;c8h$uc5>qcJG=+50~#Fh8%>;kdx-GS=#g%uZ@w+vL3dYiuurWhaVoTbyL7;(*w zi>;bWt^f9owwr8PL&s(?`0;#@!RV;i$kV48XEi2cWnYd_lVM=2=eiJA%|2=8e4(`K z`$9Ci`E50GUMWUK__t6Hk^uSVw<4m|9r8(?@PIlfwlGQ6y@$9si+5o4N;fo z?H1t}o?#dm6jc1XnsxqbbaO+4#p-;>jmQT8yQh);c$2VKD*gnGYy6Jl-|0m@RZ=0- z74tgbMZ0$tr#EKA{-C5C4HBqm^o`2UWGhG>QmJHl^zD;c{2?}rGrA6@A;0(N=9O*@ zXRJ`m+#2sG-pcp6+4b<-jb0f`ZJuS8o{^8R_cwVA83h>xQ|LyM~4aho(gx=p`IoRTxiE zl0U2*L;?kkC!IpVT)P2r^T%Zll+JgSrUp={P4tyM1nPO>#0e}LMUz>@Q*G%F7Z&&( zZ03fg0j*xr$N(c+N+>EhpPijOFfj05YtKp+T8LoQOkIBCA0mbM3pk5KrK!n98R#&DN8?hv)e z{O+MW8oDdm`P~SRxd#EB!~EzHll%G;i&H4kg)q2$e~k?N|48Z7)3S$;Q1=aflc!V6AUwx2SDC z`8L5E5F>1%0rendQ&Lf6!RGE=numAdHV4Gzo)#q}gkAVKnlmfq(|4mn?jxgifBjAZ zp{(*&`n#?l(@Q*jd~53N_mqkank)&&GmffTEIV(6i>9TuGHG25$}KE(ORHBr=&c+S z-F%wjH0t5El^9Xg8fU7=C~G;rPfhjv_yjtMZrfHZ+R>K98je#>eSGBOi%KU^fmVOB z`+MnSP|#8>SG`4$L*dQoV2lQPv5lYk++du!ZJP!fx1d(td>hnz1>q(gpJovi73W^{ zkXlqcq5PGTgKz}&{0jFjP0lMsZZb_j+3i0%mzK>pK2*&Vk(g*SIcXXal3uKR;d9KO zKDU=`LrLkgz&k=&pCf_jd-<33=eXp0QId6JJWa`AymTV#v4sHPOVB78l^kD3VYiCs zT2V>Ir~MDrDrP6My|uKpuk{vAooX0_Q8Pfs_ZZOA(a^L{+Et%N<%lLdVPRnkRg+Sl zWv8jTPL4%?ygaqcw!$c{2fSe^(a{6A{aDVN={I{z`M1Kvf@{KW)anuEj=oROnK@~P zr!jj2Gv=h^InsSoab&y92}YKXy4M{YmqS9XlJ7A#n!RJ7`15S(e>@h& zt5;u_-!e5ezQZZG7Aul*RNQS#!0~8menD5=l{B})`=+M{ck8TK6Xb!{rfQqzdj9@9 z6nO%qD6k7FpV8fZbexMRefkXQJNyrH0U~vdsI)z#J24qMJC+O{(_ zYS&!=q{g8?jkrUlnYyp5s?N=n`8WK+u4-1a;$OP^uf1yT#>mswq%5-BqZEP$7Mwio z{r-+(sJkPVmS*qElr|hnHXp+*RmmQF(F-@81a7?Ve=Z7*4jmgi`%N6ht6mR0$=O<>JnzI=W0VjjV3V#uqfLw6vaA5865v zUKQABXl_0|KK@aQg5&7w#^&m(Q%1Wm2w0(}#=nE>4xZ0;_!)iuVb&G-zzIo->4%5? zy>*p`M6dPcTDfXzg|3_3e0I;!0&$w`+?|K6Msf1fh0+I)5`~sEX3`7RV;cp^?o|@W!I7#c{E6Mh2>G-mCOm0WV2+h)$rzMaO>BKxlcov+L( zgc<^4%rC#J`Zdcf$WUFjmU7kEDK9rSw`wS_sj;z4+#~u@3@5vgbM%1WR)$)c6P@Ym z#JR16l9{TnUxUGJ(9sF688S9DR&kteI}*d$d@G%wfoj2(Z}b(Lh=@a2pi;lrv1jUA zWW<%p8M@5xXPVKOv)fng*5cl}OQ`%%{NKC>c3r5|zpSqA>2k<#_iC!=eVX(K4+UH- zOtuh?czxX3b}r^+dPT+RlYMjlS4U?a57qj|@ngvnW64;ju3eUN=Vu$+jhY!TR}&e@ zR>VYTEKQMhFc{mtV`-?XvZYCuNY)|4a4jW85y}u6O5#T;UfgH=dCu!R=RD^;&+Geq zpYwfxKVOSMOi-vYsYH-2Jlc4VJJTWVKlwADdrCX1jk3vE!Srm+mAT)+2RtFZdP>?O zipr??US56{{y8-uxWs`i3~5#93P~OMv`~vObZ2`GdY6u1ejb1{Pgrvc-Wi!h%Jkvt(=u zELToK&N!3i5<42c?9IO#+~UB-%F3k-gBl-5GbJxrQb(mL^^k={-r(TrR3M6Hexg_NN`fD0Avzf0zQI{W8Y=c_wB{g z2}Aw;zPQ%bRvfMaaM|6*D_=6tnV!^L9A5wa$AjG!hrA+rps~>kCkFtz3`j|NW22_B zQo`lI(50f7j)V(nG!h_{^=B|x^!Hl znHp0Nl3~0ZZxhK7kkp*Fv|Bvg(IIc=7ZktK0R9=4&gk+#i&$~qQOk`|Iiw{_;s{NR zWh*2_5mt!XCyMAZkKR5O>eGx15S?Lfn zPd~qpz&-h~virNXimU6*&tucTQcoxBUXVMyV1|m3Obu@sSS+#x46}FJhn9`Eo+Bg1 zO158M3M5HF5c2r4NMva(#PK(>y7Q#+(aWaBM#sC>t}n9v_JY@E&et~8*OyjT-^90{ zaTz%`?(JjB5+B-xlQI%9LTbJ}T!q8=#PSNI*BiZ(?K!_)_NZI2i;j*yb?OD{#xo#n z@x25+y|A!gc?Vy87O1Q)c6CipE?-Y(JGr}WfQouG&*JA_pr-31=CjwUu$dWBsyj7h zWtxvg%Mr+d<|Y^Qby=$`6QO~PRaGGOA2$Wu900PU^5!z|bv#TazKK_EP)HK~M!G8q z^#_w{j01>7kWIq_Rj`4e`>_`jA!cdab>zkRsw4jbX9gtip;s=n7j=lSpPOoGcKZyg z0s!xJumX}YKJ#>j3n$SSA!37;zwY7Xz?`c(8xt3|y!!EE)!S9D*5&E>O*Ion$)F1m zCZhvRzILtQ>C-6d?Ck6fGf&2d#bBW0JmCtpab7W)CQtr`vyjPzv~D|Zy(S`+7(mJZ zFlL`?JXhJGE1>8wSg5COeDY{NHV>i%KwH0Qav6)woQ_$!*V1xhJ)UuU0@YE&SYi2iQN53RMx^m#lof2SFW6jj4XJWmc&OeDSbS$ zo=A7|=%`6ve^H*XyJB;)z=Qj`A8&@z_NlJX!yqj0Q*_?%3d!1*|WAbEAtng zSbcqcz?{W(!%#*Prin>2_^GMWSWyu9yZqPKKo9eh$7dou=Hy!*ZT^2?6*y*4XQ8Ho zNuP=E8`@9?UgGdMlX-;3Zegb4%Y_B}B}gW%7xyk!m+w7Ik(1jhtG;{!q)x4O3`&Uh z$4%_PTp?GE8xC(glom2w`b`Wy{N5_*kwo7KaATk5o{DdYW3P_Hwp5anx5%%Y&^sH- zkQO6qNy5nqS+Iko%&7A?|1%%_Qzr@$)-8qaWt&U9vu*G7VX{wIj&nt=n?59Ce_TcK zKS*7gn~i#1qFwY^leJ;ma?vh)MugWPK&KCH%BWG@II?C2hyeSebHd6~g~<+DhaA6^ z9Hk2KDGjA9jXr5A8cUFNOV?c+?i=FQPV5vw+Amz!pJJiodew7+X;K8=i+-+{ooqhf zp?23H+tGIbd(e^C%AT|VQZj1ho)1!o;F z#|a|)QT)b<%z*=`P8>F71a^z9x3;VAuL_031VptoZ)Kq$<6?_(n+=X`&I-;yMe?e+ zooR-kk(L-~Q?2eSQC2k6qd6hREhilb_DUQOaG+C7>i5ZZY5es#QJ=M)H0eO7dK9?p zqU5LF7D`R1ACM<;Kh%LcAg}A*7s5U2$uutvEMmi#OgU~3w+hteAex_;xtc}#2Ssdz zca;0d@#w|L&Q$DgRl6U}Ua!Hjzr5@Ot)W?G4EA7__&ZRpq+%MB3lyyE&&ysz zxZVq=j*%pv|ByADreAJXPe|FbM;-m6;YttWsY6uj z{&?@hnt;8NQe#&u^E+uo7gr%D5bYlz)&dCTKz!yP|MIqMqs1(=b-UArHuW!UiMjmg zXfF~pah_TAk?zf0(1z5))wqyPhLCHynT#Yp$4mDg@_J}z>2^L=m#X27sGK6n41 zqlT#Ot9`nV%rn3lFtyIqtGBakhUgP_%Od++5t}~zh=zHEP9S~hfXZS7sQC<@o&?V{ zpEJv4PSBS)>W$*6zxayxwn;Q*Hg&P2}SBb#!~5>Cx~xS2XbNS zd~lrNUw$z#U1#Z&U4t^jxw8x6U%R`Wwu;uES0en`E(GOBr!nEMzd7Ixa6PrlNw3#*G`uA8*{a-H3JzexkCZ zcy;3j_6cWxI-O<{qoPr)xi4X$Gy%>V?qg2b!z_nLl^GVuEHqj$3+P+C<| zhFQS?8|U9wo*)X@^?$-EdymNRe?N}yGHd+jGw@^P$eXDDy;Yo8p-~4G7kXpAA_&I%|Up zGGi&aj*hRWGBNIB&n_>-8o>cvh}72`dhqh`5sKe$|K(9$R)(wd@!wB9Ddn+RSUMbU zqRyqF!Ed$s=lWPsj_R>L>QgK$B^!U~OuAdr#SziMl5e-j-1 zT=(NEWD}=npO2+plo+M1%C&cCte@wn{t!xUXGJ4*c>VhI?yeI}cT2pUrRDd^Ndz}$ zag${1qW(8W`;LghK-7CITAxd_0wqk&4%rge4WiNrI1J0Qi)UP153&>7wkF@|WG8&l z${VhB7RVEEm=-TKtlOCJr}}iI(H(ktcC>9~Z7t+`x2q>d)cdfhHPPby z_{ZTP7BzKK{?kH_ze{nv%7G~1DSS4s1FDXe@8Gs8#4Rl?`JV1Ozw8R%`zU!qMn)zd zM&!HDnL#U$B_y1%J$2?T!`U6r=5@M%hn|y*>*Q>^G|^&pKsJ(6TqZm|{^`({p^3^( zstULB`25ucbo0PZ>`FA^V4`rQY=! z|82d3XHKg*FMg#J>U`B0PqXU#XwvdF+}EczS0(9<)Ws?0(y#Qh%ZnP-)bHQEX=&Lz zj+RglphTvn876W6WYeo07>+kEa9!+LR7(?y|MVl8b{T;~`{L(^t<}|x#8Sh$({NG& z*+0MYaD(qrele_*TOYQ|NyuIt&eJ5EaP6{KePUZ(s9Ql+Cp$JeYCc->=lSz6Rwm_n z95NZ5*gf_82>zWw4j%0h6a^$~)Qy=2ZLig}q3%v97Z;bc-%f4Hr>7_yzK)LA1DJR} z)5TMiy6^MxRh*xoBOxKp>ir%2n)})F^86u%QG;Jl-_2E&F1<=ysqe3QGVQ0lK8yIB zceVr{;j=CLcwhCjP{`6`q-e7XT`K;y%WY@Z?P+wrV>fxsTM0|OdShc_DM?98^!5YU z)zQ)Y)y^;QW;zJjJH7lCyB=)JMOkBivYq@!pm)1dGOB-8SzArb$m~}b zxVQ5sa5PNvO*D&kQ2;VJ(;6-=E*6EzE0^2EGBGaF0Y?ZgS65ftn_H9B1}6`CXwtip z7w_Wh_uZtPkl>b(?9y5A{f6kU87X4sFS^vTHw|5M-=3zKYD}>nFHcHMEzHYHqUsv= zKthea`^`h$?N$3q|9oLV0nX+ggM zU_bjMK8RBg%c`TBTxZ#D>bmw@y4ck8(%sTh;?-3szB0Bb28D==|ZaGNcClyX>MGa`G_ z38Q{CXDm7n7HZ6N85PaxleV_D=X-WaCEqxvj(PqH|9#h~v9A9_=>46Nn$LClc?n5oCS z)6^apS6sY3-w~-4&-$RAo?ByBEt}e+YnFTnS4M{-a+XTt<}rno3KixQ+*aqMo*;*0 z1lpL`T}ny^a&q!)QpPMQ-yhUo4UT_A+RqDhe?*AOv|kO$;;}JL{Bhi#HfX(ju*QeI z7f7`GEK^3&6V+!2A&Q|O@aEhDlUh7Yic8o{27}}`2S0!1^WO1LCElQ9>mh4}nTp5R z3S2JuM(1W7mvv6_x{Fx*>qn#mm>UV5aovjNgp=^k+~e)XSUY>C*()*oe)wO#J$ycJ zncelv{%U}Lm!FVrjLA`CUY^z8rLw;-;HJ?JnKfWlE)EwP3BO!$bU(Tmx*BcYX=GP` zVAFVGjzo=!ni8Xbtp3pZkoBBQ$Yn*@S<$=UbpJ&9{HjG!L;ahhiMO}+2AgzRnMF4} zRCbF695NFV>d|#lV&bA&bOG1n`QL*)jrJze(q@t}M#k3GZxPhIym*Q?>#@Xr_hd$k z;pK71v$nMKPQ6S{af^1bAvBh@wpB7=w`ZNVZ!vvUK(4QgBAgW_S{$!1D6RT4*Y;P+ z&+=`Qfqu)aNJ_D9inz+2!PO^M_JT&)3hEmPB_$;V`qf`D2in`|Sy|7IcWK)~@qeWV zq(>Q9m`#3DgdQ?k>v_9=-e%}a3T;P2m5KDdUBeHl-C3ml{ryMVGqMlpTjskHIHaVc z!otJZ*a~;>CT?mB2R_LdU44C7#Zl`)QHBm`Stw?c0GIeD5BKS>^Y%wrZ(AbeuJ&7XQT8 zrc>f{F#CFAVGg>75_wA_W)^2Ovu$-a2_FG2tjdF>UQ#~m-!ENU@MLtJwIh+Kt4G(@ zk0#_lx3EZI(H2`B54QTiMMsDB7X{_iY`XjxT9^EjKiil!6*+s2uLHBcb{nq_Jb3a& z3rB`|r7KPu?N&jd9rM!ytwP=KI&b&hWWEaPA(DF(lkdX9VpThCtmY)~Sa49|btds> zFaMnSnI=kWeiFdee&yxm1zjCBV~&kKy_Jq<2r@c>-~P($>gtD?Z|*-(qI$*2$r+o8 z>BB|HtVM*=o+*$-3`0g=Ug46Y)SmFHK=N{SU)y5dE zzrX(mfkxWwR85ss<<&EJA@K(xdR6wOU%Q%{X{f0wA`>s*NSL;6c%SSoM$-oOar4)S z`5)?5*<;eTsInRv8LftyWfrjBR#m@)j_%~_ZDwJiU2bV*V^iaBmx+_>c~e*-dH6@B zU4tTn8g~4W6zynx?7Z?CcLz#wzlDJZV@IZ`LPc%Qknr0EY&WM0S24{r^2tYhfQ2mCdw%kDw_I*AavV6NZew7<<5#YMVr4ibrXtYm3nVdf>E_oCI1eZ$~uMFqZ$ z&Oi8CA^7uW1teTp$pT!8+kCEpfwzt7eKrczCL|7QsHzElUg{a2jkJnsn=p>^qJnWDD>;r5M0jL zhrXv;p|~O*JB|lyLr2@)sv<0!pHyb*ecutV(JTa4a2VDe!i0mQvN)GYiRE}8S z@7~ooFIT=(mW`IQpZo?T*mIGEgAvMqmP%6Dk9$MsPCmZAfQC3fil-9- z-cq7Aw7$NL>b5z~$H>U|LwVHyWNWIXP_ODPO(w5`b|Vf6iK#_g6N70+Q=>#fIVxGu zUHsGiRou%z!e0A{nPq+#UZJmOxwxF>S{0=(x92~r)9&K)c^`h*+1c5h??@MN-J6pg ztA4>}Gn~k6aaUJj;WZU)o6ef6ryQpvf5f@D23g4Z{Lo{l8?N`Y-$`qn>&DA2w0wq4Bm?1dGQm2QjCnW zU8<6P`%7LPoI_E-hfWs`qk7xvTF;m+F0=Mn7Hw5*oSaABZ$)%=?&w$Vg&kF#(V@DijQc1x4-Z#L z2BLJ4YKf~pdp5c;#xqg1&1g_VB3yL1Igxt!YJRbs5JB;B@#WonktLNsH>B@rjYIc6 zJ6O-vH?y=vU@k#FnAMI3H~cuTNs) z=HA<19dzHCRJ_#q`n-4TcOETwTL^APS1i-nOltL;y1I*3Hv_-&W5XV)9 z;e!*;{A8^u5LL>LLJ80dK$cI5jX!=UG8Y)s6g?|7J;s_SG0Ec1Nli_ysquy{qgPAg zh2?c|cI55h;o;?{q<~N}OyYTgb-kow4U9>xCMxabUU=^aH8BZ^tc=Xc`ufpI|N3P0*F^FZYc!h@b?t10exNp{x4lM+$aT5L zzkmP!B>$=OMNiV;)ulIH0EW2u4A54y5TFvZZkyJQj-1c))U$>^JtBo#FC{IV%x`B1 z+t1d-ex`mCn4Fi_shiuO;_2JX1LKDq82Nf52Zx(_CMFpte+gImGBiU)3HMS04QoB7 z8yow2dRX}nXS_c^RbBa-LrzMV*Gi-H~X7Rw| zj>EY&bkG;t8knKnm6VoRjh6IB3VY24Bat01i!m}jW?o-e86Cg$#@DEQ;C^(K>NmHt zk~lXMSFh+(yI~wo|0r4Eru^WiM^Magaj)EwP=}|C{4t>bU2nu>zOxxm-#`@1y~D%R z{w#+2q`QRd8=IRKGb|xLSnTZVkgk;?{s7F%O`IA}K4$~5{E6c)eU`;2yx8A!WxMLCGKex+AD+=OE5}v}m@W+ zI*Uqx#%O72tr(JuitPI{WoH`vwE-(?YHF^k{sG-6UCdW$IypVvRxX=#Anbv1yjCq8 zc}!FkHixKe_2Ueh0XP0ib=Z?G2VXYsA3S|JjPRST_tgY-z)FcQAr!%IdG+!)b{^VE z_^;lco@~tVTF<|Jm*>Qo^xF@c@v<2P4(Xs46iL~Sp$8a|2+!8R0p z_^`UVI_H=O?dxEGT&QBpO*hlA>L%l zxfD7D1tmGTvvJB_*aOIS@nY9}eSK|hZH?-@auT2QlhDhZL0yzb+gs_E_Vzy0uYQ^F zilo-->auPDec<=GJB#l47p?NQ$PczXZEbsUlnLQ@0Gayw_+ZZ%E3w}C(Yf7lBn!WV zLfk7$yc!^Mkx_$~r?0uWxv}xbP8Xm#oq;i0dr#kXfrJf3O&6fIXll+f)Gpl#X?ekwdR zDKe~kx%@MgnCE$j10Eq^aD5!RK{BY^>T*qnryv3Otm5I*(q{FHb-V|7L?P-`_^cFT zUeCZll#+7W>wx6r?KtoQC|kv`<^+B zmWXk2HFb85j-Sr7(7^sH_c~zq2{sLUEYzfnDBra@g|}$rYxZe}g1MD(?3oF7Anx)UD~f{r1uVkX@4#6QLdLul^10 z)W0}AsPQ@3OA&C0Whrf|cUc{n@jH8D{vBW#kQ;H&3+Rb&LM8aKefqEuH{zKzQCM)j z{bl76IZc{}^0k46`vIes%)YyW|J7yHG@G;~II^|D4?d+2U7{!HtN$eNeepw@ERZav z8lBD#3-3`*MhU_>4EOY?VE2#I`dy32o2Lf~_VRjbX{sAVv>Ia(Mxj79*W~!9q;ywfBg`OmvjnQ2V&p*v48Y1ci z&vv0h$jQqq|G72G^2EsygTKBbJOz<6|72AHV?V?HN<1fJ_knn2re^L>jhkG3$Gh*d zU#9SHW=rj*q3bjc5H(?XMx+-g0*hTwTGgQKPq1jS2fuxb7X7KerlCRnle?=c zenXgp0U!}^WrByYvP}x?iaDjbRpI4a%^!HJZq>7Mp|wum^1)pE@m}8Rj!q!Wl!E%6 zO-s&ldGvy)yi1G^4%5@;Bt9sI8)JWW{zwj0HMhPut!lSab`a)0~ooMS)5g;OIDz{Uh|%AgnZKnY9k!2!Qy@ z{L}>&*GosolBn$mmcs?Bz|&B$&T%<1e2%sZ&R0!HUMzEiL=t_-Y&%|#!%=8Z(>_!Y z!Aq>GJdOH>l~lm~v5NCa*@i-=(|kMJCRAkBxkz#Is{NKssQCz4JeH@~+Qk$g&cu<9 z!EG+k;Zc89X-iBJt@`jSK1;lr*S>XsW>9EIDT3cl*Tf07kwKNcT`1|~XcfQTxuBJy z3(DE)8`}<5kM8(h&`^ckHi&vCh=@Sno_KZhf{WO%Ppv?WdLpFihVM6Lc{gQ|eO!wI z>DousH4`(2BBDTdK=~4Kv1BNGwoi6e_U4?%(Nad2F`k_bZ=K-l$8;!!Aj?N*2LI5; zq3B=oZ}`TNxDGdn5z1JBW-e9=zn#=qa3thza%_&4l1DxpE-~?Eq6~Q?vrlWhZ~x-O zav})Kr1*6x#B$BB;T2R=zIp84l5@$D3sZI+UA;pqC@4t92DlxUfBDS@z1U6QKpTule*!nsVqjxSdIE!EOn>N%vN&DmZRVW^ z2Y!4&ua?W7tc~axHd9XfWcKQ^wUbR*7 z0)#A3+W@BB?lyBY{p?M-%#Ag9@}_II&@NQ~dbKnwM%|8k+wUkwHUPM!A(UOnnD^a%L8oM*^!(SZ@Lp zbPrEY#rJSGi@^Z{QA*M#7>k_Au=d-Y2Eh;30=OVhCpa&+$1A#b=NUjm19rZ%yg@aO zcyM{Bw>?qi0L@LvVY(Jz(`sKv3y?Sbvkss}oOLxd!b{z$6N*lv{H-hp>jDzR;4uYH z!=Yf(`m^48y;Wk;0s_^W-*Vd8Rc0Nkiqpb}945FKzGqk<)=ZUId=2jCfX}tJwap~7 zq_ka9B4LB3DZ>DVnU#@I@4T$)Qw(?uMO44USWE-s#q!Hh`bHA$y$`ooOkh)Z=w`}< z0B)=I*!B7SxgQ#_koO_RFsH7~czJ2mR9K#}l+^j!P=5bwfN7@l61w3lJj2BXEVEAT*XvyGY;v@*(&>{Q}(F z+<*cys7^g2$b}Dg=jDB>m8*r z*idAb<u0cEZm8GrozN$2BW3DatC@rXf_QlLWLr;&gijthn zZIPUBW3c)?4NOx?UQ0)~2kMt++tKsw;qqNzRLzX}U!J^Zd5c-&x_)``H6fEh%1>5+ zRiTqTa@@WtKsHo)2dJn0&kxn}9o=3Buw_qDVx|PG2eK8xG^7wacZl6Z{xDdJ&+?xZ zFgGFYINLW`I`6hU9Vp=Orx|%sIV)Av+i$E4AC_lx11E41`1jAAq^nucxm9RYIqzPP ziF)BhGN`3R9e$<)BBu$Jno+x`7PxgsWEtJ9Gaj%yy^eR(HyQyapgzC4I1-PV0()_+ zt!)vgeW(GY!VA?@q40`~73r8KboD6tw;BrWKe!aN#dpA*GOT`y-}S660JH}!Y<{*9 zO&K8pf4DcJX0h?r@$3d)1d9k#?1bGmEC;ghbb*lOd9a30q4~jPsV6B>gIT*!7hl*a z+m2#m7N?AKlnuM=^|QY-{#OP<#z^lZTxbwwd6f4ZjomF1*vkxx;p5He*oOgbs{{DL z{2dYGJPyYj+(H?c6hb6^#N=e>4t@DypOQFR9k47!z5j9yn;NLv9VE&TQ3RU7v)@C1qLt1 z7K$6xztA`_{j#H)dwU=Ggu9d@TrgEvd9ha?xo(alZ_dtu$<#=F5{8CHMs5)-YiVhz z#IV7L6(J$@T12W}tu6k|K1!+1$6|-ROj%_a&e5etihJi-Z=U@*-ZdK-6969>uS~h- z2RojC<7~P`S1d4lYagG<6oF#(K>u&qM+nb2!cbOer)OP9c^Wxi_69R$ElOj7t(x`% zKa1`H03{FgCY#&s7E}81`@}@X1^0YKF>O!;3knLdC&WJa@_h8WIEAl{1_4lecxWhY ztCEz2Bs51sryW$el6(~6VBRrU$;j&b2hytQRsfUtQt5XS=Q8H#mHN zAi&wBWqIIIBrP|kaKkUfB{akt6Zm82jUtusy6tte06 z1EZenj^%hvQ}J;$s!9kK#0#6sv6sDt+M<>cf*5fSt|KQ6OS&ezJj=9M6E z0@NhrP)uKgzWgVp3^-3^r5gfcM>JgD49@G$on6?|8uoXo1EP%V@Eq>eVAcOl2YyC9 zD^bt~QwId5&5e8}D3R2=9L}{}BV35;Vb`a%hfAO9Zc9-!!OkW75b*#QFl&Ac;oW zi@3&MY$kd)ZHQR1{Vq`QP%FCfKby43Sz^B<;#=DW0-%(7LJxOb*mG|I992@@*^>oe zOw6~Zcfl2ndQ62SAzIG?KrN@Zm}6>+ z_6}3?701sjBhmYqt6}%4CrUYq)q{?Wra8Pni1~hsh}e34`|KWt2&4H-#MItWFN1mR z%kuF$?~zh7`I$QJ;Qll45g>HJotM+-rkuIe4*Fir|{mCs>T6l0A1uvvsN0bfPN|Ec8}coT3=F#dn=@}RwS2ZW2q%3Zf5EriDC6BDL z8hi`Oa;nC?3e1ev2Gq^HMP)!3d4hAIqCl$N{eJ2chji+SgmnDy;UXb113&*EEGW8|MBbhrM~P2sRembmMiF%@m~3&pUg2&GCs96&1&Z5MohK zEb)y?lS61peUF%hILqO|#fQ?Hs3a=$^-3GXeg|u=9TBOR7#NXc59yG}jv0)%r$x86 zw!FN)gAh&BaIk%qs};iCZan&6qCm$P4oyRj5zJg-oy~*GckaI_c4OKs^tCCc?jIWJ1#vk> z>3nf~+^oI8g}>VrL2g1R z{(ZSK`fqd4-%i@gQyU`sZ*H4wf0utfz9w_@q`a1BbAeEn#Xa`~-M2&#JaXYAf$GFG zfuLguSPfv*M8rkTHWulclYzO6#?4tcf^(j=0c z{a;@=$l$N7k$lG6)6+FhKg^UxUmwa3zF2^m6<9P-BS|$dkZ9nqhKA`7azRi(R#DmC z7`yto%m_XRdea(sl2MgZ&m^m|GHG&hjJ;g^pp4u`#cH>Abb%~QIIaA3EK)}1s()~> z10^I{eJOl*flz&zP$%nuer^tr%>FxtZCSa(0^6xcLogpe3=7%6gM}rdsj7N1!0qJY za}EX!4gpmO_8uw02VwUjy{fJ2phXHf+SuypVw5}DSZdTX#21S7s^q>zA`mj>#sL)F zM-R<93K9~uLzS8IhEG5){go~*&tK{^|8^ipnf9P>WW@hy%dRanF6S>YcvbI2q&kmw z379lwxVAyx2_;|)aFOnG2n`YI`S6fjQVtgEV>3HDw$0h0;bA8IZ=J#S>|u9<-O?l+ zV>CvmyH;t+1UqJWdK%Pr(9EL8JA?>jW{PyaK7Rn&0(%-|8JV##$ir4ug7tq}`O5$?&8cj*z--^pkh4qA!QP@7L+<(N!-$rS4s;+ZO7jntVMks2Gj-l- zt5z;9`=DfihXm4yGmvlap`ee=d~-7J;(PH^e`(2Nz!k};)+3rh%^ry+^j!>nHEq@& z?66c&Kp;F9WK09Q0NTOt0v%0j@L%PF&Q?7}<+nTc;2d5T7eJdKAPa0X1R01+B>)wVRjAkus$}x$&pw+nLCa5k z20R#YXNc!fE`Wx2Ed=H3DkV$l##%2L&V858UX3X^m=qgN@8d3&;YYJ9wXX6DyWMSaxFD-^zG?4}U_wW+z748HSv`TbqOTwp3K zExls1n1>s9ukvc~-gGEX@P;8Ww`HoUAB+t*iCX8B>jpqV7d&aR46=2KxtO-&70az#%@rWMM8 zTm%_81;twxd8bKKFCs$1^lVAi2V!D|&>{Q5k50_UFd-3EOk!=>&XfWHoBY=8i{=*T zg9FUcJJF>H24U~sL7Y1bfz~p;#~Z=mum8diN5?vqMJUkj`1fFV&xXqQh>GqGiiFG; zmfI1tk0lhM)gQLG1NA#RSl2c%Sf|bvbTsw{r5c~Z%Etdf6=}vr)6%Y*SC!S^fL1Z* z_3J-Z4v!f;y%h;wyG6yIU1!QUT8!`MSx{3;US9eUA%%to-uwbF^zd-$@n6WtPXC6` zi`G)9GdI|1Z$}h-gc6K`f&wV-iKeE*c)4fj(a8BK#K_;_v#?*^0zV>*lYwu6qPXUH zup*CdQe_%FmP>=v6_E{s|5nJ^#lxo=%K7KL*YDRN`zPBDheD&_i6MCXBX}t+a?Mg* z|BMEa%@y&V7C=K2*YPUw-*+IiDE@zc@c;eI*8gWp;NRbosglctV3fXwH`moSJ9%=_ zP*`vQuOY0pwe{P#(c@zeJekwakaq-@Yi*rDh44f9ZziCDMuwD%8zI6H-9IoO)kBTo zCjZ}YWg4lfsHph(d^o;|oeVCIwT%sWW>4F@u=`N(K=IdI$jv#Af?RKVDVk(#^?zds z7g7+G=h^9rCpVYb6z2gvFdobLxt64{@;c2qu$-!rO`AW4?xh>b~66+ z#r+&~gFngsFfqse@cW5F20w#5-ajXHeR9Oq1~)rk8wCagWbZ+@1)qsE&SCPK-|;?<1AXz|Ur`Ua|KQr3zJ95HQW)VA zj4~w?^Z5*X48h-(P`m>q;^Rju@RQWiMF2P-K=KRRDH|IbE1Pvd;6EB09nTK0Db@6} z7{sp#_IS#GNd+*W<1>TJN&n~(W-NfvQtu;nKE6Ne>!cJEh85No5O;<(!EdimNk~YD zj}M712VhIj=0b4G+8;gY1)=$k1$-MbKR-VtEI_|~(sF)%*5Cl#kz>!u$cT@RXBOp$ zcpz|18&ItZ3JZ~ap)IHBbv?V&B?G5RM(#}YR-ypZ(iXrA`T62K%8DgL@aZx zuMe9ccM@VVvfa>sex^6vxE~JkU`k>l#EAa3hpz*F8gK9~{{1Z>f$(w-ZcAA1`1o}; z1zM&KxXZ}@yVigI{%xDq+34j1Xu7{&02HH8*HuR7V}+2bK9|dVaiT-U1h#e7IB*Yn zTvno>d2{H0>l>@KT|y$W87>Hoj0Cl-K2I%v?(XjXzM%7x3s`ck_euadfqK5Ox|#|8 z=s?3&dROtByQuS0c{FVYW3Ubp2}nsFZpzauZyRVq6!UmvOw+-^L0H(^)ioT_j$`BF z@vJ&``LM7e(5N^u)6xW;&Kp+$DhB~LN=i%wpB>ZUd~9R9!t8WE&vpGf4X@-Q=ry~a zb8?;l!OW&Ws8-sJy^(LF0q0yyOe|5wdh+K_EJ~Pb*Z~O=?PO88rKRP+i_l_h4t^Jy z|Gm-D{6$TU^f9Tx!|3Ag{Q&u?LHD_N>oo>;hB(^SM|(3sP7D(LFl4y0hxmWFaVN(6RwG zlHNfZz}C|f{wK{P6T1rBK|fQ5iD~Kv#xq#x;H$O5%9(-;vV|5H1+`D|hn<{uLGXpN zF<`FCiz7c16BAfHVF(1P!S^0G`b)^zp!7gmlZ%(v=j<>%-$qnfIUm9!BL0_T#7eMM zA5s#Ak`X)$OxVXB4@0B3nU>Ggt@zr(hTYEea_weW4!%H}3IX+@na{^GM zA+o0fLYRn%NQo4T>Gaq8%DWu2pbEGY06GHswkJg(k{1?#8x3t%whgTUi%2S}=0~2< zn~?$M1~c4zd@M%wx8%xTLs4*U%BWr7C zw<|pT-IYfwyrjhOjVFxnz!p#DdBOku4kqU2h=T;k2&JsJxFB5;(b0zzUAIRBf^iT6 znsg6OCFJE9goK#Y(rVX-3){ZYb8`>O%-qYOYsCeE-GR0Oxg?-5(CU+GYR<~7c(_9S zj49m<{;Z}jqw6J=jXk_FMOVuAL2cWL@2y)ti zoAcj5IfXMK+qRf%-39eNu1LJE$lz?U`mb@AmA(C+<>hz#sQJjRgG9s_off-tU_=7q zL``F3#C(v?VrP#N^ErO?gY$8lZu7XD#_alf%B7|(;Ah|hdU$>5aHv@hXo7t&WV99N z0|G7F2}RvD82$Q*mghEAQiXIni(8`?s@`5g4we?PX&WmE>ptdUm6f^qn*y1W!2VB< zge9%wr>SnJH-j_4m_|dS84DrMIqitZSV*304Fa3XdzJWzS-@^w|BECQAr6kcrRBbn zaN%RQX(n0x>X(ZoU`P1S@9*zt-@*3HxcK~;aa9Iir0{VQG9_&r(sfgTJYUcB^e&85 zb@36!gQIAMu`xII@@Omd!#S!4tR z^iTXw_pQLbK__7Ci+Rt?r33%VW!aH(f7SWowBqyUPK)mNk73kwX-|s{Z}%#_2zsVB zL6?qvyAc#_Udz6fi?b?NL_i7D{qR}HlKKJJbA=Yb_bXJr#Uy1)&kQ)cxVQjYlg_|Z zat|iKVA>_~mCGjxSJ33lBu9}GJeKKHeN}RCK87Ad=fHD<8aS}kL9zO(Q7ziu$5l!8 zJGJ7=r*V6fF{T7rHyi=a+vZEeCN&@2N? z*)fQq9#r|B@xNH!>l$fztnxHRX~^^M5)A_hxB2HzOV|@Y{v}LJ1NKU(k8@_Vfd+@W z@9!;kLwJtvs<6)IL~8t9@rrXyRnkHr^@^T(o9089PJC|Mh#US-4Nzz^u3Cp26nI(A z3!NrrW@a1V#ZU58foJW+d1FI46@`BjLoes}zH z3uPxX8OA6eWavI!`w(E3n;RC0!EMGwt0-%`*1$!l8~iyc&Zji0Ri1-oQt2?GUZj5l zO@%JW(21nmU7F%ebi-T`Bhkdf_;|+se9M!)2QW!=9nm=3ytg1I>}H$)B)`&BF81o= zMLQIrSUpXZYd^Ov3}4;(~(OsMQNHI8G)KL3B<^Z(B&-e`L;MgYbU5X9$Yqm2H7Z@7G< z9UT@CAs4uc!3{GDtyL|VT$XC{IHz|(Tcz=@Ou#Y1Jc`uxe+#} z9Is9v?FbKzjA(C}>-yPrIs6qCBcl7$CU_kwMj*HoL2lN*N7nf9NDs9%$+=;agY7hz z)!@V@iB6mC_`V9bC~ouZ2asY?Q5B%_M2U?*_;k+SFdry+|37XJTS!MwPeMw1k4*4c zU-6s&CW^zbMCwls0Eu&)pC zt~+dgtCUJIHe|pX6Y|_>Fr%idOe&e(wL>g7y6ano#Bfc|G^mr4t-g<0pYHNHc9{cw z2J&KNYMN;O`0$k)x7e>*1jhBrSvbJ;*VPplnQx>i;n2sn$aL|YEvcCp9o53NAUqb4 zmzPJs{<=)tN1B@J!4!rWMMcq89U<6E+3P&yq@*?`CRB(rbeQsqilVv(L^=|1rS$b# zFO^kPZb&xV-#F3M)EtTJpR>XeM}TXi|AD04g(l0&%8G01V>*oi#BB6}k5n=?kkVgV zvr(D-!M0YJc?N1~!@goA3abakEv!O9N(KhfdU~kh0o=*4l+=o0k&$XwzE41~;N>+( zwclA{+W*Rl`QZ9E3vOiTd(PZZ0Jjlw~4?AE_b zut)%Z_^?WF(&^Gri<&ixV)iK;_)*^Fv=$3I8vEl-b;|(1Go$_nudk3@r^Y4q&<*{ zKWi7kYVbc;vygbz@G=L|P|UkARHp=BMJX6oLw&fuhT>`}D!j$aN;625L_W4iIQ>@% z#5W;aPz+q28%$Yz=2&MZCUM(QBd{UZG(YjC!8GdQf7nmf!0k@K@p<=9X1QCJ{ z&#GIlQ0G+yjR$;LJ#%w9W(F0a?G1gDI1j7KbI$-qJ8W~8l|C%-t~ihH#!csVf%o9# zyU57$2Ha;m-XdbUYc;iCcpPGf+*SjzkoSU7-Q&{(Qb1~=9y_xj{HKZJA$ckMrv-R& zn|IDa3`5-K*aN1QVY=A}Lh;X&L_7yTw1Ggp`&{b}bjaT~_`#zCd_iZ0P!MF~FCb?{ z$fmopz0H9bFz)-<#Lmv%$&E*hde>u(h5@eq$_qqfq_V>70p3c=AG5%FkyJDqF`n+~ zt3&x!(b3WQ`Ri})%tL{Pcr%Qw1f2pc67fF73j(WoeSIC2;+CO`X^`;c!j6Rj^`l~K z2yk)bLHzALrmO1#q<>YaZO1gk#Ty_~TC-2A#K7~j!&HsWpr~nlfBnz+hPa}> zegV}f`|*yY<<6%lnSJpjcckEo3O))~7xO9?FtiCN@UJLNPEQFSA-MW>zZ~K@U_(d| zn6q+de%h$@bOzjL&``e)awHG}U}0H#d3-lpwD))2WmQ%FyK|l(TkY>dC;IvGClnnJeqc^yG7vQq*cu5ocFFTz zYnW-ngINfeiFogSndA$jl3=BxWjes=fc6jb83C=WNRs;o$A73Z>B?H|Od&lO*zwT$ zx&P&c>&7Ttt4J*XDz7^sDW3Z%g@lZ3V`T++p`Eog2|4-2*|smg!*n)etR1#rRfmN? zLh2WgDsQ?*6pSni3Z02u)(Q$}{CLP0O5AHL@U#TE=O4-sXDqmXFDzz9-^~mKItH_N zwylUiV06P+;mT0HdxPJFy13o=K9`vsWK5gPA)zH-7ZlV6eTtAZQQT<`iMpXk9)9|d z$YJ3QSXN~Wah4qi~_c!pCtp|!Y+=FCkVB1 zhB=zc-+4T+rJ+xRvbeZxP3Ax*%FxgdWR2wHTJX1UVER7;FwjV`QH|ptANYQFpg<9< z%{AR$9Ub0aDtT0Z6fOO2aq6BAb;(x15m%fJK3J3q{MZVxUWL0tOe z?93NP9K@cA8PJjceW*qrqfS|DR+ibbXG8&Eb8X5WfdG<5!dP4kJtI7)A!;h)7YNz? z#linJ#JsSsIExXZe4sM>zb7YeMS=r3FbL<<#nKyeo;Z_8G-e^6^Dffb(h?NQuHgaK zcu09Zx3vw6kFTWaBG~a%^^3u~ZZhNuHoVB$jSZj8@u5OJfsrpyCVu_eh9L!ddisI7 zL(ny#6hK%YNM58DW)I+Y*s>YOJ6c*<$;!Mz&)m3`{=(NDpA0rlqC5w1B5$I66A+d3EuJh4;$HIXioA&PHisN8eQ% z!673;1fDePb*DlZ$WV-qFh^dMkrh(5_pMAdcpHJ{{1^N z*8im2|91uUKl$?iq4WNKeX|DFojZ57wkTm>2Ol5*fnOqcWq@0a&TjzaN56ab{tViM z=gw>f+({02{K)kYFw?TL+rzB`>yw<*xG`JtJ+qdh4#aQvuy$`>YbGr%(&slId4Z0J zi4Pw?IqrwY!t@hz{;M~~aasTV49*`IM@M}bfspzT^*P=F*=};m|7VH+@=pUeoI!55 zadQyz@qdi{chF+nU0#Oyf9NjnE%Y3aRo%zRa@^c1H6Fnr1z5n#3k!69Z=oz6pPpu0 zD9PNoj__r5MwA`Z(9+;%GS#cQxM&%F^!M<12J4!t>r;7oIe5&yJ*0Cc&>*T}G0Z0WRC!h)lRNaF?Z$2I#2>UI-?t@VB=ElZk z?k@)o?g21hU=KqkmWPuQdk}-DuL1V3A_;^ij-Ye}1_nZ$fzPyc2QCzdv?nKjmmyTi z&BZlVX_pVVs0CwkQ=6@ zp;;R)9E90pXnYIGKhnkhW9*HY;2yqoc9xz8-`Q@Yi0yf+w~QL}>od@lz{oJgggoTV z>fnpSdab+|crRRujftw6kCL}R8peZEO`Ufn4C3Om>kBe7e^E{-Qb2HS_ayN^Xdd`r zM;LMVP(TEv%Qgmbx)a;ma+>=x{9(&{tMP~F!TP|!3y4T?f$B8$zCqZ<3c_-*l%j=T zByvam>KyLShi4B#QbxRi-wRExuTbv@LM7x6U*e&EF={Y`{x|gdHxiEesgGXcpZR%w znBcUw-db77&dQ=ilrh;7zX=NR@bH1)KqXA7!h(!NrV{(CTcH%nK`!cL3(-h;x<^T6 z<>AiGF{BPbUEsVG85(K`BJ9gRXbhm#l^fI?0=<&=gkU>#n?znKnkC<(E%N6^m9|Wo z;IOB`=!0-TjELt;77}q9XP4gOp|@|}f_~G8bZsIEH(U%aM~eG(e5TODQosfl2CYlP z$Y=&0^FqrA8bCO&HwaW9xT$}4A@0dk5QWSC)onBR`1ly`S3HN&O+}edWyP`|bZX>9f_rTn2i2Fl`B5cY=(07q8QQYtmEY zRTLW24`}Q-j+5VAyC2)b~Yb=m8@m5qdJ;I;FJq?bZhXDG+Zyfxzp1C@$r9 z5C!40G$B`w{v5jPEqJ(wrP1zMMrVU7ChuatbHPM z44&^pO-`gy@C+XLk(?^-&#pNC(0NJFZQ~d=5KQI4(~n??D_^AP?=lCty|-=$0=0I6 z;SUfrx)X{KT9BRu>kK!A41(6zp-tWRTkvoPiSMrif`X9uV*fAJ-a8!Y{{I`lNEyjI z?U7ZTNJd&JvUg@7m0giC5|Wkev_(WEJE@G6vI`mMDxyebL?{Z`^Y=JapU?Mu9QW^^ z`?&pe)pcDs-|yFWJ|F9e;$8b^5gKV4$*fzwa0W1-bHdGx9XdHV31^ZI4mai$n)x_k zV2_HoS>fbq%rwXhx#Q;Ue)5TPA7Ce3bWD$Wv$1)Slaqm{4FO9iE0cry>bY8+Tcj$| zjOsiT3$oml!48~W5&~kIe`L{P6U@6t$JQ}Gb1^r!7k!Z8l=!pL{1%mSOXTKkq3if@ zF=!(W0$rci=Dd2=-d^-p|95kjSK7EB^861yL#IiuX^5qn2PC&f#Kf4KKOiqpaXmON zuyU!vYNB6tW@biH&i_t-HSH+*2zhu~FHWpp-vU1>waflE-NLp0%POA**;rWm*{H*5 z%x2Pe6zCjsW@Tf$_~peb)H?5>76hP+h$l72D>7S$TQe8&31W94NQNprq}?%^H`?$t zqGzK1)z~C-Kx_FpOO^x-MCxz*Tvw<>R8L*00Z=6J1W{m-mkKPMl%W(xp#Vdp1gU}TXAV4ZH5J-Of>Y@oII&`6SU-KaS1+K@BX^* zbmi3)DXR*%!VnyfFn01t-S$Ht1gLq3`D3UTTn-(ofh2KpYF=VYLei|5>KyL$@~2P7 zaB6=ld(>P|R`w2l2iu>YD{sFT$pQw35MbfgYt)Qb zstSHH*NWo_qSgDii_6MRp(E5d4V8OzkE*rxv7Zn62dC$;ba(7v3u=D;p}X>OZUPgW zsB>eb@?XCek0N7=0`@jeDN9R7$5C9Y$Tz{l%#DeeO%T0G_{G32D`HW#BzpJ~vaw|I zlU*nJ?KH2!M~_{0SJWs+oS{Trqtu~e^7L!lBx^7cT)Q3T>LWNHjL%Hof^-Rl7V++O z3=?8^xp==POY`l(OT!G6Wzj-r0GXp?V9VPhq-Rf#Ta40u!++Z?$a+oG0LMzsg!dif=7pKf ztt?atJJ8$P`}@0#7oDBQfBk~TtwMIcbwH6#!}aU0;Qem|K!&TV{7kFRXeIhN9YBtW z=7*@>;HZ2NmD>K`#KtD2_#{IMl1vtl&%)A!+}zOFu#x>2za`jGo;dLdeRzfmj++`L zj>OsRY2JveFZX1NV(WeNR!q&$xM%I?Q^o!intH>%S zP&oT;`-Gk5=TE(m0^#gGe9YWjPmks-9-c`)~jJ+nQBYJr|+Jnh`^36Lesv`BOCiC%) zRLkI8b5S{rx>{=2F6Hw;k#H@KLCOeJxT|yNvbYeH!@vI)=YL!AFz8N5O5ATg-M#b| z3-Gvw!sJASr!S;Ftx!(1_liu zI&TLQKK1#ewgUQRk3&PvZyi`)<>m9!{~rYiiO6reZL5fgzW085O2iNFvayZzS{779 zkpz7#Ed|_}b6uY(x{_JjDxcIxk1ifM{NaU5k?E&ek|EaJb?yVbjm=es)lri| z%V${0nhkciz8!8eB_A_m>i%FV6Da?b!L` z==~39g;CaU?Q<fXD2eo#4M_mjExDO>G$jIgcyQZw*Amud2)q3N+>q@Mx1jnX)TR|lRd z$43pcd+6It5v#W1Va8nxT&likvhV0kv^Vk1C2o7`!&^UikS*6rcA6Z#qNas~v70*# zZyyq*;+2=LqSRe`g7o`O8G{)oeRx!KhHRcx#cyAkv>la1YIX!mc!hmpg2b z$y0=5<=m$-)y5sN-LzL}Gd73JbKx>V_2C7o7ryd^TIy1m!#2)q3Mu*a(F(@A&eA@i z5z`#ngfz457AM`im|+BM&vop6TzUWgxkDjCmq}CH&R8YB zzP>!W@39sKs)%(V-9fW;ASoHWsJ!a{@QZ-lGmyVrmDG0WNQOxOtS0{iS`dyv{)O*Gm zV97^L`*3h=iMP#*h|FQgynFlhAwIrO1t+^i#*FCZZ)%~Iq+{Qn+@BADpuOWzC>;aC z3$>ECxCxWe?C`d5b?4ty!m=r6cj|SYwo@B4zp!KB8q^p$QksN z1L^^`mi|g+U_88yjT4LyYiQtvT+2g4&%|fQx=y<0=kngp=GDG8%gVfPtAd1m;x@vPaP#I%@MsI2MZ!>FfE>aB^3-curtLl| z)Fg3}lfPe1oI`W3@LtG253GI}8Vcn;Am$LO?rj9I-ZTe4n6%w9mE!NAy!Ats55!et zGXtO80nqVF^S=&4?gE2~=X7)8OCnbCx`+!NtDf_dcF^F|SDW6-Jofz5*rNK%(mdoqw?B@d$^%NT zhMy8oY`@13BnFIu;=;c|ov;ASE0n}IbE1l&82__)#KZ$*dOaZtgJ~r3tXd3zCeg;j zE8a%hFln3K53HSYu~Je>>$q|7@`jkIsw#Z;N{^o>aff_R(Y->s9`$vI&x)ad zP}=17Ye!%X$0s6#h0Pzt;Q2$-3juDQk>K(*fI27wf8j*Ho1)vy=zSC@WAp-`&B^gi z*ner1-N!WD?QjPAq|r0%b^Y41589TzB~Z8UdH~-(h`miRso%4JvKB?r90Drf1D5E} zFp;Qdm`~ZY%3&@Lf5)O4Px%*q%Vj_s)hpa`9zQC8JOhD1OfT_7*;LX8^|Q#?s5Lb) z2=vcH4~P}WFJnu*70tbiPA@wt_Iz&0mTP)?)-&SClB)WTZcHA_w~JNTI32% zOwiJgeou(Uj5IVfUS7MOd>$)oc{`d#B{G(kK_B}p_YQ8(-Sc{Yu?>uhtW{Mvon-52 zY;U*it+|4;8Oaa}1uu*n3*HnRJzq~6^elne+90zG2c*q|SiWKdo=XjQ_OEa3dkcFm zA?9)H1F#)Cf-;dgVenJ6 z-)80zH>=jYPq7qXJyMjWXxnt)WVw6P{%GuYUv}MB_bzMh1(hgaw!A~^4R#qYDbZU( zZbSe<*oqK3@UXL&c}~RR-1_$Y`+n#&o30LFH+$CoSU}_kl8VAs{d`FfYf{C)p#>Lw zWkJEHk|2-)0Da`5IJW1k4SH~3b6_=+q7TOXG>vUal3XpZH;Q|V?s34pV4Ko)K zON4cdUvhTI3mVIX21PW~2y3ylxOicy>pNt6YfZogU0n&R{sd-Yf!>-YZeSJ+&2-Pt zjQT+szZ2UOP1og1m!NA?^m>H#=XuXW&s{(b3Yv*CmX-jhZ)82gJH71-KPWZ=OavUw z)vGIuqg@xI7T6~JmG$&IkZcH-dwrEpg{^~wkV3lRV`LZdK&&zV$R+ut{=1`yNI<2J zJpvt3j$>Cb#Ps;X&o}8d0GP|mM^&~tIsJsVd}CLWdMK8@IG#4~EhMaW^MAFS!f#K} z9uTh z8*X`n5+0;wx@k#Sw>h9V2^1XyaVggO_$-IBZnJpeyaKo~Od%`(fp=2`M-0x%ttTpk z*(fM{VN@XB3fX2lI&Q|sK>`czFJ7Dy%6v-Bu$%j;P0eC(bbQ@9hK$iQP_;FN6)pTH z?SNq(yDop>?c3@1YgLzxB>T>h9p-DPY`XLF^H@=jjPu%XiZA4F0cgi3??X<;lGgaM z+QY{O56)I|pX^v;#eHSKDm{6^q?pyuw1;6yOgsyHeNGBd?}0h|nD zi{5psfnekdgpsli?R)D@k|fOADlTawZ)PG2q%NZTCcjhhrYT$o!PHq(BSj<@8t2K3 zb$c+4I1e=T0SMOKbGzjR*G{@WY;P0NW558D+2A;_?xz>_zqk%S?=3ic4Gq(Bci?3C z8|XQS#e7*Tz{p)Z)e#ca}*i65Y+)v6E!*C{TTev zze2*JpUQK6mqSqNhet=3`K?xI^xSPsl1vM(-_t|6>)_5)2^O=RY=AF>n&nW%$GOl5 zC9?7Iq7Qu~@3VlUU?Tvv(6E&~t(={jB6Kl)PAHu{9mfnmEghTK4eM0cqe%OY9(Vbw4n$_D?9-%$>#gdBjUr z<8DF;hX452_#CWb$BJ$9V4egl2nz10Qx8S*EGimMw16=nZXCOHupB_rmoKbk9zXkr zla*5@{+kz8cIAbz&~tQkk=4Q=bXu$(9gCfM_y;5b6yY80*|qD_qqDgoAzn~$BQFz3 zBrdo<80QP0K-mRm&3kDWffkmQmYvX%p-LavBoBcwY>?l+Ie>=6b%8@{-?3Wr?_Iz4 z?0o1~Ktcgh2T`7NVU!7cB4o|bHa&g?Fvo8TPLzw`oe+t4z!IaOL|AweKy#G*gmXfi zEXB;10U_lhxCjDUS<9M3Q{xa*Pb%B6Aloh$Dn_?ObRM1-AlOtMwrLs3wxuhpS7gE@ zYGsBin6S===bS1cy)T zNHAIdZV0B^_$jIRyZS4!y*@bMIjWzCIMqFSW-$LHlo9QD10p2|pZ0ps37pz)m^BQw z=NoQ$8?Xqqr&R^J{$c?=!HwI0(@VsBWYN8OzlRha{(|vw#roDHNYBIWQSA%HZjaZp zu@R2c4)&%lH%1UY2QP2X^XofvAC<_)d0F1u@AP>TEeDE7)>>bCnHG>wT$?wC?zNm7 zkE3B=x(yA11M<<50Ysge8g@yh4>Zl%(5y|*$k-669I_N_utTj8^%dYQrVVWxjOx+6 zQ5)2w7I=gW&CSd2+_?j%wUsU8f)NyB2x)_vF@%8+49#ZFF6*fXMOT0ohK@|jDnoJl zmc3C`f(6ewIqkzTc=lb8gBIepbDz)|E=>x`XynzSvgD^#4Q05gtE2N~6xMnsXG?ls zZtf3Rnmbif4L5RGJ~$6GT&h@(Zaw-X zjM;A!?_N$lz;ppUc~gccAC@jmR(pj0Ya>cTd7+oOJKJkIg(RSv4vJxp#!ABK0k8&Q z0cqeMQmu3+kEGAV-hPBjv~O0(=kC>tH~>?EsQ;Ikeh@v@Rcp0`o%w<`8#?Ab6aPb6 zwnD$PSqYCUdr6z=_etHU@#A#6B48Mx7xv&mRihT_-OC7J9%V9#ETypd_wl*a%8$YU z^z#&yt6M!dO*gDxj~!v`B{nEP`o)~}`alK+{X>t@&aFoP3~TNLY_EIQ1&+%KVNE@K z(N8t?T~B#k=`P(oHql?7y#eN)*z=9%ZxNI_4Dl?u9~`UOtEWTcWKz86ZD*Ew_Mt{xhGz3HvdB8Ise(sS3b3wsx8>7#3`9Jhom>#93ZBY0@%5N=waRlucFx%H zzDqS%?BU&t+6);y@Pyvk3{TNZjMar=E6cGWaRX5mkVj6(Y)(!|>7SJcwF8 z_on#sf7O|dM-)xSD#top^iuD?35-yjaRQpg>B@f*p7D#-K zhifw*`>8EAtH%M7k8V@1W8&w(G9f_+1x`a`^2QM?(3?`$bzuZ)imhr1WCw?Jy{%0v z9`%-=O^6=M*4Bn+ny4P_=X6PYQ%tMC%mZqwxztp1=mQ}XC#S~^bFRE2Jk&PZ;Qn>h zBu*(XSw$|9UU&!~3EuK0U=y&FKx|Kv)kfn1M&kR}7_x_nRIJdn>@Y24x)#7-6Bg|e z#MOFla{X4qxvin4-Xm@6D-fAFf~$y)&EA2;TxCA#ru>w-KEG|hmW!R%_U+r*^0$bI z(FrC%;B&M%cC%*R*RMIrhDJuhnp{3RWo4J(*qFP2$H7&`BdP_s3*dd*9B0->AZsHsBjlF6(#bIRocQnl z+~Qs3<=5x|mVUjar;pEO<(2a1Ralw8;llGf?G1|6NWm{(>}rphn3#+jBd505TjnYV z2*?>h%wIxg6}&BIRnRJPzV;aV-~*2fJ{M3Ioaa|xoBAP-fgA`I8NZZ;%!!X9@VURy zK&oD~ub)_T&<5!bAai$wOm#*fwuEm$2B4nzevPBiCfY(-~1`o;Y?urxv{zd z{>#2uWCpm7q-0v~d1&X`eQmKfWo&HE(h4F#!{z4csua{(Vt=8+Y;gK|R%qTmx_Tjk zxIz<;qGQq7_tD64`tk*RWEJ6bU8rAe$fINd6cq4W2(jh~-qG@*3vxJlGVGF@#CG4W z9s1$ELVkWdIPUlFSI@5gm9YM|xt}bc_>cQd;UD++HlGA#F3CO~$fQzs z;VzYMF`VOd6wTckZN4i5fql3!2vp@@ zXguH6mg4=wlipw2M@w?K`xI%X_4<(D;OxCNA9(OE#Vj8Q_~=)NoVY!eul&!v(ibC( zzP1eJB#k{?2Kw^x|K!)#2;ARuH9mUE;DI7_EH4mLqWt0Je4$H>Miy*&6&qvOmw`^G zn1Benn#r`=}1Vdt)=v7`s1HX+b*d5>B zY^+gyY-;+g*UhAY2hR4bP3nuy)eR-NJW3EWxFZ^* z6M(IR1eyAKmv6GFZ6wxXKz!?cu(zfg;WTgG?^#;vLMNcev}`@z)G)N!Z+#Ep+?rX? zt_tYO)@n+-YYwr-$AIP1)6Eza#vfw#!-?rzB71X7unV7>2jUzw4t8 zrn!56ooLdtDf@%*C}zVfJdI_apA?V7S2h;X%l;jlZmO%a!)KP{1%u&7FY#)N04`WZhCs$i|$pXJUO*L z|M%VgZb}APb)VngD-TH?$6&`Ws<0b@Q3@?~J~<`!pUs=oP>Vw{LHgPM^XJc@A@f2@ z!MJ)jE&rR{ZIJ>|!h1|`c=zsIKefgnhn5+2O#N>qQ?n%kM8m^1=kEps{EC7hhK}x7 zk@fY)GYAdEWhz|7aSE63;^|eF@f;>+0&bZ^`!^S+ES5O)mXt)l{}CLiBy>$pPb2tk zi*E=HFOj@`mnKy#E&Us}_Y^(Bh6I-1g1H(@K3so&p)EN`y)UxfGO_c3r?Z0QD|i@C z{;QsvkH+khdb^3UijzBd%_v^~abY(91HK!^rHU(8(&2A*9IejXNzSH3f-z@WYHI52 zXqUM~&!M|eksN#M*aY<}I&pGx{Y5vofPet#-B<7jyy5cGuO9>jLF5sH9&fMQ*UnNW zJ%k9BmU>irO_Rx!3KG{ISS$JX;C2sJ{r>Hn*z7lmeR20jl1MFa!l!?Sck*&^Jw4M( zi6kK`y%$txK7LxRy(Wa$#xVhU(?0?~BiC1@_gePP3XL-J}I=zF4TSUYb zAqzmhpwt5p?bvbmQA)}Ow3$V>48X$H7kkbA2ux(+=4K}l!aC57^G!+ATM&=FM1O@h zRQNA2W+OP^v2MsWXZ20Me3@5C7K0?Vm#}_I5HI|dzG)R8B^0zTEK8nX)707BzUaHE<9pHFzv$EgJ1fhF)8ZmT~X z2WMw~{#nbKNRx&ro~r{#vUnQTLzDq|W5!m^1}N9MAXkW-ha_u$B6ATj;?R9=d`7aS z%;H2-3OnotXXitQnAq9nt?M-0JYPiSajx1ZHZ5i*bBJzW2}PN1?dS)JCWzUT7Bek8 zUkoI_Uv+A5Vs$M}#n7bla|p0=u3Cy>_p`Q`Vkv3x%!wi1cX$S`Tk2mFPe z8S#18m*SKuk~dGa!AUG(zFWxd%!iVvP|u3_yhz1rXu}W_gBMgtC~2mkHsl}4Ndqka zW>Njwt1+Ky-*s7uM#w`SAmAuniezbry>)d@K8~^apwSP+4NwSr?y9$dk)#o(Nc}?} zSvPN%++}`8pBdwY-sivnC!F3e254U-*UpprIe*9BC7c9`R^c|H0vk5rzN(GUa9|M*UYazH?1U^S$fYuN^MUvZp5dp)Z`zINSvsmp zRP2r&D;~)j!uJ23M4^j4Q17?8_9{ecG zaVQV`iv?Ku*)*Fy%t64~mY)v;GHs$ECg2c1%3C1sHO2G{nc$6*IB&wA1Lw#}k|Mv% zEThBvu{(@Ndj`LM58Sm1#J#?Pv}Z@Q6c!#B?9d-p=LAZh7iWDxuTjk{sCN+g%jKvt zE6ze+)7fcyPx{^-#p}U;j6MclR<_?qkDp(fbLs4ep`u9tM+~Bd!1U=LS{tYreL8D1lbXOMjpE1Bm5*;s+74$C%(H~%e=_W9)Ou4&$ekUZdvg9$3Sv-2uf^9p zt;D|q=hCe48+bB4CWolH#HZzcot2kQM{z&O+G$PvMb5og`^uOCm!X6R$>j4(D*sVJ zx8-Xmoe%I8yT$Ok>QPx6L20m?8R!sV9zWgH0&h-{2n4n{5r+ZhHj$YKAo@H=dQcJT zeI9%P2bQYUkB`A{8dEd=*pE*47KS{q#~^hJ?;P_Bds00y59tYz6e4mQZ0ku|5UWDm z*l)ZafMf;^k=?g0Gio@nfITnBO6$DSv@<@@G( z+S=bS8;f!CXZ7VP>n@|@NAgeKKmu$D&z1NS1U{Yl_{0o#0^t9;KPJ%PO@M*3v~X^a zML(Fsq^f)T_{U6jMx;;RYApafSLTKw(d*FynIPve5+)g{z0-AJt!>Mt*(soT;K>FN zwB{Itr6K^#cOJb851L)jQ*_O$BtoJX;L>qZ6ofeE5JkZe1LNXE=RLCs%tHZlv^4#` z1~;@mZu4^keE6ZSIp0>KW^%Y!)AYKBwf$crLz%f1CYObw)w)^p`KQE}fvC&^xPVPfPgGpJ2 z)dmF5Rx}D=T0-^Z*^^9pIUtu|PtDZN)_N2aF-onZ8>BI zu4nv-{o4f`Q5eaTaW7AF|K_oG_j!_aV6`+c(Ua@{?XM+XZY(_Oj2n1xVLJ8b(Q63T z0PA$_oG8y}q@mdhR2(OlM3}KY3<$w=J8-#+nLqvr=AST)K~GigW6d~f z`_)gJsKh`gpx=jjIZ+a&L~y)@CJzubi;>r*OSqj_6q4^<7&`y=lj=iP#WVu)yXs79 zJd{XIwziybXwHn4vuq(n(92x>7Kx}npOFqAKB((9E@rB7A1`xTPoWM+2~}$h^Pg!* z^cu3T+G4LJ{EP}{#>2mG;lhYeCfF#1Y@Bv*$Uy@@UYf(J|8-0>CmR_TW_G@L^ABb| zqIl#=KJSfDKn2z|U#MCo_0-iHnw#aCZdw??69~7sMt^)-gb@X^RBRA6ga`U2402W|OW^JL zo5PaF4Q_pfeFOs;uJ3WWg=<|ne0-J>W33F#&AUG>lcR%ChMHA+9kH;e2Bwg>-AqVK zOwOX}0Q`IpOG@^-4iJ^7N1Z`7yWKi)7?5sTM~B%{SKZ}>2Y5jM`aCQxW22&8Wow%t zS)(=2hV+$G@7s5rgZnrMe!dxic>z=SUS2AYacH!=l1P? zY;0ID#+O*TL&m|$DP}u@xCbzK3KDs4soOtsi33Q3f=g_Gmgf0-LhM;+`sY@bLvelp z^dWU+uiNqQqr9oPIh&ZVeq#(B#Yl%%qOC`R%D@#zj9ycm_q@D5iw7Ik)XUS8YAX#b zt(t3kZZ0N2ou?AVl$vW>5$>R=q}1C{lvf)XBiMe3+uC~4>8qUOq3Ztnh)-2Mr^h}_8%CiC)X|AdOG}$7Q3>yd z{VY62&$QBu@23DF)5u?088TaY$0sKCxsR$?TMISA!=XffML+YA;3rI{7MU60W=pcTRFcJxEDz=U4%mlQp*d^97ZfbHGRGV(UdVJ0tvWmRUtz{d#Ju zc-kozl+A2x!I8=afw`XT9UZ#ac{s;f;`<-%j*kcrf5sB0QdeJ}J|V(Er}{XchLX7@ z=~P2LjZy4l(!@ZYYqiZ;N5|MaElOxre03te@T_ z#xZ0Vry;Cx!=`UAm>NsJ1jPZQU=T0;;}hvbv8RZoA?ypDGAwsLhgpgR$*!P(&OGbx zHaB>itv!SUqD<&h1H_JqLD`gTT~D`;dIfUJ^p9Ni83rRmL%E)$!wft#CZKFdKeG+9 zNzD(n6`&3Qoear@azZYYG;d)jFtlI7IEA)~<_nJ;yOtoW?|+Fby|!}f{WxRy3zsd5 zGG4-5`&-p!cMkQN@r!4Hq38^qzr485yU!J+#cF^*#-U}byh`{eZF1R3)b022HOy%350Fbs+fSZ7*#sAwT~I}Y(AC=6k1 zm^<3gqNB_K97LU)ga$RTN^=lFBYoK@Z71w3 z9K3sLC_woNoinu9$ue>$7AOM}c;IRBRSsQQyG_H0XVC#>StGGuTA-nGzh-4f$OfTs z=+~;f=PAGZ>Z=V!g!E%rQNMjFR=5CZ9sLNPCTTD(b8}CyZ$a_MA}C&RJvFuPznuGA z+w+XJW#_;bgKk6WS=@eAK@YU43u?$5f3bt3k>O&a7d z`AE)dFMb`zuSyaH6xW@ty{+A2r0vMsGBUV^6gUk#4UY6f{6$c@V_37uC8$!SK!2hT zlQb=i#Z`@3rQBUtP6k6W?!#t4mJMKmBG?K4ls<{hj%@i2M41!!@1cEuD~_1Lr4Qq3 zJD^&86Am()lGoY!q;r)xM5*LXP&58M_6LWB_fSF6?b5TQT5@?!Yr?gQz zzB3MR#{huDJQDJ!fb=1hJ5Mxn6^4>5S4=qu!Ev>jO}s29qLFEt<{dD$= z)~mP+knqz|pH2Dsn3x2L`>*+D)fx+y4Gb~KZ*9l+qVyND8Ej5OJBZ?D0-F{#lpjMw z+d7cMJOITwo?|Gy?6+UEN;hDg!o(lHr+;Lmuh%k03A4kXk>Tdx@c7oQnP6Z9+cjEX z^!=TUji$`3FbuM%HzCChw!@ARdz*SCL}tQtZa1PHcb;Z`dKW%@kkabPI>3o_rTRuj z5mCBcQekdFO(r}r)3pCF+!z}hi$!R>Ot}K3B@oov@9$0IA`qnT&qHsQzgPfH>SB3d zLSkxAYjiz54%r&WlB_!_vQp$+ln4&UD+zixZ`^P^Ha6=ke86P2KHubk3r)>ii>{w#BcQ^aIA#y zaIY+2z(Q@vGW68}uuiz)uEZ-&j6RB~B?sI`hoRd?Jt=bYHgZwAV12=WBsj|T9nvkI zDIGiZ0b-Mc^Jge&_QS8nwOO+KVR&lyA`r#B`vwndZv#Z?GSRKBm09JS8P1gAYMk z$f1qm+b<^~qLPJ?Y~ⅅ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 literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/desktop-plugins.png b/packages/moss-agent/test/visual/baseline/desktop-plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..dbccf10a4d57187d4d1e2f5b029b656b6c7cf728 GIT binary patch literal 98343 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 G-hTiP2cF&l literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/desktop-running.png b/packages/moss-agent/test/visual/baseline/desktop-running.png new file mode 100644 index 0000000000000000000000000000000000000000..5380742b578eb39aad9b8d70e1bd1c9b0c79fb39 GIT binary patch literal 77526 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

v!*- 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

9V1`;P~78Y!)WBvU< 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 G^nU=;DhxdU literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/desktop-settings.png b/packages/moss-agent/test/visual/baseline/desktop-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcf86661e6396784ff72df685588f19ba0db44e GIT binary patch literal 49218 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 U=`qdki4#3$Wp||T(D%Rm3paR^umAu6 literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/desktop-tool.png b/packages/moss-agent/test/visual/baseline/desktop-tool.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3eae4827ef71a6082f842b5c93b079da8fa3d7 GIT binary patch literal 78570 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 D`D`_B literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/narrow-conversation.png b/packages/moss-agent/test/visual/baseline/narrow-conversation.png new file mode 100644 index 0000000000000000000000000000000000000000..73ade5a0120134783e4f91146aea06f1b99a2b85 GIT binary patch literal 62083 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 literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/narrow-home.png b/packages/moss-agent/test/visual/baseline/narrow-home.png new file mode 100644 index 0000000000000000000000000000000000000000..d12c8e57931796ac44003dc2336ccbf73c0535ee GIT binary patch literal 81790 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 literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/tablet-gallery-dialog.png b/packages/moss-agent/test/visual/baseline/tablet-gallery-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ad231ee1901bcd72110760a89f010da29b2e19 GIT binary patch literal 100384 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 q7tsUCCl3$vZtwU}Kd~PJ7zP?6aIf^yltoe literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/tablet-gallery.png b/packages/moss-agent/test/visual/baseline/tablet-gallery.png new file mode 100644 index 0000000000000000000000000000000000000000..f54219a22601399534dc653b729653a5f69ddf24 GIT binary patch literal 98228 zcmXtXZjfR}7XU|`g$ymcFf zb^o}2CgK35SyAFydAQ#okrB?LXvtEfP2xzBbK`ZoNbo_jMmo~A5-Vf95l2NkYG*^1 z6GAceyk0`U)JCW4ze}7F1zOT9#Fu7KWQlUkph{1cm!7mUMHdqK;`uOMWC3_ra2u#f zS^EN16ab2jtCT1+5W9?V?d3eD_c5eB6;0mq`eg>V`g0~{+|Nh?+B7+>_0Ht1hUp_MTYksYv2^sx%=J1WC5Ybp=4w-!=h9p@I?qIj{bI6K4n4NNp(1x3zXVlgQE){so42(??L(Gv{Y8bv zpPacG%fIyXI%??@N+^s9GR~^bm3|X5mc5lA6Pp3ygSTbAlM~hc+W0{3_FGSEhdE^b zs@e)QNTOfZiHQ(Y?Lj~H2aIk+O6ZNEBdazkutTq=tmey9Y4vI5CnDM?ckZB1ip|7k zayp%lcaX(h@C-_N`&t~{au%g=o_pAQfpgu*D7F=|OJjso&N%e>;vq*M8XMgRQXmEJ zhY5~`pSJ2qz~v3}iC}~V>0-8troE9M-JXP&j9x-O}DOSfYVjo-f8zOYRVxK1>T|{mtORG4UP*C_0 z^q5sXG)!0g?DyYRs%{uSFrL6TZG(%Tb^5C1*^d0XLP4oQ7^n@WavR!~gKNRO9P`rTewigW6lFa-(SktBlLpqvs?{~!D7K-;U;%KFGbE+;k6 z8h)ThR)v97g>LY_PKLn5S6qKxd&Q@`aiBJvY!E9hzjHbt-Bk6=+F^FJI!IfUZz=yw zs8faSCd`S4=6D98AwVi6dp(+_ncqeeMdw30O(8^6j2xY~Jtn%?L8eLsZ$!VGx* zXtmwTabSMGhV2TxEMgrLPE+h`=HRYV!`?bm5Ee;XODjzLFdobRbhVVCSfbbk?5tmB z97&N&XF)QsLAhACOiqSoq+K(ww8{PldhnSuA|ZsrjEkH{9QJLn0kDX77 zuWAf1E851lOhcn7)w-`QZd7fa5gJbI=_=Y}{9z{H1G6LOUuRnFs*oE6Vs?}v9FMrT zQwWkzT$ned@YEwJx(laW;B?`~7#Vc5FcbWUhfU_SumJR@bB6c_Y(h;24o z3Q^#O|2dwBihx@YVU#E+qGo`a@Z~-kMT1BZ(8wmm!|>rM0}oXVHo#(Pl=;8{>yyHd zV8=BfUnBf9tRox8m)QvUDe4@yt{O4({$#KKxG?@?TL8SvX@ZP7V$)AE%_P6y?w6fD z>`m)56in)f2XLraBwRI8>I@WrQC|JwNF?@tXc9lG#}g+ynG&M_aV?$Mc$ahd+nVI%M+=`mxyzI*4O2 zC@+4YOkdnc>c9}e*2szH=bYk0A;wcv-Z0awZJTYH;s=Xs>L#MM>|=KYRTvDCGK-kV z-N_+KeNN+K;=foEor}sYhfEN_pG?RrLKpE!K=}B)XySq9KxGKPcE+GkPOw#3tb0Cc z3m(GjW4=?YLXcG?f?hUNogOb6D9N!?8orr@y>@~Y;gl1iqL+Y!+0yNl0M^ZxOk(?A z%w>1vPgP5LDN7NeVAh;bpvyhKf#Qp($1>)p>SP&%$Pui>Vz6U?@B@by$fn7U<-rDR z&tl=p&UZ}x{nGBEWNeOEB(rE^ zia$s*%HofehTP?mq4jXNpLt?VN5VRro>CQGTvr%Fe5C`^r|wjFlC&TL3(3bAY-qhT zNQ(C`fH32i!D<)Aw=6WC7`GZ|z|$+GiwxL-N6L7^9?_Z4TF_4?T;be&?b)!-Z z1aK8t#)3FZm0z7Un!}&0$<-2#GlOdo+13FcMnv*eTlERme$zN>hXh5AxpL~pITNj8 z0}w#5^7JO8s7tM(;Rmr7moXi@gLK6>3=Wa~{OCQLOkWPM|0>1_0bQI%XTH;_K^Fg= zqHK+ZyN=MDOjX0P`m-h&kC9t039Mlv7wRX_yt7#-Kft8 zy}^Zo(u`O_Pc!hFVg|&(A(F!a7xXz$1WmHntC?!mnQ>E&B6UU~NvqZh^l(hTGIzT_9wGz z+fA&g559MiCY@0oEZ4HSIRG_2_kuJ2PL-QwY|_VQ#w2uBUS2x>)y}JW@yu>>kh*ZL zfaTx-Zkk-AkH4DR(IoAtM!T$X2M9L^8uHf!spHNeA@}rrua;}eUCfjV<0&4eRer*B zAjNqOjFSkwj*A?GxD_*`p$=*hI4APCDtW>cS+Sk!kR@=xXuUII?mBjRrc$`j(34Z6 z5j=@Wgz&ByYDgw{s?N&E(>$R7re772^6BzvwC(Fdx_M2666W_(Avp-7cTW%JSi_Ju zA=}o2u$mzw=2p!}D*T`vs|Yh5KYmBRi8W3Te3SgCh7H`4A}?Q;2C zN%l+Ef5~o>;+uU*!J9XiRB8p>3pguOJkqbOpIA;em(}uRY=A6Jo(Un$ijXR+BI!f@ zRH$mC9Yy?**%#zF9VuQLk_-%yBm`=}h0s!%ZF@xgptNA+^>X?sg7Wx=Mgs`pG48Fsc8e7QFe4I8Kpy>yxLBl}hMsnyA`dkOy$Wt%>6h?bF3y zH<^ow z;~98PD711WmZQ)G3~=80)2~FsOC;AeKlo+zilNqgN&t+V^lwicDRat4j$u_4gg)Z( zCC1vGX3v~7Nf9)_Q^L9NzZWJ1seDLaD7(y|u!x67oA`47<>-V?d${$W6zhS%xXEY+*Bu;IQd-2t zEoM-H%${-ajCm=|LE?YI{WtulHeZXkbRu69E|Ht8GUaBgd*RMtiA18x7IpD@u{!%a zLUyrtve+M-R1g>#W9n#E!VY295jEy_<`}p8{-dyfa+og-b!j9P4&Q_fBM-NOBF>$R zRl#7GZ((ugr#iIVKxzeQ|J$tW4~;|Q8Be^;3|3`QV}Mm>KMI4q(LiX2VQG|8;gBvq zSaQ)F!xUwi>wY9`1K~3oMo`Nt)2`#12om9do?t`G(C@ z0MZ6(<3(3MbQ_LzCabD8^-M{Ff9&h+GXm zfvTc^f6KtaJApsu6}QUsPN^VTY~U~%_&SGj%!vCP;p7s>}n;^YYtC2$7wp65s{b4K0* z@Y5s<)oM}2iPut*1dfvCH7+9}GT{NxKT8=S^dkQ~S4v2I0=(zqDO>K>BdKP3qd=Gr z`0@Y|rdimt%;P$t8PvRX8jMgKdMU&Np+_1WrxYwRwVav|bUW2eD3rQ^j7k_yPfQ5r zCaSl}VqJUc{rDj*jc5RAz;>JiGU!2P#z7vw0?|t<68A2nIF{^NDzD!g+|$j+^exm+ z^n1$<-cPVk>Bp(b`dy(kvH!;c zGCNcCd(fy;IfIb**)L%>al5^}hg)fL5xMM@rJ>`sRLyBHbIz+7o=@h`^k+7K+ZIUDzr_6Z2WfbGX?qPWbgt z#yoJ->u*ed$S0A15S%O?`+si#2!vj4trwclTE2TXSpP;eP#qjgxoAE4I`aH{!}*s znvRz$IhN4ZyC3Ax$R|H~{`*OP+oogGXB4yGSDVRw_RXL|y+i?{{j3?AM&XOVPpg5B z3tC!QxZen$@VyTfmU?kNdv5uJtH#TXj+zNSAL@cQ%mwSDW3nz<&ED4AqWs?4{tgnj zpUs->HCljyQ?^SDW^oE%VG;e&4B(N@cI`KWiG{tlHoM${+>Yl;6duldmxu07u2SSv zm@v8?jKVwroq|;>@N4w$&bG+td-IGRL_O*IPlf2?DMoVE_SR2@lY{6Lz6LzjysZA1;i-{UcR76s{&k?GXMbt80WQxv<~`%>;PZ`5)Fq%%okz z7MI!mi18@tq7CMvC5bbTW(#8O{N6wKy){|ZJhddiPT)T7v8v|V4aW{DBrkWGP#qcv zWj7md3eF^_8G1;SFlzl+6dwOhA|CEPIqze-x-e=sdp|v+vBHr} zXJ7PuZ?UYg)T%Zv5U*L4F3-^cBmV1hK0s%~_3yG5@-n^8KK?w=d;4TRXHH*k7luy2 zZI7B3h0kPJ_h;uhkl*<#Z-_!kKE8+LJ9;XLE@@0APlZ}lYHEG}np(bS08JEr$rq8g z`D}j7o>nhjOr!xZ``5bmN>B=8)07BVEtmZwYC1e+2nt@H>>V-pDWKYQt@-i;PRuFg z$zpYYIIqJxlFJv%YQ%@ob79jGH^zLAj)aB1aMHnlD>-N$$c0 z`*jpMd?)lRo15R!-t6>nAmM;_;lxc(O%06}ihU+9gdai^-%lb)ue&+(g}lOU4z$ozetmiM&Ff* z4VlQ^Jd|QmyV}IJiihb)NH~7Cvc${R2zLEeY+i_SHD#mI_$S zUeSzB3H+-X!2(novXNpNjAuLdvNYP2V}ew&X~7ukAF#GxVEwyokEjPf{yS`_oO4v$_81!oe>pdT5C~Q24M<0(y5-vZ`!5awn*ymj1F~WHL-t_z= zNWXuKlL5c|9`q5Ta70_D%e88$^J$FfqU&uaQ{?^E;&SQ6DX_UAwxN{5G8gA<9c52l6+qXtx7R9*EhH8v|% z-i5Y0+7OU5d07nBtghQ3+e!5ufX!kzv7QDfLre{HIjmta#42m7%|17YARM<{iW}?u zx;99!KV=kZC$?-$iOg@q+`WRmNFRH&NlgW8CkBBQ4M2;KJw;c9FtpU{iZ5UJlPK<5 zepk;w;6iyeHl>ZnLD^b?ja*PYu-D)jEWXjL6mrYhYY@t1i+u%T&J^j9Z~BpcjrCP# zsgEC4yMOfWFhy=gf|K$4TX1mjKdk8hbj0D`Dnct2Hahi&`|o@ou_2>Lz{9Qw^!C?g zXbGzWG@+nkg?at`zD)MyZ~#RL74BkPtF9++U2Y`hXREHq@yfAcEnDb4QycBa_+`d> z>uv`*#&oZ@f8*$4%XG(yavZ%RccCE)qV2=itd`K7~rG8puI6}hlT5{$*ikBTxOq_o;izg z;kOA+9n>#Kh%40>-C!NVn$_kIzqMZu4pF;>p=e}&&(_Oqa34oI$$V#O7P*NE4B=W( zNxjEO++B_qC+*oC*ZjL0O^?)*1#JwmNjub@nwgA1CD7QR?5Ri0YRg)SbjFE##~pM*(F6C&VMw zJBrk%vdf7qL>zk)$LP)333%;4?-IZY;^rSlM>Edrnr)A$Ns&1riZtL>X(N7|Xn~f9 z&k(i-rZ{iN1a?>yGAJ6_S(RLV1MfE7B)G3wh7I%&q@*AzDfF1`$%jPYhRV+4Pxdjh zBU|Z#Q(4Fbo{QqrUK=05YI%W%aGP+7KllGw8?PrbXdq(yXTU{ZknlauUhdS7Ycy&y zw5F%0FPZn5BB0_L7}T`8o*4b45C*ALDU*O15#7#~(R-9mc$b;#fBpH>)$#t}9iGw# z7@FV*En2s~s{vG-USzvaRRq?FsG!quKU;2a9*#Bq<}NxX@e!jpcH-(U1HP9>wpKAk z=TPW*-sOVM=eM_yH)1HlP@I@pqGP;$4)=DJ)I5^@HKpHZ{?$HEWzms1NaGi#Mv zc`Q>}Cqjzivlhk$1H-A~UQOBRH>?Imi-xnYm~h{?>?!frGt0oPXLmYBEV0BYztU_h zE$*0P@O}y>_b=|nnfnyZ1#_;V=>1ajas5{>NOZXGQ3|J)f=qvA2ieR@7if_XTN+7C zQ&4EsGU6E&wLVs#@M)cf7D<@W$s`ISl=mHIp7bjDH2n7X5@NcR*zkIs-aD-oZ zo5rlX7h14F@18@@h_{D59Oo9#R_W+y-rK#~oLcb=ReO9d#-GKZV7x4rL}9btWBh_i zJJ7ScRmMHv@$s^tC@fAfhYeOeaF`aU|t5rHR{TnHeOZTC=Xc*$f`C^;?cL(F4uUWXD_R?M8v zi$RoS;L6&1dD$l+gH9Ie!_+!g%wK=-C7E6KkIDFcWYx!h#6_r>8Wv2Z*HY)be`tu# zFNMnKH{WN}$<^0psh^j<0cZLxeHf>S-LEf6Rq9nFRDQ*I@+!*8h!3dYxZczop7#S$ z%wGF*XE=C>`_nm5{IFZmIWXRO8gxo<$Ur@WLu~@&*9jC#FDxyy9H-PkKCo$1hZ1%J z2H-H4lL=obTR-Z20;S>S0(B4C0C~hniR&^@oB78-FfJ)SRaGRhO18Z~HYXDgj_mzJ zzzfi=UB7rCd)&Xnf#St}zGQ!B4^elyZ!`>-YJdUSI)uGY1n4E>mZ>2#rwnL-M z+7|$|k*4sM&$fo`a){fOFi{0o4W`ZCVUt9Bp8rJP&_xok)>j;468#A;(^4Wq^M{szco(~%;=*%_8!v4u{)0J(4|1s| zT?G{n)%4j_mwwYIAJ%c#1L!OUkmS+yn9hG;tp=xj#{Cc*`U>}zEcYo;6tzgQk_*u% zK(Tc$cGyc>_WEGiOZzb}A7V@F$3B*kt&)y+k4rvFBQ+=!2pw;Aq9r&6h?eTb=)tP0^L8G9W{TPcVU6` zvl&87uRM4tA6R{A>6qcE_R!0G*LcbKv%}ke&U=p;U@sVLjSvDxy8dox`Q4)UQemJQ zYfw8OUt17iTh~N5Nj#MvW($;%9Vzq;mjydYzE&D`k2xi!s|B|txC>#(RuRmXaEL%G z(RSRxpjXkI7803C%j!EVU%&diWipqL2$r63R0p9mB6a-SQ&JnTfb#s-QqLRDYh)!J3OdiRPi9OadCqNO=@9?Z3_en&Sl-y8+8S{T|0oQRRA}Ae=m4 zsS1!CBcwDpvw`bkW*kt~5&lc(DeDu!M9c=(=4+sI0)KY~(u}eHOJ)9BCcr*z# z5Z+q$;$c@V9~Cnq?|~I^sB5s;F90?rr^^ADQk9qquZ-!*JSGduXFd|nD-RPa4XWs>b07=X290Wq?VL(B=Ky9aDALTPsvl=Z z@lbk8tQLw2Ze!|k{qxvkC>Z^}>qi*n&oZWJ{t7@l{8DKZ)C~+#p|j-wTOJ3?qLE1# zl5S0Fen0YmEC5l?CP=*t2zB@Zu5$4}>QPhU{eoc1Piam?PI-uhd8jCYHw+f!iE-+P zMu|K0A2LPul$??@hqzc1{zo-orpJul!V7w33lvb>s;^5OZRo2A{}dG*&(83Xs1HG= zYagI5n)dmVftV@?{XmE*ySvQduISG42SdJdbAph#%z||P z_~{=!CXmo;s^W20ZOoqmsRUIr**TuWaWwUHAaa18f*(0jgS|bGyec`k=)y}l_m8N{ z0O)>v+b$BO8DKxA?9_eF3=g=hez0^q7jDr%%o^3 zNnlNFmfE<`Azzs6!3fE^+oMw_?tHN7>>Ok|Rpw-n=Hs~+lz}=xY4L~GT)gK~1ova7 zUS-@Qihhx@{%s?MAZG)jM~g@?sAUvfi^_a0Y#2HI%fN8pe=Cpa#ZA#CuCkq@wC3{_ zSLuIH&-}NSHt0A5Z%fsZF;M|8(KH@1tV7RNNs4yI6$+)&A{G@!1O`)T5<+?x78?Ie zOd18m;X^|m#|}v^Ek?C_RXUmSgJWH?*dk+4c~5V3asa$sakOFCtfHIgGCzjc0&#m9D23Z$4~}1YV8juUsjP zY?%`%(j@=mrJc;NJu1WSfpyd|8Fn)7y0le}(JV7f)nSd)(kYZS=Q2A~`v^QmfMCVnG9keeBPi zlVGtozO6>2Lh65OVqj<16C`Y+y{zFcnT9(SFdmoOcOU_Pez#a(jN~NY#v-$PNNsT@ zQRZJ5m7aY`*ms+D{*m@H5JVk zj&X%*h?-f}nHrG`#V-2JG1f{;N3b%-+(}=St|T=TsHi8BIg28{NY^x5l6~K;KS}@( zC323&t^b$AafQ%d1U2$bVMp{~x17#)R~M=bQ;PM{P-_|m?O1?{^Caj`u{QtZ*@&50 zs+B6F5?iDYAsDc7BN4>2kN#TR%-y+UZKy%V9zh6i-yD z*ZjDdT_I#-Om2!_1hBl5(BnPbK$DkyM`KXRs!$O24Lmn2clW*3`>uOi%)s&dewfT<@Ez~{NL zT_EY^>;~6kDqzt5c0tgZtJTA6G(Z8Lm3CRe9hGRkx$C9Th7>+G*SONdDjHMRMR@tQ_2t(xH3_(P;>*TpXMnJ#V|?aUzd1`#b+u56bccnyi0I zKTf_lDYsqkDd!2J;Va$|AM~+Y|3kTUEwj-q_o$_y4a2udwhj=#DNV1;Xge+(jMm-6 z%@)koN(<&4w0GQ)Aqwx*CjHK*GDWN~MJ*C)%cNDS*`QwX)v#mTand!5*RI*2&-Kyu zX!S1Crnae0BlM%pl&sk;+Ob0=9BgucmY>GDq%5Ar%|T+4q4wz}E^Y|#ppc+}-Q;cQ zHiY754Rwt5Bok0_bme#VR6IC}GdFus<}Y=ZHnCU$A@3J{sv%!&h4ZifKYvM3c1h;z z+&rcN<;2nPo)Oz>8_#@l+Cu%aKHi^s9kmg>|1-mbd~_J&WEI*fwoamyit5h`!yq9R zaa&K0NJ2jq@#i1sODagR`2-3mI{7M0gp&vmJ0L!4$k(B}EgXvMXlqH-W!|n7pm5MD z(gxW^sBMx|n(rb`(gGKxxJV|0EqRf=?o^=t-kIH6^INAeh2&TY>(###Cdw9^5}k`7)7HvyV8LG*`^Y?%ia-HC@7NjXiC9r_E^Tq1;-oIYcOX(U=yB z^QR}a{8Xkcod1Y|vt7UQXSqx`Dg9K*5w?s~oGduvtR+GAqBV6Ou@zgU=Dy3t3t115 z9A=ZT#|Ri_?3*c%CyWXn4>?ex_$~1feS__?J&8_5yz@uXkBiu!J?eX7()%N?92R53 zw~thV3b2`fOzB}?_P}!H%rYlB;mBwBJi^~oT zvT|b-c|YCYw0tRi8a*MtMjF{z{N;ia8XlYPlpe2!NGum~U2S!5H+!6SNZa1B5##{~ ztbP*`$`I-%G@M}qs<<1E5Iv2pSSWJt*}7XnzRoTzPMDZ2MD+!o0h}Nc0sBJJKn&D4 z@|9X1Wqp|wA)1$5s3{u-zoARJO(xEv;Ii@723i*Bsn+J(?J`+bhs_%sHj@d!5osi3 zfB((?y4ct9{ZBcCC2lm{hOW^H6H5+CjsXu|k_?B-W67gaD^1lwVpvjA8o-_3$99F1 zLsCGZ)0{HY*mZ+Ry!L0#u3dsLRvWzR)flXTcsQN&Kzy5y>;&~ha{+O%{QjTp_)z6~ z*^PY2DceMRy?&vflPcVw2x03e08mc%Azu7+N^*R_B#S~`BR~4bA!eYIDhImvf;jKP6V8?;)&mnpQm@go)yQn0tl5K+o`K(y=OtC876GDcXTr0%4L+!KWe`^ zu#5lcy(`M>t)LtYE8`|)8M9m)q@~=8{vUSEP7s~S)St=>&ff3|paD+mOu68#fJzlg zWM=^zE!>myH}N$%~@xsP06EkT`#3lzjDGU-pmw%5}V_J*{lUYmM6>8ijt&7vy{65C-u;jYk z;voYAk_6MEGD)$tG+O1l1)>3P`>q39(~In%!}=aHYP~)F!WjzZz-G5GFfe?)zo=8K zP~YhfaTy0QJ6qDw@bAqONT|v~uNZo*@i6IbW_a%BZgk*aUyHKD?`MFK#B74INC-c8 zq*h@TOat^X7iNSMbQ_yBSvmU67=|A%*1ngk_BHN}Wv~n$vGk4{%>(bxHj+|P(T!R_ zdy}^=4u3|pihL}kihLy7oh?I*wIzVcc`I!;K)Lz^g%oPyNJsEVG$#}JlX{6f4K?)$ zt5Joo=*WtPfb>CL3Au$r6ZcBh7vwN^ON21r9QA*K zqw_*uhuisppL=^NXSsA_<9Rc;fZI9z5DGnE5Q{UuUc33xp9qb`TBDeUL>SkTg|nH8 zc{JXwbl&g6iok!sJcmc%YlGQvEU8dtb~3zx!|G{<{`-c&ev*n`ZqLlV^`)VNL;Ia2 z;W|(`CzH!$PUmkApC^RAd!bRQiZ0iu(K{qk6|(bNMjHLIFZ0v#Rq|gsIT^8vhtrLd zw=lBj-5aM*`>((3PIz$nJ@jg&##7zbxr+_jt}|KSKCQLbk-c7(yV@+RmW49u)UN-M z0{6LZ07?~!m;;469-`kKakilZc)IiPUkHJb z6-sXW@)#ZyQ1Qk7snLQ?g|NdmV+7grP0}FRPV8)q?)}JdYdN?)$|ozMIAph3>cOlN2WH_?-QrEc^DI($9UW zqQTu%O(D`&^o<>WQJ1yHTtTPZ=}&$}ZR^DtT%Wn^y|;oMbgHyj)aQk~gr6>pAP}?B zQ8^jPMt;xtAdK6d!gqqdLw+L8i;Fe-3d!`afXFm@u|}PC#UtJ=-%m_I?0K<9%`QY9 z?w2zZHF_-^FFa@c^}1<-;KaKNK!fE6^rF;X+~-MRs608L4T-aMavUbeO43JjF5!T& z-`y$MeVi3%9FXtLrf@~0Ro+#B6e06b(7B(i=gpq38qb3`Ltc_OVB#lKdcNK)ZE00$4USjc{`rOVTR5G^ z8pRwsxdvOlX=(IoU$_R^xovpummlXlJy<)h=boBuBsO!txqa1p1RLTr&!>Ggx?cW( z(ILrp{5!6%`)H-=;4g+q``d-zh<;D4fyYSBE+R zkSt`?6mmn*DRe4yi433&M{-$Bwsz>c7vQK4GxG6Vs?Z1CRf_mMdCZ<~bR0~-9901G zj^?_UsD)h_ea?=#9cN3CwPz(Bgp5ygQ0rstyLL+J=v1l!;84TJ+zLN_`+p-lROFk# zJiy91-{@#)d_z~PXSy(|b-S}md+t&{Bl>)^pwwj< z9UYDGeOsa7x<*O&)T-2+73|tO+$n0=bm3eUh~IB~d(~_H@$}H%)9d(jwzOsN$4J6c z+H(KWee3;sylz{CEjN?P4$f@>5|I@9h5vf6)yZb5`t5LD&3G|>+G2U-Ot`x33&{W) z+lG<%8$##PPwTC2G-96RMvqT3-&>7g{{=k@N&g=U*z`WA`MS|wQdU-nxbyEJPYK4h zdYIG~0<0nk5bT>8pO~QjbhKJi)%84`CbBgY^I0XAFTf!ni1EAd@0emQ^e{bQX&LkK zHHs#6UKx0M%a}I&vO`Q>?urM$c#iq_GbzVhKa+3$>n^f>jDz`mJC{1Y;Bl0b|5_AG zbogHY#Eg)$DEcr|rlwGjI4aE{r{>1OR1ug=T@L76I#|xxCAq7wbEHC7N{SUTI@IBGT zX6}|jt5SRLs&2@Sd-v63q+YZ8@jeS`-tR^rE5?63?ze8MMmo0OoKGQ(_|j+gQsJhN$S~gEti@xRd6TEgF7QB%4@*hm(g}v&F zc#FIo(J}12UyRbF!uYa(=Uu9m@T&K8`q#w!{bHqxAcK&HrjFz%ny#QyCJ)KeRaiof zB*r0D-)(7qo|7|!@s!2ZoNh(A*MyGOq0vY9zoB15zNl(p06$5HPx%u41f?=6(E}^0 zCx*hc`=Nx06MMq!Y=7D#v#%+geY)nPmg-WnyaO8$7p_|6FB?e}mO}!&%R|M8UK8YCvslQ#9vD-Ab%FkSFpUv#-7dzvI(T>Pbrh~5Y&%=2 zwbE#z|I6NW{H$fI<(gpReP!u8YUh0><3goot@_?99a)P*jUjkwf5Q9663pqK_w&>8 zqTL$)SA%lJl|~=R0g*=Mm@mTE3a;PN>~0&jvd#m{(`$f+VZ?vSejSY zXdrLDJ2fH_8L?aD{oC_;4AtCAf<4+$0^sl&^zkv~vIcM4zCqjY<>6vDRen^xj)bW!g5_Jqf%-Dx&roG5(xAry&E zx%V>g72Uf_G~nM5-Xkmae%~-(HBbLptHXtnZ3WEp-39O-HCVvqG@Lc?hIUUE#k|h= zv~i__4l2$>T%VKKF-{h$bb6|{_8!|!oaPM20}ZQBtb$k$LT(Ps6iQ_3at*y)z~2DF zQzRyzk?2Stp7<1tbn+C&(pVjEh;E*A*|f5F9b(_%Q+wALG?&+h^e*S&a-{nL5vH?+ z(U3QN-Z$W$KJk57TW^yNzRQa}jE`q94dDynb$O3ZL*Q%zWCF>lq&*}lRSNFWe)NJq zf;Bo>5Sj76xm^7KO#~{4k0jT3X0uSt7J_K5WYZ~tj2VO6*JByRf7+DR$;;$Bu1931 zn4MbFMb8ro@*VF3Jc*GgVhGfM%cE46ZsiR)6w_D_zr)a12GatYnB}I0&(F~k+@2>g z9yYx{13QZy$o>*h9vFLz=L-6K<(v#}6Pb!Qog(ClN~5o|m9MW(;k@8tPyKMzw$ z?=o$NTCa9ic-U?wD%WkMrI(y;3R%qIcH~1H)$J2r)bk1Cl^?|o;e;{ zdL1kv1f1GW3CHj(dYPOj78g845lLZ zZ7F035{I1rRoX?0fjWTBbDlKS(BNg0=lpFEu#YcwJrrm^gD&$7JKS&N zi=pj9!ZZ@0ZkQooxE?$ny>2`%Y4CDDa6)Qk=%>&e67Lf28od!C;?M6XOgf9o80Z*P zQcC`SP^)Dlc+pCe>Q;ijk*@pFM8c(!G%(4sdvA9}I^AqHRGO!=oG~F9+>M>o^&3r> zv**!LQ!f`PE2!}5!_v{}jqD&$M1Fc6inUuiGowFP;G1r0uhDIQ>uxd|Mqj=ZcS##f z+gdjdKE6Gl2Oj1~P$?6T+;tT8oW*!#rn@E~Z1svas2AusCs5iBoIa|XgoWKN@MX~`b zllD)4l!6|cDyL+^y3!O6W_k$#+EkQ%{vs*&JV@4MlS=&Qi%-Rp9nQPu*xWn#(2j zk0w>PeW~t3Bmlr|`&YNNox5nw8I@Dr>)Y()We(}kvHQNCwRjTz8Fc;rKD~AC`g`0| z{&OdTQ21{$I^}E_s*4u@_%vy7d82S;14WHP^j;vlIznw1y>M;)=LT9hqDMB*k(GJ| zhsFAwlR${GZy_jUjO3f^v&AfBtH{+Fa*%yDa^5Oz9ffX;eL5nY3U|nVQ4LePLL0HRnyeapOOUokQ99o+Gm`&gdT%AKH6XhBWE|a$6(iz<+Hp;6x zi?M93^Vh_ZR{_j%EHXCDltPPpxwz5}-wyN&jwnPi$s z0^Z_?g@lBa5zV=u^aMoT#OhmlF{+N0DcT2rmEy40Qao--2^MJ<%O>m&MkUq2`mMeN z6%Iyb{_rmp^8ts}7J`}S&eO;F)Z+(k$ubg{l3D%s{Hsa{?L+ejm|O3kPblB8mA>EJ zu%^S?KJ=o0s*QcUg@05_Wd#Tv4D;U{yaq?#aFxiX2$%}qXVbCAQ2`&kv?q|D?#Wu8 zEsbP=RlLqME$y*oi8U7ajocT|mFHcPj+q$(k5B4XK;ZPQx5$Z?_jqF5E96s&XB%|j zJ`!S;gkrG(ANZOsmjAoY{qw--Z#R|ZA$&0zs$pWH=N{l73$U3p29X9RF1|Q}+XD=_ zO2%2hjSb#l*%o!D{_8P~^5jws<(s9!uFziu1X`wgT+KY3D=cvw?-@$aQ-6$FOF z78W5Ud3x%#=Ll*{|JuO)Rc(M^ZEljOA>-~-WAo?NUH>>MxAmgtyum!L>E-z!L+7s^ zJ~+V~`Hihvt6k~dw-LkRsZ1|dBXNt>MmL8N815&tKEFjydY+DL%saQum&11=B0P}T zk2%Yxzp&f#@hE-$@pG0$BJ`K-#&Ji*ypi9YR%_x%=n#9PR|Y5;z$cAZB*ngY+rD`} zt*_!djUcuuG&VN<*l34t=v-#!wC<;7)6Q=zaC5}6Ux^Gb_&aBWKiSRlkc$_W?OG`D z;sL;1@hOB3*d*n`dF>a;(ai>FRLgrpcTSU1v`ag3Q1SAUAxOGdl;Lya)KP7!oOsl; z5EGII{HXIs_BB1IowbuK4cCMfHNv8s!O1igr~5WT?fTH3Z!xazcEyzXHR{w~Re@-O z`e@*;=KbxP-&E&ueT*r^bs~EQ7v<|t(EgF(vc8j*p0Q>~YYEjwDThy<)Ktem@Rq51 zhjPyGLe;FG7vD_6YyYnw3sp3b(ICN1@}9lqD|hIcJN@(#gOrPi((TvTq;HrR1{Q6# zI7w{HXH8g5?5YLqU%^=pT}@EoGTc_;@-b+0UyqQd# z&sEz&L&^0rPFx(xyGNFrU9adU+f)J!Hug22lEhLkGr+yUYO`Fuq|#?+Wal^f+Qj)W z9cm?-@qN#8X4RF&Wi@msu+7Sx#kNJ;Tj)sx%`o&7V~5=AWF?N4nEAWqSVkg$5wXCv z+o32>JDZqoT=IUVMWPT<^Bo-S@iFh53Mk25kVKKyIoT@H=wc^lP2ov8n?pSzfKzdX z%0;1!2dFV=6l)w9jZEL@!z+@6j7W-6=#clhlIA>Om2D-QxbPc!)29pUD@>wS|_3dM%!Tf(B?ZNlBepZqKbV#m9M)=kHYi40Wl4L(E36#21UlRt(y zHS!CL_aSJ|on7!;Ix;jRRUQL7dX>ano)2ecWtsdwL%|N+A+i?=FIJKdrav_>DZNVP zKOY7hCf4uoCfMR#V3OAU^7ua%KpRGBie~aG(;%xgi*6X5DK#H6^&c88^lI2=1yZ`W z0~;}0vaLr~4SA^fZNBo`BxfHnUhkdO2c&~aL8=j4-~Jf*;YmX@g8@b%!oa2eAb1 z&CV>Z7RX)rk;U(JgYw_{q|iQlrmeO=kx{0aFS0lv9UC!X10n{~U1Rioh4{QI$0 z=OqSly=%7M@!J&4(JPk%_3DvT#^G?;Y)0#r@rNAdF4ROhq^D%ISOu^u=G`0qKeEmu zs;(~B)&zI=;2PZB-60{k2M!S2-5nAL?(XjH?(XjH?)LV7@3^hkrNKBG)?TM-)|_9R zgkiM6m`%u^*;_{POyuJ5)~i%NOR;V`{hobyTx8Ek>sI;xiH zwY!F)w_KdCN89$gAMzY3;<(hPH$tx#UOVk#xu_J!AzDhBEq8q$s#aQeVjIr{hTX}| zAwFJia@_==4G+dRmBuzffzO>gNpn|G;7{Kc*}R-|gcwP%wm(+9LEWIVA2OyHUqlLJ2s#AI z!+m-SIbe6JmQGS0E*78DN71AHrSy<75nEiV&#L8}XGL?Xq$9<9OJ%iV?N~jmk+WFj zA+A`nE7Y8|(r$cjHAcuuEV?~N($8d6@6g#CWg-tWyUky%DOku;j3?u<23pq++nc`O zYNG*nbp!o~&z--MgX1YIz19-3{5dXL$Nfnrszg2fa0R9a59R*~^K8}f75`eUfI7IJ zuBC{+J}w^$jb*g|?(PBf*D~!|=!bh{rL?+QNoxPIb&&R0_wQg83isuO(1lT8mu^)c0`gCMhAmP(hns_ z5ux)=E?)7Wd+M##^Dm8K5!SHswLHJw^#1aLv=XA{;S0CDWX61_%TkO$l-4_&Xv8)Q ziP|TlEF*Iv5o_y#Gaaf9y8VJi_5smY3fqP*dV^>PT1Oh1c28WI8J^o-_!6SW{#YDi ze@Y@;1gYtNUI4fZ)xh@eBw{PdT#VYM3a^K2_WRD2OyQeOTpPmH&;l=Az4{TahLaZp zocVLH#YRGS5t~+@Q@fFBrD}u{dK5nEZUc+9|A=_Zy<3)LQM7!j@AHNUU6AYX_-(g* zbw?I_8p%R*-{*>dKK#`VXF^j>yIeK(4mFs(Sf^IXuq}s(zNW=tjy&VPN@cMcC=vP) z9zbxublVd2Ed7x?@Q}Kr=lZfd6kse&~plE>rw-X5qa&7S{;xIVm|VkS@KXPWEbKSJ^lpR2W> zll(7JriTZk?h9r7xfl8eTru&3zgn4 z3Y%}wDlxxg#StamnNPRu+t7KxJMGIdXPjxzm#CjQXl{;H9_hEaR!8>=KE*U~T&)nkfMoZ~-N!^U3R&q5Rk+l{KMrOJmFCSj7Zg07F(p47e<-T;Le!lPZ zMqVAS3}(9Le8!^%KyzAjr1Dxl&lo=}nu4A4IUgIu3*f7`c+;DNmE6F6+->#*=`02am{FG`B4laxFHETYowi+(7rU;Vjdq z>_+F(V;yPnP)2&G&g_;PMNqs$HGcyN2k7J7zS`b*eF{87!up)-(HJz*Yql*ZE)-a; z9x$Z1oUJvRjN_-glYG0TALxU_xW1LG?6}sdlw%Y@&yoUv6rc+i*_8^B--%5Y86uc| z$`EhnfANv}s*pGA38pMU`Y5{U;7WX$ zFewcmv%=?nYaPX((bE|(-kxTa zFq!nge-gb97flKh?o#p@&Pn0u*orJ7rzcYizQ3_C3BJBXZhmgHzs~2`Sj?4OZ(pG; zX?*D|GUyid2xY>BU~GS@c_nhsl8z?RGaJj`IbG-4Y+#@czqQExJd--G%Em9-VU~dl@GNAPyPxBKK5kw--yZm# z*S~hIQ_97csFj}pgW#@Ir?VxN88?WJ@JAus2CvnBrWv005Zed;Kqyb{E~|s@Ass}nAn(B#}mZhxkm@@EPaYl_6H9&PbUI|x4>?C{PFuY8&omz zf5d2bgwg#LZ&Ig}-5gKgBbsp(S@KJp#Ox$hYW~hhj2J2Zh2Af~A4^A@W=}KV6meD= zr0YPorokE}k^>Wjd|Xy*N%r*lzpHch=~TEY2i$;I-_a>7c;>K} zEBay$k$KnDK~~`@ZcOz&byMbeym23-uD8)*jBpkYWGx$kuBywy&@e~oU~DXW{quae z&1|>Yh=$`!y*W0G)?9yb5{#tk8a&DIZ**zsI#vxhl4QgFzuCT7`#awtzCQ!8PH<{* zKz*ZADbXl0AT5B!0nUr%xkw%$VF1HH<=$YV>joZ0@Ql=G;_#%WbI3H;{gO=#^t$ly zF@{vG%a!_4`Q#d>leq>iYcMl2v(wLyR^e`cgJ{fe-=~!DuFMUnXYK_&9(-4!>8Yzc z%;!opeV%v1A~mJ>`}*HVnmC@ zj`l|U<72aiuSOp^K@xv)V&gh3;fn{H86^tAy5gPg;~^TX*ITX-R`vFw^<25?Q8Zx%**bpgBN@I1@sivu{RF(1mqW?s5 z+$;$uzYVOa*j*mn+byJ84Ns*>SpHTi;xlem$)ICXn-wSMgj@7j$1t7FGgSa7EGkOh zoMjx1ub6Fcshe-O5zh|BaSUkFmy^*@4#y_w{t1x>gAzu)6|C4g$cVwTkT@-eKP9Kk zYCHeQ1WcqwAHA?~;a zhsIXnP%&%geKa>+N8JX}aUwnay}06S^yQ4)Rs7&h!AmIUxg3>MJd{r#pO}M1w1zg+ z9r;T%>3B#lsy>oNd|^toYZI6oQIjp)M!(S6&T>ByzipLazN{L0p@bT}{=Z76vo*NH z-FaxoZBS({oq9UybeX-ehpe%kU+lnHw!P$w;*=Vy-=T)b zqy@{14)aud1LjNIor>oSshqvUj~h;tvy%d|d1e@V!^v!>*bHya{fGME1BZwa)L~0> z-i_?VmvgQOBmc&D>P6xb`wbTuto9-_K@Y^-U3|V`6iY}OSB6WDwLIRK7ost( zfkF3L9gkd7OEG2E^l@8u@t9-pOM^+Wr!wWQOf#!kw?C-k(4J6ncy`lV%226DlX?F3 zEvXxgK~_Z;vpJGbF8OY}(Wm_NucvMC_iRz1M)|$c zw!HuTI{gq}(_IEP#BmO}m#mI8AUoPCCLF`RFS{{Kh8*t^ykRU9p;O`coKkO|K(BcN zNGqwFRs$%OfF$ZR^(foxwpD zEb#+n`+r^0Jhh8vYr2?yu{oV-5U9*nVC%WRbI&GII$6f!*h-nbtpdgg@K4boH@}M~ zi2a`y(D1M0GHi&sUG2w+rU)ra&ua#j!iMD)(b_CTn@>>AUb3zsTsylae<+p9;*SU~ zkB1H0`+E5cz{c`+0dsj9#;Or&qL^DwI)0cYYdb^>*4$%@F2Lrn-s03ruTy7of07IM zy9)Ct4#u_X&EtXjvTB8Lv-;%*FhGA;q_E`h1qJp0gudCi8u_nYNaA!l`C~j#Eda33st;lpumD zrS`>~&_z{(a1%xLl+<7^<^YU?+<1Y>PyssJI5Nmj2F<-GNuG1UbFr9%^@{15aKZ|D zcqBq!n#0#gj9-TJY3Zy&qnaZ$U_IUn(gJ=9`3xAB^iiO_p6K^Q65z=lR0~y$V*J|} z!ln!}KQqlw3=*3;H~s-+khn)l@1eEr`;PcG0~o1#$x`C83t26rNo3=pQ;&E8#bZ0p z;`)-&!r17#sks>k{Q(}zf`p9!u(0*th%--cW7PQXPpjtBqOmMb6fF*C_6L7{${wf* zA?{c2ow>iI&UzVM)eJ?r15bG!1>lV|Ap!Ezp6hlOp9QO!^+Xxs`#!3Zb%d3WbjU6q&u&DRI%2f{H=ru>pX6cDsYT^p6Dr)v=@`hNAk4(D zu%d*_L`rTM?dg*}wnULQ5yXmnfX!F=*30?vZTL#RjGEq8pD7HVZJ!`DkJ^_`mZY;SpP2C5O?9CZhGfWzf zp=w1qqV++K)AP!Jl=C;Rgt8+nA7tJ-+>Y+T>N1{>sktb}cJPN`Fw=mwU!Id?29Ts9 zJFHE@yCxb4|4X=w`5*e!NUdma_he<%Ri?3STwc*laDJcdylaY3)K1gwc+H48(>9r%R#*CNlcfWmw=)B(YX7Nh{+C}=?0$VJrBKw2;-m*KbXh(1+ zOT#EO09=!bUJpzv?MZY@0rue73%Ki~CnVo!j?5D0kD%&wh3q{lc1KTKIN=z+AQPk$yp#b=HsCiE&~sIg zL~lDh_?-dStDt5s*Y?mI;Wl+8C+!Gt&x`7vnHXlieUtuAE_jy#9$C*hXLF3vPp~}P z2|qTvI);$9aDJDZ+HC>4Zm1NfU=EkI+OJ~izzYfU%T0}$JC|E-qSCck5+{<3;(1T* zk1?BcEY76lPO;)p8s4I)CuCfIbtD(mv)Xj%!3gk5b?-Uc!jVWOu}zf0ic>O~stJvu zX(x<9h5rxm3#j`dtURS@J-$#(R!X}W@{=;PH(~yNNWreOJ03a@AzqemS}}^qLbd2p zHt;;sO;}N->Rlf+>>bZ>Mklf2pOKM^vN^=&-VSmX|DDVUW!p?>GO;cmFh8w zQNi~wP-V>;RH4O=?``xu|LA^{%#pyYj*1Q~>;5VRufs(|qphFgCn3W1Gwz9Vu!PR^ z7ey9#%)mkmoyKnAlAuD|GbVkGOVs9$ZH=NZ1&6<1rv>?4a~I+AW8Iu^|5ED||Dxqb zVKUHsBQ@Pa>9A)retkMoiKF@@dyGSfZbIsKfZh}t!_IwA@I4~T*GF2Fooccr!u_Nw=H$7|Z-l4^ZVrdxY>O!X}qWK)v#kjP_kezl*2+7orAXdxjd;!N|h!m#f~ryj+z^hxz4VMpgX&qJJ7( z(ta(iU<^L8CtdS{~z6jk!RvfTQd zf*t34PStX~bdC4lDe9sBY!%dl>FVH7jyM+q$)7))uYAq#d+Q&zLM0_7xz2-uuX6FU z#thlf^A1ND^`l0GCmbt-7Q4liRs%LzD9&b97V&Mlf@s#%*Wn3tp#oQ)`herw#EO&T?3@D_Klq|2`l1^i9(Bc#R z=`CU~)#`cKqlq=RTelyz${&rh8=2Bc?Ke^&h7*uSj<;=oht;4s23$=B(!*~K3q~MxL@9LT{OK`*zePk==|#^ zz*^*4d|UZQE=#cC%bGx)h2Ljh^JMs*;eTN{Hv zTY_=I&0b9Um_rBfpYHDNSdB-?m~_5k)4R0vX4hl#C8V99=HV0@tXi$t>f*L zZg*xY6&*@|EjLek z5OuOqw}O-dK1Oq%72YPyBk_=amGHG;f7r%9etTz8rYolz0@4Vf^>1=q#uc$WbLl;y z4><#b-6#yd1lWuwGX!LYW!Qg;3)St(yU?|)5BDq+&aG$uy0hA-GaHKHvzX`Ij7H4i zB@ml983Qt#V*bDWSU88Kaf?o18R0Gkw@L;(Q%#`6lJA5d6G6)5%hZ~1t=T*D%f{dC z$$Zl&x(Y%%*}R<+3kwU|RLJPLM()EmSL3(Y=%dc?Xs`--z_ckN)|JXxNFbo6S*{U1 z*vwNQbP17^9;Gzgu_0q0GBYXSiGK!2G)zLDYX$=l9hjELXrdKZTQ+oR-q*{fm~z;~ zfc+T|ru?DcmE&u)=8$RZNc&{{1&LS;PZP$S|~jIvr| z9NU^|0sQoz4lFRBG;<5 z47cZDMbpZ4Job$a7d2aJLYMYAc7(>#pd@7~JG`z#>uNC>)XEm~6ED`=J!XR=hWfF8 zq}i-7%?)#Rqx6@zGJ*)#(Wma^PyV!na{lCqiW;a4b(k}FoWmb6X5>xCe;;LLveW`e z&-Nfl?Oh-OSslte(~}mtGex@!*%-8z2}l@F=+VV+i{FqlX^?0gXAZ{kMT2nNn@j`2 z^5Fg${POTp{LFD$UFe$5X(*Ee9|IZfp{;L}dYWX3{Q4>`FIJ8LP$xZ4^{~qgE^)e0g|oF^@MD&$w&T@$wNv|KuG9k{D=-PY zzLi*1JpVcv6KHk80k9WRnHv$Qob{T^P2Rn0%e5%PypWCf?B+|kE;dzu(&n2ADTrk{ z-t+Mf@sm`u5IWJKc}<8ncPV+DrE>@6b$MuaiPzADz!deIP*d-ElEPAhq7I7!3omn!ZuI z;B*vdIh!pt?Uj|c$t1J@rK#8gN6hwRB!6@ZTL(t@p0N$pl3R>*rThK0d!A)$#lmEg zxpcEuiP%=Ed*ivPaf8?H?Fne)H@yCb*#?lyHj-xxu$X@A98Kq1sFjy^Z@2|mw<3*b zbvPbJ_lAg2MU_tOCsI>T7-V#nBHBY-_ml(ZFx`dD&!Jzv%-t?}K7_CvZkt|1=1a?L zrf>Dm414&W%ci!c8zDsgPr%$tG#9wqiGQo{UAB!@Hi3hJUWbPsH!tV%M=M7YZB|?A z0W;~U%b716!}ES3mRzDFzVXf8GMmX=Q=SW8<=&ob_jpizJ6LV^aK`!eJxe`P5b#6J zAQE$;0wa0y0jxKy=3c^-O(taDOuMv!t|gfPvY0 zt_T2P1?Mxb1z42w169u=zTQ9;}UGGPWBcA;4K95V6iy7no8{;n9OF1TvNEWU25IJVhp}#QG zd#%YX7Mnp^WFQCuXYA9AD74x$2wq*61J(U?QQs@s@$P7&-Gj4CU%%5kz*}ACi}CyI z$^MX)8KHZ7^O5@FfI(MB?|5s)A^z0GPp&WR1XYmZQAc&wz|dWRLWpI zK*T=$Hz^hssjN<{;gtmnsR7yuN1ivsg8=Z+?afDtNWdO+vlj-a+faF04VKLomF*QK z<62AAvECmH~9^}Oym9-IKGW+>$PxfFA`%OWov=_1)A>;ACBzX{}F{gG z;jx@Q8^7)(C-chV?Mg;kuazwmx@_v+zTI{|aXX!`>wPcNZa+x9-W6Hg;B=I(RV!C} ze|QD(jx)tOce1J_Z_k6o)c-QO)IV15iHibL4i|&Dt%poh{)7o<$eL|3WBZnGes8X^3fx(z1>-3jZkO#ibCsX#aWuzf z#Z7z)>Fj3RO1F#`E9Vc{Vj`^pV2MncCwCYD%>Z$${PQp~mYVF`gP#&A4`w_)BjF$7 zG~mi$lOKZ~nSiDVz)-wIhY?t+PCZCV6P49rU00c^E%E|ZbkcINqHLuP0 zEX`jIsDZ&yunDIqwVj(CUa#dY!r1{0Qt-OItsoPV0S}u_s07(gx{9{P5113K-^})X zFhgu-zijWD?^v5Q$}}B9RVuxSh;a11Scv4?S7A`h=9;F9>l}*+lQdiEcQ!k1KC9z~ z%&G|a8YVxy)iy_8*F82N_DAB0+1xRcbPR;!zG1>YZPBT(o|?dU^ImIpS+wB1T9`No=wLyu(ZX3v9s+{ z3`M|xJLq2M)pG1duGtnZE>{5by638u3nrt^@1?58EXOQ3FQbDoy!TiAFUP1 z?MsW07WzMw{l3Y-s^;onK`G#;D^$!EOX?K%-f%YWXmb;x?A0~$3ta)Gv^5GKnRTBo zuqjDxPOI=HF-Ii%KsBq?yR+G^L+a&v?V#cqwgPzpAipY4Ohu||u~v2*S!+_RcMpRq z5^aPxD)(O%Bx~$Re92BMV2``w#MqQ2JxvBt(Tc4`>PB{fHz>Emvt2n~s!!~#p$McL zVFr6UwHthedT&D`lee$3dwo7WJT^bxyTADf(Ww{D6v<#{koT0FKE~5AoiA2OoT>?z z+0O$@chsQzKUe=?0gT4p(gEjm-UjnkY^r)XXk^IzR=3>&1SWH^($DwT2fvl7OcVbg zLHe>^;B1K*umaC-x7^_DA__g?o6Xwl2Bt4@GzQp+O)utSq__gl5%Y&1?XO+Fe^KX( zT}oAo)yhG`%CpmPE%%H?pit|TJsIIIh=lUQWobZ`_5Kxa7G~X@E&(6Zyi-ydN)<5# zkzkEQs{+PX0HkYi<|4W4u8g{X35NM>hghChB|cd2+{^uGD!Y~Y)mFA@=co5BL*rcQ z7Pvtn;CuiA(a&ZVX`JUP(F#8*KY~#G@~vh~#uv(UwcA|nG=6@(Kk6%_a=?&7gTUKF zmH}#5Ta|Z!-=bbf?Lvj_VT8JVGS7P};88`2Ezv4piHCsR;Xa^cV7MQ(%k2Gg>lZ@o z7gX={y;}8@)9dxV*N)`l24QmY`5LCmq)YsD_i@v@<(|_3*IEKs(7}Bpjd-=e2Bk-y z8Ej>pyWmfY5d!RRsE&quSA_301Gz6Ux=1s}*da8T*)YUKW#yWqY-9JQjbUsuGs&{SQ{>3;2AQYOVMC->7~5 zGPQDE6}(5E-Yl+2-Kbqiumh4lVGC>qt-ApcF25fL$SAgQzP->YMq<4}Uy@kO3|k)v zyHdfE4N(2Ke(wa@L=y1ml&F|pNpqO5J*8Mw4z^bVhpDpdEk|bKMB||fa?SCU!Rch7 zR}7JN6{dGHg!JcU&R+nsCXPK0XIIW~^f?v!T?YZT&^=FmuIR_^yt-ZwkJIfPd<``t z>JyeaA{dV_WSW@I$1}AfgX!H@(lW9xKNT#?+miXyxngyIj;1a9@V50?l zJP}neUN{)-NILgH*r`uYSShfjHZ$+^!GU|Af^JMi7{bx&yyZSknPEi>l<$F>;JBd2 z$lGbHJ0=ArvZ|<7>y4<3c(3XLL~3m=1((XY@wSyQB{q7!c>tXUCQu=jt5N;7ssknyqYSNExI6D;uK2Hd za+WLE{AM$TB}b~zI`1ut-4HC+G+-{y`aTu<`gj3#VE_SsBbs6qyr$J)W`q?=2B3%w zWzd!<$(HBmt$q;jB_KjpPZDt99`zM4XmwS@rdKhtXX>g3>P-Gc^Zyg*#8ea#>u(R> z2FEH0`S7{ST1KM~HT(=Rc2fL{vUO}74DnMqX$SyW+m!|ad z3Boeb=R-@q&|3FOl#-fS0{7q9P!a=p3?vTDnar{|gf=e4z`qyFGy)Xajx;Bs&hmd2%zy&Fi@1XCJUlRi@~Xmpwm6h+yDs|}SJ9ga-wj^_B5FT$UT*K9Nf zfvV*RLdw4>^r{V^a;M}Ol#e=r$s%jU8>=z+Mym`)Cx;y6ip(rtz?MJ4IZFpT;+dG@L_ zvQ+w(b2g62h%L{o13P^%?Ee<7U3Pw=8?yFtTCMu=wA#%|+D3rgE{tvEO-Z|H=lcdp zjZ;zuM7zEe-|2fl<5{{J(My4#PU)JUIxw!t{qqgKE=bOjHzCKoeY_?&jCH$i)Kc$g z7Hc;WI zJ{*O_r;Hx}_!ENNqW-odb?^|4R;w=5YlhIdhJ~)mG6?n?x<=_X@i!ye%s6^o*;-9z zGOLxw075@6kH@Y9E|A$wTXO*q0_{_y?KT;T(6e}@9Fu_e*%Cl#f9^NUTrOq0%39$7 z?>E|?0C|n-=d=P3Ms{tUQ7rIB18YE_=t2zG7jd5L+}oe+e!5va_^zwxbQvwjxYqUDNV1LUpqf9XsOf4`}fHR-;$ zJ%Qq{-Cb>8jW*hP;qy|WqF`LY1Nq^oY)tycO}-dix9<{|>vhMu68;3owid-mU7 zh~)&KJ+!N&j7FCR%yOOJ@e~k`Ndx=G`gL3Um)&3H@Ya;`y2{z;6kY05$C{0U3?4*6 zTqYGH`GNeSe(2d(d^@AIRRKkVJl+4(0_Fhtz#b8#$=a1_k}eMZs7}IK?1J{CB2^%McEJZ2AExKn|2nLi!`nJiIDSDZR_Uo z445p1^Jl*}W*wM9T{LjuYt3QPn?w9XO zWQ$ezdmVq_D7NDn+S$~=4gPc@k6fxug0jcLi$1pA=VQ6TDCDA@F$^>@7fDG?ZrUFl zI-g2|f92Li{As~P}1q)k)ba9V;N;};QT zmfxaksd_p1_L}|c`BHkl;WFzO=^Vmd!^dUkuk|ok8~BMM)H%2d2Iwm@v?VDBc#@)% z`N`VF{VdjQFiN*+w0$!N(OJkjv(G=e;0KUzsA$7oCKzWmzZkou(ieR%9IK^qdD!mO zT{e|6zXa1+YJ(CcA?sOoTQ9TXhNz;g)t+s}sx&E)aG{@%23l3+?KuOW-vtwOI~=c> z^gTb8?*pLcZET~*zgnu)b2VUI$KQXxS*3N%blZWelXbk9&sSF>q@ah#gd#+64}-$- zO@ATzbPJB^TP!-APR~AoG}1ImJuEO$b7ts=bA`M=2|X!X5SuZm0Uiwtc2>c$xQ{UJ zG4r(3Rnr^04P!V?uMLnu1Sm1N_X^nM+g7x)0zVt2>fEMFAf4lg1l%#Dvxiy@Bk@ey zdFq63svKZ8g6b_6J$bwd&iH&Ur;Z?~Jn|zJiglXp8!rUT^pH%*mc9s+&dh#1e|?xc z^R9oH6gvNx^Mg1b+!YCc{SezR;NtwFAoNp}-KSM`5>2{7*`QM7b%(?aej6V2-Buxo zJ3A0I{jctksx=vpxLc_DyufIvTTx0coH^d%b>dBg2cz$qLL!lrIJwaN_YVJZw` zFe1^M*GAnxhs%0xDp!i>?049l08O!Y7&2k6uC#-b|Ku1`a^Ao6L)$nR)mMMF%NY4{3Et+24-^xgvVO* z$wHo_HRyA^PUkgOg_#R)&9rQ6yI0v_`Vn6rr>lMiCw^`A-qP_a|MIOU!p_$>iy&a3Dm8#+mks(0;4;%z=+QWZqlC#lQb}JxR?1Z!735}&d z)z(^ji;wHf{+?)INB5@+CQ})Uv^?(xpm4t3qTtez`~fDo5K!Ax=vi0PZK2n0 zdjh(uZb~3F5*DWKBjEC238Jr+_lH3--;iu9fwHi@0y^lLy~cPtVQ}W@0AsM$gRK;M z$iJxd!ql*Sl-0(!1sGd!Jl;KK1}8Yf;JnZUu2=TwE6orGj<7qsJ z4LZ#nrJv!hkz^|@C`sH`)Rrg`M2}$J^??-v?)18CPmA$%S?yWXCi3b3C647@bV^7? zhr~mT-Yc5We|vLy^Kbm=@qf2_cm(q7gn@7avw3ivJ#Cx0rc6yx3W$i2U-_^f0=5_f zFFS7^`fNHmQW2+(`f0>l^IS6DUmq2cxmoT(w60s&pEXChXv828h<7;MFF4Bd8y39= zGY=d-FBB&B+{f)q)fc~Nj+fg(*7~Y`eZ|#&j%xS&m ziq1QGjX6HsBJmdsiqGlck?ofdI|l<2Jvs=NE6V4gOtZ4{g*6;A)aX#;;|;265b7bj zOU1tfy0PW)2u|zaanl>ZX0RIqW+43IF1>NHucg7F@j{46=jwDMzAEIaTb}VupKhzO z7J1^<3_g9PC%^q+MS7IW=7(3N=N;*jMM^Ib-Lh9Vp>mxoK&~(uPlKCLR8Roy`-elU zJhbW+;CyPE-naLYLQHEwgOI{ey6N#qNL@J3W5t9pO%NK_ul^Iy^uP2~Qt!9EYrEY6 zvR$vWE7On%!fu+^?GSPU_b)qNIm>*`>l3?E%xvoJrHCWK)3ybi%;!sl^gOSd_eaS~ z6O-8rJMU(0zyAcCQA!*{fIpL7UTt4aW(uJIep6o;rioV8VywEWH+Z}iQ_U9r znNwi-fT?^kcqf4dSB3TnXL} zp-k^T;qO!it{W&qhB=A4)5M(Ndfo?kn9EGumEOI<(J;#LcHEyDr?W$3kAT#dBItB- zm@Bmlx#a0L

0?!eg~^C`kjh^aJ01QUEH#0o~-joSeor$k;6k?W~VUt7_}Lal`-k zGVCy8R-U+R*%8q9K3#4Pxb)qi@KR~M)4VM)XT@&+P2uo*2{)T10hdI%f<`OqpG3fJ zdpt-LzA8SSg@hZ&B=BzboVfKGSOL-M$_6nVD2yDi+bHbdK_0NfR>5G<4Ef!zM|Xum~`8F28^EcISdR&)ymP-iu;=X zZg?>gJ}xg6X1EgUFlaT%Dk;JALM@$n+9d)B;@1s6o9&dlwmcWKU01Wh37p86z1+i0 zua;lElHXmbq=iKkQ=ZNPZ90QNRW+T58L!NTTh?C`5F58b!mAfL#0H1F84t%~6D!sw z5q*eP_YK_ESU|st+IEBU&0gy6HWDA+Jv1~_ zIBr3fG*~VxuWo1Kk@b`PsYA;^KesXeoe(e)gJ}5+c#f_-8$58SA#m*?K7Hq z%XoHZZV1XD({~b9I>3(%5=l$QfJTP94GgrYCsW#^qU^3|mEH^dBfekW;#TXI{LtGC{aa_QRAg5N1CKH*nP79>kR+m`uBEmF(WU^n zgm^=2S+~`S8d~8lKwx8nNNm#ic5*7&CHHKDw|wvhmA zJmb*>Bf&NZa3xt@co*GS@Fn&rG*??fbHBT-*`QNr2)|Ohj;*&_A+(h9D}$i zih)xR-|mmaTq+DP>04AvQe|W^(UemVWMxGVCcNnmWL~_)6gG{KupXl43JsV6SpIvT6pXe$FeIsGuQ*LGYgG1;E&R zc~p++Pj5+gi3#n6s%g0lj0>nPIWC$Qh=R>dAcdAPcx@|%n%xrE9{pUW4*5}Zb`gn? zlc0HetjS-q3=S__h}ypNwX3=^Em#6~+(rwl;0tM6b7*e_rE2fhpy3!Gp9TniR-bev18_v}GWoS1*SR4r;%6mt&HyG+-1Y!?0 zv%s@z61clj?TO9F$q$8iA}WZRVGRUc4Em7V=(TsXkdrF$@Pz)f`w5#GhuG>0Tv<(S zw+CV&$ZACz#d_@sEAYQ$>f9Gce+~BuLeJxodk;-Nz_G>%^p8oxD^)fhum4 zLwSdyMGmwyqO$^@D5h!*AFJ*^1oSdiB(RbsJspYG@rg{8LpCF(MpjHf{s{vv4PxN{HH> z?$H@U^AS1yuIc4o6dhQ0*T;;E=aTeVmf<)w!wREefJd!?w=lk>oCJbOoCL>aT4`9m zkSKcN1Qp=6z{&v?jf$$Oy-7|;h&Vhe;)5an4O6x6!pSgkY@JH(hxxyGf7|jnNCz9g z0kw*7;4^#FK$U6pe?|-K6E=-2Fs_fabv2Y9u+^HFu*HH6yaH8p&dbfe#TXE9Z`1E1MEArMFoOz z{4&T$)zAehK56_cKLYuQm@_FR$?P?cMeK^lrqmVDWmU}WA7#i??X$x4O3IhHddzcc zpU3`WZsonOB?_lamVxTIg8G&Iao37AwEpKqR_uBlgU3r54&x>kDTn>_qs`EG28LEw z%aRqU%BxQvMRx8dPh|ZPwTqy_r8tx9K3QNc&rIr${EHoTt-nqJQ~?7+!_t0b^*MZI z*>$`du+%gLY6G(vZm2o0jRqc`6WmQLFk2>eTVZ&ZbeQ@;NZLf^hJ`))w|!(evqBbZ zeU}z{fsB3`7wK01XANegwkKec-$XgAZ(jji%~~>T zhpluB>r#A7El}B<6tyTU#zT}6`A|h(6<^`ssbuSR zyA+>bn)#SkD&U3$UnAF3{f#Fok^;x}PbjeoxPm5;77VIhf3g3!T3mO_UF~U?H|e2( zz4J3xB*)(fX`O$nElk=q1I+L%unvqaWpdGHXjovyUvnhhDMS-Y%0LTP$h-&a6U8uP zlEY+L6RS~PS2m!(V0WngDjq0asUKbJzuTbEjVEpGaWP}#175&FEF=s?Yy<@*M z{2q}*6$rwBwPk?XQ(4IZW^#9THl~Gl7ZM)Jf z-MQ(M?%s5FNq4s(Al)UM(hZUV(n>edf=D+C(kUQk^1Rey)EwC+EJ;3 z$|w5Y;fe73V@4~oxS)u0y*@|`Vqx5Yg}<&jm3T=@{7pV;p7wx}K`C{TRE3CMK!{Fw zts-;<@%`HtSq#h6wL>-?RwMQ!8so;=K(9B@2zs6ccFb3Tn`&0c| zS?$rMlugmP0@?mP#aE3LS(b17ZQ08;=3MUSYf4eGr%f)ZE?WcrHA0mKT8-&xE4Gh5 zBM?#UnN%)0CY#SlbZApm(VFeZn|1=YU)JBS3;*i;$}ugNxua0PPn%>R0X7lZYvD){q6YVR z5u7niy!snUoHe6)isUK6MO)f17_~RomEbYhkH4vsS2;eW zH5Yl`r~DqotrE}}B7b^BWHgRI9g^c@+DNu?53$v|2 z8#+cJ2j)GW7OAb=Sh?z9U6_C9Rih4Us?gSd@13pLb6~A6N?q}(g}AY!Nm6*Q+Ozx5 z8|6n$^WI9Z!67Uk8yn3N9Yn${j`BB}s-bc*E*&72>O9pNaI>M~*-oVM z^>vI>nsRf=Mp*Xb5$xZj0mRRP6#~! zvjGc?N`XODc&0xLdj^^@jWrbCxTr1hngSMv5B?R`@*8~6XvU`T1nDDtqTaf)n%CEk zxsx>z$>4Y1j1Uv}KlTO4jaSV#Z!?Yl0;VoP=?Qqx zS0gz45;AI*+Kr}^q2V)!0&+7gPJjrE4UWn}PO+!dD(+$;*$SqO;@x?=qIRuLgBhf> z5L`**@+zX)X>WY?C!K+TQN2++3Fu1uB0un8VWzC%kx{HPb*hK-@j5O5s2*H`aLX;u zib_gAe!vI*p}9QO7y2JL)aYK!^IrRrXPKL#X9IbsBO#Atni}dLV!*yqqeL|X7UAv5 zS`4@+BAgL!#((>IN9rZeZ!wlw8q6*m+OJ8D{xK@aNJ;{gD(q2uTG~!3Lm~}AL~gkB zQ-z+1{6X2C+Vz*~(`%D0xRX=3g0ve=!kdUJJ@_}|AND9-@Y4RDhf zAjxmT{HGLOoG59Z*gb!P=W7Gl#g5!tVWnJDQO$-x2fVmkR(1aOSL#V})VqI9MTo;o z1DIDl**l;6;I~B^`hhoPJVX%4Dl0aQm*wY6Hsq4P`e^he#P}w6x!MO)^7vz^v zgO7}8LjBPcnzWb$HMs)O^p~u0=QWJC+XFGUybju}L77Igj(y>-8ZN`Yb6zg~*6jZJ zPhVV-83^-~5M*P+X99PdtJ9N@A8yrMGZD2>MNM5-*dzJb;X8%@X%R#!l0w91Bk1Yf z!!TvgPFXImqfH{kY7a_CUw<%+p4i32oIH4MAi@9w7+n}azv*`KQDzWU@Dh6#Wh*qrq&>EDn?A}J_H6zG#t`P3H=r)17u*$6|^33!)NDa zezB)wPDn#TW4SdDLj$s64KYP8r=R}a{74`de%1ZJ)fOEuhIq!m=0m1tqUHLZH$bk z4Hkpv;Jz_hEPEP)#ot{X`0h<)le%_M97R^we=WBhRz2yuxCZnaR03A@X1f6d&2r`J z6gnl~A75+Sxz`i&n1wv>$$R~?BjLbvOP*fk17L$&ef#j))Sr_g)^53l+$d--yW$9_ zCz{97znwVh*62e3J6rtW6fO$^tVwNWLz3@qj=zBC(d*YRw^(b4$+%(s5ir7`{tvhA z8+#!hgsl4N?H<-<@1_e$D^zlRmMJY>|5*;Y`kra_0gyX^4gwV?jP0}6VM`t8b;&&P`$>)Po>Me~?YjZ_-yHm2g(j~iXrO*qnfe)pmK z->mX5egU*I{3UH;FCi9xVX9#W>l0cmF5Ezy zZUn?1-`mqoK&%ct?L`7+BnHg~wm**BZ`STzI)2%leqc5IO6HHLRS}5vnqUQAP3+EU zdr0MhG8a&I%^&|>H9h5u_&R`IT#t35(-POcMZQQ3W#BF6E$QoKyR)<5k`2@>0W8&Q zE{vlh@SaMvDqeyZDh zYrcz?iJ}QrA^UI>X^qz7MI$bHe~7tl@EO(3u8&SO)j0fmYV3bBfKXY=7YtdipZ@7} z-5M6rjP^&r622ipu-)cJ6lqr0V=pgS>!nCDc? z3B?x!jEuL%j*Bkinf35W2n&z9<9fj?w?$c)Vni?B5wpGK2|EOC2&hmT@OVcP7OUUF z=rd!19uCR*Y9@StF<9Qrs;K&Tsx(UWI=l`?;5RN_%%QR(_WR-rW^`JOTAYRgl4+Yv z++G7Wf*$DmB;tnA!1sYKV8H5ys5D5AkbxThcGc@`5pKI* z5)RBP3G^73s?cZ zx0^_$ysv>l1%ki(c*ZvgBHWOMH@~=i&uMR?`*dh>V0K^#LVu=$O-mpysSw))mm$I8 zqR*`>?*-@35A?*LYyr4fGpd9o+^O z*o-9g{`&Rnb_-~NL<1jg6;kQHo{xq`mfGq@u3Ks7xAUWIS`wG!)qicda zSwJ|s&`=G|yrAvwdBZLQwF9dA3m^JZjYL8dpRfLR=YWQVAA6L7j&Oy(Oa>mZ)Q~Ew zKFafM&|rQ-$fUWmWLp5Y3_B}fqCWe<$x4gbSSvUP;A+tF2UL;uR$5#-I!GoFr(xIeki{8wxS;Y1s^@wv| z>Y{0?Ck@qi|C?IW5#Kk!Yk_&sPxAFy!$zt2Z zWT0R6-xY%GOCrymP}~4reR=kYK&66$02=L=CjVwgCeP{r3NYk&>BH|#Bjm4#m5;D| zw;FAYDlcCB-|wTsB-xS0%P6CT-~Yhmx9WaQPkdgLz!gfR!TmDT=aG>bGxmOz%4EgY zVr0eWd5}C`$idQwUQNg9=d5w|SqJlPGqA}Qzc1_m?^p4PWs2`2tfs2)e@jxV`esG# zhi$&Iu&a-MEnK~G}$r158t-gitE-A-XQ{Wm|KihxD{{qODsF*#)R zr%Ycw7ofm-{#=LgL!E-3*3M*G)){OB8jx}64uP{Lz_UO-3$#HppuR>y!M5zXB}qD) z%L89EU!6gWE_}NNEBUNXCic&IH_~&x#<(NjgJ;}W`d2IrIthh+)P3EbY4N3&AO`x- zV#qa#jE&E(Ua1}ejc9dQ4*%~9c@VWYFKdJS2O1Ge^;}s;+YY)VWI@gc*w|xKhv32m zWCxVeS%SE(1{P|^O#Um~C0{7fv9W#j*mVGfag?NR(i;wS#EVN5;zVYVt{~H&qqtyM zXVxfg7V7)&MH~O`BthgI)KgK+3f?)&pB{~I{h4U~qO3$>N6sahKs6$ntzT7D44Nr( zV3c_=lmGW^tdPzDa#kuo1FDefRmupmxM*9Mp#u)Bs9PKUS*iX`3SAK=A8Tr24@Q}s zoY9=U8+-cq3Mnck6N&0C8#nNZiCrazYPNl7<3qn{fBKPS!+~9CU}5)GP%Qh;0e$~h z=S5CkV!xjw_{AF=O5vVz7HuP=dMgAlgA*!vA0EItR}?Eh9l48y_4jn?$<1+w6Y}aB z`TIfJW;!41XvUP;oiC>BZb3Af-i@g{27I>KR~C+oK58rQ0nnJ=CLxH7`e+~3X*O<< z^zKs-t=|~IJ6OhC&#H@{OZPEe9v*}`fVKV=q)ES^E*4^2B)wFSeO>{eHZ;j=;N;4= zbz-pjZTX-3nick?-y3&q9%6E~GCo)h)QQSOTRK$}0*wIctc(wBB__Rb4!bNtG4!aj z$Bm*9Ina+e1Fc_v!iBO)?-L=rit?3&n0aQ8-j32nRCUmtgqJal-N&oY?>p^=x89eY^sWBX|_pX zB{BF8Z4~Tru)Djl9dpC;1hnL%e>AdFM47C5(}Mh4gh5LWra5eKPNI~r98m$UBTJGK zsejxP4-(}-lqMZ7yDfRfLe&r&Z)0Jtyr8&+^YiNeX&Iqgb?9LDy9aPJUY^gp9lLAkBew4j~!*ZMqzrI z1$Q95=nbPUpA4az=gdX@sPbjV?`YhaYHxpG3R~UEzKDJ8P(0Q#ym-coN?9i;rU{!% zbwrSj3<&Z_pbGWYDcI@DSDQoeM_x?~d~xT=(tp(mPD0~Uz;^Ky6S@ksw21EMkoEMT zIaQKLMt*5=A+2U0Z9(6tUWUDUOygpik&@irf&6HwRW`=9l&WWRVIr*JonEVXX`n@?PanX2*qEvFdM_E4wwI|s0i%yu}huuO=3e~${CQO@1-5aOJo;6T5dmGWyVpkaE%ML zAfSEj(?k$qZ_P<`QTu%0CfJ5_s7F#}`beji7>)38okko`>c-CK1i5{zC z5%(}Z6GDfdN@_(Mk19$uh*Dz zZi|I_m5a(`81$01Q_UYU@b6bieSMf6c5DR$Uz9VSGft_HqLXXmeUzXj!m zr85jF4Q4_JSvrppg3*9Yv^?Waw`HXZZfRIdbdAoD>*F?(2#pv8V7a4?)$=rg%Fc7~ zSD%2-=R&RdT0)>m+*QONhQ8)NF@yO#?mAFAF}cGQawo{n;#@Jb@<^bg9v_9f&xgOzd%B9~2>CkH8IYZtcnD zxA;WvVKeg4vL#;yrEbSZ5RQ;VY}1#|Pu=dX2$NDXtXw_>czk8S-Zirak-p08GK^4q zr9DL;EF%GPmurCHdjvK~*x*kd(VlS?-u;aT{?OD`^=)_5FXt#P*j}mKsMEoJRI=m6 zV;rv$&>qprb#jD$JonhjJmU60gQwb_OAx$VWsV-_uSmi1h?Xw7EC)VY*S12~i#gOs z++cHu%>p&1dRXk+wNTySom|QuU(JU&{Gd}V zw~HZ}m_}!m(PM%_m6G5STa04bv8`{deYrWkZ(#>DH_MZLGn@%E)D*f+h6*)N!<~o_ zTaOqTC12n?`NvOqjb6}k6}28q?vnZ0r+C`DFqCo8y*?`p7sK`xVO;W3MUZ;!KJ-R4 z;$uo$ZrM+vuZr_tb@Cik8XPfLZ>6jB!=VnD8v$#rZ1bHuczCpuKDu2O5|?Hw$43Cg zIPa1{gSs5C(Z;CvG@AA{dL*T37yfNbqgImKi}hrtV3J{<*$C*Vufb~BWYjooWhf?p zh2tEqygk$kvvZ{5f@Hn7Q9k{E{?e5iWJ9YXlWXSVpX62${2$G|TSkq3Vx?<@Zo0&NY zG2O^CfouiXOF!C!$v&8ERlMiN57uY|1c?7+&1sKTZm)A}F2&zP{^&G?<>1{nNkTa| za|0idKDd=+`?up0D37`O-QnxGQz!C{20WB8=`IOEjEU~y=C^G?Ja&qU-_;oVLAWZVbZ?aLM=$X$1zs+r-?8=K z$Y~)mo)s4T?E{h%jlv-DpQUIsz|ONZ>}>}h&DyTu@~K_vdYjtq$+j7RAn`9nQYiF= zvPjdIeanD^xOX%};fdg0_i zsEdrY?|87vGfLKLssC8Vw6nF*W+Mh5*MgG+%jQ`P*7k@pcE-{cq8iKq4TW6NId;BW z@_EfbP4W)Il0H7Zj_-_gF8+xYq~ERpu{Z)p+WoH^?cP#1S4vD@08_yUU+xc7%Q>rN z?5#y5s#MmWF1UQ`OZ({{s2=jNL6n8)d@Pap1CQWYE_&4x<4-Ip4r_#R99&_GI3~w6 zc}I`brnQPb_6a#_L`!bO!Cxu^BR!2Dns!#1<1+_G@##Oh@;LA8@1EmU=6uyQ^cm%l z=Zg0MjU_6WKkBoPJ^lD&vPe}5%;~#*V-JbkUWTC1R1}4F2w-S@H1=sC5BhnTqi?CB zDoJme=U1R;r#Lg7fFF4whA$RC@ziTIftSMrLrM3cq#GujXvOnqTn)^=O$JGXCfw-% zs15EBPhdNqo=_T?LOA_Rq3vhkOpJgp&W8XAP^Ig{M9=3155_(=ew9%$MGcY~(vq_E zk0)t*Y=e+hZ{6-EBP|@KJlL|h_!N>uL6;VU)QW^Zh#)naG;P!4&xWPMZPe1Jy@V#l zrBUn*q9nj(bEXUqQBlouqzF}{h=R{{Bx_)^(9M;M$7EXj(K%fsD!Vg^$B#BxhsraT_y;YsuatiWY%{&%I3VfF+dVd3$Ir9v#M|F!;1i3Ir z!?x19+oBYb-n4#}4SEz9TA24iltW*u4|X14_&q12fy!g2 zoR?!sbnb$$eR&$R=id+}%i8c*l=rx@jq;VDV7rUM@e3vFXpLA+Yluu%O%M8sSh>u= zW7SrE?JcEV%SeA-&%w|}nmtq5wboESg}bq*GC8>7k)}-9)}wauU=1*4reI)K;u-rs znh}jN-(}t33}Q>+$@UB#=~ATAGpd@xt;j5nmTmV1@teLsFxRxdhnnDE3vVqXJBSx} zn>)2eED(U5i7y_mCD*=RS#qGPcW!p=zjYTO*v;g7geQ5PAf~1mKEM3CK_q{Br7r&o zrIAz-T1?auBX?AH%@$trI!USVxy$lt3cNEhjPqJlce%7N8DzOBde>NzeN@!O>6diN z%M!1Z>0`SwHc)&`Vtoe6E+dqU;wx1MZLKpZZ8!+HKD({SD?wEu2(*fOKuToMqzLP= zF-*qP=j7WOYrP`i?m{%sPLqMfAEB+KRicxp1?XcW0=BxP-*AI!^9`k*I+|!n@vo%4 zv?JiKROwL*F$S2Gk`&EWZ+#75i6}o2Q|}a(HFD}*6o~?0N; z4OKNneo3`a)$iHHC(jwA6pu9O@u6+DJ9wYaTQ1@Bumim2*PIgQ?})PnJS& zj*XgZ*ltQ?$9h?+v$CX8^gF%(#1nG^foN`a_EMMc1!z0gDQ9yrw!)47MpwXT67Yjx4jpnmVo1q>JgUddERbl#riURbWHG0| z{MJgim9&H~qS)~ZS3yC{D@-Hrk0f^O&lnsGY%XZWJ4E3M=(v3Aw)S%J`6VA5_V36l zOZu6-a2N0BYY)YRH)`LPoCmVLb*ZTE(Yi}9yhd93Q@o~KU5JH)^Gz}~3X?+JY9+t? z$Qpq-6XRQ1sz2H30QVFDqkhlUoDrhK0;R_Eo0&vy87UJNke${Nw7$0Bye!$}K4)V+ zmLWruKE#6LpdvFmjs6KRQoGb~EP+Rk*h5%f1X`=p5;Yr}^U;q_z@g!3FQ?w~HZ@83 z?ePabX9s{CXjkjvBOuKfWn>8!#yVkWIcl^B~wX(8#W!ljU%-JQ(&Ic3%{$8^I z_Yi3FZw`x829=|^o5s-OueK@u&MJIWnVb&V8w{FNQ8&UZW&%ApVFo+P_eladgJ6W=!Fi2V2FkOU4B{V!|~t0 zCa+y?j_@fNdhccRio2Z!%B(s%eP`%d=bn);@Ig7e``=$Q)^rfZl}Pc(bc?=$s?WS% z5EM8WWZNGCR51yUH9-9`L(I~~Rzq|yK)#Z|+yk6VriAMetrVx5z5fVrv^?C`d#%2^ zW>znJahxbrEB^1_Vg2!!Q{(=j&!Q|{saSZzbrJkc*|k3p^rPJG@l|)q)vgFy(|2;U z%=6zEr_*TDRnf1Ln>^uX_F(*3B8w`WqO42v_N_wAbC z%`hdfxYDfh*i9WyRLizXU#pxc%e+xio@lb$oC48X`Ut!oH9_JkO1F-yKYwYJ_be#? z>F`1_@>Bs(+2p0m_|Mn6j*KKzV-I&15dW>1Cvzo)>2eiPvXC!DH*4>LK(dM1m=VBt z^h`yueg|&94+E0>FW!GTRy*Hf61m|YIlKp<+LyoP003+TJX3%HnuDAjkqZr~++HXPeTZo{9hF&M59lH+lQJ?>!+PLS1k_YH6eMqh=ZN zn?#GjSW2PhpreWc*a*!srFH*9=fSwlQ!a&N%p-geOI}x6OFx4ZLy=~*2;@BRn(tk> zex;)~^#|eX{oJbdm?3*<<7b4_jmaX2Q8tDL$F!wvw42rtmc6USq#Eu$;SN}y@j8kK zT1?9Yk;pXAl8??3-rucLY2 zqpX?T@yu@Lk?Cu4p*sDqM?jSQd!h3MYZzFEpYx48oNxDCIj|k(Yueo(|Kg8lta?2? z8h3c-@Y}xJVb*Aze`vpGab5L33B&aIJ!^eaXAJTtg1z{hP)qX#d`zq6=s=E5O>y zu*E5x$Ns!flAj*L&Oe+D1Le=jbdglg$n91fJFx5f+4=SajC5Dvrq;UVhc?h_1RS_v2(w2wdU7uel0f$F~Ad zHM6B)-Y~7uZ*Ksw7~+LcJ^{Rx*4~}0HaE|sy=r@*kFUFO;~9A*Ot|3M0BqnYRP(!l zm=YL<;j@DX>HWA&He(P>mB?fN6Avc@9m(XKb6iI4a1dXMbv56HmO+cvudqas**1ka z;8zz~D^h~R^1F_t% z^?4qFZ+N=ozwasa4RJ~1i@WDOGFTFAlGS}5Zj2D$|96^|mzQ4q<26K#=HUfZWgmEv zCbmtzSsODQ^t*i@4UdQX>X-emr#~x#x09VXAR95fYlD?o(CKzp&&b@vTD&88`@=%B zZycB(y_AFt_1(U6dnBJ7fK||N&tcs-;molgu(-^8^$(%Iph~;!{K3~VH8pi^ZdM}w zwU_ilE@4cVqxs@w-rE)5%#1=hS;cOPod$Dtp<9jk&{!!U^;mWFZ?E_Ds&oTpTi09c z7wepty%A9Hw?-FoNsNoHaEYHROW>v)A{e%aids`DnTI29QUD+_wgr?bojk zW&%z(dXr63vTkp;pA5SL1I$4pN#}6~t`V0ReJBfpGC|u*LI9L@ca_FO?O*y4}})(=rw6^-|Vz?CPeRLq~kka#NcN2mhVc0j^9MWdvWyj}>WO zn}|QV)Z??!-sZWWU8x?8h%&U$Fo}LP6-{%Y##OiM-mQM~{-O`raR7fBqfqIbmUe>$ zWRY@nbDtiewz_?2p4Yb8Wdm**d0YTU9^mHUGEW^TN6C@II$m#m>fh{-!(;l{VtoJl z^P&D{Dfp-40%M`C`TU&Niu|m^qMAvN>VdA9p`U%ZrZ<$F^Sq4sIvYSc^Aoi@n7P-Hqp(dlrr^Kcs zVAV&KbMyYe3-^xBRBX;OjE0Zbi8iEo7*A7cjw*#gtq)A_jfMC8YcIYsa?!mSM{w&G zxtQPvcA#d6@5$~UDZxs1HOCI+9$wrV-Hxp;8wN{XopS=5-~u-+vU%L0z%*0X>sYf< zo2j}!Cp6^m-grU1SyAXl2#Z$vC2(u%xw858VcqLSbb6s7`Pm3jcZ#oR?g6_W%J16@ zWp2%rXOQZcI(Sp?DY8t5&jZTJD?D!iR0c`z_ayi@ypnalsrBUf(TP2NCMZHV}85^z}Cs#kBq?J!@_kTX{{J}CbZSPjAtPpFAM^0;r&o_Yo+yDwP>*nay@MY|4e z7_cbVfqN$)ql`=}_X%*rm*Y4Q=~QX*vavn(p|P8l^H6+}RLXp{3T9>Nx+=iw*HhKR z5Y|3`B9t1%%-}-Wfj8XdS_dNppLa8-KA}JWCMZu?6ou5YOffT3;C6p@P7~7Te7FEM z+MYnHqdhXQH^?MdjlHYQ^E_>6F707RFL_*6n!(WxNMr>)>EWWoI_ZK!LNiSk>VX&L zzgU5!E>Q|d9BHUHGxlheqtOq@cVT_eC=$+Sqh8@6xzKX{UIpbSdaNtSsrU0M+iJ_JAe|6f5o5M2np9}DP{1a`;mY( zltsHT3ESXr&MTkX@m#?-Zxjl|OcO|Nek!pOFzZ+9pIK~p1y_3=8guMNQAT#(AA>^G zER|YR6hm{N(!lcXJd^9!^Yhxb(%usBOp(SNoPV;$UpvM^3)f5n<jZm2K{*K=;Dk z!a4f5F1N0&YP5)Z_<$#ImR5;u0GI#mDGDxqs3?ryNA0R}u#_%V>j5^%y6;}Lt!u|G z`Zi>Wgu}Yd1eqSDzI>s>g<8*>)f)7Joy&IDtqm?*OI-D(G^pVVl+K_`cAy2h-lysRv}UVRgU zAdc9rkR!hBRcNsszScAGE0UinW>Cu|gMXiJ89%{&^5sJJ*KAoLg`mf9Qc)J%@Au># zga*%;Yvjz>bz#UCcKv;#HIw(lx$5bo*oe?~3sbpoTQH zi%P{@4oV7(<)=}Ir1$D>Yvpklx!M^G7x9%qNnVsp#$(kUX;$?A1vZ_Q?A_HSfPn}v1u^~iklX%~6~&4EhZM}dG+uS(0M#6c z)56i(7gE%|P7$K)>}=qs5E)mu-74brvl)eq8<-o)0=iWqrT9yStS&Ts1r?Qa-&HaW zxZO~?DE<_Gz=^`eyZoNFt!i0oNa)~U?74c!VPtM|7Goaz~l&(5Keo;NM9|T+M-@*A-K4W zK^*w74GG_&(QM9`yQ%^C?#?xrM@zW7PF8kMI!IZ>%4kg6kY9&1p*TCsE4|Ph#*yKB zd#c7BvTGi!Y&kowF?VbeQs6Gg$QX{^T@hl{hdd!5_{V2k2n1Qo{eeW0xPG)681<83 zqf^$oaS5T}s%x*e#W#~f_f9@NH1ZVSc_=8n*SCdJE{iQ)3w220zeGPF##IyRaPu^b zpTj51|90&y@1Pl*`di%U;9*l`Yj5d*h|seoIC#D%aeDQ%;gED;(jKlPPI20ZmNxO@Xi$&Ykx{b?0bhC0P~E~k83DcUEx z8tTzBK(oSis>-kr9jShIARmwR-3az#0u^!fMPG}QraeOK$4`HdMpa8%zCfUv+L+VB!l6!-TXxryPj>&TI%4PqIXZ2Fh4`27-{kt`tHtp2 z4PrfHWw>4{rVU>h{5FW0jYfY4Z$AL8I^zx%?FK?V{%CYA!--?v# zM!aYr;gc$jXogJkl;$J!WEL{uw-3iO2qYF^-Vr9LkqVh9HgUMd?D-@ps5m@E3mOc_+yku zNn;bcL`~G2MzCddC456Ai$2DMr9gg0@pd#u?L~||BA4_nPrpBGG!I!=GhtMhA1vT& z)v4#FvqtH~q_`_;w5JnzLV0uuuW&xH3at$5!G`y3M?hspT90T`6v(1 zEVMF2^255Tbd^)bE5fNl--Ix>C#h`?b9IJ%7X&gvC!|IF>!mJHGjK~l~~#H9y7MKA$TZCdN22#jm)$O7=8wcO$TLeB5JZc`$|?`D*Cas zXuX$dK2zl!FO7#P&Y>uAnrG<+4Ao#QiSaD!^-0>$OcA-S;<=g!k@w77jj*kRnY4}? zMU!BT4G`Z>pn4|Uh~OM0C`H+5*ylC7R^cdhD)jR$u})`QL{&c8-prH zM&2e}esWh^KUi6H^SC&tGz+P{1Ku&qN8~E3?L7H1w}>$XS&?9OqdbXv+bA|Fq!KJv zsL@+(4CLgUJqppNSsCIsD$PyxQ`n0OhWZxNv4#6j+2I^Io3(KWh=A>I5$ z^ZWDv(LZhZLHI&^Bi8RSH(T5qe2z`t(S@6G^{&DGFlZ-iR(5EC3bx04$ury@2C80e z*MeV1LKR!Zi4X@z7!7gp*oqee)z-Ib>|Uw>56&qf7xT_~)aN=eLU^D39Tdg1Pnem_+e zZnFYNngh5?dj^|Kr8V&d-=}?KW#>;+l3Va#&xdH(t8#A_-bcl+3*x&Q4?M_wkR^4^ ze-up%9Oso@L9`2292z*mlNmZMWSW3(1w4 zL}%|vqL+|%NM;k^&sVeY(x#>$b_6gAH$^tZf1q|iS`wjN2*Nm}rQP}H#@BM#e?kua ze=h)fHmXM>ZKQeDkcG=El88iy)U6h=P<-ZJfci~!LHvqFaj=y5x0bko)JDs8imhMw zsmgyMHkLwiLGN(iuzMo6X-`srnem&IaLUD}8!Xuw6Gj_x$QBw?IG8)lc4<)VqeU6cxaT>Qr6s1@NnU)m2aQ8L4-an5M zbpUG#VrK~djOo-Jl3dHdkzUHP?QvI-z)aEw!^ymFjf$gpY((;O_KERcNOOZkzTo(Kk+aA#3Ni~=uB~ZFyY^gM(i@Ri<^hO!$L`^H7?H^F| z>7X4e9A%Fgz@uYfaa(p@%JfrI0yJ;O9?>Qo0-p=>g|99JB3gZ7rZ^paBZ_vR>7RC( z4YsDO-Bc(<9C>6TgJVyfV)Z2(``fzI2IJ8lf*AQuefL&oq`gDK=h$8l){w2tYdU|7 zaD5)IR`}rdgnN1Dp~5*h`rY@ZO!Hb?sO)X8ZGUR~+t&ufnjwiin1`UbsZGgm0pB#`7FCDoPS{j>UyxEQ_)YM?v_mps*T->8>FT~>WyAb zS$&yaf)o5q=5~)rDkY|5BN#!b&Y-v`TZs(E)^gQDymh|tIwj~IfqAs8E{{P8uGBOo zbhQQ7lSU@eY1oG(4lImC{XR@&w!E(8ry|**lfDi43%zI@k#Yl1B8tkkT7CHjyAvU9 z=*XW^E^Z2MvEN6w2Cpc65D-)3-0{RD=_j&&jRCvduY`M6&BB2EYQ}D=<~AL_jl6w_ z_g|+D)L9UmNKghIfjvO<1`Fo#Qd&~?39j@g2-(xXXD!BQ^<;)H%D5oZRJ^}z6SMmDLV1H2@iecNkuP^v zpGiM`vPneTrQADJE{}!r5zm@RJtOp{D!iCAdnjrdKKZgS`WF(H&>au?vT|Qr8VgIf zcj<^{qTurcWeq>C$yG_>rmwtUboX~fH6?{ter3#EbdI}(KI?`3RSgVglRR7tEYi3o41*e(IIwdNZ2VfWRTLm_f%@9M)AyyzMa$YY5j0Pv(TkngTMpOTaY z^0Baa@fL^nMyb_K73aTU;dywGG|hIj{zi_;$yDq;vJoQw4G$-M_~~yx!(}R~R=ld` z-N+;jGEHJ$_VOJOhJ@RW^$>b3w5BGS#$AnJI*-o_z9RLATd2703LJj6kai75RpHOm zu-p?;3yju;@>41&OAa)Zw#hanQJT{W--$3%2X390V(PFuR*!V9Vg;BVTNnq7s!8B* zp;xU2+@jALO`xxMYXg~xp;@j0gh6hN7>!v~)mwF?^dMW!L+sYG@RB%9;0xuTa8qPO zv;I}Oo(L!RSaba)V?I_)D1Z07$I3lkir0zOW)tp?Jrw}&uaR^on@;QtlL|JU@i_2e zcBDs$abea~n&Gu15T@-M32=eus1^C>Bv8{F9;lY%KGl?u+&?{Oh`vB}tQ2 z2Yga>joG7l)L*tHQ1-P)ir+BMrp$sLrfWjtKC-+DcdnvRZ7oH;Y6xx%_+D(!y^~Qh z7bKv4KxvpDO;Id)CFnuFt9**RHrkk8E$jZ*}w)oTe~-9}hW zKg9u)RIGx7nO(wJb6=HGM$RsJD-p%>K)_Ig_yo{N@a9cvi9_)AwpFkfS$`f!(xM<- zmCO67Upn3Tls;FzMdS)%(0IEw1JvREap9<<`>xvbo51A4eeo^q#665A&MsV;Nde?q zFSs0(4`~K;_NzW4$W!I&uVsz64a6dW{uRU*je9A;0(NWs-uL(!T)4x;Mcsr9j$2>-#}+w-sj8Au_~3Ro)PBvP#@9}a zv`&vLXr=^x^0y$cyLRGii$~8uirALx#p0y>&0Vam{2?X3=|u)|I;88m41?qf186PC zVxm7m)k4?Wgn2wYw%SobwCUs`1qxIk+ylCA*T=HX zj{FK@7jI8jif-||lnwrmNtk`aNeybtM)ZYj{P;p_j$<75PM3d7+xxeK zY=yQ#ApQSi?Jc9K>bmz~1(EJXNm1$Ult#LwySqE3yOa{7LzI*_bc1wBcS&>TlKijZ zJ)Yl}_v?F);kXCq?7jBctLB>5ob$TOS(N-f_`$;}J%Y|l>&4g+-ug3bJRW2s8sbT; z{M!Ca|2j8hIU@>B1OX2o9Np}!?(lq%Se8oVLFB7;ULB!V>Q70b!qd(CvI&)ZZk za)?3)q|iyZlh5v^6n@VVrt}x?8rDYTkFfCICeAaDi(K}UleJ!mMHm>?Yf`AAJQCVA zm5aVsdw5z~TN@V2=}2@$yD+6Rc(JD&Z_M90DBOU6ZLi2{^`cO(PZIiYBCYV;j!$I! z!usW%jH8tHZE)WBnnscylgvGt`?4d+XQEKDZ}DdY7fReH;rIKypui{TdEp6Hg0}Db zaP7T~*-L^dYng>m*>iCPKDzB{8`T=U5mi;$QI!oKjV+Ta$~!B|;2RaAA`*6) z-`<)(bx3`T$!OGRe0~|!UQ-jkVm1py@Q>C{Qs`#3RPb>-3Eo26dWx2{EqU)%{KHo@ ziLgxFMeU5d8t7ZblT7R68O_ey?|3PB-W7bd4CqUm*86H4X8mq-AxTd4v|qW$I1Bji zCJvnyaC`#F-OP8-L+LWh@=6}GM_tcIWNnUB@rhqIC`jngU9jWX?eFp7OVv(zMW!?L zlxxUgiTVBsZbL#tzbehP4 z?-=s-W%A=6EC}aC;0XxL9ke^bFIAQ273SwC1lklNRQcquJ`&!hVyVn0Wm!nrtH*=+Cbso3tPNC96qT4X!-UO-*eqiRlv!H7YnS_-O$K;om z?zNo48cq#S=*Wa~5vs&4kCsL3g({6b9^~v^O}8xMrq;4qIb`FHyIW#3=kF|0oeR_l zlkZ_@DHTaR%@)X%`bFp5p&-3R_pbl*&z~Pa1_eGA7RB9D^nitnP@IgXzlL!Z8=rjB z$2CbLIvsbTgS_SM@5`|hPR1d=jB z@WJb|EUdFV)tUBQBE~Y6JN>Nr%%uPIv_EN6m|0d*0!uyns#OQ~rRw<2bbQ$3?rh7j z+f3iGmqO#@d&|cQ7O+gDzkG8Qpbxlv=q+J>RHRi+@)g>T=CWHrA^+ucTaP7EkeQYB zFs!k%s-dJb29GJYldF578)H0HMb{kp<3@*&8$2_Z zxv7YB!u~jo_iaUgZ9UP3RT-+3a}!a5^`0Y0&sJsN83~ z-Q5NfFo=kV+;-D729LLV?t9c{ydH;(K1XumKW6DZlpihro%lYnu9($aHI*D3j$s8N zN9;v@jsEvx2c@Mpaq6?8pjNfHyi1eaUz@=? zm)4~w3q=Km5fCvKa-FS&Xw)XZ_I-q2Ez~&#`*~C}JuFr_O${U)85zxZv_6dYl4GKx z-v9k(Cd{ON2MUz?xpwBu=vCr;OmyAdM@pGnb%90~2nv_#)Y%WxSA-OlsMN|Rd*EZH zXg78=%!sop;a`Te3g0vyBKcYHF;BmjB$+9?zW1jSZ6SWioiG7+?xQqWvAk@RweL}` zN?8!2^hYa^=8-NbM1eI5HImT2;ly04vrkGgmWcPa{lH!G-M4IC=V5Z2(jWYm$2s4! zeF&_8TI@>QRSRSWmza32RI3{LMwu!Q<9g?_V#4;>s6cp!e$mhLz?;*OxiTO-t8&=f z;IiWF5@grF%E~JISoN|B-m3L(Jvv_Kt8KF3U53M=lZ7JDmbIpn?2OK`U%+oEa=Bl- z>fsNXZI}JM+1J}g0i`l`Ry|b_$ButhH!&L(@bd%Gu-sidyzHVbdUk%a`6aHs?=Vs( zoyt^e-W54%=fk)19tzI;@X`85#tnKmY`dk0LxH^DCZLdebgD7m^a&x6LQ!`uCn0(^#LHrKGbZZG%gp>=PY-Dr8WXnq*={75cQ=;_rc*CnRw zeyO$8y%vmEs3MXahDHjffqvlR5QB+{%3hl~H1$|%*Y`gxz!HN07{djT=|!5$a~I3! z#goy&>rH#kFJY-RANs|zDIAY@j(M7@hGFhONzVQQ~W5hl)H@ zb-aSOmbjl*3O@Ls`Zpi(xjy}7LL;s9P{xsX$`z}EhvIXUJQXP^!N_QBbk#X&Q&d{F zv@m9QgcK@yu{v2esD8o`XKbgZdKZ(8szV=#^(Ei;i8bs`OV zwB<`bu{hKAn0~R(Wj}|87#X9*5)de7GO`^xoPa2JX??Qr8VP(#bM)&6k*2%X!nUnEBvsP**Bs55-nVhjLbyir}0^3`4m**~Lo z%U-vzAm48CW32ZdY$FwEz-K}jWxd*68&Ga=bEde37EdZDWVy5Iu#>*(_M z!xfjZI~BRo-+K~|Kq!Eu%+_f8>FD{8u|E>d#oi2isvn4n<+pGU6YqkoxzAQ)es|*^ z+do#0jrB?iQ<}IR&QeZfob66EX^5+dgJSqUiha?5uR-I7ZiC%8y#(#|@1bt&tmlD7 zu_WB0TBLk#Y&MDcy&(Vdg{G2yT9vL@ZeKH~`=`vMoY6B#6VukFiv#I!`hU*~3H5DV zKmrn@j(i5+hhHy+-F3f+#V`1XOG(U>t2P zx1Yk;;N=yyRfkKLUOP)bK=xGj=pzjTbr6E9eUHlpsZ`ZAq8UQa5->*H_V_A~Z>s?5 zmp%#DDp8wHmzju|?`rI%&2dD~PF7{swMtyfTFsI_KNVaLeuo6?pyDT=e5TMaENc%pO2 z1WQIN;qD9LTjR@y7YPP<^Sjh$TR)Or#?*Rp?-x3@)XwhB=V-QcOCNZfQW>n*R)v(` ze3+c_S1i72mB2)m_^iX>deTEnXT4Msg0=Ft{U*1+*jJj9uO?c6MrL9C%eVp&5!S~@ zG%c>XXUr|v#sh`25u<~{_eKwQ<=k$(j)noYaxq?p`gP{90v;C*ZT)F)fkZ^B%D zGyYqaKgpT+8NuE0QuEQb0506iu2*3?MXAYEeIm-kaL!dOrbFo5%k_I#Q{;Z9{pj3_ z6qxrc4*vfBTC z<1*+Gsw>V8RMKeV)*s}ZN}PPI8(%C*AvNDsth5)A5ZTjImmjC@HAHmZ38OX3z&D{zcWp^EN zm1h>m{H){zGrmp(*2=UxDr?l^&l``10k=)&wsrC?5ei+?&@gl|zT1q7rbXw$cv%#J z0D-^VpT)v3hWm!nuI_ce+$)hQfE9(Lu2LW4X6ZEGX;fwX>tQAe<;9~AtVfEz^8%xX zm9jGEUluN|t>L?w#p$p9=&q`hd%XUtk{i_L41q>#_Or=Wg%g}2jnwz*xlW&@o*)4mUv>)3$b=H z(~TujU}GUDeJsJLl}kGDKYu(4GJrZ>rX`)FG7a}x9ZQnuDtDOF;0$^ zC@%iG{?V+B&>%sSA>F&d(ElTt`bAWQY2bFbQF%hT2;@^;(fT z%xFUWiM9CwR#uiq_x&OPZ-d8&Y`?!=(w5RjLgr|qe`$!Yh-ggUjM9+MP*enZQHI2( z%Jmk$KFn=rzhJX19-0to$Sran?jeGMLklf@hL?;Jk(RT%`hB8k9nTB{&;@1I9fy-} z+R&85?)A$c;B8_V4&XliQuNICzS!GJiWlHRVKkXis%YiWhZ2ToLZ(SYTbfjl5TV6^hlz_A9kX_;euT~in zvLx&7ib<0(S>^QMc4@V=0+@}DiyhMxYUKO67^r6+w%ePVnLJLX2VX*dd?=YJ)8J-d zk=|XvF2daWD&T|@;N-}`!7&MWP~Rm@y11(z?MF^0H1Pkv;&;Ekp=f4iKJB2ia{k?7 z|9p3s7^DKdYq;2(LPth-$wjEDs){G)PyhURq1Y*3>6TaeK=>%v44e`z%q+xe@ff!7 zso2@ix+6Du=XgOvKJ#podZA-*_0csE=@H+LqZ3t)j2(Ve1N^V1)_y0?2Q%ebj{n$c z(IyWsqKz~&?BP$PELxdZm9zyn_4#v+47%-;DSa;vTzNuOP>MxOE|}ypwKbO1{tKcv zlV=@m+;lt|UW@Jq*YE@{poj4R_&}0ecGE*0D~7>)&$GBTweK$2Cx7S-IwwG+$+3yY zYrNQ1n=4x+&G=^_$!J}jq8S`E=Db*1p`E{&$`zE9D9*oBm2`G>fijmL&CfJuitxfE z@ay`f2!itiD|e!zrUhrU^w-wh=zcp}WkylecxMrkNJ<6Y@Fi0%j7!^S(ei&#n;i4U z)jqEklu-Az-x{@BHu@>*eGF>Z2(-LK=gUl_|en~Tr$KXuZXxm@aMj?MnxM`~TMk6g&X;j4v zve{zfg^8yZWhW8Kbj3y49gd_TWJ`pv2xtrye_KNkMOFWjMbx1T6I%H9IjiI5&Oz+C zm32QgmR%y*9=RcvkT&EPpiJIG8mrUCA*j)8=&BTD_jvv-el!l37?@@yRbN zV`V5U48!g>+SIioM^80lKejB5`z!}#9%4nBVm|cFBZR6=s5s6>U zeSU$dLNYbknB~0GNUj!Lbrtwt@d}vCL84D8Q9V)6N>w@|qhZ~usnZit%Y`uS+s=vF zY2_cED=o*IORP^#Nr~SNTGBLB(3I4^Ke=6@%S!H)q4|)DNLSz=OLEAA-eRcnYPTYB zZ!Y~ty4O#|_ni}_rf7-0eZWnDa?Se`(BN9%6O=2_|?A@W@ z^&JvH6@>dBF|mAtXp=JN?m5|XHsI0Q3z!JUQejdq)nYADtrOxYUWlaBA<$neyccTy#w&PfYvhkSVPd*J3L98!G(si{df=w)c= zz8K)-YI~}t8Tni9oADPJu?fD+NavsKonDM(xV*f9`hY%)4rCM6eskX>=hta^*46nV zS+jW|S4x1&{W<1nOfZu{vvq%?^SR~J!Kg-moloqs2#@Blj z)Wzg2Us_UHvV_tT68yBZ;Q5Pa>mLdPn&qlaey^*8>1I(mYeHJhAr*<|Gv$?(wxjCu zWz|`6N4VaqNR;LRds?(ZRdTZ!V!hA}a~dZT^eCK6!Xh@MU9#YFbuHDW3NuAX4|VK-{iv=9S|t@Qb!q`vbtp>Q(-L+#~}>YAT{w* zrYeNy((wz+WBkE*&LS^Xl0hSB&fRvAU!gfg|G_^-RZPrghqQ^Lzh{1qUq>~-sxi7A zfNgn^PgH57`0|ylUPPPN+U8onAf43~%MV|_2$788VW9pW7BCFa&d{vM!15N$kG13e zJxwr8`i+3#!)!56N3rEQEhlKMeC${MiEqb`a**-maF^1yqgV3z^8H*8GTTG#BftG# z%PUVO7ZeNbdPuAC*NW>;N=}bS2Oa?^c1^X_4W5It3@D6kx2iqL#_@zPT3cHLAy zW=l!7;dSF-xB5Gxi{bnILn({k1e5QE-*C#acl)h>RH&Xz*ZJF)IM52A1bE%qQP@F` zYD8-FQkm9D+KS3&>))9qGPj-+q+Q76@3hfi+OC%xtI%5f{a zxv@6&xDV{rmNI!UkZFw%S#qOu4++iKeO$FeptyjUE!J4fHy`8I`xunN~sc zw)}0Z!&Opg{mJcUC`4){yPFgO~CS($TNy8Z&88o66ycNO zyjQm6ni*w=x_ba35D|zH7q(M)H}<%>?i;6NE^ll6tSkV{U@Eq?a(+plO_R?j_am=Ax zs-+E${a|T*Hys~NU$896cch4p?l9IeBxyo=4(5W(LR*E5O?o`mx(AQGp-!4)57Vfn z6?r@@(zk$LdQ4LngHy$oQP8}u);g}jzUg`{i7q~TyG_1*D{gN^C!^P^B0urJleJaA z){wDCpoN5+uhaWZqC2H|PdV@6+T8NcSZ}e&{0_-p{9;V$!d3?vCswe!J&hLJE(j_; z3+Mb%clQW1I6eU&R4=v2+nPUcUk!S*w-UKML(?Nf`dO?t*=tC+?|pTHkJBEdPVv)UM! zph)TGAUoM-vP%J0HdO-)_>JB!UXB#rgfAa z5lXD4Mc+0}Eqc4VJ2R+2`&jEG?Sr4vJSksVzh=`;dj9nJ=eBNrOGnEld~*x4ci+{% ztHjELVu>Q1II(D&^o`I^$b*X{l`C6PxVsjc7i*I6uGQ)V{#}8}VrsIgpr9}?JdCgZ zwjKW{qS6F49HKO-SZUxUG<8^(c~H^?P2S`%~{nWok&%&6U$F$j4~O5DAl62 zF}#K9PQaOz7rzGYafgAnGB@{S*`xefpI{b>AY}@qBe3jMjpos(&zZzz%GQIC$gp?7 zz{XD0(jx9`!t+v(LCKC%UXxd@hK5Koy4x!#Xj-OGfVLvYaY#r~GBaN{%PQq^_gD(! zVb~3h<@AgU4sTlHiy~2WD|S$1ecrgR$_dJGRDPdp0m5ejL!+bHvhQHGX9tN02n#EE zrc&fyvwS(#v3o9+OXJ%im95uY@eB_DV~#1D$@%)&=(}1ws2|;aSNdmr8}RqO`~`|^0k`!jC{ve| zkm$hr@5yi|!cn?JD20qK=e$Mp*?vg?p6cjIK#qWv%B1IgxX62!3u=k%^i0TOaz>q#ukCZAcD+|+( zHv&8iMgI3UETGVh0+Ugz%Jh6^95l;(5E2q1=yPei(yB)`4=T4if)RlpV|*I;PBCqf z{c6z#^G#R+C5{Onawm{3e=8_RYQ^QS42nxlUv_GxvCAkZz@)>C0YC6Z(K`Djl-yVU z)}|g@%$tBnul6cIqG%Hw}m z&(h$c@3|J*6HN$Ma=U_HvupYFyZTiv)_Qx?`*+(z>71y~1zv(`@Jw!ptQt@ec2!zh ziu+b!^=%O-&M)=ch~<_P7k~Eb8J@n*yLX0$Ic)UT+E|?pIJmg*{Xt(S?gX6wMDTV1 ze9^H7UqhOoogJ5ihK&s;E(LT}7h<(ZFUEhJPc>7D$17-SYqY{e@N1`9@4VFT0l`^h zKJ74Z@7WNLO61_cJ0zF|jQ(P2;J@r_2O-v1ue#_;0O>MShz>$O%OHFmivM)6a@W@< z>%Vf8)X-mW>DD{0fpVmoQZ4qre4wF=1l}*ild!?OaBMesjtdVw2>p4g06o@gBoO^* z%ZmWS@h@4^S_4%J6tjgY0bB4!mY|RO?r(%MA;)5AgflQ3Od!%J}x-VI=o@)hI9(&hrqX?%?2<73CWkW>j+e|9&~%#jzbGU^t#{fRbiA z&F+s+;s1>PJ=+$(oHYT`VE9F}Sv55^ZI2K9+}u~Y-?9mc|r=WQI#yyYH~)ik=(c(1(^N$4o=S zGe$$QV0IuR=~$yI-RS z(1$MM)sv!p&_S}Vg0+B^>Ifpg#dF}QOS^v`-17idrb*z7px$!9o*Us0hX$6m`0RX^ z&Uhy$J?tf&0x5Q-Ssx)AQYT|k1m#-)u0zEu*J6#p0rW=I|Ful3Uu}Fc5+~I{OLkrg zb{xNx^_~~p_5$t)X*4dAfPx#$Ah6wffCb`~nU<0QGw!cn^U~9+UNh$A8i6B%iLvpk zSNX6riAo6NYv?B$<(MdspqTZ$h7j%AJ(N^HTR#Lg5axlWuqwfNrwxubLQdg$PV%J!$L;X2 znBry_s4_eRo3&&5!C0=Jqcn%*m|7BL+{-ykLgjqPVc5}Sr3=iNcBMPGgpN2yTM!mq zc5jJJhfb&CU#kryt30jO*R9>)IR2g_SP17RQO~5C39~#P->Eg#mf;=VgTYTdQ({!R zzXlU~pYuGG@pS6xB$nL$h6liQIoN*?k6&-C+cZC3Q-e430NSAHa9i7Rj0G!2y5a4+ zH9>53NP1n*^mN?V=z34IgjY{T?b|o{#p-26G)=4jcOeo6rr0>0W{Fasxle5D3+|}X zs9+n#_wUP<^W$im)PCTBUD*okW(AA5YW1bv=UrUjtZ}6DW<_N>BG_hhVBmb;Bj9UL z$=N>lPcYp*qn;S4JsMVxcXCZ^WFmuW>#fC;D$<=smN#irD!{8VZ|Al=G|=TCDd~CLkQ|Zo6O0{O?0=BpU5% z;~TSHu&xefpVK!jIxg7N4QIFI0NVRJ+r*3v`n&AAyE|abKs~UjdCDrP6j0u{J?_E; zk`>HgV%Li(1&+d#+JJykdB2c{Ocz`Z@S*3SGc321JJ{Jt%VYXmc$UB_2Xut z{|^h8Z}mf5Wx#$=+#cZ;xR{*qSXtT!&pnu_I0DbC$$o*2tq%+{pj1J9q-JJ@9V3+J zz|i}H#sDu7{6>aDYapt45sX87M&1 zt@xuFmz&F%EnN2YOlek|XCCXcg5w3S(Z0 z5*Ia#mXgzuSzGP+B(tLR#{23}klgopEmuqmgG}Ijh#e5!N(c0k)^(+^td&ib1XSqq zns)?ANQZSl-c?>H_H06N5QAJODnJ^Sknr2k({QC}pCfsk)^4qd=6ANX45HF0 zt$s&#V>zH>>q@n2aahM#fi(?mZa;#P=Q8bE1v&x8U=>E(9aMi|3kSq3RDvUWD{U*_ z+=#_)JBwA2Bn8;}1EiZhj`U~S?jb0bKzf2wCK;qRyy`B9SEI`T>{lw^!5&GfKsZav z=X!lmJ^IJ^7$iHmmPT^f&7U7G-S#EEIxThC9s%SeE)nAEAa1|;=a1nJ?C1VeI6@hJ z{+Osa>4Ae~iJJ!IWI#Cy0I_)66Y8~CvB}E8i=(tlRvd=C<;|;JNorEQ2x(6nN8|L}ED`u}f7fgBeDXlQ zhZRzKa+08=!J8|glUoNcOs+T-e?)OebCrh)tRa6h2ABO_Aaxz5FfO=5=h>~*It+%G z+wS0Asfvq-%q2c)l8l9G0_zX>K`^zANZej{_+T=hgA>3F^yTcmqT=Wv{c(=ryH1Lb z{v5!no&}Dc|Ix&JAhQ+deRK!3Vs5ucaaw`#uwikQ1Kln*7s*K)c{AR{VT5v z1wRE_>-D+|$M^>zX#(_WnvQh2Xr-_3p_jl(LiV_kMA`6uF;OS#RmfQsbzSk_}9wT2J60WaSP|rI6QHNnZ zsrYxQHshs6H=6}9m=X%ej5}WIDpC8+21rD}agO2?a1uzk*ey2`(>=Sisc3m4HxZ2q z>&103@ zdLr0~I&T#c2EZ|@1~+F#)!5M%RY#}cS5I_%HaRYCu*FVu^P+}<9|Go8+=OD<@fIM; z_{fUS_57{N9Uy&!`2KY!GU;tyE}2;Z>Opo_hjlQ@C?L`!BQGDi9#~NbriQfR-sCQr z;01oS?l#kRl%vqOvk|bhcJu+#hb5NZsN|~$bL>FJB&4}rv&nKCC!!kA2w|K6$?8j> zDbgEDPgI`5bpKPQPN$F(r9iS{6Fh2Zz?X&V)!k0M;>{KL@%h9kHTBo!Mz_JTI(Ml* zfP)20D7w!grR}WMKqKiAT2ZcD`{VfOfxZF>g&T2k{pQKz`|lFe|cj0 zS;)^tMRk4V0bB2z{Vn0c%=$ye)I5a$YV>k3#`R16$x=&&&;AktJgU0s%%1P71Bjw9 z=51$|9?!|2d10#c^~RB}Zcv*I9pTFYR_3Fz-#u;)yHU@21L(2pdo}KZD#6B$$&iMb z4^lvvU#|HuNd)WYYT87*#4~L7$9woS(#ZID zgUVIJ33|riRUejbi9bNv75^8LF;`%+P=A3Xvp@Mg`i=LWL@96xq!Pfjva<4699K;O zSx1nN$@XExeO;|e!w%q{m^~o-(V|=8@%%BIEYl$*L0}T)C3Xe=GU|jWm9H{5#9$-f z*j1}+WC=lCvSSV#j^7Slv~%JRk-+t*I0K)NHf`yU!dkm`lJQUaGVfrQA&WPBE{4)p$_?G-UcdTdu4}UET{5WrKkG2OQsfU8MPqz6?W?#>i>SR~_KBFw;TVTU-3RT^~x7k?Pg3JJl};P7s9y6t^q zWlc6}hX*`l7mbLybOA*#=~<}cjv|c8 z5sl3j3L?Gc=Fsiiswtdo47>ADpA!CoPNSTU@SFVeT>j*aDF|aUGLa2`CXMRecIOjXql91>-uCP z?J)@H9R?uFw4Nx6Z77pTdjgLrh>-js)vvV<^}ZN=Y=Y0*o~;TJ&bIOg1putA^gY8EOX`L3iAHwS^6Op49I)8_6euqw0oKhZ=rME z{UVm~D5zK0Q^c_O?(`7{2M3(@2nDDBl14?o`~)|zFN11DEG0KNz-()XxDPQa7#Qxu z{P;H;G|u}=O_-8qUnqEZh_p?I(q_sV_vp~pimuF1&hAzo^?&un=Gv@v_Hor}D z<#s7ODhg*lPi-%$h|_BGUjj$98a_BS;oG_(+QE5Jy2?9~j2;jmstMn;YboS~h| zjAjWE0zoau)psQ`vD92c;MDLLWNCrc~-1CyNk7JuZA9s_q&m`-oNK8r_K7MqTYJU+3|5bEpB5aOm=JR zQ|N-QCo?nq*$)f-gb7KWGLiV8zpbaBLWX07`BD$wE(d`KXRP^n%7O~O zJ10Yk!EcV-PW_`STm67Y5=(m8F?r8Wx+sAucBIn13e542nxeXn$aeBk}xv@LKj)AJ$+ zbs?Z9eop_C`AMZRrRNI+`_^V*rVu`X&THw>B?+Vx`Sp!>;3MGZcPD65sH0s@_ohgD zjv#hN1*~!YTn|qAstNq;b+%EQ4(ccjUiN zLIhcmoM_h$M^YBP1w{P2bkfliLQ=D6*r(ze6S3JtrWG${*0#aEePtxri-)<}RkNpM#DxQ_eo`RMF)Ze@*I{@pWsuda?- zfPMi?PbNvv(XAc^`~q*?@F!^T7FI%PDj^XO&A(~lV2Fi@bbLu+zox}XN07{OR$70Z z0z|PKK`pGIVLc28if9WI5#ZsG_9P6oD7@|=m50QQY1$$phMSt1g@r2r1N0scpPwWo zD6Q$ip%taNMG0rx_7Ys?F|lC&4-2qMeFzN=1vIO$!3w#iBz}OJ z@DKFA#>OIgCXw>VnU=3H=--1MKd$jpQ!~)??N7W5!|@l9YFL)QAtrWP>*TH1WO+^f z?+q}4KWWgIq*f^7w&n&`%B?kyMG_lln_tLiyS}CyS+2y&dLpW?pY^ZB(O}9K@E#zA zy7@@`X;{rU-l*S?N)|;%cWrGMb#rq$Ifi=}Y#6}|pN*0v6 zSeuV19DWpXDAfBxFn;effk%9YA&d6>bgsaAe|Fe?v}<#9fkY_>33mJsbWohqKq(aV zd3@MylUq_>JRKI?sDhnxcLY*rdfob!g4{b44mNd zNp;ff2u1Tl^)!|9>(r}#QEWi6j64<)#kUDYA^wiRVUggLGd+j$-#(gfC z!AljIlNiaW59BfnpYbnNH@(TGWb4|lrOgDR-jg{Af>_?Q004V;NWYLSSa)TATi2`B z>-NFv+C=eUN&2#PRmGzjZ|u_oS{=Z24z$ZHV=KUc@}#_$S?Jnp5A^6BR%Dl4h8Yh+oIl3BFvL{y^iYs(U<>)a+q%cVd+ zt&4!oUv^Rwrx!9$^Jg$O<)+Ep#`5vE5=|(as8Q3h?dxdk&pTQfoqix8sC(3@r&`6c zNMRw>X}eKIjel*?NLBgwZ@@pt(47l#JVL1Gdm#g@YCQb-r z|Jjbc`EABie!Yx5ymzqSB<@VG_kYpnOhN1K3E{3x-c~A;FI^a3Eg|WLUESW^-rxV<@|E7j#=;_c`4SHYgq=x% zR1&q!i_uo}0{)@F;rFt#gCip`5fNzU=%^SN$Y^MIVC;}+1y4^;ot>-Jq@)!UQIV0O zqoSDf`eF0LWkE1O-dysgQ1(4o$5C6jMf6;fHw-I(C1fhUOQ%7HLusaXa}<6#X1T(}2Z@z%x3@nm{6qc!iT8I>Fg3>^3erFC zh0IldN=ebq6@7gJ5Wv9a6U@A2wP0IGHztV8CxiNQ*^lEjU%M4(UUs9V z9)LyWuC8wRzvw;)&-3%kdJ=A?;|E7U`>|SIm8-)n${ilsIxp{X)^j#HX^ncao?>Gk zHW1a{kbMWfghlliZ^?fl)46)@EWTNZO@KX598rXz;>Pn8HLUx_1N}!)%p=f7)=6h! ze^YuZd8(sH-a_mwC$TEb{{iwK^wfH-xHUnAc2S?tbfoVFF`w3I%y1mpeM z`9M7q{BGLqXT(X%7@@QvYpe!eYH|gK?&RJEutVz?%HUgpg1x^WG_cSX5D-r$7_xm0 zTw5%lc6|vDJ3uu#9)y6}{N~?L#F!A2U@O(QWtds2)o$()v_P7y%|N687H<9fwp+&C z-5t1l+I9ARAP5d)o(8`%;^=qbAn@}vei}=ZOsvHOR{sHxBB=Ge2k})Xfik!O#IQ*P zz0ZMjbFEdP&e+tiv=|PYKR|YF0g6mrhB;v@sOFAJfuO(=1nKWCW(=g#feh=~>`xOw zY`qTvf)oZVHk;{E0KVrxC<>f(%X2Smw9@6;{uU#?b9t#(Q>XfpYY-X4&Nv)Xmn>EWK za>c?$aeaaJTA8>2bnJ8V3}?Xq020n7FDV(upzxrpC%*A3R++}MTUAjolmjp=cPj4? z;a%OGjdmSQexCptACfUdCjipb1=_euTmXu|dX9kbW&h)s9H1Z|HU~O%8z{9)qXpoc z%E`%z=YsI~tL_1SM+f2NejY;t8t*B!5@GdnQLyudSFl;7oCBt5 z(OiqsEF~6ak;rFX^6UHh`hXI7xj`El2|^-3gZ)5s#xw{Z*A(bzYRGZq^)4a(uiyek z0nTh@>;kk#l*o=N(oEps;VnkKA}gXP_+GDtW5dT|b8IG1iW!Q*iwwgwvfZNR zheSYpU0Zt|%xp%JMt3O62B_AS2ulztral0X{C{o+8n&r+oJ!4FMwuOR61|3Q%~B4C z%nWeSoBz@T6o-&79LpYm2U!l^=u;0@Ht<4Tb#tHy z5cHV>Huz3zB&BjTE#SRk8;>AFQ40v%0icUbN|aHgRJsna9)x!R`n47u*xB9;cw7N< zxC*GqNUC6_4E(_9ez=HS2)B6xSmU#KU7o8-r)`T06t&-69bpn;ha|D^`cuS{aM^-H zjZTnVLO4P+q$&S}t;hNy8VtgT2V8-LMC%Qx7$PKDtdu~0@;02ML50OojK2N;<8Fpb zG9B&2qW>)vi8a)9zpQQ<h1Z|HL;yx5(`!6{2*iNt@xZ$P3d9{E zx%)oiY!H6KrTile0&-?-NmTeaY6zWxI2rCQ46`WCa#ral*i8<67ij%cg^Z0p()AS( z4SAwb12Bp{fM55({4x~?Qo=HZUheqog_rqFQBR-7;Z7DS!?V9SF11~5{tJFU$4B&3 zNstsXDanGh>^#T_HjQU7KtVk$G*l1lIGvILAUJ`6B9=BigfcNG1(rBokwg`}dMV4> z5|zRMPzO%JZI9Lh7y68_?@#|{ka@+(9&#r3CfG-k1T;g&V)*1My<;GSV9f|VV2}5~ zHy8A{n9>k?PAOQF4Js~^teBb(*yNNuK2is<;1ubZI=0l`0caGF@fd)pFk4VyYt+{# zjjK;hN!bb@kGy9eaXJf-MJ)+yIf&+A$xO5_5QVa2-y}q;@nZ0RTqk#TE@v0IZy~#+ zc_AUsuC)sQFam1l(J(L|IP_@}LClC$$Sz{Q93{jI4GxNpz;Z}7YerxOFXR8x1b%4# zoJAVxWLjn#nO1+KFwXURv!;d|nanl{WTn|ahLlxTxLSj=87wu(lk_MW|3m7>8&tvP zh!Bxrd0msE<(AGGIy11s{#ncc%uwKnl0zWnbs;q&LG=Sb_&vCx089?6FK#eXJAg*8 z^1Q0nt>twAD|I=xy(pMkl$&Tm`7kTq{Vf-UjEF`kiv0wChG1of{g=lggx>Qnoz9o! z--Z@)&4KqXU*p7z=0E&mLg}Al`Tt`Bs&U-|5BIkl|KM0A|7*0r&I&BkrxEs%+nGQR!}w?(UZElJ1g5QABAF z1f*L!Bt%k55EPY`ZjeSqIt3*K1*Fcke1Gq^zp?k(W1n%xIODv3y((+5*7MxYea~xN zbIuEM`n3f+GbqWPx`8X%|!3qr@G5qLkP2{PVDG#$V^X)i(!|%@1{DPuDPt3#0$#0+Q9}w!VJ&0o}*cl#~__ zSRq7LLP7>5F!O{3JCrHJ37V_Dl_VV?*aB2VC+@Zc2WR-LMwq8U7kFa#GT`#`TY-MQ z5zG~iCSrE`+_cx?ztV*@S!&lAsmBX74kqL7GKM{x*N@LT(8|k|f;ibv*ec4(ZDug0 z9yDNQZ72lt97B0>tuVD?znno9$lULDfI%GokT?$4_k^;3KQQ{qNxQA9M3`6HPLqe&S z0iBOtLKyAF!!PoGpMv_tpytK^pv0LGD$r%Mc2sSUf-XM@!9Ys}Egy=auPp5O4)*ug z*4Fy++=em_%gx`hbs)rR%*-e~(3`yhePs|ME6lYyFiqTKWzj0c0J>loR`D?)Obj$M zm_Pp^I)q;3t_z=j=CeOcA{4kYYz&D*Ei{P7us$p(IvvDv_Sxug^JVS~!B^vphnAxv z)6w^-2cUk!A?FLfLOB$D`}VCkoLSJ2)CCe6l%k;D+sG8YhmYC|?bC#zbs_R=Q=$EA zTDa}2$Ud4da~-CZU?-!pYe3PZHBs+=n-uBZ$e&+7Of!Rz(F9>C0l+PO zyX>W}r6upO%K7b(*Q!j~o06(7sz+ARQX> zv?nTmN#X$X*mQd;5y$;m*VcbXGvf8lib2?1Fb~xJUvH9uwVal~b=j{(q@}G@R%-p# zhsuOUMuOrjE+!^EF7Enem|RRc3421xOBPTxzk^P}@-orihsqC5GhK~Fx9u+lo0}TI z!jcDuE^49BO1>Yl6?pIDjrUKvOGP0s7-uigofI2le1ZjccgZm1+be~zlD}`_62?e| z!X0V4OmGrn2333eHo-qHQxJG#@7vA59Y6;gGcc?mX5#$2Bk2n?+b5C9CelZz!-v*L zxBt5xOJhfx;?{J0I|!=_si_hAPvt94VSQoGP3VHHhIr}!{jUW>O1?M5SkI34u0V?#VG8Sf80c)o?N~t%{LQGu3zVmwK%@Z{CT8Er2mv-W zm4Iyvfvp)fLrpezlWhls1S#Vz$f=kJTdw5wuIPNDna}3zr5w50s3_1+Qvp?RMhhz z^vuz~#xX~)Wx@lhZ8SjBu4xJ*8u3)3pr}oRr@E)->&(j_*v+6iJ%nnLiHQkO(Dl;# zprVn9bifV;m?8jrNZZ@naFIbT`_bbqngM`O61fZ>b7+vvl;-+jpYF}p5o9f~4?9D+ zK0tWHmUJn1aWnyiUxb$1ADAw*{PpdtYdv29XMu2i7m7{skI?r6rDUCdp&GhN#IJL$Lx93M8VfiPytXz&X5 zy3TdPFM|j6BnEx1)|r~m#AF*_pZd+46he2RIZliWSKv27%PuD`&jy6HBDNDH5sR71 z0dOOeuYJ4WIJ&ePMQ>vL3#9QN$aVvHH5|dz3)N7VB9W=4yR@8cfUub16O3@8fd8OX z2KDNyUa>~HOY?!MWx^1WcH_gD8u&(5jb2z!ra|ZSpsJzA9fu(hu)U*mPUxK8=!a=* zZdht3)FIW)KjoHH3=9n+iMZ@XT6p*gC_nG(CfX5u*a5t!&?`XCmmV@$$^(oDqT&Jq zfv%3TpDRP^x-+lf5u}zf-z-`n$0V*+zdSVbZ(fpZzR}Hs#~ zjXHzt{shioiaaRKL&h{SRX@OBH@mhlt7>bRdL+UyeM)QW&1;_c6a|7To$Mj)*4VUt zY0q66)#FoAezHeuZN(FoaF)UWbkhmbkqCDRZdHacB%&pNHtH)ycR`r|?jjsq z_*Iz97ohyA;&JZ?$J#$aNO;}OmGf**$7M#)9zz-m&F z=gyzMyg0V8q>@(EGlH`z)GPRlBGJ~?79oAd+Ies@g^Zubotz=cRF^Wk0HdEj3lO@C z`!0lb9{x}SlRII390jhUi$Sam?`B>$8-pJcGxMjd<>6$xF>%mtCOITgMK{caYlXEa zMY@gTBRla1p8!dNPkjToLq9V>vy9856AwY5oRB%_RbGoTrqzPO*zeEL*1n*8i|w@@ zBV_yiHr~|bQjYyO7Wv90EILEs%*Bv8`4-`vEc0_`c8MjdR2$TL{r7P^&F@mD+~gv= zc2CL4iHn$<`;v<=D#=J4viTG{>3wvXX8 zxMaw?Z7Fl&<#L7q@4aS*(kQj zG)@#A)p87bZW|*diXG}P`kdw{%|3y8P$H^_GN+{*=1=4VKHoQYy7Tqn@J_@P))sd} zq9ni|J2w!bdqrCMWe1^0Z_%P$Y`-4H7eGBqKZ@%6MisY9`3}*3C7>_zAcP2keY3ZKO9>*#J0)7U8!hAE@Wxlb!A5|_%tLQVb5S>b96Sc73 zrVAYRU5gxGi}claW%Al7@K2PKLgpG;BscE;Odo-fh9yE}Ex>SmnG|p`_6XbEQhN1F z;vAz7b+vBL|Ak#3Hu1o@;s>uJartM_SX2%%dW;_Sni?P;#m_Wt$R=6(p8Mptxx~5a zLbJIzN_=EVuqRpu!Ez{x;DfMok$R3H-pB^VNmLI7^CSW7oN@=8g0L96pU4p4%GGv0vU3tIu(QNY_ajN}4lOzp7ug>+F& zc6M}x-+!b^%7dhH0fcGzefbZc=(D`G#vK5SQ*;YfmJ}C%$`bwtTlDp81#=3=<1X}14IZ5>1T!U~I>YWe?i}gmMQ#!oZ zU`N6dN~WyVd8FA#3f$PC)VAj*2XB`9fk|DdWoHsQZ18ZdZcxTdW>kvIv|&)(0_h^k zQPw$@8Z!DG7W0H9{RFCp-h;)wFu>y{`ta+n8n(l&M zwJ@NTdj=xI4xg&@nQMQreDZ6G5H<5i0huEgj0gaCEa;rZ3el8P-tz-56P*I{nfmg| z)B$-E$GdcMLP1d@@Nqxll_IAkJmPXdglIMP`&wdd%)i9bMj@bKTV2v6F8QTC`k~%< zh)fnHJORCpfSUAeNy*7<&Cy#jcb@Dez;3)zQN3IFgOr1~o&>nKeLa_^S!_$H%&q9? zXuVxp41s62k2>Na!;H&JvTW~sm{(U>ZOBXvHXHN4Zi!#^eE!{%X!}y^4`aTwwsi(N z7h(+LZc&DfrDZqvdq+ex)Q&QTvA28`M%lv9@f3&MWEnjx66B?&?*TAM3uNZrt__y{ zfsk<5-BP*pVcbOGf+hAYfwwdJO-#niKAWJ|&M?x@s`Otv=;llSHRkO&%Nkqqxavp8 zPjSQ;-xoYn?|748_)<`eArX&;oP3Bo_O$Ms%T7s1+9U?AXhLMzA z67Frj4Pz5sMB#yVLY{>vuVuAoz{wMYdMG=G1iqwbUQ+HZ(|V}S|4J%QN<;nv_y2{% zS;eqt6%pxlkRJV)3*cd9wnDsNSCQ?1VSljGq^9uwV<#iUt){pWF@ks@8yf&q!@o5I z9a<+hy7}@UR1h(7aR~`kUTb}Ue@hvHkPx!}{97;bENGkn4H;A;eghqn5*NA&ZgmI! z{`0yJC=~CCQ2A_s3HWn_RaJ*D##&xO;fU17Euk$uo z@Vj1CeJxL}WG;?2!N!zz+imx7M6Rep8FAGe&O6_w-nADni? zwSRqghnm78r)M1}#4Mb81MEw}y?}=$I{(%r8gy0W?urnz3Y=QFCPlpJ@(sZ1;0W-_ zDFG@AK%HAo&kLOUpDRy;u6DFFxzplc(%I)KD}VhI-B0N_6ZIt&Dp z`Gcr8j57rdX9EKr9meiCY>r|858<#u!ro$4q>48r3F8y{s;rt|D@M6e1`-H`K$?_@ zD5eNtn5-uo5}NmSule6Q7VeP2w6Xo1u8u!}r7&JEhkctICOp+~xB443=dWv0IQqqG55w*}+jB&OG20>iuxEGg}SC2K+n@F0TAE zAj?kR<)1ya|BeuDiVL!{gNTHH6Xtim_xzS1cQqI6`CRlt4`VI^D^Td( zt_wrpJfc8Ole?e(AnX37m3q`sCgHhp1RYPrm}OX3zrZ^A^y$+kFHQ*t1_5d5hh5QX zzzo8Zc`>1@38QE4S7^EMMef6P4{lKsr88>RILIIi-1+JaI(IYZAjT!%?m6GPIA$lH z5OCWXr>6(G>f`G)6#JfSpY{j&2kHGBPkQ2m6j$az010%dF@88FXGXp-Iv$nB`H3J$ zI6G3jv83nF59pG;xp z7s=b{rai!@u(IR?Le070_kgKJrF4mEEOXRY$A1R&9!BPKDXdSo9}&XgBG_{I*{CqS)}Jr17L8MfMuJs)A^DqY6ZhrdF%)(a3r9$dM*fTTC$oxNyU-zE8D8_?;rqPCTiGgLD~=M^PO!8 z778|8oA+UdrW`JXo80?BFeY0EJ<$Sw8K83I&^zOb8+u#-VA-du&}T(_xgn|UnsOTGcV|G`N3N0 zQ!}>&G@4FpRG^4fU&&?s3ZZ&CAqZqJ5y-bc_y0AOv97BXgi9-lJAss$*wz+?mGInk zH#Fol1cNSHWJ^Z+A`j?q*Tuk0g-o%%Gd$|gw|R_a4N=FJfnVsj8EFV@gt%k^{1}J9 zKpoiQhKAadn)}I#eSU9e0ae>69b#Zqfy{X=2BlgZ%*z7UUvWdw6v5UKN#SDSze9HN zaDPrN;N<4|Sm7Ir6S7LK{0%Do9%?PjDDjpgmw5)|lGcMB@h|YwhhIjAn^gA6R8&<9 zKcpAW{zhYa4f_mDE-}UN+yqAKens`&0|euHe{g1dv6w& zMXj;>DE9z<$9q~AEG=pTD|#8m$lO`sipI{;HH~m#BTFkqW$LL~H>T0hS}EWcCyB$U zLV>fBo4`oO3}MNMYO>4A%NrPeS}jY2JvTfx>ctp*DzSyam|&c4zDl@cpD;7CQiFY` zyL|<=FLp0ElNN8Jk%yBidF_+rloVuMj@x>C(oFSC#o%Nr0)Btd$L0#b#6K&K;Vu36 z(89T5rBaeZPHr*8CKiB^;eQE-`Ab7s9`yz`q$${Edt#AE9zyq%7@LBW7I%LiL)?T* zNH<=i+XYQJVikudf_DSE))eESfM>dW=;`WH@2`U$C0|Xt&AkZ`TV(qk zTOWvCrnODt)}6D1k`zrY_aF7k@xi4Cq16fkl>C3#P+Qftv66M)n2c-{+xt>?wpqSP z&d-WdsI!hu_G7wo_SMY#i?5c3rGDB7Erf2i_bWPdC$Mv_+0IL zd|+6E_?)NSBrFzi9=fjRimA zW7LNncgN~hn}_JCaHXsL!D~9~nYDdcT+G6jtE=7sM>S`(UQgpUiYL6RBp9MR)bs;n;IRKuNXk0l0lQ zsTRd>k+qgP1&8HU_`*t*Pzou>GRGU3o@bokH~0UtZ>d0Id`YuZWbe@1GLKp9{Ftnx ztLrecgS-oGG#JQwW&PBF4b~PEzbLT=>meUe#+O5@MfU5kCNQ5*xrPg{t{W6<1l*qC z9S!E>MDxEKU`zj`8GvyF-}+-F;-h5ssx6|YG;Ix986(*IFQeL{!9QipW?r6~g;cjc zpF{iSO*;uF5nA~Fb6YsOhTmj-d>qWOaeBVVAU=Q*<*i8|x2p;R-NvQl{c(RF(Lx=W zK^_c9A`m*9zxNiae{=z7{{&<#R3qR3R9S)g+3H04^z;<`!m){oBZGq^(73(MIcV=N z-}nJ~;S)gre=gQk!1M=BxPv?3@RJxK86*yf7}5LVo4xcIWyO}Qffwv~0XbP&jOWkw$07)=<=!*%k_;Wzo6*O$oLWuQ;?h2ym&N*&~5J0AoA zjc-ntcY05I!^G)j?&@=XPEK_w2xdBbS{t|75MEH|EVKbT?g#=TpuG11{>z*!y*XaI z$~Ud{53egTD))fHzB`so#k}jc{(_@OYzk`UA@m76r>%TGLY7Nm07~Ng$K&5U@o-u_ zg-$mGZY0<|hqDep0dL(9a2h*0ss|5}LqrXy$-bHN-JuGB65YJ9*R!vMegc0%FX`1+ zQQZQ9FI^ z!1V!@;m#;IaD|uljRy4H15keqO-Mn(NoaSB$e!WKW;zT$`?WhiD@`JHf1KsKYmJDC z<`J}n1$OPPt6P7C+;ev?=(d2g4v~Pf&IyKtAXsvCJfMP68{2Sv3yf1sd<;m5KD9U8 zh4Nz>h|ZU41si;3&A#r?LDHLr<~!6uqu)t~9$k!}5-(Y5?Wey-QO5xyQt{;H;8m&y zT6jdnGJ6~>MitWe_w^G3NU_f`BsV~0CbSMM(OlmZ_qn_EWP&)HGIyBO@F9Xku4`3! zDBCRv;@NWX_G9Uh0w7Le))Z7cpkt?M(>!^ZO$?7Ti#WsaNS6B+j0ytahui zAs355{&tdZif4P9rA`-S{31|i7fNJjz8cv|^&Ie?IPu)+|ZxT=oYfuog>0W}If_EV2 z+wcV)dt^8&0gX83y)1H77FMgSm<+Ai*`S~OY9PtzW_F!=H3i7K13J%X5^WW7zWWTm zKV4fI2Ej)X^=$*z0OqP-ZZ47Qt7Z8(LEvAn3n^bj5L{aydyhFeLqktbzX%<=o9|&M zz=ZGn;LL{F(iz?q8dEqgLQr97G*nyUXp4mvzk$1KYuU(tz(5LoBMej**B^CJzX{c+a;}&2^$$Ye3_rG;Za{KVxsj;GB^b>e)lLGcXyl}?CN--s`wou;qpNLF|EZ)+OjwI&799{=k2~9Ru`jGe8)4 z4*#6bgIx&RMfg-AC!Z~vzJ7N4xt17lpV8^v-A^EH=?5dOWzds*hhqS6m6G$3N91hY zsQ!Xt=nv#m9gthfx&;23n!XulSE80UyLN2}r>mz2Jke9*!+m{iZX7#cG^S&u;o4WS z^+E^*5#dBolD&kR&TU$yrLGP<3pX(s-!Ud67XuFQ(grH3uSa))NGm!~Y{6G)V*)%w z@9-Fe7#v(0w@N?^a|k<61cn2sRY9 z*J0r$ayI13xMsvKIuN$}`aHW?4(4UNV=k64&^#6i-c!WXF9PRCPyF-f(EAy$O%5{E zwYZxro-ZyZyollDh7i!PUu`>hA4c$LaAQ@Jsj-|mpc z97FIKZ;ofvql?)_Z)(pqc;2<5zGkXuL4Jlh%14y9p{l9&7XT1C9OM)5W8O8s!(vIkZ?L4xEB!5lkL=ugp>9v^@#dGep?1}vu0zd7H?N<3J)-LF*4TAuMes_ zvD|xUWh#ZrAu~V={Wy$+Vh`s!l2L^T?ICT)5l7sCLFVUB%sjOOyCfU!Y|=8-hJ2(? z{(xLM%|I#&jAFi#fKqsgJnqW!KA{R;f@aTBR9;9(2)>3wWDO~&7lYxQu}m8`H$K$7 zH%EgGSs=inL^*35hoYnVI1kX4*p` z-Pn^uQhTKJm4fPwS_#)3@#}R1&zz@#0=iZwvBF6E(zH`h#(zQ3b3(9LwDWde`#J;jq=ES%Fkn|(k)2(g=$D3m) zsZtPba}K(20ULBzZ2Q;+Gs=C?RdsAmRgf!g5=Xy*MbpWT?EihTd_OI-^cfAx2;Qyj z7d{Kgyf*+QtX=EHx|9xWOAWUK#$d*(4eyFgr>*R>T5!*}W zua)^8=V8_oNZcdM+RHe<#U;`4#Y2xzpG`iDTk7V{sr57D-l6T8cZ`JYjRK!0)ESKC)cFTaYuXNsZstdkd2kU=y_@#hl0ma*ezgFTfX()&YRwS~1#v zZf1JlrFQ6_sXq2!x(n<}=v1}i;r$8Obm8>H0AY+BbTl3zyC)jI?;KgHnch z?%Mp5+Togp1ENJ^(SulcP|T9hp`{i80O$!wH5Zq>M)ovLxkwc|Ltt?#oY0k+K1iCc z>e)V%!{>MQY+u8_>YtxJd%*j;%u#W(Ys=b`q9H=K@;&~>OFF;Jc6c1VfY#^Jb1|iI zAjGszP@J3}kWW)tt|XJOP?$R}de(L{BX^bt%O@LhIoW0p)iN*Pa~6F3we-{7lAg8Y z&7Ua3m9w-bZ&&tgGedl=`09}WKKX$S0nybmaN#JmXXUHi`K zY#FK4V?iBtNkBh=@QJVdFTJvV1=Brh-5TrIXcjIxt!8gjo*=y1s*MaT!RX4uv4#Is z(F<#Qwk;J{j1F}4WZb_VT;KL++H-8j*e@*N24qZ#DAC8p(2!Mbls~jyk;?b+P5sdw zU`hfJ;j&yNw?w&5I`&I~>KNl<%0c_ZsW5j9kK=eRLz@dx{BP1OtoaGT%}5eT1bRWI zWba8OY}qBeOw2_^MclL!H8zA9@)HF}V{wjJBIO)T@Ei8ork|cxT?a-Y7+xYd^7^!Dl=&ck zS38fY^OIg|3MhR+j}7(=s7O&Wm?Y7(!y^?v3xL*$RuHb5t5+ozc&?6&m_mu{RlFCFv#KpPv;-l=Z7`n~X>p$xoz(d_wV z?p-m$r8mw$J_agAO_#RSm(!fko6EG!to81^$tS+O$qlNOGmw>bh5f6cKWH&qj>7$C zo%vc+LZax#`ucx4u?5p`_EwzV64TJ6rKa)%Nk+I5WlPwr$JhL{u3O{gO^&)ogwP*h z`lA?#@Hwb8g9lev_xO8?HBd3(zS#fc?*YSMVQH#2AV_M$6;s=j9)^ShOWzCwUuq66 zu0P|&ELE29FN)`wxN{UOg3&nDhS>IKv6c4S8bBgJxGCag8hf_@+LUuRn$bD~F_nMEU<5)SP({qFekvEtbRTEwYEF zr=g)?%{yUcCMG4N&d@L=WR#B|r*IJ;B+YglV#f$XR z)aQ94FlZZ?mixs2&3|g$D5SDN@{gTC885K!ug&rQ2VVmTOF%G~7b`2{wzn&Da^}v@ zr4dYL(l|48=)}c2SXf~6i!?{sQE@0EGqZLYT@p-NQ7QoCwrnpaDg> z{@Z;l3LbZNOA9sY|MUs{>_GlsE}(mxAb`s<7qPxh&?ssIA>X%0}EQw-gGPs+6Ug3Z9h1o}_qyzIa6Rg3g} zX~Ww8S^|mD!^9(h<}*}Rz5i7U^X{d%MMSjHB;v4@@9TXh176vHuI=yYC3p2Vfd>4A z!-v?bgg=c=IvI$iv-3Y55wIuoH=`;ahf(rsDz~$ZT^AR?AWDI-a6q*R##UR`*;-yME{*yw2z_dVradHv$^eE76%R{Q zhTr40++^P^{gRd4#t-3MO}GRF6{t{1TSCq+?^x&7`5Ybkh^s5Z_r+=9Fqym?07cnf zKWbF?NiRlZv>}H%d=v4WsIJ&-Rl#16>Yf8nA>0cpqC;?WoCD1T%LQ;-3y6aIV+vR` zpA7-u2QCB9`JN(J*$HhiMj_Bi14=#xEY08p(m+>>0Vp>!_-*i4;iWy{_%)JG{)qfs ze1G3iQLzK`xM#pa0`GkdD@k}o(3wT+&lZ?i3{AX&H-Y!=jvEKT^Eas$`o$n5kH^+ul86A>@4-jId5rY2#`jG^qywWE>%hE>IJSE?}TYPEJnZ=>sitpg15b2t~Xt z`v5YL1_nk18MVfvG`dAM9pSFot8hLgv)Vh654c$bnqvs|5diJ&DOgpu7hCC(A&Dr9 zkQ+MeSStr4Oz7DlLTbsD^5L`OHz?PFP9G@P=%gO;7)2Xz013Gb>TCd2*i%2d$!!qc zA;4bJ0Rr9-$OlwMz7azVh_AzOlk1^kbz1?2Mrnv5nCIA%p*VdFnlvtc zWiGN&Se?fcez&<*N$P3l`nxpAP(P_zbph*A**+3<65 zVaKBWL{1e4P8lRH{R0D`4_KgwUdlj6A`kNG&YT424U5``4L}+vm7Y`5(C{oO1%j;+ zKpdZq>+s-U>beU&4%5myItg15-$Dl))}L8`P#NtutQ!dBhE*R{@|&C}STo-mcGsU; zoY7>7C%7&je|?5^TWQ%q{E7+iv~_%jwI7xfigi4{b`Ipw{XuC-0**lxvNfsDG}aM1 z$4KW$xONO_qma99r<9$^{rLREyuHG)leO#M%Y9T>-knh34R_TPptu*AU zpP>6j==;mC28dhYoz+e%+5Yo6g7+UIBX1kkKo=6Ek0JC9Gc^u+TuBTFC(#P{80X=k z7uUbeXNl>f`EB?`HSjcTZEYYLf>a#}tbC)jJ4wWAVQB{CZN6ZnCOVun)LmwOKMWl4 z9ig}kpa*40u@aa(wWJaA#o)=?p!&TvQ3|eCfm~3spPcwEyHb#0(uY}4kU-*Z_g}3X zTF-Ogdpc8<=4!r}LxVXWaEE>0q?w6lz|OteJy5DjV~2(@N;_qS1Z-uUPYGD-=xx!Kf^a?d>n5Qtb>0u zc6{%DiZvJX)t1yNN)svm5Klb~(yyD3JE`rvpErh3b)Wg#e9%MuRYPG{cdXAOifAnV zlJ=D1M>tE?qf*GYtw#xqISkJg8Pf-%cVB#(D>DTbXO3Q|eX(+{hYs(3<<~zK+ym3R z%>VvMIu6daE7Kaq(pp^RR<~pDPg%J*|Gr|#kjcJy4gD;oFYAYua{u04i$W5mzb~mh zXf``|Qmp7*7?I-kF)ioS-v9ClM6VOYmN$Nrgzd^ zO(?FjV~Oo|q>vJPC)1#ZCbEyl%)1q$;uO%rK(h&0ZD4Y7&U4 zDpIusT2{*Y`xhWSx{RvnFsAI&wK7b54E-V+qY&?daFLD1NZGUg3y=-1ECp zfPumI_KXdJr6!~YbMdZHByJVV0r`~uAv849nZ(hQfNqSE6h6!f=fBJRrB_$%a}8D* znVs?Cm#~G5JQuSeq%Uz@^jC|g(l1afj*h-LTeL9A{m;vq`Av|+b($Nnp3kQNG6R#M zZCA9u5myVrA558uOU3FLI`1GlJ*hbp#3v=6x9@&X#+eQQ{19%@d3H=s*hMd|ThKcC zzy-1J7}u{qfuB%%`gMB*)Jf1S>Q75EQaHyrBKO045=Hl3=G8$-p(h**1H9J1D(i)L z);BgR8`F+}-Y7FVCpx0~gD(>u_+I9_DB|Jjq90>4X%;prOZWJ0bpHPSgv8luYyRG7 z*rr;On&$B?)E6s*z9a7n9dg{>@!G!ojJlmu z!jsMJ_jWbvLC|QT2Yu^!s0ZR3;cMG>OFf|8DN(os!AZEg=Nn-N1zC}rT=@^unMBZ* zKT7oLZTS1FUq|xXOp7&|$=NH#y0< z*ZqjJe|T8dcRzm=|-At)$i z-vZ$as@*XzWKnP})I}ph0Z`#APQ<<7RbeJ!G=z$VmMi<(Regg*SNi@hUW#+&mlGsm zp`qZn{9K^a3oH)woIvtD7~puk`%wsq>D$n$3w+4gTIW5WFxldO>I`yo+lLAEVL@o6 z{5CDfoO>-z)3Ic&=cnJ;hPa*Q>K}i3g8_}#cR^R}kU!gxtE8j^M-EKy2muJdZ&{Bi zmo8dvT75|$RH@>}a978sp1QYaUi`G@CM)4}idwk~uRn0~LX$%J zNE;5NQ%7IldX6v8`N+8#Wn^BfJiQCps~=oL*z5|28`_>89*{(;2I_J*jfW4(UV=y8 z>FfI~fR<0oi(&K-pn%ib*~VYry-n*}tU!G3!EyrKd1wPZo-%d@X=)ExpqqbvmKqos z%Dd_WKXuaKuW6rw{(cqap}bZG#${alueHurAQuB}mAD^FW!LUcl|l-O^buUH?el#SDdQb@9%4uqA$oNL@bgmxgbmjnguX#Vm!SIHU2K)}q9|!}8|bCi zg^48x!AQqe(Ed`C+tjv95bF8+kitP%W3RHxToZO@f#$vBqvl6H*9aKZA_;=(H@(Rm zw(icJbl~tW$pJQ30j?GWdArUoutkuU*BO|=H&>VbX8>p*VzR;i*d-kNUv=g6I>6O~ ziga#sOt++@#1i^_8=e)$71yb$ablA4@)AXKWkeeR8i1FU^2S3d1xTTDu9rkLw4Jmz}wIXNr0viLQ~H?>bC8+kSQ6?tJxP&RO~S2=4$ z#eFF1)P*GjP4uW*g57A+gaIxQgs~s=e&aRk=@c=7<35|CNXg)540kh`f=t3FbzGBH zpPjG9#TrwfRRJXH-q7%P-z<}$y%VYu!N7Cs4i=$EJpUz-1;FTbA@t_cjc_=hFlD~* z;^*c9iLTD)v^87DPotuDGdUS8)rN!Uos}cf%RGVQPcR#|perx%78SYaD&!?IBN4-S zsSJ-CXLqa=KPnNx7r8W`t0WtW+_iugg8kv`C<^*U)9&{Mrzx(}m-r}hMCI!smz+L7 z+Z%>Qpd(lG#~|#ZvyEe{_iX;<0=zAtlA)11fNFIIHe>60H=<@0{1o+z0l zwfmF|7OikoGqcUzdH>`c?&`R5$ZV}~7$jsWf&USgywj&g^R>x`UIPrOld#PS82*NG z>fz!g6n`!q=gFf4ek4!6i^um!h1Wm=`2b2}T$~6-)I25bcJA{eLYsGYX)&-K>PD&A zb;qt#XsFyLBqcQht7_bYj-g2vjpvp@&DVuWr#5;LQc_>YC2djzO?ql}_M-#)w-aay zc;a$HhkAZ*EocH*GP4Ew&DvR4*-I+cM&QcZ)VoAg!(R)}$ec7ohs0$+t_`yS6{{I=eo$Y3tK+G!aU}!Pl7@cW*s5L7;9huSL7*^z z%5A~}m!~$zpLm!wY>uw z1NN;b7E2bLDyS;jAQ%@0IaWYH8mjhD(A!L?1bil=NX0uU}WQ?`G}{QxgLA z@HJqc#g=32m63dmu|yO9UrxQNei6u!V|N}pzDTOWEb25#CEh z+WMkDRW9H9fPd6xQ}pP?skejG=B@0VyBqMM0ZGIMmEwUfXU)DuCMW* zQ|(n8zpQ`eMBL*-h=ECGfUnuXz9*s^7XeS?r@_IU&#wojOl@AIrqbR~^yRqv8S{YI zrz&P?iO|<@ls_co70d;+q-3yog$K8#(^sp~mu5$U2}nmC9wt7%j)g6qnz3@zHI|I; zjQ*!MBP+JD%8ruyz4^PoKUF@dt&lpw?PP4+k25Y zuEw1^O7@-WRzw1Z$$^3(nru;@EB6`a2CKM9G3H{g(@f%dqP@uRQ2lPpodT%I30FuL zv(Y^cd0E78_y;u7jMM1T(yk7o1KibW^z7jNxyJ&ZWjKuMb0^l{+wBc*@pe%fKOc|N z+o1uK{*`u4Mnnz4nF=>eXVoTPkBcnqYfKehk_uOE{x>FUAMAr_Bz=85wO^`InU|E> z$itg8rOM)4L}6hh^Su!PWv+m8d)?>Xtz3+u-Hw%bz41Ko2-)O5zIE!Nf9KH3XL ztaUfA{7At~cx3MB@WllGcU42Rr6F$B3zhqD{T!%`->&##`b?-Sr^xE@ipj~z0h1{q z!3iVL#Laq3+`6=Z{|2-I8YIX*BBh}rCe#zCaC`=3W}HD`VU!|(=YYI%n(3*d*z7cg zoT)WU9i87GI3sHC{!xoqQlOoxn>}XpczOYN6)aN)Fb82X8>HyBoZq^B#>2mxP)Q>} ziWoVU_T}nElCrjzqkC*waq=QMF`G|x)x_&ZFJU#wc(N%3_PIfRSLn$#89y(2p*wCM zM657PeD~F5@gSkD_Pa9Ws!>xJ>nM{SM;sh`{4GBjm4v?+wqqr9$4(r_8@D)^IYO8@ z$aS^Awhbvzp(hki&K9JcCZqfMHs8E)a|n$(^yDouLjX0k z`R!mWP@9Z`roYT6faD0r593LAu8`Wmsg&+V1y!i?EemujHy?lcvLsHzo7i02U0hPK z4f*H=QIUI#LGpw)XdlC56?Hj(#dg)|PVJ(`|L~+`&zEL`&R8)1+m-d!v)XRE-``FS zilFAmN=f00c18R=tz01P$GabHshq{HC0iu;LCJJZOaB7B<_Rkdy%7`rH4bN*YVitx ze(9)74rUeA-vtdN4|7wdg~Q61E7$HU;nGs==fgAfSI8F;)=G;rbmJas z67z|@gNqRezM2avsFjWf${Ph7um(6ev$&lu{;9+`EF%n{mL8DE?$YRwzfP4G2k}!< zAj$|mVc(QG${&rncQ3lk7Zz|3r};?i)bJ0Tw@n{40t4G)G3Xahc?AUaLC<8-@Usr4 z5k=Pw17G|ZTn;;14vYPPB1OMDGOV`QR{hA~@nQG%4|&}qW|}@*0m;0OAE=#1frNwv z*d!!5V0dAbDSvm`S+G5e_XE29*w}#C15ashTPMyXBmzrs%=_9daHDT z0$P!eAjxgiQ6PY+C(oOvK9Q#Y!Jo#R6HS)UDqhBov9476iO+2XERobV&N;n^EjgP# zdjE*}*~A11>>KhrfYK8}F+g6W;Hd>e0qk$zh7hOS_i3z}*Z000Byv!+y3Rsyk8A5| zh_oZx@&xuLLaeiHI6DnKGX>{PUmk?ye}O_8+K!m_0`}X_ zAdRd!AA(G?pFc-gg+O*tmgqZf#Bx_fCnQ9M1Rx4Jj-q^wcQx44U%u*Gb5}rgH88}< zxm{#~oz9}GUKt=MC@7TbvSZ39TbWqhet8G<$e>DuI_sHS)1!~;71h|E4}WjEpAElg zf&oL#52kaQb{la7p`iG)o{WZYxS19YlR2K>qONE{|6QROa-{%9Xy~lBeA{DM}3u48rM#WXVdC?;_?^US43dLF9>&qvIwZ z;rN*>AV9(J_y7VRawWY7UaHgEzEpD%2<$8vuXpc+ei}q-si~;Ud+JuhX~<{s+cSet zOifw2r>BR3elrHheBaUh5b+C0D1sqfPH>cipwjhoC03Unv=CtW({%IWiJY7qsol-7 zCZB4s27md&C4K<>FO8^EnzZ{|{WNgq(Zu@KSrnn!_VoHENXbftjE$*Rm!p)BPv|)F z)8ibHY#}SemGHj#%1&RYP3sv$ViL@Nk~435MEjCb^m{T`ZhzMdX46Y}pk_=|Od}BQ z?#$uu&#$Xt2+%$#<&sN$_GF;~q=f-lcYYo8rv8AzR9>NU$`kjq7CH4dJ78G_DNl&# z^~>~S)4e`i$1F_g(JUH-9)?kCAWGcleUXPCqvPi%aAM}?Zw0&v>FtP_9C}Saa%_B~ zE}(!gRH;(Rg`lgpMbK7(K=)0l*6E$@SQ~-rw6wG%=-cRK389^exL7W|e?u#a*a`f8 zIXzwhNg(KmA}h5xyK(rNudRYWA0bee4>n$;gdf7x4x4!f9Vrpl1zi0B;;~^chhD(A z3&@FtK?k_{toL4kfLPM5BV24DQvd?7;IrXTxIs&41#~bVXpO3LnkcPn2PeK2$an+&f#YQM%~>g~vWc*Gi? zd^dqcA^@~t$;|W(An}FmH! zOYooC??0;|T4R{b$TV*WIE7qDF5ND3w>BO~N)<=Zh6I<0AD)7qUf+$RaXn)YYdn^V z<1LJAnYNx?&bpTy2wE;TQbS?HbfiKR9M{&5XON}`T^YVK81Z2|B(nSpvR-+}X|MkL z;0K93WHs78d*%J(28buKMzQ<|FE~u~rL-K6`Y!(f&yxIh=K8bmPMWnEhiJZqQ zx`A**d8hLRh^Yh_k*+H#yP-$tYQaz8^ekYh05fb>vhc>XIk2>);?>7r*-&R-w z-v^d4Ha>ojbTV9t(es*gtIGEe|F5dPGAPPFTpL9MNu@hQK?LazK}uAlq!C0)knWC^ zS^+_kkdPLnyFnVsrKCFqQCg%q_v-n-@0@QA(!o!!fL6T_5>8I5 zX|n9MJ1@d@0Tw`hvaEZ`7Mq#SmdSY+$8*^ie#Hz8;jkl2_=sxbQKqhs+7|hqOCFLe zqywykjY2IeM_*)RFw-RWWH}T@;6?AHUBK(9m@bcHWs|~9OpG*4F3~fFqm)sJ>uH^Z zvU;f*r>RaP@5tvTQZ7HUcW&24QTuBGjrgsoD4;U@VL+1%Kbyd-o$U7&+~-a@j+774 z-hP{_|0!yYT9K%9t)IAb;l^!Fd3N*GQ2Ha&oHJ=tYjD*$L;D(InFiT^vw(&!B$*U6 zap2?NkO~^N$w!SzS+ZN`U!&c*jfBVFo&@qNZS!R}b1d@`eS;>OHkR8&tW5qMX zLQlKHN>>eO#0!;IRbab3&&&|#Agt)8@Q^2r=e>TtOf3@$*H8{9N`OmQDt7+D?-|Ug zU3+^TCVUGVD`@b#Zc(7M>Kdfd0KpLPZ01M^evd*S~9eZF_=t&ew z+Ldm=|9cfihTT3>4k(D=8lVY7q9^Kj{hpfoZlfBDo!1@P4@Og@|3BO%+Uo|mE5{%w zPcHgp&!%lfn8(oU2C$+*KeFs}+cB~A+H;bUVFHq?X;9limuTh526tVi`8}}6nDw7o z9`29<3V=ON5IPBA2hxQ9SD^0ygPZc=aBJ}NL0bOgt3|mgYOKhDG`RR!GzGg9IZNkR zxK|JRYhT-c>Lw^UwFy9H9aOrMuCNY4LGTftUFi4vN7r2aN7ukP1sM=-FmW9a0be&B zA=k;}$dQQRilZ;mVdTZk{1$}h$7Wj?W*nlD;G5b>N6>HgtoL%m&#IX(3ijg4DdI`E zo4`>%H^<1x-*N?uk1K4py1H6Kq#6R0;JwQjc5W)-1+Qn(MK8!;(faO0BGDVuWt&hk z)$4b}g_mk0pFw@Iwzlw@PIBghec}7*4rBU$C`9{k4Yuxbhht(U|Cre5n$C`_LIW;A zAuA1C&smjU2OngmFIZJ^Xuir6YgMm`F(1(UbV%@c`bjRu&2B7a z$jRk>_`X`+lHC1lT=Y4>{=n^SUT1L!OnDODJaDIetz6#OrT(PkR;T_@^EoAd@;Xmm zkV)H9%fMeo1qgF&+o2$zl`I!lbI14MWlct*xqyV3GD83_OIW9VNDz6P>RhMw8Jj}c zRfE8F3v#(^T51qee%gXXczl}4pM%mQlQpE!vlQIQR^+d%t9{&?bGgBUC7d4qioe{p zSC^}7mMt^$cZ`2WY{b-}x+w7!BK9AOukT3PtdOD8GrEWiUX#_P*LHizbq7@wK7HP9 z|EX=_Gr1h0$NEb)-5Mq@r6mi)=T`FRcI-RpW8S?A6^-v=y?>I=OV=}RN}yYBGJejd zY1^l8>Z3TQhd9VWlbP{xInxAtmt^vnQ&u_NwqeB^yB7q~YDC@Wb99+EFn+^^pGlmF zX7hQ2K5N^XD=Umv*O&x*1&lT(`8H8m-i&V-e9fc$iI`ZeBs*#O8eRG$j4EEm?jh^U z(1kXJRI8HCg4bd=qWZde#(dXgU zae!|@ASAYsB=!*8))Zt1>MQWc-L>Gpq{|vfcby{2VjR0ozR+TX#HCSPQ3SnaLy2ie z>DI}@!0RsRMd&hX?k_6hdq&#>cLO*|+u_3RQ0u+PC^TU^Rb>x>2_TUP?h6giH=eOD zWH!*ejQA#3h!pbRPnKpt11CINHw5S&{QQv3af$l2@?}DUvfLWtu!r6OYf`IyPm@iL|F&q{0@W=d3UNTlxSbO z2)a5m({Gq14@!ZL~4fPQ4de!MyQ}iNaX95bd zuJ}&iuOFAF@|Q{V}nCIGAvL zh;3r)P|36mUYcB(QyGUC+vyJC|j1AaFSoOQ$PJ86hR-ot{F!Y$!LgNxhbwFg`3K>_k4Be91QQG&|0(QNMceB>UOe` z>lL;iK|a}>kCtS>86?wCdBZ1dg{hTPy8$R z9vt^O4F8d=6~X$oB>E_}#49jAD3NCOI_S0Byo3Eb@=zNDcn%J{z<*M}_>uZZnJQ-> z-`Fu^h7`V{#^^k4RnMG`rm^RLUL3&YS8DFd`tRHsZ(nyP(B|sO0&Q8OLvX~jT;R>3 z6OH85&N9i**QKNwu5^v`*%mg4W|?+#1inFsOh(Y3W)!HStg`ZvyUUL=hl>UZo4@6! znM#p$*xi6xY!`-dD^h{pgsw5ja`f2vwoKfLAMi>y>YBr-_`rKdNvhFhNKpf@9t1Wd ztZ+@80^nBwN*>f#xEDvqXXjv;r~(DU%q;~J;A|o7oz#tySRWyJcdguG@1o!-JNB< zdGm#$b{z?k&_~GbNt1o2ZU22hbFx|<+qMkm1i*g(h2xKN{f>ApS6hqWpE!NiN>PRT z$^pCx0Tr)Cv;kBufDP+#YD#~e4CN{!B4U}uVM|2IPdd*SZ}s;JIHCJ)+;-ZbW8FuF zs9(N~bqO0gNivCX57nSNf7qVp%R9KOgJPTY5i!2QqFTQ;|~y2!3O}7!DPT(0*+jtL(^p#r~o|2m+A#r$3kK>kqLNB5kg;c z!D%2J-vVL3AiJAo90$$Z{x2~{>_xHa7==8KKld2Lr1NklUyK`@ePcw(I6WQmYF>4ELwsH%&IZH zw;*X|etrx(9uowCzHb0+Q5Tx?n*Q-5TV);;hCmek4!PDMb+oz&ukh6QNdib9p*mL- zFb5&A*ZFB3sFz@tu?JqM4M^&TF{CLC2$ACWq?0n4SmsNRVPOxIl;HB*1pZO9R~uAN z`S;(+1HyDaKP3X;`{KfaWF>!%Twc&KXFGkn5h z_jT+K3LF{`{7*e8(Z$vz#KhnbG<$bvem1wD1~KeGMSoAxL zJ%uuNdrX9{kvKu@g`&Iskky?D2H*E%5^XL_`9on$I4LwvB3cnQsn^F3RIld5&>vP> zPYSZHEkMoW>mM=apgMa)Bcw^{^hOehK$K`~c+Z#!NkpNDIpjs0A1s0MW$F9)ikprT-%sD_eTkto1h0zC@@@e0ab5 z(wh*rIQk`uP82gyzX=V+HV&m)#MGY${54rGjs=s&?03^R=Dxwto9J>-V|W%W-B zudQBQw21>3CK(@l5tJTISJ}S<-%Lxg_+bmslSVV&AxCH7JM4 znGM^*2gf!+l4m?G$G#3$Fyg0CiaC3et?GZ!E@El)rbFm|x(L;2UDf;}dywiv({RZY z|9V@|Gorg$U)mG9OH4WDDq+GIfM@di$E?YR8;?G~a0PDxgHQVOc-Gum0w6Th#vjAT zt!a~(jO;gT*3d|OpER%70EGC^l6M45^#NK7Oi0D+biD677Ydi5i)s_r)WQxu`ykAX zxqWC4`V|NU95_893qfm|eU8?gaBlO@L6Uw?sJ#K7xesCR)!{gi$9kAPqz_fW_QpA- zm<@{L+kWX-Q5M*%g8DMhqoObT?`xR87h@xM!ap%hpO+#AqAtMP&I`JxX6?d9R*8W%5{S_kxE4i zPT8m^nEC?HhUFMNB+gVfcR>_ln4*!q#9SZ2ug1YrzPpmJSnFIXa68Y)y3ip(SMNe< zMQHvI<)jxeaXVY;}O{ zxZj?7t>vmHgy0#`xc?keom8}7MtkuM?uB-cD>w-z) zS9;RGo#Aa}oyp@?&X*KUaI4%FqkV)qe!5s-rG-D)8h07uR0>kwEh=DO5I(stE3M%W z)6ukM#v&$$$H)F>TIlZ8M&pgCP3}TcVzs)VB!snPV5vKE$F?rF;}+p)mhhoXv=}NMzA97v zW6*WR(pAt@iuFlv|0v1w8YWy`UWP1hQIW&HLPp@M{~tOifLJ#O3zU{_T5$`uWzTKU z_^EAO<*4CF4X~*R+C^~?&afiYD&?gcn z?~n0S@=i`p;nemJDGt3!&ud+@Qq3W$mYkM0&D)S2!vyd{BraSiHr{H*j?Z@(de0=^1ytfmsdz4GHl69_BhR%7dUhqoI=>-l z1CiGYjM%k@W2XTri~L;+j2el_8!1Z30ciDS*RAC3JU7k4s>D>^6VUS3>pn%DPnLPe*(<_%OrtLf#%88yX)ojAO29sNc+W#a61K5_VP@sK8bg_UA| zC|YHWS5NreE05_V-;q9NU;WCSrfjW36>T7j2Lb_>696oKAJ6FLwlPwKSS`})ia3GJja~2y5B-W;D(fT4g*COZ$kpgc_BGy*| zbLa#FR?LF9OwzOpNgqv&ZRD}^DBmW?waiA>%~b`Mf6I#-$kuu|#MUO2lx#ezkaqBb z`;M!#3d^MJ8rgD+=d8g{$No}$GhH-Rt@!E(*4IM<6)yd14~(j}LoJhU)GyqRPs^o3 zzZ&@ZYP3~p=6@?USh)6IxQL0iWiU@#J!(>q^U6@wez!v3jL5$9UHghAY@; zr2CyX8zkwBq&fL2+D75o;A2OSd{TI?y+-!y=8rbIOqurpL41OPKlw*j6}k;87dy;= zjo|y=8qqLrHa215s!MmeC?GcjOi2W|xX=yghcd#^pntM!Cw%uPMxTtFbwSu(gMQ>P zfIL2Zs!@p&@)6cdW1eY*G~SP;lS9XlsS?w5&S< zv!2AZu}BEjoC@vFGr{!K4Zi0Wq;E?n#Oa!S#H?S~LrBUMl3wxjp+HnK7(9Ku@H4BV zQGb-Bl6jdBW-sib;v5@=x#jK;55K z7Cb1SGFnLP&E|zYr{xbi!RrRJ%S`8sE8nqxYWhu}1<_1L-}2m$X-pkwsOMUgNh0sK zttXuN&MYqEzpCJ^ALcY*H~Y;vyob!hmYWrm6;v>2x}}Fir&^f-r(Iso!evyO-*8fh zFj=|A0m+>rBEaL9BPwbjb5lsD-c^O3d(+dAWxp@5N)MZjeGo)lN8reAKht^w{G zv;>f_Q|#&V^=%t~VHTxi$V_$X6&TgXAH7Q31&Ho!hC@pVKjP$n5nMTd4a58)pU%XrB7E@HjjlFwkvr+248&(<3 ziQ1s1MYK%WfjGaI0qu3WlFR?DQW5sN1WPNPcRxs7H>qcB+%dPaLyNm)h_-UZY@P)v zrUs)y#?U=rvmj>ZF=(|-Ok%kzA?=b-c4N|Yu2<;hn8bEw>{Fk`@GFo$(Xj@38Q?sF z$rxi+40?WmLIn{0IXPOtwUjQN37L*@ZlZ2mR~_i3&IqW+VGp3HHt+X+Be7qFBAVc2 zW7FmtU0j{!VAUMDNBH)I>Ma)`{ec4XF%j)pSN!GMxZje+cOqKYGL_JCfyh!RUFH#V zgPlD1x9#Rm0o_vrr2)UN^TC#XiTmXNqk*HnY9T(pb)flWO(0DZ$X4#8OTEDR;HWmUnIMw{M}Je7Uak13S+v{m zhC(zJt-k8QcskLf>D^;@`vq>q%F2rFAyZ1jyYpK_{5hUc~W=}6( zjAUeEL)lA0W<;ET)jlLHNF6Sv!)<5$5zF_Ww@AOsx^-?mU2m7W_;Yd!yi72D!Kt`j z7E0GcGH#68x)@~~D}ul)Ag$Fw%X2G*i8<)UtG?lybBO+;ZL`x$mrq2se1099_t}PD z4j0|tcv3NG^ZGRhTP1XS!S81PF%OU<)!sHzH6KKCO{dtn&FAzeU#GO)UJ|q;yWk8n zbek7BcmWq=6QN$n;D;V1=rQXEr#S}wJ~;I@R|i<2$gID!)9v(ku_D~UxL*t&%Sc%W zO+I?rYvJpx$MZMuN76ruJWJv39|K1uOH_t0UkdK9+ z7lN>`taih}VzZTW+F0s>aJc48r1`t|s5SIV`4ZX!G{K|Cp86nf>`~%B5peMR9)N}* zU4x}|=lpm!w|PBIGoIhiqsW7ZN|Jc>ikoDa2{9$*7(6f81U=>=$~vG}#iQuc>pfuH zffRnbdYsd`?e;2gI~boS;oPJr4ZcH(r@BXH*74oaDZyPK2j}kyo$5bymysbDIK*g0 z%gXbs#L$frnQBm*EBhicDXHGKF)8o{jQ)r}eC_TQv%C9F4>E_+saXUDp>knvPK90I z;bw4dR@u6K@rS))rNs$L9b7bD>oEYr0xOnq2Yq}THtp7lbOl%GJwI~9-77eDrUd1P z^4k^bs^XHzEUV~>;IuCfY%$sGpS7ad)JP@-)&QpNZNUm;fjaH&>QgB(*GSB(__EL3 zCa}6E6c;h3LO4Q>8T{nsF3H_fTsj{NOi38;c`)gept|zMp*P_^7RJ_1hF4_q$^(}h zx&8!u%__a+?|wKm9AKrNAI5X$^y}wV!^E0BnYs*>oH4n^tBi{nRZOCJ;=>P)#x_i? z2b`^+ybs_jP%6-Lw;?*SmmARyzsIrM5%FazB#zneIvFt$#>rO<42<*hX(exM_{U{5 bz{JF$U-=P)=Rc7Sf5Esfrz~3_V-)Z|dSH~H literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/baseline/tablet-home.png b/packages/moss-agent/test/visual/baseline/tablet-home.png new file mode 100644 index 0000000000000000000000000000000000000000..517c1fd48538e9a795486d9b394c47d753b2a488 GIT binary patch literal 59689 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�AqeEeCW0tVKpM@aL>lJ0 z0r_ORE+YV-`JUE2KqsoBM<>Bc3v~qmlXSEwP!VV*{urJ6Rs|;P4VdL{f~oqSBZ@$W zCd>lx70k@cK(P}(L*TiL5!{&>))%rfCMzeW5D-Zv+Idg2Z}dCDHl26G9L6&ucWMu` zI2V|b22OoBFom}xOupC6g=<>|)z#bRaqVkZNQPy!O$s|UY7 z-_i%*p|*d_i}nrV^>1hwi%~>?$_Wu@KJ`HE6A}`t2Dyj@ZmmREvKe2{!j3KU{j%Nu zZ`qHS)VKp>7sUGbIEZnIBp{W7uS5%b?X*>crs*xk#{7YThJ9;ahX>zZp05yDx`A+M zVA%5y!yjG<6dcEFJoap1g-}*SK|$}1EnX*$9@t1ofoUfdRbflZqH#@ES68L0X=|h* z|DuiAXsG5>Q!0a-sJSmugo6i#Do86k5oor=fgX3K=0!`~{rX zfPPg13Mx{yJ=;)ib#(RnH|*;Uva(Sxp?)K>)=f@M_VkFd&oDOz$b{f_D-M62;!tud< zzS(@`aO^;~!nXZvj$if7shzsDHDd~BPd@^gwMZ9>dg%D~_1II^Hs|p5M)A_^-#+yS zS7nPlaNvNM*;0Kj4F)2pqt*28+FlH*o|0uzveHdzSAYd9JLi4PD+YdJBcp;D(>P_? zw&2@bZ>krtx1d0aMDr5iJnrx%LJ5lhel`jyp~C5b(~BxFT3`dG^R%501C`NsN4(U? zLI5I>WOLBSCLj^z7i@`&6bhDN>XP%cg?0-C)tfKk@dr>TlH>!vU~YgKB~ny&2GIc8 zkSVzoauS&67n2C9g%rW z24*!kgV`hlN^(B$jFLrAI`i&?wiH8O-eNq@Yn-$r?xrL-5Y8a@d%J^zFM)tal>ip` zsK5x`?O&?G0M_B~=h0bhdu8WuYPb|+$P^8fRvEWIwVB;7o091L2ctN{9Y1FIhPNy| z?8Cgb7M=P~o=@4h=_TlUMo2yUv}=YYCP1rxWbfkCH?W#~b!`ny4L;r|Lw+@6R`6hC zly%C%UKDSq%6xxb2IoJP1NG_;s4@P11HY}H+K}<^@q@AB(Kue;(dMSUe>)+je>Lq_ zvS`pZ-4<7^CLBOCauE;~HdzpF9(#X~p*U?&3_m;t$L{$J*)pBpF*Ed#5dm?AKJ=ZD zS&!dj68{~MZxb{W)T<#T62+v=`3-APYwg{BMvY&hKKmswpK zEDW)ETwGTX!Ak^om}=+Awou)#o_|jC;Emu`HvdQ)I7hekp>pW|7Pfoa8HudM+Skn- z;B?aO|I!4oBFR3FDfJr;EZ;aVRkrPzKOuQNf=_&U5)w=YX9WfGoR>mF#i6n#t50XF Rfd4>=3Q7u;e);D0e*oHZz-|Bl literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-home.png b/packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-home.png new file mode 100644 index 0000000000000000000000000000000000000000..f401c4a410649a7e8d9adedf062173e80cab8676 GIT binary patch literal 80626 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 literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-plan.png b/packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-plan.png new file mode 100644 index 0000000000000000000000000000000000000000..4e40d50ade3cfbe52aede07f40e0cd0752ec3d40 GIT binary patch literal 96225 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 b?M8Hfn)6V5nBlKos53fOZ)g@?wvGG`Gfk_r literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-plugins.png b/packages/moss-agent/test/visual/reference/deepseek-47f9438/desktop-plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..ee36616ec2dcce28fd07ca05434f980cd7b3203b GIT binary patch literal 74088 zcmdSAbz7U;^F5s6Qrz8wJH_20xVsd0cXxLvP~6?M6p9q5loH&Eml9lx>o4b=Z$EG0 zxt{!$eP4I7ZT8HXwPweusmP(B5TgJ905p)iv<3hGUkm`i4j{ompD6tXy#fH30FbnV zmT&%X0b(fb-u>%l&dSQVP%=}oIV{#2tmF7_c%hq(fH-2sZ(=X=A5D~$5=V(~EaF63 zbdT|l!%Ou5cvxx&h)bQ{zrQlR^9aaXFEhRmcGkDH+3?#haR2ltaGx=bz|?;Q09cj9 zJnyku!8c?13hn*hkKXPw!r$+J;t1F<*#EW2$dO3@*MOXhZ~d$a!jHV948%r1!j>rJ71mGb9CG13B8NYVN+yGU#;J7!8tU79ho=|Tk;MZez#WDJD*SR~`xq6kcI;?5mm+0>LE1ZSiveT%*CN4T3{w$9 zI44xulM7Z{If8U~Q@=g#SnKjxh({p>~yV82?a*AsRG3CBTI-y8n7@%m_Visb0n=4H| zSdB>yhA9phd|&s_XEezY(+K!CzG&&)dw)RoXPAA?9KkbFfy~(;P-G%wZ^qe2$WPPf)B{#SW^atV_plX_NpOV~fq&Es76EzdhOF--tR^!&8M6Sob*BCazYl=%G3N z7zE?F!Nu7m^vDN|CyEwk@9ij4_Fy8;edHfQ6l-0gOyh8o7ykGlOiBEO(u97yGkoxz zv?FWC=9RTQ&I@0P*N2Q^bhUexxV7uPI5WW9zD<@IOF$w*oILD-3a0@5ZG)bsv9aQz z2AiTWd>^C2u5B5;BKYa4xi?KyzBV(1+N`cV@kg+qKG6hE7TzdLPDgmYgLlS6T6@|g zSAFimcKUnVIE5DN?e~c2*gQtqw&CS&#-BL~@Z{e9^)I%3xb&`(U$KsRBo?n{zkQQQ zz{knV%+%IiD3=Dqx^wkUG}E7y%B7t4`rjU|lp)3u6%zikG`h?hN1!t+tFJFD4e#ES z2P9i@kiNr&uZRth?`-UBtgX!5uq!*z$}vMNtXElzO`GP5hL9YiQ9DzWGM`hQN{3s^ z$EP8|PO3Lytz{LQkH8MuwO7QRw-|gi5zK9U!9B6>HUC9u zR`tk0Y$vM^lYx1+FPCp=OjLO*ywgbmfp+mAiZL^b#D@c zK>b+o;Ec_P^HP`6io6%?YBC3`pu4nhrY;jz3MW1yL0dx0(>L2e;Y%xix7KTuvSHH1 zpf}P<8sJp1qvi$@wz?#m{dL%SRXEv#h?r#hq->j*3^5UwoW3LF1ZHP7lzy~A)OiHa z{`F(;;c<_?em#ZtOKDH6J*=fw%wlsAEk`Wm>ke&#L#>0n`{i>r zrQ-3Lc|A-Tb#p00I=>cu>=zZ{4<1-wCBG1R8Y|b8+Nmv24WUTW%?ixVR*%KEkS^6g zbY|!?N{B#wBZySn-|&}Y=}@P7iDOOZbhD(dnx94@vPIs)YDmvsE?C4|l^GSHr{NUR zttyXE;{1)Eo|y5N{PRIHsWIDLL|o0;tcE%umO7)(Kz(Ix9%RBN$9zZMwOVD`iSoD7 zXpHRaWgR>lku36j2kGnjS!_5_;jC7E11e17m7V{XFI)DM!jEL(I8+`U9@^Bkk#i}`#EE(G_QPrP$-MsSmpnujQ<=rUzp$rRO6>z8;#z;&C$W{QoNmYD zccHl)?KEf2hHzE=mUYY60UsB?S#xn`X2YdeDo(gHuQe#o{CU1_`QqSRhzCjWW9Sij*um%|qFQ>JY`#Nh%O;;O8Y^gUmp5dn` zE8r9>9pkAVFRKvoYaXw|%a47G4SOcz0qzsX=P0YhyS0I(ilC-eV+_Z8%Jrv~VCKnU z(hZ05qq%;0ke05tc0yMM!9{p3t(9>3ek!h{$Wf!VZrgywF4aircLza)?nh5)(0qvq zwPx-@Shs=SbTe=pF*$EbrCMaE3Ca5o@uL6waRREC;i+gT03QWc(`UyRU(S!1#CRmiTmfb$iCYV((aV z&p9O7KXMeHILM}-FIxHFP5Np~>xCEH2}g&g*#MY1p|yJpnR}Uv*=!B920!klW#B2LOwp|K6zg1{!I#c^A|DIane?`bgD+PCjh&o2 zr0r8j2Z*F5&ONaU_XPCw>XKZsvg-XwS#L>6h}uik44XVd=4jKpIz%$uw+ zZs6o$>5|7n)C6q@JP-iYsBvaOJVovdDRbKHmJI-8Wwn#teQjG7XE z^l^SZH5V&W-t0Q2^A{)_W3`k&@fT$4S2<=qmP6j;hX>L9U#@n-$>ls|syGQ=cy(-f zY4g>hWNa6!NbgLCuN8(2SkwcNov24dk?O^oVWWQQS?vufC^YEg*3_ovbMfVvhedcO zyXG#4XQ+YQ%801XB7YDY2uJpEz!d$WP@UWaBbR##@XG|rBo2Y3fI|)&a~cD5Z+%K+ zOR&usnV696PUks-YVr2P_I%`Cb|a1m$96xIdE$pZxKjMj3&FOShe6yAK=Iqi)gzbiE-{`+s z?o`dzT(-I!02vk9j0B|*4XPzna4bXYsgW5oOBX=EX35Jq1qP+$Ige(GaHsk&7m4jV zCfN6pi`<;%CqB&k2Ax1SaK1r}ry_5kl~qkh!+vQaj?R0#&w3Z`<2LdlX>S2smMl%}5_`W=n;yPKms_112oJDKcF%oM9dQawBttr2H6k(lN zaiorQ1*}z9DH;OrcZ^&+iZ=@Qe2Em+A5$;!cRVSz zwYwr?Xb&TRh-uV}W*ca$K=$jmW2$=CdlKu-Fk6aDn0fPAt(We^=o0{-lRP+Po_c%i zHW`Qlveh;y+eRF^*80l@2+S*Ih1deHx3)dp;|Jz0TZ}lOJl{+wdwAOuYc(tk`tfo1 z&_A~M&MVocA(%1ZT#UuS>e-swo(unIMq-;pDp_~p5ys2Hhvmd}k{BD->5zdhE+014 zOFM!&5;|_C8ajuloj1nwMa*a(*d8W*A^UA|9VDkPPke)#=82m=Dw&=I=Io&TQ*H9r zAeyd3Fd1K)^CWe&%wAaj&f)(SQ(Vqw1SV#6B5M)8W7oXQ5i7&40bWNx1^k35N(7cr zR(ASfF(HmxmX1D~G?L_OwP!V98L#9t5k*8R1dc_$!P#=slknq zJ6qeHt2>CQ7rRZ?ez%?t_aUo6_4RXnyuXwyn|4gyY@qo^o@IUV(Yh;1Q zbk`Nh@N}^#UD2mB5=VZ5GEG>YFgLy+B*PKMQ1M9XMIe>hGnyU8lCK4tgj)lnVq!^y zpQB4LKgh$XjbW~apzkz$xi~fY)qNHQRyq0_^Q(ugcr&<3U%S(wF?FAZSATJ?7R&)? z{14zM#sArA9w$U6V_5bl=n>4DtaJyt)uf`->{&qrmJyM(MwowxiPl)8LqcqydZ9|? zPmZ$)gBSDn3AbTmaU88)J3IqXChv$?w@cU%1W_iu4h8z=2b*z5_oyn;L1SKtO_dHm zVmX_%CC7hz1j+ovgf(V&!x|H7Xo|E`r7nY7c!VNhc+ z&$BNvMzPM8F%42Ysl#tkf43;zM^EfXlODs1|0$i}Z8=#i={BdP%n-&Od)M<15U#?- zo=n+vY2X&Hse4Wx3HASsE)-o_9VSLlRsH~3#dLy*`_GD!vFwx#*Giio8=Yij09U3` z)g)I=J@Iro?uUxGJu9H|hdHT ziO#Zw%?e-r%F_6;l`A8 zFRP`A6VzSyhK$S(=t`)T{CMk7b(yRuFgD?8gk>kF15p{=AL(q@OVm=F*8f{@L1ta-8>NE9DhZ!1&`P+rG6F9C;?YcGH{sYR-%a>9j7X`) zSNxZo6PGJR3X7N$Q4s(k1VR~(%!+g`5YNc7{Y@xlgm6-1Xu_d|j>_dCk!>rnWjECQ8R@01?fceY`q@VSs}u$F zF=0sPX!7^M$WXF$GDkb`J32ExhhT#2PWTQ>vCc**Y-xI&Air%Yde5@_#EM#dDr+@+ z9In}n)I=VE(|BYU)8W>TsOaHGi=2*qcq~M2JEaV*WxO#wl?dWdxchYZ1=nv_svcim z>9ArvdZlZOOWgi?)R+=}4D^V# z-IZyi5cI zCZDi#h>F+B?l25NPN?)Z$0NHIh{<4F~>E+9K73O8fFBg)Y`SpBQ2- zEv?i6iM%bNT53Vd!&XaC#8F$bC9WGQ&|EZ#Y@DvGooY$h-dj6e^6+puDN3=-l{y81 zUgDZ~6-8*|Lw3dosZPN-QQ}~;Jcct{Eh-)(Ax}9ZpH+LdKwvDffjXx)b}F{J6Tg{o z+HaE<(i<0KTD%!f-^ShZ#u<=}TNTSme9H8yHX;jJZTc{S83O*UUHAN#Z=@1iv|YUQ z)?zd5^qoMka`mW%)aGA@k}RDjz&{)pQSXo~#nGP3q#xbU5v_&T+VXkTfvpaiUGw-u z8m~D?2IXvTX=%VTd3)9*4C2aA=ao&l9w@!uT!+*#Z$4frYe*vzPOTY%+8q!F->yE( zE-zIx)tnJaUtv;lh%!NOOfESKJ5@5(s*TMNPA9ZGKe>9@aJ{o`6As+gyD&bCe>C`7ntSIQoDoMLmD~3E zg9e|0i_2!eF{ergRix5wqcb`qjsGSU5F}hfI$qBmSDXXN3P#Blf2FRDxZG6(xyh*7 z>3-{}Ey22U$MCn8&Uko0wA7E37~iFIVbC8q(Cw(WV+=If^5ubjF5H9JIL?aFhR;|SUXL9p$DQ=k^-R3>J23&w~k-A2cBSAN^@`s>wILG-$bW?zXQ z@1wmZL2!F4$ehg5jlJ?aVNrbw480;0mCy-cUj_+*}!n41`Q0>Jy++lf8_-^2n!1 ztv9Qh8m<1MGG_beiWQ~f>f_|@*YnJQ{lVnc zioZl2gbZrUY6vg<(6i80>TJ)#AP(!rrzNojK}{@!DQDXPDVR;(3| z&#z?3Ets5jl3Ge-IhW;eh{lLUV$GR4w$)M>a>eGyxd7=XtI03ql3IDOBqOf8Ib4PrYU|6XY_ z0Z^?H*p!Rs$!#80@CEDODJMM?UyovMQn@Q>n7bc(xYj#`g?hw|%R}mc{4nF$+%*y< zLkaez{^b?U$xc+yf5jzFaRn@XrD`|5^pa33)FtIAO^qDwx_JA0UB#oo;dpT~M1<2wSqF7gWzL1(wHrxT`DyH^Nmt$l`ht&D`Af{9M1G>wY^Chz z1Jeh-)o9vNb`2xlmyQGodQGK6&6lqVa%z+ac%(ZI@9H?2D=)PF5m5j66w|1c4wxNk zBL_jI{D_P{ap*@hpp%s%Wl6iQ%_3h@(p%?AkS&J!cIm^Q~2Hjkk5CBVA{|cS0q-m|z8muFAc{ z%M)T_u{IkfciELI5&bs=0DvqBs?N=gJO5%Tnen)w)ZtFF+cH$QEMi_Lj{{vgZRwffdT{>JO4Uds7kr@|CNSIZwB4DP)ek?{|roAZlIL~%5-2sWn)OG`1pU% zswy6dkSGA2%21IQOdFd2&#*%qrRIbvQ#`Vd8QSZz8vC3JGo=~>J?tWPq{(AnaEq4SDu*WRjrZJQlef-8=|3ig55@um9o z$ljLu0a$GN@B27&5S^+iL3ks9f8GXdA-&p5hX}uC3rkK^%}k5>%LN4b5NY%K#y1{$ zKPfL-`@#G-+iptc9C6%6Qh+Cm0s%ja*Gg(X?xpFoi*WF*#27W#z4jc~Vb#8gSZ)m$ z<^N`GP5S}8%N+m}PSv-zOwWor7)DxiGkMM*F;?GQ?5%x29>CU3E)E*0{ZOkZzVy!! z0k&D4jAX8R04OOQKQNQujrHOpu>eOF%Wx8%#$Gp|7gb{!4o)a5uq939{r3kth!x$| z1DUX)H>xu*a`lefYJ4n{(Oqu@nf#IKhQHPZvYejb6e-J}&Ko?X@7n=#uhq70bNv7^#Dy-*HiAJL&{W#J3hDfeDqv+T? zcr?y`e_nuE7dn{J(4?LI{Y?^d#Gn=!Iat3TJ=aY@LB#nXtLvQFNJJ37^iMrzg4b+;*R@qIy9bo`)D zLr%o(D0S9%HdlCkvgR`o`sT{{-ysXqTrF2h>bdk@d;S=VLfxOrlRNVivRv!@;rKk- z=c|hjmB-up;sf1DKEhZqdH#fW@`gB~VtUf?e1}Fh%E<| zNFCy}E1ZYXgs01@@JU?0T%=M-{dY(S%9_M+-dTVDDCE<)L5xRZhRbLoz6&TeZjlTt z+W>!}RxeW*Hr%IF0g3N4_KhXTAMNcwTsr4IYA$zod{#)-F1a(;+GSXsX}l}!@%^6m z;8q=x&OmnZfqDVWe|rB9EW%qtPV>lr4>V-;Emoy+96f3K~ywwgVx@mZnd<%WPe%Z zh9(>D!7;&hw%d7@LA>%$6yt)>B_WRSjrwWMZym6Vx0Yu06rv?wEy-u2MyRmA=F;E$ z?;-)FE;a(rSoK>YPtTOG_}WK)Zb?A*LqyH~I`Rimj^yeaJL2+PYc8)GrD&eyK$CaM zvqiPi)DnlXqD2Z-HBRZ)>7B(O;_`5>Q%tJTZ?wH<)%8-HAGufzGX{@23OD%jy#09YR~yGKRi6(NIy&3AZsXzu_8 zqV?JIWM7wtYp=8lgM|29M+g%5o{lQnoVc?s(*!kST8T7-Y%7oGywVg9xT>H;XN;9C zie;GOcJYkRwGf(KS{8?~Uf|mWVFOu`t{4erS){7##bdqSrvW606`Yivw6*a- z9PM}-@;{-hvP#|0RQaxUY^P*n6_&Cb$#$0{hZ5da2_2e5>7HRu9$B~#4CG_{$S)-? zWj|Z98q7Fa+j7f*Z&O>GRvYh9;i4|lY+>sZ){EQbdVE}}{}a+=B>7a%dT%#oD-=ROy3lcJp25TZ}I}D8EwPY*p9P z)EIRp3Q~oYu^4A5(XN~g5fmZOZ_^oLlX17ePHjh4s7OkqGo#!i15sruow1lgmrE17 z+NrQ9TI>7g7Zzu|?GI>@zE&wmk`n<YA**)> zPGsVS+eE!aU*-DL;w#QAx6aMI6jM!dJW)zcirtw3<@FLlBYjkN5q*LTTzrUW3Kgk7 z|H>uBK*-I(^^$4TenDkykG?!1pxvXpaR95T6tkxwBf;NK0|jQSMQia~f0;w)mmQUc zJX@Ye`e#x_jC52Q%r>zhb*6gpRQ%LwzX_Ha4A~4Vy7Cv4=N8;E#93TDYETzTdg_Og zIN{-h$j(Yd{a05UXQs?@KOi-n1Ouz3$JIBGidvQ~DZP!2(*+I{eB?V%*N<^lMibv9 z3c%>+$t{*R%|CYB8?{!ARJ@n|EH_AvpsMS_Oi)QmHP=YFJ%Z~=lldbFb9dcr3dyNg z<#W1HtEp);Vk7!*oQl1kO9{QCMi>R_&i}JeTiBr(j3Qw_u64;dC+&Raep&;lw+aO` zdxs&$G;tEAThhcTTDyV~6bauPp(QsI;^#KdP>cjgPe_9>QiY3KftZ?e@(3D=Qo<}T zdGd7A;34X-Vh>B2SEzBs$bqvO@)7dg`9=}zY~{QSzJApyk(S^sm`*yEz1AHYiGp7s zGqbY{N61&IKD_oy|AO=PZ|lgpHMLV5lS6DHk|T3mM=_PNnF6HOFs-UK8aplXOIyd; z2$NJn5CXsfT_c3&E?@&8euh2%AdIaMjdvMS+Fr&B4=@KT zQX7jP#>82oYoN}XMzB1H*S7waCg!MT>*Css#iTq%GrL%H_4~Lz=$#1HP;HBCHQYQB zB-N_hd=^pQifuCM(Hm*CLLGSLr;cu`ohvmc!2~*tcFO=#14w@e> z;HrGViuDm^*cm6+(-??)m*^WEFk%0dDCNrefF2U)<-JHPQ@QbeiDZoEZ;S&tg*#XL zo-W#CxCl{%Liyr#n6L<}el$bPfYs!^0QKMmTQiHp5j5iww~;@RJTNtf->!{#D5G$q z;;UjkcklA2!=)ryend-X$cQqnN}@R$Pb$;V4$25-Lojaci_t8N@zvbboeZ#fhRuNV zToGoQC_}w%4`0{zrec@VcV)6(CUl-hGKNVUNfiBO_)nm;0V_zIma{hUJocp&i#e|A zdweBjT6@`bhk^J-y``(d&rp@0ba{^E|N6!Oh34&OlHlj-rH6AD+COoUZ{ECjdJ`r! znc&J0H|^civSKwjOWg9{_;ZoEhT1E#4-J0V{HhID;-xQu0L+-)3sNB_2B)wpfVvv1 zVRzz7;FaeYfw6%U!@AVxtlrPfK(Xisl6HM>S4)u?XsrhYEdtLWD>W9&7lK-G+m^cO zkBTP7GLB;eUn2vwrUw5c`sT_rVd6y6Bwgi&_kYvim%*-guTHQ)RPSADUaogUJtY}w zOaIE~hCuZEK+0tq`(F%YezUGNRVZS3)_P^O@huh?3f1+PJ?+A1Y7NXCnAA*r>45k2 zWJFvCBX!g)p5{P7nt8%f!TQ5H2@j14;1T9={q~BNw^l@^rf(`+aW}kEiUC~)H1_1U z8V{+EW(fvK?}Vo@;NgptP9$RyFmTd&(#A12q_&nItI2>$e4Le}6j7W9wc*1>*kP2j zYs>Z+aKx^5Vqr7}rE6Pkas2lVOntDF5}70#k1D0NQs36fqV|a|>Fwd3{gjxK{|^W> zD-^HQMxhdne%f@M0~8O9_<$3c}RLBvYNshBM;)aN%fJulcW8Oc34w&WAa7Ge~8Z*+o1+E!Jj9H3Bv6WbK zB6w-kR|+# zbzNF8vy;|>!Am;i6^hB2GQV54YWQZZvvSK+WsyM*4MGB1^=8VZX&K5eDq-pZOAji4 z$j;6f{kmW>;v*@g!jCLBJ6BCqFp+6$CkVDI6(D9}M1wNCJ4jWbI=YxY-hDGiIicvu zxXWLhuh6#D($PcE!9{nID4`mEPs@zNOh>FuL&dc-C1HF>K0^^muE{ma|CS*u^LwBA za-s^N@PB2|I>?@e6=54Phs3TIfa2aTOgvWq!|?=%4{(KXLxSNPNKp<=>CNgoqm6jA zLe&EjmoWNw^LTb>vPU(9%*MYnt>!)(nc!loXnpPV_nUghbgh<7jic8$Uy#%q5Z$2< z0?E^Awo_f76$^a1*7}Bnfu(Hq?Ld*XfiVsr=xS@And34{G*Y4RHal+5fFs{7BE#Qx z#L(+!YI{k05z9|k%%p~Go=)RbK`n=_aRub--Be-HsfbGO*s~1c4Qd zjQmlMmA0z?&QV<~xro1(j!tg4kYP0;z>_l7QVTv=nk#3AA9wP%cxKmp9Wpm3gZ>30 z9VH_fU~Uat#|&v%?w4>L7<7Y+QdZY*8nd{ilE4z%0XC989j>%Qva~@nH# z6gH-^)W`v3AzS7~Ep;qaG_T53OVVSHG#7A4b^l$-J`(*FSgW=j>qb2dn`w19U7A=O z2Awr`(p~Ap`w4GsvsO*A^3m4egY5Qd1;Pp#9r~nsG@5%Ws{b^udP&G{`-yZ~&k)0E zBk>VHahY1}z)TI36=ai98;-vta^w_415euu&U*)`0xmnD-Tqsg-g+!Ide!!3Pc@;! z2V1SUsJE=(3Po&ec5Doq*lx64c@&$` zaG5Vc1_fp6F1g{{Kiq2r%CjYnbSmfew)AS4=o_xrT2o{}Ul|o{PuKsYE{M~yT2~y8 znNSyL*;>Q?aseDOIK$<_G)g(iQrlAt-wI~f?KFkiY}IHJ;d z1FWNGri_EpjT)o@LoBEqV`aBV)s0olcoa}{(`0mh4XB6sTC7tw${hh=aELx#)2b>3 zH7s_$R`1)+sb}J9s+qOVY#lLINw4cOuYScN4?|Z-lN`z|U!j`mFi=-F`zIz~s92{t{)#dO*_-aqrC;m3)R4+i0D^GL*!(-+F)PDv zWvlMdFudSr__^!LFr7+sWm%lKHTZPEpJyU;npn7v>%`4DE~uPW+hn8Ln@jP&kti>s z85FF1e{ZSt(-6z%^Pi_07Zz&VV0*sDW!qHGTkC&D^ByYZ(MaVwFGCsg3dY$118J@f z&T@j(@9Nsx+J=T}Z8oa9Ovs%!#Op>9OHj5(JseREGe!i?%u{B6hQBnf(hhxRB+8AH z^;+#$^s4w5uT1jXG_gcZnG~le8oQcLDyk)2c%xg9iaL)owuX>+x`%&gr*3{rVRmRr zR-SZu=?=R}1oXH%n5%+TYkv)g?+v(RV`hGL@=?dR5i=e}{IQDRXq-!DAdX8J*B$FT z-@NGD=j|b0B;LJ#y>WN_RdaWoh&ORHGQ22HojtQPZLF^8L@>0E&>wI$B+$C%pvRl2 zUD<%>cKTU#e0CG1xf7#ZHS;NR+7VP+3P3$59!bIR5|!vqf}Xd%9-pK554Oo@R2oR) zYgE6^bnu$6&_DmhCdrm<*lGzX5)CSLZV#EyjQBxNz%!Tpb)5h}mTlg~rk|EcFmF?m zD13jEBnc2COk&%$&y2>r9g7TDa_Czd8gQlss&XMBP{uvK<0i%cIr)xETio%W>3yR9DBG`Nni_dmp! zr;d>aP#3;48*JmYdAK@wa9e+QHuVi2B>VIVWjFzVx@0A~vJQDeyLT49zdvK}`_?sl z+O(JslJ5&SzMxkUl9KhsM1~R#$wRD_kO`S&eGbAPCMbeNKWy$lpIf@k8aTbm3Ia_^g zh4V#2mrb8()WO);zBn4*M3-d2SDxV zU^j{HCE|C!&r1|{Rc&p2rQOb@=~FJWT^9LWh8rkVc~#I zc)I73UH3%P*(EpR;?-CoC9nEo{q|>_B1Ir%JLrb2e}*o?hp6XqVadp_mX8JM2UMWt zuTJYhyERosAycYyFRj8tZzyYxQPtQa}I`V%Z-xbjFJ0L2i45zlJNAM+`NMG1I~J1TZ>Fzo>1A7 zf7-8AC}z(t9ZkJ{ks;C49qJ_Pn1i%nh+RVNU@^AW{p?|a1P(P0GyG9~etr2f-G43z z%S$Ss*H~X)&ThV1bK*_-JP?7Q9-+wI^K^hb{d9V(o9{Zycy&>(sWJz^S)D^=f0+0! zC3oC8W^#pAw{CL%$)WN7(JO|+jeF|#ey_ijH>yX#`;%LnO^C-bmfY*XbO_@yQ{};o z1H7P*CxY@pYJ3T?-0>Jz9Z4OC%3$b|B_K4j1Q!E+M1uldF+z)_Zfk}wcn(^AhZ4lQ z^GUnOx&AxBcJ4hknSlG`gl6T_)1|4&Wr*0(dJo^!ie*O9L4_jdh5un0XVKK9H$zp> z4eFNqU#8BW;q)b8lAT1@_uPBU`EfzF4FQd`>-lEw_Grna$LUj!kjussJZk5^}RoYV6Xo!7Z+epeDh zuB0*kc&1u1nmZZ6jn!?j7SbOS@|b7Zd;iKvuvUIbVV=r;QFlxx=YJ7RR#B_YZ>1rCqu4}HZ9w7_~?6I zHXhH4+!h5gOhQ(?*4g`>+@opvSona84(W}p@pdIO9hWjJgtKaE8L1FME=VYt=m%E!a7dvZhFR%Pfri>{K zmu{N*eQjOi`$^NMpPeUg(9|9@^1t#A-m{;=b@V~zn3<(aJi$WCrc7}EPUi@$3=nJ`g=afIKSRX-SjOfcS&h2J^4^u&@#pR(x(@D?t z#zmp%?RQO~WA5J}x0~-Q$E~A`N4Q1&{pDs@JWnBSb9qbn08ubwhnjpS`b3Cm{62tY zYX;*j4!5Zf&Cd0fWbnmh<~%R`3Bk8U-UlO1y)S|y{H1b+K#fF_Ph*^N6g;+IapQ;A z;G2+jW~RcN^YZArr#pJFvKV2T{9qS{MIZIHTbN2ydE*;))8v@hWZ_detoZ<7h1)}?i zW|#FdWj=?S{jXOC?>blQaj%OMXi1{}2w(ilz%dQ@9MT_rC3robQRH_cK#V;lc2^uB zo471VhYpnsbWz~ZiGe``*_oLgzxd~_ASa*BL@VJTKN}L?S(l8qSVM33iN_Qx!^FfT z4Gh3V#mT*aG}l+4exBMOs{7es(R;lZaJ@%B9tcT$6*=Gfz^J+5|5zaQe9!K=?{h!R zel46LI(za%IE)yBm^*bt?C$+x=o?t2gT&1cv1@!2n*!1K2LF~|{%aZA0bS<&ardF+H@*cn}2_jy=0KfU>f3$p9x5S$vJ)TR6C0 zG|o0r6~34+4ujoAh(JKg7qzHFAq{%Gp34C;YjqgOTAqIKJ8J6hQ*r6~icqNy1?ohq zA)-MKwAoKjZPTJY8K?OI9>SXr-kH#&qs7`(+VtWY35zKDI+!4+Jk2_Yb#o@>b1JOK zUH-@&a3#p#G@vX$+a`H_LU+&s9Z1-UDwQ^JW>p;FSdofA-j)jZ~n&n8I&)34J&y zdbt|&`28aYQW67=qh|gHUgKX8pHF@IEA!-`NVT}Glnv0p@8&3Ao*?w%v2T_AV(RGH z_w=pquuwcu=&Yw}?+bL%-bbMM-yE+%vjLyYLM=UioeWS14Cwqyrt{hRm`O4P?$XZ% z8uA}*dLDlCKi&xCS}2$;gG(~#Raew^95#Z^L<(}``7hqvJJ{zMUz8>UyN^>Lirfu6 z$4Q$%l6gDVggjh&WlSvNMadc-BIV5<&p1Tk32wEk zTrBo4g2Qz|btEnME!NnsU^Jrj{F$WWU>0U(q33o@_TES-6*|=%uJ-^jX~Ex+GVAGF z{k!h1CyHF{vGeVrgJ&qHPTKz`0{99RD6D%9dCiICdB67hkOhLnFof^GAo>D(s9AZM z>3kgC21{X>bOzoRy*y<@t2?=>=#_kbFRq>5%|sDEW{KX}h+Yh9%C_2u+^p;yCK1cv zA3OIX^=^-bfU{k^ysicIUz*SJs%dXlJ$|C`{gj?Yu;r-A_a2>keOiK|dVE%cr(=(4 zk}Ud-SIBOPVgsG`jlPZ1eRf?V6uy!;e*tAgV@B|;fAG)ifByyzDnBAVRhp^7`z2za%!AxDw@@rzQ`t#@G!0%LPDlPcCMbA$1dz;A!Jmzr9S|n73pt z_sv*PxJB{ewtEd#3g#*-lU{Gb5Tns3{6_WnjY3X%f*xE2zaKR{Kh`z%iUuaA8z!%I zxYR7teGI*b)y8b%eehZUg|cOx8>fvu zXK}Yzkg{ao)6e@U{FfgGv)U(t+2F!cF6&R4sset{)A=#8vb^lmAT>YhOuO|r`&oWy zbp;r!We3v-AU*-%E3#V2q7A0fQ9Mmx4U%hg4Q|6gfq~uuPofapsHgr1shR{$bqJja zKMdm}AI?-p$%~ef*m^e!vxPVxs6a|m2T%{hCXQ)&+)bt)6IzV^lYD387 z=4dIqZ~$yvmgmae4SAA67xgVm;sr*TFF~=ibzXz2!2K|eDu1D~ssHss$Z|={Pq)W@ z5Pk_s{ZV7@!-ovj*%PSe#+s{Cesur6FDo3ABKW{R{YU;luiNv$Z@=vdr1@bo&wjRZ&A573ebb`vUzo`+{_rTjQ%6 z+1@$^{?4&+xxaP75V+$b7 zaM&UmWDmLU=tibV+MVLt<*Nantsx0?w>3J@Fd+l=qB9GAI%WJa# zrNnO>;vBcw3x)qrJK6n2+^(3&q%?BQpy{SUznjlRPggrM=wkJE`|oydmY<(}HvOUa z4XUB^zrH-u8fU|y_mbSr;f0LvT`oO68+7}W&|5s7_Dp+)^sho)5M(gb$w*&cKaoZ} z3Orj{`Hp0Pn=#s2`JuChWLTEO>FSlO?^pMc3$Vi+N(SDpd+1(Rc#u}rbesKp>^@L> z&NA)5^|*r6Lv#7sZi!Uine<4B^s(g@3mubnTjcU>Xju#Z10A3f&a?M*rh4V@d@DBK z<*-g4daZcH{O;V^#UE-{(hrhtJ}SyCoQjvC73=q#ujEE9&(~0omjC1aNL%;yB3?}F z3H)l_uirfl9sAj$vClfM+zGTY2BM^;t82rRBO3Jo==$ogD7rshloF9nNtG@^I+yP5 zE@`B@krI(^=`QJpr5i+Y>F!QhYNg9`WlfHmdd z*MSO! zcS2N4&@|MTFo61CHh^(!VPOGS=BfC8oGeiTyIcowgxM|vGdz0+7Ox@YYMrjDNytB{ zpEq$4FX0wY-IqP@5O=e#M_W!GuiX7_ZZ@q3$ld>hGxI}6?S%jcsZ1Z35}RH2CueFS z1FzsS=y(lXW`JH_hJ=~>5}=yAMAS5X8mp~pN`8M9{*A8}mzS59l^sEf6c>LvedRzZ zAr2>Crgk-P-Fnmt>3vUMXsjn4>nVW+d|C&Aj0CRCO-8=6n$`DNVWf{%lQd**(Bxn& zFCY2h7>}3FC2FAqoKqH+#=g}0q6$d}{ojz1@#^^J7Qk? z>zB{!>1?H;bRS@e%vSp^#RLd9(H;dbx$=q%1F%bp?c%;mD!^6>ST20!Kp%R0>yw#} z7MIRmU^y^C{~B&j2+-bTx50->0C$uvH5D`Z3UEAA5T})WfuG^dXNU!h5vc;`uWAOB zA@@NM-1s9PZj;F=DQH7_{0-qeSN}&Vl`D<%ybvP*ByF@W%NO3OhF~Ly6X%-}f0-U6 z8JWTP1lC@W=+e-vu#h?huJe41?^`0jlvJ~Xe7!>XLbTrT?yLtx;!B=&fZ7aMT~v}4 zybg2<0nMVf7GB#_oRERmOcb$=_A)oZ&ysQO-!lMRF(!f5f&D3>Z5u97gRy`7@0-;! zBk|)d9bqWqD#pzKpo9rSL=W9U8)zUMXs}5Oj>_(3BP_v~GNTmk4GfN*&&mBf)K9WP zXz`lCO>|<-#AAwGBgxEWTIO{Ko?h^Oml=1Y6JL83m@N(N2^@=bJ_*KHL=}`g{CP9s zQwKKVu(p2-k&?6GEviz47+KX`pbiiuOg0T;qaYZF8LUXVuzcW+S&K1xNfR4ms#2&H zDM}gPwM?nxkJilMkt9W*J~q^Vt| z*DaLRFv$MDuf6a>9F+u({2Rfj`5k01{`_Sr3py=Jbv+?MwG`F>pM%b!&|ikRzp7b( za!N|2*hVR;-(j=sE!^L8v*euLJJ>n1l~<&#)CesP?m9P0N{sK7 zii?fDrXH`%p&;gEPWx#m#x&Xl*WcULKPDXA^3*coa@+_cB7m>>TB}ORp4x@h_RCh2OQEFt& zZWU|?f_OARfVB{H5$t2vL$q_N2imPo!0LS&99!VUF?ik}?nx_58uKNT{Z-a< zyj~K=E62IDOz8}xi6C6`XiyCO`Yqk?oI)UV-|c7dv~0WLT0KzKkZH|4vUu;cSaBOy){ z^f&DX@#P7L#0IgYxTh2|HCv^E#Fuy9N*ho=tYSv`OsEHOZ|29&H^h>cvfLFkVCW0? zsw6qQMhlo|FCWAaZ$S|!Ox+6bOvpiLCj(>zCCvA!gxz`WAOc( z+*jCwSr;}8r*ly|8xAtka6~*`wmgZOTaoe!Q})jrwAaStW!nY<7=P(#Gmy0IDrW(3 zDk3_z%w7%d`pCJ>Sgm*tTPxy%-5TV^ca~%5EY-p0KWz^1a>mkXti57?n{P>CdSo3F zsFQ=B9h|G+Q9Yqe?)c##fHVx%QDTVJwt!qL0N%8-CWO)Mo$%B<`sw#CgLS~hzoZt! z*l`VTL7}rvD2`;+<>Pe3P2fbFCfxO2)EFf_oQLPP3M+sN*RS@;d8~y{BW~=9!(X)kMDhRak?2&K z%Eo4$7t>{CAtHL*TCXtg8bO(q8e9>d5Dl<@+3w+ZxK(0GqNkpEkTJY&&-)Pkt*2M# zTlw$r_j`HXe&}QB9E_hDBKga&sR|_XwZC_E=|YG|Vq6NO2%+K$nX6IWP?RYz@mRevjrg>N~<`srfY!3yznvI!PaK#WQ`*uEM_qa#A5QCj% zHR^D!Pn!QhR{xiP=wh&>>8sFc#wodNY;~?wEN=EAk^UXNBejkBqiCbSh(@qOg|hN@ zADn6HdYf_)kpcCnND|&ekqB}G+eySgSRCC43Bm#HoQ}wz97TS~c>C|!X0KHy8Yazf zo3_4S>*@fAoGGicNErCxW@CuLjxH)TxTHp&ubq3A*OosMU@e{(RfdlTT<4OoZ6Xe* zEdT~v>NxKwetsfGOgTFd zFW~9~f8cP78OEs4U7wo>%Yq=%*$6i&1BK|pP%rtCP8ObdDx;M}xC~b& zHnqIWvg)(hml+*{>Yo?NhM`)Cj1y9I<7MB3=U;^OoSB(Pk(x-$rHdUECn@p?>?;Wf z@rm_?n++$)XR?MEoB|LT1%}{wxh_|&%)Ig4v0clhA%IZ+qcSi1lx+q#UR@P#V<9fM z!TSC!17%Byx)KJb+NalVSY+8af7ii$#Zs6lLnQJU#7g+t#qx#G7Fd1@)oS;9$^3L? zKNE3(qiqO26A{%8kMdFu!38KtcSz93p#o5W*wKse?Qu5D zOxjSzMqIfe3+EIY4f@KR8lE^_N@Ce90}~m3y@?d`AkhyGU9W3%gTrjZ-=b0&1vV7Z zhKQ(B76c<7&rIjb| zwJwiQ!N+sO)QeKXCk?^LN*F*zY*+O}FZk?zH;Lvuzu1RZVR1Cw?)XnkR(52{L!iG( zN^+u;pEhRMA1Zb2d>=yyFnG7l&;Um9PlY%CV{g3UF2HCe>%p8;o4X`}+?IXE4DbJP zxw^VOKRsIXCA$~nSak1)EN#wtt-t9gtRduja2p3At!_@m)D#CKVM?uQ$sPa1nK%Sdo2=%*k`lA zmy&Pl=SZ2RKG((Ka}~JqbbbrQK8E~cv5=Y##_-*Jg5mTpu^GTf|3l z%|vV7@Bc1+bVHLL=Rz35ud`h1l;87h)E}7qvjEmfEkr4Y-A|WQ?wOn#wEaVeiRK>G zS!Ja=9lT|3Kl=mFBeKp{3l>jfpgSKxHP3fa^>7zowB)cU4@l-`P{#yK{^_McGzFFz z=#Di?;j_{X(&52}P0%EVdhQSfssc5{hpOw2nawHI>RfAwFlDpm{bpaI2uy?xK%2ai1C_F~$Js54E{K!oi@u;)yVC(R5()opW z^yQNc>Iy1!bSLh8%I1w7BgE8qR27bSFJxnV-d*^jUD8>}#@_YfU`iV{qhOss!_oYK#+4H*A4~As)EiD_x1@+>{Ela{wTpT|nG;pn|h|8CY%?bwQa+k?X47kRJE5&vZ$NGne*nLjiK%;5E7JJa&Gk9`2zhu*>)P;qyBE^55G1>7dKaeHW0uqOt!4)&c>ZJ+Jy4;yF zT6h%GoH~R(7+IaVh{Xxnh+67>4#2x5fqVCvy(QGvO6v!|iA7KR@~0;M63oNknX2vC zJB;8EQT@`R0_!5`v&u)PbT zFpf+A9UPtG;c(-n#<5;%f6+AyYe{_-qEKj-rb5DO_jPyC|8!tHyY1AZY8)y35lZF2;B%J6ZKQd0>i^8A+UAa1R6+?u#oW{sO3|d2iO>tv)v{yDd8} zH6fFG-2iBIVe~Y1zsM8c zGpOKe#hnFmmlp4|C>03feOFS=_IueOyz`BPi0XF$P*{gjqt%zw+6LzR4Vt=pgOmOn zf9^uaE?WM+Dr+{*hj__5kj-tpfnw~1tgWZc>N&~sSa4x>zVFo38-0#dQ^NBeFZ@Fl zMh7uoQB1Rd%YvPXe8)&9)9*s{-J{bzB7xuLO1?F26$gFG`9g!6bd!L%5lLae|C+B_ zW2)9R^n@lXn1+mGqc^sQp)34vwU{P>A<8!~wsVd+RN7xGHgIqZfqp>^tH!(CJc8VJ ze;^71eF=k-PDPLX1&_vz#T-(J!OhY$GW@ z1vE($3jQ+bn%3!gnf}4`%$m{eCdw*-PYrFaxXeZm7Q9(8)gk(GA z&QFh{AsL38y&=n3qIDUxewjh5E-9zU>6FLzkwaH|;|%B0S}psnkwCd)&-?RykvU@} z6=g{#g^T@E1bNEz;G4VPzZzPcN%218pF`oZ^|*58g>+91or)d$38FNe9w=L~JgT20 zr92WRw4|Byp13W4Mw2|4?Wc z)FMjxa4w^7Y9i~w*jXz+QL@^eEE41dp9iN7@JxRp;Ym>3@>g* z>0wN+_Q~#+d7gm&(8+|x9sgyYya{v6FNhq@g*YmXvJ}!_lf%sZkGIfRibnpewIBt)2Sy6KcKI-y`sv~Ua^F3G z{)PPp$Pj?Gt2jKV+eDw$cSjqd{jaO3lszXWyWr;5Wh1%J1vb1gL-VE`rE5b=)^L%x z<}n_&ZvW*VYj9pZ7M+aG8BTz8>*IIt!5@W0`ey9nSq}g^tkl%d(BOUoCJ{s5OO8oa zbb&1+%^KIKnHhBQ>S@52b9z5!OX>ELQ#j*K1{XjDastTzKLueRfVWd(huySSoSjsF zMB0aPMPxEC;I!1s6fmOH(H}p!$ZI^-ZT^0dy}ZUfT9}4z&D&uSO_uy{PY{mJ)PCCj zMCLRo3_Oo$!AHsxVt|1pYaBQ!ERTt(nP2Pr?;F10O?VD$&W?{$D0=dKY9r7)%LBeM zj~mmHb*ZxZies8a%s)msxNO&dkWWhjn~vp%cltgH;cSaGl zVl#Nw6U}Yj6Uim8p0C>eaHU(@Us6%=2uQ0K^}$pB-5?n5IpaFQ%a&0e7?`TTIk=;S zIi2TMe5cRM-`!E|EOZR?=&}$B0l~5*qshEay@m9t|1CFxrEmQUAXgg`sfc}&!_u6B zN0hiXmT~0o^_NP)jkBKTvTb{N8(MAH(LQV7d?}0^^|TeQSl87P%@2Nhfo$J!dsaIN z;<`F&x+myphoyc2G)>8A7^IH9u>-AV8?ug}BMqy78Vf_Hd3xbeQ{26{!O_OU7WcUP#R>F@WU18m_Dif{QEgnvb;(R*%Z zRnEDk*?QpM(CB+iC@S!;H{G4I@nwx=x%}Oqw@KPz)~Z@7^j})4v|j~Ci!VT#KKj_@ znYmj(`FJ?LdJp635WKGveR6*ifSxn^KP)m-wz^%&&#rn6cbNM=Tv8?L|7&Ok!1*_n zZxP{sR-3rJ<#T(pPoM~T{EqcLC?TXEd>7(U33`ye8HeVwJML2vG{#v2j6s3(?kFjz zOR*myFX$g2SA^{6q}hW$_u>ODJtTzS{%k8=A)n`|^|o-GLP8;v-we8!v9~$M)Of$I z=qH9lAraAZy>bT>zsH|U+^h;7<}ETDXHts3?CxgX!Rs^vnZSkq9xFV+N<`*=J?QhZ zZJvcvx0j3rcu!wipkecUR?fS;NvNrD8m_Un{&KnLecJB7DQH(12F!1O^dRi68v{M~nQ1ki{3~ z^5D^pG9d5ufahh~Fu&$HdtAweY|CpI^a36#P8vnTp|Z=@fOBoKcB%X6_{;6M`w9%OOBz-Zi|UYWbQ{3{%r^L_8k{?pe+B}L`|+a%keEbRh|9vpH~39 zY%!JzxS6TxNC9^BR-Wqt^4}%FWDGP82vDI!!*&!y;k3l4cg6lM;AXffEn@s~jOij1 zqPlM*WrjG-+FWOS_xmh5?hi_tByC$(zD8cJSlk1ux~H+@#)C;fpm+XQAq5To-0gNlN{_W$x__q?>2+o3g9@WNYl>k!4Z zY-8R2&k?+_p%q)@9@*jPSnO(IWga0KzOyg1?uyAQv>Obrye_#Q^p?iQGdlyasA+xS z-+e%Wz$8;ElLC;mVK_7;F@i+$z)NPS`@v_L**2AjnRFgegO zGuwk*0Gab)8DxMS=I#@6y#JL^r>-d<^epOzOJz0g4hHPktFw43I=v8i0z8#xhWA%D z&*cb>x8Ev{nlzgP04C?rW<;MvM*f9Ic6n$@h`PIDQj?k69&}d@j>Bl|r?J z?;a(-UVX*$gKwa8D5LgS1$f2p+66YP=Ms7%;tYKXUYjd-kKU)g*YT5%-RA=nAH48Z z)d4HPYDdQ*c;qA1bY8wmefL#e-4v*cJ|MWEvOQB@U46M+*VEW-F7C$bD!p;VGfU%i zzILE?tYfKim3Lq5cb#l|Du?%Iy6555sU~+kQr7Uc_w|9*0##)zXNh9gN{PCQRFNN4 zTAvzHY7rebliQ)m;A{>AnEG5^av|IEIwU?t4Imfg=hay=2bps{^d;At`<+iC!Ow6N zC^g&6FP^pvI>ci?YB1RHmBYDcn2)AQ8%jT?SbVSBHcyyF6MQF5k%nqrBkZcLq|Q(Y z&Mq9CG7psF9NY@B0S#`KyzOW`Yj$2jRP^*)^E3cu4V#HNX@j{2A&jfnT9+)BjtnpO z!ejC`AoTYu4p#fj@Nkx4bG|_yf5Rj-36oxe8JRnH&nst_pa);g8>b21r+42x8C7Z{29FPk%TBq6maB`Po=r?V-Gx^(WdYZ#L@?xk6GW5}w*Z=W8 zgt?9N)8ox!LP@EE2V48iUqIl+MO71Lkz`}9lfg@8RW31*qrDNNI;pHPH2l@hl+6EN z9t@Vt`-CgvyzzRzPgPx=?KUV{Zolrhu0qEk3p%spx%%wrGNPhw`ytb5M`U2+)SS)v z#aes#-9!K$`~WA)fDAPwz<-2iZp~|~aZ|s)Amw{UH5HYBsKKDNY$Q)XjsOyPY9LjS zCGA(_Mjyg#0O4rvqOV?Gj>LV3TWz4Q{qK6>Dt790Id~k zoMhxu?!^7??P0-N8(5}y1jq3=u@BX(7H(~>cjW$m)(gdE&KzkUS+jLhFhKVnOD86i zh2o)Dyyba+@CzBvZ=uXm+l?pC(erfTIzu6YWB=FaRv`H^BG22p7azNu%Vp=re7VtA_; z;+Q$|=kO$ZteVpmZ|Dz_zg&wh zYas9Ac2nts*Cf!bd&pR!g>!RP5K`2tz2dBE$DQ9JWURGmdXUM$fAjcnO%190ocW=$ zt{?v~#KO>{prPSpf!KcDd#Qq=f$%C?_k{bTxX0`Iq~2!!FCdk3yy9|(RX{9?NE^Hl zGpsJ5Q!~CG-<{jt%#}Rv>tw?W z=s8W+grWaIZAqByGU&Ry6qSG}_x!YephA>$F~J-Jy9q|))OxBNv+x0O*>}>=R!kc8 zy`Xyv7Z$z`XqTM+U4dO`==ojj0=SC&mrI@UoJ7srXGvZjz})~s;2=5b+H(nFvZkk% zWpE__=>B`u+{Zlk?CJVOt1O?ZoyAiKJOWb03L%d#{T2o36IO55k>nO z_Q8V0VM_vZ0ZTy`lC72Kr}7A;6zC2g)aUcHJ`Xd7Kxq?T=}dROvKq=?JPOO>JWnZL zzjJPjG}#w~gO(Mb!AkxEH6yC|cnB&%A}h>-7(s zG+&x096kL1hT6AZ_^GR3!VWJ5w>lpzDGL!(+dMQLSpgHe`m)zR8~gd`;%Uw~L@7-` zSQT{hT>*CUaAkc3qg(pudIJq6FdxZ;RN7}9H!RaGy5uv7S1x%Y>?`==BF+9|AdjCSSUmo7kZ#v)hhTF!&(V+PWda zE+dJ#vckYXSC?Yr6>`J)EK7$)E%Z|H%goFfM%#fU{M7pn>n8UU$w((6#GqUzfR?2m ztkG|BIR8fchBm!<^J>xZ?5PxJux-uSz1X|?qAW50EOO5yEA76t>tlDQ<|8onP)To; zpfCgO2&Qis>Z%u^g50(@RU;+ZX4_7RAFxjDRw)F$T{_m5*f2;s#(KF{3>sR0e|J>Z zZf2aRQl}~kljFSWnz9l_!T|4uTDVpgzgst%nXOd>ty|V4SO&_ScRNlV07G`zpYkjN z7qaok_8GaM!|3<*o)y2w zl{hgv<+CA|9R`v);xrB;NCFGKZng zBNS~p!e-4tzEYgeC2ex@+iNSU;7|9UySna{!twqpHBJY61dkQcu-V4 zO-vfvCz}+v?K8EG{BRRkdv|?$y%oGGkIL?SUUqMWDLP9tQiQ@wYP#46e5NtTPg@7< z_xg4%@LZ2)c~%Q+X*|wWiI+3Sl^qk%&V#^`mE(QU>kX?zUIXNKoU&wz{OhqhOAC$>d9^(A{OVYN# zvf`rD`oRqPD~F(HH=D;*n_`GtYBQT`jxA}6&kR40j@RXdJDDmS~xp`KAv zjZGaE?GkffHk?eC?>H`r|H-mVPQn#UKj#Rx&M*1|Z{*{H<${IxX|s10sBMTJD^jE9 zu-S`og+U*kW@e#B8En(UqKaXtS#yB;EZ7DZVBTsP7&O>D`I)%SPn3O^=Uj;?V`RM? z`ke}!V6Pb(YN85qXw-L4xfzR6N%{d{j~E^ZNuw*$d}OL#+-iB(k$P8X;b!o zg@{O%+sPH4FoXxmi%r7O47a7Eql3qXySN|FWA_W)1*JS+E4Scs)vd5RyM4LmQ4m;Z zdh|yyU(!y%?SXUghGt0lEsYp->C7*IVoCATz-4KWv1s`%$Yqerd8dBLvzB1&w;@tU z(?{=dO1&$wX&!k+B{|vIXb~>4RlngAm(+VRarRPvYJp^2r7Pu*ukeaL~qGXhf=IVq|phIyvGX(S#bj@IL@7GNgw6!nh2 z=(Fw%EAmwK9{HQ0;E@z=l9I*`ZzY^>Nqn7mrRXM1i8x&|&q&6GfEej8hDs$aPi(;E z?ekGlwr1WGbiCc>6W6Y}-!k6dt0A|?nfRnU1|ej+x2_Mb6b=SHvqMN`Jr@ zSrZl&NdV-02@;hC0z>H9tsZnKrjhuLyhDAmQXS*bri=LyI*v$7R?g-jpAErBCZOi# z;rLD!O(wo|nLW}ApFOhdyDGYzFZSuJxjYVA+r#J`FuDI^cS3UwBL?<-z(=d(XXw$b zvvka|G>n+LN5%hWZAK{XP1rOf(GvOg;U<1822;>w(0ucXP_&S7#LxoRU1#561O_8c zy;98T1_4qpvzBK53mXo8A`YF>^!hhS9cPp7{1fG&PY_1>kod% z<&C_l^2InRS*y=~M)}5Z!u?kr?RgU^Q9T>0`5ILciqJ~q6CdxxD@X60@Q*pdUNT)S zP4?CPO%^_67ZCo$q%ZipTRdDkJS-&chF81F2y4LkVUzPgD%wM80u|ZNfoa03K%e3T z!^(rXzvq5;_O$fEoa-NjEI-iZRD9GlQhxMaFcX*hFZsRLqO>lJex-x+=at-#d?wcB z{B@()?u&Y<*JE3)#2R(nfeTwNVZTsWo4@8`VvEJqeV#&HWwYF@`dM~f()iBa+im4< z#FX57+wQ8|F&VLy3-R_>9j|y)i^nS7d3v1;$X?_onrg3M(r687Swl4b$^jCmMHyBCbsZ=O**+7~d?R=cNmwvPK>N^2gw%R`41i~az)n=iR)`p1Rf2^}^p z7wrtJ%cM2D&L1E>PrqfZW)3GZ;t6~N?$SJ3BwpS@K3I&4ZWb1NZ(g#ACL17em4a-& z{GHys+Wr?tY?0xI{np8}{qgqKp)T1gSsv$IUjlzUo#sCY=mOh?vvCE9rY3@qy|pxC z{`s*=;Y}~(zi`GgNxsSRjaIFozu09?XKQ@?#7C+E!`B@`ULLV4#u|xY`9{_Np@2C^ zHILur72q_A?C}FNGqcykyytz1h2?4gNliRmDqh9osJCi+R>xTxM1hf+IgRgh(fh=| zY2Hrk1`(pk-NppJ|w7Uzx=gAX_B=aY*-ee z8@VJB7hxkcP^37#FZ z?$n>*QutRzD{EWC>EIwkC|z2jPd?Er(P2uoQ0nWLBZ0LEG!H4ju& zwmiM!Cv(@YkMr4BWZoBK!Fy^84v#V20KiyZKjDWHe?_OQNj&kR@qCb5 zmLG+s;^jL+Wm7=t4B8)Yw*(1ndBWxi_PNvuXG~5)&g?_v@g;d`1tK zdky>ZyN2`Drq%WOI&Vd5$8Uc`qZ|((#;;g=$vIc5A6OhHQ)b7D9(H z@L$rrr_$2e$BgXZ(umT5;Q!5ccc_@C+9a) zdN?>G)*vK1pS7E|{n#3vXJu1SxjefM?y4^>$_-;@x5^Q6g=~56?A!0~kJ= z4^FuffpGM4kGc1ou8(KNqJRzKXs9Tw==7Jq#3_r`RuI!S+ji5TNnQJn@ zHfhNIL>?b$56W1Zlw@Li-PN2cK_nGWB;-AA9}qL&ucuUxbzpJ*7~xuk!u;>=*5I!f zMN}F&3+B-{tRY9Q4!sH6ZwIn`+>X&2V~Rg{4IFRWGG#Q)G4R43@1b4G2) zsJ{a0JTJR9g=$cTaQxeL3e{MfH_;b;&bP~wz}8nA+PA~mm^_(_g6C7Ux^|yzI`Ht4 zZTDeeJU}r_?zJ`4xSAn1djTxG!a1UFqIfpe2QpKkJ1x*Ai$U`s$v5P`F09Tl`2Y6S zn5moXPsN6kP8CzjGIX@&H7souXi{gYtqInM=nw&&isu8*KA_L@ci0)qFPYGxXk5zG z9Gm>D0HED_8_(#Z6UvBo!&*KuM~abEVn_aui?AJmyn3T}l%5neF~&0q@lBXRD2DM_EGkX(QhCI16y z#JE62;}zvmd;<1xup=$~RXlFo))q+}6+`l{^@qt$RFVOOLKT1wS#EJJx)TSJ=11YM zdtr&afh)kiWuEs!L>;Mrt)taae|tXJZGQg2_Z=qyg~E3(d?SmCw_O^PW5pg*tmBE> zSiUZd5ibwJ*wa3lt=)Yt!_QSNyusC?@mz*N-vHb7bVN>Z8FZIPB-;2Eif8pZS+vl;0POBEyx@FF37Q z4GmYz2ewy`JaQCxhaq$@!ek~_bMMMldI?fh8Cep1B7>}=ktu48^wG7Qz&dKiJ%56kx#T^t);))eS)@C4e=2kVI<9Qm49Z*p zFbFOP4ZRHQ&zAzDVQ<1G%cdeEZ4q1s1-{9P3t|6W5QD(*4my3Ll{y)pb9XI-g7B^S|t_#j%4wi`)A)@t^G9?{Ah9(sSjuh;=c`_+yc$8tQFmP zD$-oEwAO7^3~yTpVn0eJg7l{4x}mu@*oeSBsr_^MZbS{YF#y4u$yg15B$^Sq69Isg ze*9>y%xa*{GdSa}*VU!}7}Ve`-l#I0t6Lb!xnz_)!N)Gc{=Ah*9oNEEmvKt)77mp- zD2u>KRPR!t%fUV9 zG_*Ou6mp!r>>}aS=q>7KCNUSLs3&RB2|G-k%n6mFXe4>&<-WQphP_0dWsWV& zZ4l2DTd0?sdKdQY6j^>aR;%ItL#Lyhj8386u&al@I&PBzIQ~puXL;t$eT|zI5vSba zTY}ha66AZ)?$E)vnHu)%ie=x&kqr-Ow2p8;tka;}W|`t1ESc2@q5hfVjk<}*S1AeJ zTsY|Yhl2nv4)+yZVgEgSnO=+yR*cO$jjhRjut`3Gjj+#;h6E}6Sz{}Tj5?JtZs|~} zm&knPlzn^@N#cRUKV*zH0vV|PtmWD3!HNI1BedC{Snd9?i%7BZ;T2jqtW=>~BWa3S3T?D+^ zQZRcy$aVnzNqGL>D*(UqBHNbbewHOdAFe0ilj2Pps36eD`;kl%`Po@RIaC0|J#ATR z*V~sUMvFqk>sP151!1?rVb^)T_L<>wUxXO%unu11^Fhl_LLSn-`2U{RR|QdBgeVpq zWE8^G=$fY}9Lyg|m}QMK)|XWfma+nYKTr@5B=aBN4#)eF;cD&GYdvmuP=V6I*WWLAk?9Th`bHq2S)~R_ z8>;NA3T5>Wu}DF~Tg}X$+$9savdqmt4gUA>1%|8Fx?(FtMETf=#R%)DUq^-4sYneD z{6vK-YYmSnZJ#w05_J(YSspI?8@I4rt3*z~pjv51`X%Do*LPl!tZT*cWo8x-H4Fc* zy%^5clx8C(6i6^Rgo+B=iCFLKtM0yi`a6bDsCwrJm>tW~`T;j;ZvZ`IAph+RMfo+G z`K$o`AH%cxBJz1R_y_2p+EGs+$VKYYC-LV1BEVof_hrnHiQ^}1Lh@P1YZ3+e{of-4 z^D{u#UdahZO{h!X_qJATsvo|^zNF6Kc>HzL>Tnk0!^K>&dKcQgHS9Cm=zAL(V5|4vx7pe2kRHO?jYcSDP#!AC7byan;RMystTYX$MmL9Aiv=LuV#nudI-TRdDWv;QKk=IwB%YiIRexX zTSbE2*KOCc$E#2G7h?j)Q>xEvKj6q_sP3kxH^)m3ip2K3(Q(iylU%Ghbmsp>Wu@If z`kK7ZC9o>9{M57E?z{OyncZBJ$s(&+V!J4PSFz;=a=Wr?ka~Rf9Qyk}7na<)go+#o z2cO?m1YEA$@7hE~HPPw2gMzrvgEybtE>}Bl%|`(XtmTbnf5)bvd!{4I>N!`at_#l} z{1-6FuPOT9ivnO^$+mP+`cIwLf-50DRkJo|D z@V*W3``Q6y^QfYqm*c7{jLc*0raMxF=2?ba@Bg%jOfDyIc;qY*L0H{$wfLV&Mkv|1 zPhCxehZ6G!*mrzaV9X?-r$NiPid##f9zz{XDy*u`x(Jg2UV|MErld7uiByMjz(2Od zkI&OYW!oo>X-Y+930C@2RaTWIVLhMyAtns+YD0ipQjH6bgi+b(w z#R5;rTP~s;XDs1C0GeV=cy%5Slc+U7I3Dord}{ z8sX)vd@(cF%QXgl?bQ+S`@@pS_w0-I+=BRGTFZmmtgVr6Y{TEsTgL*Hr%8Egt1kh} z2Vq{OS_dDoyLK$O=ZU~&FYiR<0JUz7!(&+mv!x1Hi5j5Fy|T0fbn@#yNGq*o2fM{5O-iP-*Bgu=o z%-3v-sjIs(`Bs#d7Cd?6HdH7W+&4E+r^c6*n)H2$r((@D*n0yL6Xa20?PU-fw5a9L zDfw1X5&Q9gwZ2ZG&g+}^7L&v5q%yl;o-TyxHxe5wQKo9qBJQ?Wf6VkYyC%_@Vus&L zy>&O~T68mG^!T+FgRr&AI69D$8XN(LZO8$E7kf?sJyZd5UOHGI5xruS(SFE(2@MAH zs%`gw8E7(GL|VW5eUfUGYO>=Gb&-T|e?S-8Q;^rWqskS_uK}sj6$~jY04H zH)@)*G4#fKZoG-3MR7^hZJl|2M_sWFB#X+?7&^=@zH7yJ@;F2-Iu4tIY~AL9m^8-o zF39`ae|h4_r7Q+_YU;GlF;RMlyZ`zs#((w59AonoH%P>fgT*Abl1gNvTo5w02VD37 z0gLPf8v$4a%y0`A}xxe_=|Ii>nxT&#NH!)>l?p60fMFa?NHUC3P=%#ybWN4Z}*+$c?#X_w|jSR zpx(p-Yg)8xnLPX<_~@7QfZlZa_+;>SA&aIpa>Q@W$|vr@KvZKOm%XY#N;N*#pp{tY+P>KdYkcH@4NM0Xp6bz&~%vhY6nH1p4BlQ5_=*o7q( z7@-HMj3P8Wa8^KPR;)o{GA8ZfjOzRSvJ{h%p$aKSm?58AD=szY5+TgJy4(RPMNT?O z2!&*G@W*|Rip&ZGq2!joek7hYc32y`J6Brh1ZPW< zdiI_^IrJ&;ov>I>4f36~djH*`1BP;fkyW52yf2T$$J&@%px6MV_~h;g1OoY=cF>$S zKL#QKK_@_eVyf49$?^s($)4d9K3bGG9SXBBnPB5>) zXV5(Jq^Onk5EsT}B_A#lj`}#FSZGNw`#T z21d`Mdd3sMV237GqBapPd3||Ot{r0y^@%6InWp?lCL^D8C}snj!0ko$gAjecFfuv5 zWFak1T7rCvmdlbb5LzH@r{&*vnL3mFaJO2y;;|Xof5K_EcNUxfHAa51T$d}=A5d75 z`!50MWZvE1i0xquy+5c&o+~;h4d|elvjMWB^cg`9Bxs0CyO>cT{2A%H$q z;3PPn>n*!!mhXTd5H03?+}08MHCf^GGb}Rz2nK`w)CmiF>DQ<5MVj!8W?> zq&f651Q`f@fwGNdvRQmY+s_G|r?Y~7Z1KCCE=%f{@NX~KuA#->{MDg>HhzTaYnB=Lf<4OMt7I zqy|0M^lvJHYF(_h>$z4$be~hg;NS|X@cFsr)KtVoWRHZL+>mb5`&|&|6%qR5=ko)k z;C^gQD0asN)*O(mhr1&Kf!`=x`&72WPRse+6%ZI_z5FW!gO`Rrg2||Jp@9Odtt3T9 zgUZ)aq^=A+qQ0^|((Gb=S4Z!#xIuhhlrRpuy7H*1d(WqXC}!yL_rh(7bwxCNT$f(S zHgX>sZ8#sH@|9Ee*#_rngC*vb#{UxE$2+tne{1^`y|0=Vr~pb1DhlsTK`$zQ%IAhBP*Yv!eGxsLvGnoK6t@bJ zX)!Yek#CbxDxZSro#4$H=xQB$J}3;e&lU1xg6-C|;tCxbaj)|L4~M`kUd%9XU$ZVJ zGV-xg%sdSzz(6~gK4uyOaMl%G*Mr7s6GtqxIht zO^xC|JeOox-zusbzyVMMay;q-tqgHA#&Z;|T$>uP78tBo&%K<5Q9WzYQ#o2hrTcjR zoSWt8doKzx2=J8^P5(4M6K$37Z{Cihz{+%p}WdePDKX}%iw z4Ab7kK0^I6PMWu8h`$=5nv89t;%;BmWdjKa=M1S_Cc^0RRN@(=k7R{+g3@A}D+OKe zqRewe1>}n`nsuKKU}{Ln{s_}BEtYM8&_(bU#!?erGdUS3(v7&-4&fD;PLd*ro2?h@ z?^i1?!{vqnaKkm=z^3G$%x^zwUH=W3^l<8XYw1n1Cg+SVr{y)Se0^L?mTu}KMe6f=c+ zZV!(nMmqdeKhly;F!y_YvrsIR=U$a!;r%E?g#5{reiXx%iWS1){w?{hF&zcV8R2>W#2)njS7s9C0}y zLr{AtjuZNviaeF5b2rrz*h5)7CQ4CPJ=#aonDiK8as8`foO}Jp32%_;;NJK{8ZmB0 zY8Xlnki%580HhcQL1)=rxdwkv54>&ud+u27oW@QLfnup0(umB^G9=)E7D5+Fhj55LgxJThU(!x(#)_U(y`m=*Vj_AfUE-C!E@WL zyMzV9?Auk3^{Go>NBGRXpi@492S8YX;-59hgr5In_PQXz7AO#s{`DgW~Yq-sG^`<_qZ`@;r>V~IP}ip`klOG+E2NX|rp z;f4Neh?Tfb085~UeS*t?o4Kt9a8>1Z?X3BL&Vdq@*}F@LnR2C5RH2;ZipP<7celw_ zhx`%q(XKqf@G_uY;#Yrk`T=BhATICEid>z7@2}X_HNU$#nK5t26kr{IWjd$&fSh`O z&euBc|9h&_1bD;;GT8syASw{Tv8ZP1W!Op4KTKP`Y*7z!+Z7?KMDE&m(a=y7IvPZ$ zk2^p*J~OT!aoE*}!pPV3ouO z{ljChjFXKtrYj9twJmz(O8FP#{M30MpjOKBHc{%SpomN??8%@I zc#LUOh=km9bxiR5${`bz0wzu`s_^9x_VI#D(CwoG^VdIv0C#a-dTNRP^y^rPqMYdi zfU)Db`Gy2Qvq^xm&=r>n!K}~HMRyLM$7+Shk`|8(d`-K@y*&vs}zyn@}{bR+z3?XMq0ewzLtrv65RqmfY4C8XOtAJP9)!m;(t|% zpn4Y41c<|9>~&7EU^^vCPx@gXr?-#DGA`8YVW!#^RCz2;%cPX0@Z(^ScfS_0vL)W9 zC>7KU4Vtlh$%hdiijj#2UpRyqbYD|c)wXD?IrZFiJ+?HE_qB$gI7#5Zl>erBbCs6P z{mjbUo1UybckNW|#%2z?If#SeuZ!(cWcKlpXvBL#d}04@K#?R+u^<5|lIe-te}dIK z)%@=*KmZ6IK&Z)%7k~uN<^qtrG9Bv+QNCO*yQ0(vr{~e{ ztU4oX1tJnn=cek{m9@XI^1e)zPndD11rp3$9y{y-rDfqv(BZr4zWCs-3eKS>$1+VO zb~w0tt_&9AphcohKZDIxgZ~xUowr3nxnA0MN$5)7TNK7@E=&0_I0SXU#qYB%xj$M` zznUP=8?#sQ1SRim3cN*D8mO*-s(vwvc7J$l2cNvZ9R|?mNH|Uvjx=s1{#kA?!)E<-=f!#YYPix)p4HDJqw|no}ac7O`Wm zVXDVP*LDh>n>6bEgP9GVjo8E#`I-}zlT^XQ!uXbYK)guwBjL~U7o*O08nQj5ul6j_ zcw+gu8(cATYRk^7DK8@`wg`cbnR{g zEq50GYQM&{~HMU&{5_VC}zMdk9&nKzC@Wd8U!fj7O;3lg__m> zd&fx;D~*l%p0`-f7G#@!nN~khrclxhnHj?!ynHu;>qNI$fgNW}bpd2{{(S{p_eIIg zM26zbaiPbGorh#qSVcT5m{B%*EbC%;QEv%(#SIpfnka3MzLEqHAE{%2qBw*3EcI$Y z`+uJy3MqPpf{EuN;-~zkMtD-@5aJ~vI5Dwv-sYP}+N_e;X zV92yTH*29P(<+dwAI&zXeUMGB@9QSKY&%e=lqo__IMnTJ;8#qZ0I!bl=R_e$E1Em_wm!xqg2y z+O{MvA&?jZS^kb4RgYM}G#XXR;GcfnToA1=F}pC)4zRdI3&`TAEo zp1AQ(FM|vKuFNs_Dyy-#KLIslF@l+8Y3aAaN7$fTlxsQ-7G7`)HL1XQIj{drZT;5| z4(Imbdj;uAzno(gh%@bab_@NDpDzX1dnkFMmJpYlyNC_8l&bwUeE6e*JheJIZmJNn zocwij@myHp6%hJJbd=DZl|MY5q&4i2(DSDElFqMNT9;scW_Q%tTG%tOWor6qP46Q?vrDb3a~YM5L0>RJYas`4f>ccb0Mm zh?C^O)NSnfV5a_B025s9fiuFA%#*M9^e2M*#^ZuLiiwcKNOU649DDO4Jg630Db>44~pyO05 z*fOO9wX&JEYom#M#(fLq2~#s^7+ls!HB4y4au^WxmEx&nnw}HuS4oV7DvTvWHaIA? zqet*3wp?<|%OTXNh>S&4!)8fqZJFj%ah32Gm4qu^OcQzqs7?8^)^xeD<<@*MQuL1P zRSjzl3ca~+dLrKZoVwHRR{0e(f^JX(@A_;5Vow^Pj}ln5E5 zFiVQVST2%O5WK^wEJ;~6%XA7lL z$M6c{dgadnS|oYW=#2eLBB@*OwRHSjpD5fxQrZ4lIRbp`cQQ8KBf&jfn;6xh$8=P# zryIMuzbmG9%|773QU9~{T%9ykHzH<{lei!?XKVx2>|NpyKR-K756Iy053@<3NrqJu z075O)(ct!Ws^sBmhBSEnFI$3cmdfmTO>pu3Na28Hc`p;PVczabCl_UE#07<_#*mlZ z8QLGtICsS4_4zN~vt}^{cgiy86$^SwT<0mrC;3vz(TRsW$_nVLZ;x9El-QRfaTsfB z54jjoN=yzl;>|N02&=xY@L7AE#w~p(?RA%u{)1q&Ohv7{+0AV>1N+t_P+52>MDACa z%#`$dYuqM5RqliO`Va~}lpDqB1UR$j%S!mDM5NOSzRY-(&m#y}{STIkmy|hHXvc$! zj1>wi(EEiYY_LbjT%DIn!{679mpk41|J?ri0pa=o=@;D%w3EQOSpDW<=6w&PDwU-6 zO?URl-vgYs;>-BVXd`b+)Dw6}6$$aa@W|LGC(rH=J-7Q!nIq8Q5V9O{>sO!k-5;4) z=OHc`Lwh&D3_Gm!&2|4r$_@lOX=JV8P-C8E_(P<$!g+hPVR~vE{RGE%?pc4%@u|0D zxVsdWTHYHHq$Mj+p6A&$G{Q#`xVe?+n)QtanY~s_6k`}HOnKi_`Hoe(01o)y(YpqbZ$P=`bPvg+ugrM8f)cT;>@PE-7a>xWIm9`QQj zhnKq=X>8v?1odXKC#9#juPgm=x}?Ocl*Y|6Ru7loLPs8W-I#fQ6d$nPMCR-^OC53b zKD=6-RHuQ%0>XkRwe#IrBGk78NrjtGu|Sj$GnW^G+t!L8)>E$_GMcG<=%1Yez=fEZ zzl^KTqNQH_b0q(H#4J6d{S{Sf%zlU9E#B8;Hbp$}D8;2Cr`PdkUcRN>?gmUAD=k*F`14&ktvWj2gKRru%`I>N`sEnM-4Cz;Dgtti_G!+s3pZW&# zz!w@kv6V!9bDv7#ZAppYL{ci%gGtntrnGTu^S44vRd_5BYWMkb5Jblg{+xj_@Hne( zt9G4qlwarS6p=S}Q35>GN6{Si#oF(V&gkn=(_-Jt3&=z~U%qf_J3IG2d}$o=hWjzzzsv8k-AJCRj_zOR*H!z;yApwwT+`?<}>Qe4~p`*SCAw4wtQNK(ue&u632E?Q+_FwS5kt zmfkOb*Iep4mq{JJJ&g0i?j}HSeD_vEzW?-NK$`Y@a}znLS;P|f8Vbh*IC`8!B07@~ zq>(JncZB=3AH`-j&l@D|{82;^IqoWOYr~&YP@fK0_|@Cj|EaMqt;^nwNk^7h&hW=}B-+F?O17CW==n#1dSI{J*9mmjB zxOiYRqeNM2K@`gRmE%Pti2QQes_L4;Kd)%1m%=G0ljvJGOs2Zsk_A3<#K+#h{xx!b z6iOr=hO(TVBF8wI;e5|L*0KF56h}wtMoP^!qrR$E1I$QNvbb;Nv;TgXoPkCz+A29G zPF!EIsHj}Jmn=kwlVJ>_N;i{|tDz?uV8dCp>qrsE`k+X@nUL`G3dNj^!~Zg)$Ug?z ziq4gcr+QUVLP+RZA{9sIwT2411=5_<0hxBD_Tw+3fNVwH?e^IqiLmuFWo{SX07B*a z^Zlgt=WjsNVbrd5?LK=Q5@sO;-e-f$tBd4t=*d4ZxS# zzSS3riOPRDsX`$|?A3=3h`s!qDjC2uFoH;!xG8=AYC*n|Wq6Hhbs`0M14m&}DoZ9> zG>}3+{6uz8(=E6p;M{ro<*kDFvos8H`qb>mD`pw-T*N$+Y@-wPUi@(CVHW440`?8( z&nR*PGAOuYspP}Vv4k?RvZ}g!U$$R{`)eEf>0p+D5kp^$O(x2R;K}zJi>YJarAuRf z60bI}b1}zGG;G?o!qG;GtT|G~Q?V9L{urf8-dJiwFH0->P%OgTLPOZJSkV#XjsIb# zg8Fi%ke-|@U6MTM`=w|iyX_o_|Ma(6%dk4S+V7aMAFnL?T@Nwno;ET73uOd2*kkvS zo2FW334n6DQVMxGb!?%nd3V`i<#$TG0}NV z&RO#L^Z38pV><>tPEijOX6DoQ0IwBdPD`=+Ri1&d2>wbo3f{u8aK340VJA|3S%Hej zyKg)S7AlbyYS!^FTCJ)Azd;(a8&xR@|PndW(=uPS@!#oPuE%Sjdn+v|u|4YjIAcFfsZF^)2lrffRVA zW+1?c*1#DV&WAIJXznBO)gehY_{4sAlq^Ug(7N`F^N54IrS(T>J357>2;D6oSMJN7 z=Nb=%Fv508%9oY(A+pDLn~rgDR$ZIP7;>tbeq>8bg8z@ zpkDPOL&VY%{CHhmQNaVu?|7aq#8}9`z#vy5&1rZvwMq9F8GJ3e9zOGdiDCJ4P81Xs z8QB-~z6?x7q1mKYBIlO)y>5odw9|+sRrGaqoH~NFEL#u5lj$NH&)J0Ems5|DB-w~K zJMLf-AHFF(A`?Q#$m$_VrrKJxU&B;FeW#rGX-{PqEX z{vO`u9mkt&OipdZ8V+ffqkM#9O2*zYWM?w0iTxO|LcEiRxNe)Nu*DLtqZ{-+4n{}9 zjWJ67BNma~t=#6Xnl+K^ZuR^!u1r+Xd*v7$`Z!`*x)D$eA+&I z-5rG9LDiyk^1xnK9gg0EpTKl<*JlA3Q)OeC2ZLuo5DEI2W%Il1*JocLFhHw9r;yaY zY6WL*-CoWp0Y2NFTYx6u00RV4IPAF0hR||xxqNSfQH7*2_3Ybr3q*pi*B!twPy`%T zzB(04#Y@(p|1)C^VpFksW+Q_!?W}5KMwIGvm2vWKx zE;*doFVV^SI(#-(oo$SX>{w{iMjA;=tAV#NJP{2mQMSbMO(pU``DcSji;dzm#0rG0 zjhhdyNM~0YFUeI2!_?BV>bb(RUE4IH-=%IiV%4hC@u8FxB?`$%zD~0BoY7o03vx;J zHuNJ>!U|3xb@r?^iG42mAD`_34!xqk&QO89y9L22BB*GiP+ZE#=kgoC0I}msoH$Sd`N-DY1Xl za6>kvel`~0<2lJc=XRqEMewn#w;-hz?B!$7q#?u2ZVF~`3ZC+&P7C7?c`Zc9|5-uq zDB@J&m4X=s`SGojwdz<~_iOQ>?_|#?^55EYSoua1(kZr7EwK=tZLs7#PRmirgr4y( zSg8+jyzQ&!M2d`HYp|W&Raqr>cC+R%V#264zWBq3gx`!@?kJtT--oHVD6^$04Yks% znv#4=!gUNt>*Vpd9RccGbwDbmdo9M34G5%79N%uo5%AeAmPBHP+qUQ=5(xoYB9Os# z-f`Myc>&PApdF{u9DqKj!v9Iqt~&qIoRZlvtdIUeo8R%cj6Qh}jl=idI>Xh(K7lU^ zgPPIvVwFxMlz@hl`**oTC4ES}vV>ij;>0wYy^x@)_f>2M7a&!}BTLEP8%|>Kh^S@V zLio)uq8RV&mqWAC@t1uj!)vbYMP-^%<(KKdEU9vgR}soY3C|c^_c?v$Cbv3aijW; z(*?r^h|9!S4sT-y%FVJ(UF*7cbRT-`&V4Tl3{d4G_;=JlX!UplbpvC|JW4rMVx%GMwYu3oc3H3!2G+=((sj)mynPs=Dn7OjABAFN#j9NYl~|Lq53XL*%0(homF(H> z8DQ0%h2mf{=zAWs4jy+-2mxfyf6YGtPW=R$Jc$4TvAJ&7OMhboz#^3G;{r5$6-0y# zCNsMu|9RKosiMZ!nGgZIXYf47>hEHm?C(Zqh07)64wP)hL90+8w~4X3s%$)9TvWmf z|DRA09Ne3iC~)m)W^X%Qm;dV)A1X;=qScI$|L6Ni%ZLyOMU;i@bl~CY`N)#L`m}N^ z4P@#IrBC?eojwFUBYO6;<>0a{Qas9x?!Q7N4zm-W)W_y!S)jRje|~}M)0G!rS7h*m zr~e(C0L7kVG#>HgKf!32)`ZwFnj+Uee5uKmZF3sZ?|p1|mbOzada1W>H{gFW#!lTS#OuUMyOYI)X7^Rg7%1M&`YPU%g18F|0)qd+0zae zYtU0hZb5QZdHFyCE}rb)8yzszyh240MiiJB-FFce%13>kAEPkMY5UU{60)5@`>DFS z%8)pR^23@H${|UYT{NxP#SYv9ZTT=(LowSoe3}+aHbA2K&QBU~Uyo(N}6Kr}h1I3g8|3YEA zv1nj#(&&et!dp-tPMBz>@~@X>S#= zxuusJ5A)M0X(=|Vd`0FhHxRs3xt*8v(*X>$@+lH@5} zGw6Wr*)lQo7qrdZZaevfzmGB48XcxSj4nHrEtomo(Yg4P^=)4KOg=U!+sUf_H z8Cvr{b!7o@1NiTF$a__Dc@DaLxB%q8i{u5>Vw1oouUP?KVkq8nW{L8S4BD{SIWGo} zJXiLQazRzmBuY0*470@hnv8_|ZrF}-SIJR5krUjR#to?$*Cs$k%p4-YAN+nNk9_bw zq&$9{C)ZT5M)g!8h@kPAYQ5ZqXTZWRY|223hDzAeM1Z5Ko z%1TaO-92$a^4_YqXz?zF94koa^PXR(7*f7H38_`~a?kfL$WGsrpdbG7o$L^o(zH@R zZTs2YQu3C2dPL7bg4`Z@}X$7U`fnSY~&*v#*cCl0m!b()Z0?e zrZQ=mjg=!QCC99Om<>$y#qgoyvlNAqb^DqmDd7vbQx~SDPg*@!px~Hv7vrA3S=(2i z8`rfttx_vDy!pI*_2ri@_{M8ot^Cu%a>uw=p3nGwF6_Qe$3VGgQ&d=^I>Gs>|07y* z1B+ayq$2YXQE0SRno2pI9KG6JtC|1?W^BTUw}qEl+G@uiV4NJA$920^u0(M|s&>0s z!f>qP7puUgx(cey3>muvMK?D$th3TfgFKv)G~vZnhoavoED0OQSN4fmdnmcdI>B`w zIgHL)p({NU+`Ad_7I)=$#fOe*9b6^WwyV7&U#FDX28xF61`2e|FnSo&2})ADGKYKj zo9UK4r3Itzt{d(SB{bGqjXKGn!p{elF3c*G+%^giJ!OmvBThQCq(ge&HTertHqXwS z@c9Vmk)=kJHLH=Q&yv4ImC`u>icPV9cV~HC{B6nhH%F!{m#QS2f{)GH>G>~bxyEyG zWIwbRC#84`5U-5lS#pqPEWuT?($5CJ2@iggFV}5Ubs#4^a;3O2!J7pUM1AbU0PKsr{lMxUA5O(xw;4}ypYn4q|VKoAAZ@Y zmXy*|-cpoczaa~w^4OmB=g2RUCX$?Kv~WskLb6-a<9c&FasY0UEnVK^gx5Noxcgln z4Eg9LpX#~;R&NyPWT=##RGk}SSpca!Ni{2utOK#|fIL2r?<#XPeP7Aoky*osqSdBX z+Y|;!p@jZv*;akLzdW%o;?US5X%s(}TeHe#l$B60n#y!^YsPY@(od83lNP^=?%U26 z>>!9g4GYF~e>)SE(ftvC5u`GCXk4;>W=p;wys~KW!#+PMz4f3y$zZP_u-fS}X^^u` zUSdMKOdE5#j#Ys^T9jj{k zqz)^6xp{M}CEca;E1ce@&0jPpx4N}#(qo)u8i$gGnMt7M`DtY_CVh$5@v*1z)H9ct zQ(u?;->-R|Ej3T*E12yITgP`x#j%%Z zG!9)F%8HLbX6_P}S>7J)Qnz(T>4sn+kd!x3*s&1gv;W|v0KoeM$b-REVZnK$UQ3SZ zAxj_Yttc2L$O`EY(7gc*<8o$+o=5eW6y1-nqjPxCcJw26Omw@` z;v6BR+-)*uM;$8a;U!pfjdzMP!QXCd>5waR*=8Tc(|9+eMWl}edEc_$gGk3p7xlE^*D!jCe~T%Ncb?l{ZJE z*W!>%VssNFZ#`(DA^N+FMavB>Hoo)~-L{GlORc5!nH1Cx#fQQ$0LEYny(*3#cy~ER2ESx;=s8Gj~f)+j$lTq13Q>^cmgtI6t+dj0Wt z{>>5UV^rP!(bmhZ(+6m}!(BG0`fC$?8}Q&%;9M9``~}~s>7kj>&z5K7>^45`S&Pp_ zHh8-^A0kudcR~%iw}i&6U*pxmGUA~Jb+9n*{-z?`hUrNVbOAQN3<(AQad@nS74ZaS zfFW(dFq|m4j-*kb^>jGMJOT8WYB3o$eFW?Gt>E_qghpq(pdCig>6q~2T0Z2dqx!>5 zuBRMxxcz3hVc{UCu;*Dn4s>nZXLM_v1iI7%l56J*O`1ksw8Vs5bWp@BQ{M?=aA7;bu&t*V6Qc$OF7aeQYEwC8}uhno+AM;}m zH}tp1x9#xi@UEkEXqNB;38ak~n#BCDFASl8?VsL%wzKrz=LhW=JseMXjWI(jj2@Xm z(?(EwkQ?jyefO{QhLbh`A?1b06QCQzlE!b}N5HzRy`qQ!c>t9S^Eki)Ng{wklRv+N zcRjvATfv6};I{UQT`fbeUYu{hv!0>%%mNGsolN&TB)Ka#IujGVjCk@$>vm&E)i z=5T9}|A1@+0|1f96R;p=Zz#m;8!UYNj>71X6Ljn%eB%M#gkPqNBa>m|g#XMg)Y6ez`9iv1wd0bJT17yGfYFGErbmmF;;-6`z23uPY^l`tL zZ~b-^4!X^S&9y$_2=DJhay)-jLo>A=ZSo&^=gvTz!uRpuooEmY#}`VlbppPHLF0vg zZ^J@?A!&WgGP$hDsq1}ak56~R=k{;Ga0?Q(@gv^2OwftZ=V8H=Q*x<2G*Ml8U z^VSnLs@D~B=-PhP2KV9gN2|xN=WKuN$6Dw=0j$Ty@-$J3#pRn=uyB`y`m#2@w>by0&cG74^e_YNnQtx^^g)E$U4x+*? zAJ()wAJ%T5vmT&{8_j2fgMP<@njZc=)V{v*-2PkC{^z~I5Y7(fjb#6mx=MTBNd&)1 z=7+EGPq#Fx3fMLk+B3b*J9F{h2SY<0AglRznfcIc(2Rrc>Mx;_P|FE-qqQDKo|RjD zxBwHk(;?M?XVfN3*3;X#Q(xG_(}FrTC%HL; znLw@@g&!J0$MGP$#O<(~PS|5~?;6;Z|31R#9G&Dk+F#|0o{Bd5D5kp}3Q}L*Y|HHE z2shjOz0{a)caG>q<2jUFTOZ>#d!aiuE9MYa)Qj_9ba$U53mg{5!hEBFWZ6_cof&W52%mviq zee(c@oq#vhKo>si4{G2oOyM(<$70ykDeMvS2ly7|fd|;~0@(U2MF|RQ;98*GIv5y| z4Q};r9ggP&50km1#>ZYga5u;O(zp(47V7-uijF zgXavl|D2Zp-QT$pJHZH;94;!|&nQ{jB9bpY5si%4(`r;SoE2g{x%k$hKiBV<@*j12 z+mvoY;$ao>kRk9HBj{pV7@Ge0o7sEY((n2dGA(=?E_{k?^mQfp!bN!B2sQ)So9NoD zg_-_90;bS!FsvQ~rRe%)=kU`hE&eVeK2Ap_Mv)8Ha34;6S5YCopxYVY#~GtL4I@F~ z^~dEw8yWYUv!~O+=+>A7*vK!y=oB&e_lNoZPve>h-bp|H`fYb~@me2l!}_O2Sz*Kr zzVe_K(kA|Ahxups>cwY!r`m_?_dgA9^uSy6VDD`)dMIrD+DHgkxxWk_hDSZRpjY{K zvFo=A;F}xYsfEYky2rmAOR@&ZWxcxXVfO5WZQ{(Wa&&E6tpACJoyGfa;`mQ>z=nnI zyo68lA3eaoZ9uzqw^;n+=ga!4XO-Z?R^OBSTT`dSR4G^;=yr4q$!o%Ajo?KD_&gmp z4NQ83+W7jD7|^v6tWx+~3cNK6orE#^_nra!-M5MRnuSvy&s{byAz&)?T<_!DJAG*F z0bO{&em>`sPwfb2K|Hik8{#6;u=l$D{D2eBMAG6(13ZQ1Ut8yEx|Sbxoh>i;JLj}( zwN{rAur7Fx*%)4Q2%WlAg+~SZZoDA5wK0N~0V68BEe3*4Fgx#$b9bG2fVab;Q%KAL z$6V)1&|x2;9WlezKcl|BcfFgAcN-*-Zj$>{@R8Bo6vJ_!0_YFIDUsPW z-ga)C{}saNRlLA|zJNN9$3@RSBj&a~OmLGp>(_R$T`LY>puh!4GVe>b>6F2^|QvN&pu+#~DAr750GLrKn;j=;T-tXU^0fQiqSWbNdv9(zo zU^OYGSG*goR-cbEB5s3=^LT|tIO-w*`vQ=yexkRy68LePH7LL0b7~7Hz8ATaUC-_J zf%?saxW0u8u))bXsYpV-Vq_%T#CRqJZRMx8i3Xh%W~ASS=eROJog5gpZdPqY@ zuC_moV!miUv}3#hMZ&@HgtLJ3u=&9V8Y9mJd3?Sn?w8K!@MbH_)Ope?@vF74;=bL= z-XvZ3uGph-`5AcR0o^A~Be9!kYJr`vhuvzGXN(E1daM-G8efEP(K zq|~T?n}=MWtKpo{tQccBtRYsnYBH1+%iM0;bls|4D&`djB;UCsbj{HITR za)$$>OBee$!1gmWV3h(w9xOg%Sj#|GBa_PW+~bRX7g6#ho@aoCm`7GdI@h_xlvq|k z(_hwz!JNb^Ir?46PX6UXp`Xz%Sd?}(Lq3@e$LVcV3tGqx(%^QK~iHq%1 z2&x-PetVi1JfTB>rNfBw)`e6rxnd}i+7dC{FO!(dVa2uu*DM=e6CTzKWT}}9r;yYh z@NQL14k)$X`AYH)R}`Ulzp%53#U=$D970E=1Eo3P<*d$&IDt<2ndyfI_3pDkRNswM zEyG9{D$r-E$4ukugRH&MZT)^ZWo2HLdBX#|$B*xfqg?Oik!=b2!_y^F4N%`PeW#H*A>dM|_n&pTbl^okb{hyV z6>6x7;`vQ|Gm*c(E(~U_vcM0%y|v=YL80!wd)t_2IS^uk@gh;nFmq)vpx6@%u|F4u z3_tELNfH&S$fW4jD}Rq1O3fAX{aDEV@em~hNe`2?(S`5Lu#fpgFO1hLz(xOOpvy|*?Q-kI=fONMVYjpa5W9#&mf zj&WQT5}y`SPbm#U?z-nX`nMcD&N)!jD&b*Qx&q788vYQr6RH6aG6@UQk)^bB+7(W7 zST}}Nk*nJF>hBBhtT?h2ehuVXqsFM$priiKt0^&wsoEZ}^2LEUX>j7q#qX)9#X*?u z(oFj^jK5)E#^E}aq$Qhw`oW6dUui#gOd*6ZfwBL&u|r2-rm@447Cv+QCicI->TTf3KFcD)d$3iuNTGDinrK`+!?MfVk_J0^-R}ipz2O5#^Zg(TAA4 z5^@RcT61a{GQe_1ieCYGR>sG^FP)F5%&_DRd_?`&6WdjFjgq(bo8FBs@%jVpj8XU! zX*kht?|faq??X!I2E`3-EU%uyTQ;N4EqWlTtt3`Vj>%4SzYC1w(U|T`SG~1dva`M> zJ>ofb{TvF-?zSMyG>0os4MAL)j*Y)4pMR28!#fH4&cx|hawQijuf`?v)R2;-*px*1 zUY1;Tl;jqS+GW;|j|w`>8mpYDZ_+MekC+uY_icu-@UG62P0plJ?SJfLBZl*>4s~k7 zU#*9EBLaK%G$Ulv)|x^T58=`2I)H+cUm9~XgDYmBxM;1SvBF(c22{ptRdq_EI-Q6z z%0DpR(aYe_t!f_o|KK@l^s0;1F}O+|Nf^H*Kb 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 Had`57y$ru? literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/reference/deepseek-47f9438/narrow-home.png b/packages/moss-agent/test/visual/reference/deepseek-47f9438/narrow-home.png new file mode 100644 index 0000000000000000000000000000000000000000..d344b0f7a79d6d7adb96701954743585de2fb425 GIT binary patch literal 69771 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 E0iy^Bi2wiq literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/visual/reference/deepseek-47f9438/tablet-home.png b/packages/moss-agent/test/visual/reference/deepseek-47f9438/tablet-home.png new file mode 100644 index 0000000000000000000000000000000000000000..6676d8adc60aa0c1b277a5d051fd42a57d65fe22 GIT binary patch literal 52760 zcmeEtWmlX*(Td!Ceyw?mB32hv4q+?(XjHJ4xPW&)HwF=j=Z7 zWoEkXuCA`W%DVavQIHcy{D|`r3=9lWQbI%t3=Dz=3=A?2797+v^`J`!28IkKDI%!i zmUfa3c+-DmBZyNjWqQPJl z@&gI;y2*E)7G{Q|e14l;LvI@ob&A-WEPPGGr8E1pelW1kVk=A5_vof3yRKe2^#U26 z$q7B(=35pyON$TcoX$9}tneK2#l^)-^;RW+MTgEUNNYBuY{8a{A=G5E)ssrT=7okA zh0C3&Ju_k$S#J54>@Pn;qp_6);O5ULp6XeH+yxL0KpzD^fW0aH$@wNz*?6IEoU6Hm zL?V!z_b*{TpdT7If@g9w#;C*WJO}fi=l#fo&*46xk?RQgQpo#sawu~^MvNHcuH~z# z4WXJPBmaBmdw}!UA1;dMhZmTXOr6$v>JYX^{`7(Iz!8sy-;Rt#qch)N>oW)sXCgAX zeCY%JozV?>!oifAuEUy|#Cxt*Ti&srTwfF7@3@8y?KFF%&+Orxx~z=W)*1^4f0_j# z*SD-e;`7qg`@Nm5aF`CxEYYO3idT7RKYVMd! zP1NMl`$kP2T*m`A{wz!YP4GKM*oS{)Sx`u=*CGFq0yF+#5B=x+7c%lcTzve0x^n|cS;Bkw=i>s=tKD*ek z{*jWOp}0`}UheZ*J4k7q7)`FiZUDo3h&NG45{WT7Inp}<|3CyDP@5KWL7a+x$XFmJ zBM(E|;qXVwe&j-hU(H(Br*+*frFX)cIJ)lve+(oTI(rta*&nduCC!9b@JWV7$Z751 zH0HL)QMCVp0#E!41{M^d2u|sc-yv$L*w};A1#;DCJKN(API7-JfNh9e*vj&aWOC8` z{kX?X1DtfX&XXz!`MZY zl1r}%3DXG6p9#(Z+;;>yqkoD20i2h!f&&^3o6}#0?I>oFnVB*$kVtU3ZDkCwDD?Mb z{w=+HU{QM-uT8Qeevkn=1JUn4kd0;}BCM77yFLT<-N_~w!2RV}l5!XuORrDRRiU8m!c-;=!+xBdetF)9RIsZ zenLVa)o^I^KrKxRK4uV%G4aHZK!{4^d4&3>5pF0g+KyA+_i-1*taTs<@&;I0sKkIh8k0h$Q@THNo4r^NfM`ghir~Z=r{}({U3YwfYQ@PKF-z-gb z8!CCxrgbSPhPKFC6{zYdX_ouMj+Tde*hE;+5%SWG#~8G2CVBmN)oqUxln%BBCog1p(zPn~~}iGbh6 zR``j5*B}B)(m(Vd6E<+5v4_Z}1w;MY`2bkfJ((U-=<0tlBFCRugBmO1J1asFWdE&J z>$5$Z%gJXYU3wZ5xANM*iv*+n7W9`-us~Rl|1CwDmRU{mO2bySZZTutAy571TFr?i z79LiR^%9f|VraLQGpF@)*yE(xt-mAv8M_ezISi!e+o}uKyCfg7ovah02n&>e;Yt@5%{k>{^H}m zaQLr!{NL4v{rc^_|C|N2lM zBaU#QiO^3z8hV^8!pkZ65NJQ{gE>e-NtO(z;eZN%;;gR(CPr9BU@9N|#a9?Ybg_q0(UUn*s|&ye9-O2vEKq8+t+dLOhLzLJAXF za!7o4vK=ccIcFxM*x#lqfE>&m&Er)b5r9XOF4zZ#;>PK3GK?}=+Bugkfb3-TJpjdg zR;q>?>Q@-*1C&W0{`xF@;u=(jK$<@(O14sWWHk9i&-adB7dx_P-Ui&6##3_(62aDY;M0cG$}>S*wfs9=hq)uMv&G35ED zK`IFd#zIoFe}nJAmH?mPo4#!Q1Qz{0cL>rM^*6*8LZRGUHIj zFe`xdU@M^L)~lL+X;&qR2SS)5`Y|Yc`vRv+WpazX2Lpz5H)nm6jJc#J)5D>vBqLq8 z7D_x-uG%QTTHz!;!J_Isg=^MdfZ6L4OKp-kzH=C9hCXe!_?2wo6N}zAPOGK^ixCQz zTS@CzWW}Czni1j$Fu-@VfNXC|l-d)xIrza~k24F*8Z1IB!m$)eqzd5DIet8_Y+r3X z%%a03&JrQ?uxR%adc+l!A72EXq8V%xpg1&X99BXHDH5W;c3gD~`RTWdx+WmOO+pIn$R7|DY8sK%t2342e(T6{!M{* zV@(c!V*ze*>GOTUY|pdL#~Rd^b3|g4-6L+M|@uq4i2m zI_yRjVJ;idvu{+crG~t>AY)vzOFBO)1u?978Fx5ZQv{yeT?x)OEvVS?syNdsTg#4? zNNRx|Y*@3@*o=^U>RJ5(F1MOvdy9s0wWw}L<)Z^l z0EYw78uf_2si#h4``vA@k0LuvC52o^KG{B$d>TO)E3~|*Ey_Rru!SebHGjOcYEUft=h#8B;##$s=IzCZ`jb>T4gyrdu^yS-H z1Q1CJ8Sn8iV#HPoo#%|ad?cIvoJ3g;5&IK$LKv|g64n+iQX0I15qjwkWi^kXlIa8q zwo1`W$^e8S2{3w_+_1>T7;?(^2Iy^yQNs6wBkW5>_B3Vs?Ip?^ohe_xK|p>8yFyX8 zT1k`D$L97~EN2aK9XfA|uR({d);|N3MtzRjD@6|ck znZ2Z43%6{Fh|8v8*n-J6o=U0X3S+*N+55F(DE6&+d}|0ixSCw-M2Yd``TO|8=ZWg~ z=v6||rHmZ*#}CPu$ZzRZ0sR5x=fRy^W{L(L>pE&b1wY*Xy3GBaaZrH9xU8aPI_N`) zR9Na=$e4>2bA{UT#@J9R*29#xWH~;t0Of zcQ9?IM^v_lb!}qgkJh|a?#Lk$K?Efc5Gmz@Bb%-DJk?1gnCxx0hVDPjr9FN*hKU~D3g5d2L@R>Uv4R$_29sM%kf$ov*JKCPyZ?oq?q8C`nIqfkwO zzM5j&V}lnV0OZW1{WuJOPBnm0GtOs)dsO?9=p9Xqs(eJOXbMDQ^T7(6)UCgh3#(-n z4Eef@PTTl9jT7}gCsYZDo#b?^$cUcCkt7|vESBH9%nTG~gWo!?gzgPHSDJA$#pg1X z^?{~L#@Jk9GkvURMY9n0H?$5;pa#(>5?nD_37gADRUcB(b08l0sQSV7L$7S1Qmzvs zn)piSqBWl5Qp!;fNe_^>w`m*LB3p)GJp`o|Yzv;AN|XcT4P9eMFN)$~u2oU+g_2`N zMhxkoNkKbKV8-HUvaAS9@|DSaOV?nCj6jQ0=&QI#3+S(%ETY;Iuzb@{V|$Asll!U=yDtd4A-^C>lsP z7o+bEQ73E4lnyMJ#W;3kRrKmo-sogQLNTe`eyFw!6nob>zEgRwRXj?}bt?yw?ru)z*ez73^An@sa4?4`Fg>%(>d=}jUjmY6gj2+|* zqP!e_poDn?k7Y}u-d1(3<%ghCkBZ zlk@@T_9Y&vQ$2E|YQRnMS@&S91VpSLc2g)17fWFpVi7btto#)yt9$q(Mr{_KS`{3xBhe6v**#%PB9U3x&#OeprJjvR6#{Fwe&N8YT0+|@8Qtz%o zsWLa_gp$yiC@cKQ-r5Z#wfYx!_gpL@#>gujhM#rJcP$}GUD@?eWe(5*vlJ1FY`{GP~D9s7X#+Hn* zIKCLkiU~pfP<(LSPLRNlxO2wk>JfV)ytjSpNl}EdmriNUrK%D&-%Tj}oLQ%#VBf|f zvqXb)kJ&hKO{ZR6CEuDS=e;DwE`QlV0aS>kA0F8$Ae*yRL0N6omzIQRqbH@@8nu(e z#&}NrwKf^aN?-zwc@#n_mKM^QJv7Tlj3Q+|6%btSfjT&Nz+K|Kjdv=76KFD}@#Aw2 z`JEG$W`rB2FVLNo0%k|`jx?cfkR_1ac&7eM}d4>tU%fSy8^TOzjsu7eB#v?ShdG99?$ zxQ?3#j>-edC&_RvR(s0F0m!g=DI7H(ayZqsuVPw-k72d0f~MZbW!h=6iKUAv^wUha zZ2C>c-g`U1!y?A{sRUz_e5+!Muy0?dR>wrsgl?}G!$xa_2S2bNmc+IrQbGj&q6*6_ zgp&Qa?HybEy^s7mN3X^)EUPd5aG#`HtMPe@bC}H(>U`N?fcy{=DP)~|{;x>`KHg}V z00WUPuVAP311%qh`5%8V4~LP@t_O|D0*D8Q+ZjClK8w5=lU(zaqf%KWPw4W;d#wAE|RVPV&3&Bva+Mh&FBsS-MB)e9rqJZ5#ibxO*T&1 z^aJtdN~SpXb~pn0IUU3%mDtGo$Bw$o0@Xm^VMjAgh!=r8exS9E*8$5XSK>H! z$9~aooQ^*q?YgF*D9%f5)ofA@Rd_g%RHPA!!r7%f(1{KsVJa(lsV?p$J-G9TZ>TUC zWEJHG$tGh}tl>{5;NmkxD@B&)<4hK1QLEUoz6=n?hOV-*=v6bbqhRi{n{z>oJiFmk z$qc7Y%Y;gIye0nUET98|{Q3jNp%TtWCR6pJMb1b#e1t@~m$uvxl6d_s?@>>Ix_7AN z`tKKrGDbNm2_)0UO_WnZ-OmVx;Z{YClr{Esy>bn$+u*7qkUa`$TxusVDqj+PKDS;N zpP;kkG^y$~QbAJeV8j`sn|0{|>nMQs#yKM#5wkknViG>_Rhbx}V4l62auz(xRM|#n_=$7wPJ4)(HjO33O`ONHIZHv#gR=`YpHR-y64&LVtf*Wz zq3P->G|>lAfoEoZo}kcXq4iy0c+UiHSw$s2%mppvbPm}OBTE_^9@7(#h%rY;X(|9E zWv9H0{0iC3e{vf|xT_+rX5eA9fJvhxf{Snl@sQf=XhzD15mXSre)ObRWe1(;`!LBE zbO|scGkcaC)tzx^C@N02xHslg=UEI54_jGT&D)e6O|`kFCT5@N-ZWc45$0jn{Jt&w zCV?8qV9Xa<#5xL@fDkH?_K4lQvBk4I(#v%*O^%~wcu{kRUamB?Afk%#nJe7!JXf-B zP}>%0j$w8$m(9!&m1^A+vfYp?F1QbkjvY);K9a%?ked>h2G1Rrl9HkvOW707Y@A94 zWC%a!d9G!1=wW>0F;1e2u8lGa&X85pRW6~D2bGeW>ug$AAKi=VY~c}*o8&)%XTx*a zyN|{GOcAy6qY5|9QOB91gc|-3tDoCVJ2cW&SC&dwuVc3fNk_M23v{b43u2H5o@@Xm z^EkyhWcG?pS-|YKlpG4#9be~)A*q-lj&^z6E;fjCwL0vS! zK_%+!(I%UtR} ztF6%yT$-4uwEyb3@G#ots)pXaTbiEEf#%+@dDnA;p%;*s`8C(C*oQ=!A~Q zw3*=-McbYZl~BF!{B(Y?U~?V6yPHb z^ZxL>KE}CkJxZbf-sfD=ddG!ltBIv}LmQP4>0V21cvaQq}G7Y`yhn3pX<< zDe3NH&fq0EYhKqyssFBwRr2K#_(`o|`EEFsVNyuAui6%mx@RAdk{godDlIm;r|T<4 z8V4aJoyE;giEkW-V?=YvI;>jEc3~aeBP?yEs??wMb=uduiMZM&@Vm0Zce;+1;$c|n z@pE4Wmc&D!(1r}(Z-W@R8MN2zF@&;$Q{fF9c*#~@B_VGHl9;BaevD8ShM)oVq9Rg< z9>`FZQxm?YAM&oEUu_6~dOy~epYGJp@VL6@{^V*;l_7pZ<$U#^e6aDb9p$^T8D#w$ zdLvAz-k}T5Br5@jimgi+yhRk(RSe-wFLg6@Ew=8y9l&~AzkauDmRU~uzBxZWL3%kl zEI+qX`7V&&z!7#3H(NNQ_exije%flsBHp()dE13dJSshY# z9DsEnl40g&OYK|aN$BS8p2Ci85jEEoj9dz5t1q(8DG`L%U$-;ZeJn^#sXAF7afXAE zo+mrq$cK@w$!OMY0jgwil5U4H+)cH_cv?^i401v-}{ z$`uc{SE@zCm2Qtet!!VqEBDvkA3x#iKJAioUH5j)u0OB0f6m~!nb96^xuU|eUa30H zKIe0~y#4gPnR$+_ete9J?{!6Yb2}(>=v2h$F+(JM z$6uz1QnBmgIEvHoJwdtiIM%7yK;bK^Ws_}$`NHpy{5mA)V2|zAY)Et}v}+OU(kUEh zl1ezs6ezvh_S7Q&T~`lN`xbGg$cc3~CBA^07vB&P)|rzvNiD(#zUe8rOb&a)tRLY_ zXaiX66m3@Z0el~ksoe9j>&gX<{Z_*pX`;TYB@vu2x^ARL?Z<(8zRb__J`Go}TB)^F z9BtIwzFsdCI%-!B@$0K=oc7^NdPv2bL zUFC4Ot+)4df4a0$MKj&UBl#>TSK( z9{2G$?7sDdV}nZ2cc;tjAai>?&R?P1?6R`>9SVMLEWO_C67}u+w0>Q)&Pg+gURRF) zm4!s2%HR88Gbq#h?XfQcm%HYi(e2_FXyCfbKujm|IFIAThM-T2#de?X`}4Y!-4IoQ z)A`!!mc#qo>vVy9K~25&;#F>(JeR{vVHH#Ak@;zpb4AvEWPa~;9X-1`Hc3?ph>xi=>^v_HC2c%-*m37WaToZ)c>d)UWeyd9HH ze_f%1-)?`l@3Hk6Y0Z5*kS@jSNm$><)70G^d$0(2tvFmVQw#jXJ zZk6&AUv() zmJDTjWt+Q9K6zy|4$O>ehTvehi*il9OgfjUbkt&|n`8cUOt^tEO+n}}p$9?D4_)vd zUP?Lw^0=kttBmG(bl-pESBwEmS&%n)yv90NZB9b?w*I_! zPeW6{23TuRuh5(M7H45Loj>y{GfOxqmNoFr;rSh8HyBz^9Lh(QYAl2i?_ztyiijux z?QapsdS09EP4jHvPHp9NE_H48LKvD zXJ*FIx$kl3y|35h--nTDK$e2v?XAXq(r_gCtA}uR!E`}fWl)b4NVgf<9*F61-Y%nj zeeM>`;&F4tB34@5;q?=?4+}E!IURbO*B^dP>z=n<+GSxU-JYk*V(jRrvs+*E(^l<&j!!TgPA?5bbu%XJ`XWO zV+WhDOgRwM;UstG%dVGXN#&#HQF7=X8Sv+Q&poH9X;N7Mrm1~bRj8riaYCn_5)?=I zv^?v@CK-Tqu9|$d<9+_7iLH|dl26MmHuuHO%Z0c%fKMEufIf|Wq%t`^p8@r8jv=oM zE~R~19bIK*-y4)y^7s8~0|?I;LzM%W<0;nKlV0>7cQ7>JaWF8QjMXi2KQL z$+!lKAn#M(wl;G`OXP7x{+CVAc1tjirm$W&?q|?3Fi^NV?W(HB@z>eAozAN34baEg z&nSwwUOrjf0A>nX*gV%-+-Ew*)31A*&s$#av;nR6Yo1=LRrl+@nI2k=xJLvnyK~xy zex(XwnDlOUKwsqp_`PvlE@N1-YjO6s;F|zU#N2G3i`R1o?Iz}ln?sFY+<-u>+=e(>GCR663@iS9>z|BfCN+U%Tp~WHhh1YHPj#t^tn6^rvR%djW&Z1~qp5sM5s%@oFIQ7lDso_C@ zIOq7}KW71WzW^=#X7_8E!nHRSM8Nq*o$j-L|o@>J^q|{EbwRlid)P3GcN?I=^{^R>z4#2Gac)db@8eD zQTj@g$u%9+k5|b!dtUa*v)H{z^`BULF(3)KZFF=$*zb>}Gc=zl`LsA4D!EqFSugU~ zEU|EL9QL4rjQBgN+8458cxS4q&a>5K{+A13I>4n)_E0m_50)bC=X_C=OgryaVljA3=7>Rr>w~BI!$d7$;x(~TXYLe%gpezF=aVP zsxr`yDY8@YUrz>63A%u+cmDV|DFg-o`{7MI2MO9@P&#(14)C^8v%_v2B1ZU<#}9H&*t zdK@i&T7R;`$6I+iHapmfs^D%eEj4~Ic?Wd4;`2N&dG6E6l|l1ZY7iWq@oX-1ibruc z&1X|@9=)=RLu`cOa?4#KalERZT*e{&4rk}z4re}V z+)r})?epq!?`bwVM41bRrQ0JVHR4@719a<8cb)1S(PXY@d!nX8=JmY$!uZYaab(df z{qw=dy z-SLCQfeT{Tl}huTi<-hdzMP-0UNI8RZ`9F- zrt{h2(BE7vIc-e0DcZ#R`R>%XZZe(3+|yb>tHFAeAH^)Vd# z2lS`9l{QB+OVz+deJ`S`;xO?k4q>SQhol(iTSP?6ek^^5!L?S;!wrzf@){rtIzY;D zdjd+yHCZF#vDGk+-4IHo#T+eFI;saDok}jLtHj4WMk5%Jh(~Bu86WPArgFQSa2W0c zE6ejHqWv+?YaA2HL;e>W}Z1r zCN{(aZJ&~!ZFCT(!|*r6cu$5qye&|Vv$zd&R}YfXc3899f5U+4f-IShy|%T?^KNe3 zaLfTN-9IB%pKG$L9H+U{s>|`x?90w!`F49NZ=^R8BHv)!EtKtu0d7Y+r7s zXNaGTYjR#jXteL5I_Qc`gUV8poNbe)%r+@tdLVk^XsYMvN_j;yDq1pq-2s_4t)v=1 zLLn)j-1RWxQS04;5S7MfV^WlLM8GGz#d|-Aslh|1e6crG*F^t@QQahKmDD(U&d;4J zi_jX)nUKWi%lj_*QO*#{Pong(n^n)`n!AiUlj>zq$z178lTpSHOOJ!7WZcOV2D?wE z@AjKQS|V!%l?MDyN z=3s28^3d{ltqJG&v>(s<1KOmo(f4JL0?|V_>qqPJorArao}Q2SyRc)@$EvPNrNn-M z_i04_rp*<{@!2WwmAJFi9s8W_JR;#BP-rS7&46S*h)vz+wRaMXLNYWo{3yxy9Bb_i zn!HeEd`*I`vQr~0k?v7LSnAm<)4Tj~5hAh5#2a!=v6iP~j&9h)#a40XXb?ntm|8Qk3<74jO}=xw9UW;sIZM=6I_ z&%II9tIz8bqL>@v?XByoGnT9GOpG|!u8RBI_~~*zr)jp)o2k#0{n>C5gYWh&`^ey0 zz3ch|D451^-a%x48KAO?Hup1_#Q7Slgn$i8+5x?w7(_YuXMBfrEt5R>AJ4B zMxVH+xU9MFbFNBv^4@IxP}lXo&EWOS@O^t!Em2E%S+eNIcO3Em0mJ|Pa?QT(W@OQn z6upD4k4?&Bvs~wWG)OVddB1XWbad|h{tS|LD?YEs!)?ITOVu!g{PRU?=IT@Rv^>Af zdYd<(<#F%zp8r=~e#6}ZC=H*LvH0S9HOSENu+^U7qcu#R>atW+u;zWwpy#uj(A30* zx=0a@mJFK~^^m$$nq8wQy7{ZMML*@`H^ht|idXdhBj8JZ6vRT#jo)oG`n39nhL!!? zk;|GnG2ia@I9=3_u>@No8n4uH!$70z-2GPymXUh1!1Ym|$+9)Kx9XK;N=S9nt87Bv zSDnmDqob*#rLt$x%WvEKj~vWg?wbK&50bIw%2%_gdo4;@6O_;87;=1%JE5U7b6lYF z?xo)b-4!iN)m(k|z89|qZx=9HO-ZLu$L;Jd7bNse2U}QE+Nd$I#}&S>@U>6$qGuz_ z<1(W9^X(p;P_Hmw?gnRy5_22kmENkw$MMJc?rB3rQEBQ|JdP`K#P1K6?`iha`^yB` z*W5^;Hc>w~@S6;w^F?MrE&_b6Q^Obu0|l8Lw?`&zuf|Lvd9GelQy|;$DEI>=E_QoA3RKoeEYoT%$h&Cac|n&rpDKs( z44Y1fnlT2xBpx~vX5IuVk)yk;Wj*i@x3)nbDj+jO?nY2eeIeO+4_TndhwTLl%neMB z8AcH)a~=qu)vloaVuF2<8t^#ne%gNKozZ=b9c-v{-+mp`Vl(Ixy@{$wGDsr@9YuY- z#nuIFPAbu%VTc31F|WtXr1%5)D=Bz*uXG6almas#&0?+PF+pALa)kNaW&Js=;d+c4 zVHorFD->=Vi`|BR5-BM`<7ULC26DyQ`S!QlyJf(AOS;FCgpaOWCsZPtsKkZ$sg*v- zVV^QxOi6juQ7BFM#MJgpqXHWFb-1KG-|b8siP#qd9SO~Wz9^7x?1w`cAyS$>2o5LG zMIe6VoViZr{an!-iC<_6f8KSvCvgKj!_W8x=n^fnr#>p>gIghmvibnei+U@zcYPm? ztds#;QZCsMo?2W?J$&aS2U|8kV}+2rfOg?RhKZ*MAPi&Yupn^x{z+EN1s*B^jwY{_ ze3iltYjL?Rzy2fRoCN5_#I#EPCX#G2zvQmQ2yL(ndHHl!G#D>{UvA@zznsCN61Z z{P0P2*{Eih)XcI6j`F`DJw>ImPg8n7C(6V%?>nNsV#XDl-fqeMW|z;(nwe| z#9gc?c-gJY?N&2}pLOqb$%FWjL|zP@P-j*`qU}@eA+zaAC2?zh4B1$ZQxd5?IW1ey z+{^FgT8z4-iiA-CphQnCRAGxY zg|Y~`M-%lDRoFg^SvHpMT65NIUUw>b(Gl04IR>7>8g8@gvv11^RjS?5f6f9Vk-<_F zMyBB4^T$ICs3IDU*>pqEf|ftx8>z(EKiJ8c@@}87eTu5+1Wkv?%|J_@KV!{1z~18z!|2 zyB#mzG@K_E>d3{{bcR#^ojdKtqBIvOvi9N>tVf(NaC=V-di}v)JkN<^}+4@w!L73Z}4{rwh zvP8_8n`qCEH1@B3n(Rmpinq^Ojd@ilv59bM9U(Cg?&v|1gJ>8jv5cg=Z(BPU603!l z=nAGlMj4D?^%ig**8JW2Jw8W5bf4J7*4{bI7W=VTi_P!VRw&7{qF^63c2ZkCS1)Zn zuU=#<>+`+2u&YNSzng98X9B|``(E=Q+RT#Ad~)oY#TB;T>j#8Le>RkJ)L>9T zt^||Qy;m->q+GUHHhHhw2D-nDd398&glR1p?*p)rN&PdVy5GDfcrtX)3_-Wh))SQo z#amj2FdVmEnNEy7v=l4?x5;(0cQ6yl5qVP`I%|$Uls}N9#(b4aLcOE)o27eqeQ?MR z4EY4s>t6%-qAS4g(VY~|9sjWDLBsLGc^dTogE@yA8fDQGsx_skirm~q!9M$9eubwl zJhPy{JqnrcSnPb+p*rxfwQ_@Aw|=kPenZ7CFH#gfpqKB&Vr6bM0Z6|gMXJY>icGqBX*R-%FbWm^ za2HWAXq=C=raLhN6D9D?TS=me)(lmdelMz7UgkwyA0ftUa29li0Ck`^%`;zMx2X48oBN}F8 zElE1k5EL_FNerrAGL+iR7DKdsOw^U_>)MKW$OD6)UAbp_iRpfp=33YjGedyE1`+fU z!e#X$ie%^NMf8x)N@Pq=?ef+(^k+&cKM0la$IXZ}G*D6x12x0}Ub~```BOAX-z)EG zj-MV9m1#3qtS|`lXQQRSdVZFMO1C~qIH@A&#wppm2j!a%V;cRSA>R;E6xotl`F*S- zNgGVV!1uwWZzdkFS^a9Ebt2D>)^Kd{dDPG2;A7qO;u?2Q zy|#l_S6fp4&`j7!E_r>ZG>?XB0!42o?8Qg9muf9nHCUgY@qvsP7~N|rRNu|f^11b{ zb}<}-AoK_yXHH44)`U?mJPScMw`Ho=g8 ze59y8Pk`4mFRM@jJM2te^;T>V_u#7erkaXLDs>pD>Doem5;5(QgVKk?Xze5-mgT z;m4xx5OJDyYvo5=u+EJB~h=nYyOt3X?2~O37M%N*0j3qFY+8`;HfrYr8^VcMKXkwA5i~r zUBp=xf?;+=J~pJ}^nH6|M`NxhG>yKfetqDi1Ao`4L?WR`+KV{b4TNiNq60)j{630d zFR2a@U_{s#f=`jX*@|25X^dTtG8yqv^d#ux9wJgm$(D-scOnhN2L2`OX<=O%Rut+) zmfCUfou!yMGb#sFA|ccQOuax4XoyZ&6JmNb0b!#jkLY?l_Wo(^)w^(qak?P4DVDtH z$%6x&8zAbh=skn6NMiT?X~)8v?}gBXX=EZ~uE>|inTS#fJB1nqA)>tgTQd2hwAbs= zpTcfPtp%GyIT`80UTp3Yt9_1C!LR9W7=5!!z6PP9IE1_Cn~)3g|G(5 zzCF(N(h?jY@2Q5K;YGEi*8D~pgrZ<_o_)*4H-1*6n@381$>NupK*nl14U^40Y{Zk; zuFfR05%NCecU#GtTs&l2<&Vzo#WqZquRna~~aFEvd=OgL9kkmQ`A=`-PF zh%300t||3OIIMUyw`*BK4*cmc;J;$AfrZBAzv1_)he=(~`^)OJWnQAQ%@O(R*MQtT}3H+K7pzd zRvMm8&Y1U|LsDF9t`Iw%GYs3}lUyqk)u?8g2sbTh)y0;r)K0CR&}mf?MCb2-GpFIp$sf4NKLw{Hd7 z)_)ei#LaMsfo)G?8ZnIkkGq?3N}|IdA<@~aFB8GVg1csam4e2;7IoH~mYa^5uhw&? z9o#E;bcBzAO9;3y;l6QF+}k3ym$uMY4nK$oGC1`Uyzv_5Z@yNvn?Z>9Z1NYg(h=y^n+~sAX+6OrGQ6odjK_@of%b@TT z(i(8NmDZ#t9xfMYRJUj+pljiL+KyMp{mSxfMT+ z%#cwt!w}rq>CQ(QxH(NSPwO*OT*(CtfZxWesT^dF&+e56N2>*~rWX{_#^MV)jcRRl zt>+d8Z`>cfwO$urIMexJI19GGgu$F6Io{9n!n(s+hL@u4S^`s)Dqp*Y{4MxwfOpT*z8U4nOv(G3nBi;r+ zGU0loB^KQB>5sQ71jOU&Sd+z?vD9M?ovg0r$6|)Vr!(Ej>V~bZC9~Cr64wsB`yjr8uxDWp3?Lpb?u68yk#o-Xb^aGwFSao z5!ZtezBN%BU(#2VV4DNSi&VU(dA`GQlPxBxF#i?nt#8rdk=q^fLf_v?B;tsJ@Ju{q zl1FnBv_dapxozDhMJ5rSA1vKfePwo&SzDKw;QNH2)%$zByLrRwd0w3_H;#IK&qcvh zm2Dy#3B0;jV5&c|alK$|6ZIu0mqf6{@pD#_);649g729nLO#C;`vB&9SLy~E{c>A! zXx2zd_Kc>6l%CibmYW%C6&dH&B#|@ru66E7{C9j~H>x}H54O;X*zX6$#_Pc|rfwOV z(k88ZeRdXaYdv`>Wj%t?nTPU3 zyBsiDJD7J*{j|O4zp!g^SYl94m&Ku*;J07Mr+>1-TyU(}mW!{=Bpv#}DJFx4Zc;1$ z-2#bSyNPUZl5DoV$d4ai*uv42#>F&W8Z< z1+YD_FW~|%>kpAamXO7)Ww+C2XVX!K-;opoT(-)?_miLO0+^$iKk`h0v!h-inFEBm zrid0jQN27^8a?QBBD6%uTbx3!V$HqLDb#h)ua5`;;)tT!&TkKG zs}Bsk(o!agU;eTG_4Qdpk zx{Pn-UBlW(76de6MlruMgxq)Lc?s1G1fBl;1VH?x-ckR{r7gGNt*pQRfc+Hv{RTP~ zAdMpc_j5Hgq{yf$DY>4A4&e2@uw#Ff{~3MJ)K#I^Fw_@$Ai8`yDgdYZWat#~RUnS0 znAULazgWP!5rJCD{J0m6Lv*Sm;5@ey;$qy|*_`~2j5r+6c|HLGoHHwNKSIjY z?R{xITt6=}v+T@mio1f{b`}sLYvZ;Hz5RvuQ-LK>uC3o!dDf>}oZIj&%vgX2E9M%x zTV->7Ffwv&0%<$!yyRmmmF}u+Z@=$4Cgusyp{F#JUM{UfST&?L z_l|&Yf1HyG=JbTozPmi2Vb)8v`*lljBg?sIsJ-nS(*4WoG45&Ya~K(A)?LDQhez*p zydRyx!XC3v(MN(5w9m!mIaDlb*)4U=iCHj{9biHPRp=X7pzG$yO5UGQskK1N<(7)* z@fLt%QTpyVJ9eD&d%wd0Ag_fM*SV6SO!N&LlesuOJ)4P{!K3us&M^k6Hz3S;6{mKE zu*aD*mETb}0CR6=0}@Uuz4@YL2hv z1ca{vjT9SF7QR`mH|0>`kwPY^DbpGtQ1>s7Sl*<$byR=Bx9f zL{Bct8C68lSLVq^$Zgu_s8?L8z>ZVS@Lmm#R~C-FOM}779bxJLxIWE+x4T&Y-LCsj zcQBJXt9Iqpj&_%@)%Z`_s*dlOWS#=%LkWM$mei6DjGg<4%qT{}=VS8#=sO?y^1vQv z3+S-D>M@o09yxqK^u1Ulbo3;V6_mzR_l6unXE=20U}Eon*Ph_570qBh0aN$4L*?Fi zj#<5I>UX`ej`epxLIz?!r@>Nx8r8I0mg%D|*D6v@U+!Bfp5Ag*GRmiu+De$?E7}r0 zIF5i{PNg|`cnZ0!59~!i7I`ob&rW{;qdwc7I1Oc_qym88ZfqQ_DkDQ}ZFr94jicY% zZrAmGhwUs-Iy}TkL>@PFUXSi}9!CQF(|F-KavU+-R#xMK$Dgrrnzexf2;Jv*;#7hu zC+j6eXcri;gERdAXjx#I!F;xW6+yFZ%D~#Rc zy7iZ>0aOKcZ*ML^w`Wss5`h?i$2LA_*yb4sY$I0fa<8+R{sB?BoTEKt-;!t7*=l&x zQos#RuDNXks<{sjw5?Up=Vw!0EJtSDU#>6Vn4ix5kpXLwa{%8h3V^;bHT?mgzpHS% zWedIKeawWB`?=&cH42#PF}VUm-~G8_oQs?g%3R*R!1g-Or?8A!!4Gu$O=>BAI#So+ zbKbt0YU_2m!5QFu37C2>n0*u6UE8R4n|j%6Et;ckk9+5SVTjj8Vo8Y3)f0Ce3|dbw z46JgJg;IaIw2|fD$}L1Ebl@WE@$@0_z_@jI;Hv=sTFA;!DxBm}a!x7m{^EkbD{*#x zhdW39qLG_I?*rb%S4Br3l77>55?q*9iIFR~K>TB`J*Omic zZ;XFDueLI1ZKOn_D2jsTx8PKh3f#f4jn8ow2u)+J-`dO>xsC!aGdh@R`3=BZ3`DIR zR!q6=PZmg>Zqlg^3f!Fp*NXyM-a3TG^ZaTKXA#Fy7mB>*REOFfUqM zPfvcspvYH6aOGaDV{9EjP2K$Qf!B+8(}rX<5WTg_Sm=G!jWZ^^%Z8hv9CybNTD##U zLD9DMJCb%nv46b>px&KBL=OFKU~q;pprlF#wDLea_vVk&T_KxUSAelxJnoNf+0G3| zpfWs{`Fzf5=x|5zCqABW$;6Z81-fOM1K#!Nx16!?h;);3x}&0t(3>IwffgKvI7!T*nRTNhE|L z0z;l`gN~~2&<(o`jqqC(zSKLJ`Zk)zA3M|Eco?S~ClsR(!F5gfI#JQIEbNa2T>iy% zQ|I|UP&%r@2ccq~6ZTx=9Cl$6UB@WKyFdl5h{=NUCtx|Ej5fCwBHL(6vF*c7UO*0& zlGo~)3I?#Wk=4a@SFFa@LqT`2nZ`6Sr{^q15sNML^$8)3e%B|{9f-8yAy#A&n>s(I zBT#U;zT-a7=&%$dDpe6kw;OdG&?MybXlBTmvrSN>_m>^xQkc%LVPX+;{Ebr@$ z8h^|UD5{!eHI0mZi zYcIG~6EwD|lf;n4pUn20i>n<$5=j-fSW;-(*#g^b1j<%d!I@~9>sZ@6mA#F&n z{GO+p1?FtAmNNV^@euUHdZzfm$?l@VDrvHs2Hp3Otzcz+EWO1QFIjllH6C-?af!ZJ z4d)aC4DR1RH`<{+HXqyEtIDVYa9~RQ9(;U!(@F7sKStEbv?^$@$pLx2jso#Epa8rE z*d-C53xl<)-Dgsc@pKbTZ*2g+=8kBQEDcW}J#4FwU|-W4y&!mNvH@`K|0L-%#HmBO z0x`Q)U5#GHCYAetd-*5=%~Tc|?e*=I?12zDL$5 zcF-Em*jUKF7HVB(SVoe^uJkh8D^g|#w9^Eiwo0O~~Ny&qePU^;3AJ>)W~A&H+aQp&m!adR!e~oXd=FSwKpei_)2* z7djY8eD~w^QlOZBkOpsG+X8_c&T4SV@YOAAHmSIWmwa}|4w~1tfZ8t5WV7{`9sih| z-#|ghR#s+jQUM|^LQ+$I6V6lvx<#lUFF|LPpti&jUo)9$2`rPWA`)g{?Z?~j2)u$J zWz=26hA#}uUCa!XDQzMp0G<3yM&5zZA|zh|alhPIxS;uBH5`0w>cE)SmCwV`g>u;$cSD@g z!w5*h#RB89&2MKH6NR&778@&W7@oB#(r6geS&Xt#hI!={%(fSoRaDqRYYW23VvYPWzCV#9_r8R@ZMYY z>{k8{(A{pig(!M62a-fVyh1-lrPi^HljfSJAxXuta2bSZRe+q(PAFd8q*-T-(gHu__$wQ7WMP<~Sdy=eB)LLV!Eya}O8w<$ zJdd@i=bd~H_1_kftVb$H6t2Y-qOy^;?OwsX6P5vdu=Oxpwl##{J~vm zIZyQ9Ua-9JbKhx>3c0HY-kTC@55p>-&b;bR(5(P85_iOh{?#gy4S+H4nlmULoS$w5 zA9%lGI1%r37m3cZ`Q^^ow?m$$$0S>hcT&?l{Sr&*$2-;tgr2JTCk@)GEOv`dK2It1 zGhWv~inJWH*MX1Tc{Ew7;-)*kV~`!ve_Nk1dU*3>L04@uU(!5j@%trrSB!v!BI zYyxUAiIWd-|;kCyaqu`U&;;UgQ`S&zuNc+;}Ya%F_7=oRa~ zC4hfoWqO_I{$jY-Yso_x=P3SVny_SKl{}+#c!ZWYST@XtQ3fkWq?N(BNy9om=1hm> zkKGJwRS$hqsRsUJ2>t8Md%vDUTM`3R<5^jyf?+ROE-;B{y?dV#M|bpNZx&gvkr0s> z^X!tT_wb+(iS$z^gqsB_47r(aa?6QFXNudpD88)&4~{C3NIWt-phn56V!3XZXeHSNYJNVH9fMXu6p%s zlv++`u$M)hdi?^|+v|m;7)|kg@LJ@>IpvgHdy=M9>vo;VJhjBLG#YTxU@hoDFj3g?j_YSCQ)WPJj#!W!she!JJYQe3es336RX>e z6826U6dT{yRoI8?rbCn7_J~{PmGqTVTU2i62BaNM)4aR%@2Xh#oN56 zV3`smZu^DT+1x^pd2sMCVHex*b!w=FAe?;vx&B?P92c(KURu){<u12s^$iRzC+jniO%fMZuNwOq@<(-AlXk$ z*8Z@bpu3Q5Asg{)#p=^zYhr(`ud5@_k6KoIQ#Pe#wl+^^XFmWjc|<^??Oak;RdMn7 zU!l+OgyNEt6`UDs@9IGK!AY0}5z#1XD&HEvX62xpSl(1hJL2vpc|6dg7b7%lJsoIq zhkR)K`-6biR^-R?ZftY&g8hZYiF$rjQ{ZG0g#FL3e|ImxXp`gQwOs}{pqr$jTIz9R z`3`Ji>L1?`PFg~Ip?~$imAruw7J3a1Ys?V45HNXoDA`3V64_c>dRstWu0(Fd{rBFy zVv?+Uf#d>U#B1uMa@jf8>9#UX=hvnD{EDqjQl8Svm*Klg<^6N=wFNwpb2O$r`BY2(Sp{@}s0HcuMncHo&h`>vcJ{Py3R zi`S3o7-c`i)DO&AwwAj$$I(LEj#;(Lwe&TVI>066|0X~@d;%Vq)rAFoW&xB4cL!b+=cNm$Stn_RiP{rCH-2 z!RkP&O^d$@?GhaMW3q-ZBjZY@i+u4f22pOuzgF~WbRi?bN0St(IJ-MGIV1m0NkQ-u z=;Wm1j}ZI8JG%9I!Xql49m2+JWA$dl0?dPhPZ`AhS8-e7eg1G)+`j@Ilh3oD5tL{A&D%nj+()1eGwqGB`+5M4=sivNrd$PJ;xd4zu| zY}r`H-%(*>9hxNSyqQ$JN35;Kl4g@u(AfD;kp9QB9Vp%4+h4($X+uvZ0>rsuilD1} z97JXreBn@9Rn=qh_hGSq;1EzIQKX-ttnWO?ME-3yCTUB6kagsAQvOHmyH^584`sdb z`F>cpIa*#GAlbN96|GLN-ECd^Ta%1x1iZ_yTt+iHZnlHam3nnX;hF5PM#tq^CG6Ug zii#VT^M##MvMvFK#d`Cpq>4;&yQNOksm+SNI_G?{(LxFo`Dj5;Te9YdY1|bL-<(_M zp^@eXU;2i%D>wT$%*`o88V{#yB)gV7QU#)W9%>sJ@>rsCdytnDTz&%=6e3&fI+Il@ zoa`oA6-L_H#_$STOJmRd`Id0B$KJRRE3WJV`=!PXg)QZc4SvVo&Rb0Yt=XOEDBBDP zo|&oJ;;@5P8uDZ&C0I7D_r*uLm!n}36Cil2r5QT0i z;-&hC41Anz)5Z@_lxE|8?*HNXIs$qcC1R04EM^a@pOu&@1TZn+27_pVdLQArbO^Tc zHEd^Rw$XlnQn>sZ8|P`GRjdtP+0$3AT^9;RVMDA#zHYnRZsS-xUst2%%3%^6xi=Sw zj!UI8KkwW=j_r4Zw!4cA?m#F+A_V;&9v1st2A7y+!P?DX-<8rro`{zRc8OzdtroI- zo{HsLdIqeaOR-%y*>gD{9{UStyRNcXl0Ib5^&2df7S72%523IYjsBje`@jzzg%J`C zU1eu+pXn9UR#8^q+oTp+na67&)}pbU>Mbm$&`$6aBR!(4mis@9gkZ`x+?$Y#>lNl9Ut^p)4W)ZsQCr z6D^!;8sf1Ig2Ec@V9LLjD>Fo%kWOdeytiZm7iIDm0>BNN&wn%B!yfjSbRM3bTapE# zbG*6SRqA(lcRvh7A%5NoImv{llHqzHxnw9Oa{SxGd@t3ak048J!}1EuuF{lT3HJnA zz}J1K%~2MhdAh@`uM}8u)et@vL~UZ3R=GhuuG?=Cz>I8KJo;|;^Le1)Z+<=$dP z2wI)i@EW>j*mfCLyyGjYqAqJZqTidLwnf5+$uIjIAzrFK2bq2@Z4&{Ro1KXzSm<=U z{L}N4V!jJrx#TN;WhM-Fw>|8<#Uo~~sH~*q_j(=5FI?vcM=$KXV}8=AtmKu(Um;z< zcTe~5O3<0T;%>c{99Oyt-$@EF;2bKFVhl-l0KAtCSJqDqjGOzDPrsI7j(GqY5{|6 z*n(#O9VNNDaW=e=m;<_v=^TH3-1?I`-St3WDrDSh`UP~a)h*E3&`_)ozR0S?9aY;G zM?=sr{WRuHuKs{4I^Hi&AAnILb5t+XNdz_?%c)Fi=2te86C~^kI2d(!h?R^;-drqq zn$E?!jj;{(O5RYu!#PVM&AU)!$fVI=0+KUvVk~$+g*;U!ek%*0$^ab=Yke0_GCo!On6-gYmgiYX4UFRr) znGiu?SMfC8DhVBgrYb_7JUQtjwf+(o=3)~kSHN!EQd(HJ8F9QO`)$17Vt*k(bl-L7 zmM#q!@g4Y|lfEno_i(+Vb}Xf#a$|ikPMHc7C~A!5HEe8J#WKd~Pwn>?lPRXr^-q%T zy@D<`hqy`br?i|VyMY?;3StvTp~_eEaluq7X*EvA+zS1+a~v76BymSHgwwP8Fa)Pm zu%27(M|*e+Kte3qa|)1u4i0CTWX^RPHLOm_$D#+Td;U7^ciTyEnJu%ttT^M{2#z=iz9GeoFY`5{Wp7IYNOxqC&4N zVETCvlO>aa9KZYiB>27Ar);xY8n7*0(um8M6LV9`lX8C;|CD%^Qfp*w*&9fHX|#xs z*-o)`G#~__wj9@s_onOXh%eBlxuzo8>h1ISWf&2uZklP$OJE!rzKurl=peYa`OUE@ zNTGIP#DYGySXfX&LH;^DXdmX;U^nrlei(hLc^2*Ib|6na189CI5%bmZ$Ev+ofWe9% z6=ByBxg#bAt)lfC?3_1C7|9+KIT$V$%B9|L$(^Z&FoRPs4q!5|IZ?`#IJGZ^+@8fJ;URyQ@XTU%;tW1o^CYc)};GGOL9Lm>$*OyXLC}s%}$-h|q@g4c0m) znG9=dHJ571R`&d53FOUeAc$XNJ}n7vno*WR+poo9B5or;33)DNHXf8<9`3{93)M{# z1k5EQS$>ouNvlF{(pcTpAVcxit*}pQFlG|PA*5~!1J+|%td@sD%*JcxbMQ32h}p+L zbvv_W?sV{6G?N1U*lI@>9c^(>lo<|!JS^hR4xO1VEkf==9Uyd}YRm$TYTmbZd@EjW zGxJ5!IQ7ja3(LTeR4gO2TwFpsy*^3FPe3$Bovwr`zTa;pZo_ugAzS9RBFvkpuwFEN z^1&$nIy;p1y6%k?w3MFNLjSTtiGvxP(2;;2K*B+NaR7I$(TE#kg?XI(7Yo3-Uk`-w zLBDBi@$1lY-RziX2yc?2^JYg)n_{B_{B0ntNThwhYpT?II8XX1r<=6;$N89^?@uWu zk`iZZ1=w`zBX~z+K4TAj(At2D<`wkE%}vje@v}QL&;%2PVhamiMjU5$n3^f3iaD;_ zX{~EbZKc(3D$O|WLjeXC_$#_HuiYI?jb;TMj^`{5u1Uw!(eS`zG(c0muQj0Q*Wqsd zFXif&JGkR=&4-Eo$Ufic3+I*@PMZ0ipgfe)K=!J!{dJ3+Mc3q+Y+x8cNjed$_LL+u zD{FzQ4MNi|nFDiD92??!xBxD9oAy_{g`|oOcu3)1eMF~J2je`A>x0aS(SylV8_u>R zbIrp?%oJV8#M;&nm0uP`26*ANTYuxvmvhWm7bF!*5_jA93_Zo?%p@uNfVk{6t!~qwK~BjTJU64R*hP$)jj9nJrJ?$4yV*EblS53ys zM#Hh9V$6(%R;5@azEb~wr2P}px_G##b(-eqkc(X<@0;sA?*#V*{H#$$_T3?pUskX}A}RO5$;5oO%RQ(9^uUa8 zXR$^M3Y&FY9Pxcnf|s~XF{nfv|PVLAOfUPs7!(MtT!AjOV&-hmLo7qgeNBF~uX z?u1w*(dSh&on40~#qrbB5%)Q*uSnX7A>zn98te3vBRr@R8_lkh4S`Xj-oA@mw3Y!} zm?iweq{Jjjal07k2M^h?13F1L>sYJoffvimH!+m?6i@1O8Fr4oHr$Kv!iLx4BQbt};i|ys|{qSV1KDW0GeZ;E?=aJ7 zGOoa5?l5X^sg5lmlM`{m`a7*ng3GPOK~&o^VoxIVPf8&tRG18vY$h%KS`!FQcT(3Wo2gHsE{m8 zRBVWEOl&;JAB*Fo{^^=wXj&_|t}2ku<+Joy46Dc)iO~P@r#4;lu}E#(y-%#qWq+s& zY%ksqAGEU&QS2OP0V&V^GAyv>#U!-uybHG}FJ_wSEoN%+Bz>JZdUyXN9)OWNP_#|+ zKJcvEg2%|LHaSk(4* zWcr-@U#KH2#gCcc^~hd2odfd|80pjTzfc#J>N8luiF>lKo|?U1C3)cAkFdx>Ua!GV zDHv^6xQ;UW0YTZKu0Ph(ijIsXvD^)C5jYVszVFzrTsDO!? znVFrPnZ3K#3HXA<-PdXjZXF;)^Fx(|__rYm;etd;Pp4iwb(HOa zqpMSBl9qKJ3*@VhzuZU7xqBnFt_!l-LhWo;Q5a;2u0Z3ZDv7P5AXrwrO@c zOuVc3-{fNnucy=7Uo3dkErNX#{$U*5MHDVUc(=vk55gHPS88K!hl3Ls7P7cE(%3 z{UGp<=TxCTOJ5mQ3|reJIwZgsBZ*>^tKaRs=}9*B4TjkMT`Q)K{YH*;;W;A_4gB1! z;85t;`!5e2MHL{ww^A8w^$U?_G<7r_tVK%XJeyvg0_#NHOwRs#lV;(`9OT?qf9`K( z`3`4)M$v&sWx*47l5Lxo-PZo>(dU-#{5%lzZS~w8@>B!hjpZ8GWQ65tRE9{K+rbB| z&D-X|4O_={skcqGFfCiV0hShbSYs5$!e360LX}XH^(pc27$C4wZv&n5oBJM_hQ8gy zgQJiQfSkq@7S^NnpWVT29{Zd96e4a`v*qu?gF1XKEA;BVKScth!a^n6QP5%Fm9w=q zLXI)Q-Q{N)9013)61MbifgIB+0w66@ds_5EQd7zDfFU$CUZq>3maXplwYHZBSTpCp z`V=-fb=;tRB(2RtI)+QC@bOx6yfsB7C4eJhzpKSwa*G1+rw|HYza=XxH&q!lH0FOj z-*x>#EaF=#nh>uGj?Eacd!rD_bLR$Z`E0eBshQ5*)(63pspvSPY0T+eLU5v*BuLxy zl9?y`VilO+iyWRwgLbDj*dF@-SutL8)(6r->k{N@{FYI=U%x#ez?Dc2P|mnO@Qig` zZ67j(zW)gCyruFx8ze1?(texHxBbNP_GIouXnMeo7qZ1?bip^k{jh+<&>gK zZK8)vJB1jdeNb|1#Vl)M;ZF{z?sHn1R}Q;l3ED=OqqUMvo=eOH=8NVW zpvF^`&c9@s&aPMMw^b%wavjqH`iea~kNP^l)vGrfJfPiXJNjAG)eYJbwd=Q$5h-f&e z>d&g(%4*-4XZNo@gY=2(9%RugE4koKJ{$`EkBC~Lb|d{}ri@Cd@Mb~%Ry!e~mtH!7 z!-ffun&2lI0qr*DsV%1@e`kxmKfsJ)G@vD2 zt7H4iX_pHGd=|f_a&}s*MjH$rGXP@m(W6h279*+lKkB{#<97i;*%9ZwYn7clSG%B0 zafdT54OTJfiI{gC8$|+SApLqPzy( z@!O}ih{+9^$5f3UCst1(V&Rn>hMlVk@hbVjx0;&M@FuHc^&Q%md?!B?7z`v<9s7nj zsRBa}=u=N+#}2ncJjQFM9@Boh49RF4fD$DeiaJTigZAOZ=T(+j#_eXz zeHSTt(#PY>yM^t@-&;HuGqbZ1ubg{{l8x-ZhFo^@F`mo*SyUQfPq8;DZ~lt~P>H(@ zPHvbPGU`erD7@yeN~_@BhqpqmTdv8#9moOj8|LUrqe%%h2s`Y+OfV*%Df#VUmTw!% zIH|<#wo@B+jZ#l`!Z^D`^R=r^$HZVJE^BOhttPNWif;{L{fSwg2aC?z*>}jWUK1DV zN0uhM#l{&I(3wG(ZW*Wk>LYbO61&|yJ-dZA+NTlrN3OK?H*!0d7S1}(%O1$_9|vvw zMt}K3)uWsk=ew_FXn4C#g;6w&)HZfz9)>eIk8GP}T@AwliJPTLL!0crEgnm%$uh>< zHSLn9g+|kU{7Ot?kzn37_=c2yZ?Rz)VQHjOYv=9l4Fx1ZkE}HIW%dV1T(@HHe-Z9UoyaheH-<-sZ2;V>?x5@G3@})?6CGYdvp8?AY-u zPKf&Tx`YTLJD>eR(Ix0eWDQtPILKem?xuFqp})+;xke)lAN&% zweW2#aARkfGo$Haw=w3}QCOv6IXvDtNBrSV`u<|e6m3^v`qr3a^sO@>vPO5#(dG4v zF>%V+`&LQ#8hEb*u8tW$xKCb7DI}rS5SDBRGI6&7z^MVUkn&$5;`mp}w)kktS86vz z3wovyG!rdu*C)W${nu=@)t(H~YQe{ycCH9zA_dz4+#7xaaR;(-88qr(1@5^s?YycI z@SbRwHt>qjJ%ZRmr0RLG$D6Em5KttwdLeu8%J(c*ztJJjQ51PSKt%~}^uLJ?I9dXB z>P;VWm10_^kC;6xVUbO#FNNV2g1Tmz;#rT#3!DTl-&=bO8h&D(1S$tnC9MvCe^xRXU-Ihew zfnDu1UPzhi8xecZbrx~sk$(L%I#`qLd=942mfpxBQT8E>P)}8I-O1g|8nT{Rq==y4 zkq&>koYO)lmcOSGh{o$^MWF_shh%vpONcEkWP3$#PzoPD#d?Q|YjsCM#>UZ(RdN&+a zi~hjlvkPP7lKtrlMH=WVmW+NS_eQ|Vb-#y8yU+d3OOylvSgkIF&-ByTV zd5G)>A-v3UYU!zhazj|2AluA$XZdkTEc88Y*g^ZyJdsq7j*v$%)ST~lRi8Gp`o(c-g(b#_rXf1)nE?*(D4k zjVtx~dd$ne{-U3Hj^N==iN)ZNunRf;`E#5Xz4CNhGP$!Jc+tOzi;spD9Ijw%l47d> z4Ai#5sZJmgaWo3V1__xRW$OnZX;0bV$lnd9pw2-c5_})k;8w6So~==e^J?J`0(0bg zrNJ@~CY^N*bXvToZ?YKG6Q}$AxPbzwHrS)`6MEaYjotZQs^n2+gxA&IohjRz3UjRQo`vW}_vhY(a~ zBnEZqde)?{1wm~M&^|3n1&W?dn`z6A$UE+I~xZ=xvZ{tU#3 zd!oMp3P`04+i}a|04=ugL$)sc`#1#!&wHx(ii`g2d!owGpY1Rc)U_(&X3;l~1{-*loIzS*cDs3t@ocCqAh}a_G67`|TK?c3hPA z8t729K!z&mjM{QHT4A4y)t-P{V6*w;%x|P&cMgLX>^fF>A&D-K&nm$eN8%voGr4Rp zvOkBo@5Q7R$<3Tc=mN2#@#3d^H5L7SCh*w?YGa2Fwf+rACVpEN9SsCx+Tg2k3I#8N;W8Ol#Q=0GjP2Hh#QKz7482oRf~Uv;b%DXnyjol$2D( z(ihbaC8><}*mN6RpkbO8IA(OTO4f==j)_$rvSr7?#MXHqJ5C4eS`zJHN%RDk8p8Ki z4uUqQ>LPSZ3x|CmhB*cb8n42~3kev-wSUT`-^Vv96>R&1a=rE;m5C&?Zh1ch;8;S{ z9kCJnW^Wj$=2om-NkU(8Z)z-F1w{ZfYb)zuQqtV3JCDS7@)ql%g|>&}#%;*>Ar-2d zwXDPDeG4D=!T4|v(X3YaL8MZ~LwxZQoV;kj!P)!06NJ{tQmU!k(R6(gnYDz9KUiwz z&}(;_JftivTWWQe6Iotv)npZ(uk+;8Ec^fhQl!mXJcuWF_kB#s9k?g!r6Sfy-=Ba(>%rnUu zfaWnOBAwS_m@X=TYH9$*aLn&4x4SdcbOV()S!I?G^p`U#clmkbn!2wlZ?V8>EF1** z#O#`WDjBMtXfdk{G8KL_e}#S^fACI)klF7w#*%10F`5gG9%xVWEh1v-x3M>rUI4TH z{Z~*i3xj_l^zEDe-j17A?@f*7;W^+13HJNyMas{lfIYxx4R&XHJ-vi@wK`5fF}1{es2HE-Kh{^ z+(>fc6cnz1nHt~aNtxqQ3eg`%+Cv_NT$AegKhdXA`<3l|NIopIC#+r&7^v+TxFXREf za+*^vD=HB98#D$t)w_{%Aye`OYNawB^;2db2y(_Yfjkvvi1B5;y@8H`W+!_TAVQ~) zM?vS-@(S`L8+ndviN*ngW1yQ~>!91~D);mAU>u6s7E>97>qW@py{^?^zO1oS5li$c zP$#gVj?sjAga)iB6unlr&uY1u{8aJu(S`=!Az?Lpvjzg%ij*^=MLZ7n7Mb~!zH_e^k^_DD@qr!ZTb>$A?=v#z z00YM1Yz6OJItRRvKfbv9JNuF2JWEKb>y2R-8#{XeWa_WCm%fPO%IcgfEqxkO=V*Az zC+xbw%&6hH(+fLzP2`SbW*kfFiU~naQQiJgL5w4|il2uVr!->J%+J=1G1tS!D!D!} z)8tYmN8PbMb6ZoyEhD|9X`fPco(yaDeD@CL*&$PQe}%f}-0gB-Qj>{7b$fQ5A8r}Z zeUpDAw2@C3CGL{{085oveq5A{OguhknI!`!cu^;kdIEk|lpGQt!MT zGyI(nUf@(K1LtYa@VyhM5#Ru3VX^BUZ&=z9*eDuKkh}2cmR=m@s2`l=I30a#*kZT? zpjLW9_NiMbbp*d7Anq+MS0nT%WNVIgGEkE0^isyvtw3{J1 z@I_H=z8GVGOt&5W*#@W1v=oO~AJ;x?9s9mLv@FPG9^em=i7SMl1p3V|XqGVjpjTK} z#n_q*(=9J`Ox=wSED}EpJi}Q;UY6=pWtCV!|!AvgxQ3pDsm57dk9|V zx$M7nZsc1aVlW^E$bDI(scoynGt>U{04d>4$c43=xpa(I*npSxvWNQtKfSrZs!BuK z0hQ{9Bpxw7XaTi72xvEPD6VoRu++0TtWG^*y(u!fvKZ9&HpT_WY>Yf;Ao0(QF9MS8 z2Ol)lBq?g?hKsrE=Ngstp*O7eECARQfAiI}8Bc)O>Fg+l3>P47+L2%1-rlY|WG2mD zSKiH*vQb{#OA2x*Rw?0OVZFHkwrWeA#u$T;ppIeQx8MZu8RGt5T=HShLWR4l)_42W z(TF|ciMH^xUN}(O+2yB@CCKm9wGOp*k$C2;74eIPUPpt!qL!fsPx!xB0JlIIv5=LP zTIIJOhme0{(htF3U%-DE;I1dOal_g?Ipw12x$(pw{S2a4O^33Mw(FKf96zGnARQd%g|q6Lamw79!d+`R<1B)A1BUTASBF2TJNEd(b(aYAsH;$GYx4!>vS zd^qP1cxT?3=gXcXlY8%6d*8YCz1MZEwLq|IQpD{1yvWa~VIlh8_nvB}t{_d&e}f0& zO7agC*Qo7b|V4jL{q-y#M{tNpWDDs-?$Mp zFaykAYvT#p(Omx(dkFedOfJeACLt zI$Kn>RGoXcThfj`q*v!aVL?1)-pG{aYN69~IkbP6h`v4d&wsJge(NTF5dHsGId((- zzf}$=UlfDcjAFeE&*zTd#A1AKZ@`w!Mocy*77~D!c)+&&WqMRo$4JNDyd7EdKe#ta z+wAj1fDu=)46qtROgR(-w$Zu265 zJ^KLf02^eSUebUogY@T@Zh+~$+dqDB?p)b2o9TRMa8mOB>|aXL&dyFzJ+6etHl7kQ zS&vd?&t}77uRNR$Y@2K+z+|_}_Y+qe;V=ykspRI7>HPlRwfTw?$Md{?BS&Bo5bY8& z$R7dQP{;U#)YX_sBA|FQPSkwH+K0!Kf;aBS&`@-Ort-q1DBg~njOU>!D2ATsQqS>} z2kH+nO3x#~sv0Y;g-av>~X`wi!^WF&!?Ck6nr6N){3yd-U z9UEok4e6kwz~mHvt;1q{;d5(IXx?DW1GKl1H=w3l?sp@$P)hDxdc`T&e!fU3%V5F| ze9wl-v(A*$3QeDx%bl4jVssVYoBWjjTtY?3#cM<0A!?o*T%LRNfk2|&%|X7lQfSJ- z02}vP@rhFbj+%vu{^alMG7AIt%x~!sTWI{((ye+qMI>ozoUK}BpH*0%0sj=v@A82+ z>;~@tO)VR{_eK(@_?pj6YR`1nLWDAMU?N`?X#^5@Xy7x0+InXQM5xaW{Y;%j2k%lp3flwr_5K^Iw9HT3cN}t)6U?Dq;W@6#>(g zBDKsI%rH9RKnzaL0^wFOjC43k%OCzMNu{M@{RzuT<`Sdr(Nt z^Rx*_Y=8XJ*1@I$P5!-aDmOT$66R396nFVS7{(9N;p7d;Xb`LSMph*qzZHb|e9VgQ z83;~+8pSgwZdIVYp`Msm6U?d>`u!@?fBbS`1e{|a&zbV&AMg4usJ_5WW&~Rd5^C#> zFWAENrvI>5W~7ESVN_+EL6Y+2iNrQJM9BpskK1l1&4{LNrH0T7B|HLe4_z^==jl>` z0~u}Jt<(FLv-q)3oYmDy-u)_*h!imRwwCalV_7prHl$h&A&ekT5MNlS+*emloa`BFIUi{ zykRL+*Kj~fz!@6z^M`bEcNhS-`}joJ04Gf{HjR1&E`BP)a2OOG!=0jW(R

ZMeH8 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⋙>W)b9f}(S~5?W<_J$PU+{Ti5cgYa(xTl z2rxO(-#Ov@qfW|~cU~x^%+O8pRB^lQ9vBpC(`&;I(v70IeKuV@~ z_UV0%>hB5W0VB@Et9S{nqzArsXWD&tyG}wswo!KjlvU2=CIr2yN4V!jJs-Ab1;U{k zET-F`1rgrU@u`E)%Q%q`@gWG}&27UnhiM8=uYlKK^>qM`%Je?RX^Q=jv(9Z=>L|zj zmtEJY;`4gNH;XVpk=KSrD9j0CHlIOAqiLh4Liaj5!k-c(cRBrRl!g^4++PgG`SsZ; za=`)Gq%tSz9;?gk&K7{^h*db-Txj2LeY7y_qqz3dfjq0KvnC;ombDCprKTeHGBmX3 z@@j6YfIe^Xy?A{er8RMpPlwt5rxYvUnT8*KpTPHc?JaeRg942gD)Y-U*`O7srO1T+ z^uZ;JxvN|Fapzoa{GwnWUzg*MQ%-Lrh?*y-RrT>yE$~iyP{7B*Dq#3xh$m(>{x)+U zOUF-fki0GZX8e7(wqUNVB8Ycko~!QiZnS>)Ynn+=shUO|E_>E0LKtL2l4nkRNfkrNsI`mW@1 zt^DlkjH{m{b)fVxrI6FPYC1zxe$0lq+M6%set(ks(_1l1;Mfj&8v>Jw$n$ib0WTYB z*SKwEp3B-}*BmkmU$Sxz2)XdPoy{e|vBnh^lDvnsnt+ezo`r`?oB|CUnEdaC2a@4{ zqm}nJf82p3eliPS_OaTuWMf<%D=f)6U){~=!#KH}orr?DUeAAY+X~suKH9@PK*~9$ zWaEmCo<}$`ea^5Y2#I;^+*V2VYG0E4X6hoVImhK=Fx&2p{B1xf6&gVe(Y#8g32&={ z3{ioGzaeCiE+SUL4o7^oT4R&KSGi`@3Fb5{K~Aw^E9h*dbK3YlweRY3@kLR+A;Jl! z5jWs)`_2V7#W*-1p8$=EHzh>;*YHQ>F6y}>g1w#9>$2-}R^%n4FPnFAZ&tL)xsR;> zY{0IFQ17!&r!m(u+_cKq#}js7;OSXd;QrTXxMRG{2CK}^aHfkP>qrPnEO4`Mmg!kE zdsCia08fp51OM4t)`&DE5naTYeu>SuK2>DoZLps-4sPFOs~S9~3*j?qHx(`SR0n;w zT_T`7P)uv?Bq3IY$FW&q-DG`3ds{y5L3Lx#0j;Q0ATb>N)MKKgSE`-esqwB?{J_vb zo@9Qfet&QJUn)@f8@BF)1Ps5SVo_Cye16Y+-Q-6~1YqQK;VO@QNy74va6p-W$ggPm z2G#=$gn&=iKPrX83(jbhIFC>w$KB$k_izQ_Tl1bATm!&LCj-n<@7H|`70=HGxt438 zbDuFH_<6(JP0E#6WF|i3`yc~!8;%RT9`9q2h&wC%7?#9CX+ zDM-|M7^gPiaKkc+dvEP9VhKlS;R5=0&}Fxja$6jns>an;EzsC) z+P{+<9q?=&XuOhS=`Ng1@8jsGoi*dGU~!h(JR>FHY~Tjww3ds=7ws47S)`e|I&f zB#wf~MGMY;*-w^=yOp@4cx~Zv{MlsFECBodLU=N%43{Ri{Wem%9Y2XLJ$kT2YnckI z)m-;nv6AgqPtC+mFS`t1&Co9~u%2(lEisP5=gjd))>}mV#vUaBn|^!L@$dC@vs^QF zi7w9`nO@y1J`W0UL!k^iV`XXstb=_x`Q|j|jYQv6-P^t^Z3Tyb-kfd+i7v6$W+^t& zgctQvW3+}?&0OV29pmyFT?TWi@70E8Hw%ffC2+k}-|6-%+Z}}+)ykXvt>Y4?x z$iG)+x(u((H1O2*@~uDg&q`J~wW#}BtDf4pMP>bvtryYiHi%4rnF0EirE~7#`LKce zc@vh!deXV(b63`AGS0ltB&Rn7R+EV8pqRQk4Ml780UFy*dBme29C}W64mEzp`rE$~ zSC#aE-4->6;fU66dB40M>TQ7^UK8*(se^vgn4HZ;FDMq&s-G?8Co?`$D*O1Kt<>MH zkiSBA2(WWq{vKLIzbl*rbk64T2LV%B%!Hbl$r)j=h0~N)JFnxQ5u{UjTT9u=1Co>T z=wyGoNeu+|_@&1W9x4u8WYf^G7tn&2&ml`a7zWdnoBRZ(+<+cs{gK>6!fXep1|!W3 z)Zr)(I^^#vXF1Grx6v*1ty-GX%9r9&*G0&hUL5S2_{^;s$$( zn1D{xC@62m|LY6zHe^!{bikO4!*ZWWo?Dpc=Gpnn4ERv^IHvdwY+Uc5a zoM}3-l7NP^;T5k;5D86AJYITru`}Yjpv7B)15Z7o*L2Q@%Be2(`mL^FI#xIP9jB4_ zt@3CFyw%Ywp2J{viqtE!2Fipv#=FfSStIysB_UQC|E4GDhLFdE5tivZAjJ2HNu^Zb z57`B1)6;|(5zV-tGE&^@7F{sd%x+&@=Jez7(4{_N0pu+#BG{#36E$Z|F~Y}%B^UBy z(G1)Y;6%iVC>K_1O}60`~9w1O3(fK7n)M} z--v^yi|nJgJneK_$t&<7dz&`vMvyuN-o{b@C3=~+)i>SYnonMH7k3KVACl+2KRKXv z0&I@ZGv1R8z#=_Q=Zs%e`rD+gAck-D`*EeG)j?g7N;8~)F~DQuTd=%a`W%0wGY117 zoQ?$2{Yp0p*5f4aNV6O-b&!{2>L5A>IOe+Twc{FLvY+u2=`r9Oss{xGt`s1YI{`0g z>j^&C>q1jI4}Ukw$-LKU38wIl8~CEuuyw?~TK?8MCIk|v?VxmRP#Vb0p97I3TisXu zM|}2$-JpqK-26{p>7zuHogHUlsJrlLIVt{fq1OiQpq-J?9a`dK-xR9p=%llNs*pWm zQZsvsl7r*&VFTM1IW8bw?2`=i7sWe)d*t+P34JrsXUya;Uee4KmbuJiH!Vrs`m$G1 z>KF_t)kpN)uM@CDD<#^5`-V4k{3z$ zOt?|*j22r?+ppCIXr1UAZ+~D$W=e`AJ&z5s|C=oMoo zw}#KPncygvpQ=REOs6em&ZJxBTAIkJRxM?a>_aB^f=Le*rUiA}$g|2HP0oRJv)Z&W zpR|xwMAbiW(sqgc+pVSArtkSu`hts$3(OUG!{+!g6nqMGMfjbh*#5VKV+vG;@36QU zt@%u?#_(3(q$Gsqeqdocz#BGj`X@FBFm(JO@hb1*p+z}j%5j=_HCivU@Af`A^iPl4 zm(}2{fP`wc*yqEs3+7Oo+h~1cSX)VO;xFJ2b{DIjxh=?pgYr&@`4$RTcLNXPx$+l`3`#x9hCV8%K4d{ZibR49G z*6HAUxls$in>RSQs@OEpYW&q`jd(_M`w^xb>4||_lmyZR{NZapx%^~5^q6tfQIyqa z+-JG?k1|%B#ou`)RGJi&vqU~Yl*M1sq*t>)2RZiqPSH&JyC_=C^0WW$?wyYE z-9=w);L}7q(XPzh*|TZrOyET-CCZ<%inrjOducOEH9BN>M^CpSdm~S)+ks;KkYPK? zhr^?p^L$J&%AYWU3#mW5B3r^iSy{J;%H#D{ZFJrQ@n)}p+_a_T3&#NbZLlbf%I4EDW zo=2MAbq)L5g0D1QZd_Hj7Hz*lxyJi%hl`+}kH7bZthaGsI;f&yzxTeOZsUqwRKGwu zwwv-D&aTvbyuMgXd73C1ybH{xUU-FKE{k}LT3IzB)Y2Zl8}!WRq+p=NXl#>MpH%XE zGK?91`Am-V#(Ksky8nA6tiK5H{6{Zp(kG@+JHw4~_!@Ud3=ah*&SL8M=Xng?aigd& zT3vOah`psU$8$&ds?>unAu0LxxFsh*q_55_@Ls5=u4jfjr?DLKIZC}${-Z44G4-JR znVfd#doM~t6!S_;aq#CE){L3e7t<5}b1qI-9k4q|QI0=Mw><~?HTXL(%2%oXvzte1 q6qKi@nKung&m2tj{~n}XqTG$-^DyHTnm&Jmq9ms-TPb56{Qm&3P;|op literal 0 HcmV?d00001 diff --git a/packages/moss-agent/test/web-attachment-security.spec.mjs b/packages/moss-agent/test/web-attachment-security.spec.mjs new file mode 100644 index 00000000..fa786c17 --- /dev/null +++ b/packages/moss-agent/test/web-attachment-security.spec.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; + +function fakeAgent(workspaceDir, capture) { + return { + config: { + sessionStore: new InMemorySessionStore(), + model: 'attachment-model', + workspaceDir, + }, + tools: { getNames: () => [] }, + plugins: { + inspect: () => ({ generation: 0, plugins: [] }), + listCommands: () => [], + subscribe: () => () => {}, + }, + setUserQuestionAsker() { + return () => {}; + }, + async *streamChat(_sessionId, _prompt, options) { + capture.attachments = options.attachments; + yield { + type: 'done', + result: { response: '', toolCalls: [], toolResults: [], stopReason: 'end_turn' }, + }; + }, + }; +} + +test('Web mutations require strict Origin and per-server CSRF while attachment GET stays readable', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-attachment-http-')); + const capture = {}; + const web = await startMossWebServer(fakeAgent(tempDir, capture), { port: 0 }); + try { + const bootstrap = await fetch(`${web.url}/api/bootstrap`).then((response) => response.json()); + assert.equal(typeof bootstrap.csrfToken, 'string'); + const authorizedHeaders = { + origin: web.url, + 'x-moss-csrf': bootstrap.csrfToken, + 'content-type': 'application/json', + }; + + assert.equal((await fetch(`${web.url}/api/sessions`, { method: 'POST' })).status, 403); + assert.equal( + ( + await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: { ...authorizedHeaders, 'x-moss-csrf': 'wrong' }, + }) + ).status, + 403 + ); + assert.equal( + ( + await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: { ...authorizedHeaders, origin: 'http://attacker.invalid' }, + }) + ).status, + 403 + ); + + const sessionResponse = await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: authorizedHeaders, + }); + assert.equal(sessionResponse.status, 201); + const session = await sessionResponse.json(); + + const uploaded = await fetch(`${web.url}/api/attachments`, { + method: 'POST', + headers: authorizedHeaders, + body: JSON.stringify({ + filename: 'note.txt', + mimeType: 'text/plain', + contentBase64: Buffer.from('real attachment body').toString('base64'), + }), + }).then((response) => response.json()); + const download = await fetch(`${web.url}${uploaded.attachment.downloadUrl}`); + assert.match(download.headers.get('content-disposition') ?? '', /^attachment;/); + assert.equal(await download.text(), 'real attachment body'); + + const turn = await fetch(`${web.url}/api/sessions/${session.sessionId}/messages`, { + method: 'POST', + headers: authorizedHeaders, + body: JSON.stringify({ + prompt: 'Read the attachment', + attachmentIds: [uploaded.attachment.id], + }), + }); + assert.equal(turn.status, 200); + await turn.text(); + assert.deepEqual(capture.attachments, [ + { type: 'text', text: '[Attachment: note.txt]\nreal attachment body' }, + ]); + } finally { + await web.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); diff --git a/packages/moss-agent/test/web-attachment-service.spec.mjs b/packages/moss-agent/test/web-attachment-service.spec.mjs new file mode 100644 index 00000000..140c14f2 --- /dev/null +++ b/packages/moss-agent/test/web-attachment-service.spec.mjs @@ -0,0 +1,83 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { MossWebAttachmentService } from '../dist/web-ui/web-attachment-service.js'; + +test('Web attachments use random server names and resolve bounded text and image prompt blocks', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss attachments 空格 ')); + const service = new MossWebAttachmentService({ + storageDir: path.join(tempDir, '.moss', 'web attachments'), + workspaceDir: tempDir, + }); + try { + const text = await service.upload({ + filename: '../../notes.txt', + mimeType: 'text/plain', + contentBase64: Buffer.from('hello attachment').toString('base64'), + }); + const image = await service.upload({ + filename: 'preview.png', + mimeType: 'image/png', + contentBase64: Buffer.from([0x89, 0x50, 0x4e, 0x47]).toString('base64'), + }); + assert.equal(text.filename, 'notes.txt'); + assert.match(text.id, /^attachment-[0-9a-f-]+$/); + assert.equal(text.downloadUrl, `/api/attachments/${text.id}`); + const storedNames = await fs.readdir(path.join(tempDir, '.moss', 'web attachments')); + assert.equal( + storedNames.some((name) => name.includes('notes.txt')), + false + ); + + assert.deepEqual(await service.resolveForPrompt([text.id, image.id]), [ + { type: 'text', text: '[Attachment: notes.txt]\nhello attachment' }, + { + type: 'image', + data: Buffer.from([0x89, 0x50, 0x4e, 0x47]).toString('base64'), + mimeType: 'image/png', + filename: 'preview.png', + }, + ]); + await assert.rejects( + service.upload({ + filename: 'payload.svg', + mimeType: 'image/svg+xml', + contentBase64: Buffer.from('').toString('base64'), + }), + /unsupported attachment type/ + ); + await assert.rejects(service.resolveForPrompt(Array(9).fill(text.id)), /at most 8/); + } finally { + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); + +test('Generated artifact registration enforces real workspace containment before copying', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-artifacts-')); + const workspace = path.join(tempDir, 'workspace'); + const outside = path.join(tempDir, 'outside.txt'); + await fs.mkdir(path.join(workspace, 'output'), { recursive: true }); + await fs.writeFile(path.join(workspace, 'output', 'report.md'), '# report'); + await fs.writeFile(outside, 'outside'); + const service = new MossWebAttachmentService({ + storageDir: path.join(tempDir, 'attachments'), + workspaceDir: workspace, + }); + try { + const artifact = await service.registerArtifact('output/report.md'); + assert.equal(artifact.kind, 'artifact'); + assert.equal((await service.read(artifact.id)).body.toString('utf8'), '# report'); + await assert.rejects(service.registerArtifact('../outside.txt'), /workspace/); + await assert.rejects(service.registerArtifact(outside), /relative/); + if (process.platform !== 'win32') { + await fs.symlink(outside, path.join(workspace, 'output', 'escape.txt')); + await assert.rejects(service.registerArtifact('output/escape.txt'), /workspace/); + } + } finally { + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); diff --git a/packages/moss-agent/test/web-authorized-fetch.mjs b/packages/moss-agent/test/web-authorized-fetch.mjs new file mode 100644 index 00000000..7c8c51cc --- /dev/null +++ b/packages/moss-agent/test/web-authorized-fetch.mjs @@ -0,0 +1,24 @@ +const csrfByOrigin = new Map(); + +export async function authorizedWebFetch(input, init = {}) { + const url = + typeof input === 'string' || input instanceof URL ? new URL(input) : new URL(input.url); + const method = String( + init.method ?? (typeof input === 'object' ? input.method : 'GET') + ).toUpperCase(); + if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') { + return globalThis.fetch(input, init); + } + let csrfToken = csrfByOrigin.get(url.origin); + if (!csrfToken) { + const bootstrap = await globalThis + .fetch(`${url.origin}/api/bootstrap`) + .then((response) => response.json()); + csrfToken = bootstrap.csrfToken; + csrfByOrigin.set(url.origin, csrfToken); + } + const headers = new Headers(init.headers); + if (!headers.has('origin')) headers.set('origin', url.origin); + if (!headers.has('x-moss-csrf')) headers.set('x-moss-csrf', csrfToken); + return globalThis.fetch(input, { ...init, headers }); +} diff --git a/packages/moss-agent/test/web-control-plane.spec.mjs b/packages/moss-agent/test/web-control-plane.spec.mjs new file mode 100644 index 00000000..0065de6b --- /dev/null +++ b/packages/moss-agent/test/web-control-plane.spec.mjs @@ -0,0 +1,115 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { authorizedWebFetch as fetch } from './web-authorized-fetch.mjs'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { MossWebInteractionBroker } from '../dist/web-ui/web-interaction-broker.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; + +function createAgent(workspaceDir) { + return new MossAgent({ + llmProvider: { + id: 'web-control-plane-test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + }, + sessionStore: new InMemorySessionStore(), + workspaceDir, + model: 'control-model', + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); +} + +test('Web control plane resolves interactions and drives runtime and settings owners', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-control-plane-')); + const agent = createAgent(tempDir); + const broker = new MossWebInteractionBroker(); + const web = await startMossWebServer(agent, { + port: 0, + configDir: path.join(tempDir, 'config'), + interactionBroker: broker, + }); + try { + const waiting = broker.askQuestion('Which target?'); + const interactions = await fetch(`${web.url}/api/interactions`).then((response) => + response.json() + ); + assert.equal(interactions.interactions[0].kind, 'question'); + const resolved = await fetch( + `${web.url}/api/interactions/${interactions.interactions[0].id}/resolve`, + { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ answer: 'Device' }), + } + ); + assert.equal(resolved.status, 200); + assert.equal(await waiting, 'Device'); + + const session = await fetch(`${web.url}/api/sessions`, { method: 'POST' }).then((response) => + response.json() + ); + const queued = await fetch(`${web.url}/api/sessions/${session.sessionId}/inbox`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: 'Run next', delivery: 'queue' }), + }); + assert.equal(queued.status, 201); + assert.equal( + ( + await fetch(`${web.url}/api/sessions/${session.sessionId}/inbox`).then((response) => + response.json() + ) + ).entries[0].prompt, + 'Run next' + ); + + const mode = await fetch(`${web.url}/api/runtime/mode`, { + method: 'PUT', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ mode: 'plan' }), + }).then((response) => response.json()); + assert.equal(mode.mode, 'plan'); + + const goal = await fetch(`${web.url}/api/sessions/${session.sessionId}/goal`, { + method: 'PUT', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ action: 'set', objective: 'Complete control plane' }), + }).then((response) => response.json()); + assert.equal(goal.goal.objective, 'Complete control plane'); + + const saved = await fetch(`${web.url}/api/settings/permissions`, { + method: 'PUT', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + values: { safetyMode: 'workspace-write', approvalPolicy: 'prompt' }, + }), + }); + assert.equal(saved.status, 200); + const secretWrite = await fetch(`${web.url}/api/settings/credentials/apiKey`, { + method: 'PUT', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ value: 'control-plane-secret' }), + }); + assert.equal(secretWrite.status, 200); + const modelSettings = await fetch(`${web.url}/api/settings/models`).then((response) => + response.json() + ); + assert.equal(modelSettings.credentials.apiKey.configured, true); + assert.equal(JSON.stringify(modelSettings).includes('control-plane-secret'), false); + } finally { + await web.close(); + await agent.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); diff --git a/packages/moss-agent/test/web-design-system.spec.mjs b/packages/moss-agent/test/web-design-system.spec.mjs new file mode 100644 index 00000000..ca82f4a0 --- /dev/null +++ b/packages/moss-agent/test/web-design-system.spec.mjs @@ -0,0 +1,56 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import test from 'node:test'; + +const clientRoot = new URL('../dist/web-ui/client/', import.meta.url); + +test('bundled workbench exposes the complete Moss design system and layout contract', async () => { + const [styles, script] = await Promise.all([ + readFile(new URL('workbench.css', clientRoot), 'utf8'), + readFile(new URL('workbench.js', clientRoot), 'utf8'), + ]); + + for (const token of [ + '--moss-font-family-body', + '--moss-font-family-code', + '--moss-font-size-1', + '--moss-line-height-body', + '--moss-space-10', + '--moss-radius-round', + '--moss-shadow-dialog', + '--moss-z-dialog', + '--moss-state-success', + '--moss-state-interrupted', + ]) { + assert.match(styles, new RegExp(`${token}:`), `missing design token ${token}`); + } + + for (const primitive of [ + 'button', + 'input', + 'tabs', + 'dialog', + 'toast', + 'tooltip', + 'card', + 'disclosure', + 'code', + 'diff', + 'terminal', + ]) { + assert.match( + script, + new RegExp(`data-moss-ui.{0,20}${primitive}`), + `missing ${primitive} primitive` + ); + } + + assert.match(script, /data-moss-component-gallery/); + assert.match(script, /moss-layout-v1/); + assert.match(script, /data-resize-handle/); + assert.match(script, /aria-orientation/); + assert.match(styles, /\.moss-skip-link/); + assert.match(styles, /\[data-mobile-drawer/); + assert.match(styles, /prefers-reduced-motion/); +}); diff --git a/packages/moss-agent/test/web-event-journal.spec.mjs b/packages/moss-agent/test/web-event-journal.spec.mjs new file mode 100644 index 00000000..e536aec1 --- /dev/null +++ b/packages/moss-agent/test/web-event-journal.spec.mjs @@ -0,0 +1,201 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { authorizedWebFetch as fetch } from './web-authorized-fetch.mjs'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { TaskRunLedger } from '../dist/core/task-run/task-run-ledger.js'; +import { MossWebEventJournal, parseMossWebEventCursor } from '../dist/web-ui/web-event-journal.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; + +function fakeAgent(streamChat, store = new InMemorySessionStore()) { + return { + config: { sessionStore: store, model: 'journal-model' }, + tools: { getNames: () => [] }, + plugins: { + inspect: () => ({ generation: 0, plugins: [] }), + listCommands: () => [], + subscribe: () => () => {}, + }, + streamChat, + }; +} + +test('Web event journal survives restart and validates run-scoped cursors', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss web journal 空格 ')); + const journalFile = path.join(tempDir, 'nested', 'events.jsonl'); + try { + const first = new MossWebEventJournal(journalFile); + first.append('run:windows-safe', 'session/a', { type: 'text', delta: 'one' }); + first.append('run:windows-safe', 'session/a', { + type: 'retry', + attempt: 2, + error: 'retryable', + }); + const reloaded = new MossWebEventJournal(journalFile); + assert.deepEqual( + reloaded.events('run:windows-safe', 1).map(({ seq, event }) => [seq, event.type]), + [[2, 'retry']] + ); + assert.equal(parseMossWebEventCursor('run:windows-safe', 'run:windows-safe:2'), 2); + assert.equal(parseMossWebEventCursor('run:windows-safe', 'other-run:99'), 0); + assert.equal(parseMossWebEventCursor('run:windows-safe', 'not-a-cursor'), 0); + assert.equal(parseMossWebEventCursor('run:windows-safe', '2trailing-data'), 0); + } finally { + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); + +test('Web stream journals rich events and replays them as SSE after Last-Event-ID', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-sse-')); + const journalFile = path.join(tempDir, '.moss', 'events.jsonl'); + const store = new InMemorySessionStore(); + const agent = fakeAgent(async function* () { + yield { type: 'text_delta', delta: 'first' }; + yield { type: 'retry', attempt: 1, error: 'temporary' }; + yield { type: 'compaction', summaryChars: 12, droppedMessages: 3 }; + yield { type: 'llm_usage', inputTokens: 20, outputTokens: 5, contextTokens: 100 }; + yield { + type: 'working_context_checkpoint', + status: 'active', + reason: 'tool result', + goal: 'finish', + nextAction: 'verify', + }; + yield { + type: 'done', + result: { + response: 'first', + toolCalls: [], + toolResults: [], + stopReason: 'end_turn', + }, + }; + }, store); + const taskRuns = new TaskRunLedger(); + const firstHost = await startMossWebServer(agent, { + port: 0, + taskRunLedger: taskRuns, + eventJournalFile: journalFile, + }); + let runId; + try { + const session = await fetch(`${firstHost.url}/api/sessions`, { method: 'POST' }).then( + (response) => response.json() + ); + const stream = await fetch(`${firstHost.url}/api/sessions/${session.sessionId}/messages`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: 'journal this turn' }), + }).then((response) => response.text()); + const events = stream + .trim() + .split('\n') + .map((line) => JSON.parse(line)); + assert.deepEqual( + events.map(({ type }) => type), + ['run', 'text', 'retry', 'compaction', 'usage', 'context', 'done'] + ); + runId = events[0].run.id; + } finally { + await firstHost.close(); + } + + const secondHost = await startMossWebServer(agent, { + port: 0, + taskRunLedger: taskRuns, + eventJournalFile: journalFile, + }); + try { + const replay = await fetch(`${secondHost.url}/api/runs/${encodeURIComponent(runId)}/events`, { + headers: { 'last-event-id': `${runId}:2` }, + }); + assert.match(replay.headers.get('content-type') ?? '', /text\/event-stream/); + const body = await replay.text(); + assert.doesNotMatch(body, /"delta":"first"/); + assert.match(body, /event: retry/); + assert.match(body, /event: compaction/); + assert.match(body, /event: usage/); + assert.match(body, /event: context/); + assert.match(body, /event: done/); + assert.match(body, /id: 7/); + } finally { + await secondHost.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); + +test('refresh discovers an active run and SSE remains attached through cancellation', async () => { + const store = new InMemorySessionStore(); + const agent = fakeAgent(async function* (_sessionId, _prompt, options) { + await new Promise((resolve) => + options.abortSignal.addEventListener('abort', resolve, { once: true }) + ); + yield { + type: 'done', + result: { + response: '', + toolCalls: [], + toolResults: [], + stopReason: 'aborted_by_user', + }, + }; + }, store); + const web = await startMossWebServer(agent, { port: 0 }); + try { + const session = await fetch(`${web.url}/api/sessions`, { method: 'POST' }).then((response) => + response.json() + ); + const pending = await fetch(`${web.url}/api/sessions/${session.sessionId}/messages`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ prompt: 'keep running' }), + }); + const active = await fetch(`${web.url}/api/sessions/${session.sessionId}/active-run`).then( + (response) => response.json() + ); + assert.equal(active.run.status, 'running'); + assert.ok(active.cursor >= 1); + + const replay = await fetch(`${web.url}${active.eventsUrl}?after=0`); + const cancelled = await fetch(`${web.url}/api/sessions/${session.sessionId}/cancel`, { + method: 'POST', + }).then((response) => response.json()); + assert.equal(cancelled.cancelled, true); + assert.match(await pending.text(), /"stopReason":"aborted_by_user"/); + const replayBody = await replay.text(); + assert.match(replayBody, /event: run/); + assert.match(replayBody, /event: done/); + } finally { + await web.close(); + } +}); + +test('host restart records an interrupted event instead of inventing completion', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-interrupted-')); + const journalFile = path.join(tempDir, 'events.jsonl'); + const taskRuns = new TaskRunLedger(); + taskRuns.create({ id: 'restart-run', sessionId: 'restart-session', title: 'Restart task' }); + taskRuns.append('restart-run', { type: 'run.started' }); + const agent = fakeAgent(async function* () {}); + const web = await startMossWebServer(agent, { + port: 0, + taskRunLedger: taskRuns, + eventJournalFile: journalFile, + }); + try { + assert.equal(taskRuns.get('restart-run').status, 'interrupted'); + const replay = await fetch(`${web.url}/api/runs/restart-run/events`); + const body = await replay.text(); + assert.match(body, /event: interrupted/); + assert.match(body, /"reason":"host restarted"/); + assert.doesNotMatch(body, /"type":"done"/); + } finally { + await web.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); diff --git a/packages/moss-agent/test/web-interaction-broker.spec.mjs b/packages/moss-agent/test/web-interaction-broker.spec.mjs new file mode 100644 index 00000000..9ca4cbd6 --- /dev/null +++ b/packages/moss-agent/test/web-interaction-broker.spec.mjs @@ -0,0 +1,251 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { createCliToolApprovalHook } from '../dist/cli/approval.js'; +import { MossWebInteractionBroker } from '../dist/web-ui/web-interaction-broker.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; +import { authorizedWebFetch } from './web-authorized-fetch.mjs'; + +test('Web interaction broker exposes approval and question requests until resolved', async () => { + const broker = new MossWebInteractionBroker(); + + const approval = broker.askApproval('Allow once or deny?'); + const question = broker.askQuestion('Choose a target\n 1. Local\n 2. Device'); + const pending = broker.pending(); + + assert.deepEqual( + pending.map(({ kind, prompt, state }) => [kind, prompt, state]), + [ + ['approval', 'Allow once or deny?', 'pending'], + ['question', 'Choose a target\n 1. Local\n 2. Device', 'pending'], + ] + ); + + assert.equal(broker.resolve(pending[0].id, 'allow_once'), true); + assert.equal(broker.resolve(pending[1].id, '2'), true); + assert.equal(await approval, 'y'); + assert.equal(await question, '2'); + assert.deepEqual(broker.pending(), []); + assert.equal(broker.resolve(pending[0].id, 'deny'), false, 'cannot resolve twice'); +}); + +test('Web interaction broker cancellation and abort release the waiting agent call', async () => { + const broker = new MossWebInteractionBroker(); + const controller = new AbortController(); + const cancelled = broker.askQuestion('What next?'); + const aborted = broker.askApproval('Proceed?', controller.signal); + const [cancelledRequest, abortedRequest] = broker.pending(); + + assert.equal(broker.cancel(cancelledRequest.id), true); + controller.abort(); + + assert.equal(await cancelled, ''); + assert.equal(await aborted, ''); + assert.equal(broker.get(abortedRequest.id)?.state, 'cancelled'); + assert.deepEqual(broker.pending(), []); +}); + +test('Web interaction broker rejects answers that do not match the interaction kind', async () => { + const broker = new MossWebInteractionBroker(); + const pending = broker.askApproval('Proceed?'); + const request = broker.pending()[0]; + + assert.throws(() => broker.resolve(request.id, 'arbitrary free text'), /approval answer/); + assert.equal(broker.resolve(request.id, 'deny'), true); + assert.equal(await pending, 'n'); +}); + +test('two Web servers keep approval prompts and resolutions isolated by agent instance', async () => { + const create = (id) => { + const approval = createCliToolApprovalHook('workspace-write', {}, {}); + const agent = new MossAgent({ + llmProvider: { + id, + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + }, + sessionStore: new InMemorySessionStore(), + hooks: { onBeforeToolExec: approval }, + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); + return { agent, approval }; + }; + const first = create('first-agent'); + const second = create('second-agent'); + const firstWeb = await startMossWebServer(first.agent, { port: 0 }); + const secondWeb = await startMossWebServer(second.agent, { port: 0 }); + const tool = { + name: 'remember_test', + description: 'test', + metadata: { sideEffectClass: 'memory_write' }, + inputSchema: { type: 'object', properties: {} }, + async execute() { + return 'ok'; + }, + }; + try { + const firstDecision = first.approval({ + tool, + input: { value: 'first' }, + sessionKey: 'first', + runId: 'first-run', + toolCallId: 'first-call', + abortSignal: new AbortController().signal, + }); + const secondDecision = second.approval({ + tool, + input: { value: 'second' }, + sessionKey: 'second', + runId: 'second-run', + toolCallId: 'second-call', + abortSignal: new AbortController().signal, + }); + const firstBootstrap = await fetch(`${firstWeb.url}/api/bootstrap`).then((response) => + response.json() + ); + const secondBootstrap = await fetch(`${secondWeb.url}/api/bootstrap`).then((response) => + response.json() + ); + const firstPending = await fetch(`${firstWeb.url}/api/interactions`).then((response) => + response.json() + ); + const secondPending = await fetch(`${secondWeb.url}/api/interactions`).then((response) => + response.json() + ); + assert.equal(firstPending.interactions.length, 1); + assert.equal(secondPending.interactions.length, 1); + assert.notEqual(firstPending.interactions[0].id, secondPending.interactions[0].id); + + const resolve = (web, csrfToken, interactionId, answer) => + fetch(`${web.url}/api/interactions/${interactionId}/resolve`, { + method: 'POST', + headers: { + origin: web.url, + 'x-moss-csrf': csrfToken, + 'content-type': 'application/json', + }, + body: JSON.stringify({ answer }), + }); + assert.equal( + ( + await resolve( + firstWeb, + firstBootstrap.csrfToken, + firstPending.interactions[0].id, + 'allow_once' + ) + ).status, + 200 + ); + assert.equal( + ( + await resolve( + secondWeb, + secondBootstrap.csrfToken, + secondPending.interactions[0].id, + 'deny' + ) + ).status, + 200 + ); + assert.deepEqual(await firstDecision, { approved: true }); + assert.deepEqual(await secondDecision, { + approved: false, + reason: 'User denied remember_test.', + }); + } finally { + await Promise.all([firstWeb.close(), secondWeb.close()]); + await Promise.all([first.agent.close(), second.agent.close()]); + } +}); + +test('Web runtime mode controls only its own agent approval hook', async () => { + const create = (id) => { + const approval = createCliToolApprovalHook('workspace-write', {}, {}); + const agent = new MossAgent({ + llmProvider: { + id, + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + }, + sessionStore: new InMemorySessionStore(), + hooks: { onBeforeToolExec: approval }, + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); + return { agent, approval }; + }; + const first = create('first-mode-agent'); + const second = create('second-mode-agent'); + const firstWeb = await startMossWebServer(first.agent, { port: 0 }); + const secondWeb = await startMossWebServer(second.agent, { port: 0 }); + const tool = { + name: 'remember_mode_test', + description: 'test', + metadata: { sideEffectClass: 'memory_write' }, + inputSchema: { type: 'object', properties: {} }, + async execute() { + return 'ok'; + }, + }; + const request = (value) => ({ + tool, + input: { value }, + sessionKey: value, + runId: `${value}-run`, + toolCallId: `${value}-call`, + abortSignal: new AbortController().signal, + }); + try { + const switched = await authorizedWebFetch(`${firstWeb.url}/api/runtime/mode`, { + method: 'PUT', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ mode: 'plan' }), + }); + assert.equal(switched.status, 200); + + const firstDecision = await first.approval(request('first')); + assert.equal(firstDecision.approved, false); + assert.match(firstDecision.reason, /Plan mode/); + + const secondDecision = second.approval(request('second')); + const firstPending = await fetch(`${firstWeb.url}/api/interactions`).then((response) => + response.json() + ); + const secondPending = await fetch(`${secondWeb.url}/api/interactions`).then((response) => + response.json() + ); + assert.equal(firstPending.interactions.length, 0); + assert.equal(secondPending.interactions.length, 1); + const secondBootstrap = await fetch(`${secondWeb.url}/api/bootstrap`).then((response) => + response.json() + ); + const resolved = await fetch( + `${secondWeb.url}/api/interactions/${secondPending.interactions[0].id}/resolve`, + { + method: 'POST', + headers: { + origin: secondWeb.url, + 'x-moss-csrf': secondBootstrap.csrfToken, + 'content-type': 'application/json', + }, + body: JSON.stringify({ answer: 'deny' }), + } + ); + assert.equal(resolved.status, 200); + assert.equal((await secondDecision).approved, false); + } finally { + await Promise.all([firstWeb.close(), secondWeb.close()]); + await Promise.all([first.agent.close(), second.agent.close()]); + } +}); diff --git a/packages/moss-agent/test/web-plugin-hot-reload.spec.mjs b/packages/moss-agent/test/web-plugin-hot-reload.spec.mjs new file mode 100644 index 00000000..cb915719 --- /dev/null +++ b/packages/moss-agent/test/web-plugin-hot-reload.spec.mjs @@ -0,0 +1,151 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import { mkdir, mkdtemp, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; + +function agent() { + return new MossAgent({ + llmProvider: { + id: 'web-plugin-test', + displayName: 'Web plugin test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }, + sessionStore: new InMemorySessionStore(), + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); +} + +let csrfToken = ''; + +async function json(url, init) { + if (init?.method && !csrfToken) { + const bootstrap = await fetch(`${new URL(url).origin}/api/bootstrap`); + csrfToken = (await bootstrap.json()).csrfToken; + } + const response = await fetch(url, { + ...init, + headers: { + origin: new URL(url).origin, + 'content-type': 'application/json', + ...(csrfToken ? { 'x-moss-csrf': csrfToken } : {}), + ...init?.headers, + }, + }); + const body = await response.json(); + assert.equal(response.ok, true, JSON.stringify(body)); + return body; +} + +test('Web plugin mutations hot-apply one composition generation and keep secrets write-only', async () => { + const root = await mkdtemp(path.join(os.tmpdir(), 'moss web plugin 配置 ')); + const configDir = path.join(root, 'config with spaces'); + const pluginRoot = path.join(root, 'plugin with spaces'); + await mkdir(pluginRoot, { recursive: true }); + await writeFile( + path.join(pluginRoot, 'moss.plugin.json'), + JSON.stringify({ + schemaVersion: 1, + id: 'web/hot-plugin', + version: '1.0.0', + runtime: { module: './plugin.mjs' }, + configSchema: './config.schema.json', + }) + ); + await writeFile( + path.join(pluginRoot, 'plugin.mjs'), + `export default { id: 'web/hot-plugin', setup(context) { + const label = typeof context.config.label === 'string' ? context.config.label : 'unset'; + if (label === 'reject') throw new Error('REJECT_CONFIG_CANDIDATE'); + const secretConfigured = typeof context.config.apiKey === 'string'; + context.registerCommand({ id: 'hot-command', title: 'Hot command', expand: (args) => 'HOT:' + label + ':' + secretConfigured + ':' + args }); + } };\n` + ); + await writeFile( + path.join(pluginRoot, 'config.schema.json'), + JSON.stringify({ + type: 'object', + properties: { + label: { type: 'string' }, + apiKey: { type: 'string', writeOnly: true }, + }, + }) + ); + const registry = new InstalledPluginRegistry({ configDir }); + await registry.add(pluginRoot); + const instance = agent(); + const web = await startMossWebServer(instance, { port: 0, configDir }); + try { + const before = (await json(`${web.url}/api/plugins`)).generation; + const enabled = await json( + `${web.url}/api/plugins/${encodeURIComponent('web/hot-plugin')}/enable`, + { + method: 'POST', + } + ); + assert.equal(enabled.restartRequired, false); + assert.equal(enabled.generation, before + 1); + assert.equal(await instance.plugins.expandCommand('hot-command', 'ok'), 'HOT:unset:false:ok'); + + const configured = await json( + `${web.url}/api/plugins/${encodeURIComponent('web/hot-plugin')}/config`, + { + method: 'PUT', + body: JSON.stringify({ values: { label: 'safe' } }), + } + ); + assert.equal(configured.restartRequired, false); + assert.equal(await instance.plugins.expandCommand('hot-command', 'ok'), 'HOT:safe:false:ok'); + await assert.rejects( + json(`${web.url}/api/plugins/${encodeURIComponent('web/hot-plugin')}/config`, { + method: 'PUT', + body: JSON.stringify({ values: { label: 'reject' } }), + }), + /REJECT_CONFIG_CANDIDATE/ + ); + assert.equal(await instance.plugins.expandCommand('hot-command', 'ok'), 'HOT:safe:false:ok'); + assert.deepEqual( + (await json(`${web.url}/api/plugins/${encodeURIComponent('web/hot-plugin')}/config`)).config + .values, + { label: 'safe' } + ); + const secretUrl = `${web.url}/api/plugins/${encodeURIComponent('web/hot-plugin')}/config/secrets/apiKey`; + const secret = await json(secretUrl, { + method: 'PUT', + body: JSON.stringify({ value: 'SECRET_MUST_NOT_RETURN' }), + }); + assert.deepEqual(secret.config, { + values: { label: 'safe' }, + secrets: { apiKey: { configured: true } }, + }); + assert.doesNotMatch(JSON.stringify(secret), /SECRET_MUST_NOT_RETURN/); + assert.equal(await instance.plugins.expandCommand('hot-command', 'ok'), 'HOT:safe:true:ok'); + + const disabled = await json( + `${web.url}/api/plugins/${encodeURIComponent('web/hot-plugin')}/disable`, + { + method: 'POST', + } + ); + assert.equal(disabled.restartRequired, false); + assert.equal(disabled.generation, secret.generation + 1); + assert.equal(instance.plugins.getCommand('hot-command'), undefined); + } finally { + await web.close(); + await instance.close(); + } +}); diff --git a/packages/moss-agent/test/web-plugin-lifecycle.spec.mjs b/packages/moss-agent/test/web-plugin-lifecycle.spec.mjs new file mode 100644 index 00000000..55bcc3e8 --- /dev/null +++ b/packages/moss-agent/test/web-plugin-lifecycle.spec.mjs @@ -0,0 +1,108 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { + activateWebPluginCandidate, + disableWebPlugin, +} from '../dist/web-ui/web-plugin-lifecycle.js'; + +function plugin() { + return { + id: 'fixture/transaction', + setup(context) { + context.registerCommand({ + id: 'transaction-command', + title: 'Transaction command', + expand: () => 'LAST_GOOD', + }); + }, + }; +} + +function agent() { + return new MossAgent({ + llmProvider: { + id: 'plugin-transaction-test', + displayName: 'Plugin transaction test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + async stream() { + throw new Error('streaming disabled'); + }, + }, + sessionStore: new InMemorySessionStore(), + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); +} + +test('failed registry disable restores the last-good runtime generation', async () => { + const instance = agent(); + await instance.plugins.install(plugin()); + const generation = instance.plugins.inspect().generation; + const registry = { + async disable() { + throw new Error('REGISTRY_COMMIT_FAILED'); + }, + async loadInstalled() { + return plugin(); + }, + }; + try { + await assert.rejects( + disableWebPlugin(instance, registry, 'fixture/transaction'), + /REGISTRY_COMMIT_FAILED/ + ); + assert.equal(await instance.plugins.expandCommand('transaction-command', ''), 'LAST_GOOD'); + assert.equal(instance.plugins.inspect().generation, generation + 2); + } finally { + await instance.close(); + } +}); + +test('failed same-id candidate setup rolls the registry back without draining last-good', async () => { + const instance = agent(); + await instance.plugins.install(plugin()); + let rolledBack = false; + const registry = { + async loadInstalled() { + throw new Error('CANDIDATE_SETUP_FAILED'); + }, + async rollback() { + rolledBack = true; + }, + }; + try { + await assert.rejects( + activateWebPluginCandidate( + instance, + registry, + { + id: 'fixture/transaction', + version: '2.0.0', + source: 'fixture@2.0.0', + root: '/immutable/candidate', + enabled: true, + installedAt: new Date(0).toISOString(), + lastGood: { + version: '1.0.0', + source: 'fixture@1.0.0', + root: '/immutable/last-good', + }, + }, + true + ), + /CANDIDATE_SETUP_FAILED/ + ); + assert.equal(rolledBack, true); + assert.equal(await instance.plugins.expandCommand('transaction-command', ''), 'LAST_GOOD'); + } finally { + await instance.close(); + } +}); diff --git a/packages/moss-agent/test/web-runtime-service.spec.mjs b/packages/moss-agent/test/web-runtime-service.spec.mjs new file mode 100644 index 00000000..bda2211e --- /dev/null +++ b/packages/moss-agent/test/web-runtime-service.spec.mjs @@ -0,0 +1,115 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { TaskRunLedger } from '../dist/core/task-run/task-run-ledger.js'; +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { MossWebRuntimeService } from '../dist/web-ui/web-runtime-service.js'; + +function createAgent() { + return new MossAgent({ + llmProvider: { + id: 'web-runtime-test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + }, + sessionStore: new InMemorySessionStore(), + model: 'runtime-model', + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + subagentExperts: [ + { + id: 'reviewer', + displayName: 'Reviewer', + description: 'Reviews code', + instructions: 'Review only.', + scope: 'read-only', + }, + ], + }); +} + +test('Web runtime service reuses inbox, goal, async task, and run evidence owners', async () => { + const agent = createAgent(); + const ledger = new TaskRunLedger(); + const service = new MossWebRuntimeService(agent, ledger); + try { + const queued = service.admit('session-a', 'Do this next', 'queue'); + assert.equal(queued.delivery, 'queue'); + assert.equal(service.inbox('session-a')[0].prompt, 'Do this next'); + assert.equal( + service.steer('session-a', 'Change direction'), + null, + 'steer needs one active run' + ); + + const goal = await service.setGoal('session-a', 'Ship the Web runtime'); + assert.equal(goal.status, 'active'); + assert.equal((await service.goal('session-a')).objective, 'Ship the Web runtime'); + + agent.asyncTasks.start( + { taskId: 'job-a', kind: 'host_task', label: 'Background check', payload: {} }, + async (_request, signal) => { + await new Promise((resolve) => signal.addEventListener('abort', resolve, { once: true })); + return { success: false, summary: 'stopped' }; + } + ); + assert.equal(service.jobs()[0].taskId, 'job-a'); + assert.equal(service.stopJob('job-a'), true); + + ledger.create({ id: 'run-a', sessionId: 'session-a', title: 'Evidence run' }); + ledger.append('run-a', { type: 'run.started' }); + ledger.append('run-a', { type: 'tool.started', data: { name: 'read_file' } }); + ledger.append('run-a', { type: 'tool.succeeded', data: { name: 'read_file' } }); + ledger.append('run-a', { type: 'run.completed' }); + ledger.append('run-a', { type: 'run.verified' }); + const trajectory = service.trajectory('run-a'); + assert.equal(trajectory.run.verification, 'verified'); + assert.equal(trajectory.evidence.length, 2); + assert.equal(service.completionVerdict('run-a').verdict, 'verified'); + } finally { + await agent.close(); + } +}); + +test('Web runtime service dispatches the real slash registry and exposes mention inventory', async () => { + const agent = createAgent(); + const service = new MossWebRuntimeService(agent, new TaskRunLedger()); + try { + const result = await service.dispatchSlash('session-b', '/mode plan'); + assert.equal(result.handled, true); + assert.equal(result.mode, 'plan'); + assert.match(result.messages[0].text, /plan/i); + + const inventory = service.mentionInventory(); + assert.ok(inventory.commands.includes('/mode')); + assert.deepEqual( + inventory.experts.map(({ id }) => id), + ['reviewer'] + ); + } finally { + await agent.close(); + } +}); + +test('Web interaction mode is isolated between runtime service instances', async () => { + const firstAgent = createAgent(); + const secondAgent = createAgent(); + const first = new MossWebRuntimeService(firstAgent, new TaskRunLedger()); + const second = new MossWebRuntimeService(secondAgent, new TaskRunLedger()); + try { + first.setMode('plan'); + second.setMode('accept-edits'); + assert.equal(first.mode(), 'plan'); + assert.equal(second.mode(), 'acceptEdits'); + await first.dispatchSlash('first', '/mode default'); + assert.equal(first.mode(), 'default'); + assert.equal(second.mode(), 'acceptEdits'); + } finally { + await Promise.all([firstAgent.close(), secondAgent.close()]); + } +}); diff --git a/packages/moss-agent/test/web-session-service.spec.mjs b/packages/moss-agent/test/web-session-service.spec.mjs new file mode 100644 index 00000000..25520a59 --- /dev/null +++ b/packages/moss-agent/test/web-session-service.spec.mjs @@ -0,0 +1,177 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { authorizedWebFetch as fetch } from './web-authorized-fetch.mjs'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { JsonlSessionStore } from '../dist/core/session/jsonl-session-store.js'; +import { TaskRunLedger } from '../dist/core/task-run/task-run-ledger.js'; +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { MossWebSessionService } from '../dist/web-ui/web-session-service.js'; +import { startMossWebServer } from '../dist/web-ui/web-server.js'; + +function makeAgent(store, workspaceDir) { + return new MossAgent({ + llmProvider: { + id: 'web-session-service-test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + }, + sessionStore: store, + workspaceDir, + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); +} + +test('Web session service preserves source history across fork and rewind', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss web sessions 空格 ')); + const metadataFile = path.join(tempDir, '.moss', 'web session metadata.json'); + const store = new JsonlSessionStore({ dir: path.join(tempDir, '会话 files') }); + const agent = makeAgent(store, tempDir); + const taskRuns = new TaskRunLedger(); + await store.replaceMessages('source/session', [ + { role: 'user', content: 'Find the alpha regression' }, + { role: 'assistant', content: [{ type: 'text', text: 'Alpha evidence' }] }, + { role: 'user', content: 'Continue with beta' }, + ]); + const service = new MossWebSessionService(agent, taskRuns, { metadataFile }); + try { + assert.deepEqual(await service.listWorkspaces(), [ + { id: 'current', name: path.basename(tempDir), current: true }, + ]); + assert.equal((await service.search('alpha'))[0].sessionId, 'source/session'); + + const renamed = await service.rename('source/session', 'Renamed investigation'); + assert.equal(renamed.title, 'Renamed investigation'); + const reloaded = new MossWebSessionService(agent, taskRuns, { metadataFile }); + assert.equal((await reloaded.listSessions())[0].title, 'Renamed investigation'); + + const markdown = await service.exportMarkdown('source/session'); + assert.match(markdown, /^# Session source\/session/m); + assert.match(markdown, /Alpha evidence/); + + const fork = await service.fork('source/session'); + assert.equal(fork.messageCount, 3); + assert.deepEqual( + await store.loadMessages(fork.sessionId), + await store.loadMessages('source/session') + ); + + const rewind = await service.rewind('source/session', 1); + assert.equal(rewind.sourceSessionId, 'source/session'); + assert.equal(rewind.truncated, 2); + assert.equal((await store.loadMessages(rewind.session.sessionId)).length, 1); + assert.equal((await store.loadMessages('source/session')).length, 3, 'source remains intact'); + + const created = await service.create(); + assert.equal(created.messageCount, 0); + assert.ok( + (await service.listSessions()).some(({ sessionId }) => sessionId === created.sessionId) + ); + + await assert.rejects( + service.delete('source/session', 'wrong confirmation'), + /delete confirmation must exactly match/ + ); + assert.equal(await store.exists('source/session'), true); + await service.delete('source/session', 'source/session'); + assert.equal(await store.exists('source/session'), false); + } finally { + await agent.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); + +test('Web session HTTP protocol exposes mutations with exact delete confirmation', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-session-http-')); + const store = new InMemorySessionStore(); + const agent = makeAgent(store, tempDir); + const web = await startMossWebServer(agent, { port: 0 }); + try { + const workspaces = await fetch(`${web.url}/api/workspaces`).then((response) => response.json()); + assert.equal(workspaces.workspaces[0].id, 'current'); + + const created = await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ workspaceId: 'current' }), + }).then((response) => response.json()); + await store.replaceMessages(created.sessionId, [ + { role: 'user', content: 'Protocol needle' }, + { role: 'assistant', content: 'Protocol result' }, + ]); + + const renamedResponse = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}`, + { + method: 'PATCH', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ title: 'Protocol session' }), + } + ); + assert.equal(renamedResponse.status, 200); + assert.equal((await renamedResponse.json()).session.title, 'Protocol session'); + + const search = await fetch(`${web.url}/api/sessions/search?q=needle`).then((response) => + response.json() + ); + assert.equal(search.hits[0].sessionId, created.sessionId); + + const exported = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}/export` + ); + assert.match(exported.headers.get('content-type') ?? '', /text\/markdown/); + assert.match(await exported.text(), /Protocol result/); + + const forked = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}/fork`, + { method: 'POST' } + ).then((response) => response.json()); + assert.equal(forked.session.messageCount, 2); + + const rewound = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}/rewind`, + { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ messageCount: 1 }), + } + ).then((response) => response.json()); + assert.equal(rewound.session.messageCount, 1); + assert.equal((await store.loadMessages(created.sessionId)).length, 2); + + const deniedDelete = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}`, + { + method: 'DELETE', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ confirmation: 'not-the-session' }), + } + ); + assert.equal(deniedDelete.status, 400); + assert.equal(await store.exists(created.sessionId), true); + + const deleted = await fetch( + `${web.url}/api/sessions/${encodeURIComponent(created.sessionId)}`, + { + method: 'DELETE', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ confirmation: created.sessionId }), + } + ); + assert.equal(deleted.status, 200); + assert.equal(await store.exists(created.sessionId), false); + } finally { + await web.close(); + await agent.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); diff --git a/packages/moss-agent/test/web-settings-service.spec.mjs b/packages/moss-agent/test/web-settings-service.spec.mjs new file mode 100644 index 00000000..c69c6cd5 --- /dev/null +++ b/packages/moss-agent/test/web-settings-service.spec.mjs @@ -0,0 +1,112 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { MossAgent } from '../dist/core/agent/moss-agent.js'; +import { ConfigManager } from '../dist/cli/config-manager.js'; +import { CliServices } from '../dist/cli/cli-services.js'; +import { MossWebSettingsService } from '../dist/web-ui/web-settings-service.js'; + +function createAgent(workspaceDir) { + return new MossAgent({ + llmProvider: { + id: 'settings-test', + capabilities: { streaming: false }, + async complete() { + return { stopReason: 'end_turn', content: [] }; + }, + }, + sessionStore: new InMemorySessionStore(), + workspaceDir, + model: 'current-model', + domainPrompt: false, + includeLanguagePolicyPrompt: false, + includeAgentBehaviorPrompt: false, + }); +} + +test('Web settings validates and persists supported sections without returning credentials', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss web settings 空格 ')); + const configPath = path.join(tempDir, 'config', 'config.json'); + const env = { ...process.env, MOSS_CONFIG_DIR: path.dirname(configPath) }; + const config = new ConfigManager(env); + const services = new CliServices(config); + const agent = createAgent(tempDir); + const settings = new MossWebSettingsService(agent, services, { configPath }); + try { + const invalid = settings.validate('permissions', { + safetyMode: 'anything-goes', + approvalPolicy: 'prompt', + }); + assert.equal(invalid.valid, false); + assert.match(invalid.errors.safetyMode, /read-only/); + + const saved = settings.save('permissions', { + safetyMode: 'workspace-write', + approvalPolicy: 'prompt', + trustedTools: ['read_file'], + deniedTools: ['exec'], + }); + assert.equal(saved.valid, true); + assert.equal(saved.dirty, false); + + settings.writeCredential('apiKey', 'secret-value-for-test'); + const models = await settings.section('models'); + assert.equal(models.values.apiKey, undefined); + assert.equal(models.credentials.apiKey.configured, true); + assert.equal( + JSON.stringify(await settings.snapshot()).includes('secret-value-for-test'), + false + ); + + const raw = JSON.parse(await fs.readFile(configPath, 'utf8')); + assert.notEqual(raw.apiKey, 'secret-value-for-test', 'credential is encrypted at rest'); + settings.deleteCredential('apiKey'); + assert.equal((await settings.section('models')).credentials.apiKey.configured, false); + } finally { + await agent.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); + +test('Web settings model catalog delegates to CliServices and selection is persisted', async () => { + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-web-model-settings-')); + const configPath = path.join(tempDir, 'config.json'); + const agent = createAgent(tempDir); + const fakeServices = { + config: new ConfigManager({ ...process.env, MOSS_CONFIG_FILE: configPath }), + models: { + async loadModelChoicesForRuntime() { + return { + choices: [ + { id: 'model-a', label: 'Model A', provider: 'openai' }, + { id: 'model-b', label: 'Model B', provider: 'openai' }, + ], + source: 'test catalog', + }; + }, + resolveModelSelection(input, choices) { + return choices.find(({ id }) => id === input) ?? null; + }, + }, + }; + const settings = new MossWebSettingsService(agent, fakeServices, { configPath }); + try { + const catalog = await settings.modelCatalog(); + assert.deepEqual( + catalog.choices.map(({ id }) => id), + ['model-a', 'model-b'] + ); + const selected = await settings.selectModel('model-b'); + assert.equal(selected.model, 'model-b'); + assert.equal(JSON.parse(await fs.readFile(configPath, 'utf8')).model, 'model-b'); + await assert.rejects(settings.selectModel('missing'), /unknown model/); + } finally { + await agent.close(); + await fs.rm(tempDir, { recursive: true, force: true }); + } +}); diff --git a/packages/moss-agent/test/web-ui-browser.spec.mjs b/packages/moss-agent/test/web-ui-browser.spec.mjs index aba4f293..03336ebc 100644 --- a/packages/moss-agent/test/web-ui-browser.spec.mjs +++ b/packages/moss-agent/test/web-ui-browser.spec.mjs @@ -1,20 +1,26 @@ #!/usr/bin/env node +/* global document, getComputedStyle, HTMLElement */ import assert from 'node:assert/strict'; import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import test from 'node:test'; -import puppeteer from 'puppeteer-core'; +import AxeBuilder from '@axe-core/playwright'; +import pixelmatch from 'pixelmatch'; +import { chromium } from 'playwright'; +import { PNG } from 'pngjs'; import { MossAgent } from '../dist/core/agent/moss-agent.js'; import { InMemorySessionStore } from '../dist/core/session/session.js'; +import { createCliToolApprovalHook } from '../dist/cli/approval.js'; import { startMossWebServer } from '../dist/web-ui/web-server.js'; import { InstalledPluginRegistry } from '../dist/plugins/installed-plugin-registry.js'; import { installConfiguredPlugins } from '../dist/cli/plugins-runtime.js'; const browserCandidates = [ process.env.MOSS_BROWSER_EXECUTABLE, + chromium.executablePath(), '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '/usr/bin/chromium', @@ -30,28 +36,46 @@ for (const candidate of browserCandidates) { } catch {} } -async function closeBrowser(browser) { - await new Promise((resolve) => { - const forceClose = setTimeout(() => { - browser.process()?.kill('SIGKILL'); - resolve(); - }, 5_000); - void browser.close().then( - () => { - clearTimeout(forceClose); - resolve(); - }, - () => { - clearTimeout(forceClose); - browser.process()?.kill('SIGKILL'); - resolve(); - } - ); +const visualRoot = path.join(import.meta.dirname, 'visual'); + +async function assertVisual(name, buffer) { + const baselinePath = path.join(visualRoot, 'baseline', `${name}.png`); + if (process.env.MOSS_UPDATE_VISUALS === '1') { + await fs.mkdir(path.dirname(baselinePath), { recursive: true }); + await fs.writeFile(baselinePath, buffer); + return; + } + const expected = PNG.sync.read(await fs.readFile(baselinePath)); + const actual = PNG.sync.read(buffer); + assert.equal(actual.width, expected.width, `${name} visual width changed`); + assert.equal(actual.height, expected.height, `${name} visual height changed`); + const diff = new PNG({ width: actual.width, height: actual.height }); + const changed = pixelmatch(expected.data, actual.data, diff.data, actual.width, actual.height, { + threshold: 0.18, }); + const ratio = changed / (actual.width * actual.height); + if (ratio > 0.08) { + const diffPath = path.join(visualRoot, 'diff', `${name}.png`); + await fs.mkdir(path.dirname(diffPath), { recursive: true }); + await fs.writeFile(diffPath, PNG.sync.write(diff)); + } + assert.ok(ratio <= 0.08, `${name} visual changed by ${(ratio * 100).toFixed(2)}%`); +} + +async function waitForColumns(page, expected) { + await page.waitForFunction((widths) => { + const actual = Array.from( + document.querySelectorAll( + '.moss-sidebar-column, .moss-conversation-column, .moss-details-column' + ), + (column) => Math.round(column.getBoundingClientRect().width) + ); + return actual.every((width, index) => width === widths[index]); + }, expected); } test( - 'React workbench survives a complete browser message turn', + 'Playwright workbench survives a complete browser message turn', { skip: browserExecutable ? false : 'no Chromium-compatible browser installed', timeout: 60_000, @@ -62,7 +86,57 @@ test( id: 'web-browser-test', displayName: 'Web browser test', capabilities: { streaming: false }, - async complete() { + async complete(options) { + const transcript = JSON.stringify(options.messages); + const activeScenario = [ + ['tool', transcript.lastIndexOf('Run a browser tool.')], + ['approval', transcript.lastIndexOf('Require browser approval.')], + ['question', transcript.lastIndexOf('Ask a browser question.')], + ] + .filter(([, index]) => index >= 0) + .sort((left, right) => right[1] - left[1])[0]?.[0]; + if (activeScenario === 'tool') { + if (!transcript.includes('BROWSER_TOOL_OK')) { + return { + stopReason: 'tool_use', + content: [ + { type: 'tool_use', id: 'browser-tool', name: 'browser_delayed_tool', input: {} }, + ], + }; + } + return { + stopReason: 'end_turn', + content: [{ type: 'text', text: 'BROWSER_TOOL_COMPLETE' }], + }; + } + if (activeScenario === 'approval') { + if (!transcript.includes('APPROVAL_BROWSER_OK')) { + return { + stopReason: 'tool_use', + content: [ + { type: 'tool_use', id: 'browser-approval', name: 'browser_mutation', input: {} }, + ], + }; + } + return { + stopReason: 'end_turn', + content: [{ type: 'text', text: 'APPROVAL_FLOW_COMPLETE' }], + }; + } + if (activeScenario === 'question') { + if (!transcript.includes('QUESTION_BROWSER_OK:green')) { + return { + stopReason: 'tool_use', + content: [ + { type: 'tool_use', id: 'browser-question', name: 'browser_question', input: {} }, + ], + }; + } + return { + stopReason: 'end_turn', + content: [{ type: 'text', text: 'QUESTION_FLOW_COMPLETE' }], + }; + } return { stopReason: 'end_turn', content: [{ type: 'text', text: 'BROWSER_TURN_OK' }], @@ -73,10 +147,40 @@ test( }, }, sessionStore: new InMemorySessionStore(), + hooks: { onBeforeToolExec: createCliToolApprovalHook('workspace-write', {}) }, domainPrompt: false, includeLanguagePolicyPrompt: false, includeAgentBehaviorPrompt: false, }); + agent.tools.register({ + name: 'browser_delayed_tool', + description: 'Return delayed browser fixture evidence.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + async execute() { + await new Promise((resolve) => setTimeout(resolve, 800)); + return 'BROWSER_TOOL_OK'; + }, + }); + agent.tools.register({ + name: 'browser_mutation', + description: 'Exercise the Web approval takeover.', + metadata: { sideEffectClass: 'local_write', planMode: 'deny' }, + inputSchema: { type: 'object', properties: {} }, + async execute() { + return 'APPROVAL_BROWSER_OK'; + }, + }); + agent.tools.register({ + name: 'browser_question', + description: 'Exercise the Web question takeover.', + metadata: { sideEffectClass: 'readonly', planMode: 'allow' }, + inputSchema: { type: 'object', properties: {} }, + async execute(_input, context) { + const answer = await context.askUserQuestion?.('Which fixture color should Moss use?'); + return `QUESTION_BROWSER_OK:${answer ?? 'missing'}`; + }, + }); const configDir = await fs.mkdtemp(path.join(os.tmpdir(), 'moss-browser-plugin-')); const pluginDir = path.join(configDir, 'browser-plugin'); await fs.mkdir(pluginDir, { recursive: true }); @@ -100,7 +204,7 @@ test( ); await fs.writeFile( path.join(pluginDir, 'settings.js'), - "export default { mount(root) { root.textContent = 'BROWSER_PLUGIN_UI_OK'; return () => { globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__ = true; }; } };\n" + "export default { async mount(root, context) { const ui = await import(context.componentsUrl); const dispose = ui.mountMossWebComponent(root, ui.createElement(ui.Card, null, ui.createElement('strong', null, 'BROWSER_PLUGIN_UI_OK'), ui.createElement(ui.Input, { label: 'Plugin setting', value: '', readOnly: true }), ui.createElement(ui.Button, null, 'Plugin action'))); return () => { dispose(); globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__ = true; }; } };\n" ); const pluginRegistry = new InstalledPluginRegistry({ configDir }); await pluginRegistry.add(pluginDir); @@ -134,20 +238,57 @@ test( await installConfiguredPlugins(agent, configDir); const web = await startMossWebServer(agent, { port: 0, configDir }); let browser; + let browserContext; try { - browser = await puppeteer.launch({ + browser = await chromium.launch({ executablePath: browserExecutable, headless: true, args: process.platform === 'linux' ? ['--no-sandbox', '--disable-setuid-sandbox'] : [], }); - const page = await browser.newPage(); - await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 }); + browserContext = await browser.newContext({ viewport: { width: 1440, height: 960 } }); + const page = await browserContext.newPage(); const pageErrors = []; page.on('pageerror', (error) => pageErrors.push(error.message)); await page.goto(web.url, { waitUntil: 'domcontentloaded', timeout: 30_000 }); await page.waitForSelector('.app-frame', { timeout: 10_000 }); + await page.waitForFunction( + 'document.querySelector(".workbench-state[aria-busy=true]") === null', + undefined, + { timeout: 10_000 } + ); + await waitForColumns(page, [252, 868, 320]); + await page.keyboard.press('Tab'); + assert.equal( + await page.evaluate(() => globalThis.document.activeElement?.className), + 'moss-skip-link', + 'keyboard users reach the skip link first' + ); + await page.evaluate(() => { + if (document.activeElement instanceof HTMLElement) document.activeElement.blur(); + }); + const accessibility = await new AxeBuilder({ page }).analyze(); + assert.deepEqual( + accessibility.violations.filter( + ({ impact }) => impact === 'critical' || impact === 'serious' + ), + [], + 'workbench has no serious accessibility violations' + ); + await assertVisual('desktop-home', await page.screenshot({ type: 'png' })); + await page.setViewportSize({ width: 1120, height: 800 }); + await waitForColumns(page, [252, 560, 308]); + await assertVisual('narrow-home', await page.screenshot({ type: 'png' })); + await page.setViewportSize({ width: 820, height: 1180 }); + await waitForColumns(page, [64, 756, 0]); + await assertVisual('tablet-home', await page.screenshot({ type: 'png' })); + await page.setViewportSize({ width: 1440, height: 960 }); + await waitForColumns(page, [252, 868, 320]); + assert.equal( + await page.$eval('.moss-skip-link', (link) => link.getAttribute('href')), + '#moss-main-content' + ); const desktopColumns = await page.$$eval( - '.sidebar, .conversation-column, .details-panel', + '.moss-sidebar-column, .moss-conversation-column, .moss-details-column', (columns) => columns.map((column) => Math.round(column.getBoundingClientRect().width)) ); assert.deepEqual( @@ -155,45 +296,282 @@ test( [252, 868, 320], 'desktop keeps the stable three-column frame' ); + assert.equal(await page.$$eval('[data-resize-handle]', (handles) => handles.length), 2); + const sidebarHandle = await page.$('[data-resize-handle="sidebar"]'); + const sidebarHandleBox = await sidebarHandle.boundingBox(); + assert.ok(sidebarHandleBox); + await page.mouse.move(sidebarHandleBox.x + sidebarHandleBox.width / 2, 200); + await page.mouse.down(); + await page.mouse.move(sidebarHandleBox.x + 38, 200, { steps: 4 }); + await page.mouse.up(); + const resizedSidebar = await page.$eval('.moss-sidebar-column', (sidebar) => + Math.round(sidebar.getBoundingClientRect().width) + ); + assert.ok(resizedSidebar > 252, 'sidebar drag increases the live column width'); + assert.match( + await page.evaluate(() => localStorage.getItem('moss-layout-v1') ?? ''), + /sidebarWidth/, + 'layout preference is durable' + ); + await page.click('[aria-label="Toggle navigation panel"]'); + await page.waitForFunction( + () => + Math.round( + document.querySelector('.moss-sidebar-column').getBoundingClientRect().width + ) === 64 + ); + assert.equal( + await page.$eval('.moss-sidebar-column', (sidebar) => + Math.round(sidebar.getBoundingClientRect().width) + ), + 64, + 'sidebar toggle keeps a compact mounted rail' + ); + await page.click('[aria-label="Toggle navigation panel"]'); + await page.waitForFunction( + (expected) => + Math.round( + globalThis.document.querySelector('.moss-sidebar-column').getBoundingClientRect().width + ) === expected, + resizedSidebar + ); + assert.equal( + await page.$eval('.moss-sidebar-column', (sidebar) => + Math.round(sidebar.getBoundingClientRect().width) + ), + resizedSidebar, + 'expanding restores the persisted width' + ); const screenshot = await page.screenshot({ type: 'png' }); assert.ok( screenshot.byteLength > 20_000, 'fixed viewport produces a non-empty visual sample' ); await page.click('.sidebar-footer > button'); - await page.click('.settings-tabs button:last-child'); + assert.equal( + await page.$$eval('.settings-view > .moss-tabs button', (tabs) => tabs.length), + 7 + ); + for (const section of [ + 'General', + 'Models', + 'Permissions', + 'Skills', + 'MCP', + 'Plugins', + 'Runtime', + ]) { + await page.getByRole('tab', { name: section }).click(); + await page.waitForFunction( + (title) => document.querySelector('.settings-section > h3')?.textContent === title, + section + ); + } + await page.getByRole('tab', { name: 'General' }).click(); + await assertVisual('desktop-settings', await page.screenshot({ type: 'png' })); + await page.getByRole('tab', { name: 'Plugins' }).click(); await page.waitForFunction( - `Array.from(document.querySelectorAll('[data-moss-slot="settings.plugin"] > div')) - .map((node) => node.shadowRoot?.textContent) - .includes('BROWSER_PLUGIN_UI_OK') && - Array.from(document.querySelectorAll('[data-moss-slot="settings.plugin"] > div')) - .map((node) => node.shadowRoot?.textContent) - .includes('BROWSER_PLUGIN_UI_TWO_OK')`, + () => { + const content = Array.from( + document.querySelectorAll('[data-moss-slot="settings.plugin"] > div'), + (node) => node.shadowRoot?.textContent ?? '' + ); + return ( + content.some((text) => text.includes('BROWSER_PLUGIN_UI_OK')) && + content.some((text) => text.includes('BROWSER_PLUGIN_UI_TWO_OK')) + ); + }, + undefined, { timeout: 10_000 } ); - await new Promise((resolve) => setTimeout(resolve, 300)); + const pluginSlotState = await page.evaluate(() => + Array.from( + document.querySelectorAll('[data-moss-slot="settings.plugin"] > div'), + (node) => ({ + generation: node.getAttribute('data-moss-plugin-generation'), + text: node.shadowRoot?.textContent ?? '', + }) + ) + ); + assert.equal( + pluginSlotState.length, + 2, + `each plugin owns a distinct slot host; page errors: ${pageErrors.join(' | ')}` + ); + await assertVisual('desktop-plugins', await page.screenshot({ type: 'png' })); + await page.getByRole('button', { name: /Run doctor/ }).click(); + await page.waitForFunction(() => document.body.textContent.includes('Doctor · generation')); await page.click('.new-task'); - await new Promise((resolve) => setTimeout(resolve, 100)); - assert.equal(await page.evaluate('globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__'), true); - await page.waitForSelector('textarea'); + await page.waitForSelector('.composer-shell textarea'); + await page.waitForFunction(() => globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__ === true); + assert.equal(await page.evaluate(() => globalThis.__MOSS_FIRST_PLUGIN_DISPOSED__), true); + const notePath = path.join(configDir, 'browser-note.txt'); + await fs.writeFile(notePath, 'ATTACHMENT_BROWSER_OK'); + await page.locator('input[type="file"]').setInputFiles(notePath); + await page.waitForFunction(() => document.body.textContent.includes('ready')); await page.type('textarea', 'Complete the browser turn.'); + assert.match( + await page.evaluate(() => localStorage.getItem('moss-workbench-v2') ?? ''), + /Complete the browser turn/ + ); await page.keyboard.press('Enter'); - await page.waitForFunction('document.body.textContent.includes("BROWSER_TURN_OK")', { - timeout: 10_000, - }); + await page.waitForFunction( + () => document.body.textContent.includes('BROWSER_TURN_OK'), + undefined, + { timeout: 10_000 } + ); + assert.equal(await page.inputValue('textarea'), '', 'send clears the active session draft'); assert.equal(await page.$$eval('.message', (messages) => messages.length), 2); - await page.setViewport({ width: 740, height: 900, deviceScaleFactor: 1 }); + await page.getByRole('tab', { name: 'Plan' }).click(); + await assertVisual('desktop-plan', await page.screenshot({ type: 'png' })); + await page.type('textarea', 'Run a browser tool.'); + await page.keyboard.press('Enter'); + await page.waitForFunction(() => document.body.textContent.includes('Moss is working')); + await assertVisual('desktop-running', await page.screenshot({ type: 'png' })); + await page.waitForSelector('.tool-row.tool-running'); + await page.waitForSelector('.tool-row.tool-complete', { timeout: 10_000 }); + assert.equal( + await page.inputValue('textarea'), + '', + 'tool turns do not restore a stale draft' + ); + await page.click('.tool-row.tool-complete'); + await page.waitForFunction(() => document.body.textContent.includes('BROWSER_TOOL_OK')); + await assertVisual('desktop-tool', await page.screenshot({ type: 'png' })); + await page.type('textarea', 'Require browser approval.'); + await page.keyboard.press('Enter'); + await page.waitForSelector('[role="alertdialog"][aria-label="Approval required"]'); + await assertVisual('desktop-approval', await page.screenshot({ type: 'png' })); + await page.getByRole('button', { name: 'Allow once' }).click(); + await page.waitForFunction(() => + document.body.textContent.includes('APPROVAL_FLOW_COMPLETE') + ); + await page.type('textarea', 'Ask a browser question.'); + await page.keyboard.press('Enter'); + await page.waitForSelector('[role="alertdialog"][aria-label="Moss has a question"]'); + await page.getByRole('textbox', { name: 'Answer' }).fill('green'); + await page.getByRole('button', { name: 'Answer' }).click(); + await page.waitForFunction(() => + document.body.textContent.includes('QUESTION_FLOW_COMPLETE') + ); + await page.setViewportSize({ width: 980, height: 900 }); + await page.waitForFunction( + () => + Math.round( + document.querySelector('.moss-sidebar-column').getBoundingClientRect().width + ) === 64 + ); + await page.click('[aria-label="Toggle navigation panel"]'); + await page.waitForFunction( + (expected) => + Math.round( + globalThis.document.querySelector('.moss-sidebar-column').getBoundingClientRect().width + ) === expected, + resizedSidebar + ); assert.equal( - await page.$eval('.sidebar', (sidebar) => globalThis.getComputedStyle(sidebar).display), - 'none' + await page.$eval('.moss-sidebar-column', (sidebar) => + Math.round(sidebar.getBoundingClientRect().width) + ), + resizedSidebar, + 'narrow desktop allows an explicit sidebar expansion' + ); + assert.equal( + await page.$eval('.moss-details-column', (details) => + Math.round(details.getBoundingClientRect().width) + ), + 0, + 'details concedes before the center column when the narrow sidebar expands' + ); + await page.click('[aria-label="Toggle navigation panel"]'); + await page.waitForFunction( + () => + Math.round( + document.querySelector('.moss-sidebar-column').getBoundingClientRect().width + ) === 64 + ); + await assertVisual('narrow-conversation', await page.screenshot({ type: 'png' })); + await page.setViewportSize({ width: 740, height: 900 }); + await page.waitForFunction( + () => + getComputedStyle(document.querySelector('[data-mobile-drawer="sidebar"]')).visibility === + 'hidden' + ); + assert.equal( + await page.$eval( + '[data-mobile-drawer="sidebar"]', + (sidebar) => globalThis.getComputedStyle(sidebar).visibility + ), + 'hidden' + ); + await page.click('[aria-label="Toggle navigation panel"]'); + await page.waitForFunction( + () => + getComputedStyle(document.querySelector('[data-mobile-drawer="sidebar"]')).visibility === + 'visible' + ); + assert.equal( + await page.$eval( + '[data-mobile-drawer="sidebar"]', + (sidebar) => globalThis.getComputedStyle(sidebar).visibility + ), + 'visible', + 'mobile navigation opens as a drawer' + ); + await page.click('.moss-drawer-backdrop'); + await page.waitForFunction( + () => + getComputedStyle(document.querySelector('[data-mobile-drawer="sidebar"]')).visibility === + 'hidden' + ); + await page.click('[aria-label="Toggle details panel"]'); + await page.waitForFunction( + () => + getComputedStyle(document.querySelector('[data-mobile-drawer="details"]')).visibility === + 'visible' + ); + assert.equal( + await page.$eval( + '[data-mobile-drawer="details"]', + (details) => globalThis.getComputedStyle(details).visibility + ), + 'visible', + 'mobile details opens independently as a drawer' ); assert.ok( - (await page.$eval('.details-panel', (panel) => panel.getBoundingClientRect().width)) <= 330, + (await page.$eval( + '[data-mobile-drawer="details"]', + (panel) => panel.getBoundingClientRect().width + )) <= 330, 'tablet details panel becomes a bounded drawer' ); + await page.goto(`${web.url}/#gallery`, { waitUntil: 'domcontentloaded', timeout: 30_000 }); + await page.waitForSelector('[data-moss-component-gallery]'); + for (const primitive of [ + 'button', + 'input', + 'tabs', + 'toast', + 'tooltip', + 'card', + 'disclosure', + 'code', + 'diff', + 'terminal', + 'menu', + ]) { + assert.ok(await page.$(`[data-moss-ui="${primitive}"]`), `gallery renders ${primitive}`); + } + await page.click('[data-gallery-action="dialog"]'); + await page.waitForSelector('[data-moss-ui="dialog"] [role="dialog"]'); + await assertVisual('tablet-gallery-dialog', await page.screenshot({ type: 'png' })); + await page.keyboard.press('Escape'); + await page.waitForFunction(() => document.querySelector('[data-moss-ui="dialog"]') === null); + await assertVisual('tablet-gallery', await page.screenshot({ type: 'png' })); assert.deepEqual(pageErrors, []); } finally { - if (browser) await closeBrowser(browser); + if (browserContext) await browserContext.close(); + if (browser) await browser.close(); await web.close(); await agent.close(); } diff --git a/packages/moss-agent/test/web-ui.spec.mjs b/packages/moss-agent/test/web-ui.spec.mjs index e5ab4a29..60a77fe9 100644 --- a/packages/moss-agent/test/web-ui.spec.mjs +++ b/packages/moss-agent/test/web-ui.spec.mjs @@ -2,6 +2,8 @@ import assert from 'node:assert/strict'; import http from 'node:http'; import test from 'node:test'; + +import { authorizedWebFetch as fetch } from './web-authorized-fetch.mjs'; import { mkdtemp, mkdir, writeFile } from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; @@ -75,10 +77,14 @@ test('web host boots on loopback and streams real tool evidence', async () => { assert.equal(web.host, '127.0.0.1'); const page = await fetch(web.url).then((response) => response.text()); assert.match(page, /id="moss-web-root"/); + const legacy = await fetch(`${web.url}/?legacy=1`).then((response) => response.text()); + assert.match(legacy, /Legacy workspace · temporary rollback/); const clientScript = await fetch(`${web.url}/assets/workbench.js`); assert.equal(clientScript.status, 200); assert.match(clientScript.headers.get('content-type') ?? '', /javascript/); assert.doesNotMatch(await clientScript.text(), /\bprocess\.env\b/); + assert.equal((await fetch(`${web.url}/assets/moss-web-components.js`)).status, 200); + assert.equal((await fetch(`${web.url}/assets/moss-web-components.css`)).status, 200); const clientStyles = await fetch(`${web.url}/assets/workbench.css`).then((response) => response.text() ); @@ -365,7 +371,7 @@ test('web plugin settings expose redacted inventory and require local-origin mut ); await writeFile( path.join(brokenPluginDir, 'plugin.mjs'), - "import { isMainThread } from 'node:worker_threads'; export default { id: 'zz/broken-web', setup() { if (isMainThread) throw new Error('BROKEN_WEB_SETUP'); } };\n" + "export default { id: 'zz/broken-web', setup() { throw new Error('BROKEN_WEB_SETUP'); } };\n" ); await writeFile( path.join(brokenPluginDir, 'settings.js'), @@ -424,13 +430,14 @@ test('web plugin settings expose redacted inventory and require local-origin mut const disabled = await fetch(`${web.url}/api/plugins/fixture%2Fplugin/disable`, { method: 'POST', }).then((response) => response.json()); - assert.equal(disabled.restartRequired, true); + assert.equal(disabled.restartRequired, false); const refreshed = await fetch(`${web.url}/api/plugins`).then((response) => response.json()); assert.equal(refreshed.installed[0].enabled, false); - assert.equal(refreshed.contributions[0].pluginId, 'fixture/plugin'); - const retainedAsset = await fetch(`${web.url}${refreshed.contributions[0].moduleUrl}`); - assert.equal(retainedAsset.status, 200); - assert.match(await retainedAsset.text(), /FIXTURE_PLUGIN_UI/); + assert.equal( + refreshed.contributions.some(({ pluginId }) => pluginId === 'fixture/plugin'), + false + ); + assert.equal((await fetch(`${web.url}${inventory.contributions[0].moduleUrl}`)).status, 404); } finally { await web.close(); await agent.close(); diff --git a/packages/moss-agent/test/web-workbench-capabilities.spec.mjs b/packages/moss-agent/test/web-workbench-capabilities.spec.mjs new file mode 100644 index 00000000..24e7b1a9 --- /dev/null +++ b/packages/moss-agent/test/web-workbench-capabilities.spec.mjs @@ -0,0 +1,120 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import test from 'node:test'; +import { fileURLToPath } from 'node:url'; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const client = path.resolve(here, '../src/web-ui/client'); + +test('workbench source keeps durable session and resumable stream contracts visible', async () => { + const [api, preferences, workbench] = await Promise.all([ + fs.readFile(path.join(client, 'api-client.ts'), 'utf8'), + fs.readFile(path.join(client, 'workbench-preferences.ts'), 'utf8'), + fs.readFile(path.join(client, 'workbench.tsx'), 'utf8'), + ]); + assert.match(api, /EventSource/); + assert.match(api, /after/); + assert.match(api, /lastEventId/); + assert.match(api, /\/api\/plugins\/events/); + assert.match(api, /connectPluginComposition/); + assert.match(preferences, /moss-workbench-v2/); + assert.match(preferences, /draft/); + assert.match(preferences, /scrollTop/); + assert.match(workbench, /SessionSidebar/); + assert.match( + await fs.readFile(path.join(client, 'session-sidebar.tsx'), 'utf8'), + /WorkspacePicker/ + ); +}); + +test('plugin UI generations clear owned ShadowRoot content before remount', async () => { + const source = await fs.readFile(path.join(client, 'plugin-slot.tsx'), 'utf8'); + assert.match(source, /mossPluginGeneration/); + assert.match(source, /replaceChildren\(\)/); + assert.match(source, /dispose/); +}); + +test('workbench exposes every planned control and settings surface', async () => { + const files = await Promise.all( + ['composer.tsx', 'session-sidebar.tsx', 'settings-center.tsx', 'details-panel.tsx'].map( + (file) => fs.readFile(path.join(client, file), 'utf8') + ) + ); + const source = files.join('\n'); + for (const label of [ + 'plan', + 'acceptEdits', + 'queue', + 'steer', + 'General', + 'Models', + 'Permissions', + 'Skills', + 'MCP', + 'Plugins', + 'Runtime', + 'Trajectory', + 'Evidence', + 'Completion verdict', + ]) { + assert.ok(source.includes(label), `missing planned UI surface: ${label}`); + } +}); + +test('timeline includes rich tool renderers and complete stream states', async () => { + const source = `${await fs.readFile(path.join(client, 'conversation-timeline.tsx'), 'utf8')}\n${await fs.readFile(path.join(client, 'workbench.tsx'), 'utf8')}`; + for (const token of [ + 'retry', + 'compaction', + 'usage', + 'context', + 'interrupted', + 'diff', + 'terminal', + 'read', + 'edit', + 'search', + 'web', + ]) { + assert.ok(source.toLowerCase().includes(token), `missing timeline capability: ${token}`); + } +}); + +test('commands, attachments, CSRF and plugin lifecycle use real server contracts', async () => { + const [api, composer, settings] = await Promise.all([ + fs.readFile(path.join(client, 'api-client.ts'), 'utf8'), + fs.readFile(path.join(client, 'composer.tsx'), 'utf8'), + fs.readFile(path.join(client, 'settings-center.tsx'), 'utf8'), + ]); + assert.match(api, /x-moss-csrf/); + assert.match(api, /contentBase64/); + assert.match(api, /attachmentIds/); + assert.match(api, /workspaceRelativePath/); + assert.match(composer, /if \(text\.startsWith\('\/'\)\) \{/); + assert.match(composer, /onCommand\(text\)/); + assert.doesNotMatch(composer, /text\.slice\(1\)/); + for (const capability of ['addPlugin', 'doctorPlugins', 'pluginConfig', 'putPluginSecret']) { + assert.ok(api.includes(capability), `missing plugin API: ${capability}`); + } + assert.match( + settings, + /Local path, exact npm package, official source, or compatible DSH package/ + ); + assert.match(settings, /Configured — write-only/); +}); + +test('plugins receive a self-contained controlled component browser entry', async () => { + const source = await fs.readFile(path.join(client, 'moss-web-components.tsx'), 'utf8'); + assert.match(source, /mountMossWebComponent/); + for (const component of ['Button', 'Input', 'Card', 'Menu', 'Modal']) { + assert.ok(source.includes(component), `missing controlled component export: ${component}`); + } + const config = await fs.readFile( + path.resolve(client, '../../../web-components-vite.config.mjs'), + 'utf8' + ); + assert.match(config, /moss-web-components\.js/); + assert.match(config, /emptyOutDir: false/); +}); diff --git a/packages/moss-agent/web-components-vite.config.mjs b/packages/moss-agent/web-components-vite.config.mjs new file mode 100644 index 00000000..1903c54a --- /dev/null +++ b/packages/moss-agent/web-components-vite.config.mjs @@ -0,0 +1,28 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { defineConfig } from 'vite'; + +const packageRoot = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + define: { 'process.env.NODE_ENV': JSON.stringify('production') }, + build: { + outDir: path.join(packageRoot, 'dist', 'web-ui', 'client'), + emptyOutDir: false, + cssCodeSplit: false, + lib: { + entry: path.join(packageRoot, 'src', 'web-ui', 'client', 'moss-web-components.tsx'), + formats: ['es'], + fileName: () => 'moss-web-components.js', + }, + rollupOptions: { + output: { + assetFileNames: (assetInfo) => + assetInfo.names.some((name) => name.endsWith('.css')) + ? 'moss-web-components.css' + : '[name][extname]', + }, + }, + }, +}); diff --git a/scripts/check-moss-web-tokens.mjs b/scripts/check-moss-web-tokens.mjs new file mode 100644 index 00000000..09311416 --- /dev/null +++ b/scripts/check-moss-web-tokens.mjs @@ -0,0 +1,60 @@ +import { readFile, readdir } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const workspace = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const tokenDefinition = path.join( + workspace, + 'packages/moss-agent/src/web-ui/client/design-system.css' +); +const roots = [ + path.join(workspace, 'packages/moss-agent/src/web-ui/client'), + path.join(workspace, 'packages/moss-agent/assets/plugins'), + path.join(workspace, 'packages/create-moss-app'), +]; +const sourceExtensions = new Set(['.css', '.html', '.js', '.mjs', '.ts', '.tsx']); +const rawVisualValue = + /(?:color|background(?:-color)?|border(?:-[a-z-]+)?|box-shadow|fill|stroke)\s*:\s*(?:#[0-9a-f]{3,8}\b|rgba?\()/gi; + +async function filesBelow(root) { + const files = []; + let entries; + try { + entries = await readdir(root, { withFileTypes: true }); + } catch (error) { + if (error?.code === 'ENOENT') return files; + throw error; + } + for (const entry of entries) { + if (entry.name === 'node_modules' || entry.name === 'dist') continue; + const target = path.join(root, entry.name); + if (entry.isDirectory()) files.push(...(await filesBelow(target))); + else if (sourceExtensions.has(path.extname(entry.name))) files.push(target); + } + return files; +} + +const violations = []; +for (const root of roots) { + for (const file of await filesBelow(root)) { + if (file === tokenDefinition) continue; + const source = await readFile(file, 'utf8'); + for (const match of source.matchAll(rawVisualValue)) { + const line = source.slice(0, match.index).split('\n').length; + violations.push(`${path.relative(workspace, file)}:${line}: ${match[0]}`); + } + } +} + +if (violations.length > 0) { + console.error( + [ + 'Moss Web visual values must come from --moss-* design tokens.', + 'Define palette values in design-system.css and consume var(--moss-...) elsewhere.', + ...violations, + ].join('\n') + ); + process.exitCode = 1; +} else { + console.log('[moss-web-tokens] built-in UI, official plugins, and templates use design tokens'); +} diff --git a/scripts/config/maintainability-baseline.json b/scripts/config/maintainability-baseline.json index 6bc72733..39fd0ecd 100644 --- a/scripts/config/maintainability-baseline.json +++ b/scripts/config/maintainability-baseline.json @@ -11,7 +11,7 @@ "reason": "Legacy hotspot recorded at initial maintainability-ratchet adoption." }, "packages/moss-agent/src/cli/approval.ts": { - "maxLines": 958, + "maxLines": 898, "reason": "Legacy hotspot recorded at initial maintainability-ratchet adoption." }, "packages/moss-agent/src/cli/coding-completion-gate.ts": { diff --git a/scripts/lib/cloud-local-scenario.mjs b/scripts/lib/cloud-local-scenario.mjs index 4c57adde..d7dfbcea 100644 --- a/scripts/lib/cloud-local-scenario.mjs +++ b/scripts/lib/cloud-local-scenario.mjs @@ -238,12 +238,17 @@ export async function runCloudLocalScenario(options = {}) { taskRunFile: path.join(root, '.moss', 'task-runs.jsonl'), }); try { - const session = await fetch(`${web.url}/api/sessions`, { method: 'POST' }).then((response) => + const { csrfToken } = await fetch(`${web.url}/api/bootstrap`).then((response) => response.json() ); + const mutationHeaders = { origin: web.url, 'x-moss-csrf': csrfToken }; + const session = await fetch(`${web.url}/api/sessions`, { + method: 'POST', + headers: mutationHeaders, + }).then((response) => response.json()); const wire = await fetch(`${web.url}/api/sessions/${session.sessionId}/messages`, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: { ...mutationHeaders, 'content-type': 'application/json' }, body: JSON.stringify({ prompt: 'Reconcile the local release manifest with cloud attestation and recover failures.', }), From 94fa15d92122e17324f2a9ad3e2b22455e5bc34c Mon Sep 17 00:00:00 2001 From: QiaolongLi1201 Date: Tue, 18 Aug 2026 16:02:57 +0800 Subject: [PATCH 4/5] fix(agent): harden plugin workers across platforms --- CHANGELOG.md | 6 ++++++ packages/moss-agent/CHANGELOG.md | 5 +++++ .../moss-agent/src/plugins/installed-plugin-registry.ts | 2 +- packages/moss-agent/src/plugins/isolated-plugin-runtime.ts | 5 +++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12a4044b..8f2de1a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ Categories: **Added** · **Changed** · **Fixed** · **Removed** · **Internal** ## [Unreleased] +### Fixed + +- **Cross-platform plugin process lifecycle**: active Worker RPC calls now keep their worker alive + until every pending promise settles, and exact-version plugin installation resolves the Windows + `npm.cmd` shim instead of failing with `spawn npm ENOENT`. + ### Added - **Complete local Web workbench**: `moss web` now provides the responsive three-column Moss design diff --git a/packages/moss-agent/CHANGELOG.md b/packages/moss-agent/CHANGELOG.md index ac53b78f..d84d3f25 100644 --- a/packages/moss-agent/CHANGELOG.md +++ b/packages/moss-agent/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Active isolated-plugin RPC calls now keep their Worker alive until pending promises settle, and + exact-version npm plugin installation resolves `npm.cmd` on Windows. + ### Added - Replaced the inline Web client with an in-package React/Vite three-column workbench, centralized diff --git a/packages/moss-agent/src/plugins/installed-plugin-registry.ts b/packages/moss-agent/src/plugins/installed-plugin-registry.ts index e39d467b..a2df450a 100644 --- a/packages/moss-agent/src/plugins/installed-plugin-registry.ts +++ b/packages/moss-agent/src/plugins/installed-plugin-registry.ts @@ -608,7 +608,7 @@ export class InstalledPluginRegistry { randomUUID() ); await mkdir(generationRoot, { recursive: true, mode: 0o700 }); - await this.npmRunner('npm', { + await this.npmRunner(process.platform === 'win32' ? 'npm.cmd' : 'npm', { args: [ 'install', '--ignore-scripts', diff --git a/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts b/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts index a5ed8eeb..c21b37f0 100644 --- a/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts +++ b/packages/moss-agent/src/plugins/isolated-plugin-runtime.ts @@ -114,12 +114,14 @@ class IsolatedPluginWorker { const abort = () => { this.worker.postMessage({ type: 'cancel', requestId }); this.pending.delete(requestId); + if (this.pending.size === 0) this.worker.unref(); reject(new MossError({ code: ErrorCode.USER_ABORTED, message: 'plugin call aborted' })); }; if (signal?.aborted) { abort(); return; } + this.worker.ref(); signal?.addEventListener('abort', abort, { once: true }); this.pending.set(requestId, { resolve: (value) => resolve(value as T), @@ -133,6 +135,7 @@ class IsolatedPluginWorker { this.worker.postMessage({ type: 'call', requestId, method, target, args }); } catch (error) { this.pending.delete(requestId); + if (this.pending.size === 0) this.worker.unref(); signal?.removeEventListener('abort', abort); reject(error instanceof Error ? error : pluginError(String(error))); } @@ -187,6 +190,7 @@ class IsolatedPluginWorker { return; } this.pending.delete(requestId); + if (this.pending.size === 0) this.worker.unref(); pending.removeAbortListener?.(); if (value.type === 'result') pending.resolve(value.value); else pending.reject(pluginError(String(value.message ?? 'isolated plugin call failed'))); @@ -198,6 +202,7 @@ class IsolatedPluginWorker { pending.reject(error); } this.pending.clear(); + this.worker.unref(); } } From 681e9f03798dc24082a3545837dbf4b3e2335ab5 Mon Sep 17 00:00:00 2001 From: QiaolongLi1201 Date: Tue, 18 Aug 2026 16:20:04 +0800 Subject: [PATCH 5/5] fix(agent): invoke npm safely on Windows --- CHANGELOG.md | 4 +- packages/moss-agent/CHANGELOG.md | 2 +- .../src/plugins/installed-plugin-registry.ts | 69 +++++++++++++------ .../test/plugin-npm-generations.spec.mjs | 4 ++ 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f2de1a4..888db906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,8 @@ Categories: **Added** · **Changed** · **Fixed** · **Removed** · **Internal** ### Fixed - **Cross-platform plugin process lifecycle**: active Worker RPC calls now keep their worker alive - until every pending promise settles, and exact-version plugin installation resolves the Windows - `npm.cmd` shim instead of failing with `spawn npm ENOENT`. + until every pending promise settles, and exact-version plugin installation runs npm's JavaScript + CLI directly on Windows instead of failing through the `npm.cmd` shim. ### Added diff --git a/packages/moss-agent/CHANGELOG.md b/packages/moss-agent/CHANGELOG.md index d84d3f25..b7cf76f9 100644 --- a/packages/moss-agent/CHANGELOG.md +++ b/packages/moss-agent/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Active isolated-plugin RPC calls now keep their Worker alive until pending promises settle, and - exact-version npm plugin installation resolves `npm.cmd` on Windows. + exact-version plugin installation runs npm's JavaScript CLI directly on Windows. ### Added diff --git a/packages/moss-agent/src/plugins/installed-plugin-registry.ts b/packages/moss-agent/src/plugins/installed-plugin-registry.ts index a2df450a..96cf6d84 100644 --- a/packages/moss-agent/src/plugins/installed-plugin-registry.ts +++ b/packages/moss-agent/src/plugins/installed-plugin-registry.ts @@ -272,6 +272,24 @@ function officialPluginRoot(source: string): string | undefined { return path.resolve(here, '..', '..', 'assets', 'plugins', name); } +async function resolveNpmInvocation(): Promise<{ + readonly command: string; + readonly argsPrefix: readonly string[]; +}> { + if (process.platform !== 'win32') return { command: 'npm', argsPrefix: [] }; + const candidates = [ + process.env.npm_execpath, + path.join(path.dirname(process.execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js'), + ].filter((candidate): candidate is string => Boolean(candidate)); + for (const candidate of candidates) { + try { + await access(candidate); + return { command: process.execPath, argsPrefix: [candidate] }; + } catch {} + } + throw invalidManifest('unable to locate npm-cli.js for exact-version plugin installation'); +} + async function assertInstalledIdentity(entry: InstalledMossPlugin): Promise { if (entry.format === 'dsh-package-v1') { const report = await inspectDshPackageCompatibility(entry.root); @@ -608,28 +626,35 @@ export class InstalledPluginRegistry { randomUUID() ); await mkdir(generationRoot, { recursive: true, mode: 0o700 }); - await this.npmRunner(process.platform === 'win32' ? 'npm.cmd' : 'npm', { - args: [ - 'install', - '--ignore-scripts', - '--no-save', - '--no-audit', - '--no-fund', - '--package-lock=false', - '--prefix', - generationRoot, - source, - ], - timeout: 120_000, - maxBuffer: 2 * 1024 * 1024, - }); - const root = await realpath( - path.join(generationRoot, 'node_modules', ...packageName.split('/')) - ); - return { - root, - discard: () => rm(generationRoot, { recursive: true, force: true }), - }; + try { + const npm = await resolveNpmInvocation(); + await this.npmRunner(npm.command, { + args: [ + ...npm.argsPrefix, + 'install', + '--ignore-scripts', + '--no-save', + '--no-audit', + '--no-fund', + '--package-lock=false', + '--prefix', + generationRoot, + source, + ], + timeout: 120_000, + maxBuffer: 2 * 1024 * 1024, + }); + const root = await realpath( + path.join(generationRoot, 'node_modules', ...packageName.split('/')) + ); + return { + root, + discard: () => rm(generationRoot, { recursive: true, force: true }), + }; + } catch (error) { + await rm(generationRoot, { recursive: true, force: true }).catch(() => {}); + throw error; + } } } diff --git a/packages/moss-agent/test/plugin-npm-generations.spec.mjs b/packages/moss-agent/test/plugin-npm-generations.spec.mjs index 0c891d82..8ac5a78e 100644 --- a/packages/moss-agent/test/plugin-npm-generations.spec.mjs +++ b/packages/moss-agent/test/plugin-npm-generations.spec.mjs @@ -43,7 +43,9 @@ await writeFile(path.join(packageRoot, 'plugin.mjs'), name.includes('bad') || (n await chmod(npmCommand, 0o755); } const previousPath = process.env.PATH; + const previousNpmExecPath = process.env.npm_execpath; process.env.PATH = `${bin}${path.delimiter}${previousPath ?? ''}`; + if (process.platform === 'win32') process.env.npm_execpath = fakeNpm; try { const registry = new InstalledPluginRegistry({ configDir, setupTimeoutMs: 75 }); const first = await registry.add('fixture_npm_one@1.0.0'); @@ -99,5 +101,7 @@ await writeFile(path.join(packageRoot, 'plugin.mjs'), name.includes('bad') || (n await Promise.all(recovered.plugins.map((plugin) => plugin.disposeCandidate?.())); } finally { process.env.PATH = previousPath; + if (previousNpmExecPath === undefined) delete process.env.npm_execpath; + else process.env.npm_execpath = previousNpmExecPath; } });