expandai 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/build/{esm/Install/Opencode → assets/opencode}/expandai-webfetch.js +22 -4
- package/build/dts/Mcp/RequestHeaders.d.ts +0 -1
- package/build/dts/Mcp/Server.d.ts +1 -2
- package/build/dts/index.d.ts +0 -1
- package/build/esm/index.js +193 -2
- package/build/esm/main.js +691 -200
- package/build/skills/expandai/SKILL.md +100 -8
- package/package.json +20 -12
- package/build/dts/ApiClient.d.ts +0 -165
- package/build/dts/ApiClient.d.ts.map +0 -1
- package/build/dts/Auth/Domain.d.ts +0 -95
- package/build/dts/Auth/Domain.d.ts.map +0 -1
- package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
- package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
- package/build/dts/Auth/PendingInit.d.ts +0 -35
- package/build/dts/Auth/PendingInit.d.ts.map +0 -1
- package/build/dts/Auth/Pkce.d.ts +0 -10
- package/build/dts/Auth/Pkce.d.ts.map +0 -1
- package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
- package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
- package/build/dts/Authentication.d.ts +0 -24
- package/build/dts/Authentication.d.ts.map +0 -1
- package/build/dts/BrowserOAuth.d.ts +0 -99
- package/build/dts/BrowserOAuth.d.ts.map +0 -1
- package/build/dts/CommandPath.d.ts +0 -2
- package/build/dts/CommandPath.d.ts.map +0 -1
- package/build/dts/Commands/Fetch.d.ts +0 -30
- package/build/dts/Commands/Fetch.d.ts.map +0 -1
- package/build/dts/Commands/Hook.d.ts +0 -17
- package/build/dts/Commands/Hook.d.ts.map +0 -1
- package/build/dts/Commands/Init.d.ts +0 -55
- package/build/dts/Commands/Init.d.ts.map +0 -1
- package/build/dts/Commands/Mcp.d.ts +0 -11
- package/build/dts/Commands/Mcp.d.ts.map +0 -1
- package/build/dts/Commands/McpRun.d.ts +0 -5
- package/build/dts/Commands/McpRun.d.ts.map +0 -1
- package/build/dts/Commands/Search.d.ts +0 -21
- package/build/dts/Commands/Search.d.ts.map +0 -1
- package/build/dts/Commands/Skill.d.ts +0 -12
- package/build/dts/Commands/Skill.d.ts.map +0 -1
- package/build/dts/Commands/Status.d.ts +0 -27
- package/build/dts/Commands/Status.d.ts.map +0 -1
- package/build/dts/Commands/Telemetry.d.ts +0 -7
- package/build/dts/Commands/Telemetry.d.ts.map +0 -1
- package/build/dts/Commands/Uninstall.d.ts +0 -9
- package/build/dts/Commands/Uninstall.d.ts.map +0 -1
- package/build/dts/Config.d.ts +0 -196
- package/build/dts/Config.d.ts.map +0 -1
- package/build/dts/Hook/Claude.d.ts +0 -13
- package/build/dts/Hook/Claude.d.ts.map +0 -1
- package/build/dts/Hook/Errors.d.ts +0 -20
- package/build/dts/Hook/Errors.d.ts.map +0 -1
- package/build/dts/Hook/Opencode.d.ts +0 -13
- package/build/dts/Hook/Opencode.d.ts.map +0 -1
- package/build/dts/Hook/SnapshotNote.d.ts +0 -12
- package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
- package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
- package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
- package/build/dts/Init/ClaudeProfile.d.ts +0 -77
- package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
- package/build/dts/Init/Domain.d.ts +0 -139
- package/build/dts/Init/Domain.d.ts.map +0 -1
- package/build/dts/Init/HarnessAdapter.d.ts +0 -33
- package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
- package/build/dts/Init/HarnessDetector.d.ts +0 -19
- package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
- package/build/dts/Init/HarnessRegistry.d.ts +0 -50
- package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
- package/build/dts/Init/MutationTransaction.d.ts +0 -96
- package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
- package/build/dts/Init/Service.d.ts +0 -72
- package/build/dts/Init/Service.d.ts.map +0 -1
- package/build/dts/Init/StandardAdapters.d.ts +0 -42
- package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
- package/build/dts/Init/Status.d.ts +0 -149
- package/build/dts/Init/Status.d.ts.map +0 -1
- package/build/dts/Install/Claude/Hook.d.ts +0 -88
- package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
- package/build/dts/Install/Claude/Mcp.d.ts +0 -48
- package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Claude/Skill.d.ts +0 -23
- package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
- package/build/dts/Install/Codex/Mcp.d.ts +0 -45
- package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Codex/Skill.d.ts +0 -22
- package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
- package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
- package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Cursor/Skill.d.ts +0 -29
- package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
- package/build/dts/Install/Domain.d.ts +0 -103
- package/build/dts/Install/Domain.d.ts.map +0 -1
- package/build/dts/Install/Hook.d.ts +0 -30
- package/build/dts/Install/Hook.d.ts.map +0 -1
- package/build/dts/Install/Mcp.d.ts +0 -28
- package/build/dts/Install/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Hook.d.ts +0 -24
- package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
- package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Skill.d.ts +0 -26
- package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
- package/build/dts/Install/Skill.d.ts +0 -32
- package/build/dts/Install/Skill.d.ts.map +0 -1
- package/build/dts/Install/Uninstall.d.ts +0 -32
- package/build/dts/Install/Uninstall.d.ts.map +0 -1
- package/build/dts/MarkdownAnsi.d.ts +0 -29
- package/build/dts/MarkdownAnsi.d.ts.map +0 -1
- package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
- package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
- package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
- package/build/dts/Mcp/Server.d.ts.map +0 -1
- package/build/dts/Mcp/Toolkit.d.ts +0 -3
- package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
- package/build/dts/Mcp/tools/Citations.d.ts +0 -266
- package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
- package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
- package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
- package/build/dts/SecureFile.d.ts +0 -23
- package/build/dts/SecureFile.d.ts.map +0 -1
- package/build/dts/Snippets.d.ts +0 -18
- package/build/dts/Snippets.d.ts.map +0 -1
- package/build/dts/Telemetry.d.ts +0 -30
- package/build/dts/Telemetry.d.ts.map +0 -1
- package/build/dts/Version.d.ts +0 -2
- package/build/dts/Version.d.ts.map +0 -1
- package/build/dts/Xdg.d.ts +0 -11
- package/build/dts/Xdg.d.ts.map +0 -1
- package/build/dts/index.d.ts.map +0 -1
- package/build/dts/main.d.ts +0 -3
- package/build/dts/main.d.ts.map +0 -1
- package/build/esm/ApiClient.js +0 -305
- package/build/esm/ApiClient.js.map +0 -1
- package/build/esm/Auth/Domain.js +0 -56
- package/build/esm/Auth/Domain.js.map +0 -1
- package/build/esm/Auth/ManualAuthorization.js +0 -253
- package/build/esm/Auth/ManualAuthorization.js.map +0 -1
- package/build/esm/Auth/PendingInit.js +0 -267
- package/build/esm/Auth/PendingInit.js.map +0 -1
- package/build/esm/Auth/Pkce.js +0 -23
- package/build/esm/Auth/Pkce.js.map +0 -1
- package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
- package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
- package/build/esm/Authentication.js +0 -143
- package/build/esm/Authentication.js.map +0 -1
- package/build/esm/BrowserOAuth.js +0 -251
- package/build/esm/BrowserOAuth.js.map +0 -1
- package/build/esm/CommandPath.js +0 -31
- package/build/esm/CommandPath.js.map +0 -1
- package/build/esm/Commands/Fetch.js +0 -119
- package/build/esm/Commands/Fetch.js.map +0 -1
- package/build/esm/Commands/Hook.js +0 -20
- package/build/esm/Commands/Hook.js.map +0 -1
- package/build/esm/Commands/Init.js +0 -371
- package/build/esm/Commands/Init.js.map +0 -1
- package/build/esm/Commands/Mcp.js +0 -19
- package/build/esm/Commands/Mcp.js.map +0 -1
- package/build/esm/Commands/McpRun.js +0 -15
- package/build/esm/Commands/McpRun.js.map +0 -1
- package/build/esm/Commands/Search.js +0 -46
- package/build/esm/Commands/Search.js.map +0 -1
- package/build/esm/Commands/Skill.js +0 -17
- package/build/esm/Commands/Skill.js.map +0 -1
- package/build/esm/Commands/Status.js +0 -186
- package/build/esm/Commands/Status.js.map +0 -1
- package/build/esm/Commands/Telemetry.js +0 -23
- package/build/esm/Commands/Telemetry.js.map +0 -1
- package/build/esm/Commands/Uninstall.js +0 -28
- package/build/esm/Commands/Uninstall.js.map +0 -1
- package/build/esm/Config.js +0 -619
- package/build/esm/Config.js.map +0 -1
- package/build/esm/Hook/Claude.js +0 -74
- package/build/esm/Hook/Claude.js.map +0 -1
- package/build/esm/Hook/Errors.js +0 -18
- package/build/esm/Hook/Errors.js.map +0 -1
- package/build/esm/Hook/Opencode.js +0 -50
- package/build/esm/Hook/Opencode.js.map +0 -1
- package/build/esm/Hook/SnapshotNote.js +0 -65
- package/build/esm/Hook/SnapshotNote.js.map +0 -1
- package/build/esm/Init/ClaudeAdapter.js +0 -137
- package/build/esm/Init/ClaudeAdapter.js.map +0 -1
- package/build/esm/Init/ClaudeProfile.js +0 -344
- package/build/esm/Init/ClaudeProfile.js.map +0 -1
- package/build/esm/Init/Domain.js +0 -118
- package/build/esm/Init/Domain.js.map +0 -1
- package/build/esm/Init/HarnessAdapter.js +0 -21
- package/build/esm/Init/HarnessAdapter.js.map +0 -1
- package/build/esm/Init/HarnessDetector.js +0 -65
- package/build/esm/Init/HarnessDetector.js.map +0 -1
- package/build/esm/Init/HarnessRegistry.js +0 -58
- package/build/esm/Init/HarnessRegistry.js.map +0 -1
- package/build/esm/Init/MutationTransaction.js +0 -494
- package/build/esm/Init/MutationTransaction.js.map +0 -1
- package/build/esm/Init/Service.js +0 -319
- package/build/esm/Init/Service.js.map +0 -1
- package/build/esm/Init/StandardAdapters.js +0 -116
- package/build/esm/Init/StandardAdapters.js.map +0 -1
- package/build/esm/Init/Status.js +0 -215
- package/build/esm/Init/Status.js.map +0 -1
- package/build/esm/Install/Claude/Hook.js +0 -77
- package/build/esm/Install/Claude/Hook.js.map +0 -1
- package/build/esm/Install/Claude/Mcp.js +0 -101
- package/build/esm/Install/Claude/Mcp.js.map +0 -1
- package/build/esm/Install/Claude/Skill.js +0 -56
- package/build/esm/Install/Claude/Skill.js.map +0 -1
- package/build/esm/Install/Codex/Mcp.js +0 -97
- package/build/esm/Install/Codex/Mcp.js.map +0 -1
- package/build/esm/Install/Codex/Skill.js +0 -33
- package/build/esm/Install/Codex/Skill.js.map +0 -1
- package/build/esm/Install/Cursor/Mcp.js +0 -74
- package/build/esm/Install/Cursor/Mcp.js.map +0 -1
- package/build/esm/Install/Cursor/Skill.js +0 -40
- package/build/esm/Install/Cursor/Skill.js.map +0 -1
- package/build/esm/Install/Domain.js +0 -162
- package/build/esm/Install/Domain.js.map +0 -1
- package/build/esm/Install/Hook.js +0 -38
- package/build/esm/Install/Hook.js.map +0 -1
- package/build/esm/Install/Mcp.js +0 -40
- package/build/esm/Install/Mcp.js.map +0 -1
- package/build/esm/Install/Opencode/Hook.js +0 -44
- package/build/esm/Install/Opencode/Hook.js.map +0 -1
- package/build/esm/Install/Opencode/Mcp.js +0 -76
- package/build/esm/Install/Opencode/Mcp.js.map +0 -1
- package/build/esm/Install/Opencode/Skill.js +0 -37
- package/build/esm/Install/Opencode/Skill.js.map +0 -1
- package/build/esm/Install/Skill.js +0 -41
- package/build/esm/Install/Skill.js.map +0 -1
- package/build/esm/Install/Uninstall.js +0 -49
- package/build/esm/Install/Uninstall.js.map +0 -1
- package/build/esm/MarkdownAnsi.js +0 -142
- package/build/esm/MarkdownAnsi.js.map +0 -1
- package/build/esm/Mcp/ExpandDocs.js +0 -56
- package/build/esm/Mcp/ExpandDocs.js.map +0 -1
- package/build/esm/Mcp/RequestHeaders.js +0 -13
- package/build/esm/Mcp/RequestHeaders.js.map +0 -1
- package/build/esm/Mcp/Server.js +0 -12
- package/build/esm/Mcp/Server.js.map +0 -1
- package/build/esm/Mcp/Toolkit.js +0 -16
- package/build/esm/Mcp/Toolkit.js.map +0 -1
- package/build/esm/Mcp/tools/Citations.js +0 -193
- package/build/esm/Mcp/tools/Citations.js.map +0 -1
- package/build/esm/Mcp/tools/Fetch.js +0 -165
- package/build/esm/Mcp/tools/Fetch.js.map +0 -1
- package/build/esm/SecureFile.js +0 -36
- package/build/esm/SecureFile.js.map +0 -1
- package/build/esm/Snippets.js +0 -29
- package/build/esm/Snippets.js.map +0 -1
- package/build/esm/Telemetry.js +0 -157
- package/build/esm/Telemetry.js.map +0 -1
- package/build/esm/Version.js +0 -4
- package/build/esm/Version.js.map +0 -1
- package/build/esm/Xdg.js +0 -15
- package/build/esm/Xdg.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/esm/main.js.map +0 -1
- package/src/ApiClient.ts +0 -450
- package/src/Auth/Domain.ts +0 -63
- package/src/Auth/ManualAuthorization.ts +0 -296
- package/src/Auth/PendingInit.ts +0 -338
- package/src/Auth/Pkce.ts +0 -26
- package/src/Auth/SetupGrantAuthorization.ts +0 -116
- package/src/Authentication.ts +0 -202
- package/src/BrowserOAuth.ts +0 -359
- package/src/CommandPath.ts +0 -30
- package/src/Commands/Fetch.ts +0 -188
- package/src/Commands/Hook.ts +0 -48
- package/src/Commands/Init.ts +0 -489
- package/src/Commands/Mcp.ts +0 -30
- package/src/Commands/McpRun.ts +0 -25
- package/src/Commands/Search.ts +0 -97
- package/src/Commands/Skill.ts +0 -30
- package/src/Commands/Status.ts +0 -228
- package/src/Commands/Telemetry.ts +0 -42
- package/src/Commands/Uninstall.ts +0 -38
- package/src/Config.ts +0 -840
- package/src/Hook/Claude.ts +0 -81
- package/src/Hook/Errors.ts +0 -19
- package/src/Hook/Opencode.ts +0 -58
- package/src/Hook/SnapshotNote.ts +0 -66
- package/src/Init/ClaudeAdapter.ts +0 -191
- package/src/Init/ClaudeProfile.ts +0 -453
- package/src/Init/Domain.ts +0 -153
- package/src/Init/HarnessAdapter.ts +0 -35
- package/src/Init/HarnessDetector.ts +0 -77
- package/src/Init/HarnessRegistry.ts +0 -87
- package/src/Init/MutationTransaction.ts +0 -747
- package/src/Init/Service.ts +0 -385
- package/src/Init/StandardAdapters.ts +0 -141
- package/src/Init/Status.ts +0 -253
- package/src/Install/Claude/Hook.ts +0 -123
- package/src/Install/Claude/Mcp.ts +0 -129
- package/src/Install/Claude/Skill.ts +0 -77
- package/src/Install/Codex/Mcp.ts +0 -114
- package/src/Install/Codex/Skill.ts +0 -44
- package/src/Install/Cursor/Mcp.ts +0 -85
- package/src/Install/Cursor/Skill.ts +0 -51
- package/src/Install/Domain.ts +0 -221
- package/src/Install/Hook.ts +0 -50
- package/src/Install/Mcp.ts +0 -71
- package/src/Install/Opencode/Hook.ts +0 -55
- package/src/Install/Opencode/Mcp.ts +0 -87
- package/src/Install/Opencode/Skill.ts +0 -48
- package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
- package/src/Install/Opencode/expandai-webfetch.js +0 -56
- package/src/Install/Skill.ts +0 -57
- package/src/Install/Uninstall.ts +0 -82
- package/src/MarkdownAnsi.ts +0 -162
- package/src/Mcp/ExpandDocs.ts +0 -62
- package/src/Mcp/RequestHeaders.ts +0 -16
- package/src/Mcp/Server.ts +0 -15
- package/src/Mcp/Toolkit.ts +0 -21
- package/src/Mcp/tools/Citations.ts +0 -219
- package/src/Mcp/tools/Fetch.ts +0 -203
- package/src/SecureFile.ts +0 -70
- package/src/Snippets.ts +0 -39
- package/src/Telemetry.ts +0 -186
- package/src/Version.ts +0 -3
- package/src/Xdg.ts +0 -18
- package/src/index.ts +0 -1
- package/src/main.ts +0 -305
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Skill.js","sourceRoot":"","sources":["../../../../src/Install/Codex/Skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAA;AAEpC,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,OAAO,EAAc,CAAC,mCAAmC,EAAE;IACjG,YAAY,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAA;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAE/E,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,mBAAmB,UAAU,EAAE,CAAC,CAAC,EAClF,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,mBAAmB,UAAU,EAAE,CAAC,CAAC,EAClF,KAAK,CAAC,UAAU,CAChB,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACzD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACzD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAW,CAAA;IAC3D,CAAC,CAAC;CACF,CAAC;CAAG"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Console, Effect, Match, Record, Schema } from 'effect';
|
|
3
|
-
import { CliInvocation, ConfigIo, McpParseError, McpServersConfigSchema, McpWriteError, SERVER_KEY } from '../Domain.js';
|
|
4
|
-
/**
|
|
5
|
-
* Cursor MCP descriptor — same `mcpServers` shape as Claude Code, different
|
|
6
|
-
* paths.
|
|
7
|
-
*
|
|
8
|
-
* - global → `~/.cursor/mcp.json`
|
|
9
|
-
* - project → `<cwd>/.cursor/mcp.json`
|
|
10
|
-
*/
|
|
11
|
-
export class Entry extends Schema.Class('CursorMcpEntry')({
|
|
12
|
-
type: Schema.Literal('stdio'),
|
|
13
|
-
command: Schema.NonEmptyTrimmedString,
|
|
14
|
-
args: Schema.Array(Schema.String),
|
|
15
|
-
env: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
|
|
16
|
-
}) {
|
|
17
|
-
}
|
|
18
|
-
export class CursorMcp extends Effect.Service()('@expandai/cli/Install/Cursor/Mcp', {
|
|
19
|
-
dependencies: [ConfigIo.Default, CliInvocation.Default],
|
|
20
|
-
effect: Effect.gen(function* () {
|
|
21
|
-
const io = yield* ConfigIo;
|
|
22
|
-
const cli = yield* CliInvocation;
|
|
23
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
24
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
25
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
26
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.cursor/mcp.json`)), Match.when('project', () => Effect.succeed(`${cwd}/.cursor/mcp.json`)), Match.exhaustive);
|
|
27
|
-
});
|
|
28
|
-
const readConfig = Effect.fn(function* (file) {
|
|
29
|
-
return yield* io
|
|
30
|
-
.read(file, McpServersConfigSchema)
|
|
31
|
-
.pipe(Effect.mapError((error) => new McpParseError({ path: file, error })));
|
|
32
|
-
});
|
|
33
|
-
const writeConfig = Effect.fn(function* (file, value) {
|
|
34
|
-
yield* io
|
|
35
|
-
.write(file, value, McpServersConfigSchema)
|
|
36
|
-
.pipe(Effect.mapError((error) => new McpWriteError({ path: file, error })));
|
|
37
|
-
});
|
|
38
|
-
const install = Effect.fn(function* (scope) {
|
|
39
|
-
const file = yield* pathFor(scope);
|
|
40
|
-
const config = yield* readConfig(file);
|
|
41
|
-
const invocation = yield* cli.resolve();
|
|
42
|
-
yield* writeConfig(file, {
|
|
43
|
-
...config,
|
|
44
|
-
mcpServers: {
|
|
45
|
-
...config.mcpServers,
|
|
46
|
-
[SERVER_KEY]: new Entry({
|
|
47
|
-
type: 'stdio',
|
|
48
|
-
command: invocation.command,
|
|
49
|
-
args: [...invocation.args, 'mcp', 'run'],
|
|
50
|
-
env: { EXPANDAI_HARNESS: 'cursor' },
|
|
51
|
-
}),
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
yield* Console.log(`Installed expandai MCP server into ${file}`);
|
|
55
|
-
});
|
|
56
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
57
|
-
const file = yield* pathFor(scope);
|
|
58
|
-
const config = yield* readConfig(file);
|
|
59
|
-
if (!(SERVER_KEY in config.mcpServers)) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
yield* writeConfig(file, { ...config, mcpServers: Record.remove(config.mcpServers, SERVER_KEY) });
|
|
63
|
-
yield* Console.log(`Removed expandai MCP server from ${file}`);
|
|
64
|
-
});
|
|
65
|
-
const isInstalled = Effect.fn(function* (scope) {
|
|
66
|
-
const file = yield* pathFor(scope);
|
|
67
|
-
const config = yield* readConfig(file);
|
|
68
|
-
return SERVER_KEY in config.mcpServers;
|
|
69
|
-
});
|
|
70
|
-
return { install, uninstall, isInstalled, pathFor };
|
|
71
|
-
}),
|
|
72
|
-
}) {
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=Mcp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../../src/Install/Cursor/Mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Effect, Match } from 'effect';
|
|
3
|
-
import { SkillIo } from '../Domain.js';
|
|
4
|
-
/**
|
|
5
|
-
* Cursor skills are auto-loaded from these locations (per
|
|
6
|
-
* cursor.com/docs/skills):
|
|
7
|
-
*
|
|
8
|
-
* - global → `~/.cursor/skills/<name>/`
|
|
9
|
-
* - project → `<cwd>/.cursor/skills/<name>/`
|
|
10
|
-
*
|
|
11
|
-
* Cursor also compat-loads `.claude/skills/`, `.codex/skills/`, `.agents/skills/`
|
|
12
|
-
* at both project and user scope, but we ship to Cursor's native paths.
|
|
13
|
-
*
|
|
14
|
-
* Format is the same SKILL.md + YAML frontmatter open standard as Claude Code
|
|
15
|
-
* and OpenCode, so the bundled `skills/expandai/` directory copies in unchanged.
|
|
16
|
-
*/
|
|
17
|
-
export const SKILL_NAME = 'expandai';
|
|
18
|
-
export class CursorSkill extends Effect.Service()('@expandai/cli/Install/Cursor/Skill', {
|
|
19
|
-
dependencies: [SkillIo.Default],
|
|
20
|
-
effect: Effect.gen(function* () {
|
|
21
|
-
const io = yield* SkillIo;
|
|
22
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
23
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
24
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
25
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.cursor/skills/${SKILL_NAME}`)), Match.when('project', () => Effect.succeed(`${cwd}/.cursor/skills/${SKILL_NAME}`)), Match.exhaustive);
|
|
26
|
-
});
|
|
27
|
-
const install = Effect.fn(function* (scope) {
|
|
28
|
-
return yield* io.install(yield* pathFor(scope));
|
|
29
|
-
});
|
|
30
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
31
|
-
return yield* io.uninstall(yield* pathFor(scope));
|
|
32
|
-
});
|
|
33
|
-
const isCurrent = Effect.fn(function* (scope) {
|
|
34
|
-
return yield* io.isCurrent(yield* pathFor(scope));
|
|
35
|
-
});
|
|
36
|
-
return { install, uninstall, isCurrent, pathFor };
|
|
37
|
-
}),
|
|
38
|
-
}) {
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=Skill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Skill.js","sourceRoot":"","sources":["../../../../src/Install/Cursor/Skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAA;AAEpC,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,OAAO,EAAe,CAAC,oCAAoC,EAAE;IACpG,YAAY,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAA;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAE/E,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,mBAAmB,UAAU,EAAE,CAAC,CAAC,EAClF,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,mBAAmB,UAAU,EAAE,CAAC,CAAC,EAClF,KAAK,CAAC,UAAU,CAChB,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACzD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACzD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAW,CAAA;IAC3D,CAAC,CAAC;CACF,CAAC;CAAG"}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { FileSystem, Path } from '@effect/platform';
|
|
2
|
-
import { NodeFileSystem, NodePath } from '@effect/platform-node';
|
|
3
|
-
import { Array, Config, Effect, Inspectable, Layer, Schema, String } from 'effect';
|
|
4
|
-
export class McpParseError extends Schema.TaggedError()('McpParseError', {
|
|
5
|
-
path: Schema.String,
|
|
6
|
-
error: Schema.Defect,
|
|
7
|
-
}) {
|
|
8
|
-
get message() {
|
|
9
|
-
return `Failed to parse MCP config at ${this.path}: ${Inspectable.format(this.error)}`;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export class McpWriteError extends Schema.TaggedError()('McpWriteError', {
|
|
13
|
-
path: Schema.String,
|
|
14
|
-
error: Schema.Defect,
|
|
15
|
-
}) {
|
|
16
|
-
get message() {
|
|
17
|
-
return `Failed to write MCP config at ${this.path}: ${Inspectable.format(this.error)}`;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export const Host = Schema.Literal('claude-code', 'cursor', 'opencode', 'codex');
|
|
21
|
-
/**
|
|
22
|
-
* The agent harness invoking the CLI — every install target plus 'unknown'
|
|
23
|
-
* for uninstrumented callers. Installers bake `EXPANDAI_HARNESS=<host>` into
|
|
24
|
-
* MCP/hook configs; telemetry reads it back.
|
|
25
|
-
*/
|
|
26
|
-
export const Harness = Schema.Literal(...Host.literals, 'unknown');
|
|
27
|
-
export const InstallScope = Schema.Literal('project', 'global');
|
|
28
|
-
const McpServerMap = Schema.Record({ key: Schema.String, value: Schema.Unknown });
|
|
29
|
-
export const McpServersConfigSchema = Schema.parseJson(Schema.Struct({ mcpServers: Schema.optionalWith(McpServerMap, { default: () => ({}) }) }, McpServerMap), { space: 2 });
|
|
30
|
-
export const OpencodeConfigSchema = Schema.parseJson(Schema.Struct({ mcp: Schema.optionalWith(McpServerMap, { default: () => ({}) }) }, McpServerMap), { space: 2 });
|
|
31
|
-
export const SERVER_KEY = 'expandai';
|
|
32
|
-
export const DIRECT_CLI = { command: 'expandai', args: [] };
|
|
33
|
-
const NPX_CLI = { command: 'npx', args: ['-y', 'expandai'] };
|
|
34
|
-
/**
|
|
35
|
-
* Renders a `CliCommand` as the single shell string Claude Code stores for hook
|
|
36
|
-
* entries. MCP descriptors keep `command`/`args` separate because they exec
|
|
37
|
-
* directly; hooks are run through a shell, so they need one flat line.
|
|
38
|
-
*/
|
|
39
|
-
export function cliShellCommand(cli, args) {
|
|
40
|
-
return [cli.command, ...cli.args, ...args].join(' ');
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Resolves how installed host configs should invoke the expandai CLI. MCP
|
|
44
|
-
* entries exec their `command` directly (no shell), so the fallback decision
|
|
45
|
-
* happens at install time: prefer the `expandai` binary when it is on PATH,
|
|
46
|
-
* otherwise write an `npx -y expandai` invocation so installs performed via
|
|
47
|
-
* `npx expandai …` keep working without a global CLI install.
|
|
48
|
-
*/
|
|
49
|
-
const makeCliInvocation = Effect.gen(function* () {
|
|
50
|
-
const fs = yield* FileSystem.FileSystem;
|
|
51
|
-
const path = yield* Path.Path;
|
|
52
|
-
const searchPath = yield* Config.string('PATH').pipe(Config.withDefault(''));
|
|
53
|
-
const resolve = Effect.fn('CliInvocation.resolve')(function* () {
|
|
54
|
-
// ':' is the POSIX PATH delimiter — the install flow already assumes
|
|
55
|
-
// POSIX conventions (HOME-based config paths, shell hooks).
|
|
56
|
-
const onPath = yield* Effect.exists(Array.filter(searchPath.split(':'), String.isNonEmpty), (dir) => fs.exists(path.join(dir, 'expandai')).pipe(Effect.orElseSucceed(() => false)));
|
|
57
|
-
return onPath ? DIRECT_CLI : NPX_CLI;
|
|
58
|
-
});
|
|
59
|
-
return { resolve };
|
|
60
|
-
});
|
|
61
|
-
export class CliInvocation extends Effect.Service()('@expandai/cli/Install/CliInvocation', {
|
|
62
|
-
dependencies: [NodeFileSystem.layer, NodePath.layer],
|
|
63
|
-
effect: makeCliInvocation,
|
|
64
|
-
}) {
|
|
65
|
-
/** Dependency-open layer so fixtures can supply their own file system and PATH. */
|
|
66
|
-
static layer = Layer.effect(CliInvocation, makeCliInvocation.pipe(Effect.map(CliInvocation.make)));
|
|
67
|
-
}
|
|
68
|
-
export const readConfigText = Effect.fn(function* (file) {
|
|
69
|
-
const fs = yield* FileSystem.FileSystem;
|
|
70
|
-
const exists = yield* fs.exists(file);
|
|
71
|
-
if (!exists) {
|
|
72
|
-
return '{}';
|
|
73
|
-
}
|
|
74
|
-
return yield* fs.readFileString(file);
|
|
75
|
-
});
|
|
76
|
-
export const writeConfigText = Effect.fn(function* (file, text) {
|
|
77
|
-
const fs = yield* FileSystem.FileSystem;
|
|
78
|
-
const path = yield* Path.Path;
|
|
79
|
-
yield* fs.makeDirectory(path.dirname(file), { recursive: true });
|
|
80
|
-
yield* fs.writeFileString(file, `${text}\n`);
|
|
81
|
-
});
|
|
82
|
-
/**
|
|
83
|
-
* Captures `FileSystem` + `Path` once and exposes string-encoded JSON read/
|
|
84
|
-
* write methods that don't re-yield them on every call. Use this from inside
|
|
85
|
-
* an `Effect.Service` gen block so the install/uninstall methods don't have
|
|
86
|
-
* to re-thread `provideService` calls.
|
|
87
|
-
*/
|
|
88
|
-
export class ConfigIo extends Effect.Service()('@expandai/cli/Install/ConfigIo', {
|
|
89
|
-
dependencies: [NodeFileSystem.layer, NodePath.layer],
|
|
90
|
-
effect: Effect.gen(function* () {
|
|
91
|
-
const fs = yield* FileSystem.FileSystem;
|
|
92
|
-
const path = yield* Path.Path;
|
|
93
|
-
const read = Effect.fn('ConfigIo.read')(function* (file, schema) {
|
|
94
|
-
const text = yield* readConfigText(file).pipe(Effect.provideService(FileSystem.FileSystem, fs));
|
|
95
|
-
return yield* Schema.decode(schema)(text);
|
|
96
|
-
});
|
|
97
|
-
const write = Effect.fn('ConfigIo.write')(function* (file, value, schema) {
|
|
98
|
-
const encoded = yield* Schema.encodeUnknown(schema)(value);
|
|
99
|
-
yield* writeConfigText(file, encoded).pipe(Effect.provideService(FileSystem.FileSystem, fs), Effect.provideService(Path.Path, path));
|
|
100
|
-
});
|
|
101
|
-
const exists = Effect.fn('ConfigIo.exists')(function* (file) {
|
|
102
|
-
return yield* fs.exists(file);
|
|
103
|
-
});
|
|
104
|
-
// Raw text I/O for formats `ConfigIo.read`/`write` can't handle through a
|
|
105
|
-
// `Schema.parseJson(...)` schema (e.g. Codex's TOML). Missing file reads
|
|
106
|
-
// as an empty string — callers attach their own parser-specific default.
|
|
107
|
-
const readText = Effect.fn('ConfigIo.readText')(function* (file) {
|
|
108
|
-
const present = yield* fs.exists(file);
|
|
109
|
-
return present ? yield* fs.readFileString(file) : '';
|
|
110
|
-
});
|
|
111
|
-
const writeText = Effect.fn('ConfigIo.writeText')(function* (file, text) {
|
|
112
|
-
yield* writeConfigText(file, text).pipe(Effect.provideService(FileSystem.FileSystem, fs), Effect.provideService(Path.Path, path));
|
|
113
|
-
});
|
|
114
|
-
return { read, write, exists, readText, writeText };
|
|
115
|
-
}),
|
|
116
|
-
}) {
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Captures `FileSystem` + `Path` once and exposes skill directory copy/remove
|
|
120
|
-
* operations. The bundled `SKILL.md` lives at `<cli>/skills/expandai/` (or
|
|
121
|
-
* `<build>/skills/expandai/` in production); this service computes that path
|
|
122
|
-
* from its own `import.meta.url`, so per-host skill descriptors only need to
|
|
123
|
-
* provide `pathFor` and call `io.install(target)` / `io.uninstall(target)`.
|
|
124
|
-
*/
|
|
125
|
-
export class SkillIo extends Effect.Service()('@expandai/cli/Install/SkillIo', {
|
|
126
|
-
dependencies: [NodeFileSystem.layer, NodePath.layer],
|
|
127
|
-
effect: Effect.gen(function* () {
|
|
128
|
-
const fs = yield* FileSystem.FileSystem;
|
|
129
|
-
const path = yield* Path.Path;
|
|
130
|
-
const sourceDir = path.resolve(path.dirname(yield* path.fromFileUrl(new URL(import.meta.url))), '..', '..', 'skills', 'expandai');
|
|
131
|
-
const install = Effect.fn('SkillIo.install')(function* (target) {
|
|
132
|
-
yield* fs.makeDirectory(path.dirname(target), { recursive: true });
|
|
133
|
-
yield* fs.copy(sourceDir, target, { overwrite: true });
|
|
134
|
-
return target;
|
|
135
|
-
});
|
|
136
|
-
const uninstall = Effect.fn('SkillIo.uninstall')(function* (target) {
|
|
137
|
-
const exists = yield* fs.exists(target);
|
|
138
|
-
if (exists) {
|
|
139
|
-
yield* fs.remove(target, { recursive: true });
|
|
140
|
-
}
|
|
141
|
-
return target;
|
|
142
|
-
});
|
|
143
|
-
/**
|
|
144
|
-
* Whether the installed skill matches the bundled one. Presence alone is not
|
|
145
|
-
* enough: an upgraded CLI ships new skill text, and a harness whose install is
|
|
146
|
-
* gated on "the file exists" would keep serving the old instructions forever.
|
|
147
|
-
*/
|
|
148
|
-
const isCurrent = Effect.fn('SkillIo.isCurrent')(function* (target) {
|
|
149
|
-
const targetFile = path.join(target, 'SKILL.md');
|
|
150
|
-
if (!(yield* fs.exists(targetFile)))
|
|
151
|
-
return false;
|
|
152
|
-
const [installed, bundled] = yield* Effect.all([
|
|
153
|
-
fs.readFileString(targetFile),
|
|
154
|
-
fs.readFileString(path.join(sourceDir, 'SKILL.md')),
|
|
155
|
-
]);
|
|
156
|
-
return installed === bundled;
|
|
157
|
-
});
|
|
158
|
-
return { install, uninstall, isCurrent };
|
|
159
|
-
}),
|
|
160
|
-
}) {
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=Domain.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Domain.js","sourceRoot":"","sources":["../../../src/Install/Domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Effect, Match, Schema } from 'effect';
|
|
2
|
-
import { ClaudeHook } from './Claude/Hook.js';
|
|
3
|
-
import { Mcp } from './Mcp.js';
|
|
4
|
-
import { OpencodeHook } from './Opencode/Hook.js';
|
|
5
|
-
/**
|
|
6
|
-
* Hook install dispatcher. Bundles MCP install + per-host hook config:
|
|
7
|
-
*
|
|
8
|
-
* - claude-code: writes the matcher into `~/.claude/settings.json` (global)
|
|
9
|
-
* or `<cwd>/.claude/settings.json` (project), then registers expandai as
|
|
10
|
-
* an MCP server at the matching scope.
|
|
11
|
-
* - opencode: writes the webfetch plugin file into `.opencode/plugins/`
|
|
12
|
-
* (project) or `~/.config/opencode/plugins/` (global), plus registers
|
|
13
|
-
* expandai as an MCP server.
|
|
14
|
-
*
|
|
15
|
-
* Cursor has no hook system per opencode.ai/docs and Cursor's docs, so it's
|
|
16
|
-
* absent from this Host union (compare with `Mcp.Host` which includes Cursor).
|
|
17
|
-
*/
|
|
18
|
-
export const HookHost = Schema.Literal('claude-code', 'opencode');
|
|
19
|
-
export class HookInstaller extends Effect.Service()('@expandai/cli/Install/Hook', {
|
|
20
|
-
dependencies: [Mcp.Default, ClaudeHook.Default, OpencodeHook.Default],
|
|
21
|
-
effect: Effect.gen(function* () {
|
|
22
|
-
const mcp = yield* Mcp;
|
|
23
|
-
const claudeHook = yield* ClaudeHook;
|
|
24
|
-
const opencodeHook = yield* OpencodeHook;
|
|
25
|
-
const install = Effect.fn('HookInstaller.install')(function* (host, scope) {
|
|
26
|
-
// Bundle: MCP install first, then host-specific hook config.
|
|
27
|
-
yield* mcp.install(host, scope);
|
|
28
|
-
yield* Match.value(host).pipe(Match.when('claude-code', () => claudeHook.install(scope)), Match.when('opencode', () => opencodeHook.install(scope)), Match.exhaustive);
|
|
29
|
-
});
|
|
30
|
-
const uninstall = Effect.fn('HookInstaller.uninstall')(function* (host, scope) {
|
|
31
|
-
yield* Match.value(host).pipe(Match.when('claude-code', () => claudeHook.uninstall(scope)), Match.when('opencode', () => opencodeHook.uninstall(scope)), Match.exhaustive);
|
|
32
|
-
yield* mcp.uninstall(host, scope);
|
|
33
|
-
});
|
|
34
|
-
return { install, uninstall };
|
|
35
|
-
}),
|
|
36
|
-
}) {
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=Hook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../src/Install/Hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAqB,GAAG,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;AAGjE,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,OAAO,EAAiB,CAAC,4BAA4B,EAAE;IAChG,YAAY,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAA;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;QAExC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAc,EAAE,KAAmB;YAChG,6DAA6D;YAC7D,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAC/B,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5B,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAC1D,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACzD,KAAK,CAAC,UAAU,CAChB,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAc,EAAE,KAAmB;YACpG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5B,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAC3D,KAAK,CAAC,UAAU,CAChB,CAAA;YACD,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAW,CAAA;IACvC,CAAC,CAAC;CACF,CAAC;CAAG"}
|
package/build/esm/Install/Mcp.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Effect, Match } from 'effect';
|
|
2
|
-
import { ClaudeMcp } from './Claude/Mcp.js';
|
|
3
|
-
import { CodexMcp } from './Codex/Mcp.js';
|
|
4
|
-
import { CursorMcp } from './Cursor/Mcp.js';
|
|
5
|
-
import { OpencodeMcp } from './Opencode/Mcp.js';
|
|
6
|
-
export { Host, InstallScope, McpParseError, McpWriteError } from './Domain.js';
|
|
7
|
-
/**
|
|
8
|
-
* MCP install dispatcher. Per-host descriptors live in `Install/<Host>/Mcp.ts`
|
|
9
|
-
* and contribute their path resolution + entry shape; this service handles
|
|
10
|
-
* the file I/O (read existing config, merge, write back) and routes by host.
|
|
11
|
-
*
|
|
12
|
-
* - claude-code (~/.claude.json | <cwd>/.mcp.json) → mcpServers shape
|
|
13
|
-
* - cursor (~/.cursor/mcp.json | <cwd>/.cursor/mcp.json) → mcpServers
|
|
14
|
-
* - opencode (~/.config/opencode/opencode.json | <cwd>/opencode.json) → opencode `mcp` shape
|
|
15
|
-
* - codex (~/.codex/config.toml | <cwd>/.codex/config.toml) → Codex TOML `mcp_servers`
|
|
16
|
-
*/
|
|
17
|
-
export class Mcp extends Effect.Service()('@expandai/cli/Install/Mcp', {
|
|
18
|
-
dependencies: [ClaudeMcp.Default, CursorMcp.Default, OpencodeMcp.Default, CodexMcp.Default],
|
|
19
|
-
effect: Effect.gen(function* () {
|
|
20
|
-
const claude = yield* ClaudeMcp;
|
|
21
|
-
const cursor = yield* CursorMcp;
|
|
22
|
-
const opencode = yield* OpencodeMcp;
|
|
23
|
-
const codex = yield* CodexMcp;
|
|
24
|
-
const pathFor = Effect.fn('Mcp.pathFor')(function* (host, scope) {
|
|
25
|
-
return yield* Match.value(host).pipe(Match.when('claude-code', () => claude.pathFor(scope)), Match.when('cursor', () => cursor.pathFor(scope)), Match.when('opencode', () => opencode.pathFor(scope)), Match.when('codex', () => codex.pathFor(scope)), Match.exhaustive);
|
|
26
|
-
});
|
|
27
|
-
const install = Effect.fn('Mcp.install')(function* (host, scope) {
|
|
28
|
-
yield* Match.value(host).pipe(Match.when('claude-code', () => claude.install(scope)), Match.when('cursor', () => cursor.install(scope)), Match.when('opencode', () => opencode.install(scope)), Match.when('codex', () => codex.install(scope)), Match.exhaustive);
|
|
29
|
-
});
|
|
30
|
-
const uninstall = Effect.fn('Mcp.uninstall')(function* (host, scope) {
|
|
31
|
-
yield* Match.value(host).pipe(Match.when('claude-code', () => claude.uninstall(scope)), Match.when('cursor', () => cursor.uninstall(scope)), Match.when('opencode', () => opencode.uninstall(scope)), Match.when('codex', () => codex.uninstall(scope)), Match.exhaustive);
|
|
32
|
-
});
|
|
33
|
-
const isInstalled = Effect.fn('Mcp.isInstalled')(function* (host, scope) {
|
|
34
|
-
return yield* Match.value(host).pipe(Match.when('claude-code', () => claude.isInstalled(scope)), Match.when('cursor', () => cursor.isInstalled(scope)), Match.when('opencode', () => opencode.isInstalled(scope)), Match.when('codex', () => codex.isInstalled(scope)), Match.exhaustive);
|
|
35
|
-
});
|
|
36
|
-
return { install, uninstall, isInstalled, pathFor };
|
|
37
|
-
}),
|
|
38
|
-
}) {
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=Mcp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../src/Install/Mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { FileSystem, Path } from '@effect/platform';
|
|
3
|
-
import { NodeFileSystem, NodePath } from '@effect/platform-node';
|
|
4
|
-
import { Config, Console, Effect, Match } from 'effect';
|
|
5
|
-
/**
|
|
6
|
-
* OpenCode hook = a JS plugin file at `.opencode/plugins/` (project) or
|
|
7
|
-
* `~/.config/opencode/plugins/` (global). The plugin shells out to
|
|
8
|
-
* `expandai hook opencode` so all fetch logic stays in the CLI.
|
|
9
|
-
*
|
|
10
|
-
* The plugin uses `tool.execute.after` (the only hook whose contract lets us
|
|
11
|
-
* replace the rendered result via `output.output`); `tool.execute.before` is
|
|
12
|
-
* limited to mutating tool args. See @opencode-ai/plugin's dist/index.d.ts.
|
|
13
|
-
*/
|
|
14
|
-
export const PLUGIN_FILE = 'expandai-webfetch.js';
|
|
15
|
-
export class OpencodeHook extends Effect.Service()('@expandai/cli/Install/Opencode/Hook', {
|
|
16
|
-
dependencies: [NodeFileSystem.layer, NodePath.layer],
|
|
17
|
-
effect: Effect.gen(function* () {
|
|
18
|
-
const fs = yield* FileSystem.FileSystem;
|
|
19
|
-
const path = yield* Path.Path;
|
|
20
|
-
const source = path.join(path.dirname(yield* path.fromFileUrl(new URL(import.meta.url))), PLUGIN_FILE);
|
|
21
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
22
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
23
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
24
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.config/opencode/plugins/${PLUGIN_FILE}`)), Match.when('project', () => Effect.succeed(`${cwd}/.opencode/plugins/${PLUGIN_FILE}`)), Match.exhaustive);
|
|
25
|
-
});
|
|
26
|
-
const install = Effect.fn('OpencodeHook.install')(function* (scope) {
|
|
27
|
-
const target = yield* pathFor(scope);
|
|
28
|
-
yield* fs.makeDirectory(path.dirname(target), { recursive: true });
|
|
29
|
-
yield* fs.copyFile(source, target);
|
|
30
|
-
yield* Console.log(`Installed expandai webfetch plugin at ${target}`);
|
|
31
|
-
});
|
|
32
|
-
const uninstall = Effect.fn('OpencodeHook.uninstall')(function* (scope) {
|
|
33
|
-
const target = yield* pathFor(scope);
|
|
34
|
-
const exists = yield* fs.exists(target);
|
|
35
|
-
if (exists) {
|
|
36
|
-
yield* fs.remove(target);
|
|
37
|
-
yield* Console.log(`Removed expandai webfetch plugin from ${target}`);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
return { install, uninstall, pathFor };
|
|
41
|
-
}),
|
|
42
|
-
}) {
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=Hook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../../src/Install/Opencode/Hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Console, Effect, Match, Record, Schema } from 'effect';
|
|
3
|
-
import { CliInvocation, ConfigIo, McpParseError, McpWriteError, OpencodeConfigSchema, SERVER_KEY } from '../Domain.js';
|
|
4
|
-
/**
|
|
5
|
-
* OpenCode MCP descriptor — its own shape (per opencode.ai/docs/mcp-servers):
|
|
6
|
-
* top-level key is `mcp` (not `mcpServers`), `command` is an array (no
|
|
7
|
-
* separate args), env is called `environment`, and `type` uses
|
|
8
|
-
* `local` / `remote` rather than `stdio` / `http`.
|
|
9
|
-
*
|
|
10
|
-
* - global → `~/.config/opencode/opencode.json`
|
|
11
|
-
* - project → `<cwd>/opencode.json`
|
|
12
|
-
*/
|
|
13
|
-
export class Entry extends Schema.Class('OpencodeMcpEntry')({
|
|
14
|
-
type: Schema.Literal('local'),
|
|
15
|
-
command: Schema.Array(Schema.String),
|
|
16
|
-
environment: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
|
|
17
|
-
enabled: Schema.optional(Schema.Boolean),
|
|
18
|
-
}) {
|
|
19
|
-
}
|
|
20
|
-
export class OpencodeMcp extends Effect.Service()('@expandai/cli/Install/Opencode/Mcp', {
|
|
21
|
-
dependencies: [ConfigIo.Default, CliInvocation.Default],
|
|
22
|
-
effect: Effect.gen(function* () {
|
|
23
|
-
const io = yield* ConfigIo;
|
|
24
|
-
const cli = yield* CliInvocation;
|
|
25
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
26
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
27
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
28
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.config/opencode/opencode.json`)), Match.when('project', () => Effect.succeed(`${cwd}/opencode.json`)), Match.exhaustive);
|
|
29
|
-
});
|
|
30
|
-
const readConfig = Effect.fn(function* (file) {
|
|
31
|
-
return yield* io
|
|
32
|
-
.read(file, OpencodeConfigSchema)
|
|
33
|
-
.pipe(Effect.mapError((error) => new McpParseError({ path: file, error })));
|
|
34
|
-
});
|
|
35
|
-
const writeConfig = Effect.fn(function* (file, value) {
|
|
36
|
-
yield* io
|
|
37
|
-
.write(file, value, OpencodeConfigSchema)
|
|
38
|
-
.pipe(Effect.mapError((error) => new McpWriteError({ path: file, error })));
|
|
39
|
-
});
|
|
40
|
-
const install = Effect.fn(function* (scope) {
|
|
41
|
-
const file = yield* pathFor(scope);
|
|
42
|
-
const config = yield* readConfig(file);
|
|
43
|
-
const invocation = yield* cli.resolve();
|
|
44
|
-
yield* writeConfig(file, {
|
|
45
|
-
...config,
|
|
46
|
-
mcp: {
|
|
47
|
-
...config.mcp,
|
|
48
|
-
[SERVER_KEY]: new Entry({
|
|
49
|
-
type: 'local',
|
|
50
|
-
command: [invocation.command, ...invocation.args, 'mcp', 'run'],
|
|
51
|
-
environment: { EXPANDAI_HARNESS: 'opencode' },
|
|
52
|
-
enabled: true,
|
|
53
|
-
}),
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
yield* Console.log(`Installed expandai MCP server into ${file}`);
|
|
57
|
-
});
|
|
58
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
59
|
-
const file = yield* pathFor(scope);
|
|
60
|
-
const config = yield* readConfig(file);
|
|
61
|
-
if (!(SERVER_KEY in config.mcp)) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
yield* writeConfig(file, { ...config, mcp: Record.remove(config.mcp, SERVER_KEY) });
|
|
65
|
-
yield* Console.log(`Removed expandai MCP server from ${file}`);
|
|
66
|
-
});
|
|
67
|
-
const isInstalled = Effect.fn(function* (scope) {
|
|
68
|
-
const file = yield* pathFor(scope);
|
|
69
|
-
const config = yield* readConfig(file);
|
|
70
|
-
return SERVER_KEY in config.mcp;
|
|
71
|
-
});
|
|
72
|
-
return { install, uninstall, isInstalled, pathFor };
|
|
73
|
-
}),
|
|
74
|
-
}) {
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=Mcp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../../src/Install/Opencode/Mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Effect, Match } from 'effect';
|
|
3
|
-
import { SkillIo } from '../Domain.js';
|
|
4
|
-
/**
|
|
5
|
-
* OpenCode skills are Claude-Code-compatible Markdown files. Per
|
|
6
|
-
* opencode.ai/docs/skills, OpenCode auto-discovers them under either
|
|
7
|
-
* `.opencode/skills/<name>/`, `.claude/skills/<name>/`, or
|
|
8
|
-
* `.agents/skills/<name>/` (and the `~/.config/opencode/...` equivalents
|
|
9
|
-
* for global). We ship to OpenCode-native paths.
|
|
10
|
-
*
|
|
11
|
-
* - global → `~/.config/opencode/skills/expandai/SKILL.md`
|
|
12
|
-
* - project → `<cwd>/.opencode/skills/expandai/SKILL.md`
|
|
13
|
-
*/
|
|
14
|
-
export const SKILL_NAME = 'expandai';
|
|
15
|
-
export class OpencodeSkill extends Effect.Service()('@expandai/cli/Install/Opencode/Skill', {
|
|
16
|
-
dependencies: [SkillIo.Default],
|
|
17
|
-
effect: Effect.gen(function* () {
|
|
18
|
-
const io = yield* SkillIo;
|
|
19
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
20
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
21
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
22
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.config/opencode/skills/${SKILL_NAME}`)), Match.when('project', () => Effect.succeed(`${cwd}/.opencode/skills/${SKILL_NAME}`)), Match.exhaustive);
|
|
23
|
-
});
|
|
24
|
-
const install = Effect.fn(function* (scope) {
|
|
25
|
-
return yield* io.install(yield* pathFor(scope));
|
|
26
|
-
});
|
|
27
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
28
|
-
return yield* io.uninstall(yield* pathFor(scope));
|
|
29
|
-
});
|
|
30
|
-
const isCurrent = Effect.fn(function* (scope) {
|
|
31
|
-
return yield* io.isCurrent(yield* pathFor(scope));
|
|
32
|
-
});
|
|
33
|
-
return { install, uninstall, isCurrent, pathFor };
|
|
34
|
-
}),
|
|
35
|
-
}) {
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=Skill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Skill.js","sourceRoot":"","sources":["../../../../src/Install/Opencode/Skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAA;AAEpC,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,OAAO,EAAiB,CAAC,sCAAsC,EAAE;IAC1G,YAAY,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAA;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAE/E,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,4BAA4B,UAAU,EAAE,CAAC,CAAC,EAC3F,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,qBAAqB,UAAU,EAAE,CAAC,CAAC,EACpF,KAAK,CAAC,UAAU,CAChB,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACzD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACzD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAW,CAAA;IAC3D,CAAC,CAAC;CACF,CAAC;CAAG"}
|