@jaypie/dynamodb 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../src/client.ts","../../../../../src/constants.ts","../../../../../src/keyBuilders.ts","../../../../../src/entities.ts","../../../../../src/queries.ts","../../../../../src/mcp/admin/createTable.ts","../../../../../src/mcp/admin/dockerCompose.ts","../../../../../src/mcp/autoInit.ts","../../../../../src/mcp/admin/status.ts","../../../../../src/mcp/index.ts"],"sourcesContent":["import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport { DynamoDBDocumentClient } from \"@aws-sdk/lib-dynamodb\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport type { DynamoClientConfig } from \"./types.js\";\n\n// Environment variable names\nconst ENV_AWS_REGION = \"AWS_REGION\";\nconst ENV_DYNAMODB_TABLE_NAME = \"DYNAMODB_TABLE_NAME\";\n\n// Defaults\nconst DEFAULT_REGION = \"us-east-1\";\nconst LOCAL_CREDENTIALS = {\n accessKeyId: \"local\",\n secretAccessKey: \"local\",\n};\n\n// Module-level state\nlet docClient: DynamoDBDocumentClient | null = null;\nlet tableName: string | null = null;\n\n/**\n * Check if endpoint indicates local development mode\n */\nfunction isLocalEndpoint(endpoint?: string): boolean {\n if (!endpoint) return false;\n return endpoint.includes(\"127.0.0.1\") || endpoint.includes(\"localhost\");\n}\n\n/**\n * Initialize the DynamoDB client\n * Must be called once at application startup before using query functions\n *\n * @param config - Client configuration\n */\nexport function initClient(config: DynamoClientConfig = {}): void {\n const { endpoint } = config;\n const region =\n config.region ?? process.env[ENV_AWS_REGION] ?? DEFAULT_REGION;\n\n // Auto-detect local mode and use dummy credentials\n const credentials =\n config.credentials ??\n (isLocalEndpoint(endpoint) ? LOCAL_CREDENTIALS : undefined);\n\n const dynamoClient = new DynamoDBClient({\n ...(credentials && { credentials }),\n ...(endpoint && { endpoint }),\n region,\n });\n\n docClient = DynamoDBDocumentClient.from(dynamoClient, {\n marshallOptions: {\n removeUndefinedValues: true,\n },\n });\n\n tableName = config.tableName ?? process.env[ENV_DYNAMODB_TABLE_NAME] ?? null;\n}\n\n/**\n * Get the initialized DynamoDB Document Client\n * @throws ConfigurationError if client has not been initialized\n */\nexport function getDocClient(): DynamoDBDocumentClient {\n if (!docClient) {\n throw new ConfigurationError(\n \"DynamoDB client not initialized. Call initClient() first.\",\n );\n }\n return docClient;\n}\n\n/**\n * Get the configured table name\n * @throws ConfigurationError if client has not been initialized\n */\nexport function getTableName(): string {\n if (!tableName) {\n throw new ConfigurationError(\n \"DynamoDB client not initialized. Call initClient() first.\",\n );\n }\n return tableName;\n}\n\n/**\n * Check if the client has been initialized\n */\nexport function isInitialized(): boolean {\n return docClient !== null && tableName !== null;\n}\n\n/**\n * Reset the client state (primarily for testing)\n */\nexport function resetClient(): void {\n docClient = null;\n tableName = null;\n}\n","// Primary markers\nexport const APEX = \"@\"; // Root-level marker (DynamoDB prohibits empty strings)\nexport const SEPARATOR = \"#\"; // Composite key separator\n\n// GSI names\nexport const INDEX_ALIAS = \"indexAlias\";\nexport const INDEX_CLASS = \"indexClass\";\nexport const INDEX_OU = \"indexOu\";\nexport const INDEX_TYPE = \"indexType\";\nexport const INDEX_XID = \"indexXid\";\n\n// Index suffixes for soft state\nexport const ARCHIVED_SUFFIX = \"#archived\";\nexport const DELETED_SUFFIX = \"#deleted\";\n","import { APEX, SEPARATOR } from \"./constants.js\";\nimport type { FabricEntity, ParentReference } from \"./types.js\";\n\n/**\n * Build the indexOu key for hierarchical queries\n * @param ou - The organizational unit (APEX or \"{parent.model}#{parent.id}\")\n * @param model - The entity model name\n * @returns Composite key: \"{ou}#{model}\"\n */\nexport function buildIndexOu(ou: string, model: string): string {\n return `${ou}${SEPARATOR}${model}`;\n}\n\n/**\n * Build the indexAlias key for human-friendly lookups\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param alias - The human-friendly alias\n * @returns Composite key: \"{ou}#{model}#{alias}\"\n */\nexport function buildIndexAlias(\n ou: string,\n model: string,\n alias: string,\n): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${alias}`;\n}\n\n/**\n * Build the indexClass key for category filtering\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param recordClass - The category classification\n * @returns Composite key: \"{ou}#{model}#{class}\"\n */\nexport function buildIndexClass(\n ou: string,\n model: string,\n recordClass: string,\n): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${recordClass}`;\n}\n\n/**\n * Build the indexType key for type filtering\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param type - The type classification\n * @returns Composite key: \"{ou}#{model}#{type}\"\n */\nexport function buildIndexType(\n ou: string,\n model: string,\n type: string,\n): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${type}`;\n}\n\n/**\n * Build the indexXid key for external ID lookups\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param xid - The external ID\n * @returns Composite key: \"{ou}#{model}#{xid}\"\n */\nexport function buildIndexXid(ou: string, model: string, xid: string): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${xid}`;\n}\n\n/**\n * Calculate the organizational unit from a parent reference\n * @param parent - Optional parent entity reference\n * @returns APEX (\"@\") if no parent, otherwise \"{parent.model}#{parent.id}\"\n */\nexport function calculateOu(parent?: ParentReference): string {\n if (!parent) {\n return APEX;\n }\n return `${parent.model}${SEPARATOR}${parent.id}`;\n}\n\n/**\n * Auto-populate GSI index keys on an entity\n * - indexOu is always populated from ou + model\n * - indexAlias is populated only when alias is present\n * - indexClass is populated only when class is present\n * - indexType is populated only when type is present\n * - indexXid is populated only when xid is present\n *\n * @param entity - The entity to populate index keys for\n * @param suffix - Optional suffix to append to all index keys (e.g., \"#deleted\", \"#archived\")\n * @returns The entity with populated index keys\n */\nexport function indexEntity<T extends FabricEntity>(\n entity: T,\n suffix: string = \"\",\n): T {\n const result = { ...entity };\n\n // indexOu is always set (from ou + model)\n result.indexOu = buildIndexOu(entity.ou, entity.model) + suffix;\n\n // Optional indexes - only set when the source field is present\n if (entity.alias !== undefined) {\n result.indexAlias =\n buildIndexAlias(entity.ou, entity.model, entity.alias) + suffix;\n }\n\n if (entity.class !== undefined) {\n result.indexClass =\n buildIndexClass(entity.ou, entity.model, entity.class) + suffix;\n }\n\n if (entity.type !== undefined) {\n result.indexType =\n buildIndexType(entity.ou, entity.model, entity.type) + suffix;\n }\n\n if (entity.xid !== undefined) {\n result.indexXid =\n buildIndexXid(entity.ou, entity.model, entity.xid) + suffix;\n }\n\n return result;\n}\n","import { DeleteCommand, GetCommand, PutCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { serviceHandler } from \"@jaypie/vocabulary\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport { ARCHIVED_SUFFIX, DELETED_SUFFIX } from \"./constants.js\";\nimport { indexEntity } from \"./keyBuilders.js\";\nimport type { FabricEntity } from \"./types.js\";\n\n/**\n * Calculate suffix based on entity's archived/deleted state\n */\nfunction calculateEntitySuffix(entity: {\n archivedAt?: string;\n deletedAt?: string;\n}): string {\n const hasArchived = Boolean(entity.archivedAt);\n const hasDeleted = Boolean(entity.deletedAt);\n\n if (hasArchived && hasDeleted) {\n return ARCHIVED_SUFFIX + DELETED_SUFFIX;\n }\n if (hasArchived) {\n return ARCHIVED_SUFFIX;\n }\n if (hasDeleted) {\n return DELETED_SUFFIX;\n }\n return \"\";\n}\n\n/**\n * Get a single entity by primary key\n */\nexport const getEntity = serviceHandler({\n alias: \"getEntity\",\n description: \"Get a single entity by primary key\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<FabricEntity | null> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new GetCommand({\n Key: { id, model },\n TableName: tableName,\n });\n\n const response = await docClient.send(command);\n return (response.Item as FabricEntity) ?? null;\n },\n});\n\n/**\n * Put (create or replace) an entity\n * Auto-populates GSI index keys via indexEntity\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex FabricEntity objects that can't be coerced by vocabulary's type system.\n */\nexport async function putEntity({\n entity,\n}: {\n entity: FabricEntity;\n}): Promise<FabricEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Auto-populate index keys\n const indexedEntity = indexEntity(entity);\n\n const command = new PutCommand({\n Item: indexedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return indexedEntity;\n}\n\n/**\n * Update an existing entity\n * Auto-populates GSI index keys and sets updatedAt\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex FabricEntity objects that can't be coerced by vocabulary's type system.\n */\nexport async function updateEntity({\n entity,\n}: {\n entity: FabricEntity;\n}): Promise<FabricEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Update timestamp and re-index\n const updatedEntity = indexEntity({\n ...entity,\n updatedAt: new Date().toISOString(),\n });\n\n const command = new PutCommand({\n Item: updatedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return updatedEntity;\n}\n\n/**\n * Soft delete an entity by setting deletedAt timestamp\n * Re-indexes with appropriate suffix based on archived/deleted state\n */\nexport const deleteEntity = serviceHandler({\n alias: \"deleteEntity\",\n description: \"Soft delete an entity (sets deletedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Fetch the current entity\n const existing = await getEntity({ id, model });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n // Build updated entity with deletedAt\n const updatedEntity = {\n ...existing,\n deletedAt: now,\n updatedAt: now,\n };\n\n // Calculate suffix based on combined state (may already be archived)\n const suffix = calculateEntitySuffix(updatedEntity);\n const deletedEntity = indexEntity(updatedEntity, suffix);\n\n const command = new PutCommand({\n Item: deletedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n\n/**\n * Archive an entity by setting archivedAt timestamp\n * Re-indexes with appropriate suffix based on archived/deleted state\n */\nexport const archiveEntity = serviceHandler({\n alias: \"archiveEntity\",\n description: \"Archive an entity (sets archivedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Fetch the current entity\n const existing = await getEntity({ id, model });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n // Build updated entity with archivedAt\n const updatedEntity = {\n ...existing,\n archivedAt: now,\n updatedAt: now,\n };\n\n // Calculate suffix based on combined state (may already be deleted)\n const suffix = calculateEntitySuffix(updatedEntity);\n const archivedEntity = indexEntity(updatedEntity, suffix);\n\n const command = new PutCommand({\n Item: archivedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n\n/**\n * Hard delete an entity (permanently removes from table)\n * Use with caution - prefer deleteEntity for soft delete\n */\nexport const destroyEntity = serviceHandler({\n alias: \"destroyEntity\",\n description: \"Hard delete an entity (permanently removes from table)\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new DeleteCommand({\n Key: { id, model },\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n","import { QueryCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { serviceHandler } from \"@jaypie/vocabulary\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport {\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n INDEX_ALIAS,\n INDEX_CLASS,\n INDEX_OU,\n INDEX_TYPE,\n INDEX_XID,\n} from \"./constants.js\";\nimport {\n buildIndexAlias,\n buildIndexClass,\n buildIndexOu,\n buildIndexType,\n buildIndexXid,\n} from \"./keyBuilders.js\";\nimport type { BaseQueryOptions, FabricEntity, QueryResult } from \"./types.js\";\n\n/**\n * Calculate the suffix based on archived/deleted flags\n * When both are true, returns combined suffix (archived first, alphabetically)\n */\nfunction calculateSuffix({\n archived,\n deleted,\n}: {\n archived?: boolean;\n deleted?: boolean;\n}): string {\n if (archived && deleted) {\n return ARCHIVED_SUFFIX + DELETED_SUFFIX;\n }\n if (archived) {\n return ARCHIVED_SUFFIX;\n }\n if (deleted) {\n return DELETED_SUFFIX;\n }\n return \"\";\n}\n\n/**\n * Execute a GSI query with common options\n */\nasync function executeQuery<T extends FabricEntity>(\n indexName: string,\n keyValue: string,\n options: BaseQueryOptions = {},\n): Promise<QueryResult<T>> {\n const { ascending = false, limit, startKey } = options;\n\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new QueryCommand({\n ExclusiveStartKey: startKey as Record<string, unknown> | undefined,\n ExpressionAttributeNames: {\n \"#pk\": indexName,\n },\n ExpressionAttributeValues: {\n \":pkValue\": keyValue,\n },\n IndexName: indexName,\n KeyConditionExpression: \"#pk = :pkValue\",\n ...(limit && { Limit: limit }),\n ScanIndexForward: ascending,\n TableName: tableName,\n });\n\n const response = await docClient.send(command);\n\n return {\n items: (response.Items ?? []) as T[],\n lastEvaluatedKey: response.LastEvaluatedKey,\n };\n}\n\n/**\n * Query parameters for queryByOu\n */\ninterface QueryByOuParams extends BaseQueryOptions {\n model: string;\n ou: string;\n}\n\n/**\n * Query entities by organizational unit (parent hierarchy)\n * Uses indexOu GSI\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\n */\nexport async function queryByOu({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n ou,\n startKey,\n}: QueryByOuParams): Promise<QueryResult<FabricEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexOu(ou, model) + suffix;\n return executeQuery<FabricEntity>(INDEX_OU, keyValue, {\n ascending,\n limit,\n startKey,\n });\n}\n\n/**\n * Query a single entity by human-friendly alias\n * Uses indexAlias GSI\n */\nexport const queryByAlias = serviceHandler({\n alias: \"queryByAlias\",\n description: \"Query a single entity by human-friendly alias\",\n input: {\n alias: { type: String, description: \"Human-friendly alias\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n },\n service: async ({\n alias,\n archived,\n deleted,\n model,\n ou,\n }): Promise<FabricEntity | null> => {\n const aliasStr = alias as string;\n const archivedBool = archived as boolean | undefined;\n const deletedBool = deleted as boolean | undefined;\n const modelStr = model as string;\n const ouStr = ou as string;\n\n const suffix = calculateSuffix({ archived: archivedBool, deleted: deletedBool });\n const keyValue = buildIndexAlias(ouStr, modelStr, aliasStr) + suffix;\n const result = await executeQuery<FabricEntity>(INDEX_ALIAS, keyValue, {\n limit: 1,\n });\n return result.items[0] ?? null;\n },\n});\n\n/**\n * Query parameters for queryByClass\n */\ninterface QueryByClassParams extends BaseQueryOptions {\n model: string;\n ou: string;\n recordClass: string;\n}\n\n/**\n * Query entities by category classification\n * Uses indexClass GSI\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\n */\nexport async function queryByClass({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n ou,\n recordClass,\n startKey,\n}: QueryByClassParams): Promise<QueryResult<FabricEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexClass(ou, model, recordClass) + suffix;\n return executeQuery<FabricEntity>(INDEX_CLASS, keyValue, {\n ascending,\n limit,\n startKey,\n });\n}\n\n/**\n * Query parameters for queryByType\n */\ninterface QueryByTypeParams extends BaseQueryOptions {\n model: string;\n ou: string;\n type: string;\n}\n\n/**\n * Query entities by type classification\n * Uses indexType GSI\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\n */\nexport async function queryByType({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n ou,\n startKey,\n type,\n}: QueryByTypeParams): Promise<QueryResult<FabricEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexType(ou, model, type) + suffix;\n return executeQuery<FabricEntity>(INDEX_TYPE, keyValue, {\n ascending,\n limit,\n startKey,\n });\n}\n\n/**\n * Query a single entity by external ID\n * Uses indexXid GSI\n */\nexport const queryByXid = serviceHandler({\n alias: \"queryByXid\",\n description: \"Query a single entity by external ID\",\n input: {\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n xid: { type: String, description: \"External ID\" },\n },\n service: async ({\n archived,\n deleted,\n model,\n ou,\n xid,\n }): Promise<FabricEntity | null> => {\n const archivedBool = archived as boolean | undefined;\n const deletedBool = deleted as boolean | undefined;\n const modelStr = model as string;\n const ouStr = ou as string;\n const xidStr = xid as string;\n\n const suffix = calculateSuffix({ archived: archivedBool, deleted: deletedBool });\n const keyValue = buildIndexXid(ouStr, modelStr, xidStr) + suffix;\n const result = await executeQuery<FabricEntity>(INDEX_XID, keyValue, {\n limit: 1,\n });\n return result.items[0] ?? null;\n },\n});\n","import {\n CreateTableCommand,\n DescribeTableCommand,\n DynamoDBClient,\n} from \"@aws-sdk/client-dynamodb\";\nimport { serviceHandler } from \"@jaypie/vocabulary\";\n\nconst DEFAULT_ENDPOINT = \"http://127.0.0.1:8000\";\nconst DEFAULT_REGION = \"us-east-1\";\nconst DEFAULT_TABLE_NAME = \"jaypie-local\";\n\n/**\n * DynamoDB table schema with Jaypie GSI pattern\n */\nfunction createTableParams(\n tableName: string,\n billingMode: \"PAY_PER_REQUEST\" | \"PROVISIONED\",\n) {\n const gsiProjection = { ProjectionType: \"ALL\" as const };\n\n return {\n AttributeDefinitions: [\n { AttributeName: \"id\", AttributeType: \"S\" as const },\n { AttributeName: \"indexAlias\", AttributeType: \"S\" as const },\n { AttributeName: \"indexClass\", AttributeType: \"S\" as const },\n { AttributeName: \"indexOu\", AttributeType: \"S\" as const },\n { AttributeName: \"indexType\", AttributeType: \"S\" as const },\n { AttributeName: \"indexXid\", AttributeType: \"S\" as const },\n { AttributeName: \"model\", AttributeType: \"S\" as const },\n { AttributeName: \"sequence\", AttributeType: \"N\" as const },\n ],\n BillingMode: billingMode,\n GlobalSecondaryIndexes: [\n {\n IndexName: \"indexOu\",\n KeySchema: [\n { AttributeName: \"indexOu\", KeyType: \"HASH\" as const },\n { AttributeName: \"sequence\", KeyType: \"RANGE\" as const },\n ],\n Projection: gsiProjection,\n },\n {\n IndexName: \"indexAlias\",\n KeySchema: [\n { AttributeName: \"indexAlias\", KeyType: \"HASH\" as const },\n { AttributeName: \"sequence\", KeyType: \"RANGE\" as const },\n ],\n Projection: gsiProjection,\n },\n {\n IndexName: \"indexClass\",\n KeySchema: [\n { AttributeName: \"indexClass\", KeyType: \"HASH\" as const },\n { AttributeName: \"sequence\", KeyType: \"RANGE\" as const },\n ],\n Projection: gsiProjection,\n },\n {\n IndexName: \"indexType\",\n KeySchema: [\n { AttributeName: \"indexType\", KeyType: \"HASH\" as const },\n { AttributeName: \"sequence\", KeyType: \"RANGE\" as const },\n ],\n Projection: gsiProjection,\n },\n {\n IndexName: \"indexXid\",\n KeySchema: [\n { AttributeName: \"indexXid\", KeyType: \"HASH\" as const },\n { AttributeName: \"sequence\", KeyType: \"RANGE\" as const },\n ],\n Projection: gsiProjection,\n },\n ],\n KeySchema: [\n { AttributeName: \"model\", KeyType: \"HASH\" as const },\n { AttributeName: \"id\", KeyType: \"RANGE\" as const },\n ],\n TableName: tableName,\n };\n}\n\n/**\n * Create DynamoDB table with Jaypie GSI schema\n */\nexport const createTableHandler = serviceHandler({\n alias: \"dynamodb_create_table\",\n description: \"Create DynamoDB table with Jaypie GSI schema\",\n input: {\n billingMode: {\n type: [\"PAY_PER_REQUEST\", \"PROVISIONED\"] as const,\n default: \"PAY_PER_REQUEST\",\n description: \"DynamoDB billing mode\",\n },\n endpoint: {\n type: String,\n default: DEFAULT_ENDPOINT,\n description: \"DynamoDB endpoint URL\",\n },\n tableName: {\n type: String,\n default: DEFAULT_TABLE_NAME,\n description: \"Table name to create\",\n },\n },\n service: async ({ billingMode, endpoint, tableName }) => {\n const endpointStr = endpoint as string;\n const tableNameStr = tableName as string;\n const billingModeStr = billingMode as \"PAY_PER_REQUEST\" | \"PROVISIONED\";\n\n const client = new DynamoDBClient({\n credentials: {\n accessKeyId: \"local\",\n secretAccessKey: \"local\",\n },\n endpoint: endpointStr,\n region: DEFAULT_REGION,\n });\n\n try {\n // Check if table already exists\n await client.send(new DescribeTableCommand({ TableName: tableNameStr }));\n return {\n message: `Table \"${tableNameStr}\" already exists`,\n success: false,\n tableName: tableNameStr,\n };\n } catch (error) {\n if ((error as { name?: string }).name !== \"ResourceNotFoundException\") {\n throw error;\n }\n }\n\n // Create the table\n const tableParams = createTableParams(tableNameStr, billingModeStr);\n await client.send(new CreateTableCommand(tableParams));\n\n return {\n message: \"Table created successfully\",\n success: true,\n tableName: tableNameStr,\n };\n },\n});\n","import { serviceHandler } from \"@jaypie/vocabulary\";\n\nconst DEFAULT_ADMIN_PORT = 8001;\nconst DEFAULT_DYNAMODB_PORT = 8000;\nconst DEFAULT_PROJECT_NAME = \"jaypie\";\nconst DEFAULT_TABLE_NAME = \"jaypie-local\";\n\n/**\n * Generate docker-compose.yml for local DynamoDB development\n */\nexport const dockerComposeHandler = serviceHandler({\n alias: \"dynamodb_generate_docker_compose\",\n description: \"Generate docker-compose.yml for local DynamoDB development\",\n input: {\n adminPort: {\n type: Number,\n default: DEFAULT_ADMIN_PORT,\n description: \"Port for DynamoDB Admin UI\",\n },\n dynamodbPort: {\n type: Number,\n default: DEFAULT_DYNAMODB_PORT,\n description: \"Port for DynamoDB Local\",\n },\n projectName: {\n type: String,\n default: DEFAULT_PROJECT_NAME,\n description: \"Project name for container naming\",\n },\n tableName: {\n type: String,\n default: DEFAULT_TABLE_NAME,\n description: \"Default table name\",\n },\n },\n service: async ({ adminPort, dynamodbPort, projectName, tableName }) => {\n const dockerCompose = `name: ${projectName}-dynamodb-stack\n\nservices:\n dynamodb:\n image: amazon/dynamodb-local:latest\n container_name: ${projectName}-dynamodb\n command: \"-jar DynamoDBLocal.jar -sharedDb -dbPath /data\"\n ports:\n - \"${dynamodbPort}:8000\"\n working_dir: /home/dynamodblocal\n volumes:\n - dynamodb_data:/data\n user: \"0:0\"\n\n dynamodb-admin:\n image: aaronshaf/dynamodb-admin:latest\n container_name: ${projectName}-dynamodb-admin\n ports:\n - \"${adminPort}:8001\"\n environment:\n - DYNAMO_ENDPOINT=http://dynamodb:8000\n - AWS_REGION=us-east-1\n - AWS_ACCESS_KEY_ID=local\n - AWS_SECRET_ACCESS_KEY=local\n depends_on:\n - dynamodb\n\nvolumes:\n dynamodb_data:\n driver: local\n`;\n\n const envVars = {\n AWS_REGION: \"us-east-1\",\n DYNAMODB_ENDPOINT: `http://127.0.0.1:${dynamodbPort}`,\n DYNAMODB_TABLE_NAME: tableName,\n };\n\n const envFile = `# DynamoDB Local Configuration\nDYNAMODB_TABLE_NAME=${tableName}\nDYNAMODB_ENDPOINT=http://127.0.0.1:${dynamodbPort}\nAWS_REGION=us-east-1\n`;\n\n return {\n dockerCompose,\n envFile,\n envVars,\n };\n },\n});\n","import { ConfigurationError } from \"@jaypie/errors\";\n\nimport { initClient, isInitialized } from \"../client.js\";\n\nconst DEFAULT_REGION = \"us-east-1\";\n\n/**\n * Ensure DynamoDB client is initialized from environment variables\n * Called automatically before each MCP tool execution\n */\nexport function ensureInitialized(): void {\n if (isInitialized()) {\n return;\n }\n\n const tableName = process.env.DYNAMODB_TABLE_NAME;\n if (!tableName) {\n throw new ConfigurationError(\n \"DYNAMODB_TABLE_NAME environment variable is required\",\n );\n }\n\n initClient({\n endpoint: process.env.DYNAMODB_ENDPOINT,\n region: process.env.AWS_REGION || DEFAULT_REGION,\n tableName,\n });\n}\n","import { serviceHandler } from \"@jaypie/vocabulary\";\n\nimport { getTableName, isInitialized } from \"../../client.js\";\nimport { ensureInitialized } from \"../autoInit.js\";\n\n/**\n * Check DynamoDB connection status and configuration\n */\nexport const statusHandler = serviceHandler({\n alias: \"dynamodb_status\",\n description: \"Check DynamoDB connection status and configuration\",\n service: async () => {\n ensureInitialized();\n return {\n endpoint: process.env.DYNAMODB_ENDPOINT || \"AWS Default\",\n initialized: isInitialized(),\n region: process.env.AWS_REGION || \"us-east-1\",\n tableName: getTableName(),\n };\n },\n});\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerMcpTool } from \"@jaypie/vocabulary/mcp\";\nimport { serviceHandler, type ServiceHandlerFunction } from \"@jaypie/vocabulary\";\n\nimport {\n archiveEntity,\n deleteEntity,\n destroyEntity,\n getEntity,\n putEntity,\n queryByAlias,\n queryByClass,\n queryByOu,\n queryByType,\n queryByXid,\n updateEntity,\n} from \"../index.js\";\nimport type { FabricEntity } from \"../types.js\";\nimport {\n createTableHandler,\n dockerComposeHandler,\n statusHandler,\n} from \"./admin/index.js\";\nimport { ensureInitialized } from \"./autoInit.js\";\n\nexport interface RegisterDynamoDbToolsConfig {\n /** MCP server to register tools with */\n server: McpServer;\n /** Include admin tools (create_table, docker_compose, status). Default: true */\n includeAdmin?: boolean;\n}\n\nexport interface RegisterDynamoDbToolsResult {\n /** Names of registered tools */\n tools: string[];\n}\n\n/**\n * Wrap a handler to auto-initialize before execution\n */\nfunction wrapWithInit(\n handler: ServiceHandlerFunction,\n): ServiceHandlerFunction {\n const wrapped = async (input: Record<string, unknown>) => {\n ensureInitialized();\n return handler(input);\n };\n // Preserve handler properties for MCP registration\n Object.assign(wrapped, {\n alias: handler.alias,\n description: handler.description,\n input: handler.input,\n });\n return wrapped as ServiceHandlerFunction;\n}\n\n// MCP-specific serviceHandler wrappers for functions with complex inputs\n// Note: These wrap the regular async functions to make them work with registerMcpTool\n\n/**\n * MCP wrapper for putEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpPutEntity = serviceHandler({\n alias: \"dynamodb_put\",\n description: \"Create or replace an entity in DynamoDB (auto-indexes GSI keys)\",\n input: {\n // Required entity fields\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model name (partition key)\" },\n name: { type: String, description: \"Entity name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n // Optional fields\n alias: { type: String, required: false, description: \"Human-friendly alias\" },\n class: { type: String, required: false, description: \"Category classification\" },\n type: { type: String, required: false, description: \"Type classification\" },\n xid: { type: String, required: false, description: \"External ID\" },\n },\n service: async (input) => {\n const now = new Date().toISOString();\n const entity: FabricEntity = {\n alias: input.alias as string | undefined,\n class: input.class as string | undefined,\n createdAt: now,\n id: input.id as string,\n model: input.model as string,\n name: input.name as string,\n ou: input.ou as string,\n sequence: Date.now(),\n type: input.type as string | undefined,\n updatedAt: now,\n xid: input.xid as string | undefined,\n };\n return putEntity({ entity });\n },\n});\n\n/**\n * MCP wrapper for updateEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpUpdateEntity = serviceHandler({\n alias: \"dynamodb_update\",\n description: \"Update an entity in DynamoDB (sets updatedAt, re-indexes GSI keys)\",\n input: {\n // Required fields to identify the entity\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model name (partition key)\" },\n // Fields that can be updated\n name: { type: String, required: false, description: \"Entity name\" },\n ou: { type: String, required: false, description: \"Organizational unit\" },\n alias: { type: String, required: false, description: \"Human-friendly alias\" },\n class: { type: String, required: false, description: \"Category classification\" },\n type: { type: String, required: false, description: \"Type classification\" },\n xid: { type: String, required: false, description: \"External ID\" },\n },\n service: async (input) => {\n // First get the existing entity\n const existing = await getEntity({\n id: input.id as string,\n model: input.model as string,\n });\n if (!existing) {\n return { error: \"Entity not found\", id: input.id, model: input.model };\n }\n // Merge updates\n const entity: FabricEntity = {\n ...existing,\n ...(input.alias !== undefined && { alias: input.alias as string }),\n ...(input.class !== undefined && { class: input.class as string }),\n ...(input.name !== undefined && { name: input.name as string }),\n ...(input.ou !== undefined && { ou: input.ou as string }),\n ...(input.type !== undefined && { type: input.type as string }),\n ...(input.xid !== undefined && { xid: input.xid as string }),\n };\n return updateEntity({ entity });\n },\n});\n\n/**\n * MCP wrapper for queryByOu\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByOu = serviceHandler({\n alias: \"dynamodb_query_ou\",\n description: \"Query entities by organizational unit (parent hierarchy)\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n ascending: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Sort ascending (oldest first)\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n limit: {\n type: Number,\n required: false,\n description: \"Maximum number of items to return\",\n },\n },\n service: async (input) => {\n return queryByOu({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n ou: input.ou as string,\n });\n },\n});\n\n/**\n * MCP wrapper for queryByClass\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByClass = serviceHandler({\n alias: \"dynamodb_query_class\",\n description: \"Query entities by category classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n recordClass: { type: String, description: \"Category classification\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n ascending: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Sort ascending (oldest first)\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n limit: {\n type: Number,\n required: false,\n description: \"Maximum number of items to return\",\n },\n },\n service: async (input) => {\n return queryByClass({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n ou: input.ou as string,\n recordClass: input.recordClass as string,\n });\n },\n});\n\n/**\n * MCP wrapper for queryByType\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByType = serviceHandler({\n alias: \"dynamodb_query_type\",\n description: \"Query entities by type classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n type: { type: String, description: \"Type classification\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n ascending: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Sort ascending (oldest first)\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n limit: {\n type: Number,\n required: false,\n description: \"Maximum number of items to return\",\n },\n },\n service: async (input) => {\n return queryByType({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n ou: input.ou as string,\n type: input.type as string,\n });\n },\n});\n\n/**\n * Register all DynamoDB MCP tools with a server\n */\nexport function registerDynamoDbTools(\n config: RegisterDynamoDbToolsConfig,\n): RegisterDynamoDbToolsResult {\n const { includeAdmin = true, server } = config;\n const tools: string[] = [];\n\n // Entity operations\n registerMcpTool({\n handler: wrapWithInit(getEntity),\n name: \"dynamodb_get\",\n server,\n });\n tools.push(\"dynamodb_get\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpPutEntity),\n name: \"dynamodb_put\",\n server,\n });\n tools.push(\"dynamodb_put\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpUpdateEntity),\n name: \"dynamodb_update\",\n server,\n });\n tools.push(\"dynamodb_update\");\n\n registerMcpTool({\n handler: wrapWithInit(deleteEntity),\n name: \"dynamodb_delete\",\n server,\n });\n tools.push(\"dynamodb_delete\");\n\n registerMcpTool({\n handler: wrapWithInit(archiveEntity),\n name: \"dynamodb_archive\",\n server,\n });\n tools.push(\"dynamodb_archive\");\n\n registerMcpTool({\n handler: wrapWithInit(destroyEntity),\n name: \"dynamodb_destroy\",\n server,\n });\n tools.push(\"dynamodb_destroy\");\n\n // Query operations\n registerMcpTool({\n handler: wrapWithInit(mcpQueryByOu),\n name: \"dynamodb_query_ou\",\n server,\n });\n tools.push(\"dynamodb_query_ou\");\n\n registerMcpTool({\n handler: wrapWithInit(queryByAlias),\n name: \"dynamodb_query_alias\",\n server,\n });\n tools.push(\"dynamodb_query_alias\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpQueryByClass),\n name: \"dynamodb_query_class\",\n server,\n });\n tools.push(\"dynamodb_query_class\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpQueryByType),\n name: \"dynamodb_query_type\",\n server,\n });\n tools.push(\"dynamodb_query_type\");\n\n registerMcpTool({\n handler: wrapWithInit(queryByXid),\n name: \"dynamodb_query_xid\",\n server,\n });\n tools.push(\"dynamodb_query_xid\");\n\n // Admin tools (MCP-only)\n if (includeAdmin) {\n registerMcpTool({ handler: statusHandler, server });\n tools.push(\"dynamodb_status\");\n\n registerMcpTool({ handler: createTableHandler, server });\n tools.push(\"dynamodb_create_table\");\n\n registerMcpTool({ handler: dockerComposeHandler, server });\n tools.push(\"dynamodb_generate_docker_compose\");\n }\n\n return { tools };\n}\n\n// Export individual handlers for direct use\nexport {\n createTableHandler,\n dockerComposeHandler,\n statusHandler,\n} from \"./admin/index.js\";\n\nexport { ensureInitialized } from \"./autoInit.js\";\n"],"names":["DEFAULT_REGION","DynamoDBClient","DynamoDBDocumentClient","ConfigurationError","serviceHandler","GetCommand","PutCommand","DeleteCommand","QueryCommand","DEFAULT_TABLE_NAME","DescribeTableCommand","CreateTableCommand","registerMcpTool"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/client.ts","../../../../../src/constants.ts","../../../../../src/keyBuilders.ts","../../../../../src/entities.ts","../../../../../src/queries.ts","../../../../../src/mcp/admin/createTable.ts","../../../../../src/mcp/admin/dockerCompose.ts","../../../../../src/mcp/autoInit.ts","../../../../../src/mcp/admin/status.ts","../../../../../src/mcp/index.ts"],"sourcesContent":["import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport { DynamoDBDocumentClient } from \"@aws-sdk/lib-dynamodb\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport type { DynamoClientConfig } from \"./types.js\";\n\n// Environment variable names\nconst ENV_AWS_REGION = \"AWS_REGION\";\nconst ENV_DYNAMODB_TABLE_NAME = \"DYNAMODB_TABLE_NAME\";\n\n// Defaults\nconst DEFAULT_REGION = \"us-east-1\";\nconst LOCAL_CREDENTIALS = {\n accessKeyId: \"local\",\n secretAccessKey: \"local\",\n};\n\n// Module-level state\nlet docClient: DynamoDBDocumentClient | null = null;\nlet tableName: string | null = null;\n\n/**\n * Check if endpoint indicates local development mode\n */\nfunction isLocalEndpoint(endpoint?: string): boolean {\n if (!endpoint) return false;\n return endpoint.includes(\"127.0.0.1\") || endpoint.includes(\"localhost\");\n}\n\n/**\n * Initialize the DynamoDB client\n * Must be called once at application startup before using query functions\n *\n * @param config - Client configuration\n */\nexport function initClient(config: DynamoClientConfig = {}): void {\n const { endpoint } = config;\n const region =\n config.region ?? process.env[ENV_AWS_REGION] ?? DEFAULT_REGION;\n\n // Auto-detect local mode and use dummy credentials\n const credentials =\n config.credentials ??\n (isLocalEndpoint(endpoint) ? LOCAL_CREDENTIALS : undefined);\n\n const dynamoClient = new DynamoDBClient({\n ...(credentials && { credentials }),\n ...(endpoint && { endpoint }),\n region,\n });\n\n docClient = DynamoDBDocumentClient.from(dynamoClient, {\n marshallOptions: {\n removeUndefinedValues: true,\n },\n });\n\n tableName = config.tableName ?? process.env[ENV_DYNAMODB_TABLE_NAME] ?? null;\n}\n\n/**\n * Get the initialized DynamoDB Document Client\n * @throws ConfigurationError if client has not been initialized\n */\nexport function getDocClient(): DynamoDBDocumentClient {\n if (!docClient) {\n throw new ConfigurationError(\n \"DynamoDB client not initialized. Call initClient() first.\",\n );\n }\n return docClient;\n}\n\n/**\n * Get the configured table name\n * @throws ConfigurationError if client has not been initialized\n */\nexport function getTableName(): string {\n if (!tableName) {\n throw new ConfigurationError(\n \"DynamoDB client not initialized. Call initClient() first.\",\n );\n }\n return tableName;\n}\n\n/**\n * Check if the client has been initialized\n */\nexport function isInitialized(): boolean {\n return docClient !== null && tableName !== null;\n}\n\n/**\n * Reset the client state (primarily for testing)\n */\nexport function resetClient(): void {\n docClient = null;\n tableName = null;\n}\n","// Re-export shared constants from vocabulary\nexport { APEX, ARCHIVED_SUFFIX, DELETED_SUFFIX, SEPARATOR } from \"@jaypie/vocabulary\";\n\n// GSI names (derived from DEFAULT_INDEXES)\nexport const INDEX_ALIAS = \"indexAlias\";\nexport const INDEX_CLASS = \"indexClass\";\nexport const INDEX_OU = \"indexOu\";\nexport const INDEX_TYPE = \"indexType\";\nexport const INDEX_XID = \"indexXid\";\n","import {\n buildCompositeKey as vocabBuildCompositeKey,\n calculateOu as vocabCalculateOu,\n DEFAULT_INDEXES,\n getModelIndexes,\n type IndexableEntity,\n populateIndexKeys as vocabPopulateIndexKeys,\n} from \"@jaypie/vocabulary\";\n\nimport { APEX, SEPARATOR } from \"./constants.js\";\nimport type { ParentReference, StorableEntity } from \"./types.js\";\n\n// =============================================================================\n// Key Builders\n// =============================================================================\n\n/**\n * Build the indexOu key for hierarchical queries\n * @param ou - The organizational unit (APEX or \"{parent.model}#{parent.id}\")\n * @param model - The entity model name\n * @returns Composite key: \"{ou}#{model}\"\n */\nexport function buildIndexOu(ou: string, model: string): string {\n return `${ou}${SEPARATOR}${model}`;\n}\n\n/**\n * Build the indexAlias key for human-friendly lookups\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param alias - The human-friendly alias\n * @returns Composite key: \"{ou}#{model}#{alias}\"\n */\nexport function buildIndexAlias(\n ou: string,\n model: string,\n alias: string,\n): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${alias}`;\n}\n\n/**\n * Build the indexClass key for category filtering\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param recordClass - The category classification\n * @returns Composite key: \"{ou}#{model}#{class}\"\n */\nexport function buildIndexClass(\n ou: string,\n model: string,\n recordClass: string,\n): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${recordClass}`;\n}\n\n/**\n * Build the indexType key for type filtering\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param type - The type classification\n * @returns Composite key: \"{ou}#{model}#{type}\"\n */\nexport function buildIndexType(\n ou: string,\n model: string,\n type: string,\n): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${type}`;\n}\n\n/**\n * Build the indexXid key for external ID lookups\n * @param ou - The organizational unit\n * @param model - The entity model name\n * @param xid - The external ID\n * @returns Composite key: \"{ou}#{model}#{xid}\"\n */\nexport function buildIndexXid(ou: string, model: string, xid: string): string {\n return `${ou}${SEPARATOR}${model}${SEPARATOR}${xid}`;\n}\n\n// =============================================================================\n// New Vocabulary-Based Functions\n// =============================================================================\n\n/**\n * Build a composite key from entity fields\n *\n * @param entity - Entity with fields to extract\n * @param fields - Field names to combine with SEPARATOR\n * @param suffix - Optional suffix to append (e.g., \"#deleted\")\n * @returns Composite key string\n */\nexport function buildCompositeKey(\n entity: IndexableEntity,\n fields: string[],\n suffix?: string,\n): string {\n return vocabBuildCompositeKey(entity, fields, suffix);\n}\n\n/**\n * Calculate the organizational unit from a parent reference\n * @param parent - Optional parent entity reference\n * @returns APEX (\"@\") if no parent, otherwise \"{parent.model}#{parent.id}\"\n */\nexport function calculateOu(parent?: ParentReference): string {\n if (!parent) {\n return APEX;\n }\n return vocabCalculateOu(parent);\n}\n\n/**\n * Auto-populate GSI index keys on an entity\n *\n * Uses the model's registered indexes (from vocabulary registry) or\n * DEFAULT_INDEXES if no custom indexes are registered.\n *\n * - indexOu is always populated from ou + model\n * - indexAlias is populated only when alias is present\n * - indexClass is populated only when class is present\n * - indexType is populated only when type is present\n * - indexXid is populated only when xid is present\n *\n * @param entity - The entity to populate index keys for\n * @param suffix - Optional suffix to append to all index keys (e.g., \"#deleted\", \"#archived\")\n * @returns The entity with populated index keys\n */\nexport function indexEntity<T extends StorableEntity>(\n entity: T,\n suffix: string = \"\",\n): T {\n const indexes = getModelIndexes(entity.model);\n // Cast through unknown to bridge the type gap between StorableEntity and IndexableEntity\n return vocabPopulateIndexKeys(entity as unknown as IndexableEntity, indexes, suffix) as unknown as T;\n}\n\n// Re-export DEFAULT_INDEXES for convenience\nexport { DEFAULT_INDEXES };\n","import { DeleteCommand, GetCommand, PutCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { serviceHandler } from \"@jaypie/vocabulary\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport { ARCHIVED_SUFFIX, DELETED_SUFFIX } from \"./constants.js\";\nimport { indexEntity } from \"./keyBuilders.js\";\nimport type { StorableEntity } from \"./types.js\";\n\n/**\n * Calculate suffix based on entity's archived/deleted state\n */\nfunction calculateEntitySuffix(entity: {\n archivedAt?: string;\n deletedAt?: string;\n}): string {\n const hasArchived = Boolean(entity.archivedAt);\n const hasDeleted = Boolean(entity.deletedAt);\n\n if (hasArchived && hasDeleted) {\n return ARCHIVED_SUFFIX + DELETED_SUFFIX;\n }\n if (hasArchived) {\n return ARCHIVED_SUFFIX;\n }\n if (hasDeleted) {\n return DELETED_SUFFIX;\n }\n return \"\";\n}\n\n/**\n * Get a single entity by primary key\n */\nexport const getEntity = serviceHandler({\n alias: \"getEntity\",\n description: \"Get a single entity by primary key\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<StorableEntity | null> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new GetCommand({\n Key: { id, model },\n TableName: tableName,\n });\n\n const response = await docClient.send(command);\n return (response.Item as StorableEntity) ?? null;\n },\n});\n\n/**\n * Put (create or replace) an entity\n * Auto-populates GSI index keys via indexEntity\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex StorableEntity objects that can't be coerced by vocabulary's type system.\n */\nexport async function putEntity({\n entity,\n}: {\n entity: StorableEntity;\n}): Promise<StorableEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Auto-populate index keys\n const indexedEntity = indexEntity(entity);\n\n const command = new PutCommand({\n Item: indexedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return indexedEntity;\n}\n\n/**\n * Update an existing entity\n * Auto-populates GSI index keys and sets updatedAt\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex StorableEntity objects that can't be coerced by vocabulary's type system.\n */\nexport async function updateEntity({\n entity,\n}: {\n entity: StorableEntity;\n}): Promise<StorableEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Update timestamp and re-index\n const updatedEntity = indexEntity({\n ...entity,\n updatedAt: new Date().toISOString(),\n });\n\n const command = new PutCommand({\n Item: updatedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return updatedEntity;\n}\n\n/**\n * Soft delete an entity by setting deletedAt timestamp\n * Re-indexes with appropriate suffix based on archived/deleted state\n */\nexport const deleteEntity = serviceHandler({\n alias: \"deleteEntity\",\n description: \"Soft delete an entity (sets deletedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Fetch the current entity\n const existing = await getEntity({ id, model });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n // Build updated entity with deletedAt\n const updatedEntity = {\n ...existing,\n deletedAt: now,\n updatedAt: now,\n };\n\n // Calculate suffix based on combined state (may already be archived)\n const suffix = calculateEntitySuffix(updatedEntity);\n const deletedEntity = indexEntity(updatedEntity, suffix);\n\n const command = new PutCommand({\n Item: deletedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n\n/**\n * Archive an entity by setting archivedAt timestamp\n * Re-indexes with appropriate suffix based on archived/deleted state\n */\nexport const archiveEntity = serviceHandler({\n alias: \"archiveEntity\",\n description: \"Archive an entity (sets archivedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n // Fetch the current entity\n const existing = await getEntity({ id, model });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n // Build updated entity with archivedAt\n const updatedEntity = {\n ...existing,\n archivedAt: now,\n updatedAt: now,\n };\n\n // Calculate suffix based on combined state (may already be deleted)\n const suffix = calculateEntitySuffix(updatedEntity);\n const archivedEntity = indexEntity(updatedEntity, suffix);\n\n const command = new PutCommand({\n Item: archivedEntity,\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n\n/**\n * Hard delete an entity (permanently removes from table)\n * Use with caution - prefer deleteEntity for soft delete\n */\nexport const destroyEntity = serviceHandler({\n alias: \"destroyEntity\",\n description: \"Hard delete an entity (permanently removes from table)\",\n input: {\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model (partition key)\" },\n },\n service: async ({ id, model }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new DeleteCommand({\n Key: { id, model },\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n","import { QueryCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { serviceHandler } from \"@jaypie/vocabulary\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport {\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n INDEX_ALIAS,\n INDEX_CLASS,\n INDEX_OU,\n INDEX_TYPE,\n INDEX_XID,\n} from \"./constants.js\";\nimport {\n buildIndexAlias,\n buildIndexClass,\n buildIndexOu,\n buildIndexType,\n buildIndexXid,\n} from \"./keyBuilders.js\";\nimport type { BaseQueryOptions, StorableEntity, QueryResult } from \"./types.js\";\n\n/**\n * Calculate the suffix based on archived/deleted flags\n * When both are true, returns combined suffix (archived first, alphabetically)\n */\nfunction calculateSuffix({\n archived,\n deleted,\n}: {\n archived?: boolean;\n deleted?: boolean;\n}): string {\n if (archived && deleted) {\n return ARCHIVED_SUFFIX + DELETED_SUFFIX;\n }\n if (archived) {\n return ARCHIVED_SUFFIX;\n }\n if (deleted) {\n return DELETED_SUFFIX;\n }\n return \"\";\n}\n\n/**\n * Execute a GSI query with common options\n */\nasync function executeQuery<T extends StorableEntity>(\n indexName: string,\n keyValue: string,\n options: BaseQueryOptions = {},\n): Promise<QueryResult<T>> {\n const { ascending = false, limit, startKey } = options;\n\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new QueryCommand({\n ExclusiveStartKey: startKey as Record<string, unknown> | undefined,\n ExpressionAttributeNames: {\n \"#pk\": indexName,\n },\n ExpressionAttributeValues: {\n \":pkValue\": keyValue,\n },\n IndexName: indexName,\n KeyConditionExpression: \"#pk = :pkValue\",\n ...(limit && { Limit: limit }),\n ScanIndexForward: ascending,\n TableName: tableName,\n });\n\n const response = await docClient.send(command);\n\n return {\n items: (response.Items ?? []) as T[],\n lastEvaluatedKey: response.LastEvaluatedKey,\n };\n}\n\n/**\n * Query parameters for queryByOu\n */\ninterface QueryByOuParams extends BaseQueryOptions {\n model: string;\n ou: string;\n}\n\n/**\n * Query entities by organizational unit (parent hierarchy)\n * Uses indexOu GSI\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\n */\nexport async function queryByOu({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n ou,\n startKey,\n}: QueryByOuParams): Promise<QueryResult<StorableEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexOu(ou, model) + suffix;\n return executeQuery<StorableEntity>(INDEX_OU, keyValue, {\n ascending,\n limit,\n startKey,\n });\n}\n\n/**\n * Query a single entity by human-friendly alias\n * Uses indexAlias GSI\n */\nexport const queryByAlias = serviceHandler({\n alias: \"queryByAlias\",\n description: \"Query a single entity by human-friendly alias\",\n input: {\n alias: { type: String, description: \"Human-friendly alias\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n },\n service: async ({\n alias,\n archived,\n deleted,\n model,\n ou,\n }): Promise<StorableEntity | null> => {\n const aliasStr = alias as string;\n const archivedBool = archived as boolean | undefined;\n const deletedBool = deleted as boolean | undefined;\n const modelStr = model as string;\n const ouStr = ou as string;\n\n const suffix = calculateSuffix({ archived: archivedBool, deleted: deletedBool });\n const keyValue = buildIndexAlias(ouStr, modelStr, aliasStr) + suffix;\n const result = await executeQuery<StorableEntity>(INDEX_ALIAS, keyValue, {\n limit: 1,\n });\n return result.items[0] ?? null;\n },\n});\n\n/**\n * Query parameters for queryByClass\n */\ninterface QueryByClassParams extends BaseQueryOptions {\n model: string;\n ou: string;\n recordClass: string;\n}\n\n/**\n * Query entities by category classification\n * Uses indexClass GSI\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\n */\nexport async function queryByClass({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n ou,\n recordClass,\n startKey,\n}: QueryByClassParams): Promise<QueryResult<StorableEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexClass(ou, model, recordClass) + suffix;\n return executeQuery<StorableEntity>(INDEX_CLASS, keyValue, {\n ascending,\n limit,\n startKey,\n });\n}\n\n/**\n * Query parameters for queryByType\n */\ninterface QueryByTypeParams extends BaseQueryOptions {\n model: string;\n ou: string;\n type: string;\n}\n\n/**\n * Query entities by type classification\n * Uses indexType GSI\n *\n * Note: This is a regular async function (not serviceHandler) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\n */\nexport async function queryByType({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n ou,\n startKey,\n type,\n}: QueryByTypeParams): Promise<QueryResult<StorableEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexType(ou, model, type) + suffix;\n return executeQuery<StorableEntity>(INDEX_TYPE, keyValue, {\n ascending,\n limit,\n startKey,\n });\n}\n\n/**\n * Query a single entity by external ID\n * Uses indexXid GSI\n */\nexport const queryByXid = serviceHandler({\n alias: \"queryByXid\",\n description: \"Query a single entity by external ID\",\n input: {\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n xid: { type: String, description: \"External ID\" },\n },\n service: async ({\n archived,\n deleted,\n model,\n ou,\n xid,\n }): Promise<StorableEntity | null> => {\n const archivedBool = archived as boolean | undefined;\n const deletedBool = deleted as boolean | undefined;\n const modelStr = model as string;\n const ouStr = ou as string;\n const xidStr = xid as string;\n\n const suffix = calculateSuffix({ archived: archivedBool, deleted: deletedBool });\n const keyValue = buildIndexXid(ouStr, modelStr, xidStr) + suffix;\n const result = await executeQuery<StorableEntity>(INDEX_XID, keyValue, {\n limit: 1,\n });\n return result.items[0] ?? null;\n },\n});\n","import {\n CreateTableCommand,\n DescribeTableCommand,\n DynamoDBClient,\n} from \"@aws-sdk/client-dynamodb\";\nimport {\n DEFAULT_INDEXES,\n getAllRegisteredIndexes,\n type IndexDefinition,\n} from \"@jaypie/vocabulary\";\nimport { serviceHandler } from \"@jaypie/vocabulary\";\n\nconst DEFAULT_ENDPOINT = \"http://127.0.0.1:8000\";\nconst DEFAULT_REGION = \"us-east-1\";\nconst DEFAULT_TABLE_NAME = \"jaypie-local\";\n\n// =============================================================================\n// Index to GSI Conversion\n// =============================================================================\n\n/**\n * Generate an index name from pk fields (if not provided)\n */\nfunction generateIndexName(pk: string[]): string {\n const suffix = pk\n .map((field) => field.charAt(0).toUpperCase() + field.slice(1))\n .join(\"\");\n return `index${suffix}`;\n}\n\n/**\n * Collect all unique indexes from DEFAULT_INDEXES and registered models\n */\nfunction collectAllIndexes(): IndexDefinition[] {\n const indexMap = new Map<string, IndexDefinition>();\n\n // Add DEFAULT_INDEXES first\n for (const index of DEFAULT_INDEXES) {\n const name = index.name ?? generateIndexName(index.pk as string[]);\n indexMap.set(name, { ...index, name });\n }\n\n // Add registered model indexes (will not overwrite if name already exists)\n for (const index of getAllRegisteredIndexes()) {\n const name = index.name ?? generateIndexName(index.pk as string[]);\n if (!indexMap.has(name)) {\n indexMap.set(name, { ...index, name });\n }\n }\n\n return Array.from(indexMap.values());\n}\n\n/**\n * Build attribute definitions from indexes\n */\nfunction buildAttributeDefinitions(\n indexes: IndexDefinition[],\n): Array<{ AttributeName: string; AttributeType: \"S\" | \"N\" }> {\n const attrs = new Map<string, \"S\" | \"N\">();\n\n // Primary key attributes\n attrs.set(\"model\", \"S\");\n attrs.set(\"id\", \"S\");\n attrs.set(\"sequence\", \"N\");\n\n // GSI attributes (partition keys are always strings)\n for (const index of indexes) {\n const indexName = index.name ?? generateIndexName(index.pk as string[]);\n attrs.set(indexName, \"S\");\n }\n\n // Sort keys (sequence is always a number, others would be strings)\n // Note: Currently all indexes use sequence as SK, so this is mostly future-proofing\n for (const index of indexes) {\n const sk = index.sk ?? [\"sequence\"];\n for (const skField of sk) {\n if (!attrs.has(skField as string)) {\n // Assume string unless it's sequence\n attrs.set(\n skField as string,\n skField === \"sequence\" ? \"N\" : \"S\",\n );\n }\n }\n }\n\n return Array.from(attrs.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, type]) => ({\n AttributeName: name,\n AttributeType: type,\n }));\n}\n\n/**\n * Build GSI definitions from indexes\n */\nfunction buildGSIs(\n indexes: IndexDefinition[],\n): Array<{\n IndexName: string;\n KeySchema: Array<{ AttributeName: string; KeyType: \"HASH\" | \"RANGE\" }>;\n Projection: { ProjectionType: \"ALL\" };\n}> {\n const gsiProjection = { ProjectionType: \"ALL\" as const };\n\n return indexes.map((index) => {\n const indexName = index.name ?? generateIndexName(index.pk as string[]);\n const sk = index.sk ?? [\"sequence\"];\n\n // For GSIs, the partition key attribute name IS the index name\n // (e.g., indexOu stores the composite key value \"@#record\")\n return {\n IndexName: indexName,\n KeySchema: [\n { AttributeName: indexName, KeyType: \"HASH\" as const },\n // Use first SK field as the range key attribute\n { AttributeName: sk[0] as string, KeyType: \"RANGE\" as const },\n ],\n Projection: gsiProjection,\n };\n });\n}\n\n// =============================================================================\n// Table Creation\n// =============================================================================\n\n/**\n * DynamoDB table schema with Jaypie GSI pattern\n *\n * Collects indexes from:\n * 1. DEFAULT_INDEXES (5 standard GSIs)\n * 2. Any custom indexes registered via registerModel()\n */\nfunction createTableParams(\n tableName: string,\n billingMode: \"PAY_PER_REQUEST\" | \"PROVISIONED\",\n) {\n const allIndexes = collectAllIndexes();\n\n return {\n AttributeDefinitions: buildAttributeDefinitions(allIndexes),\n BillingMode: billingMode,\n GlobalSecondaryIndexes: buildGSIs(allIndexes),\n KeySchema: [\n { AttributeName: \"model\", KeyType: \"HASH\" as const },\n { AttributeName: \"id\", KeyType: \"RANGE\" as const },\n ],\n TableName: tableName,\n };\n}\n\n/**\n * Create DynamoDB table with Jaypie GSI schema\n */\nexport const createTableHandler = serviceHandler({\n alias: \"dynamodb_create_table\",\n description: \"Create DynamoDB table with Jaypie GSI schema\",\n input: {\n billingMode: {\n type: [\"PAY_PER_REQUEST\", \"PROVISIONED\"] as const,\n default: \"PAY_PER_REQUEST\",\n description: \"DynamoDB billing mode\",\n },\n endpoint: {\n type: String,\n default: DEFAULT_ENDPOINT,\n description: \"DynamoDB endpoint URL\",\n },\n tableName: {\n type: String,\n default: DEFAULT_TABLE_NAME,\n description: \"Table name to create\",\n },\n },\n service: async ({ billingMode, endpoint, tableName }) => {\n const endpointStr = endpoint as string;\n const tableNameStr = tableName as string;\n const billingModeStr = billingMode as \"PAY_PER_REQUEST\" | \"PROVISIONED\";\n\n const client = new DynamoDBClient({\n credentials: {\n accessKeyId: \"local\",\n secretAccessKey: \"local\",\n },\n endpoint: endpointStr,\n region: DEFAULT_REGION,\n });\n\n try {\n // Check if table already exists\n await client.send(new DescribeTableCommand({ TableName: tableNameStr }));\n return {\n message: `Table \"${tableNameStr}\" already exists`,\n success: false,\n tableName: tableNameStr,\n };\n } catch (error) {\n if ((error as { name?: string }).name !== \"ResourceNotFoundException\") {\n throw error;\n }\n }\n\n // Create the table\n const tableParams = createTableParams(tableNameStr, billingModeStr);\n await client.send(new CreateTableCommand(tableParams));\n\n return {\n message: \"Table created successfully\",\n success: true,\n tableName: tableNameStr,\n };\n },\n});\n","import { serviceHandler } from \"@jaypie/vocabulary\";\n\nconst DEFAULT_ADMIN_PORT = 8001;\nconst DEFAULT_DYNAMODB_PORT = 8000;\nconst DEFAULT_PROJECT_NAME = \"jaypie\";\nconst DEFAULT_TABLE_NAME = \"jaypie-local\";\n\n/**\n * Generate docker-compose.yml for local DynamoDB development\n */\nexport const dockerComposeHandler = serviceHandler({\n alias: \"dynamodb_generate_docker_compose\",\n description: \"Generate docker-compose.yml for local DynamoDB development\",\n input: {\n adminPort: {\n type: Number,\n default: DEFAULT_ADMIN_PORT,\n description: \"Port for DynamoDB Admin UI\",\n },\n dynamodbPort: {\n type: Number,\n default: DEFAULT_DYNAMODB_PORT,\n description: \"Port for DynamoDB Local\",\n },\n projectName: {\n type: String,\n default: DEFAULT_PROJECT_NAME,\n description: \"Project name for container naming\",\n },\n tableName: {\n type: String,\n default: DEFAULT_TABLE_NAME,\n description: \"Default table name\",\n },\n },\n service: async ({ adminPort, dynamodbPort, projectName, tableName }) => {\n const dockerCompose = `name: ${projectName}-dynamodb-stack\n\nservices:\n dynamodb:\n image: amazon/dynamodb-local:latest\n container_name: ${projectName}-dynamodb\n command: \"-jar DynamoDBLocal.jar -sharedDb -dbPath /data\"\n ports:\n - \"${dynamodbPort}:8000\"\n working_dir: /home/dynamodblocal\n volumes:\n - dynamodb_data:/data\n user: \"0:0\"\n\n dynamodb-admin:\n image: aaronshaf/dynamodb-admin:latest\n container_name: ${projectName}-dynamodb-admin\n ports:\n - \"${adminPort}:8001\"\n environment:\n - DYNAMO_ENDPOINT=http://dynamodb:8000\n - AWS_REGION=us-east-1\n - AWS_ACCESS_KEY_ID=local\n - AWS_SECRET_ACCESS_KEY=local\n depends_on:\n - dynamodb\n\nvolumes:\n dynamodb_data:\n driver: local\n`;\n\n const envVars = {\n AWS_REGION: \"us-east-1\",\n DYNAMODB_ENDPOINT: `http://127.0.0.1:${dynamodbPort}`,\n DYNAMODB_TABLE_NAME: tableName,\n };\n\n const envFile = `# DynamoDB Local Configuration\nDYNAMODB_TABLE_NAME=${tableName}\nDYNAMODB_ENDPOINT=http://127.0.0.1:${dynamodbPort}\nAWS_REGION=us-east-1\n`;\n\n return {\n dockerCompose,\n envFile,\n envVars,\n };\n },\n});\n","import { ConfigurationError } from \"@jaypie/errors\";\n\nimport { initClient, isInitialized } from \"../client.js\";\n\nconst DEFAULT_REGION = \"us-east-1\";\n\n/**\n * Ensure DynamoDB client is initialized from environment variables\n * Called automatically before each MCP tool execution\n */\nexport function ensureInitialized(): void {\n if (isInitialized()) {\n return;\n }\n\n const tableName = process.env.DYNAMODB_TABLE_NAME;\n if (!tableName) {\n throw new ConfigurationError(\n \"DYNAMODB_TABLE_NAME environment variable is required\",\n );\n }\n\n initClient({\n endpoint: process.env.DYNAMODB_ENDPOINT,\n region: process.env.AWS_REGION || DEFAULT_REGION,\n tableName,\n });\n}\n","import { serviceHandler } from \"@jaypie/vocabulary\";\n\nimport { getTableName, isInitialized } from \"../../client.js\";\nimport { ensureInitialized } from \"../autoInit.js\";\n\n/**\n * Check DynamoDB connection status and configuration\n */\nexport const statusHandler = serviceHandler({\n alias: \"dynamodb_status\",\n description: \"Check DynamoDB connection status and configuration\",\n service: async () => {\n ensureInitialized();\n return {\n endpoint: process.env.DYNAMODB_ENDPOINT || \"AWS Default\",\n initialized: isInitialized(),\n region: process.env.AWS_REGION || \"us-east-1\",\n tableName: getTableName(),\n };\n },\n});\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerMcpTool } from \"@jaypie/vocabulary/mcp\";\nimport { serviceHandler, type ServiceHandlerFunction } from \"@jaypie/vocabulary\";\n\nimport {\n archiveEntity,\n deleteEntity,\n destroyEntity,\n getEntity,\n putEntity,\n queryByAlias,\n queryByClass,\n queryByOu,\n queryByType,\n queryByXid,\n updateEntity,\n} from \"../index.js\";\nimport type { StorableEntity } from \"../types.js\";\nimport {\n createTableHandler,\n dockerComposeHandler,\n statusHandler,\n} from \"./admin/index.js\";\nimport { ensureInitialized } from \"./autoInit.js\";\n\nexport interface RegisterDynamoDbToolsConfig {\n /** MCP server to register tools with */\n server: McpServer;\n /** Include admin tools (create_table, docker_compose, status). Default: true */\n includeAdmin?: boolean;\n}\n\nexport interface RegisterDynamoDbToolsResult {\n /** Names of registered tools */\n tools: string[];\n}\n\n/**\n * Wrap a handler to auto-initialize before execution\n */\nfunction wrapWithInit(\n handler: ServiceHandlerFunction,\n): ServiceHandlerFunction {\n const wrapped = async (input: Record<string, unknown>) => {\n ensureInitialized();\n return handler(input);\n };\n // Preserve handler properties for MCP registration\n Object.assign(wrapped, {\n alias: handler.alias,\n description: handler.description,\n input: handler.input,\n });\n return wrapped as ServiceHandlerFunction;\n}\n\n// MCP-specific serviceHandler wrappers for functions with complex inputs\n// Note: These wrap the regular async functions to make them work with registerMcpTool\n\n/**\n * MCP wrapper for putEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpPutEntity = serviceHandler({\n alias: \"dynamodb_put\",\n description: \"Create or replace an entity in DynamoDB (auto-indexes GSI keys)\",\n input: {\n // Required entity fields\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model name (partition key)\" },\n name: { type: String, description: \"Entity name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n // Optional fields\n alias: { type: String, required: false, description: \"Human-friendly alias\" },\n class: { type: String, required: false, description: \"Category classification\" },\n type: { type: String, required: false, description: \"Type classification\" },\n xid: { type: String, required: false, description: \"External ID\" },\n },\n service: async (input) => {\n const now = new Date().toISOString();\n const entity: StorableEntity = {\n alias: input.alias as string | undefined,\n class: input.class as string | undefined,\n createdAt: now,\n id: input.id as string,\n model: input.model as string,\n name: input.name as string,\n ou: input.ou as string,\n sequence: Date.now(),\n type: input.type as string | undefined,\n updatedAt: now,\n xid: input.xid as string | undefined,\n };\n return putEntity({ entity });\n },\n});\n\n/**\n * MCP wrapper for updateEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpUpdateEntity = serviceHandler({\n alias: \"dynamodb_update\",\n description: \"Update an entity in DynamoDB (sets updatedAt, re-indexes GSI keys)\",\n input: {\n // Required fields to identify the entity\n id: { type: String, description: \"Entity ID (sort key)\" },\n model: { type: String, description: \"Entity model name (partition key)\" },\n // Fields that can be updated\n name: { type: String, required: false, description: \"Entity name\" },\n ou: { type: String, required: false, description: \"Organizational unit\" },\n alias: { type: String, required: false, description: \"Human-friendly alias\" },\n class: { type: String, required: false, description: \"Category classification\" },\n type: { type: String, required: false, description: \"Type classification\" },\n xid: { type: String, required: false, description: \"External ID\" },\n },\n service: async (input) => {\n // First get the existing entity\n const existing = await getEntity({\n id: input.id as string,\n model: input.model as string,\n });\n if (!existing) {\n return { error: \"Entity not found\", id: input.id, model: input.model };\n }\n // Merge updates\n const entity: StorableEntity = {\n ...existing,\n ...(input.alias !== undefined && { alias: input.alias as string }),\n ...(input.class !== undefined && { class: input.class as string }),\n ...(input.name !== undefined && { name: input.name as string }),\n ...(input.ou !== undefined && { ou: input.ou as string }),\n ...(input.type !== undefined && { type: input.type as string }),\n ...(input.xid !== undefined && { xid: input.xid as string }),\n };\n return updateEntity({ entity });\n },\n});\n\n/**\n * MCP wrapper for queryByOu\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByOu = serviceHandler({\n alias: \"dynamodb_query_ou\",\n description: \"Query entities by organizational unit (parent hierarchy)\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n ascending: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Sort ascending (oldest first)\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n limit: {\n type: Number,\n required: false,\n description: \"Maximum number of items to return\",\n },\n },\n service: async (input) => {\n return queryByOu({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n ou: input.ou as string,\n });\n },\n});\n\n/**\n * MCP wrapper for queryByClass\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByClass = serviceHandler({\n alias: \"dynamodb_query_class\",\n description: \"Query entities by category classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n recordClass: { type: String, description: \"Category classification\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n ascending: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Sort ascending (oldest first)\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n limit: {\n type: Number,\n required: false,\n description: \"Maximum number of items to return\",\n },\n },\n service: async (input) => {\n return queryByClass({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n ou: input.ou as string,\n recordClass: input.recordClass as string,\n });\n },\n});\n\n/**\n * MCP wrapper for queryByType\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByType = serviceHandler({\n alias: \"dynamodb_query_type\",\n description: \"Query entities by type classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n ou: { type: String, description: \"Organizational unit (@ for root)\" },\n type: { type: String, description: \"Type classification\" },\n archived: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query archived entities instead of active ones\",\n },\n ascending: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Sort ascending (oldest first)\",\n },\n deleted: {\n type: Boolean,\n default: false,\n required: false,\n description: \"Query deleted entities instead of active ones\",\n },\n limit: {\n type: Number,\n required: false,\n description: \"Maximum number of items to return\",\n },\n },\n service: async (input) => {\n return queryByType({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n ou: input.ou as string,\n type: input.type as string,\n });\n },\n});\n\n/**\n * Register all DynamoDB MCP tools with a server\n */\nexport function registerDynamoDbTools(\n config: RegisterDynamoDbToolsConfig,\n): RegisterDynamoDbToolsResult {\n const { includeAdmin = true, server } = config;\n const tools: string[] = [];\n\n // Entity operations\n registerMcpTool({\n handler: wrapWithInit(getEntity),\n name: \"dynamodb_get\",\n server,\n });\n tools.push(\"dynamodb_get\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpPutEntity),\n name: \"dynamodb_put\",\n server,\n });\n tools.push(\"dynamodb_put\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpUpdateEntity),\n name: \"dynamodb_update\",\n server,\n });\n tools.push(\"dynamodb_update\");\n\n registerMcpTool({\n handler: wrapWithInit(deleteEntity),\n name: \"dynamodb_delete\",\n server,\n });\n tools.push(\"dynamodb_delete\");\n\n registerMcpTool({\n handler: wrapWithInit(archiveEntity),\n name: \"dynamodb_archive\",\n server,\n });\n tools.push(\"dynamodb_archive\");\n\n registerMcpTool({\n handler: wrapWithInit(destroyEntity),\n name: \"dynamodb_destroy\",\n server,\n });\n tools.push(\"dynamodb_destroy\");\n\n // Query operations\n registerMcpTool({\n handler: wrapWithInit(mcpQueryByOu),\n name: \"dynamodb_query_ou\",\n server,\n });\n tools.push(\"dynamodb_query_ou\");\n\n registerMcpTool({\n handler: wrapWithInit(queryByAlias),\n name: \"dynamodb_query_alias\",\n server,\n });\n tools.push(\"dynamodb_query_alias\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpQueryByClass),\n name: \"dynamodb_query_class\",\n server,\n });\n tools.push(\"dynamodb_query_class\");\n\n registerMcpTool({\n handler: wrapWithInit(mcpQueryByType),\n name: \"dynamodb_query_type\",\n server,\n });\n tools.push(\"dynamodb_query_type\");\n\n registerMcpTool({\n handler: wrapWithInit(queryByXid),\n name: \"dynamodb_query_xid\",\n server,\n });\n tools.push(\"dynamodb_query_xid\");\n\n // Admin tools (MCP-only)\n if (includeAdmin) {\n registerMcpTool({ handler: statusHandler, server });\n tools.push(\"dynamodb_status\");\n\n registerMcpTool({ handler: createTableHandler, server });\n tools.push(\"dynamodb_create_table\");\n\n registerMcpTool({ handler: dockerComposeHandler, server });\n tools.push(\"dynamodb_generate_docker_compose\");\n }\n\n return { tools };\n}\n\n// Export individual handlers for direct use\nexport {\n createTableHandler,\n dockerComposeHandler,\n statusHandler,\n} from \"./admin/index.js\";\n\nexport { ensureInitialized } from \"./autoInit.js\";\n"],"names":["DEFAULT_REGION","DynamoDBClient","DynamoDBDocumentClient","ConfigurationError","SEPARATOR","getModelIndexes","vocabPopulateIndexKeys","ARCHIVED_SUFFIX","DELETED_SUFFIX","serviceHandler","GetCommand","PutCommand","DeleteCommand","QueryCommand","DEFAULT_TABLE_NAME","DEFAULT_INDEXES","getAllRegisteredIndexes","DescribeTableCommand","CreateTableCommand","registerMcpTool"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { BaseQueryOptions, FabricEntity, QueryResult } from "./types.js";
1
+ import type { BaseQueryOptions, StorableEntity, QueryResult } from "./types.js";
2
2
  /**
3
3
  * Query parameters for queryByOu
4
4
  */
@@ -13,12 +13,12 @@ interface QueryByOuParams extends BaseQueryOptions {
13
13
  * Note: This is a regular async function (not serviceHandler) because it accepts
14
14
  * complex startKey objects that can't be coerced by vocabulary's type system.
15
15
  */
16
- export declare function queryByOu({ archived, ascending, deleted, limit, model, ou, startKey, }: QueryByOuParams): Promise<QueryResult<FabricEntity>>;
16
+ export declare function queryByOu({ archived, ascending, deleted, limit, model, ou, startKey, }: QueryByOuParams): Promise<QueryResult<StorableEntity>>;
17
17
  /**
18
18
  * Query a single entity by human-friendly alias
19
19
  * Uses indexAlias GSI
20
20
  */
21
- export declare const queryByAlias: import("@jaypie/vocabulary").ServiceHandlerFunction<Record<string, unknown>, FabricEntity | null>;
21
+ export declare const queryByAlias: import("@jaypie/vocabulary").ServiceHandlerFunction<Record<string, unknown>, StorableEntity | null>;
22
22
  /**
23
23
  * Query parameters for queryByClass
24
24
  */
@@ -34,7 +34,7 @@ interface QueryByClassParams extends BaseQueryOptions {
34
34
  * Note: This is a regular async function (not serviceHandler) because it accepts
35
35
  * complex startKey objects that can't be coerced by vocabulary's type system.
36
36
  */
37
- export declare function queryByClass({ archived, ascending, deleted, limit, model, ou, recordClass, startKey, }: QueryByClassParams): Promise<QueryResult<FabricEntity>>;
37
+ export declare function queryByClass({ archived, ascending, deleted, limit, model, ou, recordClass, startKey, }: QueryByClassParams): Promise<QueryResult<StorableEntity>>;
38
38
  /**
39
39
  * Query parameters for queryByType
40
40
  */
@@ -50,10 +50,10 @@ interface QueryByTypeParams extends BaseQueryOptions {
50
50
  * Note: This is a regular async function (not serviceHandler) because it accepts
51
51
  * complex startKey objects that can't be coerced by vocabulary's type system.
52
52
  */
53
- export declare function queryByType({ archived, ascending, deleted, limit, model, ou, startKey, type, }: QueryByTypeParams): Promise<QueryResult<FabricEntity>>;
53
+ export declare function queryByType({ archived, ascending, deleted, limit, model, ou, startKey, type, }: QueryByTypeParams): Promise<QueryResult<StorableEntity>>;
54
54
  /**
55
55
  * Query a single entity by external ID
56
56
  * Uses indexXid GSI
57
57
  */
58
- export declare const queryByXid: import("@jaypie/vocabulary").ServiceHandlerFunction<Record<string, unknown>, FabricEntity | null>;
58
+ export declare const queryByXid: import("@jaypie/vocabulary").ServiceHandlerFunction<Record<string, unknown>, StorableEntity | null>;
59
59
  export {};
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Unified Query Function with Auto-Detect Index Selection
3
+ *
4
+ * The query() function automatically selects the best index based on
5
+ * the filter fields provided. This simplifies query construction by
6
+ * removing the need to know which specific GSI to use.
7
+ */
8
+ import { DEFAULT_INDEXES, getModelIndexes } from "@jaypie/vocabulary";
9
+ import type { QueryResult, StorableEntity } from "./types.js";
10
+ /**
11
+ * Query parameters for the unified query function
12
+ */
13
+ export interface QueryParams<T = StorableEntity> {
14
+ /** Whether to query archived entities instead of active ones */
15
+ archived?: boolean;
16
+ /** Whether to sort ascending (oldest first). Default: false */
17
+ ascending?: boolean;
18
+ /** Whether to query deleted entities instead of active ones */
19
+ deleted?: boolean;
20
+ /** Filter object with field values to match. Used for index auto-detection. */
21
+ filter?: Partial<T>;
22
+ /** Maximum number of items to return */
23
+ limit?: number;
24
+ /** Model name (required) */
25
+ model: string;
26
+ /** Organizational unit (APEX or "{parent.model}#{parent.id}") */
27
+ ou?: string;
28
+ /** Pagination cursor from previous query */
29
+ startKey?: Record<string, unknown>;
30
+ }
31
+ /**
32
+ * Query entities with automatic index selection
33
+ *
34
+ * The query function automatically selects the best GSI based on
35
+ * the filter fields provided. This removes the need to know which
36
+ * specific query function (queryByOu, queryByAlias, etc.) to use.
37
+ *
38
+ * @example
39
+ * // Uses indexOu (pk: ["ou", "model"])
40
+ * const allMessages = await query({ model: "message", ou: `chat#${chatId}` });
41
+ *
42
+ * @example
43
+ * // Uses indexAlias (pk: ["ou", "model", "alias"])
44
+ * const byAlias = await query({
45
+ * model: "record",
46
+ * ou: "@",
47
+ * filter: { alias: "my-record" },
48
+ * });
49
+ *
50
+ * @example
51
+ * // Uses a custom registered index if model has one
52
+ * const byChat = await query({
53
+ * model: "message",
54
+ * filter: { chatId: "abc-123" },
55
+ * });
56
+ */
57
+ export declare function query<T extends StorableEntity = StorableEntity>(params: QueryParams<T>): Promise<QueryResult<T>>;
58
+ export { DEFAULT_INDEXES, getModelIndexes };
@@ -1,4 +1,4 @@
1
- import type { FabricEntity } from "./types.js";
1
+ import type { StorableEntity } from "./types.js";
2
2
  /**
3
3
  * Result of a seed operation
4
4
  */
@@ -25,7 +25,7 @@ export interface SeedOptions {
25
25
  /**
26
26
  * Result of an export operation
27
27
  */
28
- export interface ExportResult<T extends FabricEntity = FabricEntity> {
28
+ export interface ExportResult<T extends StorableEntity = StorableEntity> {
29
29
  /** Number of entities exported */
30
30
  count: number;
31
31
  /** Exported entities */
@@ -37,7 +37,7 @@ export interface ExportResult<T extends FabricEntity = FabricEntity> {
37
37
  * @param entity - Partial entity with at least alias, model, and ou
38
38
  * @returns true if entity was created, false if it already exists
39
39
  */
40
- export declare function seedEntityIfNotExists<T extends Partial<FabricEntity>>(entity: T): Promise<boolean>;
40
+ export declare function seedEntityIfNotExists<T extends Partial<StorableEntity>>(entity: T): Promise<boolean>;
41
41
  /**
42
42
  * Seed multiple entities (idempotent)
43
43
  *
@@ -50,7 +50,7 @@ export declare function seedEntityIfNotExists<T extends Partial<FabricEntity>>(e
50
50
  * @param options - Seed options
51
51
  * @returns Result with created, skipped, and errors arrays
52
52
  */
53
- export declare function seedEntities<T extends Partial<FabricEntity>>(entities: T[], options?: SeedOptions): Promise<SeedResult>;
53
+ export declare function seedEntities<T extends Partial<StorableEntity>>(entities: T[], options?: SeedOptions): Promise<SeedResult>;
54
54
  /**
55
55
  * Export entities by model and organizational unit
56
56
  *
@@ -62,7 +62,7 @@ export declare function seedEntities<T extends Partial<FabricEntity>>(entities:
62
62
  * @param limit - Optional maximum number of entities to export
63
63
  * @returns Export result with entities and count
64
64
  */
65
- export declare function exportEntities<T extends FabricEntity>(model: string, ou: string, limit?: number): Promise<ExportResult<T>>;
65
+ export declare function exportEntities<T extends StorableEntity>(model: string, ou: string, limit?: number): Promise<ExportResult<T>>;
66
66
  /**
67
67
  * Export entities as a JSON string
68
68
  *
@@ -1,3 +1,4 @@
1
+ import type { BaseEntity } from "@jaypie/vocabulary";
1
2
  /**
2
3
  * DynamoDB client configuration
3
4
  */
@@ -100,16 +101,21 @@ export interface QueryByXidParams {
100
101
  /**
101
102
  * Result of a query operation
102
103
  */
103
- export interface QueryResult<T = FabricEntity> {
104
+ export interface QueryResult<T = StorableEntity> {
104
105
  /** Array of matching entities */
105
106
  items: T[];
106
107
  /** Pagination cursor for next page (undefined if no more results) */
107
108
  lastEvaluatedKey?: Record<string, unknown>;
108
109
  }
109
110
  /**
110
- * Base entity interface for DynamoDB single-table design
111
+ * Entity with required fields for DynamoDB storage.
112
+ *
113
+ * Extends BaseEntity from @jaypie/vocabulary with:
114
+ * - Required storage fields (id, model, name, ou, sequence)
115
+ * - String timestamps (DynamoDB uses ISO 8601 strings, not Date objects)
116
+ * - GSI index keys (auto-populated by indexEntity)
111
117
  */
112
- export interface FabricEntity {
118
+ export interface StorableEntity extends Omit<BaseEntity, "archivedAt" | "createdAt" | "deletedAt" | "updatedAt"> {
113
119
  /** Partition key (e.g., "record", "message") */
114
120
  model: string;
115
121
  /** Sort key (UUID) */
@@ -125,14 +131,6 @@ export interface FabricEntity {
125
131
  indexOu?: string;
126
132
  indexType?: string;
127
133
  indexXid?: string;
128
- /** Human-friendly slug/alias */
129
- alias?: string;
130
- /** Category classification */
131
- class?: string;
132
- /** Type classification */
133
- type?: string;
134
- /** External ID for integration with external systems */
135
- xid?: string;
136
134
  createdAt: string;
137
135
  updatedAt: string;
138
136
  /** Archive timestamp (for inactive but preserved records) */
@@ -1,9 +1,6 @@
1
- export declare const APEX = "@";
2
- export declare const SEPARATOR = "#";
1
+ export { APEX, ARCHIVED_SUFFIX, DELETED_SUFFIX, SEPARATOR } from "@jaypie/vocabulary";
3
2
  export declare const INDEX_ALIAS = "indexAlias";
4
3
  export declare const INDEX_CLASS = "indexClass";
5
4
  export declare const INDEX_OU = "indexOu";
6
5
  export declare const INDEX_TYPE = "indexType";
7
6
  export declare const INDEX_XID = "indexXid";
8
- export declare const ARCHIVED_SUFFIX = "#archived";
9
- export declare const DELETED_SUFFIX = "#deleted";
@@ -1,28 +1,28 @@
1
- import type { FabricEntity } from "./types.js";
1
+ import type { StorableEntity } from "./types.js";
2
2
  /**
3
3
  * Get a single entity by primary key
4
4
  */
5
- export declare const getEntity: import("@jaypie/vocabulary").ServiceHandlerFunction<Record<string, unknown>, FabricEntity | null>;
5
+ export declare const getEntity: import("@jaypie/vocabulary").ServiceHandlerFunction<Record<string, unknown>, StorableEntity | null>;
6
6
  /**
7
7
  * Put (create or replace) an entity
8
8
  * Auto-populates GSI index keys via indexEntity
9
9
  *
10
10
  * Note: This is a regular async function (not serviceHandler) because it accepts
11
- * complex FabricEntity objects that can't be coerced by vocabulary's type system.
11
+ * complex StorableEntity objects that can't be coerced by vocabulary's type system.
12
12
  */
13
13
  export declare function putEntity({ entity, }: {
14
- entity: FabricEntity;
15
- }): Promise<FabricEntity>;
14
+ entity: StorableEntity;
15
+ }): Promise<StorableEntity>;
16
16
  /**
17
17
  * Update an existing entity
18
18
  * Auto-populates GSI index keys and sets updatedAt
19
19
  *
20
20
  * Note: This is a regular async function (not serviceHandler) because it accepts
21
- * complex FabricEntity objects that can't be coerced by vocabulary's type system.
21
+ * complex StorableEntity objects that can't be coerced by vocabulary's type system.
22
22
  */
23
23
  export declare function updateEntity({ entity, }: {
24
- entity: FabricEntity;
25
- }): Promise<FabricEntity>;
24
+ entity: StorableEntity;
25
+ }): Promise<StorableEntity>;
26
26
  /**
27
27
  * Soft delete an entity by setting deletedAt timestamp
28
28
  * Re-indexes with appropriate suffix based on archived/deleted state
@@ -1,8 +1,10 @@
1
1
  export { getDocClient, getTableName, initClient, isInitialized, resetClient, } from "./client.js";
2
2
  export { APEX, ARCHIVED_SUFFIX, DELETED_SUFFIX, INDEX_ALIAS, INDEX_CLASS, INDEX_OU, INDEX_TYPE, INDEX_XID, SEPARATOR, } from "./constants.js";
3
3
  export { archiveEntity, deleteEntity, destroyEntity, getEntity, putEntity, updateEntity, } from "./entities.js";
4
- export { buildIndexAlias, buildIndexClass, buildIndexOu, buildIndexType, buildIndexXid, calculateOu, indexEntity, } from "./keyBuilders.js";
4
+ export { buildCompositeKey, buildIndexAlias, buildIndexClass, buildIndexOu, buildIndexType, buildIndexXid, calculateOu, DEFAULT_INDEXES, indexEntity, } from "./keyBuilders.js";
5
5
  export { queryByAlias, queryByClass, queryByOu, queryByType, queryByXid, } from "./queries.js";
6
+ export { query } from "./query.js";
7
+ export type { QueryParams } from "./query.js";
6
8
  export { exportEntities, exportEntitiesToJson, seedEntities, seedEntityIfNotExists, } from "./seedExport.js";
7
- export type { BaseQueryOptions, DynamoClientConfig, FabricEntity, ParentReference, QueryResult, } from "./types.js";
9
+ export type { BaseQueryOptions, DynamoClientConfig, ParentReference, QueryResult, StorableEntity, } from "./types.js";
8
10
  export type { ExportResult, SeedOptions, SeedResult } from "./seedExport.js";