@creezio/mcp-facade 0.22.0

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 (174) hide show
  1. package/README.md +420 -0
  2. package/dist/.creezio-src-hash.json +4 -0
  3. package/dist/admin/adapters.d.ts +10 -0
  4. package/dist/admin/adapters.d.ts.map +1 -0
  5. package/dist/admin/adapters.js +21 -0
  6. package/dist/admin/adapters.js.map +1 -0
  7. package/dist/admin/http-routes.d.ts +11 -0
  8. package/dist/admin/http-routes.d.ts.map +1 -0
  9. package/dist/admin/http-routes.js +66 -0
  10. package/dist/admin/http-routes.js.map +1 -0
  11. package/dist/admin/index.d.ts +12 -0
  12. package/dist/admin/index.d.ts.map +1 -0
  13. package/dist/admin/index.js +8 -0
  14. package/dist/admin/index.js.map +1 -0
  15. package/dist/admin/mcp-admin.d.ts +165 -0
  16. package/dist/admin/mcp-admin.d.ts.map +1 -0
  17. package/dist/admin/mcp-admin.js +419 -0
  18. package/dist/admin/mcp-admin.js.map +1 -0
  19. package/dist/admin/tool-policy-guard.d.ts +106 -0
  20. package/dist/admin/tool-policy-guard.d.ts.map +1 -0
  21. package/dist/admin/tool-policy-guard.js +187 -0
  22. package/dist/admin/tool-policy-guard.js.map +1 -0
  23. package/dist/admin/types.d.ts +62 -0
  24. package/dist/admin/types.d.ts.map +1 -0
  25. package/dist/admin/types.js +6 -0
  26. package/dist/admin/types.js.map +1 -0
  27. package/dist/brand-facade.d.ts +41 -0
  28. package/dist/brand-facade.d.ts.map +1 -0
  29. package/dist/brand-facade.js +67 -0
  30. package/dist/brand-facade.js.map +1 -0
  31. package/dist/core-tools.d.ts +22 -0
  32. package/dist/core-tools.d.ts.map +1 -0
  33. package/dist/core-tools.js +93 -0
  34. package/dist/core-tools.js.map +1 -0
  35. package/dist/dyn-import.d.ts +13 -0
  36. package/dist/dyn-import.d.ts.map +1 -0
  37. package/dist/dyn-import.js +2 -0
  38. package/dist/dyn-import.js.map +1 -0
  39. package/dist/facade.d.ts +40 -0
  40. package/dist/facade.d.ts.map +1 -0
  41. package/dist/facade.js +334 -0
  42. package/dist/facade.js.map +1 -0
  43. package/dist/hono-bind.d.ts +48 -0
  44. package/dist/hono-bind.d.ts.map +1 -0
  45. package/dist/hono-bind.js +70 -0
  46. package/dist/hono-bind.js.map +1 -0
  47. package/dist/hono-proxy.d.ts +63 -0
  48. package/dist/hono-proxy.d.ts.map +1 -0
  49. package/dist/hono-proxy.js +185 -0
  50. package/dist/hono-proxy.js.map +1 -0
  51. package/dist/index.d.ts +32 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +23 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/jwt.d.ts +20 -0
  56. package/dist/jwt.d.ts.map +1 -0
  57. package/dist/jwt.js +84 -0
  58. package/dist/jwt.js.map +1 -0
  59. package/dist/module-ops-tools.d.ts +43 -0
  60. package/dist/module-ops-tools.d.ts.map +1 -0
  61. package/dist/module-ops-tools.js +301 -0
  62. package/dist/module-ops-tools.js.map +1 -0
  63. package/dist/namespace.d.ts +23 -0
  64. package/dist/namespace.d.ts.map +1 -0
  65. package/dist/namespace.js +51 -0
  66. package/dist/namespace.js.map +1 -0
  67. package/dist/oauth/cors-policy.d.ts +3 -0
  68. package/dist/oauth/cors-policy.d.ts.map +1 -0
  69. package/dist/oauth/cors-policy.js +25 -0
  70. package/dist/oauth/cors-policy.js.map +1 -0
  71. package/dist/oauth/hono-app.d.ts +18 -0
  72. package/dist/oauth/hono-app.d.ts.map +1 -0
  73. package/dist/oauth/hono-app.js +175 -0
  74. package/dist/oauth/hono-app.js.map +1 -0
  75. package/dist/oauth/index.d.ts +9 -0
  76. package/dist/oauth/index.d.ts.map +1 -0
  77. package/dist/oauth/index.js +6 -0
  78. package/dist/oauth/index.js.map +1 -0
  79. package/dist/oauth/rate-limit.d.ts +11 -0
  80. package/dist/oauth/rate-limit.d.ts.map +1 -0
  81. package/dist/oauth/rate-limit.js +32 -0
  82. package/dist/oauth/rate-limit.js.map +1 -0
  83. package/dist/oauth/routes.d.ts +8 -0
  84. package/dist/oauth/routes.d.ts.map +1 -0
  85. package/dist/oauth/routes.js +671 -0
  86. package/dist/oauth/routes.js.map +1 -0
  87. package/dist/oauth/store.d.ts +113 -0
  88. package/dist/oauth/store.d.ts.map +1 -0
  89. package/dist/oauth/store.js +390 -0
  90. package/dist/oauth/store.js.map +1 -0
  91. package/dist/oauth/types.d.ts +97 -0
  92. package/dist/oauth/types.d.ts.map +1 -0
  93. package/dist/oauth/types.js +5 -0
  94. package/dist/oauth/types.js.map +1 -0
  95. package/dist/open-external-tab-host-tools.d.ts +67 -0
  96. package/dist/open-external-tab-host-tools.d.ts.map +1 -0
  97. package/dist/open-external-tab-host-tools.js +92 -0
  98. package/dist/open-external-tab-host-tools.js.map +1 -0
  99. package/dist/policy.d.ts +59 -0
  100. package/dist/policy.d.ts.map +1 -0
  101. package/dist/policy.js +88 -0
  102. package/dist/policy.js.map +1 -0
  103. package/dist/runtime.d.ts +22 -0
  104. package/dist/runtime.d.ts.map +1 -0
  105. package/dist/runtime.js +20 -0
  106. package/dist/runtime.js.map +1 -0
  107. package/dist/types.d.ts +163 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +2 -0
  110. package/dist/types.js.map +1 -0
  111. package/dist-cjs/admin/adapters.js +27 -0
  112. package/dist-cjs/admin/adapters.js.map +1 -0
  113. package/dist-cjs/admin/http-routes.js +69 -0
  114. package/dist-cjs/admin/http-routes.js.map +1 -0
  115. package/dist-cjs/admin/index.js +40 -0
  116. package/dist-cjs/admin/index.js.map +1 -0
  117. package/dist-cjs/admin/mcp-admin.js +441 -0
  118. package/dist-cjs/admin/mcp-admin.js.map +1 -0
  119. package/dist-cjs/admin/tool-policy-guard.js +193 -0
  120. package/dist-cjs/admin/tool-policy-guard.js.map +1 -0
  121. package/dist-cjs/admin/types.js +7 -0
  122. package/dist-cjs/admin/types.js.map +1 -0
  123. package/dist-cjs/brand-facade.js +70 -0
  124. package/dist-cjs/brand-facade.js.map +1 -0
  125. package/dist-cjs/core-tools.js +97 -0
  126. package/dist-cjs/core-tools.js.map +1 -0
  127. package/dist-cjs/dyn-import.js +5 -0
  128. package/dist-cjs/dyn-import.js.map +1 -0
  129. package/dist-cjs/facade.js +337 -0
  130. package/dist-cjs/facade.js.map +1 -0
  131. package/dist-cjs/hono-bind.js +74 -0
  132. package/dist-cjs/hono-bind.js.map +1 -0
  133. package/dist-cjs/hono-proxy.js +189 -0
  134. package/dist-cjs/hono-proxy.js.map +1 -0
  135. package/dist-cjs/index.js +120 -0
  136. package/dist-cjs/index.js.map +1 -0
  137. package/dist-cjs/jwt.js +91 -0
  138. package/dist-cjs/jwt.js.map +1 -0
  139. package/dist-cjs/module-ops-tools.js +308 -0
  140. package/dist-cjs/module-ops-tools.js.map +1 -0
  141. package/dist-cjs/namespace.js +56 -0
  142. package/dist-cjs/namespace.js.map +1 -0
  143. package/dist-cjs/oauth/cors-policy.js +29 -0
  144. package/dist-cjs/oauth/cors-policy.js.map +1 -0
  145. package/dist-cjs/oauth/hono-app.js +178 -0
  146. package/dist-cjs/oauth/hono-app.js.map +1 -0
  147. package/dist-cjs/oauth/index.js +48 -0
  148. package/dist-cjs/oauth/index.js.map +1 -0
  149. package/dist-cjs/oauth/rate-limit.js +37 -0
  150. package/dist-cjs/oauth/rate-limit.js.map +1 -0
  151. package/dist-cjs/oauth/routes.js +674 -0
  152. package/dist-cjs/oauth/routes.js.map +1 -0
  153. package/dist-cjs/oauth/store.js +418 -0
  154. package/dist-cjs/oauth/store.js.map +1 -0
  155. package/dist-cjs/oauth/types.js +6 -0
  156. package/dist-cjs/oauth/types.js.map +1 -0
  157. package/dist-cjs/open-external-tab-host-tools.js +96 -0
  158. package/dist-cjs/open-external-tab-host-tools.js.map +1 -0
  159. package/dist-cjs/package.json +3 -0
  160. package/dist-cjs/policy.js +93 -0
  161. package/dist-cjs/policy.js.map +1 -0
  162. package/dist-cjs/runtime.js +24 -0
  163. package/dist-cjs/runtime.js.map +1 -0
  164. package/dist-cjs/types.js +3 -0
  165. package/dist-cjs/types.js.map +1 -0
  166. package/package.json +92 -0
  167. package/ui/index.ts +5 -0
  168. package/ui/mcp-admin-client.tsx +270 -0
  169. package/ui/primitives/badge.tsx +37 -0
  170. package/ui/primitives/button.tsx +44 -0
  171. package/ui/primitives/card.tsx +44 -0
  172. package/ui/primitives/cn.ts +6 -0
  173. package/ui/primitives/input.tsx +19 -0
  174. package/ui/primitives/tabs.tsx +51 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Garde d'enforcement réutilisable des policies MCP admin (M1).
