@linklabjs/core 0.1.0 → 0.1.2
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/api/DomainNode.d.ts +154 -0
- package/dist/api/DomainNode.d.ts.map +1 -0
- package/dist/api/DomainNode.js +1157 -0
- package/dist/api/DomainNode.js.map +1 -0
- package/dist/api/Graph.d.ts +117 -0
- package/dist/api/Graph.d.ts.map +1 -0
- package/dist/api/Graph.js +212 -0
- package/dist/api/Graph.js.map +1 -0
- package/dist/api/PathBuilder.d.ts +76 -0
- package/dist/api/PathBuilder.d.ts.map +1 -0
- package/dist/api/PathBuilder.js +182 -0
- package/dist/api/PathBuilder.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/loadGraph.d.ts +57 -0
- package/dist/api/loadGraph.d.ts.map +1 -0
- package/dist/api/loadGraph.js +153 -0
- package/dist/api/loadGraph.js.map +1 -0
- package/dist/api/test-api.d.ts +9 -0
- package/dist/api/test-api.d.ts.map +1 -0
- package/dist/api/test-api.js +133 -0
- package/dist/api/test-api.js.map +1 -0
- package/dist/api/test-domain.d.ts +13 -0
- package/dist/api/test-domain.d.ts.map +1 -0
- package/dist/api/test-domain.js +105 -0
- package/dist/api/test-domain.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +22 -0
- package/dist/api/types.js.map +1 -0
- package/dist/config/synonyms.json +25 -0
- package/dist/core/EventBus.d.ts +56 -0
- package/dist/core/EventBus.d.ts.map +1 -0
- package/dist/core/EventBus.js +147 -0
- package/dist/core/EventBus.js.map +1 -0
- package/dist/core/GraphEvents.d.ts +118 -0
- package/dist/core/GraphEvents.d.ts.map +1 -0
- package/dist/core/GraphEvents.js +23 -0
- package/dist/core/GraphEvents.js.map +1 -0
- package/dist/core/PathFinder.d.ts +43 -0
- package/dist/core/PathFinder.d.ts.map +1 -0
- package/dist/core/PathFinder.js +264 -0
- package/dist/core/PathFinder.js.map +1 -0
- package/dist/formatters/BaseFormatter.d.ts +15 -0
- package/dist/formatters/BaseFormatter.d.ts.map +1 -0
- package/dist/formatters/BaseFormatter.js +9 -0
- package/dist/formatters/BaseFormatter.js.map +1 -0
- package/dist/graph/GraphAssembler.d.ts +14 -0
- package/dist/graph/GraphAssembler.d.ts.map +1 -0
- package/dist/graph/GraphAssembler.js +44 -0
- package/dist/graph/GraphAssembler.js.map +1 -0
- package/dist/graph/GraphCompiler.d.ts +37 -0
- package/dist/graph/GraphCompiler.d.ts.map +1 -0
- package/dist/graph/GraphCompiler.js +355 -0
- package/dist/graph/GraphCompiler.js.map +1 -0
- package/dist/graph/GraphExtractor.d.ts +21 -0
- package/dist/graph/GraphExtractor.d.ts.map +1 -0
- package/dist/graph/GraphExtractor.js +145 -0
- package/dist/graph/GraphExtractor.js.map +1 -0
- package/dist/graph/GraphOptimizer.d.ts +104 -0
- package/dist/graph/GraphOptimizer.d.ts.map +1 -0
- package/dist/graph/GraphOptimizer.js +306 -0
- package/dist/graph/GraphOptimizer.js.map +1 -0
- package/dist/graph/GraphTrainer.d.ts +52 -0
- package/dist/graph/GraphTrainer.d.ts.map +1 -0
- package/dist/graph/GraphTrainer.js +188 -0
- package/dist/graph/GraphTrainer.js.map +1 -0
- package/dist/http/LinkBuilder.d.ts +82 -0
- package/dist/http/LinkBuilder.d.ts.map +1 -0
- package/dist/http/LinkBuilder.js +190 -0
- package/dist/http/LinkBuilder.js.map +1 -0
- package/dist/http/TrailRequest.d.ts +39 -0
- package/dist/http/TrailRequest.d.ts.map +1 -0
- package/dist/http/TrailRequest.js +22 -0
- package/dist/http/TrailRequest.js.map +1 -0
- package/dist/http/example-netflix.d.ts +6 -0
- package/dist/http/example-netflix.d.ts.map +1 -0
- package/dist/http/example-netflix.js +52 -0
- package/dist/http/example-netflix.js.map +1 -0
- package/dist/http/index.d.ts +32 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +27 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/plugin.d.ts +110 -0
- package/dist/http/plugin.d.ts.map +1 -0
- package/dist/http/plugin.js +217 -0
- package/dist/http/plugin.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/TelemetryShim.d.ts +114 -0
- package/dist/instrumentation/TelemetryShim.d.ts.map +1 -0
- package/dist/instrumentation/TelemetryShim.js +107 -0
- package/dist/instrumentation/TelemetryShim.js.map +1 -0
- package/dist/navigation/NavigationEngine.d.ts +69 -0
- package/dist/navigation/NavigationEngine.d.ts.map +1 -0
- package/dist/navigation/NavigationEngine.js +361 -0
- package/dist/navigation/NavigationEngine.js.map +1 -0
- package/dist/navigation/Resolver.d.ts +35 -0
- package/dist/navigation/Resolver.d.ts.map +1 -0
- package/dist/navigation/Resolver.js +113 -0
- package/dist/navigation/Resolver.js.map +1 -0
- package/dist/navigation/Scheduler.d.ts +36 -0
- package/dist/navigation/Scheduler.d.ts.map +1 -0
- package/dist/navigation/Scheduler.js +107 -0
- package/dist/navigation/Scheduler.js.map +1 -0
- package/dist/navigation/Trail.d.ts +129 -0
- package/dist/navigation/Trail.d.ts.map +1 -0
- package/dist/navigation/Trail.js +202 -0
- package/dist/navigation/Trail.js.map +1 -0
- package/dist/navigation/TrailParser.d.ts +96 -0
- package/dist/navigation/TrailParser.d.ts.map +1 -0
- package/dist/navigation/TrailParser.js +180 -0
- package/dist/navigation/TrailParser.js.map +1 -0
- package/dist/navigation/index.d.ts +10 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +9 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/providers/MockProvider.d.ts +29 -0
- package/dist/providers/MockProvider.d.ts.map +1 -0
- package/dist/providers/MockProvider.js +55 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/PostgresProvider.d.ts +46 -0
- package/dist/providers/PostgresProvider.d.ts.map +1 -0
- package/dist/providers/PostgresProvider.js +152 -0
- package/dist/providers/PostgresProvider.js.map +1 -0
- package/dist/runtime/CompiledGraphEngine.d.ts +74 -0
- package/dist/runtime/CompiledGraphEngine.d.ts.map +1 -0
- package/dist/runtime/CompiledGraphEngine.js +211 -0
- package/dist/runtime/CompiledGraphEngine.js.map +1 -0
- package/dist/runtime/DataLoader.d.ts +90 -0
- package/dist/runtime/DataLoader.d.ts.map +1 -0
- package/dist/runtime/DataLoader.js +178 -0
- package/dist/runtime/DataLoader.js.map +1 -0
- package/dist/runtime/Engine.d.ts +36 -0
- package/dist/runtime/Engine.d.ts.map +1 -0
- package/dist/runtime/Engine.js +128 -0
- package/dist/runtime/Engine.js.map +1 -0
- package/dist/runtime/QueryEngine.d.ts +80 -0
- package/dist/runtime/QueryEngine.d.ts.map +1 -0
- package/dist/runtime/QueryEngine.js +188 -0
- package/dist/runtime/QueryEngine.js.map +1 -0
- package/dist/scenarios/test-metro-paris/config.json +6 -0
- package/dist/scenarios/test-metro-paris/graph.json +16325 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts +22 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts.map +1 -0
- package/dist/scenarios/test-metro-paris/queries.js +128 -0
- package/dist/scenarios/test-metro-paris/queries.js.map +1 -0
- package/dist/scenarios/test-metro-paris/stack.json +1 -0
- package/dist/scenarios/test-musicians/config.json +10 -0
- package/dist/scenarios/test-musicians/graph.json +20 -0
- package/dist/scenarios/test-musicians/stack.json +1 -0
- package/dist/scenarios/test-netflix/actions.d.ts +14 -0
- package/dist/scenarios/test-netflix/actions.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/actions.js +86 -0
- package/dist/scenarios/test-netflix/actions.js.map +1 -0
- package/dist/scenarios/test-netflix/config.json +6 -0
- package/dist/scenarios/test-netflix/data/categories.json +1 -0
- package/dist/scenarios/test-netflix/data/companies.json +1 -0
- package/dist/scenarios/test-netflix/data/credits.json +19797 -0
- package/dist/scenarios/test-netflix/data/departments.json +18 -0
- package/dist/scenarios/test-netflix/data/jobs.json +142 -0
- package/dist/scenarios/test-netflix/data/movies.json +3497 -0
- package/dist/scenarios/test-netflix/data/people.json +1 -0
- package/dist/scenarios/test-netflix/data/synonyms.json +7 -0
- package/dist/scenarios/test-netflix/data/users.json +70 -0
- package/dist/scenarios/test-netflix/graph.json +1017 -0
- package/dist/scenarios/test-netflix/queries.d.ts +29 -0
- package/dist/scenarios/test-netflix/queries.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/queries.js +134 -0
- package/dist/scenarios/test-netflix/queries.js.map +1 -0
- package/dist/scenarios/test-netflix/stack.json +14 -0
- package/dist/schema/GraphBuilder.d.ts +9 -0
- package/dist/schema/GraphBuilder.d.ts.map +1 -0
- package/dist/schema/GraphBuilder.js +90 -0
- package/dist/schema/GraphBuilder.js.map +1 -0
- package/dist/schema/JsonSchemaExtractor.d.ts +21 -0
- package/dist/schema/JsonSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/JsonSchemaExtractor.js +88 -0
- package/dist/schema/JsonSchemaExtractor.js.map +1 -0
- package/dist/schema/SchemaAnalyzer.d.ts +41 -0
- package/dist/schema/SchemaAnalyzer.d.ts.map +1 -0
- package/dist/schema/SchemaAnalyzer.js +144 -0
- package/dist/schema/SchemaAnalyzer.js.map +1 -0
- package/dist/schema/SchemaExtractor.d.ts +10 -0
- package/dist/schema/SchemaExtractor.d.ts.map +1 -0
- package/dist/schema/SchemaExtractor.js +90 -0
- package/dist/schema/SchemaExtractor.js.map +1 -0
- package/dist/schema/SynonymResolver.d.ts +55 -0
- package/dist/schema/SynonymResolver.d.ts.map +1 -0
- package/dist/schema/SynonymResolver.js +121 -0
- package/dist/schema/SynonymResolver.js.map +1 -0
- package/dist/scripts/dictionary.json +796 -0
- package/dist/scripts/graph.json +664 -0
- package/dist/scripts/regenerate.d.ts +23 -0
- package/dist/scripts/regenerate.d.ts.map +1 -0
- package/dist/scripts/regenerate.js +206 -0
- package/dist/scripts/regenerate.js.map +1 -0
- package/dist/types/index.d.ts +394 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NavigationEngine - Moteur de navigation sémantique
|
|
3
|
+
*
|
|
4
|
+
* Trois modes orthogonaux :
|
|
5
|
+
*
|
|
6
|
+
* PATHFIND — Trouver les N meilleurs chemins entre deux nœuds
|
|
7
|
+
* NAVIGATE — Résoudre une stack de frames étape par étape
|
|
8
|
+
* SCHEDULE — Exécuter des actions par priorité sur un contexte
|
|
9
|
+
*
|
|
10
|
+
* Trois bus exposés sur chaque instance :
|
|
11
|
+
*
|
|
12
|
+
* engine.hooks — awaitable, enrichit ou annule le flux
|
|
13
|
+
* engine.events — fire-and-forget, observation pure
|
|
14
|
+
* engine.errors — synchrone, jamais silencieux
|
|
15
|
+
*
|
|
16
|
+
* Trail :
|
|
17
|
+
* Le moteur accepte un Trail existant (Option B).
|
|
18
|
+
* Si aucun Trail n'est fourni, il en crée un à partir de initialStack.
|
|
19
|
+
* engine.trail est toujours accessible après création.
|
|
20
|
+
*
|
|
21
|
+
* ── Instrumentation @linklab/telemetry ──────────────────────────────────────
|
|
22
|
+
* Chaque appel à run() produit un Span si @linklab/telemetry est installé.
|
|
23
|
+
* Points mesurés :
|
|
24
|
+
* - Step 'PathFinder' : durée de findAllPaths() (mode PATHFIND)
|
|
25
|
+
* - Step 'Resolver' : durée de resolver.resolve() par frame (mode NAVIGATE)
|
|
26
|
+
* - Step 'Scheduler' : durée de scheduler.step() (mode SCHEDULE)
|
|
27
|
+
* Le span est émis sur traceBus à la fin de run(), succès ou erreur.
|
|
28
|
+
*/
|
|
29
|
+
import type { Graph, Frame, ScheduleAction, EngineMode, NavigationEngineConfig, EngineStepResult, PathQuery } from '../types/index.js';
|
|
30
|
+
import { Trail } from './Trail.js';
|
|
31
|
+
import { type GraphBuses } from '../core/GraphEvents.js';
|
|
32
|
+
export declare class NavigationEngine {
|
|
33
|
+
private mode;
|
|
34
|
+
private graph;
|
|
35
|
+
private pathFinder?;
|
|
36
|
+
private resolver?;
|
|
37
|
+
private scheduler?;
|
|
38
|
+
private config;
|
|
39
|
+
readonly trail: Trail;
|
|
40
|
+
readonly hooks: GraphBuses['hooks'];
|
|
41
|
+
readonly events: GraphBuses['events'];
|
|
42
|
+
readonly errors: GraphBuses['errors'];
|
|
43
|
+
constructor(config: NavigationEngineConfig);
|
|
44
|
+
static forPathfinding(graph: Graph, query: PathQuery): NavigationEngine;
|
|
45
|
+
static forNavigation(graph: Graph, options: {
|
|
46
|
+
trail: Trail;
|
|
47
|
+
} | {
|
|
48
|
+
stack: Frame[];
|
|
49
|
+
}): NavigationEngine;
|
|
50
|
+
static forScheduling(graph: Graph, options: {
|
|
51
|
+
trail?: Trail;
|
|
52
|
+
stack?: Frame[];
|
|
53
|
+
actions: ScheduleAction[];
|
|
54
|
+
}): NavigationEngine;
|
|
55
|
+
run(maxSteps?: number): Promise<EngineStepResult[]>;
|
|
56
|
+
private runPathfind;
|
|
57
|
+
private runNavigate;
|
|
58
|
+
private runSchedule;
|
|
59
|
+
private _buildTrailString;
|
|
60
|
+
private _resolvedFrom;
|
|
61
|
+
private _targetTo;
|
|
62
|
+
private _currentFilters;
|
|
63
|
+
private _countRows;
|
|
64
|
+
getMode(): EngineMode;
|
|
65
|
+
getGraph(): Graph;
|
|
66
|
+
/** @deprecated Utiliser engine.trail directement */
|
|
67
|
+
getCurrentStack(): Frame[];
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=NavigationEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationEngine.d.ts","sourceRoot":"","sources":["../../src/navigation/NavigationEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EACV,KAAK,EAEL,KAAK,EACL,cAAc,EACd,UAAU,EACV,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EAEV,MAAM,mBAAmB,CAAA;AAK1B,OAAO,EAAE,KAAK,EAAE,MAAW,YAAY,CAAA;AACvC,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAG1E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,MAAM,CAA6B;IAG3C,SAAgB,KAAK,EAAE,KAAK,CAAA;IAG5B,SAAgB,KAAK,EAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3C,SAAgB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC5C,SAAgB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAEhC,MAAM,EAAE,sBAAsB;IAqC1C,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,gBAAgB;IAIvE,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,KAAK,EAAE,CAAA;KAAE,GAC7C,gBAAgB;IAOnB,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,GACrE,gBAAgB;IAOb,GAAG,CAAC,QAAQ,GAAE,MAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAqD9C,WAAW;YA0EX,WAAW;YAoGX,WAAW;IA+CzB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,UAAU;IAWlB,OAAO,IAAK,UAAU;IACtB,QAAQ,IAAI,KAAK;IAEjB,oDAAoD;IACpD,eAAe,IAAI,KAAK,EAAE;CAC3B"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NavigationEngine - Moteur de navigation sémantique
|
|
3
|
+
*
|
|
4
|
+
* Trois modes orthogonaux :
|
|
5
|
+
*
|
|
6
|
+
* PATHFIND — Trouver les N meilleurs chemins entre deux nœuds
|
|
7
|
+
* NAVIGATE — Résoudre une stack de frames étape par étape
|
|
8
|
+
* SCHEDULE — Exécuter des actions par priorité sur un contexte
|
|
9
|
+
*
|
|
10
|
+
* Trois bus exposés sur chaque instance :
|
|
11
|
+
*
|
|
12
|
+
* engine.hooks — awaitable, enrichit ou annule le flux
|
|
13
|
+
* engine.events — fire-and-forget, observation pure
|
|
14
|
+
* engine.errors — synchrone, jamais silencieux
|
|
15
|
+
*
|
|
16
|
+
* Trail :
|
|
17
|
+
* Le moteur accepte un Trail existant (Option B).
|
|
18
|
+
* Si aucun Trail n'est fourni, il en crée un à partir de initialStack.
|
|
19
|
+
* engine.trail est toujours accessible après création.
|
|
20
|
+
*
|
|
21
|
+
* ── Instrumentation @linklab/telemetry ──────────────────────────────────────
|
|
22
|
+
* Chaque appel à run() produit un Span si @linklab/telemetry est installé.
|
|
23
|
+
* Points mesurés :
|
|
24
|
+
* - Step 'PathFinder' : durée de findAllPaths() (mode PATHFIND)
|
|
25
|
+
* - Step 'Resolver' : durée de resolver.resolve() par frame (mode NAVIGATE)
|
|
26
|
+
* - Step 'Scheduler' : durée de scheduler.step() (mode SCHEDULE)
|
|
27
|
+
* Le span est émis sur traceBus à la fin de run(), succès ou erreur.
|
|
28
|
+
*/
|
|
29
|
+
import { PathFinder } from '../core/PathFinder.js';
|
|
30
|
+
import { Resolver } from './Resolver.js';
|
|
31
|
+
import { Scheduler } from './Scheduler.js';
|
|
32
|
+
import { Trail } from './Trail.js';
|
|
33
|
+
import { createGraphBuses } from '../core/GraphEvents.js';
|
|
34
|
+
import { shim } from '../instrumentation/TelemetryShim.js';
|
|
35
|
+
export class NavigationEngine {
|
|
36
|
+
mode;
|
|
37
|
+
graph;
|
|
38
|
+
pathFinder;
|
|
39
|
+
resolver;
|
|
40
|
+
scheduler;
|
|
41
|
+
config;
|
|
42
|
+
// ── Trail — contexte de navigation vivant ────────────────────
|
|
43
|
+
trail;
|
|
44
|
+
// ── Les trois bus ────────────────────────────────────────────
|
|
45
|
+
hooks;
|
|
46
|
+
events;
|
|
47
|
+
errors;
|
|
48
|
+
constructor(config) {
|
|
49
|
+
this.config = config;
|
|
50
|
+
this.mode = config.mode;
|
|
51
|
+
this.graph = config.graph;
|
|
52
|
+
this.trail = config.trail ?? Trail.create({
|
|
53
|
+
frames: config.initialStack ?? []
|
|
54
|
+
});
|
|
55
|
+
if (!config.trail && config.initialStack) {
|
|
56
|
+
for (const frame of config.initialStack) {
|
|
57
|
+
if (!frame.state) {
|
|
58
|
+
frame.state = frame.id !== undefined ? 'RESOLVED' : 'UNRESOLVED';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const buses = createGraphBuses();
|
|
63
|
+
this.hooks = buses.hooks;
|
|
64
|
+
this.events = buses.events;
|
|
65
|
+
this.errors = buses.errors;
|
|
66
|
+
switch (this.mode) {
|
|
67
|
+
case 'PATHFIND':
|
|
68
|
+
this.pathFinder = new PathFinder(this.graph);
|
|
69
|
+
break;
|
|
70
|
+
case 'NAVIGATE':
|
|
71
|
+
this.resolver = new Resolver(this.graph);
|
|
72
|
+
break;
|
|
73
|
+
case 'SCHEDULE':
|
|
74
|
+
this.scheduler = new Scheduler(config.actions ?? [], this.graph);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ==================== FACTORY METHODS ====================
|
|
79
|
+
static forPathfinding(graph, query) {
|
|
80
|
+
return new NavigationEngine({ mode: 'PATHFIND', graph, pathQuery: query });
|
|
81
|
+
}
|
|
82
|
+
static forNavigation(graph, options) {
|
|
83
|
+
if ('trail' in options) {
|
|
84
|
+
return new NavigationEngine({ mode: 'NAVIGATE', graph, trail: options.trail });
|
|
85
|
+
}
|
|
86
|
+
return new NavigationEngine({ mode: 'NAVIGATE', graph, initialStack: options.stack });
|
|
87
|
+
}
|
|
88
|
+
static forScheduling(graph, options) {
|
|
89
|
+
const trail = options.trail ?? Trail.create({ frames: options.stack ?? [] });
|
|
90
|
+
return new NavigationEngine({ mode: 'SCHEDULE', graph, trail, actions: options.actions });
|
|
91
|
+
}
|
|
92
|
+
// ==================== RUN ====================
|
|
93
|
+
async run(maxSteps = 1) {
|
|
94
|
+
// ── Span : contexte commun aux trois modes ───────────────
|
|
95
|
+
const trailStr = this._buildTrailString();
|
|
96
|
+
const spanBuilder = shim.startSpan({
|
|
97
|
+
trail: trailStr,
|
|
98
|
+
from: this._resolvedFrom(),
|
|
99
|
+
to: this._targetTo(),
|
|
100
|
+
filters: this._currentFilters(),
|
|
101
|
+
path: [], // mis à jour après résolution
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
let results;
|
|
105
|
+
switch (this.mode) {
|
|
106
|
+
case 'PATHFIND':
|
|
107
|
+
results = await this.runPathfind(spanBuilder);
|
|
108
|
+
break;
|
|
109
|
+
case 'NAVIGATE':
|
|
110
|
+
results = await this.runNavigate(maxSteps, spanBuilder);
|
|
111
|
+
break;
|
|
112
|
+
case 'SCHEDULE':
|
|
113
|
+
results = await this.runSchedule(maxSteps, spanBuilder);
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
throw new Error(`Mode inconnu : ${this.mode}`);
|
|
117
|
+
}
|
|
118
|
+
// Émettre le span de succès
|
|
119
|
+
if (spanBuilder) {
|
|
120
|
+
const rowCount = this._countRows(results);
|
|
121
|
+
const span = spanBuilder.end({ rowCount });
|
|
122
|
+
shim.emitEnd(span);
|
|
123
|
+
}
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
// Émettre le span d'erreur
|
|
128
|
+
if (spanBuilder) {
|
|
129
|
+
const span = spanBuilder.endWithError(err, {
|
|
130
|
+
compiledGraphHash: 'unknown',
|
|
131
|
+
weights: {},
|
|
132
|
+
cacheState: { l1HitRate: 0, l2HitRate: 0, globalHitRate: 0, yoyoEvents: 0 },
|
|
133
|
+
});
|
|
134
|
+
shim.emitError(span);
|
|
135
|
+
}
|
|
136
|
+
throw err;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ==================== PRIVATE (inchangé sauf signature + step timings) ====================
|
|
140
|
+
async runPathfind(spanBuilder) {
|
|
141
|
+
if (!this.pathFinder || !this.config.pathQuery) {
|
|
142
|
+
throw new Error('PATHFIND requiert pathQuery');
|
|
143
|
+
}
|
|
144
|
+
const { from, to, maxPaths = 5, transferPenalty = 0, via, minHops = 0 } = this.config.pathQuery;
|
|
145
|
+
const startTime = Date.now();
|
|
146
|
+
const hookResult = await this.hooks.call('traversal.before', {
|
|
147
|
+
from, to,
|
|
148
|
+
stack: [...this.trail.frames],
|
|
149
|
+
graph: this.graph,
|
|
150
|
+
});
|
|
151
|
+
if (hookResult.cancelled) {
|
|
152
|
+
this.errors.emit('traversal.failed', {
|
|
153
|
+
from, to,
|
|
154
|
+
reason: hookResult.reason ?? 'Annulé par hook traversal.before',
|
|
155
|
+
});
|
|
156
|
+
return [{ time: 0, mode: 'PATHFIND', result: { type: 'FAIL', reason: hookResult.reason } }];
|
|
157
|
+
}
|
|
158
|
+
// ── Step : PathFinder ────────────────────────────────────
|
|
159
|
+
spanBuilder?.stepStart('PathFinder');
|
|
160
|
+
const allPaths = this.pathFinder.findAllPaths(from, to, maxPaths, 50, transferPenalty, via, minHops);
|
|
161
|
+
spanBuilder?.stepEnd('PathFinder');
|
|
162
|
+
if (allPaths.length === 0) {
|
|
163
|
+
this.errors.emit('route.notfound', {
|
|
164
|
+
from, to,
|
|
165
|
+
stack: [...this.trail.frames],
|
|
166
|
+
});
|
|
167
|
+
return [{ time: 0, mode: 'PATHFIND', result: { type: 'FAIL', reason: 'Aucun chemin trouvé' } }];
|
|
168
|
+
}
|
|
169
|
+
const pathsWithDetails = allPaths
|
|
170
|
+
.map(nodes => {
|
|
171
|
+
const edges = [];
|
|
172
|
+
let totalWeight = 0;
|
|
173
|
+
for (let i = 0; i < nodes.length - 1; i++) {
|
|
174
|
+
const edge = this.graph.edges.find(e => e.from === nodes[i] && e.to === nodes[i + 1]);
|
|
175
|
+
if (edge) {
|
|
176
|
+
edges.push(edge);
|
|
177
|
+
totalWeight += edge.weight;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return { nodes, edges, totalWeight };
|
|
181
|
+
})
|
|
182
|
+
.sort((a, b) => a.totalWeight - b.totalWeight)
|
|
183
|
+
.slice(0, maxPaths);
|
|
184
|
+
const best = pathsWithDetails[0];
|
|
185
|
+
// Mettre à jour le path dans le span
|
|
186
|
+
if (spanBuilder) {
|
|
187
|
+
;
|
|
188
|
+
spanBuilder.withPath?.(best.nodes);
|
|
189
|
+
}
|
|
190
|
+
this.events.emit('traversal.complete', {
|
|
191
|
+
from, to,
|
|
192
|
+
path: best,
|
|
193
|
+
durationMs: Date.now() - startTime,
|
|
194
|
+
stackDepth: this.trail.depth,
|
|
195
|
+
routeUsed: best.nodes.join('→'),
|
|
196
|
+
routeWeight: best.totalWeight,
|
|
197
|
+
});
|
|
198
|
+
return pathsWithDetails.map((path, index) => ({
|
|
199
|
+
time: index,
|
|
200
|
+
mode: 'PATHFIND',
|
|
201
|
+
path,
|
|
202
|
+
result: { type: 'SUCCESS', data: { rank: index + 1, allPaths: pathsWithDetails } }
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
async runNavigate(maxSteps, spanBuilder) {
|
|
206
|
+
if (!this.resolver)
|
|
207
|
+
throw new Error('NAVIGATE requiert Resolver');
|
|
208
|
+
const results = [];
|
|
209
|
+
for (let t = 0; t < maxSteps; t++) {
|
|
210
|
+
const resolved = this.trail.frames.filter(f => f.state === 'RESOLVED').length;
|
|
211
|
+
const unresolved = this.trail.unresolved;
|
|
212
|
+
if (unresolved.length === 0) {
|
|
213
|
+
results.push({
|
|
214
|
+
time: t, mode: 'NAVIGATE', phase: 'COMPLETE',
|
|
215
|
+
resolvedCount: resolved, unresolvedCount: 0,
|
|
216
|
+
result: { type: 'SUCCESS' }
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
const nextUnresolved = unresolved[0];
|
|
221
|
+
const hookResult = await this.hooks.call('traversal.before', {
|
|
222
|
+
from: [...this.trail.frames].reverse().find(f => f.state === 'RESOLVED')?.entity ?? '',
|
|
223
|
+
to: nextUnresolved.entity,
|
|
224
|
+
stack: [...this.trail.frames],
|
|
225
|
+
graph: this.graph,
|
|
226
|
+
});
|
|
227
|
+
if (hookResult.cancelled) {
|
|
228
|
+
this.errors.emit('traversal.failed', {
|
|
229
|
+
from: '',
|
|
230
|
+
to: nextUnresolved.entity,
|
|
231
|
+
reason: hookResult.reason ?? 'Annulé par hook traversal.before',
|
|
232
|
+
});
|
|
233
|
+
results.push({
|
|
234
|
+
time: t, mode: 'NAVIGATE', phase: 'COMPLETE',
|
|
235
|
+
result: { type: 'FAIL', reason: hookResult.reason }
|
|
236
|
+
});
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
const accessResult = await this.hooks.call('access.check', {
|
|
240
|
+
node: nextUnresolved.entity,
|
|
241
|
+
stack: [...this.trail.frames],
|
|
242
|
+
context: this.trail.user,
|
|
243
|
+
});
|
|
244
|
+
if (accessResult.cancelled) {
|
|
245
|
+
this.errors.emit('access.denied', {
|
|
246
|
+
node: nextUnresolved.entity,
|
|
247
|
+
reason: accessResult.reason ?? 'Accès refusé',
|
|
248
|
+
stack: [...this.trail.frames],
|
|
249
|
+
});
|
|
250
|
+
results.push({
|
|
251
|
+
time: t, mode: 'NAVIGATE', phase: 'COMPLETE',
|
|
252
|
+
result: { type: 'FAIL', reason: accessResult.reason }
|
|
253
|
+
});
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
const startTime = Date.now();
|
|
257
|
+
const currentStack = [...this.trail.frames];
|
|
258
|
+
// ── Step : Resolver ──────────────────────────────────
|
|
259
|
+
spanBuilder?.stepStart('Resolver');
|
|
260
|
+
const newStack = await this.resolver.resolve(currentStack);
|
|
261
|
+
spanBuilder?.stepEnd('Resolver');
|
|
262
|
+
for (const newFrame of newStack) {
|
|
263
|
+
if (newFrame.state === 'RESOLVED' || newFrame.state === 'DEFERRED') {
|
|
264
|
+
this.trail.updateFrame(newFrame.entity, newFrame);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const justResolved = newStack.find(f => f.entity === nextUnresolved.entity && f.state === 'RESOLVED');
|
|
268
|
+
if (justResolved?.resolvedBy) {
|
|
269
|
+
this.events.emit('traversal.complete', {
|
|
270
|
+
from: justResolved.resolvedBy.via,
|
|
271
|
+
to: justResolved.entity,
|
|
272
|
+
path: { nodes: [justResolved.resolvedBy.via, justResolved.entity], edges: [], totalWeight: 0 },
|
|
273
|
+
durationMs: Date.now() - startTime,
|
|
274
|
+
stackDepth: this.trail.depth,
|
|
275
|
+
routeUsed: justResolved.resolvedBy.relation,
|
|
276
|
+
routeWeight: 0,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
results.push({
|
|
280
|
+
time: t, mode: 'NAVIGATE', phase: 'RESOLVE',
|
|
281
|
+
resolvedCount: resolved, unresolvedCount: unresolved.length
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return results;
|
|
285
|
+
}
|
|
286
|
+
async runSchedule(maxSteps, spanBuilder) {
|
|
287
|
+
if (!this.scheduler)
|
|
288
|
+
throw new Error('SCHEDULE requiert Scheduler');
|
|
289
|
+
const results = [];
|
|
290
|
+
let currentStack = [...this.trail.frames];
|
|
291
|
+
for (let t = 0; t < maxSteps; t++) {
|
|
292
|
+
// ── Step : Scheduler ─────────────────────────────────
|
|
293
|
+
spanBuilder?.stepStart('Scheduler');
|
|
294
|
+
const stepResult = await this.scheduler.step(t, currentStack);
|
|
295
|
+
spanBuilder?.stepEnd('Scheduler');
|
|
296
|
+
if (!stepResult) {
|
|
297
|
+
results.push({
|
|
298
|
+
time: t, mode: 'SCHEDULE', phase: 'COMPLETE',
|
|
299
|
+
result: { type: 'SUCCESS', reason: 'Plus aucune action disponible' }
|
|
300
|
+
});
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
currentStack = stepResult.updatedStack;
|
|
304
|
+
this.events.emit('traversal.complete', {
|
|
305
|
+
from: stepResult.selectedAction,
|
|
306
|
+
to: currentStack[currentStack.length - 1]?.entity ?? '',
|
|
307
|
+
path: { nodes: [], edges: [], totalWeight: 0 },
|
|
308
|
+
durationMs: 0,
|
|
309
|
+
stackDepth: this.trail.depth,
|
|
310
|
+
routeUsed: stepResult.selectedAction,
|
|
311
|
+
routeWeight: 0,
|
|
312
|
+
});
|
|
313
|
+
results.push({
|
|
314
|
+
time: t, mode: 'SCHEDULE', phase: 'EXECUTE',
|
|
315
|
+
selectedAction: stepResult.selectedAction,
|
|
316
|
+
result: stepResult.result
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return results;
|
|
320
|
+
}
|
|
321
|
+
// ==================== HELPERS INSTRUMENTATION ====================
|
|
322
|
+
_buildTrailString() {
|
|
323
|
+
return this.trail.frames
|
|
324
|
+
.map(f => f.id !== undefined ? `${f.entity}(${f.id})` : f.entity)
|
|
325
|
+
.join('.');
|
|
326
|
+
}
|
|
327
|
+
_resolvedFrom() {
|
|
328
|
+
const resolved = [...this.trail.frames].reverse().find(f => f.state === 'RESOLVED');
|
|
329
|
+
if (resolved)
|
|
330
|
+
return resolved.entity;
|
|
331
|
+
if (this.config.pathQuery)
|
|
332
|
+
return this.config.pathQuery.from;
|
|
333
|
+
return this.trail.frames[0]?.entity ?? '';
|
|
334
|
+
}
|
|
335
|
+
_targetTo() {
|
|
336
|
+
const unresolved = this.trail.unresolved[0];
|
|
337
|
+
if (unresolved)
|
|
338
|
+
return unresolved.entity;
|
|
339
|
+
if (this.config.pathQuery)
|
|
340
|
+
return this.config.pathQuery.to;
|
|
341
|
+
return this.trail.frames[this.trail.frames.length - 1]?.entity ?? '';
|
|
342
|
+
}
|
|
343
|
+
_currentFilters() {
|
|
344
|
+
const resolved = this.trail.frames.find(f => f.state === 'RESOLVED' && f.id !== undefined);
|
|
345
|
+
return resolved?.id !== undefined ? { id: resolved.id } : {};
|
|
346
|
+
}
|
|
347
|
+
_countRows(results) {
|
|
348
|
+
// PATHFIND : nombre de chemins trouvés
|
|
349
|
+
if (this.mode === 'PATHFIND') {
|
|
350
|
+
return results.filter(r => r.result?.type === 'SUCCESS').length;
|
|
351
|
+
}
|
|
352
|
+
// NAVIGATE/SCHEDULE : nombre de steps résolus
|
|
353
|
+
return results.filter(r => r.phase === 'RESOLVE' || r.phase === 'EXECUTE').length;
|
|
354
|
+
}
|
|
355
|
+
// ==================== GETTERS ====================
|
|
356
|
+
getMode() { return this.mode; }
|
|
357
|
+
getGraph() { return this.graph; }
|
|
358
|
+
/** @deprecated Utiliser engine.trail directement */
|
|
359
|
+
getCurrentStack() { return [...this.trail.frames]; }
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=NavigationEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationEngine.js","sourceRoot":"","sources":["../../src/navigation/NavigationEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolver - Résolution sémantique de frames (mode NAVIGATE)
|
|
3
|
+
*
|
|
4
|
+
* Parcourt la stack, trouve la première frame UNRESOLVED,
|
|
5
|
+
* identifie la meilleure arête dans le graphe V3 (nodes/edges)
|
|
6
|
+
* et résout la frame avec les filtres appropriés.
|
|
7
|
+
*/
|
|
8
|
+
import type { Frame, Graph } from '../types/index.js';
|
|
9
|
+
export declare class Resolver {
|
|
10
|
+
private graph;
|
|
11
|
+
constructor(graph: Graph);
|
|
12
|
+
/**
|
|
13
|
+
* Résout la prochaine frame UNRESOLVED dans la stack.
|
|
14
|
+
* Retourne une nouvelle stack avec la frame résolue (ou DEFERRED si impossible).
|
|
15
|
+
*/
|
|
16
|
+
resolve(stack: Frame[]): Promise<Frame[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Trouve l'arête la plus pertinente pour résoudre une frame.
|
|
19
|
+
*
|
|
20
|
+
* Logique : on cherche parmi les frames RESOLVED (en remontant la stack),
|
|
21
|
+
* une arête qui va de cette entité source vers l'entité cible.
|
|
22
|
+
*/
|
|
23
|
+
private selectBestEdge;
|
|
24
|
+
/**
|
|
25
|
+
* Vérifie si l'intention de la frame est compatible avec
|
|
26
|
+
* les conditions sémantiques portées par l'arête.
|
|
27
|
+
*/
|
|
28
|
+
private intentMatchesCondition;
|
|
29
|
+
/**
|
|
30
|
+
* Extrait les filtres implicites portés par les métadonnées d'une arête.
|
|
31
|
+
* Ex: une arête sémantique { condition: { jobId: 2 } } devient un filtre.
|
|
32
|
+
*/
|
|
33
|
+
private extractEdgeFilters;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=Resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resolver.d.ts","sourceRoot":"","sources":["../../src/navigation/Resolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAA0B,MAAM,mBAAmB,CAAA;AAE7E,qBAAa,QAAQ;IACP,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEhC;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAgD/C;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAgCtB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAU3B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolver - Résolution sémantique de frames (mode NAVIGATE)
|
|
3
|
+
*
|
|
4
|
+
* Parcourt la stack, trouve la première frame UNRESOLVED,
|
|
5
|
+
* identifie la meilleure arête dans le graphe V3 (nodes/edges)
|
|
6
|
+
* et résout la frame avec les filtres appropriés.
|
|
7
|
+
*/
|
|
8
|
+
export class Resolver {
|
|
9
|
+
graph;
|
|
10
|
+
constructor(graph) {
|
|
11
|
+
this.graph = graph;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Résout la prochaine frame UNRESOLVED dans la stack.
|
|
15
|
+
* Retourne une nouvelle stack avec la frame résolue (ou DEFERRED si impossible).
|
|
16
|
+
*/
|
|
17
|
+
async resolve(stack) {
|
|
18
|
+
const unresolved = stack.filter(f => f.state === 'UNRESOLVED');
|
|
19
|
+
if (unresolved.length === 0)
|
|
20
|
+
return stack;
|
|
21
|
+
const frame = unresolved[0];
|
|
22
|
+
// Frame racine (en position 0, aucune frame résolue avant elle) :
|
|
23
|
+
// c'est une collection ou un point d'entrée — pas besoin d'arête entrante.
|
|
24
|
+
const frameIndex = stack.indexOf(frame);
|
|
25
|
+
const hasPriorResolved = stack
|
|
26
|
+
.slice(0, frameIndex)
|
|
27
|
+
.some(f => f.state === 'RESOLVED' && f.id !== undefined && f.id !== null);
|
|
28
|
+
if (!hasPriorResolved) {
|
|
29
|
+
return stack.map(f => (f === frame ? { ...f, state: 'RESOLVED' } : f));
|
|
30
|
+
}
|
|
31
|
+
const candidate = this.selectBestEdge(frame, stack);
|
|
32
|
+
if (!candidate) {
|
|
33
|
+
console.warn(`[Resolver] Aucune arête trouvée pour "${frame.entity}"`);
|
|
34
|
+
return stack.map(f => (f === frame ? { ...f, state: 'DEFERRED' } : f));
|
|
35
|
+
}
|
|
36
|
+
const { edge, sourceFrame } = candidate;
|
|
37
|
+
const resolved = {
|
|
38
|
+
...frame,
|
|
39
|
+
state: 'RESOLVED',
|
|
40
|
+
resolvedBy: {
|
|
41
|
+
relation: edge.name ?? `${edge.from}→${edge.to}`,
|
|
42
|
+
via: edge.via ?? edge.from,
|
|
43
|
+
filters: [
|
|
44
|
+
{
|
|
45
|
+
field: `${sourceFrame.entity.toLowerCase()}Id`,
|
|
46
|
+
operator: 'equals',
|
|
47
|
+
value: sourceFrame.id
|
|
48
|
+
},
|
|
49
|
+
// Filtres portés par l'arête elle-même (ex: condition sémantique)
|
|
50
|
+
...this.extractEdgeFilters(edge)
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
return stack.map(f => (f === frame ? resolved : f));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Trouve l'arête la plus pertinente pour résoudre une frame.
|
|
58
|
+
*
|
|
59
|
+
* Logique : on cherche parmi les frames RESOLVED (en remontant la stack),
|
|
60
|
+
* une arête qui va de cette entité source vers l'entité cible.
|
|
61
|
+
*/
|
|
62
|
+
selectBestEdge(frame, stack) {
|
|
63
|
+
// Frames résolues, les plus récentes en premier (dernier contexte connu)
|
|
64
|
+
const resolvedFrames = [...stack]
|
|
65
|
+
.reverse()
|
|
66
|
+
.filter(f => f.state === 'RESOLVED' && f.id !== undefined && f.id !== null);
|
|
67
|
+
for (const source of resolvedFrames) {
|
|
68
|
+
const candidates = this.graph.edges.filter(edge => {
|
|
69
|
+
// L'arête doit partir de l'entité source et arriver à l'entité cible
|
|
70
|
+
const matchesDirection = edge.from === source.entity && edge.to === frame.entity;
|
|
71
|
+
// Si la frame a une intention, on vérifie la compatibilité sémantique
|
|
72
|
+
if (matchesDirection && frame.intent && edge.metadata?.condition) {
|
|
73
|
+
return this.intentMatchesCondition(frame.intent, edge.metadata.condition);
|
|
74
|
+
}
|
|
75
|
+
return matchesDirection;
|
|
76
|
+
});
|
|
77
|
+
// On prend la candidate avec le poids le plus faible (chemin le plus direct)
|
|
78
|
+
if (candidates.length > 0) {
|
|
79
|
+
const best = candidates.sort((a, b) => a.weight - b.weight)[0];
|
|
80
|
+
return { edge: best, sourceFrame: source };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Vérifie si l'intention de la frame est compatible avec
|
|
87
|
+
* les conditions sémantiques portées par l'arête.
|
|
88
|
+
*/
|
|
89
|
+
intentMatchesCondition(intent, condition) {
|
|
90
|
+
if (typeof condition === 'string')
|
|
91
|
+
return true; // Pas de condition structurée
|
|
92
|
+
return Object.entries(condition).every(([key, value]) => {
|
|
93
|
+
if (intent[key] === undefined)
|
|
94
|
+
return true; // On ne filtre pas ce qu'on ne connaît pas
|
|
95
|
+
return intent[key] === value;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extrait les filtres implicites portés par les métadonnées d'une arête.
|
|
100
|
+
* Ex: une arête sémantique { condition: { jobId: 2 } } devient un filtre.
|
|
101
|
+
*/
|
|
102
|
+
extractEdgeFilters(edge) {
|
|
103
|
+
const condition = edge.metadata?.condition;
|
|
104
|
+
if (!condition || typeof condition === 'string')
|
|
105
|
+
return [];
|
|
106
|
+
return Object.entries(condition).map(([field, value]) => ({
|
|
107
|
+
field,
|
|
108
|
+
operator: 'equals',
|
|
109
|
+
value
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=Resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resolver.js","sourceRoot":"","sources":["../../src/navigation/Resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler - Exécution d'actions par priorité (mode SCHEDULE)
|
|
3
|
+
*
|
|
4
|
+
* À chaque step :
|
|
5
|
+
* 1. Filtre les actions disponibles (condition when + cooldown + terminal)
|
|
6
|
+
* 2. Sélectionne la plus prioritaire (weight le plus élevé)
|
|
7
|
+
* 3. L'exécute et met à jour l'état interne
|
|
8
|
+
*
|
|
9
|
+
* C'est le cœur du moteur d'agent : une boucle de décision
|
|
10
|
+
* déterministe basée sur les poids et l'état de la stack.
|
|
11
|
+
*/
|
|
12
|
+
import type { ScheduleAction, ActionState, Frame, Graph, NavigationResult } from '../types/index.js';
|
|
13
|
+
export interface SchedulerStepResult {
|
|
14
|
+
selectedAction: string;
|
|
15
|
+
result: NavigationResult;
|
|
16
|
+
updatedStack: Frame[];
|
|
17
|
+
}
|
|
18
|
+
export declare class Scheduler {
|
|
19
|
+
private actions;
|
|
20
|
+
private graph;
|
|
21
|
+
private actionStates;
|
|
22
|
+
constructor(actions: ScheduleAction[], graph: Graph);
|
|
23
|
+
/**
|
|
24
|
+
* Exécute un step du scheduler.
|
|
25
|
+
* Retourne null si aucune action n'est disponible (terminaison naturelle).
|
|
26
|
+
*/
|
|
27
|
+
step(time: number, stack: Frame[]): Promise<SchedulerStepResult | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Retourne les actions disponibles à un instant t pour une stack donnée.
|
|
30
|
+
* Filtre : terminal déjà exécuté, cooldown, maxExecutions, condition when().
|
|
31
|
+
*/
|
|
32
|
+
getAvailableActions(time: number, stack: Frame[]): ScheduleAction[];
|
|
33
|
+
private updateState;
|
|
34
|
+
getActionState(name: string): ActionState | undefined;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=Scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/navigation/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,KAAK,EACL,KAAK,EACL,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,gBAAgB,CAAA;IACxB,YAAY,EAAE,KAAK,EAAE,CAAA;CACtB;AAED,qBAAa,SAAS;IAIlB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IAJf,OAAO,CAAC,YAAY,CAA0B;gBAGpC,OAAO,EAAE,cAAc,EAAE,EACzB,KAAK,EAAE,KAAK;IAWtB;;;OAGG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IA6C7E;;;OAGG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE;IA0BnE,OAAO,CAAC,WAAW;IAWnB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;CAGtD"}
|