@jaypie/dynamodb 0.4.0 → 0.4.2

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,5 +1,5 @@
1
1
  import { fabricMcp } from '@jaypie/fabric/mcp';
2
- import { getModelIndexes, populateIndexKeys, SEPARATOR, fabricService, ARCHIVED_SUFFIX, DELETED_SUFFIX, DEFAULT_INDEXES, getAllRegisteredIndexes } from '@jaypie/fabric';
2
+ import { getModelIndexes, populateIndexKeys, SEPARATOR, fabricService, ARCHIVED_SUFFIX, DELETED_SUFFIX, getAllRegisteredIndexes } from '@jaypie/fabric';
3
3
  import { DynamoDBClient, DescribeTableCommand, CreateTableCommand } from '@aws-sdk/client-dynamodb';
4
4
  import { DynamoDBDocumentClient, GetCommand, PutCommand, DeleteCommand, QueryCommand } from '@aws-sdk/lib-dynamodb';
5
5
  import { ConfigurationError } from '@jaypie/errors';
@@ -76,9 +76,9 @@ function isInitialized() {
76
76
  }
77
77
 
78
78
  // Re-export shared constants from fabric
79
- // GSI names (derived from DEFAULT_INDEXES)
79
+ // GSI names
80
80
  const INDEX_ALIAS = "indexAlias";
81
- const INDEX_CLASS = "indexClass";
81
+ const INDEX_CATEGORY = "indexCategory";
82
82
  const INDEX_SCOPE = "indexScope";
83
83
  const INDEX_TYPE = "indexType";
84
84
  const INDEX_XID = "indexXid";
@@ -106,14 +106,14 @@ function buildIndexAlias(scope, model, alias) {
106
106
  return `${scope}${SEPARATOR}${model}${SEPARATOR}${alias}`;
107
107
  }
108
108
  /**
109
- * Build the indexClass key for category filtering
109
+ * Build the indexCategory key for category filtering
110
110
  * @param scope - The scope
111
111
  * @param model - The entity model name
112
- * @param recordClass - The category classification
113
- * @returns Composite key: "{scope}#{model}#{class}"
112
+ * @param category - The category classification
113
+ * @returns Composite key: "{scope}#{model}#{category}"
114
114
  */
