@happyvertical/smrt-education 0.57.34 → 0.57.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/smrt-knowledge.json +3 -3
- package/package.json +10 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["links","node"],"sources":["../src/__smrt-register__.ts","../src/catalog-capability.ts","../src/catalog-policy.ts","../src/catalog-acquisition-service.ts","../src/catalog-models.ts","../src/catalog-collections.ts","../src/catalog-database-sync-store.ts","../src/catalog-materialization-service.ts","../src/catalog-read-service.ts","../src/catalog-sync-service.ts","../src/course-source.ts","../src/sources/illustrative-mathematics-parser.ts","../src/sources/oer-commons-rss-parser.ts","../src/hearth-catalog-providers.ts","../src/hearth-easy-peasy-grade4.ts","../src/recipes.ts","../src/sources/easy-peasy-parser.ts","../src/source-import-service.ts","../src/sources/google-drive-adapter.ts","../src/sources/public-illustrative-mathematics-parser.ts","../src/sources/public-illustrative-mathematics-adapter.ts"],"sourcesContent":["// Generated by @happyvertical/smrt-core smrtPlugin at library build time.\n// The package manifest is inlined so self-registration cannot miss when a\n// downstream bundler relocates this module away from dist/manifest.json\n// (https://github.com/happyvertical/smrt/issues/1506,\n// https://github.com/happyvertical/smrt/issues/1507).\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\nObjectRegistry.registerPackageManifest(JSON.parse(\"{\\\"version\\\":\\\"1.0.0\\\",\\\"timestamp\\\":0,\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"packageVersion\\\":\\\"0.57.34\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-education:CatalogProviderCollection\\\":{\\\"name\\\":\\\"catalogprovidercollection\\\",\\\"className\\\":\\\"CatalogProviderCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogProviderCollection\\\",\\\"collection\\\":\\\"catalogproviders\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogProvider\\\",\\\"exportName\\\":\\\"CatalogProviderCollection\\\",\\\"collectionExportName\\\":\\\"CatalogProviderCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_providers\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_providers\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_providers_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_providers_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"f35557a4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogResourceCollection\\\":{\\\"name\\\":\\\"catalogresourcecollection\\\",\\\"className\\\":\\\"CatalogResourceCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogResourceCollection\\\",\\\"collection\\\":\\\"catalogresources\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogResource\\\",\\\"exportName\\\":\\\"CatalogResourceCollection\\\",\\\"collectionExportName\\\":\\\"CatalogResourceCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_resources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_resources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"stable_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"canonical_url\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"supplied_description\\\\\\\" TEXT,\\\\n \\\\\\\"author\\\\\\\" TEXT,\\\\n \\\\\\\"subjects\\\\\\\" TEXT,\\\\n \\\\\\\"grades\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT,\\\\n \\\\\\\"resource_type\\\\\\\" TEXT,\\\\n \\\\\\\"parent_stable_id\\\\\\\" TEXT,\\\\n \\\\\\\"available_formats\\\\\\\" TEXT,\\\\n \\\\\\\"representation\\\\\\\" TEXT,\\\\n \\\\\\\"license_evidence\\\\\\\" TEXT,\\\\n \\\\\\\"license_state\\\\\\\" TEXT DEFAULT 'unknown',\\\\n \\\\\\\"visibility\\\\\\\" TEXT DEFAULT 'catalog',\\\\n \\\\\\\"last_seen_run_id\\\\\\\" TEXT,\\\\n \\\\\\\"withdrawn_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"canonical_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"supplied_description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"author\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subjects\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"grades\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"resource_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"parent_stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"available_formats\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"representation\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_evidence\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_state\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"unknown\\\"},\\\"visibility\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"catalog\\\"},\\\"last_seen_run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"withdrawn_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_resources_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_resources_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"e75f6bd0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSyncStateCollection\\\":{\\\"name\\\":\\\"catalogsyncstatecollection\\\",\\\"className\\\":\\\"CatalogSyncStateCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSyncStateCollection\\\",\\\"collection\\\":\\\"catalogsyncstates\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogSyncState\\\",\\\"exportName\\\":\\\"CatalogSyncStateCollection\\\",\\\"collectionExportName\\\":\\\"CatalogSyncStateCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_sync_states\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_sync_states\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"cursor\\\\\\\" TEXT,\\\\n \\\\\\\"run_id\\\\\\\" TEXT,\\\\n \\\\\\\"complete\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"paused\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"pause_reason\\\\\\\" TEXT,\\\\n \\\\\\\"imported_count\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"failures\\\\\\\" TEXT,\\\\n \\\\\\\"last_successful_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"cursor\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"complete\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"paused\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"pause_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"imported_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"failures\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"last_successful_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_sync_states_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_sync_states_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"52dc3ee1\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSelectionCollection\\\":{\\\"name\\\":\\\"catalogselectioncollection\\\",\\\"className\\\":\\\"CatalogSelectionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSelectionCollection\\\",\\\"collection\\\":\\\"catalogselections\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogSelection\\\",\\\"exportName\\\":\\\"CatalogSelectionCollection\\\",\\\"collectionExportName\\\":\\\"CatalogSelectionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_selections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_selections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selected_by_user_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"selected_revision\\\\\\\" TEXT NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selected_by_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"selected_revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_selections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_selections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_selections_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]}],\\\"version\\\":\\\"c6b02eb9\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogAcquisitionCollection\\\":{\\\"name\\\":\\\"catalogacquisitioncollection\\\",\\\"className\\\":\\\"CatalogAcquisitionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogAcquisitionCollection\\\",\\\"collection\\\":\\\"catalogacquisitions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogAcquisition\\\",\\\"exportName\\\":\\\"CatalogAcquisitionCollection\\\",\\\"collectionExportName\\\":\\\"CatalogAcquisitionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_acquisitions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_acquisitions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selection_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"format\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sha256\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"attribution\\\\\\\" TEXT,\\\\n \\\\\\\"notices\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selection_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_selections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"attribution\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"notices\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_acquisitions_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_acquisitions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_selection_id_idx\\\",\\\"columns\\\":[\\\"selection_id\\\"]}],\\\"version\\\":\\\"ee9c5add\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogProvider\\\":{\\\"name\\\":\\\"catalogprovider\\\",\\\"className\\\":\\\"CatalogProvider\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogProvider\\\",\\\"collection\\\":\\\"catalogproviders\\\",\\\"description\\\":\\\"Globally visible provider registration. Hosts configure adapters and credentials out of band.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"providerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":true}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogProvider\\\",\\\"collectionExportName\\\":\\\"CatalogProviderCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"providerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"name\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"active\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_providers\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_providers\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_providers_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_providers_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"f35557a4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogResource\\\":{\\\"name\\\":\\\"catalogresource\\\",\\\"className\\\":\\\"CatalogResource\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogResource\\\",\\\"collection\\\":\\\"catalogresources\\\",\\\"description\\\":\\\"A provider-native record. Rows are intentionally not merged across providers.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"providerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"stableId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"revision\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"canonicalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"suppliedDescription\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"author\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subjects\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"grades\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"language\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"resourceType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"parentStableId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"availableFormats\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"representation\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseEvidence\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseState\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"unknown\\\",\\\"enum\\\":[\\\"verified\\\",\\\"unknown\\\",\\\"conflicting\\\",\\\"restricted\\\"]},\\\"visibility\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"catalog\\\",\\\"enum\\\":[\\\"catalog\\\",\\\"teacher\\\"]},\\\"lastSeenRunId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"withdrawnAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getRepresentation\\\":{\\\"name\\\":\\\"getRepresentation\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"CatalogResourceRepresentation | undefined\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setRepresentation\\\":{\\\"name\\\":\\\"setRepresentation\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"CatalogResourceRepresentation | undefined\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"CatalogResourceRepresentation\\\"},{\\\"type\\\":\\\"undefined\\\"}]}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogResource\\\",\\\"collectionExportName\\\":\\\"CatalogResourceCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"providerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"stableId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"revision\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_resources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_resources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"stable_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"canonical_url\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"supplied_description\\\\\\\" TEXT,\\\\n \\\\\\\"author\\\\\\\" TEXT,\\\\n \\\\\\\"subjects\\\\\\\" TEXT,\\\\n \\\\\\\"grades\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT,\\\\n \\\\\\\"resource_type\\\\\\\" TEXT,\\\\n \\\\\\\"parent_stable_id\\\\\\\" TEXT,\\\\n \\\\\\\"available_formats\\\\\\\" TEXT,\\\\n \\\\\\\"representation\\\\\\\" TEXT,\\\\n \\\\\\\"license_evidence\\\\\\\" TEXT,\\\\n \\\\\\\"license_state\\\\\\\" TEXT DEFAULT 'unknown',\\\\n \\\\\\\"visibility\\\\\\\" TEXT DEFAULT 'catalog',\\\\n \\\\\\\"last_seen_run_id\\\\\\\" TEXT,\\\\n \\\\\\\"withdrawn_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"canonical_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"supplied_description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"author\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subjects\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"grades\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"resource_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"parent_stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"available_formats\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"representation\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_evidence\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_state\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"unknown\\\"},\\\"visibility\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"catalog\\\"},\\\"last_seen_run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"withdrawn_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_resources_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_resources_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"e75f6bd0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSyncState\\\":{\\\"name\\\":\\\"catalogsyncstate\\\",\\\"className\\\":\\\"CatalogSyncState\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSyncState\\\",\\\"collection\\\":\\\"catalogsyncstates\\\",\\\"description\\\":\\\"Durable per-provider enumeration state. A failed or partial feed is never complete.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"providerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"cursor\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"runId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"complete\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":false},\\\"paused\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":false},\\\"pauseReason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"importedCount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"failures\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"lastSuccessfulAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogSyncState\\\",\\\"collectionExportName\\\":\\\"CatalogSyncStateCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"providerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"complete\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"paused\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"importedCount\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_sync_states\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_sync_states\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"cursor\\\\\\\" TEXT,\\\\n \\\\\\\"run_id\\\\\\\" TEXT,\\\\n \\\\\\\"complete\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"paused\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"pause_reason\\\\\\\" TEXT,\\\\n \\\\\\\"imported_count\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"failures\\\\\\\" TEXT,\\\\n \\\\\\\"last_successful_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"cursor\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"complete\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"paused\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"pause_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"imported_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"failures\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"last_successful_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_sync_states_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_sync_states_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"52dc3ee1\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSelection\\\":{\\\"name\\\":\\\"catalogselection\\\",\\\"className\\\":\\\"CatalogSelection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSelection\\\",\\\"collection\\\":\\\"catalogselections\\\",\\\"description\\\":\\\"Tenant-owned intent to use a metadata record, distinct from acquiring bytes.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"resourceId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CatalogResource\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"selectedByUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"selectedRevision\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogSelection\\\",\\\"collectionExportName\\\":\\\"CatalogSelectionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"resourceId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"selectedByUserId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"selectedRevision\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_selections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_selections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selected_by_user_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"selected_revision\\\\\\\" TEXT NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selected_by_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"selected_revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_selections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_selections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_selections_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]}],\\\"version\\\":\\\"c6b02eb9\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogAcquisition\\\":{\\\"name\\\":\\\"catalogacquisition\\\",\\\"className\\\":\\\"CatalogAcquisition\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogAcquisition\\\",\\\"collection\\\":\\\"catalogacquisitions\\\",\\\"description\\\":\\\"A pinned, tenant-owned acquisition record. Bytes belong in a host storage service.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"resourceId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CatalogResource\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"selectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CatalogSelection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"revision\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"format\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"sha256\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"attribution\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"notices\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogAcquisition\\\",\\\"collectionExportName\\\":\\\"CatalogAcquisitionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"resourceId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"selectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"revision\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"format\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sha256\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_acquisitions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_acquisitions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selection_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"format\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sha256\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"attribution\\\\\\\" TEXT,\\\\n \\\\\\\"notices\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selection_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_selections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"attribution\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"notices\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_acquisitions_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_acquisitions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_selection_id_idx\\\",\\\"columns\\\":[\\\"selection_id\\\"]}],\\\"version\\\":\\\"ee9c5add\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Course\\\":{\\\"name\\\":\\\"course\\\",\\\"className\\\":\\\"Course\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Course\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"summary\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"license\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"own-work\\\",\\\"enum\\\":[\\\"own-work\\\",\\\"open-license\\\",\\\"personal-use-copy\\\",\\\"licensed-for-sharing\\\"]},\\\"licenseNote\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"attestedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"levelMin\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"levelMax\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Course\\\",\\\"collectionExportName\\\":\\\"CourseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"levelMin\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"levelMax\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCourse\\\":{\\\"name\\\":\\\"externalcourse\\\",\\\"className\\\":\\\"ExternalCourse\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCourse\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"summary\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"license\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"own-work\\\",\\\"enum\\\":[\\\"own-work\\\",\\\"open-license\\\",\\\"personal-use-copy\\\",\\\"licensed-for-sharing\\\"]},\\\"licenseNote\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"attestedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"levelMin\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"levelMax\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Course\\\",\\\"exportName\\\":\\\"ExternalCourse\\\",\\\"collectionExportName\\\":\\\"ExternalCourseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"levelMin\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"levelMax\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:AuthoredCourse\\\":{\\\"name\\\":\\\"authoredcourse\\\",\\\"className\\\":\\\"AuthoredCourse\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:AuthoredCourse\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"summary\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"license\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"own-work\\\",\\\"enum\\\":[\\\"own-work\\\",\\\"open-license\\\",\\\"personal-use-copy\\\",\\\"licensed-for-sharing\\\"]},\\\"licenseNote\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"attestedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"levelMin\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"levelMax\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Course\\\",\\\"exportName\\\":\\\"AuthoredCourse\\\",\\\"collectionExportName\\\":\\\"AuthoredCourseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"levelMin\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"levelMax\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSection\\\":{\\\"name\\\":\\\"coursesection\\\",\\\"className\\\":\\\"CourseSection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSection\\\",\\\"collection\\\":\\\"coursesections\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"courseId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Course\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CourseSection\\\",\\\"collectionExportName\\\":\\\"CourseSectionCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"courseId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"course_sections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"course_sections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"course_sections_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"e20480d7\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Lesson\\\":{\\\"name\\\":\\\"lesson\\\",\\\"className\\\":\\\"Lesson\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Lesson\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Lesson\\\",\\\"collectionExportName\\\":\\\"LessonCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"092df043\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Reading\\\":{\\\"name\\\":\\\"reading\\\",\\\"className\\\":\\\"Reading\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Reading\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Reading\\\",\\\"collectionExportName\\\":\\\"ReadingCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9d8b6fcd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Video\\\":{\\\"name\\\":\\\"video\\\",\\\"className\\\":\\\"Video\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Video\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"videoUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Video\\\",\\\"collectionExportName\\\":\\\"VideoCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9e0ef984\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Worksheet\\\":{\\\"name\\\":\\\"worksheet\\\",\\\"className\\\":\\\"Worksheet\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Worksheet\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"submit\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"printableUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"answerUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Worksheet\\\",\\\"collectionExportName\\\":\\\"WorksheetCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"pages\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"10976938\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Exercise\\\":{\\\"name\\\":\\\"exercise\\\",\\\"className\\\":\\\"Exercise\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Exercise\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Exercise\\\",\\\"collectionExportName\\\":\\\"ExerciseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"145eadbe\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseCollection\\\":{\\\"name\\\":\\\"coursecollection\\\",\\\"className\\\":\\\"CourseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseCollection\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Course\\\",\\\"exportName\\\":\\\"CourseCollection\\\",\\\"collectionExportName\\\":\\\"CourseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCourseCollection\\\":{\\\"name\\\":\\\"externalcoursecollection\\\",\\\"className\\\":\\\"ExternalCourseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCourseCollection\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ExternalCourse\\\",\\\"exportName\\\":\\\"ExternalCourseCollection\\\",\\\"collectionExportName\\\":\\\"ExternalCourseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:AuthoredCourseCollection\\\":{\\\"name\\\":\\\"authoredcoursecollection\\\",\\\"className\\\":\\\"AuthoredCourseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:AuthoredCourseCollection\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"AuthoredCourse\\\",\\\"exportName\\\":\\\"AuthoredCourseCollection\\\",\\\"collectionExportName\\\":\\\"AuthoredCourseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSectionCollection\\\":{\\\"name\\\":\\\"coursesectioncollection\\\",\\\"className\\\":\\\"CourseSectionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSectionCollection\\\",\\\"collection\\\":\\\"coursesections\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CourseSection\\\",\\\"exportName\\\":\\\"CourseSectionCollection\\\",\\\"collectionExportName\\\":\\\"CourseSectionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"course_sections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"course_sections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"course_sections_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"e20480d7\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonCollection\\\":{\\\"name\\\":\\\"lessoncollection\\\",\\\"className\\\":\\\"LessonCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"LessonCollection\\\",\\\"collectionExportName\\\":\\\"LessonCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"092df043\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ReadingCollection\\\":{\\\"name\\\":\\\"readingcollection\\\",\\\"className\\\":\\\"ReadingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ReadingCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Reading\\\",\\\"exportName\\\":\\\"ReadingCollection\\\",\\\"collectionExportName\\\":\\\"ReadingCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9d8b6fcd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:VideoCollection\\\":{\\\"name\\\":\\\"videocollection\\\",\\\"className\\\":\\\"VideoCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:VideoCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Video\\\",\\\"exportName\\\":\\\"VideoCollection\\\",\\\"collectionExportName\\\":\\\"VideoCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9e0ef984\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorksheetCollection\\\":{\\\"name\\\":\\\"worksheetcollection\\\",\\\"className\\\":\\\"WorksheetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorksheetCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Worksheet\\\",\\\"exportName\\\":\\\"WorksheetCollection\\\",\\\"collectionExportName\\\":\\\"WorksheetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"10976938\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExerciseCollection\\\":{\\\"name\\\":\\\"exercisecollection\\\",\\\"className\\\":\\\"ExerciseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExerciseCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Exercise\\\",\\\"exportName\\\":\\\"ExerciseCollection\\\",\\\"collectionExportName\\\":\\\"ExerciseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"145eadbe\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonAssetCollection\\\":{\\\"name\\\":\\\"lessonassetcollection\\\",\\\"className\\\":\\\"LessonAssetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonAssetCollection\\\",\\\"collection\\\":\\\"lessonassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"byRight\\\":{\\\"name\\\":\\\"byRight\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"byLeft\\\":{\\\"name\\\":\\\"byLeft\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"attach\\\":{\\\"name\\\":\\\"attach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"detach\\\":{\\\"name\\\":\\\"detach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setLinks\\\":{\\\"name\\\":\\\"setLinks\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightIds\\\",\\\"type\\\":\\\"string[]\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtJunction\\\",\\\"extendsTypeArg\\\":\\\"LessonAsset\\\",\\\"exportName\\\":\\\"LessonAssetCollection\\\",\\\"collectionExportName\\\":\\\"LessonAssetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'attachment',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"attachment\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_assets_tenant_id_lesson_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"lesson_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lesson_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_assets_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"lesson_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d96385c6\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LearnerCollection\\\":{\\\"name\\\":\\\"learnercollection\\\",\\\"className\\\":\\\"LearnerCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LearnerCollection\\\",\\\"collection\\\":\\\"learners\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Learner\\\",\\\"exportName\\\":\\\"LearnerCollection\\\",\\\"collectionExportName\\\":\\\"LearnerCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"learners\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"learners\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"user_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"profile_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"display_name\\\\\\\" TEXT,\\\\n \\\\\\\"birth_date\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"level\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"settings\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"user_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"display_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"birth_date\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"level\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"settings\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"learners_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"learners_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"learners_user_id_idx\\\",\\\"columns\\\":[\\\"user_id\\\"]},{\\\"name\\\":\\\"learners_profile_id_idx\\\",\\\"columns\\\":[\\\"profile_id\\\"]}],\\\"version\\\":\\\"ca9907b5\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CurriculumCollection\\\":{\\\"name\\\":\\\"curriculumcollection\\\",\\\"className\\\":\\\"CurriculumCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CurriculumCollection\\\",\\\"collection\\\":\\\"curriculums\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"curricula\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Curriculum\\\",\\\"exportName\\\":\\\"CurriculumCollection\\\",\\\"collectionExportName\\\":\\\"CurriculumCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"curricula\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"curricula\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"starts_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"ends_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"starts_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"ends_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"curricula_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"curricula_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"curricula_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"b7e90cbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:EnrollmentCollection\\\":{\\\"name\\\":\\\"enrollmentcollection\\\",\\\"className\\\":\\\"EnrollmentCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:EnrollmentCollection\\\",\\\"collection\\\":\\\"enrollments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Enrollment\\\",\\\"exportName\\\":\\\"EnrollmentCollection\\\",\\\"collectionExportName\\\":\\\"EnrollmentCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"enrollments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"enrollments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"curriculum_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"target_minutes_per_week\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"curriculum_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"curricula\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"target_minutes_per_week\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"enrollments_tenant_id_curriculum_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"curriculum_id\\\",\\\"course_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"enrollments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"enrollments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"enrollments_curriculum_id_idx\\\",\\\"columns\\\":[\\\"curriculum_id\\\"]},{\\\"name\\\":\\\"enrollments_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"enrollments_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"2a34b5ee\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonProgressCollection\\\":{\\\"name\\\":\\\"lessonprogresscollection\\\",\\\"className\\\":\\\"LessonProgressCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonProgressCollection\\\",\\\"collection\\\":\\\"lessonprogresses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lesson_progress\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"LessonProgress\\\",\\\"exportName\\\":\\\"LessonProgressCollection\\\",\\\"collectionExportName\\\":\\\"LessonProgressCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_progress\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_progress\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'not_started',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"time_spent_seconds\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"attempts\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"best_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"not_started\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"time_spent_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"attempts\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"best_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_progress_tenant_id_enrollment_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"enrollment_id\\\",\\\"lesson_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"lesson_progress_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_progress_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_progress_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"lesson_progress_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"lesson_progress_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"36704fbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionCollection\\\":{\\\"name\\\":\\\"submissioncollection\\\",\\\"className\\\":\\\"SubmissionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"SubmissionCollection\\\",\\\"collectionExportName\\\":\\\"SubmissionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"27a21ab4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionIntakeBindingCollection\\\":{\\\"name\\\":\\\"submissionintakebindingcollection\\\",\\\"className\\\":\\\"SubmissionIntakeBindingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionIntakeBindingCollection\\\",\\\"collection\\\":\\\"submissionintakebindings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SubmissionIntakeBinding\\\",\\\"exportName\\\":\\\"SubmissionIntakeBindingCollection\\\",\\\"collectionExportName\\\":\\\"SubmissionIntakeBindingCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_intake_bindings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_intake_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_item_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_intake_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]}],\\\"version\\\":\\\"7102c909\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ScannedSubmissionCollection\\\":{\\\"name\\\":\\\"scannedsubmissioncollection\\\",\\\"className\\\":\\\"ScannedSubmissionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ScannedSubmissionCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ScannedSubmission\\\",\\\"exportName\\\":\\\"ScannedSubmissionCollection\\\",\\\"collectionExportName\\\":\\\"ScannedSubmissionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"7c394510\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCompletionCollection\\\":{\\\"name\\\":\\\"externalcompletioncollection\\\",\\\"className\\\":\\\"ExternalCompletionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCompletionCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ExternalCompletion\\\",\\\"exportName\\\":\\\"ExternalCompletionCollection\\\",\\\"collectionExportName\\\":\\\"ExternalCompletionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"eff3715d\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:AttestationCollection\\\":{\\\"name\\\":\\\"attestationcollection\\\",\\\"className\\\":\\\"AttestationCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:AttestationCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Attestation\\\",\\\"exportName\\\":\\\"AttestationCollection\\\",\\\"collectionExportName\\\":\\\"AttestationCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"4f3230a3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:GradeCollection\\\":{\\\"name\\\":\\\"gradecollection\\\",\\\"className\\\":\\\"GradeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:GradeCollection\\\",\\\"collection\\\":\\\"grades\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Grade\\\",\\\"exportName\\\":\\\"GradeCollection\\\",\\\"collectionExportName\\\":\\\"GradeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"grades\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"grades\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"grader_kind\\\\\\\" TEXT NOT NULL DEFAULT 'auto',\\\\n \\\\\\\"grader_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"score\\\\\\\" REAL,\\\\n \\\\\\\"points_earned\\\\\\\" INTEGER,\\\\n \\\\\\\"points_possible\\\\\\\" INTEGER,\\\\n \\\\\\\"rubric_results\\\\\\\" TEXT,\\\\n \\\\\\\"feedback\\\\\\\" TEXT,\\\\n \\\\\\\"graded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"grader_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"auto\\\"},\\\"grader_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_earned\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_possible\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"rubric_results\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"feedback\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"graded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"grades_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"grades_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"grades_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"grades_grader_profile_id_idx\\\",\\\"columns\\\":[\\\"grader_profile_id\\\"]}],\\\"version\\\":\\\"7d629fec\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionAssetCollection\\\":{\\\"name\\\":\\\"submissionassetcollection\\\",\\\"className\\\":\\\"SubmissionAssetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionAssetCollection\\\",\\\"collection\\\":\\\"submissionassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"byRight\\\":{\\\"name\\\":\\\"byRight\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"byLeft\\\":{\\\"name\\\":\\\"byLeft\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"attach\\\":{\\\"name\\\":\\\"attach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"detach\\\":{\\\"name\\\":\\\"detach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setLinks\\\":{\\\"name\\\":\\\"setLinks\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightIds\\\",\\\"type\\\":\\\"string[]\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtJunction\\\",\\\"extendsTypeArg\\\":\\\"SubmissionAsset\\\",\\\"exportName\\\":\\\"SubmissionAssetCollection\\\",\\\"collectionExportName\\\":\\\"SubmissionAssetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'page',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"page\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_assets_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_assets_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"submission_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d9b61c8a\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSource\\\":{\\\"name\\\":\\\"coursesource\\\",\\\"className\\\":\\\"CourseSource\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSource\\\",\\\"collection\\\":\\\"coursesources\\\",\\\"description\\\":\\\"Host-managed source policy; deliberately has no generated CRUD surface.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/course-source.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"key\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"adapter\\\",\\\"enum\\\":[\\\"manual\\\",\\\"url\\\",\\\"adapter\\\"]},\\\"adapterKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"config\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sharing\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"private\\\",\\\"enum\\\":[\\\"private\\\",\\\"group\\\",\\\"global\\\"]}},\\\"methods\\\":{\\\"getConfig\\\":{\\\"name\\\":\\\"getConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"CourseSourceConfig\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setConfig\\\":{\\\"name\\\":\\\"setConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"CourseSourceConfig\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"cli\\\":false,\\\"mcp\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CourseSource\\\",\\\"collectionExportName\\\":\\\"CourseSourceCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"key\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"name\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"course_sources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"key\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'adapter',\\\\n \\\\\\\"adapter_key\\\\\\\" TEXT,\\\\n \\\\\\\"config\\\\\\\" TEXT,\\\\n \\\\\\\"sharing\\\\\\\" TEXT DEFAULT 'private'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"adapter\\\"},\\\"adapter_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sharing\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"private\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sources_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"course_sources_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"98177eb3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSourceCollection\\\":{\\\"name\\\":\\\"coursesourcecollection\\\",\\\"className\\\":\\\"CourseSourceCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSourceCollection\\\",\\\"collection\\\":\\\"coursesources\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/course-source.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CourseSource\\\",\\\"exportName\\\":\\\"CourseSourceCollection\\\",\\\"collectionExportName\\\":\\\"CourseSourceCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"course_sources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"key\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'adapter',\\\\n \\\\\\\"adapter_key\\\\\\\" TEXT,\\\\n \\\\\\\"config\\\\\\\" TEXT,\\\\n \\\\\\\"sharing\\\\\\\" TEXT DEFAULT 'private'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"adapter\\\"},\\\"adapter_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sharing\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"private\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sources_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"course_sources_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"98177eb3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Learner\\\":{\\\"name\\\":\\\"learner\\\",\\\"className\\\":\\\"Learner\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Learner\\\",\\\"collection\\\":\\\"learners\\\",\\\"description\\\":\\\"A learner is a real user/profile identity with active family membership.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"userId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-users:User\\\"},\\\"profileId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-profiles:Profile\\\"},\\\"displayName\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"birthDate\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"level\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"settings\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getSettings\\\":{\\\"name\\\":\\\"getSettings\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setSettings\\\":{\\\"name\\\":\\\"setSettings\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Learner\\\",\\\"collectionExportName\\\":\\\"LearnerCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"userId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"profileId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"level\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"learners\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"learners\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"user_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"profile_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"display_name\\\\\\\" TEXT,\\\\n \\\\\\\"birth_date\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"level\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"settings\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"user_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"display_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"birth_date\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"level\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"settings\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"learners_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"learners_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"learners_user_id_idx\\\",\\\"columns\\\":[\\\"user_id\\\"]},{\\\"name\\\":\\\"learners_profile_id_idx\\\",\\\"columns\\\":[\\\"profile_id\\\"]}],\\\"version\\\":\\\"ca9907b5\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Curriculum\\\":{\\\"name\\\":\\\"curriculum\\\",\\\"className\\\":\\\"Curriculum\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Curriculum\\\",\\\"collection\\\":\\\"curriculums\\\",\\\"description\\\":\\\"A distinct plan retains its own enrollment history.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"startsOn\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"endsOn\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"planned\\\",\\\"enum\\\":[\\\"planned\\\",\\\"active\\\",\\\"completed\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableName\\\":\\\"curricula\\\",\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Curriculum\\\",\\\"collectionExportName\\\":\\\"CurriculumCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"curricula\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"curricula\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"starts_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"ends_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"starts_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"ends_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"curricula_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"curricula_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"curricula_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"b7e90cbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Enrollment\\\":{\\\"name\\\":\\\"enrollment\\\",\\\"className\\\":\\\"Enrollment\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Enrollment\\\",\\\"collection\\\":\\\"enrollments\\\",\\\"description\\\":\\\"One course in one curriculum; a new curriculum means a new enrollment.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"curriculumId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Curriculum\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"courseId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Course\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"planned\\\",\\\"enum\\\":[\\\"planned\\\",\\\"active\\\",\\\"paused\\\",\\\"completed\\\",\\\"dropped\\\"]},\\\"startedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"completedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"targetMinutesPerWeek\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"curriculum_id\\\",\\\"course_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Enrollment\\\",\\\"collectionExportName\\\":\\\"EnrollmentCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"curriculumId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"courseId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"targetMinutesPerWeek\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"enrollments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"enrollments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"curriculum_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"target_minutes_per_week\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"curriculum_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"curricula\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"target_minutes_per_week\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"enrollments_tenant_id_curriculum_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"curriculum_id\\\",\\\"course_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"enrollments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"enrollments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"enrollments_curriculum_id_idx\\\",\\\"columns\\\":[\\\"curriculum_id\\\"]},{\\\"name\\\":\\\"enrollments_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"enrollments_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"2a34b5ee\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonProgress\\\":{\\\"name\\\":\\\"lessonprogress\\\",\\\"className\\\":\\\"LessonProgress\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonProgress\\\",\\\"collection\\\":\\\"lessonprogresses\\\",\\\"description\\\":\\\"Progress identity is enrollment + lesson, never learner + lesson.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"enrollmentId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Enrollment\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"not_started\\\",\\\"enum\\\":[\\\"not_started\\\",\\\"in_progress\\\",\\\"submitted\\\",\\\"needs_review\\\",\\\"complete\\\",\\\"skipped\\\"]},\\\"startedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"completedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"timeSpentSeconds\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"attempts\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"bestScore\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableName\\\":\\\"lesson_progress\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"enrollment_id\\\",\\\"lesson_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"LessonProgress\\\",\\\"collectionExportName\\\":\\\"LessonProgressCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"enrollmentId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"timeSpentSeconds\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"attempts\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_progress\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_progress\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'not_started',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"time_spent_seconds\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"attempts\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"best_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"not_started\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"time_spent_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"attempts\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"best_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_progress_tenant_id_enrollment_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"enrollment_id\\\",\\\"lesson_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"lesson_progress_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_progress_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_progress_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"lesson_progress_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"lesson_progress_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"36704fbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonAsset\\\":{\\\"name\\\":\\\"lessonasset\\\",\\\"className\\\":\\\"LessonAsset\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonAsset\\\",\\\"collection\\\":\\\"lessonassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/lesson-assets.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"relationship\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"attachment\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"printable\\\",\\\"answer-key\\\",\\\"video\\\",\\\"attachment\\\"]},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"lesson_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"LessonAsset\\\",\\\"collectionExportName\\\":\\\"LessonAssetCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"assetId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"relationship\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'attachment',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"attachment\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_assets_tenant_id_lesson_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"lesson_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lesson_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_assets_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"lesson_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d96385c6\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Submission\\\":{\\\"name\\\":\\\"submission\\\",\\\"className\\\":\\\"Submission\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Submission\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"Evidence that a learner completed one progress item.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Submission\\\",\\\"collectionExportName\\\":\\\"SubmissionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"27a21ab4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionIntakeBinding\\\":{\\\"name\\\":\\\"submissionintakebinding\\\",\\\"className\\\":\\\"SubmissionIntakeBinding\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionIntakeBinding\\\",\\\"collection\\\":\\\"submissionintakebindings\\\",\\\"description\\\":\\\"Durable tenant/item claim for trusted ingestion receipts. This separate table keeps ordinary uploads (which have no intake item) out of the uniqueness key.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"intake_item_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SubmissionIntakeBinding\\\",\\\"collectionExportName\\\":\\\"SubmissionIntakeBindingCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"intakeItemId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_intake_bindings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_intake_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_item_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_intake_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]}],\\\"version\\\":\\\"7102c909\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ScannedSubmission\\\":{\\\"name\\\":\\\"scannedsubmission\\\",\\\"className\\\":\\\"ScannedSubmission\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ScannedSubmission\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"Photos or scans of work submitted for review.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"pageCount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"ocrText\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getExtracted\\\":{\\\"name\\\":\\\"getExtracted\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setExtracted\\\":{\\\"name\\\":\\\"setExtracted\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"ScannedSubmission\\\",\\\"collectionExportName\\\":\\\"ScannedSubmissionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"pageCount\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"7c394510\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCompletion\\\":{\\\"name\\\":\\\"externalcompletion\\\",\\\"className\\\":\\\"ExternalCompletion\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCompletion\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"Completion reported by the learner, guardian, or external source.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"reportedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"learner\\\",\\\"enum\\\":[\\\"learner\\\",\\\"guardian\\\",\\\"source\\\"]},\\\"evidenceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reportedScore\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"ExternalCompletion\\\",\\\"collectionExportName\\\":\\\"ExternalCompletionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"eff3715d\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Attestation\\\":{\\\"name\\\":\\\"attestation\\\",\\\"className\\\":\\\"Attestation\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Attestation\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"A guardian's statement that work was completed.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"Attestation\\\",\\\"collectionExportName\\\":\\\"AttestationCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"4f3230a3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionAsset\\\":{\\\"name\\\":\\\"submissionasset\\\",\\\"className\\\":\\\"SubmissionAsset\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionAsset\\\",\\\"collection\\\":\\\"submissionassets\\\",\\\"description\\\":\\\"The tenant-owned files attached to a submission.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"relationship\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"page\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"page\\\",\\\"attachment\\\"]},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SubmissionAsset\\\",\\\"collectionExportName\\\":\\\"SubmissionAssetCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"assetId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"relationship\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'page',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"page\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_assets_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_assets_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"submission_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d9b61c8a\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Grade\\\":{\\\"name\\\":\\\"grade\\\",\\\"className\\\":\\\"Grade\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Grade\\\",\\\"collection\\\":\\\"grades\\\",\\\"description\\\":\\\"An assessment of a submission; the service selects the authoritative grade.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"graderKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"auto\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"auto\\\",\\\"ai\\\",\\\"guardian\\\",\\\"instructor\\\"]},\\\"graderProfileId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-profiles:Profile\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"score\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"pointsEarned\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"pointsPossible\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"rubricResults\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"feedback\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"gradedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getRubricResults\\\":{\\\"name\\\":\\\"getRubricResults\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setRubricResults\\\":{\\\"name\\\":\\\"setRubricResults\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Grade\\\",\\\"collectionExportName\\\":\\\"GradeCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"graderKind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"grades\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"grades\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"grader_kind\\\\\\\" TEXT NOT NULL DEFAULT 'auto',\\\\n \\\\\\\"grader_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"score\\\\\\\" REAL,\\\\n \\\\\\\"points_earned\\\\\\\" INTEGER,\\\\n \\\\\\\"points_possible\\\\\\\" INTEGER,\\\\n \\\\\\\"rubric_results\\\\\\\" TEXT,\\\\n \\\\\\\"feedback\\\\\\\" TEXT,\\\\n \\\\\\\"graded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"grader_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"auto\\\"},\\\"grader_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_earned\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_possible\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"rubric_results\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"feedback\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"graded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"grades_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"grades_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"grades_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"grades_grader_profile_id_idx\\\",\\\"columns\\\":[\\\"grader_profile_id\\\"]}],\\\"version\\\":\\\"7d629fec\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Workbook\\\":{\\\"name\\\":\\\"workbook\\\",\\\"className\\\":\\\"Workbook\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Workbook\\\",\\\"collection\\\":\\\"workbooks\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"edition\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reviewRequired\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":true},\\\"policyVersion\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":1}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"learner_id\\\",\\\"workbook_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Workbook\\\",\\\"collectionExportName\\\":\\\"WorkbookCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"reviewRequired\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"policyVersion\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbooks\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_key\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"edition\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"edition\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbooks_tenant_id_learner_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"learner_id\\\",\\\"workbook_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbooks_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbooks_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbooks_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"a5b56a39\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookCollection\\\":{\\\"name\\\":\\\"workbookcollection\\\",\\\"className\\\":\\\"WorkbookCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookCollection\\\",\\\"collection\\\":\\\"workbooks\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Workbook\\\",\\\"exportName\\\":\\\"WorkbookCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbooks\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_key\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"edition\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"edition\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbooks_tenant_id_learner_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"learner_id\\\",\\\"workbook_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbooks_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbooks_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbooks_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"a5b56a39\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookActivity\\\":{\\\"name\\\":\\\"workbookactivity\\\",\\\"className\\\":\\\"WorkbookActivity\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookActivity\\\",\\\"collection\\\":\\\"workbookactivities\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Workbook\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"captureKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"identified\\\",\\\"_meta\\\":{\\\"required\\\":true,\\\"default\\\":\\\"identified\\\"}},\\\"photoIntakeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookPhotoIntake\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"enrollmentId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Enrollment\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"pageKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"pageLabel\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"workbook_id\\\",\\\"page_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookActivity\\\",\\\"collectionExportName\\\":\\\"WorkbookActivityCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"captureKind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"enrollmentId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_activities\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID,\\\\n \\\\\\\"capture_kind\\\\\\\" TEXT NOT NULL DEFAULT 'identified',\\\\n \\\\\\\"photo_intake_id\\\\\\\" UUID,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"page_key\\\\\\\" TEXT,\\\\n \\\\\\\"page_label\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"capture_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"identified\\\"},\\\"photo_intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"page_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"page_label\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_activities_tenant_id_workbook_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"workbook_id\\\",\\\"page_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_activities_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_activities_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_activities_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_activities_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_activities_photo_intake_id_idx\\\",\\\"columns\\\":[\\\"photo_intake_id\\\"]},{\\\"name\\\":\\\"workbook_activities_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"workbook_activities_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"320c8eb0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookActivityCollection\\\":{\\\"name\\\":\\\"workbookactivitycollection\\\",\\\"className\\\":\\\"WorkbookActivityCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookActivityCollection\\\",\\\"collection\\\":\\\"workbookactivities\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookActivity\\\",\\\"exportName\\\":\\\"WorkbookActivityCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookActivityCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_activities\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID,\\\\n \\\\\\\"capture_kind\\\\\\\" TEXT NOT NULL DEFAULT 'identified',\\\\n \\\\\\\"photo_intake_id\\\\\\\" UUID,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"page_key\\\\\\\" TEXT,\\\\n \\\\\\\"page_label\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"capture_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"identified\\\"},\\\"photo_intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"page_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"page_label\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_activities_tenant_id_workbook_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"workbook_id\\\",\\\"page_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_activities_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_activities_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_activities_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_activities_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_activities_photo_intake_id_idx\\\",\\\"columns\\\":[\\\"photo_intake_id\\\"]},{\\\"name\\\":\\\"workbook_activities_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"workbook_activities_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"320c8eb0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookWorkFiling\\\":{\\\"name\\\":\\\"workbookworkfiling\\\",\\\"className\\\":\\\"WorkbookWorkFiling\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookWorkFiling\\\",\\\"collection\\\":\\\"workbookworkfilings\\\",\\\"description\\\":\\\"Append-only association; the source work unit and its routing never move.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"sourceActivityId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookActivity\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Workbook\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"canonicalActivityId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookActivity\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"previousRevisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookWorkFiling\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"digest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"source_activity_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookWorkFiling\\\",\\\"collectionExportName\\\":\\\"WorkbookWorkFilingCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"sourceActivityId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"workbookId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_work_filings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"source_activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"canonical_activity_id\\\\\\\" UUID,\\\\n \\\\\\\"previous_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"reason\\\\\\\" TEXT,\\\\n \\\\\\\"digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"source_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"canonical_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_work_filings\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_work_filings_tenant_id_source_activity_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"source_activity_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_work_filings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_work_filings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_work_filings_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_source_activity_id_idx\\\",\\\"columns\\\":[\\\"source_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_canonical_activity_id_idx\\\",\\\"columns\\\":[\\\"canonical_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_previous_revision_id_idx\\\",\\\"columns\\\":[\\\"previous_revision_id\\\"]}],\\\"version\\\":\\\"03e989a0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookWorkFilingCollection\\\":{\\\"name\\\":\\\"workbookworkfilingcollection\\\",\\\"className\\\":\\\"WorkbookWorkFilingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookWorkFilingCollection\\\",\\\"collection\\\":\\\"workbookworkfilings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookWorkFiling\\\",\\\"exportName\\\":\\\"WorkbookWorkFilingCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookWorkFilingCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_work_filings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"source_activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"canonical_activity_id\\\\\\\" UUID,\\\\n \\\\\\\"previous_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"reason\\\\\\\" TEXT,\\\\n \\\\\\\"digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"source_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"canonical_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_work_filings\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_work_filings_tenant_id_source_activity_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"source_activity_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_work_filings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_work_filings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_work_filings_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_source_activity_id_idx\\\",\\\"columns\\\":[\\\"source_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_canonical_activity_id_idx\\\",\\\"columns\\\":[\\\"canonical_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_previous_revision_id_idx\\\",\\\"columns\\\":[\\\"previous_revision_id\\\"]}],\\\"version\\\":\\\"03e989a0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAttempt\\\":{\\\"name\\\":\\\"workbookattempt\\\",\\\"className\\\":\\\"WorkbookAttempt\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAttempt\\\",\\\"collection\\\":\\\"workbookattempts\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"activityId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookActivity\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"previousAttemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"capturedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"episodeId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reviewRequired\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":true},\\\"policyVersion\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":1},\\\"assistance\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceHashes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookAttempt\\\",\\\"collectionExportName\\\":\\\"WorkbookAttemptCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"activityId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"reviewRequired\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"policyVersion\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_attempts\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"previous_attempt_id\\\\\\\" UUID,\\\\n \\\\\\\"captured_at\\\\\\\" TEXT,\\\\n \\\\\\\"episode_id\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1,\\\\n \\\\\\\"assistance\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_hashes\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"captured_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"episode_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1},\\\"assistance\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_hashes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_attempts_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_attempts_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_attempts_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_attempts_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_activity_id_idx\\\",\\\"columns\\\":[\\\"activity_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_previous_attempt_id_idx\\\",\\\"columns\\\":[\\\"previous_attempt_id\\\"]}],\\\"version\\\":\\\"bd9cdd9f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAttemptCollection\\\":{\\\"name\\\":\\\"workbookattemptcollection\\\",\\\"className\\\":\\\"WorkbookAttemptCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAttemptCollection\\\",\\\"collection\\\":\\\"workbookattempts\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookAttempt\\\",\\\"exportName\\\":\\\"WorkbookAttemptCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookAttemptCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_attempts\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"previous_attempt_id\\\\\\\" UUID,\\\\n \\\\\\\"captured_at\\\\\\\" TEXT,\\\\n \\\\\\\"episode_id\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1,\\\\n \\\\\\\"assistance\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_hashes\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"captured_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"episode_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1},\\\"assistance\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_hashes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_attempts_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_attempts_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_attempts_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_attempts_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_activity_id_idx\\\",\\\"columns\\\":[\\\"activity_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_previous_attempt_id_idx\\\",\\\"columns\\\":[\\\"previous_attempt_id\\\"]}],\\\"version\\\":\\\"bd9cdd9f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAssessmentRevision\\\":{\\\"name\\\":\\\"workbookassessmentrevision\\\",\\\"className\\\":\\\"WorkbookAssessmentRevision\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAssessmentRevision\\\",\\\"collection\\\":\\\"workbookassessmentrevisions\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"attemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"requestDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRevisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"decisionReason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"supersedesId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"assessmentJson\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}},\\\"recordedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookAssessmentRevision\\\",\\\"collectionExportName\\\":\\\"WorkbookAssessmentRevisionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"attemptId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_assessment_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"request_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"decision_reason\\\\\\\" TEXT,\\\\n \\\\\\\"supersedes_id\\\\\\\" UUID,\\\\n \\\\\\\"assessment_json\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"supersedes_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"assessment_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_assessment_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_source_revision_id_idx\\\",\\\"columns\\\":[\\\"source_revision_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_supersedes_id_idx\\\",\\\"columns\\\":[\\\"supersedes_id\\\"]}],\\\"version\\\":\\\"94b2bd33\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAssessmentRevisionCollection\\\":{\\\"name\\\":\\\"workbookassessmentrevisioncollection\\\",\\\"className\\\":\\\"WorkbookAssessmentRevisionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAssessmentRevisionCollection\\\",\\\"collection\\\":\\\"workbookassessmentrevisions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookAssessmentRevision\\\",\\\"exportName\\\":\\\"WorkbookAssessmentRevisionCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookAssessmentRevisionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_assessment_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"request_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"decision_reason\\\\\\\" TEXT,\\\\n \\\\\\\"supersedes_id\\\\\\\" UUID,\\\\n \\\\\\\"assessment_json\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"supersedes_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"assessment_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_assessment_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_source_revision_id_idx\\\",\\\"columns\\\":[\\\"source_revision_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_supersedes_id_idx\\\",\\\"columns\\\":[\\\"supersedes_id\\\"]}],\\\"version\\\":\\\"94b2bd33\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackRelease\\\":{\\\"name\\\":\\\"workbookfeedbackrelease\\\",\\\"className\\\":\\\"WorkbookFeedbackRelease\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackRelease\\\",\\\"collection\\\":\\\"workbookfeedbackreleases\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"attemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"revisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"expectedHeadId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"recordedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookFeedbackRelease\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackReleaseCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"attemptId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"revisionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_releases\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"expected_head_id\\\\\\\" UUID,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"expected_head_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_releases_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_expected_head_id_idx\\\",\\\"columns\\\":[\\\"expected_head_id\\\"]}],\\\"version\\\":\\\"ebe23baf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackReleaseCollection\\\":{\\\"name\\\":\\\"workbookfeedbackreleasecollection\\\",\\\"className\\\":\\\"WorkbookFeedbackReleaseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackReleaseCollection\\\",\\\"collection\\\":\\\"workbookfeedbackreleases\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookFeedbackRelease\\\",\\\"exportName\\\":\\\"WorkbookFeedbackReleaseCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackReleaseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_releases\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"expected_head_id\\\\\\\" UUID,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"expected_head_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_releases_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_expected_head_id_idx\\\",\\\"columns\\\":[\\\"expected_head_id\\\"]}],\\\"version\\\":\\\"ebe23baf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackDelivery\\\":{\\\"name\\\":\\\"workbookfeedbackdelivery\\\",\\\"className\\\":\\\"WorkbookFeedbackDelivery\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackDelivery\\\",\\\"collection\\\":\\\"workbookfeedbackdeliveries\\\",\\\"description\\\":\\\"Authenticated delivery acknowledgment; this does not assert comprehension.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"attemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"revisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"recordedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"actor_user_id\\\",\\\"revision_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookFeedbackDelivery\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackDeliveryCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"attemptId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"revisionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_deliveries\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"actor_user_id\\\",\\\"revision_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_deliveries_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]}],\\\"version\\\":\\\"37bfd434\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackDeliveryCollection\\\":{\\\"name\\\":\\\"workbookfeedbackdeliverycollection\\\",\\\"className\\\":\\\"WorkbookFeedbackDeliveryCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackDeliveryCollection\\\",\\\"collection\\\":\\\"workbookfeedbackdeliveries\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookFeedbackDelivery\\\",\\\"exportName\\\":\\\"WorkbookFeedbackDeliveryCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackDeliveryCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_deliveries\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"actor_user_id\\\",\\\"revision_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_deliveries_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]}],\\\"version\\\":\\\"37bfd434\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoIntake\\\":{\\\"name\\\":\\\"workbookphotointake\\\",\\\"className\\\":\\\"WorkbookPhotoIntake\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoIntake\\\",\\\"collection\\\":\\\"workbookphotointakes\\\",\\\"description\\\":\\\"Durable receipt before any course, enrollment or activity exists.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"itemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"contentDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"item_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookPhotoIntake\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoIntakeCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_intakes\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"item_id\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"content_digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"content_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"item_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_intakes_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"fafc1daf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoIntakeCollection\\\":{\\\"name\\\":\\\"workbookphotointakecollection\\\",\\\"className\\\":\\\"WorkbookPhotoIntakeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoIntakeCollection\\\",\\\"collection\\\":\\\"workbookphotointakes\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookPhotoIntake\\\",\\\"exportName\\\":\\\"WorkbookPhotoIntakeCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoIntakeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_intakes\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"item_id\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"content_digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"content_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"item_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_intakes_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"fafc1daf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoAsset\\\":{\\\"name\\\":\\\"workbookphotoasset\\\",\\\"className\\\":\\\"WorkbookPhotoAsset\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoAsset\\\",\\\"collection\\\":\\\"workbookphotoassets\\\",\\\"description\\\":\\\"Sole owner join for original photo intake files.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"intakeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookPhotoIntake\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"mimeType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"position\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"asset_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookPhotoAsset\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoAssetCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"intakeId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"position\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID,\\\\n \\\\\\\"name\\\\\\\" TEXT,\\\\n \\\\\\\"mime_type\\\\\\\" TEXT,\\\\n \\\\\\\"sha256\\\\\\\" TEXT,\\\\n \\\\\\\"position\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"mime_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"position\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"asset_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"9d49acb2\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoAssetCollection\\\":{\\\"name\\\":\\\"workbookphotoassetcollection\\\",\\\"className\\\":\\\"WorkbookPhotoAssetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoAssetCollection\\\",\\\"collection\\\":\\\"workbookphotoassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookPhotoAsset\\\",\\\"exportName\\\":\\\"WorkbookPhotoAssetCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoAssetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID,\\\\n \\\\\\\"name\\\\\\\" TEXT,\\\\n \\\\\\\"mime_type\\\\\\\" TEXT,\\\\n \\\\\\\"sha256\\\\\\\" TEXT,\\\\n \\\\\\\"position\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"mime_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"position\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"asset_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"9d49acb2\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoDecision\\\":{\\\"name\\\":\\\"workbookphotodecision\\\",\\\"className\\\":\\\"WorkbookPhotoDecision\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoDecision\\\",\\\"collection\\\":\\\"workbookphotodecisions\\\",\\\"description\\\":\\\"Immutable provider/guardian/capture decision, retaining provenance and retry key.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"intakeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookPhotoIntake\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sequence\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"bodyJson\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookPhotoDecision\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoDecisionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"intakeId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"sequence\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_decisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"sequence\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"body_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sequence\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"body_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_decisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]}],\\\"version\\\":\\\"4c8b4e5f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoDecisionCollection\\\":{\\\"name\\\":\\\"workbookphotodecisioncollection\\\",\\\"className\\\":\\\"WorkbookPhotoDecisionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoDecisionCollection\\\",\\\"collection\\\":\\\"workbookphotodecisions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookPhotoDecision\\\",\\\"exportName\\\":\\\"WorkbookPhotoDecisionCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoDecisionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_decisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"sequence\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"body_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sequence\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"body_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_decisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]}],\\\"version\\\":\\\"4c8b4e5f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookContextRevision\\\":{\\\"name\\\":\\\"workbookcontextrevision\\\",\\\"className\\\":\\\"WorkbookContextRevision\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookContextRevision\\\",\\\"collection\\\":\\\"workbookcontextrevisions\\\",\\\"description\\\":\\\"Versioned contextual metadata; never edits Workbook identity or learning evidence.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Workbook\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"decisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookPhotoDecision\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"metadataJson\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"decision_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookContextRevision\\\",\\\"collectionExportName\\\":\\\"WorkbookContextRevisionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"workbookId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"decisionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_context_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"decision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"metadata_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_decisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"metadata_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_decision_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"decision_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_context_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_decision_id_idx\\\",\\\"columns\\\":[\\\"decision_id\\\"]}],\\\"version\\\":\\\"b1e8b4dc\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookContextRevisionCollection\\\":{\\\"name\\\":\\\"workbookcontextrevisioncollection\\\",\\\"className\\\":\\\"WorkbookContextRevisionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookContextRevisionCollection\\\",\\\"collection\\\":\\\"workbookcontextrevisions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookContextRevision\\\",\\\"exportName\\\":\\\"WorkbookContextRevisionCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookContextRevisionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_context_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"decision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"metadata_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_decisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"metadata_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_decision_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"decision_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_context_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_decision_id_idx\\\",\\\"columns\\\":[\\\"decision_id\\\"]}],\\\"version\\\":\\\"b1e8b4dc\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"recipes\\\":[{\\\"id\\\":\\\"education.catalog\\\",\\\"className\\\":\\\"EducationCatalogRecipe\\\",\\\"label\\\":\\\"Course catalog\\\",\\\"summary\\\":\\\"Organize courses, sections, lessons, and their authorized learning materials.\\\",\\\"synonyms\\\":[\\\"courses\\\",\\\"lessons\\\",\\\"curriculum catalog\\\"],\\\"models\\\":[\\\"@happyvertical/smrt-education:Course\\\",\\\"@happyvertical/smrt-education:CourseSection\\\",\\\"@happyvertical/smrt-education:Lesson\\\",\\\"@happyvertical/smrt-education:LessonAsset\\\"],\\\"nav\\\":[{\\\"label\\\":\\\"Courses\\\",\\\"model\\\":\\\"@happyvertical/smrt-education:Course\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"Courses available to this family.\\\",\\\"noun\\\":\\\"course\\\"}],\\\"requires\\\":[],\\\"section\\\":{\\\"id\\\":\\\"education\\\",\\\"label\\\":\\\"Education\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"Courses and lessons for learning.\\\"},\\\"help\\\":{\\\"markdown\\\":\\\"# Course catalog\\\\n\\\\nManage courses, their sections, and lessons. Private family copies and answer\\\\nkeys remain visible only through the application’s authorized catalog service.\\\\n\\\",\\\"fieldRefs\\\":[]},\\\"runtime\\\":\\\"both\\\",\\\"demo\\\":{\\\"mode\\\":\\\"server\\\",\\\"reasons\\\":[\\\"Needs a server because its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627).\\\"]}},{\\\"id\\\":\\\"education.learner\\\",\\\"className\\\":\\\"EducationLearnerRecipe\\\",\\\"label\\\":\\\"Learners\\\",\\\"summary\\\":\\\"Plan learner curricula and retain enrollment-scoped progress.\\\",\\\"synonyms\\\":[\\\"learners\\\",\\\"enrollments\\\",\\\"learning progress\\\"],\\\"models\\\":[\\\"@happyvertical/smrt-education:Learner\\\",\\\"@happyvertical/smrt-education:Curriculum\\\",\\\"@happyvertical/smrt-education:Enrollment\\\",\\\"@happyvertical/smrt-education:LessonProgress\\\"],\\\"nav\\\":[{\\\"label\\\":\\\"Learners\\\",\\\"model\\\":\\\"@happyvertical/smrt-education:Learner\\\",\\\"icon\\\":\\\"users\\\",\\\"description\\\":\\\"Authorized learners in this family.\\\",\\\"noun\\\":\\\"learner\\\"}],\\\"requires\\\":[],\\\"section\\\":{\\\"id\\\":\\\"education\\\",\\\"label\\\":\\\"Education\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"Courses and lessons for learning.\\\"},\\\"help\\\":{\\\"markdown\\\":\\\"# Learners\\\\n\\\\nUse `LearnerService` in an authenticated exact-tenant context to read a learner,\\\\nplan a curriculum as an authorized guardian, enroll in a visible course, and\\\\nstart a lesson. Recipe metadata does not expose model CRUD. Hosts authenticate\\\\nusers, provision family membership, and validate guardian ProfileRelationship\\\\ntypes and effective terms. See `agents/learner-service.md` for the boundary.\\\\n\\\",\\\"fieldRefs\\\":[]},\\\"runtime\\\":\\\"both\\\",\\\"demo\\\":{\\\"mode\\\":\\\"server\\\",\\\"reasons\\\":[\\\"Needs a server because its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627).\\\"]}}],\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-assets\\\",\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-ingestion\\\",\\\"@happyvertical/smrt-profiles\\\",\\\"@happyvertical/smrt-tenancy\\\",\\\"@happyvertical/smrt-users\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3615\\\",\\\"#3617\\\",\\\"#3624\\\",\\\"#3625\\\",\\\"#3626\\\",\\\"#3627\\\"],\\\"via\\\":[\\\"@happyvertical/smrt-agents\\\",\\\"@happyvertical/smrt-jobs\\\",\\\"@happyvertical/smrt-profiles\\\",\\\"@happyvertical/smrt-reports\\\",\\\"@happyvertical/smrt-secrets\\\",\\\"@happyvertical/smrt-tenancy\\\",\\\"@happyvertical/smrt-users\\\"]},\\\"stampsConstructors\\\":true}\"));\n","import type {\n CatalogAcquisitionCapabilityDecision,\n CatalogResourceRepresentation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\n\n/** Closed observed MIME mapping; icons and file names never establish a format. */\nexport const CATALOG_REPRESENTATION_MEDIA_TYPES = {\n pdf: 'application/pdf',\n zip: 'application/zip',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n} as const;\n/** Bound and validate a complete Content-Type before retaining its canonical token. */\nexport function catalogRepresentationMediaType(value: string): string {\n const token = \"[!#$%&'*+.^_`|~0-9A-Za-z-]+\";\n const quoted = '\"(?:[\\\\x20-\\\\x21\\\\x23-\\\\x5b\\\\x5d-\\\\x7e]|\\\\\\\\[\\\\x20-\\\\x7e])*\"';\n const syntax = new RegExp(\n `^${token}/${token}(?:[ \\t]*;[ \\t]*${token}=(?:${token}|${quoted}))*[ \\t]*$`,\n );\n if (value.length > 512 || !syntax.test(value))\n throw new CatalogRepresentationError();\n return value.split(';', 1)[0].trim().toLowerCase();\n}\nexport function catalogRepresentationFormat(\n mediaType: string,\n): keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES | undefined {\n const token = catalogRepresentationMediaType(mediaType);\n return Object.entries(CATALOG_REPRESENTATION_MEDIA_TYPES).find(\n ([, mime]) => mime === token,\n )?.[0] as keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES | undefined;\n}\n\nexport class CatalogRepresentationError extends Error {\n readonly code = 'invalid-representation-metadata';\n constructor() {\n super('Catalog representation metadata is invalid.');\n this.name = 'CatalogRepresentationError';\n }\n}\nfunction object(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new CatalogRepresentationError();\n return value as Record<string, unknown>;\n}\nfunction keys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n): void {\n if (Object.keys(value).some((key) => !allowed.includes(key)))\n throw new CatalogRepresentationError();\n}\nfunction positive(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\n/** Missing/null is legacy; malformed present data always throws, never becomes absence. */\nexport function normalizeCatalogRepresentation(\n value: unknown,\n): CatalogResourceRepresentation | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') {\n if (value.length > 4096) throw new CatalogRepresentationError();\n try {\n value = JSON.parse(value);\n } catch {\n throw new CatalogRepresentationError();\n }\n if (value === null) return undefined;\n }\n const record = object(value);\n keys(record, [\n 'format',\n 'mediaType',\n 'byteLength',\n 'validators',\n 'acquisition',\n ]);\n if (!positive(record.byteLength)) throw new CatalogRepresentationError();\n if (record.format === 'unknown') {\n if (\n record.mediaType !== null &&\n (typeof record.mediaType !== 'string' ||\n catalogRepresentationMediaType(record.mediaType) !== record.mediaType ||\n catalogRepresentationFormat(record.mediaType) !== undefined)\n )\n throw new CatalogRepresentationError();\n } else if (\n typeof record.format !== 'string' ||\n !Object.hasOwn(CATALOG_REPRESENTATION_MEDIA_TYPES, record.format) ||\n CATALOG_REPRESENTATION_MEDIA_TYPES[\n record.format as keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES\n ] !== record.mediaType\n )\n throw new CatalogRepresentationError();\n const validators = object(record.validators);\n keys(validators, ['etag', 'lastModified']);\n if (\n typeof validators.etag !== 'string' ||\n !/^\"[\\x21\\x23-\\x7e]{1,200}\"$/.test(validators.etag) ||\n typeof validators.lastModified !== 'string' ||\n validators.lastModified.length > 100 ||\n !Number.isFinite(Date.parse(validators.lastModified)) ||\n new Date(validators.lastModified).toUTCString() !== validators.lastModified\n )\n throw new CatalogRepresentationError();\n const capability = object(record.acquisition);\n keys(\n capability,\n record.format === 'unknown' ? ['status', 'reason'] : ['status', 'maxBytes'],\n );\n let acquisition: CatalogResourceRepresentation['acquisition'];\n if (record.format === 'unknown') {\n const reason =\n record.mediaType === null\n ? 'missing-content-type'\n : 'unrecognized-content-type';\n if (capability.status !== 'unknown-format' || capability.reason !== reason)\n throw new CatalogRepresentationError();\n acquisition = { status: 'unknown-format', reason };\n } else if (record.format !== 'pdf') {\n if (\n capability.status !== 'unsupported-format' ||\n capability.maxBytes !== undefined\n )\n throw new CatalogRepresentationError();\n acquisition = { status: 'unsupported-format' };\n } else {\n if (\n !positive(capability.maxBytes) ||\n (capability.status !== 'supported' &&\n capability.status !== 'size-limit') ||\n (capability.status === 'supported') !==\n record.byteLength <= capability.maxBytes\n )\n throw new CatalogRepresentationError();\n acquisition = {\n status: capability.status as 'supported' | 'size-limit',\n maxBytes: capability.maxBytes,\n };\n }\n return {\n format: record.format as CatalogResourceRepresentation['format'],\n mediaType: record.mediaType as CatalogResourceRepresentation['mediaType'],\n byteLength: record.byteLength,\n validators: {\n etag: validators.etag,\n lastModified: validators.lastModified,\n },\n acquisition,\n } as CatalogResourceRepresentation;\n}\n\n/** Read-only preselection guard for NEW downloads. It does not authorize legal use or pinned-byte printing. */\nexport function evaluateCatalogAcquisitionCapability(\n resource: Pick<CatalogSourceRecord, 'availableFormats' | 'representation'>,\n format: string,\n limits?: { maxBytes?: number },\n): CatalogAcquisitionCapabilityDecision {\n let representation: CatalogResourceRepresentation | undefined;\n try {\n representation = normalizeCatalogRepresentation(resource.representation);\n if (limits?.maxBytes !== undefined && !positive(limits.maxBytes))\n throw new CatalogRepresentationError();\n } catch {\n return { allowed: false, reason: 'invalid-representation-metadata' };\n }\n if (representation?.format === 'unknown')\n return {\n allowed: false,\n reason: 'unknown-format',\n byteLength: representation.byteLength,\n };\n if (\n !Array.isArray(resource.availableFormats) ||\n !resource.availableFormats.includes(format)\n )\n return { allowed: false, reason: 'format-unavailable' };\n if (!representation) return { allowed: true, verification: 'legacy' };\n if (representation.format !== format)\n return { allowed: false, reason: 'format-unavailable' };\n if (representation.acquisition.status === 'unsupported-format')\n return {\n allowed: false,\n reason: 'unsupported-format',\n byteLength: representation.byteLength,\n };\n const maxBytes = Math.min(\n representation.acquisition.maxBytes,\n limits?.maxBytes ?? representation.acquisition.maxBytes,\n );\n if (\n representation.acquisition.status === 'size-limit' ||\n representation.byteLength > maxBytes\n )\n return {\n allowed: false,\n reason: 'size-limit',\n maxBytes,\n byteLength: representation.byteLength,\n };\n return { allowed: true, verification: 'observed' };\n}\n","import type {\n CatalogActor,\n CatalogLicenseEvidence,\n CatalogOperation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\n\nexport interface CatalogPolicyDecision {\n allowed: boolean;\n reason?:\n | 'teacher-material'\n | 'unverified-license'\n | 'operation-not-permitted';\n}\n\n/** Server-side resource policy. UI affordances are advisory and cannot bypass it. */\nexport class CatalogPolicy {\n canView(\n record: Pick<CatalogSourceRecord, 'visibility'>,\n actor: CatalogActor,\n ): boolean {\n return record.visibility === 'catalog' || actor.roles.includes('teacher');\n }\n\n authorize(\n record: Pick<CatalogSourceRecord, 'visibility' | 'licenseEvidence'>,\n operation: CatalogOperation,\n actor: CatalogActor,\n ): CatalogPolicyDecision {\n if (!this.canView(record, actor))\n return { allowed: false, reason: 'teacher-material' };\n const evidence = record.licenseEvidence;\n if (!this.isVerified(evidence))\n return { allowed: false, reason: 'unverified-license' };\n if (!evidence.permittedOperations?.includes(operation))\n return { allowed: false, reason: 'operation-not-permitted' };\n return { allowed: true };\n }\n\n private isVerified(evidence: CatalogLicenseEvidence): boolean {\n return evidence.state === 'verified' && !!evidence.identifier?.trim();\n }\n}\n","import {\n evaluateCatalogAcquisitionCapability,\n normalizeCatalogRepresentation,\n} from './catalog-capability.js';\nimport type {\n CatalogAcquireAdapter,\n CatalogActor,\n CatalogOperation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\nimport { CatalogPolicy } from './catalog-policy.js';\n\nexport interface CatalogAcquisitionRecord {\n id: string;\n tenantId: string;\n resourceId: string;\n selectionId: string;\n revision: string;\n format: string;\n sha256: string;\n attribution?: string;\n notices?: string;\n}\n\nexport interface CatalogSelectionRecord {\n id: string;\n tenantId: string;\n resourceId: string;\n selectedRevision: string;\n}\n\nexport interface CatalogAcquisitionStore {\n getResource(\n resourceId: string,\n ): Promise<\n (CatalogSourceRecord & { id: string; withdrawnAt: Date | null }) | undefined\n >;\n getSelection(input: {\n tenantId: string;\n selectionId: string;\n }): Promise<CatalogSelectionRecord | undefined>;\n findAcquisition(input: {\n tenantId: string;\n resourceId: string;\n selectionId: string;\n revision: string;\n format: string;\n }): Promise<CatalogAcquisitionRecord | undefined>;\n createAcquisition(\n input: Omit<CatalogAcquisitionRecord, 'id'> & { bytes: Uint8Array },\n ): Promise<CatalogAcquisitionRecord>;\n}\n\nexport interface CatalogAcquisitionRequest {\n tenantId: string;\n actorUserId: string;\n roles: readonly string[];\n resourceId: string;\n selectionId: string;\n revision: string;\n format: string;\n operation: CatalogOperation;\n}\n\nasync function digest(bytes: Uint8Array): Promise<string> {\n const hash = await globalThis.crypto.subtle.digest('SHA-256', bytes);\n return Array.from(new Uint8Array(hash), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n}\n\n/** Explicit, policy-gated selected-content acquisition. Catalog discovery has no route here. */\nexport class CatalogAcquisitionService {\n constructor(\n private readonly store: CatalogAcquisitionStore,\n private readonly adapter: CatalogAcquireAdapter,\n private readonly policy = new CatalogPolicy(),\n ) {}\n\n async acquire(\n request: CatalogAcquisitionRequest,\n ): Promise<CatalogAcquisitionRecord> {\n const actor: CatalogActor = {\n tenantId: request.tenantId,\n actorUserId: request.actorUserId,\n roles: request.roles,\n };\n if (!actor.tenantId.trim() || !actor.actorUserId.trim())\n throw new Error('Trusted tenant and actor identity are required.');\n const resource = await this.store.getResource(request.resourceId);\n if (!resource) throw new Error('Catalog resource was not found.');\n if (resource.withdrawnAt)\n throw new Error('Withdrawn catalog resource cannot be acquired.');\n if (resource.revision !== request.revision)\n throw new Error(\n 'Catalog resource revision is no longer current; reselect it.',\n );\n const selection = await this.store.getSelection({\n tenantId: actor.tenantId,\n selectionId: request.selectionId,\n });\n if (\n !selection ||\n selection.resourceId !== resource.id ||\n selection.selectedRevision !== request.revision\n )\n throw new Error(\n 'A matching tenant selection is required for acquisition.',\n );\n if (!resource.availableFormats?.includes(request.format))\n throw new Error('Requested content format is unavailable.');\n const decision = this.policy.authorize(resource, request.operation, actor);\n if (!decision.allowed)\n throw new Error(`Catalog acquisition denied: ${decision.reason}`);\n const existing = await this.store.findAcquisition({\n tenantId: actor.tenantId,\n resourceId: resource.id,\n selectionId: selection.id,\n revision: request.revision,\n format: request.format,\n });\n if (existing) return existing;\n const capability = evaluateCatalogAcquisitionCapability(\n resource,\n request.format,\n );\n if (!capability.allowed)\n throw new Error(`Catalog acquisition unavailable: ${capability.reason}`);\n const acquired = await this.adapter.acquire({\n providerId: resource.providerId,\n stableId: resource.stableId,\n revision: request.revision,\n format: request.format,\n });\n if (acquired.revision !== request.revision)\n throw new Error('Provider returned an unpinned resource revision.');\n const representation = normalizeCatalogRepresentation(\n resource.representation,\n );\n if (\n representation &&\n acquired.bytes.byteLength !== representation.byteLength\n )\n throw new Error(\n 'Acquired bytes differ from observed representation length.',\n );\n const actualHash = await digest(acquired.bytes);\n if (actualHash !== acquired.sha256.toLowerCase())\n throw new Error('Provider content hash did not match acquired bytes.');\n return await this.store.createAcquisition({\n tenantId: actor.tenantId,\n resourceId: resource.id,\n selectionId: selection.id,\n revision: request.revision,\n format: request.format,\n sha256: actualHash,\n attribution: resource.licenseEvidence.attribution,\n notices: resource.licenseEvidence.exceptions,\n bytes: acquired.bytes,\n });\n }\n}\n","import { field, foreignKey, SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { normalizeCatalogRepresentation } from './catalog-capability.js';\nimport type {\n CatalogLicenseState,\n CatalogResourceRepresentation,\n CatalogVisibility,\n} from './catalog-contracts.js';\n\nconst closed = { api: false, mcp: false, cli: false } as const;\n\n/** Globally visible provider registration. Hosts configure adapters and credentials out of band. */\n@smrt({ ...closed })\nexport class CatalogProvider extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @field({ required: true }) providerId = '';\n @field({ required: true }) name = '';\n active = true;\n}\n\n/** A provider-native record. Rows are intentionally not merged across providers. */\n@smrt({ ...closed })\nexport class CatalogResource extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @field({ required: true }) providerId = '';\n @field({ required: true }) stableId = '';\n @field({ required: true }) revision = '';\n canonicalUrl = '';\n @field({ required: true }) title = '';\n suppliedDescription = '';\n author = '';\n subjects = '[]';\n grades = '{}';\n language = '';\n resourceType = '';\n parentStableId = '';\n availableFormats = '[]';\n /** Serialized observed representation; JSON null is legacy absence. */\n representation = 'null';\n\n getRepresentation(): CatalogResourceRepresentation | undefined {\n return normalizeCatalogRepresentation(this.representation);\n }\n setRepresentation(value: CatalogResourceRepresentation | undefined): void {\n this.representation = JSON.stringify(\n normalizeCatalogRepresentation(value) ?? null,\n );\n }\n licenseEvidence = '{}';\n licenseState: CatalogLicenseState = 'unknown';\n visibility: CatalogVisibility = 'catalog';\n /** Last durable enumeration generation that observed this provider record. */\n lastSeenRunId = '';\n withdrawnAt = '';\n}\n\n/** Durable per-provider enumeration state. A failed or partial feed is never complete. */\n@smrt({ ...closed })\nexport class CatalogSyncState extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n /** Provider-owned stable key, not an internal provider row ID. */\n @field({ required: true }) providerId = '';\n cursor = '';\n /** Persists across interrupted pages so terminal withdrawal is safe on resume. */\n runId = '';\n complete = false;\n paused = false;\n pauseReason = '';\n importedCount = 0;\n failures = '[]';\n lastSuccessfulAt = '';\n}\n\n/** Tenant-owned intent to use a metadata record, distinct from acquiring bytes. */\n@TenantScoped({ mode: 'required' })\n@smrt({ ...closed })\nexport class CatalogSelection extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @tenantId() tenantId = '';\n @foreignKey('CatalogResource', { required: true }) resourceId = '';\n @field({ required: true }) selectedByUserId = '';\n @field({ required: true }) selectedRevision = '';\n}\n\n/** A pinned, tenant-owned acquisition record. Bytes belong in a host storage service. */\n@TenantScoped({ mode: 'required' })\n@smrt({ ...closed })\nexport class CatalogAcquisition extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @tenantId() tenantId = '';\n @foreignKey('CatalogResource', { required: true }) resourceId = '';\n @foreignKey('CatalogSelection', { required: true }) selectionId = '';\n @field({ required: true }) revision = '';\n @field({ required: true }) format = '';\n @field({ required: true }) sha256 = '';\n attribution = '';\n notices = '';\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport {\n CatalogAcquisition,\n CatalogProvider,\n CatalogResource,\n CatalogSelection,\n CatalogSyncState,\n} from './catalog-models.js';\n\nexport class CatalogProviderCollection extends SmrtCollection<CatalogProvider> {\n static readonly _itemClass = CatalogProvider;\n}\nexport class CatalogResourceCollection extends SmrtCollection<CatalogResource> {\n static readonly _itemClass = CatalogResource;\n}\nexport class CatalogSyncStateCollection extends SmrtCollection<CatalogSyncState> {\n static readonly _itemClass = CatalogSyncState;\n}\nexport class CatalogSelectionCollection extends SmrtCollection<CatalogSelection> {\n static readonly _itemClass = CatalogSelection;\n}\nexport class CatalogAcquisitionCollection extends SmrtCollection<CatalogAcquisition> {\n static readonly _itemClass = CatalogAcquisition;\n}\n","import type { DatabaseInterface } from '@happyvertical/sql';\nimport { normalizeCatalogRepresentation } from './catalog-capability.js';\nimport {\n CatalogResourceCollection,\n CatalogSyncStateCollection,\n} from './catalog-collections.js';\nimport type {\n CatalogSourceRecord,\n CatalogSyncCheckpoint,\n} from './catalog-contracts.js';\nimport type { CatalogSyncStore } from './catalog-sync-service.js';\n\nfunction json(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction checkpoint(row: {\n providerId: string;\n runId: string;\n cursor: string;\n complete: boolean;\n paused: boolean;\n pauseReason: string;\n importedCount: number;\n failures: string;\n lastSuccessfulAt: string;\n}): CatalogSyncCheckpoint {\n let failures: CatalogSyncCheckpoint['failures'] = [];\n try {\n const parsed: unknown = JSON.parse(row.failures);\n if (Array.isArray(parsed)) failures = parsed as typeof failures;\n } catch {\n // A corrupt historical failure ledger stays visible as an incomplete run.\n failures = [\n {\n code: 'invalid-failure-ledger',\n message: 'Stored failure ledger is invalid.',\n },\n ];\n }\n return {\n providerId: row.providerId,\n ...(row.runId ? { runId: row.runId } : {}),\n ...(row.cursor ? { cursor: row.cursor } : {}),\n complete: row.complete,\n ...(row.paused ? { paused: true } : {}),\n ...(row.pauseReason ? { pauseReason: row.pauseReason } : {}),\n importedCount: row.importedCount,\n failures,\n ...(row.lastSuccessfulAt ? { lastSuccessfulAt: row.lastSuccessfulAt } : {}),\n };\n}\n\n/** Default durable store for metadata-only provider synchronization. */\nexport class CatalogDatabaseSyncStore implements CatalogSyncStore {\n constructor(private readonly db: DatabaseInterface) {}\n\n async getCheckpoint(\n providerId: string,\n ): Promise<CatalogSyncCheckpoint | undefined> {\n const states = await CatalogSyncStateCollection.create({ db: this.db });\n const rows = await states.list({ where: { providerId }, limit: 2 });\n if (rows.length > 1)\n throw new Error('Catalog provider has ambiguous sync state.');\n return rows[0] ? checkpoint(rows[0]) : undefined;\n }\n\n async saveCheckpoint(value: CatalogSyncCheckpoint): Promise<void> {\n const states = await CatalogSyncStateCollection.create({ db: this.db });\n const rows = await states.list({\n where: { providerId: value.providerId },\n limit: 2,\n });\n if (rows.length > 1)\n throw new Error('Catalog provider has ambiguous sync state.');\n const fields = {\n providerId: value.providerId,\n runId: value.runId ?? '',\n cursor: value.cursor ?? '',\n complete: value.complete,\n paused: value.paused ?? false,\n pauseReason: value.pauseReason ?? '',\n importedCount: value.importedCount,\n failures: json(value.failures),\n lastSuccessfulAt: value.lastSuccessfulAt ?? '',\n };\n if (rows[0]) {\n Object.assign(rows[0], fields);\n await rows[0].save();\n } else await states.create(fields);\n }\n\n async upsert(record: CatalogSourceRecord, runId: string): Promise<void> {\n const resources = await CatalogResourceCollection.create({ db: this.db });\n const rows = await resources.list({\n where: { providerId: record.providerId, stableId: record.stableId },\n limit: 2,\n });\n if (rows.length > 1)\n throw new Error('Catalog provider record identity is ambiguous.');\n const fields = {\n providerId: record.providerId,\n stableId: record.stableId,\n revision: record.revision,\n canonicalUrl: record.canonicalUrl,\n title: record.title,\n suppliedDescription: record.suppliedDescription ?? '',\n author: record.author ?? '',\n subjects: json(record.subjects ?? []),\n grades: json(record.gradeRange ?? {}),\n language: record.language ?? '',\n resourceType: record.resourceType ?? '',\n parentStableId: record.parentStableId ?? '',\n availableFormats: json(record.availableFormats ?? []),\n representation: json(\n normalizeCatalogRepresentation(record.representation),\n ),\n licenseEvidence: json(record.licenseEvidence),\n licenseState: record.licenseEvidence.state,\n visibility: record.visibility,\n lastSeenRunId: runId,\n withdrawnAt: '',\n };\n if (rows[0]) {\n Object.assign(rows[0], fields);\n await rows[0].save();\n } else await resources.create(fields);\n }\n\n async withdrawUnseen(providerId: string, runId: string): Promise<number> {\n const resources = await CatalogResourceCollection.create({ db: this.db });\n const rows = await resources.list({ where: { providerId } });\n const timestamp = new Date().toISOString();\n let withdrawn = 0;\n for (const row of rows) {\n if (row.lastSeenRunId === runId || row.withdrawnAt) continue;\n row.withdrawnAt = timestamp;\n await row.save();\n withdrawn++;\n }\n return withdrawn;\n }\n}\n","import { getCurrentTenant } from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport type { CatalogAcquisitionRecord } from './catalog-acquisition-service.js';\nimport type { CatalogActor, CatalogSourceRecord } from './catalog-contracts.js';\nimport { CatalogPolicy } from './catalog-policy.js';\nimport {\n CourseSectionCollection,\n ExternalCourseCollection,\n LessonAssetCollection,\n ReadingCollection,\n WorksheetCollection,\n} from './collections.js';\nimport type { LearnerRequest } from './learner-service.js';\n\nexport interface CatalogMaterializationStore {\n getResource(\n resourceId: string,\n ): Promise<\n (CatalogSourceRecord & { id: string; withdrawnAt: Date | null }) | undefined\n >;\n getAcquisition(input: {\n tenantId: string;\n acquisitionId: string;\n }): Promise<CatalogAcquisitionRecord | undefined>;\n}\n\n/** Host-owned copy operation; it must retain the pinned bytes and prove a private Asset capability. */\nexport interface CatalogMaterializationStorage {\n ensurePrivateAsset(input: {\n tenantId: string;\n actorUserId: string;\n acquisition: CatalogAcquisitionRecord;\n name: string;\n }): Promise<{ assetId: string }>;\n}\n\nexport interface CatalogEnrollmentPort {\n enroll(\n input: LearnerRequest & { curriculumId: string; courseId: string },\n ): Promise<{\n id: string;\n }>;\n}\n\nexport interface CatalogMaterializationRequest {\n tenantId: string;\n actorUserId: string;\n acquisitionId: string;\n /** Required when provider metadata does not classify a subject. */\n subject?: string;\n courseTitle?: string;\n lessonTitle?: string;\n curriculumId?: string;\n learnerId?: string;\n guardianRelationshipId?: string;\n}\n\n/** Host derives this from current memberships and guardian terms; callers never supply roles. */\nexport type CatalogMaterializationAuthorizer = (input: {\n tenantId: string;\n actorUserId: string;\n executor: DatabaseInterface;\n action: 'education.catalog.materialize';\n}) => Promise<Readonly<{ allowed: boolean; roles: readonly string[] }>>;\n\nexport interface CatalogMaterializationResult {\n courseId: string;\n lessonId: string;\n assetId: string;\n revision: string;\n sha256: string;\n enrollmentId?: string;\n}\n\nasync function identity(...parts: string[]): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(\n JSON.stringify(['smrt.education.catalog.v1', ...parts]),\n ),\n );\n const hex = Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-5${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n\n/** Both adapter file extensions and MIME media types preserve PDF layout. */\nexport function isPrintableAcquisitionFormat(format: string): boolean {\n return format === 'pdf' || format === 'application/pdf';\n}\n\n/** Creates a private course from an already-authorized, pinned acquisition. */\nexport class CatalogMaterializationService {\n constructor(\n private readonly db: DatabaseInterface,\n private readonly store: CatalogMaterializationStore,\n private readonly storage: CatalogMaterializationStorage,\n private readonly learner: CatalogEnrollmentPort | undefined,\n private readonly authorize: CatalogMaterializationAuthorizer,\n private readonly policy = new CatalogPolicy(),\n ) {}\n\n async materialize(\n request: CatalogMaterializationRequest,\n ): Promise<CatalogMaterializationResult> {\n const active = getCurrentTenant();\n if (\n !request.tenantId?.trim() ||\n !request.actorUserId?.trim() ||\n active?.tenantId !== request.tenantId ||\n active.userId !== request.actorUserId ||\n active.superAdminBypass\n )\n throw new Error('Trusted active tenant and actor identity are required.');\n const authorization = await this.authorize({\n tenantId: request.tenantId,\n actorUserId: request.actorUserId,\n executor: this.db,\n action: 'education.catalog.materialize',\n });\n if (!authorization.allowed || !authorization.roles.includes('guardian'))\n throw new Error('Active guardian authorization is required.');\n const actor: CatalogActor = {\n tenantId: request.tenantId,\n actorUserId: request.actorUserId,\n roles: authorization.roles,\n };\n const acquisition = await this.store.getAcquisition({\n tenantId: actor.tenantId,\n acquisitionId: request.acquisitionId,\n });\n if (!acquisition || acquisition.tenantId !== actor.tenantId)\n throw new Error('Pinned tenant acquisition was not found.');\n const resource = await this.store.getResource(acquisition.resourceId);\n if (!resource || resource.revision !== acquisition.revision)\n throw new Error('Pinned catalog resource revision was not found.');\n if (resource.withdrawnAt)\n throw new Error('Withdrawn catalog resource cannot be materialized.');\n // A teacher may inspect restricted metadata, but this learner-material\n // workflow never promotes it into a course, printable, or asset link.\n if (resource.visibility === 'teacher')\n throw new Error(\n 'Teacher-only material cannot be materialized for learners.',\n );\n const operation = isPrintableAcquisitionFormat(acquisition.format)\n ? 'print'\n : 'download';\n const decision = this.policy.authorize(resource, operation, actor);\n if (!decision.allowed)\n throw new Error(`Current catalog license does not permit ${operation}.`);\n const subject =\n resource.subjects?.find((value) => value.trim()) ??\n request.subject?.trim();\n if (!subject)\n throw new Error('Guardian subject classification is required.');\n const courseId = await identity(\n actor.tenantId,\n resource.providerId,\n resource.stableId,\n );\n const sectionId = await identity(courseId, 'materials');\n const lessonId = await identity(\n courseId,\n acquisition.revision,\n acquisition.format,\n );\n const asset = await this.storage.ensurePrivateAsset({\n tenantId: actor.tenantId,\n actorUserId: actor.actorUserId,\n acquisition,\n name: request.lessonTitle?.trim() || resource.title,\n });\n if (!asset.assetId)\n throw new Error('Materialized private asset is required.');\n if (!this.db.transaction)\n throw new Error('Catalog materialization requires a transaction.');\n await this.db.transaction(async (tx) => {\n const courses = await ExternalCourseCollection.create({ db: tx });\n const sections = await CourseSectionCollection.create({ db: tx });\n const readings = await ReadingCollection.create({ db: tx });\n const worksheets = await WorksheetCollection.create({ db: tx });\n const assets = await LessonAssetCollection.create({ db: tx });\n const course = await courses.get(courseId);\n if (course) {\n if (\n course.tenantId !== actor.tenantId ||\n course.sourceKey !== resource.providerId ||\n course.sourceRef !== resource.stableId ||\n course.licenseKind !== 'personal-use-copy'\n )\n throw new Error(\n 'Existing materialized course ownership cannot change.',\n );\n } else {\n await courses.create({\n id: courseId,\n tenantId: actor.tenantId,\n title: request.courseTitle?.trim() || resource.title,\n subject,\n sourceKey: resource.providerId,\n sourceRef: resource.stableId,\n sourceUrl: resource.canonicalUrl,\n license: resource.licenseEvidence.identifier ?? '',\n licenseKind: 'personal-use-copy',\n licenseNote: [\n resource.licenseEvidence.attribution,\n acquisition.sha256,\n ]\n .filter(Boolean)\n .join('\\n'),\n status: 'draft',\n });\n }\n if (!(await sections.get(sectionId)))\n await sections.create({\n id: sectionId,\n tenantId: actor.tenantId,\n courseId,\n title: 'Materials',\n sortOrder: 0,\n });\n // Acquisition formats are MIME types. Only a layout-preserving PDF is\n // printable; all other formats remain attachments for host-specific use.\n const printable = isPrintableAcquisitionFormat(acquisition.format);\n const lessons = printable ? worksheets : readings;\n if (!(await lessons.get(lessonId)))\n await lessons.create({\n id: lessonId,\n tenantId: actor.tenantId,\n sectionId,\n title: request.lessonTitle?.trim() || resource.title,\n externalRef: `${resource.stableId}@${acquisition.revision}`,\n externalUrl: resource.canonicalUrl,\n sortOrder: 0,\n });\n if (\n !(await assets.get({\n lessonId,\n assetId: asset.assetId,\n tenantId: actor.tenantId,\n }))\n )\n await assets.create({\n tenantId: actor.tenantId,\n lessonId,\n assetId: asset.assetId,\n relationship: printable ? 'printable' : 'attachment',\n });\n });\n let enrollmentId: string | undefined;\n if (request.curriculumId || request.learnerId) {\n if (!this.learner || !request.curriculumId || !request.learnerId)\n throw new Error(\n 'Learner, curriculum, and enrollment service are required.',\n );\n enrollmentId = (\n await this.learner.enroll({\n tenantId: actor.tenantId,\n actorUserId: actor.actorUserId,\n learnerId: request.learnerId,\n ...(request.guardianRelationshipId\n ? { guardianRelationshipId: request.guardianRelationshipId }\n : {}),\n curriculumId: request.curriculumId,\n courseId,\n })\n ).id;\n }\n return {\n courseId,\n lessonId,\n assetId: asset.assetId,\n revision: acquisition.revision,\n sha256: acquisition.sha256,\n ...(enrollmentId ? { enrollmentId } : {}),\n };\n }\n}\n","import { normalizeCatalogRepresentation } from './catalog-capability.js';\nimport type {\n CatalogActor,\n CatalogLicenseEvidence,\n CatalogResourceRepresentation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\nimport { CatalogPolicy } from './catalog-policy.js';\n\nexport interface CatalogReadStore {\n search(input: {\n query?: string;\n subject?: string;\n grade?: string;\n }): Promise<readonly (CatalogSourceRecord & { id: string })[]>;\n}\n\n/** Deliberately metadata-only DTO: credentials, byte locations, and teacher records stay server-side. */\nexport interface CatalogResourceView {\n id: string;\n providerId: string;\n stableId: string;\n revision: string;\n canonicalUrl: string;\n title: string;\n suppliedDescription?: string;\n author?: string;\n subjects?: string[];\n gradeRange?: { min?: string; max?: string };\n language?: string;\n resourceType?: string;\n parentStableId?: string;\n availableFormats?: string[];\n representation?: CatalogResourceRepresentation;\n license: Pick<\n CatalogLicenseEvidence,\n | 'state'\n | 'identifier'\n | 'version'\n | 'attribution'\n | 'exceptions'\n | 'retrievedAt'\n >;\n}\n\nexport class CatalogReadService {\n constructor(\n private readonly store: CatalogReadStore,\n private readonly policy = new CatalogPolicy(),\n ) {}\n\n async search(\n actor: CatalogActor,\n filter: { query?: string; subject?: string; grade?: string } = {},\n ): Promise<CatalogResourceView[]> {\n if (!actor.tenantId.trim() || !actor.actorUserId.trim())\n throw new Error('Trusted tenant and actor identity are required.');\n const records = await this.store.search(filter);\n return records\n .filter((record) => this.policy.canView(record, actor))\n .map((record) => this.view(record));\n }\n\n private view(\n record: CatalogSourceRecord & { id: string },\n ): CatalogResourceView {\n const { licenseEvidence } = record;\n const representation = normalizeCatalogRepresentation(\n record.representation,\n );\n return {\n id: record.id,\n providerId: record.providerId,\n stableId: record.stableId,\n revision: record.revision,\n canonicalUrl: record.canonicalUrl,\n title: record.title,\n ...(record.suppliedDescription\n ? { suppliedDescription: record.suppliedDescription }\n : {}),\n ...(record.author ? { author: record.author } : {}),\n ...(record.subjects ? { subjects: [...record.subjects] } : {}),\n ...(record.gradeRange ? { gradeRange: { ...record.gradeRange } } : {}),\n ...(record.language ? { language: record.language } : {}),\n ...(record.resourceType ? { resourceType: record.resourceType } : {}),\n ...(record.parentStableId\n ? { parentStableId: record.parentStableId }\n : {}),\n ...(record.availableFormats\n ? { availableFormats: [...record.availableFormats] }\n : {}),\n ...(representation ? { representation } : {}),\n license: {\n state: licenseEvidence.state,\n ...(licenseEvidence.identifier\n ? { identifier: licenseEvidence.identifier }\n : {}),\n ...(licenseEvidence.version\n ? { version: licenseEvidence.version }\n : {}),\n ...(licenseEvidence.attribution\n ? { attribution: licenseEvidence.attribution }\n : {}),\n ...(licenseEvidence.exceptions\n ? { exceptions: licenseEvidence.exceptions }\n : {}),\n ...(licenseEvidence.retrievedAt\n ? { retrievedAt: licenseEvidence.retrievedAt }\n : {}),\n },\n };\n }\n}\n","import type {\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncCheckpoint,\n CatalogSyncFailure,\n} from './catalog-contracts.js';\n\nexport interface CatalogSyncStore {\n getCheckpoint(providerId: string): Promise<CatalogSyncCheckpoint | undefined>;\n saveCheckpoint(checkpoint: CatalogSyncCheckpoint): Promise<void>;\n upsert(record: CatalogSourceRecord, runId: string): Promise<void>;\n withdrawUnseen(providerId: string, runId: string): Promise<number>;\n}\n\n/** Policy counts cover only pages processed by the current sync invocation. */\nexport interface CatalogExclusionSummary {\n total: number;\n byCode: { code: string; count: number }[];\n otherCount: number;\n}\nexport interface CatalogFailureSummary {\n total: number;\n historical: boolean;\n historicalCount: number;\n currentCount: number;\n omittedDetailCount: number;\n}\nexport interface CatalogSyncReport extends CatalogSyncCheckpoint {\n withdrawnCount: number;\n /** Invocation-local, bounded, report-only; never a full-generation coverage total. */\n exclusionSummary?: CatalogExclusionSummary;\n /** Historical diagnostics do not imply a current active failure. */\n failureSummary?: CatalogFailureSummary;\n}\n\nconst MAX_FAILURE_CODES = 31;\nconst MAX_POLICY_CODES = 32;\nconst OVERFLOW_CODE = 'additional-failures';\nfunction addCount(left: number, right: number): number {\n const result = left + right;\n if (!Number.isSafeInteger(result))\n throw new Error(\n 'Catalog diagnostic occurrence count exceeds the safe integer bound.',\n );\n return result;\n}\nfunction occurrenceCount(value: unknown): number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0\n ? value\n : 1;\n}\nfunction bounded(value: string, cap: number): string {\n return value.length > cap ? `${value.slice(0, cap - 12)} [truncated]` : value;\n}\ntype CountedFailure = CatalogSyncFailure & {\n count: number;\n omittedDetailCount: number;\n};\nfunction diagnostic(raw: CatalogSyncFailure): CountedFailure {\n const value: Partial<CatalogSyncFailure> =\n raw && typeof raw === 'object' ? raw : {};\n const count = occurrenceCount(value.count);\n const invalidCount = value.count !== undefined && count !== value.count;\n const code =\n typeof value.code === 'string' && value.code\n ? value.code\n : 'invalid-failure-entry';\n const message = `${invalidCount ? 'Invalid legacy occurrence count; counted once. ' : ''}${typeof value.message === 'string' ? value.message : 'Stored failure diagnostic is malformed.'}`;\n const cursor = typeof value.cursor === 'string' ? value.cursor : undefined;\n const truncated =\n code.length > 128 || message.length > 512 || (cursor?.length ?? 0) > 256;\n const suppliedOmitted =\n typeof value.omittedDetailCount === 'number' &&\n Number.isSafeInteger(value.omittedDetailCount) &&\n value.omittedDetailCount >= 0\n ? Math.min(count, value.omittedDetailCount)\n : 0;\n return {\n code: bounded(code, 128),\n message: bounded(message, 512),\n ...(cursor !== undefined ? { cursor: bounded(cursor, 256) } : {}),\n ...(typeof value.retryAfterMs === 'number' &&\n Number.isFinite(value.retryAfterMs) &&\n value.retryAfterMs >= 0\n ? { retryAfterMs: value.retryAfterMs }\n : {}),\n count,\n omittedDetailCount: truncated ? count : suppliedOmitted,\n };\n}\n/** Keep recent per-code facts and exact occurrence totals; declare omitted details. */\nfunction compactFailures(entries: CatalogSyncFailure[]): CountedFailure[] {\n const groups = new Map<string, CountedFailure>();\n let overflowCount = 0;\n for (const raw of entries) {\n const next = diagnostic(raw);\n if (next.code === OVERFLOW_CODE) {\n overflowCount = addCount(overflowCount, next.count);\n continue;\n }\n const previous = groups.get(next.code);\n if (previous) {\n const sameDetail =\n previous.message === next.message &&\n previous.cursor === next.cursor &&\n previous.retryAfterMs === next.retryAfterMs;\n next.omittedDetailCount = addCount(\n sameDetail ? previous.omittedDetailCount : previous.count,\n next.omittedDetailCount,\n );\n next.count = addCount(previous.count, next.count);\n groups.delete(next.code);\n } else if (groups.size === MAX_FAILURE_CODES) {\n const oldest = groups.values().next().value;\n if (oldest) {\n overflowCount = addCount(overflowCount, oldest.count);\n groups.delete(oldest.code);\n }\n }\n groups.set(next.code, next);\n }\n return [\n ...groups.values(),\n ...(overflowCount\n ? [\n {\n code: OVERFLOW_CODE,\n message:\n 'Additional failure diagnostics compacted; full detail is unavailable.',\n count: overflowCount,\n omittedDetailCount: overflowCount,\n },\n ]\n : []),\n ];\n}\nfunction totalFailures(entries: CatalogSyncFailure[]): number {\n return entries.reduce(\n (total, entry) => addCount(total, occurrenceCount(entry.count)),\n 0,\n );\n}\nfunction failure(error: unknown): CatalogSyncFailure {\n const value = error as {\n code?: unknown;\n message?: unknown;\n retryAfterMs?: unknown;\n };\n return {\n code: String(value?.code ?? 'enumeration-failed'),\n message: String(value?.message ?? error),\n ...(typeof value?.retryAfterMs === 'number'\n ? { retryAfterMs: value.retryAfterMs }\n : {}),\n };\n}\n\n/** Durable metadata synchronization. It never invokes a content acquisition adapter. */\nexport class CatalogSyncService {\n constructor(\n private readonly store: CatalogSyncStore,\n private readonly retries = 2,\n private readonly maxPages = 100,\n ) {}\n\n async sync(\n providerId: string,\n adapter: CatalogSyncAdapter,\n ): Promise<CatalogSyncReport> {\n if (!providerId.trim()) throw new Error('A provider ID is required.');\n const saved = await this.store.getCheckpoint(providerId);\n const resuming = saved?.complete === false;\n const runId = resuming\n ? (saved.runId ?? globalThis.crypto.randomUUID())\n : globalThis.crypto.randomUUID();\n let checkpoint: CatalogSyncCheckpoint = {\n providerId,\n cursor: resuming ? saved?.cursor : undefined,\n complete: false,\n importedCount: resuming ? (saved?.importedCount ?? 0) : 0,\n failures: compactFailures(resuming ? (saved?.failures ?? []) : []),\n runId,\n };\n const historicalCount = totalFailures(checkpoint.failures);\n let currentCount = 0;\n let withdrawnCount = 0;\n let policyTotal = 0;\n let otherCount = 0;\n const policyCodes = new Map<string, number>();\n const report = (): CatalogSyncReport => ({\n ...checkpoint,\n withdrawnCount,\n exclusionSummary: {\n total: policyTotal,\n byCode: [...policyCodes].map(([code, count]) => ({ code, count })),\n otherCount,\n },\n failureSummary: {\n total: totalFailures(checkpoint.failures),\n historical: historicalCount > 0,\n historicalCount,\n currentCount,\n omittedDetailCount: checkpoint.failures.reduce(\n (total, entry) => addCount(total, entry.omittedDetailCount ?? 0),\n 0,\n ),\n },\n });\n const pause = async (\n reason: string,\n entries: CatalogSyncFailure[],\n ): Promise<CatalogSyncReport> => {\n currentCount = addCount(\n currentCount,\n totalFailures(entries.map(diagnostic)),\n );\n checkpoint = {\n ...checkpoint,\n complete: false,\n paused: true,\n pauseReason: bounded(reason, 512),\n failures: compactFailures([...checkpoint.failures, ...entries]),\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n };\n const cursors = new Set<string>();\n if (checkpoint.cursor) cursors.add(checkpoint.cursor);\n for (let pageCount = 0; pageCount < this.maxPages; pageCount++) {\n let page:\n | Awaited<ReturnType<CatalogSyncAdapter['enumerate']>>\n | undefined;\n let lastFailure: CatalogSyncFailure | undefined;\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n try {\n page = await adapter.enumerate({\n cursor: checkpoint.cursor,\n checkpoint,\n });\n break;\n } catch (error) {\n lastFailure = failure(error);\n }\n }\n if (!page) {\n const terminalFailure = lastFailure ?? {\n code: 'enumeration-failed',\n message: 'Adapter returned no catalog page.',\n };\n return await pause(terminalFailure.message, [terminalFailure]);\n }\n if (page.complete && page.nextCursor)\n throw new Error('A terminal catalog page cannot have a next cursor.');\n if (\n !page.complete &&\n !page.nextCursor &&\n !page.paused &&\n !page.exclusions?.length &&\n !page.policyExclusions?.length\n )\n throw new Error('A partial catalog page requires a next cursor.');\n for (const omission of page.policyExclusions ?? []) {\n const count = occurrenceCount(omission.count);\n policyTotal = addCount(policyTotal, count);\n const code =\n typeof omission.code === 'string' &&\n /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(omission.code)\n ? omission.code\n : 'invalid-policy-code';\n if (policyCodes.has(code) || policyCodes.size < MAX_POLICY_CODES)\n policyCodes.set(code, addCount(policyCodes.get(code) ?? 0, count));\n else otherCount = addCount(otherCount, count);\n }\n // Current operational failures never advance, withdraw, or claim success.\n // Saved legacy diagnostics remain audit history, without guessed reclassification.\n if (page.paused || page.exclusions?.length) {\n const entries = page.exclusions?.length\n ? page.exclusions\n : [{ code: 'paused', message: 'Catalog source is paused.' }];\n return await pause(entries[0].message, entries);\n }\n for (const record of page.records) {\n if (\n record.providerId !== providerId ||\n !record.stableId ||\n !record.revision\n )\n throw new Error(\n 'Catalog records require matching provider, stable ID, and revision.',\n );\n await this.store.upsert(record, runId);\n }\n checkpoint = {\n ...checkpoint,\n cursor:\n page.nextCursor ?? (page.complete ? undefined : checkpoint.cursor),\n complete: page.complete,\n paused: false,\n pauseReason: undefined,\n importedCount: checkpoint.importedCount + page.records.length,\n };\n if (!page.complete) {\n if (!page.nextCursor) {\n // A valid snapshot can be retained while its declared coverage is\n // explicitly unconfirmed. This is a controlled policy pause, not an\n // access/parse failure, and can never authorize withdrawal.\n checkpoint = {\n ...checkpoint,\n paused: true,\n pauseReason: bounded(\n page.policyExclusions?.[0]?.message ??\n 'Catalog scope is incomplete.',\n 512,\n ),\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n }\n if (checkpoint.cursor && cursors.has(checkpoint.cursor))\n return await pause('Catalog source did not advance its cursor.', [\n {\n cursor: checkpoint.cursor,\n code: 'cursor-cycle',\n message: 'Catalog source did not advance its cursor.',\n },\n ]);\n if (checkpoint.cursor) cursors.add(checkpoint.cursor);\n await this.store.saveCheckpoint(checkpoint);\n continue;\n }\n withdrawnCount = await this.store.withdrawUnseen(providerId, runId);\n checkpoint = {\n providerId,\n complete: true,\n importedCount: checkpoint.importedCount,\n failures: checkpoint.failures,\n lastSuccessfulAt: new Date().toISOString(),\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n }\n // A controlled invocation budget is a resumable yield, not a source failure.\n checkpoint = {\n ...checkpoint,\n complete: false,\n paused: false,\n pauseReason: undefined,\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n }\n}\n","import {\n field,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\n\nexport type SourceSharing = 'private' | 'group' | 'global';\nexport type CourseSourceKind = 'manual' | 'url' | 'adapter';\nexport interface CourseSourceConfig {\n /** Host-recorded written permission for a shared import, never learner input. */\n licenseEvidence?: string;\n}\n\n/** Host-managed source policy; deliberately has no generated CRUD surface. */\n@TenantScoped({ mode: 'required' })\n@smrt({ api: false, cli: false, mcp: false })\nexport class CourseSource extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @tenantId() tenantId = '';\n @field({ required: true }) key = '';\n @field({ required: true }) name = '';\n kind: CourseSourceKind = 'adapter';\n adapterKey = 'easy-peasy';\n config = '{}';\n sharing: SourceSharing = 'private';\n\n constructor(options: Record<string, unknown> = {}) {\n super(options);\n for (const [key, value] of Object.entries(options)) {\n if (Object.hasOwn(this, key))\n (this as unknown as Record<string, unknown>)[key] = value;\n }\n }\n\n getConfig(): CourseSourceConfig {\n const value: unknown = JSON.parse(this.config);\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error('CourseSource config must be an object.');\n const record = value as Record<string, unknown>;\n if (\n Object.keys(record).some((key) => key !== 'licenseEvidence') ||\n (record.licenseEvidence !== undefined &&\n typeof record.licenseEvidence !== 'string')\n )\n throw new Error('Invalid CourseSource config.');\n return {\n ...(record.licenseEvidence === undefined\n ? {}\n : { licenseEvidence: record.licenseEvidence as string }),\n };\n }\n\n setConfig(value: CourseSourceConfig): void {\n const previous = this.config;\n this.config = JSON.stringify(value);\n try {\n this.getConfig();\n } catch (error) {\n this.config = previous;\n throw error;\n }\n }\n\n override async save(): Promise<this> {\n if (\n !['private', 'group', 'global'].includes(this.sharing) ||\n !['manual', 'url', 'adapter'].includes(this.kind)\n )\n throw new Error('Invalid CourseSource kind or sharing.');\n this.getConfig();\n return super.save();\n }\n}\n\nexport class CourseSourceCollection extends SmrtCollection<CourseSource> {\n static readonly _itemClass = CourseSource;\n}\n","import type { CatalogSourceRecord } from '../catalog-contracts.js';\n\nconst host = 'im.kendallhunt.com';\n\nfunction text(value: string): string {\n return value\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Parses the publicly linked K-5 family curriculum index published by the IM\n * Certified Kendall Hunt site. It is deliberately metadata-only: unit and\n * lesson pages are not fetched or acquired here.\n */\nexport function parseIllustrativeMathematicsK5Index(\n html: string,\n revision: string,\n pageUrl = 'https://im.kendallhunt.com/k5/curriculum.html',\n): CatalogSourceRecord[] {\n const index = new URL(pageUrl);\n if (index.protocol !== 'https:' || index.hostname !== host)\n throw new Error(\n 'Illustrative Mathematics index must use the official HTTPS host.',\n );\n if (!revision.trim())\n throw new Error('Illustrative Mathematics revision is required.');\n\n const records: CatalogSourceRecord[] = [];\n const seen = new Set<string>();\n const anchors = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a\\s*>/gi;\n for (const match of html.matchAll(anchors)) {\n const href = /\\bhref\\s*=\\s*[\"']([^\"']+)[\"']/i.exec(match[1])?.[1];\n if (!href) continue;\n const url = new URL(href, index);\n const grade =\n /^\\/K5\\/families\\/(kindergarten|grade-[1-5])\\/units\\.html$/i.exec(\n url.pathname,\n )?.[1];\n if (!grade || url.hostname !== host || seen.has(url.pathname)) continue;\n seen.add(url.pathname);\n const gradeLabel =\n grade === 'kindergarten' ? 'K' : grade.slice('grade-'.length);\n records.push({\n providerId: 'illustrative-mathematics',\n stableId: `k5-family-${grade.toLowerCase()}`,\n revision,\n canonicalUrl: url.toString(),\n title: `IM K-5 Math Grade ${gradeLabel}`,\n suppliedDescription: text(match[2]) || undefined,\n subjects: ['mathematics'],\n gradeRange: { min: gradeLabel, max: gradeLabel },\n language: 'en',\n resourceType: 'course',\n availableFormats: ['html'],\n licenseEvidence: {\n state: 'verified',\n identifier: 'CC BY',\n version: '4.0',\n sourceUrl: 'https://creativecommons.org/licenses/by/4.0/',\n retrievedAt: revision,\n permittedOperations: [\n 'link',\n 'adapt',\n 'redistribute',\n 'commercial-use',\n ],\n },\n visibility: 'catalog',\n });\n }\n if (!records.length)\n throw new Error(\n 'Illustrative Mathematics K-5 index has no family-grade links.',\n );\n return records;\n}\n","import type { CatalogSourceRecord } from '../catalog-contracts.js';\n\nconst maximumFeedBytes = 2_000_000;\nconst namedEntities: Readonly<Record<string, string>> = {\n '&': '&',\n ''': \"'\",\n '>': '>',\n '<': '<',\n '"': '\"',\n};\n\nfunction decode(value: string): string {\n return value\n .replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, '$1')\n .replace(/<[^>]+>/g, ' ')\n .replace(\n /&(?:amp|apos|gt|lt|quot);/g,\n (entity) => namedEntities[entity] ?? entity,\n )\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction element(xml: string, names: readonly string[]): string | undefined {\n for (const name of names) {\n const match = new RegExp(\n `<${name}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${name}\\\\s*>`,\n 'i',\n ).exec(xml);\n const value = match ? decode(match[1]) : '';\n if (value) return value;\n }\n return undefined;\n}\n\nfunction elements(xml: string, names: readonly string[]): string[] {\n const values: string[] = [];\n for (const name of names) {\n const expression = new RegExp(\n `<${name}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${name}\\\\s*>`,\n 'gi',\n );\n for (const match of xml.matchAll(expression)) {\n const value = decode(match[1]);\n if (value) values.push(value);\n }\n }\n return [...new Set(values)];\n}\n\nfunction https(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && !url.username && !url.password\n ? url.toString()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parses a configured OER Commons/ISKME RSS or Dublin Core feed without entity\n * expansion or external resolution. The configured feed is authoritative for\n * scope; this parser never represents its page as global catalog coverage.\n */\nexport function parseOerCommonsRssFeed(\n xml: string,\n revision: string,\n): CatalogSourceRecord[] {\n if (new TextEncoder().encode(xml).byteLength > maximumFeedBytes)\n throw new Error('OER Commons RSS feed exceeds the 2 MB metadata limit.');\n if (/<!DOCTYPE|<!ENTITY/i.test(xml))\n throw new Error('OER Commons RSS feed must not contain DTDs or entities.');\n if (!revision.trim())\n throw new Error('OER Commons feed revision is required.');\n\n const records: CatalogSourceRecord[] = [];\n const items = xml.match(/<item\\b[^>]*>[\\s\\S]*?<\\/item\\s*>/gi) ?? [];\n for (const item of items) {\n const canonicalUrl = https(element(item, ['link', 'dc:identifier']));\n const stableId = element(item, ['guid', 'dc:identifier']) ?? canonicalUrl;\n const title = element(item, ['title', 'dc:title']);\n if (!canonicalUrl || !stableId || !title) continue;\n const rights = element(item, ['license', 'dc:rights', 'rights']);\n const licenseUrl = https(rights);\n records.push({\n providerId: 'oer-commons',\n stableId,\n revision: element(item, ['dc:date', 'pubDate']) ?? revision,\n canonicalUrl,\n title,\n suppliedDescription: element(item, ['description', 'dc:description']),\n author: element(item, ['dc:creator', 'author']),\n subjects: elements(item, ['category', 'dc:subject']),\n language: element(item, ['dc:language', 'language']),\n resourceType: element(item, ['dc:type']) ?? 'resource',\n availableFormats: elements(item, ['dc:format']),\n licenseEvidence: rights\n ? {\n // A feed label is provenance, not a license validation decision.\n state: 'unknown',\n identifier: rights,\n ...(licenseUrl ? { sourceUrl: licenseUrl } : {}),\n retrievedAt: revision,\n }\n : { state: 'unknown', retrievedAt: revision },\n visibility: 'catalog',\n });\n }\n if (!records.length)\n throw new Error('OER Commons RSS feed has no complete metadata items.');\n return records;\n}\n","import type {\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncCheckpoint,\n CatalogSyncPage,\n} from './catalog-contracts.js';\nimport { parseIllustrativeMathematicsK5Index } from './sources/illustrative-mathematics-parser.js';\nimport { parseOerCommonsRssFeed } from './sources/oer-commons-rss-parser.js';\n\nexport type HearthCatalogProviderId =\n | 'illustrative-mathematics'\n | 'ck12'\n | 'oer-commons';\n\n/**\n * A host-supplied integration for a provider-approved metadata feed. The\n * provider must approve the exact feed URL and credentials before it is used.\n * This deliberately does not guess a public endpoint or scrape course pages.\n */\nexport interface AuthorizedCatalogFeed {\n providerId: HearthCatalogProviderId;\n metadataFeedUrl: string;\n termsAccepted: true;\n enumerate(input: {\n cursor?: string;\n checkpoint: CatalogSyncCheckpoint;\n }): Promise<CatalogSyncPage>;\n}\n\nexport interface ProviderMetadataResponse {\n ok: boolean;\n status: number;\n url: string;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}\nexport type ProviderMetadataFetch = (\n url: string,\n options: {\n redirect: 'error';\n headers: { accept: string };\n signal?: AbortSignal;\n },\n) => Promise<ProviderMetadataResponse>;\n\nconst DEFAULT_METADATA_TIMEOUT_MS = 10_000;\n\nexport interface PublicIllustrativeMathematicsK5Config {\n /** The official K-5 curriculum index; defaults to the published index. */\n indexUrl?: string;\n fetch: ProviderMetadataFetch;\n /** Bounds both the provider request and response-body read. */\n timeoutMs?: number;\n}\nexport interface OerCommonsRssConfig {\n /** An ISKME/OER Commons-approved RSS or DC feed URL for an agreed collection. */\n feedUrl: string;\n fetch: ProviderMetadataFetch;\n /** Bounds both the provider request and response-body read. */\n timeoutMs?: number;\n /** Only set after the feed owner confirms this snapshot is terminal for its scope. */\n terminalSnapshot?: true;\n}\n\nexport interface ProviderFeedRequirement {\n providerId: HearthCatalogProviderId;\n requirement: string;\n}\n\nexport const providerFeedRequirements: readonly ProviderFeedRequirement[] = [\n {\n providerId: 'illustrative-mathematics',\n requirement:\n 'A provider-approved, paginated metadata feed plus written catalog-harvesting permission.',\n },\n {\n providerId: 'ck12',\n requirement:\n 'CK-12-approved catalog-feed access and credentials; ordinary web access is not an enumeration API.',\n },\n {\n providerId: 'oer-commons',\n requirement:\n 'OER Commons-approved paginated metadata-feed access with each record’s publisher and license fields.',\n },\n];\n\nfunction unavailablePage(providerId: HearthCatalogProviderId): CatalogSyncPage {\n const requirement = providerFeedRequirements.find(\n (entry) => entry.providerId === providerId,\n );\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n {\n code: 'provider_feed_not_configured',\n message: requirement?.requirement ?? 'Provider feed is not configured.',\n },\n ],\n };\n}\n\nfunction retryAfter(\n headers: ProviderMetadataResponse['headers'],\n): number | undefined {\n const value = headers.get('retry-after');\n if (!value) return undefined;\n const seconds = Number(value);\n return Number.isFinite(seconds) && seconds >= 0 ? seconds * 1000 : undefined;\n}\n\nfunction httpsUrl(value: string, provider: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`${provider} metadata URL is invalid.`);\n }\n if (url.protocol !== 'https:' || url.username || url.password || url.port)\n throw new Error(`${provider} metadata URL must be credential-free HTTPS.`);\n return url.toString();\n}\n\nasync function fetchMetadata(\n fetch: ProviderMetadataFetch,\n url: string,\n accept: string,\n timeoutMs = DEFAULT_METADATA_TIMEOUT_MS,\n): Promise<{ body: string; revision: string } | CatalogSyncPage> {\n const controller = new AbortController();\n const bounded = async <T>(operation: Promise<T>): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n operation,\n new Promise<T>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('Provider metadata request timed out.'));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n };\n let response: ProviderMetadataResponse;\n try {\n response = await bounded(\n fetch(url, {\n redirect: 'error',\n headers: { accept },\n signal: controller.signal,\n }),\n );\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n {\n code: 'provider_feed_failed',\n message:\n error instanceof Error ? error.message : 'Metadata request failed.',\n },\n ],\n };\n }\n if (response.status === 429)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_rate_limited',\n message: 'Provider metadata request was rate limited.',\n retryAfterMs: retryAfter(response.headers),\n },\n ],\n };\n if (!response.ok)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_feed_failed',\n message: `Provider metadata request failed with HTTP ${response.status}.`,\n },\n ],\n };\n if (response.url !== url)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'unexpected_provider_redirect',\n message:\n 'Provider metadata response URL did not match the configured URL.',\n },\n ],\n };\n let body: string;\n try {\n body = await bounded(response.text());\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n {\n code: 'provider_feed_failed',\n message:\n error instanceof Error ? error.message : 'Metadata read failed.',\n },\n ],\n };\n }\n if (new TextEncoder().encode(body).byteLength > 2_000_000)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_metadata_oversized',\n message: 'Provider metadata response exceeds 2 MB.',\n },\n ],\n };\n const revision =\n response.headers.get('etag') ?? response.headers.get('last-modified');\n if (!revision)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_revision_unavailable',\n message:\n 'Provider metadata response supplied no ETag or Last-Modified revision.',\n },\n ],\n };\n return { body, revision };\n}\n\nfunction validRecord(\n providerId: HearthCatalogProviderId,\n record: CatalogSourceRecord,\n): boolean {\n return (\n record.providerId === providerId &&\n record.stableId.trim().length > 0 &&\n record.revision.trim().length > 0 &&\n record.title.trim().length > 0 &&\n /^https:\\/\\//.test(record.canonicalUrl) &&\n typeof record.licenseEvidence.state === 'string'\n );\n}\n\n/**\n * Protects catalog state from optimistic completion and malformed provider\n * data. An unavailable feed stays explicitly incomplete and resumable.\n */\nexport class AuthorizedCatalogFeedAdapter implements CatalogSyncAdapter {\n constructor(\n private readonly providerId: HearthCatalogProviderId,\n private readonly feed?: AuthorizedCatalogFeed,\n ) {}\n\n async enumerate(input: {\n cursor?: string;\n checkpoint: CatalogSyncCheckpoint;\n }): Promise<CatalogSyncPage> {\n if (!this.feed) return unavailablePage(this.providerId);\n if (\n this.feed.providerId !== this.providerId ||\n this.feed.termsAccepted !== true ||\n !/^https:\\/\\//.test(this.feed.metadataFeedUrl)\n )\n return unavailablePage(this.providerId);\n\n try {\n const page = await this.feed.enumerate(input);\n const malformed = page.records.filter(\n (record) => !validRecord(this.providerId, record),\n );\n if (malformed.length) {\n return {\n records: page.records.filter((record) =>\n validRecord(this.providerId, record),\n ),\n complete: false,\n nextCursor: input.cursor,\n exclusions: [\n ...(page.exclusions ?? []),\n {\n cursor: input.cursor,\n code: 'invalid_provider_metadata',\n message: `${malformed.length} provider records lack required stable metadata or license evidence.`,\n },\n ],\n };\n }\n if (page.complete && page.nextCursor)\n return {\n records: page.records,\n complete: false,\n nextCursor: page.nextCursor,\n exclusions: [\n ...(page.exclusions ?? []),\n {\n cursor: input.cursor,\n code: 'contradictory_terminal_page',\n message:\n 'A terminal provider page cannot also declare a next cursor.',\n },\n ],\n };\n return page;\n } catch (error) {\n return {\n records: [],\n complete: false,\n nextCursor: input.cursor,\n exclusions: [\n {\n cursor: input.cursor,\n code: 'provider_feed_failed',\n message:\n error instanceof Error\n ? error.message\n : 'Provider metadata feed failed without an error message.',\n },\n ],\n };\n }\n }\n}\n\nexport function createIllustrativeMathematicsAdapter(\n feed?: AuthorizedCatalogFeed,\n): CatalogSyncAdapter {\n return new AuthorizedCatalogFeedAdapter('illustrative-mathematics', feed);\n}\n\n/** Enumerates only the public K-5 course index, never claims all IM coverage. */\nexport function createPublicIllustrativeMathematicsK5Adapter(\n config: PublicIllustrativeMathematicsK5Config,\n): CatalogSyncAdapter {\n return {\n async enumerate(input) {\n if (input.cursor)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n cursor: input.cursor,\n code: 'unsupported_provider_cursor',\n message: 'The public IM K-5 index has no pagination cursor.',\n },\n ],\n };\n const url = httpsUrl(\n config.indexUrl ?? 'https://im.kendallhunt.com/k5/curriculum.html',\n 'Illustrative Mathematics',\n );\n const result = await fetchMetadata(\n config.fetch,\n url,\n 'text/html,application/xhtml+xml',\n config.timeoutMs,\n );\n if ('complete' in result) return result;\n try {\n return {\n records: parseIllustrativeMathematicsK5Index(\n result.body,\n result.revision,\n url,\n ),\n complete: false,\n policyExclusions: [\n {\n code: 'partial_provider_coverage',\n message:\n 'The public IM K-5 index is not a complete IM catalog feed.',\n },\n ],\n };\n } catch (error) {\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_metadata_invalid',\n message:\n error instanceof Error\n ? error.message\n : 'IM metadata parsing failed.',\n },\n ],\n };\n }\n },\n };\n}\n\nexport function createCk12Adapter(\n feed?: AuthorizedCatalogFeed,\n): CatalogSyncAdapter {\n return new AuthorizedCatalogFeedAdapter('ck12', feed);\n}\n\nexport function createOerCommonsAdapter(\n feed?: AuthorizedCatalogFeed,\n): CatalogSyncAdapter {\n return new AuthorizedCatalogFeedAdapter('oer-commons', feed);\n}\n\n/** Parses an ISKME/OER Commons-approved RSS or Dublin Core collection feed. */\nexport function createOerCommonsRssAdapter(\n config: OerCommonsRssConfig,\n): CatalogSyncAdapter {\n return {\n async enumerate(input) {\n if (input.cursor)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n cursor: input.cursor,\n code: 'unsupported_provider_cursor',\n message:\n 'Configured OER RSS/DC feeds are snapshot feeds without cursors.',\n },\n ],\n };\n const url = httpsUrl(config.feedUrl, 'OER Commons');\n const result = await fetchMetadata(\n config.fetch,\n url,\n 'application/rss+xml, application/xml, text/xml',\n config.timeoutMs,\n );\n if ('complete' in result) return result;\n try {\n return {\n records: parseOerCommonsRssFeed(result.body, result.revision),\n complete: config.terminalSnapshot === true,\n ...(config.terminalSnapshot === true\n ? {}\n : {\n policyExclusions: [\n {\n code: 'partial_provider_coverage',\n message:\n 'Configured OER feed scope has not been confirmed as terminal.',\n },\n ],\n }),\n };\n } catch (error) {\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_metadata_invalid',\n message:\n error instanceof Error\n ? error.message\n : 'OER RSS/DC parsing failed.',\n },\n ],\n };\n }\n },\n };\n}\n","import type {\n SourceImportRequest,\n SourceImportResult,\n SourceImportService,\n} from './source-import-service.js';\n\nexport type EasyPeasyGrade4Variant =\n | 'core'\n | 'shared-theme-choice'\n | 'once-weekly';\n\n/**\n * Official source pointers only. Theme rows represent a family choice and are\n * never automatically combined into an enrollment.\n */\nexport interface EasyPeasyGrade4Course {\n courseRef: string;\n title: string;\n pageUrl: string;\n subject: string;\n variant: EasyPeasyGrade4Variant;\n enrollmentMode: 'individual' | 'choose-one-theme';\n}\nexport interface EasyPeasyGrade4Theme {\n themeId: 'theme-1' | 'theme-2' | 'theme-3' | 'theme-4';\n title: string;\n courses: readonly EasyPeasyGrade4Course[];\n}\nexport interface EasyPeasyThemeImportResult {\n themeId: EasyPeasyGrade4Theme['themeId'];\n courseIds: readonly string[];\n}\n\nexport const easyPeasyGrade4Courses: readonly EasyPeasyGrade4Course[] = [\n {\n courseRef: 'grade-4-math',\n title: 'Math 4',\n subject: 'math',\n pageUrl: 'https://allinonehomeschool.com/ep-math-4/',\n variant: 'core',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'grade-4-reading',\n title: 'Reading 4',\n subject: 'reading',\n pageUrl: 'https://allinonehomeschool.com/reading-4/',\n variant: 'core',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'grade-4-language-arts',\n title: 'Language Arts 4',\n subject: 'language-arts',\n pageUrl: 'https://allinonehomeschool.com/language-arts-4/',\n variant: 'core',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'lower-elementary-theme-1',\n title: 'Theme 1: biology and ancient history',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-theme-2',\n title: 'Theme 2: zoology and early American history',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-theme-3',\n title: 'Theme 3: earth science and geography/cultures',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-theme-4',\n title: 'Theme 4: physics/chemistry and modern history',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-computer',\n title: 'Computer: Level 4 placement',\n subject: 'computer',\n pageUrl: 'https://allinonehomeschool.com/computer-fourth-level/',\n variant: 'once-weekly',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'lower-elementary-thinking',\n title: 'Thinking',\n subject: 'thinking',\n pageUrl: 'https://allinonehomeschool.com/thinking-levels-4-6/',\n variant: 'once-weekly',\n enrollmentMode: 'individual',\n },\n];\n\nexport function grade4Courses(\n variant?: EasyPeasyGrade4Variant,\n): readonly EasyPeasyGrade4Course[] {\n return variant\n ? easyPeasyGrade4Courses.filter((course) => course.variant === variant)\n : easyPeasyGrade4Courses;\n}\n\nfunction themeCourse(\n themeId: EasyPeasyGrade4Theme['themeId'],\n subject: string,\n title: string,\n pageUrl: string,\n): EasyPeasyGrade4Course {\n return {\n courseRef: `${themeId}-${subject}`,\n title,\n subject,\n pageUrl,\n variant: 'shared-theme-choice',\n enrollmentMode: 'individual',\n };\n}\n\n/**\n * Theme constituents are the official lower-level course pointers linked by\n * the source's themes and individual-course pages. A caller imports one theme,\n * never all four rotations.\n */\nexport const easyPeasyGrade4Themes: readonly EasyPeasyGrade4Theme[] = [\n {\n themeId: 'theme-1',\n title: 'Theme 1: biology and ancient history',\n courses: [\n themeCourse(\n 'theme-1',\n 'science',\n 'Science — Biology',\n 'https://allinonehomeschool.com/science-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'history',\n 'History — Ancient',\n 'https://allinonehomeschool.com/history-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'bible',\n 'Bible — Old Testament',\n 'https://allinonehomeschool.com/bible-year-1-2/',\n ),\n themeCourse(\n 'theme-1',\n 'art',\n 'Art — Ancient',\n 'https://allinonehomeschool.com/art-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'music',\n 'Music — Ancient',\n 'https://allinonehomeschool.com/1908-wright-brothers-flight-demonstration/music-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'pe-health',\n 'PE/Health — Strong and Healthy',\n 'https://allinonehomeschool.com/pehealth-odds/',\n ),\n ],\n },\n {\n themeId: 'theme-2',\n title: 'Theme 2: zoology and early American history',\n courses: [\n themeCourse(\n 'theme-2',\n 'science',\n 'Science — Zoology',\n 'https://allinonehomeschool.com/zoology/',\n ),\n themeCourse(\n 'theme-2',\n 'history',\n 'History — Early American',\n 'https://allinonehomeschool.com/early-american-history/',\n ),\n themeCourse(\n 'theme-2',\n 'bible',\n 'Bible — New Testament',\n 'https://allinonehomeschool.com/bible-newtestament/',\n ),\n themeCourse(\n 'theme-2',\n 'art',\n 'Art — Early American',\n 'https://allinonehomeschool.com/art-early-american/',\n ),\n themeCourse(\n 'theme-2',\n 'music',\n 'Music — Early American',\n 'https://allinonehomeschool.com/music-year-2/',\n ),\n themeCourse(\n 'theme-2',\n 'pe-health',\n 'PE/Health — Exercise and Nutrition',\n 'https://allinonehomeschool.com/pe-health/',\n ),\n ],\n },\n {\n themeId: 'theme-3',\n title: 'Theme 3: earth science and geography/cultures',\n courses: [\n themeCourse(\n 'theme-3',\n 'science',\n 'Science — Earth Science',\n 'https://allinonehomeschool.com/science-earth-science/',\n ),\n themeCourse(\n 'theme-3',\n 'history',\n 'History — Geography and Cultures',\n 'https://allinonehomeschool.com/geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'bible',\n 'Bible — Poetry',\n 'https://allinonehomeschool.com/bible-geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'art',\n 'Art — Geography and Cultures',\n 'https://allinonehomeschool.com/art-geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'music',\n 'Music — Geography and Cultures',\n 'https://allinonehomeschool.com/individual-courses-of-study/music-geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'pe-health',\n 'PE/Health — Strong and Healthy',\n 'https://allinonehomeschool.com/pehealth-odds/',\n ),\n ],\n },\n {\n themeId: 'theme-4',\n title: 'Theme 4: physics/chemistry and modern history',\n courses: [\n themeCourse(\n 'theme-4',\n 'science',\n 'Science — Physics and Chemistry',\n 'https://allinonehomeschool.com/science-year-4/',\n ),\n themeCourse(\n 'theme-4',\n 'history',\n 'History — Modern',\n 'https://allinonehomeschool.com/history-year-4/',\n ),\n themeCourse(\n 'theme-4',\n 'bible',\n 'Bible — Prophets',\n 'https://allinonehomeschool.com/bible/',\n ),\n themeCourse(\n 'theme-4',\n 'art',\n 'Art — Modern',\n 'https://allinonehomeschool.com/art-year-4/',\n ),\n themeCourse(\n 'theme-4',\n 'music',\n 'Music — Modern',\n 'https://allinonehomeschool.com/music/',\n ),\n themeCourse(\n 'theme-4',\n 'pe-health',\n 'PE/Health — Exercise and Nutrition',\n 'https://allinonehomeschool.com/pe-health/',\n ),\n ],\n },\n];\n\nexport function grade4Theme(\n themeId: EasyPeasyGrade4Theme['themeId'],\n): EasyPeasyGrade4Theme {\n const theme = easyPeasyGrade4Themes.find(\n (candidate) => candidate.themeId === themeId,\n );\n if (!theme) throw new Error('Unknown Easy Peasy Grade 4 theme.');\n return theme;\n}\n\n/** Calls the public pointer-only importer; it never fetches packets or lesson bodies. */\nexport async function importEasyPeasyGrade4Course(\n service: Pick<SourceImportService, 'importCourse'>,\n request: Omit<SourceImportRequest, 'courseRef' | 'pageUrl'> & {\n courseRef: string;\n },\n): Promise<SourceImportResult> {\n const course = easyPeasyGrade4Courses.find(\n (candidate) => candidate.courseRef === request.courseRef,\n );\n if (!course) throw new Error('Unknown Easy Peasy Grade 4 course reference.');\n if (course.enrollmentMode === 'choose-one-theme')\n throw new Error(\n 'Theme choices are catalog pointers; select an official constituent course before importing lessons.',\n );\n return service.importCourse({\n ...request,\n pageUrl: course.pageUrl,\n subject: course.subject,\n });\n}\n\nexport async function importEasyPeasyGrade4Theme(\n service: Pick<SourceImportService, 'importCourse'>,\n request: Omit<SourceImportRequest, 'courseRef' | 'pageUrl'> & {\n themeId: EasyPeasyGrade4Theme['themeId'];\n },\n): Promise<EasyPeasyThemeImportResult> {\n const theme = grade4Theme(request.themeId);\n const results = await Promise.all(\n theme.courses.map((course) =>\n service.importCourse({\n ...request,\n courseRef: course.courseRef,\n pageUrl: course.pageUrl,\n subject: course.subject,\n }),\n ),\n );\n return {\n themeId: theme.themeId,\n courseIds: results.map((result) => result.courseId),\n };\n}\n","import { SmrtRecipe } from '@happyvertical/smrt-core';\nimport { Course, CourseSection, Lesson } from './catalog.js';\nimport { Curriculum, Enrollment, Learner, LessonProgress } from './learners.js';\nimport { LessonAsset } from './lesson-assets.js';\n\nexport class EducationCatalogRecipe extends SmrtRecipe {\n static id = 'education.catalog';\n static help = './education-catalog.recipe.md';\n static label = 'Course catalog';\n static summary =\n 'Organize courses, sections, lessons, and their authorized learning materials.';\n static synonyms = ['courses', 'lessons', 'curriculum catalog'];\n static section = {\n id: 'education',\n label: 'Education',\n icon: 'folder',\n description: 'Courses and lessons for learning.',\n };\n static models = [Course, CourseSection, Lesson, LessonAsset];\n static runtime = 'both' as const;\n static nav = [\n {\n label: 'Courses',\n model: Course,\n icon: 'folder',\n description: 'Courses available to this family.',\n noun: 'course',\n },\n ];\n}\n\n/** Metadata for host composition; never grants generated CRUD authority. */\nexport class EducationLearnerRecipe extends SmrtRecipe {\n static id = 'education.learner';\n static help = './education-learner.recipe.md';\n static label = 'Learners';\n static summary =\n 'Plan learner curricula and retain enrollment-scoped progress.';\n static synonyms = ['learners', 'enrollments', 'learning progress'];\n static section = {\n id: 'education',\n label: 'Education',\n icon: 'folder',\n description: 'Courses and lessons for learning.',\n };\n static models = [Learner, Curriculum, Enrollment, LessonProgress];\n static runtime = 'both' as const;\n static nav = [\n {\n label: 'Learners',\n model: Learner,\n icon: 'users',\n description: 'Authorized learners in this family.',\n noun: 'learner',\n },\n ];\n}\n","/** A pointer-only representation of an Easy Peasy lesson. */\nexport interface ParsedSourceLesson {\n day: number;\n title: string;\n externalRef: string;\n externalUrl: string;\n worksheet: boolean;\n printableUrl?: string;\n}\n\nexport interface ParsedSourceCourse {\n title: string;\n lessons: ParsedSourceLesson[];\n packetUrl?: string;\n}\n\nconst approvedHosts = new Set([\n 'allinonehomeschool.com',\n 'www.allinonehomeschool.com',\n]);\n\n/**\n * Resolve and constrain source URLs before either fetching or retaining them.\n * Easy Peasy links must remain HTTPS links to the source site; imported data\n * must never become an open redirect or a pointer to a third-party PDF.\n */\nexport function validateEasyPeasyUrl(value: string, baseUrl?: string): string {\n let url: URL;\n try {\n url = new URL(value, baseUrl);\n } catch {\n throw new Error('Easy Peasy URL is invalid.');\n }\n if (url.protocol !== 'https:' || url.port || !approvedHosts.has(url.hostname))\n throw new Error('Easy Peasy URL must use an approved HTTPS source host.');\n if (url.username || url.password)\n throw new Error('Easy Peasy URL must not include credentials.');\n return url.toString();\n}\n\ninterface HeadingMatch {\n index: number;\n end: number;\n text: string;\n /** The official daily container is authoritative even when it lacks a heading. */\n day?: number;\n fragment?: string;\n title?: string;\n containerEnd?: number;\n levelRange?: readonly [number, number];\n hasLessonMarker?: boolean;\n}\n\ninterface LinkMatch {\n href: string;\n text: string;\n}\n\nfunction decodeHtml(value: string): string {\n return value.replace(\n /&(#x[\\da-f]+|#\\d+|amp|apos|gt|lt|nbsp|quot);/gi,\n (entity) => {\n const named: Record<string, string> = {\n '&': '&',\n ''': \"'\",\n '>': '>',\n '<': '<',\n ' ': ' ',\n '"': '\"',\n };\n const lower = entity.toLowerCase();\n if (lower in named) return named[lower];\n const number = lower.startsWith('&#x')\n ? Number.parseInt(lower.slice(3, -1), 16)\n : Number.parseInt(lower.slice(2, -1), 10);\n return Number.isSafeInteger(number) && number <= 0x10ffff\n ? String.fromCodePoint(number)\n : entity;\n },\n );\n}\n\nfunction textContent(value: string): string {\n return decodeHtml(value.replace(/<[^>]*>/g, ' '))\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction attribute(attributes: string, name: string): string | undefined {\n const match = new RegExp(\n `(?:^|[\\\\t\\\\n\\\\f\\\\r ])${name}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n 'i',\n ).exec(attributes);\n return match?.[1] ?? match?.[2] ?? match?.[3];\n}\n\n/** Return the end of a div without mistaking a nested layout div for its end. */\nfunction closingDivEnd(html: string, start: number): number {\n const tags = /<\\/?div\\b[^>]*>/gi;\n tags.lastIndex = start;\n let depth = 1;\n for (let tag = tags.exec(html); tag; tag = tags.exec(html)) {\n if (/^<\\/div\\b/i.test(tag[0])) depth -= 1;\n else depth += 1;\n if (depth === 0) return tag.index + tag[0].length;\n }\n return start;\n}\n\nfunction lessonHeadings(html: string): HeadingMatch[] {\n const containers: HeadingMatch[] = [];\n const divs = /<div\\b([^>]*)>/gi;\n for (const match of html.matchAll(divs)) {\n const id = attribute(match[1], 'id');\n const marker = /^(day|week)(\\d+)$/i.exec(id ?? '');\n if (!marker) continue;\n const number = Number.parseInt(marker[2], 10);\n if (!Number.isSafeInteger(number) || number < 1)\n throw new Error(`Easy Peasy daily container is malformed: ${id}`);\n const weekly = marker[1].toLowerCase() === 'week';\n const index = match.index ?? 0;\n const end = index + match[0].length;\n const containerEnd = closingDivEnd(html, end);\n const body = html.slice(end, containerEnd);\n const level = /\\blevels?\\s+(\\d+)\\s*[-–]\\s*(\\d+)\\b/i.exec(textContent(body));\n containers.push({\n index,\n end,\n text: weekly ? `Week ${number}` : `Lesson ${number}`,\n day: number,\n fragment: `${weekly ? 'week' : 'day'}${number}`,\n ...(weekly ? { title: `Week ${number}` } : {}),\n containerEnd,\n ...(level\n ? {\n levelRange: [\n Number.parseInt(level[1], 10),\n Number.parseInt(level[2], 10),\n ] as const,\n }\n : {}),\n hasLessonMarker: new RegExp(\n `\\\\bLessons?\\\\s+${number}(?:\\\\D|$)`,\n 'i',\n ).test(textContent(body)),\n });\n }\n containers.sort((left, right) => left.index - right.index);\n const grade = 4;\n const gradeContainers = containers.filter(\n (container) =>\n !container.levelRange ||\n (container.levelRange[0] <= grade && grade <= container.levelRange[1]),\n );\n const selectedContainers: HeadingMatch[] = [];\n for (const container of gradeContainers) {\n const peers = gradeContainers.filter(\n (candidate) => candidate.day === container.day,\n );\n if (peers[0] !== container) continue;\n if (peers.length === 1) selectedContainers.push(container);\n else {\n const marked = peers.filter((candidate) => candidate.hasLessonMarker);\n if (marked.length !== 1)\n throw new Error(\n `Easy Peasy lesson day is invalid or duplicated: ${container.day}`,\n );\n selectedContainers.push(marked[0]);\n }\n }\n const isInDailyContainer = (index: number): boolean =>\n selectedContainers.some(\n (container) =>\n container.index <= index &&\n index < (container.containerEnd ?? container.end),\n );\n const isDetachedDailyMarker = (index: number, text: string): boolean => {\n const day = /^lesson\\s+(\\d+)\\b/i.exec(text)?.[1];\n if (!day) return false;\n return selectedContainers.some(\n (container) =>\n container.day === Number.parseInt(day, 10) &&\n (container.containerEnd ?? container.end) <= index &&\n !textContent(\n html.slice(container.containerEnd ?? container.end, index),\n ),\n );\n };\n\n const matches: HeadingMatch[] = [...selectedContainers];\n // Some older official pages use a bare layout div for each lesson instead of\n // a day id. Accept only a direct bold child: a nested generic block remains\n // ambiguous and is rejected below.\n const directDivLessons =\n /<div\\b[^>]*>\\s*<(?:strong|b)\\b[^>]*>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/gi;\n const bareDivMarkers: HeadingMatch[] = [];\n for (const match of html.matchAll(directDivLessons)) {\n if (isInDailyContainer(match.index ?? 0)) continue;\n const text = textContent(match[1]);\n if (!/^lesson\\b/i.test(text)) continue;\n if (isDetachedDailyMarker(match.index ?? 0, text)) continue;\n bareDivMarkers.push({\n index: match.index ?? 0,\n end: (match.index ?? 0) + match[0].length,\n text,\n });\n }\n // A lone unlabelled div marker cannot establish a course structure. Older\n // Easy Peasy course pages use a sequence of these divs; accepting a single\n // marker would turn malformed refresh input into a partial import.\n if (bareDivMarkers.length > 1) matches.push(...bareDivMarkers);\n const weeks = /<(?:strong|b)\\b([^>]*)>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/gi;\n for (const match of html.matchAll(weeks)) {\n if (isInDailyContainer(match.index ?? 0)) continue;\n const id = attribute(match[1], 'id');\n const day = /^week(\\d+)$/i.exec(id ?? '')?.[1];\n const text = textContent(match[2]);\n if (!day || !/^week\\s+\\d+\\s*$/i.test(text)) continue;\n const number = Number.parseInt(day, 10);\n if (!Number.isSafeInteger(number) || number < 1)\n throw new Error(`Easy Peasy weekly marker is malformed: ${id}`);\n const statedMatch = /^week\\s+(\\d+)/i.exec(text);\n if (!statedMatch) continue;\n const stated = Number.parseInt(statedMatch[1], 10);\n if (stated !== number)\n throw new Error('Easy Peasy weekly container and marker disagree.');\n matches.push({\n index: match.index ?? 0,\n end: (match.index ?? 0) + match[0].length,\n text,\n day: number,\n fragment: `week${number}`,\n title: `Week ${number}`,\n });\n }\n const headings = /<h[1-6]\\b[^>]*>([\\s\\S]*?)<\\/h[1-6]\\s*>/gi;\n for (const match of html.matchAll(headings)) {\n if (isInDailyContainer(match.index ?? 0)) continue;\n matches.push({\n index: match.index ?? 0,\n end: (match.index ?? 0) + match[0].length,\n text: textContent(match[1]),\n });\n }\n const blocks = /<(p|li)\\b[^>]*>([\\s\\S]*?)<\\/\\1\\s*>/gi;\n for (const block of html.matchAll(blocks)) {\n if (isInDailyContainer(block.index ?? 0)) continue;\n const bold = /<(?:strong|b)\\b[^>]*>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/i.exec(\n block[2],\n );\n if (!bold) continue;\n const text = textContent(bold[1]);\n if (!/^lesson\\b/i.test(text)) continue;\n if (isDetachedDailyMarker(block.index ?? 0, text)) continue;\n const boldIndex = (block.index ?? 0) + block[0].indexOf(bold[0]);\n matches.push({\n index: block.index ?? 0,\n end: boldIndex + bold[0].length,\n text,\n });\n }\n const sorted = matches.sort((left, right) => left.index - right.index);\n const boldMarkers = /<(strong|b)\\b[^>]*>([\\s\\S]*?)<\\/\\1\\s*>/gi;\n for (const marker of html.matchAll(boldMarkers)) {\n if (!/^lesson\\b/i.test(textContent(marker[2]))) continue;\n const index = marker.index ?? 0;\n const end = index + marker[0].length;\n const accountedFor =\n isInDailyContainer(index) ||\n isDetachedDailyMarker(index, textContent(marker[2])) ||\n sorted.some(\n (heading) =>\n /^lesson\\b/i.test(heading.text) &&\n (heading.index === index ||\n (heading.index <= index && end <= heading.end)),\n );\n if (!accountedFor)\n throw new Error('Easy Peasy lesson marker layout is unsupported.');\n }\n return sorted;\n}\n\nfunction lessonMarkerText(segment: string): string | undefined {\n const markers = /<(?:strong|b)\\b[^>]*>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/gi;\n for (const marker of segment.matchAll(markers)) {\n const text = textContent(marker[1]);\n if (/^lesson\\b/i.test(text)) return text;\n }\n return undefined;\n}\n\nfunction parseLessonMarker(value: string): { day: number; worksheet: boolean } {\n const match = /^lesson\\s+(\\d+)\\s*(\\*|\\(\\*\\))?(?:\\s*\\(|\\s*$)/i.exec(value);\n if (!match)\n throw new Error(`Easy Peasy lesson heading is malformed: ${value}`);\n return {\n day: Number.parseInt(match[1], 10),\n worksheet: match[2] === '*' || match[2] === '(*)',\n };\n}\n\n/** Reject incomplete lesson markup before the tolerant extractors can skip it. */\nfunction rejectUnterminatedLessonTags(html: string): void {\n const openings = /<(h[1-6]|strong|b)\\b[^>]*>\\s*(?:<[^>]*>\\s*)*lesson\\b/gi;\n const candidates = [...html.matchAll(openings)];\n for (let index = 0; index < candidates.length; index += 1) {\n const opening = candidates[index];\n const tag = opening[1].toLowerCase();\n const afterOpening = (opening.index ?? 0) + opening[0].length;\n const closing = new RegExp(`<\\\\/${tag}\\\\s*>`, 'i').exec(\n html.slice(afterOpening),\n );\n const closingIndex = closing\n ? afterOpening + (closing.index ?? 0)\n : Number.POSITIVE_INFINITY;\n const nextOpening =\n candidates[index + 1]?.index ?? Number.POSITIVE_INFINITY;\n if (closingIndex > nextOpening || !Number.isFinite(closingIndex))\n throw new Error(\n 'Easy Peasy lesson heading is unterminated or mismatched.',\n );\n }\n}\n\nfunction links(html: string): LinkMatch[] {\n const result: LinkMatch[] = [];\n const anchors = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a\\s*>/gi;\n for (const match of html.matchAll(anchors)) {\n const href = attribute(match[1], 'href');\n if (href)\n result.push({ href: decodeHtml(href), text: textContent(match[2]) });\n }\n return result;\n}\n\nfunction isPdfLink(link: LinkMatch): boolean {\n return /\\.pdf(?:[?#]|$)/i.test(link.href);\n}\n\nfunction isAnswerLink(link: LinkMatch): boolean {\n return /\\banswers?(?:\\s+key)?\\b/i.test(`${link.href} ${link.text}`);\n}\n\nfunction isPacketLink(link: LinkMatch): boolean {\n return /\\b(?:packet|whole course|complete course)\\b/i.test(link.text);\n}\n\nfunction isSupplementalPdfLink(link: LinkMatch): boolean {\n return /\\b(?:directions?|instructions?)\\b/i.test(`${link.href} ${link.text}`);\n}\n\nfunction courseTitle(html: string): string {\n const entryTitle =\n /<h1\\b(?=[^>]*\\bclass=(?:\"[^\"]*\\bentry-title\\b[^\"]*\"|'[^']*\\bentry-title\\b[^']*'|[^\\s>]*\\bentry-title\\b))[^>]*>([\\s\\S]*?)<\\/h1\\s*>/i.exec(\n html,\n )?.[1];\n const h1 = /<h1\\b[^>]*>([\\s\\S]*?)<\\/h1\\s*>/i.exec(html)?.[1];\n const title = /<title\\b[^>]*>([\\s\\S]*?)<\\/title\\s*>/i.exec(html)?.[1];\n const value = textContent(entryTitle ?? h1 ?? title ?? '');\n if (!value) throw new Error('Easy Peasy page has no title.');\n return value;\n}\n\nfunction isApprovedSourcePdf(link: LinkMatch, pageUrl: string): boolean {\n try {\n sourcePdf(link, pageUrl);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction sourcePdf(link: LinkMatch, pageUrl: string): string {\n const url = validateEasyPeasyUrl(link.href, pageUrl);\n const parsed = new URL(url);\n if (!parsed.pathname.startsWith('/wp-content/'))\n throw new Error('Easy Peasy PDF must be hosted under wp-content.');\n if (!/\\.pdf$/i.test(parsed.pathname))\n throw new Error('Easy Peasy printable URL must be a PDF.');\n return url;\n}\n\nfunction canonicalWorksheetLink(\n links: LinkMatch[],\n pageUrl: string,\n): LinkMatch[] {\n if (links.length < 2) return links;\n const stem = (link: LinkMatch): string => {\n const pathname = new URL(link.href, pageUrl).pathname;\n return pathname\n .slice(pathname.lastIndexOf('/') + 1)\n .replace(/\\.pdf$/i, '')\n .toLowerCase();\n };\n const escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const canonical = links.filter((candidate) => {\n const candidateStem = stem(candidate);\n const variant = new RegExp(`^${escapeRegex(candidateStem)}(?:[-_ ]?\\\\d+)$`);\n return links.every(\n (link) => link === candidate || variant.test(stem(link)),\n );\n });\n // Multi-page worksheet variants retain the course-day pointer and one\n // canonical printable URL; unrelated multiple PDFs remain a hard failure.\n return canonical.length === 1 ? canonical : links;\n}\n\ninterface PrintablePointer {\n printableUrl?: string;\n hasSourcePdf: boolean;\n}\n\nfunction printableFor(\n segment: string,\n pageUrl: string,\n day: number,\n): PrintablePointer {\n const pdfLinks = links(segment)\n .filter(isPdfLink)\n .filter(\n (link) =>\n !isAnswerLink(link) &&\n !isPacketLink(link) &&\n !isSupplementalPdfLink(link) &&\n isApprovedSourcePdf(link, pageUrl),\n );\n const ownDay = new RegExp(`(?:day|lesson)[\\\\s_-]*${day}(?:\\\\D|$)`, 'i');\n const dayLinks = pdfLinks.filter((link) =>\n ownDay.test(`${link.href} ${link.text}`),\n );\n const candidates = canonicalWorksheetLink(\n dayLinks.length ? dayLinks : pdfLinks,\n pageUrl,\n );\n if (candidates.length > 1)\n // The course page remains the lesson pointer; this bounded model deliberately\n // retains no printable when the source publishes multiple source PDFs.\n return { hasSourcePdf: true };\n return candidates[0]\n ? { printableUrl: sourcePdf(candidates[0], pageUrl), hasSourcePdf: true }\n : { hasSourcePdf: false };\n}\n\nfunction packetFor(html: string, pageUrl: string): string | undefined {\n const packets = links(html).filter(\n (link) => isPdfLink(link) && !isAnswerLink(link) && isPacketLink(link),\n );\n if (packets.length > 1)\n throw new Error('Easy Peasy page has ambiguous packet PDFs.');\n return packets[0] ? sourcePdf(packets[0], pageUrl) : undefined;\n}\n\n/** Parse only the course title, day pointers, and source-hosted printable links. */\nexport function parseEasyPeasyPage(\n html: string,\n pageUrl: string,\n): ParsedSourceCourse {\n const normalizedPageUrl = validateEasyPeasyUrl(pageUrl);\n const source = html\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<(script|style)\\b[^>]*>[\\s\\S]*?<\\/\\1\\s*>/gi, '');\n rejectUnterminatedLessonTags(source);\n const title = courseTitle(source);\n const headings = lessonHeadings(source);\n const lessons: ParsedSourceLesson[] = [];\n const days = new Set<number>();\n\n for (let index = 0; index < headings.length; index += 1) {\n const heading = headings[index];\n if (heading.day === undefined && !/^lesson\\b/i.test(heading.text)) continue;\n const segment = source.slice(heading.end, headings[index + 1]?.index);\n const marker =\n heading.day === undefined ? heading.text : lessonMarkerText(segment);\n let parsedMarker: { day: number; worksheet: boolean } | undefined;\n if (marker) {\n try {\n parsedMarker = parseLessonMarker(marker);\n } catch (error) {\n // A source-controlled day/week container remains authoritative when it\n // includes a decorative nonnumeric \"Lesson\" label.\n if (heading.day === undefined) throw error;\n }\n }\n const day = heading.day ?? parsedMarker?.day;\n if (\n !day ||\n (heading.day !== undefined && parsedMarker && parsedMarker.day !== day)\n )\n throw new Error('Easy Peasy daily container and lesson marker disagree.');\n if (!Number.isSafeInteger(day) || day < 1 || days.has(day))\n throw new Error(`Easy Peasy lesson day is invalid or duplicated: ${day}`);\n days.add(day);\n const printable = printableFor(segment, normalizedPageUrl, day);\n // Some official daily containers put the worksheet asterisk on a child\n // activity label rather than the Lesson marker. A source-hosted printable\n // is sufficient evidence without retaining that activity text.\n const worksheet = parsedMarker?.worksheet ?? printable.hasSourcePdf;\n const page = new URL(normalizedPageUrl);\n page.hash = heading.fragment ?? `lesson-${day}`;\n lessons.push({\n day,\n title: heading.title ?? `Lesson ${day}`,\n externalRef: `lesson:${day}`,\n externalUrl: page.toString(),\n worksheet,\n ...(printable.printableUrl\n ? { printableUrl: printable.printableUrl }\n : {}),\n });\n }\n if (!lessons.length)\n throw new Error('Easy Peasy page has no lesson headings.');\n const packetUrl = packetFor(source, normalizedPageUrl);\n return { title, lessons, ...(packetUrl ? { packetUrl } : {}) };\n}\n","import {\n isEmbeddedDatabase,\n isPostgresDatabase,\n withEmbeddedWriteQueue,\n} from '@happyvertical/smrt-core';\nimport { getCurrentTenant } from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport { ExternalCourse } from './catalog.js';\nimport { CatalogAuthorizationError } from './catalog-service.js';\nimport {\n CourseCollection,\n CourseSectionCollection,\n ExternalCourseCollection,\n LessonCollection,\n ReadingCollection,\n WorksheetCollection,\n} from './collections.js';\nimport {\n type CourseSource,\n CourseSourceCollection,\n type SourceSharing,\n} from './course-source.js';\nimport {\n parseEasyPeasyPage,\n validateEasyPeasyUrl,\n} from './sources/easy-peasy-parser.js';\n\nexport interface SourceImportRequest {\n tenantId: string;\n actorUserId: string;\n sourceId: string;\n /** Host-stable identity, independent of the page's current URL. */\n courseRef: string;\n /** Optional trusted catalog classification retained on the tenant course. */\n subject?: string;\n pageUrl: string;\n destination: 'private' | 'group';\n}\nexport interface SourceImportAuthorization {\n action: 'education.source.import' | 'education.source.ensure';\n actorTenantId: string;\n actorUserId: string;\n sourceId: string;\n sourceSharing: SourceSharing;\n destination: 'private' | 'group';\n licenseEvidence: string;\n}\nexport type SourceImportAuthorizer = (\n request: SourceImportAuthorization,\n) => boolean | Promise<boolean>;\nexport interface EasyPeasyRegistration {\n /** Supplied by host configuration after its operator accepts the source terms. */\n termsAccepted: true;\n /** Must honor redirect:error and bound response size/time. Never fetch PDFs. */\n fetchPage: (\n url: string,\n options: { redirect: 'error' },\n ) => Promise<{ html: string; url: string }>;\n}\nexport interface SourceImportResult {\n courseId: string;\n lessonIds: string[];\n /** Source-hosted packet link, returned without fetching or persisting its content. */\n packetUrl?: string;\n}\nexport interface EnsureEasyPeasyCourseSourceRequest {\n tenantId: string;\n actorUserId: string;\n}\nexport interface EnsureEasyPeasyCourseSourceResult {\n sourceId: string;\n}\n\nasync function identity(...parts: string[]): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(\n JSON.stringify(['smrt.education.source.v1', ...parts]),\n ),\n );\n const hex = Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-5${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n\nasync function requireOwnedIdentity(\n db: DatabaseInterface,\n table: string,\n id: string,\n tenantId: string,\n): Promise<void> {\n // A filtered collection get cannot distinguish absence from a corrupt foreign\n // owner at our deterministic ID. Check only to deny; never return that row.\n if (\n (await db.get(table, { id })) &&\n !(await db.get(table, { id, tenant_id: tenantId }))\n )\n throw new CatalogAuthorizationError();\n}\n\nfunction retryable(error: unknown): boolean {\n let current = error;\n let contention = false;\n for (\n let depth = 0;\n depth < 5 && current && typeof current === 'object';\n depth++\n ) {\n const failure = current as {\n code?: unknown;\n cause?: unknown;\n connectionInvalidated?: boolean;\n };\n if (failure.connectionInvalidated) return false;\n contention ||= [\n 'SQLITE_BUSY',\n 'SQLITE_BUSY_SNAPSHOT',\n '40001',\n '40P01',\n ].includes(String(failure.code));\n current = failure.cause;\n }\n return contention;\n}\n\n/** Opt-in, pointer-only import. Host authorization defines family/group roles. */\nexport class SourceImportService {\n private easyPeasy?: Readonly<EasyPeasyRegistration>;\n constructor(\n private readonly db: DatabaseInterface,\n private readonly authorize: SourceImportAuthorizer,\n ) {}\n\n registerEasyPeasy(registration: EasyPeasyRegistration): void {\n if (\n registration.termsAccepted !== true ||\n typeof registration.fetchPage !== 'function'\n )\n throw new Error(\n 'Easy Peasy terms must be accepted by the host before registration.',\n );\n this.easyPeasy = Object.freeze({\n termsAccepted: true,\n fetchPage: registration.fetchPage,\n });\n }\n\n async ensureEasyPeasyCourseSource(\n input: EnsureEasyPeasyCourseSourceRequest,\n ): Promise<EnsureEasyPeasyCourseSourceResult> {\n const request = Object.freeze({ ...input });\n const active = getCurrentTenant();\n if (\n !request.tenantId?.trim() ||\n !request.actorUserId?.trim() ||\n active?.tenantId !== request.tenantId ||\n active.userId !== request.actorUserId ||\n active.superAdminBypass\n )\n throw new CatalogAuthorizationError();\n if (!this.easyPeasy)\n throw new Error('Easy Peasy is not registered by this host.');\n const sourceId = await identity(request.tenantId, 'easy-peasy');\n if (\n (await this.authorize({\n action: 'education.source.ensure',\n actorTenantId: request.tenantId,\n actorUserId: request.actorUserId,\n sourceId,\n sourceSharing: 'private',\n destination: 'private',\n licenseEvidence: '',\n })) !== true\n )\n throw new CatalogAuthorizationError();\n if (!this.db.transaction)\n throw new Error('Source provisioning requires real transactions.');\n const transaction = this.db.transaction;\n return withEmbeddedWriteQueue(\n this.db,\n isEmbeddedDatabase(this.db),\n async () => {\n for (let attempt = 0; ; attempt++) {\n try {\n return await transaction(async (tx) => {\n if (isPostgresDatabase(this.db))\n await tx.query(\n 'SELECT pg_advisory_xact_lock(hashtextextended($1, 0))',\n sourceId,\n );\n const sources = await CourseSourceCollection.create({ db: tx });\n const existing = await sources.get(sourceId);\n if (existing) {\n if (\n existing.tenantId !== request.tenantId ||\n existing.key !== 'easy-peasy' ||\n existing.kind !== 'adapter' ||\n existing.adapterKey !== 'easy-peasy' ||\n existing.sharing !== 'private'\n )\n throw new Error(\n 'Existing Easy Peasy source policy cannot be changed by provisioning.',\n );\n } else {\n await sources.create({\n id: sourceId,\n tenantId: request.tenantId,\n key: 'easy-peasy',\n name: 'Easy Peasy All-in-One Homeschool',\n kind: 'adapter',\n adapterKey: 'easy-peasy',\n sharing: 'private',\n });\n }\n return { sourceId };\n });\n } catch (error) {\n if (attempt >= 3 || !retryable(error)) throw error;\n await new Promise((resolve) =>\n setTimeout(resolve, 5 * 2 ** attempt),\n );\n }\n }\n },\n );\n }\n\n private actor(request: SourceImportRequest): void {\n const active = getCurrentTenant();\n if (\n !request.tenantId?.trim() ||\n !request.actorUserId?.trim() ||\n active?.tenantId !== request.tenantId ||\n active.userId !== request.actorUserId ||\n active.superAdminBypass\n )\n throw new CatalogAuthorizationError();\n if (request.destination !== 'private' && request.destination !== 'group')\n throw new Error(\n 'Only private-family or licensed-group destinations are supported.',\n );\n if (\n !request.sourceId?.trim() ||\n !request.courseRef?.trim() ||\n request.courseRef.length > 256 ||\n (request.subject !== undefined &&\n (!request.subject.trim() || request.subject.length > 256))\n )\n throw new Error('A source and stable course reference are required.');\n }\n\n private async source(\n db: DatabaseInterface,\n request: SourceImportRequest,\n ): Promise<CourseSource> {\n this.actor(request);\n const source = await (await CourseSourceCollection.create({ db })).get(\n request.sourceId,\n );\n if (!source || source.tenantId !== request.tenantId)\n throw new CatalogAuthorizationError();\n if (\n source.kind !== 'adapter' ||\n source.adapterKey !== 'easy-peasy' ||\n !['private', 'group', 'global'].includes(source.sharing)\n )\n throw new Error('Unsupported source policy.');\n const licenseEvidence = source.getConfig().licenseEvidence?.trim() ?? '';\n if (\n request.destination === 'group' &&\n (source.sharing === 'private' || !licenseEvidence)\n )\n throw new Error(\n 'Source sharing and explicit licensing evidence must permit group import.',\n );\n if (\n (await this.authorize({\n action: 'education.source.import',\n actorTenantId: request.tenantId,\n actorUserId: request.actorUserId,\n sourceId: request.sourceId,\n sourceSharing: source.sharing,\n destination: request.destination,\n licenseEvidence,\n })) !== true\n )\n throw new CatalogAuthorizationError();\n this.actor(request);\n return source;\n }\n\n async importCourse(input: SourceImportRequest): Promise<SourceImportResult> {\n // Snapshot caller input before any host callback can mutate it.\n const request = Object.freeze({ ...input });\n this.actor(request);\n const adapter = this.easyPeasy;\n if (!adapter) throw new Error('Easy Peasy is not registered by this host.');\n const registeredSource = await this.source(this.db, request);\n const pageUrl = validateEasyPeasyUrl(request.pageUrl);\n const response = await adapter.fetchPage(pageUrl, { redirect: 'error' });\n if (validateEasyPeasyUrl(response.url) !== pageUrl)\n throw new Error('Unexpected source redirect.');\n if (typeof response.html !== 'string' || response.html.length > 2_000_000)\n throw new Error('Invalid or oversized source page.');\n const parsed = parseEasyPeasyPage(response.html, pageUrl);\n const courseId = await identity(\n request.tenantId,\n String(registeredSource.id),\n request.courseRef,\n );\n return withEmbeddedWriteQueue(\n this.db,\n isEmbeddedDatabase(this.db),\n async () => {\n if (!this.db.transaction)\n throw new Error('Source imports require real transactions.');\n for (let attempt = 0; ; attempt++) {\n try {\n return await this.db.transaction(async (tx) => {\n if (isPostgresDatabase(this.db))\n await tx.query(\n 'SELECT pg_advisory_xact_lock(hashtextextended($1, 0))',\n courseId,\n );\n const source = await this.source(tx, request);\n const courses = await ExternalCourseCollection.create({ db: tx });\n const sections = await CourseSectionCollection.create({ db: tx });\n const lessons = await LessonCollection.create({ db: tx });\n const readings = await ReadingCollection.create({ db: tx });\n const worksheets = await WorksheetCollection.create({ db: tx });\n await requireOwnedIdentity(\n tx,\n 'courses',\n courseId,\n request.tenantId,\n );\n const licenseKind =\n request.destination === 'private'\n ? 'personal-use-copy'\n : 'licensed-for-sharing';\n const existing = await (\n await CourseCollection.create({ db: tx })\n ).get(courseId);\n if (\n existing &&\n (!(existing instanceof ExternalCourse) ||\n existing.tenantId !== request.tenantId ||\n existing.sourceKey !== source.key ||\n existing.sourceRef !== request.courseRef ||\n existing.licenseKind !== licenseKind)\n )\n throw new Error(\n 'Existing course ownership, source, or license cannot be changed by import.',\n );\n if (existing) {\n existing.title = parsed.title;\n existing.sourceUrl = pageUrl;\n if (request.subject) existing.subject = request.subject.trim();\n await existing.save();\n } else {\n await courses.create({\n id: courseId,\n tenantId: request.tenantId,\n title: parsed.title,\n subject: request.subject?.trim() ?? '',\n sourceKey: source.key,\n sourceRef: request.courseRef,\n sourceUrl: pageUrl,\n licenseKind,\n licenseNote: source.getConfig().licenseEvidence ?? '',\n status: 'draft',\n });\n }\n const sectionId = await identity(courseId, 'lessons');\n await requireOwnedIdentity(\n tx,\n 'course_sections',\n sectionId,\n request.tenantId,\n );\n const section = await sections.get(sectionId);\n if (section) {\n if (\n section.tenantId !== request.tenantId ||\n section.courseId !== courseId\n )\n throw new Error(\n 'Existing section ownership cannot be changed by import.',\n );\n } else {\n await sections.create({\n id: sectionId,\n tenantId: request.tenantId,\n courseId,\n title: 'Lessons',\n sortOrder: 0,\n });\n }\n const lessonIds: string[] = [];\n for (const item of parsed.lessons) {\n const id = await identity(courseId, item.externalRef);\n await requireOwnedIdentity(tx, 'lessons', id, request.tenantId);\n const lesson = await lessons.get(id);\n if (lesson) {\n if (\n lesson.tenantId !== request.tenantId ||\n lesson.sectionId !== sectionId ||\n lesson.externalRef !== item.externalRef ||\n 'printableUrl' in lesson !== item.worksheet\n )\n throw new Error(\n 'Existing lesson ownership or kind cannot be changed by import.',\n );\n lesson.title = item.title;\n lesson.externalUrl = item.externalUrl;\n if ('printableUrl' in lesson)\n lesson.printableUrl = item.printableUrl ?? '';\n await lesson.save();\n } else {\n await (item.worksheet ? worksheets : readings).create({\n id,\n tenantId: request.tenantId,\n sectionId,\n title: item.title,\n externalRef: item.externalRef,\n externalUrl: item.externalUrl,\n sortOrder: item.day,\n ...(item.worksheet\n ? { printableUrl: item.printableUrl ?? '' }\n : {}),\n });\n }\n lessonIds.push(id);\n }\n return {\n courseId,\n lessonIds,\n ...(parsed.packetUrl ? { packetUrl: parsed.packetUrl } : {}),\n };\n });\n } catch (error) {\n if (attempt >= 3 || !retryable(error)) throw error;\n await new Promise((resolve) =>\n setTimeout(resolve, 5 * 2 ** attempt),\n );\n }\n }\n },\n );\n }\n}\n","import type {\n DriveAcquisition,\n DriveAcquisitionOptions,\n DriveFileMetadata,\n DriveMetadataPage,\n DriveMetadataPageOptions,\n GoogleDriveProvider,\n} from '@happyvertical/files';\nimport type {\n CatalogAcquireAdapter,\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncPage,\n} from '../catalog-contracts.js';\n\nexport type {\n DriveAcquisition,\n DriveAcquisitionOptions,\n DriveFileMetadata,\n DriveMetadataPage,\n DriveMetadataPageOptions,\n};\n\n/**\n * Metadata-only Google Drive curriculum discovery.\n *\n * This module deliberately accepts the public @happyvertical/files Drive\n * surface as a port. Hosts construct that SDK provider with their own\n * application credentials and pass it here; neither discovery records nor\n * checkpoints contain credentials or downloaded content.\n */\n\nexport const DRIVE_CURRICULUM_SEED_ROOTS = [\n {\n id: '1K_au1upSRuakX55PF3aZzQLHWI70KwZd',\n title: 'Carnival of Collisions (Contact Forces)',\n },\n {\n id: '1N1xFJ2omm-M1TuAxDOXQxZndkw70-KxM',\n title: 'Mission Maglev (Electric and Magnetic Forces)',\n },\n {\n id: '1v0LXs7iky2R4FsiqZkWOjWyJmRu-aVIa',\n title: 'Rocks vs. Big Rigs, Unit-Wide View',\n },\n {\n id: '1sFDNXdw8q-xrhgy8HFAMELXUoqKgp9tu',\n title: 'Operation Space Jump (Gravitational Forces)',\n },\n] as const;\n\nconst GOOGLE_FOLDER_MIME = 'application/vnd.google-apps.folder';\n\n/** The adapter only uses public SDK methods, never a raw Google API client. */\nexport type GoogleDriveFilesClient = Pick<\n GoogleDriveProvider,\n 'listMetadataPage' | 'getMetadataById' | 'acquireById'\n>;\n\nexport interface DriveCatalogRecord extends CatalogSourceRecord {\n providerId: 'google-drive';\n checksum?: string;\n mimeType: string;\n size?: number;\n modifiedTime?: string;\n}\n\nexport interface DriveExclusion {\n stableId: string;\n reason:\n | 'missing-revision'\n | 'shortcut-target-inaccessible'\n | 'shortcut-target-outside-boundary'\n | 'shortcut-target-unsupported';\n}\n\ninterface FolderCursor {\n folderId: string;\n pageToken?: string;\n visibility: 'catalog' | 'teacher';\n}\n\n/** Serializable traversal state; persist it after every returned page. */\nexport interface DriveDiscoveryCheckpoint {\n version: 1;\n roots: string[];\n pendingFolders: FolderCursor[];\n visitedFolders: string[];\n}\n\nexport interface DriveDiscoveryPage {\n records: DriveCatalogRecord[];\n exclusions: DriveExclusion[];\n checkpoint?: DriveDiscoveryCheckpoint;\n complete: boolean;\n}\n\nexport interface DriveDiscoveryOptions {\n /** Defaults to the four owner-authorized curriculum roots. */\n roots?: readonly { id: string; title?: string }[];\n checkpoint?: DriveDiscoveryCheckpoint;\n pageSize?: number;\n /**\n * Exact Drive file IDs the trusted host has reviewed as learner-safe.\n * Folder IDs never grant visibility to their contents.\n */\n studentSafeFileIds?: readonly string[];\n /**\n * Shortcut targets are re-read by ID and must pass this host boundary check\n * before a folder can enter traversal. The secure default is deny.\n */\n authorizeShortcutTarget?: (\n target: DriveFileMetadata,\n context: { sourceFolderId: string; configuredRootIds: readonly string[] },\n ) => boolean | Promise<boolean>;\n}\n\nexport interface DriveSelectionAuthorization {\n stableId: string;\n revision: string;\n exportMimeType?: string;\n /** True only after the host's resource-level license policy allows use. */\n allowed: boolean;\n}\n\nexport interface PinnedDriveContent {\n stableId: string;\n revision?: string;\n checksum?: string;\n sha256: string;\n bytes: Buffer;\n exportMimeType?: string;\n}\n\nfunction uniqueRoots(\n roots: readonly { id: string; title?: string }[],\n): readonly { id: string; title?: string }[] {\n const seen = new Set<string>();\n return roots.filter((root) => {\n if (!root.id || seen.has(root.id)) return false;\n seen.add(root.id);\n return true;\n });\n}\n\nfunction assertPageSize(pageSize: number | undefined): number | undefined {\n if (pageSize === undefined) return undefined;\n if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > 1_000)\n throw new Error('Drive metadata page size must be between 1 and 1000.');\n return pageSize;\n}\n\nfunction classify(\n name: string,\n inherited: 'catalog' | 'teacher',\n): 'catalog' | 'teacher' {\n const normalized = name\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_./-]+/g, ' ')\n .toLowerCase();\n if (/\\b(answers?|solutions?|keys?)\\b/.test(normalized)) return 'teacher';\n if (/\\b(teachers?|educators?|instructors?|facilitators?)\\b/.test(normalized))\n return 'teacher';\n return inherited;\n}\n\nfunction isFolder(metadata: DriveFileMetadata): boolean {\n return metadata.mimeType === GOOGLE_FOLDER_MIME;\n}\n\nfunction nativeExportFormats(mimeType: string): string[] {\n if (\n [\n 'application/vnd.google-apps.document',\n 'application/vnd.google-apps.spreadsheet',\n 'application/vnd.google-apps.presentation',\n ].includes(mimeType)\n )\n return ['application/pdf'];\n return [mimeType];\n}\n\nfunction encodeCheckpoint(checkpoint: DriveDiscoveryCheckpoint): string {\n return Buffer.from(JSON.stringify(checkpoint)).toString('base64url');\n}\n\nfunction decodeCheckpoint(\n cursor: string | undefined,\n): DriveDiscoveryCheckpoint | undefined {\n if (!cursor) return undefined;\n try {\n const decoded: unknown = JSON.parse(\n Buffer.from(cursor, 'base64url').toString('utf8'),\n );\n if (!decoded || typeof decoded !== 'object')\n throw new Error('not an object');\n return decoded as DriveDiscoveryCheckpoint;\n } catch {\n throw new Error('Invalid Google Drive discovery cursor.');\n }\n}\n\nfunction toRecord(\n metadata: DriveFileMetadata,\n parentStableId: string,\n inheritedVisibility: 'catalog' | 'teacher',\n studentSafeFileIds: ReadonlySet<string>,\n): DriveCatalogRecord {\n const revision =\n metadata.revisionId ??\n metadata.md5Checksum ??\n metadata.modifiedTime?.toISOString();\n if (!revision)\n throw new Error(`Drive metadata for ${metadata.id} has no revision.`);\n return {\n providerId: 'google-drive',\n stableId: metadata.id,\n revision,\n ...(metadata.md5Checksum ? { checksum: metadata.md5Checksum } : {}),\n canonicalUrl: `https://drive.google.com/open?id=${encodeURIComponent(metadata.id)}`,\n title: metadata.name,\n resourceType: metadata.shortcutDetails\n ? 'shortcut'\n : isFolder(metadata)\n ? 'folder'\n : 'file',\n parentStableId,\n availableFormats: nativeExportFormats(metadata.mimeType),\n mimeType: metadata.mimeType,\n ...(metadata.size === undefined ? {} : { size: metadata.size }),\n ...(metadata.modifiedTime\n ? { modifiedTime: metadata.modifiedTime.toISOString() }\n : {}),\n visibility:\n !isFolder(metadata) &&\n !metadata.shortcutDetails &&\n studentSafeFileIds.has(metadata.id) &&\n classify(metadata.name, inheritedVisibility) === 'catalog'\n ? 'catalog'\n : 'teacher',\n licenseEvidence: { state: 'unknown' },\n };\n}\n\nfunction normalizedCheckpoint(\n options: DriveDiscoveryOptions,\n): DriveDiscoveryCheckpoint {\n const roots = uniqueRoots(options.roots ?? DRIVE_CURRICULUM_SEED_ROOTS).map(\n (root) => root.id,\n );\n if (!roots.length) throw new Error('At least one Drive root is required.');\n const checkpoint = options.checkpoint;\n if (!checkpoint) {\n return {\n version: 1,\n roots,\n pendingFolders: roots.map((folderId) => ({\n folderId,\n visibility: 'catalog',\n })),\n visitedFolders: [],\n };\n }\n if (\n checkpoint.version !== 1 ||\n checkpoint.roots.length !== roots.length ||\n checkpoint.roots.some((root, index) => root !== roots[index])\n )\n throw new Error('Drive checkpoint does not match configured roots.');\n return {\n version: 1,\n roots,\n pendingFolders: checkpoint.pendingFolders.map((folder) => ({ ...folder })),\n visitedFolders: [...checkpoint.visitedFolders],\n };\n}\n\n/**\n * One call reads at most one Drive metadata page. Repeated calls with the\n * returned checkpoint provide durable pagination without content acquisition.\n */\nexport class GoogleDriveCurriculumAdapter\n implements CatalogSyncAdapter, CatalogAcquireAdapter\n{\n static readonly providerId = 'google-drive';\n constructor(\n private readonly drive: GoogleDriveFilesClient,\n private readonly configuration: Omit<\n DriveDiscoveryOptions,\n 'checkpoint'\n > & {\n maxAcquisitionBytes?: number;\n } = {},\n ) {}\n\n async enumerate(input: { cursor?: string }): Promise<CatalogSyncPage> {\n const page = await this.discover({\n ...this.configuration,\n checkpoint: decodeCheckpoint(input.cursor),\n });\n return {\n records: page.records,\n complete: page.complete,\n ...(page.checkpoint\n ? { nextCursor: encodeCheckpoint(page.checkpoint) }\n : {}),\n // Definite boundary/format omissions are policy; unavailable metadata is\n // an operational failure and must not authorize terminal withdrawal.\n policyExclusions: page.exclusions\n .filter(\n (entry) =>\n entry.reason === 'shortcut-target-outside-boundary' ||\n entry.reason === 'shortcut-target-unsupported',\n )\n .map((entry) => ({\n code: entry.reason,\n message: `Google Drive resource ${entry.stableId} was excluded: ${entry.reason}.`,\n })),\n exclusions: page.exclusions\n .filter(\n (entry) =>\n entry.reason !== 'shortcut-target-outside-boundary' &&\n entry.reason !== 'shortcut-target-unsupported',\n )\n .map((entry) => ({\n code: entry.reason,\n message: `Google Drive resource ${entry.stableId} was excluded: ${entry.reason}.`,\n })),\n };\n }\n\n async discover(\n options: DriveDiscoveryOptions = {},\n ): Promise<DriveDiscoveryPage> {\n const checkpoint = normalizedCheckpoint(options);\n const pageSize = assertPageSize(options.pageSize);\n const current = checkpoint.pendingFolders.shift();\n if (!current) return { records: [], exclusions: [], complete: true };\n\n const page = await this.drive.listMetadataPage({\n folderId: current.folderId,\n ...(current.pageToken ? { pageToken: current.pageToken } : {}),\n ...(pageSize === undefined ? {} : { pageSize }),\n });\n const records: DriveCatalogRecord[] = [];\n const exclusions: DriveExclusion[] = [];\n const seenRecordIds = new Set<string>();\n const seenFolders = new Set(checkpoint.visitedFolders);\n seenFolders.add(current.folderId);\n\n const studentSafeFileIds = new Set(options.studentSafeFileIds ?? []);\n for (const entry of page.entries) {\n if (!entry.id || seenRecordIds.has(entry.id)) continue;\n seenRecordIds.add(entry.id);\n if (\n entry.shortcutDetails &&\n entry.shortcutDetails.targetMimeType !== GOOGLE_FOLDER_MIME\n ) {\n // A file shortcut does not establish that its target belongs under a\n // reviewed root or that the target's real parent is learner-safe.\n // Actual files encountered through trusted folder traversal remain\n // eligible for exact-ID allowlisting.\n exclusions.push({\n stableId: entry.shortcutDetails.targetId,\n reason: 'shortcut-target-unsupported',\n });\n continue;\n }\n const inheritedVisibility = classify(entry.name, current.visibility);\n try {\n records.push(\n toRecord(\n entry,\n current.folderId,\n inheritedVisibility,\n studentSafeFileIds,\n ),\n );\n } catch {\n exclusions.push({\n stableId: entry.id,\n reason: 'missing-revision',\n });\n continue;\n }\n const visibility = inheritedVisibility;\n if (entry.shortcutDetails) {\n await this.resolveShortcut(\n entry.shortcutDetails,\n current.folderId,\n visibility,\n checkpoint,\n seenFolders,\n options,\n exclusions,\n );\n } else if (isFolder(entry) && !seenFolders.has(entry.id)) {\n seenFolders.add(entry.id);\n checkpoint.pendingFolders.push({ folderId: entry.id, visibility });\n }\n }\n\n if (page.nextPageToken) {\n checkpoint.pendingFolders.unshift({\n ...current,\n pageToken: page.nextPageToken,\n });\n } else {\n seenFolders.add(current.folderId);\n }\n checkpoint.visitedFolders = [...seenFolders].sort();\n return {\n records,\n exclusions,\n ...(checkpoint.pendingFolders.length ? { checkpoint } : {}),\n complete: checkpoint.pendingFolders.length === 0,\n };\n }\n\n private async resolveShortcut(\n shortcut: NonNullable<DriveFileMetadata['shortcutDetails']>,\n sourceFolderId: string,\n inheritedVisibility: 'catalog' | 'teacher',\n checkpoint: DriveDiscoveryCheckpoint,\n seenFolders: Set<string>,\n options: DriveDiscoveryOptions,\n exclusions: DriveExclusion[],\n ): Promise<void> {\n if (shortcut.targetMimeType !== GOOGLE_FOLDER_MIME) {\n exclusions.push({\n stableId: shortcut.targetId,\n reason: 'shortcut-target-unsupported',\n });\n return;\n }\n let target: DriveFileMetadata;\n try {\n target = await this.drive.getMetadataById(shortcut.targetId);\n } catch {\n exclusions.push({\n stableId: shortcut.targetId,\n reason: 'shortcut-target-inaccessible',\n });\n return;\n }\n if (\n !isFolder(target) ||\n seenFolders.has(target.id) ||\n (await options.authorizeShortcutTarget?.(target, {\n sourceFolderId,\n configuredRootIds: checkpoint.roots,\n })) !== true\n ) {\n exclusions.push({\n stableId: target.id,\n reason: isFolder(target)\n ? 'shortcut-target-outside-boundary'\n : 'shortcut-target-unsupported',\n });\n return;\n }\n seenFolders.add(target.id);\n checkpoint.pendingFolders.push({\n folderId: target.id,\n visibility: classify(target.name, inheritedVisibility),\n });\n }\n\n /**\n * Content is available only after explicit selection and policy approval.\n * A revision is mandatory so retries cannot silently acquire changed bytes.\n */\n async acquireSelected(\n authorization: DriveSelectionAuthorization,\n options: Omit<DriveAcquisitionOptions, 'expectedRevision'>,\n ): Promise<PinnedDriveContent> {\n if (!authorization.allowed)\n throw new Error(\n 'Drive content selection is not authorized by license policy.',\n );\n if (!authorization.stableId || !authorization.revision)\n throw new Error(\n 'Drive selection requires a stable ID and exact revision.',\n );\n if (!Number.isSafeInteger(options.maxBytes) || options.maxBytes < 1)\n throw new Error(\n 'Drive acquisition requires a positive maximum byte limit.',\n );\n const acquisition = await this.drive.acquireById(authorization.stableId, {\n ...options,\n expectedRevision: authorization.revision,\n ...(authorization.exportMimeType\n ? { exportMimeType: authorization.exportMimeType }\n : {}),\n });\n if (acquisition.metadata.id !== authorization.stableId)\n throw new Error('Drive acquisition returned a different resource.');\n if (\n acquisition.metadata.revisionId &&\n acquisition.metadata.revisionId !== authorization.revision\n )\n throw new Error(\n 'Drive acquisition revision changed before content was pinned.',\n );\n if (acquisition.bytes.byteLength > options.maxBytes)\n throw new Error('Drive acquisition exceeds its byte limit.');\n const hash = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n Uint8Array.from(acquisition.bytes),\n );\n const sha256 = Buffer.from(hash).toString('hex');\n if (acquisition.contentHash.toLowerCase() !== sha256)\n throw new Error(\n 'Drive acquisition content hash did not match returned bytes.',\n );\n return {\n stableId: acquisition.metadata.id,\n ...(acquisition.metadata.revisionId\n ? { revision: acquisition.metadata.revisionId }\n : {}),\n ...(acquisition.metadata.md5Checksum\n ? { checksum: acquisition.metadata.md5Checksum }\n : {}),\n sha256,\n bytes: acquisition.bytes,\n ...(acquisition.exportMimeType\n ? { exportMimeType: acquisition.exportMimeType }\n : {}),\n };\n }\n\n async acquire(input: {\n providerId: string;\n stableId: string;\n revision: string;\n format: string;\n }): Promise<{ bytes: Uint8Array; sha256: string; revision: string }> {\n if (input.providerId !== GoogleDriveCurriculumAdapter.providerId)\n throw new Error('Google Drive adapter cannot acquire another provider.');\n const acquired = await this.acquireSelected(\n {\n stableId: input.stableId,\n revision: input.revision,\n exportMimeType: input.format,\n allowed: true,\n },\n { maxBytes: this.configuration.maxAcquisitionBytes ?? 25_000_000 },\n );\n if (acquired.revision !== input.revision)\n throw new Error(\n 'Drive acquisition did not return the selected revision.',\n );\n return {\n bytes: acquired.bytes,\n sha256: acquired.sha256,\n revision: input.revision,\n };\n }\n}\n","/** Strict first-edition hierarchy and public artifact parsing; never executes HTML. */\nexport const IM_ORIGIN = 'https://im.kendallhunt.com';\nexport const IM_ASSET_ORIGIN = 'https://cms-assets.illustrativemathematics.org';\nexport const IM_LICENSE = 'https://creativecommons.org/licenses/by/4.0/';\nexport const IM_ROOTS = [\n '/k5/curriculum.html',\n '/MS/index.html',\n '/HS/index.html',\n];\n\nexport function imText(value: string): string {\n return value\n .replace(/<[^>]*>/g, ' ')\n .replace(/ | /g, ' ')\n .replace(/&/g, '&')\n .replace(/'|'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/\\s+/g, ' ')\n .trim();\n}\nexport interface ImPageIdentity {\n path: string;\n band: string;\n course?: string;\n unit?: string;\n lesson?: string;\n audience?: string;\n leaf: string;\n}\n/** Canonical paths contain no escapes, queries, credentials, or arbitrary filenames. */\nexport function imPagePath(value: string): ImPageIdentity {\n if (value === '/') return { path: '/', band: '', leaf: '' };\n if (IM_ROOTS.includes(value))\n return { path: value, band: value.split('/')[1], leaf: 'root' };\n const k =\n /^\\/(k5(?:_es)?)\\/(teachers|families)\\/(kindergarten|grade-[1-5])(?:\\/unit-([1-9][0-9]?))?(?:\\/lesson-([1-9][0-9]?))?\\/(units|lessons|resources|preparation|family-materials)\\.html$/i.exec(\n value,\n );\n const m =\n /^\\/(MS(?:_ES)?|HS(?:_ES)?)\\/(teachers|families)\\/([1-4])(?:\\/([1-9][0-9]?))?(?:\\/([1-9][0-9]?))?\\/(index|resources|preparation)\\.html$/i.exec(\n value,\n );\n const x = k ?? m;\n if (!x) throw new Error('Unsupported first-edition hierarchy path.');\n const [, rawBand, audience, course, unit, lesson, leaf] = x;\n const band = rawBand.toLowerCase().startsWith('k5')\n ? rawBand.toLowerCase()\n : rawBand.toUpperCase();\n const isK = band.startsWith('k5');\n if (\n (band.startsWith('MS') && course === '4') ||\n (lesson && (!unit || audience !== 'teachers' || leaf !== 'preparation')) ||\n (!lesson && leaf === 'preparation') ||\n (isK && !unit && !['units', 'resources'].includes(leaf)) ||\n (isK &&\n unit &&\n !lesson &&\n !['lessons', 'resources', 'family-materials'].includes(leaf)) ||\n (!isK && !lesson && !['index', 'resources'].includes(leaf))\n )\n throw new Error('Inconsistent first-edition hierarchy.');\n const path = `/${band}/${audience}/${course}${unit ? `/${isK ? 'unit-' : ''}${unit}` : ''}${lesson ? `/${isK ? 'lesson-' : ''}${lesson}` : ''}/${leaf}.html`;\n return { path, band, audience, course, unit, lesson, leaf };\n}\nexport function imAssetId(url: URL): string | undefined {\n return url.origin === IM_ASSET_ORIGIN &&\n !url.username &&\n !url.password &&\n !url.port &&\n !url.search &&\n !url.hash &&\n /^\\/[a-zA-Z0-9]{20,64}$/.test(url.pathname)\n ? url.pathname.slice(1)\n : undefined;\n}\nexport function imStableId(path: string, assetId?: string): string {\n return `im-first-edition:${path}${assetId ? `#${assetId}` : ''}`;\n}\nexport function imHierarchyTitle(page: ImPageIdentity): string {\n const course = page.band.startsWith('k5')\n ? `Grade ${page.course === 'kindergarten' ? 'K' : page.course?.slice(6)}`\n : page.band.startsWith('MS')\n ? `Grade ${Number(page.course) + 5}`\n : ['', 'Algebra 1', 'Geometry', 'Algebra 2', 'Algebra 1 Supports'][\n Number(page.course)\n ];\n return `IM ${page.band} ${course ?? ''}${page.unit ? ` Unit ${page.unit}` : ''}${page.lesson ? ` Lesson ${page.lesson}` : ''}`.trim();\n}\nexport interface ImArtifact {\n id: string;\n label: string;\n allowed: boolean;\n}\nexport interface ImParsedPage {\n children: string[];\n artifacts: ImArtifact[];\n exclusions: { code: string; message: string }[];\n attribution: string;\n notices: string;\n licensed: boolean;\n title: string;\n}\ninterface RoleContainer {\n tag: string;\n parent?: RoleContainer;\n contentStart: number;\n resource: boolean;\n closed: boolean;\n malformed: boolean;\n headings: { tag: string; text: string }[];\n descendantHeadingCount: number;\n cells: string[];\n}\n\n/** A '<' is legal inside a tag only in a closed, quoted attribute value. */\nfunction malformedTagToken(token: string): boolean {\n const prefix = /^<\\/?[a-zA-Z][\\w:-]*/.exec(token);\n if (!prefix) return true;\n const end = token.length - 1;\n let index = prefix[0].length;\n while (index < end) {\n while (index < end && /\\s/.test(token[index])) index++;\n if (index === end || (index === end - 1 && token[index] === '/'))\n return false;\n const nameStart = index;\n while (index < end && !/[\\s\"'<>/=]/.test(token[index])) index++;\n if (index === nameStart) return true;\n while (index < end && /\\s/.test(token[index])) index++;\n if (token[index] !== '=') continue;\n index++;\n while (index < end && /\\s/.test(token[index])) index++;\n const quote = token[index];\n if (quote === '\"' || quote === \"'\") {\n const close = token.indexOf(quote, index + 1);\n if (close < 0 || close >= end) return true;\n index = close + 1;\n } else {\n const valueStart = index;\n while (index < end && !/\\s/.test(token[index])) {\n if (/[\"'`=<>]/.test(token[index])) return true;\n index++;\n }\n if (index === valueStart) return true;\n }\n }\n return false;\n}\n\n/** Bind each link to its own source row/block; headings never cross containers. */\nfunction localArtifactLabels(html: string): Map<number, string> {\n const stack: RoleContainer[] = [];\n const links: {\n start: number;\n owner?: RoleContainer;\n kind?: 'row' | 'resource';\n }[] = [];\n const voidTags = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ]);\n const tokens =\n /<\\/?([a-zA-Z][\\w:-]*)(?:\\s+(?:[^>\"']|\"[^\"]*\"|'[^']*')*)?\\s*\\/?>/g;\n const invalidateOwners = () => {\n for (const owner of stack)\n if (owner.resource || owner.tag === 'tr') owner.malformed = true;\n };\n let tokenCount = 0;\n let consumedEnd = 0;\n for (const token of html.matchAll(tokens)) {\n if (++tokenCount > 50_000 || stack.length > 256)\n throw new Error('First-edition role structure exceeds parser bounds.');\n // Unconsumed markup starts are malformed descendants too (e.g. a tag\n // truncated before its '>' and then followed by an ancestor close).\n if (/<[/!]?[a-zA-Z]/.test(html.slice(consumedEnd, token.index)))\n invalidateOwners();\n consumedEnd = token.index + token[0].length;\n const malformed = malformedTagToken(token[0]);\n if (malformed) invalidateOwners();\n const tag = token[1].toLowerCase();\n if (token[0].startsWith('</')) {\n const index = stack.findLastIndex((node) => node.tag === tag);\n if (index < 0) {\n invalidateOwners();\n continue;\n }\n const node = stack[index];\n if (index !== stack.length - 1) {\n invalidateOwners();\n node.malformed = true;\n for (const dangling of stack.slice(index + 1))\n dangling.malformed = true;\n }\n node.closed = true;\n if (/^h[1-6]$/.test(tag)) {\n const content = imText(html.slice(node.contentStart, token.index));\n if (!node.malformed && node.parent?.resource)\n node.parent.headings.push({ tag, text: content });\n const row = stack\n .slice(0, index)\n .findLast((ancestor) => ancestor.tag === 'tr');\n if (row) row.headings.push({ tag, text: content });\n }\n if (tag === 'td' && node.parent?.tag === 'tr')\n node.parent.cells.push(\n imText(html.slice(node.contentStart, token.index)),\n );\n stack.length = index;\n continue;\n }\n // Register headings at OPEN: malformed close recovery must not erase them.\n if (/^h[1-6]$/.test(tag)) {\n for (const owner of stack)\n if (owner.resource || owner.tag === 'tr')\n owner.descendantHeadingCount++;\n }\n const parent = stack.at(-1);\n if (tag === 'a') {\n if (\n parent?.tag === 'td' &&\n parent.parent?.tag === 'tr' &&\n parent.parent.cells.length > 0\n )\n links.push({ start: token.index, owner: parent.parent, kind: 'row' });\n else\n links.push({\n start: token.index,\n owner: parent?.resource ? parent : undefined,\n kind: 'resource',\n });\n }\n if (voidTags.has(tag) || token[0].endsWith('/>')) continue;\n const className =\n /\\sclass\\s*=\\s*[\"']([^\"']*)[\"']/i.exec(token[0])?.[1] ?? '';\n stack.push({\n tag,\n parent,\n contentStart: token.index + token[0].length,\n resource:\n tag === 'div' &&\n className.split(/\\s+/).includes('im-c-row__flex-resource'),\n closed: false,\n malformed,\n headings: [],\n descendantHeadingCount: 0,\n cells: [],\n });\n }\n // Open owners or their descendants at EOF are never a complete source boundary.\n invalidateOwners();\n const labels = new Map<number, string>();\n for (const link of links) {\n const owner = link.owner;\n if (!owner?.closed || owner.malformed) continue;\n if (link.kind === 'row') {\n if (owner.descendantHeadingCount === 0 && owner.headings.length === 0)\n labels.set(link.start, owner.cells[0] ?? '');\n } else if (\n owner.descendantHeadingCount === 1 &&\n owner.headings.length === 1 &&\n /^h[34]$/.test(owner.headings[0].tag)\n )\n labels.set(link.start, owner.headings[0].text);\n }\n return labels;\n}\n\nexport function parseImFirstEditionPage(\n rawHtml: string,\n path: string,\n): ImParsedPage {\n const page = imPagePath(path);\n const html = rawHtml\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<(script|style)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, '');\n const footer = /<footer\\b[^>]*>([\\s\\S]*?)<\\/footer>/i.exec(html)?.[1] ?? '';\n const licensed =\n /href=[\"']https:\\/\\/creativecommons\\.org\\/licenses\\/by\\/4\\.0\\/[\"']/i.test(\n footer,\n ) &&\n /Illustrative Mathematics/i.test(imText(footer)) &&\n !/licenses\\/(?:by-nc|by-sa|by-nd)|all rights reserved/i.test(footer);\n const paragraphs = [...footer.matchAll(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi)].map(\n (x) => imText(x[1]),\n );\n const attribution = paragraphs\n .filter((s) => /copyright|©|licensed under/i.test(s))\n .join('\\n');\n const notices = paragraphs\n .filter((s) => /name and logo|respective|attribution/i.test(s))\n .join('\\n');\n const children = new Set<string>();\n const exclusions: ImParsedPage['exclusions'] = [];\n const artifacts = new Map<string, ImArtifact>();\n const localLabels = localArtifactLabels(html);\n const anchors = [...html.matchAll(/<a\\b([^>]*)>([\\s\\S]*?)<\\/a\\s*>/gi)];\n if (anchors.length > 4000)\n throw new Error('First-edition page has too many links.');\n for (const anchor of anchors) {\n const href = /\\bhref\\s*=\\s*[\"']([^\"']+)[\"']/i.exec(anchor[1])?.[1];\n if (!href) continue;\n let url: URL;\n try {\n url = new URL(href.replace(/&/g, '&'), IM_ORIGIN + path);\n } catch {\n exclusions.push({\n code: 'invalid_link',\n message: 'Malformed source link.',\n });\n continue;\n }\n if (/oauth_im\\/login/.test(url.pathname)) {\n exclusions.push({\n code: 'login_required',\n message: imText(anchor[2]) || 'Login-gated material.',\n });\n continue;\n }\n if (\n url.hostname === 'accessim.org' ||\n url.hostname.endsWith('.accessim.org')\n ) {\n exclusions.push({\n code: 'different_edition',\n message: 'AccessIM/v.360 is outside the first edition.',\n });\n continue;\n }\n if (url.origin === IM_ASSET_ORIGIN) {\n const id = imAssetId(url);\n if (!id) {\n exclusions.push({\n code: 'invalid_asset_path',\n message: 'Unsupported official asset path.',\n });\n continue;\n }\n const label = localLabels.get(anchor.index) ?? '';\n const allowed =\n /^(Student Task Statements|Student Handouts|Cumulative Practice Problems|Family Support Materials|Family Materials|Learning Targets|Student Task Statement Cover Page)$/i.test(\n label,\n );\n const prior = artifacts.get(id);\n artifacts.set(id, {\n id,\n label,\n allowed:\n allowed && (!prior || (prior.allowed && prior.label === label)),\n });\n continue;\n }\n if (\n url.origin !== IM_ORIGIN ||\n url.username ||\n url.password ||\n url.port ||\n url.search ||\n url.hash ||\n /%|\\\\/.test(href)\n )\n continue;\n let child: ImPageIdentity;\n try {\n child = imPagePath(url.pathname);\n } catch {\n if (\n /^\\/(?:k5(?:_es)?|MS(?:_ES)?|HS(?:_ES)?)\\/(?:teachers|families|students)\\//i.test(\n url.pathname,\n )\n )\n exclusions.push({\n code: 'unsupported_hierarchy_or_html',\n message: `Outside declared PDF hierarchy: ${url.pathname}`,\n });\n continue;\n }\n const sameCourse =\n child.band === page.band &&\n child.audience === page.audience &&\n child.course === page.course;\n const rootChild =\n page.leaf === 'root' &&\n child.band.toLowerCase().replace('_es', '') === page.band.toLowerCase() &&\n child.course &&\n !child.unit &&\n child.leaf !== 'resources';\n const courseChild =\n page.course &&\n !page.unit &&\n page.leaf !== 'resources' &&\n sameCourse &&\n ((child.unit && !child.lesson && child.leaf !== 'resources') ||\n (!child.unit && child.leaf === 'resources'));\n const unitChild =\n page.unit &&\n !page.lesson &&\n !['resources', 'family-materials'].includes(page.leaf) &&\n sameCourse &&\n child.unit === page.unit &&\n ((child.lesson && child.leaf === 'preparation') ||\n (!child.lesson && child.leaf === 'resources'));\n const familyMaterialsChild =\n page.band.startsWith('k5') &&\n page.audience === 'families' &&\n page.unit &&\n !page.lesson &&\n page.leaf !== 'family-materials' &&\n sameCourse &&\n child.unit === page.unit &&\n !child.lesson &&\n child.leaf === 'family-materials';\n if (rootChild || courseChild || unitChild || familyMaterialsChild)\n children.add(child.path);\n }\n if (children.size > 128 || artifacts.size > 128)\n throw new Error('First-edition page exceeds hierarchy/artifact bound.');\n return {\n children: [...children],\n artifacts: [...artifacts.values()],\n exclusions,\n attribution,\n notices,\n licensed,\n title: imText(/<title[^>]*>([\\s\\S]*?)<\\/title>/i.exec(html)?.[1] ?? ''),\n };\n}\n","import {\n CATALOG_REPRESENTATION_MEDIA_TYPES,\n catalogRepresentationFormat,\n catalogRepresentationMediaType,\n normalizeCatalogRepresentation,\n} from '../catalog-capability.js';\nimport type {\n CatalogAcquireAdapter,\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncPage,\n} from '../catalog-contracts.js';\nimport {\n IM_ASSET_ORIGIN,\n IM_LICENSE,\n IM_ORIGIN,\n IM_ROOTS,\n imHierarchyTitle,\n imPagePath,\n imStableId,\n parseImFirstEditionPage,\n} from './public-illustrative-mathematics-parser.js';\n\nexport interface PublicIllustrativeMathematicsFirstEditionConfig {\n /** Standard fetch, including streaming Response bodies; defaults to global fetch. */\n fetch?: typeof globalThis.fetch;\n /** Per enumeration/acquisition total deadline. Default 20 seconds; maximum 60 seconds. */\n timeoutMs?: number;\n /** Selected PDF cap. Default 32 MiB; maximum 64 MiB. */\n maxPdfBytes?: number;\n}\ninterface Cursor {\n v: 1;\n todo: string[];\n offset: number;\n pageRevision?: string;\n}\ninterface Revision {\n v: 1;\n page: string;\n etag: string;\n length: number;\n modified: string;\n}\nconst PROVIDER = 'illustrative-mathematics';\nconst METADATA_CAP = 2_000_000;\nconst HEADS_PER_PAGE = 4;\nfunction retryDelay(value: string | null): number {\n if (!value) return 60_000;\n const delay = /^[0-9]+$/.test(value)\n ? Number(value) * 1000\n : Date.parse(value) - Date.now();\n return Number.isFinite(delay)\n ? Math.min(3_600_000, Math.max(0, delay))\n : 60_000;\n}\nfunction encode(value: unknown): string {\n return JSON.stringify(value);\n}\nfunction cursor(value?: string): Cursor {\n if (!value) return { v: 1, todo: ['/', ...IM_ROOTS], offset: 0 };\n if (value.length > 64_000) throw new Error('Cursor exceeds its size bound.');\n const x = JSON.parse(value) as Cursor;\n if (\n !x ||\n Object.keys(x).some(\n (k) => !['v', 'todo', 'offset', 'pageRevision'].includes(k),\n ) ||\n x.v !== 1 ||\n !Array.isArray(x.todo) ||\n !x.todo.length ||\n x.todo.length > 384 ||\n !Number.isSafeInteger(x.offset) ||\n x.offset < 0 ||\n x.offset > 128 ||\n (x.pageRevision !== undefined &&\n (typeof x.pageRevision !== 'string' || x.pageRevision.length > 256)) ||\n (x.offset > 0 && !x.pageRevision)\n )\n throw new Error('Invalid first-edition cursor.');\n for (const p of x.todo)\n if (typeof p !== 'string' || p.length > 160 || imPagePath(p).path !== p)\n throw new Error('Invalid cursor hierarchy path.');\n if (new Set(x.todo).size !== x.todo.length)\n throw new Error('Duplicate cursor paths.');\n return x;\n}\nfunction observedMetadata(response: Response) {\n const etag = response.headers.get('etag') ?? '';\n const lengthText = response.headers.get('content-length') ?? '';\n const length = Number(lengthText);\n const modified = response.headers.get('last-modified') ?? '';\n const header = response.headers.get('content-type');\n const mediaType =\n header === null ? null : catalogRepresentationMediaType(header);\n const format =\n mediaType === null\n ? 'unknown'\n : (catalogRepresentationFormat(mediaType) ?? 'unknown');\n if (\n response.headers.has('content-encoding') &&\n response.headers.get('content-encoding') !== 'identity'\n )\n throw new Error('PDF representation is unexpectedly encoded.');\n if (\n !/^\"[\\x21\\x23-\\x7e]{1,200}\"$/.test(etag) ||\n !/^[1-9][0-9]*$/.test(lengthText) ||\n !Number.isSafeInteger(length) ||\n !modified ||\n !Number.isFinite(Date.parse(modified)) ||\n modified.length > 100\n )\n throw new Error(\n 'Metadata requires a strong ETag, positive safe length, and valid Last-Modified metadata.',\n );\n return { etag, length, modified, format, mediaType } as const;\n}\nfunction validators(\n response: Response,\n cap: number,\n): Omit<Revision, 'v' | 'page'> {\n const { format, mediaType, ...metadata } = observedMetadata(response);\n if (format !== 'pdf' || metadata.length > cap)\n throw new Error(\n 'Selected representation requires PDF content type and bounded length.',\n );\n return metadata;\n}\nasync function readBody(response: Response, cap: number): Promise<Uint8Array> {\n const declared = response.headers.get('content-length');\n if (declared && (!/^[0-9]+$/.test(declared) || Number(declared) > cap))\n throw new Error('Response exceeds declared body bound.');\n if (!response.body) throw new Error('Provider response body is missing.');\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const next = await reader.read();\n if (next.done) break;\n size += next.value.byteLength;\n if (size > cap) throw new Error('Provider streamed body exceeds bound.');\n chunks.push(next.value);\n }\n } catch (error) {\n await reader.cancel().catch(() => {});\n throw error;\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\nasync function sha256(bytes: Uint8Array): Promise<string> {\n return [\n ...new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', bytes)),\n ]\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n/**\n * Public first-edition English/linked Spanish K–12 teacher/family hierarchy.\n * Each enumeration reads one HTML page and at most four asset HEADs. Only an\n * explicit, validated selection can GET PDF bytes; generic acquisition retains\n * policy, tenant isolation, idempotence, attribution and notices.\n */\nexport function createPublicIllustrativeMathematicsFirstEditionAdapter(\n config: PublicIllustrativeMathematicsFirstEditionConfig = {},\n): CatalogSyncAdapter & CatalogAcquireAdapter {\n const fetcher = config.fetch ?? globalThis.fetch;\n const timeout = config.timeoutMs ?? 20_000;\n const pdfCap = config.maxPdfBytes ?? 32 * 1024 * 1024;\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 60_000 ||\n !Number.isSafeInteger(pdfCap) ||\n pdfCap < 5 ||\n pdfCap > 64 * 1024 * 1024\n )\n throw new Error('Invalid first-edition request bounds.');\n async function operation<T>(\n run: (\n request: (\n url: string,\n method: 'GET' | 'HEAD',\n headers?: Record<string, string>,\n ) => Promise<Response>,\n ) => Promise<T>,\n ): Promise<T> {\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n run(async (url, method, headers = {}) => {\n if (controller.signal.aborted)\n throw new Error('First-edition operation timed out.');\n const response = await fetcher(url, {\n method,\n redirect: 'error',\n signal: controller.signal,\n headers: {\n 'accept-encoding': 'identity',\n accept: url.startsWith(IM_ASSET_ORIGIN)\n ? method === 'HEAD'\n ? Object.values(CATALOG_REPRESENTATION_MEDIA_TYPES).join(', ')\n : 'application/pdf'\n : 'text/html',\n ...headers,\n },\n });\n if (\n !response.ok ||\n response.status !== 200 ||\n response.redirected ||\n response.url !== url\n ) {\n await response.body?.cancel();\n const error = new Error(\n `Official provider request failed: HTTP ${response.status} or unexpected redirect.`,\n );\n Object.assign(error, {\n retryAfterMs:\n response.status === 429\n ? retryDelay(response.headers.get('retry-after'))\n : undefined,\n });\n throw error;\n }\n return response;\n }),\n new Promise<T>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('First-edition operation timed out.'));\n }, timeout);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n controller.abort();\n }\n }\n async function html(\n request: Parameters<Parameters<typeof operation>[0]>[0],\n path: string,\n ) {\n const response = await request(IM_ORIGIN + path, 'GET');\n if (\n !/^text\\/html(?:\\s*;|$)/i.test(response.headers.get('content-type') ?? '')\n )\n throw new Error('Expected official HTML metadata.');\n const bytes = await readBody(response, METADATA_CAP);\n const parsed = parseImFirstEditionPage(\n new TextDecoder('utf-8', { fatal: true }).decode(bytes),\n path,\n );\n // Official HTML includes per-request CSRF tokens and changing weak ETags.\n // Bind the revision to the exact validated source semantics, not session markup.\n const revision = await sha256(\n new TextEncoder().encode(encode({ path, ...parsed })),\n );\n return { parsed, revision };\n }\n return {\n async enumerate(input): Promise<CatalogSyncPage> {\n let state: Cursor;\n try {\n state = cursor(input.cursor ?? input.checkpoint.cursor);\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n { code: 'invalid_provider_cursor', message: String(error) },\n ],\n };\n }\n try {\n return await operation(async (request) => {\n const path = state.todo[0];\n const { parsed, revision } = await html(request, path);\n if (state.pageRevision && state.pageRevision !== revision)\n throw new Error(\n 'Metadata changed during cursor traversal; restart this sync generation.',\n );\n if (state.offset > parsed.artifacts.length)\n throw new Error('Cursor artifact offset exceeds source page.');\n const policyExclusions =\n state.offset === 0 ? [...parsed.exclusions] : [];\n const records: CatalogSourceRecord[] = [];\n const page = imPagePath(path);\n const expectsChildren =\n page.leaf === 'root' ||\n (page.audience === 'teachers' &&\n !page.lesson &&\n ['units', 'lessons', 'index'].includes(page.leaf)) ||\n (page.audience === 'families' &&\n !page.unit &&\n ['units', 'index'].includes(page.leaf));\n if (expectsChildren && !parsed.children.length)\n throw new Error(\n 'Official hierarchy page has no recognized children; coverage is incomplete.',\n );\n if (page.course && state.offset === 0)\n records.push({\n providerId: PROVIDER,\n stableId: imStableId(path),\n revision,\n canonicalUrl: IM_ORIGIN + path,\n title: imHierarchyTitle(page),\n parentStableId: page.lesson\n ? imStableId(\n path.replace(\n /\\/(?:lesson-)?[0-9]+\\/preparation.html$/,\n page.band.startsWith('k5')\n ? '/lessons.html'\n : '/index.html',\n ),\n )\n : page.unit\n ? imStableId(\n `/${page.band}/${page.audience}/${page.course}/${page.band.startsWith('k5') ? 'units' : 'index'}.html`,\n )\n : undefined,\n resourceType: page.lesson\n ? 'lesson'\n : page.unit\n ? 'unit'\n : 'course',\n subjects: ['mathematics'],\n language: page.band.toLowerCase().endsWith('_es') ? 'es' : 'en',\n availableFormats: ['html'],\n visibility: 'teacher',\n licenseEvidence: {\n state: parsed.licensed ? 'verified' : 'unknown',\n sourceUrl: IM_ORIGIN + path,\n permittedOperations: ['link'],\n },\n });\n const slice = parsed.artifacts.slice(\n state.offset,\n state.offset + HEADS_PER_PAGE,\n );\n const results = await Promise.allSettled(\n slice.map(async (asset) => {\n if (!asset.allowed || !parsed.licensed || !parsed.attribution) {\n policyExclusions.push({\n code: !asset.allowed\n ? 'teacher_or_unknown_role'\n : 'unverified_license',\n message: `${asset.id}: ${asset.label || 'Unknown label'}.`,\n });\n return;\n }\n const response = await request(\n `${IM_ASSET_ORIGIN}/${asset.id}`,\n 'HEAD',\n );\n const { format, mediaType, ...metadata } =\n observedMetadata(response);\n const representation = normalizeCatalogRepresentation({\n format,\n mediaType,\n byteLength: metadata.length,\n validators: {\n etag: metadata.etag,\n lastModified: metadata.modified,\n },\n acquisition:\n format === 'unknown'\n ? {\n status: 'unknown-format',\n reason:\n mediaType === null\n ? 'missing-content-type'\n : 'unrecognized-content-type',\n }\n : format !== 'pdf'\n ? { status: 'unsupported-format' }\n : {\n status:\n metadata.length <= pdfCap\n ? 'supported'\n : 'size-limit',\n maxBytes: pdfCap,\n },\n });\n // Retain the published PDF revision encoding; capability limits are not content identity.\n const pinned =\n format === 'pdf'\n ? { v: 1, page: revision, ...metadata }\n : {\n v: 2,\n page: revision,\n ...metadata,\n mediaType,\n };\n const grade = page.band.startsWith('k5')\n ? page.course === 'kindergarten'\n ? 'K'\n : page.course?.slice(6)\n : page.band.startsWith('MS')\n ? String(Number(page.course) + 5)\n : undefined;\n records.push({\n providerId: PROVIDER,\n stableId: imStableId(path, asset.id),\n revision: encode(pinned),\n canonicalUrl: IM_ORIGIN + path,\n title: `${imHierarchyTitle(page)} — ${asset.label}`,\n suppliedDescription: `${parsed.title}. Source label: ${asset.label}.`,\n author: 'Illustrative Mathematics',\n subjects: ['mathematics'],\n gradeRange: grade\n ? { min: grade, max: grade }\n : { min: '9', max: '12' },\n language: page.band.toLowerCase().endsWith('_es') ? 'es' : 'en',\n resourceType: 'student-material',\n parentStableId: imStableId(path),\n availableFormats: format === 'unknown' ? [] : [format],\n representation,\n visibility: 'catalog',\n licenseEvidence: {\n state: 'verified',\n identifier: 'CC BY',\n version: '4.0',\n sourceUrl: IM_ORIGIN + path,\n attribution: `${parsed.attribution}\\n${IM_ORIGIN + path}\\n${IM_LICENSE}`,\n exceptions: `${parsed.notices}\\nOriginal first-edition ${format.toUpperCase()}; no changes made. License: ${IM_LICENSE}`,\n retrievedAt: new Date().toISOString(),\n permittedOperations: [\n 'link',\n 'download',\n 'print',\n 'adapt',\n 'redistribute',\n 'commercial-use',\n ],\n },\n });\n }),\n );\n // Do not advance a cursor or emit a partial page after any failed HEAD.\n const failure = results.find((r) => r.status === 'rejected');\n if (failure?.status === 'rejected') throw failure.reason;\n const end = state.offset + slice.length;\n const next: Cursor =\n end < parsed.artifacts.length\n ? { ...state, offset: end, pageRevision: revision }\n : {\n v: 1,\n todo: [...parsed.children, ...state.todo.slice(1)],\n offset: 0,\n };\n if (next.todo.length > 384 || encode(next).length > 64_000)\n throw new Error('Hierarchy cursor exceeds its durable bound.');\n if (path === '/')\n policyExclusions.push({\n code: 'declared_scope',\n message:\n 'Public first-edition official CMS artifact links with observed PDF/ZIP/DOCX representations explicitly labeled for students/families on official K5/MS/HS teacher/family course, unit, resources and lesson preparation pages, including linked Spanish counterparts and Algebra 1 Supports. HTML-only lessons, external-host artifacts, teacher/login and unknown-role material are excluded; unknown MIME is retained with acquisition denied; malformed MIME or invalid validators pause enumeration; AccessIM/v.360 is excluded.',\n });\n return {\n records: records.sort((a, b) =>\n a.stableId.localeCompare(b.stableId),\n ),\n complete: next.todo.length === 0,\n ...(next.todo.length ? { nextCursor: encode(next) } : {}),\n policyExclusions,\n };\n });\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n nextCursor: encode(state),\n exclusions: [\n {\n code: 'provider_metadata_unavailable',\n message: error instanceof Error ? error.message : String(error),\n retryAfterMs: (error as { retryAfterMs?: number }).retryAfterMs,\n },\n ],\n };\n }\n },\n async acquire(input) {\n if (\n input.providerId !== PROVIDER ||\n input.format !== 'pdf' ||\n input.stableId.length > 300 ||\n input.revision.length > 1000\n )\n throw new Error('Unsupported first-edition acquisition.');\n const match = /^im-first-edition:(\\/[^#]+)#([a-zA-Z0-9]{20,64})$/.exec(\n input.stableId,\n );\n if (!match || imPagePath(match[1]).path !== match[1])\n throw new Error('Invalid selected first-edition identity.');\n const selected = JSON.parse(input.revision) as Revision;\n if (\n !selected ||\n Object.keys(selected).sort().join(',') !==\n 'etag,length,modified,page,v' ||\n selected.v !== 1 ||\n typeof selected.page !== 'string' ||\n !/^[a-f0-9]{64}$/.test(selected.page) ||\n typeof selected.etag !== 'string' ||\n !/^\"[\\x21\\x23-\\x7e]{1,200}\"$/.test(selected.etag) ||\n !Number.isSafeInteger(selected.length) ||\n selected.length < 5 ||\n selected.length > pdfCap ||\n typeof selected.modified !== 'string' ||\n selected.modified.length > 100 ||\n !Number.isFinite(Date.parse(selected.modified))\n )\n throw new Error('Invalid selected first-edition revision.');\n return await operation(async (request) => {\n const { parsed, revision } = await html(request, match[1]);\n if (\n revision !== selected.page ||\n !parsed.licensed ||\n !parsed.attribution ||\n !parsed.artifacts.some((a) => a.id === match[2] && a.allowed)\n )\n throw new Error(\n 'Selected artifact, role, license or page revision changed.',\n );\n const response = await request(\n `${IM_ASSET_ORIGIN}/${match[2]}`,\n 'GET',\n {\n 'if-match': selected.etag,\n 'if-unmodified-since': selected.modified,\n },\n );\n const actual = validators(response, pdfCap);\n if (\n actual.etag !== selected.etag ||\n actual.length !== selected.length ||\n actual.modified !== selected.modified\n ) {\n await response.body?.cancel();\n throw new Error('Selected PDF revision changed.');\n }\n const bytes = await readBody(response, pdfCap);\n if (\n bytes.length !== selected.length ||\n new TextDecoder().decode(bytes.subarray(0, 5)) !== '%PDF-'\n )\n throw new Error('Selected body is not the declared PDF.');\n return { bytes, revision: input.revision, sha256: await sha256(bytes) };\n });\n },\n };\n}\n"],"mappings":"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AAU;IACV,kBAAkB,CAChB;KACE,MAAM;KACN,SACE;IACJ,CACF;GACF;EACF,SAAS,OAAO;GACd,OAAO;IACL,SAAS,CAAC;IACV,UAAU;IACV,YAAY,CACV;KACE,MAAM;KACN,SACE,iBAAiB,QACb,MAAM,UACN;IACR,CACF;GACF;EACF;CACF,EACF;AACF;AAEO,SAAS,kBACd,MACoB;CACpB,OAAO,IAAI,6BAA6B,QAAQ,IAAI;AACtD;AAEO,SAAS,wBACd,MACoB;CACpB,OAAO,IAAI,6BAA6B,eAAe,IAAI;AAC7D;AAGO,SAAS,2BACd,QACoB;CACpB,OAAO,EACL,MAAM,UAAU,OAAO;EACrB,IAAI,MAAM,QACR,OAAO;GACL,SAAS,CAAC;GACV,UAAU;GACV,YAAY,CACV;IACE,QAAQ,MAAM;IACd,MAAM;IACN,SACE;GACJ,CACF;EACF;EACF,MAAM,MAAM,SAAS,OAAO,SAAS,aAAa;EAClD,MAAM,SAAS,MAAM,cACnB,OAAO,OACP,KACA,kDACA,OAAO,SACT;EACA,IAAI,cAAc,QAAQ,OAAO;EACjC,IAAI;GACF,OAAO;IACL,SAAS,uBAAuB,OAAO,MAAM,OAAO,QAAQ;IAC5D,UAAU,OAAO,qBAAqB;IACtC,GAAI,OAAO,qBAAqB,OAC5B,CAAC,IACD,EACE,kBAAkB,CAChB;KACE,MAAM;KACN,SACE;IACJ,CACF,EACF;GACN;EACF,SAAS,OAAO;GACd,OAAO;IACL,SAAS,CAAC;IACV,UAAU;IACV,YAAY,CACV;KACE,MAAM;KACN,SACE,iBAAiB,QACb,MAAM,UACN;IACR,CACF;GACF;EACF;CACF,EACF;AACF;;;ACtcO,IAAM,yBAA2D;CACtE;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;AACF;AAEO,SAAS,cACd,SACkC;CAClC,OAAO,UACH,uBAAuB,QAAQ,WAAW,OAAO,YAAY,OAAO,IACpE;AACN;AAEA,SAAS,YACP,SACA,SACA,OACA,SACuB;CACvB,OAAO;EACL,WAAW,GAAG,QAAO,GAAI;EACzB;EACA;EACA;EACA,SAAS;EACT,gBAAgB;CAClB;AACF;AAOO,IAAM,wBAAyD;CACpE;EACE,SAAS;EACT,OAAO;EACP,SAAS;GACP,YACE,WACA,WACA,qBACA,gDACF;GACA,YACE,WACA,WACA,qBACA,gDACF;GACA,YACE,WACA,SACA,yBACA,gDACF;GACA,YACE,WACA,OACA,iBACA,4CACF;GACA,YACE,WACA,SACA,mBACA,wFACF;GACA,YACE,WACA,aACA,kCACA,+CACF;EACF;CACF;CACA;EACE,SAAS;EACT,OAAO;EACP,SAAS;GACP,YACE,WACA,WACA,qBACA,yCACF;GACA,YACE,WACA,WACA,4BACA,wDACF;GACA,YACE,WACA,SACA,yBACA,oDACF;GACA,YACE,WACA,OACA,wBACA,oDACF;GACA,YACE,WACA,SACA,0BACA,8CACF;GACA,YACE,WACA,aACA,sCACA,2CACF;EACF;CACF;CACA;EACE,SAAS;EACT,OAAO;EACP,SAAS;GACP,YACE,WACA,WACA,2BACA,uDACF;GACA,YACE,WACA,WACA,oCACA,wDA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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["links","node"],"sources":["../src/__smrt-register__.ts","../src/catalog-capability.ts","../src/catalog-policy.ts","../src/catalog-acquisition-service.ts","../src/catalog-models.ts","../src/catalog-collections.ts","../src/catalog-database-sync-store.ts","../src/catalog-materialization-service.ts","../src/catalog-read-service.ts","../src/catalog-sync-service.ts","../src/course-source.ts","../src/sources/illustrative-mathematics-parser.ts","../src/sources/oer-commons-rss-parser.ts","../src/hearth-catalog-providers.ts","../src/hearth-easy-peasy-grade4.ts","../src/recipes.ts","../src/sources/easy-peasy-parser.ts","../src/source-import-service.ts","../src/sources/google-drive-adapter.ts","../src/sources/public-illustrative-mathematics-parser.ts","../src/sources/public-illustrative-mathematics-adapter.ts"],"sourcesContent":["// Generated by @happyvertical/smrt-core smrtPlugin at library build time.\n// The package manifest is inlined so self-registration cannot miss when a\n// downstream bundler relocates this module away from dist/manifest.json\n// (https://github.com/happyvertical/smrt/issues/1506,\n// https://github.com/happyvertical/smrt/issues/1507).\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\nObjectRegistry.registerPackageManifest(JSON.parse(\"{\\\"version\\\":\\\"1.0.0\\\",\\\"timestamp\\\":0,\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"packageVersion\\\":\\\"0.57.36\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-education:CatalogProviderCollection\\\":{\\\"name\\\":\\\"catalogprovidercollection\\\",\\\"className\\\":\\\"CatalogProviderCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogProviderCollection\\\",\\\"collection\\\":\\\"catalogproviders\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogProvider\\\",\\\"exportName\\\":\\\"CatalogProviderCollection\\\",\\\"collectionExportName\\\":\\\"CatalogProviderCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_providers\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_providers\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_providers_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_providers_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"f35557a4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogResourceCollection\\\":{\\\"name\\\":\\\"catalogresourcecollection\\\",\\\"className\\\":\\\"CatalogResourceCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogResourceCollection\\\",\\\"collection\\\":\\\"catalogresources\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogResource\\\",\\\"exportName\\\":\\\"CatalogResourceCollection\\\",\\\"collectionExportName\\\":\\\"CatalogResourceCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_resources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_resources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"stable_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"canonical_url\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"supplied_description\\\\\\\" TEXT,\\\\n \\\\\\\"author\\\\\\\" TEXT,\\\\n \\\\\\\"subjects\\\\\\\" TEXT,\\\\n \\\\\\\"grades\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT,\\\\n \\\\\\\"resource_type\\\\\\\" TEXT,\\\\n \\\\\\\"parent_stable_id\\\\\\\" TEXT,\\\\n \\\\\\\"available_formats\\\\\\\" TEXT,\\\\n \\\\\\\"representation\\\\\\\" TEXT,\\\\n \\\\\\\"license_evidence\\\\\\\" TEXT,\\\\n \\\\\\\"license_state\\\\\\\" TEXT DEFAULT 'unknown',\\\\n \\\\\\\"visibility\\\\\\\" TEXT DEFAULT 'catalog',\\\\n \\\\\\\"last_seen_run_id\\\\\\\" TEXT,\\\\n \\\\\\\"withdrawn_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"canonical_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"supplied_description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"author\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subjects\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"grades\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"resource_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"parent_stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"available_formats\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"representation\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_evidence\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_state\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"unknown\\\"},\\\"visibility\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"catalog\\\"},\\\"last_seen_run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"withdrawn_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_resources_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_resources_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"e75f6bd0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSyncStateCollection\\\":{\\\"name\\\":\\\"catalogsyncstatecollection\\\",\\\"className\\\":\\\"CatalogSyncStateCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSyncStateCollection\\\",\\\"collection\\\":\\\"catalogsyncstates\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogSyncState\\\",\\\"exportName\\\":\\\"CatalogSyncStateCollection\\\",\\\"collectionExportName\\\":\\\"CatalogSyncStateCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_sync_states\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_sync_states\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"cursor\\\\\\\" TEXT,\\\\n \\\\\\\"run_id\\\\\\\" TEXT,\\\\n \\\\\\\"complete\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"paused\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"pause_reason\\\\\\\" TEXT,\\\\n \\\\\\\"imported_count\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"failures\\\\\\\" TEXT,\\\\n \\\\\\\"last_successful_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"cursor\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"complete\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"paused\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"pause_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"imported_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"failures\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"last_successful_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_sync_states_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_sync_states_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"52dc3ee1\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSelectionCollection\\\":{\\\"name\\\":\\\"catalogselectioncollection\\\",\\\"className\\\":\\\"CatalogSelectionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSelectionCollection\\\",\\\"collection\\\":\\\"catalogselections\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogSelection\\\",\\\"exportName\\\":\\\"CatalogSelectionCollection\\\",\\\"collectionExportName\\\":\\\"CatalogSelectionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_selections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_selections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selected_by_user_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"selected_revision\\\\\\\" TEXT NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selected_by_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"selected_revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_selections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_selections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_selections_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]}],\\\"version\\\":\\\"c6b02eb9\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogAcquisitionCollection\\\":{\\\"name\\\":\\\"catalogacquisitioncollection\\\",\\\"className\\\":\\\"CatalogAcquisitionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogAcquisitionCollection\\\",\\\"collection\\\":\\\"catalogacquisitions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CatalogAcquisition\\\",\\\"exportName\\\":\\\"CatalogAcquisitionCollection\\\",\\\"collectionExportName\\\":\\\"CatalogAcquisitionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_acquisitions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_acquisitions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selection_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"format\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sha256\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"attribution\\\\\\\" TEXT,\\\\n \\\\\\\"notices\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selection_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_selections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"attribution\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"notices\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_acquisitions_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_acquisitions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_selection_id_idx\\\",\\\"columns\\\":[\\\"selection_id\\\"]}],\\\"version\\\":\\\"ee9c5add\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogProvider\\\":{\\\"name\\\":\\\"catalogprovider\\\",\\\"className\\\":\\\"CatalogProvider\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogProvider\\\",\\\"collection\\\":\\\"catalogproviders\\\",\\\"description\\\":\\\"Globally visible provider registration. Hosts configure adapters and credentials out of band.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"providerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":true}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogProvider\\\",\\\"collectionExportName\\\":\\\"CatalogProviderCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"providerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"name\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"active\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_providers\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_providers\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_providers_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_providers_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"f35557a4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogResource\\\":{\\\"name\\\":\\\"catalogresource\\\",\\\"className\\\":\\\"CatalogResource\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogResource\\\",\\\"collection\\\":\\\"catalogresources\\\",\\\"description\\\":\\\"A provider-native record. Rows are intentionally not merged across providers.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"providerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"stableId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"revision\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"canonicalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"suppliedDescription\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"author\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subjects\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"grades\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"language\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"resourceType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"parentStableId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"availableFormats\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"representation\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseEvidence\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseState\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"unknown\\\",\\\"enum\\\":[\\\"verified\\\",\\\"unknown\\\",\\\"conflicting\\\",\\\"restricted\\\"]},\\\"visibility\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"catalog\\\",\\\"enum\\\":[\\\"catalog\\\",\\\"teacher\\\"]},\\\"lastSeenRunId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"withdrawnAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getRepresentation\\\":{\\\"name\\\":\\\"getRepresentation\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"CatalogResourceRepresentation | undefined\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setRepresentation\\\":{\\\"name\\\":\\\"setRepresentation\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"CatalogResourceRepresentation | undefined\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"CatalogResourceRepresentation\\\"},{\\\"type\\\":\\\"undefined\\\"}]}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogResource\\\",\\\"collectionExportName\\\":\\\"CatalogResourceCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"providerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"stableId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"revision\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_resources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_resources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"stable_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"canonical_url\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"supplied_description\\\\\\\" TEXT,\\\\n \\\\\\\"author\\\\\\\" TEXT,\\\\n \\\\\\\"subjects\\\\\\\" TEXT,\\\\n \\\\\\\"grades\\\\\\\" TEXT,\\\\n \\\\\\\"language\\\\\\\" TEXT,\\\\n \\\\\\\"resource_type\\\\\\\" TEXT,\\\\n \\\\\\\"parent_stable_id\\\\\\\" TEXT,\\\\n \\\\\\\"available_formats\\\\\\\" TEXT,\\\\n \\\\\\\"representation\\\\\\\" TEXT,\\\\n \\\\\\\"license_evidence\\\\\\\" TEXT,\\\\n \\\\\\\"license_state\\\\\\\" TEXT DEFAULT 'unknown',\\\\n \\\\\\\"visibility\\\\\\\" TEXT DEFAULT 'catalog',\\\\n \\\\\\\"last_seen_run_id\\\\\\\" TEXT,\\\\n \\\\\\\"withdrawn_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"canonical_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"supplied_description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"author\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subjects\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"grades\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"language\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"resource_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"parent_stable_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"available_formats\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"representation\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_evidence\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"license_state\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"unknown\\\"},\\\"visibility\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"catalog\\\"},\\\"last_seen_run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"withdrawn_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_resources_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_resources_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"e75f6bd0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSyncState\\\":{\\\"name\\\":\\\"catalogsyncstate\\\",\\\"className\\\":\\\"CatalogSyncState\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSyncState\\\",\\\"collection\\\":\\\"catalogsyncstates\\\",\\\"description\\\":\\\"Durable per-provider enumeration state. A failed or partial feed is never complete.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"providerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"cursor\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"runId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"complete\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":false},\\\"paused\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":false},\\\"pauseReason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"importedCount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"failures\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"lastSuccessfulAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogSyncState\\\",\\\"collectionExportName\\\":\\\"CatalogSyncStateCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"providerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"complete\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"paused\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"importedCount\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_sync_states\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_sync_states\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"provider_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"cursor\\\\\\\" TEXT,\\\\n \\\\\\\"run_id\\\\\\\" TEXT,\\\\n \\\\\\\"complete\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"paused\\\\\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\\\n \\\\\\\"pause_reason\\\\\\\" TEXT,\\\\n \\\\\\\"imported_count\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"failures\\\\\\\" TEXT,\\\\n \\\\\\\"last_successful_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"provider_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"cursor\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"run_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"complete\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"paused\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":false},\\\"pause_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"imported_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"failures\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"last_successful_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_sync_states_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_sync_states_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]}],\\\"version\\\":\\\"52dc3ee1\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogSelection\\\":{\\\"name\\\":\\\"catalogselection\\\",\\\"className\\\":\\\"CatalogSelection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogSelection\\\",\\\"collection\\\":\\\"catalogselections\\\",\\\"description\\\":\\\"Tenant-owned intent to use a metadata record, distinct from acquiring bytes.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"resourceId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CatalogResource\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"selectedByUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"selectedRevision\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogSelection\\\",\\\"collectionExportName\\\":\\\"CatalogSelectionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"resourceId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"selectedByUserId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"selectedRevision\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_selections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_selections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selected_by_user_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"selected_revision\\\\\\\" TEXT NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selected_by_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"selected_revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_selections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_selections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_selections_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]}],\\\"version\\\":\\\"c6b02eb9\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CatalogAcquisition\\\":{\\\"name\\\":\\\"catalogacquisition\\\",\\\"className\\\":\\\"CatalogAcquisition\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CatalogAcquisition\\\",\\\"collection\\\":\\\"catalogacquisitions\\\",\\\"description\\\":\\\"A pinned, tenant-owned acquisition record. Bytes belong in a host storage service.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"resourceId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CatalogResource\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"selectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CatalogSelection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"revision\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"format\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"sha256\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"attribution\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"notices\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CatalogAcquisition\\\",\\\"collectionExportName\\\":\\\"CatalogAcquisitionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"resourceId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"selectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"revision\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"format\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sha256\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"catalog_acquisitions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"catalog_acquisitions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"resource_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"selection_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"format\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sha256\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"attribution\\\\\\\" TEXT,\\\\n \\\\\\\"notices\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"resource_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_resources\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"selection_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"catalog_selections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"format\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"attribution\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"notices\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"catalog_acquisitions_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"catalog_acquisitions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_resource_id_idx\\\",\\\"columns\\\":[\\\"resource_id\\\"]},{\\\"name\\\":\\\"catalog_acquisitions_selection_id_idx\\\",\\\"columns\\\":[\\\"selection_id\\\"]}],\\\"version\\\":\\\"ee9c5add\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Course\\\":{\\\"name\\\":\\\"course\\\",\\\"className\\\":\\\"Course\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Course\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"summary\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"license\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"own-work\\\",\\\"enum\\\":[\\\"own-work\\\",\\\"open-license\\\",\\\"personal-use-copy\\\",\\\"licensed-for-sharing\\\"]},\\\"licenseNote\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"attestedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"levelMin\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"levelMax\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Course\\\",\\\"collectionExportName\\\":\\\"CourseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"levelMin\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"levelMax\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCourse\\\":{\\\"name\\\":\\\"externalcourse\\\",\\\"className\\\":\\\"ExternalCourse\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCourse\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"summary\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"license\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"own-work\\\",\\\"enum\\\":[\\\"own-work\\\",\\\"open-license\\\",\\\"personal-use-copy\\\",\\\"licensed-for-sharing\\\"]},\\\"licenseNote\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"attestedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"levelMin\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"levelMax\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Course\\\",\\\"exportName\\\":\\\"ExternalCourse\\\",\\\"collectionExportName\\\":\\\"ExternalCourseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"levelMin\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"levelMax\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:AuthoredCourse\\\":{\\\"name\\\":\\\"authoredcourse\\\",\\\"className\\\":\\\"AuthoredCourse\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:AuthoredCourse\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"summary\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"license\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"licenseKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"own-work\\\",\\\"enum\\\":[\\\"own-work\\\",\\\"open-license\\\",\\\"personal-use-copy\\\",\\\"licensed-for-sharing\\\"]},\\\"licenseNote\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"attestedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"levelMin\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"levelMax\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Course\\\",\\\"exportName\\\":\\\"AuthoredCourse\\\",\\\"collectionExportName\\\":\\\"AuthoredCourseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"levelMin\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"levelMax\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSection\\\":{\\\"name\\\":\\\"coursesection\\\",\\\"className\\\":\\\"CourseSection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSection\\\",\\\"collection\\\":\\\"coursesections\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"courseId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Course\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CourseSection\\\",\\\"collectionExportName\\\":\\\"CourseSectionCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"courseId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"course_sections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"course_sections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"course_sections_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"e20480d7\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Lesson\\\":{\\\"name\\\":\\\"lesson\\\",\\\"className\\\":\\\"Lesson\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Lesson\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Lesson\\\",\\\"collectionExportName\\\":\\\"LessonCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"092df043\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Reading\\\":{\\\"name\\\":\\\"reading\\\",\\\"className\\\":\\\"Reading\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Reading\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Reading\\\",\\\"collectionExportName\\\":\\\"ReadingCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9d8b6fcd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Video\\\":{\\\"name\\\":\\\"video\\\",\\\"className\\\":\\\"Video\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Video\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"videoUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Video\\\",\\\"collectionExportName\\\":\\\"VideoCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9e0ef984\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Worksheet\\\":{\\\"name\\\":\\\"worksheet\\\",\\\"className\\\":\\\"Worksheet\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Worksheet\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"submit\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"printableUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"answerUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Worksheet\\\",\\\"collectionExportName\\\":\\\"WorksheetCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"},{\\\"field\\\":\\\"pages\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"10976938\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Exercise\\\":{\\\"name\\\":\\\"exercise\\\",\\\"className\\\":\\\"Exercise\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Exercise\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/catalog.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true}}},\\\"sectionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"CourseSection\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"body\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"estimatedMinutes\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"online\\\",\\\"enum\\\":[\\\"online\\\",\\\"printable\\\",\\\"kit\\\",\\\"video\\\",\\\"game\\\",\\\"mixed\\\"]},\\\"completionRule\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"attest\\\",\\\"enum\\\":[\\\"attest\\\",\\\"submit\\\",\\\"score\\\",\\\"external\\\"]},\\\"externalRef\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"externalUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"Exercise\\\",\\\"collectionExportName\\\":\\\"ExerciseCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"sectionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"estimatedMinutes\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"difficulty\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"decimal\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"145eadbe\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseCollection\\\":{\\\"name\\\":\\\"coursecollection\\\",\\\"className\\\":\\\"CourseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseCollection\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Course\\\",\\\"exportName\\\":\\\"CourseCollection\\\",\\\"collectionExportName\\\":\\\"CourseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCourseCollection\\\":{\\\"name\\\":\\\"externalcoursecollection\\\",\\\"className\\\":\\\"ExternalCourseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCourseCollection\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ExternalCourse\\\",\\\"exportName\\\":\\\"ExternalCourseCollection\\\",\\\"collectionExportName\\\":\\\"ExternalCourseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:AuthoredCourseCollection\\\":{\\\"name\\\":\\\"authoredcoursecollection\\\",\\\"className\\\":\\\"AuthoredCourseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:AuthoredCourseCollection\\\",\\\"collection\\\":\\\"courses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"AuthoredCourse\\\",\\\"exportName\\\":\\\"AuthoredCourseCollection\\\",\\\"collectionExportName\\\":\\\"AuthoredCourseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"courses\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"courses\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"summary\\\\\\\" TEXT,\\\\n \\\\\\\"description\\\\\\\" TEXT,\\\\n \\\\\\\"source_key\\\\\\\" TEXT,\\\\n \\\\\\\"source_url\\\\\\\" TEXT,\\\\n \\\\\\\"source_ref\\\\\\\" TEXT,\\\\n \\\\\\\"license\\\\\\\" TEXT,\\\\n \\\\\\\"license_kind\\\\\\\" TEXT DEFAULT 'own-work',\\\\n \\\\\\\"license_note\\\\\\\" TEXT,\\\\n \\\\\\\"attested_by\\\\\\\" TEXT,\\\\n \\\\\\\"subject\\\\\\\" TEXT,\\\\n \\\\\\\"tags\\\\\\\" TEXT,\\\\n \\\\\\\"level_min\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"level_max\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"summary\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"source_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"license_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"own-work\\\"},\\\"license_note\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"attested_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"subject\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"tags\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"level_min\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"level_max\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"draft\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"courses_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"courses_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"courses_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"88cc23ab\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSectionCollection\\\":{\\\"name\\\":\\\"coursesectioncollection\\\",\\\"className\\\":\\\"CourseSectionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSectionCollection\\\",\\\"collection\\\":\\\"coursesections\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CourseSection\\\",\\\"exportName\\\":\\\"CourseSectionCollection\\\",\\\"collectionExportName\\\":\\\"CourseSectionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"course_sections\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sections\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sections_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"course_sections_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"course_sections_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"e20480d7\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonCollection\\\":{\\\"name\\\":\\\"lessoncollection\\\",\\\"className\\\":\\\"LessonCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Lesson\\\",\\\"exportName\\\":\\\"LessonCollection\\\",\\\"collectionExportName\\\":\\\"LessonCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"092df043\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ReadingCollection\\\":{\\\"name\\\":\\\"readingcollection\\\",\\\"className\\\":\\\"ReadingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ReadingCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Reading\\\",\\\"exportName\\\":\\\"ReadingCollection\\\",\\\"collectionExportName\\\":\\\"ReadingCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9d8b6fcd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:VideoCollection\\\":{\\\"name\\\":\\\"videocollection\\\",\\\"className\\\":\\\"VideoCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:VideoCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Video\\\",\\\"exportName\\\":\\\"VideoCollection\\\",\\\"collectionExportName\\\":\\\"VideoCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"9e0ef984\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorksheetCollection\\\":{\\\"name\\\":\\\"worksheetcollection\\\",\\\"className\\\":\\\"WorksheetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorksheetCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Worksheet\\\",\\\"exportName\\\":\\\"WorksheetCollection\\\",\\\"collectionExportName\\\":\\\"WorksheetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"10976938\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExerciseCollection\\\":{\\\"name\\\":\\\"exercisecollection\\\",\\\"className\\\":\\\"ExerciseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExerciseCollection\\\",\\\"collection\\\":\\\"lessons\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Exercise\\\",\\\"exportName\\\":\\\"ExerciseCollection\\\",\\\"collectionExportName\\\":\\\"ExerciseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lessons\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lessons\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"section_id\\\\\\\" UUID,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"body\\\\\\\" TEXT,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"estimated_minutes\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"difficulty\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"modality\\\\\\\" TEXT DEFAULT 'online',\\\\n \\\\\\\"completion_rule\\\\\\\" TEXT DEFAULT 'attest',\\\\n \\\\\\\"external_ref\\\\\\\" TEXT,\\\\n \\\\\\\"external_url\\\\\\\" TEXT,\\\\n \\\\\\\"video_url\\\\\\\" TEXT,\\\\n \\\\\\\"printable_url\\\\\\\" TEXT,\\\\n \\\\\\\"answer_url\\\\\\\" TEXT,\\\\n \\\\\\\"pages\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"section_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"course_sections\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"body\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"estimated_minutes\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"difficulty\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"modality\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"online\\\"},\\\"completion_rule\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"attest\\\"},\\\"external_ref\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"external_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"video_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"printable_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"answer_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"pages\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lessons_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lessons_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"lessons_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lessons_section_id_idx\\\",\\\"columns\\\":[\\\"section_id\\\"]}],\\\"version\\\":\\\"145eadbe\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonAssetCollection\\\":{\\\"name\\\":\\\"lessonassetcollection\\\",\\\"className\\\":\\\"LessonAssetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonAssetCollection\\\",\\\"collection\\\":\\\"lessonassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"byRight\\\":{\\\"name\\\":\\\"byRight\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"byLeft\\\":{\\\"name\\\":\\\"byLeft\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"attach\\\":{\\\"name\\\":\\\"attach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"detach\\\":{\\\"name\\\":\\\"detach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setLinks\\\":{\\\"name\\\":\\\"setLinks\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightIds\\\",\\\"type\\\":\\\"string[]\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtJunction\\\",\\\"extendsTypeArg\\\":\\\"LessonAsset\\\",\\\"exportName\\\":\\\"LessonAssetCollection\\\",\\\"collectionExportName\\\":\\\"LessonAssetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'attachment',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"attachment\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_assets_tenant_id_lesson_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"lesson_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lesson_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_assets_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"lesson_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d96385c6\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LearnerCollection\\\":{\\\"name\\\":\\\"learnercollection\\\",\\\"className\\\":\\\"LearnerCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LearnerCollection\\\",\\\"collection\\\":\\\"learners\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Learner\\\",\\\"exportName\\\":\\\"LearnerCollection\\\",\\\"collectionExportName\\\":\\\"LearnerCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"learners\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"learners\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"user_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"profile_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"display_name\\\\\\\" TEXT,\\\\n \\\\\\\"birth_date\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"level\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"settings\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"user_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"display_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"birth_date\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"level\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"settings\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"learners_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"learners_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"learners_user_id_idx\\\",\\\"columns\\\":[\\\"user_id\\\"]},{\\\"name\\\":\\\"learners_profile_id_idx\\\",\\\"columns\\\":[\\\"profile_id\\\"]}],\\\"version\\\":\\\"ca9907b5\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CurriculumCollection\\\":{\\\"name\\\":\\\"curriculumcollection\\\",\\\"className\\\":\\\"CurriculumCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CurriculumCollection\\\",\\\"collection\\\":\\\"curriculums\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"curricula\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Curriculum\\\",\\\"exportName\\\":\\\"CurriculumCollection\\\",\\\"collectionExportName\\\":\\\"CurriculumCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"curricula\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"curricula\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"starts_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"ends_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"starts_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"ends_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"curricula_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"curricula_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"curricula_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"b7e90cbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:EnrollmentCollection\\\":{\\\"name\\\":\\\"enrollmentcollection\\\",\\\"className\\\":\\\"EnrollmentCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:EnrollmentCollection\\\",\\\"collection\\\":\\\"enrollments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Enrollment\\\",\\\"exportName\\\":\\\"EnrollmentCollection\\\",\\\"collectionExportName\\\":\\\"EnrollmentCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"enrollments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"enrollments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"curriculum_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"target_minutes_per_week\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"curriculum_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"curricula\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"target_minutes_per_week\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"enrollments_tenant_id_curriculum_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"curriculum_id\\\",\\\"course_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"enrollments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"enrollments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"enrollments_curriculum_id_idx\\\",\\\"columns\\\":[\\\"curriculum_id\\\"]},{\\\"name\\\":\\\"enrollments_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"enrollments_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"2a34b5ee\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonProgressCollection\\\":{\\\"name\\\":\\\"lessonprogresscollection\\\",\\\"className\\\":\\\"LessonProgressCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonProgressCollection\\\",\\\"collection\\\":\\\"lessonprogresses\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lesson_progress\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"LessonProgress\\\",\\\"exportName\\\":\\\"LessonProgressCollection\\\",\\\"collectionExportName\\\":\\\"LessonProgressCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_progress\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_progress\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'not_started',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"time_spent_seconds\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"attempts\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"best_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"not_started\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"time_spent_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"attempts\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"best_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_progress_tenant_id_enrollment_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"enrollment_id\\\",\\\"lesson_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"lesson_progress_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_progress_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_progress_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"lesson_progress_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"lesson_progress_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"36704fbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionCollection\\\":{\\\"name\\\":\\\"submissioncollection\\\",\\\"className\\\":\\\"SubmissionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"SubmissionCollection\\\",\\\"collectionExportName\\\":\\\"SubmissionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"27a21ab4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionIntakeBindingCollection\\\":{\\\"name\\\":\\\"submissionintakebindingcollection\\\",\\\"className\\\":\\\"SubmissionIntakeBindingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionIntakeBindingCollection\\\",\\\"collection\\\":\\\"submissionintakebindings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SubmissionIntakeBinding\\\",\\\"exportName\\\":\\\"SubmissionIntakeBindingCollection\\\",\\\"collectionExportName\\\":\\\"SubmissionIntakeBindingCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_intake_bindings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_intake_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_item_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_intake_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]}],\\\"version\\\":\\\"7102c909\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ScannedSubmissionCollection\\\":{\\\"name\\\":\\\"scannedsubmissioncollection\\\",\\\"className\\\":\\\"ScannedSubmissionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ScannedSubmissionCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ScannedSubmission\\\",\\\"exportName\\\":\\\"ScannedSubmissionCollection\\\",\\\"collectionExportName\\\":\\\"ScannedSubmissionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"7c394510\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCompletionCollection\\\":{\\\"name\\\":\\\"externalcompletioncollection\\\",\\\"className\\\":\\\"ExternalCompletionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCompletionCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ExternalCompletion\\\",\\\"exportName\\\":\\\"ExternalCompletionCollection\\\",\\\"collectionExportName\\\":\\\"ExternalCompletionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"eff3715d\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:AttestationCollection\\\":{\\\"name\\\":\\\"attestationcollection\\\",\\\"className\\\":\\\"AttestationCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:AttestationCollection\\\",\\\"collection\\\":\\\"submissions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Attestation\\\",\\\"exportName\\\":\\\"AttestationCollection\\\",\\\"collectionExportName\\\":\\\"AttestationCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"4f3230a3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:GradeCollection\\\":{\\\"name\\\":\\\"gradecollection\\\",\\\"className\\\":\\\"GradeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:GradeCollection\\\",\\\"collection\\\":\\\"grades\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Grade\\\",\\\"exportName\\\":\\\"GradeCollection\\\",\\\"collectionExportName\\\":\\\"GradeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"grades\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"grades\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"grader_kind\\\\\\\" TEXT NOT NULL DEFAULT 'auto',\\\\n \\\\\\\"grader_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"score\\\\\\\" REAL,\\\\n \\\\\\\"points_earned\\\\\\\" INTEGER,\\\\n \\\\\\\"points_possible\\\\\\\" INTEGER,\\\\n \\\\\\\"rubric_results\\\\\\\" TEXT,\\\\n \\\\\\\"feedback\\\\\\\" TEXT,\\\\n \\\\\\\"graded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"grader_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"auto\\\"},\\\"grader_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_earned\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_possible\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"rubric_results\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"feedback\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"graded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"grades_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"grades_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"grades_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"grades_grader_profile_id_idx\\\",\\\"columns\\\":[\\\"grader_profile_id\\\"]}],\\\"version\\\":\\\"7d629fec\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionAssetCollection\\\":{\\\"name\\\":\\\"submissionassetcollection\\\",\\\"className\\\":\\\"SubmissionAssetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionAssetCollection\\\",\\\"collection\\\":\\\"submissionassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/collections.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"byRight\\\":{\\\"name\\\":\\\"byRight\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"byLeft\\\":{\\\"name\\\":\\\"byLeft\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"attach\\\":{\\\"name\\\":\\\"attach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TItem>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"detach\\\":{\\\"name\\\":\\\"detach\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionFilterOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setLinks\\\":{\\\"name\\\":\\\"setLinks\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"leftId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"rightIds\\\",\\\"type\\\":\\\"string[]\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"opts\\\",\\\"type\\\":\\\"JunctionAttachOptions\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtJunction\\\",\\\"extendsTypeArg\\\":\\\"SubmissionAsset\\\",\\\"exportName\\\":\\\"SubmissionAssetCollection\\\",\\\"collectionExportName\\\":\\\"SubmissionAssetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'page',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"page\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_assets_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_assets_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"submission_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d9b61c8a\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSource\\\":{\\\"name\\\":\\\"coursesource\\\",\\\"className\\\":\\\"CourseSource\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSource\\\",\\\"collection\\\":\\\"coursesources\\\",\\\"description\\\":\\\"Host-managed source policy; deliberately has no generated CRUD surface.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/course-source.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"key\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"adapter\\\",\\\"enum\\\":[\\\"manual\\\",\\\"url\\\",\\\"adapter\\\"]},\\\"adapterKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"config\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sharing\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"private\\\",\\\"enum\\\":[\\\"private\\\",\\\"group\\\",\\\"global\\\"]}},\\\"methods\\\":{\\\"getConfig\\\":{\\\"name\\\":\\\"getConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"CourseSourceConfig\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setConfig\\\":{\\\"name\\\":\\\"setConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"CourseSourceConfig\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"cli\\\":false,\\\"mcp\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CourseSource\\\",\\\"collectionExportName\\\":\\\"CourseSourceCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"key\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"name\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"course_sources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"key\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'adapter',\\\\n \\\\\\\"adapter_key\\\\\\\" TEXT,\\\\n \\\\\\\"config\\\\\\\" TEXT,\\\\n \\\\\\\"sharing\\\\\\\" TEXT DEFAULT 'private'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"adapter\\\"},\\\"adapter_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sharing\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"private\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sources_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"course_sources_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"98177eb3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:CourseSourceCollection\\\":{\\\"name\\\":\\\"coursesourcecollection\\\",\\\"className\\\":\\\"CourseSourceCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:CourseSourceCollection\\\",\\\"collection\\\":\\\"coursesources\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/course-source.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CourseSource\\\",\\\"exportName\\\":\\\"CourseSourceCollection\\\",\\\"collectionExportName\\\":\\\"CourseSourceCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"course_sources\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"course_sources\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"key\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'adapter',\\\\n \\\\\\\"adapter_key\\\\\\\" TEXT,\\\\n \\\\\\\"config\\\\\\\" TEXT,\\\\n \\\\\\\"sharing\\\\\\\" TEXT DEFAULT 'private'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"adapter\\\"},\\\"adapter_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sharing\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"private\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"course_sources_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"course_sources_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"98177eb3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Learner\\\":{\\\"name\\\":\\\"learner\\\",\\\"className\\\":\\\"Learner\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Learner\\\",\\\"collection\\\":\\\"learners\\\",\\\"description\\\":\\\"A learner is a real user/profile identity with active family membership.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"userId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-users:User\\\"},\\\"profileId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-profiles:Profile\\\"},\\\"displayName\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"birthDate\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"level\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"settings\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getSettings\\\":{\\\"name\\\":\\\"getSettings\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setSettings\\\":{\\\"name\\\":\\\"setSettings\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Learner\\\",\\\"collectionExportName\\\":\\\"LearnerCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"userId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"profileId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"level\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"learners\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"learners\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"user_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"profile_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"display_name\\\\\\\" TEXT,\\\\n \\\\\\\"birth_date\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"level\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"settings\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"user_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"display_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"birth_date\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"level\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"settings\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"learners_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"learners_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"learners_user_id_idx\\\",\\\"columns\\\":[\\\"user_id\\\"]},{\\\"name\\\":\\\"learners_profile_id_idx\\\",\\\"columns\\\":[\\\"profile_id\\\"]}],\\\"version\\\":\\\"ca9907b5\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Curriculum\\\":{\\\"name\\\":\\\"curriculum\\\",\\\"className\\\":\\\"Curriculum\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Curriculum\\\",\\\"collection\\\":\\\"curriculums\\\",\\\"description\\\":\\\"A distinct plan retains its own enrollment history.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"startsOn\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"endsOn\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"planned\\\",\\\"enum\\\":[\\\"planned\\\",\\\"active\\\",\\\"completed\\\",\\\"archived\\\"]}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableName\\\":\\\"curricula\\\",\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Curriculum\\\",\\\"collectionExportName\\\":\\\"CurriculumCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"title\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"curricula\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"curricula\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"title\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"starts_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"ends_on\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"starts_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"ends_on\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"curricula_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"curricula_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"curricula_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"b7e90cbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Enrollment\\\":{\\\"name\\\":\\\"enrollment\\\",\\\"className\\\":\\\"Enrollment\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Enrollment\\\",\\\"collection\\\":\\\"enrollments\\\",\\\"description\\\":\\\"One course in one curriculum; a new curriculum means a new enrollment.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"curriculumId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Curriculum\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"courseId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Course\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"planned\\\",\\\"enum\\\":[\\\"planned\\\",\\\"active\\\",\\\"paused\\\",\\\"completed\\\",\\\"dropped\\\"]},\\\"startedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"completedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"targetMinutesPerWeek\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"curriculum_id\\\",\\\"course_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Enrollment\\\",\\\"collectionExportName\\\":\\\"EnrollmentCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"curriculumId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"courseId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"targetMinutesPerWeek\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"enrollments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"enrollments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"curriculum_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"course_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'planned',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"target_minutes_per_week\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"curriculum_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"curricula\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"course_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"courses\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"planned\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"target_minutes_per_week\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"enrollments_tenant_id_curriculum_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"curriculum_id\\\",\\\"course_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"enrollments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"enrollments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"enrollments_curriculum_id_idx\\\",\\\"columns\\\":[\\\"curriculum_id\\\"]},{\\\"name\\\":\\\"enrollments_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"enrollments_course_id_idx\\\",\\\"columns\\\":[\\\"course_id\\\"]}],\\\"version\\\":\\\"2a34b5ee\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonProgress\\\":{\\\"name\\\":\\\"lessonprogress\\\",\\\"className\\\":\\\"LessonProgress\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonProgress\\\",\\\"collection\\\":\\\"lessonprogresses\\\",\\\"description\\\":\\\"Progress identity is enrollment + lesson, never learner + lesson.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/learners.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"enrollmentId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Enrollment\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"not_started\\\",\\\"enum\\\":[\\\"not_started\\\",\\\"in_progress\\\",\\\"submitted\\\",\\\"needs_review\\\",\\\"complete\\\",\\\"skipped\\\"]},\\\"startedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"completedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"timeSpentSeconds\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"attempts\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"bestScore\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableName\\\":\\\"lesson_progress\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"enrollment_id\\\",\\\"lesson_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"LessonProgress\\\",\\\"collectionExportName\\\":\\\"LessonProgressCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"enrollmentId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"timeSpentSeconds\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"},{\\\"field\\\":\\\"attempts\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_progress\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_progress\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'not_started',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"completed_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"time_spent_seconds\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"attempts\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"best_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"not_started\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"completed_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"time_spent_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"attempts\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"best_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_progress_tenant_id_enrollment_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"enrollment_id\\\",\\\"lesson_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"lesson_progress_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_progress_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_progress_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"lesson_progress_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"lesson_progress_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"36704fbd\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:LessonAsset\\\":{\\\"name\\\":\\\"lessonasset\\\",\\\"className\\\":\\\"LessonAsset\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:LessonAsset\\\",\\\"collection\\\":\\\"lessonassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/lesson-assets.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"relationship\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"attachment\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"printable\\\",\\\"answer-key\\\",\\\"video\\\",\\\"attachment\\\"]},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"lesson_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"LessonAsset\\\",\\\"collectionExportName\\\":\\\"LessonAssetCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"assetId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"relationship\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"lesson_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"lesson_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'attachment',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"attachment\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"lesson_assets_tenant_id_lesson_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"lesson_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"lesson_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"lesson_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"lesson_assets_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"lesson_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d96385c6\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Submission\\\":{\\\"name\\\":\\\"submission\\\",\\\"className\\\":\\\"Submission\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Submission\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"Evidence that a learner completed one progress item.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableStrategy\\\":\\\"sti\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Submission\\\",\\\"collectionExportName\\\":\\\"SubmissionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"27a21ab4\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionIntakeBinding\\\":{\\\"name\\\":\\\"submissionintakebinding\\\",\\\"className\\\":\\\"SubmissionIntakeBinding\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionIntakeBinding\\\",\\\"collection\\\":\\\"submissionintakebindings\\\",\\\"description\\\":\\\"Durable tenant/item claim for trusted ingestion receipts. This separate table keeps ordinary uploads (which have no intake item) out of the uniqueness key.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"required\\\":true}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"intake_item_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SubmissionIntakeBinding\\\",\\\"collectionExportName\\\":\\\"SubmissionIntakeBindingCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"intakeItemId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submission_intake_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_intake_bindings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_intake_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_item_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_intake_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_intake_bindings_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]}],\\\"version\\\":\\\"7102c909\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ScannedSubmission\\\":{\\\"name\\\":\\\"scannedsubmission\\\",\\\"className\\\":\\\"ScannedSubmission\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ScannedSubmission\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"Photos or scans of work submitted for review.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"pageCount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"ocrText\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getExtracted\\\":{\\\"name\\\":\\\"getExtracted\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setExtracted\\\":{\\\"name\\\":\\\"setExtracted\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"ScannedSubmission\\\",\\\"collectionExportName\\\":\\\"ScannedSubmissionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"pageCount\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"7c394510\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:ExternalCompletion\\\":{\\\"name\\\":\\\"externalcompletion\\\",\\\"className\\\":\\\"ExternalCompletion\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:ExternalCompletion\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"Completion reported by the learner, guardian, or external source.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"reportedBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"learner\\\",\\\"enum\\\":[\\\"learner\\\",\\\"guardian\\\",\\\"source\\\"]},\\\"evidenceUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reportedScore\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"ExternalCompletion\\\",\\\"collectionExportName\\\":\\\"ExternalCompletionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"eff3715d\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Attestation\\\":{\\\"name\\\":\\\"attestation\\\",\\\"className\\\":\\\"Attestation\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Attestation\\\",\\\"collection\\\":\\\"submissions\\\",\\\"description\\\":\\\"A guardian's statement that work was completed.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"created_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updated_at\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"progressId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"LessonProgress\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submittedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"captured\\\",\\\"enum\\\":[\\\"captured\\\",\\\"extracting\\\",\\\"needs_review\\\",\\\"graded\\\",\\\"rejected\\\"]},\\\"notes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"captureDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"completed_work\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"blank_reference\\\",\\\"completed_work\\\"]},\\\"previousSubmissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"intakeItemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tableStrategy\\\":\\\"sti\\\"},\\\"extends\\\":\\\"Submission\\\",\\\"exportName\\\":\\\"Attestation\\\",\\\"collectionExportName\\\":\\\"AttestationCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"progressId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"kind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submissions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submissions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"_meta_type\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"_meta_data\\\\\\\" JSON,\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"learner_id\\\\\\\" UUID,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID,\\\\n \\\\\\\"progress_id\\\\\\\" UUID,\\\\n \\\\\\\"submitted_at\\\\\\\" TEXT,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'captured',\\\\n \\\\\\\"notes\\\\\\\" TEXT,\\\\n \\\\\\\"capture_key\\\\\\\" TEXT,\\\\n \\\\\\\"capture_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'completed_work',\\\\n \\\\\\\"previous_submission_id\\\\\\\" UUID,\\\\n \\\\\\\"intake_item_id\\\\\\\" TEXT,\\\\n \\\\\\\"page_count\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"ocr_text\\\\\\\" TEXT,\\\\n \\\\\\\"extracted\\\\\\\" TEXT,\\\\n \\\\\\\"reported_by\\\\\\\" TEXT DEFAULT 'learner',\\\\n \\\\\\\"evidence_url\\\\\\\" TEXT,\\\\n \\\\\\\"reported_score\\\\\\\" REAL\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"_meta_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"_meta_data\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"progress_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lesson_progress\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submitted_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"captured\\\"},\\\"notes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"capture_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"completed_work\\\"},\\\"previous_submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"page_count\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"default\\\":0},\\\"ocr_text\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"extracted\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"default\\\":\\\"learner\\\"},\\\"evidence_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false},\\\"reported_score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"submissions_slug_context_meta_type_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\",\\\"_meta_type\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"submissions_meta_type_idx\\\",\\\"columns\\\":[\\\"_meta_type\\\"]},{\\\"name\\\":\\\"submissions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submissions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"submissions_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]},{\\\"name\\\":\\\"submissions_progress_id_idx\\\",\\\"columns\\\":[\\\"progress_id\\\"]},{\\\"name\\\":\\\"submissions_previous_submission_id_idx\\\",\\\"columns\\\":[\\\"previous_submission_id\\\"]}],\\\"version\\\":\\\"4f3230a3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:SubmissionAsset\\\":{\\\"name\\\":\\\"submissionasset\\\",\\\"className\\\":\\\"SubmissionAsset\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:SubmissionAsset\\\",\\\"collection\\\":\\\"submissionassets\\\",\\\"description\\\":\\\"The tenant-owned files attached to a submission.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"relationship\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"page\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"page\\\",\\\"attachment\\\"]},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SubmissionAsset\\\",\\\"collectionExportName\\\":\\\"SubmissionAssetCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"assetId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"relationship\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"sortOrder\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"submission_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"submission_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"relationship\\\\\\\" TEXT NOT NULL DEFAULT 'page',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"relationship\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"page\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"submission_assets_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\",\\\"asset_id\\\",\\\"relationship\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"submission_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"submission_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"submission_assets_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"submission_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"d9b61c8a\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Grade\\\":{\\\"name\\\":\\\"grade\\\",\\\"className\\\":\\\"Grade\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Grade\\\",\\\"collection\\\":\\\"grades\\\",\\\"description\\\":\\\"An assessment of a submission; the service selects the authoritative grade.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/submissions.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"graderKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"auto\\\",\\\"_meta\\\":{\\\"required\\\":true},\\\"enum\\\":[\\\"auto\\\",\\\"ai\\\",\\\"guardian\\\",\\\"instructor\\\"]},\\\"graderProfileId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-profiles:Profile\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"score\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"pointsEarned\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"pointsPossible\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"rubricResults\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"feedback\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"gradedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getRubricResults\\\":{\\\"name\\\":\\\"getRubricResults\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setRubricResults\\\":{\\\"name\\\":\\\"setRubricResults\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Grade\\\",\\\"collectionExportName\\\":\\\"GradeCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"graderKind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"grades\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"grades\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"grader_kind\\\\\\\" TEXT NOT NULL DEFAULT 'auto',\\\\n \\\\\\\"grader_profile_id\\\\\\\" UUID,\\\\n \\\\\\\"score\\\\\\\" REAL,\\\\n \\\\\\\"points_earned\\\\\\\" INTEGER,\\\\n \\\\\\\"points_possible\\\\\\\" INTEGER,\\\\n \\\\\\\"rubric_results\\\\\\\" TEXT,\\\\n \\\\\\\"feedback\\\\\\\" TEXT,\\\\n \\\\\\\"graded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"grader_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"auto\\\"},\\\"grader_profile_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"score\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_earned\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"points_possible\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"rubric_results\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"feedback\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"graded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"grades_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"grades_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"grades_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"grades_grader_profile_id_idx\\\",\\\"columns\\\":[\\\"grader_profile_id\\\"]}],\\\"version\\\":\\\"7d629fec\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:Workbook\\\":{\\\"name\\\":\\\"workbook\\\",\\\"className\\\":\\\"Workbook\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:Workbook\\\",\\\"collection\\\":\\\"workbooks\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"title\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"edition\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reviewRequired\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":true},\\\"policyVersion\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":1}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"learner_id\\\",\\\"workbook_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Workbook\\\",\\\"collectionExportName\\\":\\\"WorkbookCollection\\\",\\\"displayLabelField\\\":\\\"title\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"reviewRequired\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"policyVersion\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbooks\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_key\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"edition\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"edition\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbooks_tenant_id_learner_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"learner_id\\\",\\\"workbook_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbooks_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbooks_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbooks_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"a5b56a39\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookCollection\\\":{\\\"name\\\":\\\"workbookcollection\\\",\\\"className\\\":\\\"WorkbookCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookCollection\\\",\\\"collection\\\":\\\"workbooks\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Workbook\\\",\\\"exportName\\\":\\\"WorkbookCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbooks\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbooks\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_key\\\\\\\" TEXT,\\\\n \\\\\\\"title\\\\\\\" TEXT,\\\\n \\\\\\\"edition\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"title\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"edition\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbooks_tenant_id_learner_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"learner_id\\\",\\\"workbook_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbooks_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbooks_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbooks_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"a5b56a39\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookActivity\\\":{\\\"name\\\":\\\"workbookactivity\\\",\\\"className\\\":\\\"WorkbookActivity\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookActivity\\\",\\\"collection\\\":\\\"workbookactivities\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Workbook\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"captureKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"default\\\":\\\"identified\\\",\\\"_meta\\\":{\\\"required\\\":true,\\\"default\\\":\\\"identified\\\"}},\\\"photoIntakeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookPhotoIntake\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"enrollmentId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Enrollment\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"lessonId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Lesson\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"pageKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"pageLabel\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"workbook_id\\\",\\\"page_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookActivity\\\",\\\"collectionExportName\\\":\\\"WorkbookActivityCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"captureKind\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"text\\\"},{\\\"field\\\":\\\"enrollmentId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"lessonId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_activities\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID,\\\\n \\\\\\\"capture_kind\\\\\\\" TEXT NOT NULL DEFAULT 'identified',\\\\n \\\\\\\"photo_intake_id\\\\\\\" UUID,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"page_key\\\\\\\" TEXT,\\\\n \\\\\\\"page_label\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"capture_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"identified\\\"},\\\"photo_intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"page_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"page_label\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_activities_tenant_id_workbook_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"workbook_id\\\",\\\"page_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_activities_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_activities_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_activities_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_activities_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_activities_photo_intake_id_idx\\\",\\\"columns\\\":[\\\"photo_intake_id\\\"]},{\\\"name\\\":\\\"workbook_activities_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"workbook_activities_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"320c8eb0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookActivityCollection\\\":{\\\"name\\\":\\\"workbookactivitycollection\\\",\\\"className\\\":\\\"WorkbookActivityCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookActivityCollection\\\",\\\"collection\\\":\\\"workbookactivities\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookActivity\\\",\\\"exportName\\\":\\\"WorkbookActivityCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookActivityCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_activities\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_activities\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID,\\\\n \\\\\\\"capture_kind\\\\\\\" TEXT NOT NULL DEFAULT 'identified',\\\\n \\\\\\\"photo_intake_id\\\\\\\" UUID,\\\\n \\\\\\\"enrollment_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"lesson_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"page_key\\\\\\\" TEXT,\\\\n \\\\\\\"page_label\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"capture_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":\\\"identified\\\"},\\\"photo_intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"enrollment_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"enrollments\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"lesson_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"lessons\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"page_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"page_label\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_activities_tenant_id_workbook_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"workbook_id\\\",\\\"page_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_activities_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_activities_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_activities_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_activities_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_activities_photo_intake_id_idx\\\",\\\"columns\\\":[\\\"photo_intake_id\\\"]},{\\\"name\\\":\\\"workbook_activities_enrollment_id_idx\\\",\\\"columns\\\":[\\\"enrollment_id\\\"]},{\\\"name\\\":\\\"workbook_activities_lesson_id_idx\\\",\\\"columns\\\":[\\\"lesson_id\\\"]}],\\\"version\\\":\\\"320c8eb0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookWorkFiling\\\":{\\\"name\\\":\\\"workbookworkfiling\\\",\\\"className\\\":\\\"WorkbookWorkFiling\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookWorkFiling\\\",\\\"collection\\\":\\\"workbookworkfilings\\\",\\\"description\\\":\\\"Append-only association; the source work unit and its routing never move.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"sourceActivityId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookActivity\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Workbook\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"canonicalActivityId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookActivity\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"previousRevisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookWorkFiling\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"digest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"source_activity_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookWorkFiling\\\",\\\"collectionExportName\\\":\\\"WorkbookWorkFilingCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"sourceActivityId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"workbookId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_work_filings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"source_activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"canonical_activity_id\\\\\\\" UUID,\\\\n \\\\\\\"previous_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"reason\\\\\\\" TEXT,\\\\n \\\\\\\"digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"source_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"canonical_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_work_filings\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_work_filings_tenant_id_source_activity_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"source_activity_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_work_filings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_work_filings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_work_filings_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_source_activity_id_idx\\\",\\\"columns\\\":[\\\"source_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_canonical_activity_id_idx\\\",\\\"columns\\\":[\\\"canonical_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_previous_revision_id_idx\\\",\\\"columns\\\":[\\\"previous_revision_id\\\"]}],\\\"version\\\":\\\"03e989a0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookWorkFilingCollection\\\":{\\\"name\\\":\\\"workbookworkfilingcollection\\\",\\\"className\\\":\\\"WorkbookWorkFilingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookWorkFilingCollection\\\",\\\"collection\\\":\\\"workbookworkfilings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookWorkFiling\\\",\\\"exportName\\\":\\\"WorkbookWorkFilingCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookWorkFilingCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_work_filings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_work_filings\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"source_activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"canonical_activity_id\\\\\\\" UUID,\\\\n \\\\\\\"previous_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"reason\\\\\\\" TEXT,\\\\n \\\\\\\"digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"source_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"canonical_activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_work_filings\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_work_filings_tenant_id_source_activity_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"source_activity_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_work_filings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_work_filings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_work_filings_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_source_activity_id_idx\\\",\\\"columns\\\":[\\\"source_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_canonical_activity_id_idx\\\",\\\"columns\\\":[\\\"canonical_activity_id\\\"]},{\\\"name\\\":\\\"workbook_work_filings_previous_revision_id_idx\\\",\\\"columns\\\":[\\\"previous_revision_id\\\"]}],\\\"version\\\":\\\"03e989a0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAttempt\\\":{\\\"name\\\":\\\"workbookattempt\\\",\\\"className\\\":\\\"WorkbookAttempt\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAttempt\\\",\\\"collection\\\":\\\"workbookattempts\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"activityId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookActivity\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"submissionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Submission\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"previousAttemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"capturedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"episodeId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"reviewRequired\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":true,\\\"default\\\":true},\\\"policyVersion\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":1},\\\"assistance\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceHashes\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookAttempt\\\",\\\"collectionExportName\\\":\\\"WorkbookAttemptCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"activityId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"submissionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"reviewRequired\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"boolean\\\"},{\\\"field\\\":\\\"policyVersion\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_attempts\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"previous_attempt_id\\\\\\\" UUID,\\\\n \\\\\\\"captured_at\\\\\\\" TEXT,\\\\n \\\\\\\"episode_id\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1,\\\\n \\\\\\\"assistance\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_hashes\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"captured_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"episode_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1},\\\"assistance\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_hashes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_attempts_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_attempts_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_attempts_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_attempts_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_activity_id_idx\\\",\\\"columns\\\":[\\\"activity_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_previous_attempt_id_idx\\\",\\\"columns\\\":[\\\"previous_attempt_id\\\"]}],\\\"version\\\":\\\"bd9cdd9f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAttemptCollection\\\":{\\\"name\\\":\\\"workbookattemptcollection\\\",\\\"className\\\":\\\"WorkbookAttemptCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAttemptCollection\\\",\\\"collection\\\":\\\"workbookattempts\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookAttempt\\\",\\\"exportName\\\":\\\"WorkbookAttemptCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookAttemptCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_attempts\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_attempts\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"activity_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"submission_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"previous_attempt_id\\\\\\\" UUID,\\\\n \\\\\\\"captured_at\\\\\\\" TEXT,\\\\n \\\\\\\"episode_id\\\\\\\" TEXT,\\\\n \\\\\\\"review_required\\\\\\\" BOOLEAN NOT NULL DEFAULT TRUE,\\\\n \\\\\\\"policy_version\\\\\\\" INTEGER NOT NULL DEFAULT 1,\\\\n \\\\\\\"assistance\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_hashes\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"activity_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_activities\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"submission_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"submissions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"previous_attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"captured_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"episode_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"review_required\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":true},\\\"policy_version\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":1},\\\"assistance\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_hashes\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_attempts_tenant_id_submission_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"submission_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_attempts_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_attempts_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_attempts_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_activity_id_idx\\\",\\\"columns\\\":[\\\"activity_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_submission_id_idx\\\",\\\"columns\\\":[\\\"submission_id\\\"]},{\\\"name\\\":\\\"workbook_attempts_previous_attempt_id_idx\\\",\\\"columns\\\":[\\\"previous_attempt_id\\\"]}],\\\"version\\\":\\\"bd9cdd9f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAssessmentRevision\\\":{\\\"name\\\":\\\"workbookassessmentrevision\\\",\\\"className\\\":\\\"WorkbookAssessmentRevision\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAssessmentRevision\\\",\\\"collection\\\":\\\"workbookassessmentrevisions\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"attemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"requestDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sourceRevisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"decisionReason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"supersedesId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"assessmentJson\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}},\\\"recordedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookAssessmentRevision\\\",\\\"collectionExportName\\\":\\\"WorkbookAssessmentRevisionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"attemptId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_assessment_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"request_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"decision_reason\\\\\\\" TEXT,\\\\n \\\\\\\"supersedes_id\\\\\\\" UUID,\\\\n \\\\\\\"assessment_json\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"supersedes_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"assessment_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_assessment_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_source_revision_id_idx\\\",\\\"columns\\\":[\\\"source_revision_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_supersedes_id_idx\\\",\\\"columns\\\":[\\\"supersedes_id\\\"]}],\\\"version\\\":\\\"94b2bd33\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookAssessmentRevisionCollection\\\":{\\\"name\\\":\\\"workbookassessmentrevisioncollection\\\",\\\"className\\\":\\\"WorkbookAssessmentRevisionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookAssessmentRevisionCollection\\\",\\\"collection\\\":\\\"workbookassessmentrevisions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookAssessmentRevision\\\",\\\"exportName\\\":\\\"WorkbookAssessmentRevisionCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookAssessmentRevisionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_assessment_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_assessment_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"request_digest\\\\\\\" TEXT,\\\\n \\\\\\\"kind\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"source_revision_id\\\\\\\" UUID,\\\\n \\\\\\\"decision_reason\\\\\\\" TEXT,\\\\n \\\\\\\"supersedes_id\\\\\\\" UUID,\\\\n \\\\\\\"assessment_json\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source_revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"supersedes_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"assessment_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_assessment_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_source_revision_id_idx\\\",\\\"columns\\\":[\\\"source_revision_id\\\"]},{\\\"name\\\":\\\"workbook_assessment_revisions_supersedes_id_idx\\\",\\\"columns\\\":[\\\"supersedes_id\\\"]}],\\\"version\\\":\\\"94b2bd33\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackRelease\\\":{\\\"name\\\":\\\"workbookfeedbackrelease\\\",\\\"className\\\":\\\"WorkbookFeedbackRelease\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackRelease\\\",\\\"collection\\\":\\\"workbookfeedbackreleases\\\",\\\"description\\\":\\\"Education-owned private workbook record. Mutations go through WorkbookService.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"attemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"revisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"expectedHeadId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"nullable\\\":true}},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"recordedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookFeedbackRelease\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackReleaseCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"attemptId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"revisionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_releases\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"expected_head_id\\\\\\\" UUID,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"expected_head_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_releases_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_expected_head_id_idx\\\",\\\"columns\\\":[\\\"expected_head_id\\\"]}],\\\"version\\\":\\\"ebe23baf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackReleaseCollection\\\":{\\\"name\\\":\\\"workbookfeedbackreleasecollection\\\",\\\"className\\\":\\\"WorkbookFeedbackReleaseCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackReleaseCollection\\\",\\\"collection\\\":\\\"workbookfeedbackreleases\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookFeedbackRelease\\\",\\\"exportName\\\":\\\"WorkbookFeedbackReleaseCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackReleaseCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_releases\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_releases\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"expected_head_id\\\\\\\" UUID,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"expected_head_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_releases_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_releases_expected_head_id_idx\\\",\\\"columns\\\":[\\\"expected_head_id\\\"]}],\\\"version\\\":\\\"ebe23baf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackDelivery\\\":{\\\"name\\\":\\\"workbookfeedbackdelivery\\\",\\\"className\\\":\\\"WorkbookFeedbackDelivery\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackDelivery\\\",\\\"collection\\\":\\\"workbookfeedbackdeliveries\\\",\\\"description\\\":\\\"Authenticated delivery acknowledgment; this does not assert comprehension.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"attemptId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAttempt\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"revisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookAssessmentRevision\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"recordedAt\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"actor_user_id\\\",\\\"revision_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookFeedbackDelivery\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackDeliveryCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"attemptId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"revisionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_deliveries\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"actor_user_id\\\",\\\"revision_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_deliveries_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]}],\\\"version\\\":\\\"37bfd434\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookFeedbackDeliveryCollection\\\":{\\\"name\\\":\\\"workbookfeedbackdeliverycollection\\\",\\\"className\\\":\\\"WorkbookFeedbackDeliveryCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookFeedbackDeliveryCollection\\\",\\\"collection\\\":\\\"workbookfeedbackdeliveries\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookFeedbackDelivery\\\",\\\"exportName\\\":\\\"WorkbookFeedbackDeliveryCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookFeedbackDeliveryCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_feedback_deliveries\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_feedback_deliveries\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"attempt_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"revision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"recorded_at\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"attempt_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_attempts\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"revision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_assessment_revisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"recorded_at\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_attempt_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"attempt_id\\\",\\\"actor_user_id\\\",\\\"revision_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_feedback_deliveries_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_attempt_id_idx\\\",\\\"columns\\\":[\\\"attempt_id\\\"]},{\\\"name\\\":\\\"workbook_feedback_deliveries_revision_id_idx\\\",\\\"columns\\\":[\\\"revision_id\\\"]}],\\\"version\\\":\\\"37bfd434\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoIntake\\\":{\\\"name\\\":\\\"workbookphotointake\\\",\\\"className\\\":\\\"WorkbookPhotoIntake\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoIntake\\\",\\\"collection\\\":\\\"workbookphotointakes\\\",\\\"description\\\":\\\"Durable receipt before any course, enrollment or activity exists.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"itemId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"contentDigest\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"item_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookPhotoIntake\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoIntakeCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_intakes\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"item_id\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"content_digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"content_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"item_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_intakes_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"fafc1daf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoIntakeCollection\\\":{\\\"name\\\":\\\"workbookphotointakecollection\\\",\\\"className\\\":\\\"WorkbookPhotoIntakeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoIntakeCollection\\\",\\\"collection\\\":\\\"workbookphotointakes\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookPhotoIntake\\\",\\\"exportName\\\":\\\"WorkbookPhotoIntakeCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoIntakeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_intakes\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_intakes\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"item_id\\\\\\\" TEXT,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"content_digest\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"item_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"content_digest\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_item_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"item_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_intakes_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_intakes_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]}],\\\"version\\\":\\\"fafc1daf\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoAsset\\\":{\\\"name\\\":\\\"workbookphotoasset\\\",\\\"className\\\":\\\"WorkbookPhotoAsset\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoAsset\\\",\\\"collection\\\":\\\"workbookphotoassets\\\",\\\"description\\\":\\\"Sole owner join for original photo intake files.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"intakeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookPhotoIntake\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"assetId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-assets:Asset\\\"},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"mimeType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"position\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"asset_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookPhotoAsset\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoAssetCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"intakeId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"position\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID,\\\\n \\\\\\\"name\\\\\\\" TEXT,\\\\n \\\\\\\"mime_type\\\\\\\" TEXT,\\\\n \\\\\\\"sha256\\\\\\\" TEXT,\\\\n \\\\\\\"position\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"mime_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"position\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"asset_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"9d49acb2\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoAssetCollection\\\":{\\\"name\\\":\\\"workbookphotoassetcollection\\\",\\\"className\\\":\\\"WorkbookPhotoAssetCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoAssetCollection\\\",\\\"collection\\\":\\\"workbookphotoassets\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookPhotoAsset\\\",\\\"exportName\\\":\\\"WorkbookPhotoAssetCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoAssetCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_assets\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_assets\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"asset_id\\\\\\\" UUID,\\\\n \\\\\\\"name\\\\\\\" TEXT,\\\\n \\\\\\\"mime_type\\\\\\\" TEXT,\\\\n \\\\\\\"sha256\\\\\\\" TEXT,\\\\n \\\\\\\"position\\\\\\\" INTEGER NOT NULL DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"asset_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"mime_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sha256\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"position\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"asset_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_assets_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]},{\\\"name\\\":\\\"workbook_photo_assets_asset_id_idx\\\",\\\"columns\\\":[\\\"asset_id\\\"]}],\\\"version\\\":\\\"9d49acb2\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoDecision\\\":{\\\"name\\\":\\\"workbookphotodecision\\\",\\\"className\\\":\\\"WorkbookPhotoDecision\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoDecision\\\",\\\"collection\\\":\\\"workbookphotodecisions\\\",\\\"description\\\":\\\"Immutable provider/guardian/capture decision, retaining provenance and retry key.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"intakeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookPhotoIntake\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"requestKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"sequence\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":true,\\\"default\\\":0},\\\"actorUserId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"bodyJson\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"request_key\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookPhotoDecision\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoDecisionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"intakeId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"sequence\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"integer\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_decisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"sequence\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"body_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sequence\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"body_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_decisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]}],\\\"version\\\":\\\"4c8b4e5f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookPhotoDecisionCollection\\\":{\\\"name\\\":\\\"workbookphotodecisioncollection\\\",\\\"className\\\":\\\"WorkbookPhotoDecisionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookPhotoDecisionCollection\\\",\\\"collection\\\":\\\"workbookphotodecisions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookPhotoDecision\\\",\\\"exportName\\\":\\\"WorkbookPhotoDecisionCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookPhotoDecisionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_photo_decisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_photo_decisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"intake_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"request_key\\\\\\\" TEXT,\\\\n \\\\\\\"sequence\\\\\\\" INTEGER NOT NULL DEFAULT 0,\\\\n \\\\\\\"actor_user_id\\\\\\\" TEXT,\\\\n \\\\\\\"body_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"intake_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_intakes\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"request_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"sequence\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"default\\\":0},\\\"actor_user_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"body_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_intake_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"intake_id\\\",\\\"request_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"workbook_photo_decisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_photo_decisions_intake_id_idx\\\",\\\"columns\\\":[\\\"intake_id\\\"]}],\\\"version\\\":\\\"4c8b4e5f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookContextRevision\\\":{\\\"name\\\":\\\"workbookcontextrevision\\\",\\\"className\\\":\\\"WorkbookContextRevision\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookContextRevision\\\",\\\"collection\\\":\\\"workbookcontextrevisions\\\",\\\"description\\\":\\\"Versioned contextual metadata; never edits Workbook identity or learning evidence.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"learnerId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Learner\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"workbookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"Workbook\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"decisionId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":true,\\\"related\\\":\\\"WorkbookPhotoDecision\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"metadataJson\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{}}},\\\"methods\\\":{\\\"delete\\\":{\\\"name\\\":\\\"delete\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<void>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"save\\\":{\\\"name\\\":\\\"save\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<this>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"decision_id\\\"],\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"WorkbookContextRevision\\\",\\\"collectionExportName\\\":\\\"WorkbookContextRevisionCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"learnerId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"workbookId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"},{\\\"field\\\":\\\"decisionId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"foreignKey\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_context_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"decision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"metadata_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_decisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"metadata_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_decision_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"decision_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_context_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_decision_id_idx\\\",\\\"columns\\\":[\\\"decision_id\\\"]}],\\\"version\\\":\\\"b1e8b4dc\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"},\\\"@happyvertical/smrt-education:WorkbookContextRevisionCollection\\\":{\\\"name\\\":\\\"workbookcontextrevisioncollection\\\",\\\"className\\\":\\\"WorkbookContextRevisionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-education:WorkbookContextRevisionCollection\\\",\\\"collection\\\":\\\"workbookcontextrevisions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/education/src/workbook-photo-models.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-education\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"WorkbookContextRevision\\\",\\\"exportName\\\":\\\"WorkbookContextRevisionCollection\\\",\\\"collectionExportName\\\":\\\"WorkbookContextRevisionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"workbook_context_revisions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"workbook_context_revisions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"learner_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"workbook_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"decision_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"metadata_json\\\\\\\" TEXT\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"learner_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"learners\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"workbook_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbooks\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"decision_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":true,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"workbook_photo_decisions\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"metadata_json\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_decision_id_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"decision_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"workbook_context_revisions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_learner_id_idx\\\",\\\"columns\\\":[\\\"learner_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_workbook_id_idx\\\",\\\"columns\\\":[\\\"workbook_id\\\"]},{\\\"name\\\":\\\"workbook_context_revisions_decision_id_idx\\\",\\\"columns\\\":[\\\"decision_id\\\"]}],\\\"version\\\":\\\"b1e8b4dc\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-education\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"recipes\\\":[{\\\"id\\\":\\\"education.catalog\\\",\\\"className\\\":\\\"EducationCatalogRecipe\\\",\\\"label\\\":\\\"Course catalog\\\",\\\"summary\\\":\\\"Organize courses, sections, lessons, and their authorized learning materials.\\\",\\\"synonyms\\\":[\\\"courses\\\",\\\"lessons\\\",\\\"curriculum catalog\\\"],\\\"models\\\":[\\\"@happyvertical/smrt-education:Course\\\",\\\"@happyvertical/smrt-education:CourseSection\\\",\\\"@happyvertical/smrt-education:Lesson\\\",\\\"@happyvertical/smrt-education:LessonAsset\\\"],\\\"nav\\\":[{\\\"label\\\":\\\"Courses\\\",\\\"model\\\":\\\"@happyvertical/smrt-education:Course\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"Courses available to this family.\\\",\\\"noun\\\":\\\"course\\\"}],\\\"requires\\\":[],\\\"section\\\":{\\\"id\\\":\\\"education\\\",\\\"label\\\":\\\"Education\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"Courses and lessons for learning.\\\"},\\\"help\\\":{\\\"markdown\\\":\\\"# Course catalog\\\\n\\\\nManage courses, their sections, and lessons. Private family copies and answer\\\\nkeys remain visible only through the application’s authorized catalog service.\\\\n\\\",\\\"fieldRefs\\\":[]},\\\"runtime\\\":\\\"both\\\",\\\"demo\\\":{\\\"mode\\\":\\\"server\\\",\\\"reasons\\\":[\\\"Needs a server because its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627).\\\"]}},{\\\"id\\\":\\\"education.learner\\\",\\\"className\\\":\\\"EducationLearnerRecipe\\\",\\\"label\\\":\\\"Learners\\\",\\\"summary\\\":\\\"Plan learner curricula and retain enrollment-scoped progress.\\\",\\\"synonyms\\\":[\\\"learners\\\",\\\"enrollments\\\",\\\"learning progress\\\"],\\\"models\\\":[\\\"@happyvertical/smrt-education:Learner\\\",\\\"@happyvertical/smrt-education:Curriculum\\\",\\\"@happyvertical/smrt-education:Enrollment\\\",\\\"@happyvertical/smrt-education:LessonProgress\\\"],\\\"nav\\\":[{\\\"label\\\":\\\"Learners\\\",\\\"model\\\":\\\"@happyvertical/smrt-education:Learner\\\",\\\"icon\\\":\\\"users\\\",\\\"description\\\":\\\"Authorized learners in this family.\\\",\\\"noun\\\":\\\"learner\\\"}],\\\"requires\\\":[],\\\"section\\\":{\\\"id\\\":\\\"education\\\",\\\"label\\\":\\\"Education\\\",\\\"icon\\\":\\\"folder\\\",\\\"description\\\":\\\"Courses and lessons for learning.\\\"},\\\"help\\\":{\\\"markdown\\\":\\\"# Learners\\\\n\\\\nUse `LearnerService` in an authenticated exact-tenant context to read a learner,\\\\nplan a curriculum as an authorized guardian, enroll in a visible course, and\\\\nstart a lesson. Recipe metadata does not expose model CRUD. Hosts authenticate\\\\nusers, provision family membership, and validate guardian ProfileRelationship\\\\ntypes and effective terms. See `agents/learner-service.md` for the boundary.\\\\n\\\",\\\"fieldRefs\\\":[]},\\\"runtime\\\":\\\"both\\\",\\\"demo\\\":{\\\"mode\\\":\\\"server\\\",\\\"reasons\\\":[\\\"Needs a server because its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627).\\\"]}}],\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-assets\\\",\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-ingestion\\\",\\\"@happyvertical/smrt-profiles\\\",\\\"@happyvertical/smrt-tenancy\\\",\\\"@happyvertical/smrt-users\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3615\\\",\\\"#3617\\\",\\\"#3624\\\",\\\"#3625\\\",\\\"#3626\\\",\\\"#3627\\\"],\\\"via\\\":[\\\"@happyvertical/smrt-agents\\\",\\\"@happyvertical/smrt-jobs\\\",\\\"@happyvertical/smrt-profiles\\\",\\\"@happyvertical/smrt-reports\\\",\\\"@happyvertical/smrt-secrets\\\",\\\"@happyvertical/smrt-tenancy\\\",\\\"@happyvertical/smrt-users\\\"]},\\\"stampsConstructors\\\":true}\"));\n","import type {\n CatalogAcquisitionCapabilityDecision,\n CatalogResourceRepresentation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\n\n/** Closed observed MIME mapping; icons and file names never establish a format. */\nexport const CATALOG_REPRESENTATION_MEDIA_TYPES = {\n pdf: 'application/pdf',\n zip: 'application/zip',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n} as const;\n/** Bound and validate a complete Content-Type before retaining its canonical token. */\nexport function catalogRepresentationMediaType(value: string): string {\n const token = \"[!#$%&'*+.^_`|~0-9A-Za-z-]+\";\n const quoted = '\"(?:[\\\\x20-\\\\x21\\\\x23-\\\\x5b\\\\x5d-\\\\x7e]|\\\\\\\\[\\\\x20-\\\\x7e])*\"';\n const syntax = new RegExp(\n `^${token}/${token}(?:[ \\t]*;[ \\t]*${token}=(?:${token}|${quoted}))*[ \\t]*$`,\n );\n if (value.length > 512 || !syntax.test(value))\n throw new CatalogRepresentationError();\n return value.split(';', 1)[0].trim().toLowerCase();\n}\nexport function catalogRepresentationFormat(\n mediaType: string,\n): keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES | undefined {\n const token = catalogRepresentationMediaType(mediaType);\n return Object.entries(CATALOG_REPRESENTATION_MEDIA_TYPES).find(\n ([, mime]) => mime === token,\n )?.[0] as keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES | undefined;\n}\n\nexport class CatalogRepresentationError extends Error {\n readonly code = 'invalid-representation-metadata';\n constructor() {\n super('Catalog representation metadata is invalid.');\n this.name = 'CatalogRepresentationError';\n }\n}\nfunction object(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new CatalogRepresentationError();\n return value as Record<string, unknown>;\n}\nfunction keys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n): void {\n if (Object.keys(value).some((key) => !allowed.includes(key)))\n throw new CatalogRepresentationError();\n}\nfunction positive(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\n/** Missing/null is legacy; malformed present data always throws, never becomes absence. */\nexport function normalizeCatalogRepresentation(\n value: unknown,\n): CatalogResourceRepresentation | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') {\n if (value.length > 4096) throw new CatalogRepresentationError();\n try {\n value = JSON.parse(value);\n } catch {\n throw new CatalogRepresentationError();\n }\n if (value === null) return undefined;\n }\n const record = object(value);\n keys(record, [\n 'format',\n 'mediaType',\n 'byteLength',\n 'validators',\n 'acquisition',\n ]);\n if (!positive(record.byteLength)) throw new CatalogRepresentationError();\n if (record.format === 'unknown') {\n if (\n record.mediaType !== null &&\n (typeof record.mediaType !== 'string' ||\n catalogRepresentationMediaType(record.mediaType) !== record.mediaType ||\n catalogRepresentationFormat(record.mediaType) !== undefined)\n )\n throw new CatalogRepresentationError();\n } else if (\n typeof record.format !== 'string' ||\n !Object.hasOwn(CATALOG_REPRESENTATION_MEDIA_TYPES, record.format) ||\n CATALOG_REPRESENTATION_MEDIA_TYPES[\n record.format as keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES\n ] !== record.mediaType\n )\n throw new CatalogRepresentationError();\n const validators = object(record.validators);\n keys(validators, ['etag', 'lastModified']);\n if (\n typeof validators.etag !== 'string' ||\n !/^\"[\\x21\\x23-\\x7e]{1,200}\"$/.test(validators.etag) ||\n typeof validators.lastModified !== 'string' ||\n validators.lastModified.length > 100 ||\n !Number.isFinite(Date.parse(validators.lastModified)) ||\n new Date(validators.lastModified).toUTCString() !== validators.lastModified\n )\n throw new CatalogRepresentationError();\n const capability = object(record.acquisition);\n keys(\n capability,\n record.format === 'unknown' ? ['status', 'reason'] : ['status', 'maxBytes'],\n );\n let acquisition: CatalogResourceRepresentation['acquisition'];\n if (record.format === 'unknown') {\n const reason =\n record.mediaType === null\n ? 'missing-content-type'\n : 'unrecognized-content-type';\n if (capability.status !== 'unknown-format' || capability.reason !== reason)\n throw new CatalogRepresentationError();\n acquisition = { status: 'unknown-format', reason };\n } else if (record.format !== 'pdf') {\n if (\n capability.status !== 'unsupported-format' ||\n capability.maxBytes !== undefined\n )\n throw new CatalogRepresentationError();\n acquisition = { status: 'unsupported-format' };\n } else {\n if (\n !positive(capability.maxBytes) ||\n (capability.status !== 'supported' &&\n capability.status !== 'size-limit') ||\n (capability.status === 'supported') !==\n record.byteLength <= capability.maxBytes\n )\n throw new CatalogRepresentationError();\n acquisition = {\n status: capability.status as 'supported' | 'size-limit',\n maxBytes: capability.maxBytes,\n };\n }\n return {\n format: record.format as CatalogResourceRepresentation['format'],\n mediaType: record.mediaType as CatalogResourceRepresentation['mediaType'],\n byteLength: record.byteLength,\n validators: {\n etag: validators.etag,\n lastModified: validators.lastModified,\n },\n acquisition,\n } as CatalogResourceRepresentation;\n}\n\n/** Read-only preselection guard for NEW downloads. It does not authorize legal use or pinned-byte printing. */\nexport function evaluateCatalogAcquisitionCapability(\n resource: Pick<CatalogSourceRecord, 'availableFormats' | 'representation'>,\n format: string,\n limits?: { maxBytes?: number },\n): CatalogAcquisitionCapabilityDecision {\n let representation: CatalogResourceRepresentation | undefined;\n try {\n representation = normalizeCatalogRepresentation(resource.representation);\n if (limits?.maxBytes !== undefined && !positive(limits.maxBytes))\n throw new CatalogRepresentationError();\n } catch {\n return { allowed: false, reason: 'invalid-representation-metadata' };\n }\n if (representation?.format === 'unknown')\n return {\n allowed: false,\n reason: 'unknown-format',\n byteLength: representation.byteLength,\n };\n if (\n !Array.isArray(resource.availableFormats) ||\n !resource.availableFormats.includes(format)\n )\n return { allowed: false, reason: 'format-unavailable' };\n if (!representation) return { allowed: true, verification: 'legacy' };\n if (representation.format !== format)\n return { allowed: false, reason: 'format-unavailable' };\n if (representation.acquisition.status === 'unsupported-format')\n return {\n allowed: false,\n reason: 'unsupported-format',\n byteLength: representation.byteLength,\n };\n const maxBytes = Math.min(\n representation.acquisition.maxBytes,\n limits?.maxBytes ?? representation.acquisition.maxBytes,\n );\n if (\n representation.acquisition.status === 'size-limit' ||\n representation.byteLength > maxBytes\n )\n return {\n allowed: false,\n reason: 'size-limit',\n maxBytes,\n byteLength: representation.byteLength,\n };\n return { allowed: true, verification: 'observed' };\n}\n","import type {\n CatalogActor,\n CatalogLicenseEvidence,\n CatalogOperation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\n\nexport interface CatalogPolicyDecision {\n allowed: boolean;\n reason?:\n | 'teacher-material'\n | 'unverified-license'\n | 'operation-not-permitted';\n}\n\n/** Server-side resource policy. UI affordances are advisory and cannot bypass it. */\nexport class CatalogPolicy {\n canView(\n record: Pick<CatalogSourceRecord, 'visibility'>,\n actor: CatalogActor,\n ): boolean {\n return record.visibility === 'catalog' || actor.roles.includes('teacher');\n }\n\n authorize(\n record: Pick<CatalogSourceRecord, 'visibility' | 'licenseEvidence'>,\n operation: CatalogOperation,\n actor: CatalogActor,\n ): CatalogPolicyDecision {\n if (!this.canView(record, actor))\n return { allowed: false, reason: 'teacher-material' };\n const evidence = record.licenseEvidence;\n if (!this.isVerified(evidence))\n return { allowed: false, reason: 'unverified-license' };\n if (!evidence.permittedOperations?.includes(operation))\n return { allowed: false, reason: 'operation-not-permitted' };\n return { allowed: true };\n }\n\n private isVerified(evidence: CatalogLicenseEvidence): boolean {\n return evidence.state === 'verified' && !!evidence.identifier?.trim();\n }\n}\n","import {\n evaluateCatalogAcquisitionCapability,\n normalizeCatalogRepresentation,\n} from './catalog-capability.js';\nimport type {\n CatalogAcquireAdapter,\n CatalogActor,\n CatalogOperation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\nimport { CatalogPolicy } from './catalog-policy.js';\n\nexport interface CatalogAcquisitionRecord {\n id: string;\n tenantId: string;\n resourceId: string;\n selectionId: string;\n revision: string;\n format: string;\n sha256: string;\n attribution?: string;\n notices?: string;\n}\n\nexport interface CatalogSelectionRecord {\n id: string;\n tenantId: string;\n resourceId: string;\n selectedRevision: string;\n}\n\nexport interface CatalogAcquisitionStore {\n getResource(\n resourceId: string,\n ): Promise<\n (CatalogSourceRecord & { id: string; withdrawnAt: Date | null }) | undefined\n >;\n getSelection(input: {\n tenantId: string;\n selectionId: string;\n }): Promise<CatalogSelectionRecord | undefined>;\n findAcquisition(input: {\n tenantId: string;\n resourceId: string;\n selectionId: string;\n revision: string;\n format: string;\n }): Promise<CatalogAcquisitionRecord | undefined>;\n createAcquisition(\n input: Omit<CatalogAcquisitionRecord, 'id'> & { bytes: Uint8Array },\n ): Promise<CatalogAcquisitionRecord>;\n}\n\nexport interface CatalogAcquisitionRequest {\n tenantId: string;\n actorUserId: string;\n roles: readonly string[];\n resourceId: string;\n selectionId: string;\n revision: string;\n format: string;\n operation: CatalogOperation;\n}\n\nasync function digest(bytes: Uint8Array): Promise<string> {\n const hash = await globalThis.crypto.subtle.digest('SHA-256', bytes);\n return Array.from(new Uint8Array(hash), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n}\n\n/** Explicit, policy-gated selected-content acquisition. Catalog discovery has no route here. */\nexport class CatalogAcquisitionService {\n constructor(\n private readonly store: CatalogAcquisitionStore,\n private readonly adapter: CatalogAcquireAdapter,\n private readonly policy = new CatalogPolicy(),\n ) {}\n\n async acquire(\n request: CatalogAcquisitionRequest,\n ): Promise<CatalogAcquisitionRecord> {\n const actor: CatalogActor = {\n tenantId: request.tenantId,\n actorUserId: request.actorUserId,\n roles: request.roles,\n };\n if (!actor.tenantId.trim() || !actor.actorUserId.trim())\n throw new Error('Trusted tenant and actor identity are required.');\n const resource = await this.store.getResource(request.resourceId);\n if (!resource) throw new Error('Catalog resource was not found.');\n if (resource.withdrawnAt)\n throw new Error('Withdrawn catalog resource cannot be acquired.');\n if (resource.revision !== request.revision)\n throw new Error(\n 'Catalog resource revision is no longer current; reselect it.',\n );\n const selection = await this.store.getSelection({\n tenantId: actor.tenantId,\n selectionId: request.selectionId,\n });\n if (\n !selection ||\n selection.resourceId !== resource.id ||\n selection.selectedRevision !== request.revision\n )\n throw new Error(\n 'A matching tenant selection is required for acquisition.',\n );\n if (!resource.availableFormats?.includes(request.format))\n throw new Error('Requested content format is unavailable.');\n const decision = this.policy.authorize(resource, request.operation, actor);\n if (!decision.allowed)\n throw new Error(`Catalog acquisition denied: ${decision.reason}`);\n const existing = await this.store.findAcquisition({\n tenantId: actor.tenantId,\n resourceId: resource.id,\n selectionId: selection.id,\n revision: request.revision,\n format: request.format,\n });\n if (existing) return existing;\n const capability = evaluateCatalogAcquisitionCapability(\n resource,\n request.format,\n );\n if (!capability.allowed)\n throw new Error(`Catalog acquisition unavailable: ${capability.reason}`);\n const acquired = await this.adapter.acquire({\n providerId: resource.providerId,\n stableId: resource.stableId,\n revision: request.revision,\n format: request.format,\n });\n if (acquired.revision !== request.revision)\n throw new Error('Provider returned an unpinned resource revision.');\n const representation = normalizeCatalogRepresentation(\n resource.representation,\n );\n if (\n representation &&\n acquired.bytes.byteLength !== representation.byteLength\n )\n throw new Error(\n 'Acquired bytes differ from observed representation length.',\n );\n const actualHash = await digest(acquired.bytes);\n if (actualHash !== acquired.sha256.toLowerCase())\n throw new Error('Provider content hash did not match acquired bytes.');\n return await this.store.createAcquisition({\n tenantId: actor.tenantId,\n resourceId: resource.id,\n selectionId: selection.id,\n revision: request.revision,\n format: request.format,\n sha256: actualHash,\n attribution: resource.licenseEvidence.attribution,\n notices: resource.licenseEvidence.exceptions,\n bytes: acquired.bytes,\n });\n }\n}\n","import { field, foreignKey, SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { normalizeCatalogRepresentation } from './catalog-capability.js';\nimport type {\n CatalogLicenseState,\n CatalogResourceRepresentation,\n CatalogVisibility,\n} from './catalog-contracts.js';\n\nconst closed = { api: false, mcp: false, cli: false } as const;\n\n/** Globally visible provider registration. Hosts configure adapters and credentials out of band. */\n@smrt({ ...closed })\nexport class CatalogProvider extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @field({ required: true }) providerId = '';\n @field({ required: true }) name = '';\n active = true;\n}\n\n/** A provider-native record. Rows are intentionally not merged across providers. */\n@smrt({ ...closed })\nexport class CatalogResource extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @field({ required: true }) providerId = '';\n @field({ required: true }) stableId = '';\n @field({ required: true }) revision = '';\n canonicalUrl = '';\n @field({ required: true }) title = '';\n suppliedDescription = '';\n author = '';\n subjects = '[]';\n grades = '{}';\n language = '';\n resourceType = '';\n parentStableId = '';\n availableFormats = '[]';\n /** Serialized observed representation; JSON null is legacy absence. */\n representation = 'null';\n\n getRepresentation(): CatalogResourceRepresentation | undefined {\n return normalizeCatalogRepresentation(this.representation);\n }\n setRepresentation(value: CatalogResourceRepresentation | undefined): void {\n this.representation = JSON.stringify(\n normalizeCatalogRepresentation(value) ?? null,\n );\n }\n licenseEvidence = '{}';\n licenseState: CatalogLicenseState = 'unknown';\n visibility: CatalogVisibility = 'catalog';\n /** Last durable enumeration generation that observed this provider record. */\n lastSeenRunId = '';\n withdrawnAt = '';\n}\n\n/** Durable per-provider enumeration state. A failed or partial feed is never complete. */\n@smrt({ ...closed })\nexport class CatalogSyncState extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n /** Provider-owned stable key, not an internal provider row ID. */\n @field({ required: true }) providerId = '';\n cursor = '';\n /** Persists across interrupted pages so terminal withdrawal is safe on resume. */\n runId = '';\n complete = false;\n paused = false;\n pauseReason = '';\n importedCount = 0;\n failures = '[]';\n lastSuccessfulAt = '';\n}\n\n/** Tenant-owned intent to use a metadata record, distinct from acquiring bytes. */\n@TenantScoped({ mode: 'required' })\n@smrt({ ...closed })\nexport class CatalogSelection extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @tenantId() tenantId = '';\n @foreignKey('CatalogResource', { required: true }) resourceId = '';\n @field({ required: true }) selectedByUserId = '';\n @field({ required: true }) selectedRevision = '';\n}\n\n/** A pinned, tenant-owned acquisition record. Bytes belong in a host storage service. */\n@TenantScoped({ mode: 'required' })\n@smrt({ ...closed })\nexport class CatalogAcquisition extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @tenantId() tenantId = '';\n @foreignKey('CatalogResource', { required: true }) resourceId = '';\n @foreignKey('CatalogSelection', { required: true }) selectionId = '';\n @field({ required: true }) revision = '';\n @field({ required: true }) format = '';\n @field({ required: true }) sha256 = '';\n attribution = '';\n notices = '';\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport {\n CatalogAcquisition,\n CatalogProvider,\n CatalogResource,\n CatalogSelection,\n CatalogSyncState,\n} from './catalog-models.js';\n\nexport class CatalogProviderCollection extends SmrtCollection<CatalogProvider> {\n static readonly _itemClass = CatalogProvider;\n}\nexport class CatalogResourceCollection extends SmrtCollection<CatalogResource> {\n static readonly _itemClass = CatalogResource;\n}\nexport class CatalogSyncStateCollection extends SmrtCollection<CatalogSyncState> {\n static readonly _itemClass = CatalogSyncState;\n}\nexport class CatalogSelectionCollection extends SmrtCollection<CatalogSelection> {\n static readonly _itemClass = CatalogSelection;\n}\nexport class CatalogAcquisitionCollection extends SmrtCollection<CatalogAcquisition> {\n static readonly _itemClass = CatalogAcquisition;\n}\n","import type { DatabaseInterface } from '@happyvertical/sql';\nimport { normalizeCatalogRepresentation } from './catalog-capability.js';\nimport {\n CatalogResourceCollection,\n CatalogSyncStateCollection,\n} from './catalog-collections.js';\nimport type {\n CatalogSourceRecord,\n CatalogSyncCheckpoint,\n} from './catalog-contracts.js';\nimport type { CatalogSyncStore } from './catalog-sync-service.js';\n\nfunction json(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction checkpoint(row: {\n providerId: string;\n runId: string;\n cursor: string;\n complete: boolean;\n paused: boolean;\n pauseReason: string;\n importedCount: number;\n failures: string;\n lastSuccessfulAt: string;\n}): CatalogSyncCheckpoint {\n let failures: CatalogSyncCheckpoint['failures'] = [];\n try {\n const parsed: unknown = JSON.parse(row.failures);\n if (Array.isArray(parsed)) failures = parsed as typeof failures;\n } catch {\n // A corrupt historical failure ledger stays visible as an incomplete run.\n failures = [\n {\n code: 'invalid-failure-ledger',\n message: 'Stored failure ledger is invalid.',\n },\n ];\n }\n return {\n providerId: row.providerId,\n ...(row.runId ? { runId: row.runId } : {}),\n ...(row.cursor ? { cursor: row.cursor } : {}),\n complete: row.complete,\n ...(row.paused ? { paused: true } : {}),\n ...(row.pauseReason ? { pauseReason: row.pauseReason } : {}),\n importedCount: row.importedCount,\n failures,\n ...(row.lastSuccessfulAt ? { lastSuccessfulAt: row.lastSuccessfulAt } : {}),\n };\n}\n\n/** Default durable store for metadata-only provider synchronization. */\nexport class CatalogDatabaseSyncStore implements CatalogSyncStore {\n constructor(private readonly db: DatabaseInterface) {}\n\n async getCheckpoint(\n providerId: string,\n ): Promise<CatalogSyncCheckpoint | undefined> {\n const states = await CatalogSyncStateCollection.create({ db: this.db });\n const rows = await states.list({ where: { providerId }, limit: 2 });\n if (rows.length > 1)\n throw new Error('Catalog provider has ambiguous sync state.');\n return rows[0] ? checkpoint(rows[0]) : undefined;\n }\n\n async saveCheckpoint(value: CatalogSyncCheckpoint): Promise<void> {\n const states = await CatalogSyncStateCollection.create({ db: this.db });\n const rows = await states.list({\n where: { providerId: value.providerId },\n limit: 2,\n });\n if (rows.length > 1)\n throw new Error('Catalog provider has ambiguous sync state.');\n const fields = {\n providerId: value.providerId,\n runId: value.runId ?? '',\n cursor: value.cursor ?? '',\n complete: value.complete,\n paused: value.paused ?? false,\n pauseReason: value.pauseReason ?? '',\n importedCount: value.importedCount,\n failures: json(value.failures),\n lastSuccessfulAt: value.lastSuccessfulAt ?? '',\n };\n if (rows[0]) {\n Object.assign(rows[0], fields);\n await rows[0].save();\n } else await states.create(fields);\n }\n\n async upsert(record: CatalogSourceRecord, runId: string): Promise<void> {\n const resources = await CatalogResourceCollection.create({ db: this.db });\n const rows = await resources.list({\n where: { providerId: record.providerId, stableId: record.stableId },\n limit: 2,\n });\n if (rows.length > 1)\n throw new Error('Catalog provider record identity is ambiguous.');\n const fields = {\n providerId: record.providerId,\n stableId: record.stableId,\n revision: record.revision,\n canonicalUrl: record.canonicalUrl,\n title: record.title,\n suppliedDescription: record.suppliedDescription ?? '',\n author: record.author ?? '',\n subjects: json(record.subjects ?? []),\n grades: json(record.gradeRange ?? {}),\n language: record.language ?? '',\n resourceType: record.resourceType ?? '',\n parentStableId: record.parentStableId ?? '',\n availableFormats: json(record.availableFormats ?? []),\n representation: json(\n normalizeCatalogRepresentation(record.representation),\n ),\n licenseEvidence: json(record.licenseEvidence),\n licenseState: record.licenseEvidence.state,\n visibility: record.visibility,\n lastSeenRunId: runId,\n withdrawnAt: '',\n };\n if (rows[0]) {\n Object.assign(rows[0], fields);\n await rows[0].save();\n } else await resources.create(fields);\n }\n\n async withdrawUnseen(providerId: string, runId: string): Promise<number> {\n const resources = await CatalogResourceCollection.create({ db: this.db });\n const rows = await resources.list({ where: { providerId } });\n const timestamp = new Date().toISOString();\n let withdrawn = 0;\n for (const row of rows) {\n if (row.lastSeenRunId === runId || row.withdrawnAt) continue;\n row.withdrawnAt = timestamp;\n await row.save();\n withdrawn++;\n }\n return withdrawn;\n }\n}\n","import { getCurrentTenant } from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport type { CatalogAcquisitionRecord } from './catalog-acquisition-service.js';\nimport type { CatalogActor, CatalogSourceRecord } from './catalog-contracts.js';\nimport { CatalogPolicy } from './catalog-policy.js';\nimport {\n CourseSectionCollection,\n ExternalCourseCollection,\n LessonAssetCollection,\n ReadingCollection,\n WorksheetCollection,\n} from './collections.js';\nimport type { LearnerRequest } from './learner-service.js';\n\nexport interface CatalogMaterializationStore {\n getResource(\n resourceId: string,\n ): Promise<\n (CatalogSourceRecord & { id: string; withdrawnAt: Date | null }) | undefined\n >;\n getAcquisition(input: {\n tenantId: string;\n acquisitionId: string;\n }): Promise<CatalogAcquisitionRecord | undefined>;\n}\n\n/** Host-owned copy operation; it must retain the pinned bytes and prove a private Asset capability. */\nexport interface CatalogMaterializationStorage {\n ensurePrivateAsset(input: {\n tenantId: string;\n actorUserId: string;\n acquisition: CatalogAcquisitionRecord;\n name: string;\n }): Promise<{ assetId: string }>;\n}\n\nexport interface CatalogEnrollmentPort {\n enroll(\n input: LearnerRequest & { curriculumId: string; courseId: string },\n ): Promise<{\n id: string;\n }>;\n}\n\nexport interface CatalogMaterializationRequest {\n tenantId: string;\n actorUserId: string;\n acquisitionId: string;\n /** Required when provider metadata does not classify a subject. */\n subject?: string;\n courseTitle?: string;\n lessonTitle?: string;\n curriculumId?: string;\n learnerId?: string;\n guardianRelationshipId?: string;\n}\n\n/** Host derives this from current memberships and guardian terms; callers never supply roles. */\nexport type CatalogMaterializationAuthorizer = (input: {\n tenantId: string;\n actorUserId: string;\n executor: DatabaseInterface;\n action: 'education.catalog.materialize';\n}) => Promise<Readonly<{ allowed: boolean; roles: readonly string[] }>>;\n\nexport interface CatalogMaterializationResult {\n courseId: string;\n lessonId: string;\n assetId: string;\n revision: string;\n sha256: string;\n enrollmentId?: string;\n}\n\nasync function identity(...parts: string[]): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(\n JSON.stringify(['smrt.education.catalog.v1', ...parts]),\n ),\n );\n const hex = Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-5${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n\n/** Both adapter file extensions and MIME media types preserve PDF layout. */\nexport function isPrintableAcquisitionFormat(format: string): boolean {\n return format === 'pdf' || format === 'application/pdf';\n}\n\n/** Creates a private course from an already-authorized, pinned acquisition. */\nexport class CatalogMaterializationService {\n constructor(\n private readonly db: DatabaseInterface,\n private readonly store: CatalogMaterializationStore,\n private readonly storage: CatalogMaterializationStorage,\n private readonly learner: CatalogEnrollmentPort | undefined,\n private readonly authorize: CatalogMaterializationAuthorizer,\n private readonly policy = new CatalogPolicy(),\n ) {}\n\n async materialize(\n request: CatalogMaterializationRequest,\n ): Promise<CatalogMaterializationResult> {\n const active = getCurrentTenant();\n if (\n !request.tenantId?.trim() ||\n !request.actorUserId?.trim() ||\n active?.tenantId !== request.tenantId ||\n active.userId !== request.actorUserId ||\n active.superAdminBypass\n )\n throw new Error('Trusted active tenant and actor identity are required.');\n const authorization = await this.authorize({\n tenantId: request.tenantId,\n actorUserId: request.actorUserId,\n executor: this.db,\n action: 'education.catalog.materialize',\n });\n if (!authorization.allowed || !authorization.roles.includes('guardian'))\n throw new Error('Active guardian authorization is required.');\n const actor: CatalogActor = {\n tenantId: request.tenantId,\n actorUserId: request.actorUserId,\n roles: authorization.roles,\n };\n const acquisition = await this.store.getAcquisition({\n tenantId: actor.tenantId,\n acquisitionId: request.acquisitionId,\n });\n if (!acquisition || acquisition.tenantId !== actor.tenantId)\n throw new Error('Pinned tenant acquisition was not found.');\n const resource = await this.store.getResource(acquisition.resourceId);\n if (!resource || resource.revision !== acquisition.revision)\n throw new Error('Pinned catalog resource revision was not found.');\n if (resource.withdrawnAt)\n throw new Error('Withdrawn catalog resource cannot be materialized.');\n // A teacher may inspect restricted metadata, but this learner-material\n // workflow never promotes it into a course, printable, or asset link.\n if (resource.visibility === 'teacher')\n throw new Error(\n 'Teacher-only material cannot be materialized for learners.',\n );\n const operation = isPrintableAcquisitionFormat(acquisition.format)\n ? 'print'\n : 'download';\n const decision = this.policy.authorize(resource, operation, actor);\n if (!decision.allowed)\n throw new Error(`Current catalog license does not permit ${operation}.`);\n const subject =\n resource.subjects?.find((value) => value.trim()) ??\n request.subject?.trim();\n if (!subject)\n throw new Error('Guardian subject classification is required.');\n const courseId = await identity(\n actor.tenantId,\n resource.providerId,\n resource.stableId,\n );\n const sectionId = await identity(courseId, 'materials');\n const lessonId = await identity(\n courseId,\n acquisition.revision,\n acquisition.format,\n );\n const asset = await this.storage.ensurePrivateAsset({\n tenantId: actor.tenantId,\n actorUserId: actor.actorUserId,\n acquisition,\n name: request.lessonTitle?.trim() || resource.title,\n });\n if (!asset.assetId)\n throw new Error('Materialized private asset is required.');\n if (!this.db.transaction)\n throw new Error('Catalog materialization requires a transaction.');\n await this.db.transaction(async (tx) => {\n const courses = await ExternalCourseCollection.create({ db: tx });\n const sections = await CourseSectionCollection.create({ db: tx });\n const readings = await ReadingCollection.create({ db: tx });\n const worksheets = await WorksheetCollection.create({ db: tx });\n const assets = await LessonAssetCollection.create({ db: tx });\n const course = await courses.get(courseId);\n if (course) {\n if (\n course.tenantId !== actor.tenantId ||\n course.sourceKey !== resource.providerId ||\n course.sourceRef !== resource.stableId ||\n course.licenseKind !== 'personal-use-copy'\n )\n throw new Error(\n 'Existing materialized course ownership cannot change.',\n );\n } else {\n await courses.create({\n id: courseId,\n tenantId: actor.tenantId,\n title: request.courseTitle?.trim() || resource.title,\n subject,\n sourceKey: resource.providerId,\n sourceRef: resource.stableId,\n sourceUrl: resource.canonicalUrl,\n license: resource.licenseEvidence.identifier ?? '',\n licenseKind: 'personal-use-copy',\n licenseNote: [\n resource.licenseEvidence.attribution,\n acquisition.sha256,\n ]\n .filter(Boolean)\n .join('\\n'),\n status: 'draft',\n });\n }\n if (!(await sections.get(sectionId)))\n await sections.create({\n id: sectionId,\n tenantId: actor.tenantId,\n courseId,\n title: 'Materials',\n sortOrder: 0,\n });\n // Acquisition formats are MIME types. Only a layout-preserving PDF is\n // printable; all other formats remain attachments for host-specific use.\n const printable = isPrintableAcquisitionFormat(acquisition.format);\n const lessons = printable ? worksheets : readings;\n if (!(await lessons.get(lessonId)))\n await lessons.create({\n id: lessonId,\n tenantId: actor.tenantId,\n sectionId,\n title: request.lessonTitle?.trim() || resource.title,\n externalRef: `${resource.stableId}@${acquisition.revision}`,\n externalUrl: resource.canonicalUrl,\n sortOrder: 0,\n });\n if (\n !(await assets.get({\n lessonId,\n assetId: asset.assetId,\n tenantId: actor.tenantId,\n }))\n )\n await assets.create({\n tenantId: actor.tenantId,\n lessonId,\n assetId: asset.assetId,\n relationship: printable ? 'printable' : 'attachment',\n });\n });\n let enrollmentId: string | undefined;\n if (request.curriculumId || request.learnerId) {\n if (!this.learner || !request.curriculumId || !request.learnerId)\n throw new Error(\n 'Learner, curriculum, and enrollment service are required.',\n );\n enrollmentId = (\n await this.learner.enroll({\n tenantId: actor.tenantId,\n actorUserId: actor.actorUserId,\n learnerId: request.learnerId,\n ...(request.guardianRelationshipId\n ? { guardianRelationshipId: request.guardianRelationshipId }\n : {}),\n curriculumId: request.curriculumId,\n courseId,\n })\n ).id;\n }\n return {\n courseId,\n lessonId,\n assetId: asset.assetId,\n revision: acquisition.revision,\n sha256: acquisition.sha256,\n ...(enrollmentId ? { enrollmentId } : {}),\n };\n }\n}\n","import { normalizeCatalogRepresentation } from './catalog-capability.js';\nimport type {\n CatalogActor,\n CatalogLicenseEvidence,\n CatalogResourceRepresentation,\n CatalogSourceRecord,\n} from './catalog-contracts.js';\nimport { CatalogPolicy } from './catalog-policy.js';\n\nexport interface CatalogReadStore {\n search(input: {\n query?: string;\n subject?: string;\n grade?: string;\n }): Promise<readonly (CatalogSourceRecord & { id: string })[]>;\n}\n\n/** Deliberately metadata-only DTO: credentials, byte locations, and teacher records stay server-side. */\nexport interface CatalogResourceView {\n id: string;\n providerId: string;\n stableId: string;\n revision: string;\n canonicalUrl: string;\n title: string;\n suppliedDescription?: string;\n author?: string;\n subjects?: string[];\n gradeRange?: { min?: string; max?: string };\n language?: string;\n resourceType?: string;\n parentStableId?: string;\n availableFormats?: string[];\n representation?: CatalogResourceRepresentation;\n license: Pick<\n CatalogLicenseEvidence,\n | 'state'\n | 'identifier'\n | 'version'\n | 'attribution'\n | 'exceptions'\n | 'retrievedAt'\n >;\n}\n\nexport class CatalogReadService {\n constructor(\n private readonly store: CatalogReadStore,\n private readonly policy = new CatalogPolicy(),\n ) {}\n\n async search(\n actor: CatalogActor,\n filter: { query?: string; subject?: string; grade?: string } = {},\n ): Promise<CatalogResourceView[]> {\n if (!actor.tenantId.trim() || !actor.actorUserId.trim())\n throw new Error('Trusted tenant and actor identity are required.');\n const records = await this.store.search(filter);\n return records\n .filter((record) => this.policy.canView(record, actor))\n .map((record) => this.view(record));\n }\n\n private view(\n record: CatalogSourceRecord & { id: string },\n ): CatalogResourceView {\n const { licenseEvidence } = record;\n const representation = normalizeCatalogRepresentation(\n record.representation,\n );\n return {\n id: record.id,\n providerId: record.providerId,\n stableId: record.stableId,\n revision: record.revision,\n canonicalUrl: record.canonicalUrl,\n title: record.title,\n ...(record.suppliedDescription\n ? { suppliedDescription: record.suppliedDescription }\n : {}),\n ...(record.author ? { author: record.author } : {}),\n ...(record.subjects ? { subjects: [...record.subjects] } : {}),\n ...(record.gradeRange ? { gradeRange: { ...record.gradeRange } } : {}),\n ...(record.language ? { language: record.language } : {}),\n ...(record.resourceType ? { resourceType: record.resourceType } : {}),\n ...(record.parentStableId\n ? { parentStableId: record.parentStableId }\n : {}),\n ...(record.availableFormats\n ? { availableFormats: [...record.availableFormats] }\n : {}),\n ...(representation ? { representation } : {}),\n license: {\n state: licenseEvidence.state,\n ...(licenseEvidence.identifier\n ? { identifier: licenseEvidence.identifier }\n : {}),\n ...(licenseEvidence.version\n ? { version: licenseEvidence.version }\n : {}),\n ...(licenseEvidence.attribution\n ? { attribution: licenseEvidence.attribution }\n : {}),\n ...(licenseEvidence.exceptions\n ? { exceptions: licenseEvidence.exceptions }\n : {}),\n ...(licenseEvidence.retrievedAt\n ? { retrievedAt: licenseEvidence.retrievedAt }\n : {}),\n },\n };\n }\n}\n","import type {\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncCheckpoint,\n CatalogSyncFailure,\n} from './catalog-contracts.js';\n\nexport interface CatalogSyncStore {\n getCheckpoint(providerId: string): Promise<CatalogSyncCheckpoint | undefined>;\n saveCheckpoint(checkpoint: CatalogSyncCheckpoint): Promise<void>;\n upsert(record: CatalogSourceRecord, runId: string): Promise<void>;\n withdrawUnseen(providerId: string, runId: string): Promise<number>;\n}\n\n/** Policy counts cover only pages processed by the current sync invocation. */\nexport interface CatalogExclusionSummary {\n total: number;\n byCode: { code: string; count: number }[];\n otherCount: number;\n}\nexport interface CatalogFailureSummary {\n total: number;\n historical: boolean;\n historicalCount: number;\n currentCount: number;\n omittedDetailCount: number;\n}\nexport interface CatalogSyncReport extends CatalogSyncCheckpoint {\n withdrawnCount: number;\n /** Invocation-local, bounded, report-only; never a full-generation coverage total. */\n exclusionSummary?: CatalogExclusionSummary;\n /** Historical diagnostics do not imply a current active failure. */\n failureSummary?: CatalogFailureSummary;\n}\n\nconst MAX_FAILURE_CODES = 31;\nconst MAX_POLICY_CODES = 32;\nconst OVERFLOW_CODE = 'additional-failures';\nfunction addCount(left: number, right: number): number {\n const result = left + right;\n if (!Number.isSafeInteger(result))\n throw new Error(\n 'Catalog diagnostic occurrence count exceeds the safe integer bound.',\n );\n return result;\n}\nfunction occurrenceCount(value: unknown): number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0\n ? value\n : 1;\n}\nfunction bounded(value: string, cap: number): string {\n return value.length > cap ? `${value.slice(0, cap - 12)} [truncated]` : value;\n}\ntype CountedFailure = CatalogSyncFailure & {\n count: number;\n omittedDetailCount: number;\n};\nfunction diagnostic(raw: CatalogSyncFailure): CountedFailure {\n const value: Partial<CatalogSyncFailure> =\n raw && typeof raw === 'object' ? raw : {};\n const count = occurrenceCount(value.count);\n const invalidCount = value.count !== undefined && count !== value.count;\n const code =\n typeof value.code === 'string' && value.code\n ? value.code\n : 'invalid-failure-entry';\n const message = `${invalidCount ? 'Invalid legacy occurrence count; counted once. ' : ''}${typeof value.message === 'string' ? value.message : 'Stored failure diagnostic is malformed.'}`;\n const cursor = typeof value.cursor === 'string' ? value.cursor : undefined;\n const truncated =\n code.length > 128 || message.length > 512 || (cursor?.length ?? 0) > 256;\n const suppliedOmitted =\n typeof value.omittedDetailCount === 'number' &&\n Number.isSafeInteger(value.omittedDetailCount) &&\n value.omittedDetailCount >= 0\n ? Math.min(count, value.omittedDetailCount)\n : 0;\n return {\n code: bounded(code, 128),\n message: bounded(message, 512),\n ...(cursor !== undefined ? { cursor: bounded(cursor, 256) } : {}),\n ...(typeof value.retryAfterMs === 'number' &&\n Number.isFinite(value.retryAfterMs) &&\n value.retryAfterMs >= 0\n ? { retryAfterMs: value.retryAfterMs }\n : {}),\n count,\n omittedDetailCount: truncated ? count : suppliedOmitted,\n };\n}\n/** Keep recent per-code facts and exact occurrence totals; declare omitted details. */\nfunction compactFailures(entries: CatalogSyncFailure[]): CountedFailure[] {\n const groups = new Map<string, CountedFailure>();\n let overflowCount = 0;\n for (const raw of entries) {\n const next = diagnostic(raw);\n if (next.code === OVERFLOW_CODE) {\n overflowCount = addCount(overflowCount, next.count);\n continue;\n }\n const previous = groups.get(next.code);\n if (previous) {\n const sameDetail =\n previous.message === next.message &&\n previous.cursor === next.cursor &&\n previous.retryAfterMs === next.retryAfterMs;\n next.omittedDetailCount = addCount(\n sameDetail ? previous.omittedDetailCount : previous.count,\n next.omittedDetailCount,\n );\n next.count = addCount(previous.count, next.count);\n groups.delete(next.code);\n } else if (groups.size === MAX_FAILURE_CODES) {\n const oldest = groups.values().next().value;\n if (oldest) {\n overflowCount = addCount(overflowCount, oldest.count);\n groups.delete(oldest.code);\n }\n }\n groups.set(next.code, next);\n }\n return [\n ...groups.values(),\n ...(overflowCount\n ? [\n {\n code: OVERFLOW_CODE,\n message:\n 'Additional failure diagnostics compacted; full detail is unavailable.',\n count: overflowCount,\n omittedDetailCount: overflowCount,\n },\n ]\n : []),\n ];\n}\nfunction totalFailures(entries: CatalogSyncFailure[]): number {\n return entries.reduce(\n (total, entry) => addCount(total, occurrenceCount(entry.count)),\n 0,\n );\n}\nfunction failure(error: unknown): CatalogSyncFailure {\n const value = error as {\n code?: unknown;\n message?: unknown;\n retryAfterMs?: unknown;\n };\n return {\n code: String(value?.code ?? 'enumeration-failed'),\n message: String(value?.message ?? error),\n ...(typeof value?.retryAfterMs === 'number'\n ? { retryAfterMs: value.retryAfterMs }\n : {}),\n };\n}\n\n/** Durable metadata synchronization. It never invokes a content acquisition adapter. */\nexport class CatalogSyncService {\n constructor(\n private readonly store: CatalogSyncStore,\n private readonly retries = 2,\n private readonly maxPages = 100,\n ) {}\n\n async sync(\n providerId: string,\n adapter: CatalogSyncAdapter,\n ): Promise<CatalogSyncReport> {\n if (!providerId.trim()) throw new Error('A provider ID is required.');\n const saved = await this.store.getCheckpoint(providerId);\n const resuming = saved?.complete === false;\n const runId = resuming\n ? (saved.runId ?? globalThis.crypto.randomUUID())\n : globalThis.crypto.randomUUID();\n let checkpoint: CatalogSyncCheckpoint = {\n providerId,\n cursor: resuming ? saved?.cursor : undefined,\n complete: false,\n importedCount: resuming ? (saved?.importedCount ?? 0) : 0,\n failures: compactFailures(resuming ? (saved?.failures ?? []) : []),\n runId,\n };\n const historicalCount = totalFailures(checkpoint.failures);\n let currentCount = 0;\n let withdrawnCount = 0;\n let policyTotal = 0;\n let otherCount = 0;\n const policyCodes = new Map<string, number>();\n const report = (): CatalogSyncReport => ({\n ...checkpoint,\n withdrawnCount,\n exclusionSummary: {\n total: policyTotal,\n byCode: [...policyCodes].map(([code, count]) => ({ code, count })),\n otherCount,\n },\n failureSummary: {\n total: totalFailures(checkpoint.failures),\n historical: historicalCount > 0,\n historicalCount,\n currentCount,\n omittedDetailCount: checkpoint.failures.reduce(\n (total, entry) => addCount(total, entry.omittedDetailCount ?? 0),\n 0,\n ),\n },\n });\n const pause = async (\n reason: string,\n entries: CatalogSyncFailure[],\n ): Promise<CatalogSyncReport> => {\n currentCount = addCount(\n currentCount,\n totalFailures(entries.map(diagnostic)),\n );\n checkpoint = {\n ...checkpoint,\n complete: false,\n paused: true,\n pauseReason: bounded(reason, 512),\n failures: compactFailures([...checkpoint.failures, ...entries]),\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n };\n const cursors = new Set<string>();\n if (checkpoint.cursor) cursors.add(checkpoint.cursor);\n for (let pageCount = 0; pageCount < this.maxPages; pageCount++) {\n let page:\n | Awaited<ReturnType<CatalogSyncAdapter['enumerate']>>\n | undefined;\n let lastFailure: CatalogSyncFailure | undefined;\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n try {\n page = await adapter.enumerate({\n cursor: checkpoint.cursor,\n checkpoint,\n });\n break;\n } catch (error) {\n lastFailure = failure(error);\n }\n }\n if (!page) {\n const terminalFailure = lastFailure ?? {\n code: 'enumeration-failed',\n message: 'Adapter returned no catalog page.',\n };\n return await pause(terminalFailure.message, [terminalFailure]);\n }\n if (page.complete && page.nextCursor)\n throw new Error('A terminal catalog page cannot have a next cursor.');\n if (\n !page.complete &&\n !page.nextCursor &&\n !page.paused &&\n !page.exclusions?.length &&\n !page.policyExclusions?.length\n )\n throw new Error('A partial catalog page requires a next cursor.');\n for (const omission of page.policyExclusions ?? []) {\n const count = occurrenceCount(omission.count);\n policyTotal = addCount(policyTotal, count);\n const code =\n typeof omission.code === 'string' &&\n /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(omission.code)\n ? omission.code\n : 'invalid-policy-code';\n if (policyCodes.has(code) || policyCodes.size < MAX_POLICY_CODES)\n policyCodes.set(code, addCount(policyCodes.get(code) ?? 0, count));\n else otherCount = addCount(otherCount, count);\n }\n // Current operational failures never advance, withdraw, or claim success.\n // Saved legacy diagnostics remain audit history, without guessed reclassification.\n if (page.paused || page.exclusions?.length) {\n const entries = page.exclusions?.length\n ? page.exclusions\n : [{ code: 'paused', message: 'Catalog source is paused.' }];\n return await pause(entries[0].message, entries);\n }\n for (const record of page.records) {\n if (\n record.providerId !== providerId ||\n !record.stableId ||\n !record.revision\n )\n throw new Error(\n 'Catalog records require matching provider, stable ID, and revision.',\n );\n await this.store.upsert(record, runId);\n }\n checkpoint = {\n ...checkpoint,\n cursor:\n page.nextCursor ?? (page.complete ? undefined : checkpoint.cursor),\n complete: page.complete,\n paused: false,\n pauseReason: undefined,\n importedCount: checkpoint.importedCount + page.records.length,\n };\n if (!page.complete) {\n if (!page.nextCursor) {\n // A valid snapshot can be retained while its declared coverage is\n // explicitly unconfirmed. This is a controlled policy pause, not an\n // access/parse failure, and can never authorize withdrawal.\n checkpoint = {\n ...checkpoint,\n paused: true,\n pauseReason: bounded(\n page.policyExclusions?.[0]?.message ??\n 'Catalog scope is incomplete.',\n 512,\n ),\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n }\n if (checkpoint.cursor && cursors.has(checkpoint.cursor))\n return await pause('Catalog source did not advance its cursor.', [\n {\n cursor: checkpoint.cursor,\n code: 'cursor-cycle',\n message: 'Catalog source did not advance its cursor.',\n },\n ]);\n if (checkpoint.cursor) cursors.add(checkpoint.cursor);\n await this.store.saveCheckpoint(checkpoint);\n continue;\n }\n withdrawnCount = await this.store.withdrawUnseen(providerId, runId);\n checkpoint = {\n providerId,\n complete: true,\n importedCount: checkpoint.importedCount,\n failures: checkpoint.failures,\n lastSuccessfulAt: new Date().toISOString(),\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n }\n // A controlled invocation budget is a resumable yield, not a source failure.\n checkpoint = {\n ...checkpoint,\n complete: false,\n paused: false,\n pauseReason: undefined,\n };\n await this.store.saveCheckpoint(checkpoint);\n return report();\n }\n}\n","import {\n field,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\n\nexport type SourceSharing = 'private' | 'group' | 'global';\nexport type CourseSourceKind = 'manual' | 'url' | 'adapter';\nexport interface CourseSourceConfig {\n /** Host-recorded written permission for a shared import, never learner input. */\n licenseEvidence?: string;\n}\n\n/** Host-managed source policy; deliberately has no generated CRUD surface. */\n@TenantScoped({ mode: 'required' })\n@smrt({ api: false, cli: false, mcp: false })\nexport class CourseSource extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-education\";\n @tenantId() tenantId = '';\n @field({ required: true }) key = '';\n @field({ required: true }) name = '';\n kind: CourseSourceKind = 'adapter';\n adapterKey = 'easy-peasy';\n config = '{}';\n sharing: SourceSharing = 'private';\n\n constructor(options: Record<string, unknown> = {}) {\n super(options);\n for (const [key, value] of Object.entries(options)) {\n if (Object.hasOwn(this, key))\n (this as unknown as Record<string, unknown>)[key] = value;\n }\n }\n\n getConfig(): CourseSourceConfig {\n const value: unknown = JSON.parse(this.config);\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error('CourseSource config must be an object.');\n const record = value as Record<string, unknown>;\n if (\n Object.keys(record).some((key) => key !== 'licenseEvidence') ||\n (record.licenseEvidence !== undefined &&\n typeof record.licenseEvidence !== 'string')\n )\n throw new Error('Invalid CourseSource config.');\n return {\n ...(record.licenseEvidence === undefined\n ? {}\n : { licenseEvidence: record.licenseEvidence as string }),\n };\n }\n\n setConfig(value: CourseSourceConfig): void {\n const previous = this.config;\n this.config = JSON.stringify(value);\n try {\n this.getConfig();\n } catch (error) {\n this.config = previous;\n throw error;\n }\n }\n\n override async save(): Promise<this> {\n if (\n !['private', 'group', 'global'].includes(this.sharing) ||\n !['manual', 'url', 'adapter'].includes(this.kind)\n )\n throw new Error('Invalid CourseSource kind or sharing.');\n this.getConfig();\n return super.save();\n }\n}\n\nexport class CourseSourceCollection extends SmrtCollection<CourseSource> {\n static readonly _itemClass = CourseSource;\n}\n","import type { CatalogSourceRecord } from '../catalog-contracts.js';\n\nconst host = 'im.kendallhunt.com';\n\nfunction text(value: string): string {\n return value\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Parses the publicly linked K-5 family curriculum index published by the IM\n * Certified Kendall Hunt site. It is deliberately metadata-only: unit and\n * lesson pages are not fetched or acquired here.\n */\nexport function parseIllustrativeMathematicsK5Index(\n html: string,\n revision: string,\n pageUrl = 'https://im.kendallhunt.com/k5/curriculum.html',\n): CatalogSourceRecord[] {\n const index = new URL(pageUrl);\n if (index.protocol !== 'https:' || index.hostname !== host)\n throw new Error(\n 'Illustrative Mathematics index must use the official HTTPS host.',\n );\n if (!revision.trim())\n throw new Error('Illustrative Mathematics revision is required.');\n\n const records: CatalogSourceRecord[] = [];\n const seen = new Set<string>();\n const anchors = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a\\s*>/gi;\n for (const match of html.matchAll(anchors)) {\n const href = /\\bhref\\s*=\\s*[\"']([^\"']+)[\"']/i.exec(match[1])?.[1];\n if (!href) continue;\n const url = new URL(href, index);\n const grade =\n /^\\/K5\\/families\\/(kindergarten|grade-[1-5])\\/units\\.html$/i.exec(\n url.pathname,\n )?.[1];\n if (!grade || url.hostname !== host || seen.has(url.pathname)) continue;\n seen.add(url.pathname);\n const gradeLabel =\n grade === 'kindergarten' ? 'K' : grade.slice('grade-'.length);\n records.push({\n providerId: 'illustrative-mathematics',\n stableId: `k5-family-${grade.toLowerCase()}`,\n revision,\n canonicalUrl: url.toString(),\n title: `IM K-5 Math Grade ${gradeLabel}`,\n suppliedDescription: text(match[2]) || undefined,\n subjects: ['mathematics'],\n gradeRange: { min: gradeLabel, max: gradeLabel },\n language: 'en',\n resourceType: 'course',\n availableFormats: ['html'],\n licenseEvidence: {\n state: 'verified',\n identifier: 'CC BY',\n version: '4.0',\n sourceUrl: 'https://creativecommons.org/licenses/by/4.0/',\n retrievedAt: revision,\n permittedOperations: [\n 'link',\n 'adapt',\n 'redistribute',\n 'commercial-use',\n ],\n },\n visibility: 'catalog',\n });\n }\n if (!records.length)\n throw new Error(\n 'Illustrative Mathematics K-5 index has no family-grade links.',\n );\n return records;\n}\n","import type { CatalogSourceRecord } from '../catalog-contracts.js';\n\nconst maximumFeedBytes = 2_000_000;\nconst namedEntities: Readonly<Record<string, string>> = {\n '&': '&',\n ''': \"'\",\n '>': '>',\n '<': '<',\n '"': '\"',\n};\n\nfunction decode(value: string): string {\n return value\n .replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, '$1')\n .replace(/<[^>]+>/g, ' ')\n .replace(\n /&(?:amp|apos|gt|lt|quot);/g,\n (entity) => namedEntities[entity] ?? entity,\n )\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction element(xml: string, names: readonly string[]): string | undefined {\n for (const name of names) {\n const match = new RegExp(\n `<${name}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${name}\\\\s*>`,\n 'i',\n ).exec(xml);\n const value = match ? decode(match[1]) : '';\n if (value) return value;\n }\n return undefined;\n}\n\nfunction elements(xml: string, names: readonly string[]): string[] {\n const values: string[] = [];\n for (const name of names) {\n const expression = new RegExp(\n `<${name}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${name}\\\\s*>`,\n 'gi',\n );\n for (const match of xml.matchAll(expression)) {\n const value = decode(match[1]);\n if (value) values.push(value);\n }\n }\n return [...new Set(values)];\n}\n\nfunction https(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && !url.username && !url.password\n ? url.toString()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parses a configured OER Commons/ISKME RSS or Dublin Core feed without entity\n * expansion or external resolution. The configured feed is authoritative for\n * scope; this parser never represents its page as global catalog coverage.\n */\nexport function parseOerCommonsRssFeed(\n xml: string,\n revision: string,\n): CatalogSourceRecord[] {\n if (new TextEncoder().encode(xml).byteLength > maximumFeedBytes)\n throw new Error('OER Commons RSS feed exceeds the 2 MB metadata limit.');\n if (/<!DOCTYPE|<!ENTITY/i.test(xml))\n throw new Error('OER Commons RSS feed must not contain DTDs or entities.');\n if (!revision.trim())\n throw new Error('OER Commons feed revision is required.');\n\n const records: CatalogSourceRecord[] = [];\n const items = xml.match(/<item\\b[^>]*>[\\s\\S]*?<\\/item\\s*>/gi) ?? [];\n for (const item of items) {\n const canonicalUrl = https(element(item, ['link', 'dc:identifier']));\n const stableId = element(item, ['guid', 'dc:identifier']) ?? canonicalUrl;\n const title = element(item, ['title', 'dc:title']);\n if (!canonicalUrl || !stableId || !title) continue;\n const rights = element(item, ['license', 'dc:rights', 'rights']);\n const licenseUrl = https(rights);\n records.push({\n providerId: 'oer-commons',\n stableId,\n revision: element(item, ['dc:date', 'pubDate']) ?? revision,\n canonicalUrl,\n title,\n suppliedDescription: element(item, ['description', 'dc:description']),\n author: element(item, ['dc:creator', 'author']),\n subjects: elements(item, ['category', 'dc:subject']),\n language: element(item, ['dc:language', 'language']),\n resourceType: element(item, ['dc:type']) ?? 'resource',\n availableFormats: elements(item, ['dc:format']),\n licenseEvidence: rights\n ? {\n // A feed label is provenance, not a license validation decision.\n state: 'unknown',\n identifier: rights,\n ...(licenseUrl ? { sourceUrl: licenseUrl } : {}),\n retrievedAt: revision,\n }\n : { state: 'unknown', retrievedAt: revision },\n visibility: 'catalog',\n });\n }\n if (!records.length)\n throw new Error('OER Commons RSS feed has no complete metadata items.');\n return records;\n}\n","import type {\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncCheckpoint,\n CatalogSyncPage,\n} from './catalog-contracts.js';\nimport { parseIllustrativeMathematicsK5Index } from './sources/illustrative-mathematics-parser.js';\nimport { parseOerCommonsRssFeed } from './sources/oer-commons-rss-parser.js';\n\nexport type HearthCatalogProviderId =\n | 'illustrative-mathematics'\n | 'ck12'\n | 'oer-commons';\n\n/**\n * A host-supplied integration for a provider-approved metadata feed. The\n * provider must approve the exact feed URL and credentials before it is used.\n * This deliberately does not guess a public endpoint or scrape course pages.\n */\nexport interface AuthorizedCatalogFeed {\n providerId: HearthCatalogProviderId;\n metadataFeedUrl: string;\n termsAccepted: true;\n enumerate(input: {\n cursor?: string;\n checkpoint: CatalogSyncCheckpoint;\n }): Promise<CatalogSyncPage>;\n}\n\nexport interface ProviderMetadataResponse {\n ok: boolean;\n status: number;\n url: string;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}\nexport type ProviderMetadataFetch = (\n url: string,\n options: {\n redirect: 'error';\n headers: { accept: string };\n signal?: AbortSignal;\n },\n) => Promise<ProviderMetadataResponse>;\n\nconst DEFAULT_METADATA_TIMEOUT_MS = 10_000;\n\nexport interface PublicIllustrativeMathematicsK5Config {\n /** The official K-5 curriculum index; defaults to the published index. */\n indexUrl?: string;\n fetch: ProviderMetadataFetch;\n /** Bounds both the provider request and response-body read. */\n timeoutMs?: number;\n}\nexport interface OerCommonsRssConfig {\n /** An ISKME/OER Commons-approved RSS or DC feed URL for an agreed collection. */\n feedUrl: string;\n fetch: ProviderMetadataFetch;\n /** Bounds both the provider request and response-body read. */\n timeoutMs?: number;\n /** Only set after the feed owner confirms this snapshot is terminal for its scope. */\n terminalSnapshot?: true;\n}\n\nexport interface ProviderFeedRequirement {\n providerId: HearthCatalogProviderId;\n requirement: string;\n}\n\nexport const providerFeedRequirements: readonly ProviderFeedRequirement[] = [\n {\n providerId: 'illustrative-mathematics',\n requirement:\n 'A provider-approved, paginated metadata feed plus written catalog-harvesting permission.',\n },\n {\n providerId: 'ck12',\n requirement:\n 'CK-12-approved catalog-feed access and credentials; ordinary web access is not an enumeration API.',\n },\n {\n providerId: 'oer-commons',\n requirement:\n 'OER Commons-approved paginated metadata-feed access with each record’s publisher and license fields.',\n },\n];\n\nfunction unavailablePage(providerId: HearthCatalogProviderId): CatalogSyncPage {\n const requirement = providerFeedRequirements.find(\n (entry) => entry.providerId === providerId,\n );\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n {\n code: 'provider_feed_not_configured',\n message: requirement?.requirement ?? 'Provider feed is not configured.',\n },\n ],\n };\n}\n\nfunction retryAfter(\n headers: ProviderMetadataResponse['headers'],\n): number | undefined {\n const value = headers.get('retry-after');\n if (!value) return undefined;\n const seconds = Number(value);\n return Number.isFinite(seconds) && seconds >= 0 ? seconds * 1000 : undefined;\n}\n\nfunction httpsUrl(value: string, provider: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`${provider} metadata URL is invalid.`);\n }\n if (url.protocol !== 'https:' || url.username || url.password || url.port)\n throw new Error(`${provider} metadata URL must be credential-free HTTPS.`);\n return url.toString();\n}\n\nasync function fetchMetadata(\n fetch: ProviderMetadataFetch,\n url: string,\n accept: string,\n timeoutMs = DEFAULT_METADATA_TIMEOUT_MS,\n): Promise<{ body: string; revision: string } | CatalogSyncPage> {\n const controller = new AbortController();\n const bounded = async <T>(operation: Promise<T>): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n operation,\n new Promise<T>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('Provider metadata request timed out.'));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n };\n let response: ProviderMetadataResponse;\n try {\n response = await bounded(\n fetch(url, {\n redirect: 'error',\n headers: { accept },\n signal: controller.signal,\n }),\n );\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n {\n code: 'provider_feed_failed',\n message:\n error instanceof Error ? error.message : 'Metadata request failed.',\n },\n ],\n };\n }\n if (response.status === 429)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_rate_limited',\n message: 'Provider metadata request was rate limited.',\n retryAfterMs: retryAfter(response.headers),\n },\n ],\n };\n if (!response.ok)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_feed_failed',\n message: `Provider metadata request failed with HTTP ${response.status}.`,\n },\n ],\n };\n if (response.url !== url)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'unexpected_provider_redirect',\n message:\n 'Provider metadata response URL did not match the configured URL.',\n },\n ],\n };\n let body: string;\n try {\n body = await bounded(response.text());\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n {\n code: 'provider_feed_failed',\n message:\n error instanceof Error ? error.message : 'Metadata read failed.',\n },\n ],\n };\n }\n if (new TextEncoder().encode(body).byteLength > 2_000_000)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_metadata_oversized',\n message: 'Provider metadata response exceeds 2 MB.',\n },\n ],\n };\n const revision =\n response.headers.get('etag') ?? response.headers.get('last-modified');\n if (!revision)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_revision_unavailable',\n message:\n 'Provider metadata response supplied no ETag or Last-Modified revision.',\n },\n ],\n };\n return { body, revision };\n}\n\nfunction validRecord(\n providerId: HearthCatalogProviderId,\n record: CatalogSourceRecord,\n): boolean {\n return (\n record.providerId === providerId &&\n record.stableId.trim().length > 0 &&\n record.revision.trim().length > 0 &&\n record.title.trim().length > 0 &&\n /^https:\\/\\//.test(record.canonicalUrl) &&\n typeof record.licenseEvidence.state === 'string'\n );\n}\n\n/**\n * Protects catalog state from optimistic completion and malformed provider\n * data. An unavailable feed stays explicitly incomplete and resumable.\n */\nexport class AuthorizedCatalogFeedAdapter implements CatalogSyncAdapter {\n constructor(\n private readonly providerId: HearthCatalogProviderId,\n private readonly feed?: AuthorizedCatalogFeed,\n ) {}\n\n async enumerate(input: {\n cursor?: string;\n checkpoint: CatalogSyncCheckpoint;\n }): Promise<CatalogSyncPage> {\n if (!this.feed) return unavailablePage(this.providerId);\n if (\n this.feed.providerId !== this.providerId ||\n this.feed.termsAccepted !== true ||\n !/^https:\\/\\//.test(this.feed.metadataFeedUrl)\n )\n return unavailablePage(this.providerId);\n\n try {\n const page = await this.feed.enumerate(input);\n const malformed = page.records.filter(\n (record) => !validRecord(this.providerId, record),\n );\n if (malformed.length) {\n return {\n records: page.records.filter((record) =>\n validRecord(this.providerId, record),\n ),\n complete: false,\n nextCursor: input.cursor,\n exclusions: [\n ...(page.exclusions ?? []),\n {\n cursor: input.cursor,\n code: 'invalid_provider_metadata',\n message: `${malformed.length} provider records lack required stable metadata or license evidence.`,\n },\n ],\n };\n }\n if (page.complete && page.nextCursor)\n return {\n records: page.records,\n complete: false,\n nextCursor: page.nextCursor,\n exclusions: [\n ...(page.exclusions ?? []),\n {\n cursor: input.cursor,\n code: 'contradictory_terminal_page',\n message:\n 'A terminal provider page cannot also declare a next cursor.',\n },\n ],\n };\n return page;\n } catch (error) {\n return {\n records: [],\n complete: false,\n nextCursor: input.cursor,\n exclusions: [\n {\n cursor: input.cursor,\n code: 'provider_feed_failed',\n message:\n error instanceof Error\n ? error.message\n : 'Provider metadata feed failed without an error message.',\n },\n ],\n };\n }\n }\n}\n\nexport function createIllustrativeMathematicsAdapter(\n feed?: AuthorizedCatalogFeed,\n): CatalogSyncAdapter {\n return new AuthorizedCatalogFeedAdapter('illustrative-mathematics', feed);\n}\n\n/** Enumerates only the public K-5 course index, never claims all IM coverage. */\nexport function createPublicIllustrativeMathematicsK5Adapter(\n config: PublicIllustrativeMathematicsK5Config,\n): CatalogSyncAdapter {\n return {\n async enumerate(input) {\n if (input.cursor)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n cursor: input.cursor,\n code: 'unsupported_provider_cursor',\n message: 'The public IM K-5 index has no pagination cursor.',\n },\n ],\n };\n const url = httpsUrl(\n config.indexUrl ?? 'https://im.kendallhunt.com/k5/curriculum.html',\n 'Illustrative Mathematics',\n );\n const result = await fetchMetadata(\n config.fetch,\n url,\n 'text/html,application/xhtml+xml',\n config.timeoutMs,\n );\n if ('complete' in result) return result;\n try {\n return {\n records: parseIllustrativeMathematicsK5Index(\n result.body,\n result.revision,\n url,\n ),\n complete: false,\n policyExclusions: [\n {\n code: 'partial_provider_coverage',\n message:\n 'The public IM K-5 index is not a complete IM catalog feed.',\n },\n ],\n };\n } catch (error) {\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_metadata_invalid',\n message:\n error instanceof Error\n ? error.message\n : 'IM metadata parsing failed.',\n },\n ],\n };\n }\n },\n };\n}\n\nexport function createCk12Adapter(\n feed?: AuthorizedCatalogFeed,\n): CatalogSyncAdapter {\n return new AuthorizedCatalogFeedAdapter('ck12', feed);\n}\n\nexport function createOerCommonsAdapter(\n feed?: AuthorizedCatalogFeed,\n): CatalogSyncAdapter {\n return new AuthorizedCatalogFeedAdapter('oer-commons', feed);\n}\n\n/** Parses an ISKME/OER Commons-approved RSS or Dublin Core collection feed. */\nexport function createOerCommonsRssAdapter(\n config: OerCommonsRssConfig,\n): CatalogSyncAdapter {\n return {\n async enumerate(input) {\n if (input.cursor)\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n cursor: input.cursor,\n code: 'unsupported_provider_cursor',\n message:\n 'Configured OER RSS/DC feeds are snapshot feeds without cursors.',\n },\n ],\n };\n const url = httpsUrl(config.feedUrl, 'OER Commons');\n const result = await fetchMetadata(\n config.fetch,\n url,\n 'application/rss+xml, application/xml, text/xml',\n config.timeoutMs,\n );\n if ('complete' in result) return result;\n try {\n return {\n records: parseOerCommonsRssFeed(result.body, result.revision),\n complete: config.terminalSnapshot === true,\n ...(config.terminalSnapshot === true\n ? {}\n : {\n policyExclusions: [\n {\n code: 'partial_provider_coverage',\n message:\n 'Configured OER feed scope has not been confirmed as terminal.',\n },\n ],\n }),\n };\n } catch (error) {\n return {\n records: [],\n complete: false,\n exclusions: [\n {\n code: 'provider_metadata_invalid',\n message:\n error instanceof Error\n ? error.message\n : 'OER RSS/DC parsing failed.',\n },\n ],\n };\n }\n },\n };\n}\n","import type {\n SourceImportRequest,\n SourceImportResult,\n SourceImportService,\n} from './source-import-service.js';\n\nexport type EasyPeasyGrade4Variant =\n | 'core'\n | 'shared-theme-choice'\n | 'once-weekly';\n\n/**\n * Official source pointers only. Theme rows represent a family choice and are\n * never automatically combined into an enrollment.\n */\nexport interface EasyPeasyGrade4Course {\n courseRef: string;\n title: string;\n pageUrl: string;\n subject: string;\n variant: EasyPeasyGrade4Variant;\n enrollmentMode: 'individual' | 'choose-one-theme';\n}\nexport interface EasyPeasyGrade4Theme {\n themeId: 'theme-1' | 'theme-2' | 'theme-3' | 'theme-4';\n title: string;\n courses: readonly EasyPeasyGrade4Course[];\n}\nexport interface EasyPeasyThemeImportResult {\n themeId: EasyPeasyGrade4Theme['themeId'];\n courseIds: readonly string[];\n}\n\nexport const easyPeasyGrade4Courses: readonly EasyPeasyGrade4Course[] = [\n {\n courseRef: 'grade-4-math',\n title: 'Math 4',\n subject: 'math',\n pageUrl: 'https://allinonehomeschool.com/ep-math-4/',\n variant: 'core',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'grade-4-reading',\n title: 'Reading 4',\n subject: 'reading',\n pageUrl: 'https://allinonehomeschool.com/reading-4/',\n variant: 'core',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'grade-4-language-arts',\n title: 'Language Arts 4',\n subject: 'language-arts',\n pageUrl: 'https://allinonehomeschool.com/language-arts-4/',\n variant: 'core',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'lower-elementary-theme-1',\n title: 'Theme 1: biology and ancient history',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-theme-2',\n title: 'Theme 2: zoology and early American history',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-theme-3',\n title: 'Theme 3: earth science and geography/cultures',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-theme-4',\n title: 'Theme 4: physics/chemistry and modern history',\n subject: 'shared-theme',\n pageUrl: 'https://allinonehomeschool.com/history-and-science-themes/',\n variant: 'shared-theme-choice',\n enrollmentMode: 'choose-one-theme',\n },\n {\n courseRef: 'lower-elementary-computer',\n title: 'Computer: Level 4 placement',\n subject: 'computer',\n pageUrl: 'https://allinonehomeschool.com/computer-fourth-level/',\n variant: 'once-weekly',\n enrollmentMode: 'individual',\n },\n {\n courseRef: 'lower-elementary-thinking',\n title: 'Thinking',\n subject: 'thinking',\n pageUrl: 'https://allinonehomeschool.com/thinking-levels-4-6/',\n variant: 'once-weekly',\n enrollmentMode: 'individual',\n },\n];\n\nexport function grade4Courses(\n variant?: EasyPeasyGrade4Variant,\n): readonly EasyPeasyGrade4Course[] {\n return variant\n ? easyPeasyGrade4Courses.filter((course) => course.variant === variant)\n : easyPeasyGrade4Courses;\n}\n\nfunction themeCourse(\n themeId: EasyPeasyGrade4Theme['themeId'],\n subject: string,\n title: string,\n pageUrl: string,\n): EasyPeasyGrade4Course {\n return {\n courseRef: `${themeId}-${subject}`,\n title,\n subject,\n pageUrl,\n variant: 'shared-theme-choice',\n enrollmentMode: 'individual',\n };\n}\n\n/**\n * Theme constituents are the official lower-level course pointers linked by\n * the source's themes and individual-course pages. A caller imports one theme,\n * never all four rotations.\n */\nexport const easyPeasyGrade4Themes: readonly EasyPeasyGrade4Theme[] = [\n {\n themeId: 'theme-1',\n title: 'Theme 1: biology and ancient history',\n courses: [\n themeCourse(\n 'theme-1',\n 'science',\n 'Science — Biology',\n 'https://allinonehomeschool.com/science-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'history',\n 'History — Ancient',\n 'https://allinonehomeschool.com/history-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'bible',\n 'Bible — Old Testament',\n 'https://allinonehomeschool.com/bible-year-1-2/',\n ),\n themeCourse(\n 'theme-1',\n 'art',\n 'Art — Ancient',\n 'https://allinonehomeschool.com/art-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'music',\n 'Music — Ancient',\n 'https://allinonehomeschool.com/1908-wright-brothers-flight-demonstration/music-year-1/',\n ),\n themeCourse(\n 'theme-1',\n 'pe-health',\n 'PE/Health — Strong and Healthy',\n 'https://allinonehomeschool.com/pehealth-odds/',\n ),\n ],\n },\n {\n themeId: 'theme-2',\n title: 'Theme 2: zoology and early American history',\n courses: [\n themeCourse(\n 'theme-2',\n 'science',\n 'Science — Zoology',\n 'https://allinonehomeschool.com/zoology/',\n ),\n themeCourse(\n 'theme-2',\n 'history',\n 'History — Early American',\n 'https://allinonehomeschool.com/early-american-history/',\n ),\n themeCourse(\n 'theme-2',\n 'bible',\n 'Bible — New Testament',\n 'https://allinonehomeschool.com/bible-newtestament/',\n ),\n themeCourse(\n 'theme-2',\n 'art',\n 'Art — Early American',\n 'https://allinonehomeschool.com/art-early-american/',\n ),\n themeCourse(\n 'theme-2',\n 'music',\n 'Music — Early American',\n 'https://allinonehomeschool.com/music-year-2/',\n ),\n themeCourse(\n 'theme-2',\n 'pe-health',\n 'PE/Health — Exercise and Nutrition',\n 'https://allinonehomeschool.com/pe-health/',\n ),\n ],\n },\n {\n themeId: 'theme-3',\n title: 'Theme 3: earth science and geography/cultures',\n courses: [\n themeCourse(\n 'theme-3',\n 'science',\n 'Science — Earth Science',\n 'https://allinonehomeschool.com/science-earth-science/',\n ),\n themeCourse(\n 'theme-3',\n 'history',\n 'History — Geography and Cultures',\n 'https://allinonehomeschool.com/geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'bible',\n 'Bible — Poetry',\n 'https://allinonehomeschool.com/bible-geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'art',\n 'Art — Geography and Cultures',\n 'https://allinonehomeschool.com/art-geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'music',\n 'Music — Geography and Cultures',\n 'https://allinonehomeschool.com/individual-courses-of-study/music-geography-and-cultures/',\n ),\n themeCourse(\n 'theme-3',\n 'pe-health',\n 'PE/Health — Strong and Healthy',\n 'https://allinonehomeschool.com/pehealth-odds/',\n ),\n ],\n },\n {\n themeId: 'theme-4',\n title: 'Theme 4: physics/chemistry and modern history',\n courses: [\n themeCourse(\n 'theme-4',\n 'science',\n 'Science — Physics and Chemistry',\n 'https://allinonehomeschool.com/science-year-4/',\n ),\n themeCourse(\n 'theme-4',\n 'history',\n 'History — Modern',\n 'https://allinonehomeschool.com/history-year-4/',\n ),\n themeCourse(\n 'theme-4',\n 'bible',\n 'Bible — Prophets',\n 'https://allinonehomeschool.com/bible/',\n ),\n themeCourse(\n 'theme-4',\n 'art',\n 'Art — Modern',\n 'https://allinonehomeschool.com/art-year-4/',\n ),\n themeCourse(\n 'theme-4',\n 'music',\n 'Music — Modern',\n 'https://allinonehomeschool.com/music/',\n ),\n themeCourse(\n 'theme-4',\n 'pe-health',\n 'PE/Health — Exercise and Nutrition',\n 'https://allinonehomeschool.com/pe-health/',\n ),\n ],\n },\n];\n\nexport function grade4Theme(\n themeId: EasyPeasyGrade4Theme['themeId'],\n): EasyPeasyGrade4Theme {\n const theme = easyPeasyGrade4Themes.find(\n (candidate) => candidate.themeId === themeId,\n );\n if (!theme) throw new Error('Unknown Easy Peasy Grade 4 theme.');\n return theme;\n}\n\n/** Calls the public pointer-only importer; it never fetches packets or lesson bodies. */\nexport async function importEasyPeasyGrade4Course(\n service: Pick<SourceImportService, 'importCourse'>,\n request: Omit<SourceImportRequest, 'courseRef' | 'pageUrl'> & {\n courseRef: string;\n },\n): Promise<SourceImportResult> {\n const course = easyPeasyGrade4Courses.find(\n (candidate) => candidate.courseRef === request.courseRef,\n );\n if (!course) throw new Error('Unknown Easy Peasy Grade 4 course reference.');\n if (course.enrollmentMode === 'choose-one-theme')\n throw new Error(\n 'Theme choices are catalog pointers; select an official constituent course before importing lessons.',\n );\n return service.importCourse({\n ...request,\n pageUrl: course.pageUrl,\n subject: course.subject,\n });\n}\n\nexport async function importEasyPeasyGrade4Theme(\n service: Pick<SourceImportService, 'importCourse'>,\n request: Omit<SourceImportRequest, 'courseRef' | 'pageUrl'> & {\n themeId: EasyPeasyGrade4Theme['themeId'];\n },\n): Promise<EasyPeasyThemeImportResult> {\n const theme = grade4Theme(request.themeId);\n const results = await Promise.all(\n theme.courses.map((course) =>\n service.importCourse({\n ...request,\n courseRef: course.courseRef,\n pageUrl: course.pageUrl,\n subject: course.subject,\n }),\n ),\n );\n return {\n themeId: theme.themeId,\n courseIds: results.map((result) => result.courseId),\n };\n}\n","import { SmrtRecipe } from '@happyvertical/smrt-core';\nimport { Course, CourseSection, Lesson } from './catalog.js';\nimport { Curriculum, Enrollment, Learner, LessonProgress } from './learners.js';\nimport { LessonAsset } from './lesson-assets.js';\n\nexport class EducationCatalogRecipe extends SmrtRecipe {\n static id = 'education.catalog';\n static help = './education-catalog.recipe.md';\n static label = 'Course catalog';\n static summary =\n 'Organize courses, sections, lessons, and their authorized learning materials.';\n static synonyms = ['courses', 'lessons', 'curriculum catalog'];\n static section = {\n id: 'education',\n label: 'Education',\n icon: 'folder',\n description: 'Courses and lessons for learning.',\n };\n static models = [Course, CourseSection, Lesson, LessonAsset];\n static runtime = 'both' as const;\n static nav = [\n {\n label: 'Courses',\n model: Course,\n icon: 'folder',\n description: 'Courses available to this family.',\n noun: 'course',\n },\n ];\n}\n\n/** Metadata for host composition; never grants generated CRUD authority. */\nexport class EducationLearnerRecipe extends SmrtRecipe {\n static id = 'education.learner';\n static help = './education-learner.recipe.md';\n static label = 'Learners';\n static summary =\n 'Plan learner curricula and retain enrollment-scoped progress.';\n static synonyms = ['learners', 'enrollments', 'learning progress'];\n static section = {\n id: 'education',\n label: 'Education',\n icon: 'folder',\n description: 'Courses and lessons for learning.',\n };\n static models = [Learner, Curriculum, Enrollment, LessonProgress];\n static runtime = 'both' as const;\n static nav = [\n {\n label: 'Learners',\n model: Learner,\n icon: 'users',\n description: 'Authorized learners in this family.',\n noun: 'learner',\n },\n ];\n}\n","/** A pointer-only representation of an Easy Peasy lesson. */\nexport interface ParsedSourceLesson {\n day: number;\n title: string;\n externalRef: string;\n externalUrl: string;\n worksheet: boolean;\n printableUrl?: string;\n}\n\nexport interface ParsedSourceCourse {\n title: string;\n lessons: ParsedSourceLesson[];\n packetUrl?: string;\n}\n\nconst approvedHosts = new Set([\n 'allinonehomeschool.com',\n 'www.allinonehomeschool.com',\n]);\n\n/**\n * Resolve and constrain source URLs before either fetching or retaining them.\n * Easy Peasy links must remain HTTPS links to the source site; imported data\n * must never become an open redirect or a pointer to a third-party PDF.\n */\nexport function validateEasyPeasyUrl(value: string, baseUrl?: string): string {\n let url: URL;\n try {\n url = new URL(value, baseUrl);\n } catch {\n throw new Error('Easy Peasy URL is invalid.');\n }\n if (url.protocol !== 'https:' || url.port || !approvedHosts.has(url.hostname))\n throw new Error('Easy Peasy URL must use an approved HTTPS source host.');\n if (url.username || url.password)\n throw new Error('Easy Peasy URL must not include credentials.');\n return url.toString();\n}\n\ninterface HeadingMatch {\n index: number;\n end: number;\n text: string;\n /** The official daily container is authoritative even when it lacks a heading. */\n day?: number;\n fragment?: string;\n title?: string;\n containerEnd?: number;\n levelRange?: readonly [number, number];\n hasLessonMarker?: boolean;\n}\n\ninterface LinkMatch {\n href: string;\n text: string;\n}\n\nfunction decodeHtml(value: string): string {\n return value.replace(\n /&(#x[\\da-f]+|#\\d+|amp|apos|gt|lt|nbsp|quot);/gi,\n (entity) => {\n const named: Record<string, string> = {\n '&': '&',\n ''': \"'\",\n '>': '>',\n '<': '<',\n ' ': ' ',\n '"': '\"',\n };\n const lower = entity.toLowerCase();\n if (lower in named) return named[lower];\n const number = lower.startsWith('&#x')\n ? Number.parseInt(lower.slice(3, -1), 16)\n : Number.parseInt(lower.slice(2, -1), 10);\n return Number.isSafeInteger(number) && number <= 0x10ffff\n ? String.fromCodePoint(number)\n : entity;\n },\n );\n}\n\nfunction textContent(value: string): string {\n return decodeHtml(value.replace(/<[^>]*>/g, ' '))\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction attribute(attributes: string, name: string): string | undefined {\n const match = new RegExp(\n `(?:^|[\\\\t\\\\n\\\\f\\\\r ])${name}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`,\n 'i',\n ).exec(attributes);\n return match?.[1] ?? match?.[2] ?? match?.[3];\n}\n\n/** Return the end of a div without mistaking a nested layout div for its end. */\nfunction closingDivEnd(html: string, start: number): number {\n const tags = /<\\/?div\\b[^>]*>/gi;\n tags.lastIndex = start;\n let depth = 1;\n for (let tag = tags.exec(html); tag; tag = tags.exec(html)) {\n if (/^<\\/div\\b/i.test(tag[0])) depth -= 1;\n else depth += 1;\n if (depth === 0) return tag.index + tag[0].length;\n }\n return start;\n}\n\nfunction lessonHeadings(html: string): HeadingMatch[] {\n const containers: HeadingMatch[] = [];\n const divs = /<div\\b([^>]*)>/gi;\n for (const match of html.matchAll(divs)) {\n const id = attribute(match[1], 'id');\n const marker = /^(day|week)(\\d+)$/i.exec(id ?? '');\n if (!marker) continue;\n const number = Number.parseInt(marker[2], 10);\n if (!Number.isSafeInteger(number) || number < 1)\n throw new Error(`Easy Peasy daily container is malformed: ${id}`);\n const weekly = marker[1].toLowerCase() === 'week';\n const index = match.index ?? 0;\n const end = index + match[0].length;\n const containerEnd = closingDivEnd(html, end);\n const body = html.slice(end, containerEnd);\n const level = /\\blevels?\\s+(\\d+)\\s*[-–]\\s*(\\d+)\\b/i.exec(textContent(body));\n containers.push({\n index,\n end,\n text: weekly ? `Week ${number}` : `Lesson ${number}`,\n day: number,\n fragment: `${weekly ? 'week' : 'day'}${number}`,\n ...(weekly ? { title: `Week ${number}` } : {}),\n containerEnd,\n ...(level\n ? {\n levelRange: [\n Number.parseInt(level[1], 10),\n Number.parseInt(level[2], 10),\n ] as const,\n }\n : {}),\n hasLessonMarker: new RegExp(\n `\\\\bLessons?\\\\s+${number}(?:\\\\D|$)`,\n 'i',\n ).test(textContent(body)),\n });\n }\n containers.sort((left, right) => left.index - right.index);\n const grade = 4;\n const gradeContainers = containers.filter(\n (container) =>\n !container.levelRange ||\n (container.levelRange[0] <= grade && grade <= container.levelRange[1]),\n );\n const selectedContainers: HeadingMatch[] = [];\n for (const container of gradeContainers) {\n const peers = gradeContainers.filter(\n (candidate) => candidate.day === container.day,\n );\n if (peers[0] !== container) continue;\n if (peers.length === 1) selectedContainers.push(container);\n else {\n const marked = peers.filter((candidate) => candidate.hasLessonMarker);\n if (marked.length !== 1)\n throw new Error(\n `Easy Peasy lesson day is invalid or duplicated: ${container.day}`,\n );\n selectedContainers.push(marked[0]);\n }\n }\n const isInDailyContainer = (index: number): boolean =>\n selectedContainers.some(\n (container) =>\n container.index <= index &&\n index < (container.containerEnd ?? container.end),\n );\n const isDetachedDailyMarker = (index: number, text: string): boolean => {\n const day = /^lesson\\s+(\\d+)\\b/i.exec(text)?.[1];\n if (!day) return false;\n return selectedContainers.some(\n (container) =>\n container.day === Number.parseInt(day, 10) &&\n (container.containerEnd ?? container.end) <= index &&\n !textContent(\n html.slice(container.containerEnd ?? container.end, index),\n ),\n );\n };\n\n const matches: HeadingMatch[] = [...selectedContainers];\n // Some older official pages use a bare layout div for each lesson instead of\n // a day id. Accept only a direct bold child: a nested generic block remains\n // ambiguous and is rejected below.\n const directDivLessons =\n /<div\\b[^>]*>\\s*<(?:strong|b)\\b[^>]*>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/gi;\n const bareDivMarkers: HeadingMatch[] = [];\n for (const match of html.matchAll(directDivLessons)) {\n if (isInDailyContainer(match.index ?? 0)) continue;\n const text = textContent(match[1]);\n if (!/^lesson\\b/i.test(text)) continue;\n if (isDetachedDailyMarker(match.index ?? 0, text)) continue;\n bareDivMarkers.push({\n index: match.index ?? 0,\n end: (match.index ?? 0) + match[0].length,\n text,\n });\n }\n // A lone unlabelled div marker cannot establish a course structure. Older\n // Easy Peasy course pages use a sequence of these divs; accepting a single\n // marker would turn malformed refresh input into a partial import.\n if (bareDivMarkers.length > 1) matches.push(...bareDivMarkers);\n const weeks = /<(?:strong|b)\\b([^>]*)>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/gi;\n for (const match of html.matchAll(weeks)) {\n if (isInDailyContainer(match.index ?? 0)) continue;\n const id = attribute(match[1], 'id');\n const day = /^week(\\d+)$/i.exec(id ?? '')?.[1];\n const text = textContent(match[2]);\n if (!day || !/^week\\s+\\d+\\s*$/i.test(text)) continue;\n const number = Number.parseInt(day, 10);\n if (!Number.isSafeInteger(number) || number < 1)\n throw new Error(`Easy Peasy weekly marker is malformed: ${id}`);\n const statedMatch = /^week\\s+(\\d+)/i.exec(text);\n if (!statedMatch) continue;\n const stated = Number.parseInt(statedMatch[1], 10);\n if (stated !== number)\n throw new Error('Easy Peasy weekly container and marker disagree.');\n matches.push({\n index: match.index ?? 0,\n end: (match.index ?? 0) + match[0].length,\n text,\n day: number,\n fragment: `week${number}`,\n title: `Week ${number}`,\n });\n }\n const headings = /<h[1-6]\\b[^>]*>([\\s\\S]*?)<\\/h[1-6]\\s*>/gi;\n for (const match of html.matchAll(headings)) {\n if (isInDailyContainer(match.index ?? 0)) continue;\n matches.push({\n index: match.index ?? 0,\n end: (match.index ?? 0) + match[0].length,\n text: textContent(match[1]),\n });\n }\n const blocks = /<(p|li)\\b[^>]*>([\\s\\S]*?)<\\/\\1\\s*>/gi;\n for (const block of html.matchAll(blocks)) {\n if (isInDailyContainer(block.index ?? 0)) continue;\n const bold = /<(?:strong|b)\\b[^>]*>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/i.exec(\n block[2],\n );\n if (!bold) continue;\n const text = textContent(bold[1]);\n if (!/^lesson\\b/i.test(text)) continue;\n if (isDetachedDailyMarker(block.index ?? 0, text)) continue;\n const boldIndex = (block.index ?? 0) + block[0].indexOf(bold[0]);\n matches.push({\n index: block.index ?? 0,\n end: boldIndex + bold[0].length,\n text,\n });\n }\n const sorted = matches.sort((left, right) => left.index - right.index);\n const boldMarkers = /<(strong|b)\\b[^>]*>([\\s\\S]*?)<\\/\\1\\s*>/gi;\n for (const marker of html.matchAll(boldMarkers)) {\n if (!/^lesson\\b/i.test(textContent(marker[2]))) continue;\n const index = marker.index ?? 0;\n const end = index + marker[0].length;\n const accountedFor =\n isInDailyContainer(index) ||\n isDetachedDailyMarker(index, textContent(marker[2])) ||\n sorted.some(\n (heading) =>\n /^lesson\\b/i.test(heading.text) &&\n (heading.index === index ||\n (heading.index <= index && end <= heading.end)),\n );\n if (!accountedFor)\n throw new Error('Easy Peasy lesson marker layout is unsupported.');\n }\n return sorted;\n}\n\nfunction lessonMarkerText(segment: string): string | undefined {\n const markers = /<(?:strong|b)\\b[^>]*>([\\s\\S]*?)<\\/(?:strong|b)\\s*>/gi;\n for (const marker of segment.matchAll(markers)) {\n const text = textContent(marker[1]);\n if (/^lesson\\b/i.test(text)) return text;\n }\n return undefined;\n}\n\nfunction parseLessonMarker(value: string): { day: number; worksheet: boolean } {\n const match = /^lesson\\s+(\\d+)\\s*(\\*|\\(\\*\\))?(?:\\s*\\(|\\s*$)/i.exec(value);\n if (!match)\n throw new Error(`Easy Peasy lesson heading is malformed: ${value}`);\n return {\n day: Number.parseInt(match[1], 10),\n worksheet: match[2] === '*' || match[2] === '(*)',\n };\n}\n\n/** Reject incomplete lesson markup before the tolerant extractors can skip it. */\nfunction rejectUnterminatedLessonTags(html: string): void {\n const openings = /<(h[1-6]|strong|b)\\b[^>]*>\\s*(?:<[^>]*>\\s*)*lesson\\b/gi;\n const candidates = [...html.matchAll(openings)];\n for (let index = 0; index < candidates.length; index += 1) {\n const opening = candidates[index];\n const tag = opening[1].toLowerCase();\n const afterOpening = (opening.index ?? 0) + opening[0].length;\n const closing = new RegExp(`<\\\\/${tag}\\\\s*>`, 'i').exec(\n html.slice(afterOpening),\n );\n const closingIndex = closing\n ? afterOpening + (closing.index ?? 0)\n : Number.POSITIVE_INFINITY;\n const nextOpening =\n candidates[index + 1]?.index ?? Number.POSITIVE_INFINITY;\n if (closingIndex > nextOpening || !Number.isFinite(closingIndex))\n throw new Error(\n 'Easy Peasy lesson heading is unterminated or mismatched.',\n );\n }\n}\n\nfunction links(html: string): LinkMatch[] {\n const result: LinkMatch[] = [];\n const anchors = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a\\s*>/gi;\n for (const match of html.matchAll(anchors)) {\n const href = attribute(match[1], 'href');\n if (href)\n result.push({ href: decodeHtml(href), text: textContent(match[2]) });\n }\n return result;\n}\n\nfunction isPdfLink(link: LinkMatch): boolean {\n return /\\.pdf(?:[?#]|$)/i.test(link.href);\n}\n\nfunction isAnswerLink(link: LinkMatch): boolean {\n return /\\banswers?(?:\\s+key)?\\b/i.test(`${link.href} ${link.text}`);\n}\n\nfunction isPacketLink(link: LinkMatch): boolean {\n return /\\b(?:packet|whole course|complete course)\\b/i.test(link.text);\n}\n\nfunction isSupplementalPdfLink(link: LinkMatch): boolean {\n return /\\b(?:directions?|instructions?)\\b/i.test(`${link.href} ${link.text}`);\n}\n\nfunction courseTitle(html: string): string {\n const entryTitle =\n /<h1\\b(?=[^>]*\\bclass=(?:\"[^\"]*\\bentry-title\\b[^\"]*\"|'[^']*\\bentry-title\\b[^']*'|[^\\s>]*\\bentry-title\\b))[^>]*>([\\s\\S]*?)<\\/h1\\s*>/i.exec(\n html,\n )?.[1];\n const h1 = /<h1\\b[^>]*>([\\s\\S]*?)<\\/h1\\s*>/i.exec(html)?.[1];\n const title = /<title\\b[^>]*>([\\s\\S]*?)<\\/title\\s*>/i.exec(html)?.[1];\n const value = textContent(entryTitle ?? h1 ?? title ?? '');\n if (!value) throw new Error('Easy Peasy page has no title.');\n return value;\n}\n\nfunction isApprovedSourcePdf(link: LinkMatch, pageUrl: string): boolean {\n try {\n sourcePdf(link, pageUrl);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction sourcePdf(link: LinkMatch, pageUrl: string): string {\n const url = validateEasyPeasyUrl(link.href, pageUrl);\n const parsed = new URL(url);\n if (!parsed.pathname.startsWith('/wp-content/'))\n throw new Error('Easy Peasy PDF must be hosted under wp-content.');\n if (!/\\.pdf$/i.test(parsed.pathname))\n throw new Error('Easy Peasy printable URL must be a PDF.');\n return url;\n}\n\nfunction canonicalWorksheetLink(\n links: LinkMatch[],\n pageUrl: string,\n): LinkMatch[] {\n if (links.length < 2) return links;\n const stem = (link: LinkMatch): string => {\n const pathname = new URL(link.href, pageUrl).pathname;\n return pathname\n .slice(pathname.lastIndexOf('/') + 1)\n .replace(/\\.pdf$/i, '')\n .toLowerCase();\n };\n const escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const canonical = links.filter((candidate) => {\n const candidateStem = stem(candidate);\n const variant = new RegExp(`^${escapeRegex(candidateStem)}(?:[-_ ]?\\\\d+)$`);\n return links.every(\n (link) => link === candidate || variant.test(stem(link)),\n );\n });\n // Multi-page worksheet variants retain the course-day pointer and one\n // canonical printable URL; unrelated multiple PDFs remain a hard failure.\n return canonical.length === 1 ? canonical : links;\n}\n\ninterface PrintablePointer {\n printableUrl?: string;\n hasSourcePdf: boolean;\n}\n\nfunction printableFor(\n segment: string,\n pageUrl: string,\n day: number,\n): PrintablePointer {\n const pdfLinks = links(segment)\n .filter(isPdfLink)\n .filter(\n (link) =>\n !isAnswerLink(link) &&\n !isPacketLink(link) &&\n !isSupplementalPdfLink(link) &&\n isApprovedSourcePdf(link, pageUrl),\n );\n const ownDay = new RegExp(`(?:day|lesson)[\\\\s_-]*${day}(?:\\\\D|$)`, 'i');\n const dayLinks = pdfLinks.filter((link) =>\n ownDay.test(`${link.href} ${link.text}`),\n );\n const candidates = canonicalWorksheetLink(\n dayLinks.length ? dayLinks : pdfLinks,\n pageUrl,\n );\n if (candidates.length > 1)\n // The course page remains the lesson pointer; this bounded model deliberately\n // retains no printable when the source publishes multiple source PDFs.\n return { hasSourcePdf: true };\n return candidates[0]\n ? { printableUrl: sourcePdf(candidates[0], pageUrl), hasSourcePdf: true }\n : { hasSourcePdf: false };\n}\n\nfunction packetFor(html: string, pageUrl: string): string | undefined {\n const packets = links(html).filter(\n (link) => isPdfLink(link) && !isAnswerLink(link) && isPacketLink(link),\n );\n if (packets.length > 1)\n throw new Error('Easy Peasy page has ambiguous packet PDFs.');\n return packets[0] ? sourcePdf(packets[0], pageUrl) : undefined;\n}\n\n/** Parse only the course title, day pointers, and source-hosted printable links. */\nexport function parseEasyPeasyPage(\n html: string,\n pageUrl: string,\n): ParsedSourceCourse {\n const normalizedPageUrl = validateEasyPeasyUrl(pageUrl);\n const source = html\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<(script|style)\\b[^>]*>[\\s\\S]*?<\\/\\1\\s*>/gi, '');\n rejectUnterminatedLessonTags(source);\n const title = courseTitle(source);\n const headings = lessonHeadings(source);\n const lessons: ParsedSourceLesson[] = [];\n const days = new Set<number>();\n\n for (let index = 0; index < headings.length; index += 1) {\n const heading = headings[index];\n if (heading.day === undefined && !/^lesson\\b/i.test(heading.text)) continue;\n const segment = source.slice(heading.end, headings[index + 1]?.index);\n const marker =\n heading.day === undefined ? heading.text : lessonMarkerText(segment);\n let parsedMarker: { day: number; worksheet: boolean } | undefined;\n if (marker) {\n try {\n parsedMarker = parseLessonMarker(marker);\n } catch (error) {\n // A source-controlled day/week container remains authoritative when it\n // includes a decorative nonnumeric \"Lesson\" label.\n if (heading.day === undefined) throw error;\n }\n }\n const day = heading.day ?? parsedMarker?.day;\n if (\n !day ||\n (heading.day !== undefined && parsedMarker && parsedMarker.day !== day)\n )\n throw new Error('Easy Peasy daily container and lesson marker disagree.');\n if (!Number.isSafeInteger(day) || day < 1 || days.has(day))\n throw new Error(`Easy Peasy lesson day is invalid or duplicated: ${day}`);\n days.add(day);\n const printable = printableFor(segment, normalizedPageUrl, day);\n // Some official daily containers put the worksheet asterisk on a child\n // activity label rather than the Lesson marker. A source-hosted printable\n // is sufficient evidence without retaining that activity text.\n const worksheet = parsedMarker?.worksheet ?? printable.hasSourcePdf;\n const page = new URL(normalizedPageUrl);\n page.hash = heading.fragment ?? `lesson-${day}`;\n lessons.push({\n day,\n title: heading.title ?? `Lesson ${day}`,\n externalRef: `lesson:${day}`,\n externalUrl: page.toString(),\n worksheet,\n ...(printable.printableUrl\n ? { printableUrl: printable.printableUrl }\n : {}),\n });\n }\n if (!lessons.length)\n throw new Error('Easy Peasy page has no lesson headings.');\n const packetUrl = packetFor(source, normalizedPageUrl);\n return { title, lessons, ...(packetUrl ? { packetUrl } : {}) };\n}\n","import {\n isEmbeddedDatabase,\n isPostgresDatabase,\n withEmbeddedWriteQueue,\n} from '@happyvertical/smrt-core';\nimport { getCurrentTenant } from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport { ExternalCourse } from './catalog.js';\nimport { CatalogAuthorizationError } from './catalog-service.js';\nimport {\n CourseCollection,\n CourseSectionCollection,\n ExternalCourseCollection,\n LessonCollection,\n ReadingCollection,\n WorksheetCollection,\n} from './collections.js';\nimport {\n type CourseSource,\n CourseSourceCollection,\n type SourceSharing,\n} from './course-source.js';\nimport {\n parseEasyPeasyPage,\n validateEasyPeasyUrl,\n} from './sources/easy-peasy-parser.js';\n\nexport interface SourceImportRequest {\n tenantId: string;\n actorUserId: string;\n sourceId: string;\n /** Host-stable identity, independent of the page's current URL. */\n courseRef: string;\n /** Optional trusted catalog classification retained on the tenant course. */\n subject?: string;\n pageUrl: string;\n destination: 'private' | 'group';\n}\nexport interface SourceImportAuthorization {\n action: 'education.source.import' | 'education.source.ensure';\n actorTenantId: string;\n actorUserId: string;\n sourceId: string;\n sourceSharing: SourceSharing;\n destination: 'private' | 'group';\n licenseEvidence: string;\n}\nexport type SourceImportAuthorizer = (\n request: SourceImportAuthorization,\n) => boolean | Promise<boolean>;\nexport interface EasyPeasyRegistration {\n /** Supplied by host configuration after its operator accepts the source terms. */\n termsAccepted: true;\n /** Must honor redirect:error and bound response size/time. Never fetch PDFs. */\n fetchPage: (\n url: string,\n options: { redirect: 'error' },\n ) => Promise<{ html: string; url: string }>;\n}\nexport interface SourceImportResult {\n courseId: string;\n lessonIds: string[];\n /** Source-hosted packet link, returned without fetching or persisting its content. */\n packetUrl?: string;\n}\nexport interface EnsureEasyPeasyCourseSourceRequest {\n tenantId: string;\n actorUserId: string;\n}\nexport interface EnsureEasyPeasyCourseSourceResult {\n sourceId: string;\n}\n\nasync function identity(...parts: string[]): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(\n JSON.stringify(['smrt.education.source.v1', ...parts]),\n ),\n );\n const hex = Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-5${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n\nasync function requireOwnedIdentity(\n db: DatabaseInterface,\n table: string,\n id: string,\n tenantId: string,\n): Promise<void> {\n // A filtered collection get cannot distinguish absence from a corrupt foreign\n // owner at our deterministic ID. Check only to deny; never return that row.\n if (\n (await db.get(table, { id })) &&\n !(await db.get(table, { id, tenant_id: tenantId }))\n )\n throw new CatalogAuthorizationError();\n}\n\nfunction retryable(error: unknown): boolean {\n let current = error;\n let contention = false;\n for (\n let depth = 0;\n depth < 5 && current && typeof current === 'object';\n depth++\n ) {\n const failure = current as {\n code?: unknown;\n cause?: unknown;\n connectionInvalidated?: boolean;\n };\n if (failure.connectionInvalidated) return false;\n contention ||= [\n 'SQLITE_BUSY',\n 'SQLITE_BUSY_SNAPSHOT',\n '40001',\n '40P01',\n ].includes(String(failure.code));\n current = failure.cause;\n }\n return contention;\n}\n\n/** Opt-in, pointer-only import. Host authorization defines family/group roles. */\nexport class SourceImportService {\n private easyPeasy?: Readonly<EasyPeasyRegistration>;\n constructor(\n private readonly db: DatabaseInterface,\n private readonly authorize: SourceImportAuthorizer,\n ) {}\n\n registerEasyPeasy(registration: EasyPeasyRegistration): void {\n if (\n registration.termsAccepted !== true ||\n typeof registration.fetchPage !== 'function'\n )\n throw new Error(\n 'Easy Peasy terms must be accepted by the host before registration.',\n );\n this.easyPeasy = Object.freeze({\n termsAccepted: true,\n fetchPage: registration.fetchPage,\n });\n }\n\n async ensureEasyPeasyCourseSource(\n input: EnsureEasyPeasyCourseSourceRequest,\n ): Promise<EnsureEasyPeasyCourseSourceResult> {\n const request = Object.freeze({ ...input });\n const active = getCurrentTenant();\n if (\n !request.tenantId?.trim() ||\n !request.actorUserId?.trim() ||\n active?.tenantId !== request.tenantId ||\n active.userId !== request.actorUserId ||\n active.superAdminBypass\n )\n throw new CatalogAuthorizationError();\n if (!this.easyPeasy)\n throw new Error('Easy Peasy is not registered by this host.');\n const sourceId = await identity(request.tenantId, 'easy-peasy');\n if (\n (await this.authorize({\n action: 'education.source.ensure',\n actorTenantId: request.tenantId,\n actorUserId: request.actorUserId,\n sourceId,\n sourceSharing: 'private',\n destination: 'private',\n licenseEvidence: '',\n })) !== true\n )\n throw new CatalogAuthorizationError();\n if (!this.db.transaction)\n throw new Error('Source provisioning requires real transactions.');\n const transaction = this.db.transaction;\n return withEmbeddedWriteQueue(\n this.db,\n isEmbeddedDatabase(this.db),\n async () => {\n for (let attempt = 0; ; attempt++) {\n try {\n return await transaction(async (tx) => {\n if (isPostgresDatabase(this.db))\n await tx.query(\n 'SELECT pg_advisory_xact_lock(hashtextextended($1, 0))',\n sourceId,\n );\n const sources = await CourseSourceCollection.create({ db: tx });\n const existing = await sources.get(sourceId);\n if (existing) {\n if (\n existing.tenantId !== request.tenantId ||\n existing.key !== 'easy-peasy' ||\n existing.kind !== 'adapter' ||\n existing.adapterKey !== 'easy-peasy' ||\n existing.sharing !== 'private'\n )\n throw new Error(\n 'Existing Easy Peasy source policy cannot be changed by provisioning.',\n );\n } else {\n await sources.create({\n id: sourceId,\n tenantId: request.tenantId,\n key: 'easy-peasy',\n name: 'Easy Peasy All-in-One Homeschool',\n kind: 'adapter',\n adapterKey: 'easy-peasy',\n sharing: 'private',\n });\n }\n return { sourceId };\n });\n } catch (error) {\n if (attempt >= 3 || !retryable(error)) throw error;\n await new Promise((resolve) =>\n setTimeout(resolve, 5 * 2 ** attempt),\n );\n }\n }\n },\n );\n }\n\n private actor(request: SourceImportRequest): void {\n const active = getCurrentTenant();\n if (\n !request.tenantId?.trim() ||\n !request.actorUserId?.trim() ||\n active?.tenantId !== request.tenantId ||\n active.userId !== request.actorUserId ||\n active.superAdminBypass\n )\n throw new CatalogAuthorizationError();\n if (request.destination !== 'private' && request.destination !== 'group')\n throw new Error(\n 'Only private-family or licensed-group destinations are supported.',\n );\n if (\n !request.sourceId?.trim() ||\n !request.courseRef?.trim() ||\n request.courseRef.length > 256 ||\n (request.subject !== undefined &&\n (!request.subject.trim() || request.subject.length > 256))\n )\n throw new Error('A source and stable course reference are required.');\n }\n\n private async source(\n db: DatabaseInterface,\n request: SourceImportRequest,\n ): Promise<CourseSource> {\n this.actor(request);\n const source = await (await CourseSourceCollection.create({ db })).get(\n request.sourceId,\n );\n if (!source || source.tenantId !== request.tenantId)\n throw new CatalogAuthorizationError();\n if (\n source.kind !== 'adapter' ||\n source.adapterKey !== 'easy-peasy' ||\n !['private', 'group', 'global'].includes(source.sharing)\n )\n throw new Error('Unsupported source policy.');\n const licenseEvidence = source.getConfig().licenseEvidence?.trim() ?? '';\n if (\n request.destination === 'group' &&\n (source.sharing === 'private' || !licenseEvidence)\n )\n throw new Error(\n 'Source sharing and explicit licensing evidence must permit group import.',\n );\n if (\n (await this.authorize({\n action: 'education.source.import',\n actorTenantId: request.tenantId,\n actorUserId: request.actorUserId,\n sourceId: request.sourceId,\n sourceSharing: source.sharing,\n destination: request.destination,\n licenseEvidence,\n })) !== true\n )\n throw new CatalogAuthorizationError();\n this.actor(request);\n return source;\n }\n\n async importCourse(input: SourceImportRequest): Promise<SourceImportResult> {\n // Snapshot caller input before any host callback can mutate it.\n const request = Object.freeze({ ...input });\n this.actor(request);\n const adapter = this.easyPeasy;\n if (!adapter) throw new Error('Easy Peasy is not registered by this host.');\n const registeredSource = await this.source(this.db, request);\n const pageUrl = validateEasyPeasyUrl(request.pageUrl);\n const response = await adapter.fetchPage(pageUrl, { redirect: 'error' });\n if (validateEasyPeasyUrl(response.url) !== pageUrl)\n throw new Error('Unexpected source redirect.');\n if (typeof response.html !== 'string' || response.html.length > 2_000_000)\n throw new Error('Invalid or oversized source page.');\n const parsed = parseEasyPeasyPage(response.html, pageUrl);\n const courseId = await identity(\n request.tenantId,\n String(registeredSource.id),\n request.courseRef,\n );\n return withEmbeddedWriteQueue(\n this.db,\n isEmbeddedDatabase(this.db),\n async () => {\n if (!this.db.transaction)\n throw new Error('Source imports require real transactions.');\n for (let attempt = 0; ; attempt++) {\n try {\n return await this.db.transaction(async (tx) => {\n if (isPostgresDatabase(this.db))\n await tx.query(\n 'SELECT pg_advisory_xact_lock(hashtextextended($1, 0))',\n courseId,\n );\n const source = await this.source(tx, request);\n const courses = await ExternalCourseCollection.create({ db: tx });\n const sections = await CourseSectionCollection.create({ db: tx });\n const lessons = await LessonCollection.create({ db: tx });\n const readings = await ReadingCollection.create({ db: tx });\n const worksheets = await WorksheetCollection.create({ db: tx });\n await requireOwnedIdentity(\n tx,\n 'courses',\n courseId,\n request.tenantId,\n );\n const licenseKind =\n request.destination === 'private'\n ? 'personal-use-copy'\n : 'licensed-for-sharing';\n const existing = await (\n await CourseCollection.create({ db: tx })\n ).get(courseId);\n if (\n existing &&\n (!(existing instanceof ExternalCourse) ||\n existing.tenantId !== request.tenantId ||\n existing.sourceKey !== source.key ||\n existing.sourceRef !== request.courseRef ||\n existing.licenseKind !== licenseKind)\n )\n throw new Error(\n 'Existing course ownership, source, or license cannot be changed by import.',\n );\n if (existing) {\n existing.title = parsed.title;\n existing.sourceUrl = pageUrl;\n if (request.subject) existing.subject = request.subject.trim();\n await existing.save();\n } else {\n await courses.create({\n id: courseId,\n tenantId: request.tenantId,\n title: parsed.title,\n subject: request.subject?.trim() ?? '',\n sourceKey: source.key,\n sourceRef: request.courseRef,\n sourceUrl: pageUrl,\n licenseKind,\n licenseNote: source.getConfig().licenseEvidence ?? '',\n status: 'draft',\n });\n }\n const sectionId = await identity(courseId, 'lessons');\n await requireOwnedIdentity(\n tx,\n 'course_sections',\n sectionId,\n request.tenantId,\n );\n const section = await sections.get(sectionId);\n if (section) {\n if (\n section.tenantId !== request.tenantId ||\n section.courseId !== courseId\n )\n throw new Error(\n 'Existing section ownership cannot be changed by import.',\n );\n } else {\n await sections.create({\n id: sectionId,\n tenantId: request.tenantId,\n courseId,\n title: 'Lessons',\n sortOrder: 0,\n });\n }\n const lessonIds: string[] = [];\n for (const item of parsed.lessons) {\n const id = await identity(courseId, item.externalRef);\n await requireOwnedIdentity(tx, 'lessons', id, request.tenantId);\n const lesson = await lessons.get(id);\n if (lesson) {\n if (\n lesson.tenantId !== request.tenantId ||\n lesson.sectionId !== sectionId ||\n lesson.externalRef !== item.externalRef ||\n 'printableUrl' in lesson !== item.worksheet\n )\n throw new Error(\n 'Existing lesson ownership or kind cannot be changed by import.',\n );\n lesson.title = item.title;\n lesson.externalUrl = item.externalUrl;\n if ('printableUrl' in lesson)\n lesson.printableUrl = item.printableUrl ?? '';\n await lesson.save();\n } else {\n await (item.worksheet ? worksheets : readings).create({\n id,\n tenantId: request.tenantId,\n sectionId,\n title: item.title,\n externalRef: item.externalRef,\n externalUrl: item.externalUrl,\n sortOrder: item.day,\n ...(item.worksheet\n ? { printableUrl: item.printableUrl ?? '' }\n : {}),\n });\n }\n lessonIds.push(id);\n }\n return {\n courseId,\n lessonIds,\n ...(parsed.packetUrl ? { packetUrl: parsed.packetUrl } : {}),\n };\n });\n } catch (error) {\n if (attempt >= 3 || !retryable(error)) throw error;\n await new Promise((resolve) =>\n setTimeout(resolve, 5 * 2 ** attempt),\n );\n }\n }\n },\n );\n }\n}\n","import type {\n DriveAcquisition,\n DriveAcquisitionOptions,\n DriveFileMetadata,\n DriveMetadataPage,\n DriveMetadataPageOptions,\n GoogleDriveProvider,\n} from '@happyvertical/files';\nimport type {\n CatalogAcquireAdapter,\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncPage,\n} from '../catalog-contracts.js';\n\nexport type {\n DriveAcquisition,\n DriveAcquisitionOptions,\n DriveFileMetadata,\n DriveMetadataPage,\n DriveMetadataPageOptions,\n};\n\n/**\n * Metadata-only Google Drive curriculum discovery.\n *\n * This module deliberately accepts the public @happyvertical/files Drive\n * surface as a port. Hosts construct that SDK provider with their own\n * application credentials and pass it here; neither discovery records nor\n * checkpoints contain credentials or downloaded content.\n */\n\nexport const DRIVE_CURRICULUM_SEED_ROOTS = [\n {\n id: '1K_au1upSRuakX55PF3aZzQLHWI70KwZd',\n title: 'Carnival of Collisions (Contact Forces)',\n },\n {\n id: '1N1xFJ2omm-M1TuAxDOXQxZndkw70-KxM',\n title: 'Mission Maglev (Electric and Magnetic Forces)',\n },\n {\n id: '1v0LXs7iky2R4FsiqZkWOjWyJmRu-aVIa',\n title: 'Rocks vs. Big Rigs, Unit-Wide View',\n },\n {\n id: '1sFDNXdw8q-xrhgy8HFAMELXUoqKgp9tu',\n title: 'Operation Space Jump (Gravitational Forces)',\n },\n] as const;\n\nconst GOOGLE_FOLDER_MIME = 'application/vnd.google-apps.folder';\n\n/** The adapter only uses public SDK methods, never a raw Google API client. */\nexport type GoogleDriveFilesClient = Pick<\n GoogleDriveProvider,\n 'listMetadataPage' | 'getMetadataById' | 'acquireById'\n>;\n\nexport interface DriveCatalogRecord extends CatalogSourceRecord {\n providerId: 'google-drive';\n checksum?: string;\n mimeType: string;\n size?: number;\n modifiedTime?: string;\n}\n\nexport interface DriveExclusion {\n stableId: string;\n reason:\n | 'missing-revision'\n | 'shortcut-target-inaccessible'\n | 'shortcut-target-outside-boundary'\n | 'shortcut-target-unsupported';\n}\n\ninterface FolderCursor {\n folderId: string;\n pageToken?: string;\n visibility: 'catalog' | 'teacher';\n}\n\n/** Serializable traversal state; persist it after every returned page. */\nexport interface DriveDiscoveryCheckpoint {\n version: 1;\n roots: string[];\n pendingFolders: FolderCursor[];\n visitedFolders: string[];\n}\n\nexport interface DriveDiscoveryPage {\n records: DriveCatalogRecord[];\n exclusions: DriveExclusion[];\n checkpoint?: DriveDiscoveryCheckpoint;\n complete: boolean;\n}\n\nexport interface DriveDiscoveryOptions {\n /** Defaults to the four owner-authorized curriculum roots. */\n roots?: readonly { id: string; title?: string }[];\n checkpoint?: DriveDiscoveryCheckpoint;\n pageSize?: number;\n /**\n * Exact Drive file IDs the trusted host has reviewed as learner-safe.\n * Folder IDs never grant visibility to their contents.\n */\n studentSafeFileIds?: readonly string[];\n /**\n * Shortcut targets are re-read by ID and must pass this host boundary check\n * before a folder can enter traversal. The secure default is deny.\n */\n authorizeShortcutTarget?: (\n target: DriveFileMetadata,\n context: { sourceFolderId: string; configuredRootIds: readonly string[] },\n ) => boolean | Promise<boolean>;\n}\n\nexport interface DriveSelectionAuthorization {\n stableId: string;\n revision: string;\n exportMimeType?: string;\n /** True only after the host's resource-level license policy allows use. */\n allowed: boolean;\n}\n\nexport interface PinnedDriveContent {\n stableId: string;\n revision?: string;\n checksum?: string;\n sha256: string;\n bytes: Buffer;\n exportMimeType?: string;\n}\n\nfunction uniqueRoots(\n roots: readonly { id: string; title?: string }[],\n): readonly { id: string; title?: string }[] {\n const seen = new Set<string>();\n return roots.filter((root) => {\n if (!root.id || seen.has(root.id)) return false;\n seen.add(root.id);\n return true;\n });\n}\n\nfunction assertPageSize(pageSize: number | undefined): number | undefined {\n if (pageSize === undefined) return undefined;\n if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > 1_000)\n throw new Error('Drive metadata page size must be between 1 and 1000.');\n return pageSize;\n}\n\nfunction classify(\n name: string,\n inherited: 'catalog' | 'teacher',\n): 'catalog' | 'teacher' {\n const normalized = name\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_./-]+/g, ' ')\n .toLowerCase();\n if (/\\b(answers?|solutions?|keys?)\\b/.test(normalized)) return 'teacher';\n if (/\\b(teachers?|educators?|instructors?|facilitators?)\\b/.test(normalized))\n return 'teacher';\n return inherited;\n}\n\nfunction isFolder(metadata: DriveFileMetadata): boolean {\n return metadata.mimeType === GOOGLE_FOLDER_MIME;\n}\n\nfunction nativeExportFormats(mimeType: string): string[] {\n if (\n [\n 'application/vnd.google-apps.document',\n 'application/vnd.google-apps.spreadsheet',\n 'application/vnd.google-apps.presentation',\n ].includes(mimeType)\n )\n return ['application/pdf'];\n return [mimeType];\n}\n\nfunction encodeCheckpoint(checkpoint: DriveDiscoveryCheckpoint): string {\n return Buffer.from(JSON.stringify(checkpoint)).toString('base64url');\n}\n\nfunction decodeCheckpoint(\n cursor: string | undefined,\n): DriveDiscoveryCheckpoint | undefined {\n if (!cursor) return undefined;\n try {\n const decoded: unknown = JSON.parse(\n Buffer.from(cursor, 'base64url').toString('utf8'),\n );\n if (!decoded || typeof decoded !== 'object')\n throw new Error('not an object');\n return decoded as DriveDiscoveryCheckpoint;\n } catch {\n throw new Error('Invalid Google Drive discovery cursor.');\n }\n}\n\nfunction toRecord(\n metadata: DriveFileMetadata,\n parentStableId: string,\n inheritedVisibility: 'catalog' | 'teacher',\n studentSafeFileIds: ReadonlySet<string>,\n): DriveCatalogRecord {\n const revision =\n metadata.revisionId ??\n metadata.md5Checksum ??\n metadata.modifiedTime?.toISOString();\n if (!revision)\n throw new Error(`Drive metadata for ${metadata.id} has no revision.`);\n return {\n providerId: 'google-drive',\n stableId: metadata.id,\n revision,\n ...(metadata.md5Checksum ? { checksum: metadata.md5Checksum } : {}),\n canonicalUrl: `https://drive.google.com/open?id=${encodeURIComponent(metadata.id)}`,\n title: metadata.name,\n resourceType: metadata.shortcutDetails\n ? 'shortcut'\n : isFolder(metadata)\n ? 'folder'\n : 'file',\n parentStableId,\n availableFormats: nativeExportFormats(metadata.mimeType),\n mimeType: metadata.mimeType,\n ...(metadata.size === undefined ? {} : { size: metadata.size }),\n ...(metadata.modifiedTime\n ? { modifiedTime: metadata.modifiedTime.toISOString() }\n : {}),\n visibility:\n !isFolder(metadata) &&\n !metadata.shortcutDetails &&\n studentSafeFileIds.has(metadata.id) &&\n classify(metadata.name, inheritedVisibility) === 'catalog'\n ? 'catalog'\n : 'teacher',\n licenseEvidence: { state: 'unknown' },\n };\n}\n\nfunction normalizedCheckpoint(\n options: DriveDiscoveryOptions,\n): DriveDiscoveryCheckpoint {\n const roots = uniqueRoots(options.roots ?? DRIVE_CURRICULUM_SEED_ROOTS).map(\n (root) => root.id,\n );\n if (!roots.length) throw new Error('At least one Drive root is required.');\n const checkpoint = options.checkpoint;\n if (!checkpoint) {\n return {\n version: 1,\n roots,\n pendingFolders: roots.map((folderId) => ({\n folderId,\n visibility: 'catalog',\n })),\n visitedFolders: [],\n };\n }\n if (\n checkpoint.version !== 1 ||\n checkpoint.roots.length !== roots.length ||\n checkpoint.roots.some((root, index) => root !== roots[index])\n )\n throw new Error('Drive checkpoint does not match configured roots.');\n return {\n version: 1,\n roots,\n pendingFolders: checkpoint.pendingFolders.map((folder) => ({ ...folder })),\n visitedFolders: [...checkpoint.visitedFolders],\n };\n}\n\n/**\n * One call reads at most one Drive metadata page. Repeated calls with the\n * returned checkpoint provide durable pagination without content acquisition.\n */\nexport class GoogleDriveCurriculumAdapter\n implements CatalogSyncAdapter, CatalogAcquireAdapter\n{\n static readonly providerId = 'google-drive';\n constructor(\n private readonly drive: GoogleDriveFilesClient,\n private readonly configuration: Omit<\n DriveDiscoveryOptions,\n 'checkpoint'\n > & {\n maxAcquisitionBytes?: number;\n } = {},\n ) {}\n\n async enumerate(input: { cursor?: string }): Promise<CatalogSyncPage> {\n const page = await this.discover({\n ...this.configuration,\n checkpoint: decodeCheckpoint(input.cursor),\n });\n return {\n records: page.records,\n complete: page.complete,\n ...(page.checkpoint\n ? { nextCursor: encodeCheckpoint(page.checkpoint) }\n : {}),\n // Definite boundary/format omissions are policy; unavailable metadata is\n // an operational failure and must not authorize terminal withdrawal.\n policyExclusions: page.exclusions\n .filter(\n (entry) =>\n entry.reason === 'shortcut-target-outside-boundary' ||\n entry.reason === 'shortcut-target-unsupported',\n )\n .map((entry) => ({\n code: entry.reason,\n message: `Google Drive resource ${entry.stableId} was excluded: ${entry.reason}.`,\n })),\n exclusions: page.exclusions\n .filter(\n (entry) =>\n entry.reason !== 'shortcut-target-outside-boundary' &&\n entry.reason !== 'shortcut-target-unsupported',\n )\n .map((entry) => ({\n code: entry.reason,\n message: `Google Drive resource ${entry.stableId} was excluded: ${entry.reason}.`,\n })),\n };\n }\n\n async discover(\n options: DriveDiscoveryOptions = {},\n ): Promise<DriveDiscoveryPage> {\n const checkpoint = normalizedCheckpoint(options);\n const pageSize = assertPageSize(options.pageSize);\n const current = checkpoint.pendingFolders.shift();\n if (!current) return { records: [], exclusions: [], complete: true };\n\n const page = await this.drive.listMetadataPage({\n folderId: current.folderId,\n ...(current.pageToken ? { pageToken: current.pageToken } : {}),\n ...(pageSize === undefined ? {} : { pageSize }),\n });\n const records: DriveCatalogRecord[] = [];\n const exclusions: DriveExclusion[] = [];\n const seenRecordIds = new Set<string>();\n const seenFolders = new Set(checkpoint.visitedFolders);\n seenFolders.add(current.folderId);\n\n const studentSafeFileIds = new Set(options.studentSafeFileIds ?? []);\n for (const entry of page.entries) {\n if (!entry.id || seenRecordIds.has(entry.id)) continue;\n seenRecordIds.add(entry.id);\n if (\n entry.shortcutDetails &&\n entry.shortcutDetails.targetMimeType !== GOOGLE_FOLDER_MIME\n ) {\n // A file shortcut does not establish that its target belongs under a\n // reviewed root or that the target's real parent is learner-safe.\n // Actual files encountered through trusted folder traversal remain\n // eligible for exact-ID allowlisting.\n exclusions.push({\n stableId: entry.shortcutDetails.targetId,\n reason: 'shortcut-target-unsupported',\n });\n continue;\n }\n const inheritedVisibility = classify(entry.name, current.visibility);\n try {\n records.push(\n toRecord(\n entry,\n current.folderId,\n inheritedVisibility,\n studentSafeFileIds,\n ),\n );\n } catch {\n exclusions.push({\n stableId: entry.id,\n reason: 'missing-revision',\n });\n continue;\n }\n const visibility = inheritedVisibility;\n if (entry.shortcutDetails) {\n await this.resolveShortcut(\n entry.shortcutDetails,\n current.folderId,\n visibility,\n checkpoint,\n seenFolders,\n options,\n exclusions,\n );\n } else if (isFolder(entry) && !seenFolders.has(entry.id)) {\n seenFolders.add(entry.id);\n checkpoint.pendingFolders.push({ folderId: entry.id, visibility });\n }\n }\n\n if (page.nextPageToken) {\n checkpoint.pendingFolders.unshift({\n ...current,\n pageToken: page.nextPageToken,\n });\n } else {\n seenFolders.add(current.folderId);\n }\n checkpoint.visitedFolders = [...seenFolders].sort();\n return {\n records,\n exclusions,\n ...(checkpoint.pendingFolders.length ? { checkpoint } : {}),\n complete: checkpoint.pendingFolders.length === 0,\n };\n }\n\n private async resolveShortcut(\n shortcut: NonNullable<DriveFileMetadata['shortcutDetails']>,\n sourceFolderId: string,\n inheritedVisibility: 'catalog' | 'teacher',\n checkpoint: DriveDiscoveryCheckpoint,\n seenFolders: Set<string>,\n options: DriveDiscoveryOptions,\n exclusions: DriveExclusion[],\n ): Promise<void> {\n if (shortcut.targetMimeType !== GOOGLE_FOLDER_MIME) {\n exclusions.push({\n stableId: shortcut.targetId,\n reason: 'shortcut-target-unsupported',\n });\n return;\n }\n let target: DriveFileMetadata;\n try {\n target = await this.drive.getMetadataById(shortcut.targetId);\n } catch {\n exclusions.push({\n stableId: shortcut.targetId,\n reason: 'shortcut-target-inaccessible',\n });\n return;\n }\n if (\n !isFolder(target) ||\n seenFolders.has(target.id) ||\n (await options.authorizeShortcutTarget?.(target, {\n sourceFolderId,\n configuredRootIds: checkpoint.roots,\n })) !== true\n ) {\n exclusions.push({\n stableId: target.id,\n reason: isFolder(target)\n ? 'shortcut-target-outside-boundary'\n : 'shortcut-target-unsupported',\n });\n return;\n }\n seenFolders.add(target.id);\n checkpoint.pendingFolders.push({\n folderId: target.id,\n visibility: classify(target.name, inheritedVisibility),\n });\n }\n\n /**\n * Content is available only after explicit selection and policy approval.\n * A revision is mandatory so retries cannot silently acquire changed bytes.\n */\n async acquireSelected(\n authorization: DriveSelectionAuthorization,\n options: Omit<DriveAcquisitionOptions, 'expectedRevision'>,\n ): Promise<PinnedDriveContent> {\n if (!authorization.allowed)\n throw new Error(\n 'Drive content selection is not authorized by license policy.',\n );\n if (!authorization.stableId || !authorization.revision)\n throw new Error(\n 'Drive selection requires a stable ID and exact revision.',\n );\n if (!Number.isSafeInteger(options.maxBytes) || options.maxBytes < 1)\n throw new Error(\n 'Drive acquisition requires a positive maximum byte limit.',\n );\n const acquisition = await this.drive.acquireById(authorization.stableId, {\n ...options,\n expectedRevision: authorization.revision,\n ...(authorization.exportMimeType\n ? { exportMimeType: authorization.exportMimeType }\n : {}),\n });\n if (acquisition.metadata.id !== authorization.stableId)\n throw new Error('Drive acquisition returned a different resource.');\n if (\n acquisition.metadata.revisionId &&\n acquisition.metadata.revisionId !== authorization.revision\n )\n throw new Error(\n 'Drive acquisition revision changed before content was pinned.',\n );\n if (acquisition.bytes.byteLength > options.maxBytes)\n throw new Error('Drive acquisition exceeds its byte limit.');\n const hash = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n Uint8Array.from(acquisition.bytes),\n );\n const sha256 = Buffer.from(hash).toString('hex');\n if (acquisition.contentHash.toLowerCase() !== sha256)\n throw new Error(\n 'Drive acquisition content hash did not match returned bytes.',\n );\n return {\n stableId: acquisition.metadata.id,\n ...(acquisition.metadata.revisionId\n ? { revision: acquisition.metadata.revisionId }\n : {}),\n ...(acquisition.metadata.md5Checksum\n ? { checksum: acquisition.metadata.md5Checksum }\n : {}),\n sha256,\n bytes: acquisition.bytes,\n ...(acquisition.exportMimeType\n ? { exportMimeType: acquisition.exportMimeType }\n : {}),\n };\n }\n\n async acquire(input: {\n providerId: string;\n stableId: string;\n revision: string;\n format: string;\n }): Promise<{ bytes: Uint8Array; sha256: string; revision: string }> {\n if (input.providerId !== GoogleDriveCurriculumAdapter.providerId)\n throw new Error('Google Drive adapter cannot acquire another provider.');\n const acquired = await this.acquireSelected(\n {\n stableId: input.stableId,\n revision: input.revision,\n exportMimeType: input.format,\n allowed: true,\n },\n { maxBytes: this.configuration.maxAcquisitionBytes ?? 25_000_000 },\n );\n if (acquired.revision !== input.revision)\n throw new Error(\n 'Drive acquisition did not return the selected revision.',\n );\n return {\n bytes: acquired.bytes,\n sha256: acquired.sha256,\n revision: input.revision,\n };\n }\n}\n","/** Strict first-edition hierarchy and public artifact parsing; never executes HTML. */\nexport const IM_ORIGIN = 'https://im.kendallhunt.com';\nexport const IM_ASSET_ORIGIN = 'https://cms-assets.illustrativemathematics.org';\nexport const IM_LICENSE = 'https://creativecommons.org/licenses/by/4.0/';\nexport const IM_ROOTS = [\n '/k5/curriculum.html',\n '/MS/index.html',\n '/HS/index.html',\n];\n\nexport function imText(value: string): string {\n return value\n .replace(/<[^>]*>/g, ' ')\n .replace(/ | /g, ' ')\n .replace(/&/g, '&')\n .replace(/'|'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/\\s+/g, ' ')\n .trim();\n}\nexport interface ImPageIdentity {\n path: string;\n band: string;\n course?: string;\n unit?: string;\n lesson?: string;\n audience?: string;\n leaf: string;\n}\n/** Canonical paths contain no escapes, queries, credentials, or arbitrary filenames. */\nexport function imPagePath(value: string): ImPageIdentity {\n if (value === '/') return { path: '/', band: '', leaf: '' };\n if (IM_ROOTS.includes(value))\n return { path: value, band: value.split('/')[1], leaf: 'root' };\n const k =\n /^\\/(k5(?:_es)?)\\/(teachers|families)\\/(kindergarten|grade-[1-5])(?:\\/unit-([1-9][0-9]?))?(?:\\/lesson-([1-9][0-9]?))?\\/(units|lessons|resources|preparation|family-materials)\\.html$/i.exec(\n value,\n );\n const m =\n /^\\/(MS(?:_ES)?|HS(?:_ES)?)\\/(teachers|families)\\/([1-4])(?:\\/([1-9][0-9]?))?(?:\\/([1-9][0-9]?))?\\/(index|resources|preparation)\\.html$/i.exec(\n value,\n );\n const x = k ?? m;\n if (!x) throw new Error('Unsupported first-edition hierarchy path.');\n const [, rawBand, audience, course, unit, lesson, leaf] = x;\n const band = rawBand.toLowerCase().startsWith('k5')\n ? rawBand.toLowerCase()\n : rawBand.toUpperCase();\n const isK = band.startsWith('k5');\n if (\n (band.startsWith('MS') && course === '4') ||\n (lesson && (!unit || audience !== 'teachers' || leaf !== 'preparation')) ||\n (!lesson && leaf === 'preparation') ||\n (isK && !unit && !['units', 'resources'].includes(leaf)) ||\n (isK &&\n unit &&\n !lesson &&\n !['lessons', 'resources', 'family-materials'].includes(leaf)) ||\n (!isK && !lesson && !['index', 'resources'].includes(leaf))\n )\n throw new Error('Inconsistent first-edition hierarchy.');\n const path = `/${band}/${audience}/${course}${unit ? `/${isK ? 'unit-' : ''}${unit}` : ''}${lesson ? `/${isK ? 'lesson-' : ''}${lesson}` : ''}/${leaf}.html`;\n return { path, band, audience, course, unit, lesson, leaf };\n}\nexport function imAssetId(url: URL): string | undefined {\n return url.origin === IM_ASSET_ORIGIN &&\n !url.username &&\n !url.password &&\n !url.port &&\n !url.search &&\n !url.hash &&\n /^\\/[a-zA-Z0-9]{20,64}$/.test(url.pathname)\n ? url.pathname.slice(1)\n : undefined;\n}\nexport function imStableId(path: string, assetId?: string): string {\n return `im-first-edition:${path}${assetId ? `#${assetId}` : ''}`;\n}\nexport function imHierarchyTitle(page: ImPageIdentity): string {\n const course = page.band.startsWith('k5')\n ? `Grade ${page.course === 'kindergarten' ? 'K' : page.course?.slice(6)}`\n : page.band.startsWith('MS')\n ? `Grade ${Number(page.course) + 5}`\n : ['', 'Algebra 1', 'Geometry', 'Algebra 2', 'Algebra 1 Supports'][\n Number(page.course)\n ];\n return `IM ${page.band} ${course ?? ''}${page.unit ? ` Unit ${page.unit}` : ''}${page.lesson ? ` Lesson ${page.lesson}` : ''}`.trim();\n}\nexport interface ImArtifact {\n id: string;\n label: string;\n allowed: boolean;\n}\nexport interface ImParsedPage {\n children: string[];\n artifacts: ImArtifact[];\n exclusions: { code: string; message: string }[];\n attribution: string;\n notices: string;\n licensed: boolean;\n title: string;\n}\ninterface RoleContainer {\n tag: string;\n parent?: RoleContainer;\n contentStart: number;\n resource: boolean;\n closed: boolean;\n malformed: boolean;\n headings: { tag: string; text: string }[];\n descendantHeadingCount: number;\n cells: string[];\n}\n\n/** A '<' is legal inside a tag only in a closed, quoted attribute value. */\nfunction malformedTagToken(token: string): boolean {\n const prefix = /^<\\/?[a-zA-Z][\\w:-]*/.exec(token);\n if (!prefix) return true;\n const end = token.length - 1;\n let index = prefix[0].length;\n while (index < end) {\n while (index < end && /\\s/.test(token[index])) index++;\n if (index === end || (index === end - 1 && token[index] === '/'))\n return false;\n const nameStart = index;\n while (index < end && !/[\\s\"'<>/=]/.test(token[index])) index++;\n if (index === nameStart) return true;\n while (index < end && /\\s/.test(token[index])) index++;\n if (token[index] !== '=') continue;\n index++;\n while (index < end && /\\s/.test(token[index])) index++;\n const quote = token[index];\n if (quote === '\"' || quote === \"'\") {\n const close = token.indexOf(quote, index + 1);\n if (close < 0 || close >= end) return true;\n index = close + 1;\n } else {\n const valueStart = index;\n while (index < end && !/\\s/.test(token[index])) {\n if (/[\"'`=<>]/.test(token[index])) return true;\n index++;\n }\n if (index === valueStart) return true;\n }\n }\n return false;\n}\n\n/** Bind each link to its own source row/block; headings never cross containers. */\nfunction localArtifactLabels(html: string): Map<number, string> {\n const stack: RoleContainer[] = [];\n const links: {\n start: number;\n owner?: RoleContainer;\n kind?: 'row' | 'resource';\n }[] = [];\n const voidTags = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ]);\n const tokens =\n /<\\/?([a-zA-Z][\\w:-]*)(?:\\s+(?:[^>\"']|\"[^\"]*\"|'[^']*')*)?\\s*\\/?>/g;\n const invalidateOwners = () => {\n for (const owner of stack)\n if (owner.resource || owner.tag === 'tr') owner.malformed = true;\n };\n let tokenCount = 0;\n let consumedEnd = 0;\n for (const token of html.matchAll(tokens)) {\n if (++tokenCount > 50_000 || stack.length > 256)\n throw new Error('First-edition role structure exceeds parser bounds.');\n // Unconsumed markup starts are malformed descendants too (e.g. a tag\n // truncated before its '>' and then followed by an ancestor close).\n if (/<[/!]?[a-zA-Z]/.test(html.slice(consumedEnd, token.index)))\n invalidateOwners();\n consumedEnd = token.index + token[0].length;\n const malformed = malformedTagToken(token[0]);\n if (malformed) invalidateOwners();\n const tag = token[1].toLowerCase();\n if (token[0].startsWith('</')) {\n const index = stack.findLastIndex((node) => node.tag === tag);\n if (index < 0) {\n invalidateOwners();\n continue;\n }\n const node = stack[index];\n if (index !== stack.length - 1) {\n invalidateOwners();\n node.malformed = true;\n for (const dangling of stack.slice(index + 1))\n dangling.malformed = true;\n }\n node.closed = true;\n if (/^h[1-6]$/.test(tag)) {\n const content = imText(html.slice(node.contentStart, token.index));\n if (!node.malformed && node.parent?.resource)\n node.parent.headings.push({ tag, text: content });\n const row = stack\n .slice(0, index)\n .findLast((ancestor) => ancestor.tag === 'tr');\n if (row) row.headings.push({ tag, text: content });\n }\n if (tag === 'td' && node.parent?.tag === 'tr')\n node.parent.cells.push(\n imText(html.slice(node.contentStart, token.index)),\n );\n stack.length = index;\n continue;\n }\n // Register headings at OPEN: malformed close recovery must not erase them.\n if (/^h[1-6]$/.test(tag)) {\n for (const owner of stack)\n if (owner.resource || owner.tag === 'tr')\n owner.descendantHeadingCount++;\n }\n const parent = stack.at(-1);\n if (tag === 'a') {\n if (\n parent?.tag === 'td' &&\n parent.parent?.tag === 'tr' &&\n parent.parent.cells.length > 0\n )\n links.push({ start: token.index, owner: parent.parent, kind: 'row' });\n else\n links.push({\n start: token.index,\n owner: parent?.resource ? parent : undefined,\n kind: 'resource',\n });\n }\n if (voidTags.has(tag) || token[0].endsWith('/>')) continue;\n const className =\n /\\sclass\\s*=\\s*[\"']([^\"']*)[\"']/i.exec(token[0])?.[1] ?? '';\n stack.push({\n tag,\n parent,\n contentStart: token.index + token[0].length,\n resource:\n tag === 'div' &&\n className.split(/\\s+/).includes('im-c-row__flex-resource'),\n closed: false,\n malformed,\n headings: [],\n descendantHeadingCount: 0,\n cells: [],\n });\n }\n // Open owners or their descendants at EOF are never a complete source boundary.\n invalidateOwners();\n const labels = new Map<number, string>();\n for (const link of links) {\n const owner = link.owner;\n if (!owner?.closed || owner.malformed) continue;\n if (link.kind === 'row') {\n if (owner.descendantHeadingCount === 0 && owner.headings.length === 0)\n labels.set(link.start, owner.cells[0] ?? '');\n } else if (\n owner.descendantHeadingCount === 1 &&\n owner.headings.length === 1 &&\n /^h[34]$/.test(owner.headings[0].tag)\n )\n labels.set(link.start, owner.headings[0].text);\n }\n return labels;\n}\n\nexport function parseImFirstEditionPage(\n rawHtml: string,\n path: string,\n): ImParsedPage {\n const page = imPagePath(path);\n const html = rawHtml\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<(script|style)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, '');\n const footer = /<footer\\b[^>]*>([\\s\\S]*?)<\\/footer>/i.exec(html)?.[1] ?? '';\n const licensed =\n /href=[\"']https:\\/\\/creativecommons\\.org\\/licenses\\/by\\/4\\.0\\/[\"']/i.test(\n footer,\n ) &&\n /Illustrative Mathematics/i.test(imText(footer)) &&\n !/licenses\\/(?:by-nc|by-sa|by-nd)|all rights reserved/i.test(footer);\n const paragraphs = [...footer.matchAll(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi)].map(\n (x) => imText(x[1]),\n );\n const attribution = paragraphs\n .filter((s) => /copyright|©|licensed under/i.test(s))\n .join('\\n');\n const notices = paragraphs\n .filter((s) => /name and logo|respective|attribution/i.test(s))\n .join('\\n');\n const children = new Set<string>();\n const exclusions: ImParsedPage['exclusions'] = [];\n const artifacts = new Map<string, ImArtifact>();\n const localLabels = localArtifactLabels(html);\n const anchors = [...html.matchAll(/<a\\b([^>]*)>([\\s\\S]*?)<\\/a\\s*>/gi)];\n if (anchors.length > 4000)\n throw new Error('First-edition page has too many links.');\n for (const anchor of anchors) {\n const href = /\\bhref\\s*=\\s*[\"']([^\"']+)[\"']/i.exec(anchor[1])?.[1];\n if (!href) continue;\n let url: URL;\n try {\n url = new URL(href.replace(/&/g, '&'), IM_ORIGIN + path);\n } catch {\n exclusions.push({\n code: 'invalid_link',\n message: 'Malformed source link.',\n });\n continue;\n }\n if (/oauth_im\\/login/.test(url.pathname)) {\n exclusions.push({\n code: 'login_required',\n message: imText(anchor[2]) || 'Login-gated material.',\n });\n continue;\n }\n if (\n url.hostname === 'accessim.org' ||\n url.hostname.endsWith('.accessim.org')\n ) {\n exclusions.push({\n code: 'different_edition',\n message: 'AccessIM/v.360 is outside the first edition.',\n });\n continue;\n }\n if (url.origin === IM_ASSET_ORIGIN) {\n const id = imAssetId(url);\n if (!id) {\n exclusions.push({\n code: 'invalid_asset_path',\n message: 'Unsupported official asset path.',\n });\n continue;\n }\n const label = localLabels.get(anchor.index) ?? '';\n const allowed =\n /^(Student Task Statements|Student Handouts|Cumulative Practice Problems|Family Support Materials|Family Materials|Learning Targets|Student Task Statement Cover Page)$/i.test(\n label,\n );\n const prior = artifacts.get(id);\n artifacts.set(id, {\n id,\n label,\n allowed:\n allowed && (!prior || (prior.allowed && prior.label === label)),\n });\n continue;\n }\n if (\n url.origin !== IM_ORIGIN ||\n url.username ||\n url.password ||\n url.port ||\n url.search ||\n url.hash ||\n /%|\\\\/.test(href)\n )\n continue;\n let child: ImPageIdentity;\n try {\n child = imPagePath(url.pathname);\n } catch {\n if (\n /^\\/(?:k5(?:_es)?|MS(?:_ES)?|HS(?:_ES)?)\\/(?:teachers|families|students)\\//i.test(\n url.pathname,\n )\n )\n exclusions.push({\n code: 'unsupported_hierarchy_or_html',\n message: `Outside declared PDF hierarchy: ${url.pathname}`,\n });\n continue;\n }\n const sameCourse =\n child.band === page.band &&\n child.audience === page.audience &&\n child.course === page.course;\n const rootChild =\n page.leaf === 'root' &&\n child.band.toLowerCase().replace('_es', '') === page.band.toLowerCase() &&\n child.course &&\n !child.unit &&\n child.leaf !== 'resources';\n const courseChild =\n page.course &&\n !page.unit &&\n page.leaf !== 'resources' &&\n sameCourse &&\n ((child.unit && !child.lesson && child.leaf !== 'resources') ||\n (!child.unit && child.leaf === 'resources'));\n const unitChild =\n page.unit &&\n !page.lesson &&\n !['resources', 'family-materials'].includes(page.leaf) &&\n sameCourse &&\n child.unit === page.unit &&\n ((child.lesson && child.leaf === 'preparation') ||\n (!child.lesson && child.leaf === 'resources'));\n const familyMaterialsChild =\n page.band.startsWith('k5') &&\n page.audience === 'families' &&\n page.unit &&\n !page.lesson &&\n page.leaf !== 'family-materials' &&\n sameCourse &&\n child.unit === page.unit &&\n !child.lesson &&\n child.leaf === 'family-materials';\n if (rootChild || courseChild || unitChild || familyMaterialsChild)\n children.add(child.path);\n }\n if (children.size > 128 || artifacts.size > 128)\n throw new Error('First-edition page exceeds hierarchy/artifact bound.');\n return {\n children: [...children],\n artifacts: [...artifacts.values()],\n exclusions,\n attribution,\n notices,\n licensed,\n title: imText(/<title[^>]*>([\\s\\S]*?)<\\/title>/i.exec(html)?.[1] ?? ''),\n };\n}\n","import {\n CATALOG_REPRESENTATION_MEDIA_TYPES,\n catalogRepresentationFormat,\n catalogRepresentationMediaType,\n normalizeCatalogRepresentation,\n} from '../catalog-capability.js';\nimport type {\n CatalogAcquireAdapter,\n CatalogSourceRecord,\n CatalogSyncAdapter,\n CatalogSyncPage,\n} from '../catalog-contracts.js';\nimport {\n IM_ASSET_ORIGIN,\n IM_LICENSE,\n IM_ORIGIN,\n IM_ROOTS,\n imHierarchyTitle,\n imPagePath,\n imStableId,\n parseImFirstEditionPage,\n} from './public-illustrative-mathematics-parser.js';\n\nexport interface PublicIllustrativeMathematicsFirstEditionConfig {\n /** Standard fetch, including streaming Response bodies; defaults to global fetch. */\n fetch?: typeof globalThis.fetch;\n /** Per enumeration/acquisition total deadline. Default 20 seconds; maximum 60 seconds. */\n timeoutMs?: number;\n /** Selected PDF cap. Default 32 MiB; maximum 64 MiB. */\n maxPdfBytes?: number;\n}\ninterface Cursor {\n v: 1;\n todo: string[];\n offset: number;\n pageRevision?: string;\n}\ninterface Revision {\n v: 1;\n page: string;\n etag: string;\n length: number;\n modified: string;\n}\nconst PROVIDER = 'illustrative-mathematics';\nconst METADATA_CAP = 2_000_000;\nconst HEADS_PER_PAGE = 4;\nfunction retryDelay(value: string | null): number {\n if (!value) return 60_000;\n const delay = /^[0-9]+$/.test(value)\n ? Number(value) * 1000\n : Date.parse(value) - Date.now();\n return Number.isFinite(delay)\n ? Math.min(3_600_000, Math.max(0, delay))\n : 60_000;\n}\nfunction encode(value: unknown): string {\n return JSON.stringify(value);\n}\nfunction cursor(value?: string): Cursor {\n if (!value) return { v: 1, todo: ['/', ...IM_ROOTS], offset: 0 };\n if (value.length > 64_000) throw new Error('Cursor exceeds its size bound.');\n const x = JSON.parse(value) as Cursor;\n if (\n !x ||\n Object.keys(x).some(\n (k) => !['v', 'todo', 'offset', 'pageRevision'].includes(k),\n ) ||\n x.v !== 1 ||\n !Array.isArray(x.todo) ||\n !x.todo.length ||\n x.todo.length > 384 ||\n !Number.isSafeInteger(x.offset) ||\n x.offset < 0 ||\n x.offset > 128 ||\n (x.pageRevision !== undefined &&\n (typeof x.pageRevision !== 'string' || x.pageRevision.length > 256)) ||\n (x.offset > 0 && !x.pageRevision)\n )\n throw new Error('Invalid first-edition cursor.');\n for (const p of x.todo)\n if (typeof p !== 'string' || p.length > 160 || imPagePath(p).path !== p)\n throw new Error('Invalid cursor hierarchy path.');\n if (new Set(x.todo).size !== x.todo.length)\n throw new Error('Duplicate cursor paths.');\n return x;\n}\nfunction observedMetadata(response: Response) {\n const etag = response.headers.get('etag') ?? '';\n const lengthText = response.headers.get('content-length') ?? '';\n const length = Number(lengthText);\n const modified = response.headers.get('last-modified') ?? '';\n const header = response.headers.get('content-type');\n const mediaType =\n header === null ? null : catalogRepresentationMediaType(header);\n const format =\n mediaType === null\n ? 'unknown'\n : (catalogRepresentationFormat(mediaType) ?? 'unknown');\n if (\n response.headers.has('content-encoding') &&\n response.headers.get('content-encoding') !== 'identity'\n )\n throw new Error('PDF representation is unexpectedly encoded.');\n if (\n !/^\"[\\x21\\x23-\\x7e]{1,200}\"$/.test(etag) ||\n !/^[1-9][0-9]*$/.test(lengthText) ||\n !Number.isSafeInteger(length) ||\n !modified ||\n !Number.isFinite(Date.parse(modified)) ||\n modified.length > 100\n )\n throw new Error(\n 'Metadata requires a strong ETag, positive safe length, and valid Last-Modified metadata.',\n );\n return { etag, length, modified, format, mediaType } as const;\n}\nfunction validators(\n response: Response,\n cap: number,\n): Omit<Revision, 'v' | 'page'> {\n const { format, mediaType, ...metadata } = observedMetadata(response);\n if (format !== 'pdf' || metadata.length > cap)\n throw new Error(\n 'Selected representation requires PDF content type and bounded length.',\n );\n return metadata;\n}\nasync function readBody(response: Response, cap: number): Promise<Uint8Array> {\n const declared = response.headers.get('content-length');\n if (declared && (!/^[0-9]+$/.test(declared) || Number(declared) > cap))\n throw new Error('Response exceeds declared body bound.');\n if (!response.body) throw new Error('Provider response body is missing.');\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const next = await reader.read();\n if (next.done) break;\n size += next.value.byteLength;\n if (size > cap) throw new Error('Provider streamed body exceeds bound.');\n chunks.push(next.value);\n }\n } catch (error) {\n await reader.cancel().catch(() => {});\n throw error;\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\nasync function sha256(bytes: Uint8Array): Promise<string> {\n return [\n ...new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', bytes)),\n ]\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n/**\n * Public first-edition English/linked Spanish K–12 teacher/family hierarchy.\n * Each enumeration reads one HTML page and at most four asset HEADs. Only an\n * explicit, validated selection can GET PDF bytes; generic acquisition retains\n * policy, tenant isolation, idempotence, attribution and notices.\n */\nexport function createPublicIllustrativeMathematicsFirstEditionAdapter(\n config: PublicIllustrativeMathematicsFirstEditionConfig = {},\n): CatalogSyncAdapter & CatalogAcquireAdapter {\n const fetcher = config.fetch ?? globalThis.fetch;\n const timeout = config.timeoutMs ?? 20_000;\n const pdfCap = config.maxPdfBytes ?? 32 * 1024 * 1024;\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 60_000 ||\n !Number.isSafeInteger(pdfCap) ||\n pdfCap < 5 ||\n pdfCap > 64 * 1024 * 1024\n )\n throw new Error('Invalid first-edition request bounds.');\n async function operation<T>(\n run: (\n request: (\n url: string,\n method: 'GET' | 'HEAD',\n headers?: Record<string, string>,\n ) => Promise<Response>,\n ) => Promise<T>,\n ): Promise<T> {\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n run(async (url, method, headers = {}) => {\n if (controller.signal.aborted)\n throw new Error('First-edition operation timed out.');\n const response = await fetcher(url, {\n method,\n redirect: 'error',\n signal: controller.signal,\n headers: {\n 'accept-encoding': 'identity',\n accept: url.startsWith(IM_ASSET_ORIGIN)\n ? method === 'HEAD'\n ? Object.values(CATALOG_REPRESENTATION_MEDIA_TYPES).join(', ')\n : 'application/pdf'\n : 'text/html',\n ...headers,\n },\n });\n if (\n !response.ok ||\n response.status !== 200 ||\n response.redirected ||\n response.url !== url\n ) {\n await response.body?.cancel();\n const error = new Error(\n `Official provider request failed: HTTP ${response.status} or unexpected redirect.`,\n );\n Object.assign(error, {\n retryAfterMs:\n response.status === 429\n ? retryDelay(response.headers.get('retry-after'))\n : undefined,\n });\n throw error;\n }\n return response;\n }),\n new Promise<T>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('First-edition operation timed out.'));\n }, timeout);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n controller.abort();\n }\n }\n async function html(\n request: Parameters<Parameters<typeof operation>[0]>[0],\n path: string,\n ) {\n const response = await request(IM_ORIGIN + path, 'GET');\n if (\n !/^text\\/html(?:\\s*;|$)/i.test(response.headers.get('content-type') ?? '')\n )\n throw new Error('Expected official HTML metadata.');\n const bytes = await readBody(response, METADATA_CAP);\n const parsed = parseImFirstEditionPage(\n new TextDecoder('utf-8', { fatal: true }).decode(bytes),\n path,\n );\n // Official HTML includes per-request CSRF tokens and changing weak ETags.\n // Bind the revision to the exact validated source semantics, not session markup.\n const revision = await sha256(\n new TextEncoder().encode(encode({ path, ...parsed })),\n );\n return { parsed, revision };\n }\n return {\n async enumerate(input): Promise<CatalogSyncPage> {\n let state: Cursor;\n try {\n state = cursor(input.cursor ?? input.checkpoint.cursor);\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n exclusions: [\n { code: 'invalid_provider_cursor', message: String(error) },\n ],\n };\n }\n try {\n return await operation(async (request) => {\n const path = state.todo[0];\n const { parsed, revision } = await html(request, path);\n if (state.pageRevision && state.pageRevision !== revision)\n throw new Error(\n 'Metadata changed during cursor traversal; restart this sync generation.',\n );\n if (state.offset > parsed.artifacts.length)\n throw new Error('Cursor artifact offset exceeds source page.');\n const policyExclusions =\n state.offset === 0 ? [...parsed.exclusions] : [];\n const records: CatalogSourceRecord[] = [];\n const page = imPagePath(path);\n const expectsChildren =\n page.leaf === 'root' ||\n (page.audience === 'teachers' &&\n !page.lesson &&\n ['units', 'lessons', 'index'].includes(page.leaf)) ||\n (page.audience === 'families' &&\n !page.unit &&\n ['units', 'index'].includes(page.leaf));\n if (expectsChildren && !parsed.children.length)\n throw new Error(\n 'Official hierarchy page has no recognized children; coverage is incomplete.',\n );\n if (page.course && state.offset === 0)\n records.push({\n providerId: PROVIDER,\n stableId: imStableId(path),\n revision,\n canonicalUrl: IM_ORIGIN + path,\n title: imHierarchyTitle(page),\n parentStableId: page.lesson\n ? imStableId(\n path.replace(\n /\\/(?:lesson-)?[0-9]+\\/preparation.html$/,\n page.band.startsWith('k5')\n ? '/lessons.html'\n : '/index.html',\n ),\n )\n : page.unit\n ? imStableId(\n `/${page.band}/${page.audience}/${page.course}/${page.band.startsWith('k5') ? 'units' : 'index'}.html`,\n )\n : undefined,\n resourceType: page.lesson\n ? 'lesson'\n : page.unit\n ? 'unit'\n : 'course',\n subjects: ['mathematics'],\n language: page.band.toLowerCase().endsWith('_es') ? 'es' : 'en',\n availableFormats: ['html'],\n visibility: 'teacher',\n licenseEvidence: {\n state: parsed.licensed ? 'verified' : 'unknown',\n sourceUrl: IM_ORIGIN + path,\n permittedOperations: ['link'],\n },\n });\n const slice = parsed.artifacts.slice(\n state.offset,\n state.offset + HEADS_PER_PAGE,\n );\n const results = await Promise.allSettled(\n slice.map(async (asset) => {\n if (!asset.allowed || !parsed.licensed || !parsed.attribution) {\n policyExclusions.push({\n code: !asset.allowed\n ? 'teacher_or_unknown_role'\n : 'unverified_license',\n message: `${asset.id}: ${asset.label || 'Unknown label'}.`,\n });\n return;\n }\n const response = await request(\n `${IM_ASSET_ORIGIN}/${asset.id}`,\n 'HEAD',\n );\n const { format, mediaType, ...metadata } =\n observedMetadata(response);\n const representation = normalizeCatalogRepresentation({\n format,\n mediaType,\n byteLength: metadata.length,\n validators: {\n etag: metadata.etag,\n lastModified: metadata.modified,\n },\n acquisition:\n format === 'unknown'\n ? {\n status: 'unknown-format',\n reason:\n mediaType === null\n ? 'missing-content-type'\n : 'unrecognized-content-type',\n }\n : format !== 'pdf'\n ? { status: 'unsupported-format' }\n : {\n status:\n metadata.length <= pdfCap\n ? 'supported'\n : 'size-limit',\n maxBytes: pdfCap,\n },\n });\n // Retain the published PDF revision encoding; capability limits are not content identity.\n const pinned =\n format === 'pdf'\n ? { v: 1, page: revision, ...metadata }\n : {\n v: 2,\n page: revision,\n ...metadata,\n mediaType,\n };\n const grade = page.band.startsWith('k5')\n ? page.course === 'kindergarten'\n ? 'K'\n : page.course?.slice(6)\n : page.band.startsWith('MS')\n ? String(Number(page.course) + 5)\n : undefined;\n records.push({\n providerId: PROVIDER,\n stableId: imStableId(path, asset.id),\n revision: encode(pinned),\n canonicalUrl: IM_ORIGIN + path,\n title: `${imHierarchyTitle(page)} — ${asset.label}`,\n suppliedDescription: `${parsed.title}. Source label: ${asset.label}.`,\n author: 'Illustrative Mathematics',\n subjects: ['mathematics'],\n gradeRange: grade\n ? { min: grade, max: grade }\n : { min: '9', max: '12' },\n language: page.band.toLowerCase().endsWith('_es') ? 'es' : 'en',\n resourceType: 'student-material',\n parentStableId: imStableId(path),\n availableFormats: format === 'unknown' ? [] : [format],\n representation,\n visibility: 'catalog',\n licenseEvidence: {\n state: 'verified',\n identifier: 'CC BY',\n version: '4.0',\n sourceUrl: IM_ORIGIN + path,\n attribution: `${parsed.attribution}\\n${IM_ORIGIN + path}\\n${IM_LICENSE}`,\n exceptions: `${parsed.notices}\\nOriginal first-edition ${format.toUpperCase()}; no changes made. License: ${IM_LICENSE}`,\n retrievedAt: new Date().toISOString(),\n permittedOperations: [\n 'link',\n 'download',\n 'print',\n 'adapt',\n 'redistribute',\n 'commercial-use',\n ],\n },\n });\n }),\n );\n // Do not advance a cursor or emit a partial page after any failed HEAD.\n const failure = results.find((r) => r.status === 'rejected');\n if (failure?.status === 'rejected') throw failure.reason;\n const end = state.offset + slice.length;\n const next: Cursor =\n end < parsed.artifacts.length\n ? { ...state, offset: end, pageRevision: revision }\n : {\n v: 1,\n todo: [...parsed.children, ...state.todo.slice(1)],\n offset: 0,\n };\n if (next.todo.length > 384 || encode(next).length > 64_000)\n throw new Error('Hierarchy cursor exceeds its durable bound.');\n if (path === '/')\n policyExclusions.push({\n code: 'declared_scope',\n message:\n 'Public first-edition official CMS artifact links with observed PDF/ZIP/DOCX representations explicitly labeled for students/families on official K5/MS/HS teacher/family course, unit, resources and lesson preparation pages, including linked Spanish counterparts and Algebra 1 Supports. HTML-only lessons, external-host artifacts, teacher/login and unknown-role material are excluded; unknown MIME is retained with acquisition denied; malformed MIME or invalid validators pause enumeration; AccessIM/v.360 is excluded.',\n });\n return {\n records: records.sort((a, b) =>\n a.stableId.localeCompare(b.stableId),\n ),\n complete: next.todo.length === 0,\n ...(next.todo.length ? { nextCursor: encode(next) } : {}),\n policyExclusions,\n };\n });\n } catch (error) {\n return {\n records: [],\n complete: false,\n paused: true,\n nextCursor: encode(state),\n exclusions: [\n {\n code: 'provider_metadata_unavailable',\n message: error instanceof Error ? error.message : String(error),\n retryAfterMs: (error as { retryAfterMs?: number }).retryAfterMs,\n },\n ],\n };\n }\n },\n async acquire(input) {\n if (\n input.providerId !== PROVIDER ||\n input.format !== 'pdf' ||\n input.stableId.length > 300 ||\n input.revision.length > 1000\n )\n throw new Error('Unsupported first-edition acquisition.');\n const match = /^im-first-edition:(\\/[^#]+)#([a-zA-Z0-9]{20,64})$/.exec(\n input.stableId,\n );\n if (!match || imPagePath(match[1]).path !== match[1])\n throw new Error('Invalid selected first-edition identity.');\n const selected = JSON.parse(input.revision) as Revision;\n if (\n !selected ||\n Object.keys(selected).sort().join(',') !==\n 'etag,length,modified,page,v' ||\n selected.v !== 1 ||\n typeof selected.page !== 'string' ||\n !/^[a-f0-9]{64}$/.test(selected.page) ||\n typeof selected.etag !== 'string' ||\n !/^\"[\\x21\\x23-\\x7e]{1,200}\"$/.test(selected.etag) ||\n !Number.isSafeInteger(selected.length) ||\n selected.length < 5 ||\n selected.length > pdfCap ||\n typeof selected.modified !== 'string' ||\n selected.modified.length > 100 ||\n !Number.isFinite(Date.parse(selected.modified))\n )\n throw new Error('Invalid selected first-edition revision.');\n return await operation(async (request) => {\n const { parsed, revision } = await html(request, match[1]);\n if (\n revision !== selected.page ||\n !parsed.licensed ||\n !parsed.attribution ||\n !parsed.artifacts.some((a) => a.id === match[2] && a.allowed)\n )\n throw new Error(\n 'Selected artifact, role, license or page revision changed.',\n );\n const response = await request(\n `${IM_ASSET_ORIGIN}/${match[2]}`,\n 'GET',\n {\n 'if-match': selected.etag,\n 'if-unmodified-since': selected.modified,\n },\n );\n const actual = validators(response, pdfCap);\n if (\n actual.etag !== selected.etag ||\n actual.length !== selected.length ||\n actual.modified !== selected.modified\n ) {\n await response.body?.cancel();\n throw new Error('Selected PDF revision changed.');\n }\n const bytes = await readBody(response, pdfCap);\n if (\n bytes.length !== selected.length ||\n new TextDecoder().decode(bytes.subarray(0, 5)) !== '%PDF-'\n )\n throw new Error('Selected body is not the declared PDF.');\n return { bytes, revision: input.revision, sha256: await sha256(bytes) };\n });\n },\n };\n}\n"],"mappings":"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AAU;IACV,kBAAkB,CAChB;KACE,MAAM;KACN,SACE;IACJ,CACF;GACF;EACF,SAAS,OAAO;GACd,OAAO;IACL,SAAS,CAAC;IACV,UAAU;IACV,YAAY,CACV;KACE,MAAM;KACN,SACE,iBAAiB,QACb,MAAM,UACN;IACR,CACF;GACF;EACF;CACF,EACF;AACF;AAEO,SAAS,kBACd,MACoB;CACpB,OAAO,IAAI,6BAA6B,QAAQ,IAAI;AACtD;AAEO,SAAS,wBACd,MACoB;CACpB,OAAO,IAAI,6BAA6B,eAAe,IAAI;AAC7D;AAGO,SAAS,2BACd,QACoB;CACpB,OAAO,EACL,MAAM,UAAU,OAAO;EACrB,IAAI,MAAM,QACR,OAAO;GACL,SAAS,CAAC;GACV,UAAU;GACV,YAAY,CACV;IACE,QAAQ,MAAM;IACd,MAAM;IACN,SACE;GACJ,CACF;EACF;EACF,MAAM,MAAM,SAAS,OAAO,SAAS,aAAa;EAClD,MAAM,SAAS,MAAM,cACnB,OAAO,OACP,KACA,kDACA,OAAO,SACT;EACA,IAAI,cAAc,QAAQ,OAAO;EACjC,IAAI;GACF,OAAO;IACL,SAAS,uBAAuB,OAAO,MAAM,OAAO,QAAQ;IAC5D,UAAU,OAAO,qBAAqB;IACtC,GAAI,OAAO,qBAAqB,OAC5B,CAAC,IACD,EACE,kBAAkB,CAChB;KACE,MAAM;KACN,SACE;IACJ,CACF,EACF;GACN;EACF,SAAS,OAAO;GACd,OAAO;IACL,SAAS,CAAC;IACV,UAAU;IACV,YAAY,CACV;KACE,MAAM;KACN,SACE,iBAAiB,QACb,MAAM,UACN;IACR,CACF;GACF;EACF;CACF,EACF;AACF;;;ACtcO,IAAM,yBAA2D;CACtE;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;CACA;EACE,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,gBAAgB;CAClB;AACF;AAEO,SAAS,cACd,SACkC;CAClC,OAAO,UACH,uBAAuB,QAAQ,WAAW,OAAO,YAAY,OAAO,IACpE;AACN;AAEA,SAAS,YACP,SACA,SACA,OACA,SACuB;CACvB,OAAO;EACL,WAAW,GAAG,QAAO,GAAI;EACzB;EACA;EACA;EACA,SAAS;EACT,gBAAgB;CAClB;AACF;AAOO,IAAM,wBAAyD;CACpE;EACE,SAAS;EACT,OAAO;EACP,SAAS;GACP,YACE,WACA,WACA,qBACA,gDACF;GACA,YACE,WACA,WACA,qBACA,gDACF;GACA,YACE,WACA,SACA,yBACA,gDACF;GACA,YACE,WACA,OACA,iBACA,4CACF;GACA,YACE,WACA,SACA,mBACA,wFACF;GACA,YACE,WACA,aACA,kCACA,+CACF;EACF;CACF;CACA;EACE,SAAS;EACT,OAAO;EACP,SAAS;GACP,YACE,WACA,WACA,qBACA,yCACF;GACA,YACE,WACA,WACA,4BACA,wDACF;GACA,YACE,WACA,SACA,yBACA,oDACF;GACA,YACE,WACA,OACA,wBACA,oDACF;GACA,YACE,WACA,SACA,0BACA,8CACF;GACA,YACE,WACA,aACA,sCACA,2CACF;EACF;CACF;CACA;EACE,SAAS;EACT,OAAO;EACP,SAAS;GACP,YACE,WACA,WACA,2BACA,uDACF;GACA,YACE,WACA,WACA,oCACA,wDA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"}
|