Skip to content

Commit 1070122

Browse files
authored
Merge pull request #6 from clawdotnet/codex/p1-phase2-foundation
feat: add enterprise CLI follow-through and docs parity
2 parents abab913 + 3071ac6 commit 1070122

188 files changed

Lines changed: 10575 additions & 512 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ jobs:
2525
run: dotnet restore SharpClawCode.sln
2626
- name: Build
2727
run: dotnet build SharpClawCode.sln --no-restore --configuration Release
28+
- name: Build examples
29+
run: |
30+
dotnet build examples/WebApiAgent/WebApiAgent.csproj --no-restore --configuration Release
31+
dotnet build examples/MinimalConsoleAgent/MinimalConsoleAgent.csproj --no-restore --configuration Release
32+
dotnet build examples/WorkerServiceHost/WorkerServiceHost.csproj --no-restore --configuration Release
33+
dotnet build examples/McpToolAgent/McpToolAgent.csproj --no-restore --configuration Release
2834
- name: Test
2935
run: dotnet test SharpClawCode.sln --no-build --configuration Release --collect:"XPlat Code Coverage" --results-directory ./coverage
3036
- name: Upload coverage

‎Directory.Packages.props‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
1717
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.5" />
1818
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.5" />
19+
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.14.0" />
20+
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.14.0" />
1921
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
2022
<PackageVersion Include="Anthropic" Version="12.11.0" />
2123
<PackageVersion Include="Microsoft.Extensions.AI" Version="10.4.1" />
2224
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="10.4.1" />
2325
<PackageVersion Include="ModelContextProtocol" Version="1.2.0" />
26+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.0.0" />
27+
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.0" />
2428
<PackageVersion Include="Spectre.Console" Version="0.55.0" />
2529
<PackageVersion Include="System.CommandLine" Version="2.0.5" />
2630
<PackageVersion Include="xunit" Version="2.9.3" />
2731
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.4" />
2832
</ItemGroup>
29-
</Project>
33+
</Project>

‎README.md‎

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ SharpClaw Code is a C# and .NET-native coding agent runtime for teams building A
99

1010
It combines durable sessions, permission-aware tool execution, provider abstraction, structured telemetry, and an automation-friendly command-line surface in a runtime shaped for real .NET systems: explicit, testable, and operationally legible.
1111

12+
The repository now ships both a terminal-first agent runtime and an embeddable host SDK through `SharpClaw.Code`, which makes it viable for standalone CLIs, local editor backends, and tenant-aware embedded services.
13+
1214
## What It Is
1315

1416
SharpClaw Code is an open-source runtime for building and operating coding-agent experiences in the .NET ecosystem.
@@ -65,6 +67,21 @@ dotnet run --project src/SharpClaw.Code.Cli -- prompt "Summarize this workspace"
6567
dotnet run --project src/SharpClaw.Code.Cli -- doctor
6668
dotnet run --project src/SharpClaw.Code.Cli -- status
6769

