@semiont/core 0.2.33-build.77 → 0.2.33-build.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +32 -112
- package/dist/index.js +45 -119
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -332,7 +332,7 @@ type ResourceEvent = ResourceCreatedEvent | ResourceClonedEvent | ResourceArchiv
|
|
|
332
332
|
type ResourceEventType = ResourceEvent['type'];
|
|
333
333
|
type SystemEvent = EntityTypeAddedEvent;
|
|
334
334
|
type ResourceScopedEvent = Exclude<ResourceEvent, SystemEvent>;
|
|
335
|
-
declare function isResourceEvent(event: any): event is ResourceEvent;
|
|
335
|
+
declare function isResourceEvent$1(event: any): event is ResourceEvent;
|
|
336
336
|
/**
|
|
337
337
|
* Type guard: Check if event is system-level (no resourceId)
|
|
338
338
|
* System events affect global state, not individual resources
|
|
@@ -379,15 +379,34 @@ interface ResourceAnnotations {
|
|
|
379
379
|
}
|
|
380
380
|
|
|
381
381
|
/**
|
|
382
|
-
*
|
|
382
|
+
* Event Type Guards and Extraction Utilities
|
|
383
|
+
*
|
|
384
|
+
* Domain logic for working with resource events.
|
|
385
|
+
* No React dependencies - safe to use in any JavaScript environment.
|
|
383
386
|
*/
|
|
384
387
|
|
|
385
|
-
type Annotation$1 = components['schemas']['Annotation'];
|
|
386
388
|
/**
|
|
387
|
-
*
|
|
388
|
-
*
|
|
389
|
+
* Extract annotation ID from event payload
|
|
390
|
+
* Returns null if event is not annotation-related
|
|
391
|
+
*
|
|
392
|
+
* For annotation.added: extracts full URI from payload.annotation.id
|
|
393
|
+
* For annotation.removed/body.updated: constructs full URI from payload.annotationId (UUID) + resourceId
|
|
394
|
+
*/
|
|
395
|
+
declare function getAnnotationUriFromEvent(event: StoredEvent): AnnotationUri | null;
|
|
396
|
+
/**
|
|
397
|
+
* Check if an event is related to a specific annotation
|
|
389
398
|
*/
|
|
390
|
-
declare function
|
|
399
|
+
declare function isEventRelatedToAnnotation(event: StoredEvent, annotationUri: AnnotationUri): boolean;
|
|
400
|
+
/**
|
|
401
|
+
* Type guard to check if event is a resource event
|
|
402
|
+
*/
|
|
403
|
+
declare function isResourceEvent(event: any): event is StoredEvent;
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Backend-specific annotation utility functions
|
|
407
|
+
*/
|
|
408
|
+
|
|
409
|
+
type Annotation$1 = components['schemas']['Annotation'];
|
|
391
410
|
/**
|
|
392
411
|
* Find a body item in an array
|
|
393
412
|
* Returns the index of the first matching item, or -1 if not found
|
|
@@ -475,38 +494,6 @@ declare function isNullish(value: unknown): value is null | undefined;
|
|
|
475
494
|
*/
|
|
476
495
|
declare function isDefined<T>(value: T | null | undefined): value is T;
|
|
477
496
|
|
|
478
|
-
/**
|
|
479
|
-
* Cryptographic utilities
|
|
480
|
-
*/
|
|
481
|
-
/**
|
|
482
|
-
* Calculate SHA-256 checksum of content
|
|
483
|
-
* @param content The content to hash
|
|
484
|
-
* @returns Hex-encoded SHA-256 hash
|
|
485
|
-
*/
|
|
486
|
-
declare function calculateChecksum(content: string | Buffer): string;
|
|
487
|
-
/**
|
|
488
|
-
* Verify content against a checksum
|
|
489
|
-
* @param content The content to verify
|
|
490
|
-
* @param checksum The expected checksum
|
|
491
|
-
* @returns True if content matches checksum
|
|
492
|
-
*/
|
|
493
|
-
declare function verifyChecksum(content: string | Buffer, checksum: string): boolean;
|
|
494
|
-
/**
|
|
495
|
-
* Generate a random ID (12 character hex string)
|
|
496
|
-
* Similar to MongoDB ObjectId but simpler
|
|
497
|
-
*/
|
|
498
|
-
declare function generateId(): string;
|
|
499
|
-
/**
|
|
500
|
-
* Generate a UUID v4-like ID (without dashes)
|
|
501
|
-
*/
|
|
502
|
-
declare function generateUuid(): string;
|
|
503
|
-
/**
|
|
504
|
-
* Generate a secure random token
|
|
505
|
-
* @param bytes Number of random bytes (default 32)
|
|
506
|
-
* @returns Base64 encoded random token
|
|
507
|
-
*/
|
|
508
|
-
declare function generateToken(bytes?: number): string;
|
|
509
|
-
|
|
510
497
|
/**
|
|
511
498
|
* Common error classes
|
|
512
499
|
*/
|
|
@@ -1344,59 +1331,27 @@ declare function hasAWSConfig(config: EnvironmentConfig): config is EnvironmentC
|
|
|
1344
1331
|
*/
|
|
1345
1332
|
declare function displayConfiguration(config: EnvironmentConfig): void;
|
|
1346
1333
|
|
|
1347
|
-
/**
|
|
1348
|
-
* Filesystem-based wrapper for environment loading
|
|
1349
|
-
*
|
|
1350
|
-
* This module provides convenient filesystem-based wrappers around the pure
|
|
1351
|
-
* configuration functions. These are intended for application code that needs
|
|
1352
|
-
* to load config from disk.
|
|
1353
|
-
*
|
|
1354
|
-
* The pure functions (parseAndMergeConfigs, etc.) remain testable without
|
|
1355
|
-
* filesystem mocking.
|
|
1356
|
-
*/
|
|
1357
|
-
|
|
1358
|
-
/**
|
|
1359
|
-
* Load environment configuration from filesystem
|
|
1360
|
-
* Convenience wrapper around parseAndMergeConfigs for application code
|
|
1361
|
-
*
|
|
1362
|
-
* @param projectRoot - Absolute path to project directory containing semiont.json
|
|
1363
|
-
* @param environment - Environment name (must match a file in environments/)
|
|
1364
|
-
* @returns Merged environment configuration
|
|
1365
|
-
* @throws ConfigurationError if files are missing or invalid
|
|
1366
|
-
*/
|
|
1367
|
-
declare function loadEnvironmentConfig(projectRoot: string, environment: string): EnvironmentConfig;
|
|
1368
|
-
/**
|
|
1369
|
-
* Get available environments by scanning environments directory
|
|
1370
|
-
* Convenience wrapper around listEnvironmentNames for application code
|
|
1371
|
-
*
|
|
1372
|
-
* @returns Array of environment names
|
|
1373
|
-
*/
|
|
1374
|
-
declare function getAvailableEnvironments(): string[];
|
|
1375
|
-
/**
|
|
1376
|
-
* Check if an environment exists
|
|
1377
|
-
*
|
|
1378
|
-
* @param environment - Environment name to check
|
|
1379
|
-
* @returns True if environment exists
|
|
1380
|
-
*/
|
|
1381
|
-
declare function isValidEnvironment(environment: string): boolean;
|
|
1382
|
-
|
|
1383
1334
|
/**
|
|
1384
1335
|
* Environment validation utilities
|
|
1336
|
+
*
|
|
1337
|
+
* Pure functions - accept available environments as parameter instead of reading from filesystem
|
|
1385
1338
|
*/
|
|
1386
1339
|
type Environment = string;
|
|
1387
1340
|
/**
|
|
1388
1341
|
* Parse environment string to Environment type
|
|
1389
1342
|
* @param value - The environment string to parse
|
|
1343
|
+
* @param availableEnvironments - List of valid environment names
|
|
1390
1344
|
* @returns Valid Environment type
|
|
1391
1345
|
* @throws Error if environment is invalid or not provided
|
|
1392
1346
|
*/
|
|
1393
|
-
declare function parseEnvironment(value: string | undefined): Environment;
|
|
1347
|
+
declare function parseEnvironment(value: string | undefined, availableEnvironments: string[]): Environment;
|
|
1394
1348
|
/**
|
|
1395
1349
|
* Validate and return environment or throw error
|
|
1396
1350
|
* @param value - The environment string to validate
|
|
1351
|
+
* @param availableEnvironments - List of valid environment names
|
|
1397
1352
|
* @throws Error if environment is invalid
|
|
1398
1353
|
*/
|
|
1399
|
-
declare function validateEnvironment(value: string | undefined): Environment;
|
|
1354
|
+
declare function validateEnvironment(value: string | undefined, availableEnvironments: string[]): Environment;
|
|
1400
1355
|
|
|
1401
1356
|
/**
|
|
1402
1357
|
* Config Schema Validator
|
|
@@ -1444,41 +1399,6 @@ declare class ConfigurationError extends Error {
|
|
|
1444
1399
|
toString(): string;
|
|
1445
1400
|
}
|
|
1446
1401
|
|
|
1447
|
-
/**
|
|
1448
|
-
* Project Discovery Module
|
|
1449
|
-
*
|
|
1450
|
-
* Responsible for finding the Semiont project root directory.
|
|
1451
|
-
* Looks for semiont.json or environments directory to identify a valid project.
|
|
1452
|
-
*/
|
|
1453
|
-
/**
|
|
1454
|
-
* Find project root - returns SEMIONT_ROOT environment variable
|
|
1455
|
-
*
|
|
1456
|
-
* @returns The absolute path to the project root
|
|
1457
|
-
* @throws ConfigurationError if SEMIONT_ROOT is not set or invalid
|
|
1458
|
-
*/
|
|
1459
|
-
declare function findProjectRoot(): string;
|
|
1460
|
-
/**
|
|
1461
|
-
* Check if a path looks like a Semiont project root
|
|
1462
|
-
*
|
|
1463
|
-
* @param projectPath - Path to check
|
|
1464
|
-
* @returns True if path contains semiont.json or environments directory
|
|
1465
|
-
*/
|
|
1466
|
-
declare function isProjectRoot(projectPath: string): boolean;
|
|
1467
|
-
/**
|
|
1468
|
-
* Get the path to the environments directory
|
|
1469
|
-
*
|
|
1470
|
-
* @param projectRoot - Project root directory (optional, will find if not provided)
|
|
1471
|
-
* @returns Path to environments directory
|
|
1472
|
-
*/
|
|
1473
|
-
declare function getEnvironmentsPath(projectRoot?: string): string;
|
|
1474
|
-
/**
|
|
1475
|
-
* Get the path to semiont.json
|
|
1476
|
-
*
|
|
1477
|
-
* @param projectRoot - Project root directory (optional, will find if not provided)
|
|
1478
|
-
* @returns Path to semiont.json
|
|
1479
|
-
*/
|
|
1480
|
-
declare function getSemiontConfigPath(projectRoot?: string): string;
|
|
1481
|
-
|
|
1482
1402
|
/**
|
|
1483
1403
|
* @semiont/core
|
|
1484
1404
|
*
|
|
@@ -1489,4 +1409,4 @@ declare function getSemiontConfigPath(projectRoot?: string): string;
|
|
|
1489
1409
|
declare const CORE_TYPES_VERSION = "0.1.0";
|
|
1490
1410
|
declare const SDK_VERSION = "0.1.0";
|
|
1491
1411
|
|
|
1492
|
-
export { APIError, type AWSConfig, type AnnotationAddedEvent, type AnnotationBodyUpdatedEvent, type AnnotationCategory, type AnnotationId, type AnnotationRemovedEvent, type AppConfig, type BackendServiceConfig, type BaseEvent, type BodyItem, type BodyOperation, CORE_TYPES_VERSION, CREATION_METHODS, ConfigurationError, ConflictError, type CreateAnnotationInternal, type CreationMethod, type DatabaseServiceConfig, type EntityTagAddedEvent, type EntityTagRemovedEvent, type EntityTypeStats, type Environment, type EnvironmentConfig, type EventMetadata, type EventQuery, type EventSignature, type FilesystemServiceConfig, type FrontendServiceConfig, type GoogleAuthRequest, type GraphConnection, type GraphDatabaseType, type GraphPath, type GraphServiceConfig, type InferenceServiceConfig, type JobCompletedEvent, type JobFailedEvent, type JobProgressEvent, type JobStartedEvent, type McpServiceConfig, NotFoundError, type PlatformType, type ProxyServiceConfig, type RepresentationAddedEvent, type RepresentationRemovedEvent, type ResourceAnnotations, type ResourceArchivedEvent, type ResourceClonedEvent, type ResourceCreatedEvent, type ResourceEvent, type ResourceEventType, type ResourceFilter, type ResourceId, type ResourceScopedEvent, type ResourceUnarchivedEvent, SDK_VERSION, ScriptError, type SemiontConfig, SemiontError, type ServiceConfig, type ServicePlatformConfig, type ServicesConfig, type SiteConfig, type StoredEvent, type SystemEvent, UnauthorizedError, type UpdateResourceInput, type UserId, ValidationError, type ValidationResult, annotationId, annotationIdToURI,
|
|
1412
|
+
export { APIError, type AWSConfig, type AnnotationAddedEvent, type AnnotationBodyUpdatedEvent, type AnnotationCategory, type AnnotationId, type AnnotationRemovedEvent, type AppConfig, type BackendServiceConfig, type BaseEvent, type BodyItem, type BodyOperation, CORE_TYPES_VERSION, CREATION_METHODS, ConfigurationError, ConflictError, type CreateAnnotationInternal, type CreationMethod, type DatabaseServiceConfig, type EntityTagAddedEvent, type EntityTagRemovedEvent, type EntityTypeStats, type Environment, type EnvironmentConfig, type EventMetadata, type EventQuery, type EventSignature, type FilesystemServiceConfig, type FrontendServiceConfig, type GoogleAuthRequest, type GraphConnection, type GraphDatabaseType, type GraphPath, type GraphServiceConfig, type InferenceServiceConfig, type JobCompletedEvent, type JobFailedEvent, type JobProgressEvent, type JobStartedEvent, type McpServiceConfig, NotFoundError, type PlatformType, type ProxyServiceConfig, type RepresentationAddedEvent, type RepresentationRemovedEvent, type ResourceAnnotations, type ResourceArchivedEvent, type ResourceClonedEvent, type ResourceCreatedEvent, type ResourceEvent, type ResourceEventType, type ResourceFilter, type ResourceId, type ResourceScopedEvent, type ResourceUnarchivedEvent, SDK_VERSION, ScriptError, type SemiontConfig, SemiontError, type ServiceConfig, type ServicePlatformConfig, type ServicesConfig, type SiteConfig, type StoredEvent, type SystemEvent, UnauthorizedError, type UpdateResourceInput, type UserId, ValidationError, type ValidationResult, annotationId, annotationIdToURI, deepMerge, didToAgent, displayConfiguration, findBodyItem, formatErrors, getAllPlatformTypes, getAnnotationUriFromEvent, getEventType, getNodeEnvForEnvironment, hasAWSConfig, isAnnotationId, isArray, isBoolean, isDefined, isEventRelatedToAnnotation, isFunction, isNull, isNullish, isNumber, isObject, isResourceEvent$1 as isResourceEvent, isResourceId, isResourceScopedEvent, isResourceEvent as isStoredEvent, isString, isSystemEvent, isUndefined, isValidPlatformType, listEnvironmentNames, parseAndMergeConfigs, parseEnvironment, resolveEnvVars, resourceId, resourceIdToURI, uriToAnnotationId, uriToResourceId, userId, userToAgent, userToDid, validateEnvironment, validateEnvironmentConfig, validateSemiontConfig, validateSiteConfig };
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { resourceUri, annotationUri } from '@semiont/api-client';
|
|
2
|
-
import { createHash, randomBytes } from 'crypto';
|
|
3
|
-
import * as path2 from 'path';
|
|
4
2
|
import Ajv from 'ajv';
|
|
5
3
|
import addFormats from 'ajv-formats';
|
|
6
|
-
import * as fs2 from 'fs';
|
|
7
4
|
|
|
8
5
|
// src/creation-methods.ts
|
|
9
6
|
var CREATION_METHODS = {
|
|
@@ -77,22 +74,34 @@ function getEventType(event) {
|
|
|
77
74
|
return event.type;
|
|
78
75
|
}
|
|
79
76
|
|
|
80
|
-
// src/
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (item1.purpose !== item2.purpose) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
if (item1.type === "TextualBody" && item2.type === "TextualBody") {
|
|
89
|
-
return item1.value === item2.value;
|
|
77
|
+
// src/event-utils.ts
|
|
78
|
+
function getAnnotationUriFromEvent(event) {
|
|
79
|
+
const eventData = event.event;
|
|
80
|
+
if (eventData.type === "annotation.added") {
|
|
81
|
+
return eventData.payload.annotation.id || null;
|
|
90
82
|
}
|
|
91
|
-
if (
|
|
92
|
-
|
|
83
|
+
if (eventData.type === "annotation.removed" || eventData.type === "annotation.body.updated") {
|
|
84
|
+
if (eventData.payload.annotationId && eventData.resourceId) {
|
|
85
|
+
try {
|
|
86
|
+
const resourceUri2 = eventData.resourceId;
|
|
87
|
+
const baseUrl = resourceUri2.substring(0, resourceUri2.lastIndexOf("/resources/"));
|
|
88
|
+
return `${baseUrl}/annotations/${eventData.payload.annotationId}`;
|
|
89
|
+
} catch (e) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
93
|
}
|
|
94
|
-
return
|
|
94
|
+
return null;
|
|
95
95
|
}
|
|
96
|
+
function isEventRelatedToAnnotation(event, annotationUri2) {
|
|
97
|
+
const eventAnnotationUri = getAnnotationUriFromEvent(event);
|
|
98
|
+
return eventAnnotationUri === annotationUri2;
|
|
99
|
+
}
|
|
100
|
+
function isResourceEvent2(event) {
|
|
101
|
+
return event && typeof event.event === "object" && typeof event.event.id === "string" && typeof event.event.timestamp === "string" && typeof event.event.resourceId === "string" && typeof event.event.type === "string" && typeof event.metadata === "object" && typeof event.metadata.sequenceNumber === "number";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// src/annotation-utils.ts
|
|
96
105
|
function findBodyItem(body, targetItem) {
|
|
97
106
|
if (!Array.isArray(body)) {
|
|
98
107
|
return -1;
|
|
@@ -153,23 +162,6 @@ function isNullish(value) {
|
|
|
153
162
|
function isDefined(value) {
|
|
154
163
|
return value !== null && value !== void 0;
|
|
155
164
|
}
|
|
156
|
-
function calculateChecksum(content) {
|
|
157
|
-
const hash = createHash("sha256");
|
|
158
|
-
hash.update(content);
|
|
159
|
-
return hash.digest("hex");
|
|
160
|
-
}
|
|
161
|
-
function verifyChecksum(content, checksum) {
|
|
162
|
-
return calculateChecksum(content) === checksum;
|
|
163
|
-
}
|
|
164
|
-
function generateId() {
|
|
165
|
-
return randomBytes(6).toString("hex");
|
|
166
|
-
}
|
|
167
|
-
function generateUuid() {
|
|
168
|
-
return randomBytes(16).toString("hex");
|
|
169
|
-
}
|
|
170
|
-
function generateToken(bytes = 32) {
|
|
171
|
-
return randomBytes(bytes).toString("base64url");
|
|
172
|
-
}
|
|
173
165
|
|
|
174
166
|
// src/errors.ts
|
|
175
167
|
var SemiontError = class extends Error {
|
|
@@ -1929,24 +1921,24 @@ function validateSiteConfig(data) {
|
|
|
1929
1921
|
function formatErrors(errors) {
|
|
1930
1922
|
if (errors.length === 0) return "Validation failed";
|
|
1931
1923
|
const messages = errors.map((err) => {
|
|
1932
|
-
const
|
|
1924
|
+
const path = err.instancePath || "root";
|
|
1933
1925
|
const message = err.message || "validation error";
|
|
1934
1926
|
if (err.keyword === "required" && "missingProperty" in err.params) {
|
|
1935
1927
|
return `Missing required property: ${err.params.missingProperty}`;
|
|
1936
1928
|
}
|
|
1937
1929
|
if (err.keyword === "type" && "type" in err.params) {
|
|
1938
|
-
return `${
|
|
1930
|
+
return `${path}: ${message} (expected ${err.params.type})`;
|
|
1939
1931
|
}
|
|
1940
1932
|
if (err.keyword === "enum" && "allowedValues" in err.params) {
|
|
1941
|
-
return `${
|
|
1933
|
+
return `${path}: must be one of [${err.params.allowedValues.join(", ")}]`;
|
|
1942
1934
|
}
|
|
1943
1935
|
if (err.keyword === "format") {
|
|
1944
|
-
return `${
|
|
1936
|
+
return `${path}: invalid format (${message})`;
|
|
1945
1937
|
}
|
|
1946
1938
|
if (err.keyword === "minLength" || err.keyword === "minItems") {
|
|
1947
|
-
return `${
|
|
1939
|
+
return `${path}: ${message}`;
|
|
1948
1940
|
}
|
|
1949
|
-
return `${
|
|
1941
|
+
return `${path}: ${message}`;
|
|
1950
1942
|
});
|
|
1951
1943
|
return messages.join("; ");
|
|
1952
1944
|
}
|
|
@@ -2055,7 +2047,11 @@ function getNodeEnvForEnvironment(config) {
|
|
|
2055
2047
|
return nodeEnv || "development";
|
|
2056
2048
|
}
|
|
2057
2049
|
function listEnvironmentNames(files) {
|
|
2058
|
-
return files.filter((file) => file.endsWith(".json")).map((file) =>
|
|
2050
|
+
return files.filter((file) => file.endsWith(".json")).map((file) => {
|
|
2051
|
+
const lastSlash = Math.max(file.lastIndexOf("/"), file.lastIndexOf("\\"));
|
|
2052
|
+
const filename = lastSlash >= 0 ? file.substring(lastSlash + 1) : file;
|
|
2053
|
+
return filename.slice(0, -5);
|
|
2054
|
+
}).sort();
|
|
2059
2055
|
}
|
|
2060
2056
|
function hasAWSConfig(config) {
|
|
2061
2057
|
return !!config.aws && !!config.aws.region;
|
|
@@ -2064,97 +2060,27 @@ function displayConfiguration(config) {
|
|
|
2064
2060
|
console.log("Environment Configuration:");
|
|
2065
2061
|
console.log(JSON.stringify(config, null, 2));
|
|
2066
2062
|
}
|
|
2067
|
-
function findProjectRoot() {
|
|
2068
|
-
const root = process.env.SEMIONT_ROOT;
|
|
2069
|
-
if (!root) {
|
|
2070
|
-
throw new ConfigurationError(
|
|
2071
|
-
"SEMIONT_ROOT environment variable is not set",
|
|
2072
|
-
void 0,
|
|
2073
|
-
"Set SEMIONT_ROOT to your project directory, or use the semiont CLI which sets it automatically"
|
|
2074
|
-
);
|
|
2075
|
-
}
|
|
2076
|
-
if (!fs2.existsSync(root)) {
|
|
2077
|
-
throw new ConfigurationError(
|
|
2078
|
-
`SEMIONT_ROOT points to non-existent directory: ${root}`,
|
|
2079
|
-
void 0,
|
|
2080
|
-
"Check that SEMIONT_ROOT environment variable is set correctly"
|
|
2081
|
-
);
|
|
2082
|
-
}
|
|
2083
|
-
if (!isProjectRoot(root)) {
|
|
2084
|
-
throw new ConfigurationError(
|
|
2085
|
-
`SEMIONT_ROOT does not point to a valid Semiont project: ${root}`,
|
|
2086
|
-
void 0,
|
|
2087
|
-
"Ensure SEMIONT_ROOT points to a directory containing semiont.json or environments/"
|
|
2088
|
-
);
|
|
2089
|
-
}
|
|
2090
|
-
return root;
|
|
2091
|
-
}
|
|
2092
|
-
function isProjectRoot(projectPath) {
|
|
2093
|
-
return fs2.existsSync(path2.join(projectPath, "semiont.json")) || fs2.existsSync(path2.join(projectPath, "environments"));
|
|
2094
|
-
}
|
|
2095
|
-
function getEnvironmentsPath(projectRoot) {
|
|
2096
|
-
const root = projectRoot || findProjectRoot();
|
|
2097
|
-
return path2.join(root, "environments");
|
|
2098
|
-
}
|
|
2099
|
-
function getSemiontConfigPath(projectRoot) {
|
|
2100
|
-
const root = projectRoot || findProjectRoot();
|
|
2101
|
-
return path2.join(root, "semiont.json");
|
|
2102
|
-
}
|
|
2103
|
-
|
|
2104
|
-
// src/config/environment-loader-fs.ts
|
|
2105
|
-
function loadEnvironmentConfig(projectRoot, environment) {
|
|
2106
|
-
const baseConfigPath = path2.join(projectRoot, "semiont.json");
|
|
2107
|
-
const baseContent = fs2.existsSync(baseConfigPath) ? fs2.readFileSync(baseConfigPath, "utf-8") : null;
|
|
2108
|
-
const envPath = path2.join(projectRoot, "environments", `${environment}.json`);
|
|
2109
|
-
if (!fs2.existsSync(envPath)) {
|
|
2110
|
-
throw new ConfigurationError(
|
|
2111
|
-
`Environment configuration missing: ${envPath}`,
|
|
2112
|
-
environment,
|
|
2113
|
-
`Create the configuration file or use: semiont init`
|
|
2114
|
-
);
|
|
2115
|
-
}
|
|
2116
|
-
const envContent = fs2.readFileSync(envPath, "utf-8");
|
|
2117
|
-
return parseAndMergeConfigs(baseContent, envContent, process.env, environment, projectRoot);
|
|
2118
|
-
}
|
|
2119
|
-
function getAvailableEnvironments() {
|
|
2120
|
-
try {
|
|
2121
|
-
const projectRoot = findProjectRoot();
|
|
2122
|
-
const configDir = path2.join(projectRoot, "environments");
|
|
2123
|
-
if (!fs2.existsSync(configDir)) {
|
|
2124
|
-
return [];
|
|
2125
|
-
}
|
|
2126
|
-
const files = fs2.readdirSync(configDir);
|
|
2127
|
-
return listEnvironmentNames(files);
|
|
2128
|
-
} catch (error) {
|
|
2129
|
-
return [];
|
|
2130
|
-
}
|
|
2131
|
-
}
|
|
2132
|
-
function isValidEnvironment(environment) {
|
|
2133
|
-
return getAvailableEnvironments().includes(environment);
|
|
2134
|
-
}
|
|
2135
2063
|
|
|
2136
2064
|
// src/config/environment-validator.ts
|
|
2137
|
-
function
|
|
2065
|
+
function isValidEnvironment(value, availableEnvironments) {
|
|
2138
2066
|
if (!value) return false;
|
|
2139
|
-
return
|
|
2067
|
+
return availableEnvironments.includes(value);
|
|
2140
2068
|
}
|
|
2141
|
-
function parseEnvironment(value) {
|
|
2069
|
+
function parseEnvironment(value, availableEnvironments) {
|
|
2142
2070
|
if (!value) {
|
|
2143
2071
|
throw new Error("Environment is required");
|
|
2144
2072
|
}
|
|
2145
|
-
if (!
|
|
2146
|
-
|
|
2147
|
-
throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvs.join(", ")}`);
|
|
2073
|
+
if (!isValidEnvironment(value, availableEnvironments)) {
|
|
2074
|
+
throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvironments.join(", ")}`);
|
|
2148
2075
|
}
|
|
2149
2076
|
return value;
|
|
2150
2077
|
}
|
|
2151
|
-
function validateEnvironment(value) {
|
|
2078
|
+
function validateEnvironment(value, availableEnvironments) {
|
|
2152
2079
|
if (!value) {
|
|
2153
2080
|
throw new Error("Environment is required");
|
|
2154
2081
|
}
|
|
2155
|
-
if (!
|
|
2156
|
-
|
|
2157
|
-
throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvs.join(", ")}`);
|
|
2082
|
+
if (!isValidEnvironment(value, availableEnvironments)) {
|
|
2083
|
+
throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvironments.join(", ")}`);
|
|
2158
2084
|
}
|
|
2159
2085
|
return value;
|
|
2160
2086
|
}
|
|
@@ -2171,6 +2097,6 @@ function getAllPlatformTypes() {
|
|
|
2171
2097
|
var CORE_TYPES_VERSION = "0.1.0";
|
|
2172
2098
|
var SDK_VERSION = "0.1.0";
|
|
2173
2099
|
|
|
2174
|
-
export { APIError, CORE_TYPES_VERSION, CREATION_METHODS, ConfigurationError, ConflictError, NotFoundError, SDK_VERSION, ScriptError, SemiontError, UnauthorizedError, ValidationError, annotationId, annotationIdToURI,
|
|
2100
|
+
export { APIError, CORE_TYPES_VERSION, CREATION_METHODS, ConfigurationError, ConflictError, NotFoundError, SDK_VERSION, ScriptError, SemiontError, UnauthorizedError, ValidationError, annotationId, annotationIdToURI, deepMerge, didToAgent, displayConfiguration, findBodyItem, formatErrors, getAllPlatformTypes, getAnnotationUriFromEvent, getEventType, getNodeEnvForEnvironment, hasAWSConfig, isAnnotationId, isArray, isBoolean, isDefined, isEventRelatedToAnnotation, isFunction, isNull, isNullish, isNumber, isObject, isResourceEvent, isResourceId, isResourceScopedEvent, isResourceEvent2 as isStoredEvent, isString, isSystemEvent, isUndefined, isValidPlatformType, listEnvironmentNames, parseAndMergeConfigs, parseEnvironment, resolveEnvVars, resourceId, resourceIdToURI, uriToAnnotationId, uriToResourceId, userId, userToAgent, userToDid, validateEnvironment, validateEnvironmentConfig, validateSemiontConfig, validateSiteConfig };
|
|
2175
2101
|
//# sourceMappingURL=index.js.map
|
|
2176
2102
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/creation-methods.ts","../src/identifiers.ts","../src/uri-utils.ts","../src/events.ts","../src/annotation-utils.ts","../src/type-guards.ts","../src/crypto.ts","../src/errors.ts","../src/did-utils.ts","../src/config/configuration-error.ts","../src/config/config.schema.json","../src/config/config-validator.ts","../src/config/environment-loader.ts","../src/config/project-discovery.ts","../src/config/environment-loader-fs.ts","../src/config/environment-validator.ts","../src/config/platform-types.ts","../src/index.ts"],"names":["userId","path","fs","path3","isValidEnvironment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Resource creation methods - How resources are created in the system\n */\n\n/**\n * Enumeration of all possible resource creation methods\n */\nexport const CREATION_METHODS = {\n API: 'api',\n UPLOAD: 'upload',\n UI: 'ui',\n REFERENCE: 'reference',\n CLONE: 'clone',\n GENERATED: 'generated',\n} as const;\n\n/**\n * Type for resource creation methods\n */\nexport type CreationMethod = typeof CREATION_METHODS[keyof typeof CREATION_METHODS];","/**\n * Branded identifier types for compile-time type safety.\n *\n * These types prevent mixing up resource IDs, annotation IDs, and user IDs\n * at compile time while having zero runtime overhead.\n *\n * URI types (ResourceUri, AnnotationUri) are in @semiont/api-client\n * since they deal with HTTP URIs returned by the API.\n */\n\n// Branded type definitions for IDs only\nexport type ResourceId = string & { readonly __brand: 'ResourceId' };\nexport type AnnotationId = string & { readonly __brand: 'AnnotationId' };\nexport type UserId = string & { readonly __brand: 'UserId' };\n\n// Type guards with runtime validation\nexport function isResourceId(value: string): value is ResourceId {\n return !value.includes('/');\n}\n\nexport function isAnnotationId(value: string): value is AnnotationId {\n return !value.includes('/');\n}\n\n// Factory functions with runtime validation\nexport function resourceId(id: string): ResourceId {\n if (id.includes('/')) {\n throw new TypeError(`Expected ResourceId, got URI: ${id}`);\n }\n return id as ResourceId;\n}\n\nexport function annotationId(id: string): AnnotationId {\n if (id.includes('/')) {\n throw new TypeError(`Expected AnnotationId, got URI: ${id}`);\n }\n return id as AnnotationId;\n}\n\nexport function userId(id: string): UserId {\n return id as UserId;\n}\n","/**\n * URI utilities for W3C annotations\n *\n * Converts between short resource/annotation IDs and full URIs.\n * Full URIs are required by W3C Web Annotation Data Model.\n */\n\nimport { resourceId, annotationId, type ResourceId, type AnnotationId } from './identifiers';\nimport { resourceUri, annotationUri, type ResourceUri, type AnnotationUri } from '@semiont/api-client';\n\n/**\n * Convert resource ID to full URI\n *\n * @param id - Short resource ID (e.g., \"doc-abc123\")\n * @param publicURL - Backend base URL\n * @returns Full URI (e.g., \"https://api.semiont.app/resources/doc-abc123\")\n *\n * @example\n * resourceIdToURI(\"doc-abc123\", \"https://api.semiont.app\")\n * // => \"https://api.semiont.app/resources/doc-abc123\"\n */\nexport function resourceIdToURI(id: ResourceId, publicURL: string): ResourceUri {\n // Remove trailing slash if present\n const normalizedBase = publicURL.endsWith('/') ? publicURL.slice(0, -1) : publicURL;\n return resourceUri(`${normalizedBase}/resources/${id}` );\n}\n\n/**\n * Extract resource ID from full URI\n *\n * @param uri - Full resource URI (e.g., \"https://api.semiont.app/resources/doc-abc123\")\n * @returns Short resource ID (e.g., \"doc-abc123\")\n * @throws Error if URI format is invalid\n *\n * @example\n * uriToResourceId(\"https://api.semiont.app/resources/doc-abc123\")\n * // => \"doc-abc123\"\n */\nexport function uriToResourceId(uri: string): ResourceId {\n const url = new URL(uri);\n const match = url.pathname.match(/\\/resources\\/([^/]+)/);\n if (!match || !match[1]) {\n throw new Error(`Invalid resource URI: ${uri}`);\n }\n return resourceId(match[1]);\n}\n\n/**\n * Convert annotation ID to full URI\n *\n * @param id - Short annotation ID (e.g., \"anno-xyz789\")\n * @param publicURL - Backend base URL\n * @returns Full URI (e.g., \"https://api.semiont.app/annotations/anno-xyz789\")\n *\n * @example\n * annotationIdToURI(\"anno-xyz789\", \"https://api.semiont.app\")\n * // => \"https://api.semiont.app/annotations/anno-xyz789\"\n */\nexport function annotationIdToURI(id: AnnotationId, publicURL: string): AnnotationUri {\n // Remove trailing slash if present\n const normalizedBase = publicURL.endsWith('/') ? publicURL.slice(0, -1) : publicURL;\n return annotationUri(`${normalizedBase}/annotations/${id}`);\n}\n\n/**\n * Extract annotation ID from full URI\n *\n * @param uri - Full annotation URI (e.g., \"https://api.semiont.app/annotations/anno-xyz789\")\n * @returns Short annotation ID (e.g., \"anno-xyz789\")\n * @throws Error if URI format is invalid\n *\n * @example\n * uriToAnnotationId(\"https://api.semiont.app/annotations/anno-xyz789\")\n * // => \"anno-xyz789\"\n */\nexport function uriToAnnotationId(uri: string): AnnotationId {\n const url = new URL(uri);\n const match = url.pathname.match(/\\/annotations\\/([^/]+)/);\n if (!match || !match[1]) {\n throw new Error(`Invalid annotation URI: ${uri}`);\n }\n return annotationId(match[1]);\n}\n","/**\n * Resource Event Types\n *\n * Event-sourced architecture for resource state management\n * Events are stored in an append-only log (JSONL format)\n *\n * Federation-ready design:\n * - resourceId uses content hashes (doc-sha256:...)\n * - userId uses DID format (did:web:org.com:users:alice)\n * - prevEventHash creates tamper-evident chains\n * - Optional signatures for cross-org verification\n */\n\nimport type { CreationMethod } from './creation-methods';\nimport type { components, AnnotationUri, JobId } from '@semiont/api-client';\nimport type { ResourceId, AnnotationId, UserId } from './identifiers';\n\n// Import OpenAPI types\ntype Annotation = components['schemas']['Annotation'];\ntype ContentFormat = components['schemas']['ContentFormat'];\ntype Motivation = components['schemas']['Motivation'];\n\nexport interface BaseEvent {\n id: string; // Unique event ID (UUID)\n timestamp: string; // ISO 8601 timestamp (for humans, NOT for ordering)\n resourceId?: ResourceId; // Optional - present for resource-scoped events, absent for system events\n // Use isSystemEvent() / isResourceScopedEvent() type guards for routing\n userId: UserId; // DID format: did:web:org.com:users:alice (federation-ready)\n version: number; // Event schema version\n}\n\n// Resource lifecycle events\nexport interface ResourceCreatedEvent extends BaseEvent {\n type: 'resource.created';\n payload: {\n name: string;\n format: ContentFormat; // MIME type (validated enum)\n contentChecksum: string; // SHA-256 of content (should match resourceId)\n contentByteSize?: number; // Size of content in bytes\n creationMethod: CreationMethod; // How the resource was created\n entityTypes?: string[];\n\n // First-class fields (promoted from metadata)\n language?: string; // Language/locale code (e.g., 'en', 'es', 'fr')\n isDraft?: boolean; // Draft status for generated resources\n generatedFrom?: string; // Annotation/Reference ID that triggered generation\n generationPrompt?: string; // Prompt used for AI generation (events-only, not on Resource)\n };\n}\n\nexport interface ResourceClonedEvent extends BaseEvent {\n type: 'resource.cloned';\n payload: {\n name: string;\n format: ContentFormat; // MIME type (validated enum)\n contentChecksum: string; // SHA-256 of new content\n contentByteSize?: number; // Size of content in bytes\n parentResourceId: string; // Content hash of parent resource\n creationMethod: CreationMethod; // How the resource was created\n entityTypes?: string[];\n\n // First-class fields (promoted from metadata)\n language?: string; // Language/locale code (e.g., 'en', 'es', 'fr')\n };\n}\n\nexport interface ResourceArchivedEvent extends BaseEvent {\n type: 'resource.archived';\n payload: {\n reason?: string;\n };\n}\n\nexport interface ResourceUnarchivedEvent extends BaseEvent {\n type: 'resource.unarchived';\n payload: Record<string, never>; // Empty payload\n}\n\n// Representation events (multi-format support)\nexport interface RepresentationAddedEvent extends BaseEvent {\n type: 'representation.added';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n representation: {\n '@id': string; // Unique ID (content hash)\n mediaType: string; // MIME type (e.g., 'text/markdown', 'application/pdf')\n byteSize: number; // Size in bytes\n checksum: string; // Content hash (SHA-256)\n created: string; // ISO 8601 timestamp\n rel?: 'original' | 'thumbnail' | 'preview' | 'optimized' | 'derived' | 'other';\n storageUri?: string; // Where bytes are stored (optional)\n filename?: string; // Original filename (optional)\n language?: string; // IETF BCP 47 language tag (optional, for translations)\n width?: number; // Pixels (images/video)\n height?: number; // Pixels (images/video)\n duration?: number; // Seconds (audio/video)\n };\n };\n}\n\nexport interface RepresentationRemovedEvent extends BaseEvent {\n type: 'representation.removed';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n checksum: string; // Which representation to remove\n };\n}\n\n// Unified annotation events\n// Single principle: An annotation is an annotation. The motivation field tells you what kind it is.\nexport interface AnnotationAddedEvent extends BaseEvent {\n type: 'annotation.added';\n payload: {\n annotation: Omit<Annotation, 'creator' | 'created'>; // W3C Annotation (creator/created come from event metadata)\n };\n}\n\nexport interface AnnotationRemovedEvent extends BaseEvent {\n type: 'annotation.removed';\n payload: {\n annotationId: AnnotationId; // Branded type for compile-time safety\n };\n}\n\n// Body operation types for fine-grained annotation body modifications\nexport type BodyItem =\n | { type: 'TextualBody'; value: string; purpose?: Motivation; format?: string; language?: string }\n | { type: 'SpecificResource'; source: string; purpose?: Motivation };\n\nexport type BodyOperation =\n | { op: 'add'; item: BodyItem }\n | { op: 'remove'; item: BodyItem }\n | { op: 'replace'; oldItem: BodyItem; newItem: BodyItem };\n\nexport interface AnnotationBodyUpdatedEvent extends BaseEvent {\n type: 'annotation.body.updated';\n payload: {\n annotationId: AnnotationId; // Branded type for compile-time safety\n operations: BodyOperation[];\n };\n}\n\n// Job progress events (resource-level)\n// Emitted by background workers for real-time progress updates\nexport interface JobStartedEvent extends BaseEvent {\n type: 'job.started';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n totalSteps?: number; // Optional - total number of steps if known\n };\n}\n\nexport interface JobProgressEvent extends BaseEvent {\n type: 'job.progress';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n percentage: number; // 0-100\n currentStep?: string; // Human-readable current step (e.g., \"Scanning for Person\")\n processedSteps?: number; // Number of steps completed\n totalSteps?: number; // Total number of steps\n foundCount?: number; // For detection: number of entities found so far\n message?: string; // Optional status message\n progress?: any; // For new job types: full progress object\n };\n}\n\nexport interface JobCompletedEvent extends BaseEvent {\n type: 'job.completed';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n totalSteps?: number; // Total steps completed\n foundCount?: number; // For detection: total entities found\n resultResourceId?: ResourceId; // For generation: ID of generated resource (branded type)\n annotationUri?: AnnotationUri; // For generation: URI of annotation that triggered generation\n message?: string; // Optional completion message\n result?: any; // For new job types: full result object\n };\n}\n\nexport interface JobFailedEvent extends BaseEvent {\n type: 'job.failed';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n error: string; // Error message\n details?: string; // Optional detailed error information\n };\n}\n\n// Entity tag events (resource-level)\nexport interface EntityTagAddedEvent extends BaseEvent {\n type: 'entitytag.added';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n entityType: string;\n };\n}\n\nexport interface EntityTagRemovedEvent extends BaseEvent {\n type: 'entitytag.removed';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n entityType: string;\n };\n}\n\n// Entity type events (global collection)\nexport interface EntityTypeAddedEvent extends BaseEvent {\n type: 'entitytype.added';\n resourceId?: undefined; // System-level event - no resource scope\n payload: {\n entityType: string; // The entity type being added to global collection\n };\n}\n\n// Union type of all events\nexport type ResourceEvent =\n | ResourceCreatedEvent\n | ResourceClonedEvent\n | ResourceArchivedEvent\n | ResourceUnarchivedEvent\n | RepresentationAddedEvent // Multi-format support\n | RepresentationRemovedEvent // Multi-format support\n | AnnotationAddedEvent\n | AnnotationRemovedEvent\n | AnnotationBodyUpdatedEvent\n | JobStartedEvent // Job progress\n | JobProgressEvent // Job progress\n | JobCompletedEvent // Job progress\n | JobFailedEvent // Job progress\n | EntityTagAddedEvent // Resource-level\n | EntityTagRemovedEvent // Resource-level\n | EntityTypeAddedEvent; // Global collection\n\n// Extract just the event type strings from the union\nexport type ResourceEventType = ResourceEvent['type'];\n\n// System-level events (no resource scope)\nexport type SystemEvent = EntityTypeAddedEvent;\n\n// Resource-scoped events (require resourceId)\nexport type ResourceScopedEvent = Exclude<ResourceEvent, SystemEvent>;\n\n// Type guards\nexport function isResourceEvent(event: any): event is ResourceEvent {\n return event &&\n typeof event.id === 'string' &&\n typeof event.timestamp === 'string' &&\n (event.resourceId === undefined || typeof event.resourceId === 'string') && // resourceId now optional\n typeof event.type === 'string' &&\n event.type.includes('.');\n}\n\n/**\n * Type guard: Check if event is system-level (no resourceId)\n * System events affect global state, not individual resources\n */\nexport function isSystemEvent(event: ResourceEvent): event is SystemEvent {\n return event.type === 'entitytype.added';\n}\n\n/**\n * Type guard: Check if event is resource-scoped (has resourceId)\n * Resource events affect a specific resource's state\n */\nexport function isResourceScopedEvent(event: ResourceEvent): event is ResourceScopedEvent {\n return !isSystemEvent(event);\n}\n\nexport function getEventType<T extends ResourceEvent>(\n event: ResourceEvent\n): T['type'] {\n return event.type as T['type'];\n}\n\n// Event metadata for querying and indexing\nexport interface EventMetadata {\n sequenceNumber: number; // Position in the event log (source of truth for ordering)\n streamPosition: number; // Byte position in JSONL file\n timestamp: string; // When stored (for humans, not ordering)\n prevEventHash?: string; // SHA-256 of previous event (chain integrity, null for first event)\n checksum?: string; // SHA-256 of this event for integrity\n}\n\n// Optional signature for federation\nexport interface EventSignature {\n algorithm: 'ed25519'; // Signature algorithm\n publicKey: string; // User's public key (base64)\n signature: string; // Event signature (base64)\n keyId?: string; // Key identifier for rotation\n}\n\n// Event with metadata (as stored)\nexport interface StoredEvent<T extends ResourceEvent = ResourceEvent> {\n event: T;\n metadata: EventMetadata;\n signature?: EventSignature; // Optional, for federation (unused in MVP)\n}\n\n// Query filters for event retrieval\nexport interface EventQuery {\n resourceId?: ResourceId;\n userId?: string;\n eventTypes?: ResourceEvent['type'][];\n fromTimestamp?: string;\n toTimestamp?: string;\n fromSequence?: number;\n limit?: number;\n}\n\n// Annotation collections for a resource (view storage projection)\n// Annotations are NOT part of the resource - they reference the resource\nexport interface ResourceAnnotations {\n resourceId: ResourceId; // Which resource these annotations belong to (branded type)\n annotations: Annotation[]; // All annotations (highlights, references, assessments, etc.)\n version: number; // Event count for this resource's annotation stream\n updatedAt: string; // Last annotation event timestamp\n}","/**\n * Backend-specific annotation utility functions\n */\n\nimport type { components } from '@semiont/api-client';\nimport type { BodyItem } from './events';\n\ntype Annotation = components['schemas']['Annotation'];\n\n/**\n * Check if two body items match (for remove/replace operations)\n * Matches by type, value/source, and purpose fields\n */\nexport function bodyItemsMatch(item1: BodyItem, item2: BodyItem): boolean {\n // Type must match\n if (item1.type !== item2.type) {\n return false;\n }\n\n // Purpose must match\n if (item1.purpose !== item2.purpose) {\n return false;\n }\n\n // For TextualBody, match by value\n if (item1.type === 'TextualBody' && item2.type === 'TextualBody') {\n return item1.value === item2.value;\n }\n\n // For SpecificResource, match by source\n if (item1.type === 'SpecificResource' && item2.type === 'SpecificResource') {\n return item1.source === item2.source;\n }\n\n return false;\n}\n\n/**\n * Find a body item in an array\n * Returns the index of the first matching item, or -1 if not found\n */\nexport function findBodyItem(body: Annotation['body'], targetItem: BodyItem): number {\n if (!Array.isArray(body)) {\n return -1;\n }\n\n for (let i = 0; i < body.length; i++) {\n const item = body[i];\n\n // Check if this is a valid body item that can be matched\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'purpose' in item\n ) {\n const itemType = (item as { type: unknown }).type;\n const itemPurpose = (item as { purpose: unknown }).purpose;\n\n // Type and purpose must match\n if (itemType !== targetItem.type || itemPurpose !== targetItem.purpose) {\n continue;\n }\n\n // For TextualBody, match by value\n if (targetItem.type === 'TextualBody' && 'value' in item) {\n const itemValue = (item as { value: unknown }).value;\n if (itemValue === targetItem.value) {\n return i;\n }\n }\n\n // For SpecificResource, match by source\n if (targetItem.type === 'SpecificResource' && 'source' in item) {\n const itemSource = (item as { source: unknown }).source;\n if (itemSource === targetItem.source) {\n return i;\n }\n }\n }\n }\n\n return -1;\n}\n","/**\n * Common type guard utilities\n */\n\n/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Check if value is a number (not NaN)\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !isNaN(value);\n}\n\n/**\n * Check if value is an object (not null, not array)\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Check if value is null\n */\nexport function isNull(value: unknown): value is null {\n return value === null;\n}\n\n/**\n * Check if value is undefined\n */\nexport function isUndefined(value: unknown): value is undefined {\n return value === undefined;\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNullish(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Check if value is defined (not null or undefined)\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}","/**\n * Cryptographic utilities\n */\n\nimport { createHash, randomBytes } from 'crypto';\n\n/**\n * Calculate SHA-256 checksum of content\n * @param content The content to hash\n * @returns Hex-encoded SHA-256 hash\n */\nexport function calculateChecksum(content: string | Buffer): string {\n const hash = createHash('sha256');\n hash.update(content);\n return hash.digest('hex');\n}\n\n/**\n * Verify content against a checksum\n * @param content The content to verify\n * @param checksum The expected checksum\n * @returns True if content matches checksum\n */\nexport function verifyChecksum(content: string | Buffer, checksum: string): boolean {\n return calculateChecksum(content) === checksum;\n}\n\n/**\n * Generate a random ID (12 character hex string)\n * Similar to MongoDB ObjectId but simpler\n */\nexport function generateId(): string {\n return randomBytes(6).toString('hex');\n}\n\n/**\n * Generate a UUID v4-like ID (without dashes)\n */\nexport function generateUuid(): string {\n return randomBytes(16).toString('hex');\n}\n\n/**\n * Generate a secure random token\n * @param bytes Number of random bytes (default 32)\n * @returns Base64 encoded random token\n */\nexport function generateToken(bytes: number = 32): string {\n return randomBytes(bytes).toString('base64url');\n}","/**\n * Common error classes\n */\n\n/**\n * Base error class for Semiont applications\n */\nexport class SemiontError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: Record<string, any>\n ) {\n super(message);\n this.name = 'SemiontError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends SemiontError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Error thrown by scripts\n */\nexport class ScriptError extends SemiontError {\n constructor(message: string, code: string = 'SCRIPT_ERROR', details?: Record<string, any>) {\n super(message, code, details);\n this.name = 'ScriptError';\n }\n}\n\n/**\n * Error thrown when a resource is not found\n */\nexport class NotFoundError extends SemiontError {\n constructor(resource: string, id?: string) {\n const message = id ? `${resource} with id '${id}' not found` : `${resource} not found`;\n super(message, 'NOT_FOUND', { resource, id });\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Error thrown when user is not authorized\n */\nexport class UnauthorizedError extends SemiontError {\n constructor(message: string = 'Unauthorized', details?: Record<string, any>) {\n super(message, 'UNAUTHORIZED', details);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * Error thrown when operation would conflict with existing data\n */\nexport class ConflictError extends SemiontError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CONFLICT', details);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * API Error class for handling HTTP errors\n * Used by API clients to represent failed HTTP requests\n */\nexport class APIError extends Error {\n constructor(\n public status: number,\n public data: any,\n message?: string\n ) {\n super(message || `API Error: ${status}`);\n this.name = 'APIError';\n Error.captureStackTrace(this, this.constructor);\n }\n}","/**\n * DID (Decentralized Identifier) and W3C Agent utilities\n *\n * Provides utilities for working with DID:WEB identifiers and converting\n * between user representations and W3C Web Annotation Agent objects.\n */\n\nimport type { components } from '@semiont/api-client';\n\ntype Agent = components['schemas']['Agent'];\n\n/**\n * Convert a user object to a DID:WEB identifier\n *\n * Format: did:web:domain.com:users:userId\n * Example: did:web:example.com:users:abc123\n *\n * This is used for W3C Web Annotation compliance and federation readiness.\n *\n * @param user - User object with id and domain\n * @returns DID:WEB identifier string\n */\nexport function userToDid(user: { id: string; domain: string }): string {\n return `did:web:${user.domain}:users:${user.id}`;\n}\n\n/**\n * Convert a user object to a W3C Agent object with DID:WEB identifier\n *\n * Creates a full Agent object for W3C Web Annotation compliance.\n * Includes DID:WEB identifier, type, and name.\n *\n * @param user - User object with id, domain, name, and email\n * @returns W3C Agent object\n */\nexport function userToAgent(user: {\n id: string;\n domain: string;\n name: string | null;\n email: string;\n}): Agent {\n return {\n type: 'Person' as const,\n id: userToDid(user),\n name: user.name || user.email,\n };\n}\n\n/**\n * Convert a DID string to a minimal W3C Agent object\n *\n * Used when reconstructing annotations from events where only the DID is available.\n * Creates a minimal Agent with just the required fields (id, type).\n * Name is derived from the DID for display purposes.\n *\n * @param did - DID:WEB identifier string\n * @returns Minimal W3C Agent object\n */\nexport function didToAgent(did: string): Agent {\n // Extract user ID from DID format: did:web:domain.com:users:userId\n const parts = did.split(':');\n const userId = parts[parts.length - 1] || 'unknown';\n\n return {\n type: 'Person' as const,\n id: did,\n name: userId, // Use user ID as name since we don't have full user data\n };\n}\n","/**\n * Configuration Error Class\n * \n * Custom error class for configuration validation and loading errors.\n * Provides structured error information with helpful suggestions.\n */\n\nexport class ConfigurationError extends Error {\n public override readonly cause?: Error;\n\n constructor(\n message: string,\n public environment?: string,\n public suggestion?: string,\n cause?: Error\n ) {\n super(message);\n this.name = 'ConfigurationError';\n this.cause = cause;\n }\n \n /**\n * Format the error nicely for CLI output\n */\n override toString(): string {\n let output = `❌ ${this.message}`;\n if (this.environment) {\n output += `\\n Environment: ${this.environment}`;\n }\n if (this.suggestion) {\n output += `\\n 💡 Suggestion: ${this.suggestion}`;\n }\n return output;\n }\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://semiont.org/schemas/config.json\",\n \"definitions\": {\n \"PlatformType\": {\n \"type\": \"string\",\n \"enum\": [\n \"posix\",\n \"container\",\n \"aws\",\n \"external\"\n ]\n },\n \"ServicePlatformConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"$ref\": \"#/definitions/PlatformType\"\n }\n },\n \"required\": [\n \"type\"\n ]\n },\n \"ResourceRequirements\": {\n \"type\": \"object\",\n \"properties\": {\n \"cpu\": {\n \"type\": \"string\"\n },\n \"memory\": {\n \"type\": \"string\"\n },\n \"gpu\": {\n \"type\": \"integer\"\n },\n \"gpus\": {\n \"type\": \"integer\"\n },\n \"replicas\": {\n \"type\": \"integer\"\n },\n \"ephemeralStorage\": {\n \"type\": \"string\"\n },\n \"memoryReservation\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false\n },\n \"SecurityRequirements\": {\n \"type\": \"object\",\n \"properties\": {\n \"readOnlyRootFilesystem\": {\n \"type\": \"boolean\"\n },\n \"runAsNonRoot\": {\n \"type\": \"boolean\"\n },\n \"runAsUser\": {\n \"type\": \"integer\"\n },\n \"runAsGroup\": {\n \"type\": \"integer\"\n },\n \"capabilities\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"add\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"drop\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n },\n \"privileged\": {\n \"type\": \"boolean\"\n },\n \"allowPrivilegeEscalation\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"BuildRequirements\": {\n \"type\": \"object\",\n \"properties\": {\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"BackendServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"devMode\": {\n \"type\": \"boolean\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"publicURL\": {\n \"type\": \"string\"\n },\n \"corsOrigin\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"cpu\": {\n \"type\": \"string\"\n },\n \"memory\": {\n \"type\": \"string\"\n },\n \"semiontRepo\": {\n \"type\": \"string\"\n },\n \"databaseUrl\": {\n \"type\": \"string\"\n },\n \"projectRoot\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"redisUrl\": {\n \"type\": \"string\"\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"port\",\n \"publicURL\",\n \"corsOrigin\"\n ],\n \"additionalProperties\": false\n },\n \"FrontendServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"devMode\": {\n \"type\": \"boolean\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"siteName\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"semiontRepo\": {\n \"type\": \"string\"\n },\n \"projectRoot\": {\n \"type\": \"string\"\n },\n \"databaseUrl\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"publicURL\": {\n \"type\": \"string\"\n },\n \"allowedOrigins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"port\",\n \"siteName\"\n ],\n \"additionalProperties\": false\n },\n \"ProxyServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"envoy\", \"nginx\", \"haproxy\"],\n \"default\": \"envoy\"\n },\n \"port\": {\n \"type\": \"integer\",\n \"default\": 8080\n },\n \"adminPort\": {\n \"type\": \"integer\",\n \"default\": 9901\n },\n \"backendPort\": {\n \"type\": \"integer\",\n \"default\": 4000\n },\n \"frontendPort\": {\n \"type\": \"integer\",\n \"default\": 3000\n },\n \"image\": {\n \"type\": \"string\",\n \"default\": \"envoyproxy/envoy:v1.28-latest\"\n },\n \"configPath\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\",\n \"port\"\n ],\n \"additionalProperties\": false\n },\n \"DatabaseServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"host\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"user\": {\n \"type\": \"string\"\n },\n \"username\": {\n \"type\": \"string\"\n },\n \"password\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\"\n },\n \"storageSize\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\",\n \"host\",\n \"port\"\n ],\n \"additionalProperties\": false\n },\n \"GraphDatabaseType\": {\n \"type\": \"string\",\n \"enum\": [\n \"neo4j\",\n \"janusgraph\",\n \"neptune\",\n \"memory\"\n ]\n },\n \"GraphServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"$ref\": \"#/definitions/GraphDatabaseType\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"uri\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"username\": {\n \"type\": \"string\"\n },\n \"password\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\"\n },\n \"host\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"storage\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"string\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"region\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"janusgraphVersion\": {\n \"type\": \"string\"\n },\n \"javaOptions\": {\n \"type\": \"string\"\n },\n \"heapSize\": {\n \"type\": \"string\"\n },\n \"pageCacheSize\": {\n \"type\": \"string\"\n },\n \"noAuth\": {\n \"type\": \"boolean\"\n },\n \"dataPath\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\"\n ],\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"type\": {\n \"const\": \"neo4j\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"uri\",\n \"username\",\n \"password\",\n \"database\"\n ]\n }\n }\n ],\n \"additionalProperties\": false\n },\n \"FilesystemServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"path\"\n ],\n \"additionalProperties\": false\n },\n \"InferenceServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"maxTokens\": {\n \"type\": \"integer\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"baseURL\": {\n \"type\": \"string\"\n },\n \"apiKey\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"organization\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\",\n \"apiKey\"\n ],\n \"additionalProperties\": false\n },\n \"McpServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\"\n ],\n \"additionalProperties\": false\n },\n \"ServicesConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"backend\": {\n \"$ref\": \"#/definitions/BackendServiceConfig\"\n },\n \"frontend\": {\n \"$ref\": \"#/definitions/FrontendServiceConfig\"\n },\n \"database\": {\n \"$ref\": \"#/definitions/DatabaseServiceConfig\"\n },\n \"graph\": {\n \"$ref\": \"#/definitions/GraphServiceConfig\"\n },\n \"filesystem\": {\n \"$ref\": \"#/definitions/FilesystemServiceConfig\"\n },\n \"inference\": {\n \"$ref\": \"#/definitions/InferenceServiceConfig\"\n },\n \"mcp\": {\n \"$ref\": \"#/definitions/McpServiceConfig\"\n },\n \"proxy\": {\n \"$ref\": \"#/definitions/ProxyServiceConfig\"\n }\n },\n \"additionalProperties\": true\n },\n \"SiteConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"siteName\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Display name for the site\"\n },\n \"domain\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Primary domain for the site\"\n },\n \"adminEmail\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"Administrator email address\"\n },\n \"supportEmail\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"Support email address (optional)\"\n },\n \"oauthAllowedDomains\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1,\n \"description\": \"Email domains allowed for OAuth authentication\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"additionalProperties\": false\n },\n \"AppConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"features\": {\n \"type\": \"object\",\n \"properties\": {\n \"enableAnalytics\": {\n \"type\": \"boolean\"\n },\n \"enableMaintenanceMode\": {\n \"type\": \"boolean\"\n },\n \"enableDebugLogging\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"security\": {\n \"type\": \"object\",\n \"properties\": {\n \"sessionTimeout\": {\n \"type\": \"integer\",\n \"minimum\": 60,\n \"description\": \"Session timeout in seconds\"\n },\n \"maxLoginAttempts\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Maximum failed login attempts before lockout\"\n },\n \"corsAllowedOrigins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"enableLocalAuth\": {\n \"type\": \"boolean\",\n \"description\": \"Enable local username/password authentication\"\n },\n \"jwtSecret\": {\n \"type\": \"string\",\n \"minLength\": 32,\n \"description\": \"JWT signing secret (base64 encoded, 32+ bytes)\"\n }\n },\n \"additionalProperties\": false\n },\n \"performance\": {\n \"type\": \"object\",\n \"properties\": {\n \"enableCaching\": {\n \"type\": \"boolean\"\n },\n \"cacheTimeout\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Cache timeout in seconds\"\n },\n \"maxRequestSize\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9]+(kb|mb|gb)$\",\n \"description\": \"Maximum request size (e.g., '10mb')\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false\n },\n \"EnvironmentConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"_comment\": {\n \"type\": \"string\",\n \"description\": \"Optional comment for documentation\"\n },\n \"_metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"environment\": {\n \"type\": \"string\"\n },\n \"projectRoot\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"environment\",\n \"projectRoot\"\n ]\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Environment name\"\n },\n \"platform\": {\n \"type\": \"object\",\n \"properties\": {\n \"default\": {\n \"$ref\": \"#/definitions/PlatformType\"\n }\n }\n },\n \"services\": {\n \"$ref\": \"#/definitions/ServicesConfig\"\n },\n \"site\": {\n \"$ref\": \"#/definitions/SiteConfig\"\n },\n \"app\": {\n \"$ref\": \"#/definitions/AppConfig\"\n },\n \"env\": {\n \"type\": \"object\",\n \"properties\": {\n \"NODE_ENV\": {\n \"type\": \"string\",\n \"enum\": [\n \"development\",\n \"production\",\n \"test\"\n ]\n }\n },\n \"additionalProperties\": true\n },\n \"logLevel\": {\n \"type\": \"string\",\n \"enum\": [\n \"error\",\n \"warn\",\n \"info\",\n \"http\",\n \"debug\"\n ],\n \"description\": \"Logging verbosity level\"\n },\n \"deployment\": {\n \"type\": \"object\",\n \"properties\": {\n \"imageTagStrategy\": {\n \"type\": \"string\",\n \"enum\": [\n \"mutable\",\n \"immutable\",\n \"git-hash\"\n ]\n }\n }\n }\n },\n \"required\": [\n \"services\"\n ],\n \"additionalProperties\": false\n },\n \"SemiontConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+$\",\n \"description\": \"Config file version (semver)\"\n },\n \"project\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Project name\"\n },\n \"site\": {\n \"$ref\": \"#/definitions/SiteConfig\"\n },\n \"app\": {\n \"$ref\": \"#/definitions/AppConfig\"\n },\n \"services\": {\n \"$ref\": \"#/definitions/ServicesConfig\"\n }\n },\n \"required\": [\n \"version\",\n \"project\",\n \"site\"\n ],\n \"additionalProperties\": false\n }\n }\n}\n","/**\n * Config Schema Validator\n *\n * Validates configuration data against JSON Schema using Ajv (JSON Schema validator).\n * Provides runtime validation for semiont.json and environment config files.\n */\n\nimport Ajv, { type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport configSchema from './config.schema.json' with { type: 'json' };\n\n// Initialize Ajv with config-compatible settings\nconst ajv = new Ajv({\n allErrors: true, // Return all errors, not just the first one\n coerceTypes: true, // Coerce types (e.g., \"123\" -> 123)\n removeAdditional: false, // Don't remove additional properties\n useDefaults: true, // Apply default values from schema\n strict: false\n});\n\n// Add format validators (email, uri, date-time, etc.)\naddFormats(ajv);\n\n// Load schema\najv.addSchema(configSchema, 'config');\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ErrorObject[] | null;\n errorMessage?: string;\n}\n\n/**\n * Validate semiont.json config\n */\nexport function validateSemiontConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema('config#/definitions/SemiontConfig');\n if (!validate) {\n throw new Error('SemiontConfig schema not found');\n }\n\n const valid = validate(data);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage: formatErrors(validate.errors || [])\n };\n }\n\n return { valid: true, errors: null };\n}\n\n/**\n * Validate environment config (environments/*.json)\n */\nexport function validateEnvironmentConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema('config#/definitions/EnvironmentConfig');\n if (!validate) {\n throw new Error('EnvironmentConfig schema not found');\n }\n\n const valid = validate(data);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage: formatErrors(validate.errors || [])\n };\n }\n\n return { valid: true, errors: null };\n}\n\n/**\n * Validate site config\n */\nexport function validateSiteConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema('config#/definitions/SiteConfig');\n if (!validate) {\n throw new Error('SiteConfig schema not found');\n }\n\n const valid = validate(data);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage: formatErrors(validate.errors || [])\n };\n }\n\n return { valid: true, errors: null };\n}\n\n/**\n * Format validation errors into human-readable message\n */\nexport function formatErrors(errors: ErrorObject[]): string {\n if (errors.length === 0) return 'Validation failed';\n\n const messages = errors.map(err => {\n const path = err.instancePath || 'root';\n const message = err.message || 'validation error';\n\n if (err.keyword === 'required' && 'missingProperty' in err.params) {\n return `Missing required property: ${err.params.missingProperty}`;\n }\n\n if (err.keyword === 'type' && 'type' in err.params) {\n return `${path}: ${message} (expected ${err.params.type})`;\n }\n\n if (err.keyword === 'enum' && 'allowedValues' in err.params) {\n return `${path}: must be one of [${(err.params.allowedValues as string[]).join(', ')}]`;\n }\n\n if (err.keyword === 'format') {\n return `${path}: invalid format (${message})`;\n }\n\n if (err.keyword === 'minLength' || err.keyword === 'minItems') {\n return `${path}: ${message}`;\n }\n\n return `${path}: ${message}`;\n });\n\n return messages.join('; ');\n}\n","/**\n * Environment Loader Module\n * \n * Responsible for loading and merging environment configurations.\n * Handles semiont.json base config and environment-specific overrides.\n */\n\nimport * as path from 'path';\nimport { ConfigurationError } from './configuration-error';\nimport { PlatformType } from './platform-types';\nimport { isObject } from '../index';\nimport { validateEnvironmentConfig } from './config-validator';\nimport type {\n EnvironmentConfig,\n SiteConfig,\n AppConfig,\n SemiontConfig,\n ServicesConfig,\n BackendServiceConfig,\n FrontendServiceConfig,\n DatabaseServiceConfig,\n GraphServiceConfig,\n FilesystemServiceConfig,\n InferenceServiceConfig,\n ServicePlatformConfig\n} from './config.types';\n\n/**\n * Re-export generated types from JSON Schema\n * These types are automatically generated from config.schema.json\n */\nexport type {\n EnvironmentConfig,\n SiteConfig,\n AppConfig,\n SemiontConfig,\n PlatformType,\n ServicesConfig,\n BackendServiceConfig,\n FrontendServiceConfig,\n DatabaseServiceConfig,\n GraphServiceConfig,\n FilesystemServiceConfig,\n InferenceServiceConfig,\n ServicePlatformConfig\n};\n\n/**\n * Generic service configuration\n * Platform-specific fields should be accessed through platform-specific interfaces\n */\nexport interface ServiceConfig {\n platform?: {\n type: PlatformType;\n };\n // Generic fields that apply across platforms\n port?: number;\n name?: string;\n // Platform-specific fields are loosely typed here\n // Platforms should validate and type these properly\n [key: string]: any;\n}\n\nexport interface AWSConfig {\n region: string;\n accountId: string;\n certificateArn?: string;\n hostedZoneId?: string;\n rootDomain?: string;\n stacks?: {\n data?: string;\n app?: string;\n };\n database?: {\n name?: string;\n instanceClass?: string;\n allocatedStorage?: number;\n backupRetentionDays?: number;\n multiAZ?: boolean;\n };\n ecs?: {\n desiredCount?: number;\n minCapacity?: number;\n maxCapacity?: number;\n };\n monitoring?: {\n enableDetailedMonitoring?: boolean;\n logRetentionDays?: number;\n };\n}\n\n/**\n * Deep merge utility for configuration objects\n * Pure function - no side effects\n */\nexport function deepMerge(target: any, ...sources: any[]): any {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n}\n\n\n/**\n * Recursively resolve environment variable placeholders in configuration\n * Replaces ${VAR_NAME} with the value from the provided env object\n * Pure function - accepts env as parameter instead of using process.env\n *\n * @param obj - Configuration object to process\n * @param env - Environment variables object\n * @returns Configuration with resolved environment variables\n */\nexport function resolveEnvVars(obj: any, env: Record<string, string | undefined>): any {\n if (typeof obj === 'string') {\n // Replace ${VAR_NAME} with actual environment variable value\n return obj.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n return env[varName] || match;\n });\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => resolveEnvVars(item, env));\n }\n\n if (obj && typeof obj === 'object') {\n const resolved: any = {};\n for (const key in obj) {\n resolved[key] = resolveEnvVars(obj[key], env);\n }\n return resolved;\n }\n\n return obj;\n}\n\n/**\n * Parse and merge configuration files\n * Pure function - accepts file contents as strings instead of reading from filesystem\n *\n * @param baseContent - Contents of semiont.json (null if file doesn't exist)\n * @param envContent - Contents of environment-specific JSON file\n * @param env - Environment variables object\n * @param environment - Environment name\n * @param projectRoot - Project root path (for metadata only)\n * @returns Merged and validated environment configuration\n * @throws ConfigurationError if parsing or validation fails\n */\nexport function parseAndMergeConfigs(\n baseContent: string | null,\n envContent: string,\n env: Record<string, string | undefined>,\n environment: string,\n projectRoot: string\n): EnvironmentConfig {\n try {\n // Parse base config\n let baseConfig: any = {};\n if (baseContent) {\n baseConfig = JSON.parse(baseContent);\n }\n\n // Parse environment config\n const envConfig = JSON.parse(envContent);\n\n // Merge configurations: base defaults -> environment config\n const merged = deepMerge(\n {},\n { site: baseConfig.site }, // Site config from semiont.json\n baseConfig.defaults || {}, // Default config from semiont.json\n envConfig // Environment-specific overrides\n );\n\n // Resolve environment variables in the merged configuration\n const resolved = resolveEnvVars(merged, env);\n\n // Ensure services exists (even if empty)\n if (!resolved.services) {\n resolved.services = {};\n }\n\n // Validate NODE_ENV if specified\n if (resolved.env?.NODE_ENV) {\n const validNodeEnv = ['development', 'production', 'test'];\n if (!validNodeEnv.includes(resolved.env.NODE_ENV)) {\n throw new ConfigurationError(\n `Invalid NODE_ENV value: ${resolved.env.NODE_ENV}`,\n environment,\n `NODE_ENV must be one of: ${validNodeEnv.join(', ')}`\n );\n }\n }\n\n // Add metadata about where this config came from\n const configWithMetadata = {\n ...resolved,\n _metadata: {\n environment,\n projectRoot\n }\n };\n\n // Validate with AJV\n const validationResult = validateEnvironmentConfig(configWithMetadata);\n\n if (!validationResult.valid) {\n throw new ConfigurationError(\n `Invalid environment configuration: ${validationResult.errorMessage}`,\n environment,\n `Fix the validation errors in your environments/${environment}.json file`\n );\n }\n\n return configWithMetadata as EnvironmentConfig;\n } catch (error) {\n if (error instanceof ConfigurationError) {\n throw error; // Re-throw our custom errors\n }\n\n if (error instanceof SyntaxError && error.message.includes('JSON')) {\n throw new ConfigurationError(\n `Invalid JSON syntax in configuration file`,\n environment,\n `Check for missing commas, quotes, or brackets. Use a JSON validator to verify syntax.`\n );\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new ConfigurationError(\n `Failed to parse environment configuration: ${message}`,\n environment,\n `Check the configuration files are valid JSON`\n );\n }\n}\n\n/**\n * Get NODE_ENV value from environment config\n *\n * @param config - Environment configuration\n * @returns NODE_ENV value (defaults to 'development' if not specified)\n */\nexport function getNodeEnvForEnvironment(config: EnvironmentConfig): 'development' | 'production' | 'test' {\n const nodeEnv = config.env?.NODE_ENV;\n\n // Default to 'development' if not specified\n return nodeEnv || 'development';\n}\n\n/**\n * List environment names from filenames\n * Pure function - accepts array of filenames instead of reading from filesystem\n *\n * @param files - Array of filenames from environments directory\n * @returns Sorted array of environment names\n */\nexport function listEnvironmentNames(files: string[]): string[] {\n return files\n .filter(file => file.endsWith('.json'))\n .map(file => path.basename(file, '.json'))\n .sort();\n}\n\n/**\n * Type guard to check if config has AWS settings\n * \n * @param config - Environment configuration\n * @returns True if AWS configuration is present\n */\nexport function hasAWSConfig(config: EnvironmentConfig): config is EnvironmentConfig & { aws: AWSConfig } {\n return !!(config as any).aws && !!(config as any).aws.region;\n}\n\n/**\n * Display configuration for debugging\n * \n * @param config - Configuration to display\n */\nexport function displayConfiguration(config: EnvironmentConfig): void {\n console.log('Environment Configuration:');\n console.log(JSON.stringify(config, null, 2));\n}","/**\n * Project Discovery Module\n * \n * Responsible for finding the Semiont project root directory.\n * Looks for semiont.json or environments directory to identify a valid project.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { ConfigurationError } from './configuration-error';\n\n/**\n * Find project root - returns SEMIONT_ROOT environment variable\n *\n * @returns The absolute path to the project root\n * @throws ConfigurationError if SEMIONT_ROOT is not set or invalid\n */\nexport function findProjectRoot(): string {\n const root = process.env.SEMIONT_ROOT;\n\n if (!root) {\n throw new ConfigurationError(\n 'SEMIONT_ROOT environment variable is not set',\n undefined,\n 'Set SEMIONT_ROOT to your project directory, or use the semiont CLI which sets it automatically'\n );\n }\n\n if (!fs.existsSync(root)) {\n throw new ConfigurationError(\n `SEMIONT_ROOT points to non-existent directory: ${root}`,\n undefined,\n 'Check that SEMIONT_ROOT environment variable is set correctly'\n );\n }\n\n // Verify it's a valid project root\n if (!isProjectRoot(root)) {\n throw new ConfigurationError(\n `SEMIONT_ROOT does not point to a valid Semiont project: ${root}`,\n undefined,\n 'Ensure SEMIONT_ROOT points to a directory containing semiont.json or environments/'\n );\n }\n\n return root;\n}\n\n/**\n * Check if a path looks like a Semiont project root\n * \n * @param projectPath - Path to check\n * @returns True if path contains semiont.json or environments directory\n */\nexport function isProjectRoot(projectPath: string): boolean {\n return fs.existsSync(path.join(projectPath, 'semiont.json')) ||\n fs.existsSync(path.join(projectPath, 'environments'));\n}\n\n/**\n * Get the path to the environments directory\n * \n * @param projectRoot - Project root directory (optional, will find if not provided)\n * @returns Path to environments directory\n */\nexport function getEnvironmentsPath(projectRoot?: string): string {\n const root = projectRoot || findProjectRoot();\n return path.join(root, 'environments');\n}\n\n/**\n * Get the path to semiont.json\n * \n * @param projectRoot - Project root directory (optional, will find if not provided)\n * @returns Path to semiont.json\n */\nexport function getSemiontConfigPath(projectRoot?: string): string {\n const root = projectRoot || findProjectRoot();\n return path.join(root, 'semiont.json');\n}","/**\n * Filesystem-based wrapper for environment loading\n *\n * This module provides convenient filesystem-based wrappers around the pure\n * configuration functions. These are intended for application code that needs\n * to load config from disk.\n *\n * The pure functions (parseAndMergeConfigs, etc.) remain testable without\n * filesystem mocking.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { parseAndMergeConfigs, listEnvironmentNames, type EnvironmentConfig } from './environment-loader';\nimport { findProjectRoot } from './project-discovery';\nimport { ConfigurationError } from './configuration-error';\n\n/**\n * Load environment configuration from filesystem\n * Convenience wrapper around parseAndMergeConfigs for application code\n *\n * @param projectRoot - Absolute path to project directory containing semiont.json\n * @param environment - Environment name (must match a file in environments/)\n * @returns Merged environment configuration\n * @throws ConfigurationError if files are missing or invalid\n */\nexport function loadEnvironmentConfig(projectRoot: string, environment: string): EnvironmentConfig {\n // Load base semiont.json\n const baseConfigPath = path.join(projectRoot, 'semiont.json');\n const baseContent = fs.existsSync(baseConfigPath)\n ? fs.readFileSync(baseConfigPath, 'utf-8')\n : null;\n\n // Load environment-specific config\n const envPath = path.join(projectRoot, 'environments', `${environment}.json`);\n if (!fs.existsSync(envPath)) {\n throw new ConfigurationError(\n `Environment configuration missing: ${envPath}`,\n environment,\n `Create the configuration file or use: semiont init`\n );\n }\n\n const envContent = fs.readFileSync(envPath, 'utf-8');\n\n // Use pure function with filesystem inputs\n return parseAndMergeConfigs(baseContent, envContent, process.env, environment, projectRoot);\n}\n\n/**\n * Get available environments by scanning environments directory\n * Convenience wrapper around listEnvironmentNames for application code\n *\n * @returns Array of environment names\n */\nexport function getAvailableEnvironments(): string[] {\n try {\n const projectRoot = findProjectRoot();\n const configDir = path.join(projectRoot, 'environments');\n\n if (!fs.existsSync(configDir)) {\n return [];\n }\n\n const files = fs.readdirSync(configDir);\n return listEnvironmentNames(files);\n } catch (error) {\n return [];\n }\n}\n\n/**\n * Check if an environment exists\n *\n * @param environment - Environment name to check\n * @returns True if environment exists\n */\nexport function isValidEnvironment(environment: string): boolean {\n return getAvailableEnvironments().includes(environment);\n}\n","/**\n * Environment validation utilities\n */\n\nimport { getAvailableEnvironments } from './environment-loader-fs';\n\nexport type Environment = string; // Allow any environment name discovered from filesystem\n\n/**\n * Type guard to check if a string is a valid Environment\n */\nexport function isValidEnvironment(value: string | undefined): value is Environment {\n if (!value) return false;\n // Use dynamic check from filesystem to support custom environments like 'production'\n return getAvailableEnvironments().includes(value);\n}\n\n/**\n * Parse environment string to Environment type\n * @param value - The environment string to parse\n * @returns Valid Environment type\n * @throws Error if environment is invalid or not provided\n */\nexport function parseEnvironment(value: string | undefined): Environment {\n if (!value) {\n throw new Error('Environment is required');\n }\n if (!isValidEnvironment(value)) {\n const availableEnvs = getAvailableEnvironments();\n throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvs.join(', ')}`);\n }\n return value;\n}\n\n/**\n * Validate and return environment or throw error\n * @param value - The environment string to validate\n * @throws Error if environment is invalid\n */\nexport function validateEnvironment(value: string | undefined): Environment {\n if (!value) {\n throw new Error('Environment is required');\n }\n if (!isValidEnvironment(value)) {\n const availableEnvs = getAvailableEnvironments();\n throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvs.join(', ')}`);\n }\n return value;\n}","/**\n * Platform Types Module\n *\n * Re-exports PlatformType from schema-generated types.\n * Platforms represent WHERE services run (infrastructure targets).\n */\n\nimport { PlatformType as SchemaPlatformType } from './config.types';\n\n/**\n * Platform type literals from JSON Schema\n * These represent the infrastructure targets where services can be deployed\n */\nexport type PlatformType = SchemaPlatformType;\n\n/**\n * Type guard to check if a string is a valid platform type\n *\n * @param value - Value to check\n * @returns True if value is a valid PlatformType\n */\nexport function isValidPlatformType(value: string): value is PlatformType {\n return ['aws', 'container', 'posix', 'external'].includes(value);\n}\n\n/**\n * Get all valid platform types\n *\n * @returns Array of all platform types\n */\nexport function getAllPlatformTypes(): PlatformType[] {\n return ['aws', 'container', 'posix', 'external'];\n}","/**\n * @semiont/core\n *\n * Core domain logic and utilities for the Semiont semantic knowledge platform.\n * For OpenAPI types, import directly from @semiont/api-client.\n */\n\n// NOTE: OpenAPI types are NOT re-exported from @semiont/core.\n// Import types directly from @semiont/api-client where needed:\n// import type { components } from '@semiont/api-client';\n// type Annotation = components['schemas']['Annotation'];\n\n// Creation methods\nexport { CREATION_METHODS } from './creation-methods';\nexport type { CreationMethod } from './creation-methods';\n\n// Identifier types (only IDs - URIs are in @semiont/api-client)\nexport type { ResourceId, AnnotationId, UserId } from './identifiers';\nexport {\n resourceId,\n annotationId,\n userId,\n isResourceId,\n isAnnotationId,\n} from './identifiers';\n\n// URI utilities\nexport {\n resourceIdToURI,\n uriToResourceId,\n annotationIdToURI,\n uriToAnnotationId,\n} from './uri-utils';\n\n// Graph types\nexport type {\n GraphConnection,\n GraphPath,\n EntityTypeStats,\n} from './graph';\n\n// Event types\nexport type {\n BaseEvent,\n ResourceEvent,\n ResourceEventType,\n SystemEvent,\n ResourceScopedEvent,\n ResourceCreatedEvent,\n ResourceClonedEvent,\n ResourceArchivedEvent,\n ResourceUnarchivedEvent,\n RepresentationAddedEvent,\n RepresentationRemovedEvent,\n AnnotationAddedEvent,\n AnnotationRemovedEvent,\n AnnotationBodyUpdatedEvent,\n JobStartedEvent,\n JobProgressEvent,\n JobCompletedEvent,\n JobFailedEvent,\n BodyOperation,\n BodyItem,\n EntityTagAddedEvent,\n EntityTagRemovedEvent,\n EventMetadata,\n EventSignature,\n StoredEvent,\n EventQuery,\n ResourceAnnotations,\n} from './events';\nexport {\n isResourceEvent,\n isSystemEvent,\n isResourceScopedEvent,\n getEventType,\n} from './events';\n\n// Backend-specific annotation utilities\nexport { bodyItemsMatch, findBodyItem } from './annotation-utils';\n\n// Resource types\nexport type { UpdateResourceInput, ResourceFilter } from './resource-types';\n\n// Annotation types\nexport type { AnnotationCategory, CreateAnnotationInternal } from './annotation-types';\n\n// Auth types\nexport type { GoogleAuthRequest } from './auth-types';\n\n// Utility functions\nexport * from './type-guards';\nexport * from './crypto';\nexport * from './errors';\nexport * from './did-utils';\n\n// Configuration loading - Pure functions (testable without filesystem)\nexport {\n deepMerge,\n resolveEnvVars,\n parseAndMergeConfigs,\n listEnvironmentNames,\n getNodeEnvForEnvironment,\n hasAWSConfig,\n displayConfiguration,\n // Types\n type EnvironmentConfig,\n type ServiceConfig,\n type AWSConfig,\n type SiteConfig,\n type AppConfig,\n} from './config/environment-loader';\n\n// Configuration loading - Filesystem wrappers (for application code)\nexport {\n loadEnvironmentConfig,\n getAvailableEnvironments,\n isValidEnvironment,\n} from './config/environment-loader-fs';\n\nexport {\n parseEnvironment,\n validateEnvironment,\n type Environment,\n} from './config/environment-validator';\nexport {\n formatErrors,\n validateSemiontConfig,\n validateEnvironmentConfig,\n validateSiteConfig,\n type ValidationResult,\n} from './config/config-validator';\nexport { ConfigurationError } from './config/configuration-error';\nexport type { ProxyServiceConfig } from './config/config.types';\nexport {\n findProjectRoot,\n isProjectRoot,\n getEnvironmentsPath,\n getSemiontConfigPath,\n} from './config/project-discovery';\nexport {\n type PlatformType,\n isValidPlatformType,\n getAllPlatformTypes,\n} from './config/platform-types';\n\n// Schema-generated configuration types\nexport type {\n BackendServiceConfig,\n FrontendServiceConfig,\n DatabaseServiceConfig,\n GraphServiceConfig,\n FilesystemServiceConfig,\n InferenceServiceConfig,\n McpServiceConfig,\n ServicesConfig,\n SemiontConfig,\n GraphDatabaseType,\n ServicePlatformConfig\n} from './config/config.types';\n\n// Version information\nexport const CORE_TYPES_VERSION = '0.1.0';\nexport const SDK_VERSION = '0.1.0';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/creation-methods.ts","../src/identifiers.ts","../src/uri-utils.ts","../src/events.ts","../src/event-utils.ts","../src/annotation-utils.ts","../src/type-guards.ts","../src/errors.ts","../src/did-utils.ts","../src/config/configuration-error.ts","../src/config/config.schema.json","../src/config/config-validator.ts","../src/config/environment-loader.ts","../src/config/environment-validator.ts","../src/config/platform-types.ts","../src/index.ts"],"names":["resourceUri","annotationUri","isResourceEvent","userId"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Resource creation methods - How resources are created in the system\n */\n\n/**\n * Enumeration of all possible resource creation methods\n */\nexport const CREATION_METHODS = {\n API: 'api',\n UPLOAD: 'upload',\n UI: 'ui',\n REFERENCE: 'reference',\n CLONE: 'clone',\n GENERATED: 'generated',\n} as const;\n\n/**\n * Type for resource creation methods\n */\nexport type CreationMethod = typeof CREATION_METHODS[keyof typeof CREATION_METHODS];","/**\n * Branded identifier types for compile-time type safety.\n *\n * These types prevent mixing up resource IDs, annotation IDs, and user IDs\n * at compile time while having zero runtime overhead.\n *\n * URI types (ResourceUri, AnnotationUri) are in @semiont/api-client\n * since they deal with HTTP URIs returned by the API.\n */\n\n// Branded type definitions for IDs only\nexport type ResourceId = string & { readonly __brand: 'ResourceId' };\nexport type AnnotationId = string & { readonly __brand: 'AnnotationId' };\nexport type UserId = string & { readonly __brand: 'UserId' };\n\n// Type guards with runtime validation\nexport function isResourceId(value: string): value is ResourceId {\n return !value.includes('/');\n}\n\nexport function isAnnotationId(value: string): value is AnnotationId {\n return !value.includes('/');\n}\n\n// Factory functions with runtime validation\nexport function resourceId(id: string): ResourceId {\n if (id.includes('/')) {\n throw new TypeError(`Expected ResourceId, got URI: ${id}`);\n }\n return id as ResourceId;\n}\n\nexport function annotationId(id: string): AnnotationId {\n if (id.includes('/')) {\n throw new TypeError(`Expected AnnotationId, got URI: ${id}`);\n }\n return id as AnnotationId;\n}\n\nexport function userId(id: string): UserId {\n return id as UserId;\n}\n","/**\n * URI utilities for W3C annotations\n *\n * Converts between short resource/annotation IDs and full URIs.\n * Full URIs are required by W3C Web Annotation Data Model.\n */\n\nimport { resourceId, annotationId, type ResourceId, type AnnotationId } from './identifiers';\nimport { resourceUri, annotationUri, type ResourceUri, type AnnotationUri } from '@semiont/api-client';\n\n/**\n * Convert resource ID to full URI\n *\n * @param id - Short resource ID (e.g., \"doc-abc123\")\n * @param publicURL - Backend base URL\n * @returns Full URI (e.g., \"https://api.semiont.app/resources/doc-abc123\")\n *\n * @example\n * resourceIdToURI(\"doc-abc123\", \"https://api.semiont.app\")\n * // => \"https://api.semiont.app/resources/doc-abc123\"\n */\nexport function resourceIdToURI(id: ResourceId, publicURL: string): ResourceUri {\n // Remove trailing slash if present\n const normalizedBase = publicURL.endsWith('/') ? publicURL.slice(0, -1) : publicURL;\n return resourceUri(`${normalizedBase}/resources/${id}` );\n}\n\n/**\n * Extract resource ID from full URI\n *\n * @param uri - Full resource URI (e.g., \"https://api.semiont.app/resources/doc-abc123\")\n * @returns Short resource ID (e.g., \"doc-abc123\")\n * @throws Error if URI format is invalid\n *\n * @example\n * uriToResourceId(\"https://api.semiont.app/resources/doc-abc123\")\n * // => \"doc-abc123\"\n */\nexport function uriToResourceId(uri: string): ResourceId {\n const url = new URL(uri);\n const match = url.pathname.match(/\\/resources\\/([^/]+)/);\n if (!match || !match[1]) {\n throw new Error(`Invalid resource URI: ${uri}`);\n }\n return resourceId(match[1]);\n}\n\n/**\n * Convert annotation ID to full URI\n *\n * @param id - Short annotation ID (e.g., \"anno-xyz789\")\n * @param publicURL - Backend base URL\n * @returns Full URI (e.g., \"https://api.semiont.app/annotations/anno-xyz789\")\n *\n * @example\n * annotationIdToURI(\"anno-xyz789\", \"https://api.semiont.app\")\n * // => \"https://api.semiont.app/annotations/anno-xyz789\"\n */\nexport function annotationIdToURI(id: AnnotationId, publicURL: string): AnnotationUri {\n // Remove trailing slash if present\n const normalizedBase = publicURL.endsWith('/') ? publicURL.slice(0, -1) : publicURL;\n return annotationUri(`${normalizedBase}/annotations/${id}`);\n}\n\n/**\n * Extract annotation ID from full URI\n *\n * @param uri - Full annotation URI (e.g., \"https://api.semiont.app/annotations/anno-xyz789\")\n * @returns Short annotation ID (e.g., \"anno-xyz789\")\n * @throws Error if URI format is invalid\n *\n * @example\n * uriToAnnotationId(\"https://api.semiont.app/annotations/anno-xyz789\")\n * // => \"anno-xyz789\"\n */\nexport function uriToAnnotationId(uri: string): AnnotationId {\n const url = new URL(uri);\n const match = url.pathname.match(/\\/annotations\\/([^/]+)/);\n if (!match || !match[1]) {\n throw new Error(`Invalid annotation URI: ${uri}`);\n }\n return annotationId(match[1]);\n}\n","/**\n * Resource Event Types\n *\n * Event-sourced architecture for resource state management\n * Events are stored in an append-only log (JSONL format)\n *\n * Federation-ready design:\n * - resourceId uses content hashes (doc-sha256:...)\n * - userId uses DID format (did:web:org.com:users:alice)\n * - prevEventHash creates tamper-evident chains\n * - Optional signatures for cross-org verification\n */\n\nimport type { CreationMethod } from './creation-methods';\nimport type { components, AnnotationUri, JobId } from '@semiont/api-client';\nimport type { ResourceId, AnnotationId, UserId } from './identifiers';\n\n// Import OpenAPI types\ntype Annotation = components['schemas']['Annotation'];\ntype ContentFormat = components['schemas']['ContentFormat'];\ntype Motivation = components['schemas']['Motivation'];\n\nexport interface BaseEvent {\n id: string; // Unique event ID (UUID)\n timestamp: string; // ISO 8601 timestamp (for humans, NOT for ordering)\n resourceId?: ResourceId; // Optional - present for resource-scoped events, absent for system events\n // Use isSystemEvent() / isResourceScopedEvent() type guards for routing\n userId: UserId; // DID format: did:web:org.com:users:alice (federation-ready)\n version: number; // Event schema version\n}\n\n// Resource lifecycle events\nexport interface ResourceCreatedEvent extends BaseEvent {\n type: 'resource.created';\n payload: {\n name: string;\n format: ContentFormat; // MIME type (validated enum)\n contentChecksum: string; // SHA-256 of content (should match resourceId)\n contentByteSize?: number; // Size of content in bytes\n creationMethod: CreationMethod; // How the resource was created\n entityTypes?: string[];\n\n // First-class fields (promoted from metadata)\n language?: string; // Language/locale code (e.g., 'en', 'es', 'fr')\n isDraft?: boolean; // Draft status for generated resources\n generatedFrom?: string; // Annotation/Reference ID that triggered generation\n generationPrompt?: string; // Prompt used for AI generation (events-only, not on Resource)\n };\n}\n\nexport interface ResourceClonedEvent extends BaseEvent {\n type: 'resource.cloned';\n payload: {\n name: string;\n format: ContentFormat; // MIME type (validated enum)\n contentChecksum: string; // SHA-256 of new content\n contentByteSize?: number; // Size of content in bytes\n parentResourceId: string; // Content hash of parent resource\n creationMethod: CreationMethod; // How the resource was created\n entityTypes?: string[];\n\n // First-class fields (promoted from metadata)\n language?: string; // Language/locale code (e.g., 'en', 'es', 'fr')\n };\n}\n\nexport interface ResourceArchivedEvent extends BaseEvent {\n type: 'resource.archived';\n payload: {\n reason?: string;\n };\n}\n\nexport interface ResourceUnarchivedEvent extends BaseEvent {\n type: 'resource.unarchived';\n payload: Record<string, never>; // Empty payload\n}\n\n// Representation events (multi-format support)\nexport interface RepresentationAddedEvent extends BaseEvent {\n type: 'representation.added';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n representation: {\n '@id': string; // Unique ID (content hash)\n mediaType: string; // MIME type (e.g., 'text/markdown', 'application/pdf')\n byteSize: number; // Size in bytes\n checksum: string; // Content hash (SHA-256)\n created: string; // ISO 8601 timestamp\n rel?: 'original' | 'thumbnail' | 'preview' | 'optimized' | 'derived' | 'other';\n storageUri?: string; // Where bytes are stored (optional)\n filename?: string; // Original filename (optional)\n language?: string; // IETF BCP 47 language tag (optional, for translations)\n width?: number; // Pixels (images/video)\n height?: number; // Pixels (images/video)\n duration?: number; // Seconds (audio/video)\n };\n };\n}\n\nexport interface RepresentationRemovedEvent extends BaseEvent {\n type: 'representation.removed';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n checksum: string; // Which representation to remove\n };\n}\n\n// Unified annotation events\n// Single principle: An annotation is an annotation. The motivation field tells you what kind it is.\nexport interface AnnotationAddedEvent extends BaseEvent {\n type: 'annotation.added';\n payload: {\n annotation: Omit<Annotation, 'creator' | 'created'>; // W3C Annotation (creator/created come from event metadata)\n };\n}\n\nexport interface AnnotationRemovedEvent extends BaseEvent {\n type: 'annotation.removed';\n payload: {\n annotationId: AnnotationId; // Branded type for compile-time safety\n };\n}\n\n// Body operation types for fine-grained annotation body modifications\nexport type BodyItem =\n | { type: 'TextualBody'; value: string; purpose?: Motivation; format?: string; language?: string }\n | { type: 'SpecificResource'; source: string; purpose?: Motivation };\n\nexport type BodyOperation =\n | { op: 'add'; item: BodyItem }\n | { op: 'remove'; item: BodyItem }\n | { op: 'replace'; oldItem: BodyItem; newItem: BodyItem };\n\nexport interface AnnotationBodyUpdatedEvent extends BaseEvent {\n type: 'annotation.body.updated';\n payload: {\n annotationId: AnnotationId; // Branded type for compile-time safety\n operations: BodyOperation[];\n };\n}\n\n// Job progress events (resource-level)\n// Emitted by background workers for real-time progress updates\nexport interface JobStartedEvent extends BaseEvent {\n type: 'job.started';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n totalSteps?: number; // Optional - total number of steps if known\n };\n}\n\nexport interface JobProgressEvent extends BaseEvent {\n type: 'job.progress';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n percentage: number; // 0-100\n currentStep?: string; // Human-readable current step (e.g., \"Scanning for Person\")\n processedSteps?: number; // Number of steps completed\n totalSteps?: number; // Total number of steps\n foundCount?: number; // For detection: number of entities found so far\n message?: string; // Optional status message\n progress?: any; // For new job types: full progress object\n };\n}\n\nexport interface JobCompletedEvent extends BaseEvent {\n type: 'job.completed';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n totalSteps?: number; // Total steps completed\n foundCount?: number; // For detection: total entities found\n resultResourceId?: ResourceId; // For generation: ID of generated resource (branded type)\n annotationUri?: AnnotationUri; // For generation: URI of annotation that triggered generation\n message?: string; // Optional completion message\n result?: any; // For new job types: full result object\n };\n}\n\nexport interface JobFailedEvent extends BaseEvent {\n type: 'job.failed';\n resourceId: ResourceId; // Required - job is scoped to a resource\n payload: {\n jobId: JobId;\n jobType: 'detection' | 'generation' | 'highlight-detection' | 'assessment-detection' | 'comment-detection' | 'tag-detection';\n error: string; // Error message\n details?: string; // Optional detailed error information\n };\n}\n\n// Entity tag events (resource-level)\nexport interface EntityTagAddedEvent extends BaseEvent {\n type: 'entitytag.added';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n entityType: string;\n };\n}\n\nexport interface EntityTagRemovedEvent extends BaseEvent {\n type: 'entitytag.removed';\n resourceId: ResourceId; // Required - resource-scoped event\n payload: {\n entityType: string;\n };\n}\n\n// Entity type events (global collection)\nexport interface EntityTypeAddedEvent extends BaseEvent {\n type: 'entitytype.added';\n resourceId?: undefined; // System-level event - no resource scope\n payload: {\n entityType: string; // The entity type being added to global collection\n };\n}\n\n// Union type of all events\nexport type ResourceEvent =\n | ResourceCreatedEvent\n | ResourceClonedEvent\n | ResourceArchivedEvent\n | ResourceUnarchivedEvent\n | RepresentationAddedEvent // Multi-format support\n | RepresentationRemovedEvent // Multi-format support\n | AnnotationAddedEvent\n | AnnotationRemovedEvent\n | AnnotationBodyUpdatedEvent\n | JobStartedEvent // Job progress\n | JobProgressEvent // Job progress\n | JobCompletedEvent // Job progress\n | JobFailedEvent // Job progress\n | EntityTagAddedEvent // Resource-level\n | EntityTagRemovedEvent // Resource-level\n | EntityTypeAddedEvent; // Global collection\n\n// Extract just the event type strings from the union\nexport type ResourceEventType = ResourceEvent['type'];\n\n// System-level events (no resource scope)\nexport type SystemEvent = EntityTypeAddedEvent;\n\n// Resource-scoped events (require resourceId)\nexport type ResourceScopedEvent = Exclude<ResourceEvent, SystemEvent>;\n\n// Type guards\nexport function isResourceEvent(event: any): event is ResourceEvent {\n return event &&\n typeof event.id === 'string' &&\n typeof event.timestamp === 'string' &&\n (event.resourceId === undefined || typeof event.resourceId === 'string') && // resourceId now optional\n typeof event.type === 'string' &&\n event.type.includes('.');\n}\n\n/**\n * Type guard: Check if event is system-level (no resourceId)\n * System events affect global state, not individual resources\n */\nexport function isSystemEvent(event: ResourceEvent): event is SystemEvent {\n return event.type === 'entitytype.added';\n}\n\n/**\n * Type guard: Check if event is resource-scoped (has resourceId)\n * Resource events affect a specific resource's state\n */\nexport function isResourceScopedEvent(event: ResourceEvent): event is ResourceScopedEvent {\n return !isSystemEvent(event);\n}\n\nexport function getEventType<T extends ResourceEvent>(\n event: ResourceEvent\n): T['type'] {\n return event.type as T['type'];\n}\n\n// Event metadata for querying and indexing\nexport interface EventMetadata {\n sequenceNumber: number; // Position in the event log (source of truth for ordering)\n streamPosition: number; // Byte position in JSONL file\n timestamp: string; // When stored (for humans, not ordering)\n prevEventHash?: string; // SHA-256 of previous event (chain integrity, null for first event)\n checksum?: string; // SHA-256 of this event for integrity\n}\n\n// Optional signature for federation\nexport interface EventSignature {\n algorithm: 'ed25519'; // Signature algorithm\n publicKey: string; // User's public key (base64)\n signature: string; // Event signature (base64)\n keyId?: string; // Key identifier for rotation\n}\n\n// Event with metadata (as stored)\nexport interface StoredEvent<T extends ResourceEvent = ResourceEvent> {\n event: T;\n metadata: EventMetadata;\n signature?: EventSignature; // Optional, for federation (unused in MVP)\n}\n\n// Query filters for event retrieval\nexport interface EventQuery {\n resourceId?: ResourceId;\n userId?: string;\n eventTypes?: ResourceEvent['type'][];\n fromTimestamp?: string;\n toTimestamp?: string;\n fromSequence?: number;\n limit?: number;\n}\n\n// Annotation collections for a resource (view storage projection)\n// Annotations are NOT part of the resource - they reference the resource\nexport interface ResourceAnnotations {\n resourceId: ResourceId; // Which resource these annotations belong to (branded type)\n annotations: Annotation[]; // All annotations (highlights, references, assessments, etc.)\n version: number; // Event count for this resource's annotation stream\n updatedAt: string; // Last annotation event timestamp\n}","/**\n * Event Type Guards and Extraction Utilities\n *\n * Domain logic for working with resource events.\n * No React dependencies - safe to use in any JavaScript environment.\n */\n\nimport type { StoredEvent } from './events';\nimport type { AnnotationUri } from '@semiont/api-client';\n\n// =============================================================================\n// EVENT TYPE GUARDS AND EXTRACTION\n// =============================================================================\n\n/**\n * Extract annotation ID from event payload\n * Returns null if event is not annotation-related\n *\n * For annotation.added: extracts full URI from payload.annotation.id\n * For annotation.removed/body.updated: constructs full URI from payload.annotationId (UUID) + resourceId\n */\nexport function getAnnotationUriFromEvent(event: StoredEvent): AnnotationUri | null {\n const eventData = event.event;\n\n if (eventData.type === 'annotation.added') {\n // annotation.added has the full annotation object with id as full URI\n return eventData.payload.annotation.id as AnnotationUri || null;\n }\n\n if (eventData.type === 'annotation.removed' || eventData.type === 'annotation.body.updated') {\n // These events have annotationId (UUID only), need to construct full URI\n // Extract base URL from resourceId (format: http://host/resources/id)\n if (eventData.payload.annotationId && eventData.resourceId) {\n try {\n const resourceUri = eventData.resourceId;\n // Extract base URL by removing the /resources/{id} part\n const baseUrl = resourceUri.substring(0, resourceUri.lastIndexOf('/resources/'));\n return `${baseUrl}/annotations/${eventData.payload.annotationId}` as AnnotationUri;\n } catch (e) {\n return null;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Check if an event is related to a specific annotation\n */\nexport function isEventRelatedToAnnotation(event: StoredEvent, annotationUri: AnnotationUri): boolean {\n const eventAnnotationUri = getAnnotationUriFromEvent(event);\n return eventAnnotationUri === annotationUri;\n}\n\n/**\n * Type guard to check if event is a resource event\n */\nexport function isResourceEvent(event: any): event is StoredEvent {\n return event &&\n typeof event.event === 'object' &&\n typeof event.event.id === 'string' &&\n typeof event.event.timestamp === 'string' &&\n typeof event.event.resourceId === 'string' &&\n typeof event.event.type === 'string' &&\n typeof event.metadata === 'object' &&\n typeof event.metadata.sequenceNumber === 'number';\n}\n","/**\n * Backend-specific annotation utility functions\n */\n\nimport type { components } from '@semiont/api-client';\nimport type { BodyItem } from './events';\n\ntype Annotation = components['schemas']['Annotation'];\n\n/**\n * Find a body item in an array\n * Returns the index of the first matching item, or -1 if not found\n */\nexport function findBodyItem(body: Annotation['body'], targetItem: BodyItem): number {\n if (!Array.isArray(body)) {\n return -1;\n }\n\n for (let i = 0; i < body.length; i++) {\n const item = body[i];\n\n // Check if this is a valid body item that can be matched\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'purpose' in item\n ) {\n const itemType = (item as { type: unknown }).type;\n const itemPurpose = (item as { purpose: unknown }).purpose;\n\n // Type and purpose must match\n if (itemType !== targetItem.type || itemPurpose !== targetItem.purpose) {\n continue;\n }\n\n // For TextualBody, match by value\n if (targetItem.type === 'TextualBody' && 'value' in item) {\n const itemValue = (item as { value: unknown }).value;\n if (itemValue === targetItem.value) {\n return i;\n }\n }\n\n // For SpecificResource, match by source\n if (targetItem.type === 'SpecificResource' && 'source' in item) {\n const itemSource = (item as { source: unknown }).source;\n if (itemSource === targetItem.source) {\n return i;\n }\n }\n }\n }\n\n return -1;\n}\n","/**\n * Common type guard utilities\n */\n\n/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Check if value is a number (not NaN)\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !isNaN(value);\n}\n\n/**\n * Check if value is an object (not null, not array)\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Check if value is null\n */\nexport function isNull(value: unknown): value is null {\n return value === null;\n}\n\n/**\n * Check if value is undefined\n */\nexport function isUndefined(value: unknown): value is undefined {\n return value === undefined;\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNullish(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Check if value is defined (not null or undefined)\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}","/**\n * Common error classes\n */\n\n/**\n * Base error class for Semiont applications\n */\nexport class SemiontError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: Record<string, any>\n ) {\n super(message);\n this.name = 'SemiontError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends SemiontError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Error thrown by scripts\n */\nexport class ScriptError extends SemiontError {\n constructor(message: string, code: string = 'SCRIPT_ERROR', details?: Record<string, any>) {\n super(message, code, details);\n this.name = 'ScriptError';\n }\n}\n\n/**\n * Error thrown when a resource is not found\n */\nexport class NotFoundError extends SemiontError {\n constructor(resource: string, id?: string) {\n const message = id ? `${resource} with id '${id}' not found` : `${resource} not found`;\n super(message, 'NOT_FOUND', { resource, id });\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Error thrown when user is not authorized\n */\nexport class UnauthorizedError extends SemiontError {\n constructor(message: string = 'Unauthorized', details?: Record<string, any>) {\n super(message, 'UNAUTHORIZED', details);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * Error thrown when operation would conflict with existing data\n */\nexport class ConflictError extends SemiontError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CONFLICT', details);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * API Error class for handling HTTP errors\n * Used by API clients to represent failed HTTP requests\n */\nexport class APIError extends Error {\n constructor(\n public status: number,\n public data: any,\n message?: string\n ) {\n super(message || `API Error: ${status}`);\n this.name = 'APIError';\n Error.captureStackTrace(this, this.constructor);\n }\n}","/**\n * DID (Decentralized Identifier) and W3C Agent utilities\n *\n * Provides utilities for working with DID:WEB identifiers and converting\n * between user representations and W3C Web Annotation Agent objects.\n */\n\nimport type { components } from '@semiont/api-client';\n\ntype Agent = components['schemas']['Agent'];\n\n/**\n * Convert a user object to a DID:WEB identifier\n *\n * Format: did:web:domain.com:users:userId\n * Example: did:web:example.com:users:abc123\n *\n * This is used for W3C Web Annotation compliance and federation readiness.\n *\n * @param user - User object with id and domain\n * @returns DID:WEB identifier string\n */\nexport function userToDid(user: { id: string; domain: string }): string {\n return `did:web:${user.domain}:users:${user.id}`;\n}\n\n/**\n * Convert a user object to a W3C Agent object with DID:WEB identifier\n *\n * Creates a full Agent object for W3C Web Annotation compliance.\n * Includes DID:WEB identifier, type, and name.\n *\n * @param user - User object with id, domain, name, and email\n * @returns W3C Agent object\n */\nexport function userToAgent(user: {\n id: string;\n domain: string;\n name: string | null;\n email: string;\n}): Agent {\n return {\n type: 'Person' as const,\n id: userToDid(user),\n name: user.name || user.email,\n };\n}\n\n/**\n * Convert a DID string to a minimal W3C Agent object\n *\n * Used when reconstructing annotations from events where only the DID is available.\n * Creates a minimal Agent with just the required fields (id, type).\n * Name is derived from the DID for display purposes.\n *\n * @param did - DID:WEB identifier string\n * @returns Minimal W3C Agent object\n */\nexport function didToAgent(did: string): Agent {\n // Extract user ID from DID format: did:web:domain.com:users:userId\n const parts = did.split(':');\n const userId = parts[parts.length - 1] || 'unknown';\n\n return {\n type: 'Person' as const,\n id: did,\n name: userId, // Use user ID as name since we don't have full user data\n };\n}\n","/**\n * Configuration Error Class\n * \n * Custom error class for configuration validation and loading errors.\n * Provides structured error information with helpful suggestions.\n */\n\nexport class ConfigurationError extends Error {\n public override readonly cause?: Error;\n\n constructor(\n message: string,\n public environment?: string,\n public suggestion?: string,\n cause?: Error\n ) {\n super(message);\n this.name = 'ConfigurationError';\n this.cause = cause;\n }\n \n /**\n * Format the error nicely for CLI output\n */\n override toString(): string {\n let output = `❌ ${this.message}`;\n if (this.environment) {\n output += `\\n Environment: ${this.environment}`;\n }\n if (this.suggestion) {\n output += `\\n 💡 Suggestion: ${this.suggestion}`;\n }\n return output;\n }\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://semiont.org/schemas/config.json\",\n \"definitions\": {\n \"PlatformType\": {\n \"type\": \"string\",\n \"enum\": [\n \"posix\",\n \"container\",\n \"aws\",\n \"external\"\n ]\n },\n \"ServicePlatformConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"$ref\": \"#/definitions/PlatformType\"\n }\n },\n \"required\": [\n \"type\"\n ]\n },\n \"ResourceRequirements\": {\n \"type\": \"object\",\n \"properties\": {\n \"cpu\": {\n \"type\": \"string\"\n },\n \"memory\": {\n \"type\": \"string\"\n },\n \"gpu\": {\n \"type\": \"integer\"\n },\n \"gpus\": {\n \"type\": \"integer\"\n },\n \"replicas\": {\n \"type\": \"integer\"\n },\n \"ephemeralStorage\": {\n \"type\": \"string\"\n },\n \"memoryReservation\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false\n },\n \"SecurityRequirements\": {\n \"type\": \"object\",\n \"properties\": {\n \"readOnlyRootFilesystem\": {\n \"type\": \"boolean\"\n },\n \"runAsNonRoot\": {\n \"type\": \"boolean\"\n },\n \"runAsUser\": {\n \"type\": \"integer\"\n },\n \"runAsGroup\": {\n \"type\": \"integer\"\n },\n \"capabilities\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"add\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"drop\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n },\n \"privileged\": {\n \"type\": \"boolean\"\n },\n \"allowPrivilegeEscalation\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"BuildRequirements\": {\n \"type\": \"object\",\n \"properties\": {\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"BackendServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"devMode\": {\n \"type\": \"boolean\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"publicURL\": {\n \"type\": \"string\"\n },\n \"corsOrigin\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"cpu\": {\n \"type\": \"string\"\n },\n \"memory\": {\n \"type\": \"string\"\n },\n \"semiontRepo\": {\n \"type\": \"string\"\n },\n \"databaseUrl\": {\n \"type\": \"string\"\n },\n \"projectRoot\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"redisUrl\": {\n \"type\": \"string\"\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"port\",\n \"publicURL\",\n \"corsOrigin\"\n ],\n \"additionalProperties\": false\n },\n \"FrontendServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"devMode\": {\n \"type\": \"boolean\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"siteName\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"semiontRepo\": {\n \"type\": \"string\"\n },\n \"projectRoot\": {\n \"type\": \"string\"\n },\n \"databaseUrl\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"publicURL\": {\n \"type\": \"string\"\n },\n \"allowedOrigins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"port\",\n \"siteName\"\n ],\n \"additionalProperties\": false\n },\n \"ProxyServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"envoy\", \"nginx\", \"haproxy\"],\n \"default\": \"envoy\"\n },\n \"port\": {\n \"type\": \"integer\",\n \"default\": 8080\n },\n \"adminPort\": {\n \"type\": \"integer\",\n \"default\": 9901\n },\n \"backendPort\": {\n \"type\": \"integer\",\n \"default\": 4000\n },\n \"frontendPort\": {\n \"type\": \"integer\",\n \"default\": 3000\n },\n \"image\": {\n \"type\": \"string\",\n \"default\": \"envoyproxy/envoy:v1.28-latest\"\n },\n \"configPath\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\",\n \"port\"\n ],\n \"additionalProperties\": false\n },\n \"DatabaseServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"host\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"user\": {\n \"type\": \"string\"\n },\n \"username\": {\n \"type\": \"string\"\n },\n \"password\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\"\n },\n \"storageSize\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\",\n \"host\",\n \"port\"\n ],\n \"additionalProperties\": false\n },\n \"GraphDatabaseType\": {\n \"type\": \"string\",\n \"enum\": [\n \"neo4j\",\n \"janusgraph\",\n \"neptune\",\n \"memory\"\n ]\n },\n \"GraphServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"$ref\": \"#/definitions/GraphDatabaseType\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"uri\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"username\": {\n \"type\": \"string\"\n },\n \"password\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\"\n },\n \"host\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"storage\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"string\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"region\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"janusgraphVersion\": {\n \"type\": \"string\"\n },\n \"javaOptions\": {\n \"type\": \"string\"\n },\n \"heapSize\": {\n \"type\": \"string\"\n },\n \"pageCacheSize\": {\n \"type\": \"string\"\n },\n \"noAuth\": {\n \"type\": \"boolean\"\n },\n \"dataPath\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\"\n ],\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"type\": {\n \"const\": \"neo4j\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"uri\",\n \"username\",\n \"password\",\n \"database\"\n ]\n }\n }\n ],\n \"additionalProperties\": false\n },\n \"FilesystemServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"path\"\n ],\n \"additionalProperties\": false\n },\n \"InferenceServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"maxTokens\": {\n \"type\": \"integer\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"baseURL\": {\n \"type\": \"string\"\n },\n \"apiKey\": {\n \"type\": \"string\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"organization\": {\n \"type\": \"string\"\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\",\n \"type\",\n \"apiKey\"\n ],\n \"additionalProperties\": false\n },\n \"McpServiceConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"platform\": {\n \"$ref\": \"#/definitions/ServicePlatformConfig\"\n },\n \"command\": {\n \"type\": \"string\"\n },\n \"image\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"integer\"\n },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"timeout\": {\n \"type\": \"integer\"\n },\n \"wait\": {\n \"type\": \"integer\"\n },\n \"logsEndpoint\": {\n \"type\": \"string\"\n },\n \"tag\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"$ref\": \"#/definitions/ResourceRequirements\"\n },\n \"security\": {\n \"$ref\": \"#/definitions/SecurityRequirements\"\n },\n \"build\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"$ref\": \"#/definitions/BuildRequirements\"\n }\n ]\n },\n \"dockerfile\": {\n \"type\": \"string\"\n },\n \"buildContext\": {\n \"type\": \"string\"\n },\n \"buildArgs\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"buildTarget\": {\n \"type\": \"string\"\n },\n \"prebuilt\": {\n \"type\": \"boolean\"\n },\n \"noCache\": {\n \"type\": \"boolean\"\n },\n \"secrets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"labels\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"annotations\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"dependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"externalDependencies\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"healthCheck\": {\n \"type\": \"string\"\n }\n }\n }\n ]\n }\n },\n \"environment\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"env\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"platform\"\n ],\n \"additionalProperties\": false\n },\n \"ServicesConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"backend\": {\n \"$ref\": \"#/definitions/BackendServiceConfig\"\n },\n \"frontend\": {\n \"$ref\": \"#/definitions/FrontendServiceConfig\"\n },\n \"database\": {\n \"$ref\": \"#/definitions/DatabaseServiceConfig\"\n },\n \"graph\": {\n \"$ref\": \"#/definitions/GraphServiceConfig\"\n },\n \"filesystem\": {\n \"$ref\": \"#/definitions/FilesystemServiceConfig\"\n },\n \"inference\": {\n \"$ref\": \"#/definitions/InferenceServiceConfig\"\n },\n \"mcp\": {\n \"$ref\": \"#/definitions/McpServiceConfig\"\n },\n \"proxy\": {\n \"$ref\": \"#/definitions/ProxyServiceConfig\"\n }\n },\n \"additionalProperties\": true\n },\n \"SiteConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"siteName\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Display name for the site\"\n },\n \"domain\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Primary domain for the site\"\n },\n \"adminEmail\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"Administrator email address\"\n },\n \"supportEmail\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"Support email address (optional)\"\n },\n \"oauthAllowedDomains\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1,\n \"description\": \"Email domains allowed for OAuth authentication\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"additionalProperties\": false\n },\n \"AppConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"features\": {\n \"type\": \"object\",\n \"properties\": {\n \"enableAnalytics\": {\n \"type\": \"boolean\"\n },\n \"enableMaintenanceMode\": {\n \"type\": \"boolean\"\n },\n \"enableDebugLogging\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"security\": {\n \"type\": \"object\",\n \"properties\": {\n \"sessionTimeout\": {\n \"type\": \"integer\",\n \"minimum\": 60,\n \"description\": \"Session timeout in seconds\"\n },\n \"maxLoginAttempts\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Maximum failed login attempts before lockout\"\n },\n \"corsAllowedOrigins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"enableLocalAuth\": {\n \"type\": \"boolean\",\n \"description\": \"Enable local username/password authentication\"\n },\n \"jwtSecret\": {\n \"type\": \"string\",\n \"minLength\": 32,\n \"description\": \"JWT signing secret (base64 encoded, 32+ bytes)\"\n }\n },\n \"additionalProperties\": false\n },\n \"performance\": {\n \"type\": \"object\",\n \"properties\": {\n \"enableCaching\": {\n \"type\": \"boolean\"\n },\n \"cacheTimeout\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Cache timeout in seconds\"\n },\n \"maxRequestSize\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9]+(kb|mb|gb)$\",\n \"description\": \"Maximum request size (e.g., '10mb')\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false\n },\n \"EnvironmentConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"_comment\": {\n \"type\": \"string\",\n \"description\": \"Optional comment for documentation\"\n },\n \"_metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"environment\": {\n \"type\": \"string\"\n },\n \"projectRoot\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"environment\",\n \"projectRoot\"\n ]\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Environment name\"\n },\n \"platform\": {\n \"type\": \"object\",\n \"properties\": {\n \"default\": {\n \"$ref\": \"#/definitions/PlatformType\"\n }\n }\n },\n \"services\": {\n \"$ref\": \"#/definitions/ServicesConfig\"\n },\n \"site\": {\n \"$ref\": \"#/definitions/SiteConfig\"\n },\n \"app\": {\n \"$ref\": \"#/definitions/AppConfig\"\n },\n \"env\": {\n \"type\": \"object\",\n \"properties\": {\n \"NODE_ENV\": {\n \"type\": \"string\",\n \"enum\": [\n \"development\",\n \"production\",\n \"test\"\n ]\n }\n },\n \"additionalProperties\": true\n },\n \"logLevel\": {\n \"type\": \"string\",\n \"enum\": [\n \"error\",\n \"warn\",\n \"info\",\n \"http\",\n \"debug\"\n ],\n \"description\": \"Logging verbosity level\"\n },\n \"deployment\": {\n \"type\": \"object\",\n \"properties\": {\n \"imageTagStrategy\": {\n \"type\": \"string\",\n \"enum\": [\n \"mutable\",\n \"immutable\",\n \"git-hash\"\n ]\n }\n }\n }\n },\n \"required\": [\n \"services\"\n ],\n \"additionalProperties\": false\n },\n \"SemiontConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+$\",\n \"description\": \"Config file version (semver)\"\n },\n \"project\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Project name\"\n },\n \"site\": {\n \"$ref\": \"#/definitions/SiteConfig\"\n },\n \"app\": {\n \"$ref\": \"#/definitions/AppConfig\"\n },\n \"services\": {\n \"$ref\": \"#/definitions/ServicesConfig\"\n }\n },\n \"required\": [\n \"version\",\n \"project\",\n \"site\"\n ],\n \"additionalProperties\": false\n }\n }\n}\n","/**\n * Config Schema Validator\n *\n * Validates configuration data against JSON Schema using Ajv (JSON Schema validator).\n * Provides runtime validation for semiont.json and environment config files.\n */\n\nimport Ajv, { type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport configSchema from './config.schema.json' with { type: 'json' };\n\n// Initialize Ajv with config-compatible settings\nconst ajv = new Ajv({\n allErrors: true, // Return all errors, not just the first one\n coerceTypes: true, // Coerce types (e.g., \"123\" -> 123)\n removeAdditional: false, // Don't remove additional properties\n useDefaults: true, // Apply default values from schema\n strict: false\n});\n\n// Add format validators (email, uri, date-time, etc.)\naddFormats(ajv);\n\n// Load schema\najv.addSchema(configSchema, 'config');\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ErrorObject[] | null;\n errorMessage?: string;\n}\n\n/**\n * Validate semiont.json config\n */\nexport function validateSemiontConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema('config#/definitions/SemiontConfig');\n if (!validate) {\n throw new Error('SemiontConfig schema not found');\n }\n\n const valid = validate(data);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage: formatErrors(validate.errors || [])\n };\n }\n\n return { valid: true, errors: null };\n}\n\n/**\n * Validate environment config (environments/*.json)\n */\nexport function validateEnvironmentConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema('config#/definitions/EnvironmentConfig');\n if (!validate) {\n throw new Error('EnvironmentConfig schema not found');\n }\n\n const valid = validate(data);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage: formatErrors(validate.errors || [])\n };\n }\n\n return { valid: true, errors: null };\n}\n\n/**\n * Validate site config\n */\nexport function validateSiteConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema('config#/definitions/SiteConfig');\n if (!validate) {\n throw new Error('SiteConfig schema not found');\n }\n\n const valid = validate(data);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage: formatErrors(validate.errors || [])\n };\n }\n\n return { valid: true, errors: null };\n}\n\n/**\n * Format validation errors into human-readable message\n */\nexport function formatErrors(errors: ErrorObject[]): string {\n if (errors.length === 0) return 'Validation failed';\n\n const messages = errors.map(err => {\n const path = err.instancePath || 'root';\n const message = err.message || 'validation error';\n\n if (err.keyword === 'required' && 'missingProperty' in err.params) {\n return `Missing required property: ${err.params.missingProperty}`;\n }\n\n if (err.keyword === 'type' && 'type' in err.params) {\n return `${path}: ${message} (expected ${err.params.type})`;\n }\n\n if (err.keyword === 'enum' && 'allowedValues' in err.params) {\n return `${path}: must be one of [${(err.params.allowedValues as string[]).join(', ')}]`;\n }\n\n if (err.keyword === 'format') {\n return `${path}: invalid format (${message})`;\n }\n\n if (err.keyword === 'minLength' || err.keyword === 'minItems') {\n return `${path}: ${message}`;\n }\n\n return `${path}: ${message}`;\n });\n\n return messages.join('; ');\n}\n","/**\n * Environment Loader Module\n *\n * Responsible for loading and merging environment configurations.\n * Handles semiont.json base config and environment-specific overrides.\n */\n\nimport { ConfigurationError } from './configuration-error';\nimport { PlatformType } from './platform-types';\nimport { isObject } from '../index';\nimport { validateEnvironmentConfig } from './config-validator';\nimport type {\n EnvironmentConfig,\n SiteConfig,\n AppConfig,\n SemiontConfig,\n ServicesConfig,\n BackendServiceConfig,\n FrontendServiceConfig,\n DatabaseServiceConfig,\n GraphServiceConfig,\n FilesystemServiceConfig,\n InferenceServiceConfig,\n ServicePlatformConfig\n} from './config.types';\n\n/**\n * Re-export generated types from JSON Schema\n * These types are automatically generated from config.schema.json\n */\nexport type {\n EnvironmentConfig,\n SiteConfig,\n AppConfig,\n SemiontConfig,\n PlatformType,\n ServicesConfig,\n BackendServiceConfig,\n FrontendServiceConfig,\n DatabaseServiceConfig,\n GraphServiceConfig,\n FilesystemServiceConfig,\n InferenceServiceConfig,\n ServicePlatformConfig\n};\n\n/**\n * Generic service configuration\n * Platform-specific fields should be accessed through platform-specific interfaces\n */\nexport interface ServiceConfig {\n platform?: {\n type: PlatformType;\n };\n // Generic fields that apply across platforms\n port?: number;\n name?: string;\n // Platform-specific fields are loosely typed here\n // Platforms should validate and type these properly\n [key: string]: any;\n}\n\nexport interface AWSConfig {\n region: string;\n accountId: string;\n certificateArn?: string;\n hostedZoneId?: string;\n rootDomain?: string;\n stacks?: {\n data?: string;\n app?: string;\n };\n database?: {\n name?: string;\n instanceClass?: string;\n allocatedStorage?: number;\n backupRetentionDays?: number;\n multiAZ?: boolean;\n };\n ecs?: {\n desiredCount?: number;\n minCapacity?: number;\n maxCapacity?: number;\n };\n monitoring?: {\n enableDetailedMonitoring?: boolean;\n logRetentionDays?: number;\n };\n}\n\n/**\n * Deep merge utility for configuration objects\n * Pure function - no side effects\n */\nexport function deepMerge(target: any, ...sources: any[]): any {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n}\n\n\n/**\n * Recursively resolve environment variable placeholders in configuration\n * Replaces ${VAR_NAME} with the value from the provided env object\n * Pure function - accepts env as parameter instead of using process.env\n *\n * @param obj - Configuration object to process\n * @param env - Environment variables object\n * @returns Configuration with resolved environment variables\n */\nexport function resolveEnvVars(obj: any, env: Record<string, string | undefined>): any {\n if (typeof obj === 'string') {\n // Replace ${VAR_NAME} with actual environment variable value\n return obj.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n return env[varName] || match;\n });\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => resolveEnvVars(item, env));\n }\n\n if (obj && typeof obj === 'object') {\n const resolved: any = {};\n for (const key in obj) {\n resolved[key] = resolveEnvVars(obj[key], env);\n }\n return resolved;\n }\n\n return obj;\n}\n\n/**\n * Parse and merge configuration files\n * Pure function - accepts file contents as strings instead of reading from filesystem\n *\n * @param baseContent - Contents of semiont.json (null if file doesn't exist)\n * @param envContent - Contents of environment-specific JSON file\n * @param env - Environment variables object\n * @param environment - Environment name\n * @param projectRoot - Project root path (for metadata only)\n * @returns Merged and validated environment configuration\n * @throws ConfigurationError if parsing or validation fails\n */\nexport function parseAndMergeConfigs(\n baseContent: string | null,\n envContent: string,\n env: Record<string, string | undefined>,\n environment: string,\n projectRoot: string\n): EnvironmentConfig {\n try {\n // Parse base config\n let baseConfig: any = {};\n if (baseContent) {\n baseConfig = JSON.parse(baseContent);\n }\n\n // Parse environment config\n const envConfig = JSON.parse(envContent);\n\n // Merge configurations: base defaults -> environment config\n const merged = deepMerge(\n {},\n { site: baseConfig.site }, // Site config from semiont.json\n baseConfig.defaults || {}, // Default config from semiont.json\n envConfig // Environment-specific overrides\n );\n\n // Resolve environment variables in the merged configuration\n const resolved = resolveEnvVars(merged, env);\n\n // Ensure services exists (even if empty)\n if (!resolved.services) {\n resolved.services = {};\n }\n\n // Validate NODE_ENV if specified\n if (resolved.env?.NODE_ENV) {\n const validNodeEnv = ['development', 'production', 'test'];\n if (!validNodeEnv.includes(resolved.env.NODE_ENV)) {\n throw new ConfigurationError(\n `Invalid NODE_ENV value: ${resolved.env.NODE_ENV}`,\n environment,\n `NODE_ENV must be one of: ${validNodeEnv.join(', ')}`\n );\n }\n }\n\n // Add metadata about where this config came from\n const configWithMetadata = {\n ...resolved,\n _metadata: {\n environment,\n projectRoot\n }\n };\n\n // Validate with AJV\n const validationResult = validateEnvironmentConfig(configWithMetadata);\n\n if (!validationResult.valid) {\n throw new ConfigurationError(\n `Invalid environment configuration: ${validationResult.errorMessage}`,\n environment,\n `Fix the validation errors in your environments/${environment}.json file`\n );\n }\n\n return configWithMetadata as EnvironmentConfig;\n } catch (error) {\n if (error instanceof ConfigurationError) {\n throw error; // Re-throw our custom errors\n }\n\n if (error instanceof SyntaxError && error.message.includes('JSON')) {\n throw new ConfigurationError(\n `Invalid JSON syntax in configuration file`,\n environment,\n `Check for missing commas, quotes, or brackets. Use a JSON validator to verify syntax.`\n );\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new ConfigurationError(\n `Failed to parse environment configuration: ${message}`,\n environment,\n `Check the configuration files are valid JSON`\n );\n }\n}\n\n/**\n * Get NODE_ENV value from environment config\n *\n * @param config - Environment configuration\n * @returns NODE_ENV value (defaults to 'development' if not specified)\n */\nexport function getNodeEnvForEnvironment(config: EnvironmentConfig): 'development' | 'production' | 'test' {\n const nodeEnv = config.env?.NODE_ENV;\n\n // Default to 'development' if not specified\n return nodeEnv || 'development';\n}\n\n/**\n * List environment names from filenames\n * Pure function - accepts array of filenames instead of reading from filesystem\n *\n * @param files - Array of filenames from environments directory\n * @returns Sorted array of environment names\n */\nexport function listEnvironmentNames(files: string[]): string[] {\n return files\n .filter(file => file.endsWith('.json'))\n .map(file => {\n // Extract filename from path (handle directory separators)\n const lastSlash = Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\\\'));\n const filename = lastSlash >= 0 ? file.substring(lastSlash + 1) : file;\n // Remove '.json' suffix\n return filename.slice(0, -5);\n })\n .sort();\n}\n\n/**\n * Type guard to check if config has AWS settings\n * \n * @param config - Environment configuration\n * @returns True if AWS configuration is present\n */\nexport function hasAWSConfig(config: EnvironmentConfig): config is EnvironmentConfig & { aws: AWSConfig } {\n return !!(config as any).aws && !!(config as any).aws.region;\n}\n\n/**\n * Display configuration for debugging\n * \n * @param config - Configuration to display\n */\nexport function displayConfiguration(config: EnvironmentConfig): void {\n console.log('Environment Configuration:');\n console.log(JSON.stringify(config, null, 2));\n}","/**\n * Environment validation utilities\n *\n * Pure functions - accept available environments as parameter instead of reading from filesystem\n */\n\nexport type Environment = string; // Allow any environment name\n\n/**\n * Type guard to check if a string is a valid Environment\n * @param value - The environment string to check\n * @param availableEnvironments - List of valid environment names\n */\nexport function isValidEnvironment(value: string | undefined, availableEnvironments: string[]): value is Environment {\n if (!value) return false;\n return availableEnvironments.includes(value);\n}\n\n/**\n * Parse environment string to Environment type\n * @param value - The environment string to parse\n * @param availableEnvironments - List of valid environment names\n * @returns Valid Environment type\n * @throws Error if environment is invalid or not provided\n */\nexport function parseEnvironment(value: string | undefined, availableEnvironments: string[]): Environment {\n if (!value) {\n throw new Error('Environment is required');\n }\n if (!isValidEnvironment(value, availableEnvironments)) {\n throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvironments.join(', ')}`);\n }\n return value;\n}\n\n/**\n * Validate and return environment or throw error\n * @param value - The environment string to validate\n * @param availableEnvironments - List of valid environment names\n * @throws Error if environment is invalid\n */\nexport function validateEnvironment(value: string | undefined, availableEnvironments: string[]): Environment {\n if (!value) {\n throw new Error('Environment is required');\n }\n if (!isValidEnvironment(value, availableEnvironments)) {\n throw new Error(`Invalid environment: ${value}. Available environments: ${availableEnvironments.join(', ')}`);\n }\n return value;\n}","/**\n * Platform Types Module\n *\n * Re-exports PlatformType from schema-generated types.\n * Platforms represent WHERE services run (infrastructure targets).\n */\n\nimport { PlatformType as SchemaPlatformType } from './config.types';\n\n/**\n * Platform type literals from JSON Schema\n * These represent the infrastructure targets where services can be deployed\n */\nexport type PlatformType = SchemaPlatformType;\n\n/**\n * Type guard to check if a string is a valid platform type\n *\n * @param value - Value to check\n * @returns True if value is a valid PlatformType\n */\nexport function isValidPlatformType(value: string): value is PlatformType {\n return ['aws', 'container', 'posix', 'external'].includes(value);\n}\n\n/**\n * Get all valid platform types\n *\n * @returns Array of all platform types\n */\nexport function getAllPlatformTypes(): PlatformType[] {\n return ['aws', 'container', 'posix', 'external'];\n}","/**\n * @semiont/core\n *\n * Core domain logic and utilities for the Semiont semantic knowledge platform.\n * For OpenAPI types, import directly from @semiont/api-client.\n */\n\n// NOTE: OpenAPI types are NOT re-exported from @semiont/core.\n// Import types directly from @semiont/api-client where needed:\n// import type { components } from '@semiont/api-client';\n// type Annotation = components['schemas']['Annotation'];\n\n// Creation methods\nexport { CREATION_METHODS } from './creation-methods';\nexport type { CreationMethod } from './creation-methods';\n\n// Identifier types (only IDs - URIs are in @semiont/api-client)\nexport type { ResourceId, AnnotationId, UserId } from './identifiers';\nexport {\n resourceId,\n annotationId,\n userId,\n isResourceId,\n isAnnotationId,\n} from './identifiers';\n\n// URI utilities\nexport {\n resourceIdToURI,\n uriToResourceId,\n annotationIdToURI,\n uriToAnnotationId,\n} from './uri-utils';\n\n// Graph types\nexport type {\n GraphConnection,\n GraphPath,\n EntityTypeStats,\n} from './graph';\n\n// Event types\nexport type {\n BaseEvent,\n ResourceEvent,\n ResourceEventType,\n SystemEvent,\n ResourceScopedEvent,\n ResourceCreatedEvent,\n ResourceClonedEvent,\n ResourceArchivedEvent,\n ResourceUnarchivedEvent,\n RepresentationAddedEvent,\n RepresentationRemovedEvent,\n AnnotationAddedEvent,\n AnnotationRemovedEvent,\n AnnotationBodyUpdatedEvent,\n JobStartedEvent,\n JobProgressEvent,\n JobCompletedEvent,\n JobFailedEvent,\n BodyOperation,\n BodyItem,\n EntityTagAddedEvent,\n EntityTagRemovedEvent,\n EventMetadata,\n EventSignature,\n StoredEvent,\n EventQuery,\n ResourceAnnotations,\n} from './events';\nexport {\n isResourceEvent,\n isSystemEvent,\n isResourceScopedEvent,\n getEventType,\n} from './events';\n\n// Event utilities\nexport {\n getAnnotationUriFromEvent,\n isEventRelatedToAnnotation,\n isResourceEvent as isStoredEvent,\n} from './event-utils';\n\n// Backend-specific annotation utilities\nexport { findBodyItem } from './annotation-utils';\n\n// Resource types\nexport type { UpdateResourceInput, ResourceFilter } from './resource-types';\n\n// Annotation types\nexport type { AnnotationCategory, CreateAnnotationInternal } from './annotation-types';\n\n// Auth types\nexport type { GoogleAuthRequest } from './auth-types';\n\n// Utility functions\nexport * from './type-guards';\nexport * from './errors';\nexport * from './did-utils';\n\n// Configuration loading - Pure functions (testable without filesystem)\nexport {\n deepMerge,\n resolveEnvVars,\n parseAndMergeConfigs,\n listEnvironmentNames,\n getNodeEnvForEnvironment,\n hasAWSConfig,\n displayConfiguration,\n // Types\n type EnvironmentConfig,\n type ServiceConfig,\n type AWSConfig,\n type SiteConfig,\n type AppConfig,\n} from './config/environment-loader';\n\nexport {\n parseEnvironment,\n validateEnvironment,\n type Environment,\n} from './config/environment-validator';\nexport {\n formatErrors,\n validateSemiontConfig,\n validateEnvironmentConfig,\n validateSiteConfig,\n type ValidationResult,\n} from './config/config-validator';\nexport { ConfigurationError } from './config/configuration-error';\nexport type { ProxyServiceConfig } from './config/config.types';\nexport {\n type PlatformType,\n isValidPlatformType,\n getAllPlatformTypes,\n} from './config/platform-types';\n\n// Schema-generated configuration types\nexport type {\n BackendServiceConfig,\n FrontendServiceConfig,\n DatabaseServiceConfig,\n GraphServiceConfig,\n FilesystemServiceConfig,\n InferenceServiceConfig,\n McpServiceConfig,\n ServicesConfig,\n SemiontConfig,\n GraphDatabaseType,\n ServicePlatformConfig\n} from './config/config.types';\n\n// Version information\nexport const CORE_TYPES_VERSION = '0.1.0';\nexport const SDK_VERSION = '0.1.0';\n"]}
|