@lwelliott/cortex-cli 1.0.3
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/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +78 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/doc.d.ts +3 -0
- package/dist/cli/doc.d.ts.map +1 -0
- package/dist/cli/doc.js +291 -0
- package/dist/cli/doc.js.map +1 -0
- package/dist/cli/entity.d.ts +3 -0
- package/dist/cli/entity.d.ts.map +1 -0
- package/dist/cli/entity.js +135 -0
- package/dist/cli/entity.js.map +1 -0
- package/dist/cli/format-selector.d.ts +30 -0
- package/dist/cli/format-selector.d.ts.map +1 -0
- package/dist/cli/format-selector.js +101 -0
- package/dist/cli/format-selector.js.map +1 -0
- package/dist/cli/formatters/audit-formatter.d.ts +33 -0
- package/dist/cli/formatters/audit-formatter.d.ts.map +1 -0
- package/dist/cli/formatters/audit-formatter.js +204 -0
- package/dist/cli/formatters/audit-formatter.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +10 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +31 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/markdown.d.ts +12 -0
- package/dist/cli/formatters/markdown.d.ts.map +1 -0
- package/dist/cli/formatters/markdown.js +341 -0
- package/dist/cli/formatters/markdown.js.map +1 -0
- package/dist/cli/formatters/quiet.d.ts +15 -0
- package/dist/cli/formatters/quiet.d.ts.map +1 -0
- package/dist/cli/formatters/quiet.js +75 -0
- package/dist/cli/formatters/quiet.js.map +1 -0
- package/dist/cli/formatters/table.d.ts +11 -0
- package/dist/cli/formatters/table.d.ts.map +1 -0
- package/dist/cli/formatters/table.js +726 -0
- package/dist/cli/formatters/table.js.map +1 -0
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.d.ts.map +1 -0
- package/dist/cli/graph.js +209 -0
- package/dist/cli/graph.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +144 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lesson.d.ts +3 -0
- package/dist/cli/lesson.d.ts.map +1 -0
- package/dist/cli/lesson.js +85 -0
- package/dist/cli/lesson.js.map +1 -0
- package/dist/cli/project-resolver.d.ts +17 -0
- package/dist/cli/project-resolver.d.ts.map +1 -0
- package/dist/cli/project-resolver.js +25 -0
- package/dist/cli/project-resolver.js.map +1 -0
- package/dist/cli/project.d.ts +12 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +169 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/relation.d.ts +3 -0
- package/dist/cli/relation.d.ts.map +1 -0
- package/dist/cli/relation.js +128 -0
- package/dist/cli/relation.js.map +1 -0
- package/dist/cli/review.d.ts +3 -0
- package/dist/cli/review.d.ts.map +1 -0
- package/dist/cli/review.js +131 -0
- package/dist/cli/review.js.map +1 -0
- package/dist/cli/router.d.ts +38 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +49 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/schema.d.ts +3 -0
- package/dist/cli/schema.d.ts.map +1 -0
- package/dist/cli/schema.js +94 -0
- package/dist/cli/schema.js.map +1 -0
- package/dist/cli/sprint.d.ts +12 -0
- package/dist/cli/sprint.d.ts.map +1 -0
- package/dist/cli/sprint.js +200 -0
- package/dist/cli/sprint.js.map +1 -0
- package/dist/cli/task.d.ts +12 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +252 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/test-report.d.ts +3 -0
- package/dist/cli/test-report.d.ts.map +1 -0
- package/dist/cli/test-report.js +134 -0
- package/dist/cli/test-report.js.map +1 -0
- package/dist/cli/validate.d.ts +8 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +86 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/config/config.d.ts +18 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +70 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/registry.d.ts +52 -0
- package/dist/config/registry.d.ts.map +1 -0
- package/dist/config/registry.js +193 -0
- package/dist/config/registry.js.map +1 -0
- package/dist/config/resolver.d.ts +26 -0
- package/dist/config/resolver.d.ts.map +1 -0
- package/dist/config/resolver.js +87 -0
- package/dist/config/resolver.js.map +1 -0
- package/dist/db/builtin-schema-constants.d.ts +109 -0
- package/dist/db/builtin-schema-constants.d.ts.map +1 -0
- package/dist/db/builtin-schema-constants.js +32 -0
- package/dist/db/builtin-schema-constants.js.map +1 -0
- package/dist/db/connection.d.ts +34 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +140 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/generated/schema-types.d.ts +134 -0
- package/dist/db/generated/schema-types.d.ts.map +1 -0
- package/dist/db/generated/schema-types.js +31 -0
- package/dist/db/generated/schema-types.js.map +1 -0
- package/dist/db/locks.d.ts +106 -0
- package/dist/db/locks.d.ts.map +1 -0
- package/dist/db/locks.js +211 -0
- package/dist/db/locks.js.map +1 -0
- package/dist/db/migration.d.ts +65 -0
- package/dist/db/migration.d.ts.map +1 -0
- package/dist/db/migration.js +233 -0
- package/dist/db/migration.js.map +1 -0
- package/dist/db/retry.d.ts +26 -0
- package/dist/db/retry.d.ts.map +1 -0
- package/dist/db/retry.js +71 -0
- package/dist/db/retry.js.map +1 -0
- package/dist/db/schema.d.ts +21 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +830 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/models/common.d.ts +27 -0
- package/dist/models/common.d.ts.map +1 -0
- package/dist/models/common.js +4 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/document.d.ts +89 -0
- package/dist/models/document.d.ts.map +1 -0
- package/dist/models/document.js +5 -0
- package/dist/models/document.js.map +1 -0
- package/dist/models/entity-model.d.ts +30 -0
- package/dist/models/entity-model.d.ts.map +1 -0
- package/dist/models/entity-model.js +99 -0
- package/dist/models/entity-model.js.map +1 -0
- package/dist/models/entity.d.ts +88 -0
- package/dist/models/entity.d.ts.map +1 -0
- package/dist/models/entity.js +5 -0
- package/dist/models/entity.js.map +1 -0
- package/dist/models/graph-schema.d.ts +43 -0
- package/dist/models/graph-schema.d.ts.map +1 -0
- package/dist/models/graph-schema.js +76 -0
- package/dist/models/graph-schema.js.map +1 -0
- package/dist/models/project.d.ts +49 -0
- package/dist/models/project.d.ts.map +1 -0
- package/dist/models/project.js +18 -0
- package/dist/models/project.js.map +1 -0
- package/dist/models/relation.d.ts +35 -0
- package/dist/models/relation.d.ts.map +1 -0
- package/dist/models/relation.js +212 -0
- package/dist/models/relation.js.map +1 -0
- package/dist/models/review.d.ts +86 -0
- package/dist/models/review.d.ts.map +1 -0
- package/dist/models/review.js +5 -0
- package/dist/models/review.js.map +1 -0
- package/dist/models/sprint.d.ts +38 -0
- package/dist/models/sprint.d.ts.map +1 -0
- package/dist/models/sprint.js +4 -0
- package/dist/models/sprint.js.map +1 -0
- package/dist/models/task.d.ts +75 -0
- package/dist/models/task.d.ts.map +1 -0
- package/dist/models/task.js +4 -0
- package/dist/models/task.js.map +1 -0
- package/dist/models/validation.d.ts +25 -0
- package/dist/models/validation.d.ts.map +1 -0
- package/dist/models/validation.js +4 -0
- package/dist/models/validation.js.map +1 -0
- package/dist/services/audit-check-service.d.ts +16 -0
- package/dist/services/audit-check-service.d.ts.map +1 -0
- package/dist/services/audit-check-service.js +137 -0
- package/dist/services/audit-check-service.js.map +1 -0
- package/dist/services/audit-checks/dangling-relations-check.d.ts +7 -0
- package/dist/services/audit-checks/dangling-relations-check.d.ts.map +1 -0
- package/dist/services/audit-checks/dangling-relations-check.js +52 -0
- package/dist/services/audit-checks/dangling-relations-check.js.map +1 -0
- package/dist/services/audit-checks/duplicate-ids-check.d.ts +4 -0
- package/dist/services/audit-checks/duplicate-ids-check.d.ts.map +1 -0
- package/dist/services/audit-checks/duplicate-ids-check.js +49 -0
- package/dist/services/audit-checks/duplicate-ids-check.js.map +1 -0
- package/dist/services/audit-checks/fix-engine.d.ts +24 -0
- package/dist/services/audit-checks/fix-engine.d.ts.map +1 -0
- package/dist/services/audit-checks/fix-engine.js +114 -0
- package/dist/services/audit-checks/fix-engine.js.map +1 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts +9 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts.map +1 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js +56 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts +10 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js +57 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts +9 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.js +56 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.js.map +1 -0
- package/dist/services/audit-checks/inverse-consistency-check.d.ts +7 -0
- package/dist/services/audit-checks/inverse-consistency-check.d.ts.map +1 -0
- package/dist/services/audit-checks/inverse-consistency-check.js +54 -0
- package/dist/services/audit-checks/inverse-consistency-check.js.map +1 -0
- package/dist/services/audit-checks/mapping-check.d.ts +4 -0
- package/dist/services/audit-checks/mapping-check.d.ts.map +1 -0
- package/dist/services/audit-checks/mapping-check.js +74 -0
- package/dist/services/audit-checks/mapping-check.js.map +1 -0
- package/dist/services/audit-checks/orphan-documents-check.d.ts +9 -0
- package/dist/services/audit-checks/orphan-documents-check.d.ts.map +1 -0
- package/dist/services/audit-checks/orphan-documents-check.js +54 -0
- package/dist/services/audit-checks/orphan-documents-check.js.map +1 -0
- package/dist/services/audit-checks/orphan-entities-check.d.ts +4 -0
- package/dist/services/audit-checks/orphan-entities-check.d.ts.map +1 -0
- package/dist/services/audit-checks/orphan-entities-check.js +39 -0
- package/dist/services/audit-checks/orphan-entities-check.js.map +1 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts +9 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts.map +1 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js +56 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js.map +1 -0
- package/dist/services/audit-checks/sprint-consistency-check.d.ts +4 -0
- package/dist/services/audit-checks/sprint-consistency-check.d.ts.map +1 -0
- package/dist/services/audit-checks/sprint-consistency-check.js +80 -0
- package/dist/services/audit-checks/sprint-consistency-check.js.map +1 -0
- package/dist/services/audit-checks/src-filesystem-only-check.d.ts +10 -0
- package/dist/services/audit-checks/src-filesystem-only-check.d.ts.map +1 -0
- package/dist/services/audit-checks/src-filesystem-only-check.js +106 -0
- package/dist/services/audit-checks/src-filesystem-only-check.js.map +1 -0
- package/dist/services/audit-checks/ts-to-tc-check.d.ts +10 -0
- package/dist/services/audit-checks/ts-to-tc-check.d.ts.map +1 -0
- package/dist/services/audit-checks/ts-to-tc-check.js +58 -0
- package/dist/services/audit-checks/ts-to-tc-check.js.map +1 -0
- package/dist/services/audit-checks/type-mismatch-check.d.ts +4 -0
- package/dist/services/audit-checks/type-mismatch-check.d.ts.map +1 -0
- package/dist/services/audit-checks/type-mismatch-check.js +55 -0
- package/dist/services/audit-checks/type-mismatch-check.js.map +1 -0
- package/dist/services/audit-checks/types.d.ts +66 -0
- package/dist/services/audit-checks/types.d.ts.map +1 -0
- package/dist/services/audit-checks/types.js +30 -0
- package/dist/services/audit-checks/types.js.map +1 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts +9 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts.map +1 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.js +56 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.js.map +1 -0
- package/dist/services/doc-entity-mapping.d.ts +19 -0
- package/dist/services/doc-entity-mapping.d.ts.map +1 -0
- package/dist/services/doc-entity-mapping.js +35 -0
- package/dist/services/doc-entity-mapping.js.map +1 -0
- package/dist/services/document-service.d.ts +58 -0
- package/dist/services/document-service.d.ts.map +1 -0
- package/dist/services/document-service.js +409 -0
- package/dist/services/document-service.js.map +1 -0
- package/dist/services/graph-export-service.d.ts +12 -0
- package/dist/services/graph-export-service.d.ts.map +1 -0
- package/dist/services/graph-export-service.js +112 -0
- package/dist/services/graph-export-service.js.map +1 -0
- package/dist/services/graph-service.d.ts +21 -0
- package/dist/services/graph-service.d.ts.map +1 -0
- package/dist/services/graph-service.js +49 -0
- package/dist/services/graph-service.js.map +1 -0
- package/dist/services/graph-validation-service.d.ts +13 -0
- package/dist/services/graph-validation-service.d.ts.map +1 -0
- package/dist/services/graph-validation-service.js +171 -0
- package/dist/services/graph-validation-service.js.map +1 -0
- package/dist/services/project.d.ts +80 -0
- package/dist/services/project.d.ts.map +1 -0
- package/dist/services/project.js +256 -0
- package/dist/services/project.js.map +1 -0
- package/dist/services/review-service.d.ts +81 -0
- package/dist/services/review-service.d.ts.map +1 -0
- package/dist/services/review-service.js +242 -0
- package/dist/services/review-service.js.map +1 -0
- package/dist/services/schema-migration-service.d.ts +44 -0
- package/dist/services/schema-migration-service.d.ts.map +1 -0
- package/dist/services/schema-migration-service.js +894 -0
- package/dist/services/schema-migration-service.js.map +1 -0
- package/dist/services/sprint.d.ts +71 -0
- package/dist/services/sprint.d.ts.map +1 -0
- package/dist/services/sprint.js +238 -0
- package/dist/services/sprint.js.map +1 -0
- package/dist/services/stage-validator.d.ts +36 -0
- package/dist/services/stage-validator.d.ts.map +1 -0
- package/dist/services/stage-validator.js +78 -0
- package/dist/services/stage-validator.js.map +1 -0
- package/dist/services/task.d.ts +75 -0
- package/dist/services/task.d.ts.map +1 -0
- package/dist/services/task.js +487 -0
- package/dist/services/task.js.map +1 -0
- package/dist/services/validation.d.ts +24 -0
- package/dist/services/validation.d.ts.map +1 -0
- package/dist/services/validation.js +53 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/state-machines/sprint-state.d.ts +25 -0
- package/dist/state-machines/sprint-state.d.ts.map +1 -0
- package/dist/state-machines/sprint-state.js +64 -0
- package/dist/state-machines/sprint-state.js.map +1 -0
- package/dist/state-machines/task-state.d.ts +31 -0
- package/dist/state-machines/task-state.d.ts.map +1 -0
- package/dist/state-machines/task-state.js +83 -0
- package/dist/state-machines/task-state.js.map +1 -0
- package/dist/utils/errors.d.ts +673 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +1447 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format.d.ts +52 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +65 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/validators/board-integrity.d.ts +25 -0
- package/dist/validators/board-integrity.d.ts.map +1 -0
- package/dist/validators/board-integrity.js +102 -0
- package/dist/validators/board-integrity.js.map +1 -0
- package/dist/validators/board-shape.d.ts +13 -0
- package/dist/validators/board-shape.d.ts.map +1 -0
- package/dist/validators/board-shape.js +74 -0
- package/dist/validators/board-shape.js.map +1 -0
- package/dist/validators/owner-validator.d.ts +30 -0
- package/dist/validators/owner-validator.d.ts.map +1 -0
- package/dist/validators/owner-validator.js +70 -0
- package/dist/validators/owner-validator.js.map +1 -0
- package/dist/validators/spawn-legality.d.ts +19 -0
- package/dist/validators/spawn-legality.d.ts.map +1 -0
- package/dist/validators/spawn-legality.js +77 -0
- package/dist/validators/spawn-legality.js.map +1 -0
- package/dist/validators/state-field-checker.d.ts +8 -0
- package/dist/validators/state-field-checker.d.ts.map +1 -0
- package/dist/validators/state-field-checker.js +47 -0
- package/dist/validators/state-field-checker.js.map +1 -0
- package/dist/validators/state-field-recorder.d.ts +39 -0
- package/dist/validators/state-field-recorder.d.ts.map +1 -0
- package/dist/validators/state-field-recorder.js +62 -0
- package/dist/validators/state-field-recorder.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Document service: orchestrates document lifecycle
|
|
3
|
+
// SAD-0003: MOD-012 Document Registry & Content
|
|
4
|
+
// AD-0018: FTS5 with trigger-based index
|
|
5
|
+
// AD-0019: Dual-mode document storage
|
|
6
|
+
// SAD-0035: Entity auto-sync removed — entities table dropped
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.registerDocument = registerDocument;
|
|
9
|
+
exports.listDocuments = listDocuments;
|
|
10
|
+
exports.getDocument = getDocument;
|
|
11
|
+
exports.showDocument = showDocument;
|
|
12
|
+
exports.updateDocument = updateDocument;
|
|
13
|
+
exports.removeDocument = removeDocument;
|
|
14
|
+
exports.searchDocuments = searchDocuments;
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const errors_1 = require("../utils/errors");
|
|
18
|
+
const retry_1 = require("../db/retry");
|
|
19
|
+
// ─── Order-by validation ───
|
|
20
|
+
const VALID_ORDER_FIELDS = ['id', 'type', 'title', 'created', 'updated'];
|
|
21
|
+
function parseOrderBy(raw) {
|
|
22
|
+
let field;
|
|
23
|
+
let direction;
|
|
24
|
+
if (raw.startsWith('-')) {
|
|
25
|
+
field = raw.slice(1);
|
|
26
|
+
direction = 'DESC';
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
field = raw.startsWith('+') ? raw.slice(1) : raw;
|
|
30
|
+
direction = 'ASC';
|
|
31
|
+
}
|
|
32
|
+
if (!VALID_ORDER_FIELDS.includes(field)) {
|
|
33
|
+
throw new errors_1.DocumentInvalidOrderByError(field);
|
|
34
|
+
}
|
|
35
|
+
return { field: field, direction };
|
|
36
|
+
}
|
|
37
|
+
// ─── Public API ───
|
|
38
|
+
function sha256(content) {
|
|
39
|
+
return (0, crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
40
|
+
}
|
|
41
|
+
// ─── Public API ───
|
|
42
|
+
/**
|
|
43
|
+
* Register a new document.
|
|
44
|
+
*/
|
|
45
|
+
function registerDocument(db, id, type, title, opts) {
|
|
46
|
+
if (!id || !id.trim())
|
|
47
|
+
throw new errors_1.DocumentMissingFieldError('id');
|
|
48
|
+
if (!type || !type.trim())
|
|
49
|
+
throw new errors_1.DocumentMissingFieldError('type');
|
|
50
|
+
if (!title || !title.trim())
|
|
51
|
+
throw new errors_1.DocumentMissingFieldError('title');
|
|
52
|
+
// Check duplicate
|
|
53
|
+
const existing = db.prepare('SELECT id FROM documents WHERE id = ?').get(id);
|
|
54
|
+
if (existing)
|
|
55
|
+
throw new errors_1.DocumentDuplicateError(id);
|
|
56
|
+
// Pre-transaction doc type validation gate (FS-SS-012-0011, SAD-0027 §5)
|
|
57
|
+
// builtin:3.0: doc type IS entity type name (no mapping needed)
|
|
58
|
+
// Pre-transaction SRC storage enforcement (FS-SS-029-0001 v2 VR-001/VR-002)
|
|
59
|
+
// SRC documents must use filesystem storage; DB storage via --content-file is rejected
|
|
60
|
+
if (type === 'SRC' && (opts?.content || opts?.contentFile)) {
|
|
61
|
+
throw new errors_1.DocSrcStorageError();
|
|
62
|
+
}
|
|
63
|
+
// FS-SS-012-0001 v4 VR-004: When content is provided (via --content-file),
|
|
64
|
+
// content_storage defaults to 'db'. Otherwise defaults to 'filesystem'.
|
|
65
|
+
const storage = opts?.contentStorage ?? ((opts?.content || opts?.contentFile) ? 'db' : 'filesystem');
|
|
66
|
+
const metadata = opts?.metadata ? JSON.stringify(opts.metadata) : '{}';
|
|
67
|
+
const now = new Date().toISOString();
|
|
68
|
+
// Handle content: compute hash and load content from file or direct input
|
|
69
|
+
// Content is ALWAYS stored in document_contents to enable FTS5 indexing,
|
|
70
|
+
// regardless of whether content_storage is 'db' or 'filesystem'.
|
|
71
|
+
let contentHash = null;
|
|
72
|
+
let contentValue = null;
|
|
73
|
+
let contentFilePath = null;
|
|
74
|
+
if (opts?.content) {
|
|
75
|
+
contentHash = sha256(opts.content);
|
|
76
|
+
contentValue = opts.content;
|
|
77
|
+
}
|
|
78
|
+
else if (opts?.contentFile) {
|
|
79
|
+
try {
|
|
80
|
+
const fileContent = (0, fs_1.readFileSync)(opts.contentFile, 'utf-8');
|
|
81
|
+
contentHash = sha256(fileContent);
|
|
82
|
+
contentValue = fileContent;
|
|
83
|
+
contentFilePath = opts.contentFile;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
87
|
+
throw new errors_1.DocumentFileError(opts.contentFile, msg);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Determine the filesystem path to store in the documents table.
|
|
91
|
+
// Prefer the explicit --path option; fall back to --content-file path.
|
|
92
|
+
const storedPath = opts?.path ?? contentFilePath ?? null;
|
|
93
|
+
// Insert document and content (FK: document_contents → documents)
|
|
94
|
+
// SAD-0035: Entity auto-creation removed — entities table dropped
|
|
95
|
+
(0, retry_1.withTransaction)(db, () => {
|
|
96
|
+
db.prepare(`INSERT INTO documents (id, type, title, path, content_hash, content_storage, metadata, created_at, updated_at)
|
|
97
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, type, title, storedPath, contentHash, storage, metadata, now, now);
|
|
98
|
+
if (contentValue !== null) {
|
|
99
|
+
db.prepare(`INSERT INTO document_contents (document_id, content, content_hash, updated_at) VALUES (?, ?, ?, ?)`).run(id, contentValue, contentHash, now);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return getDocument(db, id);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* List documents with optional filters, pagination, sorting, and count-only support.
|
|
106
|
+
* Default ordering: ascending by id.
|
|
107
|
+
*
|
|
108
|
+
* When countOnly is true, returns { count: number } instead of Document[].
|
|
109
|
+
*/
|
|
110
|
+
function listDocuments(db, opts) {
|
|
111
|
+
const clauses = [];
|
|
112
|
+
const params = [];
|
|
113
|
+
if (opts?.type) {
|
|
114
|
+
clauses.push('type = ?');
|
|
115
|
+
params.push(opts.type);
|
|
116
|
+
}
|
|
117
|
+
const where = clauses.length > 0 ? ` WHERE ${clauses.join(' AND ')}` : '';
|
|
118
|
+
// Count-only path: no ORDER BY, LIMIT, or OFFSET needed
|
|
119
|
+
if (opts?.countOnly) {
|
|
120
|
+
const row = db.prepare(`SELECT COUNT(*) as count FROM documents${where}`).get(...params);
|
|
121
|
+
return { count: row.count };
|
|
122
|
+
}
|
|
123
|
+
// Determine ordering — map user-facing field names to SQL column names
|
|
124
|
+
let orderClause;
|
|
125
|
+
if (opts?.orderBy) {
|
|
126
|
+
const { field, direction } = parseOrderBy(opts.orderBy);
|
|
127
|
+
const columnMap = {
|
|
128
|
+
id: 'id',
|
|
129
|
+
type: 'type',
|
|
130
|
+
title: 'title',
|
|
131
|
+
created: 'created_at',
|
|
132
|
+
updated: 'updated_at',
|
|
133
|
+
};
|
|
134
|
+
const col = columnMap[field];
|
|
135
|
+
orderClause = ` ORDER BY ${col} ${direction}`;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
orderClause = ' ORDER BY id ASC'; // default per FS-SS-012-0002 v3 VR-003
|
|
139
|
+
}
|
|
140
|
+
let sql = `SELECT id, type, title, path, content_hash, content_storage, metadata, created_at, updated_at FROM documents${where}${orderClause}`;
|
|
141
|
+
// Apply pagination — LIMIT is required when OFFSET is present (SQLite constraint)
|
|
142
|
+
const hasOffset = opts?.offset !== undefined && opts.offset >= 0;
|
|
143
|
+
const hasLimit = opts?.limit !== undefined && opts.limit >= 0;
|
|
144
|
+
if (hasLimit || hasOffset) {
|
|
145
|
+
// When OFFSET is provided without LIMIT, use a very large explicit LIMIT
|
|
146
|
+
// instead of -1 (which SQLite treats as unbounded but is confusing to readers).
|
|
147
|
+
const limit = hasLimit ? opts.limit : 999999;
|
|
148
|
+
sql += ' LIMIT ?';
|
|
149
|
+
params.push(limit);
|
|
150
|
+
}
|
|
151
|
+
if (hasOffset) {
|
|
152
|
+
sql += ' OFFSET ?';
|
|
153
|
+
params.push(opts.offset);
|
|
154
|
+
}
|
|
155
|
+
const rows = db.prepare(sql).all(...params);
|
|
156
|
+
return rows;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get a single document by ID.
|
|
160
|
+
*/
|
|
161
|
+
function getDocument(db, id) {
|
|
162
|
+
const row = db.prepare('SELECT * FROM documents WHERE id = ?').get(id);
|
|
163
|
+
if (!row)
|
|
164
|
+
throw new errors_1.DocumentNotFoundError(id);
|
|
165
|
+
return row;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Show document detail (with content if stored).
|
|
169
|
+
* Content is fetched from document_contents (primary) or doc.path (fallback for
|
|
170
|
+
* legacy documents registered before this fix).
|
|
171
|
+
*/
|
|
172
|
+
function showDocument(db, id) {
|
|
173
|
+
const doc = getDocument(db, id);
|
|
174
|
+
let content = null;
|
|
175
|
+
// Primary: read from document_contents (used for FTS indexing for all storage types)
|
|
176
|
+
const row = db.prepare('SELECT content FROM document_contents WHERE document_id = ?').get(id);
|
|
177
|
+
if (row) {
|
|
178
|
+
content = row.content;
|
|
179
|
+
}
|
|
180
|
+
else if (doc.path) {
|
|
181
|
+
// Fallback: read from filesystem path (legacy documents)
|
|
182
|
+
try {
|
|
183
|
+
content = (0, fs_1.readFileSync)(doc.path, 'utf-8');
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
content = null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return { ...doc, content };
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Update document metadata.
|
|
193
|
+
* --meta replaces entirely (not merge), per spec.
|
|
194
|
+
*
|
|
195
|
+
* MOD-021: When fields.type changes the document type, the old entity is deleted
|
|
196
|
+
* (with relation cascade) and a new entity is created with the updated type mapping.
|
|
197
|
+
* All operations (content upsert, entity sync, document update) run within a single
|
|
198
|
+
* atomic transaction per FS-SS-021-0004.
|
|
199
|
+
*/
|
|
200
|
+
function updateDocument(db, id, fields) {
|
|
201
|
+
const doc = getDocument(db, id);
|
|
202
|
+
const now = new Date().toISOString();
|
|
203
|
+
const sets = ['updated_at = ?'];
|
|
204
|
+
const params = [now];
|
|
205
|
+
if (fields.title !== undefined) {
|
|
206
|
+
sets.push('title = ?');
|
|
207
|
+
params.push(fields.title);
|
|
208
|
+
}
|
|
209
|
+
if (fields.type !== undefined) {
|
|
210
|
+
sets.push('type = ?');
|
|
211
|
+
params.push(fields.type);
|
|
212
|
+
}
|
|
213
|
+
if (fields.metadata !== undefined) {
|
|
214
|
+
sets.push('metadata = ?');
|
|
215
|
+
params.push(JSON.stringify(fields.metadata));
|
|
216
|
+
}
|
|
217
|
+
if (fields.content_storage !== undefined) {
|
|
218
|
+
sets.push('content_storage = ?');
|
|
219
|
+
params.push(fields.content_storage);
|
|
220
|
+
}
|
|
221
|
+
// Handle content update
|
|
222
|
+
let newContent;
|
|
223
|
+
let contentHash;
|
|
224
|
+
if (fields.contentFile) {
|
|
225
|
+
try {
|
|
226
|
+
newContent = (0, fs_1.readFileSync)(fields.contentFile, 'utf-8');
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
230
|
+
throw new errors_1.DocumentFileError(fields.contentFile, msg);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else if (fields.content !== undefined) {
|
|
234
|
+
newContent = fields.content;
|
|
235
|
+
}
|
|
236
|
+
if (newContent !== undefined) {
|
|
237
|
+
contentHash = sha256(newContent);
|
|
238
|
+
sets.push('content_hash = ?');
|
|
239
|
+
params.push(contentHash);
|
|
240
|
+
}
|
|
241
|
+
// SAD-0035: Entity sync on type change removed — entities table dropped
|
|
242
|
+
// content_storage switch validation (FR-URD-G001-0001 M6)
|
|
243
|
+
// Switching from filesystem to db without providing content creates an
|
|
244
|
+
// inconsistency: the document_contents table has no authoritative copy.
|
|
245
|
+
if (fields.content_storage !== undefined && fields.content_storage !== doc.content_storage) {
|
|
246
|
+
if (fields.content_storage === 'db' && doc.content_storage === 'filesystem' && newContent === undefined && !fields.contentFile) {
|
|
247
|
+
throw new errors_1.DocumentMissingFieldError('content');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
params.push(id);
|
|
251
|
+
// Single atomic transaction: content upsert + document update
|
|
252
|
+
// SAD-0035: Entity sync removed — entities table dropped
|
|
253
|
+
(0, retry_1.withTransaction)(db, () => {
|
|
254
|
+
// Step 1: Content upsert
|
|
255
|
+
// Content is ALWAYS written to document_contents to enable FTS5 indexing
|
|
256
|
+
// and maintain content_hash consistency, regardless of storage type.
|
|
257
|
+
if (newContent !== undefined) {
|
|
258
|
+
db.prepare(`INSERT INTO document_contents (document_id, content, content_hash, updated_at)
|
|
259
|
+
VALUES (?, ?, ?, ?)
|
|
260
|
+
ON CONFLICT(document_id) DO UPDATE SET content = excluded.content, content_hash = excluded.content_hash, updated_at = excluded.updated_at`).run(id, newContent, contentHash, now);
|
|
261
|
+
}
|
|
262
|
+
// Step 2: Document row UPDATE
|
|
263
|
+
db.prepare(`UPDATE documents SET ${sets.join(', ')} WHERE id = ?`).run(...params);
|
|
264
|
+
});
|
|
265
|
+
return getDocument(db, id);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Remove a document registration.
|
|
269
|
+
*
|
|
270
|
+
* Deletion ordering per SAD-0035 (3-step sequence after entities table drop):
|
|
271
|
+
* Step 1: Delete relations (outgoing and incoming) referencing the document
|
|
272
|
+
* Step 2: Delete document_contents row (UNCONDITIONAL per AD-0028 — FK constraint
|
|
273
|
+
* requires content deletion before the document row is removed)
|
|
274
|
+
* Step 3: Delete document row
|
|
275
|
+
*
|
|
276
|
+
* Content is always deleted unconditionally per AD-0028 — there is no soft-delete option.
|
|
277
|
+
*/
|
|
278
|
+
function removeDocument(db, id) {
|
|
279
|
+
getDocument(db, id); // verify exists
|
|
280
|
+
(0, retry_1.withTransaction)(db, () => {
|
|
281
|
+
// Step 1: Delete all relations referencing this document (from_id OR to_id)
|
|
282
|
+
db.prepare('DELETE FROM relations WHERE from_id = ? OR to_id = ?').run(id, id);
|
|
283
|
+
// Step 2: Delete document_contents unconditionally per AD-0028
|
|
284
|
+
// FK constraint (document_contents.document_id → documents.id) requires
|
|
285
|
+
// content deletion before the document row is removed.
|
|
286
|
+
db.prepare('DELETE FROM document_contents WHERE document_id = ?').run(id);
|
|
287
|
+
// Step 3: Delete document row
|
|
288
|
+
db.prepare('DELETE FROM documents WHERE id = ?').run(id);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Full-text search across document contents with pagination, sorting, count-only support, and type filtering.
|
|
293
|
+
* Default ordering: FTS5 BM25 relevance ranking (descending).
|
|
294
|
+
* When --order-by is specified, results are sorted by the given column via SQL subquery instead of by rank.
|
|
295
|
+
*
|
|
296
|
+
* When countOnly is true, returns { count: number } instead of SearchResult[].
|
|
297
|
+
*/
|
|
298
|
+
function searchDocuments(db, query, opts) {
|
|
299
|
+
// Validate query is not purely whitespace or obviously malformed
|
|
300
|
+
if (!query || !query.trim()) {
|
|
301
|
+
throw new errors_1.DocumentInvalidSearchQueryError(query, 'query cannot be empty or whitespace');
|
|
302
|
+
}
|
|
303
|
+
// Validate order-by early (before FTS5 query to fail fast)
|
|
304
|
+
if (opts?.orderBy) {
|
|
305
|
+
parseOrderBy(opts.orderBy); // throws on invalid field
|
|
306
|
+
}
|
|
307
|
+
const hasTypeFilter = opts?.type !== undefined && opts.type.length > 0;
|
|
308
|
+
const UNBOUNDED_LIMIT = 999999;
|
|
309
|
+
// ── Path A: orderBy specified → use SQL subquery with documents-table ORDER BY ──
|
|
310
|
+
// This avoids type-unsafe _createdAt/_updatedAt casting and JavaScript sorting.
|
|
311
|
+
if (opts?.orderBy) {
|
|
312
|
+
const { field, direction } = parseOrderBy(opts.orderBy);
|
|
313
|
+
const columnMap = {
|
|
314
|
+
id: 'd.id',
|
|
315
|
+
type: 'd.type',
|
|
316
|
+
title: 'd.title',
|
|
317
|
+
created: 'd.created_at',
|
|
318
|
+
updated: 'd.updated_at',
|
|
319
|
+
};
|
|
320
|
+
const orderCol = columnMap[field];
|
|
321
|
+
// Build WHERE clauses
|
|
322
|
+
const whereClauses = [];
|
|
323
|
+
const params = [];
|
|
324
|
+
// FTS5 subquery for matching document IDs
|
|
325
|
+
whereClauses.push('d.id IN (SELECT fts.document_id FROM document_contents_fts fts WHERE document_contents_fts MATCH ?)');
|
|
326
|
+
params.push(query);
|
|
327
|
+
if (hasTypeFilter) {
|
|
328
|
+
whereClauses.push('d.type = ?');
|
|
329
|
+
params.push(opts.type);
|
|
330
|
+
}
|
|
331
|
+
const where = ` WHERE ${whereClauses.join(' AND ')}`;
|
|
332
|
+
// Count-only path
|
|
333
|
+
if (opts?.countOnly) {
|
|
334
|
+
const row = db.prepare(`SELECT COUNT(*) as count FROM documents d${where}`).get(...params);
|
|
335
|
+
return { count: row.count };
|
|
336
|
+
}
|
|
337
|
+
const limit = opts.limit ?? 20;
|
|
338
|
+
const offset = opts.offset ?? 0;
|
|
339
|
+
let sql = `SELECT d.id as document_id, d.title, d.type, d.created_at, d.updated_at FROM documents d${where} ORDER BY ${orderCol} ${direction}`;
|
|
340
|
+
sql += ' LIMIT ? OFFSET ?';
|
|
341
|
+
params.push(limit, offset);
|
|
342
|
+
try {
|
|
343
|
+
const rows = db.prepare(sql).all(...params);
|
|
344
|
+
return rows.map(r => ({
|
|
345
|
+
documentId: r.document_id,
|
|
346
|
+
title: r.title,
|
|
347
|
+
type: r.type,
|
|
348
|
+
rank: 0, // rank not applicable when ordered by document field
|
|
349
|
+
snippet: undefined,
|
|
350
|
+
}));
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
throw new errors_1.DocumentInvalidSearchQueryError(query, 'malformed FTS5 syntax');
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// ── Path B: default FTS5 BM25 ranking (no orderBy) ──
|
|
357
|
+
// Run the FTS5 query in a transaction so we can catch errors and wrap them
|
|
358
|
+
// with DocumentInvalidSearchQueryError.
|
|
359
|
+
let rows = [];
|
|
360
|
+
try {
|
|
361
|
+
// Build WHERE clause with optional type filter
|
|
362
|
+
let whereClauses = 'WHERE document_contents_fts MATCH ?';
|
|
363
|
+
const params = [query];
|
|
364
|
+
if (hasTypeFilter) {
|
|
365
|
+
whereClauses += ' AND d.type = ?';
|
|
366
|
+
params.push(opts.type);
|
|
367
|
+
}
|
|
368
|
+
const hasOffset = opts?.offset !== undefined && opts.offset >= 0;
|
|
369
|
+
const ftsLimit = opts?.countOnly
|
|
370
|
+
? UNBOUNDED_LIMIT
|
|
371
|
+
: (opts?.limit ?? 20) + (opts?.offset ?? 0);
|
|
372
|
+
params.push(ftsLimit);
|
|
373
|
+
let ftsSql = `SELECT fts.document_id, d.title, d.type, fts.rank, d.created_at, d.updated_at,
|
|
374
|
+
snippet(document_contents_fts, 0, '<b>', '</b>', '…', 32) as snippet
|
|
375
|
+
FROM document_contents_fts fts
|
|
376
|
+
JOIN documents d ON d.id = fts.document_id
|
|
377
|
+
${whereClauses}
|
|
378
|
+
ORDER BY fts.rank
|
|
379
|
+
LIMIT ?`;
|
|
380
|
+
if (hasOffset && !opts?.countOnly) {
|
|
381
|
+
ftsSql += ' OFFSET ?';
|
|
382
|
+
params.push(opts.offset);
|
|
383
|
+
}
|
|
384
|
+
rows = db.prepare(ftsSql).all(...params);
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
throw new errors_1.DocumentInvalidSearchQueryError(query, 'malformed FTS5 syntax');
|
|
388
|
+
}
|
|
389
|
+
// Count-only path: return count before applying offset
|
|
390
|
+
if (opts?.countOnly) {
|
|
391
|
+
return { count: rows.length };
|
|
392
|
+
}
|
|
393
|
+
// Map to SearchResult[] with snippet populated from FTS5 snippet() function
|
|
394
|
+
let results = rows.map(r => ({
|
|
395
|
+
documentId: r.document_id,
|
|
396
|
+
title: r.title,
|
|
397
|
+
type: r.type,
|
|
398
|
+
rank: r.rank,
|
|
399
|
+
snippet: r.snippet || undefined,
|
|
400
|
+
}));
|
|
401
|
+
// Apply limit (SQL LIMIT fetched offset + limit rows, slice to exact limit)
|
|
402
|
+
if (opts?.limit !== undefined && opts.limit >= 0) {
|
|
403
|
+
if (results.length > opts.limit) {
|
|
404
|
+
results = results.slice(0, opts.limit);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return results;
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=document-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-service.js","sourceRoot":"","sources":["../../src/services/document-service.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,gDAAgD;AAChD,yCAAyC;AACzC,sCAAsC;AACtC,8DAA8D;;AA2C9D,4CAyEC;AAQD,sCAqDC;AAKD,kCAIC;AAOD,oCAkBC;AAWD,wCAuEC;AAaD,wCAeC;AASD,0CAoIC;AA3cD,mCAAoC;AACpC,2BAAkC;AAGlC,4CAAgN;AAChN,uCAA8C;AAG9C,8BAA8B;AAE9B,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAGlF,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,KAAa,CAAC;IAClB,IAAI,SAAyB,CAAC;IAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,IAAI,CAAE,kBAAwC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,oCAA2B,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAmB,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,qBAAqB;AAErB,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,qBAAqB;AAErB;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,EAAqB,EACrB,EAAU,EACV,IAAY,EACZ,KAAa,EACb,IAA8B;IAE9B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,kCAAyB,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,kCAAyB,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,kCAAyB,CAAC,OAAO,CAAC,CAAC;IAE1E,kBAAkB;IAClB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,QAAQ;QAAE,MAAM,IAAI,+BAAsB,CAAC,EAAE,CAAC,CAAC;IAEnD,yEAAyE;IACzE,gEAAgE;IAEhE,4EAA4E;IAC5E,uFAAuF;IACvF,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,2BAAkB,EAAE,CAAC;IACjC,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,OAAO,GAAmB,IAAI,EAAE,cAAc,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACrH,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,0EAA0E;IAC1E,yEAAyE;IACzE,iEAAiE;IACjE,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;SAAM,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC5D,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAClC,YAAY,GAAG,WAAW,CAAC;YAC3B,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,0BAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,IAAI,eAAe,IAAI,IAAI,CAAC;IAEzD,kEAAkE;IAClE,kEAAkE;IAClE,IAAA,uBAAe,EAAC,EAAE,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,OAAO,CACR;0CACoC,CACrC,CAAC,GAAG,CACH,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAC3B,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CACzC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,EAAE,CAAC,OAAO,CACR,oGAAoG,CACrG,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAC3B,EAAqB,EACrB,IAAkB;IAElB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAErE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,wDAAwD;IACxD,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAsB,CAAC;QAC9G,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,uEAAuE;IACvE,IAAI,WAAmB,CAAC;IACxB,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAA2B;YACxC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,YAAY;SACtB,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7B,WAAW,GAAG,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,kBAAkB,CAAC,CAAC,uCAAuC;IAC3E,CAAC;IAED,IAAI,GAAG,GAAG,+GAA+G,KAAK,GAAG,WAAW,EAAE,CAAC;IAE/I,kFAAkF;IAClF,MAAM,SAAS,GAAG,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9D,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC1B,yEAAyE;QACzE,gFAAgF;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9C,GAAG,IAAI,UAAU,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,IAAI,WAAW,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAkB,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,EAAqB,EAAE,EAAU;IAC3D,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAyB,CAAC;IAC/F,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,8BAAqB,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,EAAqB,EAAE,EAAU;IAC5D,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,qFAAqF;IACrF,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,CAAC,EAAE,CAAoC,CAAC;IACjI,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;SAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,yDAAyD;QACzD,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,iBAAY,EAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,EAAqB,EACrB,EAAU,EACV,MAA4B;IAE5B,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,IAAI,GAAa,CAAC,gBAAgB,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAc,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IACtF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IACnF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAAC,CAAC;IAEpH,wBAAwB;IACxB,IAAI,UAA8B,CAAC;IACnC,IAAI,WAA+B,CAAC;IACpC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,IAAA,iBAAY,EAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,0BAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACxC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED,wEAAwE;IAExE,0DAA0D;IAC1D,uEAAuE;IACvE,wEAAwE;IACxE,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe,EAAE,CAAC;QAC3F,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,GAAG,CAAC,eAAe,KAAK,YAAY,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/H,MAAM,IAAI,kCAAyB,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,8DAA8D;IAC9D,yDAAyD;IACzD,IAAA,uBAAe,EAAC,EAAE,EAAE,GAAG,EAAE;QACvB,yBAAyB;QACzB,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,EAAE,CAAC,OAAO,CACR;;mJAE2I,CAC5I,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,WAAY,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,8BAA8B;QAC9B,EAAE,CAAC,OAAO,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,EAAqB,EAAE,EAAU;IAC9D,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB;IAErC,IAAA,uBAAe,EAAC,EAAE,EAAE,GAAG,EAAE;QACvB,4EAA4E;QAC5E,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE/E,+DAA+D;QAC/D,wEAAwE;QACxE,uDAAuD;QACvD,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1E,8BAA8B;QAC9B,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,EAAqB,EACrB,KAAa,EACb,IAAoB;IAEpB,iEAAiE;IACjE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,wCAA+B,CAAC,KAAK,EAAE,qCAAqC,CAAC,CAAC;IAC1F,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;IACxD,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,MAAM,CAAC;IAE/B,mFAAmF;IACnF,gFAAgF;IAChF,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAA2B;YACxC,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,cAAc;SACxB,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAElC,sBAAsB;QACtB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,0CAA0C;QAC1C,YAAY,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;QACzH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAErD,kBAAkB;QAClB,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAsB,CAAC;YAChH,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAEhC,IAAI,GAAG,GAAG,2FAA2F,KAAK,aAAa,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/I,GAAG,IAAI,mBAAmB,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAwG,CAAC;YACnJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,UAAU,EAAE,CAAC,CAAC,WAAW;gBACzB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,EAAE,qDAAqD;gBAC9D,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,wCAA+B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,2EAA2E;IAC3E,wCAAwC;IACxC,IAAI,IAAI,GAAwI,EAAE,CAAC;IACnJ,IAAI,CAAC;QACH,+CAA+C;QAC/C,IAAI,YAAY,GAAG,qCAAqC,CAAC;QACzD,MAAM,MAAM,GAAc,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,IAAI,iBAAiB,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,EAAE,SAAS;YAC9B,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,IAAI,MAAM,GAAG;;;;SAIR,YAAY;;eAEN,CAAC;QAEZ,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,WAAW,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAwI,CAAC;IAClL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,wCAA+B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAC5E,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,GAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;KAChC,CAAC,CAAC,CAAC;IAEJ,4EAA4E;IAC5E,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { ExportFormat, GraphExportData } from '../models/entity';
|
|
3
|
+
/**
|
|
4
|
+
* Export all graph data from the database.
|
|
5
|
+
* SAD-0035: entities removed — only entityTypes, relationTypes, and relations.
|
|
6
|
+
*/
|
|
7
|
+
export declare function exportGraph(db: Database.Database): GraphExportData;
|
|
8
|
+
/**
|
|
9
|
+
* Export graph data to a file in the specified format.
|
|
10
|
+
*/
|
|
11
|
+
export declare function exportGraphToFile(db: Database.Database, outputPath: string, format?: ExportFormat): void;
|
|
12
|
+
//# sourceMappingURL=graph-export-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-export-service.d.ts","sourceRoot":"","sources":["../../src/services/graph-export-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAA4B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIhG;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAMlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,YAAqB,GAAG,IAAI,CAyDhH"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Graph export service: export graph data to various formats
|
|
3
|
+
// SAD-0003: MOD-011 Graph Export
|
|
4
|
+
// SAD-0035: Entities removed from export — entities table dropped
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.exportGraph = exportGraph;
|
|
40
|
+
exports.exportGraphToFile = exportGraphToFile;
|
|
41
|
+
const errors_1 = require("../utils/errors");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
/**
|
|
44
|
+
* Export all graph data from the database.
|
|
45
|
+
* SAD-0035: entities removed — only entityTypes, relationTypes, and relations.
|
|
46
|
+
*/
|
|
47
|
+
function exportGraph(db) {
|
|
48
|
+
const entityTypes = db.prepare('SELECT DISTINCT type AS name FROM documents ORDER BY type').all();
|
|
49
|
+
const relationTypes = db.prepare('SELECT * FROM relation_types ORDER BY name').all();
|
|
50
|
+
const relations = db.prepare('SELECT * FROM relations ORDER BY id').all();
|
|
51
|
+
return { entityTypes, relationTypes, entities: [], relations };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Export graph data to a file in the specified format.
|
|
55
|
+
*/
|
|
56
|
+
function exportGraphToFile(db, outputPath, format = 'json') {
|
|
57
|
+
const data = exportGraph(db);
|
|
58
|
+
let content;
|
|
59
|
+
switch (format) {
|
|
60
|
+
case 'json':
|
|
61
|
+
content = JSON.stringify(data, null, 2);
|
|
62
|
+
break;
|
|
63
|
+
case 'jsonl': {
|
|
64
|
+
const lines = [];
|
|
65
|
+
// Header line with counts (SAD-0035: entities always 0)
|
|
66
|
+
lines.push(JSON.stringify({ _type: 'header', entityTypes: data.entityTypes.length, relationTypes: data.relationTypes.length, entities: 0, relations: data.relations.length }));
|
|
67
|
+
for (const et of data.entityTypes) {
|
|
68
|
+
lines.push(JSON.stringify({ _type: 'entity_type', ...et }));
|
|
69
|
+
}
|
|
70
|
+
for (const rt of data.relationTypes) {
|
|
71
|
+
lines.push(JSON.stringify({ _type: 'relation_type', ...rt }));
|
|
72
|
+
}
|
|
73
|
+
for (const r of data.relations) {
|
|
74
|
+
lines.push(JSON.stringify({ _type: 'relation', ...r }));
|
|
75
|
+
}
|
|
76
|
+
content = lines.join('\n');
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'csv': {
|
|
80
|
+
const lines = [];
|
|
81
|
+
// Entity types CSV
|
|
82
|
+
lines.push('# Entity Types');
|
|
83
|
+
lines.push('name');
|
|
84
|
+
for (const et of data.entityTypes) {
|
|
85
|
+
lines.push(`"${et.name}"`);
|
|
86
|
+
}
|
|
87
|
+
lines.push('');
|
|
88
|
+
// Relation types CSV
|
|
89
|
+
lines.push('# Relation Types');
|
|
90
|
+
lines.push('name,from_types,to_types,cardinality,inverse_of,description');
|
|
91
|
+
for (const rt of data.relationTypes) {
|
|
92
|
+
lines.push(`"${rt.name}","${rt.from_types}","${rt.to_types}","${rt.cardinality ?? ''}","${rt.inverse_of ?? ''}","${rt.description ?? ''}"`);
|
|
93
|
+
}
|
|
94
|
+
lines.push('');
|
|
95
|
+
// SAD-0035: Entities section removed (entities table dropped)
|
|
96
|
+
lines.push('# Entities (dropped in SAD-0035)');
|
|
97
|
+
lines.push('');
|
|
98
|
+
// Relations CSV
|
|
99
|
+
lines.push('# Relations');
|
|
100
|
+
lines.push('id,from_id,rel_type,to_id,properties,created_at,updated_at');
|
|
101
|
+
for (const r of data.relations) {
|
|
102
|
+
lines.push(`${r.id},"${r.from_id}","${r.rel_type}","${r.to_id}","${r.properties.replace(/"/g, '""')}","${r.created_at}","${r.updated_at}"`);
|
|
103
|
+
}
|
|
104
|
+
content = lines.join('\n');
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
throw new errors_1.GraphExportFormatError(format, ['json', 'jsonl', 'csv']);
|
|
109
|
+
}
|
|
110
|
+
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=graph-export-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-export-service.js","sourceRoot":"","sources":["../../src/services/graph-export-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { Relation, RelationQueryOptions } from '../models/entity';
|
|
3
|
+
import { createRelation, removeRelation, queryRelations } from '../models/relation';
|
|
4
|
+
import { isSchemaBootstrapped, getEntityTypes, getRelationTypes, getSchemaMeta } from '../models/graph-schema';
|
|
5
|
+
export { createRelation, removeRelation, queryRelations, isSchemaBootstrapped, getEntityTypes, getRelationTypes, getSchemaMeta, };
|
|
6
|
+
/**
|
|
7
|
+
* Auto-init guard for pre-change projects (FS-SS-008-0007-E).
|
|
8
|
+
* Initializes the builtin schema using INSERT OR IGNORE for idempotency.
|
|
9
|
+
* This is called at the start of operations that need a populated schema.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ensureBuiltinSchemaInitialized(db: Database.Database): void;
|
|
12
|
+
/**
|
|
13
|
+
* Get related documents (convenience method).
|
|
14
|
+
* SAD-0035: Updated to use documents table instead of entities.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getRelatedDocuments(db: Database.Database, docId: string, options?: Partial<RelationQueryOptions>): Array<{
|
|
17
|
+
relation: Relation;
|
|
18
|
+
docId: string;
|
|
19
|
+
docType: string;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=graph-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-service.d.ts","sourceRoot":"","sources":["../../src/services/graph-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG/G,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAE1E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACtC,KAAK,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB/D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Graph service: orchestrates relation + schema operations
|
|
3
|
+
// SAD-0035: Entity operations removed — entities table dropped
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.getSchemaMeta = exports.getRelationTypes = exports.getEntityTypes = exports.isSchemaBootstrapped = exports.queryRelations = exports.removeRelation = exports.createRelation = void 0;
|
|
6
|
+
exports.ensureBuiltinSchemaInitialized = ensureBuiltinSchemaInitialized;
|
|
7
|
+
exports.getRelatedDocuments = getRelatedDocuments;
|
|
8
|
+
const relation_1 = require("../models/relation");
|
|
9
|
+
Object.defineProperty(exports, "createRelation", { enumerable: true, get: function () { return relation_1.createRelation; } });
|
|
10
|
+
Object.defineProperty(exports, "removeRelation", { enumerable: true, get: function () { return relation_1.removeRelation; } });
|
|
11
|
+
Object.defineProperty(exports, "queryRelations", { enumerable: true, get: function () { return relation_1.queryRelations; } });
|
|
12
|
+
const graph_schema_1 = require("../models/graph-schema");
|
|
13
|
+
Object.defineProperty(exports, "isSchemaBootstrapped", { enumerable: true, get: function () { return graph_schema_1.isSchemaBootstrapped; } });
|
|
14
|
+
Object.defineProperty(exports, "getEntityTypes", { enumerable: true, get: function () { return graph_schema_1.getEntityTypes; } });
|
|
15
|
+
Object.defineProperty(exports, "getRelationTypes", { enumerable: true, get: function () { return graph_schema_1.getRelationTypes; } });
|
|
16
|
+
Object.defineProperty(exports, "getSchemaMeta", { enumerable: true, get: function () { return graph_schema_1.getSchemaMeta; } });
|
|
17
|
+
const migration_1 = require("../db/migration");
|
|
18
|
+
/**
|
|
19
|
+
* Auto-init guard for pre-change projects (FS-SS-008-0007-E).
|
|
20
|
+
* Initializes the builtin schema using INSERT OR IGNORE for idempotency.
|
|
21
|
+
* This is called at the start of operations that need a populated schema.
|
|
22
|
+
*/
|
|
23
|
+
function ensureBuiltinSchemaInitialized(db) {
|
|
24
|
+
(0, migration_1.initializeBuiltinSchema)(db);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get related documents (convenience method).
|
|
28
|
+
* SAD-0035: Updated to use documents table instead of entities.
|
|
29
|
+
*/
|
|
30
|
+
function getRelatedDocuments(db, docId, options) {
|
|
31
|
+
const relations = (0, relation_1.queryRelations)(db, {
|
|
32
|
+
entityId: docId,
|
|
33
|
+
relType: options?.relType,
|
|
34
|
+
direction: options?.direction ?? 'outgoing',
|
|
35
|
+
limit: options?.limit ?? 100,
|
|
36
|
+
offset: options?.offset ?? 0,
|
|
37
|
+
});
|
|
38
|
+
const results = [];
|
|
39
|
+
for (const rel of relations) {
|
|
40
|
+
const targetId = rel.from_id === docId ? rel.to_id : rel.from_id;
|
|
41
|
+
const doc = db.prepare('SELECT id, type FROM documents WHERE id = ?').get(targetId);
|
|
42
|
+
if (doc) {
|
|
43
|
+
results.push({ relation: rel, docId: doc.id, docType: doc.type });
|
|
44
|
+
}
|
|
45
|
+
// Skip dangling references
|
|
46
|
+
}
|
|
47
|
+
return results;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=graph-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-service.js","sourceRoot":"","sources":["../../src/services/graph-service.ts"],"names":[],"mappings":";AAAA,2DAA2D;AAC3D,+DAA+D;;;AAuB/D,wEAEC;AAMD,kDAwBC;AAnDD,iDAAoF;AAKlF,+FALO,yBAAc,OAKP;AACd,+FANuB,yBAAc,OAMvB;AACd,+FAPuC,yBAAc,OAOvC;AANhB,yDAA+G;AAO7G,qGAPO,mCAAoB,OAOP;AACpB,+FAR6B,6BAAc,OAQ7B;AACd,iGAT6C,+BAAgB,OAS7C;AAChB,8FAV+D,4BAAa,OAU/D;AATf,+CAA0D;AAY1D;;;;GAIG;AACH,SAAgB,8BAA8B,CAAC,EAAqB;IAClE,IAAA,mCAAuB,EAAC,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,EAAqB,EACrB,KAAa,EACb,OAAuC;IAEvC,MAAM,SAAS,GAAG,IAAA,yBAAc,EAAC,EAAE,EAAE;QACnC,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,UAAU;QAC3C,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;QAC5B,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAkE,EAAE,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;QACjE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA6C,CAAC;QAChI,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,2BAA2B;IAC7B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|