@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.
- package/LICENSE +202 -0
- package/README.md +123 -2
- package/dist/_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js +8 -0
- package/dist/index.js +37 -0
- package/dist/nodefony/command/StdioCommand.js +75 -0
- package/dist/nodefony/config/config.js +181 -0
- package/dist/nodefony/config/configSchema.js +18 -0
- package/dist/nodefony/config/defineModuleConfig.js +51 -0
- package/dist/nodefony/mcp/caller.js +38 -0
- package/dist/nodefony/mcp/gate.js +628 -0
- package/dist/nodefony/mcp/guard.js +82 -0
- package/dist/nodefony/mcp/progress.js +74 -0
- package/dist/nodefony/mcp/protocol.js +76 -0
- package/dist/nodefony/mcp/server.js +302 -0
- package/dist/nodefony/mcp/sessionTicket.js +89 -0
- package/dist/nodefony/mcp/stdio.js +64 -0
- package/dist/nodefony/mcp/stream.js +80 -0
- package/dist/nodefony/mcp/ticketSession.js +177 -0
- package/dist/nodefony/mcp/tools.js +485 -0
- package/dist/nodefony/src/errors/AiError.js +20 -0
- package/dist/types/index.d.ts +56 -0
- package/dist/types/nodefony/command/StdioCommand.d.ts +28 -0
- package/dist/types/nodefony/config/config.d.ts +44 -0
- package/dist/types/nodefony/config/configSchema.d.ts +12 -0
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +43 -0
- package/dist/types/nodefony/mcp/caller.d.ts +54 -0
- package/dist/types/nodefony/mcp/gate.d.ts +235 -0
- package/dist/types/nodefony/mcp/guard.d.ts +89 -0
- package/dist/types/nodefony/mcp/progress.d.ts +48 -0
- package/dist/types/nodefony/mcp/protocol.d.ts +107 -0
- package/dist/types/nodefony/mcp/server.d.ts +156 -0
- package/dist/types/nodefony/mcp/sessionTicket.d.ts +60 -0
- package/dist/types/nodefony/mcp/stdio.d.ts +38 -0
- package/dist/types/nodefony/mcp/stream.d.ts +76 -0
- package/dist/types/nodefony/mcp/ticketSession.d.ts +174 -0
- package/dist/types/nodefony/mcp/tools.d.ts +232 -0
- package/dist/types/nodefony/src/errors/AiError.d.ts +14 -0
- package/docs/index.md +56 -0
- package/docs/mcp.md +754 -0
- 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 };
|