70+
# Refresh and query the workspace knowledge index
71+
dotnet run --project src/SharpClaw.Code.Cli -- index refresh
72+
dotnet run --project src/SharpClaw.Code.Cli -- index query WidgetService
73+
74+
# Save and inspect durable memory
75+
dotnet run --project src/SharpClaw.Code.Cli -- memory save --scope project "Keep prompts concise"
76+
dotnet run --project src/SharpClaw.Code.Cli -- memory list --scope project
77+
78+
# Inspect metering summaries and details
79+
dotnet run --project src/SharpClaw.Code.Cli -- usage summary
80+
dotnet run --project src/SharpClaw.Code.Cli -- usage detail --limit 25
81+
82+
# Manage packaged tool bundles
83+
dotnet run --project src/SharpClaw.Code.Cli -- tool-packages list
84+
6885
# Emit machine-readable output
6986
dotnet run --project src/SharpClaw.Code.Cli -- --output-format json doctor
7087
```
@@ -73,6 +90,8 @@ Built-in REPL slash commands include `/help`, `/status`, `/doctor`, `/session`,
7390

7491
Parity-oriented commands now include:
7592

93+
- `index` / `/index`
94+
- `memory` / `/memory`
7695
- `models` / `/models`
7796
- `usage` / `/usage`
7897
- `cost` / `/cost`
@@ -101,12 +120,16 @@ Primary workflow modes:
101120
| Durable sessions | Persist conversation state, turn history, checkpoints, and recovery metadata for longer-running agent work |
102121
| Permission-aware tools | Route file, shell, and plugin-backed actions through explicit policy and approval decisions |
103122
| Provider abstraction | Run against Anthropic and OpenAI-compatible backends through a typed runtime surface |
123+
| Local runtime catalog | Surface Ollama, llama.cpp, and other OpenAI-compatible profiles with health, model discovery, and embedding defaults |
104124
| MCP support | Register, supervise, and integrate MCP servers with explicit lifecycle state |
105125
| Plugins and skills | Extend the runtime with trusted plugin manifests and discoverable workspace skills |
126+
| Workspace knowledge | Build a durable local index for lexical, symbol, and semantic workspace search |
127+
| Cross-session memory | Persist project and user memory so later sessions can recall repo-specific guidance and user preferences |
106128
| Structured telemetry | Emit runtime events and usage signals that support diagnostics, replay, and automation |
129+
| Enterprise host controls | Add tenant-aware storage, authenticated approvals, admin APIs, and usage metering for embedded deployments |
107130
| JSON-friendly CLI | Use the same runtime through human-readable terminal flows or machine-readable command output |
108131
| Spec workflow mode | Turn prompts into structured requirements, technical design, and task documents for feature proposals |
109-
| Embedded local server | Expose prompt, session, status, doctor, and share endpoints for editor or automation clients |
132+
| Embedded SDK + server | Host the runtime via `SharpClaw.Code` or expose prompt, session, admin, and SSE endpoints for editor or automation clients |
110133
| Config + agent catalog | Layer user/workspace JSONC config with typed agent defaults, tool allowlists, and runtime hooks |
111134
| Session sharing | Create self-hosted share links and durable sanitized share snapshots under `.sharpclaw/` |
112135
| Diagnostics context | Surface configured diagnostics sources into prompt context, status, and machine-readable output |
@@ -123,6 +146,7 @@ Primary workflow modes:
123146

124147
| Area | Project(s) |
125148
|---|---|
149+
| Embeddable SDK | `SharpClaw.Code` |
126150
| CLI and command handlers | `SharpClaw.Code.Cli`, `SharpClaw.Code.Commands` |
127151
| Core contracts | `SharpClaw.Code.Protocol` |
128152
| Runtime orchestration | `SharpClaw.Code.Runtime` |
@@ -135,12 +159,27 @@ Primary workflow modes:
135159

136160
For dependency boundaries and project responsibilities, see [docs/architecture.md](docs/architecture.md) and [AGENTS.md](AGENTS.md).
137161

162+
## Example Hosts
163+
164+
The solution includes embeddable host samples under `examples/`:
165+
166+
- `MinimalConsoleAgent` for direct SDK prompt execution
167+
- `WebApiAgent` for an HTTP-hosted runtime surface
168+
- `WorkerServiceHost` for lifecycle-managed background hosting
169+
- `McpToolAgent` for MCP-aware host composition
170+
138171
## Testing
139172

140173
```bash
141174
# Run all tests
142175
dotnet test SharpClawCode.sln
143176

177+
# Build example hosts as part of local validation
178+
dotnet build examples/WebApiAgent/WebApiAgent.csproj
179+
dotnet build examples/MinimalConsoleAgent/MinimalConsoleAgent.csproj
180+
dotnet build examples/WorkerServiceHost/WorkerServiceHost.csproj
181+
dotnet build examples/McpToolAgent/McpToolAgent.csproj
182+
144183
# Run a single test by name
145184
dotnet test SharpClawCode.sln --filter "FullyQualifiedName~YourTestName"
146185

