agentic-api 2.0.31 → 2.0.491
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/dist/src/agents/agents.example.js +21 -22
- package/dist/src/agents/authentication.js +1 -2
- package/dist/src/agents/prompts.d.ts +5 -4
- package/dist/src/agents/prompts.js +44 -87
- package/dist/src/agents/reducer.core.d.ts +24 -2
- package/dist/src/agents/reducer.core.js +125 -35
- package/dist/src/agents/reducer.loaders.d.ts +55 -1
- package/dist/src/agents/reducer.loaders.js +114 -1
- package/dist/src/agents/reducer.types.d.ts +45 -2
- package/dist/src/agents/semantic.js +1 -2
- package/dist/src/agents/simulator.d.ts +11 -3
- package/dist/src/agents/simulator.executor.d.ts +14 -4
- package/dist/src/agents/simulator.executor.js +81 -23
- package/dist/src/agents/simulator.js +128 -42
- package/dist/src/agents/simulator.prompts.d.ts +9 -7
- package/dist/src/agents/simulator.prompts.js +66 -86
- package/dist/src/agents/simulator.types.d.ts +23 -5
- package/dist/src/agents/simulator.utils.d.ts +7 -2
- package/dist/src/agents/simulator.utils.js +31 -11
- package/dist/src/agents/system.js +1 -2
- package/dist/src/execute/helpers.d.ts +75 -0
- package/dist/src/execute/helpers.js +139 -0
- package/dist/src/execute/index.d.ts +11 -0
- package/dist/src/execute/index.js +44 -0
- package/dist/src/execute/legacy.d.ts +46 -0
- package/dist/src/execute/legacy.js +460 -0
- package/dist/src/execute/modelconfig.d.ts +19 -0
- package/dist/src/execute/modelconfig.js +56 -0
- package/dist/src/execute/responses.d.ts +55 -0
- package/dist/src/execute/responses.js +594 -0
- package/dist/src/execute/shared.d.ts +83 -0
- package/dist/src/execute/shared.js +188 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
- package/dist/src/pricing.llm.js +255 -0
- package/dist/src/prompts.d.ts +13 -4
- package/dist/src/prompts.js +221 -114
- package/dist/src/rag/embeddings.d.ts +36 -18
- package/dist/src/rag/embeddings.js +131 -128
- package/dist/src/rag/index.d.ts +5 -5
- package/dist/src/rag/index.js +14 -17
- package/dist/src/rag/parser.d.ts +2 -1
- package/dist/src/rag/parser.js +11 -14
- package/dist/src/rag/rag.examples.d.ts +27 -0
- package/dist/src/rag/rag.examples.js +151 -0
- package/dist/src/rag/rag.manager.d.ts +383 -0
- package/dist/src/rag/rag.manager.js +1390 -0
- package/dist/src/rag/types.d.ts +128 -12
- package/dist/src/rag/types.js +100 -1
- package/dist/src/rag/usecase.d.ts +37 -0
- package/dist/src/rag/usecase.js +96 -7
- package/dist/src/rules/git/git.e2e.helper.js +22 -2
- package/dist/src/rules/git/git.health.d.ts +61 -2
- package/dist/src/rules/git/git.health.js +333 -11
- package/dist/src/rules/git/index.d.ts +2 -2
- package/dist/src/rules/git/index.js +13 -1
- package/dist/src/rules/git/repo.d.ts +160 -0
- package/dist/src/rules/git/repo.js +777 -0
- package/dist/src/rules/git/repo.pr.js +117 -13
- package/dist/src/rules/git/repo.tools.d.ts +22 -1
- package/dist/src/rules/git/repo.tools.js +50 -1
- package/dist/src/rules/types.d.ts +27 -14
- package/dist/src/rules/utils.matter.d.ts +0 -4
- package/dist/src/rules/utils.matter.js +35 -7
- package/dist/src/scrapper.d.ts +15 -22
- package/dist/src/scrapper.js +58 -110
- package/dist/src/stategraph/index.d.ts +1 -1
- package/dist/src/stategraph/stategraph.d.ts +56 -2
- package/dist/src/stategraph/stategraph.js +134 -6
- package/dist/src/stategraph/stategraph.storage.js +8 -0
- package/dist/src/stategraph/types.d.ts +27 -0
- package/dist/src/types.d.ts +46 -9
- package/dist/src/types.js +8 -7
- package/dist/src/usecase.d.ts +11 -2
- package/dist/src/usecase.js +27 -35
- package/dist/src/utils.d.ts +32 -18
- package/dist/src/utils.js +87 -129
- package/package.json +10 -3
- package/dist/src/agents/digestor.test.d.ts +0 -1
- package/dist/src/agents/digestor.test.js +0 -45
- package/dist/src/agents/reducer.example.d.ts +0 -28
- package/dist/src/agents/reducer.example.js +0 -118
- package/dist/src/agents/reducer.process.d.ts +0 -16
- package/dist/src/agents/reducer.process.js +0 -143
- package/dist/src/agents/reducer.tools.d.ts +0 -29
- package/dist/src/agents/reducer.tools.js +0 -157
- package/dist/src/agents/simpleExample.d.ts +0 -3
- package/dist/src/agents/simpleExample.js +0 -38
- package/dist/src/agents/system-review.d.ts +0 -5
- package/dist/src/agents/system-review.js +0 -181
- package/dist/src/agents/systemReview.d.ts +0 -4
- package/dist/src/agents/systemReview.js +0 -22
- package/dist/src/execute.d.ts +0 -49
- package/dist/src/execute.js +0 -564
- package/dist/src/princing.openai.js +0 -54
- package/dist/src/rag/tools.d.ts +0 -76
- package/dist/src/rag/tools.js +0 -196
- package/dist/src/rules/user.mapper.d.ts +0 -61
- package/dist/src/rules/user.mapper.js +0 -160
- package/dist/src/rules/utils/slug.d.ts +0 -22
- package/dist/src/rules/utils/slug.js +0 -35
package/dist/src/rag/tools.js
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createTools = void 0;
|
|
7
|
-
const fs_1 = require("fs");
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const parser_1 = require("./parser");
|
|
10
|
-
const embeddings_1 = require("./embeddings");
|
|
11
|
-
/**
|
|
12
|
-
* Prompts de suivi pour les outils
|
|
13
|
-
*/
|
|
14
|
-
const lookupReferencesContentFollowUpPrompt = "📋 RÉFÉRENCES DISPONIBLES\n\n";
|
|
15
|
-
const lookupKnowledgeFollowUpPrompt = "🔍 RECHERCHE DANS LA BASE DE CONNAISSANCES\n\n";
|
|
16
|
-
/**
|
|
17
|
-
* Définitions des outils pour l'agent
|
|
18
|
-
*/
|
|
19
|
-
const toolsReferencesContent = {
|
|
20
|
-
type: "function",
|
|
21
|
-
function: {
|
|
22
|
-
name: "lookupReferencesContent",
|
|
23
|
-
description: "Récupère le contenu d'un document spécifique ou liste tous les documents disponibles, optionnellement filtrés par service.",
|
|
24
|
-
parameters: {
|
|
25
|
-
type: "object",
|
|
26
|
-
properties: {
|
|
27
|
-
service: {
|
|
28
|
-
type: "string",
|
|
29
|
-
description: "Nom du service optionnel (ex: 'Gérance', 'PPE', 'Comptabilité') pour filtrer les documents (insensible à la casse)."
|
|
30
|
-
},
|
|
31
|
-
source: {
|
|
32
|
-
type: "string",
|
|
33
|
-
description: "Identifiant source optionnel (généralement un nom de fichier sans extension) pour récupérer le contenu d'un document spécifique."
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
required: [],
|
|
37
|
-
additionalProperties: false
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
const toolsKnowledge = {
|
|
42
|
-
type: "function",
|
|
43
|
-
function: {
|
|
44
|
-
name: "lookupKnowledge",
|
|
45
|
-
description: "Effectue une recherche de connaissances en utilisant la recherche vectorielle basée sur la question de l'utilisateur.",
|
|
46
|
-
parameters: {
|
|
47
|
-
type: "object",
|
|
48
|
-
properties: {
|
|
49
|
-
question: {
|
|
50
|
-
type: "string",
|
|
51
|
-
description: "La question de l'utilisateur à rechercher."
|
|
52
|
-
},
|
|
53
|
-
justification: {
|
|
54
|
-
type: "string",
|
|
55
|
-
description: "Justification optionnelle pour la recherche (actuellement loggée mais non utilisée dans la logique principale)."
|
|
56
|
-
},
|
|
57
|
-
action_suivante: {
|
|
58
|
-
type: "string",
|
|
59
|
-
description: "Action suivante optionnelle pour instruire le LLM après traitement des résultats."
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
required: ["question"],
|
|
63
|
-
additionalProperties: false
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Extrait le header d'un fichier
|
|
69
|
-
*/
|
|
70
|
-
function getMatterHeaderFromFile(filePath) {
|
|
71
|
-
try {
|
|
72
|
-
const content = (0, fs_1.readFileSync)(filePath, 'utf8');
|
|
73
|
-
const { sections } = (0, parser_1.getSections)(content, path_1.default.basename(filePath));
|
|
74
|
-
// Essayer d'extraire le titre de la première section
|
|
75
|
-
const firstSection = sections[0];
|
|
76
|
-
if (firstSection?.title) {
|
|
77
|
-
return { title: firstSection.title };
|
|
78
|
-
}
|
|
79
|
-
// Fallback sur le nom du fichier
|
|
80
|
-
const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
|
|
81
|
-
return { title: filename.replace(/-/g, ' ') };
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
|
|
85
|
-
return { title: filename.replace(/-/g, ' ') };
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// getDocumentFromId supprimée - utilisation directe de semanticSearch
|
|
89
|
-
/**
|
|
90
|
-
* Crée les outils RAG pour un agent
|
|
91
|
-
*/
|
|
92
|
-
const createTools = (openai, config) => {
|
|
93
|
-
// Utiliser l'API Embeddings existante
|
|
94
|
-
const embeddings = new embeddings_1.Embeddings(config);
|
|
95
|
-
if (!embeddings.isReady()) {
|
|
96
|
-
throw new Error(`Index RAG non disponible à ${config.baseDir}. Exécutez buildrag d'abord.`);
|
|
97
|
-
}
|
|
98
|
-
// Charger le mapping des IDs
|
|
99
|
-
const mappingFile = path_1.default.join(config.baseDir, 'rag-mapping.json');
|
|
100
|
-
let ids = {};
|
|
101
|
-
try {
|
|
102
|
-
const mappingData = (0, fs_1.readFileSync)(mappingFile, 'utf8');
|
|
103
|
-
const mapping = JSON.parse(mappingData);
|
|
104
|
-
ids = mapping.mapping;
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
console.error('Erreur lors du chargement du mapping:', error);
|
|
108
|
-
throw new Error('Mapping RAG non disponible');
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Récupère le contenu d'un document spécifique ou liste tous les documents disponibles,
|
|
112
|
-
* optionnellement filtrés par service.
|
|
113
|
-
*/
|
|
114
|
-
const lookupReferencesContent = async ({ service, source }) => {
|
|
115
|
-
const documentPath = config.baseDir;
|
|
116
|
-
const ftService = service?.toLowerCase();
|
|
117
|
-
// Liste tous les fichiers markdown dans le répertoire spécifié
|
|
118
|
-
const mdfiles = (0, fs_1.readdirSync)(documentPath)
|
|
119
|
-
.filter((file) => file.endsWith('.md') &&
|
|
120
|
-
(!ftService || file.toLowerCase().includes(ftService)))
|
|
121
|
-
.map((file) => path_1.default.join(documentPath, file));
|
|
122
|
-
// Si un source spécifique a été demandé
|
|
123
|
-
if (source) {
|
|
124
|
-
source = source.replace(/\.md.*/, '');
|
|
125
|
-
const file = mdfiles.find((file) => file.includes(source));
|
|
126
|
-
if (!file) {
|
|
127
|
-
return { content: `Désolé, je n'ai pas trouvé le document "${source}".` };
|
|
128
|
-
}
|
|
129
|
-
const filename = path_1.default.basename(file);
|
|
130
|
-
const content = (0, fs_1.readFileSync)(file, 'utf8');
|
|
131
|
-
const { sections } = (0, parser_1.getSections)(content, filename);
|
|
132
|
-
if (sections.length > 0) {
|
|
133
|
-
const title = sections[0].title || filename;
|
|
134
|
-
const allContent = sections.map(s => s.content).join('\n\n');
|
|
135
|
-
const response = `${title}\n\n${allContent}\n\n[»](${filename})`;
|
|
136
|
-
return { content: response };
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
return { content: `Le document "${source}" est vide ou mal formaté.` };
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
// Si aucun source spécifié, lister les documents (filtrés par service si applicable)
|
|
143
|
-
const serviceTitle = ftService ? ` pour le service "${service}"` : '';
|
|
144
|
-
if (!mdfiles.length) {
|
|
145
|
-
return { content: `Désolé, aucun document trouvé${serviceTitle}.` };
|
|
146
|
-
}
|
|
147
|
-
const title = `${lookupReferencesContentFollowUpPrompt}Voici la liste exhaustive des documents disponibles${serviceTitle} :\n`;
|
|
148
|
-
const content = title + mdfiles.reduce((acc, file) => {
|
|
149
|
-
const header = getMatterHeaderFromFile(file);
|
|
150
|
-
const filename = path_1.default.basename(file);
|
|
151
|
-
return acc + `- ${header.title} [»](/${filename})\n`;
|
|
152
|
-
}, '');
|
|
153
|
-
return { content };
|
|
154
|
-
};
|
|
155
|
-
/**
|
|
156
|
-
* Effectue une recherche de connaissances en utilisant la recherche vectorielle
|
|
157
|
-
*/
|
|
158
|
-
const lookupKnowledge = async (args, debug = false) => {
|
|
159
|
-
console.log("lookupKnowledge", args.question);
|
|
160
|
-
try {
|
|
161
|
-
// Utiliser l'API de recherche sémantique existante
|
|
162
|
-
const result = await embeddings.semanticSearch(args.question, {
|
|
163
|
-
neighbors: 5,
|
|
164
|
-
debug
|
|
165
|
-
});
|
|
166
|
-
if (!result.results || !result.results.length) {
|
|
167
|
-
return {
|
|
168
|
-
content: `Aucun document relatif à cette question.(⚠️ Tu dois continuer ton plan sans cette information)`
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
console.log(`--- DBG rag search: ${result.results.length} documents trouvés`);
|
|
172
|
-
if (debug) {
|
|
173
|
-
return {
|
|
174
|
-
documents: result.results,
|
|
175
|
-
scores: result.results.map(r => r.score)
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
const action_suivante = args.action_suivante || "";
|
|
179
|
-
const withNextAction = action_suivante ?
|
|
180
|
-
`(⚠️ A la fin de cette tâche, tu dois exécuter l'action suivante: "${action_suivante}")` : "";
|
|
181
|
-
const prefix = `${lookupKnowledgeFollowUpPrompt}Voici les sections des documents (avec les références) à analyser de manière exhaustive.${withNextAction}:\n`;
|
|
182
|
-
const response = prefix + result.results.reduce((doc, curr) => {
|
|
183
|
-
return doc + `\n---\n[${curr.content}](/${curr.ref})`;
|
|
184
|
-
}, '');
|
|
185
|
-
return { content: response };
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error('Erreur lors de la recherche:', error);
|
|
189
|
-
return {
|
|
190
|
-
content: `Erreur lors de la recherche dans la base de connaissances. (⚠️ Tu dois continuer ton plan sans cette information)`
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
return { toolsReferencesContent, toolsKnowledge, lookupReferencesContent, lookupKnowledge };
|
|
195
|
-
};
|
|
196
|
-
exports.createTools = createTools;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { UserMSAL } from '../microsoft/profile';
|
|
2
|
-
import { RuleUser } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* Rôles disponibles pour les règles
|
|
5
|
-
*/
|
|
6
|
-
export declare enum RuleRole {
|
|
7
|
-
READER = "reader",
|
|
8
|
-
EDITOR = "editor",
|
|
9
|
-
VALIDATOR = "validator",
|
|
10
|
-
PUBLISHER = "publisher"
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Configuration des permissions par rôle
|
|
14
|
-
*/
|
|
15
|
-
export interface RolePermissions {
|
|
16
|
-
canRead: boolean;
|
|
17
|
-
canDelete: boolean;
|
|
18
|
-
canEdit: boolean;
|
|
19
|
-
canValidate: boolean;
|
|
20
|
-
canPublish: boolean;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Permissions par rôle
|
|
24
|
-
*/
|
|
25
|
-
export declare const ROLE_PERMISSIONS: Record<RuleRole, RolePermissions>;
|
|
26
|
-
/**
|
|
27
|
-
* Mapper pour convertir UserMSAL en RuleUser
|
|
28
|
-
*/
|
|
29
|
-
export declare class UserRoleMapper {
|
|
30
|
-
/**
|
|
31
|
-
* Convertit un UserMSAL en RuleUser
|
|
32
|
-
* @param userMSAL L'utilisateur MSAL
|
|
33
|
-
* @param overrideRole Rôle à forcer (optionnel)
|
|
34
|
-
*/
|
|
35
|
-
static toRuleUser(userMSAL: UserMSAL, overrideRole?: RuleRole): RuleUser;
|
|
36
|
-
/**
|
|
37
|
-
* Détermine le rôle d'un utilisateur basé sur ses propriétés MSAL
|
|
38
|
-
* @param userMSAL L'utilisateur MSAL
|
|
39
|
-
*/
|
|
40
|
-
private static determineRoleFromMSAL;
|
|
41
|
-
/**
|
|
42
|
-
* Vérifie si un utilisateur a une permission spécifique
|
|
43
|
-
* @param userMSAL L'utilisateur MSAL
|
|
44
|
-
* @param permission La permission à vérifier
|
|
45
|
-
* @param overrideRole Rôle à forcer (optionnel)
|
|
46
|
-
*/
|
|
47
|
-
static hasPermission(userMSAL: UserMSAL, permission: keyof RolePermissions, overrideRole?: RuleRole): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* Obtient toutes les permissions d'un utilisateur
|
|
50
|
-
* @param userMSAL L'utilisateur MSAL
|
|
51
|
-
* @param overrideRole Rôle à forcer (optionnel)
|
|
52
|
-
*/
|
|
53
|
-
static getPermissions(userMSAL: UserMSAL, overrideRole?: RuleRole): RolePermissions;
|
|
54
|
-
/**
|
|
55
|
-
* Vérifie si un utilisateur peut effectuer une action sur une branche donnée
|
|
56
|
-
* @param userMSAL L'utilisateur MSAL
|
|
57
|
-
* @param action L'action à effectuer
|
|
58
|
-
* @param branch La branche concernée
|
|
59
|
-
*/
|
|
60
|
-
static canPerformAction(userMSAL: UserMSAL, action: 'read' | 'edit' | 'validate' | 'publish' | 'delete', branch: string): boolean;
|
|
61
|
-
}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UserRoleMapper = exports.ROLE_PERMISSIONS = exports.RuleRole = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Rôles disponibles pour les règles
|
|
6
|
-
*/
|
|
7
|
-
var RuleRole;
|
|
8
|
-
(function (RuleRole) {
|
|
9
|
-
RuleRole["READER"] = "reader";
|
|
10
|
-
RuleRole["EDITOR"] = "editor";
|
|
11
|
-
RuleRole["VALIDATOR"] = "validator";
|
|
12
|
-
RuleRole["PUBLISHER"] = "publisher";
|
|
13
|
-
})(RuleRole || (exports.RuleRole = RuleRole = {}));
|
|
14
|
-
/**
|
|
15
|
-
* Permissions par rôle
|
|
16
|
-
*/
|
|
17
|
-
exports.ROLE_PERMISSIONS = {
|
|
18
|
-
[RuleRole.READER]: {
|
|
19
|
-
canRead: true,
|
|
20
|
-
canDelete: false,
|
|
21
|
-
canEdit: false,
|
|
22
|
-
canValidate: false,
|
|
23
|
-
canPublish: false
|
|
24
|
-
},
|
|
25
|
-
[RuleRole.EDITOR]: {
|
|
26
|
-
canRead: true,
|
|
27
|
-
canDelete: true,
|
|
28
|
-
canEdit: true,
|
|
29
|
-
canValidate: false,
|
|
30
|
-
canPublish: false
|
|
31
|
-
},
|
|
32
|
-
[RuleRole.VALIDATOR]: {
|
|
33
|
-
canRead: true,
|
|
34
|
-
canDelete: true,
|
|
35
|
-
canEdit: true,
|
|
36
|
-
canValidate: true,
|
|
37
|
-
canPublish: false
|
|
38
|
-
},
|
|
39
|
-
[RuleRole.PUBLISHER]: {
|
|
40
|
-
canRead: true,
|
|
41
|
-
canDelete: true,
|
|
42
|
-
canEdit: true,
|
|
43
|
-
canValidate: true,
|
|
44
|
-
canPublish: true
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* Mapper pour convertir UserMSAL en RuleUser
|
|
49
|
-
*/
|
|
50
|
-
class UserRoleMapper {
|
|
51
|
-
/**
|
|
52
|
-
* Convertit un UserMSAL en RuleUser
|
|
53
|
-
* @param userMSAL L'utilisateur MSAL
|
|
54
|
-
* @param overrideRole Rôle à forcer (optionnel)
|
|
55
|
-
*/
|
|
56
|
-
static toRuleUser(userMSAL, overrideRole) {
|
|
57
|
-
// Déterminer le rôle
|
|
58
|
-
let role = overrideRole;
|
|
59
|
-
if (!role) {
|
|
60
|
-
// Déterminer le rôle basé sur les propriétés de l'utilisateur MSAL
|
|
61
|
-
role = this.determineRoleFromMSAL(userMSAL);
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
name: userMSAL.displayName || userMSAL.id,
|
|
65
|
-
email: userMSAL.mail || `${userMSAL.id}@placeholder.local`,
|
|
66
|
-
role: role
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Détermine le rôle d'un utilisateur basé sur ses propriétés MSAL
|
|
71
|
-
* @param userMSAL L'utilisateur MSAL
|
|
72
|
-
*/
|
|
73
|
-
static determineRoleFromMSAL(userMSAL) {
|
|
74
|
-
// Logique de détermination du rôle basée sur les propriétés MSAL
|
|
75
|
-
// Cette logique peut être personnalisée selon les besoins de l'organisation
|
|
76
|
-
// Par défaut, utiliser hasRole() si disponible
|
|
77
|
-
const userRole = userMSAL.role;
|
|
78
|
-
// Mapper les rôles MSAL vers les rôles de règles
|
|
79
|
-
switch (userRole?.toLowerCase()) {
|
|
80
|
-
case 'admin':
|
|
81
|
-
case 'administrator':
|
|
82
|
-
case 'director':
|
|
83
|
-
case 'publisher':
|
|
84
|
-
return RuleRole.PUBLISHER;
|
|
85
|
-
case 'manager':
|
|
86
|
-
case 'chef':
|
|
87
|
-
case 'validator':
|
|
88
|
-
case 'reviewer':
|
|
89
|
-
return RuleRole.VALIDATOR;
|
|
90
|
-
case 'editor':
|
|
91
|
-
case 'contributor':
|
|
92
|
-
case 'writer':
|
|
93
|
-
return RuleRole.EDITOR;
|
|
94
|
-
case 'reader':
|
|
95
|
-
case 'viewer':
|
|
96
|
-
case 'anonymous':
|
|
97
|
-
default:
|
|
98
|
-
return RuleRole.READER;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Vérifie si un utilisateur a une permission spécifique
|
|
103
|
-
* @param userMSAL L'utilisateur MSAL
|
|
104
|
-
* @param permission La permission à vérifier
|
|
105
|
-
* @param overrideRole Rôle à forcer (optionnel)
|
|
106
|
-
*/
|
|
107
|
-
static hasPermission(userMSAL, permission, overrideRole) {
|
|
108
|
-
const ruleUser = this.toRuleUser(userMSAL, overrideRole);
|
|
109
|
-
const role = ruleUser.role || RuleRole.READER;
|
|
110
|
-
return exports.ROLE_PERMISSIONS[role][permission];
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Obtient toutes les permissions d'un utilisateur
|
|
114
|
-
* @param userMSAL L'utilisateur MSAL
|
|
115
|
-
* @param overrideRole Rôle à forcer (optionnel)
|
|
116
|
-
*/
|
|
117
|
-
static getPermissions(userMSAL, overrideRole) {
|
|
118
|
-
const ruleUser = this.toRuleUser(userMSAL, overrideRole);
|
|
119
|
-
const role = ruleUser.role || RuleRole.READER;
|
|
120
|
-
return exports.ROLE_PERMISSIONS[role];
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Vérifie si un utilisateur peut effectuer une action sur une branche donnée
|
|
124
|
-
* @param userMSAL L'utilisateur MSAL
|
|
125
|
-
* @param action L'action à effectuer
|
|
126
|
-
* @param branch La branche concernée
|
|
127
|
-
*/
|
|
128
|
-
static canPerformAction(userMSAL, action, branch) {
|
|
129
|
-
// Déterminer le rôle requis selon l'action et la branche
|
|
130
|
-
const isValidationBranch = branch.startsWith('rule-validation-');
|
|
131
|
-
const isMainBranch = branch === 'main';
|
|
132
|
-
switch (action) {
|
|
133
|
-
case 'delete':
|
|
134
|
-
return this.hasPermission(userMSAL, 'canDelete');
|
|
135
|
-
case 'read':
|
|
136
|
-
return this.hasPermission(userMSAL, 'canRead');
|
|
137
|
-
case 'edit':
|
|
138
|
-
// L'édition n'est autorisée que sur la branche d'édition
|
|
139
|
-
if (branch !== 'rule-editor' && !isValidationBranch) {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
return this.hasPermission(userMSAL, 'canEdit');
|
|
143
|
-
case 'validate':
|
|
144
|
-
// La validation n'est autorisée que sur les branches de validation
|
|
145
|
-
if (!isValidationBranch) {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
return this.hasPermission(userMSAL, 'canValidate');
|
|
149
|
-
case 'publish':
|
|
150
|
-
// La publication n'est autorisée que depuis les branches de validation vers main
|
|
151
|
-
if (!isValidationBranch) {
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
return this.hasPermission(userMSAL, 'canPublish');
|
|
155
|
-
default:
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
exports.UserRoleMapper = UserRoleMapper;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for handling slugs in the rules system
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Extracts a slug from a file path
|
|
6
|
-
* @param filePath The file path to extract the slug from
|
|
7
|
-
* @returns The slug extracted from the file path
|
|
8
|
-
*/
|
|
9
|
-
export declare const slugFromFile: (filePath: string, ext?: string) => string;
|
|
10
|
-
/**
|
|
11
|
-
* Converts a slug back to a file path
|
|
12
|
-
* @param slug The slug to convert to a file path
|
|
13
|
-
* @param ext The file extension to append (default: '.md')
|
|
14
|
-
* @returns The file path created from the slug
|
|
15
|
-
*/
|
|
16
|
-
export declare const fileFromSlug: (slug: string, ext?: string) => string;
|
|
17
|
-
/**
|
|
18
|
-
* Validates if a string is a valid slug
|
|
19
|
-
* @param slug The slug to validate
|
|
20
|
-
* @returns True if the slug is valid, false otherwise
|
|
21
|
-
*/
|
|
22
|
-
export declare const isValidSlug: (slug: string) => boolean;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Utility functions for handling slugs in the rules system
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isValidSlug = exports.fileFromSlug = exports.slugFromFile = void 0;
|
|
7
|
-
const utils_1 = require("../../utils");
|
|
8
|
-
/**
|
|
9
|
-
* Extracts a slug from a file path
|
|
10
|
-
* @param filePath The file path to extract the slug from
|
|
11
|
-
* @returns The slug extracted from the file path
|
|
12
|
-
*/
|
|
13
|
-
const slugFromFile = (filePath, ext = '.md') => {
|
|
14
|
-
return (0, utils_1.toSlug)(filePath.replace(ext, ''));
|
|
15
|
-
};
|
|
16
|
-
exports.slugFromFile = slugFromFile;
|
|
17
|
-
/**
|
|
18
|
-
* Converts a slug back to a file path
|
|
19
|
-
* @param slug The slug to convert to a file path
|
|
20
|
-
* @param ext The file extension to append (default: '.md')
|
|
21
|
-
* @returns The file path created from the slug
|
|
22
|
-
*/
|
|
23
|
-
const fileFromSlug = (slug, ext = '.md') => {
|
|
24
|
-
return `${slug}${ext}`;
|
|
25
|
-
};
|
|
26
|
-
exports.fileFromSlug = fileFromSlug;
|
|
27
|
-
/**
|
|
28
|
-
* Validates if a string is a valid slug
|
|
29
|
-
* @param slug The slug to validate
|
|
30
|
-
* @returns True if the slug is valid, false otherwise
|
|
31
|
-
*/
|
|
32
|
-
const isValidSlug = (slug) => {
|
|
33
|
-
return /^[a-z0-9-]+$/.test(slug);
|
|
34
|
-
};
|
|
35
|
-
exports.isValidSlug = isValidSlug;
|