115
- function buildIndexClass(scope, model, recordClass) {
116
- return `${scope}${SEPARATOR}${model}${SEPARATOR}${recordClass}`;
115
+ function buildIndexCategory(scope, model, category) {
116
+ return `${scope}${SEPARATOR}${model}${SEPARATOR}${category}`;
117
117
  }
118
118
  /**
119
119
  * Build the indexType key for type filtering
@@ -138,12 +138,11 @@ function buildIndexXid(scope, model, xid) {
138
138
  /**
139
139
  * Auto-populate GSI index keys on an entity
140
140
  *
141
- * Uses the model's registered indexes (from vocabulary registry) or
142
- * DEFAULT_INDEXES if no custom indexes are registered.
141
+ * Uses the model's registered indexes (from the fabric registry).
143
142
  *
144
143
  * - indexScope is always populated from scope + model
145
144
  * - indexAlias is populated only when alias is present
146
- * - indexClass is populated only when class is present
145
+ * - indexCategory is populated only when category is present
147
146
  * - indexType is populated only when type is present
148
147
  * - indexXid is populated only when xid is present
149
148
  *
@@ -435,15 +434,15 @@ const queryByAlias = fabricService({
435
434
  });
436
435
  /**
437
436
  * Query entities by category classification
438
- * Uses indexClass GSI
437
+ * Uses indexCategory GSI
439
438
  *
440
439
  * Note: This is a regular async function (not fabricService) because it accepts
441
440
  * complex startKey objects that can't be coerced by vocabulary's type system.
442
441
  */
443
- async function queryByClass({ archived = false, ascending = false, deleted = false, limit, model, scope, recordClass, startKey, }) {
442
+ async function queryByCategory({ archived = false, ascending = false, category, deleted = false, limit, model, scope, startKey, }) {
444
443
  const suffix = calculateSuffix({ archived, deleted });
445
- const keyValue = buildIndexClass(scope, model, recordClass) + suffix;
446
- return executeQuery(INDEX_CLASS, keyValue, {
444
+ const keyValue = buildIndexCategory(scope, model, category) + suffix;
445
+ return executeQuery(INDEX_CATEGORY, keyValue, {
447
446
  ascending,
448
447
  limit,
449
448
  startKey,
@@ -523,16 +522,10 @@ function generateIndexName(pk) {
523
522
  return `index${suffix}`;
524
523
  }
525
524
  /**
526
- * Collect all unique indexes from DEFAULT_INDEXES and registered models
525
+ * Collect all unique indexes from registered models
527
526
  */
528
527
  function collectAllIndexes() {
529
528
  const indexMap = new Map();
530
- // Add DEFAULT_INDEXES first
531
- for (const index of DEFAULT_INDEXES) {
532
- const name = index.name ?? generateIndexName(index.pk);
533
- indexMap.set(name, { ...index, name });
534
- }
535
- // Add registered model indexes (will not overwrite if name already exists)
536
529
  for (const index of getAllRegisteredIndexes()) {
537
530
  const name = index.name ?? generateIndexName(index.pk);
538
531
  if (!indexMap.has(name)) {
@@ -600,9 +593,7 @@ function buildGSIs(indexes) {
600
593
  /**
601
594
  * DynamoDB table schema with Jaypie GSI pattern
602
595
  *
603
- * Collects indexes from:
604
- * 1. DEFAULT_INDEXES (5 standard GSIs)
605
- * 2. Any custom indexes registered via registerModel()
596
+ * Collects indexes from models registered via registerModel()
606
597
  */
607
598
  function createTableParams(tableName, billingMode) {
608
599
  const allIndexes = collectAllIndexes();
@@ -798,6 +789,7 @@ const statusHandler = fabricService({
798
789
 
799
790
  /**
800
791
  * Wrap a handler to auto-initialize before execution
792
+ * Uses explicit type assertion to allow any Service type to be wrapped
801
793
  */
802
794
  function wrapWithInit(handler) {
803
795
  const wrapped = async (input) => {
@@ -833,7 +825,7 @@ const mcpPutEntity = fabricService({
833
825
  required: false,
834
826
  description: "Human-friendly alias",
835
827
  },
836
- class: {
828
+ category: {
837
829
  type: String,
838
830
  required: false,
839
831
  description: "Category classification",
@@ -845,7 +837,7 @@ const mcpPutEntity = fabricService({
845
837
  const now = new Date().toISOString();
846
838
  const entity = {
847
839
  alias: input.alias,
848
- class: input.class,
840
+ category: input.category,
849
841
  createdAt: now,
850
842
  id: input.id,
851
843
  model: input.model,
@@ -878,7 +870,7 @@ const mcpUpdateEntity = fabricService({
878
870
  required: false,
879
871
  description: "Human-friendly alias",
880
872
  },
881
- class: {
873
+ category: {
882
874
  type: String,
883
875
  required: false,
884
876
  description: "Category classification",
@@ -899,7 +891,9 @@ const mcpUpdateEntity = fabricService({
899
891
  const entity = {
900
892
  ...existing,
901
893
  ...(input.alias !== undefined && { alias: input.alias }),
902
- ...(input.class !== undefined && { class: input.class }),
894
+ ...(input.category !== undefined && {
895
+ category: input.category,
896
+ }),
903
897
  ...(input.name !== undefined && { name: input.name }),
904
898
  ...(input.scope !== undefined && { scope: input.scope }),
905
899
  ...(input.type !== undefined && { type: input.type }),
@@ -954,16 +948,16 @@ const mcpQueryByScope = fabricService({
954
948
  },
955
949
  });
956
950
  /**
957
- * MCP wrapper for queryByClass
951
+ * MCP wrapper for queryByCategory
958
952
  * Note: Pagination via startKey is not exposed to MCP; use limit instead
959
953
  */
960
- const mcpQueryByClass = fabricService({
961
- alias: "dynamodb_query_class",
954
+ const mcpQueryByCategory = fabricService({
955
+ alias: "dynamodb_query_category",
962
956
  description: "Query entities by category classification",
963
957
  input: {
958
+ category: { type: String, description: "Category classification" },
964
959
  model: { type: String, description: "Entity model name" },
965
960
  scope: { type: String, description: "Scope (@ for root)" },
966
- recordClass: { type: String, description: "Category classification" },
967
961
  archived: {
968
962
  type: Boolean,
969
963
  default: false,
@@ -989,14 +983,14 @@ const mcpQueryByClass = fabricService({
989
983
  },
990
984
  },
991
985
  service: async (input) => {
992
- return queryByClass({
986
+ return queryByCategory({
993
987
  archived: input.archived,
994
988
  ascending: input.ascending,
989
+ category: input.category,
995
990
  deleted: input.deleted,
996
991
  limit: input.limit,
997
992
  model: input.model,
998
993
  scope: input.scope,
999
- recordClass: input.recordClass,
1000
994
  });
1001
995
  },
1002
996
  });
@@ -1104,11 +1098,11 @@ function registerDynamoDbTools(config) {
1104
1098
  });
1105
1099
  tools.push("dynamodb_query_alias");
1106
1100
  fabricMcp({
1107
- service: wrapWithInit(mcpQueryByClass),
1108
- name: "dynamodb_query_class",
1101
+ service: wrapWithInit(mcpQueryByCategory),
1102
+ name: "dynamodb_query_category",
1109
1103
  server,
1110
1104
  });
1111
- tools.push("dynamodb_query_class");
1105
+ tools.push("dynamodb_query_category");
1112
1106
  fabricMcp({
1113
1107
  service: wrapWithInit(mcpQueryByType),
1114
1108
  name: "dynamodb_query_type",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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 = 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 fabric\nexport {\n APEX,\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n SEPARATOR,\n} from \"@jaypie/fabric\";\n\n// GSI names (derived from DEFAULT_INDEXES)\nexport const INDEX_ALIAS = \"indexAlias\";\nexport const INDEX_CLASS = \"indexClass\";\nexport const INDEX_SCOPE = \"indexScope\";\nexport const INDEX_TYPE = \"indexType\";\nexport const INDEX_XID = \"indexXid\";\n","import {\n buildCompositeKey as fabricBuildCompositeKey,\n calculateScope as fabricCalculateScope,\n DEFAULT_INDEXES,\n getModelIndexes,\n type IndexableModel,\n populateIndexKeys as fabricPopulateIndexKeys,\n} from \"@jaypie/fabric\";\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 indexScope key for hierarchical queries\n * @param scope - The scope (APEX or \"{parent.model}#{parent.id}\")\n * @param model - The entity model name\n * @returns Composite key: \"{scope}#{model}\"\n */\nexport function buildIndexScope(scope: string, model: string): string {\n return `${scope}${SEPARATOR}${model}`;\n}\n\n/**\n * Build the indexAlias key for human-friendly lookups\n * @param scope - The scope\n * @param model - The entity model name\n * @param alias - The human-friendly alias\n * @returns Composite key: \"{scope}#{model}#{alias}\"\n */\nexport function buildIndexAlias(\n scope: string,\n model: string,\n alias: string,\n): string {\n return `${scope}${SEPARATOR}${model}${SEPARATOR}${alias}`;\n}\n\n/**\n * Build the indexClass key for category filtering\n * @param scope - The scope\n * @param model - The entity model name\n * @param recordClass - The category classification\n * @returns Composite key: \"{scope}#{model}#{class}\"\n */\nexport function buildIndexClass(\n scope: string,\n model: string,\n recordClass: string,\n): string {\n return `${scope}${SEPARATOR}${model}${SEPARATOR}${recordClass}`;\n}\n\n/**\n * Build the indexType key for type filtering\n * @param scope - The scope\n * @param model - The entity model name\n * @param type - The type classification\n * @returns Composite key: \"{scope}#{model}#{type}\"\n */\nexport function buildIndexType(\n scope: string,\n model: string,\n type: string,\n): string {\n return `${scope}${SEPARATOR}${model}${SEPARATOR}${type}`;\n}\n\n/**\n * Build the indexXid key for external ID lookups\n * @param scope - The scope\n * @param model - The entity model name\n * @param xid - The external ID\n * @returns Composite key: \"{scope}#{model}#{xid}\"\n */\nexport function buildIndexXid(scope: string, model: string, xid: string): string {\n return `${scope}${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: 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\n *\n * Uses the model's registered indexes (from vocabulary registry) or\n * DEFAULT_INDEXES if no custom indexes are registered.\n *\n * - indexScope is always populated from scope + 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 IndexableModel\n return fabricPopulateIndexKeys(\n entity as unknown as IndexableModel,\n indexes,\n suffix,\n ) 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 { 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\n */\nexport const getEntity = fabricService({\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 fabricService) 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 fabricService) 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 = fabricService({\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 = fabricService({\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 = fabricService({\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 { fabricService } from \"@jaypie/fabric\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport {\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n INDEX_ALIAS,\n INDEX_CLASS,\n INDEX_SCOPE,\n INDEX_TYPE,\n INDEX_XID,\n} from \"./constants.js\";\nimport {\n buildIndexAlias,\n buildIndexClass,\n buildIndexScope,\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 queryByScope\n */\ninterface QueryByScopeParams extends BaseQueryOptions {\n model: string;\n scope: string;\n}\n\n/**\n * Query entities by scope (parent hierarchy)\n * Uses indexScope GSI\n *\n * Note: This is a regular async function (not fabricService) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\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 suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexScope(scope, model) + suffix;\n return executeQuery<StorableEntity>(INDEX_SCOPE, 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 = 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: { type: String, description: \"Scope (@ for root)\" },\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;\n\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const keyValue = buildIndexAlias(scopeStr, 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 scope: 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 fabricService) 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 scope,\n recordClass,\n startKey,\n}: QueryByClassParams): Promise<QueryResult<StorableEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexClass(scope, 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 scope: 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 fabricService) 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 scope,\n startKey,\n type,\n}: QueryByTypeParams): Promise<QueryResult<StorableEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexType(scope, 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 = 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: { type: String, description: \"Scope (@ for root)\" },\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;\n const xidStr = xid as string;\n\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const keyValue = buildIndexXid(scopeStr, 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 fabricService,\n getAllRegisteredIndexes,\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 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(skField as string, skField === \"sequence\" ? \"N\" : \"S\");\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(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 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 = 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 // 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 { 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 queryByClass,\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 */\nfunction wrapWithInit(handler: Service): 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 class: {\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 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 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 class: {\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.class !== undefined && { class: input.class as string }),\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 queryByClass\n * Note: Pagination via startKey is not exposed to MCP; use limit instead\n */\nconst mcpQueryByClass = fabricService({\n alias: \"dynamodb_query_class\",\n description: \"Query entities by category classification\",\n input: {\n model: { type: String, description: \"Entity model name\" },\n scope: { type: String, description: \"Scope (@ 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 scope: input.scope 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 = 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(mcpQueryByClass),\n name: \"dynamodb_query_class\",\n server,\n });\n tools.push(\"dynamodb_query_class\");\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","fabricPopulateIndexKeys","DEFAULT_TABLE_NAME"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","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 = 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 fabric\nexport {\n APEX,\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n SEPARATOR,\n} from \"@jaypie/fabric\";\n\n// GSI names\nexport const INDEX_ALIAS = \"indexAlias\";\nexport const INDEX_CATEGORY = \"indexCategory\";\nexport const INDEX_SCOPE = \"indexScope\";\nexport const INDEX_TYPE = \"indexType\";\nexport const INDEX_XID = \"indexXid\";\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, SEPARATOR } from \"./constants.js\";\nimport type { ParentReference, StorableEntity } from \"./types.js\";\n\n// =============================================================================\n// Key Builders\n// =============================================================================\n\n/**\n * Build the indexScope key for hierarchical queries\n * @param scope - The scope (APEX or \"{parent.model}#{parent.id}\")\n * @param model - The entity model name\n * @returns Composite key: \"{scope}#{model}\"\n */\nexport function buildIndexScope(scope: string, model: string): string {\n return `${scope}${SEPARATOR}${model}`;\n}\n\n/**\n * Build the indexAlias key for human-friendly lookups\n * @param scope - The scope\n * @param model - The entity model name\n * @param alias - The human-friendly alias\n * @returns Composite key: \"{scope}#{model}#{alias}\"\n */\nexport function buildIndexAlias(\n scope: string,\n model: string,\n alias: string,\n): string {\n return `${scope}${SEPARATOR}${model}${SEPARATOR}${alias}`;\n}\n\n/**\n * Build the indexCategory key for category filtering\n * @param scope - The scope\n * @param model - The entity model name\n * @param category - The category classification\n * @returns Composite key: \"{scope}#{model}#{category}\"\n */\nexport function buildIndexCategory(\n scope: string,\n model: string,\n category: string,\n): string {\n return `${scope}${SEPARATOR}${model}${SEPARATOR}${category}`;\n}\n\n/**\n * Build the indexType key for type filtering\n * @param scope - The scope\n * @param model - The entity model name\n * @param type - The type classification\n * @returns Composite key: \"{scope}#{model}#{type}\"\n */\nexport function buildIndexType(\n scope: string,\n model: string,\n type: string,\n): string {\n return `${scope}${SEPARATOR}${model}${SEPARATOR}${type}`;\n}\n\n/**\n * Build the indexXid key for external ID lookups\n * @param scope - The scope\n * @param model - The entity model name\n * @param xid - The external ID\n * @returns Composite key: \"{scope}#{model}#{xid}\"\n */\nexport function buildIndexXid(\n scope: string,\n model: string,\n xid: string,\n): string {\n return `${scope}${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: 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\n *\n * Uses the model's registered indexes (from the fabric registry).\n *\n * - indexScope is always populated from scope + model\n * - indexAlias is populated only when alias is present\n * - indexCategory is populated only when category 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 IndexableModel\n return fabricPopulateIndexKeys(\n entity 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\n */\nexport const getEntity = fabricService({\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 fabricService) 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 fabricService) 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 = fabricService({\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 = fabricService({\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 = fabricService({\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\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 { fabricService } from \"@jaypie/fabric\";\n\nimport { getDocClient, getTableName } from \"./client.js\";\nimport {\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n INDEX_ALIAS,\n INDEX_CATEGORY,\n INDEX_SCOPE,\n INDEX_TYPE,\n INDEX_XID,\n} from \"./constants.js\";\nimport {\n buildIndexAlias,\n buildIndexCategory,\n buildIndexScope,\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 queryByScope\n */\ninterface QueryByScopeParams extends BaseQueryOptions {\n model: string;\n scope: string;\n}\n\n/**\n * Query entities by scope (parent hierarchy)\n * Uses indexScope GSI\n *\n * Note: This is a regular async function (not fabricService) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\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 suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexScope(scope, model) + suffix;\n return executeQuery<StorableEntity>(INDEX_SCOPE, 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 = 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: { type: String, description: \"Scope (@ for root)\" },\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;\n\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const keyValue = buildIndexAlias(scopeStr, 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 queryByCategory\n */\ninterface QueryByCategoryParams extends BaseQueryOptions {\n category: string;\n model: string;\n scope: string;\n}\n\n/**\n * Query entities by category classification\n * Uses indexCategory GSI\n *\n * Note: This is a regular async function (not fabricService) because it accepts\n * complex startKey objects that can't be coerced by vocabulary's type system.\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 suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexCategory(scope, model, category) + suffix;\n return executeQuery<StorableEntity>(INDEX_CATEGORY, 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 scope: 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 fabricService) 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 scope,\n startKey,\n type,\n}: QueryByTypeParams): Promise<QueryResult<StorableEntity>> {\n const suffix = calculateSuffix({ archived, deleted });\n const keyValue = buildIndexType(scope, 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 = 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: { type: String, description: \"Scope (@ for root)\" },\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;\n const xidStr = xid as string;\n\n const suffix = calculateSuffix({\n archived: archivedBool,\n deleted: deletedBool,\n });\n const keyValue = buildIndexXid(scopeStr, 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 fabricService,\n getAllRegisteredIndexes,\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 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 registered models\n */\nfunction collectAllIndexes(): IndexDefinition[] {\n const indexMap = new Map<string, IndexDefinition>();\n\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(skField as string, skField === \"sequence\" ? \"N\" : \"S\");\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(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 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 models 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 = 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 // 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 { 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","fabricPopulateIndexKeys","DEFAULT_TABLE_NAME"],"mappings":"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"}
@@ -20,21 +20,21 @@ export declare function queryByScope({ archived, ascending, deleted, limit, mode
20
20
  */
21
21
  export declare const queryByAlias: import("@jaypie/fabric").Service<Record<string, unknown>, StorableEntity | null, StorableEntity | null>;
22
22
  /**
23
- * Query parameters for queryByClass
23
+ * Query parameters for queryByCategory
24
24
  */
25
- interface QueryByClassParams extends BaseQueryOptions {
25
+ interface QueryByCategoryParams extends BaseQueryOptions {
26
+ category: string;
26
27
  model: string;
27
28
  scope: string;
28
- recordClass: string;
29
29
  }
30
30
  /**
31
31
  * Query entities by category classification
32
- * Uses indexClass GSI
32
+ * Uses indexCategory GSI
33
33
  *
34
34
  * Note: This is a regular async function (not fabricService) 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, scope, recordClass, startKey, }: QueryByClassParams): Promise<QueryResult<StorableEntity>>;
37
+ export declare function queryByCategory({ archived, ascending, category, deleted, limit, model, scope, startKey, }: QueryByCategoryParams): Promise<QueryResult<StorableEntity>>;
38
38
  /**
39
39
  * Query parameters for queryByType
40
40
  */
@@ -5,7 +5,7 @@
5
5
  * the filter fields provided. This simplifies query construction by
6
6
  * removing the need to know which specific GSI to use.
7
7
  */
8
- import { DEFAULT_INDEXES, getModelIndexes } from "@jaypie/fabric";
8
+ import { getModelIndexes } from "@jaypie/fabric";
9
9
  import type { QueryResult, StorableEntity } from "./types.js";
10
10
  /**
11
11
  * Query parameters for the unified query function
@@ -55,4 +55,4 @@ export interface QueryParams<T = StorableEntity> {
55
55
  * });
56
56
  */
57
57
  export declare function query<T extends StorableEntity = StorableEntity>(params: QueryParams<T>): Promise<QueryResult<T>>;
58
- export { DEFAULT_INDEXES, getModelIndexes };
58
+ export { getModelIndexes };
@@ -62,15 +62,15 @@ export interface QueryByAliasParams {
62
62
  scope: string;
63
63
  }
64
64
  /**
65
- * Parameters for queryByClass
65
+ * Parameters for queryByCategory
66
66
  */
67
- export interface QueryByClassParams extends BaseQueryOptions {
67
+ export interface QueryByCategoryParams extends BaseQueryOptions {
68
+ /** The category classification */
69
+ category: string;
68
70
  /** The entity model name */
69
71
  model: string;
70
72
  /** The scope */
71
73
  scope: string;
72
- /** The category classification */
73
- recordClass: string;
74
74
  }
75
75
  /**
76
76
  * Parameters for queryByType
@@ -127,7 +127,7 @@ export interface StorableEntity extends Omit<FabricModel, "archivedAt" | "create
127
127
  /** Timestamp for chronological ordering (Date.now()) */
128
128
  sequence: number;
129
129
  indexAlias?: string;
130
- indexClass?: string;
130
+ indexCategory?: string;
131
131
  indexScope?: string;
132
132
  indexType?: string;
133
133
  indexXid?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaypie/dynamodb",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/finlaysonstudio/jaypie.git"