@agimon-ai/doompi-mcp 0.0.1-alpha.9 → 0.0.1-alpha.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +117 -17
  2. package/dist/apiContracts.cjs +138 -0
  3. package/dist/apiContracts.cjs.map +1 -0
  4. package/dist/apiContracts.d.mts +53 -0
  5. package/dist/apiContracts.d.mts.map +1 -0
  6. package/dist/apiContracts.mjs +133 -0
  7. package/dist/apiContracts.mjs.map +1 -0
  8. package/dist/extensions/mcp-ui.mjs +31 -0
  9. package/dist/extensions/mcp-ui.mjs.map +1 -0
  10. package/dist/extensions/mcp.cjs +109 -0
  11. package/dist/extensions/mcp.cjs.map +1 -0
  12. package/dist/extensions/mcp.d.mts +5 -0
  13. package/dist/extensions/mcp.d.mts.map +1 -0
  14. package/dist/extensions/mcp.mjs +104 -0
  15. package/dist/extensions/mcp.mjs.map +1 -0
  16. package/dist/extensions/pi.cjs +292 -1
  17. package/dist/extensions/pi.cjs.map +1 -1
  18. package/dist/extensions/pi.d.mts +5 -2
  19. package/dist/extensions/pi.d.mts.map +1 -0
  20. package/dist/extensions/pi.mjs +285 -1
  21. package/dist/extensions/pi.mjs.map +1 -1
  22. package/dist/extensions/server.cjs +859 -0
  23. package/dist/extensions/server.cjs.map +1 -0
  24. package/dist/extensions/server.d.mts +5 -0
  25. package/dist/extensions/server.d.mts.map +1 -0
  26. package/dist/extensions/server.mjs +850 -0
  27. package/dist/extensions/server.mjs.map +1 -0
  28. package/dist/extensions/web.mjs +1228 -0
  29. package/dist/extensions/web.mjs.map +1 -0
  30. package/dist/index.cjs +18 -1
  31. package/dist/index.cjs.map +1 -0
  32. package/dist/index.d.mts +89 -7
  33. package/dist/index.d.mts.map +1 -0
  34. package/dist/index.mjs +9 -1
  35. package/dist/index.mjs.map +1 -0
  36. package/dist/keyringTokenStore-LBsDb_eC.cjs +108 -0
  37. package/dist/keyringTokenStore-LBsDb_eC.cjs.map +1 -0
  38. package/dist/keyringTokenStore-hWsv5r0e.mjs +97 -0
  39. package/dist/keyringTokenStore-hWsv5r0e.mjs.map +1 -0
  40. package/dist/mcpCatalog-Bnkul3t_.cjs +823 -0
  41. package/dist/mcpCatalog-Bnkul3t_.cjs.map +1 -0
  42. package/dist/mcpCatalog-laXfwecc.mjs +742 -0
  43. package/dist/mcpCatalog-laXfwecc.mjs.map +1 -0
  44. package/dist/mcpCommand-BARs6Y1N.cjs +968 -0
  45. package/dist/mcpCommand-BARs6Y1N.cjs.map +1 -0
  46. package/dist/mcpCommand-BaJXXphd.mjs +843 -0
  47. package/dist/mcpCommand-BaJXXphd.mjs.map +1 -0
  48. package/dist/mcpConfig-BAHqTlz_.d.mts +57 -0
  49. package/dist/mcpConfig-BAHqTlz_.d.mts.map +1 -0
  50. package/dist/mcpOverlay-BNYJ6gXg.cjs +507 -0
  51. package/dist/mcpOverlay-BNYJ6gXg.cjs.map +1 -0
  52. package/dist/mcpOverlay-DpLcSgu0.mjs +507 -0
  53. package/dist/mcpOverlay-DpLcSgu0.mjs.map +1 -0
  54. package/dist/projection-gyAA2jRB.mjs +43 -0
  55. package/dist/projection-gyAA2jRB.mjs.map +1 -0
  56. package/dist/projection-w3XxXmVi.cjs +51 -0
  57. package/dist/projection-w3XxXmVi.cjs.map +1 -0
  58. package/dist/projection.cjs +17 -0
  59. package/dist/projection.d.mts +12 -0
  60. package/dist/projection.d.mts.map +1 -0
  61. package/dist/projection.mjs +4 -0
  62. package/dist/rolldown-runtime-C0BPl7ul.cjs +43 -0
  63. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  64. package/llms.txt +9 -0
  65. package/package.json +111 -24
  66. package/src/prompts/doompi-use-mcp/SKILL.md +50 -0
  67. package/dist/_virtual/_rolldown/runtime.cjs +0 -1
  68. package/dist/commands/mcpCommand.cjs +0 -3
  69. package/dist/commands/mcpCommand.cjs.map +0 -1
  70. package/dist/commands/mcpCommand.mjs +0 -3
  71. package/dist/commands/mcpCommand.mjs.map +0 -1
  72. package/dist/constants.cjs +0 -2
  73. package/dist/constants.cjs.map +0 -1
  74. package/dist/constants.mjs +0 -2
  75. package/dist/constants.mjs.map +0 -1
  76. package/dist/extension.cjs +0 -2
  77. package/dist/extension.cjs.map +0 -1
  78. package/dist/extension.d.cts +0 -18
  79. package/dist/extension.d.cts.map +0 -1
  80. package/dist/extension.d.mts +0 -18
  81. package/dist/extension.d.mts.map +0 -1
  82. package/dist/extension.mjs +0 -2
  83. package/dist/extension.mjs.map +0 -1
  84. package/dist/extensions/doom.cjs +0 -2
  85. package/dist/extensions/doom.cjs.map +0 -1
  86. package/dist/extensions/doom.d.cts +0 -6
  87. package/dist/extensions/doom.d.cts.map +0 -1
  88. package/dist/extensions/doom.d.mts +0 -7
  89. package/dist/extensions/doom.d.mts.map +0 -1
  90. package/dist/extensions/doom.mjs +0 -2
  91. package/dist/extensions/doom.mjs.map +0 -1
  92. package/dist/extensions/pi.d.cts +0 -2
  93. package/dist/index.d.cts +0 -7
  94. package/dist/leader.cjs +0 -2
  95. package/dist/leader.cjs.map +0 -1
  96. package/dist/leader.mjs +0 -2
  97. package/dist/leader.mjs.map +0 -1
  98. package/dist/services/configSources.cjs +0 -2
  99. package/dist/services/configSources.cjs.map +0 -1
  100. package/dist/services/configSources.d.cts +0 -48
  101. package/dist/services/configSources.d.cts.map +0 -1
  102. package/dist/services/configSources.d.mts +0 -48
  103. package/dist/services/configSources.d.mts.map +0 -1
  104. package/dist/services/configSources.mjs +0 -2
  105. package/dist/services/configSources.mjs.map +0 -1
  106. package/dist/services/directTools.cjs +0 -2
  107. package/dist/services/directTools.cjs.map +0 -1
  108. package/dist/services/directTools.d.cts +0 -14
  109. package/dist/services/directTools.d.cts.map +0 -1
  110. package/dist/services/directTools.d.mts +0 -14
  111. package/dist/services/directTools.d.mts.map +0 -1
  112. package/dist/services/directTools.mjs +0 -2
  113. package/dist/services/directTools.mjs.map +0 -1
  114. package/dist/services/keyringTokenStore.cjs +0 -2
  115. package/dist/services/keyringTokenStore.cjs.map +0 -1
  116. package/dist/services/keyringTokenStore.mjs +0 -2
  117. package/dist/services/keyringTokenStore.mjs.map +0 -1
  118. package/dist/services/mcpCatalog.cjs +0 -2
  119. package/dist/services/mcpCatalog.cjs.map +0 -1
  120. package/dist/services/mcpCatalog.d.cts +0 -17
  121. package/dist/services/mcpCatalog.d.cts.map +0 -1
  122. package/dist/services/mcpCatalog.d.mts +0 -17
  123. package/dist/services/mcpCatalog.d.mts.map +0 -1
  124. package/dist/services/mcpCatalog.mjs +0 -2
  125. package/dist/services/mcpCatalog.mjs.map +0 -1
  126. package/dist/services/mcpRuntime.cjs +0 -2
  127. package/dist/services/mcpRuntime.cjs.map +0 -1
  128. package/dist/services/mcpRuntime.d.cts +0 -26
  129. package/dist/services/mcpRuntime.d.cts.map +0 -1
  130. package/dist/services/mcpRuntime.d.mts +0 -26
  131. package/dist/services/mcpRuntime.d.mts.map +0 -1
  132. package/dist/services/mcpRuntime.mjs +0 -2
  133. package/dist/services/mcpRuntime.mjs.map +0 -1
  134. package/dist/services/mcpSession.cjs +0 -2
  135. package/dist/services/mcpSession.cjs.map +0 -1
  136. package/dist/services/mcpSession.mjs +0 -2
  137. package/dist/services/mcpSession.mjs.map +0 -1
  138. package/dist/services/sessionConfig.cjs +0 -2
  139. package/dist/services/sessionConfig.cjs.map +0 -1
  140. package/dist/services/sessionConfig.d.cts +0 -25
  141. package/dist/services/sessionConfig.d.cts.map +0 -1
  142. package/dist/services/sessionConfig.d.mts +0 -25
  143. package/dist/services/sessionConfig.d.mts.map +0 -1
  144. package/dist/services/sessionConfig.mjs +0 -2
  145. package/dist/services/sessionConfig.mjs.map +0 -1
  146. package/dist/tools/mcpTools.cjs +0 -3
  147. package/dist/tools/mcpTools.cjs.map +0 -1
  148. package/dist/tools/mcpTools.mjs +0 -3
  149. package/dist/tools/mcpTools.mjs.map +0 -1
  150. package/dist/tui/mcpOverlay.cjs +0 -2
  151. package/dist/tui/mcpOverlay.cjs.map +0 -1
  152. package/dist/tui/mcpOverlay.mjs +0 -2
  153. package/dist/tui/mcpOverlay.mjs.map +0 -1
  154. package/dist/types.d.cts +0 -2
  155. package/dist/types.d.mts +0 -2
