open-multi-agent-kit 0.90.0 → 0.90.3

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 (168) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +20 -31
  3. package/dist/cli/args.d.ts +0 -2
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +1 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-session.d.ts +2 -0
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +41 -5
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/bang-skill-invocation.d.ts +26 -0
  12. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  13. package/dist/core/bang-skill-invocation.js +59 -0
  14. package/dist/core/bang-skill-invocation.js.map +1 -0
  15. package/dist/core/compactor.d.ts.map +1 -1
  16. package/dist/core/compactor.js +0 -3
  17. package/dist/core/compactor.js.map +1 -1
  18. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  19. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  20. package/dist/core/context-budget-governor-v2.js +1 -0
  21. package/dist/core/context-budget-governor-v2.js.map +1 -1
  22. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  23. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  24. package/dist/core/context-budget-headroom-types.js.map +1 -1
  25. package/dist/core/context-budget-headroom.d.ts +1 -1
  26. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  27. package/dist/core/context-budget-headroom.js +17 -4
  28. package/dist/core/context-budget-headroom.js.map +1 -1
  29. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  30. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  31. package/dist/core/context-budget-system-prompt.js +6 -1
  32. package/dist/core/context-budget-system-prompt.js.map +1 -1
  33. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  34. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  35. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  36. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  37. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  38. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  39. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  40. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  41. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  42. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  43. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  44. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  45. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  46. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  47. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  48. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  49. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  50. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  51. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  52. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  53. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  54. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  55. package/dist/core/context-budget-v2-cache.js +50 -0
  56. package/dist/core/context-budget-v2-cache.js.map +1 -0
  57. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  58. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  59. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  60. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  61. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  62. package/dist/core/context-budget-v2-planner.js +55 -2
  63. package/dist/core/context-budget-v2-planner.js.map +1 -1
  64. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  65. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  66. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  67. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  68. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  69. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  70. package/dist/core/context-budget-v2-selection.js +12 -2
  71. package/dist/core/context-budget-v2-selection.js.map +1 -1
  72. package/dist/core/context-budget-v2-types.d.ts +107 -1
  73. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  74. package/dist/core/context-budget-v2-types.js.map +1 -1
  75. package/dist/core/headroom.d.ts.map +1 -1
  76. package/dist/core/headroom.js +0 -4
  77. package/dist/core/headroom.js.map +1 -1
  78. package/dist/core/hook-inventory.d.ts.map +1 -1
  79. package/dist/core/hook-inventory.js +6 -0
  80. package/dist/core/hook-inventory.js.map +1 -1
  81. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  82. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  83. package/dist/core/mcp-computer-use-presets.js +158 -0
  84. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  85. package/dist/core/mcp-public-presets.d.ts +578 -0
  86. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  87. package/dist/core/mcp-public-presets.js +647 -0
  88. package/dist/core/mcp-public-presets.js.map +1 -0
  89. package/dist/core/model-registry.d.ts.map +1 -1
  90. package/dist/core/model-registry.js +1 -0
  91. package/dist/core/model-registry.js.map +1 -1
  92. package/dist/core/pi-package-intake-candidates.d.ts +14 -1
  93. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -1
  94. package/dist/core/pi-package-intake-candidates.js +182 -0
  95. package/dist/core/pi-package-intake-candidates.js.map +1 -1
  96. package/dist/core/pi-package-intake.d.ts +8 -1
  97. package/dist/core/pi-package-intake.d.ts.map +1 -1
  98. package/dist/core/pi-package-intake.js +14 -4
  99. package/dist/core/pi-package-intake.js.map +1 -1
  100. package/dist/core/reverse-skill.d.ts +2 -0
  101. package/dist/core/reverse-skill.d.ts.map +1 -0
  102. package/dist/core/reverse-skill.js +7 -0
  103. package/dist/core/reverse-skill.js.map +1 -0
  104. package/dist/core/settings-manager.d.ts +3 -3
  105. package/dist/core/settings-manager.d.ts.map +1 -1
  106. package/dist/core/settings-manager.js.map +1 -1
  107. package/dist/core/system-prompt.d.ts +2 -0
  108. package/dist/core/system-prompt.d.ts.map +1 -1
  109. package/dist/core/system-prompt.js +58 -5
  110. package/dist/core/system-prompt.js.map +1 -1
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +1 -0
  114. package/dist/index.js.map +1 -1
  115. package/dist/migrations.d.ts +19 -0
  116. package/dist/migrations.d.ts.map +1 -1
  117. package/dist/migrations.js +39 -15
  118. package/dist/migrations.js.map +1 -1
  119. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  120. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  122. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  123. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  124. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  125. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  126. package/dist/modes/interactive/components/control-panel-layout.d.ts +15 -1
  127. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/control-panel-layout.js +212 -68
  129. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  130. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/control-panel-runtime-status.js +10 -0
  132. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  133. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  134. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  135. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  136. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  137. package/dist/modes/interactive/components/control-panel.d.ts +8 -0
  138. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  139. package/dist/modes/interactive/components/control-panel.js +40 -8
  140. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  141. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  142. package/dist/modes/interactive/components/settings-selector.js +2 -1
  143. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  144. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  145. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  146. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  147. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  148. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  149. package/dist/modes/interactive/interactive-mode.js +63 -14
  150. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  151. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  152. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  153. package/dist/modes/interactive/theme/theme.js +2 -0
  154. package/dist/modes/interactive/theme/theme.js.map +1 -1
  155. package/docs/skills.md +8 -4
  156. package/docs/usage.md +4 -3
  157. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  158. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  159. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  160. package/examples/extensions/gondolin/package-lock.json +2 -2
  161. package/examples/extensions/gondolin/package.json +1 -1
  162. package/examples/extensions/preset.ts +2 -2
  163. package/examples/extensions/sandbox/package-lock.json +2 -2
  164. package/examples/extensions/sandbox/package.json +1 -1
  165. package/examples/extensions/with-deps/package-lock.json +2 -2
  166. package/examples/extensions/with-deps/package.json +1 -1
  167. package/npm-shrinkwrap.json +27 -34
  168. package/package.json +5 -5
