@manifesto-ai/core 0.2.0

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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +434 -0
  3. package/dist/dag/graph.d.ts +62 -0
  4. package/dist/dag/graph.d.ts.map +1 -0
  5. package/dist/dag/graph.js +244 -0
  6. package/dist/dag/graph.js.map +1 -0
  7. package/dist/dag/index.d.ts +4 -0
  8. package/dist/dag/index.d.ts.map +1 -0
  9. package/dist/dag/index.js +4 -0
  10. package/dist/dag/index.js.map +1 -0
  11. package/dist/dag/propagation.d.ts +58 -0
  12. package/dist/dag/propagation.d.ts.map +1 -0
  13. package/dist/dag/propagation.js +224 -0
  14. package/dist/dag/propagation.js.map +1 -0
  15. package/dist/dag/topological.d.ts +33 -0
  16. package/dist/dag/topological.d.ts.map +1 -0
  17. package/dist/dag/topological.js +173 -0
  18. package/dist/dag/topological.js.map +1 -0
  19. package/dist/domain/define.d.ts +82 -0
  20. package/dist/domain/define.d.ts.map +1 -0
  21. package/dist/domain/define.js +91 -0
  22. package/dist/domain/define.js.map +1 -0
  23. package/dist/domain/index.d.ts +4 -0
  24. package/dist/domain/index.d.ts.map +1 -0
  25. package/dist/domain/index.js +4 -0
  26. package/dist/domain/index.js.map +1 -0
  27. package/dist/domain/types.d.ts +203 -0
  28. package/dist/domain/types.d.ts.map +1 -0
  29. package/dist/domain/types.js +2 -0
  30. package/dist/domain/types.js.map +1 -0
  31. package/dist/domain/validate.d.ts +17 -0
  32. package/dist/domain/validate.d.ts.map +1 -0
  33. package/dist/domain/validate.js +204 -0
  34. package/dist/domain/validate.js.map +1 -0
  35. package/dist/effect/index.d.ts +4 -0
  36. package/dist/effect/index.d.ts.map +1 -0
  37. package/dist/effect/index.js +4 -0
  38. package/dist/effect/index.js.map +1 -0
  39. package/dist/effect/result.d.ts +100 -0
  40. package/dist/effect/result.d.ts.map +1 -0
  41. package/dist/effect/result.js +163 -0
  42. package/dist/effect/result.js.map +1 -0
  43. package/dist/effect/runner.d.ts +98 -0
  44. package/dist/effect/runner.d.ts.map +1 -0
  45. package/dist/effect/runner.js +321 -0
  46. package/dist/effect/runner.js.map +1 -0
  47. package/dist/effect/types.d.ts +169 -0
  48. package/dist/effect/types.d.ts.map +1 -0
  49. package/dist/effect/types.js +28 -0
  50. package/dist/effect/types.js.map +1 -0
  51. package/dist/expression/analyzer.d.ts +42 -0
  52. package/dist/expression/analyzer.d.ts.map +1 -0
  53. package/dist/expression/analyzer.js +166 -0
  54. package/dist/expression/analyzer.js.map +1 -0
  55. package/dist/expression/evaluator.d.ts +16 -0
  56. package/dist/expression/evaluator.d.ts.map +1 -0
  57. package/dist/expression/evaluator.js +382 -0
  58. package/dist/expression/evaluator.js.map +1 -0
  59. package/dist/expression/index.d.ts +5 -0
  60. package/dist/expression/index.d.ts.map +1 -0
  61. package/dist/expression/index.js +5 -0
  62. package/dist/expression/index.js.map +1 -0
  63. package/dist/expression/parser.d.ts +37 -0
  64. package/dist/expression/parser.d.ts.map +1 -0
  65. package/dist/expression/parser.js +201 -0
  66. package/dist/expression/parser.js.map +1 -0
  67. package/dist/expression/types.d.ts +123 -0
  68. package/dist/expression/types.d.ts.map +1 -0
  69. package/dist/expression/types.js +10 -0
  70. package/dist/expression/types.js.map +1 -0
  71. package/dist/index.d.ts +17 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +51 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/policy/field-policy.d.ts +63 -0
  76. package/dist/policy/field-policy.d.ts.map +1 -0
  77. package/dist/policy/field-policy.js +138 -0
  78. package/dist/policy/field-policy.js.map +1 -0
  79. package/dist/policy/index.d.ts +3 -0
  80. package/dist/policy/index.d.ts.map +1 -0
  81. package/dist/policy/index.js +3 -0
  82. package/dist/policy/index.js.map +1 -0
  83. package/dist/policy/precondition.d.ts +58 -0
  84. package/dist/policy/precondition.d.ts.map +1 -0
  85. package/dist/policy/precondition.js +115 -0
  86. package/dist/policy/precondition.js.map +1 -0
  87. package/dist/runtime/index.d.ts +4 -0
  88. package/dist/runtime/index.d.ts.map +1 -0
  89. package/dist/runtime/index.js +4 -0
  90. package/dist/runtime/index.js.map +1 -0
  91. package/dist/runtime/runtime.d.ts +94 -0
  92. package/dist/runtime/runtime.d.ts.map +1 -0
  93. package/dist/runtime/runtime.js +294 -0
  94. package/dist/runtime/runtime.js.map +1 -0
  95. package/dist/runtime/snapshot.d.ts +39 -0
  96. package/dist/runtime/snapshot.d.ts.map +1 -0
  97. package/dist/runtime/snapshot.js +264 -0
  98. package/dist/runtime/snapshot.js.map +1 -0
  99. package/dist/runtime/subscription.d.ts +82 -0
  100. package/dist/runtime/subscription.d.ts.map +1 -0
  101. package/dist/runtime/subscription.js +222 -0
  102. package/dist/runtime/subscription.js.map +1 -0
  103. package/dist/schema/index.d.ts +3 -0
  104. package/dist/schema/index.d.ts.map +1 -0
  105. package/dist/schema/index.js +3 -0
  106. package/dist/schema/index.js.map +1 -0
  107. package/dist/schema/integration.d.ts +89 -0
  108. package/dist/schema/integration.d.ts.map +1 -0
  109. package/dist/schema/integration.js +171 -0
  110. package/dist/schema/integration.js.map +1 -0
  111. package/dist/schema/validation.d.ts +51 -0
  112. package/dist/schema/validation.d.ts.map +1 -0
  113. package/dist/schema/validation.js +212 -0
  114. package/dist/schema/validation.js.map +1 -0
  115. package/package.json +58 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Manifesto AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,434 @@