@@ -167,8 +206,12 @@ dotnet test SharpClawCode.sln --filter "FullyQualifiedName~ParityScenarioTests"
167206
| `--primary-mode <mode>` | Workflow bias for prompts: `build`, `plan`, or `spec` |
168207
| `--session <id>` | Reuse a specific SharpClaw session id for prompt execution |
169208
| `--agent <id>` | Select the active agent for prompt execution |
209+
| `--host-id <id>` | Stable embedded-host identifier for metering, admin, and event envelopes |
210+
| `--tenant-id <id>` | Tenant identifier used by host-aware storage, approvals, and metering |
211+
| `--storage-root <path>` | External root for host-managed durable runtime state |
212+
| `--session-store fileSystem\|sqlite` | Select the embedded session/event storage backend |
170213

171-
Subcommands include `prompt`, `repl`, `doctor`, `status`, `session`, `models`, `usage`, `cost`, `stats`, `connect`, `hooks`, `skills`, `agents`, `todo`, `share`, `unshare`, `compact`, `serve`, `commands`, `mcp`, `plugins`, `acp`, `bridge`, and `version`.
214+
Subcommands include `prompt`, `repl`, `doctor`, `status`, `session`, `index`, `memory`, `models`, `usage`, `cost`, `stats`, `connect`, `hooks`, `skills`, `agents`, `todo`, `share`, `unshare`, `compact`, `serve`, `commands`, `mcp`, `plugins`, `tool-packages`, `acp`, `bridge`, and `version`.
172215

173216
## Documentation Map
174217

@@ -205,9 +248,9 @@ Key runtime configuration sections:
205248
|---|---|
206249
| `SharpClaw:Providers:Catalog` | Default provider, model aliases |
207250
| `SharpClaw:Providers:Anthropic` | Anthropic API key, base URL, default model |
208-
| `SharpClaw:Providers:OpenAiCompatible` | OpenAI-compatible API key, base URL, default model |
251+
| `SharpClaw:Providers:OpenAiCompatible` | OpenAI-compatible base settings plus local runtime profiles, auth mode, and default embedding model |
209252
| `SharpClaw:Web` | Web search provider name, endpoint template, user agent |
210-
| `SharpClaw:Telemetry` | Runtime event ring buffer capacity |
253+
| `SharpClaw:Telemetry` | Runtime event ring buffer capacity plus webhook event export behavior |
211254

212255
Key `sharpclaw.jsonc` capabilities:
213256

@@ -226,8 +269,13 @@ All options are validated at startup via `IValidateOptions` implementations.
226269
- The shared tooling layer is permission-aware across the runtime.
227270
- The current runtime includes multi-turn provider-backed tool execution, session-backed prompt replay, and durable conversation history.
228271
- Agent-driven tool calls flow through the same approval and allowlist enforcement path used by direct tool execution, including caller-aware interactive approval behavior.
272+
- Workspace indexing, symbol search, and durable memory are available through both CLI commands and built-in tools.
273+
- ACP now carries editor context, approval round-trips, model catalog queries, workspace search/index actions, and memory actions, which is enough for a real VS Code client over a single transport.
274+
- OpenAI-compatible local runtime profiles can surface Ollama, llama.cpp, and similar endpoints with profile-aware auth and model discovery.
275+
- Embedded hosts can opt into trusted-header or OIDC-backed approval identity, tenant-aware usage metering, webhook/SSE event streaming, and admin APIs for provider catalog, index status, search, memory inspection, and tool package management.
276+
- The CLI mirrors those enterprise surfaces with `usage summary`, `usage detail`, and `tool-packages` commands while preserving the existing workspace-local `usage`, `cost`, and `stats` flows.
229277
- Operational commands support stable JSON output via `--output-format json`, which makes them suitable for scripts, editors, and automation.
230-
- The embedded server exposes local JSON and SSE endpoints for prompts, sessions, sharing, status, and doctor flows.
278+
- The embedded server exposes local JSON and SSE endpoints for prompts, sessions, admin control, metering, and event streaming.
231279

232280
## Contributing
233281