@@ -0,0 +1,647 @@
1
+ import { createHash } from "node:crypto";
2
+ export const PUBLIC_MCP_PRESETS = {
3
+ context7: {
4
+ id: "context7",
5
+ key: "context7",
6
+ license: "MIT",
7
+ notes: ["Documentation retrieval preset; optional API key only raises rate limits."],
8
+ risk: "R1",
9
+ sourceUrls: ["https://github.com/upstash/context7"],
10
+ transport: {
11
+ type: "http",
12
+ url: "https://mcp.context7.com/mcp",
13
+ },
14
+ secrets: {
15
+ optional: ["CONTEXT7_API_KEY"],
16
+ headers: {
17
+ CONTEXT7_API_KEY: "secret-ref:context7",
18
+ },
19
+ },
20
+ tools: {
21
+ allow: ["resolve-library-id", "query-docs"],
22
+ denyByDefault: true,
23
+ },
24
+ policy: {
25
+ cacheable: true,
26
+ maxOutputTokens: 6000,
27
+ outputGuard: true,
28
+ promptTaint: "external-docs",
29
+ readOnly: true,
30
+ },
31
+ },
32
+ exa: {
33
+ id: "exa",
34
+ key: "exa",
35
+ license: "MIT",
36
+ notes: ["Run searches in forked context and return distilled output to the main task."],
37
+ risk: "R1",
38
+ sourceUrls: ["https://github.com/exa-labs/exa-mcp-server"],
39
+ transport: {
40
+ type: "http",
41
+ url: "https://mcp.exa.ai/mcp",
42
+ },
43
+ auth: {
44
+ kind: "header",
45
+ header: "Authorization",
46
+ secretRef: "secret-ref:exa_api_key",
47
+ },
48
+ secrets: {
49
+ optional: ["EXA_API_KEY"],
50
+ },
51
+ tools: {
52
+ allow: ["web_search_exa", "web_fetch_exa"],
53
+ conditionalAllow: ["web_search_advanced_exa"],
54
+ denyByDefault: true,
55
+ },
56
+ policy: {
57
+ blockPrivateNetwork: true,
58
+ distillBeforeMainContext: true,
59
+ domainAllowlistOptional: true,
60
+ forkContext: true,
61
+ maxOutputTokens: 5000,
62
+ maxResults: 10,
63
+ ssrfGuard: true,
64
+ },
65
+ },
66
+ githubReadOnly: {
67
+ id: "github-readonly",
68
+ key: "githubReadOnly",
69
+ license: "MIT",
70
+ notes: ["Read-only GitHub MCP profile; mutation tools remain gated for future explicit workflows."],
71
+ risk: "R2",
72
+ sourceUrls: ["https://github.com/github/github-mcp-server"],
73
+ transport: {
74
+ type: "http",
75
+ url: "https://api.githubcopilot.com/mcp/",
76
+ },
77
+ auth: {
78
+ kind: "bearer",
79
+ secretRef: "secret-ref:github_pat",
80
+ },
81
+ secrets: {
82
+ required: ["GITHUB_PERSONAL_ACCESS_TOKEN"],
83
+ },
84
+ tools: {
85
+ allow: [
86
+ "actions_list",
87
+ "get_file_contents",
88
+ "issue_read",
89
+ "list_issues",
90
+ "list_pull_requests",
91
+ "pull_request_read",
92
+ "search_code",
93
+ "search_issues",
94
+ "search_pull_requests",
95
+ "search_repositories",
96
+ ],
97
+ denyByDefault: true,
98
+ requirePostconditions: [
99
+ "add_comment_to_pending_review",
100
+ "create_branch",
101
+ "create_or_update_file",
102
+ "create_pull_request",
103
+ "delete_file",
104
+ "issue_write",
105
+ "merge_pull_request",
106
+ "pull_request_review_write",
107
+ "push_files",
108
+ "update_pull_request",
109
+ "update_pull_request_branch",
110
+ ],
111
+ },
112
+ policy: {
113
+ ledger: true,
114
+ maxOutputTokens: 8000,
115
+ mutationsRequireHumanGate: true,
116
+ readOnly: true,
117
+ secretBrokerOnly: true,
118
+ },
119
+ },
120
+ astGrep: {
121
+ id: "ast-grep",
122
+ key: "astGrep",
123
+ license: "MIT",
124
+ notes: ["Experimental upstream; pin descriptor and wrap execution before broad enablement."],
125
+ risk: "R1",
126
+ sourceUrls: ["https://github.com/ast-grep/ast-grep-mcp"],
127
+ transport: {
128
+ type: "stdio",
129
+ command: "uvx",
130
+ args: ["--from", "git+https://github.com/ast-grep/ast-grep-mcp", "ast-grep-server"],
131
+ },
132
+ tools: {
133
+ allow: ["dump_syntax_tree", "find_code", "find_code_by_rule", "test_match_code_rule"],
134
+ denyByDefault: true,
135
+ },
136
+ policy: {
137
+ descriptorHashPinned: true,
138
+ maxResults: 200,
139
+ noShell: true,
140
+ workspaceReadOnly: true,
141
+ },
142
+ },
143
+ repomixCodeCompact: {
144
+ defaultEnabled: true,
145
+ id: "repomix-code-compact",
146
+ implementation: "upstream-mcp",
147
+ key: "repomixCodeCompact",
148
+ license: "MIT",
149
+ notes: [
150
+ "Codebase packing and compression preset; remote repository packing is disabled until a task explicitly opts in.",
151
+ "Use grep/read against packed output before full-context attachment.",
152
+ ],
153
+ readiness: "stable",
154
+ risk: "R1",
155
+ sourceUrls: ["https://github.com/yamadashy/repomix"],
156
+ transport: {
157
+ type: "stdio",
158
+ command: "npx",
159
+ args: ["-y", "repomix", "--mcp"],
160
+ },
161
+ tools: {
162
+ allow: [
163
+ "attach_packed_output",
164
+ "file_system_read_directory",
165
+ "grep_repomix_output",
166
+ "pack_codebase",
167
+ "read_repomix_output",
168
+ ],
169
+ disabledByDefault: ["pack_remote_repository"],
170
+ gated: ["file_system_read_file"],
171
+ denyByDefault: true,
172
+ },
173
+ policy: {
174
+ absolutePathMustBeUnderWorkspace: true,
175
+ blockRemoteRepositoryByDefault: true,
176
+ descriptorHashPinned: true,
177
+ evidenceLedger: true,
178
+ maxOutputTokens: 120_000,
179
+ outputGuard: true,
180
+ preferGrepBeforeFullRead: true,
181
+ preferIncrementalRead: true,
182
+ secretScanRequired: true,
183
+ workspaceReadOnly: true,
184
+ },
185
+ },
186
+ omkLlmlinguaCompress: {
187
+ defaultEnabled: true,
188
+ id: "omk-llmlingua-compress",
189
+ implementation: "omk-owned",
190
+ key: "omkLlmlinguaCompress",
191
+ license: "MIT",
192
+ notes: [
193
+ "First-party wrapper target for LLMLingua-style prompt and context compression.",
194
+ "System prompts, latest user turns, and tool schemas must stay outside lossy compression.",
195
+ ],
196
+ readiness: "stable",
197
+ risk: "R1",
198
+ sourceUrls: ["https://github.com/microsoft/LLMLingua", "https://arxiv.org/abs/2403.12968"],
199
+ transport: {
200
+ type: "embedded-python-or-sidecar",
201
+ package: "llmlingua",
202
+ },
203
+ tools: {
204
+ allow: [
205
+ "compress_context_items",
206
+ "compress_messages",
207
+ "compress_prompt",
208
+ "compress_representation_candidate",
209
+ "verify_compression_coverage",
210
+ ],
211
+ denyByDefault: true,
212
+ },
213
+ policy: {
214
+ cacheMaterializedOutputs: true,
215
+ defaultCompressionRatio: 3,
216
+ evidenceLedger: true,
217
+ localOnly: true,
218
+ maxCompressionRatio: 8,
219
+ maxInputTokens: 200_000,
220
+ noFilesystemReadExceptModelCache: true,
221
+ noNetwork: true,
222
+ outputGuard: true,
223
+ rejectIfCoverageBelow: {
224
+ hard: 0.95,
225
+ high: 0.8,
226
+ medium: 0.55,
227
+ low: 0.3,
228
+ },
229
+ requireCoverageVerification: true,
230
+ },
231
+ },
232
+ doclingUnderstand: {
233
+ defaultEnabled: true,
234
+ id: "docling-understand",
235
+ implementation: "upstream-mcp",
236
+ key: "doclingUnderstand",
237
+ license: "MIT",
238
+ notes: [
239
+ "Structured document understanding preset for PDFs, Office files, tables, OCR, and layout-sensitive conversions.",
240
+ "Parser attack surface requires sandboxing and workspace-only local file access.",
241
+ ],
242
+ readiness: "stable",
243
+ risk: "R2",
244
+ sourceUrls: ["https://github.com/docling-project/docling", "https://github.com/docling-project/docling-mcp"],
245
+ transport: {
246
+ type: "stdio",
247
+ command: "uvx",
248
+ args: ["--from=docling-mcp", "docling-mcp-server", "--transport", "stdio"],
249
+ },
250
+ tools: {
251
+ allow: ["convert_document", "export_docling_document_to_json", "export_docling_document_to_markdown"],
252
+ gated: ["create_new_docling_document", "save_docling_document"],
253
+ denyByDefault: true,
254
+ },
255
+ policy: {
256
+ blockNetworkUrlsByDefault: true,
257
+ cacheDocuments: true,
258
+ evidenceLedger: true,
259
+ localFilesUnderWorkspaceOnly: true,
260
+ maxInputBytes: 80_000_000,
261
+ maxOutputTokens: 80_000,
262
+ outputGuard: true,
263
+ requiresSandbox: true,
264
+ },
265
+ },
266
+ markitdownLite: {
267
+ defaultEnabled: true,
268
+ id: "markitdown-lite",
269
+ implementation: "upstream-mcp",
270
+ key: "markitdownLite",
271
+ license: "MIT",
272
+ notes: [
273
+ "Lightweight Markdown conversion fallback for local files and data URIs.",
274
+ "HTTP, ZIP, and YouTube inputs stay blocked until a task explicitly needs them.",
275
+ ],
276
+ readiness: "stable",
277
+ risk: "R2",
278
+ sourceUrls: [
279
+ "https://github.com/microsoft/markitdown",
280
+ "https://github.com/microsoft/markitdown/tree/main/packages/markitdown-mcp",
281
+ ],
282
+ transport: {
283
+ type: "stdio",
284
+ command: "markitdown-mcp",
285
+ args: [],
286
+ },
287
+ tools: {
288
+ allow: ["convert_to_markdown"],
289
+ denyByDefault: true,
290
+ },
291
+ policy: {
292
+ allowedUriSchemes: ["file", "data"],
293
+ blockHttpByDefault: true,
294
+ denyYoutubeByDefault: true,
295
+ denyZipByDefault: true,
296
+ evidenceLedger: true,
297
+ fileRoot: "workspaceRoot",
298
+ maxInputBytes: 30_000_000,
299
+ maxOutputTokens: 50_000,
300
+ outputGuard: true,
301
+ requiresSandbox: true,
302
+ },
303
+ },
304
+ firecrawlWebUnderstand: {
305
+ defaultEnabled: false,
306
+ id: "firecrawl-web-understand",
307
+ implementation: "upstream-mcp",
308
+ key: "firecrawlWebUnderstand",
309
+ license: "MIT",
310
+ notes: [
311
+ "Opt-in live web understanding preset; search and scrape are the only default-admissible tools.",
312
+ "Prefer JSON extraction over full-page Markdown to protect the context budget.",
313
+ ],
314
+ readiness: "stable",
315
+ risk: "R2",
316
+ sourceUrls: ["https://github.com/firecrawl/firecrawl-mcp-server"],
317
+ transport: {
318
+ type: "http",
319
+ url: "https://mcp.firecrawl.dev/v2/mcp",
320
+ },
321
+ auth: {
322
+ kind: "bearer",
323
+ secretRef: "secret-ref:firecrawl_api_key",
324
+ },
325
+ secrets: {
326
+ optional: ["FIRECRAWL_API_KEY", "FIRECRAWL_OAUTH_TOKEN"],
327
+ },
328
+ tools: {
329
+ allow: ["firecrawl_scrape", "firecrawl_search"],
330
+ disabledByDefault: ["firecrawl_agent", "firecrawl_crawl", "firecrawl_interact", "firecrawl_monitor"],
331
+ gated: ["firecrawl_extract", "firecrawl_map", "firecrawl_research"],
332
+ denyByDefault: true,
333
+ },
334
+ policy: {
335
+ blockMetadataIp: true,
336
+ blockPrivateNetwork: true,
337
+ distillBeforeMainContext: true,
338
+ evidenceLedger: true,
339
+ forkContext: true,
340
+ markdownFullPageRequiresExplicitNeed: true,
341
+ maxOutputTokens: 40_000,
342
+ maxUrlsPerTask: 10,
343
+ outputGuard: true,
344
+ preferJsonExtraction: true,
345
+ requireOriginAllowlistForScrape: true,
346
+ },
347
+ },
348
+ deepwikiRepoUnderstandCandidate: {
349
+ defaultEnabled: false,
350
+ id: "deepwiki-repo-understand",
351
+ implementation: "candidate-wrapper",
352
+ key: "deepwikiRepoUnderstandCandidate",
353
+ license: "Unspecified",
354
+ notes: [
355
+ "Candidate only until an official MCP endpoint, tool schema, auth model, and retention boundary are verified.",
356
+ "Remote repository indexing is public-repo-only by default.",
357
+ ],
358
+ readiness: "candidate",
359
+ risk: "R2",
360
+ sourceUrls: ["https://deepwiki.com/"],
361
+ tools: {
362
+ allow: [],
363
+ denyByDefault: true,
364
+ },
365
+ policy: {
366
+ descriptorHashPinned: true,
367
+ evidenceLedger: true,
368
+ noSecrets: true,
369
+ outputGuard: true,
370
+ privateRepoDeniedByDefault: true,
371
+ publicReposOnly: true,
372
+ },
373
+ },
374
+ insaneSearchCandidate: {
375
+ defaultEnabled: false,
376
+ id: "insane-search-public-reader",
377
+ implementation: "candidate-wrapper",
378
+ key: "insaneSearchCandidate",
379
+ license: "MIT",
380
+ notes: [
381
+ "Candidate only: upstream is a Claude Code plugin, not a verified standalone MCP transport.",
382
+ "Any OMK integration must be a sandboxed first-party wrapper around public-content reads, with auto-install disabled.",
383
+ ],
384
+ readiness: "candidate",
385
+ risk: "R3",
386
+ sourceUrls: ["https://github.com/fivetaku/insane-search"],
387
+ tools: {
388
+ allow: ["insane_search_public_read"],
389
+ disabledByDefault: ["insane_search_auto_install_dependencies"],
390
+ gated: ["insane_search_browser_escalation"],
391
+ denyByDefault: true,
392
+ },
393
+ policy: {
394
+ authenticationBoundaryRequired: true,
395
+ blockMetadataIp: true,
396
+ blockPrivateNetwork: true,
397
+ disableAutoInstall: true,
398
+ distillBeforeMainContext: true,
399
+ evidenceLedger: true,
400
+ forkContext: true,
401
+ maxBrowserActions: 20,
402
+ maxOutputTokens: 30_000,
403
+ outputGuard: true,
404
+ publicContentOnly: true,
405
+ requiresOriginAllowlist: true,
406
+ requiresSandbox: true,
407
+ },
408
+ },
409
+ playwrightSandboxed: {
410
+ id: "playwright-sandboxed",
411
+ key: "playwrightSandboxed",
412
+ license: "Apache-2.0",
413
+ notes: ["Browser automation preset; enable only with sandbox and origin controls."],
414
+ risk: "R3",
415
+ sourceUrls: ["https://github.com/microsoft/playwright-mcp"],
416
+ transport: {
417
+ type: "local-package",
418
+ package: "@playwright/mcp",
419
+ },
420
+ tools: {
421
+ allow: [
422
+ "browser_close",
423
+ "browser_click",
424
+ "browser_navigate",
425
+ "browser_snapshot",
426
+ "browser_type",
427
+ "browser_wait_for",
428
+ ],
429
+ deny: ["browser_console_messages", "browser_file_upload", "browser_pdf_save", "browser_press_key"],
430
+ denyByDefault: true,
431
+ },
432
+ policy: {
433
+ blockMetadataIp: true,
434
+ blockPrivateNetwork: true,
435
+ ledger: true,
436
+ maxBrowserActions: 40,
437
+ recordEvidence: true,
438
+ requiresExplicitPostconditions: true,
439
+ requiresOriginAllowlist: true,
440
+ requiresSandbox: true,
441
+ },
442
+ },
443
+ microsoftLearn: {
444
+ id: "microsoft-learn",
445
+ key: "microsoftLearn",
446
+ license: "Unspecified",
447
+ notes: ["Microsoft official remote documentation endpoint from the Microsoft MCP catalog."],
448
+ risk: "R1",
449
+ sourceUrls: ["https://github.com/microsoft/mcp"],
450
+ transport: {
451
+ type: "http",
452
+ url: "https://learn.microsoft.com/api/mcp",
453
+ },
454
+ tools: {
455
+ allow: ["*"],
456
+ denyByDefault: true,
457
+ denyMutations: true,
458
+ },
459
+ policy: {
460
+ cacheable: true,
461
+ maxOutputTokens: 6000,
462
+ outputGuard: true,
463
+ promptTaint: "external-docs",
464
+ readOnly: true,
465
+ },
466
+ },
467
+ officialReferenceSafePack: {
468
+ id: "official-reference-safe-pack",
469
+ key: "officialReferenceSafePack",
470
+ license: "Apache-2.0/MIT/CC-BY-4.0",
471
+ notes: ["Reference implementations only; wrap before production use."],
472
+ risk: "R1",
473
+ sourceUrls: ["https://github.com/modelcontextprotocol/servers"],
474
+ servers: ["time", "memory", "sequential-thinking", "git-readonly"],
475
+ tools: {
476
+ allow: [],
477
+ denyByDefault: true,
478
+ },
479
+ policy: {
480
+ blockPrivateNetwork: true,
481
+ descriptorHashPinned: true,
482
+ filesystemRoot: "workspaceRoot",
483
+ mutationsRequirePostconditions: true,
484
+ },
485
+ },
486
+ };
487
+ export const OMK_PUBLIC_CONTEXT_MCP_BUNDLE = {
488
+ stableDefaults: ["repomix-code-compact", "docling-understand", "markitdown-lite", "omk-llmlingua-compress"],
489
+ optInResearchWeb: ["firecrawl-web-understand"],
490
+ candidatesNeedVerification: ["deepwiki-repo-understand", "insane-search-public-reader"],
491
+ internalRouters: ["mcp-tool-rag-router"],
492
+ };
493
+ export function listPublicMcpPresets() {
494
+ return Object.values(PUBLIC_MCP_PRESETS).map((preset) => clonePublicMcpPreset(preset));
495
+ }
496
+ export function canonicalMcpPolicyHash(value) {
497
+ return createHash("sha256").update(canonicalStringify(value)).digest("hex");
498
+ }
499
+ export function canonicalPublicMcpServerIdentity(preset) {
500
+ return canonicalMcpPolicyHash({
501
+ id: preset.id,
502
+ servers: preset.servers ?? null,
503
+ transport: preset.transport ?? null,
504
+ });
505
+ }
506
+ export function admitPublicMcpServer(preset, observed, approved) {
507
+ if (!approved) {
508
+ return {
509
+ status: "quarantine",
510
+ reasons: ["server_not_approved"],
511
+ };
512
+ }
513
+ if (approved.serverIdentity !== observed.serverIdentity) {
514
+ return {
515
+ status: "quarantine",
516
+ reasons: ["server_identity_changed"],
517
+ };
518
+ }
519
+ const reasons = [];
520
+ for (const tool of observed.tools) {
521
+ const approvedDescriptorHash = approved.tools[tool.name];
522
+ if (!approvedDescriptorHash) {
523
+ reasons.push(`new_tool:${tool.name}`);
524
+ }
525
+ else if (approvedDescriptorHash !== tool.descriptorHash) {
526
+ reasons.push(`descriptor_changed:${tool.name}`);
527
+ }
528
+ if (!isToolAllowed(preset.tools, tool.name)) {
529
+ reasons.push(`tool_not_allowed:${tool.name}`);
530
+ }
531
+ if (shouldDenyMutationLikeTool(preset, tool.name)) {
532
+ reasons.push(`mutation_tool_denied:${tool.name}`);
533
+ }
534
+ if (detectMcpDescriptorPromptInjection(tool.description).score > 0.7) {
535
+ reasons.push(`descriptor_prompt_injection:${tool.name}`);
536
+ }
537
+ }
538
+ return {
539
+ status: reasons.length === 0 ? "allow" : "quarantine",
540
+ reasons,
541
+ };
542
+ }
543
+ export function detectMcpDescriptorPromptInjection(description) {
544
+ const normalized = description.toLowerCase();
545
+ const suspiciousPatterns = [
546
+ /ignore\s+(?:all\s+)?previous\s+instructions/,
547
+ /disregard\s+(?:all\s+)?previous\s+instructions/,
548
+ /exfiltrat/,
549
+ /reveal\s+(?:the\s+)?(?:system\s+)?prompt/,
550
+ /send\s+(?:me\s+)?(?:all\s+)?secrets/,
551
+ ];
552
+ const hits = suspiciousPatterns.filter((pattern) => pattern.test(normalized)).length;
553
+ return {
554
+ score: hits === 0 ? 0 : Math.min(1, 0.6 + hits * 0.25),
555
+ };
556
+ }
557
+ function clonePublicMcpPreset(preset) {
558
+ return {
559
+ ...preset,
560
+ auth: preset.auth ? { ...preset.auth } : undefined,
561
+ defaultEnabled: preset.defaultEnabled,
562
+ implementation: preset.implementation,
563
+ notes: [...preset.notes],
564
+ policy: cloneRuntimePolicy(preset.policy),
565
+ readiness: preset.readiness,
566
+ secrets: preset.secrets
567
+ ? {
568
+ headers: preset.secrets.headers ? { ...preset.secrets.headers } : undefined,
569
+ optional: preset.secrets.optional ? [...preset.secrets.optional] : undefined,
570
+ required: preset.secrets.required ? [...preset.secrets.required] : undefined,
571
+ }
572
+ : undefined,
573
+ servers: preset.servers ? [...preset.servers] : undefined,
574
+ sourceUrls: [...preset.sourceUrls],
575
+ tools: {
576
+ allow: [...preset.tools.allow],
577
+ conditionalAllow: preset.tools.conditionalAllow ? [...preset.tools.conditionalAllow] : undefined,
578
+ deny: preset.tools.deny ? [...preset.tools.deny] : undefined,
579
+ denyByDefault: preset.tools.denyByDefault,
580
+ denyMutations: preset.tools.denyMutations,
581
+ disabledByDefault: preset.tools.disabledByDefault ? [...preset.tools.disabledByDefault] : undefined,
582
+ gated: preset.tools.gated ? [...preset.tools.gated] : undefined,
583
+ requirePostconditions: preset.tools.requirePostconditions
584
+ ? [...preset.tools.requirePostconditions]
585
+ : undefined,
586
+ },
587
+ transport: preset.transport ? cloneTransport(preset.transport) : undefined,
588
+ };
589
+ }
590
+ function cloneTransport(transport) {
591
+ if (transport.type === "stdio") {
592
+ return {
593
+ ...transport,
594
+ args: [...transport.args],
595
+ };
596
+ }
597
+ if (transport.type === "local-package") {
598
+ return {
599
+ ...transport,
600
+ args: transport.args ? [...transport.args] : undefined,
601
+ };
602
+ }
603
+ if (transport.type === "embedded-python-or-sidecar") {
604
+ return { ...transport };
605
+ }
606
+ return { ...transport };
607
+ }
608
+ function cloneRuntimePolicy(policy) {
609
+ return {
610
+ ...policy,
611
+ allowedUriSchemes: policy.allowedUriSchemes ? [...policy.allowedUriSchemes] : undefined,
612
+ rejectIfCoverageBelow: policy.rejectIfCoverageBelow ? { ...policy.rejectIfCoverageBelow } : undefined,
613
+ };
614
+ }
615
+ function isToolAllowed(policy, toolName) {
616
+ if (policy.deny?.includes(toolName)) {
617
+ return false;
618
+ }
619
+ if (policy.allow.includes("*")) {
620
+ return true;
621
+ }
622
+ return policy.allow.includes(toolName);
623
+ }
624
+ function shouldDenyMutationLikeTool(preset, toolName) {
625
+ if (!preset.tools.allow.includes("*")) {
626
+ return false;
627
+ }
628
+ if (!preset.tools.denyMutations && !preset.policy.readOnly && !preset.policy.mutationsRequirePostconditions) {
629
+ return false;
630
+ }
631
+ return isMutationLikeToolName(toolName);
632
+ }
633
+ function isMutationLikeToolName(toolName) {
634
+ return /(?:^|[_-])(add|approve|archive|cancel|close|create|delete|dismiss|merge|post|push|remove|send|submit|update|upload|write)(?:$|[_-])/.test(toolName.toLowerCase());
635
+ }
636
+ function canonicalStringify(value) {
637
+ if (value === null || typeof value === "boolean" || typeof value === "number" || typeof value === "string") {
638
+ return JSON.stringify(value);
639
+ }
640
+ if (Array.isArray(value)) {
641
+ return `[${value.map((item) => canonicalStringify(item)).join(",")}]`;
642
+ }
643
+ const record = value;
644
+ const keys = Object.keys(record).sort();
645
+ return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalStringify(record[key])}`).join(",")}}`;
646
+ }
647
+ //# sourceMappingURL=mcp-public-presets.js.map