1
+ # @manifesto-ai/core
2
+
3
+ > AI Native Semantic Layer for SaaS Business Logic
4
+
5
+ The core package provides domain definition, runtime execution, expression evaluation, and effect system for Manifesto AI.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ pnpm add @manifesto-ai/core
11
+ # or
12
+ npm install @manifesto-ai/core
13
+ ```
14
+
15
+ ## Quick Start
16
+
17
+ ```typescript
18
+ import {
19
+ defineDomain,
20
+ createRuntime,
21
+ defineDerived,
22
+ defineAction,
23
+ sequence,
24
+ setState,
25
+ apiCall,
26
+ z
27
+ } from '@manifesto-ai/core';
28
+
29
+ // Define a domain
30
+ const todosDomain = defineDomain('todos', {
31
+ dataSchema: z.object({
32
+ items: z.array(z.object({
33
+ id: z.string(),
34
+ title: z.string(),
35
+ completed: z.boolean()
36
+ }))
37
+ }),
38
+
39
+ stateSchema: z.object({
40
+ filter: z.enum(['all', 'active', 'completed']).default('all'),
41
+ isLoading: z.boolean().default(false)
42
+ }),
43
+
44
+ derived: {
45
+ 'derived.activeCount': defineDerived(
46
+ { $size: { $filter: ['data.items', { $eq: ['$item.completed', false] }] } },
47
+ z.number()
48
+ ),
49
+ 'derived.filteredItems': defineDerived(
50
+ {
51
+ $if: [
52
+ { $eq: [{ $get: 'state.filter' }, 'all'] },
53
+ { $get: 'data.items' },
54
+ { $filter: ['data.items', {
55
+ $eq: ['$item.completed', { $eq: [{ $get: 'state.filter' }, 'completed'] }]
56
+ }] }
57
+ ]
58
+ },
59
+ z.array(z.object({ id: z.string(), title: z.string(), completed: z.boolean() }))
60
+ )
61
+ },
62
+
63
+ actions: {
64
+ addTodo: defineAction({
65
+ precondition: { $gt: [{ $size: { $get: 'input.title' } }, 0] },
66
+ effect: setValue('data.items', {
67
+ $concat: [
68
+ { $get: 'data.items' },
69
+ [{ id: { $get: 'input.id' }, title: { $get: 'input.title' }, completed: false }]
70
+ ]
71
+ })
72
+ })
73
+ }
74
+ });
75
+
76
+ // Create runtime
77
+ const runtime = createRuntime(todosDomain);
78
+
79
+ // Use the runtime
80
+ runtime.set('data.items', [
81
+ { id: '1', title: 'Learn Manifesto', completed: false }
82
+ ]);
83
+
84
+ console.log(runtime.get('derived.activeCount')); // 1
85
+ ```
86
+
87
+ ## API Reference
88
+
89
+ ### Domain Definition
90
+
91
+ #### `defineDomain(name, config)`
92
+
93
+ Creates a domain definition.
94
+
95
+ ```typescript
96
+ const domain = defineDomain('myDomain', {
97
+ dataSchema: z.object({ ... }), // Required: Source data schema
98
+ stateSchema: z.object({ ... }), // Optional: UI state schema
99
+ derived: { ... }, // Optional: Computed values
100
+ async: { ... }, // Optional: Async data sources
101
+ actions: { ... } // Optional: Domain actions
102
+ });
103
+ ```
104
+
105
+ #### `defineSource(schema, meta?)`
106
+
107
+ Defines a source field with optional metadata.
108
+
109
+ ```typescript
110
+ const sources = {
111
+ 'data.user': defineSource(
112
+ z.object({ name: z.string(), email: z.string() }),
113
+ { description: 'Current user information' }
114
+ )
115
+ };
116
+ ```
117
+
118
+ #### `defineDerived(expression, schema, meta?)`
119
+
120
+ Defines a computed value.
121
+
122
+ ```typescript
123
+ const derived = {
124
+ 'derived.fullName': defineDerived(
125
+ { $concat: [{ $get: 'data.firstName' }, ' ', { $get: 'data.lastName' }] },
126
+ z.string(),
127
+ { description: 'User full name' }
128
+ )
129
+ };
130
+ ```
131
+
132
+ #### `defineAsync(config, schema, meta?)`
133
+
134
+ Defines an async data source.
135
+
136
+ ```typescript
137
+ const async = {
138
+ 'async.userData': defineAsync(
139
+ {
140
+ fetch: { method: 'GET', url: '/api/user' },
141
+ dependencies: ['data.userId']
142
+ },
143
+ z.object({ name: z.string() })
144
+ )
145
+ };
146
+ ```
147
+
148
+ #### `defineAction(config)`
149
+
150
+ Defines a domain action with preconditions and effects.
151
+
152
+ ```typescript
153
+ const actions = {
154
+ submit: defineAction({
155
+ precondition: { $and: [
156
+ { $gt: [{ $get: 'derived.total' }, 0] },
157
+ { $not: { $get: 'state.isSubmitting' } }
158
+ ]},
159
+ effect: sequence([
160
+ setState('state.isSubmitting', true),
161
+ apiCall({ method: 'POST', url: '/api/submit' }),
162
+ setState('state.isSubmitting', false)
163
+ ])
164
+ })
165
+ };
166
+ ```
167
+
168
+ ### Runtime
169
+
170
+ #### `createRuntime(domain, options?)`
171
+
172
+ Creates a runtime instance for a domain.
173
+
174
+ ```typescript
175
+ const runtime = createRuntime(domain, {
176
+ initialData: { count: 0 },
177
+ initialState: { isLoading: false }
178
+ });
179
+ ```
180
+
181
+ #### Runtime Methods
182
+
183
+ ```typescript
184
+ // Get a value by path
185
+ runtime.get('data.user.name'); // Returns the value
186
+ runtime.get('derived.fullName'); // Computes and returns
187
+
188
+ // Set a value
189
+ runtime.set('data.count', 10);
190
+ runtime.set('state.isLoading', true);
191
+
192
+ // Subscribe to changes
193
+ const unsubscribe = runtime.subscribe('data.count', (value) => {
194
+ console.log('Count:', value);
195
+ });
196
+
197
+ // Subscribe to all changes
198
+ runtime.subscribeAll((snapshot) => {
199
+ console.log('Snapshot changed:', snapshot);
200
+ });
201
+
202
+ // Get current snapshot
203
+ const snapshot = runtime.getSnapshot();
204
+
205
+ // Check action availability
206
+ const canSubmit = runtime.checkAction('submit');
207
+ // { available: true, reason: null }
208
+
209
+ // Execute an action
210
+ await runtime.executeAction('submit', { orderId: '123' });
211
+
212
+ // Explain why a value is what it is
213
+ const explanation = runtime.explain('derived.total');
214
+ ```
215
+
216
+ ### Expression DSL
217
+
218
+ Manifesto uses a JSON-based DSL for declarative expressions.
219
+
220
+ #### Comparison Operators
221
+
222
+ ```typescript
223
+ { $eq: [a, b] } // a === b
224
+ { $ne: [a, b] } // a !== b
225
+ { $gt: [a, b] } // a > b
226
+ { $gte: [a, b] } // a >= b
227
+ { $lt: [a, b] } // a < b
228
+ { $lte: [a, b] } // a <= b
229
+ ```
230
+
231
+ #### Logical Operators
232
+
233
+ ```typescript
234
+ { $and: [expr1, expr2, ...] } // All true
235
+ { $or: [expr1, expr2, ...] } // Any true
236
+ { $not: expr } // Negation
237
+ ```
238
+
239
+ #### Arithmetic Operators
240
+
241
+ ```typescript
242
+ { $add: [a, b] } // a + b
243
+ { $subtract: [a, b] } // a - b
244
+ { $multiply: [a, b] } // a * b
245
+ { $divide: [a, b] } // a / b
246
+ { $modulo: [a, b] } // a % b
247
+ ```
248
+
249
+ #### String Functions
250
+
251
+ ```typescript
252
+ { $concat: [str1, str2, ...] } // Concatenate strings
253
+ { $upper: str } // Uppercase
254
+ { $lower: str } // Lowercase
255
+ { $trim: str } // Trim whitespace
256
+ { $split: [str, delimiter] } // Split string
257
+ { $includes: [str, search] } // Contains substring
258
+ ```
259
+
260
+ #### Array Functions
261
+
262
+ ```typescript
263
+ { $size: array } // Array length
264
+ { $first: array } // First element
265
+ { $last: array } // Last element
266
+ { $filter: [array, predicate] } // Filter elements
267
+ { $map: [array, transform] } // Transform elements
268
+ { $find: [array, predicate] } // Find first match
269
+ { $some: [array, predicate] } // Any match
270
+ { $every: [array, predicate] } // All match
271
+ { $sum: array } // Sum numbers
272
+ { $reduce: [array, reducer, initial] } // Reduce array
273
+ ```
274
+
275
+ #### Conditional
276
+
277
+ ```typescript
278
+ { $if: [condition, thenValue, elseValue] }
279
+ ```
280
+
281
+ #### Path Reference
282
+
283
+ ```typescript
284
+ { $get: 'data.user.name' } // Get value at path
285
+ '$item.price' // Current item in iteration
286
+ '$index' // Current index in iteration
287
+ ```
288
+
289
+ ### Effect System
290
+
291
+ Effects describe side effects as data.
292
+
293
+ #### Effect Types
294
+
295
+ ```typescript
296
+ // Set a value
297
+ setValue('data.count', 10)
298
+ setValue('data.count', { $add: [{ $get: 'data.count' }, 1] })
299
+
300
+ // Set state
301
+ setState('state.isLoading', true)
302
+
303
+ // API call
304
+ apiCall({
305
+ method: 'POST',
306
+ url: '/api/orders',
307
+ body: { $get: 'data.order' },
308
+ headers: { 'Content-Type': 'application/json' }
309
+ })
310
+
311
+ // Navigation
312
+ navigate('/success')
313
+
314
+ // Delay
315
+ delay(1000) // milliseconds
316
+
317
+ // Emit event
318
+ emitEvent('orderCreated', { orderId: '123' })
319
+ ```
320
+
321
+ #### Effect Composition
322
+
323
+ ```typescript
324
+ // Sequential execution
325
+ sequence([
326
+ setState('state.isLoading', true),
327
+ apiCall({ method: 'GET', url: '/api/data' }),
328
+ setState('state.isLoading', false)
329
+ ])
330
+
331
+ // Parallel execution
332
+ parallel([
333
+ apiCall({ method: 'GET', url: '/api/user' }),
334
+ apiCall({ method: 'GET', url: '/api/settings' })
335
+ ])
336
+
337
+ // Conditional execution
338
+ conditional(
339
+ { $get: 'state.isPremium' },
340
+ apiCall({ method: 'GET', url: '/api/premium' }),
341
+ apiCall({ method: 'GET', url: '/api/basic' })
342
+ )
343
+
344
+ // Error handling
345
+ catchEffect(
346
+ apiCall({ method: 'POST', url: '/api/submit' }),
347
+ setState('state.error', { $get: 'error.message' })
348
+ )
349
+ ```
350
+
351
+ #### Running Effects
352
+
353
+ ```typescript
354
+ import { runEffect } from '@manifesto-ai/core';
355
+
356
+ const result = await runEffect(effect, runtime, {
357
+ apiHandler: async (config) => {
358
+ const response = await fetch(config.url, {
359
+ method: config.method,
360
+ body: JSON.stringify(config.body)
361
+ });
362
+ return response.json();
363
+ }
364
+ });
365
+
366
+ if (isOk(result)) {
367
+ console.log('Success:', result.value);
368
+ } else {
369
+ console.log('Error:', result.error);
370
+ }
371
+ ```
372
+
373
+ ### Result Type
374
+
375
+ A functional error handling type.
376
+
377
+ ```typescript
378
+ import { ok, err, isOk, isErr, map, flatMap, unwrapOr } from '@manifesto-ai/core';
379
+
380
+ // Create results
381
+ const success = ok(42);
382
+ const failure = err({ code: 'NOT_FOUND', message: 'Item not found' });
383
+
384
+ // Check type
385
+ if (isOk(success)) {
386
+ console.log(success.value); // 42
387
+ }
388
+
389
+ // Transform
390
+ const doubled = map(success, (x) => x * 2); // ok(84)
391
+
392
+ // Chain operations
393
+ const result = flatMap(success, (x) =>
394
+ x > 0 ? ok(x) : err({ code: 'INVALID', message: 'Must be positive' })
395
+ );
396
+
397
+ // Get with default
398
+ const value = unwrapOr(failure, 0); // 0
399
+ ```
400
+
401
+ ### Schema Utilities
402
+
403
+ ```typescript
404
+ import {
405
+ schemaToSource,
406
+ validateValue,
407
+ zodErrorToValidationResult,
408
+ CommonSchemas
409
+ } from '@manifesto-ai/core';
410
+
411
+ // Common schemas
412
+ CommonSchemas.email // z.string().email()
413
+ CommonSchemas.phone // Phone number pattern
414
+ CommonSchemas.money // Positive number with 2 decimals
415
+
416
+ // Validate values
417
+ const result = validateValue(userSchema, inputData);
418
+ if (!result.valid) {
419
+ console.log(result.issues);
420
+ }
421
+ ```
422
+
423
+ ## Related Packages
424
+
425
+ - [@manifesto-ai/bridge](../bridge) - Framework adapters
426
+ - [@manifesto-ai/bridge-zustand](../bridge-zustand) - Zustand integration
427
+ - [@manifesto-ai/bridge-react-hook-form](../bridge-react-hook-form) - React Hook Form integration
428
+ - [@manifesto-ai/projection-ui](../projection-ui) - UI state projection
429
+ - [@manifesto-ai/projection-agent](../projection-agent) - AI agent context
430
+ - [@manifesto-ai/projection-graphql](../projection-graphql) - GraphQL schema generation
431
+
432
+ ## License
433
+
434
+ MIT
@@ -0,0 +1,62 @@
1
+ import type { SemanticPath, ManifestoDomain, SourceDefinition, DerivedDefinition, AsyncDefinition } from '../domain/types.js';
2
+ /**
3
+ * DagNode: 그래프 노드
4
+ */
5
+ export type DagNode = SourceNode | DerivedNode | AsyncNode;
6
+ export type SourceNode = {
7
+ kind: 'source';
8
+ path: SemanticPath;
9
+ definition: SourceDefinition;
10
+ };
11
+ export type DerivedNode = {
12
+ kind: 'derived';
13
+ path: SemanticPath;
14
+ definition: DerivedDefinition;
15
+ };
16
+ export type AsyncNode = {
17
+ kind: 'async';
18
+ path: SemanticPath;
19
+ definition: AsyncDefinition;
20
+ };
21
+ /**
22
+ * DependencyGraph: Semantic Path 간 의존 관계 그래프
23
+ */
24
+ export type DependencyGraph = {
25
+ /** 모든 노드 */
26
+ nodes: Map<SemanticPath, DagNode>;
27
+ /** 정방향 엣지: path → 이 path가 의존하는 것들 */
28
+ dependencies: Map<SemanticPath, Set<SemanticPath>>;
29
+ /** 역방향 엣지: path → 이 path를 의존하는 것들 */
30
+ dependents: Map<SemanticPath, Set<SemanticPath>>;
31
+ /** 위상 정렬된 순서 */
32
+ topologicalOrder: SemanticPath[];
33
+ };
34
+ /**
35
+ * 도메인에서 의존성 그래프 구축
36
+ */
37
+ export declare function buildDependencyGraph<TData, TState>(domain: ManifestoDomain<TData, TState>): DependencyGraph;
38
+ /**
39
+ * 특정 경로의 직접 의존성 조회
40
+ */
41
+ export declare function getDirectDependencies(graph: DependencyGraph, path: SemanticPath): SemanticPath[];
42
+ /**
43
+ * 특정 경로를 직접 의존하는 경로들 조회
44
+ */
45
+ export declare function getDirectDependents(graph: DependencyGraph, path: SemanticPath): SemanticPath[];
46
+ /**
47
+ * 특정 경로의 모든 의존성 조회 (전이적)
48
+ */
49
+ export declare function getAllDependencies(graph: DependencyGraph, path: SemanticPath): SemanticPath[];
50
+ /**
51
+ * 특정 경로를 의존하는 모든 경로 조회 (전이적)
52
+ */
53
+ export declare function getAllDependents(graph: DependencyGraph, path: SemanticPath): SemanticPath[];
54
+ /**
55
+ * 순환 의존성이 있는지 확인
56
+ */
57
+ export declare function hasCycle(graph: DependencyGraph): boolean;
58
+ /**
59
+ * 두 경로 사이의 경로 찾기 (BFS)
60
+ */
61
+ export declare function findPath(graph: DependencyGraph, from: SemanticPath, to: SemanticPath): SemanticPath[] | null;
62
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/dag/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAG5B;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY;IACZ,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAElC,qCAAqC;IACrC,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnD,qCAAqC;IACrC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjD,gBAAgB;IAChB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAChD,MAAM,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,GACrC,eAAe,CAiGjB;AAoDD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,GACjB,YAAY,EAAE,CAEhB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,GACjB,YAAY,EAAE,CAEhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,GACjB,YAAY,EAAE,CAmBhB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,GACjB,YAAY,EAAE,CAmBhB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CA8BxD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,YAAY,GACf,YAAY,EAAE,GAAG,IAAI,CA4BvB"}