@@ -238,6 +286,10 @@ Before opening a PR:
238286
```bash
239287
dotnet build SharpClawCode.sln
240288
dotnet test SharpClawCode.sln
289+
dotnet build examples/WebApiAgent/WebApiAgent.csproj
290+
dotnet build examples/MinimalConsoleAgent/MinimalConsoleAgent.csproj
291+
dotnet build examples/WorkerServiceHost/WorkerServiceHost.csproj
292+
dotnet build examples/McpToolAgent/McpToolAgent.csproj
241293
```
242294

243295
## License

‎SharpClawCode.sln‎

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpClaw.Code.Acp", "src\S
5353
EndProject
5454
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpClaw.Code.Mcp.FixtureServer", "tests\SharpClaw.Code.Mcp.FixtureServer\SharpClaw.Code.Mcp.FixtureServer.csproj", "{7F55705B-1E53-4075-AB6F-3BA1BDD2CF85}"
5555
EndProject
56+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpClaw.Code", "src\SharpClaw.Code\SharpClaw.Code.csproj", "{8552440E-B169-4CD9-9B52-4BFFDDADF053}"
57+
EndProject
58+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}"
59+
EndProject
60+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McpToolAgent", "examples\McpToolAgent\McpToolAgent.csproj", "{97EC01C1-A53A-475B-9364-0BD79E9CE272}"
61+
EndProject
62+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiAgent", "examples\WebApiAgent\WebApiAgent.csproj", "{963C636F-2096-45B1-8101-B8345967F197}"
63+
EndProject
64+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinimalConsoleAgent", "examples\MinimalConsoleAgent\MinimalConsoleAgent.csproj", "{7BA2E64A-B330-4783-9330-AEF46B91929A}"
65+
EndProject
66+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkerServiceHost", "examples\WorkerServiceHost\WorkerServiceHost.csproj", "{2E8A9F4F-8161-4E49-9F04-533D972C11CB}"
67+
EndProject
5668
Global
5769
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5870
Debug|Any CPU = Debug|Any CPU
@@ -339,6 +351,66 @@ Global
339351
{7F55705B-1E53-4075-AB6F-3BA1BDD2CF85}.Release|x64.Build.0 = Release|Any CPU
340352
{7F55705B-1E53-4075-AB6F-3BA1BDD2CF85}.Release|x86.ActiveCfg = Release|Any CPU
341353
{7F55705B-1E53-4075-AB6F-3BA1BDD2CF85}.Release|x86.Build.0 = Release|Any CPU
354+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
355+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Debug|Any CPU.Build.0 = Debug|Any CPU
356+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Debug|x64.ActiveCfg = Debug|Any CPU
357+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Debug|x64.Build.0 = Debug|Any CPU
358+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Debug|x86.ActiveCfg = Debug|Any CPU
359+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Debug|x86.Build.0 = Debug|Any CPU
360+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Release|Any CPU.ActiveCfg = Release|Any CPU
361+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Release|Any CPU.Build.0 = Release|Any CPU
362+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Release|x64.ActiveCfg = Release|Any CPU
363+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Release|x64.Build.0 = Release|Any CPU
364+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Release|x86.ActiveCfg = Release|Any CPU
365+
{8552440E-B169-4CD9-9B52-4BFFDDADF053}.Release|x86.Build.0 = Release|Any CPU
366+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
367+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Debug|Any CPU.Build.0 = Debug|Any CPU
368+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Debug|x64.ActiveCfg = Debug|Any CPU
369+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Debug|x64.Build.0 = Debug|Any CPU
370+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Debug|x86.ActiveCfg = Debug|Any CPU
371+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Debug|x86.Build.0 = Debug|Any CPU
372+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Release|Any CPU.ActiveCfg = Release|Any CPU
373+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Release|Any CPU.Build.0 = Release|Any CPU
374+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Release|x64.ActiveCfg = Release|Any CPU
375+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Release|x64.Build.0 = Release|Any CPU
376+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Release|x86.ActiveCfg = Release|Any CPU
377+
{97EC01C1-A53A-475B-9364-0BD79E9CE272}.Release|x86.Build.0 = Release|Any CPU
378+
{963C636F-2096-45B1-8101-B8345967F197}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
379+
{963C636F-2096-45B1-8101-B8345967F197}.Debug|Any CPU.Build.0 = Debug|Any CPU
380+
{963C636F-2096-45B1-8101-B8345967F197}.Debug|x64.ActiveCfg = Debug|Any CPU
381+
{963C636F-2096-45B1-8101-B8345967F197}.Debug|x64.Build.0 = Debug|Any CPU
382+
{963C636F-2096-45B1-8101-B8345967F197}.Debug|x86.ActiveCfg = Debug|Any CPU
383+
{963C636F-2096-45B1-8101-B8345967F197}.Debug|x86.Build.0 = Debug|Any CPU
384+
{963C636F-2096-45B1-8101-B8345967F197}.Release|Any CPU.ActiveCfg = Release|Any CPU
385+
{963C636F-2096-45B1-8101-B8345967F197}.Release|Any CPU.Build.0 = Release|Any CPU
386+
{963C636F-2096-45B1-8101-B8345967F197}.Release|x64.ActiveCfg = Release|Any CPU
387+
{963C636F-2096-45B1-8101-B8345967F197}.Release|x64.Build.0 = Release|Any CPU
388+
{963C636F-2096-45B1-8101-B8345967F197}.Release|x86.ActiveCfg = Release|Any CPU
389+
{963C636F-2096-45B1-8101-B8345967F197}.Release|x86.Build.0 = Release|Any CPU
390+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
391+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Debug|Any CPU.Build.0 = Debug|Any CPU
392+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Debug|x64.ActiveCfg = Debug|Any CPU
393+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Debug|x64.Build.0 = Debug|Any CPU
394+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Debug|x86.ActiveCfg = Debug|Any CPU
395+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Debug|x86.Build.0 = Debug|Any CPU
396+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Release|Any CPU.ActiveCfg = Release|Any CPU
397+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Release|Any CPU.Build.0 = Release|Any CPU
398+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Release|x64.ActiveCfg = Release|Any CPU
399+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Release|x64.Build.0 = Release|Any CPU
400+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Release|x86.ActiveCfg = Release|Any CPU
401+
{7BA2E64A-B330-4783-9330-AEF46B91929A}.Release|x86.Build.0 = Release|Any CPU
402+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
403+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
404+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Debug|x64.ActiveCfg = Debug|Any CPU
405+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Debug|x64.Build.0 = Debug|Any CPU
406+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Debug|x86.ActiveCfg = Debug|Any CPU
407+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Debug|x86.Build.0 = Debug|Any CPU
408+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
409+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Release|Any CPU.Build.0 = Release|Any CPU
410+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Release|x64.ActiveCfg = Release|Any CPU
411+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Release|x64.Build.0 = Release|Any CPU
412+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Release|x86.ActiveCfg = Release|Any CPU
413+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB}.Release|x86.Build.0 = Release|Any CPU
342414
EndGlobalSection
343415
GlobalSection(SolutionProperties) = preSolution
344416
HideSolutionNode = FALSE
@@ -367,5 +439,10 @@ Global
367439
{5F0ED186-7920-4A49-B0A3-75F84B4215B3} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
368440
{0060F8FF-0714-4C01-936F-719D7E5F124D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
369441
{7F55705B-1E53-4075-AB6F-3BA1BDD2CF85} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
442+
{8552440E-B169-4CD9-9B52-4BFFDDADF053} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
443+
{97EC01C1-A53A-475B-9364-0BD79E9CE272} = {B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}
444+
{963C636F-2096-45B1-8101-B8345967F197} = {B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}
445+
{7BA2E64A-B330-4783-9330-AEF46B91929A} = {B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}
446+
{2E8A9F4F-8161-4E49-9F04-533D972C11CB} = {B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}
370447
EndGlobalSection
371448
EndGlobal

0 commit comments

Comments
 (0)