@nodefony/ai 0.0.0-stage → 10.0.0-beta.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 (40) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +123 -2
  3. package/dist/_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js +8 -0
  4. package/dist/index.js +37 -0
  5. package/dist/nodefony/command/StdioCommand.js +75 -0
  6. package/dist/nodefony/config/config.js +181 -0
  7. package/dist/nodefony/config/configSchema.js +18 -0
  8. package/dist/nodefony/config/defineModuleConfig.js +51 -0
  9. package/dist/nodefony/mcp/caller.js +38 -0
  10. package/dist/nodefony/mcp/gate.js +628 -0
  11. package/dist/nodefony/mcp/guard.js +82 -0
  12. package/dist/nodefony/mcp/progress.js +74 -0
  13. package/dist/nodefony/mcp/protocol.js +76 -0
  14. package/dist/nodefony/mcp/server.js +302 -0
  15. package/dist/nodefony/mcp/sessionTicket.js +89 -0
  16. package/dist/nodefony/mcp/stdio.js +64 -0
  17. package/dist/nodefony/mcp/stream.js +80 -0
  18. package/dist/nodefony/mcp/ticketSession.js +177 -0
  19. package/dist/nodefony/mcp/tools.js +485 -0
  20. package/dist/nodefony/src/errors/AiError.js +20 -0
  21. package/dist/types/index.d.ts +56 -0
  22. package/dist/types/nodefony/command/StdioCommand.d.ts +28 -0
  23. package/dist/types/nodefony/config/config.d.ts +44 -0
  24. package/dist/types/nodefony/config/configSchema.d.ts +12 -0
  25. package/dist/types/nodefony/config/defineModuleConfig.d.ts +43 -0
  26. package/dist/types/nodefony/mcp/caller.d.ts +54 -0
  27. package/dist/types/nodefony/mcp/gate.d.ts +235 -0
  28. package/dist/types/nodefony/mcp/guard.d.ts +89 -0
  29. package/dist/types/nodefony/mcp/progress.d.ts +48 -0
  30. package/dist/types/nodefony/mcp/protocol.d.ts +107 -0
  31. package/dist/types/nodefony/mcp/server.d.ts +156 -0
  32. package/dist/types/nodefony/mcp/sessionTicket.d.ts +60 -0
  33. package/dist/types/nodefony/mcp/stdio.d.ts +38 -0
  34. package/dist/types/nodefony/mcp/stream.d.ts +76 -0
  35. package/dist/types/nodefony/mcp/ticketSession.d.ts +174 -0
  36. package/dist/types/nodefony/mcp/tools.d.ts +232 -0
  37. package/dist/types/nodefony/src/errors/AiError.d.ts +14 -0
  38. package/docs/index.md +56 -0
  39. package/docs/mcp.md +754 -0
  40. package/package.json +83 -4
