@jaypie/dynamodb 0.5.0 → 0.6.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/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 = 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","import {\n buildCompositeKey as fabricBuildCompositeKey,\n calculateScope as fabricCalculateScope,\n getModelIndexes,\n type IndexableModel,\n populateIndexKeys as fabricPopulateIndexKeys,\n} from \"@jaypie/fabric\";\n\nimport { APEX } from \"./constants.js\";\nimport type { ParentReference, StorableEntity } from \"./types.js\";\n\n// =============================================================================\n// Key Builders\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: IndexableModel,\n fields: string[],\n suffix?: string,\n): string {\n return fabricBuildCompositeKey(entity, fields, suffix);\n}\n\n/**\n * Calculate the scope 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 calculateScope(parent?: ParentReference): string {\n if (!parent) {\n return APEX;\n }\n return fabricCalculateScope(parent);\n}\n\n/**\n * Auto-populate GSI index keys on an entity and advance its write timestamps.\n *\n * - Bumps `updatedAt` to now on every call.\n * - Backfills `createdAt` to the same now if not already set.\n * - Populates GSI attributes (pk composite and sk composite when applicable)\n * using the indexes registered for the entity's model.\n *\n * Callers (putEntity, updateEntity, deleteEntity, archiveEntity,\n * transactWriteEntities) go through this one function so `updatedAt` is\n * always fresh and never forgotten.\n *\n * @param entity - The entity to index\n * @param suffix - Optional suffix override (defaults to archived/deleted state)\n * @returns A new entity with timestamps bumped and index keys populated\n */\nexport function indexEntity<T extends StorableEntity>(\n entity: T,\n suffix?: string,\n): T {\n const now = new Date().toISOString();\n const bumped = {\n ...entity,\n createdAt: entity.createdAt ?? now,\n updatedAt: now,\n } as T;\n\n const indexes = getModelIndexes(entity.model);\n return fabricPopulateIndexKeys(\n bumped as unknown as IndexableModel,\n indexes,\n suffix,\n ) as unknown as T;\n}\n","import {\n DeleteCommand,\n GetCommand,\n PutCommand,\n TransactWriteCommand,\n} from \"@aws-sdk/lib-dynamodb\";\nimport { fabricService } from \"@jaypie/fabric\";\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 (id)\n */\nexport const getEntity = fabricService({\n alias: \"getEntity\",\n description: \"Get a single entity by id\",\n input: {\n id: { type: String, description: \"Entity id (partition key)\" },\n },\n service: async ({ id }): Promise<StorableEntity | null> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new GetCommand({\n Key: { id },\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 * `indexEntity` auto-bumps `updatedAt` and backfills `createdAt`.\n */\nexport async function putEntity({\n entity,\n}: {\n entity: StorableEntity;\n}): Promise<StorableEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\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 * `indexEntity` auto-bumps `updatedAt` — callers never set it manually.\n */\nexport async function updateEntity({\n entity,\n}: {\n entity: StorableEntity;\n}): Promise<StorableEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const updatedEntity = indexEntity(entity);\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 = fabricService({\n alias: \"deleteEntity\",\n description: \"Soft delete an entity (sets deletedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity id\" },\n },\n service: async ({ id }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const existing = await getEntity({ id });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n // indexEntity will bump updatedAt again; set deletedAt here.\n const updatedEntity = {\n ...existing,\n deletedAt: now,\n };\n\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 = fabricService({\n alias: \"archiveEntity\",\n description: \"Archive an entity (sets archivedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity id\" },\n },\n service: async ({ id }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const existing = await getEntity({ id });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n const updatedEntity = {\n ...existing,\n archivedAt: now,\n };\n\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 = fabricService({\n alias: \"destroyEntity\",\n description: \"Hard delete an entity (permanently removes from table)\",\n input: {\n id: { type: String, description: \"Entity id\" },\n },\n service: async ({ id }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new DeleteCommand({\n Key: { id },\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n\n/**\n * Write multiple entities atomically using DynamoDB transactions.\n * Each entity is auto-indexed via indexEntity before writing.\n * All entities are written to the same table in a single transaction.\n */\nexport async function transactWriteEntities({\n entities,\n}: {\n entities: StorableEntity[];\n}): Promise<void> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new TransactWriteCommand({\n TransactItems: entities.map((entity) => ({\n Put: {\n Item: indexEntity(entity),\n TableName: tableName,\n },\n })),\n });\n\n await docClient.send(command);\n}\n","import { QueryCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { ConfigurationError } from \"@jaypie/errors\";\nimport {\n fabricService,\n getGsiAttributeNames,\n getModelIndexes,\n type IndexDefinition,\n SEPARATOR,\n} from \"@jaypie/fabric\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport { ARCHIVED_SUFFIX, DELETED_SUFFIX } from \"./constants.js\";\nimport { buildCompositeKey } from \"./keyBuilders.js\";\nimport type {\n QueryByAliasParams,\n QueryByCategoryParams,\n QueryByScopeParams,\n QueryByTypeParams,\n QueryByXidParams,\n QueryResult,\n StorableEntity,\n} from \"./types.js\";\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Calculate the suffix for the GSI partition key based on archived/deleted\n * flags. Suffix stays on pk so deleted/archived entities are queried as their\n * own partition (active queries skip them naturally).\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 * Find the registered index for a model that matches a given partition-key\n * shape. The matching index is the first one whose pk equals the expected\n * fields. Throws ConfigurationError if no match is found.\n */\nfunction requireIndex(model: string, pkFields: string[]): IndexDefinition {\n const indexes = getModelIndexes(model);\n const match = indexes.find(\n (index) =>\n index.pk.length === pkFields.length &&\n index.pk.every((field, i) => field === pkFields[i]),\n );\n if (!match) {\n throw new ConfigurationError(\n `Model \"${model}\" has no index with pk=[${pkFields.join(\", \")}]. ` +\n `Register one with fabricIndex(${\n pkFields.length > 1 ? `\"${pkFields[1]}\"` : \"\"\n }).`,\n );\n }\n return match;\n}\n\n/**\n * Execute a GSI query.\n *\n * - pk: exact match on the index partition key\n * - skPrefix: optional begins_with on the index sort key (used when the index\n * has a composite sk like [scope, updatedAt])\n */\nasync function executeQuery<T extends StorableEntity>(\n index: IndexDefinition,\n pkValue: string,\n options: {\n ascending?: boolean;\n limit?: number;\n skPrefix?: string;\n startKey?: Record<string, unknown>;\n } = {},\n): Promise<QueryResult<T>> {\n const { ascending = false, limit, skPrefix, startKey } = options;\n const attrs = getGsiAttributeNames(index);\n const indexName = attrs.pk;\n\n const expressionAttributeNames: Record<string, string> = {\n \"#pk\": indexName,\n };\n const expressionAttributeValues: Record<string, unknown> = {\n \":pkValue\": pkValue,\n };\n let keyConditionExpression = \"#pk = :pkValue\";\n\n if (skPrefix !== undefined && attrs.sk) {\n expressionAttributeNames[\"#sk\"] = attrs.sk;\n expressionAttributeValues[\":skPrefix\"] = skPrefix;\n keyConditionExpression += \" AND begins_with(#sk, :skPrefix)\";\n }\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: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n IndexName: indexName,\n KeyConditionExpression: keyConditionExpression,\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\nfunction scopePrefix(scope: string | undefined): string | undefined {\n return scope === undefined ? undefined : `${scope}${SEPARATOR}`;\n}\n\n// =============================================================================\n// Query Functions\n// =============================================================================\n\n/**\n * List entities of a model, optionally narrowed to a scope.\n * Requires the model to register `fabricIndex()` (pk=[model]).\n */\nexport async function queryByScope({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n scope,\n startKey,\n}: QueryByScopeParams): Promise<QueryResult<StorableEntity>> {\n const index = requireIndex(model, [\"model\"]);\n const suffix = calculateSuffix({ archived, deleted });\n const pkValue = buildCompositeKey({ model }, [\"model\"], suffix);\n return executeQuery<StorableEntity>(index, pkValue, {\n ascending,\n limit,\n skPrefix: scopePrefix(scope),\n startKey,\n });\n}\n\n/**\n * Query a single entity by human-friendly alias.\n * Requires the model to register `fabricIndex(\"alias\")`.\n */\nexport const queryByAlias = fabricService({\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 scope: {\n type: String,\n required: false,\n description: \"Optional scope narrower (begins_with on sk)\",\n },\n },\n service: async ({\n alias,\n archived,\n deleted,\n model,\n scope,\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 scopeStr = scope as string | undefined;\n\n const index = requireIndex(modelStr, [\"model\", \"alias\"]);\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const pkValue = buildCompositeKey(\n { model: modelStr, alias: aliasStr },\n [\"model\", \"alias\"],\n suffix,\n );\n const result = await executeQuery<StorableEntity>(index, pkValue, {\n limit: 1,\n skPrefix: scopePrefix(scopeStr),\n });\n return result.items[0] ?? null;\n },\n});\n\n/**\n * Query entities by category classification.\n * Requires the model to register `fabricIndex(\"category\")`.\n */\nexport async function queryByCategory({\n archived = false,\n ascending = false,\n category,\n deleted = false,\n limit,\n model,\n scope,\n startKey,\n}: QueryByCategoryParams): Promise<QueryResult<StorableEntity>> {\n const index = requireIndex(model, [\"model\", \"category\"]);\n const suffix = calculateSuffix({ archived, deleted });\n const pkValue = buildCompositeKey(\n { model, category },\n [\"model\", \"category\"],\n suffix,\n );\n return executeQuery<StorableEntity>(index, pkValue, {\n ascending,\n limit,\n skPrefix: scopePrefix(scope),\n startKey,\n });\n}\n\n/**\n * Query entities by type classification.\n * Requires the model to register `fabricIndex(\"type\")`.\n */\nexport async function queryByType({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n scope,\n startKey,\n type,\n}: QueryByTypeParams): Promise<QueryResult<StorableEntity>> {\n const index = requireIndex(model, [\"model\", \"type\"]);\n const suffix = calculateSuffix({ archived, deleted });\n const pkValue = buildCompositeKey(\n { model, type },\n [\"model\", \"type\"],\n suffix,\n );\n return executeQuery<StorableEntity>(index, pkValue, {\n ascending,\n limit,\n skPrefix: scopePrefix(scope),\n startKey,\n });\n}\n\n/**\n * Query a single entity by external ID.\n * Requires the model to register `fabricIndex(\"xid\")`.\n */\nexport const queryByXid = fabricService({\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 scope: {\n type: String,\n required: false,\n description: \"Optional scope narrower (begins_with on sk)\",\n },\n xid: { type: String, description: \"External ID\" },\n },\n service: async ({\n archived,\n deleted,\n model,\n scope,\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 scopeStr = scope as string | undefined;\n const xidStr = xid as string;\n\n const index = requireIndex(modelStr, [\"model\", \"xid\"]);\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const pkValue = buildCompositeKey(\n { model: modelStr, xid: xidStr },\n [\"model\", \"xid\"],\n suffix,\n );\n const result = await executeQuery<StorableEntity>(index, pkValue, {\n limit: 1,\n skPrefix: scopePrefix(scopeStr),\n });\n return result.items[0] ?? null;\n },\n});\n\n// Internal exports for the unified query() layer\nexport { executeQuery, requireIndex, calculateSuffix, scopePrefix };\n","import {\n CreateTableCommand,\n DescribeTableCommand,\n DynamoDBClient,\n} from \"@aws-sdk/client-dynamodb\";\nimport {\n fabricService,\n getAllRegisteredIndexes,\n getGsiAttributeNames,\n type IndexDefinition,\n} from \"@jaypie/fabric\";\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 → GSI Conversion\n// =============================================================================\n\n/**\n * Build attribute definitions from registered indexes.\n * Primary key is `id` (STRING) only; GSI pk and composite sk attributes\n * are all STRING. A single-field sk (e.g., raw `updatedAt`) is also STRING.\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: id only\n attrs.set(\"id\", \"S\");\n\n for (const index of indexes) {\n const { pk, sk } = getGsiAttributeNames(index);\n // All pk attributes are composite strings\n if (!attrs.has(pk)) attrs.set(pk, \"S\");\n if (sk && !attrs.has(sk)) {\n // Single-field `sequence` remains NUMBER for back-compat callers;\n // every other sk attribute (composite or not) is STRING.\n attrs.set(sk, sk === \"sequence\" ? \"N\" : \"S\");\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 registered indexes\n */\nfunction buildGSIs(indexes: IndexDefinition[]): 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 { pk, sk } = getGsiAttributeNames(index);\n const keySchema: Array<{\n AttributeName: string;\n KeyType: \"HASH\" | \"RANGE\";\n }> = [{ AttributeName: pk, KeyType: \"HASH\" }];\n if (sk) {\n keySchema.push({ AttributeName: sk, KeyType: \"RANGE\" });\n }\n return {\n IndexName: pk,\n KeySchema: keySchema,\n Projection: gsiProjection,\n };\n });\n}\n\n// =============================================================================\n// Table Creation\n// =============================================================================\n\n/**\n * DynamoDB table schema with Jaypie GSI pattern.\n * Primary key is `id` only. GSIs come from models registered via\n * `registerModel()`, shaped by `fabricIndex()`.\n */\nfunction createTableParams(\n tableName: string,\n billingMode: \"PAY_PER_REQUEST\" | \"PROVISIONED\",\n) {\n const allIndexes = getAllRegisteredIndexes();\n\n return {\n AttributeDefinitions: buildAttributeDefinitions(allIndexes),\n BillingMode: billingMode,\n GlobalSecondaryIndexes: buildGSIs(allIndexes),\n KeySchema: [{ AttributeName: \"id\", KeyType: \"HASH\" as const }],\n TableName: tableName,\n };\n}\n\n/**\n * Create DynamoDB table with Jaypie GSI schema\n */\nexport const createTableHandler = fabricService({\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 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 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 { fabricService } from \"@jaypie/fabric\";\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 = fabricService({\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 { fabricService } from \"@jaypie/fabric\";\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 = fabricService({\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 { fabricMcp } from \"@jaypie/fabric/mcp\";\nimport { fabricService, type Service } from \"@jaypie/fabric\";\n\nimport {\n archiveEntity,\n deleteEntity,\n destroyEntity,\n getEntity,\n putEntity,\n queryByAlias,\n queryByCategory,\n queryByScope,\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 * Uses explicit type assertion to allow any Service type to be wrapped\n */\n\nfunction wrapWithInit(handler: Service<any, any, any>): Service {\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 Service;\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 fabricMcp\n\n/**\n * MCP wrapper for putEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpPutEntity = fabricService({\n alias: \"dynamodb_put\",\n description:\n \"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 scope: { type: String, description: \"Scope (@ for root)\" },\n // Optional fields\n alias: {\n type: String,\n required: false,\n description: \"Human-friendly alias\",\n },\n category: {\n type: String,\n required: false,\n description: \"Category classification\",\n },\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 category: input.category 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 scope: input.scope 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 = fabricService({\n alias: \"dynamodb_update\",\n description:\n \"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 scope: { type: String, required: false, description: \"Scope\" },\n alias: {\n type: String,\n required: false,\n description: \"Human-friendly alias\",\n },\n category: {\n type: String,\n required: false,\n description: \"Category classification\",\n },\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.category !== undefined && {\n category: input.category as string,\n }),\n ...(input.name !== undefined && { name: input.name as string }),\n ...(input.scope !== undefined && { scope: input.scope 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 queryByScope\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByScope = fabricService({\n alias: \"dynamodb_query_scope\",\n description: \"Query entities by scope (parent hierarchy)\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 queryByScope({\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 scope: input.scope as string,\n });\n },\n});\n\n/**\n * MCP wrapper for queryByCategory\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByCategory = fabricService({\n alias: \"dynamodb_query_category\",\n description: \"Query entities by category classification\",\n input: {\n category: { type: String, description: \"Category classification\" },\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 queryByCategory({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n category: input.category as string,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n scope: input.scope 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 = fabricService({\n alias: \"dynamodb_query_type\",\n description: \"Query entities by type classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 scope: input.scope 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 fabricMcp({\n service: wrapWithInit(getEntity),\n name: \"dynamodb_get\",\n server,\n });\n tools.push(\"dynamodb_get\");\n\n fabricMcp({\n service: wrapWithInit(mcpPutEntity),\n name: \"dynamodb_put\",\n server,\n });\n tools.push(\"dynamodb_put\");\n\n fabricMcp({\n service: wrapWithInit(mcpUpdateEntity),\n name: \"dynamodb_update\",\n server,\n });\n tools.push(\"dynamodb_update\");\n\n fabricMcp({\n service: wrapWithInit(deleteEntity),\n name: \"dynamodb_delete\",\n server,\n });\n tools.push(\"dynamodb_delete\");\n\n fabricMcp({\n service: wrapWithInit(archiveEntity),\n name: \"dynamodb_archive\",\n server,\n });\n tools.push(\"dynamodb_archive\");\n\n fabricMcp({\n service: wrapWithInit(destroyEntity),\n name: \"dynamodb_destroy\",\n server,\n });\n tools.push(\"dynamodb_destroy\");\n\n // Query operations\n fabricMcp({\n service: wrapWithInit(mcpQueryByScope),\n name: \"dynamodb_query_scope\",\n server,\n });\n tools.push(\"dynamodb_query_scope\");\n\n fabricMcp({\n service: wrapWithInit(queryByAlias),\n name: \"dynamodb_query_alias\",\n server,\n });\n tools.push(\"dynamodb_query_alias\");\n\n fabricMcp({\n service: wrapWithInit(mcpQueryByCategory),\n name: \"dynamodb_query_category\",\n server,\n });\n tools.push(\"dynamodb_query_category\");\n\n fabricMcp({\n service: wrapWithInit(mcpQueryByType),\n name: \"dynamodb_query_type\",\n server,\n });\n tools.push(\"dynamodb_query_type\");\n\n fabricMcp({\n service: 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 fabricMcp({ service: statusHandler, server });\n tools.push(\"dynamodb_status\");\n\n fabricMcp({ service: createTableHandler, server });\n tools.push(\"dynamodb_create_table\");\n\n fabricMcp({ service: 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","fabricBuildCompositeKey","getModelIndexes","fabricPopulateIndexKeys","ARCHIVED_SUFFIX","DELETED_SUFFIX","fabricService","GetCommand","PutCommand","DeleteCommand","getGsiAttributeNames","QueryCommand","SEPARATOR","DEFAULT_TABLE_NAME","getAllRegisteredIndexes","DescribeTableCommand","CreateTableCommand","fabricMcp"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/client.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 = 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","import {\n buildCompositeKey as fabricBuildCompositeKey,\n calculateScope as fabricCalculateScope,\n getModelIndexes,\n type IndexableModel,\n populateIndexKeys as fabricPopulateIndexKeys,\n} from \"@jaypie/fabric\";\n\nimport { APEX } from \"./constants.js\";\nimport type { ParentReference, StorableEntity } from \"./types.js\";\n\n// =============================================================================\n// Key Builders\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: IndexableModel,\n fields: string[],\n suffix?: string,\n): string {\n return fabricBuildCompositeKey(entity, fields, suffix);\n}\n\n/**\n * Calculate the scope 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 calculateScope(parent?: ParentReference): string {\n if (!parent) {\n return APEX;\n }\n return fabricCalculateScope(parent);\n}\n\n/**\n * Auto-populate GSI index keys on an entity and advance its write timestamps.\n *\n * - Bumps `updatedAt` to now on every call.\n * - Backfills `createdAt` to the same now if not already set.\n * - Populates GSI attributes (pk composite and sk composite when applicable)\n * using the indexes registered for the entity's model.\n *\n * Callers (createEntity, updateEntity, deleteEntity, archiveEntity,\n * transactWriteEntities) go through this one function so `updatedAt` is\n * always fresh and never forgotten.\n *\n * @param entity - The entity to index\n * @param suffix - Optional suffix override (defaults to archived/deleted state)\n * @returns A new entity with timestamps bumped and index keys populated\n */\nexport function indexEntity<T extends StorableEntity>(\n entity: T,\n suffix?: string,\n): T {\n const now = new Date().toISOString();\n const bumped = {\n ...entity,\n createdAt: entity.createdAt ?? now,\n updatedAt: now,\n } as T;\n\n const indexes = getModelIndexes(entity.model);\n return fabricPopulateIndexKeys(\n bumped as unknown as IndexableModel,\n indexes,\n suffix,\n ) as unknown as T;\n}\n","import {\n DeleteCommand,\n GetCommand,\n PutCommand,\n TransactWriteCommand,\n} from \"@aws-sdk/lib-dynamodb\";\nimport { fabricService } from \"@jaypie/fabric\";\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 (id)\n */\nexport const getEntity = fabricService({\n alias: \"getEntity\",\n description: \"Get a single entity by id\",\n input: {\n id: { type: String, description: \"Entity id (partition key)\" },\n },\n service: async ({ id }): Promise<StorableEntity | null> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new GetCommand({\n Key: { id },\n TableName: tableName,\n });\n\n const response = await docClient.send(command);\n return (response.Item as StorableEntity) ?? null;\n },\n});\n\n/**\n * Create an entity. Fails the conditional write if `id` already exists,\n * returning `null` instead of throwing. Use `updateEntity` to overwrite.\n * `indexEntity` auto-bumps `updatedAt` and backfills `createdAt`.\n */\nexport async function createEntity({\n entity,\n}: {\n entity: StorableEntity;\n}): Promise<StorableEntity | null> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const indexedEntity = indexEntity(entity);\n\n const command = new PutCommand({\n ConditionExpression: \"attribute_not_exists(id)\",\n Item: indexedEntity,\n TableName: tableName,\n });\n\n try {\n await docClient.send(command);\n } catch (error) {\n if ((error as { name?: string })?.name === \"ConditionalCheckFailedException\") {\n return null;\n }\n throw error;\n }\n return indexedEntity;\n}\n\n/**\n * Update an existing entity.\n * `indexEntity` auto-bumps `updatedAt` — callers never set it manually.\n */\nexport async function updateEntity({\n entity,\n}: {\n entity: StorableEntity;\n}): Promise<StorableEntity> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const updatedEntity = indexEntity(entity);\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 = fabricService({\n alias: \"deleteEntity\",\n description: \"Soft delete an entity (sets deletedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity id\" },\n },\n service: async ({ id }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const existing = await getEntity({ id });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n // indexEntity will bump updatedAt again; set deletedAt here.\n const updatedEntity = {\n ...existing,\n deletedAt: now,\n };\n\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 = fabricService({\n alias: \"archiveEntity\",\n description: \"Archive an entity (sets archivedAt timestamp)\",\n input: {\n id: { type: String, description: \"Entity id\" },\n },\n service: async ({ id }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const existing = await getEntity({ id });\n if (!existing) {\n return false;\n }\n\n const now = new Date().toISOString();\n\n const updatedEntity = {\n ...existing,\n archivedAt: now,\n };\n\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 = fabricService({\n alias: \"destroyEntity\",\n description: \"Hard delete an entity (permanently removes from table)\",\n input: {\n id: { type: String, description: \"Entity id\" },\n },\n service: async ({ id }): Promise<boolean> => {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new DeleteCommand({\n Key: { id },\n TableName: tableName,\n });\n\n await docClient.send(command);\n return true;\n },\n});\n\n/**\n * Write multiple entities atomically using DynamoDB transactions.\n * Each entity is auto-indexed via indexEntity before writing.\n * All entities are written to the same table in a single transaction.\n */\nexport async function transactWriteEntities({\n entities,\n}: {\n entities: StorableEntity[];\n}): Promise<void> {\n const docClient = getDocClient();\n const tableName = getTableName();\n\n const command = new TransactWriteCommand({\n TransactItems: entities.map((entity) => ({\n Put: {\n Item: indexEntity(entity),\n TableName: tableName,\n },\n })),\n });\n\n await docClient.send(command);\n}\n","import { QueryCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { ConfigurationError } from \"@jaypie/errors\";\nimport {\n fabricService,\n getGsiAttributeNames,\n getModelIndexes,\n type IndexDefinition,\n SEPARATOR,\n} from \"@jaypie/fabric\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport { ARCHIVED_SUFFIX, DELETED_SUFFIX } from \"./constants.js\";\nimport { buildCompositeKey } from \"./keyBuilders.js\";\nimport type {\n QueryByAliasParams,\n QueryByCategoryParams,\n QueryByScopeParams,\n QueryByTypeParams,\n QueryByXidParams,\n QueryResult,\n StorableEntity,\n} from \"./types.js\";\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Calculate the suffix for the GSI partition key based on archived/deleted\n * flags. Suffix stays on pk so deleted/archived entities are queried as their\n * own partition (active queries skip them naturally).\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 * Find the registered index for a model that matches a given partition-key\n * shape. The matching index is the first one whose pk equals the expected\n * fields. Throws ConfigurationError if no match is found.\n */\nfunction requireIndex(model: string, pkFields: string[]): IndexDefinition {\n const indexes = getModelIndexes(model);\n const match = indexes.find(\n (index) =>\n index.pk.length === pkFields.length &&\n index.pk.every((field, i) => field === pkFields[i]),\n );\n if (!match) {\n throw new ConfigurationError(\n `Model \"${model}\" has no index with pk=[${pkFields.join(\", \")}]. ` +\n `Register one with fabricIndex(${\n pkFields.length > 1 ? `\"${pkFields[1]}\"` : \"\"\n }).`,\n );\n }\n return match;\n}\n\n/**\n * Execute a GSI query.\n *\n * - pk: exact match on the index partition key\n * - skPrefix: optional begins_with on the index sort key (used when the index\n * has a composite sk like [scope, updatedAt])\n */\nasync function executeQuery<T extends StorableEntity>(\n index: IndexDefinition,\n pkValue: string,\n options: {\n ascending?: boolean;\n limit?: number;\n skPrefix?: string;\n startKey?: Record<string, unknown>;\n } = {},\n): Promise<QueryResult<T>> {\n const { ascending = false, limit, skPrefix, startKey } = options;\n const attrs = getGsiAttributeNames(index);\n const indexName = attrs.pk;\n\n const expressionAttributeNames: Record<string, string> = {\n \"#pk\": indexName,\n };\n const expressionAttributeValues: Record<string, unknown> = {\n \":pkValue\": pkValue,\n };\n let keyConditionExpression = \"#pk = :pkValue\";\n\n if (skPrefix !== undefined && attrs.sk) {\n expressionAttributeNames[\"#sk\"] = attrs.sk;\n expressionAttributeValues[\":skPrefix\"] = skPrefix;\n keyConditionExpression += \" AND begins_with(#sk, :skPrefix)\";\n }\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: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n IndexName: indexName,\n KeyConditionExpression: keyConditionExpression,\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\nfunction scopePrefix(scope: string | undefined): string | undefined {\n return scope === undefined ? undefined : `${scope}${SEPARATOR}`;\n}\n\n// =============================================================================\n// Query Functions\n// =============================================================================\n\n/**\n * List entities of a model, optionally narrowed to a scope.\n * Requires the model to register `fabricIndex()` (pk=[model]).\n */\nexport async function queryByScope({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n scope,\n startKey,\n}: QueryByScopeParams): Promise<QueryResult<StorableEntity>> {\n const index = requireIndex(model, [\"model\"]);\n const suffix = calculateSuffix({ archived, deleted });\n const pkValue = buildCompositeKey({ model }, [\"model\"], suffix);\n return executeQuery<StorableEntity>(index, pkValue, {\n ascending,\n limit,\n skPrefix: scopePrefix(scope),\n startKey,\n });\n}\n\n/**\n * Query a single entity by human-friendly alias.\n * Requires the model to register `fabricIndex(\"alias\")`.\n */\nexport const queryByAlias = fabricService({\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 scope: {\n type: String,\n required: false,\n description: \"Optional scope narrower (begins_with on sk)\",\n },\n },\n service: async ({\n alias,\n archived,\n deleted,\n model,\n scope,\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 scopeStr = scope as string | undefined;\n\n const index = requireIndex(modelStr, [\"model\", \"alias\"]);\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const pkValue = buildCompositeKey(\n { model: modelStr, alias: aliasStr },\n [\"model\", \"alias\"],\n suffix,\n );\n const result = await executeQuery<StorableEntity>(index, pkValue, {\n limit: 1,\n skPrefix: scopePrefix(scopeStr),\n });\n return result.items[0] ?? null;\n },\n});\n\n/**\n * Query entities by category classification.\n * Requires the model to register `fabricIndex(\"category\")`.\n */\nexport async function queryByCategory({\n archived = false,\n ascending = false,\n category,\n deleted = false,\n limit,\n model,\n scope,\n startKey,\n}: QueryByCategoryParams): Promise<QueryResult<StorableEntity>> {\n const index = requireIndex(model, [\"model\", \"category\"]);\n const suffix = calculateSuffix({ archived, deleted });\n const pkValue = buildCompositeKey(\n { model, category },\n [\"model\", \"category\"],\n suffix,\n );\n return executeQuery<StorableEntity>(index, pkValue, {\n ascending,\n limit,\n skPrefix: scopePrefix(scope),\n startKey,\n });\n}\n\n/**\n * Query entities by type classification.\n * Requires the model to register `fabricIndex(\"type\")`.\n */\nexport async function queryByType({\n archived = false,\n ascending = false,\n deleted = false,\n limit,\n model,\n scope,\n startKey,\n type,\n}: QueryByTypeParams): Promise<QueryResult<StorableEntity>> {\n const index = requireIndex(model, [\"model\", \"type\"]);\n const suffix = calculateSuffix({ archived, deleted });\n const pkValue = buildCompositeKey(\n { model, type },\n [\"model\", \"type\"],\n suffix,\n );\n return executeQuery<StorableEntity>(index, pkValue, {\n ascending,\n limit,\n skPrefix: scopePrefix(scope),\n startKey,\n });\n}\n\n/**\n * Query a single entity by external ID.\n * Requires the model to register `fabricIndex(\"xid\")`.\n */\nexport const queryByXid = fabricService({\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 scope: {\n type: String,\n required: false,\n description: \"Optional scope narrower (begins_with on sk)\",\n },\n xid: { type: String, description: \"External ID\" },\n },\n service: async ({\n archived,\n deleted,\n model,\n scope,\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 scopeStr = scope as string | undefined;\n const xidStr = xid as string;\n\n const index = requireIndex(modelStr, [\"model\", \"xid\"]);\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const pkValue = buildCompositeKey(\n { model: modelStr, xid: xidStr },\n [\"model\", \"xid\"],\n suffix,\n );\n const result = await executeQuery<StorableEntity>(index, pkValue, {\n limit: 1,\n skPrefix: scopePrefix(scopeStr),\n });\n return result.items[0] ?? null;\n },\n});\n\n// Internal exports for the unified query() layer\nexport { executeQuery, requireIndex, calculateSuffix, scopePrefix };\n","import {\n CreateTableCommand,\n DescribeTableCommand,\n DynamoDBClient,\n} from \"@aws-sdk/client-dynamodb\";\nimport {\n fabricService,\n getAllRegisteredIndexes,\n getGsiAttributeNames,\n type IndexDefinition,\n} from \"@jaypie/fabric\";\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 → GSI Conversion\n// =============================================================================\n\n/**\n * Build attribute definitions from registered indexes.\n * Primary key is `id` (STRING) only; GSI pk and composite sk attributes\n * are all STRING. A single-field sk (e.g., raw `updatedAt`) is also STRING.\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: id only\n attrs.set(\"id\", \"S\");\n\n for (const index of indexes) {\n const { pk, sk } = getGsiAttributeNames(index);\n // All pk attributes are composite strings\n if (!attrs.has(pk)) attrs.set(pk, \"S\");\n if (sk && !attrs.has(sk)) {\n // Single-field `sequence` remains NUMBER for back-compat callers;\n // every other sk attribute (composite or not) is STRING.\n attrs.set(sk, sk === \"sequence\" ? \"N\" : \"S\");\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 registered indexes\n */\nfunction buildGSIs(indexes: IndexDefinition[]): 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 { pk, sk } = getGsiAttributeNames(index);\n const keySchema: Array<{\n AttributeName: string;\n KeyType: \"HASH\" | \"RANGE\";\n }> = [{ AttributeName: pk, KeyType: \"HASH\" }];\n if (sk) {\n keySchema.push({ AttributeName: sk, KeyType: \"RANGE\" });\n }\n return {\n IndexName: pk,\n KeySchema: keySchema,\n Projection: gsiProjection,\n };\n });\n}\n\n// =============================================================================\n// Table Creation\n// =============================================================================\n\n/**\n * DynamoDB table schema with Jaypie GSI pattern.\n * Primary key is `id` only. GSIs come from models registered via\n * `registerModel()`, shaped by `fabricIndex()`.\n */\nfunction createTableParams(\n tableName: string,\n billingMode: \"PAY_PER_REQUEST\" | \"PROVISIONED\",\n) {\n const allIndexes = getAllRegisteredIndexes();\n\n return {\n AttributeDefinitions: buildAttributeDefinitions(allIndexes),\n BillingMode: billingMode,\n GlobalSecondaryIndexes: buildGSIs(allIndexes),\n KeySchema: [{ AttributeName: \"id\", KeyType: \"HASH\" as const }],\n TableName: tableName,\n };\n}\n\n/**\n * Create DynamoDB table with Jaypie GSI schema\n */\nexport const createTableHandler = fabricService({\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 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 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 { fabricService } from \"@jaypie/fabric\";\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 = fabricService({\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 { fabricService } from \"@jaypie/fabric\";\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 = fabricService({\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 { fabricMcp } from \"@jaypie/fabric/mcp\";\nimport { fabricService, type Service } from \"@jaypie/fabric\";\n\nimport {\n archiveEntity,\n createEntity,\n deleteEntity,\n destroyEntity,\n getEntity,\n queryByAlias,\n queryByCategory,\n queryByScope,\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 * Uses explicit type assertion to allow any Service type to be wrapped\n */\n\nfunction wrapWithInit(handler: Service<any, any, any>): Service {\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 Service;\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 fabricMcp\n\n/**\n * MCP wrapper for createEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpCreateEntity = fabricService({\n alias: \"dynamodb_create\",\n description:\n \"Create an entity in DynamoDB (auto-indexes GSI keys; returns null if id exists)\",\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 scope: { type: String, description: \"Scope (@ for root)\" },\n // Optional fields\n alias: {\n type: String,\n required: false,\n description: \"Human-friendly alias\",\n },\n category: {\n type: String,\n required: false,\n description: \"Category classification\",\n },\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 category: input.category 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 scope: input.scope 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 createEntity({ entity });\n },\n});\n\n/**\n * MCP wrapper for updateEntity\n * Accepts entity JSON directly from LLM\n */\nconst mcpUpdateEntity = fabricService({\n alias: \"dynamodb_update\",\n description:\n \"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 scope: { type: String, required: false, description: \"Scope\" },\n alias: {\n type: String,\n required: false,\n description: \"Human-friendly alias\",\n },\n category: {\n type: String,\n required: false,\n description: \"Category classification\",\n },\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.category !== undefined && {\n category: input.category as string,\n }),\n ...(input.name !== undefined && { name: input.name as string }),\n ...(input.scope !== undefined && { scope: input.scope 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 queryByScope\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByScope = fabricService({\n alias: \"dynamodb_query_scope\",\n description: \"Query entities by scope (parent hierarchy)\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 queryByScope({\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 scope: input.scope as string,\n });\n },\n});\n\n/**\n * MCP wrapper for queryByCategory\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByCategory = fabricService({\n alias: \"dynamodb_query_category\",\n description: \"Query entities by category classification\",\n input: {\n category: { type: String, description: \"Category classification\" },\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 queryByCategory({\n archived: input.archived as boolean,\n ascending: input.ascending as boolean,\n category: input.category as string,\n deleted: input.deleted as boolean,\n limit: input.limit as number | undefined,\n model: input.model as string,\n scope: input.scope 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 = fabricService({\n alias: \"dynamodb_query_type\",\n description: \"Query entities by type classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 scope: input.scope 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 fabricMcp({\n service: wrapWithInit(getEntity),\n name: \"dynamodb_get\",\n server,\n });\n tools.push(\"dynamodb_get\");\n\n fabricMcp({\n service: wrapWithInit(mcpCreateEntity),\n name: \"dynamodb_create\",\n server,\n });\n tools.push(\"dynamodb_create\");\n\n fabricMcp({\n service: wrapWithInit(mcpUpdateEntity),\n name: \"dynamodb_update\",\n server,\n });\n tools.push(\"dynamodb_update\");\n\n fabricMcp({\n service: wrapWithInit(deleteEntity),\n name: \"dynamodb_delete\",\n server,\n });\n tools.push(\"dynamodb_delete\");\n\n fabricMcp({\n service: wrapWithInit(archiveEntity),\n name: \"dynamodb_archive\",\n server,\n });\n tools.push(\"dynamodb_archive\");\n\n fabricMcp({\n service: wrapWithInit(destroyEntity),\n name: \"dynamodb_destroy\",\n server,\n });\n tools.push(\"dynamodb_destroy\");\n\n // Query operations\n fabricMcp({\n service: wrapWithInit(mcpQueryByScope),\n name: \"dynamodb_query_scope\",\n server,\n });\n tools.push(\"dynamodb_query_scope\");\n\n fabricMcp({\n service: wrapWithInit(queryByAlias),\n name: \"dynamodb_query_alias\",\n server,\n });\n tools.push(\"dynamodb_query_alias\");\n\n fabricMcp({\n service: wrapWithInit(mcpQueryByCategory),\n name: \"dynamodb_query_category\",\n server,\n });\n tools.push(\"dynamodb_query_category\");\n\n fabricMcp({\n service: wrapWithInit(mcpQueryByType),\n name: \"dynamodb_query_type\",\n server,\n });\n tools.push(\"dynamodb_query_type\");\n\n fabricMcp({\n service: 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 fabricMcp({ service: statusHandler, server });\n tools.push(\"dynamodb_status\");\n\n fabricMcp({ service: createTableHandler, server });\n tools.push(\"dynamodb_create_table\");\n\n fabricMcp({ service: 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","fabricBuildCompositeKey","getModelIndexes","fabricPopulateIndexKeys","ARCHIVED_SUFFIX","DELETED_SUFFIX","fabricService","GetCommand","PutCommand","DeleteCommand","getGsiAttributeNames","QueryCommand","SEPARATOR","DEFAULT_TABLE_NAME","getAllRegisteredIndexes","DescribeTableCommand","CreateTableCommand","fabricMcp"],"mappings":"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"}
@@ -4,12 +4,13 @@ import type { StorableEntity } from "./types.js";
4
4
  */
