@nodefony/ai 10.0.0-beta.3 → 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 (43) hide show
  1. package/README.md +14 -6
  2. package/dist/_virtual/{_@oxc-project_runtime@0.154.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/decorate.js +1 -2
  3. package/dist/index.js +21 -14
  4. package/dist/nodefony/command/StdioCommand.js +75 -0
  5. package/dist/nodefony/config/config.js +141 -8
  6. package/dist/nodefony/config/configSchema.js +1 -2
  7. package/dist/nodefony/config/defineModuleConfig.js +1 -2
  8. package/dist/nodefony/mcp/caller.js +38 -0
  9. package/dist/nodefony/mcp/gate.js +628 -0
  10. package/dist/nodefony/mcp/guard.js +82 -0
  11. package/dist/nodefony/mcp/progress.js +74 -0
  12. package/dist/nodefony/mcp/protocol.js +76 -0
  13. package/dist/nodefony/mcp/server.js +302 -0
  14. package/dist/nodefony/mcp/sessionTicket.js +89 -0
  15. package/dist/nodefony/mcp/stdio.js +64 -0
  16. package/dist/nodefony/mcp/stream.js +80 -0
  17. package/dist/nodefony/mcp/ticketSession.js +177 -0
  18. package/dist/nodefony/mcp/tools.js +485 -0
  19. package/dist/nodefony/src/errors/AiError.js +1 -2
  20. package/dist/types/index.d.ts +25 -0
  21. package/dist/types/nodefony/command/StdioCommand.d.ts +28 -0
  22. package/dist/types/nodefony/config/config.d.ts +28 -32
  23. package/dist/types/nodefony/mcp/caller.d.ts +54 -0
  24. package/dist/types/nodefony/mcp/gate.d.ts +235 -0
  25. package/dist/types/nodefony/mcp/guard.d.ts +89 -0
  26. package/dist/types/nodefony/mcp/progress.d.ts +48 -0
  27. package/dist/types/nodefony/mcp/protocol.d.ts +107 -0
  28. package/dist/types/nodefony/mcp/server.d.ts +156 -0
  29. package/dist/types/nodefony/mcp/sessionTicket.d.ts +60 -0
  30. package/dist/types/nodefony/mcp/stdio.d.ts +38 -0
  31. package/dist/types/nodefony/mcp/stream.d.ts +76 -0
  32. package/dist/types/nodefony/mcp/ticketSession.d.ts +174 -0
  33. package/dist/types/nodefony/mcp/tools.d.ts +232 -0
  34. package/docs/index.md +56 -0
  35. package/docs/mcp.md +754 -0
  36. package/package.json +13 -11
  37. package/dist/_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js +0 -6
  38. package/dist/nodefony/interfaces/IAiService.js +0 -1
  39. package/dist/nodefony/interfaces/index.js +0 -1
  40. package/dist/nodefony/service/AiService.js +0 -96
  41. package/dist/types/nodefony/interfaces/IAiService.d.ts +0 -15
  42. package/dist/types/nodefony/interfaces/index.d.ts +0 -1
  43. package/dist/types/nodefony/service/AiService.d.ts +0 -80
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodefony/ai",
3
- "version": "10.0.0-beta.3",
3
+ "version": "10.0.0-beta.4",
4
4
  "description": "La boîte à outils IA de Nodefony : serveur MCP, puis les services de la couche agentique",
5
5
  "contributors": [],
6
6
  "type": "module",
@@ -20,11 +20,12 @@
20
20
  "typecheck": "tsgo --noEmit -p tsconfig.json && tsgo --noEmit -p tsconfig.tests.json",
21
21
  "test": "vitest run",
22
22
  "clean": "node --eval \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
23
- "coverage": "vitest run --coverage"
23
+ "coverage": "vitest run --coverage",
24
+ "test:integration": "vitest run --config vitest.integration.config.ts"
24
25
  },
25
26
  "private": false,
26
27
  "engines": {
27
- "node": ">=24.0.0"
28
+ "node": ">=24.14.0"
28
29
  },
29
30
  "keywords": [
30
31
  "nodefony",
@@ -40,20 +41,21 @@
40
41
  "configSchema": "./dist/nodefony/config/configSchema.js"
41
42
  },
42
43
  "peerDependencies": {
43
- "nodefony": "^10.0.0-beta.3",
44
- "@nodefony/framework": "^10.0.0-beta.3",
45
- "zod": "^4.6.7",
46
- "@nodefony/http": "^10.0.0-beta.3"
44
+ "@nodefony/framework": "^10.0.0-beta.4",
45
+ "@nodefony/http": "^10.0.0-beta.4",
46
+ "nodefony": "^10.0.0-beta.4",
47
+ "zod": "^4.6.7"
47
48
  },
48
49
  "dependencies": {
49
50
  "tslib": "2.8.1"
50
51
  },