@@ -0,0 +1,51 @@
1
+ import { aiConfigSchema } from "./config.js";
2
+ import { configJsonSchema } from "./configSchema.js";
3
+ import { parseModuleConfig } from "nodefony";
4
+ // nodefony/config/defineModuleConfig.ts
5
+ /**
6
+ * @nodefony/ai — LE COMMENT : builder PUR de la config.
7
+ *
8
+ * ⭐ TL;DR : ce fichier VALIDE et GÈLE. Il ne porte AUCUNE valeur — les défauts
9
+ * vivent dans le schéma de `./config.ts` (règle d'or ADR-0006). Pour changer un
10
+ * défaut, c'est là-bas ; ici, on ne fait que le faire respecter.
11
+ *
12
+ * Le nom du FICHIER est le même dans tous les modules Nodefony
13
+ * (`defineModuleConfig.ts`) ; la FONCTION, elle, est préfixée par le module —
14
+ * deux modules importés côte à côte ne se marchent pas dessus.
15
+ *
16
+ * L'environnement ne se lit JAMAIS ici. La surcharge générique
17
+ * (`NF__AI__<CHEMIN>`) comme un nom court (`NF_AI_<RÉGLAGE>`) sont
18
+ * posés par le Kernel avant cette validation. Un nom court se DÉCLARE sur son
19
+ * champ, dans `./config.ts` : `.meta({ env: "NF_AI_<RÉGLAGE>" })`.
20
+ *
21
+ * 🔴 **La validation passe par `parseModuleConfig`, du cœur** — un seul endroit
22
+ * pour une seule règle. Il lève une `BootConfigurationError`, et pas une `Error`
23
+ * ordinaire : le kernel distingue les deux. Un hook de cycle de vie qui lève une
24
+ * erreur QUELCONQUE est absorbé en développement (fail-soft — il protège la DX
25
+ * d'un module optionnel cassé), tandis qu'une erreur de CONFIGURATION interrompt
26
+ * le boot dans TOUS les environnements. Mesuré sur un module généré : avec une
27
+ * `Error`, `use("@nodefony/ai", { gretting: "…" })` laissait l'application
28
+ * démarrer, servir, et rendre 0 — la faute de frappe n'atteignait personne. Une
29
+ * configuration explicite qu'on ne peut pas honorer ne se répare pas en
30
+ * continuant.
31
+ *
32
+ * ⚠️ Ne PAS réécrire ce bloc à la main : les dix modules du framework portaient
33
+ * chacun leur copie du `try`/`catch`, et elles avaient divergé sur les deux
34
+ * points qui comptent — le type de l'erreur levée et la langue du message.
35
+ *
36
+ * @param config - config brute venue de `use("@nodefony/ai", { … })`.
37
+ * @returns config validée et gelée.
38
+ * @throws BootConfigurationError si un champ est invalide ou inconnu (toutes les
39
+ * erreurs Zod agrégées, par champ) — le boot s'interrompt, en dev comme en prod.
40
+ */
41
+ function defineAiConfig(config = {}) {
42
+ return Object.freeze(parseModuleConfig(aiConfigSchema, config, "@nodefony/ai"));
43
+ }
44
+ /**
45
+ * JSON Schema de la config — Studio en dérive son formulaire d'édition
46
+ * (libellés, types, défauts, descriptions), sans une ligne d'UI écrite à la main.
47
+ */
48
+ function aiConfigJsonSchema() {
49
+ return configJsonSchema();
50
+ }
51
+ export { aiConfigJsonSchema, defineAiConfig };
@@ -0,0 +1,38 @@
1
+ import { rolesFromScopes } from "nodefony";
2
+ // nodefony/mcp/caller.ts
3
+ const NO_ROLES = [];
4
+ /**
5
+ * Quels rôles porte l'appelant d'une porte MCP — **la règle, à un seul endroit**.
6
+ *
7
+ * ⭐ Toute porte MCP passe par ici, y compris celles qu'un module créera plus
8
+ * tard (gestion d'agents, passerelles métier). C'est délibéré : la question
9
+ * « que vaut un appelant sur ma porte » a exactement une bonne réponse, et
10
+ * laisser chaque porte la réécrire garantit qu'une copie finira plus permissive
11
+ * que les autres sans que rien ne le signale — c'est déjà ce qui s'est produit
12
+ * quand la lecture d'administration fabriquait un administrateur.
13
+ *
14
+ * Les trois postures :
15
+ *
16
+ * | La porte | L'appelant | Ce qu'il porte |
17
+ * | --- | --- | --- |
18
+ * | non protégée | quiconque l'atteint | `operatorRoles` — AUCUN par défaut ; une porte dont le PÉRIMÈTRE protège l'élargit |
19
+ * | protégée | jeton vérifié | ce que ses SCOPES ouvrent, rien de plus |
20
+ * | protégée | anonyme toléré | **rien** — la déclaration d'autorisation serait vidée de son sens |
21
+ *
22
+ * Le premier cas n'accorde RIEN par défaut : une porte non protégée peut être
23
+ * celle d'une application, ouverte en production. Seule une porte que son
24
+ * PÉRIMÈTRE protège — la porte de développement de devkit, module
25
+ * `policy: "dev"`, dont l'appelant lit déjà les sources — passe le rôle
26
+ * d'opérateur, et l'écrit. Ce qui compte, c'est que ce soit un CHOIX écrit par
27
+ * la porte — pas un administrateur fabriqué au fond d'une fonction de lecture.
28
+ *
29
+ * @param posture - ce que la porte sait d'elle-même et de cet appel.
30
+ * @param operatorRoles - ce qu'accorde une porte NON protégée ; aucun rôle par
31
+ * défaut.
32
+ * @returns les rôles à poser sur `IMcpCaller.roles`.
33
+ */
34
+ function mcpCallerRoles(posture, operatorRoles = NO_ROLES) {
35
+ if (!posture.protected) return operatorRoles;
36
+ return posture.authenticated ? rolesFromScopes(posture.scopes) : [];
37
+ }
38
+ export { mcpCallerRoles };