package/README.md CHANGED
@@ -1,35 +1,135 @@
1
1
  # @agimon-ai/doompi-mcp
2
2
 
3
- MCP server tools for Doompi.
3
+ Domain-aware MCP selection for DoomPi and a standalone MCP adapter for Pi.
4
4
 
5
- The MCP adapter. Resolves the servers a selection allows and exposes them to the session, so
6
- a domain with an `mcp` allowlist reaches only the servers and proxy upstreams it names.
5
+ Part of the [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi).
7
6
 
8
- Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
9
- only the skills and tools you name. This package is composed by Doompi and is not usually
10
- installed on its own.
7
+ The package removes disallowed servers before any stdio process is spawned. A filtered server is
8
+ absent rather than merely hidden from the model.
9
+
10
+ > **Alpha:** configuration and adapter contracts may change between releases.
11
+
12
+ ## Requirements
13
+
14
+ - Node.js 22.19.0 or newer
15
+ - Pi 0.85.0 and Pi TUI 0.85.0
11
16
 
12
17
  ## Install
13
18
 
19
+ `doompi init` and `dpi init` include this adapter in `default.packages` in `.doom/modes.yaml`.
20
+ Remove it or move it to a named layer to change which major modes load it. When loaded in DoomPi,
21
+ domain selection controls server access. For plain Pi:
22
+
14
23
  ```bash
15
- npm install @agimon-ai/doompi-mcp
24
+ pi install npm:@agimon-ai/doompi-mcp
25
+ ```
26
+
27
+ | Entry | Purpose |
28
+ | ------------------------------------- | ---------------------------------------------------------- |
29
+ | `@agimon-ai/doompi-mcp/extensions/pi` | Standard Pi adapter using repository and domain MCP config |
30
+ | `@agimon-ai/doompi-mcp` | Library API |
31
+ | `@agimon-ai/doompi-mcp/projection` | Neutral projection adapter and Agent Plugin normalization |
32
+
33
+ ## Configure direct servers
34
+
35
+ Repository `.mcp.json` entries describe direct MCP servers:
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "filesystem": {
41
+ "command": "npx",
42
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ Selected legacy plugins may also provide root `.mcp.json`. A schema-gated Agent Plugin v1 instead
49
+ provides root `mcp.json`. Doom validates its portable contract, supplies private persistent
50
+ `PLUGIN_DATA`, and resolves plugin-relative stdio commands and working directories. It also
51
+ normalizes `streamable-http` for the embedded runtime. Invalid portable server entries are isolated
52
+ from the other entries in that plugin.
53
+
54
+ Proxy upstreams are read from `mcp-config.yaml`. Domains can select direct `servers` and proxy
55
+ upstreams separately in `.doom/domains.yaml`:
56
+
57
+ ```yaml
58
+ # .doom/domains.yaml
59
+ domains:
60
+ development:
61
+ description: Repository development tools.
62
+ mcp:
63
+ servers: [filesystem]
64
+ proxy: [github]
65
+ ```
66
+
67
+ An absent or empty allowlist retains configured entries. Use `doompi --no-mcp` when no MCP server
68
+ should load. In plain Pi mode, no DoomPi domain allowlist is applied.
69
+
70
+ Within DoomPi, this package consumes the immutable `doomMcpProjection` service published on the
71
+ session Cordis root. Each Pi reload disposes the old injected runtime before the replacement binds.
72
+ Downstream clients run in-process through `@agimon-ai/mcp-proxy`; this adapter does not start its
73
+ Hono server.
74
+
75
+ ## Commands
76
+
77
+ ```text
78
+ /mcp
79
+ /mcp status
80
+ /mcp auth <server>
81
+ /mcp reload
16
82
  ```
17
83
 
18
- ## How it loads
84
+ In a TUI, the bare `/mcp` command opens the interactive overlay. In the web cockpit, the focused
85
+ session's Context panel lists only servers currently waiting for authorization. Its `authorize`
86
+ action sends one `/mcp auth <server>` prompt frame to that session. The authorization URL then appears
87
+ as a clickable notice in the transcript. Headless hosts never open a desktop browser automatically.
88
+
89
+ The live browser status is intentionally compact: `doom-mcp-session-auth` contains JSON rows shaped
90
+ as `[{"name":"server","state":"needs-auth"}]` and is cleared when no server needs authorization.
91
+ It never includes authorization URLs, errors, credentials, or credential-store data. Repository
92
+ catalog and authorization APIs remain separate from this live-session view.
19
93
 
20
- Doompi loads this unconditionally. It is core, not a layer, so it does not appear in
21
- `.doom/modes.yaml`: making it optional would only create broken configurations.
94
+ ## Credentials and trust
22
95
 
23
- Extension entry: `@agimon-ai/doompi-mcp/extensions/pi`
96
+ Allowed stdio entries execute their configured commands with the Pi process environment and
97
+ operating system privileges. Review configuration as executable code.
24
98
 
25
- ## Entry points
99
+ OAuth credentials use the operating system keyring when available. The private-file fallback is
100
+ stored under `~/.mcp-proxy/oauth` with owner-only permissions. Credentials remain machine-wide and
101
+ keyed by server name, while their upstream URL binding prevents blind replay to another endpoint.
102
+ Treat both the configuration and credential store as sensitive.
103
+
104
+ The default OAuth callback is `http://127.0.0.1:19876/callback`. Authorization therefore requires the
105
+ browser and DoomPi runtime to share that loopback network namespace. A remote browser cannot complete
106
+ the callback when its `127.0.0.1` resolves to another machine or container.
107
+
108
+ ## Public API
109
+
110
+ ```ts
111
+ import { buildMcpConfigGroups, readCachedCatalog, registerMcpExtension, toPiToolName } from '@agimon-ai/doompi-mcp';
112
+ import type { McpAllowlist, McpSessionConfig } from '@agimon-ai/doompi-mcp';
113
+ ```
26
114
 
27
- | Import |
28
- | --------------------------------------- |
29
- | `@agimon-ai/doompi-mcp` |
30
- | `@agimon-ai/doompi-mcp/extensions/pi` |
31
- | `@agimon-ai/doompi-mcp/extensions/doom` |
115
+ `doompi --emit-mcp <directory>` emits the resolved MCP configuration to the target directory
116
+ without launching a model.
117
+
118
+ ## Development
119
+
120
+ ```bash
121
+ pnpm build
122
+ pnpm typecheck
123
+ pnpm test
124
+ pnpm lint
125
+ ```
126
+
127
+ Maintained by [Agimon](https://agimon.ai/about).
32
128
 
33
129
  ## License
34
130
 
35
131
  MIT
132
+
133
+ The direct `src/extensions/` entries declare host contributions. MCP session state and connection behavior live in named service folders; controllers handle commands and API requests. `tools/` produces typed declarations, and `exports/` exposes reusable public APIs.
134
+
135
+ Pi tools use a live collection. The helper subscribes to discovery changes and owns registrations and cleanup. Unchanged tools retain their declaration identity across reconnects. Removed tools are unavailable, and incompatible schema reuse stays hidden until the runtime is relaunched. Renderer callbacks enter through the Pi extension, keeping services independent of terminal presentation.
@@ -0,0 +1,138 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ let _agimon_ai_doompi_core_apiContracts = require("@agimon-ai/doompi-core/apiContracts");
6
+ let typebox = require("typebox");
7
+ //#region src/schemas/apiContracts.ts
8
+ const S = typebox.Type.String();
9
+ const N = typebox.Type.Number();
10
+ const B = typebox.Type.Boolean();
11
+ const O = typebox.Type.Optional;
12
+ const literals = (values) => typebox.Type.Union(values.map((value) => typebox.Type.Literal(value)));
13
+ const RepositoryId = typebox.Type.String({ pattern: "^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$" });
14
+ const RepositoryQuery = [{
15
+ name: "repositoryId",
16
+ in: "query",
17
+ required: true,
18
+ schema: RepositoryId
19
+ }];
20
+ const McpCatalogSchema = typebox.Type.Object({
21
+ repositoryId: S,
22
+ sync: typebox.Type.Object({
23
+ fresh: B,
24
+ reasons: typebox.Type.Array(S)
25
+ }),
26
+ servers: typebox.Type.Array(typebox.Type.Object({
27
+ name: S,
28
+ state: literals([
29
+ "not-connected",
30
+ "connecting",
31
+ "connected",
32
+ "degraded",
33
+ "needs-auth",
34
+ "failed",
35
+ "closed"
36
+ ]),
37
+ source: literals([
38
+ "cached",
39
+ "live",
40
+ "configured"
41
+ ]),
42
+ credentialPresent: B,
43
+ tools: typebox.Type.Array(typebox.Type.Object({
44
+ name: S,
45
+ piName: S,
46
+ description: O(S)
47
+ })),
48
+ error: O(S)
49
+ })),
50
+ droppedServers: typebox.Type.Array(S),
51
+ diagnostics: typebox.Type.Array(S)
52
+ });
53
+ const McpAuthorizationSchema = typebox.Type.Object({
54
+ id: S,
55
+ repositoryId: S,
56
+ serverName: S,
57
+ status: literals([
58
+ "starting",
59
+ "waiting",
60
+ "completed",
61
+ "failed",
62
+ "cancelled",
63
+ "expired"
64
+ ]),
65
+ authorizationUrl: O(S),
66
+ error: O(S),
67
+ expiresAt: N
68
+ });
69
+ const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)({
70
+ version: 1,
71
+ sockets: [],
72
+ dynamic: [],
73
+ http: ["global", "workspace"].flatMap((scope) => [
74
+ {
75
+ id: "mcp.catalog",
76
+ scope,
77
+ basePath: "mcp",
78
+ path: "/repository",
79
+ method: "GET",
80
+ authentication: "owner",
81
+ description: "Read the synced MCP repository catalog.",
82
+ parameters: RepositoryQuery,
83
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(McpCatalogSchema)
84
+ },
85
+ {
86
+ id: "mcp.discover",
87
+ scope,
88
+ basePath: "mcp",
89
+ path: "/repository/discover",
90
+ method: "POST",
91
+ authentication: "owner",
92
+ description: "Discover repository MCP servers.",
93
+ body: {
94
+ required: true,
95
+ contentType: "application/json",
96
+ schema: typebox.Type.Object({ repositoryId: RepositoryId })
97
+ },
98
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(McpCatalogSchema)
99
+ },
100
+ {
101
+ id: "mcp.authorize",
102
+ scope,
103
+ basePath: "mcp",
104
+ path: "/repository/authorize",
105
+ method: "POST",
106
+ authentication: "owner",
107
+ description: "Start MCP authorization.",
108
+ body: {
109
+ required: true,
110
+ contentType: "application/json",
111
+ schema: typebox.Type.Object({
112
+ repositoryId: RepositoryId,
113
+ serverName: typebox.Type.String({
114
+ minLength: 1,
115
+ maxLength: 160
116
+ })
117
+ })
118
+ },
119
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(McpAuthorizationSchema, 202)
120
+ },
121
+ ...["GET", "DELETE"].map((method) => ({
122
+ id: `mcp.authorization.${method}`,
123
+ scope,
124
+ basePath: "mcp",
125
+ path: "/repository/authorize/{flowId}",
126
+ method,
127
+ authentication: "owner",
128
+ description: method === "GET" ? "Read an authorization flow." : "Cancel an authorization flow.",
129
+ parameters: RepositoryQuery,
130
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(McpAuthorizationSchema)
131
+ }))
132
+ ])
133
+ });
134
+ //#endregion
135
+ exports.apiContracts = apiContracts;
136
+ exports.default = apiContracts;
137
+
138
+ //# sourceMappingURL=apiContracts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RepositoryId = Type.String({ pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$' });\nconst RepositoryQuery = [{ name: 'repositoryId', in: 'query' as const, required: true, schema: RepositoryId }];\nexport const McpCatalogSchema = Type.Object({\n repositoryId: S,\n sync: Type.Object({ fresh: B, reasons: Type.Array(S) }),\n servers: Type.Array(\n Type.Object({\n name: S,\n state: literals(['not-connected', 'connecting', 'connected', 'degraded', 'needs-auth', 'failed', 'closed']),\n source: literals(['cached', 'live', 'configured']),\n credentialPresent: B,\n tools: Type.Array(Type.Object({ name: S, piName: S, description: O(S) })),\n error: O(S),\n }),\n ),\n droppedServers: Type.Array(S),\n diagnostics: Type.Array(S),\n});\nexport const McpAuthorizationSchema = Type.Object({\n id: S,\n repositoryId: S,\n serverName: S,\n status: literals(['starting', 'waiting', 'completed', 'failed', 'cancelled', 'expired']),\n authorizationUrl: O(S),\n error: O(S),\n expiresAt: N,\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n sockets: [],\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'mcp.catalog',\n scope,\n basePath: 'mcp',\n path: '/repository',\n method: 'GET',\n authentication: 'owner',\n description: 'Read the synced MCP repository catalog.',\n parameters: RepositoryQuery,\n responses: jsonApiResponses(McpCatalogSchema),\n },\n {\n id: 'mcp.discover',\n scope,\n basePath: 'mcp',\n path: '/repository/discover',\n method: 'POST',\n authentication: 'owner',\n description: 'Discover repository MCP servers.',\n body: { required: true, contentType: 'application/json', schema: Type.Object({ repositoryId: RepositoryId }) },\n responses: jsonApiResponses(McpCatalogSchema),\n },\n {\n id: 'mcp.authorize',\n scope,\n basePath: 'mcp',\n path: '/repository/authorize',\n method: 'POST',\n authentication: 'owner',\n description: 'Start MCP authorization.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ repositoryId: RepositoryId, serverName: Type.String({ minLength: 1, maxLength: 160 }) }),\n },\n responses: jsonApiResponses(McpAuthorizationSchema, 202),\n },\n ...(['GET', 'DELETE'] as const).map((method) => ({\n id: `mcp.authorization.${method}`,\n scope,\n basePath: 'mcp',\n path: '/repository/authorize/{flowId}',\n method,\n authentication: 'owner' as const,\n description: method === 'GET' ? 'Read an authorization flow.' : 'Cancel an authorization flow.',\n parameters: RepositoryQuery,\n responses: jsonApiResponses(McpAuthorizationSchema),\n })),\n ]),\n});\nexport default apiContracts;\n"],"mappings":";;;;;;;AAGA,MAAM,IAAIA,QAAAA,KAAK,OAAO;AACtB,MAAM,IAAIA,QAAAA,KAAK,OAAO;AACtB,MAAM,IAAIA,QAAAA,KAAK,QAAQ;AACvB,MAAM,IAAIA,QAAAA,KAAK;AACf,MAAM,YAA8B,WAAgBA,QAAAA,KAAK,MAAM,OAAO,KAAK,UAAUA,QAAAA,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzG,MAAM,eAAeA,QAAAA,KAAK,OAAO,EAAE,SAAS,4CAA4C,CAAC;AACzF,MAAM,kBAAkB,CAAC;CAAE,MAAM;CAAgB,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAa,CAAC;AAC7G,MAAa,mBAAmBA,QAAAA,KAAK,OAAO;CAC1C,cAAc;CACd,MAAMA,QAAAA,KAAK,OAAO;EAAE,OAAO;EAAG,SAASA,QAAAA,KAAK,MAAM,CAAC;CAAE,CAAC;CACtD,SAASA,QAAAA,KAAK,MACZA,QAAAA,KAAK,OAAO;EACV,MAAM;EACN,OAAO,SAAS;GAAC;GAAiB;GAAc;GAAa;GAAY;GAAc;GAAU;EAAQ,CAAC;EAC1G,QAAQ,SAAS;GAAC;GAAU;GAAQ;EAAY,CAAC;EACjD,mBAAmB;EACnB,OAAOA,QAAAA,KAAK,MAAMA,QAAAA,KAAK,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,aAAa,EAAE,CAAC;EAAE,CAAC,CAAC;EACxE,OAAO,EAAE,CAAC;CACZ,CAAC,CACH;CACA,gBAAgBA,QAAAA,KAAK,MAAM,CAAC;CAC5B,aAAaA,QAAAA,KAAK,MAAM,CAAC;AAC3B,CAAC;AACD,MAAa,yBAAyBA,QAAAA,KAAK,OAAO;CAChD,IAAI;CACJ,cAAc;CACd,YAAY;CACZ,QAAQ,SAAS;EAAC;EAAY;EAAW;EAAa;EAAU;EAAa;CAAS,CAAC;CACvF,kBAAkB,EAAE,CAAC;CACrB,OAAO,EAAE,CAAC;CACV,WAAW;AACb,CAAC;AACD,MAAa,gBAAA,GAAeC,oCAAAA,kBAAAA,CAAkB;CAC5C,SAAS;CACT,SAAS,CAAC;CACV,SAAS,CAAC;CACV,MAAO,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAAU;EAC1D;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,YAAA,GAAWC,oCAAAA,iBAAAA,CAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IAAE,UAAU;IAAM,aAAa;IAAoB,QAAQF,QAAAA,KAAK,OAAO,EAAE,cAAc,aAAa,CAAC;GAAE;GAC7G,YAAA,GAAWE,oCAAAA,iBAAAA,CAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IACJ,UAAU;IACV,aAAa;IACb,QAAQF,QAAAA,KAAK,OAAO;KAAE,cAAc;KAAc,YAAYA,QAAAA,KAAK,OAAO;MAAE,WAAW;MAAG,WAAW;KAAI,CAAC;IAAE,CAAC;GAC/G;GACA,YAAA,GAAWE,oCAAAA,iBAAAA,CAAiB,wBAAwB,GAAG;EACzD;EACA,GAAI,CAAC,OAAO,QAAQ,CAAC,CAAW,KAAK,YAAY;GAC/C,IAAI,qBAAqB;GACzB;GACA,UAAU;GACV,MAAM;GACN;GACA,gBAAgB;GAChB,aAAa,WAAW,QAAQ,gCAAgC;GAChE,YAAY;GACZ,YAAA,GAAWA,oCAAAA,iBAAAA,CAAiB,sBAAsB;EACpD,EAAE;CACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { Type } from "typebox";
2
+ //#region src/schemas/apiContracts.d.ts
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAmCa"}
@@ -0,0 +1,133 @@
1
+ import { defineApiContract, jsonApiResponses } from "@agimon-ai/doompi-core/apiContracts";
2
+ import { Type } from "typebox";
3
+ //#region src/schemas/apiContracts.ts
4
+ const S = Type.String();
5
+ const N = Type.Number();
6
+ const B = Type.Boolean();
7
+ const O = Type.Optional;
8
+ const literals = (values) => Type.Union(values.map((value) => Type.Literal(value)));
9
+ const RepositoryId = Type.String({ pattern: "^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$" });
10
+ const RepositoryQuery = [{
11
+ name: "repositoryId",
12
+ in: "query",
13
+ required: true,
14
+ schema: RepositoryId
15
+ }];
16
+ const McpCatalogSchema = Type.Object({
17
+ repositoryId: S,
18
+ sync: Type.Object({
19
+ fresh: B,
20
+ reasons: Type.Array(S)
21
+ }),
22
+ servers: Type.Array(Type.Object({
23
+ name: S,
24
+ state: literals([
25
+ "not-connected",
26
+ "connecting",
27
+ "connected",
28
+ "degraded",
29
+ "needs-auth",
30
+ "failed",
31
+ "closed"
32
+ ]),
33
+ source: literals([
34
+ "cached",
35
+ "live",
36
+ "configured"
37
+ ]),
38
+ credentialPresent: B,
39
+ tools: Type.Array(Type.Object({
40
+ name: S,
41
+ piName: S,
42
+ description: O(S)
43
+ })),
44
+ error: O(S)
45
+ })),
46
+ droppedServers: Type.Array(S),
47
+ diagnostics: Type.Array(S)
48
+ });
49
+ const McpAuthorizationSchema = Type.Object({
50
+ id: S,
51
+ repositoryId: S,
52
+ serverName: S,
53
+ status: literals([
54
+ "starting",
55
+ "waiting",
56
+ "completed",
57
+ "failed",
58
+ "cancelled",
59
+ "expired"
60
+ ]),
61
+ authorizationUrl: O(S),
62
+ error: O(S),
63
+ expiresAt: N
64
+ });
65
+ const apiContracts = defineApiContract({
66
+ version: 1,
67
+ sockets: [],
68
+ dynamic: [],
69
+ http: ["global", "workspace"].flatMap((scope) => [
70
+ {
71
+ id: "mcp.catalog",
72
+ scope,
73
+ basePath: "mcp",
74
+ path: "/repository",
75
+ method: "GET",
76
+ authentication: "owner",
77
+ description: "Read the synced MCP repository catalog.",
78
+ parameters: RepositoryQuery,
79
+ responses: jsonApiResponses(McpCatalogSchema)
80
+ },
81
+ {
82
+ id: "mcp.discover",
83
+ scope,
84
+ basePath: "mcp",
85
+ path: "/repository/discover",
86
+ method: "POST",
87
+ authentication: "owner",
88
+ description: "Discover repository MCP servers.",
89
+ body: {
90
+ required: true,
91
+ contentType: "application/json",
92
+ schema: Type.Object({ repositoryId: RepositoryId })
93
+ },
94
+ responses: jsonApiResponses(McpCatalogSchema)
95
+ },
96
+ {
97
+ id: "mcp.authorize",
98
+ scope,
99
+ basePath: "mcp",
100
+ path: "/repository/authorize",
101
+ method: "POST",
102
+ authentication: "owner",
103
+ description: "Start MCP authorization.",
104
+ body: {
105
+ required: true,
106
+ contentType: "application/json",
107
+ schema: Type.Object({
108
+ repositoryId: RepositoryId,
109
+ serverName: Type.String({
110
+ minLength: 1,
111
+ maxLength: 160
112
+ })
113
+ })
114
+ },
115
+ responses: jsonApiResponses(McpAuthorizationSchema, 202)
116
+ },
117
+ ...["GET", "DELETE"].map((method) => ({
118
+ id: `mcp.authorization.${method}`,
119
+ scope,
120
+ basePath: "mcp",
121
+ path: "/repository/authorize/{flowId}",
122
+ method,
123
+ authentication: "owner",
124
+ description: method === "GET" ? "Read an authorization flow." : "Cancel an authorization flow.",
125
+ parameters: RepositoryQuery,
126
+ responses: jsonApiResponses(McpAuthorizationSchema)
127
+ }))
128
+ ])
129
+ });
130
+ //#endregion
131
+ export { apiContracts, apiContracts as default };
132
+
133
+ //# sourceMappingURL=apiContracts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RepositoryId = Type.String({ pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$' });\nconst RepositoryQuery = [{ name: 'repositoryId', in: 'query' as const, required: true, schema: RepositoryId }];\nexport const McpCatalogSchema = Type.Object({\n repositoryId: S,\n sync: Type.Object({ fresh: B, reasons: Type.Array(S) }),\n servers: Type.Array(\n Type.Object({\n name: S,\n state: literals(['not-connected', 'connecting', 'connected', 'degraded', 'needs-auth', 'failed', 'closed']),\n source: literals(['cached', 'live', 'configured']),\n credentialPresent: B,\n tools: Type.Array(Type.Object({ name: S, piName: S, description: O(S) })),\n error: O(S),\n }),\n ),\n droppedServers: Type.Array(S),\n diagnostics: Type.Array(S),\n});\nexport const McpAuthorizationSchema = Type.Object({\n id: S,\n repositoryId: S,\n serverName: S,\n status: literals(['starting', 'waiting', 'completed', 'failed', 'cancelled', 'expired']),\n authorizationUrl: O(S),\n error: O(S),\n expiresAt: N,\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n sockets: [],\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'mcp.catalog',\n scope,\n basePath: 'mcp',\n path: '/repository',\n method: 'GET',\n authentication: 'owner',\n description: 'Read the synced MCP repository catalog.',\n parameters: RepositoryQuery,\n responses: jsonApiResponses(McpCatalogSchema),\n },\n {\n id: 'mcp.discover',\n scope,\n basePath: 'mcp',\n path: '/repository/discover',\n method: 'POST',\n authentication: 'owner',\n description: 'Discover repository MCP servers.',\n body: { required: true, contentType: 'application/json', schema: Type.Object({ repositoryId: RepositoryId }) },\n responses: jsonApiResponses(McpCatalogSchema),\n },\n {\n id: 'mcp.authorize',\n scope,\n basePath: 'mcp',\n path: '/repository/authorize',\n method: 'POST',\n authentication: 'owner',\n description: 'Start MCP authorization.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ repositoryId: RepositoryId, serverName: Type.String({ minLength: 1, maxLength: 160 }) }),\n },\n responses: jsonApiResponses(McpAuthorizationSchema, 202),\n },\n ...(['GET', 'DELETE'] as const).map((method) => ({\n id: `mcp.authorization.${method}`,\n scope,\n basePath: 'mcp',\n path: '/repository/authorize/{flowId}',\n method,\n authentication: 'owner' as const,\n description: method === 'GET' ? 'Read an authorization flow.' : 'Cancel an authorization flow.',\n parameters: RepositoryQuery,\n responses: jsonApiResponses(McpAuthorizationSchema),\n })),\n ]),\n});\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAM,IAAI,KAAK,OAAO;AACtB,MAAM,IAAI,KAAK,OAAO;AACtB,MAAM,IAAI,KAAK,QAAQ;AACvB,MAAM,IAAI,KAAK;AACf,MAAM,YAA8B,WAAgB,KAAK,MAAM,OAAO,KAAK,UAAU,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzG,MAAM,eAAe,KAAK,OAAO,EAAE,SAAS,4CAA4C,CAAC;AACzF,MAAM,kBAAkB,CAAC;CAAE,MAAM;CAAgB,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAa,CAAC;AAC7G,MAAa,mBAAmB,KAAK,OAAO;CAC1C,cAAc;CACd,MAAM,KAAK,OAAO;EAAE,OAAO;EAAG,SAAS,KAAK,MAAM,CAAC;CAAE,CAAC;CACtD,SAAS,KAAK,MACZ,KAAK,OAAO;EACV,MAAM;EACN,OAAO,SAAS;GAAC;GAAiB;GAAc;GAAa;GAAY;GAAc;GAAU;EAAQ,CAAC;EAC1G,QAAQ,SAAS;GAAC;GAAU;GAAQ;EAAY,CAAC;EACjD,mBAAmB;EACnB,OAAO,KAAK,MAAM,KAAK,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,aAAa,EAAE,CAAC;EAAE,CAAC,CAAC;EACxE,OAAO,EAAE,CAAC;CACZ,CAAC,CACH;CACA,gBAAgB,KAAK,MAAM,CAAC;CAC5B,aAAa,KAAK,MAAM,CAAC;AAC3B,CAAC;AACD,MAAa,yBAAyB,KAAK,OAAO;CAChD,IAAI;CACJ,cAAc;CACd,YAAY;CACZ,QAAQ,SAAS;EAAC;EAAY;EAAW;EAAa;EAAU;EAAa;CAAS,CAAC;CACvF,kBAAkB,EAAE,CAAC;CACrB,OAAO,EAAE,CAAC;CACV,WAAW;AACb,CAAC;AACD,MAAa,eAAe,kBAAkB;CAC5C,SAAS;CACT,SAAS,CAAC;CACV,SAAS,CAAC;CACV,MAAO,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAAU;EAC1D;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,WAAW,iBAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IAAE,UAAU;IAAM,aAAa;IAAoB,QAAQ,KAAK,OAAO,EAAE,cAAc,aAAa,CAAC;GAAE;GAC7G,WAAW,iBAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IACJ,UAAU;IACV,aAAa;IACb,QAAQ,KAAK,OAAO;KAAE,cAAc;KAAc,YAAY,KAAK,OAAO;MAAE,WAAW;MAAG,WAAW;KAAI,CAAC;IAAE,CAAC;GAC/G;GACA,WAAW,iBAAiB,wBAAwB,GAAG;EACzD;EACA,GAAI,CAAC,OAAO,QAAQ,CAAC,CAAW,KAAK,YAAY;GAC/C,IAAI,qBAAqB;GACzB;GACA,UAAU;GACV,MAAM;GACN;GACA,gBAAgB;GAChB,aAAa,WAAW,QAAQ,gCAAgC;GAChE,YAAY;GACZ,WAAW,iBAAiB,sBAAsB;EACpD,EAAE;CACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { defineMcpWidget } from "@agimon-ai/doompi-core/web";
2
+ import { McpToolFields, McpToolFrame, McpToolOutput } from "@agimon-ai/doompi-web-components";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/extensions/workspaces/sessions/(frontend)/tool/mcp_use.mcp.tsx
5
+ function McpUseMcpWidget(props) {
6
+ return /* @__PURE__ */ jsxs(McpToolFrame, {
7
+ ...props,
8
+ title: "Call MCP tool",
9
+ children: [/* @__PURE__ */ jsx(McpToolFields, { fields: [["Server", props.args.server], ["Tool", props.args.tool]] }), /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })]
10
+ });
11
+ }
12
+ var mcp_use_mcp_default = defineMcpWidget(McpUseMcpWidget);
13
+ //#endregion
14
+ //#region src/extensions/workspaces/sessions/(frontend)/tool/session_mcp.mcp.tsx
15
+ function SessionMcpMcpWidget(props) {
16
+ return /* @__PURE__ */ jsx(McpToolFrame, {
17
+ ...props,
18
+ title: props.toolName,
19
+ children: /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })
20
+ });
21
+ }
22
+ //#endregion
23
+ //#region generated/mcp-ui.ts
24
+ const widgets = {
25
+ "@agimon-ai/doompi-mcp/mcp_use": mcp_use_mcp_default,
26
+ "@agimon-ai/doompi-mcp/session_mcp": defineMcpWidget(SessionMcpMcpWidget)
27
+ };
28
+ //#endregion
29
+ export { widgets };
30
+
31
+ //# sourceMappingURL=mcp-ui.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-ui.mjs","names":["Widget0","Widget1"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/mcp_use.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/session_mcp.mcp.tsx","../../generated/mcp-ui.ts"],"sourcesContent":["import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/doompi-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/doompi-web-components';\n\nfunction McpUseMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Call MCP tool\">\n <McpToolFields\n fields={[\n ['Server', props.args.server],\n ['Tool', props.args.tool],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(McpUseMcpWidget);\n","import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/doompi-core/web';\nimport { McpToolFrame, McpToolOutput } from '@agimon-ai/doompi-web-components';\n\nfunction SessionMcpMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title={props.toolName}>\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(SessionMcpMcpWidget);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport type { ComponentType } from 'react';\nimport type { DoomMcpWidgetProps } from '@agimon-ai/doompi-core/mcpWidget';\nimport Widget0 from \"../src/extensions/workspaces/sessions/(frontend)/tool/mcp_use.mcp\";\nimport Widget1 from \"../src/extensions/workspaces/sessions/(frontend)/tool/session_mcp.mcp\";\n\nexport const widgets: Readonly<Record<string, ComponentType<DoomMcpWidgetProps>>> = {\n \"@agimon-ai/doompi-mcp/mcp_use\": Widget0,\n \"@agimon-ai/doompi-mcp/session_mcp\": Widget1,\n};\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,OAA2B;CAClD,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,UAAU,MAAM,KAAK,MAAM,GAC5B,CAAC,QAAQ,MAAM,KAAK,IAAI,CAC1B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,sBAAe,gBAAgB,eAAe;;;ACd9C,SAAS,oBAAoB,OAA2B;CACtD,OACE,oBAAC,cAAD;EAAc,GAAI;EAAO,OAAO,MAAM;EACpC,UAAA,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA;CAC1B,CAAA;AAElB;;;ACHA,MAAa,UAAuE;CAClF,iCAAiCA;CACjC,qCDGa,gBAAgB,mBCHQC;AACvC"}
@@ -0,0 +1,109 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ let _agimon_ai_doompi_core_mcpFacet = require("@agimon-ai/doompi-core/mcpFacet");
6
+ let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
7
+ let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
8
+ require("typebox/value");
9
+ let typebox = require("typebox");
10
+ //#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-mcp.mcp.ts
11
+ var doompi_use_mcp_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpSkill)({
12
+ name: "doompi-use-mcp",
13
+ description: "Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
14
+ read: () => (0, _agimon_ai_doompi_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/doompi-use-mcp/SKILL.md")
15
+ });
16
+ //#endregion
17
+ //#region src/services/mcpHeadlessTools/index.ts
18
+ const MCP_HEADLESS_TOOLS_SERVICE = "doom/mcp-headless-tools";
19
+ function bindMcpHeadlessTool(context, name) {
20
+ const tool = context.services.get(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);
21
+ if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);
22
+ return {
23
+ ...tool,
24
+ execute(toolCallId, parameters, signal, onUpdate) {
25
+ const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);
26
+ return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);
27
+ }
28
+ };
29
+ }
30
+ //#endregion
31
+ //#region src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts
32
+ var mcp_use_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpTool)((context) => bindMcpHeadlessTool(context, "mcp_use"));
33
+ typebox.Type.Object({
34
+ server: typebox.Type.String({ minLength: 1 }),
35
+ tool: typebox.Type.String({ minLength: 1 }),
36
+ arguments: typebox.Type.Optional(typebox.Type.Record(typebox.Type.String(), typebox.Type.Unknown()))
37
+ });
38
+ //#endregion
39
+ //#region src/services/mcpSessionTools/index.ts
40
+ const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
41
+ //#endregion
42
+ //#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
43
+ function fingerprint(service) {
44
+ return JSON.stringify(service.snapshot().map((tool) => ({
45
+ name: tool.piName,
46
+ description: tool.description,
47
+ schema: tool.inputSchema,
48
+ annotations: tool.annotations,
49
+ outputSchema: tool.outputSchema
50
+ })));
51
+ }
52
+ var session_mcp_mcp_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => {
53
+ const service = context.services.get(MCP_SESSION_TOOLS_SERVICE);
54
+ if (!service) return [];
55
+ let current = fingerprint(service);
56
+ const stop = service.onChange(() => {
57
+ const next = fingerprint(service);
58
+ if (next === current) return;
59
+ current = next;
60
+ context.refresh();
61
+ });
62
+ context.signal.addEventListener("abort", stop, { once: true });
63
+ return service.snapshot().map((tool) => ({
64
+ name: tool.piName,
65
+ label: `${tool.serverName}: ${tool.toolName}`,
66
+ description: tool.description ?? `${tool.toolName} on the ${tool.serverName} MCP server.`,
67
+ ...tool.annotations === void 0 ? {} : { annotations: tool.annotations },
68
+ ...tool.outputSchema === void 0 ? {} : { outputSchema: tool.outputSchema },
69
+ parameters: Object.keys(tool.inputSchema).length > 0 ? tool.inputSchema : {
70
+ type: "object",
71
+ properties: {}
72
+ },
73
+ execute: (_toolCallId, parameters, signal) => service.invoke(tool.piName, parameters ?? {}, AbortSignal.any([context.signal, signal ?? context.signal]))
74
+ }));
75
+ }, { cardinality: "many" });
76
+ //#endregion
77
+ //#region generated/mcp.ts
78
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
79
+ const many = (value, context) => {
80
+ const resolved = typeof value === "function" ? value(context) : value;
81
+ return Array.isArray(resolved) ? resolved : [resolved];
82
+ };
83
+ const via = (identity, value) => value === void 0 ? void 0 : {
84
+ ...identity,
85
+ ...value
86
+ };
87
+ const withWidget = (key, value) => value === void 0 ? value : {
88
+ ...value,
89
+ _meta: {
90
+ ...value._meta,
91
+ ["doompi/widget"]: key
92
+ }
93
+ };
94
+ const mcp = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpPlugin)({
95
+ name: "@agimon-ai/doompi-mcp",
96
+ session: (context) => ({
97
+ get skills() {
98
+ return [at(doompi_use_mcp_mcp_default, context)];
99
+ },
100
+ get tools() {
101
+ return [withWidget("@agimon-ai/doompi-mcp/mcp_use", via({ name: "mcp_use" }, at(mcp_use_mcp_default, context))), ...many(session_mcp_mcp_default, context).map((tool) => withWidget("@agimon-ai/doompi-mcp/session_mcp", tool))];
102
+ }
103
+ })
104
+ });
105
+ //#endregion
106
+ exports.default = mcp;
107
+ exports.mcp = mcp;
108
+
109
+ //# sourceMappingURL=mcp.cjs.map