5
5
  export declare const getEntity: import("@jaypie/fabric").Service<Record<string, unknown>, StorableEntity | null, StorableEntity | null>;
6
6
  /**
7
- * Put (create or replace) an entity.
7
+ * Create an entity. Fails the conditional write if `id` already exists,
8
+ * returning `null` instead of throwing. Use `updateEntity` to overwrite.
8
9
  * `indexEntity` auto-bumps `updatedAt` and backfills `createdAt`.
9
10
  */
10
- export declare function putEntity({ entity, }: {
11
+ export declare function createEntity({ entity, }: {
11
12
  entity: StorableEntity;
12
- }): Promise<StorableEntity>;
13
+ }): Promise<StorableEntity | null>;
13
14
  /**
14
15
  * Update an existing entity.
15
16
  * `indexEntity` auto-bumps `updatedAt` — callers never set it manually.
@@ -1,6 +1,6 @@
1
1
  export { getDocClient, getTableName, initClient, isInitialized, resetClient, } from "./client.js";
2
2
  export { APEX, ARCHIVED_SUFFIX, DELETED_SUFFIX, SEPARATOR, } from "./constants.js";
3
- export { archiveEntity, deleteEntity, destroyEntity, getEntity, putEntity, transactWriteEntities, updateEntity, } from "./entities.js";
3
+ export { archiveEntity, createEntity, deleteEntity, destroyEntity, getEntity, transactWriteEntities, updateEntity, } from "./entities.js";
4
4
  export { buildCompositeKey, calculateScope, indexEntity, } from "./keyBuilders.js";
5
5
  export { queryByAlias, queryByCategory, queryByScope, queryByType, queryByXid, } from "./queries.js";
6
6
  export { query } from "./query.js";
package/dist/esm/index.js CHANGED
@@ -115,7 +115,7 @@ function calculateScope(parent) {
115
115
  * - Populates GSI attributes (pk composite and sk composite when applicable)
116
116
  * using the indexes registered for the entity's model.
117
117
  *
118
- * Callers (putEntity, updateEntity, deleteEntity, archiveEntity,
118
+ * Callers (createEntity, updateEntity, deleteEntity, archiveEntity,
119
119
  * transactWriteEntities) go through this one function so `updatedAt` is
120
120
  * always fresh and never forgotten.
121
121
  *
@@ -172,18 +172,28 @@ const getEntity = fabricService({
172
172
  },
173
173
  });
174
174
  /**
175
- * Put (create or replace) an entity.
175
+ * Create an entity. Fails the conditional write if `id` already exists,
176
+ * returning `null` instead of throwing. Use `updateEntity` to overwrite.
176
177
  * `indexEntity` auto-bumps `updatedAt` and backfills `createdAt`.
177
178
  */
