@databricks/appkit 0.67.0 → 0.69.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -2
- package/dist/appkit/package.js +1 -1
- package/dist/core/agent/skills/types.d.ts +6 -1
- package/dist/core/agent/skills/types.d.ts.map +1 -1
- package/dist/database/contract/index.js +1 -1
- package/dist/database/contract/wire.d.ts.map +1 -1
- package/dist/database/contract/wire.js +5 -1
- package/dist/database/contract/wire.js.map +1 -1
- package/dist/database/errors.js +39 -3
- package/dist/database/errors.js.map +1 -1
- package/dist/database/runtime/data-path.js.map +1 -1
- package/dist/database/runtime/engine/drizzle-data-path.js +1 -1
- package/dist/database/runtime/engine/drizzle-data-path.js.map +1 -1
- package/dist/database/runtime/engine/translate.js +9 -2
- package/dist/database/runtime/engine/translate.js.map +1 -1
- package/dist/database/schema-builder/define-schema.d.ts +5 -1
- package/dist/database/schema-builder/define-schema.d.ts.map +1 -1
- package/dist/database/schema-builder/define-schema.js +4 -0
- package/dist/database/schema-builder/define-schema.js.map +1 -1
- package/dist/database/schema-builder/types.d.ts +7 -2
- package/dist/database/schema-builder/types.d.ts.map +1 -1
- package/dist/database/schema-builder/types.js.map +1 -1
- package/dist/plugins/agents/active-stream-tracker.js +52 -0
- package/dist/plugins/agents/active-stream-tracker.js.map +1 -0
- package/dist/plugins/agents/adapter-extensions.js +50 -0
- package/dist/plugins/agents/adapter-extensions.js.map +1 -0
- package/dist/plugins/agents/agents.d.ts +6 -77
- package/dist/plugins/agents/agents.d.ts.map +1 -1
- package/dist/plugins/agents/agents.js +57 -431
- package/dist/plugins/agents/agents.js.map +1 -1
- package/dist/plugins/agents/approval.js +28 -0
- package/dist/plugins/agents/approval.js.map +1 -0
- package/dist/plugins/agents/builtin-tools.js +39 -0
- package/dist/plugins/agents/builtin-tools.js.map +1 -0
- package/dist/plugins/agents/prompt.js +27 -0
- package/dist/plugins/agents/prompt.js.map +1 -0
- package/dist/plugins/agents/registry.js +56 -0
- package/dist/plugins/agents/registry.js.map +1 -0
- package/dist/plugins/agents/resolve-config.js +40 -0
- package/dist/plugins/agents/resolve-config.js.map +1 -0
- package/dist/plugins/agents/skill-loader.js +139 -0
- package/dist/plugins/agents/skill-loader.js.map +1 -0
- package/dist/plugins/agents/tool-dispatch.js +124 -0
- package/dist/plugins/agents/tool-dispatch.js.map +1 -0
- package/dist/plugins/database/crud/codecs.js +78 -0
- package/dist/plugins/database/crud/codecs.js.map +1 -0
- package/dist/plugins/database/crud/contract.js +151 -0
- package/dist/plugins/database/crud/contract.js.map +1 -0
- package/dist/plugins/database/crud/exposure.js +40 -0
- package/dist/plugins/database/crud/exposure.js.map +1 -0
- package/dist/plugins/database/crud/query.js +244 -0
- package/dist/plugins/database/crud/query.js.map +1 -0
- package/dist/plugins/database/crud/routes.js +124 -0
- package/dist/plugins/database/crud/routes.js.map +1 -0
- package/dist/plugins/database/database.d.ts +6 -0
- package/dist/plugins/database/database.d.ts.map +1 -1
- package/dist/plugins/database/database.js +58 -4
- package/dist/plugins/database/database.js.map +1 -1
- package/dist/plugins/database/defaults.js +28 -1
- package/dist/plugins/database/defaults.js.map +1 -1
- package/dist/plugins/database/entity-client.js +1 -1
- package/dist/plugins/database/entity-types.d.ts +13 -4
- package/dist/plugins/database/entity-types.d.ts.map +1 -1
- package/dist/plugins/database/lifecycle.js +2 -1
- package/dist/plugins/database/lifecycle.js.map +1 -1
- package/dist/plugins/database/types.d.ts +32 -0
- package/dist/plugins/database/types.d.ts.map +1 -1
- package/dist/shared/src/schemas/manifest.d.ts +54 -54
- package/docs/api/appkit/Function.database.md +3 -3
- package/docs/api/appkit/Function.defineSchema.md +14 -6
- package/docs/api/appkit/Interface.Schema.md +10 -2
- package/docs/api/appkit/TypeAlias.IDatabaseConfig.md +20 -0
- package/docs/api/appkit.md +2 -2
- package/llms.txt +2 -2
- package/package.json +1 -1
- package/sbom.cdx.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-schema.js","names":[],"sources":["../../../src/database/schema-builder/define-schema.ts"],"sourcesContent":["import { ColumnBuilder, enumColumn, validateLiteralDefaults } from \"./columns\";\nimport { buildEngineTables } from \"./engine/tables\";\nimport { resolveForeignKeys } from \"./fk\";\nimport { buildRelations } from \"./relations\";\nimport {\n type AppKitTable,\n type ColumnMeta,\n type ColumnRef,\n type DefineSchemaOptions,\n type MutableColumnMeta,\n type ResolvedRelation,\n type Schema,\n SchemaBuildError,\n type TableHandle,\n} from \"./types\";\nimport { deriveInsertSchema, deriveUpdateSchema } from \"./validators\";\n\ninterface RawTable {\n readonly name: string;\n readonly metas: Record<string, MutableColumnMeta>;\n readonly handle: Record<string, ColumnRef>;\n}\n\ninterface FinalizedTableCandidate {\n readonly columns: Readonly<Record<string, ColumnMeta>>;\n readonly engine: Schema[\"$engine\"][string];\n readonly relations: readonly ResolvedRelation[];\n readonly insertSchema: unknown;\n readonly updateSchema: unknown;\n}\n\ninterface DeclarationState {\n readonly raw: Map<string, RawTable>;\n readonly handleNames: Map<object, string>;\n}\n\nexport interface SchemaBuilderContext {\n table<C extends Record<string, ColumnBuilder>>(\n name: string,\n columns: C,\n ): TableHandle<C>;\n enum(name: string, values: readonly string[]): ColumnBuilder;\n}\n\nconst RESERVED_OBJECT_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst RESERVED_DATABASE_EXPORT_KEYS = new Set([\"sql\", \"transaction\"]);\n// A global symbol lets typegen recognize schemas loaded through another AppKit instance.\nconst FINALIZED_SCHEMA = Symbol.for(\"@databricks/appkit.database.schema\");\nconst TABLE_METADATA_KEYS = [\n \"$name\",\n \"$schemaName\",\n \"$columns\",\n \"$engine\",\n \"$relations\",\n \"$insertSchema\",\n \"$updateSchema\",\n] as const;\n\nfunction nullRecord<T>(): Record<string, T> {\n return Object.create(null) as Record<string, T>;\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is object {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new SchemaBuildError(`${label} must be an object`);\n }\n}\n\nfunction assertName(value: string, label: string): void {\n if (!value || RESERVED_OBJECT_KEYS.has(value)) {\n throw new SchemaBuildError(`${label} \"${value}\" is reserved`);\n }\n}\n\nfunction assertTableName(value: string): void {\n assertName(value, \"Table name\");\n if (RESERVED_DATABASE_EXPORT_KEYS.has(value)) {\n throw new SchemaBuildError(`Table name \"${value}\" is reserved`);\n }\n}\n\nfunction finalizeColumn(meta: MutableColumnMeta): ColumnMeta {\n if (!meta.engineColumn) {\n throw new SchemaBuildError(\n `Engine column \"${meta.columnName}\" is missing during finalization`,\n );\n }\n const { fkRef: _fkRef, ...published } = meta;\n return Object.freeze({\n ...published,\n enumValues: meta.enumValues\n ? Object.freeze([...meta.enumValues])\n : undefined,\n fk: meta.fk ? Object.freeze({ ...meta.fk }) : undefined,\n engineColumn: meta.engineColumn,\n }) as ColumnMeta;\n}\n\nfunction finalizeRelations(\n relations: readonly ResolvedRelation[],\n): readonly ResolvedRelation[] {\n return Object.freeze(\n relations.map((relation) => Object.freeze({ ...relation })),\n );\n}\n\n/** Clone builders into per-table metadata and create stable column handles. */\nfunction declareTable<C extends Record<string, ColumnBuilder>>(\n state: DeclarationState,\n name: string,\n columns: C,\n): TableHandle<C> {\n assertTableName(name);\n if (state.raw.has(name)) {\n throw new SchemaBuildError(`Duplicate table \"${name}\"`);\n }\n assertRecord(columns, `Columns for table \"${name}\"`);\n\n const metas = nullRecord<MutableColumnMeta>();\n const handle = Object.create(null) as Record<string, ColumnRef>;\n for (const [key, column] of Object.entries(columns)) {\n assertName(key, `Column name on table \"${name}\"`);\n if (key.startsWith(\"$\") || key === \"and\" || key === \"or\") {\n throw new SchemaBuildError(\n `Column \"${name}.${key}\" collides with AppKit runtime metadata`,\n );\n }\n if (!(column instanceof ColumnBuilder)) {\n throw new SchemaBuildError(\n `Column \"${name}.${key}\" was not created by an AppKit column builder`,\n );\n }\n\n const meta = column._cloneMeta();\n meta.name = key;\n meta.columnName = key;\n metas[key] = meta;\n\n const reference: ColumnRef = Object.freeze({\n __isColumnRef: true,\n tableName: name,\n columnName: key,\n });\n Object.defineProperty(handle, key, {\n enumerable: true,\n value: reference,\n });\n }\n\n state.raw.set(name, { name, metas, handle });\n state.handleNames.set(handle, name);\n return handle as unknown as TableHandle<C>;\n}\n\nfunction createBuilderContext(state: DeclarationState): SchemaBuilderContext {\n return {\n table(name, columns) {\n return declareTable(state, name, columns);\n },\n enum(name, values) {\n return enumColumn(name, values);\n },\n };\n}\n\n/** Require every exact table handle once under its declared identity. */\nfunction validateReturnedTables(\n returned: unknown,\n state: DeclarationState,\n): void {\n assertRecord(returned, \"defineSchema() return value\");\n const returnedHandles = new Set<object>();\n for (const [key, value] of Object.entries(returned)) {\n const name =\n value !== null && typeof value === \"object\"\n ? state.handleNames.get(value)\n : undefined;\n if (!name) {\n throw new SchemaBuildError(\n `defineSchema returned a value for \"${key}\" that was not produced by ctx.table()`,\n );\n }\n if (key !== name) {\n throw new SchemaBuildError(\n `defineSchema returned table \"${name}\" under key \"${key}\"; aliases are not supported`,\n );\n }\n if (returnedHandles.has(value)) {\n throw new SchemaBuildError(`Table \"${name}\" was returned more than once`);\n }\n returnedHandles.add(value);\n }\n if (returnedHandles.size !== state.raw.size) {\n const omitted = [...state.raw.values()]\n .filter((table) => !returnedHandles.has(table.handle))\n .map((table) => table.name);\n throw new SchemaBuildError(\n `defineSchema omitted declared table${omitted.length === 1 ? \"\" : \"s\"}: ${omitted.join(\", \")}`,\n );\n }\n}\n\n/** Detect declaration-handle tampering before metadata publication. */\nfunction validateHandles(raw: ReadonlyMap<string, RawTable>): void {\n for (const table of raw.values()) {\n const ownKeys = Reflect.ownKeys(table.handle);\n const hasOnlyDeclaredColumns =\n ownKeys.length === Object.keys(table.metas).length &&\n ownKeys.every(\n (key) => typeof key === \"string\" && Object.hasOwn(table.metas, key),\n );\n const hasMetadataCollision = TABLE_METADATA_KEYS.some((key) =>\n Object.hasOwn(table.handle, key),\n );\n if (\n Object.getPrototypeOf(table.handle) !== null ||\n !Object.isExtensible(table.handle) ||\n !hasOnlyDeclaredColumns ||\n hasMetadataCollision\n ) {\n throw new SchemaBuildError(\n `Table handle \"${table.name}\" was modified during schema declaration`,\n );\n }\n }\n}\n\n/** Reject composite primary keys, which keyed operations cannot represent. */\nfunction validatePrimaryKeys(raw: ReadonlyMap<string, RawTable>): void {\n for (const table of raw.values()) {\n const primaryKeys = Object.values(table.metas).filter(\n (meta) => meta.primaryKey,\n );\n if (primaryKeys.length > 1) {\n throw new SchemaBuildError(\n `Table \"${table.name}\" declares multiple primary-key columns; composite primary keys are not supported`,\n );\n }\n }\n}\n\n/** Reject table names that collide with generated Drizzle relation keys. */\nfunction validateRelationKeys(\n raw: ReadonlyMap<string, RawTable>,\n relations: ReadonlyMap<string, readonly ResolvedRelation[]>,\n): void {\n for (const [name, tableRelations] of relations) {\n if (tableRelations.length > 0 && raw.has(`${name}Relations`)) {\n throw new SchemaBuildError(\n `Table \"${name}Relations\" collides with generated relation metadata for \"${name}\"`,\n );\n }\n }\n}\n\n/** Prepare every engine object and validator without mutating handles. */\nfunction prepareTables(\n raw: ReadonlyMap<string, RawTable>,\n schemaName: string,\n relations: ReadonlyMap<string, readonly ResolvedRelation[]>,\n): Map<string, FinalizedTableCandidate> {\n const built = buildEngineTables(raw.values(), schemaName);\n const candidates = new Map<string, FinalizedTableCandidate>();\n for (const table of raw.values()) {\n const builtTable = built.get(table.name);\n if (!builtTable) {\n throw new SchemaBuildError(\n `Engine table \"${table.name}\" was not constructed`,\n );\n }\n const columns = nullRecord<ColumnMeta>();\n for (const [key, meta] of Object.entries(builtTable.columns)) {\n columns[key] = finalizeColumn(meta);\n }\n Object.freeze(columns);\n const tableRelations = finalizeRelations(relations.get(table.name) ?? []);\n const validatorTable = { $columns: columns } as AppKitTable;\n candidates.set(table.name, {\n columns,\n engine: builtTable.engine,\n relations: tableRelations,\n insertSchema: deriveInsertSchema(validatorTable),\n updateSchema: deriveUpdateSchema(validatorTable),\n });\n }\n return candidates;\n}\n\n/** Atomically publish prepared metadata as the final schema transition. */\nfunction publishSchema(\n raw: ReadonlyMap<string, RawTable>,\n candidates: ReadonlyMap<string, FinalizedTableCandidate>,\n schemaName: string,\n): Schema {\n const publications = [...raw.values()].map((table) => {\n const candidate = candidates.get(table.name);\n if (!candidate) {\n throw new SchemaBuildError(\n `Table \"${table.name}\" was not prepared for finalization`,\n );\n }\n return { table, candidate };\n });\n\n const tables = nullRecord<AppKitTable>();\n const engine = nullRecord<Schema[\"$engine\"][string]>();\n for (const { table, candidate } of publications) {\n Object.defineProperties(table.handle, {\n $name: { value: table.name },\n $schemaName: { value: schemaName },\n $columns: { value: candidate.columns },\n $engine: { value: candidate.engine },\n $relations: { value: candidate.relations },\n $insertSchema: { value: candidate.insertSchema },\n $updateSchema: { value: candidate.updateSchema },\n });\n const finalized = Object.freeze(table.handle) as unknown as AppKitTable;\n tables[table.name] = finalized;\n engine[table.name] = candidate.engine;\n }\n\n const schema = {\n $schemaName: schemaName,\n $tables: Object.freeze(tables),\n $engine: Object.freeze(engine),\n };\n Object.defineProperty(schema, FINALIZED_SCHEMA, { value: true });\n return Object.freeze(schema);\n}\n\n/** @internal Reject values that were not finalized by `defineSchema()`. */\nexport function assertFinalizedSchema(value: unknown): asserts value is Schema {\n if (\n value === null ||\n typeof value !== \"object\" ||\n (value as Record<PropertyKey, unknown>)[FINALIZED_SCHEMA] !== true\n ) {\n throw new TypeError(\"Expected a finalized AppKit database schema\");\n }\n}\n\nexport function defineSchema(\n builder: (context: SchemaBuilderContext) => Record<string, AppKitTable>,\n options?: DefineSchemaOptions,\n): Schema {\n const schemaName = options?.schemaName ?? \"public\";\n if (!schemaName) throw new SchemaBuildError(\"Schema name cannot be empty\");\n\n const state: DeclarationState = {\n raw: new Map(),\n handleNames: new Map(),\n };\n const returned = builder(createBuilderContext(state));\n\n validateReturnedTables(returned, state);\n validateHandles(state.raw);\n validatePrimaryKeys(state.raw);\n resolveForeignKeys(state.raw);\n // FK literals are checked against the inherited target storage, not the placeholder.\n validateLiteralDefaults(state.raw.values());\n\n const relations = buildRelations(state.raw);\n validateRelationKeys(state.raw, relations);\n const candidates = prepareTables(state.raw, schemaName, relations);\n return publishSchema(state.raw, candidates, schemaName);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"define-schema.js","names":[],"sources":["../../../src/database/schema-builder/define-schema.ts"],"sourcesContent":["import { ColumnBuilder, enumColumn, validateLiteralDefaults } from \"./columns\";\nimport { buildEngineTables } from \"./engine/tables\";\nimport { resolveForeignKeys } from \"./fk\";\nimport { buildRelations } from \"./relations\";\nimport {\n type AppKitTable,\n type ColumnMeta,\n type ColumnRef,\n type DefineSchemaOptions,\n type MutableColumnMeta,\n type ResolvedRelation,\n type Schema,\n SchemaBuildError,\n type TableHandle,\n} from \"./types\";\nimport { deriveInsertSchema, deriveUpdateSchema } from \"./validators\";\n\ninterface RawTable {\n readonly name: string;\n readonly metas: Record<string, MutableColumnMeta>;\n readonly handle: Record<string, ColumnRef>;\n}\n\ninterface FinalizedTableCandidate {\n readonly columns: Readonly<Record<string, ColumnMeta>>;\n readonly engine: Schema[\"$engine\"][string];\n readonly relations: readonly ResolvedRelation[];\n readonly insertSchema: unknown;\n readonly updateSchema: unknown;\n}\n\ninterface DeclarationState {\n readonly raw: Map<string, RawTable>;\n readonly handleNames: Map<object, string>;\n}\n\nexport interface SchemaBuilderContext {\n table<C extends Record<string, ColumnBuilder>>(\n name: string,\n columns: C,\n ): TableHandle<C>;\n enum(name: string, values: readonly string[]): ColumnBuilder;\n}\n\nconst RESERVED_OBJECT_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst RESERVED_DATABASE_EXPORT_KEYS = new Set([\"sql\", \"transaction\"]);\n// A global symbol lets typegen recognize schemas loaded through another AppKit instance.\nconst FINALIZED_SCHEMA = Symbol.for(\"@databricks/appkit.database.schema\");\nconst TABLE_METADATA_KEYS = [\n \"$name\",\n \"$schemaName\",\n \"$columns\",\n \"$engine\",\n \"$relations\",\n \"$insertSchema\",\n \"$updateSchema\",\n] as const;\n\nfunction nullRecord<T>(): Record<string, T> {\n return Object.create(null) as Record<string, T>;\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is object {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new SchemaBuildError(`${label} must be an object`);\n }\n}\n\nfunction assertName(value: string, label: string): void {\n if (!value || RESERVED_OBJECT_KEYS.has(value)) {\n throw new SchemaBuildError(`${label} \"${value}\" is reserved`);\n }\n}\n\nfunction assertTableName(value: string): void {\n assertName(value, \"Table name\");\n if (RESERVED_DATABASE_EXPORT_KEYS.has(value)) {\n throw new SchemaBuildError(`Table name \"${value}\" is reserved`);\n }\n}\n\nfunction finalizeColumn(meta: MutableColumnMeta): ColumnMeta {\n if (!meta.engineColumn) {\n throw new SchemaBuildError(\n `Engine column \"${meta.columnName}\" is missing during finalization`,\n );\n }\n const { fkRef: _fkRef, ...published } = meta;\n return Object.freeze({\n ...published,\n enumValues: meta.enumValues\n ? Object.freeze([...meta.enumValues])\n : undefined,\n fk: meta.fk ? Object.freeze({ ...meta.fk }) : undefined,\n engineColumn: meta.engineColumn,\n }) as ColumnMeta;\n}\n\nfunction finalizeRelations(\n relations: readonly ResolvedRelation[],\n): readonly ResolvedRelation[] {\n return Object.freeze(\n relations.map((relation) => Object.freeze({ ...relation })),\n );\n}\n\n/** Clone builders into per-table metadata and create stable column handles. */\nfunction declareTable<C extends Record<string, ColumnBuilder>>(\n state: DeclarationState,\n name: string,\n columns: C,\n): TableHandle<C> {\n assertTableName(name);\n if (state.raw.has(name)) {\n throw new SchemaBuildError(`Duplicate table \"${name}\"`);\n }\n assertRecord(columns, `Columns for table \"${name}\"`);\n\n const metas = nullRecord<MutableColumnMeta>();\n const handle = Object.create(null) as Record<string, ColumnRef>;\n for (const [key, column] of Object.entries(columns)) {\n assertName(key, `Column name on table \"${name}\"`);\n if (key.startsWith(\"$\") || key === \"and\" || key === \"or\") {\n throw new SchemaBuildError(\n `Column \"${name}.${key}\" collides with AppKit runtime metadata`,\n );\n }\n if (!(column instanceof ColumnBuilder)) {\n throw new SchemaBuildError(\n `Column \"${name}.${key}\" was not created by an AppKit column builder`,\n );\n }\n\n const meta = column._cloneMeta();\n meta.name = key;\n meta.columnName = key;\n metas[key] = meta;\n\n const reference: ColumnRef = Object.freeze({\n __isColumnRef: true,\n tableName: name,\n columnName: key,\n });\n Object.defineProperty(handle, key, {\n enumerable: true,\n value: reference,\n });\n }\n\n state.raw.set(name, { name, metas, handle });\n state.handleNames.set(handle, name);\n return handle as unknown as TableHandle<C>;\n}\n\nfunction createBuilderContext(state: DeclarationState): SchemaBuilderContext {\n return {\n table(name, columns) {\n return declareTable(state, name, columns);\n },\n enum(name, values) {\n return enumColumn(name, values);\n },\n };\n}\n\n/** Require every exact table handle once under its declared identity. */\nfunction validateReturnedTables(\n returned: unknown,\n state: DeclarationState,\n): void {\n assertRecord(returned, \"defineSchema() return value\");\n const returnedHandles = new Set<object>();\n for (const [key, value] of Object.entries(returned)) {\n const name =\n value !== null && typeof value === \"object\"\n ? state.handleNames.get(value)\n : undefined;\n if (!name) {\n throw new SchemaBuildError(\n `defineSchema returned a value for \"${key}\" that was not produced by ctx.table()`,\n );\n }\n if (key !== name) {\n throw new SchemaBuildError(\n `defineSchema returned table \"${name}\" under key \"${key}\"; aliases are not supported`,\n );\n }\n if (returnedHandles.has(value)) {\n throw new SchemaBuildError(`Table \"${name}\" was returned more than once`);\n }\n returnedHandles.add(value);\n }\n if (returnedHandles.size !== state.raw.size) {\n const omitted = [...state.raw.values()]\n .filter((table) => !returnedHandles.has(table.handle))\n .map((table) => table.name);\n throw new SchemaBuildError(\n `defineSchema omitted declared table${omitted.length === 1 ? \"\" : \"s\"}: ${omitted.join(\", \")}`,\n );\n }\n}\n\n/** Detect declaration-handle tampering before metadata publication. */\nfunction validateHandles(raw: ReadonlyMap<string, RawTable>): void {\n for (const table of raw.values()) {\n const ownKeys = Reflect.ownKeys(table.handle);\n const hasOnlyDeclaredColumns =\n ownKeys.length === Object.keys(table.metas).length &&\n ownKeys.every(\n (key) => typeof key === \"string\" && Object.hasOwn(table.metas, key),\n );\n const hasMetadataCollision = TABLE_METADATA_KEYS.some((key) =>\n Object.hasOwn(table.handle, key),\n );\n if (\n Object.getPrototypeOf(table.handle) !== null ||\n !Object.isExtensible(table.handle) ||\n !hasOnlyDeclaredColumns ||\n hasMetadataCollision\n ) {\n throw new SchemaBuildError(\n `Table handle \"${table.name}\" was modified during schema declaration`,\n );\n }\n }\n}\n\n/** Reject composite primary keys, which keyed operations cannot represent. */\nfunction validatePrimaryKeys(raw: ReadonlyMap<string, RawTable>): void {\n for (const table of raw.values()) {\n const primaryKeys = Object.values(table.metas).filter(\n (meta) => meta.primaryKey,\n );\n if (primaryKeys.length > 1) {\n throw new SchemaBuildError(\n `Table \"${table.name}\" declares multiple primary-key columns; composite primary keys are not supported`,\n );\n }\n }\n}\n\n/** Reject table names that collide with generated Drizzle relation keys. */\nfunction validateRelationKeys(\n raw: ReadonlyMap<string, RawTable>,\n relations: ReadonlyMap<string, readonly ResolvedRelation[]>,\n): void {\n for (const [name, tableRelations] of relations) {\n if (tableRelations.length > 0 && raw.has(`${name}Relations`)) {\n throw new SchemaBuildError(\n `Table \"${name}Relations\" collides with generated relation metadata for \"${name}\"`,\n );\n }\n }\n}\n\n/** Prepare every engine object and validator without mutating handles. */\nfunction prepareTables(\n raw: ReadonlyMap<string, RawTable>,\n schemaName: string,\n relations: ReadonlyMap<string, readonly ResolvedRelation[]>,\n): Map<string, FinalizedTableCandidate> {\n const built = buildEngineTables(raw.values(), schemaName);\n const candidates = new Map<string, FinalizedTableCandidate>();\n for (const table of raw.values()) {\n const builtTable = built.get(table.name);\n if (!builtTable) {\n throw new SchemaBuildError(\n `Engine table \"${table.name}\" was not constructed`,\n );\n }\n const columns = nullRecord<ColumnMeta>();\n for (const [key, meta] of Object.entries(builtTable.columns)) {\n columns[key] = finalizeColumn(meta);\n }\n Object.freeze(columns);\n const tableRelations = finalizeRelations(relations.get(table.name) ?? []);\n const validatorTable = { $columns: columns } as AppKitTable;\n candidates.set(table.name, {\n columns,\n engine: builtTable.engine,\n relations: tableRelations,\n insertSchema: deriveInsertSchema(validatorTable),\n updateSchema: deriveUpdateSchema(validatorTable),\n });\n }\n return candidates;\n}\n\n/** Atomically publish prepared metadata as the final schema transition. */\nfunction publishSchema(\n raw: ReadonlyMap<string, RawTable>,\n candidates: ReadonlyMap<string, FinalizedTableCandidate>,\n schemaName: string,\n): Schema {\n const publications = [...raw.values()].map((table) => {\n const candidate = candidates.get(table.name);\n if (!candidate) {\n throw new SchemaBuildError(\n `Table \"${table.name}\" was not prepared for finalization`,\n );\n }\n return { table, candidate };\n });\n\n const tables = nullRecord<AppKitTable>();\n const engine = nullRecord<Schema[\"$engine\"][string]>();\n for (const { table, candidate } of publications) {\n Object.defineProperties(table.handle, {\n $name: { value: table.name },\n $schemaName: { value: schemaName },\n $columns: { value: candidate.columns },\n $engine: { value: candidate.engine },\n $relations: { value: candidate.relations },\n $insertSchema: { value: candidate.insertSchema },\n $updateSchema: { value: candidate.updateSchema },\n });\n const finalized = Object.freeze(table.handle) as unknown as AppKitTable;\n tables[table.name] = finalized;\n engine[table.name] = candidate.engine;\n }\n\n const schema = {\n $schemaName: schemaName,\n $tables: Object.freeze(tables),\n $engine: Object.freeze(engine),\n };\n Object.defineProperty(schema, FINALIZED_SCHEMA, { value: true });\n return Object.freeze(schema);\n}\n\n/** @internal Reject values that were not finalized by `defineSchema()`. */\nexport function assertFinalizedSchema(value: unknown): asserts value is Schema {\n if (\n value === null ||\n typeof value !== \"object\" ||\n (value as Record<PropertyKey, unknown>)[FINALIZED_SCHEMA] !== true\n ) {\n throw new TypeError(\"Expected a finalized AppKit database schema\");\n }\n}\n\n/**\n * Compile one declared schema. The returned type keeps the table names the\n * builder returned, so `crudRoutes` and `hooks` can name only real tables.\n */\nexport function defineSchema<TTables extends Record<string, AppKitTable>>(\n builder: (context: SchemaBuilderContext) => TTables,\n options?: DefineSchemaOptions,\n): Schema<Extract<keyof TTables, string>> {\n const schemaName = options?.schemaName ?? \"public\";\n if (!schemaName) throw new SchemaBuildError(\"Schema name cannot be empty\");\n\n const state: DeclarationState = {\n raw: new Map(),\n handleNames: new Map(),\n };\n const returned = builder(createBuilderContext(state));\n\n validateReturnedTables(returned, state);\n validateHandles(state.raw);\n validatePrimaryKeys(state.raw);\n resolveForeignKeys(state.raw);\n // FK literals are checked against the inherited target storage, not the placeholder.\n validateLiteralDefaults(state.raw.values());\n\n const relations = buildRelations(state.raw);\n validateRelationKeys(state.raw, relations);\n const candidates = prepareTables(state.raw, schemaName, relations);\n return publishSchema(state.raw, candidates, schemaName);\n}\n"],"mappings":"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"}
|
|
@@ -111,9 +111,14 @@ type TableHandle<C extends Record<string, unknown>> = AppKitTable & { readonly [
|
|
|
111
111
|
interface DefineSchemaOptions {
|
|
112
112
|
readonly schemaName?: string;
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
/**
|
|
115
|
+
* One finalized schema. `TTableName` keeps the declared names in the type, so
|
|
116
|
+
* configuration that addresses a table by name is checked against the schema
|
|
117
|
+
* it was written for. Code that accepts any schema uses the default.
|
|
118
|
+
*/
|
|
119
|
+
interface Schema<TTableName extends string = string> {
|
|
115
120
|
readonly $schemaName: string;
|
|
116
|
-
readonly $tables: Readonly<Record<
|
|
121
|
+
readonly $tables: Readonly<Record<TTableName, AppKitTable>>;
|
|
117
122
|
readonly $engine: Readonly<Record<string, EngineTable>>;
|
|
118
123
|
}
|
|
119
124
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/database/schema-builder/types.ts"],"mappings":";cAEc,YAAA;AAAA,cACA,aAAA;;KAEF,WAAA;EAAA,UAA0B,YAAA;AAAA;AAAA,KAC1B,YAAA;EAAA,UAA2B,aAAA;AAAA;;KAG3B,eAAA;;KAiCA,iBAAA;AApCZ;AAAA,KA4CY,cAAA;EAAA,SACG,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;EAAA,SAA0B,MAAA;AAAA;EAAA,SAC1B,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;EAAA,SAA4B,YAAA;AAAA;EAAA,SAC5B,IAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA;AAAA;EAAA,SAEA,IAAA;AAAA;;KAGH,WAAA;AAAA,UAaK,SAAA;EAAA,SACN,aAAA;EAAA,SACA,SAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGC,KAAA,GAAQ,SAAA,UAAmB,SAAA;AAAA,UAEtB,kBAAA;EAAA,SACN,WAAA;EAAA,SACA,YAAA;EAAA,SACA,QAAA,GAAW,iBAAA;EAAA,SACX,QAAA,GAAW,iBAAA;AAAA;;UAIL,iBAAA;EACf,IAAA;EACA,UAAA;EACA,IAAA,EAAM,eAAA;EACN,WAAA,EAAa,WAAA;EACb,OAAA;EACA,UAAA;EACA,MAAA;EACA,SAAA;EACA,eAAA;EACA,UAAA;EACA,YAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA,GAAQ,KAAA;EACR,QAAA,GAAW,iBAAA;EACX,QAAA,GAAW,iBAAA;EACX,EAAA,GAAK,kBAAA;EACL,YAAA,GAAe,YAAA;AAAA;;KAIL,UAAA,GAAa,QAAA,CACvB,IAAA,CAAK,iBAAA;EAAA,SACM,UAAA;EAAA,SACA,EAAA,GAAK,QAAA,CAAS,kBAAA;EAAA,SACd,YAAA,EAAc,YAAA;AAAA;AAAA,UAIV,gBAAA;EAAA,SACN,IAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;EAAA,SACA,QAAA;AAAA;AAAA,UAGM,WAAA;EAAA,SACN,KAAA;EAAA,SACA,WAAA;EAAA,SACA,QAAA,EAAU,QAAA,CAAS,MAAA,SAAe,UAAA;EAAA,SAClC,OAAA,EAAS,WAAA;EAAA,SACT,UAAA,WAAqB,gBAAA;EAxC9B;EAAA,SA0CS,aAAA;EAxCT;EAAA,SA0CS,aAAA;AAAA;;KAIC,WAAA,WAAsB,MAAA,qBAA2B,WAAA,0BACtC,CAAA,GAAI,SAAA;AAAA,UAGV,mBAAA;EAAA,SACN,UAAA;AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/database/schema-builder/types.ts"],"mappings":";cAEc,YAAA;AAAA,cACA,aAAA;;KAEF,WAAA;EAAA,UAA0B,YAAA;AAAA;AAAA,KAC1B,YAAA;EAAA,UAA2B,aAAA;AAAA;;KAG3B,eAAA;;KAiCA,iBAAA;AApCZ;AAAA,KA4CY,cAAA;EAAA,SACG,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;EAAA,SAA0B,MAAA;AAAA;EAAA,SAC1B,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;EAAA,SAA4B,YAAA;AAAA;EAAA,SAC5B,IAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA;AAAA;EAAA,SAEA,IAAA;AAAA;;KAGH,WAAA;AAAA,UAaK,SAAA;EAAA,SACN,aAAA;EAAA,SACA,SAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGC,KAAA,GAAQ,SAAA,UAAmB,SAAA;AAAA,UAEtB,kBAAA;EAAA,SACN,WAAA;EAAA,SACA,YAAA;EAAA,SACA,QAAA,GAAW,iBAAA;EAAA,SACX,QAAA,GAAW,iBAAA;AAAA;;UAIL,iBAAA;EACf,IAAA;EACA,UAAA;EACA,IAAA,EAAM,eAAA;EACN,WAAA,EAAa,WAAA;EACb,OAAA;EACA,UAAA;EACA,MAAA;EACA,SAAA;EACA,eAAA;EACA,UAAA;EACA,YAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA,GAAQ,KAAA;EACR,QAAA,GAAW,iBAAA;EACX,QAAA,GAAW,iBAAA;EACX,EAAA,GAAK,kBAAA;EACL,YAAA,GAAe,YAAA;AAAA;;KAIL,UAAA,GAAa,QAAA,CACvB,IAAA,CAAK,iBAAA;EAAA,SACM,UAAA;EAAA,SACA,EAAA,GAAK,QAAA,CAAS,kBAAA;EAAA,SACd,YAAA,EAAc,YAAA;AAAA;AAAA,UAIV,gBAAA;EAAA,SACN,IAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;EAAA,SACA,QAAA;AAAA;AAAA,UAGM,WAAA;EAAA,SACN,KAAA;EAAA,SACA,WAAA;EAAA,SACA,QAAA,EAAU,QAAA,CAAS,MAAA,SAAe,UAAA;EAAA,SAClC,OAAA,EAAS,WAAA;EAAA,SACT,UAAA,WAAqB,gBAAA;EAxC9B;EAAA,SA0CS,aAAA;EAxCT;EAAA,SA0CS,aAAA;AAAA;;KAIC,WAAA,WAAsB,MAAA,qBAA2B,WAAA,0BACtC,CAAA,GAAI,SAAA;AAAA,UAGV,mBAAA;EAAA,SACN,UAAA;AAAA;;;;;;UAQM,MAAA;EAAA,SACN,WAAA;EAAA,SACA,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,WAAA;EAAA,SACrC,OAAA,EAAS,QAAA,CAAS,MAAA,SAAe,WAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/database/schema-builder/types.ts"],"sourcesContent":["import type { FilterOperator } from \"../contract\";\n\ndeclare const ENGINE_TABLE: unique symbol;\ndeclare const ENGINE_COLUMN: unique symbol;\n/** Opaque handles keep Drizzle types behind the schema/runtime boundary. */\nexport type EngineTable = { readonly [ENGINE_TABLE]: true };\nexport type EngineColumn = { readonly [ENGINE_COLUMN]: true };\n\n/** JavaScript value category exposed by a column, independent of its storage. */\nexport type ColumnValueKind =\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"date\"\n | \"json\"\n | \"uuid\"\n | \"enum\"\n | \"unknown\";\n\n/** The filter subset shared by runtime translation and later typed surfaces. */\nexport function filterOperatorsForKind(\n kind: ColumnValueKind,\n): readonly FilterOperator[] {\n switch (kind) {\n case \"string\":\n return [\"eq\", \"neq\", \"in\", \"like\", \"ilike\"];\n case \"number\":\n case \"bigint\":\n case \"date\":\n return [\"eq\", \"neq\", \"in\", \"gt\", \"gte\", \"lt\", \"lte\"];\n case \"enum\":\n case \"boolean\":\n case \"uuid\":\n return [\"eq\", \"neq\", \"in\"];\n case \"json\":\n case \"unknown\":\n return [];\n }\n}\n\n/** PostgreSQL action applied when a referenced row changes or is deleted. */\nexport type ReferentialAction =\n | \"cascade\"\n | \"set null\"\n | \"set default\"\n | \"restrict\"\n | \"no action\";\n\n/** DSL declaration kind, including identity shorthand and unresolved FKs. */\nexport type ColumnTypeSpec =\n | { readonly kind: \"id\" }\n | { readonly kind: \"bigid\" }\n | { readonly kind: \"text\" }\n | { readonly kind: \"varchar\"; readonly length: number }\n | { readonly kind: \"integer\" }\n | { readonly kind: \"bigint\" }\n | { readonly kind: \"boolean\" }\n | { readonly kind: \"uuid\" }\n | { readonly kind: \"timestamp\"; readonly withTimezone: boolean }\n | { readonly kind: \"jsonb\" }\n | {\n readonly kind: \"enum\";\n readonly enumName: string;\n readonly values: readonly string[];\n }\n | { readonly kind: \"fk\" };\n\n/** Resolved PostgreSQL storage used to construct the engine column. */\nexport type StorageKind =\n | \"id\"\n | \"bigid\"\n | \"text\"\n | \"varchar\"\n | \"integer\"\n | \"bigint\"\n | \"boolean\"\n | \"uuid\"\n | \"timestamp\"\n | \"jsonb\"\n | \"enum\";\n\nexport interface ColumnRef {\n readonly __isColumnRef: true;\n readonly tableName: string;\n readonly columnName: string;\n}\n\nexport type FkRef = ColumnRef | (() => ColumnRef);\n\nexport interface ResolvedForeignKey {\n readonly targetTable: string;\n readonly targetColumn: string;\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n}\n\n/** Mutable declaration state. It is cloned per table and never published. */\nexport interface MutableColumnMeta {\n name: string;\n columnName: string;\n kind: ColumnValueKind;\n storageKind: StorageKind;\n notNull: boolean;\n primaryKey: boolean;\n unique: boolean;\n isPrivate: boolean;\n serverGenerated: boolean;\n hasDefault: boolean;\n defaultValue?: string | number | boolean;\n defaultNow?: boolean;\n defaultRandom?: boolean;\n withTimezone?: boolean;\n varcharLength?: number;\n enumName?: string;\n enumValues?: readonly string[];\n fkRef?: FkRef;\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n fk?: ResolvedForeignKey;\n engineColumn?: EngineColumn;\n}\n\n/** Immutable column metadata published by a finalized schema. */\nexport type ColumnMeta = Readonly<\n Omit<MutableColumnMeta, \"enumValues\" | \"fk\" | \"fkRef\" | \"engineColumn\"> & {\n readonly enumValues?: readonly string[];\n readonly fk?: Readonly<ResolvedForeignKey>;\n readonly engineColumn: EngineColumn;\n }\n>;\n\nexport interface ResolvedRelation {\n readonly name: string;\n readonly cardinality: \"toOne\" | \"toMany\";\n readonly localColumn: string;\n readonly targetTable: string;\n readonly targetColumn: string;\n readonly inferred: boolean;\n}\n\nexport interface AppKitTable {\n readonly $name: string;\n readonly $schemaName: string;\n readonly $columns: Readonly<Record<string, ColumnMeta>>;\n readonly $engine: EngineTable;\n readonly $relations: readonly ResolvedRelation[];\n /** @internal insert schema retained from the current-main foundation. */\n readonly $insertSchema: unknown;\n /** @internal update schema retained from the current-main foundation. */\n readonly $updateSchema: unknown;\n}\n\n/** A declaration handle gains finalized table metadata only at publication. */\nexport type TableHandle<C extends Record<string, unknown>> = AppKitTable & {\n readonly [K in keyof C]: ColumnRef;\n};\n\nexport interface DefineSchemaOptions {\n readonly schemaName?: string;\n}\n\nexport interface Schema {\n readonly $schemaName: string;\n readonly $tables: Readonly<Record<
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/database/schema-builder/types.ts"],"sourcesContent":["import type { FilterOperator } from \"../contract\";\n\ndeclare const ENGINE_TABLE: unique symbol;\ndeclare const ENGINE_COLUMN: unique symbol;\n/** Opaque handles keep Drizzle types behind the schema/runtime boundary. */\nexport type EngineTable = { readonly [ENGINE_TABLE]: true };\nexport type EngineColumn = { readonly [ENGINE_COLUMN]: true };\n\n/** JavaScript value category exposed by a column, independent of its storage. */\nexport type ColumnValueKind =\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"date\"\n | \"json\"\n | \"uuid\"\n | \"enum\"\n | \"unknown\";\n\n/** The filter subset shared by runtime translation and later typed surfaces. */\nexport function filterOperatorsForKind(\n kind: ColumnValueKind,\n): readonly FilterOperator[] {\n switch (kind) {\n case \"string\":\n return [\"eq\", \"neq\", \"in\", \"like\", \"ilike\"];\n case \"number\":\n case \"bigint\":\n case \"date\":\n return [\"eq\", \"neq\", \"in\", \"gt\", \"gte\", \"lt\", \"lte\"];\n case \"enum\":\n case \"boolean\":\n case \"uuid\":\n return [\"eq\", \"neq\", \"in\"];\n case \"json\":\n case \"unknown\":\n return [];\n }\n}\n\n/** PostgreSQL action applied when a referenced row changes or is deleted. */\nexport type ReferentialAction =\n | \"cascade\"\n | \"set null\"\n | \"set default\"\n | \"restrict\"\n | \"no action\";\n\n/** DSL declaration kind, including identity shorthand and unresolved FKs. */\nexport type ColumnTypeSpec =\n | { readonly kind: \"id\" }\n | { readonly kind: \"bigid\" }\n | { readonly kind: \"text\" }\n | { readonly kind: \"varchar\"; readonly length: number }\n | { readonly kind: \"integer\" }\n | { readonly kind: \"bigint\" }\n | { readonly kind: \"boolean\" }\n | { readonly kind: \"uuid\" }\n | { readonly kind: \"timestamp\"; readonly withTimezone: boolean }\n | { readonly kind: \"jsonb\" }\n | {\n readonly kind: \"enum\";\n readonly enumName: string;\n readonly values: readonly string[];\n }\n | { readonly kind: \"fk\" };\n\n/** Resolved PostgreSQL storage used to construct the engine column. */\nexport type StorageKind =\n | \"id\"\n | \"bigid\"\n | \"text\"\n | \"varchar\"\n | \"integer\"\n | \"bigint\"\n | \"boolean\"\n | \"uuid\"\n | \"timestamp\"\n | \"jsonb\"\n | \"enum\";\n\nexport interface ColumnRef {\n readonly __isColumnRef: true;\n readonly tableName: string;\n readonly columnName: string;\n}\n\nexport type FkRef = ColumnRef | (() => ColumnRef);\n\nexport interface ResolvedForeignKey {\n readonly targetTable: string;\n readonly targetColumn: string;\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n}\n\n/** Mutable declaration state. It is cloned per table and never published. */\nexport interface MutableColumnMeta {\n name: string;\n columnName: string;\n kind: ColumnValueKind;\n storageKind: StorageKind;\n notNull: boolean;\n primaryKey: boolean;\n unique: boolean;\n isPrivate: boolean;\n serverGenerated: boolean;\n hasDefault: boolean;\n defaultValue?: string | number | boolean;\n defaultNow?: boolean;\n defaultRandom?: boolean;\n withTimezone?: boolean;\n varcharLength?: number;\n enumName?: string;\n enumValues?: readonly string[];\n fkRef?: FkRef;\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n fk?: ResolvedForeignKey;\n engineColumn?: EngineColumn;\n}\n\n/** Immutable column metadata published by a finalized schema. */\nexport type ColumnMeta = Readonly<\n Omit<MutableColumnMeta, \"enumValues\" | \"fk\" | \"fkRef\" | \"engineColumn\"> & {\n readonly enumValues?: readonly string[];\n readonly fk?: Readonly<ResolvedForeignKey>;\n readonly engineColumn: EngineColumn;\n }\n>;\n\nexport interface ResolvedRelation {\n readonly name: string;\n readonly cardinality: \"toOne\" | \"toMany\";\n readonly localColumn: string;\n readonly targetTable: string;\n readonly targetColumn: string;\n readonly inferred: boolean;\n}\n\nexport interface AppKitTable {\n readonly $name: string;\n readonly $schemaName: string;\n readonly $columns: Readonly<Record<string, ColumnMeta>>;\n readonly $engine: EngineTable;\n readonly $relations: readonly ResolvedRelation[];\n /** @internal insert schema retained from the current-main foundation. */\n readonly $insertSchema: unknown;\n /** @internal update schema retained from the current-main foundation. */\n readonly $updateSchema: unknown;\n}\n\n/** A declaration handle gains finalized table metadata only at publication. */\nexport type TableHandle<C extends Record<string, unknown>> = AppKitTable & {\n readonly [K in keyof C]: ColumnRef;\n};\n\nexport interface DefineSchemaOptions {\n readonly schemaName?: string;\n}\n\n/**\n * One finalized schema. `TTableName` keeps the declared names in the type, so\n * configuration that addresses a table by name is checked against the schema\n * it was written for. Code that accepts any schema uses the default.\n */\nexport interface Schema<TTableName extends string = string> {\n readonly $schemaName: string;\n readonly $tables: Readonly<Record<TTableName, AppKitTable>>;\n readonly $engine: Readonly<Record<string, EngineTable>>;\n}\n\nexport class SchemaBuildError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SchemaBuildError\";\n }\n}\n"],"mappings":";;AAqBA,SAAgB,uBACd,MAC2B;AAC3B,SAAQ,MAAR;EACE,KAAK,SACH,QAAO;GAAC;GAAM;GAAO;GAAM;GAAQ;GAAQ;EAC7C,KAAK;EACL,KAAK;EACL,KAAK,OACH,QAAO;GAAC;GAAM;GAAO;GAAM;GAAM;GAAO;GAAM;GAAM;EACtD,KAAK;EACL,KAAK;EACL,KAAK,OACH,QAAO;GAAC;GAAM;GAAO;GAAK;EAC5B,KAAK;EACL,KAAK,UACH,QAAO,EAAE;;;AAwIf,IAAa,mBAAb,cAAsC,MAAM;CAC1C,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//#region src/plugins/agents/active-stream-tracker.ts
|
|
2
|
+
/**
|
|
3
|
+
* Tracks active SSE streams and a per-user stream count for the agents plugin's
|
|
4
|
+
* concurrency limit. The count is kept in sync with the stream map on every
|
|
5
|
+
* {@link track}/{@link untrack} so the limit check is O(1) instead of O(n) over
|
|
6
|
+
* all active streams on every request. `track` and `untrack` are the only
|
|
7
|
+
* writers, which is what keeps the counter from drifting from the map.
|
|
8
|
+
*
|
|
9
|
+
* Distinct from the SSE-layer `StreamRegistry` in `src/stream/` (which buffers
|
|
10
|
+
* events per connection for reconnection replay) — this only counts streams.
|
|
11
|
+
*/
|
|
12
|
+
var ActiveStreamTracker = class {
|
|
13
|
+
activeStreams = /* @__PURE__ */ new Map();
|
|
14
|
+
userStreamCounts = /* @__PURE__ */ new Map();
|
|
15
|
+
/** Count active streams owned by a given user. O(1). */
|
|
16
|
+
count(userId) {
|
|
17
|
+
return this.userStreamCounts.get(userId) ?? 0;
|
|
18
|
+
}
|
|
19
|
+
/** Total active streams across all users. */
|
|
20
|
+
get size() {
|
|
21
|
+
return this.activeStreams.size;
|
|
22
|
+
}
|
|
23
|
+
/** Look up an active stream by request id. */
|
|
24
|
+
get(requestId) {
|
|
25
|
+
return this.activeStreams.get(requestId);
|
|
26
|
+
}
|
|
27
|
+
/** Register a stream for `userId` and bump the per-user counter. */
|
|
28
|
+
track(requestId, userId, controller) {
|
|
29
|
+
this.activeStreams.set(requestId, {
|
|
30
|
+
controller,
|
|
31
|
+
userId
|
|
32
|
+
});
|
|
33
|
+
this.userStreamCounts.set(userId, (this.userStreamCounts.get(userId) ?? 0) + 1);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Remove a stream and decrement the per-user counter. Idempotent — calling
|
|
37
|
+
* twice for the same `requestId` is a no-op. Drops the counter key entirely
|
|
38
|
+
* when it reaches zero so the map can't grow unbounded across many users.
|
|
39
|
+
*/
|
|
40
|
+
untrack(requestId) {
|
|
41
|
+
const entry = this.activeStreams.get(requestId);
|
|
42
|
+
if (!entry) return;
|
|
43
|
+
this.activeStreams.delete(requestId);
|
|
44
|
+
const next = (this.userStreamCounts.get(entry.userId) ?? 0) - 1;
|
|
45
|
+
if (next <= 0) this.userStreamCounts.delete(entry.userId);
|
|
46
|
+
else this.userStreamCounts.set(entry.userId, next);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { ActiveStreamTracker };
|
|
52
|
+
//# sourceMappingURL=active-stream-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-stream-tracker.js","names":[],"sources":["../../../src/plugins/agents/active-stream-tracker.ts"],"sourcesContent":["/**\n * Tracks active SSE streams and a per-user stream count for the agents plugin's\n * concurrency limit. The count is kept in sync with the stream map on every\n * {@link track}/{@link untrack} so the limit check is O(1) instead of O(n) over\n * all active streams on every request. `track` and `untrack` are the only\n * writers, which is what keeps the counter from drifting from the map.\n *\n * Distinct from the SSE-layer `StreamRegistry` in `src/stream/` (which buffers\n * events per connection for reconnection replay) — this only counts streams.\n */\nexport class ActiveStreamTracker {\n private readonly activeStreams = new Map<\n string,\n { controller: AbortController; userId: string }\n >();\n private readonly userStreamCounts = new Map<string, number>();\n\n /** Count active streams owned by a given user. O(1). */\n count(userId: string): number {\n return this.userStreamCounts.get(userId) ?? 0;\n }\n\n /** Total active streams across all users. */\n get size(): number {\n return this.activeStreams.size;\n }\n\n /** Look up an active stream by request id. */\n get(\n requestId: string,\n ): { controller: AbortController; userId: string } | undefined {\n return this.activeStreams.get(requestId);\n }\n\n /** Register a stream for `userId` and bump the per-user counter. */\n track(requestId: string, userId: string, controller: AbortController): void {\n this.activeStreams.set(requestId, { controller, userId });\n this.userStreamCounts.set(\n userId,\n (this.userStreamCounts.get(userId) ?? 0) + 1,\n );\n }\n\n /**\n * Remove a stream and decrement the per-user counter. Idempotent — calling\n * twice for the same `requestId` is a no-op. Drops the counter key entirely\n * when it reaches zero so the map can't grow unbounded across many users.\n */\n untrack(requestId: string): void {\n const entry = this.activeStreams.get(requestId);\n if (!entry) return;\n this.activeStreams.delete(requestId);\n const next = (this.userStreamCounts.get(entry.userId) ?? 0) - 1;\n if (next <= 0) {\n this.userStreamCounts.delete(entry.userId);\n } else {\n this.userStreamCounts.set(entry.userId, next);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AAUA,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,gCAAgB,IAAI,KAGlC;CACH,AAAiB,mCAAmB,IAAI,KAAqB;;CAG7D,MAAM,QAAwB;AAC5B,SAAO,KAAK,iBAAiB,IAAI,OAAO,IAAI;;;CAI9C,IAAI,OAAe;AACjB,SAAO,KAAK,cAAc;;;CAI5B,IACE,WAC6D;AAC7D,SAAO,KAAK,cAAc,IAAI,UAAU;;;CAI1C,MAAM,WAAmB,QAAgB,YAAmC;AAC1E,OAAK,cAAc,IAAI,WAAW;GAAE;GAAY;GAAQ,CAAC;AACzD,OAAK,iBAAiB,IACpB,SACC,KAAK,iBAAiB,IAAI,OAAO,IAAI,KAAK,EAC5C;;;;;;;CAQH,QAAQ,WAAyB;EAC/B,MAAM,QAAQ,KAAK,cAAc,IAAI,UAAU;AAC/C,MAAI,CAAC,MAAO;AACZ,OAAK,cAAc,OAAO,UAAU;EACpC,MAAM,QAAQ,KAAK,iBAAiB,IAAI,MAAM,OAAO,IAAI,KAAK;AAC9D,MAAI,QAAQ,EACV,MAAK,iBAAiB,OAAO,MAAM,OAAO;MAE1C,MAAK,iBAAiB,IAAI,MAAM,QAAQ,KAAK"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createLogger } from "../../logging/logger.js";
|
|
2
|
+
import { SUPERVISOR_EXTENSION_KEY } from "../../agents/supervisor-api.js";
|
|
3
|
+
|
|
4
|
+
//#region src/plugins/agents/adapter-extensions.ts
|
|
5
|
+
const logger = createLogger("agents");
|
|
6
|
+
/**
|
|
7
|
+
* Pulls the LLM-readable description off any {@link SupervisorTool} kind.
|
|
8
|
+
* Used to populate the synthetic placeholder `def.description` on
|
|
9
|
+
* hosted-supervisor tool-index entries.
|
|
10
|
+
*/
|
|
11
|
+
function supervisorToolDescription(spec) {
|
|
12
|
+
switch (spec.type) {
|
|
13
|
+
case "genie_space": return spec.genie_space.description;
|
|
14
|
+
case "uc_function": return spec.uc_function.description;
|
|
15
|
+
case "knowledge_assistant": return spec.knowledge_assistant.description;
|
|
16
|
+
case "app": return spec.app.description;
|
|
17
|
+
case "uc_connection": return spec.uc_connection.description;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Builds the `AgentInput.extensions` payload from a tool index, aggregating
|
|
22
|
+
* the hosted-supervisor specs under {@link SUPERVISOR_EXTENSION_KEY}. Returns
|
|
23
|
+
* `undefined` when there are no adapter-side hosted tools so the field stays
|
|
24
|
+
* absent on the wire — adapters that don't read extensions never see it.
|
|
25
|
+
*/
|
|
26
|
+
function buildAdapterExtensions(toolIndex) {
|
|
27
|
+
const supervisorSpecs = [];
|
|
28
|
+
for (const entry of toolIndex.values()) if (entry.source === "hosted-supervisor") supervisorSpecs.push(entry.spec);
|
|
29
|
+
if (supervisorSpecs.length === 0) return void 0;
|
|
30
|
+
return { [SUPERVISOR_EXTENSION_KEY]: { hostedTools: supervisorSpecs } };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compares the adapter's declared capabilities against the tool index and
|
|
34
|
+
* logs a warning when the agent's tool declarations would be silently
|
|
35
|
+
* dropped at runtime. Warn-not-throw: misconfiguration is loud enough to
|
|
36
|
+
* notice without taking the whole app down.
|
|
37
|
+
*/
|
|
38
|
+
function warnOnCapabilityMismatch(agentName, adapter, toolIndex) {
|
|
39
|
+
const accepted = new Set(adapter.acceptsExtensions ?? []);
|
|
40
|
+
const hostedSupervisorKeys = [];
|
|
41
|
+
const inputToolKeys = [];
|
|
42
|
+
for (const [key, entry] of toolIndex) if (entry.source === "hosted-supervisor") hostedSupervisorKeys.push(key);
|
|
43
|
+
else inputToolKeys.push(key);
|
|
44
|
+
if (hostedSupervisorKeys.length > 0 && !accepted.has(SUPERVISOR_EXTENSION_KEY)) logger.warn(`Agent '${agentName}' declares hosted-supervisor tools (${hostedSupervisorKeys.join(", ")}) but its model adapter does not accept the 'databricks.supervisor' extension. These tools will not reach the model. Pair them with \`DatabricksAdapter.fromSupervisorApi(...)\`, or remove them.`);
|
|
45
|
+
if (adapter.consumesInputTools === false && inputToolKeys.length > 0) logger.warn(`Agent '${agentName}' declares function tools / sub-agents / MCP tools (${inputToolKeys.join(", ")}) but its model adapter does not consume input.tools (Supervisor API owns its own tool loop). These tools will not be exposed to the model. See docs/plugins/agents.md.`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
export { buildAdapterExtensions, supervisorToolDescription, warnOnCapabilityMismatch };
|
|
50
|
+
//# sourceMappingURL=adapter-extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-extensions.js","names":[],"sources":["../../../src/plugins/agents/adapter-extensions.ts"],"sourcesContent":["import type { AgentAdapter } from \"shared\";\n\nimport {\n SUPERVISOR_EXTENSION_KEY,\n type SupervisorTool,\n} from \"../../agents/supervisor-api\";\nimport type { ResolvedToolEntry } from \"../../core/agent/types\";\nimport { createLogger } from \"../../logging/logger\";\n\nconst logger = createLogger(\"agents\");\n\n/**\n * Pulls the LLM-readable description off any {@link SupervisorTool} kind.\n * Used to populate the synthetic placeholder `def.description` on\n * hosted-supervisor tool-index entries.\n */\nexport function supervisorToolDescription(spec: SupervisorTool): string {\n switch (spec.type) {\n case \"genie_space\":\n return spec.genie_space.description;\n case \"uc_function\":\n return spec.uc_function.description;\n case \"knowledge_assistant\":\n return spec.knowledge_assistant.description;\n case \"app\":\n return spec.app.description;\n case \"uc_connection\":\n return spec.uc_connection.description;\n }\n}\n\n/**\n * Builds the `AgentInput.extensions` payload from a tool index, aggregating\n * the hosted-supervisor specs under {@link SUPERVISOR_EXTENSION_KEY}. Returns\n * `undefined` when there are no adapter-side hosted tools so the field stays\n * absent on the wire — adapters that don't read extensions never see it.\n */\nexport function buildAdapterExtensions(\n toolIndex: Map<string, ResolvedToolEntry>,\n): Readonly<Record<string, unknown>> | undefined {\n const supervisorSpecs: SupervisorTool[] = [];\n for (const entry of toolIndex.values()) {\n if (entry.source === \"hosted-supervisor\") {\n supervisorSpecs.push(entry.spec);\n }\n }\n if (supervisorSpecs.length === 0) return undefined;\n return {\n [SUPERVISOR_EXTENSION_KEY]: { hostedTools: supervisorSpecs },\n };\n}\n\n/**\n * Compares the adapter's declared capabilities against the tool index and\n * logs a warning when the agent's tool declarations would be silently\n * dropped at runtime. Warn-not-throw: misconfiguration is loud enough to\n * notice without taking the whole app down.\n */\nexport function warnOnCapabilityMismatch(\n agentName: string,\n adapter: AgentAdapter,\n toolIndex: Map<string, ResolvedToolEntry>,\n): void {\n const accepted = new Set(adapter.acceptsExtensions ?? []);\n\n const hostedSupervisorKeys: string[] = [];\n const inputToolKeys: string[] = [];\n for (const [key, entry] of toolIndex) {\n if (entry.source === \"hosted-supervisor\") {\n hostedSupervisorKeys.push(key);\n } else {\n inputToolKeys.push(key);\n }\n }\n\n if (\n hostedSupervisorKeys.length > 0 &&\n !accepted.has(SUPERVISOR_EXTENSION_KEY)\n ) {\n logger.warn(\n `Agent '${agentName}' declares hosted-supervisor tools (${hostedSupervisorKeys.join(\", \")}) ` +\n \"but its model adapter does not accept the 'databricks.supervisor' extension. \" +\n \"These tools will not reach the model. Pair them with `DatabricksAdapter.fromSupervisorApi(...)`, or remove them.\",\n );\n }\n\n // `consumesInputTools` defaults to true. Only warn when an adapter\n // explicitly opts out (`false`) and an input tool would be silently\n // ignored.\n if (adapter.consumesInputTools === false && inputToolKeys.length > 0) {\n logger.warn(\n `Agent '${agentName}' declares function tools / sub-agents / MCP tools (${inputToolKeys.join(\", \")}) ` +\n \"but its model adapter does not consume input.tools (Supervisor API owns its own tool loop). \" +\n \"These tools will not be exposed to the model. See docs/plugins/agents.md.\",\n );\n }\n}\n"],"mappings":";;;;AASA,MAAM,SAAS,aAAa,SAAS;;;;;;AAOrC,SAAgB,0BAA0B,MAA8B;AACtE,SAAQ,KAAK,MAAb;EACE,KAAK,cACH,QAAO,KAAK,YAAY;EAC1B,KAAK,cACH,QAAO,KAAK,YAAY;EAC1B,KAAK,sBACH,QAAO,KAAK,oBAAoB;EAClC,KAAK,MACH,QAAO,KAAK,IAAI;EAClB,KAAK,gBACH,QAAO,KAAK,cAAc;;;;;;;;;AAUhC,SAAgB,uBACd,WAC+C;CAC/C,MAAM,kBAAoC,EAAE;AAC5C,MAAK,MAAM,SAAS,UAAU,QAAQ,CACpC,KAAI,MAAM,WAAW,oBACnB,iBAAgB,KAAK,MAAM,KAAK;AAGpC,KAAI,gBAAgB,WAAW,EAAG,QAAO;AACzC,QAAO,GACJ,2BAA2B,EAAE,aAAa,iBAAiB,EAC7D;;;;;;;;AASH,SAAgB,yBACd,WACA,SACA,WACM;CACN,MAAM,WAAW,IAAI,IAAI,QAAQ,qBAAqB,EAAE,CAAC;CAEzD,MAAM,uBAAiC,EAAE;CACzC,MAAM,gBAA0B,EAAE;AAClC,MAAK,MAAM,CAAC,KAAK,UAAU,UACzB,KAAI,MAAM,WAAW,oBACnB,sBAAqB,KAAK,IAAI;KAE9B,eAAc,KAAK,IAAI;AAI3B,KACE,qBAAqB,SAAS,KAC9B,CAAC,SAAS,IAAI,yBAAyB,CAEvC,QAAO,KACL,UAAU,UAAU,sCAAsC,qBAAqB,KAAK,KAAK,CAAC,mMAG3F;AAMH,KAAI,QAAQ,uBAAuB,SAAS,cAAc,SAAS,EACjE,QAAO,KACL,UAAU,UAAU,sDAAsD,cAAc,KAAK,KAAK,CAAC,yKAGpG"}
|
|
@@ -14,14 +14,11 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
14
14
|
protected config: AgentsPluginConfig;
|
|
15
15
|
private agents;
|
|
16
16
|
private defaultAgentName;
|
|
17
|
-
private activeStreams;
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* active stream on every request. Mutated only via {@link trackStream}
|
|
22
|
-
* and {@link untrackStream}.
|
|
18
|
+
* Active SSE streams + per-user counts (the O(1) concurrency-limit check).
|
|
19
|
+
* Mutated only via {@link trackStream} / {@link untrackStream}.
|
|
23
20
|
*/
|
|
24
|
-
private
|
|
21
|
+
private streams;
|
|
25
22
|
private mcpClient;
|
|
26
23
|
private threadStore;
|
|
27
24
|
private approvalGate;
|
|
@@ -52,18 +49,7 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
52
49
|
private get resolvedLimits();
|
|
53
50
|
/** Count active streams owned by a given user. O(1). */
|
|
54
51
|
private countUserStreams;
|
|
55
|
-
/**
|
|
56
|
-
* Register a stream for `userId` and bump the per-user counter. Paired
|
|
57
|
-
* with {@link untrackStream}; the two helpers are the only writers to
|
|
58
|
-
* `activeStreams` + `userStreamCounts`, so the counter cannot drift from
|
|
59
|
-
* the map.
|
|
60
|
-
*/
|
|
61
52
|
private trackStream;
|
|
62
|
-
/**
|
|
63
|
-
* Remove a stream from the active map and decrement the per-user
|
|
64
|
-
* counter. Idempotent — calling twice for the same `requestId` is a
|
|
65
|
-
* no-op (the second call sees no entry and returns early).
|
|
66
|
-
*/
|
|
67
53
|
private untrackStream;
|
|
68
54
|
setup(): Promise<void>;
|
|
69
55
|
/**
|
|
@@ -96,15 +82,7 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
96
82
|
*/
|
|
97
83
|
private warnConfigAgentsDeprecated;
|
|
98
84
|
private resolvedAgentsDir;
|
|
99
|
-
/**
|
|
100
|
-
* Discovers code agents (see {@link resolveCodeAgentsDir} and
|
|
101
|
-
* {@link loadCodeAgentsFromDir}). Warns if sources exist but nothing was
|
|
102
|
-
* discovered — usually the build didn't emit the compiled agents — unless
|
|
103
|
-
* the deprecated `agents({ agents })` map is carrying them instead.
|
|
104
|
-
*/
|
|
105
85
|
private loadCodeAgents;
|
|
106
|
-
/** True when `dir` holds at least one `<id>/agent.ts` folder. */
|
|
107
|
-
private hasCodeAgentSources;
|
|
108
86
|
private loadFileDefinitions;
|
|
109
87
|
/**
|
|
110
88
|
* Builds the map of plugin-name → toolkit that the markdown loader consults
|
|
@@ -116,8 +94,6 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
116
94
|
private buildRegisteredAgent;
|
|
117
95
|
/** Loads the shared global skill pool from `<agentsDir>/skills/`. */
|
|
118
96
|
private loadGlobalSkills;
|
|
119
|
-
/** Configured catalog-skills volume path, or null when none is set. */
|
|
120
|
-
private resolveSkillsVolume;
|
|
121
97
|
/**
|
|
122
98
|
* Workspace client used to read catalog skills. v1 reads as the app service
|
|
123
99
|
* principal; `getWorkspaceClient()` resolves to SP outside a user scope
|
|
@@ -125,23 +101,8 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
125
101
|
* switch point for a future OBO mode.
|
|
126
102
|
*/
|
|
127
103
|
private skillWorkspaceClient;
|
|
128
|
-
/**
|
|
129
|
-
* Discovers catalog skills from the configured UC Volume, read as the
|
|
130
|
-
* service principal at boot (and on `reload()`). Each `<volume>/<name>/`
|
|
131
|
-
* folder with a `SKILL.md` becomes a `source: "volume"` skill. Best-effort:
|
|
132
|
-
* a missing volume, unavailable workspace client, or a malformed individual
|
|
133
|
-
* skill is logged and skipped rather than failing the whole registry build.
|
|
134
|
-
*/
|
|
104
|
+
/** Discovers catalog skills from the configured UC Volume (best-effort). */
|
|
135
105
|
private loadVolumeSkills;
|
|
136
|
-
/** Lists a volume skill's resource files (one level, excluding SKILL.md). */
|
|
137
|
-
private listVolumeSkillFiles;
|
|
138
|
-
/**
|
|
139
|
-
* Resolves the per-agent skill catalog: loads this agent's private skills
|
|
140
|
-
* (`<agentsDir>/<id>/skills/`, file-origin only), then applies visibility
|
|
141
|
-
* (opt-in via `def.skills` or `autoInheritSkills`) and collision rules
|
|
142
|
-
* against the shared global pool. Returns `undefined` when nothing is
|
|
143
|
-
* visible so the prompt catalog and dispatch can cheaply skip skills.
|
|
144
|
-
*/
|
|
145
106
|
private resolveAgentSkills;
|
|
146
107
|
private resolveAdapter;
|
|
147
108
|
/**
|
|
@@ -237,25 +198,6 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
237
198
|
* a dropped no-op instead of a runtime crash.
|
|
238
199
|
*/
|
|
239
200
|
private _runAgentNonStreaming;
|
|
240
|
-
/**
|
|
241
|
-
* Dispatch a single tool call from either the top-level adapter or a
|
|
242
|
-
* sub-agent. Centralising this in one method is what makes the budget
|
|
243
|
-
* counter, approval gate, and abort signal observe sub-agent activity:
|
|
244
|
-
* `runSubAgent` reuses the same `runState` and so increments the same
|
|
245
|
-
* counter and emits approval events through the same channel.
|
|
246
|
-
*
|
|
247
|
-
* `depth` is the current sub-agent recursion depth (0 at the top level).
|
|
248
|
-
* It is forwarded to `runSubAgent` when the dispatched entry is itself a
|
|
249
|
-
* sub-agent, so depth limits remain enforced.
|
|
250
|
-
*/
|
|
251
|
-
private dispatchToolCall;
|
|
252
|
-
/**
|
|
253
|
-
* Executes the built-in `load_skill` / `read_skill_file` tools against the
|
|
254
|
-
* agent's resolved skill catalog. `load_skill` returns a skill's body plus a
|
|
255
|
-
* manifest of bundled files; `read_skill_file` returns the contents of one
|
|
256
|
-
* of those files (bundle skills only in v1 — catalog-volume resource reads
|
|
257
|
-
* arrive with the volume source).
|
|
258
|
-
*/
|
|
259
201
|
private dispatchSkillTool;
|
|
260
202
|
/**
|
|
261
203
|
* Renders the prompt addendum for a force-loaded skill (`/skill-name`).
|
|
@@ -264,21 +206,8 @@ declare class AgentsPlugin extends Plugin implements ToolProvider {
|
|
|
264
206
|
* model proceeds with the catalog + `load_skill` still available.
|
|
265
207
|
*/
|
|
266
208
|
private renderForcedSkill;
|
|
267
|
-
/**
|
|
268
|
-
|
|
269
|
-
* concatenated text output to hand back to the parent adapter as the tool
|
|
270
|
-
* result.
|
|
271
|
-
*
|
|
272
|
-
* `depth` starts at 1 for a top-level sub-agent invocation (i.e. the
|
|
273
|
-
* outer `_streamAgent` calls `runSubAgent(..., 1)`) and increments on
|
|
274
|
-
* each nested `runSubAgent` call. Depths exceeding
|
|
275
|
-
* `limits.maxSubAgentDepth` are rejected before any adapter work.
|
|
276
|
-
*
|
|
277
|
-
* Sub-agent tool calls run through `dispatchToolCall` with the same
|
|
278
|
-
* `runState` as the parent — the budget counter and approval gate are
|
|
279
|
-
* therefore enforced for every nested call, not only at the top level.
|
|
280
|
-
*/
|
|
281
|
-
private runSubAgent;
|
|
209
|
+
/** Collaborators the tool-dispatch path needs, bound to this instance. */
|
|
210
|
+
private toolDispatchDeps;
|
|
282
211
|
private _handleCancel;
|
|
283
212
|
private _handleApprove;
|
|
284
213
|
private _handleListThreads;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","names":[],"sources":["../../../src/plugins/agents/agents.ts"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","names":[],"sources":["../../../src/plugins/agents/agents.ts"],"mappings":";;;;;;;;;;cAqGa,YAAA,SAAqB,MAAA,YAAkB,YAAA;EAAA,OAC3C,QAAA,EADiB,cAAA;EAAA,OAEjB,KAAA,EAAO,WAAA;EAAA,UAEI,MAAA,EAAQ,kBAAA;EAAA,QAElB,MAAA;EAAA,QACA,gBAAA;;AAPV;;;UAYU,OAAA;EAAA,QACA,SAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAqFG;EAAA,QAnFH,0BAAA;EAwvBS;EAAA,QAtvBT,6BAAA;cAEI,MAAA,EAAQ,kBAAA;EAg0BJ;;;;;;;;;;EAr1B8C;;;;;EAAA,QAyDtD,YAAA;EAAA,QAEA,oBAAA;EAAA,YAKI,sBAAA,CAAA;EA5DM;EAAA,YAsEN,cAAA,CAAA;EApEJ;EAAA,QA8EA,gBAAA;EAAA,QAIA,WAAA;EAAA,QAQA,aAAA;EAIF,KAAA,CAAA,GAAK,OAAA;EArFH;;;;;;EAoGF,MAAA,CAAA,GAAU,OAAA;EAxDR;;;;;EAAA,QAkFM,kBAAA;EAzCR;;;;;EAAA,QAsJE,mBAAA;EAiBA;;;;EAAA,QAAA,uBAAA;EAuFA;;;;EAAA,QAxEA,0BAAA;EAAA,QAUA,iBAAA;EAAA,QAIA,cAAA;EAAA,QAOM,mBAAA;EAiTN;;;;;;EAAA,QA9PA,mBAAA;EAAA,QAmBM,oBAAA;EAoaN;EAAA,QA1YA,gBAAA;EAoZa;;;;;;EAAA,QA1Yb,oBAAA;EAwpBM;EAAA,QAnpBN,gBAAA;EAAA,QAIM,kBAAA;EAAA,QAgBA,cAAA;EA0hCN;;;;;EAAA,QA9+BM,cAAA;EA4lCN;;;;;;;;;;;EAAA,QA19BA,eAAA;;;;;;;;;;;;;UA4BA,eAAA;EAAA,QAkBM,gBAAA;EAAA,QA0DA,kBAAA;EAiEd,aAAA,CAAA,GAAiB,mBAAA;EAIX,gBAAA,CAAA,GAAoB,OAAA;EAq4BT;;;;;;EAAA,QAz3BT,iBAAA;EAUR,YAAA,CAAa,MAAA,EAAQ,UAAA;EAkDrB,YAAA,CAAA,GAAgB,MAAA;EAAA,QAeF,WAAA;;;;;;;;;;;;UA2FN,gCAAA;;;;;;;;;;;UAuBM,aAAA;EAAA,QA2FA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;UAsOA,qBAAA;EAAA,QAgKN,iBAAA;;;;;;;UAaA,iBAAA;;UAQA,gBAAA;EAAA,QAYM,aAAA;EAAA,QA2BA,cAAA;EAAA,QAuCA,kBAAA;EAAA,QASA,gBAAA;EAAA,QAUA,mBAAA;EAAA,QAaN,YAAA;EAAA,QASA,aAAA;EAgBF,QAAA,CAAA,GAAY,OAAA;EAQlB,OAAA,CAAA;6BAE2B,GAAA,EAAO,eAAA,KAAe,OAAA;;2BAG3B,eAAA;;;oCAGS,OAAA,CAAA,MAAA;EAAA;EAAA,QAIjB,iBAAA;AAAA;;;;;;;;;;;;;;;;;;cA2CH,MAAA,EAAM,QAAA,QAAA,YAAA,EAAA,kBAAA"}
|