@stoneforge/quarry 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/quarry-api.d.ts +268 -0
- package/dist/api/quarry-api.d.ts.map +1 -0
- package/dist/api/quarry-api.js +3905 -0
- package/dist/api/quarry-api.js.map +1 -0
- package/dist/api/types.d.ts +1359 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +204 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +9 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +11 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +465 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/alias.d.ts +8 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +70 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/channel.d.ts +13 -0
- package/dist/cli/commands/channel.d.ts.map +1 -0
- package/dist/cli/commands/channel.js +680 -0
- package/dist/cli/commands/channel.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +8 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +87 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +242 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +64 -0
- package/dist/cli/commands/crud.d.ts.map +1 -0
- package/dist/cli/commands/crud.js +805 -0
- package/dist/cli/commands/crud.js.map +1 -0
- package/dist/cli/commands/dep.d.ts +16 -0
- package/dist/cli/commands/dep.d.ts.map +1 -0
- package/dist/cli/commands/dep.js +499 -0
- package/dist/cli/commands/dep.js.map +1 -0
- package/dist/cli/commands/document.d.ts +12 -0
- package/dist/cli/commands/document.d.ts.map +1 -0
- package/dist/cli/commands/document.js +1039 -0
- package/dist/cli/commands/document.js.map +1 -0
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +273 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/entity.d.ts +16 -0
- package/dist/cli/commands/entity.d.ts.map +1 -0
- package/dist/cli/commands/entity.js +522 -0
- package/dist/cli/commands/entity.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +10 -0
- package/dist/cli/commands/gc.d.ts.map +1 -0
- package/dist/cli/commands/gc.js +257 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/help.d.ts +11 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +169 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +160 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/identity.d.ts +18 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +698 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +20 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +493 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +144 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +9 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +200 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/library.d.ts +12 -0
- package/dist/cli/commands/library.d.ts.map +1 -0
- package/dist/cli/commands/library.js +665 -0
- package/dist/cli/commands/library.js.map +1 -0
- package/dist/cli/commands/message.d.ts +11 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +608 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +17 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +698 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +12 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +730 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +306 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +106 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +82 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +370 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +25 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1153 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +13 -0
- package/dist/cli/commands/team.d.ts.map +1 -0
- package/dist/cli/commands/team.js +471 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +753 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/completion.d.ts +28 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +295 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/db.d.ts +38 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/cli/db.js +90 -0
- package/dist/cli/db.js.map +1 -0
- package/dist/cli/formatter.d.ts +87 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +464 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +45 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +256 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/plugin-loader.d.ts +39 -0
- package/dist/cli/plugin-loader.d.ts.map +1 -0
- package/dist/cli/plugin-loader.js +165 -0
- package/dist/cli/plugin-loader.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +50 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +206 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/dist/cli/plugin-types.d.ts +106 -0
- package/dist/cli/plugin-types.d.ts.map +1 -0
- package/dist/cli/plugin-types.js +103 -0
- package/dist/cli/plugin-types.js.map +1 -0
- package/dist/cli/runner.d.ts +35 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +340 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/suggest.d.ts +15 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/types.d.ts +138 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +63 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +348 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +66 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +114 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/duration.d.ts +75 -0
- package/dist/config/duration.d.ts.map +1 -0
- package/dist/config/duration.js +190 -0
- package/dist/config/duration.js.map +1 -0
- package/dist/config/env.d.ts +67 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +207 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/file.d.ts +97 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +365 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge.d.ts +53 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +257 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +72 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +55 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +251 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/sync-handlers.d.ts +162 -0
- package/dist/http/sync-handlers.d.ts.map +1 -0
- package/dist/http/sync-handlers.js +271 -0
- package/dist/http/sync-handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3329 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/ws/broadcaster.d.ts +8 -0
- package/dist/server/ws/broadcaster.d.ts.map +1 -0
- package/dist/server/ws/broadcaster.js +7 -0
- package/dist/server/ws/broadcaster.js.map +1 -0
- package/dist/server/ws/handler.d.ts +55 -0
- package/dist/server/ws/handler.d.ts.map +1 -0
- package/dist/server/ws/handler.js +160 -0
- package/dist/server/ws/handler.js.map +1 -0
- package/dist/services/blocked-cache.d.ts +297 -0
- package/dist/services/blocked-cache.d.ts.map +1 -0
- package/dist/services/blocked-cache.js +755 -0
- package/dist/services/blocked-cache.js.map +1 -0
- package/dist/services/dependency.d.ts +205 -0
- package/dist/services/dependency.d.ts.map +1 -0
- package/dist/services/dependency.js +566 -0
- package/dist/services/dependency.js.map +1 -0
- package/dist/services/embeddings/fusion.d.ts +33 -0
- package/dist/services/embeddings/fusion.d.ts.map +1 -0
- package/dist/services/embeddings/fusion.js +34 -0
- package/dist/services/embeddings/fusion.js.map +1 -0
- package/dist/services/embeddings/index.d.ts +12 -0
- package/dist/services/embeddings/index.d.ts.map +1 -0
- package/dist/services/embeddings/index.js +10 -0
- package/dist/services/embeddings/index.js.map +1 -0
- package/dist/services/embeddings/local-provider.d.ts +31 -0
- package/dist/services/embeddings/local-provider.d.ts.map +1 -0
- package/dist/services/embeddings/local-provider.js +80 -0
- package/dist/services/embeddings/local-provider.js.map +1 -0
- package/dist/services/embeddings/service.d.ts +76 -0
- package/dist/services/embeddings/service.d.ts.map +1 -0
- package/dist/services/embeddings/service.js +153 -0
- package/dist/services/embeddings/service.js.map +1 -0
- package/dist/services/embeddings/types.d.ts +70 -0
- package/dist/services/embeddings/types.d.ts.map +1 -0
- package/dist/services/embeddings/types.js +8 -0
- package/dist/services/embeddings/types.js.map +1 -0
- package/dist/services/id-length-cache.d.ts +156 -0
- package/dist/services/id-length-cache.d.ts.map +1 -0
- package/dist/services/id-length-cache.js +197 -0
- package/dist/services/id-length-cache.js.map +1 -0
- package/dist/services/inbox.d.ts +147 -0
- package/dist/services/inbox.d.ts.map +1 -0
- package/dist/services/inbox.js +428 -0
- package/dist/services/inbox.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/priority-service.d.ts +145 -0
- package/dist/services/priority-service.d.ts.map +1 -0
- package/dist/services/priority-service.js +272 -0
- package/dist/services/priority-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +47 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +83 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/sync/hash.d.ts +48 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +136 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +16 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/merge.d.ts +80 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +310 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/serialization.d.ts +132 -0
- package/dist/sync/serialization.d.ts.map +1 -0
- package/dist/sync/serialization.js +306 -0
- package/dist/sync/serialization.js.map +1 -0
- package/dist/sync/service.d.ts +102 -0
- package/dist/sync/service.d.ts.map +1 -0
- package/dist/sync/service.js +493 -0
- package/dist/sync/service.js.map +1 -0
- package/dist/sync/types.d.ts +275 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +76 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/systems/identity.d.ts +479 -0
- package/dist/systems/identity.d.ts.map +1 -0
- package/dist/systems/identity.js +817 -0
- package/dist/systems/identity.js.map +1 -0
- package/dist/systems/index.d.ts +8 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +29 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +121 -0
- package/web/assets/charts-vendor-D1YcbGux.js +55 -0
- package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
- package/web/assets/editor-vendor-BxraAWts.js +279 -0
- package/web/assets/index-B77vv208.js +341 -0
- package/web/assets/index-CF_XnVLh.css +1 -0
- package/web/assets/router-vendor-BCKpRBrB.js +41 -0
- package/web/assets/ui-vendor-DUahGnbT.js +45 -0
- package/web/assets/utils-vendor-CfYKiENT.js +813 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +23 -0
- package/web/logo.png +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates configuration values for correctness and consistency.
|
|
5
|
+
*/
|
|
6
|
+
import { ValidationError, ErrorCode } from '@stoneforge/core';
|
|
7
|
+
import { isValidIdentityMode } from '../systems/identity.js';
|
|
8
|
+
import { MIN_EXPORT_DEBOUNCE, MAX_EXPORT_DEBOUNCE, MIN_TIME_TOLERANCE, MAX_TIME_TOLERANCE, MAX_TTL, } from './defaults.js';
|
|
9
|
+
import { validateDurationRange, formatDuration } from './duration.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Field Validators
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Validates an actor name
|
|
15
|
+
*/
|
|
16
|
+
export function isValidActor(value) {
|
|
17
|
+
if (typeof value !== 'string') {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// Actor must be non-empty and contain only valid identifier characters
|
|
21
|
+
return value.length > 0 && /^[a-zA-Z0-9_-]+$/.test(value);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validates actor and throws if invalid
|
|
25
|
+
*/
|
|
26
|
+
export function validateActor(value) {
|
|
27
|
+
if (typeof value !== 'string') {
|
|
28
|
+
throw new ValidationError('Actor must be a string', ErrorCode.INVALID_INPUT, { field: 'actor', value, expected: 'string' });
|
|
29
|
+
}
|
|
30
|
+
if (value.length === 0) {
|
|
31
|
+
throw new ValidationError('Actor cannot be empty', ErrorCode.INVALID_INPUT, { field: 'actor', value });
|
|
32
|
+
}
|
|
33
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(value)) {
|
|
34
|
+
throw new ValidationError('Actor must contain only alphanumeric characters, hyphens, and underscores', ErrorCode.INVALID_INPUT, { field: 'actor', value, expected: 'alphanumeric, hyphen, underscore' });
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validates a database filename
|
|
40
|
+
*/
|
|
41
|
+
export function isValidDatabase(value) {
|
|
42
|
+
if (typeof value !== 'string') {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// Must be non-empty, end with .db, and not contain path separators
|
|
46
|
+
return (value.length > 0 &&
|
|
47
|
+
value.endsWith('.db') &&
|
|
48
|
+
!value.includes('/') &&
|
|
49
|
+
!value.includes('\\'));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validates database and throws if invalid
|
|
53
|
+
*/
|
|
54
|
+
export function validateDatabase(value) {
|
|
55
|
+
if (typeof value !== 'string') {
|
|
56
|
+
throw new ValidationError('Database must be a string', ErrorCode.INVALID_INPUT, { field: 'database', value, expected: 'string' });
|
|
57
|
+
}
|
|
58
|
+
if (value.length === 0) {
|
|
59
|
+
throw new ValidationError('Database cannot be empty', ErrorCode.INVALID_INPUT, { field: 'database', value });
|
|
60
|
+
}
|
|
61
|
+
if (!value.endsWith('.db')) {
|
|
62
|
+
throw new ValidationError('Database must end with .db extension', ErrorCode.INVALID_INPUT, { field: 'database', value, expected: '*.db' });
|
|
63
|
+
}
|
|
64
|
+
if (value.includes('/') || value.includes('\\')) {
|
|
65
|
+
throw new ValidationError('Database must be a filename, not a path', ErrorCode.INVALID_INPUT, { field: 'database', value });
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Validates a JSONL filename
|
|
71
|
+
*/
|
|
72
|
+
export function isValidJsonlFilename(value) {
|
|
73
|
+
if (typeof value !== 'string') {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return (value.length > 0 &&
|
|
77
|
+
value.endsWith('.jsonl') &&
|
|
78
|
+
!value.includes('/') &&
|
|
79
|
+
!value.includes('\\'));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validates JSONL filename and throws if invalid
|
|
83
|
+
*/
|
|
84
|
+
export function validateJsonlFilename(value, field) {
|
|
85
|
+
if (typeof value !== 'string') {
|
|
86
|
+
throw new ValidationError(`${field} must be a string`, ErrorCode.INVALID_INPUT, { field, value, expected: 'string' });
|
|
87
|
+
}
|
|
88
|
+
if (value.length === 0) {
|
|
89
|
+
throw new ValidationError(`${field} cannot be empty`, ErrorCode.INVALID_INPUT, { field, value });
|
|
90
|
+
}
|
|
91
|
+
if (!value.endsWith('.jsonl')) {
|
|
92
|
+
throw new ValidationError(`${field} must end with .jsonl extension`, ErrorCode.INVALID_INPUT, { field, value, expected: '*.jsonl' });
|
|
93
|
+
}
|
|
94
|
+
if (value.includes('/') || value.includes('\\')) {
|
|
95
|
+
throw new ValidationError(`${field} must be a filename, not a path`, ErrorCode.INVALID_INPUT, { field, value });
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validates playbook paths array
|
|
101
|
+
*/
|
|
102
|
+
export function isValidPlaybookPaths(value) {
|
|
103
|
+
if (!Array.isArray(value)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return value.every((p) => typeof p === 'string' && p.length > 0);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validates playbook paths and throws if invalid
|
|
110
|
+
*/
|
|
111
|
+
export function validatePlaybookPaths(value) {
|
|
112
|
+
if (!Array.isArray(value)) {
|
|
113
|
+
throw new ValidationError('Playbook paths must be an array', ErrorCode.INVALID_INPUT, { field: 'playbooks.paths', value, expected: 'array of strings' });
|
|
114
|
+
}
|
|
115
|
+
for (let i = 0; i < value.length; i++) {
|
|
116
|
+
if (typeof value[i] !== 'string') {
|
|
117
|
+
throw new ValidationError(`Playbook path at index ${i} must be a string`, ErrorCode.INVALID_INPUT, { field: `playbooks.paths[${i}]`, value: value[i], expected: 'string' });
|
|
118
|
+
}
|
|
119
|
+
if (value[i].length === 0) {
|
|
120
|
+
throw new ValidationError(`Playbook path at index ${i} cannot be empty`, ErrorCode.INVALID_INPUT, { field: `playbooks.paths[${i}]`, value: value[i] });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
// ============================================================================
|
|
126
|
+
// Full Configuration Validation
|
|
127
|
+
// ============================================================================
|
|
128
|
+
/**
|
|
129
|
+
* Validates a complete configuration object
|
|
130
|
+
*
|
|
131
|
+
* @param config - Configuration to validate
|
|
132
|
+
* @returns Validated configuration
|
|
133
|
+
* @throws ValidationError if validation fails
|
|
134
|
+
*/
|
|
135
|
+
export function validateConfiguration(config) {
|
|
136
|
+
if (typeof config !== 'object' || config === null) {
|
|
137
|
+
throw new ValidationError('Configuration must be an object', ErrorCode.INVALID_INPUT, { value: config });
|
|
138
|
+
}
|
|
139
|
+
const obj = config;
|
|
140
|
+
// Validate actor (optional)
|
|
141
|
+
if (obj.actor !== undefined) {
|
|
142
|
+
validateActor(obj.actor);
|
|
143
|
+
}
|
|
144
|
+
// Validate database
|
|
145
|
+
if (typeof obj.database !== 'string') {
|
|
146
|
+
throw new ValidationError('Configuration must include database', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'database' });
|
|
147
|
+
}
|
|
148
|
+
validateDatabase(obj.database);
|
|
149
|
+
// Validate sync
|
|
150
|
+
if (typeof obj.sync !== 'object' || obj.sync === null) {
|
|
151
|
+
throw new ValidationError('Configuration must include sync object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'sync' });
|
|
152
|
+
}
|
|
153
|
+
const sync = obj.sync;
|
|
154
|
+
if (typeof sync.autoExport !== 'boolean') {
|
|
155
|
+
throw new ValidationError('sync.autoExport must be a boolean', ErrorCode.INVALID_INPUT, { field: 'sync.autoExport', value: sync.autoExport, expected: 'boolean' });
|
|
156
|
+
}
|
|
157
|
+
if (typeof sync.exportDebounce !== 'number') {
|
|
158
|
+
throw new ValidationError('sync.exportDebounce must be a number', ErrorCode.INVALID_INPUT, { field: 'sync.exportDebounce', value: sync.exportDebounce, expected: 'number' });
|
|
159
|
+
}
|
|
160
|
+
validateDurationRange(sync.exportDebounce, MIN_EXPORT_DEBOUNCE, MAX_EXPORT_DEBOUNCE, 'sync.exportDebounce');
|
|
161
|
+
validateJsonlFilename(sync.elementsFile, 'sync.elementsFile');
|
|
162
|
+
validateJsonlFilename(sync.dependenciesFile, 'sync.dependenciesFile');
|
|
163
|
+
// Validate playbooks
|
|
164
|
+
if (typeof obj.playbooks !== 'object' || obj.playbooks === null) {
|
|
165
|
+
throw new ValidationError('Configuration must include playbooks object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'playbooks' });
|
|
166
|
+
}
|
|
167
|
+
const playbooks = obj.playbooks;
|
|
168
|
+
validatePlaybookPaths(playbooks.paths);
|
|
169
|
+
// Validate tombstone
|
|
170
|
+
if (typeof obj.tombstone !== 'object' || obj.tombstone === null) {
|
|
171
|
+
throw new ValidationError('Configuration must include tombstone object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'tombstone' });
|
|
172
|
+
}
|
|
173
|
+
const tombstone = obj.tombstone;
|
|
174
|
+
if (typeof tombstone.ttl !== 'number') {
|
|
175
|
+
throw new ValidationError('tombstone.ttl must be a number', ErrorCode.INVALID_INPUT, { field: 'tombstone.ttl', value: tombstone.ttl, expected: 'number' });
|
|
176
|
+
}
|
|
177
|
+
if (typeof tombstone.minTtl !== 'number') {
|
|
178
|
+
throw new ValidationError('tombstone.minTtl must be a number', ErrorCode.INVALID_INPUT, { field: 'tombstone.minTtl', value: tombstone.minTtl, expected: 'number' });
|
|
179
|
+
}
|
|
180
|
+
validateDurationRange(tombstone.ttl, tombstone.minTtl, MAX_TTL, 'tombstone.ttl');
|
|
181
|
+
validateDurationRange(tombstone.minTtl, 1, tombstone.ttl, 'tombstone.minTtl');
|
|
182
|
+
// Validate identity
|
|
183
|
+
if (typeof obj.identity !== 'object' || obj.identity === null) {
|
|
184
|
+
throw new ValidationError('Configuration must include identity object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'identity' });
|
|
185
|
+
}
|
|
186
|
+
const identity = obj.identity;
|
|
187
|
+
if (!isValidIdentityMode(identity.mode)) {
|
|
188
|
+
throw new ValidationError('identity.mode must be a valid identity mode', ErrorCode.INVALID_INPUT, { field: 'identity.mode', value: identity.mode, expected: ['soft', 'cryptographic', 'hybrid'] });
|
|
189
|
+
}
|
|
190
|
+
if (typeof identity.timeTolerance !== 'number') {
|
|
191
|
+
throw new ValidationError('identity.timeTolerance must be a number', ErrorCode.INVALID_INPUT, { field: 'identity.timeTolerance', value: identity.timeTolerance, expected: 'number' });
|
|
192
|
+
}
|
|
193
|
+
validateDurationRange(identity.timeTolerance, MIN_TIME_TOLERANCE, MAX_TIME_TOLERANCE, 'identity.timeTolerance');
|
|
194
|
+
return config;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Validates a configuration without throwing, returns result
|
|
198
|
+
*/
|
|
199
|
+
export function validateConfigurationSafe(config) {
|
|
200
|
+
const errors = [];
|
|
201
|
+
const warnings = [];
|
|
202
|
+
try {
|
|
203
|
+
validateConfiguration(config);
|
|
204
|
+
return { valid: true, errors, warnings };
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
if (err instanceof ValidationError) {
|
|
208
|
+
errors.push(err.message);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
errors.push(String(err));
|
|
212
|
+
}
|
|
213
|
+
return { valid: false, errors, warnings };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Validates partial configuration for merging
|
|
218
|
+
*/
|
|
219
|
+
export function validatePartialConfiguration(config) {
|
|
220
|
+
if (config.actor !== undefined) {
|
|
221
|
+
validateActor(config.actor);
|
|
222
|
+
}
|
|
223
|
+
if (config.database !== undefined) {
|
|
224
|
+
validateDatabase(config.database);
|
|
225
|
+
}
|
|
226
|
+
if (config.sync?.exportDebounce !== undefined) {
|
|
227
|
+
validateDurationRange(config.sync.exportDebounce, MIN_EXPORT_DEBOUNCE, MAX_EXPORT_DEBOUNCE, 'sync.exportDebounce');
|
|
228
|
+
}
|
|
229
|
+
if (config.sync?.elementsFile !== undefined) {
|
|
230
|
+
validateJsonlFilename(config.sync.elementsFile, 'sync.elementsFile');
|
|
231
|
+
}
|
|
232
|
+
if (config.sync?.dependenciesFile !== undefined) {
|
|
233
|
+
validateJsonlFilename(config.sync.dependenciesFile, 'sync.dependenciesFile');
|
|
234
|
+
}
|
|
235
|
+
if (config.playbooks?.paths !== undefined) {
|
|
236
|
+
validatePlaybookPaths(config.playbooks.paths);
|
|
237
|
+
}
|
|
238
|
+
if (config.identity?.mode !== undefined && !isValidIdentityMode(config.identity.mode)) {
|
|
239
|
+
throw new ValidationError('identity.mode must be a valid identity mode', ErrorCode.INVALID_INPUT, { field: 'identity.mode', value: config.identity.mode, expected: ['soft', 'cryptographic', 'hybrid'] });
|
|
240
|
+
}
|
|
241
|
+
if (config.identity?.timeTolerance !== undefined) {
|
|
242
|
+
validateDurationRange(config.identity.timeTolerance, MIN_TIME_TOLERANCE, MAX_TIME_TOLERANCE, 'identity.timeTolerance');
|
|
243
|
+
}
|
|
244
|
+
// Cross-field validation for tombstone
|
|
245
|
+
if (config.tombstone?.ttl !== undefined && config.tombstone?.minTtl !== undefined) {
|
|
246
|
+
if (config.tombstone.ttl < config.tombstone.minTtl) {
|
|
247
|
+
throw new ValidationError(`tombstone.ttl (${formatDuration(config.tombstone.ttl)}) must be >= tombstone.minTtl (${formatDuration(config.tombstone.minTtl)})`, ErrorCode.INVALID_INPUT, { field: 'tombstone.ttl', value: config.tombstone.ttl, expected: `>= ${config.tombstone.minTtl}` });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,uEAAuE;IACvE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CACvB,wBAAwB,EACxB,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAC9C,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACvB,uBAAuB,EACvB,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAC1B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,eAAe,CACvB,2EAA2E,EAC3E,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kCAAkC,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,mEAAmE;IACnE,OAAO,CACL,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QACrB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CACvB,2BAA2B,EAC3B,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACjD,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACvB,0BAA0B,EAC1B,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAC7B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,eAAe,CACvB,sCAAsC,EACtC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,eAAe,CACvB,yCAAyC,EACzC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAC7B,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,KAAa;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CACvB,GAAG,KAAK,mBAAmB,EAC3B,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACrC,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACvB,GAAG,KAAK,kBAAkB,EAC1B,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CACvB,GAAG,KAAK,iCAAiC,EACzC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CACtC,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,eAAe,CACvB,GAAG,KAAK,iCAAiC,EACzC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,eAAe,CACvB,iCAAiC,EACjC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAClE,CAAC;IACJ,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,eAAe,CACvB,0BAA0B,CAAC,mBAAmB,EAC9C,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CACvB,0BAA0B,CAAC,kBAAkB,EAC7C,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAiB,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,eAAe,CACvB,iCAAiC,EACjC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,4BAA4B;IAC5B,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,eAAe,CACvB,qCAAqC,EACrC,SAAS,CAAC,sBAAsB,EAChC,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;IACJ,CAAC;IACD,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE/B,gBAAgB;IAChB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,IAAI,eAAe,CACvB,wCAAwC,EACxC,SAAS,CAAC,sBAAsB,EAChC,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA+B,CAAC;IACjD,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,IAAI,eAAe,CACvB,mCAAmC,EACnC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,eAAe,CACvB,sCAAsC,EACtC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACjF,CAAC;IACJ,CAAC;IACD,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;IAC5G,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC9D,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;IAEtE,qBAAqB;IACrB,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,eAAe,CACvB,6CAA6C,EAC7C,SAAS,CAAC,sBAAsB,EAChC,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAoC,CAAC;IAC3D,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEvC,qBAAqB;IACrB,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,eAAe,CACvB,6CAA6C,EAC7C,SAAS,CAAC,sBAAsB,EAChC,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAoC,CAAC;IAC3D,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,eAAe,CACvB,gCAAgC,EAChC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,eAAe,CACvB,mCAAmC,EACnC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAC3E,CAAC;IACJ,CAAC;IACD,qBAAqB,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACjF,qBAAqB,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAE9E,oBAAoB;IACpB,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC9D,MAAM,IAAI,eAAe,CACvB,4CAA4C,EAC5C,SAAS,CAAC,sBAAsB,EAChC,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAmC,CAAC;IACzD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,eAAe,CACvB,6CAA6C,EAC7C,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,IAAI,eAAe,CACvB,yCAAyC,EACzC,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,qBAAqB,CAAC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;IAEhH,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAe;IACvD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAA4B;IACvE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS,EAAE,CAAC;QAC9C,qBAAqB,CACnB,MAAM,CAAC,IAAI,CAAC,cAAc,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,CACtB,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;QAC5C,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAChD,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,eAAe,CACvB,6CAA6C,EAC7C,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,CACvG,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QACjD,qBAAqB,CACnB,MAAM,CAAC,QAAQ,CAAC,aAAa,EAC7B,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,CACzB,CAAC;IACJ,CAAC;IACD,uCAAuC;IACvC,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAClF,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,IAAI,eAAe,CACvB,kBAAkB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,kCAAkC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAClI,SAAS,CAAC,aAAa,EACvB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CACnG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Module - HTTP handlers for browser sync
|
|
3
|
+
*
|
|
4
|
+
* Provides framework-agnostic HTTP handlers that can be integrated
|
|
5
|
+
* with any HTTP server (Bun.serve, Express, Hono, etc.)
|
|
6
|
+
*/
|
|
7
|
+
export { SyncHttpHandlers, createSyncHttpHandlers, type SyncPullRequest, type SyncPullResponse, type SyncPushRequest, type SyncPushResponse, type SyncExchangeRequest, type SyncExchangeResponse, type HttpResponse, getHttpStatus, parseRequestBody, serializeResponse, SYNC_CONTENT_TYPES, } from './sync-handlers.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,gBAAgB,EAChB,sBAAsB,EAEtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAEjB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Module - HTTP handlers for browser sync
|
|
3
|
+
*
|
|
4
|
+
* Provides framework-agnostic HTTP handlers that can be integrated
|
|
5
|
+
* with any HTTP server (Bun.serve, Express, Hono, etc.)
|
|
6
|
+
*/
|
|
7
|
+
export {
|
|
8
|
+
// Handler class
|
|
9
|
+
SyncHttpHandlers, createSyncHttpHandlers,
|
|
10
|
+
// Helpers
|
|
11
|
+
getHttpStatus, parseRequestBody, serializeResponse, SYNC_CONTENT_TYPES, } from './sync-handlers.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO;AACL,gBAAgB;AAChB,gBAAgB,EAChB,sBAAsB;AAStB,UAAU;AACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Sync Handlers - Browser sync support via HTTP endpoints
|
|
3
|
+
*
|
|
4
|
+
* Provides framework-agnostic handlers for browser sync operations.
|
|
5
|
+
* These can be integrated with any HTTP framework (Bun.serve, Express, Hono, etc.)
|
|
6
|
+
*
|
|
7
|
+
* Implements the browser sync protocol from api/sync.md:
|
|
8
|
+
* 1. Browser exports local changes
|
|
9
|
+
* 2. HTTP POST to server with JSONL
|
|
10
|
+
* 3. Server merges with its state
|
|
11
|
+
* 4. Server exports current state
|
|
12
|
+
* 5. HTTP response with JSONL
|
|
13
|
+
* 6. Browser imports and merges
|
|
14
|
+
*/
|
|
15
|
+
import type { StorageBackend } from '@stoneforge/storage';
|
|
16
|
+
import type { ImportResult, SyncStatus } from '../sync/types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Request body for browser sync pull (export from server)
|
|
19
|
+
*/
|
|
20
|
+
export interface SyncPullRequest {
|
|
21
|
+
/** Include ephemeral elements in export */
|
|
22
|
+
includeEphemeral?: boolean;
|
|
23
|
+
/** Include dependencies in export */
|
|
24
|
+
includeDependencies?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Response for browser sync pull
|
|
28
|
+
*/
|
|
29
|
+
export interface SyncPullResponse {
|
|
30
|
+
/** JSONL string of elements */
|
|
31
|
+
elements: string;
|
|
32
|
+
/** JSONL string of dependencies (if requested) */
|
|
33
|
+
dependencies?: string;
|
|
34
|
+
/** Element count */
|
|
35
|
+
elementCount: number;
|
|
36
|
+
/** Dependency count (if included) */
|
|
37
|
+
dependencyCount?: number;
|
|
38
|
+
/** Export timestamp */
|
|
39
|
+
exportedAt: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Request body for browser sync push (import to server)
|
|
43
|
+
*/
|
|
44
|
+
export interface SyncPushRequest {
|
|
45
|
+
/** JSONL string of elements to import */
|
|
46
|
+
elements: string;
|
|
47
|
+
/** JSONL string of dependencies to import */
|
|
48
|
+
dependencies?: string;
|
|
49
|
+
/** Dry run - validate without applying changes */
|
|
50
|
+
dryRun?: boolean;
|
|
51
|
+
/** Force - remote always wins conflicts */
|
|
52
|
+
force?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Response for browser sync push
|
|
56
|
+
*/
|
|
57
|
+
export interface SyncPushResponse {
|
|
58
|
+
/** Import result with counts and conflicts */
|
|
59
|
+
result: ImportResult;
|
|
60
|
+
/** Server's current state after merge (for client to sync) */
|
|
61
|
+
serverState?: SyncPullResponse;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Request/Response for full bidirectional sync
|
|
65
|
+
*/
|
|
66
|
+
export interface SyncExchangeRequest {
|
|
67
|
+
/** Client's elements to import */
|
|
68
|
+
elements: string;
|
|
69
|
+
/** Client's dependencies to import */
|
|
70
|
+
dependencies?: string;
|
|
71
|
+
/** Force - remote always wins conflicts */
|
|
72
|
+
force?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface SyncExchangeResponse {
|
|
75
|
+
/** Import result from processing client data */
|
|
76
|
+
importResult: ImportResult;
|
|
77
|
+
/** Server's current state (for client to import) */
|
|
78
|
+
serverElements: string;
|
|
79
|
+
/** Server's dependencies (for client to import) */
|
|
80
|
+
serverDependencies: string;
|
|
81
|
+
/** Counts for client reference */
|
|
82
|
+
serverElementCount: number;
|
|
83
|
+
serverDependencyCount: number;
|
|
84
|
+
/** Sync timestamp */
|
|
85
|
+
syncedAt: string;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* HTTP response envelope
|
|
89
|
+
*/
|
|
90
|
+
export interface HttpResponse<T> {
|
|
91
|
+
success: boolean;
|
|
92
|
+
data?: T;
|
|
93
|
+
error?: {
|
|
94
|
+
code: string;
|
|
95
|
+
message: string;
|
|
96
|
+
details?: Record<string, unknown>;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* HTTP handlers for browser sync operations
|
|
101
|
+
*/
|
|
102
|
+
export declare class SyncHttpHandlers {
|
|
103
|
+
private backend;
|
|
104
|
+
private syncService;
|
|
105
|
+
constructor(backend: StorageBackend);
|
|
106
|
+
/**
|
|
107
|
+
* Handle GET /api/sync/status
|
|
108
|
+
*
|
|
109
|
+
* Returns current sync status including dirty element count
|
|
110
|
+
*/
|
|
111
|
+
getStatus(): HttpResponse<SyncStatus>;
|
|
112
|
+
/**
|
|
113
|
+
* Handle GET /api/sync/pull or POST /api/sync/pull
|
|
114
|
+
*
|
|
115
|
+
* Exports server state as JSONL for client to import
|
|
116
|
+
*/
|
|
117
|
+
pull(request?: SyncPullRequest): HttpResponse<SyncPullResponse>;
|
|
118
|
+
/**
|
|
119
|
+
* Handle POST /api/sync/push
|
|
120
|
+
*
|
|
121
|
+
* Imports client JSONL data to server
|
|
122
|
+
*/
|
|
123
|
+
push(request: SyncPushRequest): HttpResponse<SyncPushResponse>;
|
|
124
|
+
/**
|
|
125
|
+
* Handle POST /api/sync/exchange
|
|
126
|
+
*
|
|
127
|
+
* Bidirectional sync in a single request:
|
|
128
|
+
* 1. Import client data
|
|
129
|
+
* 2. Export server state
|
|
130
|
+
* 3. Return both results
|
|
131
|
+
*/
|
|
132
|
+
exchange(request: SyncExchangeRequest): HttpResponse<SyncExchangeResponse>;
|
|
133
|
+
/**
|
|
134
|
+
* Handle errors and return appropriate HTTP response
|
|
135
|
+
*/
|
|
136
|
+
private handleError;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Create sync HTTP handlers for a storage backend
|
|
140
|
+
*/
|
|
141
|
+
export declare function createSyncHttpHandlers(backend: StorageBackend): SyncHttpHandlers;
|
|
142
|
+
/**
|
|
143
|
+
* Map response to HTTP status code
|
|
144
|
+
*/
|
|
145
|
+
export declare function getHttpStatus(response: HttpResponse<unknown>): number;
|
|
146
|
+
/**
|
|
147
|
+
* Supported content types for sync endpoints
|
|
148
|
+
*/
|
|
149
|
+
export declare const SYNC_CONTENT_TYPES: {
|
|
150
|
+
readonly JSON: "application/json";
|
|
151
|
+
readonly JSONL: "application/jsonl";
|
|
152
|
+
readonly NDJSON: "application/x-ndjson";
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Parse request body based on content type
|
|
156
|
+
*/
|
|
157
|
+
export declare function parseRequestBody<T>(body: string, _contentType?: string): T;
|
|
158
|
+
/**
|
|
159
|
+
* Serialize response based on accept header
|
|
160
|
+
*/
|
|
161
|
+
export declare function serializeResponse<T>(response: HttpResponse<T>): string;
|
|
162
|
+
//# sourceMappingURL=sync-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-handlers.d.ts","sourceRoot":"","sources":["../../src/http/sync-handlers.ts"],"names":[],"mappings":"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"}
|