3
+ *
4
+ * Trois surfaces, pour trois points d'entrée :
5
+ * - `checkToolPolicy` : décision brute (enabled/rôles/scopes) —
6
+ * utilisable par n'importe quel enforcement
7
+ * marque (ex. TF3 `registerMcpTool`) ;
8
+ * - `createToolPolicyAuthorize`: `McpAuthorizeToolCallFn` composable avec
9
+ * `composeToolPolicies` / `denyCrossLayerToolCall`
10
+ * pour la façade (`createBrandMcpFacade`) ;
11
+ * - `registerGuardedMcpTool` : wrapper serveur MCP SDK — annotations +
12
+ * policy + audit + scopes marque injectés.
13
+ *
14
+ * Aucune donnée marque : la résolution du rôle (`resolveRole`) et la logique
15
+ * scopes marque (`scopeAllows`) sont injectées. Les policies vivent dans la
16
+ * table `mcp_tool_policies` (adapters `configureMcpAdmin`) — mêmes lignes que
17
+ * la page /admin/mcp.
18
+ */
19
+ import type { McpAuthorizeContext, McpAuthorizeToolCallFn } from "../types.js";
20
+ import { auditMcpAdmin } from "./mcp-admin.js";
21
+ export type ToolPolicyDenialReason = "tool_disabled" | "role_forbidden" | "policy_scope_forbidden";
22
+ /** Vue minimale d'une policy — ce que la garde consomme. */
23
+ export type ToolPolicyView = {
24
+ enabled: boolean;
25
+ allowedRoles: string[];
26
+ allowedScopes: string[];
27
+ };
28
+ export type ToolPolicyActor = {
29
+ userId?: string | null;
30
+ /**
31
+ * Scopes accordés à l'acteur (string séparée espaces/virgules ou tableau).
32
+ * `null`/`undefined` = pas de modèle de scopes sur ce canal → la garde ne
33
+ * vérifie pas les scopes (les canaux OAuth/API key doivent passer `""` au
34
+ * minimum pour forcer la vérification).
35
+ */
36
+ scopes?: string | readonly string[] | null;
37
+ };
38
+ export type ToolPolicyGuardOptions = {
39
+ /** Résolution de la policy (défaut : table `mcp_tool_policies` des adapters). */
40
+ getPolicy?: (name: string) => ToolPolicyView | null | undefined;
41
+ /** Rôle de l'acteur (injecté par la marque — ex. getUserById(id)?.role). */
42
+ resolveRole?: (userId: string) => string | null | undefined;
43
+ /** Rôle par défaut quand user inconnu / non résolu (défaut "collaborator"). */
44
+ defaultRole?: string;
45
+ /** Scopes « accès complet » qui court-circuitent la policy (défaut ["crm","full"]). */
46
+ fullAccessScopes?: readonly string[];
47
+ /** Audit (défaut `auditMcpAdmin` du kit). */
48
+ audit?: typeof auditMcpAdmin;
49
+ };
50
+ /** Policy stockée, lue directement (indépendante du registre tools marque). */
51
+ export declare function getStoredMcpToolPolicy(name: string): ToolPolicyView | null;
52
+ /**
53
+ * Décision d'enforcement d'un tool pour un acteur.
54
+ * Retourne la raison du deny, ou `null` si autorisé.
55
+ *
56
+ * Sémantique (parité TempoFlow) :
57
+ * - policy absente ou `enabled=false` → "tool_disabled" ;
58
+ * - rôle (resolveRole(userId) sinon defaultRole) hors allowedRoles → "role_forbidden" ;
59
+ * - scopes fournis, aucun full-access ni allowedScope accordé → "policy_scope_forbidden"
60
+ * (allowedScopes vide = aucune restriction de scope configurée).
61
+ */
62
+ export declare function checkToolPolicy(name: string, actor: ToolPolicyActor, opts?: ToolPolicyGuardOptions): ToolPolicyDenialReason | null;
63
+ export type CreateToolPolicyAuthorizeOptions = ToolPolicyGuardOptions & {
64
+ /**
65
+ * Extraction de l'acteur depuis le contexte façade. Défaut : subject JWT
66
+ * (hors "anonymous"/"opaque-token") comme userId ; scopes depuis les
67
+ * claims (`scope` string OAuth ou `scopes`), sinon `null` (pas de scopes
68
+ * sur ce canal → pas de vérif scopes).
69
+ */
70
+ resolveActor?: (ctx: McpAuthorizeContext) => ToolPolicyActor;
71
+ };
72
+ /**
73
+ * `McpAuthorizeToolCallFn` (composable via `composeToolPolicies`) qui applique
74
+ * les policies admin. Opt-in non cassant : si aucun `getPolicy` custom n'est
75
+ * fourni ET que `configureMcpAdmin` n'a pas été câblé, la garde autorise tout
76
+ * (comportement identique à une façade sans admin MCP).
77
+ */
78
+ export declare function createToolPolicyAuthorize(opts?: CreateToolPolicyAuthorizeOptions): McpAuthorizeToolCallFn;
79
+ /** Surface minimale du serveur MCP SDK (`@modelcontextprotocol/sdk`). */
80
+ export type GuardedMcpServerLike = {
81
+ registerTool(name: string, config: Record<string, unknown>, handler: (input: any) => any): unknown;
82
+ };
83
+ export type GuardedMcpToolContext = {
84
+ userId?: string | null;
85
+ clientId?: string | null;
86
+ scopes?: string | null;
87
+ };
88
+ export type GuardedMcpToolDefinition = {
89
+ name: string;
90
+ requiredScope?: string;
91
+ annotations?: Record<string, boolean>;
92
+ };
93
+ export type RegisterGuardedMcpToolOptions = ToolPolicyGuardOptions & {
94
+ /**
95
+ * Vérification scopes marque supplémentaire (ex. apiKeyAllowsMethod) —
96
+ * deny `insufficient_scope` si false. Injectée par la marque.
97
+ */
98
+ scopeAllows?: (ctx: GuardedMcpToolContext, def: GuardedMcpToolDefinition) => boolean;
99
+ };
100
+ /**
101
+ * Enregistre un tool sur le serveur MCP SDK avec annotations + policy admin
102
+ * + audit + vérification scopes marque — SoT de l'enforcement TF-like
103
+ * (`registerMcpTool` des marques délègue ici, le registre métier reste marque).
104
+ */
105
+ export declare function registerGuardedMcpTool(server: GuardedMcpServerLike, ctx: GuardedMcpToolContext, def: GuardedMcpToolDefinition, config: Record<string, unknown>, handler: (input: any) => any, opts?: RegisterGuardedMcpToolOptions): void;
106
+ //# sourceMappingURL=tool-policy-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-policy-guard.d.ts","sourceRoot":"","sources":["../../src/admin/tool-policy-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Garde d'enforcement réutilisable des policies MCP admin (M1).
3
+ *
4
+ * Trois surfaces, pour trois points d'entrée :
5
+ * - `checkToolPolicy` : décision brute (enabled/rôles/scopes) —
6
+ * utilisable par n'importe quel enforcement
7
+ * marque (ex. TF3 `registerMcpTool`) ;
8
+ * - `createToolPolicyAuthorize`: `McpAuthorizeToolCallFn` composable avec
9
+ * `composeToolPolicies` / `denyCrossLayerToolCall`
10
+ * pour la façade (`createBrandMcpFacade`) ;
11
+ * - `registerGuardedMcpTool` : wrapper serveur MCP SDK — annotations +
12
+ * policy + audit + scopes marque injectés.
13
+ *
14
+ * Aucune donnée marque : la résolution du rôle (`resolveRole`) et la logique
15
+ * scopes marque (`scopeAllows`) sont injectées. Les policies vivent dans la
16
+ * table `mcp_tool_policies` (adapters `configureMcpAdmin`) — mêmes lignes que
17
+ * la page /admin/mcp.
18
+ */
19
+ import { getMcpAdminAdapters, isMcpAdminConfigured } from "./adapters.js";
20
+ import { auditMcpAdmin, ensureMcpAdminSchema } from "./mcp-admin.js";
21
+ function splitList(raw) {
22
+ return String(raw || "")
23
+ .split(/[\s,]+/)
24
+ .filter(Boolean);
25
+ }
26
+ function grantedScopeSet(scopes) {
27
+ if (Array.isArray(scopes))
28
+ return new Set(scopes.map(String).filter(Boolean));
29
+ return new Set(splitList(String(scopes)));
30
+ }
31
+ /** Policy stockée, lue directement (indépendante du registre tools marque). */
32
+ export function getStoredMcpToolPolicy(name) {
33
+ ensureMcpAdminSchema();
34
+ const row = getMcpAdminAdapters()
35
+ .getDb()
36
+ .prepare(`SELECT enabled, allowed_roles, allowed_scopes
37
+ FROM mcp_tool_policies WHERE tool_name = ?`)
38
+ .get(name);
39
+ if (!row)
40
+ return null;
41
+ return {
42
+ enabled: row.enabled !== 0,
43
+ allowedRoles: splitList(row.allowed_roles),
44
+ allowedScopes: splitList(row.allowed_scopes),
45
+ };
46
+ }
47
+ /**
48
+ * Décision d'enforcement d'un tool pour un acteur.
49
+ * Retourne la raison du deny, ou `null` si autorisé.
50
+ *
51
+ * Sémantique (parité TempoFlow) :
52
+ * - policy absente ou `enabled=false` → "tool_disabled" ;
53
+ * - rôle (resolveRole(userId) sinon defaultRole) hors allowedRoles → "role_forbidden" ;
54
+ * - scopes fournis, aucun full-access ni allowedScope accordé → "policy_scope_forbidden"
55
+ * (allowedScopes vide = aucune restriction de scope configurée).
56
+ */
57
+ export function checkToolPolicy(name, actor, opts = {}) {
58
+ const getPolicy = opts.getPolicy || getStoredMcpToolPolicy;
59
+ const policy = getPolicy(name);
60
+ if (!policy?.enabled)
61
+ return "tool_disabled";
62
+ const role = (actor.userId ? opts.resolveRole?.(actor.userId) : null) ||
63
+ opts.defaultRole ||
64
+ "collaborator";
65
+ if (!policy.allowedRoles.includes(role))
66
+ return "role_forbidden";
67
+ if (actor.scopes != null && policy.allowedScopes.length > 0) {
68
+ const granted = grantedScopeSet(actor.scopes);
69
+ const fullAccess = opts.fullAccessScopes || ["crm", "full"];
70
+ if (!fullAccess.some((scope) => granted.has(scope)) &&
71
+ !policy.allowedScopes.some((scope) => granted.has(scope))) {
72
+ return "policy_scope_forbidden";
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ function defaultResolveActor(ctx) {
78
+ const claims = ctx.claims || {};
79
+ const claimUserId = typeof claims.userId === "string" && claims.userId ? claims.userId : null;
80
+ const subject = ctx.subject && ctx.subject !== "anonymous" && ctx.subject !== "opaque-token"
81
+ ? ctx.subject
82
+ : null;
83
+ let scopes = null;
84
+ if (typeof claims.scope === "string")
85
+ scopes = claims.scope;
86
+ else if (Array.isArray(claims.scopes))
87
+ scopes = claims.scopes.map(String);
88
+ else if (typeof claims.scopes === "string")
89
+ scopes = claims.scopes;
90
+ return { userId: claimUserId ?? subject, scopes };
91
+ }
92
+ /**
93
+ * `McpAuthorizeToolCallFn` (composable via `composeToolPolicies`) qui applique
94
+ * les policies admin. Opt-in non cassant : si aucun `getPolicy` custom n'est
95
+ * fourni ET que `configureMcpAdmin` n'a pas été câblé, la garde autorise tout
96
+ * (comportement identique à une façade sans admin MCP).
97
+ */
98
+ export function createToolPolicyAuthorize(opts = {}) {
99
+ const resolveActor = opts.resolveActor || defaultResolveActor;
100
+ const audit = opts.audit || auditMcpAdmin;
101
+ return (ctx) => {
102
+ if (!opts.getPolicy && !isMcpAdminConfigured()) {
103
+ return { allow: true };
104
+ }
105
+ const actor = resolveActor(ctx);
106
+ // Les policies sont stockées sous le nom canonique OU le nom public
107
+ // (alias legacy) selon la surface seedée — on tente les deux.
108
+ const getPolicy = opts.getPolicy || getStoredMcpToolPolicy;
109
+ let denial = checkToolPolicy(ctx.canonicalName, actor, opts);
110
+ if (denial === "tool_disabled" &&
111
+ ctx.name !== ctx.canonicalName &&
112
+ getPolicy(ctx.name)) {
113
+ denial = checkToolPolicy(ctx.name, actor, opts);
114
+ }
115
+ if (denial) {
116
+ try {
117
+ audit("tool_call", {
118
+ actor: actor.userId || null,
119
+ toolName: ctx.name,
120
+ outcome: "denied",
121
+ detail: { reason: denial },
122
+ });
123
+ }
124
+ catch {
125
+ /* audit best-effort côté façade */
126
+ }
127
+ return { allow: false, reason: denial };
128
+ }
129
+ return { allow: true };
130
+ };
131
+ }
132
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
+ function errorResult(payload) {
134
+ return {
135
+ content: [{ type: "text", text: JSON.stringify(payload) }],
136
+ isError: true,
137
+ };
138
+ }
139
+ /**
140
+ * Enregistre un tool sur le serveur MCP SDK avec annotations + policy admin
141
+ * + audit + vérification scopes marque — SoT de l'enforcement TF-like
142
+ * (`registerMcpTool` des marques délègue ici, le registre métier reste marque).
143
+ */
144
+ export function registerGuardedMcpTool(server, ctx, def, config,
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
+ handler, opts = {}) {
147
+ const auditFn = opts.audit || auditMcpAdmin;
148
+ server.registerTool(def.name, {
149
+ ...config,
150
+ ...(def.annotations ? { annotations: def.annotations } : {}),
151
+ },
152
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ async (input) => {
154
+ const audit = (outcome, detail) => auditFn("tool_call", {
155
+ actor: ctx.userId ?? null,
156
+ clientId: ctx.clientId ?? null,
157
+ toolName: def.name,
158
+ outcome,
159
+ detail,
160
+ });
161
+ const denial = checkToolPolicy(def.name, { userId: ctx.userId, scopes: ctx.scopes ?? "" }, opts);
162
+ if (denial) {
163
+ audit("denied", { reason: denial });
164
+ return errorResult({ error: denial, tool: def.name });
165
+ }
166
+ if (opts.scopeAllows && !opts.scopeAllows(ctx, def)) {
167
+ audit("denied", { reason: "insufficient_scope" });
168
+ return errorResult({
169
+ error: "insufficient_scope",
170
+ tool: def.name,
171
+ required_scope: def.requiredScope,
172
+ });
173
+ }
174
+ try {
175
+ const result = await handler(input);
176
+ audit(result?.isError ? "error" : "ok");
177
+ return result;
178
+ }
179
+ catch (error) {
180
+ audit("error", {
181
+ message: error instanceof Error ? error.message.slice(0, 300) : "Erreur tool",
182
+ });
183
+ throw error;
184
+ }
185
+ });
186
+ }
187
+ //# sourceMappingURL=tool-policy-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-policy-guard.js","sourceRoot":"","sources":["../../src/admin/tool-policy-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Types admin MCP (port TempoFlow — N6).
3
+ * Le registre métier des tools reste injecté par la marque.
4
+ */
5
+ export type McpToolDefinition = {
6
+ name: string;
7
+ category: string;
8
+ access: "read" | "write";
9
+ requiredScope: string;
10
+ defaultRoles?: string[];
11
+ annotations?: Record<string, boolean>;
12
+ description?: string;
13
+ /** Absent = seed enabled (historique). false = désactivé jusqu'à /admin/mcp. */
14
+ mcpPublishDefault?: boolean;
15
+ };
16
+ export type McpAdminSqliteStatement = {
17
+ run(...params: unknown[]): {
18
+ changes: number;
19
+ lastInsertRowid?: number | bigint;
20
+ };
21
+ get(...params: unknown[]): unknown;
22
+ all(...params: unknown[]): unknown[];
23
+ };
24
+ export type McpAdminSqliteDatabase = {
25
+ exec(sql: string): unknown;
26
+ prepare(sql: string): McpAdminSqliteStatement;
27
+ transaction?: <TArgs extends unknown[], TResult>(fn: (...args: TArgs) => TResult) => (...args: TArgs) => TResult;
28
+ };
29
+ export type McpRequestLogEntry = {
30
+ status: number;
31
+ durationMs: number;
32
+ detail: Record<string, unknown>;
33
+ };
34
+ export type McpAdminAdapters = {
35
+ getDb: () => McpAdminSqliteDatabase;
36
+ getWriteDb: () => McpAdminSqliteDatabase;
37
+ tableExists: (name: string) => boolean;
38
+ /** Registre tools métier (seed policies). */
39
+ listTools: () => McpToolDefinition[];
40
+ mcpOauthReady: () => boolean;
41
+ resolveMcpPublicUrl: () => string | null;
42
+ /** Logs process MCP pour métriques (optionnel → métriques vides). */
43
+ listRequestLogs?: (opts: {
44
+ source: string;
45
+ limit: number;
46
+ }) => {
47
+ logs: McpRequestLogEntry[];
48
+ };
49
+ /** Filename export diagnostic (défaut creezio). */
50
+ diagnosticFilenamePrefix?: string;
51
+ /**
52
+ * Rôles acceptés dans `updateMcpToolPolicy` / seed des policies
53
+ * (défaut ["owner","collaborator"] — comportement historique).
54
+ */
55
+ policyRoleNames?: string[];
56
+ /**
57
+ * Scopes acceptés dans `updateMcpToolPolicy`
58
+ * (défaut ["crm","crm:read","crm:write","full"] — comportement historique).
59
+ */
60
+ policyScopeNames?: string[];
61
+ };
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/admin/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAClF,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;CAClH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,sBAAsB,CAAC;IACpC,UAAU,EAAE,MAAM,sBAAsB,CAAC;IACzC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,6CAA6C;IAC7C,SAAS,EAAE,MAAM,iBAAiB,EAAE,CAAC;IACrC,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,mBAAmB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACzC,qEAAqE;IACrE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,KAAK;QAAE,IAAI,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;IACrC,mDAAmD;IACnD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Types admin MCP (port TempoFlow — N6).
3
+ * Le registre métier des tools reste injecté par la marque.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/admin/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * DX factory marque — remplace le boilerplate create*BrandMcp ×3.
3
+ * La marque fournit api + aliases ; tools module.* générés depuis
4
+ * `api.listOperations()`. `discoverModuleTools` = hook apps optionnel
5
+ * (extras / JWT) — SoT = `operations[]`, pas de `mcpTools` manuscrit.
6
+ */
7
+ import type { ApiKernel } from "@creezio/api-kernel";
8
+ import { type McpFacade } from "./facade.js";
9
+ import { type CreateToolPolicyAuthorizeOptions } from "./admin/tool-policy-guard.js";
10
+ import type { McpFacadeOptions, McpPublicSurfaceMode, McpRegisteredTool } from "./types.js";
11
+ export type CreateBrandMcpFacadeOptions = Omit<McpFacadeOptions, "discoverToolsBySpace" | "aliases"> & {
12
+ api: ApiKernel;
13
+ /** Aliases legacy métier (surface publique). */
14
+ aliases: Record<string, string>;
15
+ /**
16
+ * Hook apps (extras / JWT). Le runtime génère toujours depuis
17
+ * `api.listOperations()` (space module) — SoT = `operations[]`.
18
+ */
19
+ discoverModuleTools?: (api: ApiKernel) => McpRegisteredTool[] | Promise<McpRegisteredTool[]>;
20
+ /** Discovery plugins (défaut : []). */
21
+ discoverPluginTools?: (api: ApiKernel) => McpRegisteredTool[] | Promise<McpRegisteredTool[]>;
22
+ /** Surface publique (défaut legacy-preferred — compat clients MCP externes). */
23
+ publicSurface?: McpPublicSurfaceMode;
24
+ /** Aliases additionnels fusionnés. */
25
+ extraAliases?: Record<string, string>;
26
+ /**
27
+ * M2 — enforcement des policies admin MCP (`mcp_tool_policies`) sur les
28
+ * tool calls de la façade, composé avec `denyCrossLayerToolCall`. Opt-in
29
+ * et non cassant : sans ce flag (ou si `configureMcpAdmin` n'est pas
30
+ * câblé), comportement identique à aujourd'hui. `true` = défauts ; objet =
31
+ * options de la garde (resolveRole, fullAccessScopes, …). Les tools listés
32
+ * par la façade sont seedés en policies permissives à la première décision
33
+ * (rien ne casse à l'activation).
34
+ */
35
+ toolPolicyGuard?: boolean | CreateToolPolicyAuthorizeOptions;
36
+ };
37
+ /**
38
+ * Une seule factory listTools/callTool pour Electron / Hono / assistant.
39
+ */
40
+ export declare function createBrandMcpFacade(options: CreateBrandMcpFacadeOptions): McpFacade;
41
+ //# sourceMappingURL=brand-facade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-facade.d.ts","sourceRoot":"","sources":["../src/brand-facade.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAI9D,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAEV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,gBAAgB,EAChB,sBAAsB,GAAG,SAAS,CACnC,GAAG;IACF,GAAG,EAAE,SAAS,CAAC;IACf,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CACpB,GAAG,EAAE,SAAS,KACX,iBAAiB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,uCAAuC;IACvC,mBAAmB,CAAC,EAAE,CACpB,GAAG,EAAE,SAAS,KACX,iBAAiB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,gFAAgF;IAChF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,gCAAgC,CAAC;CAC9D,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,SAAS,CA0EX"}
@@ -0,0 +1,67 @@
1
+ import { createMcpFacade } from "./facade.js";
2
+ import { composeToolPolicies } from "./policy.js";
3
+ import { isMcpAdminConfigured } from "./admin/adapters.js";
4
+ import { seedMcpToolPolicies } from "./admin/mcp-admin.js";
5
+ import { createToolPolicyAuthorize, } from "./admin/tool-policy-guard.js";
6
+ import { discoverModuleToolsFromKernel } from "./module-ops-tools.js";
7
+ /**
8
+ * Une seule factory listTools/callTool pour Electron / Hono / assistant.
9
+ */
10
+ export function createBrandMcpFacade(options) {
11
+ const { api, aliases, discoverModuleTools, discoverPluginTools, extraAliases, publicSurface = "legacy-preferred", toolPolicyGuard, ...rest } = options;
12
+ let facade;
13
+ let authorizeToolCall = rest.authorizeToolCall;
14
+ if (toolPolicyGuard) {
15
+ const guardOpts = typeof toolPolicyGuard === "object" ? toolPolicyGuard : {};
16
+ const policyAuthorize = createToolPolicyAuthorize(guardOpts);
17
+ // Seed permissif des tools exposés par la façade (INSERT OR IGNORE) —
18
+ // lazy à la première décision : la DB admin n'est pas forcément prête
19
+ // à la création de la façade.
20
+ let policySeeded = false;
21
+ const ensurePolicySeed = async () => {
22
+ if (policySeeded || guardOpts.getPolicy || !isMcpAdminConfigured()) {
23
+ return;
24
+ }
25
+ policySeeded = true;
26
+ try {
27
+ const { tools } = await facade.listTools();
28
+ seedMcpToolPolicies(tools.map((tool) => ({
29
+ name: tool.name,
30
+ defaultRoles: tool.defaultRoles,
31
+ requiredScope: tool.requiredScope,
32
+ mcpPublishDefault: tool.mcpPublishDefault,
33
+ })));
34
+ }
35
+ catch {
36
+ policySeeded = false; // DB pas prête — retentera au prochain call
37
+ }
38
+ };
39
+ const guardedAuthorize = async (ctx) => {
40
+ await ensurePolicySeed();
41
+ return policyAuthorize(ctx);
42
+ };
43
+ authorizeToolCall = authorizeToolCall
44
+ ? composeToolPolicies(authorizeToolCall, guardedAuthorize)
45
+ : guardedAuthorize;
46
+ }
47
+ facade = createMcpFacade({
48
+ allowUnauthenticated: true,
49
+ enforceNamespaces: true,
50
+ publicSurface,
51
+ // defaultCrossLayerDeny=true : la façade compose elle-même
52
+ // denyCrossLayerToolCall AVANT authorizeToolCall (premier deny gagne).
53
+ defaultCrossLayerDeny: true,
54
+ listApiMounts: () => api.listMounts(),
55
+ ...rest,
56
+ authorizeToolCall,
57
+ aliases: { ...aliases, ...(extraAliases || {}) },
58
+ discoverToolsBySpace: async () => ({
59
+ module: discoverModuleToolsFromKernel(api, discoverModuleTools ? await discoverModuleTools(api) : []),
60
+ plugin: discoverPluginTools
61
+ ? await discoverPluginTools(api)
62
+ : [],
63
+ }),
64
+ });
65
+ return facade;
66
+ }
67
+ //# sourceMappingURL=brand-facade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-facade.js","sourceRoot":"","sources":["../src/brand-facade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Tools MCP cœur (`creezio.*`) — SoT kit (H1/H4 → M9).
3
+ *
4
+ * Les marques importent les noms / factories ; handlers Hono peuvent
5
+ * rester brand-specific tant que les noms restent alignés.
6
+ */
7
+ import type { McpRegisteredTool, McpToolsBySpace } from "./types.js";
8
+ export declare const CREEZIO_CORE_MCP_TOOL_NAMES: readonly ["creezio.health", "creezio.architecture", "creezio.admin.list_mounts", "creezio.admin.list_tools_by_space", "creezio.admin.list_aliases"];
9
+ export type CreezioCoreMcpToolName = (typeof CREEZIO_CORE_MCP_TOOL_NAMES)[number];
10
+ export type CreateCoreMcpToolsOptions = {
11
+ architectureVersion?: string;
12
+ brandId?: string;
13
+ listApiMounts?: () => Array<{
14
+ space: string;
15
+ id: string;
16
+ }>;
17
+ listToolsBySpaceSync?: () => McpToolsBySpace;
18
+ listAliasesSync?: () => Record<string, string>;
19
+ };
20
+ /** Factory tools cœur — utilisée par `createMcpFacade`. */
21
+ export declare function createCoreMcpTools(opts?: CreateCoreMcpToolsOptions): McpRegisteredTool[];
22
+ //# sourceMappingURL=core-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tools.d.ts","sourceRoot":"","sources":["../src/core-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,2BAA2B,qJAM9B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,yBAAyB,GAAG;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,oBAAoB,CAAC,EAAE,MAAM,eAAe,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD,CAAC;AAMF,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,yBAA8B,GACnC,iBAAiB,EAAE,CA2ErB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Tools MCP cœur (`creezio.*`) — SoT kit (H1/H4 → M9).
3
+ *
4
+ * Les marques importent les noms / factories ; handlers Hono peuvent
5
+ * rester brand-specific tant que les noms restent alignés.
6
+ */
7
+ import { ARCHITECTURE_VERSION } from "@creezio/platform-core";
8
+ import { API_V1_PREFIX } from "@creezio/api-kernel";
9
+ export const CREEZIO_CORE_MCP_TOOL_NAMES = [
10
+ "creezio.health",
11
+ "creezio.architecture",
12
+ "creezio.admin.list_mounts",
13
+ "creezio.admin.list_tools_by_space",
14
+ "creezio.admin.list_aliases",
15
+ ];
16
+ function emptyBySpace() {
17
+ return { core: [], module: [], plugin: [] };
18
+ }
19
+ /** Factory tools cœur — utilisée par `createMcpFacade`. */
20
+ export function createCoreMcpTools(opts = {}) {
21
+ const architectureVersion = opts.architectureVersion ?? ARCHITECTURE_VERSION;
22
+ return [
23
+ {
24
+ name: "creezio.health",
25
+ description: "Ping santé façade MCP / API cœur",
26
+ space: "core",
27
+ inputSchema: { type: "object", properties: {} },
28
+ handler: async () => ({
29
+ ok: true,
30
+ content: { ok: true, brandId: opts.brandId ?? null },
31
+ }),
32
+ },
33
+ {
34
+ name: "creezio.architecture",
35
+ description: "Version architecture + préfixe API unique",
36
+ space: "core",
37
+ inputSchema: { type: "object", properties: {} },
38
+ handler: async () => ({
39
+ ok: true,
40
+ content: {
41
+ architectureVersion,
42
+ apiPrefix: API_V1_PREFIX,
43
+ note: "Une seule façade MCP = MCP de l'app (proxy unifié H4)",
44
+ toolSpaces: ["core", "module", "plugin"],
45
+ publicSurfaceModes: [
46
+ "canonical",
47
+ "legacy-preferred",
48
+ "both",
49
+ ],
50
+ },
51
+ }),
52
+ },
53
+ {
54
+ name: "creezio.admin.list_mounts",
55
+ description: "Liste les montages API modules/plugins connus",
56
+ space: "core",
57
+ inputSchema: { type: "object", properties: {} },
58
+ handler: async () => ({
59
+ ok: true,
60
+ content: {
61
+ mounts: opts.listApiMounts ? opts.listApiMounts() : [],
62
+ },
63
+ }),
64
+ },
65
+ {
66
+ name: "creezio.admin.list_tools_by_space",
67
+ description: "Liste les tools MCP groupés par couche (core / module / plugin)",
68
+ space: "core",
69
+ inputSchema: { type: "object", properties: {} },
70
+ handler: async () => ({
71
+ ok: true,
72
+ content: {
73
+ bySpace: opts.listToolsBySpaceSync
74
+ ? opts.listToolsBySpaceSync()
75
+ : emptyBySpace(),
76
+ },
77
+ }),
78
+ },
79
+ {
80
+ name: "creezio.admin.list_aliases",
81
+ description: "Liste les aliases legacy → tools canoniques (anti double exposition)",
82
+ space: "core",
83
+ inputSchema: { type: "object", properties: {} },
84
+ handler: async () => ({
85
+ ok: true,
86
+ content: {
87
+ aliases: opts.listAliasesSync ? opts.listAliasesSync() : {},
88
+ },
89
+ }),
90
+ },
91
+ ];
92
+ }
93
+ //# sourceMappingURL=core-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tools.js","sourceRoot":"","sources":["../src/core-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Import dynamique type-erased pour les packages `@creezio/*` qui ne sont
3
+ * PAS des dépendances de build de mcp-facade (`@creezio/auth`,
4
+ * `@creezio/tasks` — façade utilisable standalone). Un `import("…")` littéral
5
+ * ferait résoudre les types par tsc → TS2307 selon l'ordre topologique de
6
+ * `scripts/build-workspaces.mjs` (tasks compile APRÈS mcp-facade). Résolution
7
+ * au RUNTIME de l'app hôte, fail-closed chez les appelants — même pattern que
8
+ * `@creezio/mails` (imapflow / nodemailer).
9
+ */
10
+ type DynImport = (specifier: string) => Promise<unknown>;
11
+ export declare const dynImport: DynImport;
12
+ export {};
13
+ //# sourceMappingURL=dyn-import.d.ts.map