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.
Files changed (102) hide show
  1. package/dist/src/agents/agents.example.js +21 -22
  2. package/dist/src/agents/authentication.js +1 -2
  3. package/dist/src/agents/prompts.d.ts +5 -4
  4. package/dist/src/agents/prompts.js +44 -87
  5. package/dist/src/agents/reducer.core.d.ts +24 -2
  6. package/dist/src/agents/reducer.core.js +125 -35
  7. package/dist/src/agents/reducer.loaders.d.ts +55 -1
  8. package/dist/src/agents/reducer.loaders.js +114 -1
  9. package/dist/src/agents/reducer.types.d.ts +45 -2
  10. package/dist/src/agents/semantic.js +1 -2
  11. package/dist/src/agents/simulator.d.ts +11 -3
  12. package/dist/src/agents/simulator.executor.d.ts +14 -4
  13. package/dist/src/agents/simulator.executor.js +81 -23
  14. package/dist/src/agents/simulator.js +128 -42
  15. package/dist/src/agents/simulator.prompts.d.ts +9 -7
  16. package/dist/src/agents/simulator.prompts.js +66 -86
  17. package/dist/src/agents/simulator.types.d.ts +23 -5
  18. package/dist/src/agents/simulator.utils.d.ts +7 -2
  19. package/dist/src/agents/simulator.utils.js +31 -11
  20. package/dist/src/agents/system.js +1 -2
  21. package/dist/src/execute/helpers.d.ts +75 -0
  22. package/dist/src/execute/helpers.js +139 -0
  23. package/dist/src/execute/index.d.ts +11 -0
  24. package/dist/src/execute/index.js +44 -0
  25. package/dist/src/execute/legacy.d.ts +46 -0
  26. package/dist/src/execute/legacy.js +460 -0
  27. package/dist/src/execute/modelconfig.d.ts +19 -0
  28. package/dist/src/execute/modelconfig.js +56 -0
  29. package/dist/src/execute/responses.d.ts +55 -0
  30. package/dist/src/execute/responses.js +594 -0
  31. package/dist/src/execute/shared.d.ts +83 -0
  32. package/dist/src/execute/shared.js +188 -0
  33. package/dist/src/index.d.ts +1 -1
  34. package/dist/src/index.js +2 -2
  35. package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
  36. package/dist/src/pricing.llm.js +255 -0
  37. package/dist/src/prompts.d.ts +13 -4
  38. package/dist/src/prompts.js +221 -114
  39. package/dist/src/rag/embeddings.d.ts +36 -18
  40. package/dist/src/rag/embeddings.js +131 -128
  41. package/dist/src/rag/index.d.ts +5 -5
  42. package/dist/src/rag/index.js +14 -17
  43. package/dist/src/rag/parser.d.ts +2 -1
  44. package/dist/src/rag/parser.js +11 -14
  45. package/dist/src/rag/rag.examples.d.ts +27 -0
  46. package/dist/src/rag/rag.examples.js +151 -0
  47. package/dist/src/rag/rag.manager.d.ts +383 -0
  48. package/dist/src/rag/rag.manager.js +1390 -0
  49. package/dist/src/rag/types.d.ts +128 -12
  50. package/dist/src/rag/types.js +100 -1
  51. package/dist/src/rag/usecase.d.ts +37 -0
  52. package/dist/src/rag/usecase.js +96 -7
  53. package/dist/src/rules/git/git.e2e.helper.js +22 -2
  54. package/dist/src/rules/git/git.health.d.ts +61 -2
  55. package/dist/src/rules/git/git.health.js +333 -11
  56. package/dist/src/rules/git/index.d.ts +2 -2
  57. package/dist/src/rules/git/index.js +13 -1
  58. package/dist/src/rules/git/repo.d.ts +160 -0
  59. package/dist/src/rules/git/repo.js +777 -0
  60. package/dist/src/rules/git/repo.pr.js +117 -13
  61. package/dist/src/rules/git/repo.tools.d.ts +22 -1
  62. package/dist/src/rules/git/repo.tools.js +50 -1
  63. package/dist/src/rules/types.d.ts +27 -14
  64. package/dist/src/rules/utils.matter.d.ts +0 -4
  65. package/dist/src/rules/utils.matter.js +35 -7
  66. package/dist/src/scrapper.d.ts +15 -22
  67. package/dist/src/scrapper.js +58 -110
  68. package/dist/src/stategraph/index.d.ts +1 -1
  69. package/dist/src/stategraph/stategraph.d.ts +56 -2
  70. package/dist/src/stategraph/stategraph.js +134 -6
  71. package/dist/src/stategraph/stategraph.storage.js +8 -0
  72. package/dist/src/stategraph/types.d.ts +27 -0
  73. package/dist/src/types.d.ts +46 -9
  74. package/dist/src/types.js +8 -7
  75. package/dist/src/usecase.d.ts +11 -2
  76. package/dist/src/usecase.js +27 -35
  77. package/dist/src/utils.d.ts +32 -18
  78. package/dist/src/utils.js +87 -129
  79. package/package.json +10 -3
  80. package/dist/src/agents/digestor.test.d.ts +0 -1
  81. package/dist/src/agents/digestor.test.js +0 -45
  82. package/dist/src/agents/reducer.example.d.ts +0 -28
  83. package/dist/src/agents/reducer.example.js +0 -118
  84. package/dist/src/agents/reducer.process.d.ts +0 -16
  85. package/dist/src/agents/reducer.process.js +0 -143
  86. package/dist/src/agents/reducer.tools.d.ts +0 -29
  87. package/dist/src/agents/reducer.tools.js +0 -157
  88. package/dist/src/agents/simpleExample.d.ts +0 -3
  89. package/dist/src/agents/simpleExample.js +0 -38
  90. package/dist/src/agents/system-review.d.ts +0 -5
  91. package/dist/src/agents/system-review.js +0 -181
  92. package/dist/src/agents/systemReview.d.ts +0 -4
  93. package/dist/src/agents/systemReview.js +0 -22
  94. package/dist/src/execute.d.ts +0 -49
  95. package/dist/src/execute.js +0 -564
  96. package/dist/src/princing.openai.js +0 -54
  97. package/dist/src/rag/tools.d.ts +0 -76
  98. package/dist/src/rag/tools.js +0 -196
  99. package/dist/src/rules/user.mapper.d.ts +0 -61
  100. package/dist/src/rules/user.mapper.js +0 -160
  101. package/dist/src/rules/utils/slug.d.ts +0 -22
  102. package/dist/src/rules/utils/slug.js +0 -35
@@ -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;