178
- async function putEntity({ entity, }) {
179
+ async function createEntity({ entity, }) {
179
180
  const docClient = getDocClient();
180
181
  const tableName = getTableName();
181
182
  const indexedEntity = indexEntity(entity);
182
183
  const command = new PutCommand({
184
+ ConditionExpression: "attribute_not_exists(id)",
183
185
  Item: indexedEntity,
184
186
  TableName: tableName,
185
187
  });
186
- await docClient.send(command);
188
+ try {
189
+ await docClient.send(command);
190
+ }
191
+ catch (error) {
192
+ if (error?.name === "ConditionalCheckFailedException") {
193
+ return null;
194
+ }
195
+ throw error;
196
+ }
187
197
  return indexedEntity;
188
198
  }
189
199
  /**
@@ -636,7 +646,7 @@ async function seedEntityIfNotExists(entity) {
636
646
  scope: entity.scope,
637
647
  ...entity,
638
648
  };
639
- await putEntity({ entity: completeEntity });
649
+ await createEntity({ entity: completeEntity });
640
650
  return true;
641
651
  }
642
652
  /**
@@ -665,6 +675,7 @@ async function seedEntities(entities, options = {}) {
665
675
  throw new Error("Entity must have model and scope");
666
676
  }
667
677
  // For entities with alias, check existence
678
+ let isReplace = false;
668
679
  if (entity.alias) {
669
680
  const existing = await queryByAlias({
670
681
  alias: entity.alias,
@@ -678,6 +689,7 @@ async function seedEntities(entities, options = {}) {
678
689
  // If replacing, use existing ID to update rather than create new
679
690
  if (existing && replace) {
680
691
  entity.id = existing.id;
692
+ isReplace = true;
681
693
  }
682
694
  }
683
695
  if (dryRun) {
@@ -692,7 +704,12 @@ async function seedEntities(entities, options = {}) {
692
704
  scope: entity.scope,
693
705
  ...entity,
694
706
  };
695
- await putEntity({ entity: completeEntity });
707
+ if (isReplace) {
708
+ await updateEntity({ entity: completeEntity });
709
+ }
710
+ else {
711
+ await createEntity({ entity: completeEntity });
712
+ }
696
713
  result.created.push(alias);
697
714
  }
698
715
  catch (error) {
@@ -750,5 +767,5 @@ async function exportEntitiesToJson(model, scope, pretty = true) {
750
767
  return pretty ? JSON.stringify(entities, null, 2) : JSON.stringify(entities);
751
768
  }
752
769
 
753
- export { archiveEntity, buildCompositeKey, calculateScope, deleteEntity, destroyEntity, exportEntities, exportEntitiesToJson, getDocClient, getEntity, getTableName, indexEntity, initClient, isInitialized, putEntity, query, queryByAlias, queryByCategory, queryByScope, queryByType, queryByXid, resetClient, seedEntities, seedEntityIfNotExists, transactWriteEntities, updateEntity };
770
+ export { archiveEntity, buildCompositeKey, calculateScope, createEntity, deleteEntity, destroyEntity, exportEntities, exportEntitiesToJson, getDocClient, getEntity, getTableName, indexEntity, initClient, isInitialized, query, queryByAlias, queryByCategory, queryByScope, queryByType, queryByXid, resetClient, seedEntities, seedEntityIfNotExists, transactWriteEntities, updateEntity };
754
771
  //# sourceMappingURL=index.js.map