obsidian-accomplishments-mcp 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -182
- package/dist/index.js +207 -38
- package/dist/index.js.map +1 -1
- package/dist/integration.test.d.ts +8 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +979 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/models/types.d.ts +1 -2
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/models/v2-types.d.ts +460 -0
- package/dist/models/v2-types.d.ts.map +1 -0
- package/dist/models/v2-types.js +137 -0
- package/dist/models/v2-types.js.map +1 -0
- package/dist/models/v2-types.test.d.ts +5 -0
- package/dist/models/v2-types.test.d.ts.map +1 -0
- package/dist/models/v2-types.test.js +133 -0
- package/dist/models/v2-types.test.js.map +1 -0
- package/dist/parsers/canvas-parser.d.ts +1 -1
- package/dist/parsers/canvas-parser.d.ts.map +1 -1
- package/dist/parsers/canvas-parser.js +1 -1
- package/dist/parsers/canvas-parser.js.map +1 -1
- package/dist/parsers/markdown-parser.js +9 -9
- package/dist/parsers/markdown-parser.js.map +1 -1
- package/dist/services/v2/archive-manager.d.ts +96 -0
- package/dist/services/v2/archive-manager.d.ts.map +1 -0
- package/dist/services/v2/archive-manager.js +281 -0
- package/dist/services/v2/archive-manager.js.map +1 -0
- package/dist/services/v2/canvas-manager.d.ts +155 -0
- package/dist/services/v2/canvas-manager.d.ts.map +1 -0
- package/dist/services/v2/canvas-manager.js +540 -0
- package/dist/services/v2/canvas-manager.js.map +1 -0
- package/dist/services/v2/canvas-manager.test.d.ts +5 -0
- package/dist/services/v2/canvas-manager.test.d.ts.map +1 -0
- package/dist/services/v2/canvas-manager.test.js +327 -0
- package/dist/services/v2/canvas-manager.test.js.map +1 -0
- package/dist/services/v2/cascade-manager.d.ts +54 -0
- package/dist/services/v2/cascade-manager.d.ts.map +1 -0
- package/dist/services/v2/cascade-manager.js +220 -0
- package/dist/services/v2/cascade-manager.js.map +1 -0
- package/dist/services/v2/cycle-detector.d.ts +76 -0
- package/dist/services/v2/cycle-detector.d.ts.map +1 -0
- package/dist/services/v2/cycle-detector.js +183 -0
- package/dist/services/v2/cycle-detector.js.map +1 -0
- package/dist/services/v2/cycle-detector.test.d.ts +7 -0
- package/dist/services/v2/cycle-detector.test.d.ts.map +1 -0
- package/dist/services/v2/cycle-detector.test.js +125 -0
- package/dist/services/v2/cycle-detector.test.js.map +1 -0
- package/dist/services/v2/entity-parser.d.ts +54 -0
- package/dist/services/v2/entity-parser.d.ts.map +1 -0
- package/dist/services/v2/entity-parser.js +418 -0
- package/dist/services/v2/entity-parser.js.map +1 -0
- package/dist/services/v2/entity-parser.test.d.ts +5 -0
- package/dist/services/v2/entity-parser.test.d.ts.map +1 -0
- package/dist/services/v2/entity-parser.test.js +637 -0
- package/dist/services/v2/entity-parser.test.js.map +1 -0
- package/dist/services/v2/entity-serializer.d.ts +94 -0
- package/dist/services/v2/entity-serializer.d.ts.map +1 -0
- package/dist/services/v2/entity-serializer.js +583 -0
- package/dist/services/v2/entity-serializer.js.map +1 -0
- package/dist/services/v2/entity-serializer.test.d.ts +5 -0
- package/dist/services/v2/entity-serializer.test.d.ts.map +1 -0
- package/dist/services/v2/entity-serializer.test.js +241 -0
- package/dist/services/v2/entity-serializer.test.js.map +1 -0
- package/dist/services/v2/entity-validator.d.ts +65 -0
- package/dist/services/v2/entity-validator.d.ts.map +1 -0
- package/dist/services/v2/entity-validator.js +573 -0
- package/dist/services/v2/entity-validator.js.map +1 -0
- package/dist/services/v2/entity-validator.test.d.ts +5 -0
- package/dist/services/v2/entity-validator.test.d.ts.map +1 -0
- package/dist/services/v2/entity-validator.test.js +519 -0
- package/dist/services/v2/entity-validator.test.js.map +1 -0
- package/dist/services/v2/file-manager.d.ts +73 -0
- package/dist/services/v2/file-manager.d.ts.map +1 -0
- package/dist/services/v2/file-manager.js +310 -0
- package/dist/services/v2/file-manager.js.map +1 -0
- package/dist/services/v2/file-manager.test.d.ts +5 -0
- package/dist/services/v2/file-manager.test.d.ts.map +1 -0
- package/dist/services/v2/file-manager.test.js +339 -0
- package/dist/services/v2/file-manager.test.js.map +1 -0
- package/dist/services/v2/index-manager.d.ts +68 -0
- package/dist/services/v2/index-manager.d.ts.map +1 -0
- package/dist/services/v2/index-manager.js +228 -0
- package/dist/services/v2/index-manager.js.map +1 -0
- package/dist/services/v2/index-manager.test.d.ts +5 -0
- package/dist/services/v2/index-manager.test.d.ts.map +1 -0
- package/dist/services/v2/index-manager.test.js +386 -0
- package/dist/services/v2/index-manager.test.js.map +1 -0
- package/dist/services/v2/index-service.d.ts +82 -0
- package/dist/services/v2/index-service.d.ts.map +1 -0
- package/dist/services/v2/index-service.js +274 -0
- package/dist/services/v2/index-service.js.map +1 -0
- package/dist/services/v2/index-service.test.d.ts +5 -0
- package/dist/services/v2/index-service.test.d.ts.map +1 -0
- package/dist/services/v2/index-service.test.js +117 -0
- package/dist/services/v2/index-service.test.js.map +1 -0
- package/dist/services/v2/lifecycle-manager.d.ts +59 -0
- package/dist/services/v2/lifecycle-manager.d.ts.map +1 -0
- package/dist/services/v2/lifecycle-manager.js +310 -0
- package/dist/services/v2/lifecycle-manager.js.map +1 -0
- package/dist/services/v2/lifecycle-manager.test.d.ts +5 -0
- package/dist/services/v2/lifecycle-manager.test.d.ts.map +1 -0
- package/dist/services/v2/lifecycle-manager.test.js +141 -0
- package/dist/services/v2/lifecycle-manager.test.js.map +1 -0
- package/dist/services/v2/path-resolver.d.ts +64 -0
- package/dist/services/v2/path-resolver.d.ts.map +1 -0
- package/dist/services/v2/path-resolver.js +174 -0
- package/dist/services/v2/path-resolver.js.map +1 -0
- package/dist/services/v2/progress-computer.d.ts +46 -0
- package/dist/services/v2/progress-computer.d.ts.map +1 -0
- package/dist/services/v2/progress-computer.js +200 -0
- package/dist/services/v2/progress-computer.js.map +1 -0
- package/dist/services/v2/search-service.d.ts +68 -0
- package/dist/services/v2/search-service.d.ts.map +1 -0
- package/dist/services/v2/search-service.js +194 -0
- package/dist/services/v2/search-service.js.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.d.ts +54 -0
- package/dist/services/v2/transitive-dependency-remover.d.ts.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.js +156 -0
- package/dist/services/v2/transitive-dependency-remover.js.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.test.d.ts +7 -0
- package/dist/services/v2/transitive-dependency-remover.test.d.ts.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.test.js +119 -0
- package/dist/services/v2/transitive-dependency-remover.test.js.map +1 -0
- package/dist/services/v2/v2-runtime.d.ts +374 -0
- package/dist/services/v2/v2-runtime.d.ts.map +1 -0
- package/dist/services/v2/v2-runtime.js +1908 -0
- package/dist/services/v2/v2-runtime.js.map +1 -0
- package/dist/services/v2/v2-runtime.test.d.ts +5 -0
- package/dist/services/v2/v2-runtime.test.d.ts.map +1 -0
- package/dist/services/v2/v2-runtime.test.js +658 -0
- package/dist/services/v2/v2-runtime.test.js.map +1 -0
- package/dist/services/v2/workstream-normalizer.d.ts +59 -0
- package/dist/services/v2/workstream-normalizer.d.ts.map +1 -0
- package/dist/services/v2/workstream-normalizer.js +137 -0
- package/dist/services/v2/workstream-normalizer.js.map +1 -0
- package/dist/services/v2/workstream-normalizer.test.d.ts +7 -0
- package/dist/services/v2/workstream-normalizer.test.d.ts.map +1 -0
- package/dist/services/v2/workstream-normalizer.test.js +130 -0
- package/dist/services/v2/workstream-normalizer.test.js.map +1 -0
- package/dist/test-runner.d.ts +4 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +44 -249
- package/dist/test-runner.js.map +1 -1
- package/dist/tools/batch-operations-tools.d.ts +54 -0
- package/dist/tools/batch-operations-tools.d.ts.map +1 -0
- package/dist/tools/batch-operations-tools.js +370 -0
- package/dist/tools/batch-operations-tools.js.map +1 -0
- package/dist/tools/decision-document-tools.d.ts +78 -0
- package/dist/tools/decision-document-tools.d.ts.map +1 -0
- package/dist/tools/decision-document-tools.js +260 -0
- package/dist/tools/decision-document-tools.js.map +1 -0
- package/dist/tools/entity-management-tools.d.ts +79 -0
- package/dist/tools/entity-management-tools.d.ts.map +1 -0
- package/dist/tools/entity-management-tools.js +851 -0
- package/dist/tools/entity-management-tools.js.map +1 -0
- package/dist/tools/entity-management-tools.test.d.ts +5 -0
- package/dist/tools/entity-management-tools.test.d.ts.map +1 -0
- package/dist/tools/entity-management-tools.test.js +530 -0
- package/dist/tools/entity-management-tools.test.js.map +1 -0
- package/dist/tools/index.d.ts +15 -271
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +510 -47
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.d.ts +8 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +429 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/project-understanding-tools.d.ts +75 -0
- package/dist/tools/project-understanding-tools.d.ts.map +1 -0
- package/dist/tools/project-understanding-tools.js +751 -0
- package/dist/tools/project-understanding-tools.js.map +1 -0
- package/dist/tools/search-navigation-tools.d.ts +77 -0
- package/dist/tools/search-navigation-tools.d.ts.map +1 -0
- package/dist/tools/search-navigation-tools.js +379 -0
- package/dist/tools/search-navigation-tools.js.map +1 -0
- package/dist/tools/tool-types.d.ts +703 -0
- package/dist/tools/tool-types.d.ts.map +1 -0
- package/dist/tools/tool-types.js +7 -0
- package/dist/tools/tool-types.js.map +1 -0
- package/dist/utils/config.d.ts +0 -4
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +2 -19
- package/dist/utils/config.js.map +1 -1
- package/package.json +16 -1
- package/dist/services/accomplishment-service.d.ts +0 -33
- package/dist/services/accomplishment-service.d.ts.map +0 -1
- package/dist/services/accomplishment-service.js +0 -293
- package/dist/services/accomplishment-service.js.map +0 -1
- package/dist/services/canvas-service.d.ts +0 -96
- package/dist/services/canvas-service.d.ts.map +0 -1
- package/dist/services/canvas-service.js +0 -231
- package/dist/services/canvas-service.js.map +0 -1
- package/dist/services/context-doc-service.d.ts +0 -70
- package/dist/services/context-doc-service.d.ts.map +0 -1
- package/dist/services/context-doc-service.js +0 -229
- package/dist/services/context-doc-service.js.map +0 -1
- package/dist/services/dependency-service.d.ts +0 -22
- package/dist/services/dependency-service.d.ts.map +0 -1
- package/dist/services/dependency-service.js +0 -99
- package/dist/services/dependency-service.js.map +0 -1
- package/dist/services/status-indicator-service.d.ts +0 -40
- package/dist/services/status-indicator-service.d.ts.map +0 -1
- package/dist/services/status-indicator-service.js +0 -173
- package/dist/services/status-indicator-service.js.map +0 -1
- package/dist/services/task-service.d.ts +0 -32
- package/dist/services/task-service.d.ts.map +0 -1
- package/dist/services/task-service.js +0 -152
- package/dist/services/task-service.js.map +0 -1
- package/dist/test-real-vault.d.ts +0 -6
- package/dist/test-real-vault.d.ts.map +0 -1
- package/dist/test-real-vault.js +0 -30
- package/dist/test-real-vault.js.map +0 -1
- package/dist/tools/batch-operations.d.ts +0 -246
- package/dist/tools/batch-operations.d.ts.map +0 -1
- package/dist/tools/batch-operations.js +0 -235
- package/dist/tools/batch-operations.js.map +0 -1
- package/dist/tools/get-accomplishment.d.ts +0 -26
- package/dist/tools/get-accomplishment.d.ts.map +0 -1
- package/dist/tools/get-accomplishment.js +0 -53
- package/dist/tools/get-accomplishment.js.map +0 -1
- package/dist/tools/get-accomplishments-graph.d.ts +0 -26
- package/dist/tools/get-accomplishments-graph.d.ts.map +0 -1
- package/dist/tools/get-accomplishments-graph.js +0 -137
- package/dist/tools/get-accomplishments-graph.js.map +0 -1
- package/dist/tools/get-blocked-items.d.ts +0 -15
- package/dist/tools/get-blocked-items.d.ts.map +0 -1
- package/dist/tools/get-blocked-items.js +0 -73
- package/dist/tools/get-blocked-items.js.map +0 -1
- package/dist/tools/get-current-work.d.ts +0 -15
- package/dist/tools/get-current-work.d.ts.map +0 -1
- package/dist/tools/get-current-work.js +0 -68
- package/dist/tools/get-current-work.js.map +0 -1
- package/dist/tools/get-project-status.d.ts +0 -26
- package/dist/tools/get-project-status.d.ts.map +0 -1
- package/dist/tools/get-project-status.js +0 -98
- package/dist/tools/get-project-status.js.map +0 -1
- package/dist/tools/get-ready-to-start.d.ts +0 -15
- package/dist/tools/get-ready-to-start.d.ts.map +0 -1
- package/dist/tools/get-ready-to-start.js +0 -47
- package/dist/tools/get-ready-to-start.js.map +0 -1
- package/dist/tools/list-accomplishments.d.ts +0 -34
- package/dist/tools/list-accomplishments.d.ts.map +0 -1
- package/dist/tools/list-accomplishments.js +0 -34
- package/dist/tools/list-accomplishments.js.map +0 -1
- package/dist/tools/manage-accomplishment.d.ts +0 -147
- package/dist/tools/manage-accomplishment.d.ts.map +0 -1
- package/dist/tools/manage-accomplishment.js +0 -153
- package/dist/tools/manage-accomplishment.js.map +0 -1
- package/dist/tools/manage-dependency.d.ts +0 -41
- package/dist/tools/manage-dependency.d.ts.map +0 -1
- package/dist/tools/manage-dependency.js +0 -66
- package/dist/tools/manage-dependency.js.map +0 -1
- package/dist/tools/manage-task.d.ts +0 -119
- package/dist/tools/manage-task.d.ts.map +0 -1
- package/dist/tools/manage-task.js +0 -126
- package/dist/tools/manage-task.js.map +0 -1
- package/dist/tools/reconcile-canvas.d.ts +0 -33
- package/dist/tools/reconcile-canvas.d.ts.map +0 -1
- package/dist/tools/reconcile-canvas.js +0 -41
- package/dist/tools/reconcile-canvas.js.map +0 -1
- package/dist/tools/set-work-focus.d.ts +0 -48
- package/dist/tools/set-work-focus.d.ts.map +0 -1
- package/dist/tools/set-work-focus.js +0 -78
- package/dist/tools/set-work-focus.js.map +0 -1
- package/dist/tools/sync-dependencies.d.ts +0 -33
- package/dist/tools/sync-dependencies.d.ts.map +0 -1
- package/dist/tools/sync-dependencies.js +0 -144
- package/dist/tools/sync-dependencies.js.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 Path Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves entity paths, archive paths, and file naming conventions.
|
|
5
|
+
*/
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { getEntityTypeFromId, } from '../../models/v2-types.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Path Constants
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/** Folder names for each entity type */
|
|
12
|
+
const TYPE_FOLDERS = {
|
|
13
|
+
milestone: 'milestones',
|
|
14
|
+
story: 'stories',
|
|
15
|
+
task: 'tasks',
|
|
16
|
+
decision: 'decisions',
|
|
17
|
+
document: 'documents',
|
|
18
|
+
feature: 'features',
|
|
19
|
+
};
|
|
20
|
+
/** Archive folder structure */
|
|
21
|
+
const ARCHIVE_FOLDER = 'archive';
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Path Resolver Class
|
|
24
|
+
// =============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Resolves file paths for entities in the vault.
|
|
27
|
+
*/
|
|
28
|
+
export class PathResolver {
|
|
29
|
+
config;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Entity Paths
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/** Get folder path for entity type */
|
|
37
|
+
getTypeFolderPath(type) {
|
|
38
|
+
return path.join(this.config.entitiesFolder, TYPE_FOLDERS[type]);
|
|
39
|
+
}
|
|
40
|
+
/** Get absolute folder path for entity type */
|
|
41
|
+
getAbsoluteTypeFolderPath(type) {
|
|
42
|
+
return path.join(this.config.vaultPath, this.getTypeFolderPath(type));
|
|
43
|
+
}
|
|
44
|
+
/** Generate file path for entity */
|
|
45
|
+
getEntityPath(id, title) {
|
|
46
|
+
const type = getEntityTypeFromId(id);
|
|
47
|
+
if (!type)
|
|
48
|
+
throw new Error(`Invalid entity ID: ${id}`);
|
|
49
|
+
const folder = this.getTypeFolderPath(type);
|
|
50
|
+
const filename = this.generateFilename(id, title);
|
|
51
|
+
return path.join(folder, filename);
|
|
52
|
+
}
|
|
53
|
+
/** Get absolute file path for entity */
|
|
54
|
+
getAbsoluteEntityPath(id, title) {
|
|
55
|
+
return path.join(this.config.vaultPath, this.getEntityPath(id, title));
|
|
56
|
+
}
|
|
57
|
+
/** Generate filename from title (ID is stored in frontmatter, not filename) */
|
|
58
|
+
generateFilename(_id, title) {
|
|
59
|
+
const sanitized = this.sanitizeTitle(title);
|
|
60
|
+
return `${sanitized}.md`;
|
|
61
|
+
}
|
|
62
|
+
/** Sanitize title for use in filename */
|
|
63
|
+
sanitizeTitle(title) {
|
|
64
|
+
return title
|
|
65
|
+
.replace(/[<>:"/\\|?*]/g, '') // Remove invalid chars
|
|
66
|
+
.replace(/\s+/g, '_') // Replace spaces with underscores
|
|
67
|
+
.replace(/_+/g, '_') // Collapse multiple underscores
|
|
68
|
+
.replace(/^_|_$/g, '') // Trim leading/trailing underscores
|
|
69
|
+
.substring(0, 100); // Limit length
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Archive Paths
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
/** Get archive folder path for a date */
|
|
75
|
+
getArchiveFolderPath(date = new Date()) {
|
|
76
|
+
const year = date.getFullYear();
|
|
77
|
+
const quarter = Math.ceil((date.getMonth() + 1) / 3);
|
|
78
|
+
return path.join(this.config.archiveFolder, `${year}-Q${quarter}`);
|
|
79
|
+
}
|
|
80
|
+
/** Get absolute archive folder path */
|
|
81
|
+
getAbsoluteArchiveFolderPath(date = new Date()) {
|
|
82
|
+
return path.join(this.config.vaultPath, this.getArchiveFolderPath(date));
|
|
83
|
+
}
|
|
84
|
+
/** Get archive path for entity */
|
|
85
|
+
getArchivePath(id, title, date = new Date()) {
|
|
86
|
+
const archiveFolder = this.getArchiveFolderPath(date);
|
|
87
|
+
const filename = this.generateFilename(id, title);
|
|
88
|
+
return path.join(archiveFolder, filename);
|
|
89
|
+
}
|
|
90
|
+
/** Get absolute archive path for entity */
|
|
91
|
+
getAbsoluteArchivePath(id, title, date = new Date()) {
|
|
92
|
+
return path.join(this.config.vaultPath, this.getArchivePath(id, title, date));
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Path Parsing
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
/**
|
|
98
|
+
* Extract entity ID from file path.
|
|
99
|
+
* NOTE: Since IDs are no longer in filenames, this returns null.
|
|
100
|
+
* Use entity-parser to get ID from frontmatter instead.
|
|
101
|
+
* @deprecated IDs are stored in frontmatter, not filenames
|
|
102
|
+
*/
|
|
103
|
+
extractIdFromPath(_filePath) {
|
|
104
|
+
// IDs are no longer in filenames - they're in frontmatter
|
|
105
|
+
// This method is kept for backward compatibility but always returns null
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/** Check if path is in archive */
|
|
109
|
+
isArchivePath(filePath) {
|
|
110
|
+
return filePath.startsWith(this.config.archiveFolder);
|
|
111
|
+
}
|
|
112
|
+
/** Check if path is an entity file (based on folder location) */
|
|
113
|
+
isEntityPath(filePath) {
|
|
114
|
+
if (!filePath.endsWith('.md'))
|
|
115
|
+
return false;
|
|
116
|
+
// Check if file is in one of the entity folders
|
|
117
|
+
const type = this.getTypeFromPath(filePath);
|
|
118
|
+
return type !== null;
|
|
119
|
+
}
|
|
120
|
+
/** Get entity type from path */
|
|
121
|
+
getTypeFromPath(filePath) {
|
|
122
|
+
for (const [type, folder] of Object.entries(TYPE_FOLDERS)) {
|
|
123
|
+
if (filePath.includes(`/${folder}/`) || filePath.startsWith(`${folder}/`)) {
|
|
124
|
+
return type;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Canvas Paths
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/** Get canvas folder path */
|
|
133
|
+
getCanvasFolderPath() {
|
|
134
|
+
return this.config.canvasFolder;
|
|
135
|
+
}
|
|
136
|
+
/** Get absolute canvas folder path */
|
|
137
|
+
getAbsoluteCanvasFolderPath() {
|
|
138
|
+
return path.join(this.config.vaultPath, this.config.canvasFolder);
|
|
139
|
+
}
|
|
140
|
+
/** Check if path is a canvas file */
|
|
141
|
+
isCanvasPath(filePath) {
|
|
142
|
+
return filePath.endsWith('.canvas');
|
|
143
|
+
}
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Folder Utilities
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
/** Get all entity folder paths */
|
|
148
|
+
getAllEntityFolders() {
|
|
149
|
+
return Object.values(TYPE_FOLDERS).map(folder => path.join(this.config.entitiesFolder, folder));
|
|
150
|
+
}
|
|
151
|
+
/** Get all absolute entity folder paths */
|
|
152
|
+
getAllAbsoluteEntityFolders() {
|
|
153
|
+
return this.getAllEntityFolders().map(folder => path.join(this.config.vaultPath, folder));
|
|
154
|
+
}
|
|
155
|
+
/** Get config */
|
|
156
|
+
/** Convert absolute path to vault-relative path */
|
|
157
|
+
toVaultPath(absolutePath) {
|
|
158
|
+
if (absolutePath.startsWith(this.config.vaultPath)) {
|
|
159
|
+
return absolutePath.slice(this.config.vaultPath.length + 1);
|
|
160
|
+
}
|
|
161
|
+
return absolutePath;
|
|
162
|
+
}
|
|
163
|
+
/** Convert vault-relative path to absolute path */
|
|
164
|
+
toAbsolutePath(vaultPath) {
|
|
165
|
+
if (path.isAbsolute(vaultPath))
|
|
166
|
+
return vaultPath;
|
|
167
|
+
return path.join(this.config.vaultPath, vaultPath);
|
|
168
|
+
}
|
|
169
|
+
/** Get config */
|
|
170
|
+
getConfig() {
|
|
171
|
+
return this.config;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../../src/services/v2/path-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 Progress Computer
|
|
3
|
+
*
|
|
4
|
+
* Computes progress metrics for entities based on their children's status.
|
|
5
|
+
*/
|
|
6
|
+
import { Entity, EntityId, EntityType } from '../../models/v2-types.js';
|
|
7
|
+
export interface ProgressMetrics {
|
|
8
|
+
total: number;
|
|
9
|
+
completed: number;
|
|
10
|
+
in_progress: number;
|
|
11
|
+
not_started: number;
|
|
12
|
+
blocked: number;
|
|
13
|
+
percentage: number;
|
|
14
|
+
}
|
|
15
|
+
export interface EntityProgress {
|
|
16
|
+
entity_id: EntityId;
|
|
17
|
+
entity_type: EntityType;
|
|
18
|
+
direct_progress: ProgressMetrics;
|
|
19
|
+
nested_progress?: ProgressMetrics;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Computes progress metrics for entities.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ProgressComputer {
|
|
25
|
+
private getEntity;
|
|
26
|
+
private getChildren;
|
|
27
|
+
setEntityCallback(fn: (id: EntityId) => Entity | undefined): void;
|
|
28
|
+
setChildrenCallback(fn: (id: EntityId, type?: EntityType) => Entity[]): void;
|
|
29
|
+
/** Compute progress for any entity */
|
|
30
|
+
computeProgress(entityId: EntityId): EntityProgress | undefined;
|
|
31
|
+
/** Compute progress for a milestone (stories and nested tasks) */
|
|
32
|
+
computeMilestoneProgress(milestoneId: EntityId): EntityProgress;
|
|
33
|
+
/** Compute progress for a story (tasks) */
|
|
34
|
+
computeStoryProgress(storyId: EntityId): EntityProgress;
|
|
35
|
+
/** Compute metrics for a list of entities (stories) */
|
|
36
|
+
private computeMetrics;
|
|
37
|
+
/** Compute metrics for a list of tasks */
|
|
38
|
+
private computeTaskMetrics;
|
|
39
|
+
/** Return empty metrics */
|
|
40
|
+
private emptyMetrics;
|
|
41
|
+
/** Check if an entity is complete based on its type */
|
|
42
|
+
isComplete(entity: Entity): boolean;
|
|
43
|
+
/** Get completion percentage as a formatted string */
|
|
44
|
+
formatProgress(progress: ProgressMetrics): string;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=progress-computer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-computer.d.ts","sourceRoot":"","sources":["../../../src/services/v2/progress-computer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EAIX,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAMD;;GAEG;AACH,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,SAAS,CAAyD;IAC1E,OAAO,CAAC,WAAW,CAA2D;IAM9E,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI;IAIjE,mBAAmB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,UAAU,KAAK,MAAM,EAAE,GAAG,IAAI;IAQ5E,sCAAsC;IACtC,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,GAAG,SAAS;IAkB/D,kEAAkE;IAClE,wBAAwB,CAAC,WAAW,EAAE,QAAQ,GAAG,cAAc;IAiD/D,2CAA2C;IAC3C,oBAAoB,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc;IAevD,uDAAuD;IACvD,OAAO,CAAC,cAAc;IAkCtB,0CAA0C;IAC1C,OAAO,CAAC,kBAAkB;IAkC1B,2BAA2B;IAC3B,OAAO,CAAC,YAAY;IAepB,uDAAuD;IACvD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAenC,sDAAsD;IACtD,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;CAGlD"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 Progress Computer
|
|
3
|
+
*
|
|
4
|
+
* Computes progress metrics for entities based on their children's status.
|
|
5
|
+
*/
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// Progress Computer Class
|
|
8
|
+
// =============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Computes progress metrics for entities.
|
|
11
|
+
*/
|
|
12
|
+
export class ProgressComputer {
|
|
13
|
+
// Callbacks for external dependencies
|
|
14
|
+
getEntity = () => undefined;
|
|
15
|
+
getChildren = () => [];
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Configuration
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
setEntityCallback(fn) {
|
|
20
|
+
this.getEntity = fn;
|
|
21
|
+
}
|
|
22
|
+
setChildrenCallback(fn) {
|
|
23
|
+
this.getChildren = fn;
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Progress Computation
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** Compute progress for any entity */
|
|
29
|
+
computeProgress(entityId) {
|
|
30
|
+
const entity = this.getEntity(entityId);
|
|
31
|
+
if (!entity)
|
|
32
|
+
return undefined;
|
|
33
|
+
switch (entity.type) {
|
|
34
|
+
case 'milestone':
|
|
35
|
+
return this.computeMilestoneProgress(entityId);
|
|
36
|
+
case 'story':
|
|
37
|
+
return this.computeStoryProgress(entityId);
|
|
38
|
+
default:
|
|
39
|
+
return {
|
|
40
|
+
entity_id: entityId,
|
|
41
|
+
entity_type: entity.type,
|
|
42
|
+
direct_progress: this.emptyMetrics(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Compute progress for a milestone (stories and nested tasks) */
|
|
47
|
+
computeMilestoneProgress(milestoneId) {
|
|
48
|
+
const stories = this.getChildren(milestoneId, 'story');
|
|
49
|
+
const directProgress = this.computeMetrics(stories);
|
|
50
|
+
// Compute nested task progress across all stories
|
|
51
|
+
let totalTasks = 0;
|
|
52
|
+
let completedTasks = 0;
|
|
53
|
+
let inProgressTasks = 0;
|
|
54
|
+
let notStartedTasks = 0;
|
|
55
|
+
let blockedTasks = 0;
|
|
56
|
+
for (const story of stories) {
|
|
57
|
+
const tasks = this.getChildren(story.id, 'task');
|
|
58
|
+
totalTasks += tasks.length;
|
|
59
|
+
for (const task of tasks) {
|
|
60
|
+
switch (task.status) {
|
|
61
|
+
case 'Completed':
|
|
62
|
+
completedTasks++;
|
|
63
|
+
break;
|
|
64
|
+
case 'In Progress':
|
|
65
|
+
inProgressTasks++;
|
|
66
|
+
break;
|
|
67
|
+
case 'Not Started':
|
|
68
|
+
notStartedTasks++;
|
|
69
|
+
break;
|
|
70
|
+
case 'Blocked':
|
|
71
|
+
blockedTasks++;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const nestedProgress = {
|
|
77
|
+
total: totalTasks,
|
|
78
|
+
completed: completedTasks,
|
|
79
|
+
in_progress: inProgressTasks,
|
|
80
|
+
not_started: notStartedTasks,
|
|
81
|
+
blocked: blockedTasks,
|
|
82
|
+
percentage: totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0,
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
entity_id: milestoneId,
|
|
86
|
+
entity_type: 'milestone',
|
|
87
|
+
direct_progress: directProgress,
|
|
88
|
+
nested_progress: nestedProgress,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** Compute progress for a story (tasks) */
|
|
92
|
+
computeStoryProgress(storyId) {
|
|
93
|
+
const tasks = this.getChildren(storyId, 'task');
|
|
94
|
+
const directProgress = this.computeTaskMetrics(tasks);
|
|
95
|
+
return {
|
|
96
|
+
entity_id: storyId,
|
|
97
|
+
entity_type: 'story',
|
|
98
|
+
direct_progress: directProgress,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Helper Methods
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/** Compute metrics for a list of entities (stories) */
|
|
105
|
+
computeMetrics(entities) {
|
|
106
|
+
const metrics = {
|
|
107
|
+
total: entities.length,
|
|
108
|
+
completed: 0,
|
|
109
|
+
in_progress: 0,
|
|
110
|
+
not_started: 0,
|
|
111
|
+
blocked: 0,
|
|
112
|
+
percentage: 0,
|
|
113
|
+
};
|
|
114
|
+
for (const entity of entities) {
|
|
115
|
+
switch (entity.status) {
|
|
116
|
+
case 'Completed':
|
|
117
|
+
metrics.completed++;
|
|
118
|
+
break;
|
|
119
|
+
case 'In Progress':
|
|
120
|
+
metrics.in_progress++;
|
|
121
|
+
break;
|
|
122
|
+
case 'Not Started':
|
|
123
|
+
metrics.not_started++;
|
|
124
|
+
break;
|
|
125
|
+
case 'Blocked':
|
|
126
|
+
metrics.blocked++;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
metrics.percentage = metrics.total > 0
|
|
131
|
+
? Math.round((metrics.completed / metrics.total) * 100)
|
|
132
|
+
: 0;
|
|
133
|
+
return metrics;
|
|
134
|
+
}
|
|
135
|
+
/** Compute metrics for a list of tasks */
|
|
136
|
+
computeTaskMetrics(tasks) {
|
|
137
|
+
const metrics = {
|
|
138
|
+
total: tasks.length,
|
|
139
|
+
completed: 0,
|
|
140
|
+
in_progress: 0,
|
|
141
|
+
not_started: 0,
|
|
142
|
+
blocked: 0,
|
|
143
|
+
percentage: 0,
|
|
144
|
+
};
|
|
145
|
+
for (const task of tasks) {
|
|
146
|
+
switch (task.status) {
|
|
147
|
+
case 'Completed':
|
|
148
|
+
metrics.completed++;
|
|
149
|
+
break;
|
|
150
|
+
case 'In Progress':
|
|
151
|
+
metrics.in_progress++;
|
|
152
|
+
break;
|
|
153
|
+
case 'Not Started':
|
|
154
|
+
metrics.not_started++;
|
|
155
|
+
break;
|
|
156
|
+
case 'Blocked':
|
|
157
|
+
metrics.blocked++;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
metrics.percentage = metrics.total > 0
|
|
162
|
+
? Math.round((metrics.completed / metrics.total) * 100)
|
|
163
|
+
: 0;
|
|
164
|
+
return metrics;
|
|
165
|
+
}
|
|
166
|
+
/** Return empty metrics */
|
|
167
|
+
emptyMetrics() {
|
|
168
|
+
return {
|
|
169
|
+
total: 0,
|
|
170
|
+
completed: 0,
|
|
171
|
+
in_progress: 0,
|
|
172
|
+
not_started: 0,
|
|
173
|
+
blocked: 0,
|
|
174
|
+
percentage: 0,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Utility Methods
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
/** Check if an entity is complete based on its type */
|
|
181
|
+
isComplete(entity) {
|
|
182
|
+
switch (entity.type) {
|
|
183
|
+
case 'milestone':
|
|
184
|
+
case 'story':
|
|
185
|
+
case 'task':
|
|
186
|
+
return entity.status === 'Completed';
|
|
187
|
+
case 'decision':
|
|
188
|
+
return entity.status === 'Decided' || entity.status === 'Superseded';
|
|
189
|
+
case 'document':
|
|
190
|
+
return entity.status === 'Approved' || entity.status === 'Superseded';
|
|
191
|
+
case 'feature':
|
|
192
|
+
return entity.status === 'Complete';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Get completion percentage as a formatted string */
|
|
196
|
+
formatProgress(progress) {
|
|
197
|
+
return `${progress.completed}/${progress.total} (${progress.percentage}%)`;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=progress-computer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-computer.js","sourceRoot":"","sources":["../../../src/services/v2/progress-computer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 Search Service
|
|
3
|
+
*
|
|
4
|
+
* Provides token-based inverted index for full-text search across entities.
|
|
5
|
+
*/
|
|
6
|
+
import { EntityId } from '../../models/v2-types.js';
|
|
7
|
+
/** Search result with relevance score */
|
|
8
|
+
export interface SearchResult {
|
|
9
|
+
id: EntityId;
|
|
10
|
+
score: number;
|
|
11
|
+
matches: {
|
|
12
|
+
field: string;
|
|
13
|
+
positions: number[];
|
|
14
|
+
}[];
|
|
15
|
+
}
|
|
16
|
+
/** Search options */
|
|
17
|
+
export interface SearchOptions {
|
|
18
|
+
/** Fields to search (default: all) */
|
|
19
|
+
fields?: ('title' | 'content' | 'tags')[];
|
|
20
|
+
/** Maximum results to return */
|
|
21
|
+
limit?: number;
|
|
22
|
+
/** Minimum score threshold */
|
|
23
|
+
minScore?: number;
|
|
24
|
+
/** Filter by entity type */
|
|
25
|
+
types?: string[];
|
|
26
|
+
/** Include archived entities */
|
|
27
|
+
includeArchived?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Token-based inverted index for full-text search.
|
|
31
|
+
*/
|
|
32
|
+
export declare class SearchIndex {
|
|
33
|
+
/** Inverted index: token -> Set of entity IDs */
|
|
34
|
+
private titleIndex;
|
|
35
|
+
private contentIndex;
|
|
36
|
+
/** Document frequency for TF-IDF scoring */
|
|
37
|
+
private documentCount;
|
|
38
|
+
private tokenDocFreq;
|
|
39
|
+
/** Entity metadata cache for filtering */
|
|
40
|
+
private entityMeta;
|
|
41
|
+
/** Add or update entity in search index */
|
|
42
|
+
index(id: EntityId, title: string, content: string, type: string, archived: boolean): void;
|
|
43
|
+
/** Remove entity from search index */
|
|
44
|
+
remove(id: EntityId): void;
|
|
45
|
+
/** Clear all indexes */
|
|
46
|
+
clear(): void;
|
|
47
|
+
/** Search for entities matching query */
|
|
48
|
+
search(query: string, options?: SearchOptions): SearchResult[];
|
|
49
|
+
/** Tokenize text into searchable tokens */
|
|
50
|
+
private tokenize;
|
|
51
|
+
/** Add entity to token index */
|
|
52
|
+
private addToIndex;
|
|
53
|
+
/** Increment document frequency for token */
|
|
54
|
+
private incrementDocFreq;
|
|
55
|
+
/** Decrement document frequency for token */
|
|
56
|
+
private decrementDocFreq;
|
|
57
|
+
/** Calculate IDF (Inverse Document Frequency) for token */
|
|
58
|
+
private calculateIDF;
|
|
59
|
+
/** Add match info to results */
|
|
60
|
+
private addMatch;
|
|
61
|
+
/** Get index statistics */
|
|
62
|
+
getStats(): {
|
|
63
|
+
documentCount: number;
|
|
64
|
+
titleTokens: number;
|
|
65
|
+
contentTokens: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=search-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-service.d.ts","sourceRoot":"","sources":["../../../src/services/v2/search-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAkB,MAAM,0BAA0B,CAAC;AAMpE,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,EAAE,CAAC;CACL;AAED,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1C,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gCAAgC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD;;GAEG;AACH,qBAAa,WAAW;IACtB,iDAAiD;IACjD,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,YAAY,CAAyC;IAE7D,4CAA4C;IAC5C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAkC;IAEtD,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAAiE;IAMnF,2CAA2C;IAC3C,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAuB1F,sCAAsC;IACtC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAuB1B,wBAAwB;IACxB,KAAK,IAAI,IAAI;IAYb,yCAAyC;IACzC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE;IAwDlE,2CAA2C;IAC3C,OAAO,CAAC,QAAQ;IAUhB,gCAAgC;IAChC,OAAO,CAAC,UAAU;IAMlB,6CAA6C;IAC7C,OAAO,CAAC,gBAAgB;IAIxB,6CAA6C;IAC7C,OAAO,CAAC,gBAAgB;IASxB,2DAA2D;IAC3D,OAAO,CAAC,YAAY;IAMpB,gCAAgC;IAChC,OAAO,CAAC,QAAQ;IAkBhB,2BAA2B;IAC3B,QAAQ,IAAI;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;CAOlF"}
|