51
52
  "devDependencies": {
52
- "nodefony": "^10.0.0-beta.3",
53
- "@nodefony/framework": "^10.0.0-beta.3",
54
- "@nodefony/http": "^10.0.0-beta.3",
53
+ "@modelcontextprotocol/sdk": "1.32.1",
54
+ "@nodefony/framework": "^10.0.0-beta.4",
55
+ "@nodefony/http": "^10.0.0-beta.4",
55
56
  "@types/node": "26.6.5",
56
- "vitest": "5.0.4"
57
+ "nodefony": "^10.0.0-beta.4",
58
+ "vitest": "5.0.5"
57
59
  },
58
60
  "repository": {
59
61
  "type": "git",
@@ -1,6 +0,0 @@
1
- //#region \0@oxc-project+runtime@0.154.0/helpers/esm/decorateMetadata.js
2
- function __decorateMetadata(k, v) {
3
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
4
- }
5
- //#endregion
6
- export { __decorateMetadata as default };
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,96 +0,0 @@
1
- import { defineAiConfig } from "../config/defineModuleConfig.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
4
- import { Module, Service, injectable } from "nodefony";
5
- //#region nodefony/service/AiService.ts
6
- /**
7
- * Service principal du module — la logique vit ici, pas dans les controllers
8
- * (un controller traduit du HTTP/WS ; un service, lui, est réutilisable par la
9
- * CLI, un job, un autre module).
10
- *
11
- * ⚡ **Tu veux un service ? Ne recopie pas ce fichier — génère-le :**
12
- *
13
- * ```bash
14
- * npx nodefony create service <Nom> # la classe + sa déclaration
15
- * npx nodefony create service <Nom> --inject <Autre> # + la dépendance écrite
16
- * ```
17
- *
18
- * Le générateur écrit la version COURANTE du framework et déclare le service sur
19
- * le module ; recopié à la main, il naît déjà décalé et personne ne le signale.
20
- * Ce fichier reste là pour se LIRE — comprendre ce qu'est un service — pas pour
21
- * se dupliquer.
22
- *
23
- * Cycle : `constructor` (fusion défauts + config de l'app) → `init`
24
- * (branchements kernel) → méthodes métier.
25
- *
26
- * Un service porte DEUX noms, et c'est normal :
27
- * `@injectable()` → nomme la CLASSE (`AiService`),
28
- * c'est ce qu'on écrit dans `@inject("…")`
29
- * `super("ai", …)` → nomme l'INSTANCE, sa clé dans le conteneur,
30
- * c'est ce qu'on écrit dans `kernel.get("…")`
31
- * Les deux mènent à la MÊME instance : le conteneur les réconcilie via la classe.
32
- * (Le décorateur ne peut pas deviner la clé — il s'exécute au chargement de la
33
- * classe, le `super()` seulement à la construction.)
34
- *
35
- * ⚠️ Ne JAMAIS redéclarer `options` comme propriété : la classe `Service` parente
36
- * l'assigne déjà via le 4ᵉ argument du `super()`. On garde une référence typée
37
- * `cfg` pour lire la config sans se battre avec TypeScript.
38
- *
39
- * POUR L'UTILISER AILLEURS, deux voies, toutes deux légales :
40
- *
41
- * ```ts
42
- * // 1. INJECTION par le constructeur — la dépendance est DÉCLARÉE, donc le
43
- * // conteneur l'ordonnance et elle se voit dans la signature (nom de CLASSE).
44
- * import { inject, injectable, Service, Module } from "nodefony";
45
- *
46
- * @injectable()
47
- * class ReportService extends Service {
48
- * constructor(
49
- * module: Module,
50
- * @inject("AiService") private ai: AiService,
51
- * ) {
52
- * super("report", module.container, module.notificationsCenter);
53
- * }
54
- * }
55
- *
56
- * // 2. RÉSOLUTION par le conteneur, pour une dépendance tardive ou optionnelle
57
- * // (nom d'INSTANCE).
58
- * const ai = this.container.get("ai");
59
- * ```
60
- */
61
- let AiService = class AiService extends Service {
62
- module;
63
- cfg;
64
- constructor(module) {
65
- const merged = defineAiConfig(module.options);
66
- super("ai", module.container ?? void 0, module.notificationsCenter, merged);
67
- this.module = module;
68
- this.cfg = merged;
69
- }
70
- /**
71
- * Hook de démarrage d'un service : appelé UNE fois par le kernel, après la
72
- * construction. C'est ici qu'on s'abonne aux événements du kernel — jamais
73
- * dans le constructeur, où le kernel n'est pas encore prêt.
74
- *
75
- * ⚠️ Il s'appelle `init`, pas `initialize`. Le kernel ne cherche que `init`
76
- * (`guardServiceInitialize`) : une méthode nommée `initialize` sur un service
77
- * n'est JAMAIS appelée, et rien ne le signale — le code y dort en silence.
78
- * (`initialize` existe bien, mais sur un CONTROLLER, où il tourne à CHAQUE
79
- * requête : deux cycles de vie distincts, d'où deux noms.)
80
- */
81
- async init() {
82
- this.log("service ai initialisé", "DEBUG");
83
- return this;
84
- }
85
- /** Exemple de méthode métier — à remplacer par la vôtre. */
86
- greet(who = "monde") {
87
- return `${this.cfg.greeting}, ${who} !`;
88
- }
89
- status() {
90
- return { ready: this.cfg.enabled };
91
- }
92
- };
93
- AiService = __decorate([injectable(), __decorateMetadata("design:paramtypes", [typeof Module === "undefined" ? Object : Module])], AiService);
94
- var AiService_default = AiService;
95
- //#endregion
96
- export { AiService_default as default };
@@ -1,15 +0,0 @@
1
- /**
2
- * API publique de `AiService` (injectable, nom `ai`).
3
- *
4
- * L'interface est le CONTRAT : ce que les autres modules (et Studio) peuvent
5
- * appeler. Tout ce qui n'est pas ici est un détail d'implémentation, libre de
6
- * changer.
7
- */
8
- export interface IAiService {
9
- /** Snapshot de lecture — état courant du service. */
10
- status(): {
11
- ready: boolean;
12
- };
13
- /** Exemple de méthode métier — à remplacer par la vôtre. */
14
- greet(who?: string): string;
15
- }
@@ -1 +0,0 @@
1
- export type { IAiService } from "./IAiService.js";
@@ -1,80 +0,0 @@
1
- import { Service, Module } from "nodefony";
2
- import type { IAiService } from "../interfaces/IAiService.js";
3
- /**
4
- * Service principal du module — la logique vit ici, pas dans les controllers
5
- * (un controller traduit du HTTP/WS ; un service, lui, est réutilisable par la
6
- * CLI, un job, un autre module).
7
- *
8
- * ⚡ **Tu veux un service ? Ne recopie pas ce fichier — génère-le :**
9
- *
10
- * ```bash
11
- * npx nodefony create service <Nom> # la classe + sa déclaration
12
- * npx nodefony create service <Nom> --inject <Autre> # + la dépendance écrite
13
- * ```
14
- *
15
- * Le générateur écrit la version COURANTE du framework et déclare le service sur
16
- * le module ; recopié à la main, il naît déjà décalé et personne ne le signale.
17
- * Ce fichier reste là pour se LIRE — comprendre ce qu'est un service — pas pour
18
- * se dupliquer.
19
- *
20
- * Cycle : `constructor` (fusion défauts + config de l'app) → `init`
21
- * (branchements kernel) → méthodes métier.
22
- *
23
- * Un service porte DEUX noms, et c'est normal :
24
- * `@injectable()` → nomme la CLASSE (`AiService`),
25
- * c'est ce qu'on écrit dans `@inject("…")`
26
- * `super("ai", …)` → nomme l'INSTANCE, sa clé dans le conteneur,
27
- * c'est ce qu'on écrit dans `kernel.get("…")`
28
- * Les deux mènent à la MÊME instance : le conteneur les réconcilie via la classe.
29
- * (Le décorateur ne peut pas deviner la clé — il s'exécute au chargement de la
30
- * classe, le `super()` seulement à la construction.)
31
- *
32
- * ⚠️ Ne JAMAIS redéclarer `options` comme propriété : la classe `Service` parente
33
- * l'assigne déjà via le 4ᵉ argument du `super()`. On garde une référence typée
34
- * `cfg` pour lire la config sans se battre avec TypeScript.
35
- *
36
- * POUR L'UTILISER AILLEURS, deux voies, toutes deux légales :
37
- *
38
- * ```ts
39
- * // 1. INJECTION par le constructeur — la dépendance est DÉCLARÉE, donc le
40
- * // conteneur l'ordonnance et elle se voit dans la signature (nom de CLASSE).
41
- * import { inject, injectable, Service, Module } from "nodefony";
42
- *
43
- * @injectable()
44
- * class ReportService extends Service {
45
- * constructor(
46
- * module: Module,
47
- * @inject("AiService") private ai: AiService,
48
- * ) {
49
- * super("report", module.container, module.notificationsCenter);
50
- * }
51
- * }
52
- *
53
- * // 2. RÉSOLUTION par le conteneur, pour une dépendance tardive ou optionnelle
54
- * // (nom d'INSTANCE).
55
- * const ai = this.container.get("ai");
56
- * ```
57
- */
58
- declare class AiService extends Service implements IAiService {
59
- module: Module;
60
- private readonly cfg;
61
- constructor(module: Module);
62
- /**
63
- * Hook de démarrage d'un service : appelé UNE fois par le kernel, après la
64
- * construction. C'est ici qu'on s'abonne aux événements du kernel — jamais
65
- * dans le constructeur, où le kernel n'est pas encore prêt.
66
- *
67
- * ⚠️ Il s'appelle `init`, pas `initialize`. Le kernel ne cherche que `init`
68
- * (`guardServiceInitialize`) : une méthode nommée `initialize` sur un service
69
- * n'est JAMAIS appelée, et rien ne le signale — le code y dort en silence.
70
- * (`initialize` existe bien, mais sur un CONTROLLER, où il tourne à CHAQUE
71
- * requête : deux cycles de vie distincts, d'où deux noms.)
72
- */
73
- init(): Promise<this>;
74
- /** Exemple de méthode métier — à remplacer par la vôtre. */
75
- greet(who?: string): string;
76
- status(): {
77
- ready: boolean;
78
- };
79
- }
80
- export default AiService;