open-multi-agent-kit 0.90.0 → 0.90.4

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