@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.
- package/README.md +14 -6
- package/dist/_virtual/{_@oxc-project_runtime@0.154.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/decorate.js +1 -2
- package/dist/index.js +21 -14
- package/dist/nodefony/command/StdioCommand.js +75 -0
- package/dist/nodefony/config/config.js +141 -8
- package/dist/nodefony/config/configSchema.js +1 -2
- package/dist/nodefony/config/defineModuleConfig.js +1 -2
- 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 +1 -2
- package/dist/types/index.d.ts +25 -0
- package/dist/types/nodefony/command/StdioCommand.d.ts +28 -0
- package/dist/types/nodefony/config/config.d.ts +28 -32
- 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/docs/index.md +56 -0
- package/docs/mcp.md +754 -0
- package/package.json +13 -11
- package/dist/_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js +0 -6
- package/dist/nodefony/interfaces/IAiService.js +0 -1
- package/dist/nodefony/interfaces/index.js +0 -1
- package/dist/nodefony/service/AiService.js +0 -96
- package/dist/types/nodefony/interfaces/IAiService.d.ts +0 -15
- package/dist/types/nodefony/interfaces/index.d.ts +0 -1
- 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
|
+
"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.
|
|
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.
|
|
44
|
-
"@nodefony/
|
|
45
|
-
"
|
|
46
|
-
"
|
|
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
|
-
"
|
|
53
|
-
"@nodefony/framework": "^10.0.0-beta.
|
|
54
|
-
"@nodefony/http": "^10.0.0-beta.
|
|
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
|
-
"
|
|
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;
|