@niuhuoshan/dsh-connect 0.1.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/LICENSE +21 -0
- package/README.md +380 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +1489 -0
- package/lib/index.js +2303 -0
- package/lib/index.js.map +7 -0
- package/lib/types/client/ConnectSettings.d.ts +9 -0
- package/lib/types/client/ConnectSettings.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +5 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/rpc.d.ts +7 -0
- package/lib/types/client/rpc.d.ts.map +1 -0
- package/lib/types/client/styles.d.ts +3 -0
- package/lib/types/client/styles.d.ts.map +1 -0
- package/lib/types/domain.d.ts +156 -0
- package/lib/types/domain.d.ts.map +1 -0
- package/lib/types/host/datasource/clickhouse.d.ts +8 -0
- package/lib/types/host/datasource/clickhouse.d.ts.map +1 -0
- package/lib/types/host/datasource/index.d.ts +4 -0
- package/lib/types/host/datasource/index.d.ts.map +1 -0
- package/lib/types/host/datasource/mysql.d.ts +8 -0
- package/lib/types/host/datasource/mysql.d.ts.map +1 -0
- package/lib/types/host/datasource/postgresql.d.ts +8 -0
- package/lib/types/host/datasource/postgresql.d.ts.map +1 -0
- package/lib/types/host/datasource/provider.d.ts +24 -0
- package/lib/types/host/datasource/provider.d.ts.map +1 -0
- package/lib/types/host/http/conversation-api.d.ts +57 -0
- package/lib/types/host/http/conversation-api.d.ts.map +1 -0
- package/lib/types/host/http/executor.d.ts +10 -0
- package/lib/types/host/http/executor.d.ts.map +1 -0
- package/lib/types/host/http/security.d.ts +5 -0
- package/lib/types/host/http/security.d.ts.map +1 -0
- package/lib/types/host/http/tools.d.ts +13 -0
- package/lib/types/host/http/tools.d.ts.map +1 -0
- package/lib/types/host/metadata/enricher.d.ts +35 -0
- package/lib/types/host/metadata/enricher.d.ts.map +1 -0
- package/lib/types/host/metadata/governance.d.ts +4 -0
- package/lib/types/host/metadata/governance.d.ts.map +1 -0
- package/lib/types/host/metadata/profiler.d.ts +22 -0
- package/lib/types/host/metadata/profiler.d.ts.map +1 -0
- package/lib/types/host/metadata/tools.d.ts +4 -0
- package/lib/types/host/metadata/tools.d.ts.map +1 -0
- package/lib/types/host/rpc.d.ts +29 -0
- package/lib/types/host/rpc.d.ts.map +1 -0
- package/lib/types/host/store.d.ts +47 -0
- package/lib/types/host/store.d.ts.map +1 -0
- package/lib/types/index.d.ts +6 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/types.d.ts +395 -0
- package/lib/types/types.d.ts.map +1 -0
- package/package.json +121 -0
package/lib/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/domain.ts", "../src/types.ts", "../src/host/store.ts", "../src/host/http/executor.ts", "../src/host/http/security.ts", "../src/host/http/tools.ts", "../src/host/http/conversation-api.ts", "../src/host/metadata/profiler.ts", "../src/host/datasource/clickhouse.ts", "../src/host/datasource/provider.ts", "../src/host/datasource/mysql.ts", "../src/host/datasource/postgresql.ts", "../src/host/datasource/index.ts", "../src/host/metadata/enricher.ts", "../src/host/metadata/tools.ts", "../src/host/metadata/governance.ts", "../src/host/rpc.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-agent-default-model'\nimport type {} from '@deepseek-ai/dsh-client-connection'\nimport type {} from '@deepseek-ai/dsh-credentials'\nimport type {} from '@deepseek-ai/dsh-llm'\nimport { settingsNamespace } from '@deepseek-ai/dsh-settings'\nimport type {} from '@deepseek-ai/dsh-storage-domain'\nimport type {} from '@deepseek-ai/dsh-tools'\nimport z from '@deepseek-ai/schemastery'\nimport { connectDomainSpec } from './domain.js'\nimport { ApiToolRegistry } from './host/http/tools.js'\nimport { registerConversationApiTool } from './host/http/conversation-api.js'\nimport { MetadataProfiler } from './host/metadata/profiler.js'\nimport { registerMetadataTools } from './host/metadata/tools.js'\nimport { ConnectRpc } from './host/rpc.js'\nimport { ConnectStore } from './host/store.js'\n\nexport const name = 'dsh-connect'\nexport const inject = ['storageDomain', 'credentials', 'tools', 'connection']\n\nconst CONNECT_SETTINGS_NAMESPACE = settingsNamespace('dsh-connect')\nconst ConnectSettingsSchema = z.object({\n version: z.number().step(1).min(1).default(1),\n})\n\nexport async function apply(ctx: Context): Promise<void> {\n ctx.inject(['settings'], settingsCtx => {\n settingsCtx.settings.register(CONNECT_SETTINGS_NAMESPACE, ConnectSettingsSchema)\n })\n const domain = await ctx.storageDomain.open(connectDomainSpec)\n const store = new ConnectStore(ctx, domain)\n const apiTools = new ApiToolRegistry(ctx)\n const profiler = new MetadataProfiler(ctx, store)\n const fixedTools: Array<() => void> = []\n let disposeRpc: (() => Promise<void>) | undefined\n try {\n apiTools.replace(store.apiDefinitions())\n fixedTools.push(...registerMetadataTools(ctx, store))\n const rpc = new ConnectRpc(ctx, store, profiler, apiTools)\n fixedTools.push(...registerConversationApiTool(\n ctx,\n input => rpc.validateConversationApi(input),\n input => rpc.createConversationApi(input),\n ))\n disposeRpc = ctx.connection.rpc.handle(\n '/dsh-connect',\n (endpoint, payload, signal) => rpc.handle(endpoint, payload, signal),\n { authority: 'loopback' },\n )\n } catch (error) {\n apiTools.dispose()\n for (const dispose of fixedTools.reverse()) dispose()\n await domain.close()\n throw error\n }\n\n ctx.effect(() => async () => {\n await profiler.dispose()\n apiTools.dispose()\n for (const dispose of fixedTools.reverse()) dispose()\n await disposeRpc?.()\n await domain.close()\n }, 'dsh-connect runtime')\n}\n\nexport type * from './types.js'\n", "import { defineDomain, domainTable } from '@deepseek-ai/dsh-storage-domain'\nimport type { Domain } from '@deepseek-ai/dsh-storage-domain'\nimport {\n apiDefinitionSchema,\n dataSourceSchema,\n metadataChangeSchema,\n metricDefinitionSchema,\n metadataProfileSchema,\n profileJobSchema,\n} from './types.js'\n\nexport const connectDomainSpec = defineDomain({\n name: 'dsh_connect',\n version: 0,\n tables: {\n data_sources: domainTable(dataSourceSchema),\n api_definitions: domainTable(apiDefinitionSchema),\n metadata_profiles: domainTable(metadataProfileSchema),\n profile_jobs: domainTable(profileJobSchema),\n metrics: domainTable(metricDefinitionSchema),\n metadata_changes: domainTable(metadataChangeSchema),\n },\n})\n\nexport type ConnectDomain = Domain<typeof connectDomainSpec>\n", "import { z } from 'zod'\n\nexport const databaseTypeSchema = z.enum(['mysql', 'postgresql', 'clickhouse'])\nexport type DatabaseType = z.infer<typeof databaseTypeSchema>\n\nexport const apiMethodSchema = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])\nexport type ApiMethod = z.infer<typeof apiMethodSchema>\n\nexport const apiParameterSchema = z.object({\n name: z.string().min(1).max(64).regex(/^[A-Za-z_][A-Za-z0-9_-]*$/),\n location: z.enum(['path', 'query', 'header', 'body']),\n type: z.enum(['string', 'number', 'integer', 'boolean', 'json']),\n description: z.string().max(500).default(''),\n required: z.boolean().default(false),\n})\nexport type ApiParameter = z.infer<typeof apiParameterSchema>\n\nexport const apiAuthSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('bearer'), credentialRef: z.string().min(1) }),\n z.object({\n type: z.literal('api-key'),\n credentialRef: z.string().min(1),\n location: z.enum(['header', 'query']),\n name: z.string().min(1).max(100),\n }),\n z.object({ type: z.literal('basic'), credentialRef: z.string().min(1), username: z.string().min(1).max(200) }),\n])\nexport type ApiAuth = z.infer<typeof apiAuthSchema>\n\nexport type ApiAuthView =\n | { type: 'none'; credentialConfigured: boolean }\n | { type: 'bearer'; credentialConfigured: boolean }\n | { type: 'api-key'; credentialConfigured: boolean; location: 'header' | 'query'; name: string }\n | { type: 'basic'; credentialConfigured: boolean; username: string }\n\nconst timestampSchema = z.number().int().nonnegative()\n\nexport const dataSourceSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).max(100),\n type: databaseTypeSchema,\n host: z.string().min(1).max(255),\n port: z.number().int().min(1).max(65535),\n database: z.string().min(1).max(255),\n username: z.string().min(1).max(255),\n credentialRef: z.string().min(1),\n schemaInclude: z.array(z.string().min(1).max(255)).max(100).default([]),\n tls: z.boolean().default(false),\n sampleRows: z.number().int().min(0).max(3).default(0),\n aiEnrichment: z.boolean().default(false),\n enabled: z.boolean().default(true),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n})\nexport type DataSourceDefinition = z.infer<typeof dataSourceSchema>\n\nexport const apiDefinitionSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).max(100),\n slug: z.string().min(2).max(48).regex(/^[a-z][a-z0-9_]*$/),\n description: z.string().min(1).max(1000),\n method: apiMethodSchema,\n baseUrl: z.string().url().max(2048),\n pathTemplate: z.string().min(1).max(2048).default('/'),\n parameters: z.array(apiParameterSchema).max(50).default([]),\n auth: apiAuthSchema,\n timeoutMs: z.number().int().min(1000).max(120000).default(30000),\n maxResponseBytes: z.number().int().min(1024).max(2 * 1024 * 1024).default(131072),\n responsePointer: z.string().max(500).default(''),\n allowPrivateNetwork: z.boolean().default(false),\n enabled: z.boolean().default(true),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n})\nexport type ApiDefinition = z.infer<typeof apiDefinitionSchema>\n\nexport const physicalColumnSchema = z.object({\n name: z.string(),\n type: z.string(),\n nullable: z.boolean(),\n defaultValue: z.string().nullable().optional(),\n comment: z.string().optional(),\n primaryKey: z.boolean().default(false),\n references: z.object({\n schemaName: z.string(),\n objectName: z.string(),\n columnName: z.string(),\n }).optional(),\n})\nexport type PhysicalColumn = z.infer<typeof physicalColumnSchema>\n\nexport const semanticColumnSchema = z.object({\n name: z.string(),\n term: z.string(),\n description: z.string(),\n synonyms: z.array(z.string().max(100)).max(20).default([]),\n enums: z.array(z.string().max(100)).max(50).default([]),\n role: z.enum(['identifier', 'dimension', 'measure', 'time', 'unknown']).default('unknown'),\n})\nexport type SemanticColumn = z.infer<typeof semanticColumnSchema>\n\nexport const metadataProfileSchema = z.object({\n id: z.string(),\n sourceId: z.string().uuid(),\n schemaName: z.string(),\n objectName: z.string(),\n objectType: z.enum(['table', 'view']),\n engine: z.string().optional(),\n comment: z.string().optional(),\n ddl: z.string().max(100000),\n columns: z.array(physicalColumnSchema),\n sample: z.array(z.record(z.string(), z.unknown())).max(3).default([]),\n term: z.string().default(''),\n description: z.string().default(''),\n tags: z.array(z.string()).max(20).default([]),\n synonyms: z.array(z.string().max(100)).max(30).default([]),\n semanticColumns: z.array(semanticColumnSchema).default([]),\n confidence: z.number().int().min(0).max(100).default(0),\n confidenceReason: z.string().default(''),\n temporary: z.boolean().default(false),\n ignored: z.boolean().default(false),\n ignoredOverride: z.boolean().optional(),\n editedAt: timestampSchema.optional(),\n fingerprint: z.string(),\n semanticFingerprint: z.string().default(''),\n modelProvider: z.string().optional(),\n modelName: z.string().optional(),\n modelReasoningEffort: z.string().optional(),\n modelAnalyzedAt: timestampSchema.optional(),\n modelStatus: z.enum(['heuristic', 'ai', 'failed']).default('heuristic'),\n modelPromptVersion: z.string().default('v1'),\n profiledAt: timestampSchema,\n})\nexport type MetadataProfile = z.infer<typeof metadataProfileSchema>\n\nexport const metricAggregationSchema = z.enum(['count', 'sum', 'avg', 'min', 'max', 'formula'])\nexport type MetricAggregation = z.infer<typeof metricAggregationSchema>\n\nexport const metricDefinitionSchema = z.object({\n id: z.string().uuid(),\n sourceId: z.string().uuid(),\n profileId: z.string().min(1),\n name: z.string().min(1).max(120),\n term: z.string().min(1).max(120),\n description: z.string().max(500).default(''),\n aggregation: metricAggregationSchema,\n columnName: z.string().max(255).default(''),\n expression: z.string().max(2000),\n unit: z.string().max(50).default(''),\n tags: z.array(z.string().max(50)).max(20).default([]),\n enabled: z.boolean().default(true),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n})\nexport type MetricDefinition = z.infer<typeof metricDefinitionSchema>\n\nexport const metadataChangeSchema = z.object({\n id: z.string().uuid(),\n sourceId: z.string().uuid(),\n profileId: z.string().min(1),\n action: z.enum(['create', 'update', 'scan', 'model']),\n summary: z.string().max(500),\n before: z.record(z.string(), z.unknown()).optional(),\n after: z.record(z.string(), z.unknown()).optional(),\n changedAt: timestampSchema,\n})\nexport type MetadataChange = z.infer<typeof metadataChangeSchema>\n\nexport type MetadataChangeSummary = Pick<MetadataChange, 'id' | 'sourceId' | 'profileId' | 'action' | 'summary' | 'changedAt'>\n\nexport interface MetadataChangePage {\n items: MetadataChangeSummary[]\n offset: number\n limit: number\n total: number\n hasMore: boolean\n}\n\nexport interface MetricSuggestion {\n profileId: string\n name: string\n term: string\n description: string\n aggregation: MetricAggregation\n columnName: string\n expression: string\n unit: string\n reason: string\n}\n\nexport interface SqlQueryResult {\n columns: string[]\n rows: Array<Record<string, unknown>>\n rowCount: number\n truncated: boolean\n durationMs: number\n}\n\nexport const profileJobSchema = z.object({\n id: z.string().uuid(),\n sourceId: z.string().uuid(),\n status: z.enum(['queued', 'running', 'completed', 'cancelled', 'failed']),\n mode: z.enum(['incremental', 'rebuild-ai', 'full']).default('incremental'),\n total: z.number().int().nonnegative(),\n processed: z.number().int().nonnegative(),\n currentObject: z.string().optional(),\n error: z.string().optional(),\n startedAt: timestampSchema,\n updatedAt: timestampSchema,\n finishedAt: timestampSchema.optional(),\n modelProvider: z.string().optional(),\n modelName: z.string().optional(),\n})\nexport type ProfileJob = z.infer<typeof profileJobSchema>\n\nexport interface DataSourceView extends Omit<DataSourceDefinition, 'credentialRef'> {\n credentialConfigured: boolean\n latestJob?: ProfileJob\n profileCount: number\n aiProfileCount: number\n}\n\nexport interface ApiDefinitionView extends Omit<ApiDefinition, 'auth'> {\n auth: ApiAuthView\n toolName: string\n}\n\nexport interface SaveDataSourceInput {\n id?: string\n name: string\n type: DatabaseType\n host: string\n port: number\n database: string\n username: string\n secret?: string\n schemaInclude?: string[]\n tls?: boolean\n sampleRows?: number\n aiEnrichment?: boolean\n enabled?: boolean\n}\n\nexport interface SaveApiDefinitionInput {\n id?: string\n name: string\n slug: string\n description: string\n method: ApiMethod\n baseUrl: string\n pathTemplate: string\n parameters?: ApiParameter[]\n auth: Omit<ApiAuth, 'credentialRef'>\n secret?: string\n timeoutMs?: number\n maxResponseBytes?: number\n responsePointer?: string\n allowPrivateNetwork?: boolean\n enabled?: boolean\n}\n\nexport interface ApiExecutionResult {\n status: number\n contentType: string\n body: unknown\n truncated: boolean\n durationMs: number\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport type { CredentialRef } from '@deepseek-ai/dsh-credentials'\nimport type { ConnectDomain } from '../domain.js'\nimport type {\n ApiDefinition,\n ApiDefinitionView,\n DataSourceDefinition,\n DataSourceView,\n MetadataChange,\n MetadataProfile,\n MetricDefinition,\n ProfileJob,\n} from '../types.js'\n\nexport class ConnectStore {\n constructor(\n private readonly ctx: Context,\n readonly domain: ConnectDomain,\n ) {}\n\n dataSources(): DataSourceDefinition[] {\n return [...this.domain.table('data_sources').entries()]\n .map(([, value]) => value)\n .sort((a, b) => a.name.localeCompare(b.name))\n }\n\n dataSource(id: string): DataSourceDefinition | undefined {\n return this.domain.table('data_sources').get(id)\n }\n\n async dataSourceViews(): Promise<DataSourceView[]> {\n const jobs = this.jobs()\n const profiles = this.profiles()\n return Promise.all(this.dataSources().map(async source => {\n const { credentialRef, ...safe } = source\n const latestJob = jobs\n .filter(job => job.sourceId === source.id && job.status !== 'cancelled')\n .sort((a, b) => b.startedAt - a.startedAt)[0]\n // `cancelled` is kept in the persisted schema only for compatibility\n // with existing installations. It is not a user-facing source state.\n return {\n ...safe,\n credentialConfigured: (await this.ctx.credentials.describe(credentialRef as CredentialRef)).configured,\n ...(latestJob === undefined ? {} : { latestJob }),\n profileCount: profiles.filter(profile => profile.sourceId === source.id).length,\n aiProfileCount: profiles.filter(profile => profile.sourceId === source.id && profile.modelStatus === 'ai').length,\n }\n }))\n }\n\n putDataSource(value: DataSourceDefinition): Promise<void> {\n return this.domain.table('data_sources').put(value.id, value)\n }\n\n async deleteDataSource(id: string): Promise<void> {\n await this.domain.table('data_sources').delete(id)\n const profileTable = this.domain.table('metadata_profiles')\n for (const [key, profile] of profileTable.entries()) {\n if (profile.sourceId === id) await profileTable.delete(key)\n }\n const jobTable = this.domain.table('profile_jobs')\n for (const [key, job] of jobTable.entries()) {\n if (job.sourceId === id) await jobTable.delete(key)\n }\n for (const tableName of ['metrics', 'metadata_changes'] as const) {\n const table = this.domain.table(tableName)\n for (const [key, value] of table.entries()) if (value.sourceId === id) await table.delete(key)\n }\n }\n\n apiDefinitions(): ApiDefinition[] {\n return [...this.domain.table('api_definitions').entries()]\n .map(([, value]) => value)\n .sort((a, b) => a.name.localeCompare(b.name))\n }\n\n apiDefinition(id: string): ApiDefinition | undefined {\n return this.domain.table('api_definitions').get(id)\n }\n\n async apiDefinitionViews(): Promise<ApiDefinitionView[]> {\n return Promise.all(this.apiDefinitions().map(async definition => {\n const { auth, ...safe } = definition\n if (auth.type === 'none') {\n return { ...safe, auth: { type: 'none', credentialConfigured: true }, toolName: toolName(definition) }\n }\n const { credentialRef, ...safeAuth } = auth\n return {\n ...safe,\n auth: {\n ...safeAuth,\n credentialConfigured: (await this.ctx.credentials.describe(credentialRef as CredentialRef)).configured,\n },\n toolName: toolName(definition),\n }\n }))\n }\n\n putApiDefinition(value: ApiDefinition): Promise<void> {\n return this.domain.table('api_definitions').put(value.id, value)\n }\n\n deleteApiDefinition(id: string): Promise<boolean> {\n return this.domain.table('api_definitions').delete(id)\n }\n\n profiles(sourceId?: string): MetadataProfile[] {\n return [...this.domain.table('metadata_profiles').entries()]\n .map(([, value]) => value)\n .filter(profile => sourceId === undefined || profile.sourceId === sourceId)\n .sort((a, b) => `${a.schemaName}.${a.objectName}`.localeCompare(`${b.schemaName}.${b.objectName}`))\n }\n\n profile(id: string): MetadataProfile | undefined {\n return this.domain.table('metadata_profiles').get(id)\n }\n\n putProfile(value: MetadataProfile): Promise<void> {\n return this.domain.table('metadata_profiles').put(value.id, value)\n }\n\n metrics(sourceId?: string): MetricDefinition[] {\n return [...this.domain.table('metrics').entries()]\n .map(([, value]) => value)\n .filter(metric => sourceId === undefined || metric.sourceId === sourceId)\n .sort((a, b) => a.term.localeCompare(b.term))\n }\n\n metric(id: string): MetricDefinition | undefined { return this.domain.table('metrics').get(id) }\n putMetric(value: MetricDefinition): Promise<void> { return this.domain.table('metrics').put(value.id, value) }\n deleteMetric(id: string): Promise<boolean> { return this.domain.table('metrics').delete(id) }\n\n changes(sourceId?: string, profileId?: string): MetadataChange[] {\n return [...this.domain.table('metadata_changes').entries()]\n .map(([, value]) => value)\n .filter(change => (sourceId === undefined || change.sourceId === sourceId) && (profileId === undefined || change.profileId === profileId))\n .sort((a, b) => b.changedAt - a.changedAt)\n }\n\n changePage(sourceId: string, profileId: string | undefined, offset: number, limit: number) {\n const changes = this.changes(sourceId, profileId)\n return {\n items: changes.slice(offset, offset + limit).map(({ id, sourceId: itemSourceId, profileId: itemProfileId, action, summary, changedAt }) => ({\n id, sourceId: itemSourceId, profileId: itemProfileId, action, summary, changedAt,\n })),\n offset,\n limit,\n total: changes.length,\n hasMore: offset + limit < changes.length,\n }\n }\n putChange(value: MetadataChange): Promise<void> { return this.domain.table('metadata_changes').put(value.id, value) }\n\n async deleteStaleProfiles(sourceId: string, keep: ReadonlySet<string>): Promise<void> {\n const table = this.domain.table('metadata_profiles')\n for (const [key, value] of table.entries()) {\n if (value.sourceId === sourceId && !keep.has(key)) await table.delete(key)\n }\n }\n\n jobs(sourceId?: string): ProfileJob[] {\n return [...this.domain.table('profile_jobs').entries()]\n .map(([, value]) => value)\n .filter(job => job.status !== 'cancelled' && (sourceId === undefined || job.sourceId === sourceId))\n .sort((a, b) => b.startedAt - a.startedAt)\n }\n\n putJob(value: ProfileJob): Promise<void> {\n return this.domain.table('profile_jobs').put(value.id, value)\n }\n\n deleteJob(id: string): Promise<boolean> {\n return this.domain.table('profile_jobs').delete(id)\n }\n}\n\nexport function toolName(definition: Pick<ApiDefinition, 'slug'>): string {\n return `dsh_connect_api_${definition.slug}`\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport type { ApiDefinition, ApiExecutionResult, ApiParameter } from '../../types.js'\nimport { assertOutboundTarget, assertSafeHeaderName, parseConfiguredBaseUrl } from './security.js'\n\nconst BLOCKED_PARAMETER_HEADERS = new Set(['authorization', 'proxy-authorization'])\n\nexport class SecureHttpExecutor {\n constructor(private readonly ctx: Context) {}\n\n async execute(definition: ApiDefinition, rawArgs: unknown, signal?: AbortSignal): Promise<ApiExecutionResult> {\n const args = validateArguments(definition.parameters, rawArgs)\n const base = parseConfiguredBaseUrl(definition.baseUrl)\n const path = replacePathParameters(definition.pathTemplate, definition.parameters, args)\n const target = new URL(path, base)\n if (target.origin !== base.origin) throw new Error('API path must stay on the configured origin')\n await assertOutboundTarget(target, definition.allowPrivateNetwork)\n\n const headers = new Headers({ Accept: 'application/json, text/plain;q=0.9, */*;q=0.5' })\n const bodyValues: Record<string, unknown> = {}\n for (const parameter of definition.parameters) {\n const value = args[parameter.name]\n if (value === undefined || parameter.location === 'path') continue\n if (parameter.location === 'query') target.searchParams.append(parameter.name, serializeScalar(value))\n if (parameter.location === 'header') {\n assertSafeHeaderName(parameter.name)\n if (BLOCKED_PARAMETER_HEADERS.has(parameter.name.toLowerCase())) {\n throw new Error(`Header ${parameter.name} cannot be supplied by the model`)\n }\n headers.set(parameter.name, serializeScalar(value))\n }\n if (parameter.location === 'body') bodyValues[parameter.name] = value\n }\n\n await this.applyAuth(definition, target, headers)\n let body: string | undefined\n if (!['GET', 'DELETE'].includes(definition.method) && Object.keys(bodyValues).length > 0) {\n body = JSON.stringify(bodyValues)\n headers.set('Content-Type', 'application/json')\n }\n\n const timeout = AbortSignal.timeout(definition.timeoutMs)\n const combined = signal === undefined ? timeout : AbortSignal.any([signal, timeout])\n const started = Date.now()\n const response = await fetch(target, {\n method: definition.method,\n headers,\n ...(body === undefined ? {} : { body }),\n redirect: 'error',\n signal: combined,\n })\n const payload = await readBounded(response, definition.maxResponseBytes)\n const contentType = response.headers.get('content-type')?.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n const parsed = parseBody(payload.text, contentType)\n const selected = definition.responsePointer === '' ? parsed : resolveJsonPointer(parsed, definition.responsePointer)\n if (!response.ok) {\n const detail = typeof selected === 'string' ? selected : JSON.stringify(selected)\n throw new Error(`HTTP ${response.status}: ${detail.slice(0, 500)}`)\n }\n return {\n status: response.status,\n contentType,\n body: selected,\n truncated: payload.truncated,\n durationMs: Date.now() - started,\n }\n }\n\n private async applyAuth(definition: ApiDefinition, target: URL, headers: Headers): Promise<void> {\n const auth = definition.auth\n if (auth.type === 'none') return\n const resolved = await this.ctx.credentials.resolve(credentialRef(auth.credentialRef))\n if (resolved === undefined) throw new Error(`Credential ${auth.credentialRef} is not configured`)\n if (auth.type === 'bearer') headers.set('Authorization', `Bearer ${resolved.value}`)\n if (auth.type === 'basic') {\n headers.set('Authorization', `Basic ${Buffer.from(`${auth.username}:${resolved.value}`).toString('base64')}`)\n }\n if (auth.type === 'api-key') {\n if (auth.location === 'header') {\n assertSafeHeaderName(auth.name)\n headers.set(auth.name, resolved.value)\n } else {\n target.searchParams.set(auth.name, resolved.value)\n }\n }\n }\n}\n\nfunction validateArguments(parameters: ApiParameter[], raw: unknown): Record<string, unknown> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('Tool arguments must be an object')\n const source = raw as Record<string, unknown>\n const known = new Set(parameters.map(parameter => parameter.name))\n for (const key of Object.keys(source)) {\n if (!known.has(key)) throw new Error(`Unknown API parameter: ${key}`)\n }\n const result: Record<string, unknown> = {}\n for (const parameter of parameters) {\n const value = source[parameter.name]\n if (value === undefined) {\n if (parameter.required) throw new Error(`Missing required API parameter: ${parameter.name}`)\n continue\n }\n if (!matchesType(parameter.type, value)) throw new Error(`API parameter ${parameter.name} must be ${parameter.type}`)\n result[parameter.name] = value\n }\n return result\n}\n\nfunction matchesType(type: ApiParameter['type'], value: unknown): boolean {\n if (type === 'string') return typeof value === 'string'\n if (type === 'boolean') return typeof value === 'boolean'\n if (type === 'number') return typeof value === 'number' && Number.isFinite(value)\n if (type === 'integer') return typeof value === 'number' && Number.isSafeInteger(value)\n return value === null || typeof value === 'string' || typeof value === 'number'\n || typeof value === 'boolean' || Array.isArray(value) || typeof value === 'object'\n}\n\nfunction replacePathParameters(template: string, parameters: ApiParameter[], args: Record<string, unknown>): string {\n let path = template.startsWith('/') ? template : `/${template}`\n for (const parameter of parameters.filter(item => item.location === 'path')) {\n const value = args[parameter.name]\n if (value === undefined) throw new Error(`Path parameter ${parameter.name} is required`)\n path = path.replaceAll(`{${parameter.name}}`, encodeURIComponent(serializeScalar(value)))\n }\n if (/\\{[^}]+\\}/.test(path)) throw new Error('API path contains an unresolved placeholder')\n return path\n}\n\nfunction serializeScalar(value: unknown): string {\n return typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n}\n\nasync function readBounded(response: Response, maxBytes: number): Promise<{ text: string; truncated: boolean }> {\n if (response.body === null) return { text: '', truncated: false }\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let size = 0\n let truncated = false\n try {\n while (true) {\n const next = await reader.read()\n if (next.done) break\n const remaining = maxBytes - size\n if (next.value.byteLength > remaining) {\n if (remaining > 0) chunks.push(next.value.slice(0, remaining))\n truncated = true\n await reader.cancel('dsh-connect response limit reached')\n break\n }\n chunks.push(next.value)\n size += next.value.byteLength\n }\n } finally {\n reader.releaseLock()\n }\n const bytes = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.byteLength, 0))\n let offset = 0\n for (const chunk of chunks) {\n bytes.set(chunk, offset)\n offset += chunk.byteLength\n }\n return { text: new TextDecoder().decode(bytes), truncated }\n}\n\nfunction parseBody(text: string, contentType: string): unknown {\n if (text === '') return null\n if (contentType === 'application/json' || contentType.endsWith('+json')) {\n try {\n return JSON.parse(text)\n } catch {\n throw new Error('API returned invalid JSON')\n }\n }\n return text\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string): unknown {\n if (pointer === '') return value\n if (!pointer.startsWith('/')) throw new Error('Response pointer must be empty or start with /')\n let current = value\n for (const encoded of pointer.slice(1).split('/')) {\n const key = encoded.replaceAll('~1', '/').replaceAll('~0', '~')\n if (Array.isArray(current)) {\n const index = Number(key)\n if (!Number.isSafeInteger(index) || index < 0 || index >= current.length) throw new Error(`Response pointer not found: ${pointer}`)\n current = current[index]\n } else if (current !== null && typeof current === 'object' && Object.hasOwn(current, key)) {\n current = (current as Record<string, unknown>)[key]\n } else {\n throw new Error(`Response pointer not found: ${pointer}`)\n }\n }\n return current\n}\n", "import { lookup } from 'node:dns/promises'\nimport { isIP } from 'node:net'\n\nconst FORBIDDEN_HEADERS = new Set([\n 'authorization',\n 'proxy-authorization',\n 'host',\n 'content-length',\n 'connection',\n 'transfer-encoding',\n 'cookie',\n])\n\nexport function assertSafeHeaderName(name: string): void {\n const normalized = name.trim().toLowerCase()\n if (!/^[a-z0-9!#$%&'*+.^_`|~-]+$/.test(normalized)) {\n throw new Error(`Invalid HTTP header name: ${name}`)\n }\n if (FORBIDDEN_HEADERS.has(normalized)) {\n throw new Error(`HTTP header ${name} is controlled by dsh-connect`)\n }\n}\n\nexport function parseConfiguredBaseUrl(raw: string): URL {\n const url = new URL(raw)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('Only HTTP and HTTPS API targets are supported')\n }\n if (url.username !== '' || url.password !== '') {\n throw new Error('Credentials must not be embedded in the API URL')\n }\n if (url.hash !== '') throw new Error('API base URL must not contain a fragment')\n return url\n}\n\nexport async function assertOutboundTarget(url: URL, allowPrivateNetwork: boolean): Promise<void> {\n if (allowPrivateNetwork) return\n const addresses = isIP(url.hostname) === 0\n ? await lookup(url.hostname, { all: true, verbatim: true })\n : [{ address: url.hostname, family: isIP(url.hostname) }]\n if (addresses.length === 0) throw new Error('API target did not resolve to an address')\n for (const { address } of addresses) {\n if (isPrivateAddress(address)) {\n throw new Error('API target resolves to a private, loopback, link-local, or reserved address')\n }\n }\n}\n\nexport function isPrivateAddress(raw: string): boolean {\n const lower = raw.toLowerCase()\n const unbracketed = lower.startsWith('[') && lower.endsWith(']') ? lower.slice(1, -1) : lower\n const address = unbracketed.split('%', 1)[0] ?? unbracketed\n if (address.includes(':')) {\n if (isIP(address) !== 6) return true\n if (address === '::' || address === '::1') return true\n if (address.startsWith('fc') || address.startsWith('fd') || address.startsWith('fe8')\n || address.startsWith('fe9') || address.startsWith('fea') || address.startsWith('feb')) return true\n if (address.startsWith('::ffff:')) return isPrivateAddress(address.slice('::ffff:'.length))\n return address.startsWith('ff')\n || address.startsWith('2001:db8:')\n || address.startsWith('2001:0db8:')\n || address.startsWith('2001:10:')\n || address.startsWith('2001:20:')\n || address.startsWith('2002:')\n }\n const parts = address.split('.').map(Number)\n if (parts.length !== 4 || parts.some(value => !Number.isInteger(value) || value < 0 || value > 255)) return true\n const [a, b, c] = parts as [number, number, number, number]\n return a === 0\n || a === 10\n || a === 127\n || (a === 169 && b === 254)\n || (a === 172 && b >= 16 && b <= 31)\n || (a === 192 && b === 168)\n || (a === 192 && b === 0 && (c === 0 || c === 2))\n || (a === 192 && b === 88 && c === 99)\n || (a === 198 && (b === 18 || b === 19))\n || (a === 198 && b === 51 && c === 100)\n || (a === 203 && b === 0 && c === 113)\n || (a === 100 && b >= 64 && b <= 127)\n || a >= 224\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport type { JsonValue, ToolDefinition } from '@deepseek-ai/dsh-tools'\nimport type { ApiDefinition, ApiParameter } from '../../types.js'\nimport { toolName } from '../store.js'\nimport { SecureHttpExecutor } from './executor.js'\n\nexport class ApiToolRegistry {\n private disposers: Array<() => void> = []\n private names = new Set<string>()\n private readonly executor: SecureHttpExecutor\n\n constructor(private readonly ctx: Context) {\n this.executor = new SecureHttpExecutor(ctx)\n }\n\n replace(definitions: ApiDefinition[]): void {\n const enabled = definitions.filter(definition => definition.enabled)\n const names = new Set<string>()\n for (const definition of enabled) {\n const name = toolName(definition)\n if (names.has(name)) throw new Error(`Duplicate API tool name: ${name}`)\n names.add(name)\n const existing = this.ctx.tools.get(name)\n if (existing !== undefined && !this.names.has(name)) throw new Error(`Tool name is already registered: ${name}`)\n }\n\n this.dispose()\n const next: Array<() => void> = []\n try {\n for (const definition of enabled) next.push(this.ctx.tools.register(this.definition(definition)))\n } catch (error) {\n for (const dispose of next.reverse()) dispose()\n throw error\n }\n this.disposers = next\n this.names = names\n }\n\n dispose(): void {\n for (const dispose of this.disposers.splice(0).reverse()) dispose()\n this.names.clear()\n }\n\n private definition(definition: ApiDefinition): ToolDefinition {\n return {\n name: toolName(definition),\n description: definition.description,\n parameters: parametersSchema(definition.parameters),\n output: {\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n status: { type: 'integer' },\n contentType: { type: 'string' },\n body: {},\n truncated: { type: 'boolean' },\n durationMs: { type: 'integer' },\n },\n required: ['status', 'contentType', 'body', 'truncated', 'durationMs'],\n },\n render: (_args, value) => [{ type: 'text', text: JSON.stringify(value, null, 2) }],\n },\n timeoutMs: definition.timeoutMs,\n isConcurrencySafe: () => definition.method === 'GET',\n execute: (args, exec) => this.executor.execute(definition, args, exec.signal) as unknown as Promise<JsonValue>,\n presentCall: args => ({\n card: 'generic',\n title: definition.name,\n kind: 'fetch',\n rawInput: args,\n }),\n }\n }\n}\n\nfunction parametersSchema(parameters: ApiParameter[]): Record<string, unknown> {\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n for (const parameter of parameters) {\n properties[parameter.name] = {\n ...parameter.type === 'json' ? {} : { type: parameter.type },\n description: parameter.description || `${parameter.location} parameter ${parameter.name}`,\n }\n if (parameter.required || parameter.location === 'path') required.push(parameter.name)\n }\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n }\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport { defineTool } from '@deepseek-ai/dsh-tools'\nimport { z } from 'zod'\nimport { apiMethodSchema, apiParameterSchema, type ApiDefinitionView } from '../../types.js'\n\nexport const CONVERSATION_API_TOOL = 'dsh_connect_create_http_api'\n\nexport const conversationApiInput = z.object({\n name: z.string().min(1).max(100),\n slug: z.string().min(2).max(48).regex(/^[a-z][a-z0-9_]*$/),\n description: z.string().min(1).max(1000),\n method: apiMethodSchema,\n baseUrl: z.string().url().max(2048),\n pathTemplate: z.string().min(1).max(2048).default('/'),\n parameters: z.array(apiParameterSchema).max(50).default([]),\n authType: z.enum(['none', 'bearer', 'api-key', 'basic']).default('none'),\n authLocation: z.enum(['header', 'query']).optional(),\n authName: z.string().min(1).max(100).optional(),\n basicUsername: z.string().min(1).max(200).optional(),\n timeoutMs: z.number().int().min(1000).max(120000).default(30000),\n maxResponseBytes: z.number().int().min(1024).max(2 * 1024 * 1024).default(131072),\n responsePointer: z.string().max(500).default(''),\n}).strict().superRefine((input, refinement) => {\n if (input.authType === 'api-key') {\n if (input.authLocation === undefined) refinement.addIssue({ code: 'custom', path: ['authLocation'], message: 'Required for api-key authentication' })\n if (input.authName === undefined) refinement.addIssue({ code: 'custom', path: ['authName'], message: 'Required for api-key authentication' })\n } else if (input.authLocation !== undefined || input.authName !== undefined) {\n refinement.addIssue({ code: 'custom', path: ['authType'], message: 'API key fields are only allowed with api-key authentication' })\n }\n if (input.authType === 'basic') {\n if (input.basicUsername === undefined) refinement.addIssue({ code: 'custom', path: ['basicUsername'], message: 'Required for basic authentication' })\n } else if (input.basicUsername !== undefined) {\n refinement.addIssue({ code: 'custom', path: ['basicUsername'], message: 'Only allowed with basic authentication' })\n }\n})\n\nexport type ConversationApiInput = z.infer<typeof conversationApiInput>\n\ntype CreateConversationApi = (input: ConversationApiInput) => Promise<ApiDefinitionView | undefined>\ntype ValidateConversationApi = (input: ConversationApiInput) => void\n\nconst parameterItem = {\n type: 'object',\n additionalProperties: false,\n properties: {\n name: { type: 'string', required: true, description: 'Parameter name.' },\n location: { type: 'string', enum: ['path', 'query', 'header', 'body'], required: true },\n type: { type: 'string', enum: ['string', 'number', 'integer', 'boolean', 'json'], required: true },\n description: { type: 'string', description: 'What the parameter means.' },\n required: { type: 'boolean', description: 'Whether the caller must provide this parameter.' },\n },\n} as const\n\nexport function registerConversationApiTool(\n ctx: Context,\n validate: ValidateConversationApi,\n create: CreateConversationApi,\n): Array<() => void> {\n const disposeTool = ctx.tools.register(defineTool({\n name: CONVERSATION_API_TOOL,\n description: [\n 'Create and register a reusable HTTP API in DSH\u8FDE\u63A5\u5668 when the user asks to add, configure, or register an API.',\n 'Derive this non-secret configuration from the conversation, then call this tool so DSH can show an approval preview.',\n 'Never ask for or pass tokens, passwords, API-key values, Authorization values, or other credentials.',\n 'For authenticated APIs, provide only the authentication type and public metadata; the user completes credentials in Settings.',\n ].join(' '),\n parameters: {\n name: { type: 'string', required: true, description: 'User-facing API name.' },\n slug: { type: 'string', required: true, description: 'Lowercase tool suffix matching ^[a-z][a-z0-9_]{1,47}$.' },\n description: { type: 'string', required: true, description: 'Describe when the Agent should call this API and what it returns.' },\n method: { type: 'string', enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], required: true },\n baseUrl: { type: 'string', required: true, description: 'Public HTTP(S) base URL without credentials or a query string.' },\n pathTemplate: { type: 'string', description: 'Request path such as /v1/weather/{city}. Default /.' },\n parameters: { type: 'array', items: parameterItem, description: 'Path, query, header, and body arguments exposed to the Agent.' },\n authType: { type: 'string', enum: ['none', 'bearer', 'api-key', 'basic'], description: 'Authentication type. Default none.' },\n authLocation: { type: 'string', enum: ['header', 'query'], description: 'Required only for api-key authentication.' },\n authName: { type: 'string', description: 'Header or query parameter name for an API key, never its value.' },\n basicUsername: { type: 'string', description: 'Public username for basic authentication, never the password.' },\n timeoutMs: { type: 'integer', description: 'Timeout from 1000 to 120000 milliseconds. Default 30000.' },\n maxResponseBytes: { type: 'integer', description: 'Response limit from 1024 to 2097152 bytes. Default 131072.' },\n responsePointer: { type: 'string', description: 'Optional RFC 6901 JSON pointer selecting the useful response value.' },\n },\n output: {\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n created: { type: 'boolean', required: true },\n id: { type: 'string', required: true },\n name: { type: 'string', required: true },\n toolName: { type: 'string', required: true },\n enabled: { type: 'boolean', required: true },\n credentialRequired: { type: 'boolean', required: true },\n nextStep: { type: 'string', required: true },\n },\n },\n render: (_args, value) => [{ type: 'text', text: JSON.stringify(value, null, 2) }],\n },\n isConcurrencySafe: () => false,\n async execute(rawInput) {\n const input = conversationApiInput.parse(rawInput)\n validate(input)\n const saved = await create(input)\n if (saved === undefined) throw new Error('HTTP API was saved but could not be loaded')\n const credentialRequired = saved.auth.type !== 'none' && !saved.auth.credentialConfigured\n return {\n created: true,\n id: saved.id,\n name: saved.name,\n toolName: saved.toolName,\n enabled: saved.enabled,\n credentialRequired,\n nextStep: credentialRequired\n ? '\u8BF7\u524D\u5F80\u201CDSH\u8FDE\u63A5\u5668 \u2192 HTTP API\u201D\u8865\u5145\u51ED\u636E\u5E76\u542F\u7528\u8BE5 API\u3002'\n : `API \u5DF2\u542F\u7528\uFF0CAgent \u73B0\u5728\u53EF\u4EE5\u8C03\u7528 ${saved.toolName}\u3002`,\n }\n },\n presentCall: input => ({\n card: 'generic',\n title: `\u521B\u5EFA HTTP API\uFF1A${input.name}`,\n kind: 'edit',\n rawInput: input,\n }),\n }))\n\n const disposeApproval = ctx.on('tools/pre-execute', async (exec, next) => {\n if (exec.name !== CONVERSATION_API_TOOL) return next()\n const downstream = await next()\n if (downstream.kind !== 'allow') return downstream\n const parsed = conversationApiInput.safeParse(exec.arguments)\n if (!parsed.success) {\n return { kind: 'deny', reason: 'HTTP API \u914D\u7F6E\u65E0\u6548\uFF1B\u5BF9\u8BDD\u521B\u5EFA\u4E0D\u63A5\u53D7\u672A\u58F0\u660E\u5B57\u6BB5\u6216\u4EFB\u4F55\u51ED\u636E\u3002\u8BF7\u4FEE\u6B63\u975E\u654F\u611F\u914D\u7F6E\u540E\u91CD\u8BD5\u3002' }\n }\n try {\n validate(parsed.data)\n } catch (error) {\n return { kind: 'deny', reason: safeValidationMessage(error) }\n }\n return { kind: 'ask', reason: approvalPreview(parsed.data) }\n })\n\n return [disposeTool, disposeApproval]\n}\n\nfunction approvalPreview(input: ConversationApiInput): string {\n const auth = input.authType === 'none' ? '\u65E0\u8BA4\u8BC1' : `${input.authType}\uFF08\u51ED\u636E\u7A0D\u540E\u5728\u8BBE\u7F6E\u4E2D\u586B\u5199\uFF0C\u6B64 API \u5C06\u5148\u4FDD\u6301\u7981\u7528\uFF09`\n return [\n '\u786E\u8BA4\u521B\u5EFA\u4EE5\u4E0B HTTP API\uFF1A',\n `\u540D\u79F0\uFF1A${input.name}`,\n `\u8BF7\u6C42\uFF1A${input.method} ${previewTarget(input)}`,\n `\u5DE5\u5177\uFF1Adsh_connect_api_${input.slug}`,\n `\u53C2\u6570\uFF1A${input.parameters.length} \u4E2A`,\n `\u8BA4\u8BC1\uFF1A${auth}`,\n ].join('\\n')\n}\n\nfunction previewTarget(input: ConversationApiInput): string {\n try {\n const path = input.pathTemplate.startsWith('/') ? input.pathTemplate : `/${input.pathTemplate}`\n return new URL(path, input.baseUrl).toString()\n } catch {\n // Full API validation runs immediately before this preview. Keep the\n // approval path total even for a malformed path that reaches this helper.\n return `${input.baseUrl.replace(/\\/$/, '')}/${input.pathTemplate.replace(/^\\//, '')}`\n }\n}\n\nfunction safeValidationMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error)\n return `HTTP API \u914D\u7F6E\u65E0\u6548\uFF1A${message.replaceAll(/[\\r\\n]+/g, ' ').slice(0, 500)}`\n}\n", "import { createHash, randomUUID } from 'node:crypto'\nimport type { Context } from '@deepseek-ai/cordis'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport type { DataSourceDefinition, MetadataProfile, ProfileJob } from '../../types.js'\nimport { providerFor } from '../datasource/index.js'\nimport type { DiscoveredObject } from '../datasource/provider.js'\nimport { ConnectStore } from '../store.js'\nimport { METADATA_MODEL_PROMPT_VERSION, MetadataEnricher, type MetadataModelRoute } from './enricher.js'\n\ninterface RunningJob {\n controller: AbortController\n done: Promise<void>\n}\n\nexport class MetadataProfiler {\n private readonly running = new Map<string, RunningJob>()\n private readonly enricher: MetadataEnricher\n\n constructor(\n private readonly ctx: Context,\n private readonly store: ConnectStore,\n ) {\n this.enricher = new MetadataEnricher(ctx)\n }\n\n async test(source: DataSourceDefinition, signal?: AbortSignal): Promise<void> {\n const password = await this.resolvePassword(source)\n await providerFor(source.type).test(source, password, signal)\n }\n\n async start(sourceId: string, mode: ProfileJob['mode'] = 'incremental'): Promise<ProfileJob> {\n const source = this.store.dataSource(sourceId)\n if (source === undefined) throw new Error('Data source not found')\n if (!source.enabled) throw new Error('Data source is disabled')\n if (mode === 'rebuild-ai' && !source.aiEnrichment) throw new Error('\u8BF7\u5148\u5728\u6570\u636E\u5E93\u8BBE\u7F6E\u4E2D\u5F00\u542F AI \u8BED\u4E49\u589E\u5F3A')\n if (this.running.has(sourceId)) throw new Error('A metadata scan is already running for this data source')\n await this.resolvePassword(source)\n\n const now = Date.now()\n const job: ProfileJob = {\n id: randomUUID(),\n sourceId,\n status: 'queued',\n mode,\n total: 0,\n processed: 0,\n startedAt: now,\n updatedAt: now,\n }\n await this.store.putJob(job)\n const controller = new AbortController()\n const done = this.run(source, job, controller.signal).finally(() => {\n this.running.delete(sourceId)\n })\n this.running.set(sourceId, { controller, done })\n void done.catch(() => {})\n return job\n }\n\n async cancel(sourceId: string): Promise<{ stopped: true; processed: number; total: number }> {\n const active = this.running.get(sourceId)\n active?.controller.abort('metadata scan cancelled')\n\n // Do not wait for a database driver or model stream to release its\n // connection. Remove the unfinished job immediately so stopping a scan\n // does not become the data source's permanent status. Profiles already\n // committed table by table remain available.\n const current = this.store.jobs(sourceId).find(job => job.status === 'queued' || job.status === 'running')\n if (current !== undefined) await this.store.deleteJob(current.id)\n return { stopped: true, processed: current?.processed ?? 0, total: current?.total ?? 0 }\n }\n\n async dispose(): Promise<void> {\n const active = [...this.running.values()]\n for (const job of active) job.controller.abort('dsh-connect is unloading')\n await Promise.allSettled(active.map(job => job.done))\n }\n\n private async run(source: DataSourceDefinition, initial: ProfileJob, signal: AbortSignal): Promise<void> {\n const route = source.aiEnrichment ? this.modelRoute() : undefined\n let job = { ...initial, status: 'running' as const, updatedAt: Date.now() }\n if (route !== undefined) job = { ...job, modelProvider: route.provider, modelName: route.model }\n await this.store.putJob(job)\n try {\n const password = await this.resolvePassword(source)\n const objects = await providerFor(source.type).discover(source, password, signal)\n signal.throwIfAborted()\n job = { ...job, total: objects.length, updatedAt: Date.now() }\n await this.store.putJob(job)\n const keep = new Set<string>()\n for (const object of objects) {\n signal.throwIfAborted()\n const id = profileId(source.id, object)\n keep.add(id)\n job = { ...job, currentObject: `${object.schemaName}.${object.objectName}`, updatedAt: Date.now() }\n await this.store.putJob(job)\n const fingerprint = fingerprintOf(object)\n const semanticFingerprint = semanticFingerprintOf(fingerprint, source.aiEnrichment, route)\n const existing = this.store.profile(id)\n const rebuild = initial.mode === 'full'\n || (initial.mode === 'rebuild-ai' && source.aiEnrichment)\n if (rebuild || existing === undefined || existing.semanticFingerprint !== semanticFingerprint) {\n const semantic = await this.enricher.enrich(object, source.aiEnrichment, signal, route)\n signal.throwIfAborted()\n const profile: MetadataProfile = {\n id,\n sourceId: source.id,\n schemaName: object.schemaName,\n objectName: object.objectName,\n objectType: object.objectType,\n ...(object.engine === undefined ? {} : { engine: object.engine }),\n ...(object.comment === undefined ? {} : { comment: object.comment }),\n ddl: object.ddl.slice(0, 100_000),\n columns: object.columns,\n sample: object.sample,\n term: semantic.term,\n description: semantic.description,\n tags: semantic.tags,\n synonyms: semantic.synonyms,\n semanticColumns: semantic.semanticColumns,\n confidence: semantic.confidence,\n confidenceReason: semantic.confidenceReason,\n temporary: semantic.temporary,\n ignored: existing?.ignoredOverride ?? (semantic.temporary || semantic.confidence < 60),\n ...(existing?.ignoredOverride === undefined ? {} : { ignoredOverride: existing.ignoredOverride }),\n fingerprint,\n semanticFingerprint,\n ...(semantic.modelProvider === undefined ? {} : { modelProvider: semantic.modelProvider }),\n ...(semantic.modelName === undefined ? {} : { modelName: semantic.modelName }),\n ...(semantic.modelReasoningEffort === undefined ? {} : { modelReasoningEffort: semantic.modelReasoningEffort }),\n ...(semantic.modelAnalyzedAt === undefined ? {} : { modelAnalyzedAt: semantic.modelAnalyzedAt }),\n modelStatus: semantic.modelStatus,\n modelPromptVersion: METADATA_MODEL_PROMPT_VERSION,\n profiledAt: Date.now(),\n }\n await this.store.putProfile(profile)\n await this.store.putChange({\n id: randomUUID(),\n sourceId: source.id,\n profileId: profile.id,\n action: initial.mode === 'rebuild-ai' ? 'model' : 'scan',\n summary: initial.mode === 'rebuild-ai' ? 'AI \u8BED\u4E49\u5EFA\u6A21\u5B8C\u6210' : '\u7269\u7406\u5143\u6570\u636E\u626B\u63CF\u5B8C\u6210',\n after: { term: profile.term, description: profile.description, modelStatus: profile.modelStatus, confidence: profile.confidence },\n changedAt: Date.now(),\n })\n }\n signal.throwIfAborted()\n job = { ...job, processed: job.processed + 1, updatedAt: Date.now() }\n await this.store.putJob(job)\n }\n signal.throwIfAborted()\n await this.store.deleteStaleProfiles(source.id, keep)\n const { currentObject: _currentObject, ...completedJob } = job\n await this.store.putJob({\n ...completedJob,\n status: 'completed',\n processed: objects.length,\n updatedAt: Date.now(),\n finishedAt: Date.now(),\n })\n } catch (error) {\n const cancelled = signal.aborted\n if (cancelled) {\n await this.store.deleteJob(job.id)\n } else {\n const { currentObject: _currentObject, ...failedJob } = job\n await this.store.putJob({\n ...failedJob,\n status: 'failed',\n error: safeError(error),\n updatedAt: Date.now(),\n finishedAt: Date.now(),\n })\n }\n }\n }\n\n private async resolvePassword(source: DataSourceDefinition): Promise<string> {\n const resolved = await this.ctx.credentials.resolve(credentialRef(source.credentialRef))\n if (resolved === undefined) throw new Error('Database credential is not configured')\n return resolved.value\n }\n\n private modelRoute(): MetadataModelRoute | undefined {\n const defaults = this.ctx.get('agentDefaultModel') as { currentSelection(): MetadataModelRoute } | undefined\n if (defaults === undefined) return undefined\n try {\n return defaults.currentSelection()\n } catch {\n return undefined\n }\n }\n}\n\nfunction profileId(sourceId: string, object: Pick<DiscoveredObject, 'schemaName' | 'objectName'>): string {\n return `${sourceId}:${object.schemaName}:${object.objectName}`\n}\n\nfunction fingerprintOf(object: DiscoveredObject): string {\n return createHash('sha256').update(JSON.stringify({\n schemaName: object.schemaName,\n objectName: object.objectName,\n objectType: object.objectType,\n engine: object.engine,\n comment: object.comment,\n ddl: object.ddl,\n columns: object.columns,\n sample: object.sample,\n })).digest('hex')\n}\n\nfunction semanticFingerprintOf(physicalFingerprint: string, aiEnabled: boolean, route: MetadataModelRoute | undefined): string {\n return createHash('sha256').update(JSON.stringify({\n physicalFingerprint,\n aiEnabled,\n promptVersion: METADATA_MODEL_PROMPT_VERSION,\n provider: aiEnabled ? route?.provider : undefined,\n model: aiEnabled ? route?.model : undefined,\n reasoningEffort: aiEnabled ? route?.reasoningEffort : undefined,\n })).digest('hex')\n}\n\nfunction safeError(error: unknown): string {\n return (error instanceof Error ? error.message : String(error)).replaceAll(/[\\r\\n]+/g, ' ').slice(0, 1000)\n}\n", "import { createClient } from '@clickhouse/client'\nimport type { DataSourceDefinition, PhysicalColumn } from '../../types.js'\nimport type { DataSourceProvider, DiscoveredObject } from './provider.js'\nimport { queryLimit, queryResult, sanitizeRows, throwIfAborted, validateReadOnlySql } from './provider.js'\n\ninterface TableRow {\n database: string\n name: string\n engine: string\n comment: string\n create_table_query: string\n is_temporary: number\n}\n\ninterface ColumnRow {\n database: string\n table: string\n name: string\n type: string\n default_expression: string\n comment: string\n is_in_primary_key: number\n}\n\nexport class ClickhouseProvider implements DataSourceProvider {\n async test(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<void> {\n const client = connect(source, password)\n try {\n await client.query({ query: 'SELECT 1', format: 'JSONEachRow', ...(signal === undefined ? {} : { abort_signal: signal }) })\n } finally {\n await client.close()\n }\n }\n\n async discover(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<DiscoveredObject[]> {\n const client = connect(source, password)\n try {\n const databases = source.schemaInclude.length > 0 ? source.schemaInclude : [source.database]\n const dbList = databases.map(quoteLiteral).join(', ')\n const tableResult = await client.query({\n query: `SELECT database, name, engine, comment, create_table_query, is_temporary\n FROM system.tables WHERE database IN (${dbList}) ORDER BY database, name`,\n format: 'JSONEachRow',\n ...(signal === undefined ? {} : { abort_signal: signal }),\n })\n const columnResult = await client.query({\n query: `SELECT database, table, name, type, default_expression, comment, is_in_primary_key\n FROM system.columns WHERE database IN (${dbList}) ORDER BY database, table, position`,\n format: 'JSONEachRow',\n ...(signal === undefined ? {} : { abort_signal: signal }),\n })\n const tables = await tableResult.json<TableRow>()\n const columns = await columnResult.json<ColumnRow>()\n const columnsByObject = groupColumns(columns)\n const result: DiscoveredObject[] = []\n for (const table of tables) {\n throwIfAborted(signal)\n let sample: Array<Record<string, unknown>> = []\n if (source.sampleRows > 0) {\n const rows = await client.query({\n query: `SELECT * FROM ${quote(table.database)}.${quote(table.name)} LIMIT ${source.sampleRows}`,\n format: 'JSONEachRow',\n ...(signal === undefined ? {} : { abort_signal: signal }),\n })\n sample = sanitizeRows(await rows.json<Record<string, unknown>>(), source.sampleRows)\n }\n result.push({\n schemaName: table.database,\n objectName: table.name,\n objectType: table.engine === 'View' || table.engine.endsWith('View') ? 'view' : 'table',\n engine: table.engine,\n ...(table.comment ? { comment: table.comment } : {}),\n ddl: table.create_table_query,\n columns: columnsByObject.get(`${table.database}\\0${table.name}`) ?? [],\n sample,\n })\n }\n return result\n } finally {\n await client.close()\n }\n }\n\n async query(source: DataSourceDefinition, password: string, rawSql: string, limit: number, signal?: AbortSignal) {\n const sql = validateReadOnlySql(rawSql)\n const bounded = queryLimit(limit)\n const startedAt = Date.now()\n const client = connect(source, password)\n try {\n const result = await client.query({ query: `SELECT * FROM (${sql}) AS dsh_connect_query LIMIT ${bounded + 1}`, format: 'JSONEachRow', clickhouse_settings: { readonly: '2', max_execution_time: 30 }, ...(signal === undefined ? {} : { abort_signal: signal }) })\n const rows = await result.json<Record<string, unknown>>()\n throwIfAborted(signal)\n return queryResult(Object.keys(rows[0] ?? {}), rows, bounded, startedAt)\n } finally {\n await client.close()\n }\n }\n}\n\nfunction connect(source: DataSourceDefinition, password: string) {\n return createClient({\n url: `${source.tls ? 'https' : 'http'}://${source.host}:${source.port}`,\n username: source.username,\n password,\n database: source.database,\n request_timeout: 30_000,\n })\n}\n\nfunction groupColumns(rows: ColumnRow[]): Map<string, PhysicalColumn[]> {\n const result = new Map<string, PhysicalColumn[]>()\n for (const row of rows) {\n const key = `${row.database}\\0${row.table}`\n const list = result.get(key) ?? []\n list.push({\n name: row.name,\n type: row.type,\n nullable: row.type.startsWith('Nullable('),\n defaultValue: row.default_expression === '' ? null : row.default_expression,\n ...(row.comment ? { comment: row.comment } : {}),\n primaryKey: Boolean(row.is_in_primary_key),\n })\n result.set(key, list)\n }\n return result\n}\n\nfunction quote(value: string): string {\n return `\\`${value.replaceAll('`', '``')}\\``\n}\n\nfunction quoteLiteral(value: string): string {\n return `'${value.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`\n}\n", "import type { DataSourceDefinition, PhysicalColumn, SqlQueryResult } from '../../types.js'\n\nexport interface DiscoveredObject {\n schemaName: string\n objectName: string\n objectType: 'table' | 'view'\n engine?: string\n comment?: string\n ddl: string\n columns: PhysicalColumn[]\n sample: Array<Record<string, unknown>>\n}\n\nexport interface DataSourceProvider {\n test(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<void>\n discover(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<DiscoveredObject[]>\n query(source: DataSourceDefinition, password: string, sql: string, limit: number, signal?: AbortSignal): Promise<SqlQueryResult>\n}\n\nconst SENSITIVE_COLUMN = /(?:pass(?:word)?|secret|token|api[_-]?key|authorization|cookie|email|e[-_]?mail|phone|mobile|id[_-]?card|\u8EAB\u4EFD\u8BC1|\u624B\u673A\u53F7|\u90AE\u7BB1)/i\n\nexport function sanitizeRows(rows: unknown[], maxRows: number): Array<Record<string, unknown>> {\n return rows.slice(0, maxRows).map(row => {\n if (row === null || typeof row !== 'object' || Array.isArray(row)) return { value: sanitizeValue(row) }\n return Object.fromEntries(Object.entries(row).map(([key, value]) => [\n key,\n SENSITIVE_COLUMN.test(key) ? '[REDACTED]' : sanitizeValue(value),\n ]))\n })\n}\n\nfunction sanitizeValue(value: unknown): unknown {\n if (value === null || typeof value === 'number' || typeof value === 'boolean') return value\n if (value instanceof Date) return value.toISOString()\n if (typeof value === 'bigint') return value.toString()\n if (value instanceof Uint8Array) return `[binary:${value.byteLength} bytes]`\n const text = typeof value === 'string' ? value : JSON.stringify(value)\n return text.length <= 200 ? text : `${text.slice(0, 200)}...`\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n signal?.throwIfAborted()\n}\n\n/** Validate the query before it reaches a database driver. Providers also use a\n * read-only session where supported, but the plugin must reject writes itself. */\nexport function validateReadOnlySql(rawSql: string): string {\n const sql = rawSql.trim()\n if (sql === '') throw new Error('SQL cannot be empty')\n if (sql.length > 20_000) throw new Error('SQL is limited to 20000 characters')\n if (sql.includes(';') || sql.includes('--') || sql.includes('/*') || sql.includes('*/')) {\n throw new Error('Only one read-only SQL statement is allowed; comments and semicolons are not allowed')\n }\n if (!/^(?:select|with)\\b/i.test(sql)) throw new Error('Only SELECT or WITH queries are allowed')\n if (/\\b(?:insert|update|delete|drop|alter|create|truncate|grant|revoke|replace|merge|call|set|use|into|outfile|dumpfile)\\b/i.test(sql)) {\n throw new Error('The SQL contains a write or session-changing operation')\n }\n return sql\n}\n\nexport function queryLimit(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 100\n return Math.min(1000, Math.max(1, Math.trunc(value)))\n}\n\nexport function queryResult(columns: string[], rows: unknown[], limit: number, startedAt: number): SqlQueryResult {\n const truncated = rows.length > limit\n return {\n columns,\n rows: sanitizeRows(rows, limit),\n rowCount: Math.min(rows.length, limit),\n truncated,\n durationMs: Date.now() - startedAt,\n }\n}\n", "import mysql from 'mysql2/promise'\nimport type { RowDataPacket } from 'mysql2/promise'\nimport type { DataSourceDefinition, PhysicalColumn } from '../../types.js'\nimport type { DataSourceProvider, DiscoveredObject } from './provider.js'\nimport { queryLimit, queryResult, sanitizeRows, throwIfAborted, validateReadOnlySql } from './provider.js'\n\ninterface TableRow extends RowDataPacket {\n TABLE_SCHEMA: string\n TABLE_NAME: string\n TABLE_TYPE: string\n ENGINE: string | null\n TABLE_COMMENT: string | null\n}\n\ninterface ColumnRow extends RowDataPacket {\n TABLE_SCHEMA: string\n TABLE_NAME: string\n COLUMN_NAME: string\n COLUMN_TYPE: string\n IS_NULLABLE: string\n COLUMN_DEFAULT: unknown\n COLUMN_COMMENT: string | null\n COLUMN_KEY: string\n}\n\ninterface ForeignKeyRow extends RowDataPacket {\n TABLE_SCHEMA: string\n TABLE_NAME: string\n COLUMN_NAME: string\n REFERENCED_TABLE_SCHEMA: string\n REFERENCED_TABLE_NAME: string\n REFERENCED_COLUMN_NAME: string\n}\n\nexport class MysqlProvider implements DataSourceProvider {\n async test(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<void> {\n throwIfAborted(signal)\n const connection = await connect(source, password)\n try {\n await connection.query('SELECT 1')\n throwIfAborted(signal)\n } finally {\n await connection.end()\n }\n }\n\n async discover(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<DiscoveredObject[]> {\n const connection = await connect(source, password)\n try {\n const schemas = source.schemaInclude.length > 0 ? source.schemaInclude : [source.database]\n const placeholders = schemas.map(() => '?').join(', ')\n const [tables] = await connection.query<TableRow[]>(\n `SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, TABLE_COMMENT\n FROM information_schema.TABLES\n WHERE TABLE_SCHEMA IN (${placeholders})\n ORDER BY TABLE_SCHEMA, TABLE_NAME`,\n schemas,\n )\n const [columns] = await connection.query<ColumnRow[]>(\n `SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE,\n COLUMN_DEFAULT, COLUMN_COMMENT, COLUMN_KEY\n FROM information_schema.COLUMNS\n WHERE TABLE_SCHEMA IN (${placeholders})\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION`,\n schemas,\n )\n const [foreignKeys] = await connection.query<ForeignKeyRow[]>(\n `SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_SCHEMA,\n REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA IN (${placeholders})\n AND REFERENCED_TABLE_NAME IS NOT NULL\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION`,\n schemas,\n )\n const columnsByObject = groupColumns(columns, foreignKeys)\n const result: DiscoveredObject[] = []\n for (const table of tables) {\n throwIfAborted(signal)\n const qualified = `${quote(table.TABLE_SCHEMA)}.${quote(table.TABLE_NAME)}`\n const [ddlRows] = await connection.query<RowDataPacket[]>(`SHOW CREATE ${table.TABLE_TYPE === 'VIEW' ? 'VIEW' : 'TABLE'} ${qualified}`)\n const ddlRecord = ddlRows[0]\n const ddl = ddlRecord === undefined ? '' : String(ddlRecord['Create Table'] ?? ddlRecord['Create View'] ?? '')\n let sample: Array<Record<string, unknown>> = []\n if (source.sampleRows > 0) {\n const [rows] = await connection.query<RowDataPacket[]>(`SELECT * FROM ${qualified} LIMIT ${source.sampleRows}`)\n sample = sanitizeRows(rows, source.sampleRows)\n }\n result.push({\n schemaName: table.TABLE_SCHEMA,\n objectName: table.TABLE_NAME,\n objectType: table.TABLE_TYPE === 'VIEW' ? 'view' : 'table',\n ...(table.ENGINE === null ? {} : { engine: table.ENGINE }),\n ...(table.TABLE_COMMENT ? { comment: table.TABLE_COMMENT } : {}),\n ddl,\n columns: columnsByObject.get(`${table.TABLE_SCHEMA}\\0${table.TABLE_NAME}`) ?? [],\n sample,\n })\n }\n return result\n } finally {\n await connection.end()\n }\n }\n\n async query(source: DataSourceDefinition, password: string, rawSql: string, limit: number, signal?: AbortSignal) {\n const sql = validateReadOnlySql(rawSql)\n const bounded = queryLimit(limit)\n const startedAt = Date.now()\n throwIfAborted(signal)\n const connection = await connect(source, password)\n try {\n await connection.query('START TRANSACTION READ ONLY')\n const [rows, fields] = await connection.query<RowDataPacket[]>({ sql: `SELECT * FROM (${sql}) AS dsh_connect_query LIMIT ${bounded + 1}`, timeout: 30_000 })\n throwIfAborted(signal)\n const columns = (fields as Array<{ name: string }> | undefined)?.map(field => field.name) ?? Object.keys(rows[0] ?? {})\n return queryResult(columns, rows, bounded, startedAt)\n } finally {\n await connection.rollback().catch(() => {})\n await connection.end()\n }\n }\n}\n\nfunction connect(source: DataSourceDefinition, password: string) {\n return mysql.createConnection({\n host: source.host,\n port: source.port,\n user: source.username,\n password,\n database: source.database,\n connectTimeout: 10_000,\n ...(source.tls ? { ssl: {} } : {}),\n })\n}\n\nfunction groupColumns(rows: ColumnRow[], foreignKeys: ForeignKeyRow[]): Map<string, PhysicalColumn[]> {\n const result = new Map<string, PhysicalColumn[]>()\n const references = new Map(foreignKeys.map(row => [\n `${row.TABLE_SCHEMA}\\0${row.TABLE_NAME}\\0${row.COLUMN_NAME}`,\n { schemaName: row.REFERENCED_TABLE_SCHEMA, objectName: row.REFERENCED_TABLE_NAME, columnName: row.REFERENCED_COLUMN_NAME },\n ]))\n for (const row of rows) {\n const key = `${row.TABLE_SCHEMA}\\0${row.TABLE_NAME}`\n const list = result.get(key) ?? []\n list.push({\n name: row.COLUMN_NAME,\n type: row.COLUMN_TYPE,\n nullable: row.IS_NULLABLE === 'YES',\n defaultValue: row.COLUMN_DEFAULT === null ? null : String(row.COLUMN_DEFAULT),\n ...(row.COLUMN_COMMENT ? { comment: row.COLUMN_COMMENT } : {}),\n primaryKey: row.COLUMN_KEY === 'PRI',\n ...(references.get(`${row.TABLE_SCHEMA}\\0${row.TABLE_NAME}\\0${row.COLUMN_NAME}`) === undefined\n ? {}\n : { references: references.get(`${row.TABLE_SCHEMA}\\0${row.TABLE_NAME}\\0${row.COLUMN_NAME}`) }),\n })\n result.set(key, list)\n }\n return result\n}\n\nfunction quote(value: string): string {\n return `\\`${value.replaceAll('`', '``')}\\``\n}\n", "import { Client } from 'pg'\nimport type { QueryConfig, QueryResultRow } from 'pg'\nimport type { DataSourceDefinition, PhysicalColumn } from '../../types.js'\nimport type { DataSourceProvider, DiscoveredObject } from './provider.js'\nimport { queryLimit, queryResult, sanitizeRows, throwIfAborted, validateReadOnlySql } from './provider.js'\n\ninterface TableRow {\n table_schema: string\n table_name: string\n table_type: string\n table_comment: string | null\n}\n\ninterface ColumnRow {\n table_schema: string\n table_name: string\n column_name: string\n data_type: string\n udt_name: string\n is_nullable: string\n column_default: string | null\n column_comment: string | null\n primary_key: boolean\n}\n\ninterface ForeignKeyRow {\n table_schema: string\n table_name: string\n column_name: string\n referenced_table_schema: string\n referenced_table_name: string\n referenced_column_name: string\n}\n\nexport class PostgresqlProvider implements DataSourceProvider {\n async test(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<void> {\n const client = await connect(source, password)\n try {\n await queryRows(client, 'SELECT 1', [], signal)\n } finally {\n await client.end()\n }\n }\n\n async discover(source: DataSourceDefinition, password: string, signal?: AbortSignal): Promise<DiscoveredObject[]> {\n const client = await connect(source, password)\n try {\n const schemas = source.schemaInclude.length > 0 ? source.schemaInclude : ['public']\n const tables = await queryRows<TableRow>(client, `SELECT t.table_schema, t.table_name, t.table_type,\n obj_description((quote_ident(t.table_schema) || '.' || quote_ident(t.table_name))::regclass) AS table_comment\n FROM information_schema.tables t\n WHERE t.table_schema = ANY($1::text[])\n ORDER BY t.table_schema, t.table_name`, [schemas], signal)\n const columns = await queryRows<ColumnRow>(client, `SELECT c.table_schema, c.table_name, c.column_name, c.data_type, c.udt_name,\n c.is_nullable, c.column_default,\n col_description((quote_ident(c.table_schema) || '.' || quote_ident(c.table_name))::regclass, c.ordinal_position) AS column_comment,\n EXISTS (\n SELECT 1 FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.constraint_type = 'PRIMARY KEY'\n AND tc.table_schema = c.table_schema AND tc.table_name = c.table_name\n AND kcu.column_name = c.column_name\n ) AS primary_key\n FROM information_schema.columns c\n WHERE c.table_schema = ANY($1::text[])\n ORDER BY c.table_schema, c.table_name, c.ordinal_position`, [schemas], signal)\n const foreignKeys = await queryRows<ForeignKeyRow>(client, `SELECT fk.table_schema, fk.table_name, fk.column_name,\n pk.table_schema AS referenced_table_schema,\n pk.table_name AS referenced_table_name,\n pk.column_name AS referenced_column_name\n FROM information_schema.referential_constraints rc\n JOIN information_schema.key_column_usage fk\n ON fk.constraint_catalog = rc.constraint_catalog\n AND fk.constraint_schema = rc.constraint_schema\n AND fk.constraint_name = rc.constraint_name\n JOIN information_schema.key_column_usage pk\n ON pk.constraint_catalog = rc.unique_constraint_catalog\n AND pk.constraint_schema = rc.unique_constraint_schema\n AND pk.constraint_name = rc.unique_constraint_name\n AND pk.ordinal_position = fk.position_in_unique_constraint\n WHERE fk.table_schema = ANY($1::text[])\n ORDER BY fk.table_schema, fk.table_name, fk.ordinal_position`, [schemas], signal)\n const columnsByObject = groupColumns(columns, foreignKeys)\n const result: DiscoveredObject[] = []\n for (const table of tables) {\n throwIfAborted(signal)\n const objectColumns = columnsByObject.get(`${table.table_schema}\\0${table.table_name}`) ?? []\n const qualified = `${quote(table.table_schema)}.${quote(table.table_name)}`\n let sample: Array<Record<string, unknown>> = []\n if (source.sampleRows > 0) {\n const rows = await queryRows<Record<string, unknown>>(client, `SELECT * FROM ${qualified} LIMIT ${source.sampleRows}`, [], signal)\n sample = sanitizeRows(rows, source.sampleRows)\n }\n result.push({\n schemaName: table.table_schema,\n objectName: table.table_name,\n objectType: table.table_type === 'VIEW' ? 'view' : 'table',\n ...(table.table_comment ? { comment: table.table_comment } : {}),\n ddl: buildDdl(table.table_schema, table.table_name, objectColumns, table.table_type === 'VIEW'),\n columns: objectColumns,\n sample,\n })\n }\n return result\n } finally {\n await client.end()\n }\n }\n\n async query(source: DataSourceDefinition, password: string, rawSql: string, limit: number, signal?: AbortSignal) {\n const sql = validateReadOnlySql(rawSql)\n const bounded = queryLimit(limit)\n const startedAt = Date.now()\n const client = await connect(source, password)\n try {\n const result = await client.query<QueryResultRow>({ text: `SELECT * FROM (${sql}) AS dsh_connect_query LIMIT $1`, values: [bounded + 1], ...(signal === undefined ? {} : { signal }) } as QueryConfig<unknown[]>)\n throwIfAborted(signal)\n return queryResult(result.fields.map(field => field.name), result.rows, bounded, startedAt)\n } finally {\n await client.end()\n }\n }\n}\n\nasync function queryRows<T extends QueryResultRow>(\n client: Client,\n text: string,\n values: unknown[],\n signal?: AbortSignal,\n): Promise<T[]> {\n throwIfAborted(signal)\n const config = {\n text,\n ...(values.length === 0 ? {} : { values }),\n ...(signal === undefined ? {} : { signal }),\n } as QueryConfig<unknown[]>\n const result = await client.query<T>(config)\n throwIfAborted(signal)\n return result.rows\n}\n\nasync function connect(source: DataSourceDefinition, password: string): Promise<Client> {\n const client = new Client({\n host: source.host,\n port: source.port,\n user: source.username,\n password,\n database: source.database,\n connectionTimeoutMillis: 10_000,\n statement_timeout: 30_000,\n ssl: source.tls ? { rejectUnauthorized: true } : false,\n })\n await client.connect()\n await client.query('SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY')\n return client\n}\n\nfunction groupColumns(rows: ColumnRow[], foreignKeys: ForeignKeyRow[]): Map<string, PhysicalColumn[]> {\n const result = new Map<string, PhysicalColumn[]>()\n const references = new Map(foreignKeys.map(row => [\n `${row.table_schema}\\0${row.table_name}\\0${row.column_name}`,\n { schemaName: row.referenced_table_schema, objectName: row.referenced_table_name, columnName: row.referenced_column_name },\n ]))\n for (const row of rows) {\n const key = `${row.table_schema}\\0${row.table_name}`\n const list = result.get(key) ?? []\n list.push({\n name: row.column_name,\n type: row.data_type === 'USER-DEFINED' ? row.udt_name : row.data_type,\n nullable: row.is_nullable === 'YES',\n defaultValue: row.column_default,\n ...(row.column_comment ? { comment: row.column_comment } : {}),\n primaryKey: row.primary_key,\n ...(references.get(`${row.table_schema}\\0${row.table_name}\\0${row.column_name}`) === undefined\n ? {}\n : { references: references.get(`${row.table_schema}\\0${row.table_name}\\0${row.column_name}`) }),\n })\n result.set(key, list)\n }\n return result\n}\n\nfunction buildDdl(schema: string, table: string, columns: PhysicalColumn[], view: boolean): string {\n if (view) return `CREATE VIEW ${quote(schema)}.${quote(table)} AS /* definition not exposed by information_schema */;`\n const definitions = columns.map(column => {\n const suffix = [column.nullable ? '' : 'NOT NULL', column.defaultValue == null ? '' : `DEFAULT ${column.defaultValue}`]\n .filter(Boolean).join(' ')\n return ` ${quote(column.name)} ${column.type}${suffix === '' ? '' : ` ${suffix}`}`\n })\n const primary = columns.filter(column => column.primaryKey).map(column => quote(column.name))\n if (primary.length > 0) definitions.push(` PRIMARY KEY (${primary.join(', ')})`)\n for (const column of columns) {\n if (column.references !== undefined) {\n definitions.push(` FOREIGN KEY (${quote(column.name)}) REFERENCES ${quote(column.references.schemaName)}.${quote(column.references.objectName)} (${quote(column.references.columnName)})`)\n }\n }\n return `CREATE TABLE ${quote(schema)}.${quote(table)} (\\n${definitions.join(',\\n')}\\n);`\n}\n\nfunction quote(value: string): string {\n return `\"${value.replaceAll('\"', '\"\"')}\"`\n}\n", "import type { DatabaseType } from '../../types.js'\nimport type { DataSourceProvider } from './provider.js'\nimport { ClickhouseProvider } from './clickhouse.js'\nimport { MysqlProvider } from './mysql.js'\nimport { PostgresqlProvider } from './postgresql.js'\n\nconst providers: Record<DatabaseType, DataSourceProvider> = {\n mysql: new MysqlProvider(),\n postgresql: new PostgresqlProvider(),\n clickhouse: new ClickhouseProvider(),\n}\n\nexport function providerFor(type: DatabaseType): DataSourceProvider {\n return providers[type]\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport { BlockAssembler, createUserMessage, deepFreeze } from '@deepseek-ai/dsh-llm'\nimport { z } from 'zod'\nimport type { DiscoveredObject } from '../datasource/provider.js'\nimport type { SemanticColumn } from '../../types.js'\n\nexport interface SemanticProfile {\n term: string\n description: string\n tags: string[]\n synonyms: string[]\n semanticColumns: SemanticColumn[]\n confidence: number\n confidenceReason: string\n temporary: boolean\n modelProvider?: string\n modelName?: string\n modelReasoningEffort?: string\n modelAnalyzedAt?: number\n modelStatus: 'heuristic' | 'ai' | 'failed'\n}\n\nexport const METADATA_MODEL_PROMPT_VERSION = 'v3'\n\nexport interface MetadataModelRoute {\n provider: string\n model: string\n reasoningEffort?: string\n}\n\nexport class MetadataModelOutputError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'MetadataModelOutputError'\n }\n}\n\nconst stringList = (maxItems: number, maxLength: number) => z.preprocess(\n value => normalizeStringList(value, maxItems, maxLength),\n z.array(z.string().max(maxLength)).max(maxItems),\n)\n\nconst semanticProfileSchema = z.object({\n term: z.string().max(100),\n description: z.string().max(500),\n tags: stringList(20, 50),\n synonyms: stringList(30, 100),\n columns: z.array(z.object({\n name: z.string(),\n term: z.string().max(100),\n description: z.string().max(300),\n synonyms: stringList(20, 100),\n enums: stringList(50, 100),\n role: z.enum(['identifier', 'dimension', 'measure', 'time', 'unknown']).default('unknown'),\n })).max(500),\n confidence: z.number().refine(Number.isFinite, 'confidence must be a finite number'),\n confidenceReason: z.string().max(500),\n temporary: z.boolean(),\n})\n\ninterface DefaultModelLike {\n currentSelection(): MetadataModelRoute\n}\n\ninterface LlmLike {\n stream(options: Parameters<Context['llm']['stream']>[0]): ReturnType<Context['llm']['stream']>\n}\n\nexport class MetadataEnricher {\n constructor(private readonly ctx: Context) {}\n\n async enrich(object: DiscoveredObject, useAi: boolean, signal?: AbortSignal, selectedRoute?: MetadataModelRoute): Promise<SemanticProfile> {\n const fallback = heuristicProfile(object)\n if (!useAi) return fallback\n const llm = this.ctx.get('llm') as LlmLike | undefined\n const defaults = this.ctx.get('agentDefaultModel') as DefaultModelLike | undefined\n if (llm === undefined || defaults === undefined) {\n return { ...fallback, modelStatus: 'failed', confidenceReason: `${fallback.confidenceReason}; DSH model service unavailable` }\n }\n try {\n signal?.throwIfAborted()\n const route = selectedRoute ?? defaults.currentSelection()\n const input = JSON.stringify({\n schema: object.schemaName,\n name: object.objectName,\n type: object.objectType,\n comment: object.comment ?? '',\n ddl: object.ddl.slice(0, 16_000),\n columns: object.columns,\n })\n const messages = [createUserMessage({\n content: [{ type: 'text', text: input }],\n source: { kind: 'plugin', plugin: 'dsh-connect' },\n })]\n const assembler = new BlockAssembler()\n const options = deepFreeze({\n provider: route.provider,\n model: route.model,\n messages,\n system: SYSTEM_PROMPT,\n temperature: 0.1,\n maxTokens: 12_000,\n ...(signal === undefined ? {} : { signal }),\n })\n for await (const chunk of llm.stream(options)) assembler.push(chunk)\n if (assembler.finish.kind !== 'stop') throw new Error(`model stopped with ${assembler.finish.kind}`)\n const text = assembler.blocks()\n .filter((block): block is Extract<(ReturnType<BlockAssembler['blocks']>)[number], { type: 'text' }> => block.type === 'text')\n .map(block => block.text)\n .join('\\n')\n let parsed: z.infer<typeof semanticProfileSchema>\n try {\n parsed = semanticProfileSchema.parse(parseJson(text))\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new MetadataModelOutputError(`AI \u5143\u6570\u636E\u7ED3\u679C\u683C\u5F0F\u65E0\u6548\uFF1A${formatIssues(error)}`, { cause: error })\n }\n throw new MetadataModelOutputError('AI \u5143\u6570\u636E\u7ED3\u679C\u4E0D\u662F\u6709\u6548 JSON', { cause: error })\n }\n const knownColumns = new Set(object.columns.map(column => column.name))\n const parsedColumns = new Map(parsed.columns.filter(column => knownColumns.has(column.name)).map(column => [column.name, column]))\n return {\n term: parsed.term,\n description: parsed.description,\n tags: [...new Set(parsed.tags)],\n synonyms: [...new Set(parsed.synonyms)],\n semanticColumns: object.columns.map(column => {\n const semantic = parsedColumns.get(column.name)\n const fallbackColumn = fallback.semanticColumns.find(item => item.name === column.name)\n return {\n name: column.name,\n term: semantic?.term ?? fallbackColumn?.term ?? column.name,\n description: semantic?.description ?? fallbackColumn?.description ?? '',\n synonyms: semantic?.synonyms ?? fallbackColumn?.synonyms ?? [],\n enums: semantic?.enums ?? fallbackColumn?.enums ?? [],\n role: normalizeRole(semantic?.role ?? fallbackColumn?.role ?? 'unknown', column),\n }\n }),\n confidence: normalizeConfidence(parsed.confidence),\n confidenceReason: parsed.confidenceReason,\n temporary: parsed.temporary,\n modelProvider: route.provider,\n modelName: route.model,\n ...(route.reasoningEffort === undefined ? {} : { modelReasoningEffort: route.reasoningEffort }),\n modelAnalyzedAt: Date.now(),\n modelStatus: 'ai',\n }\n } catch (error) {\n if (signal?.aborted) throw error\n return {\n ...fallback,\n modelStatus: 'failed',\n ...(selectedRoute === undefined ? {} : { modelProvider: selectedRoute.provider, modelName: selectedRoute.model, modelAnalyzedAt: Date.now() }),\n confidenceReason: `${fallback.confidenceReason}; AI enrichment failed: ${safeError(error)}`.slice(0, 500),\n }\n }\n }\n}\n\nconst SYSTEM_PROMPT = `You are a database metadata governance specialist. Infer semantic metadata only from the supplied JSON physical metadata. Never invent rows, metrics, or business rules. Return one JSON object with exactly these fields: term, description, tags, columns, confidence, confidenceReason, temporary, synonyms. columns is an array of {name, term, description, synonyms, enums, role} using only physical column names. role must be one of identifier, dimension, measure, time, unknown. Role rules are strict: primary keys, explicit foreign keys, columns with a references object, and obvious identifiers such as *_id, *_key, *_code, *_uuid, *_no, or comments containing ID/\u7F16\u53F7/\u7F16\u7801/\u6807\u8BC6 must be identifier, even when they can also be used for filtering. A foreign-key identifier must never be dimension. Use dimension only for descriptive or categorical attributes such as name, status, type, region, or category. Use measure only for numeric amounts, counts, quantities, rates, or scores; use time only for dates and timestamps. Preserve every physical column in the response. confidence may be either a probability from 0 to 1 or a score from 0 to 100; it will be normalized by the host. Return JSON only, without Markdown.`\n\nfunction heuristicProfile(object: DiscoveredObject): SemanticProfile {\n const temporary = /(?:^|_)(?:tmp|temp|test|bak|backup|stg|stage|cache)(?:_|$)/i.test(object.objectName)\n let confidence = temporary ? 35 : 85\n const reasons: string[] = []\n if (temporary) reasons.push('object name indicates temporary, test, staging, backup, or cache data')\n if (!object.columns.some(column => column.primaryKey)) {\n confidence -= 10\n reasons.push('no primary key was discovered')\n }\n if (!object.comment && object.columns.every(column => !column.comment)) {\n confidence -= 10\n reasons.push('database comments are absent')\n }\n if (object.sample.length === 0) {\n confidence -= 5\n reasons.push('sample data was disabled or unavailable')\n }\n return {\n term: object.comment?.trim() || humanize(object.objectName),\n description: object.comment?.trim() || `${object.objectType} ${object.schemaName}.${object.objectName}`,\n tags: [object.objectType, ...(object.engine ? [object.engine] : []), ...(temporary ? ['temporary'] : [])],\n synonyms: [],\n semanticColumns: object.columns.map(column => ({\n name: column.name,\n term: column.comment?.trim() || humanize(column.name),\n description: column.comment?.trim() || `${column.type}${column.nullable ? ', nullable' : ', required'}`,\n synonyms: [],\n enums: [],\n role: fallbackRole(column),\n })),\n confidence: Math.max(0, confidence),\n confidenceReason: reasons.join('; ') || 'physical metadata is complete',\n temporary,\n modelStatus: 'heuristic',\n }\n}\n\nfunction humanize(value: string): string {\n return value.replaceAll(/[_-]+/g, ' ').replaceAll(/\\s+/g, ' ').trim()\n}\n\nfunction normalizeConfidence(value: number): number {\n const score = value >= 0 && value <= 1 ? value * 100 : value\n return Math.max(0, Math.min(100, Math.round(score)))\n}\n\nfunction normalizeStringList(value: unknown, maxItems: number, maxLength: number): string[] {\n const items = Array.isArray(value)\n ? value\n : value !== null && typeof value === 'object'\n ? Object.entries(value).map(([key, item]) => `${key}: ${String(item)}`)\n : value === undefined || value === null || value === '' ? [] : [value]\n return [...new Set(items.map(item => String(item).trim().slice(0, maxLength)).filter(Boolean))].slice(0, maxItems)\n}\n\nfunction normalizeRole(role: SemanticColumn['role'], column: DiscoveredObject['columns'][number]): SemanticColumn['role'] {\n if (column.primaryKey || column.references !== undefined || isIdentifierName(column.name) || isIdentifierComment(column.comment)) return 'identifier'\n return role\n}\n\nfunction fallbackRole(column: DiscoveredObject['columns'][number]): SemanticColumn['role'] {\n if (column.primaryKey || column.references !== undefined || isIdentifierName(column.name) || isIdentifierComment(column.comment)) return 'identifier'\n if (/(?:date|time|timestamp|year|month|day)(?:$|_)/i.test(column.name) || /(?:date|time|timestamp)/i.test(column.type)) return 'time'\n if (/(?:amount|price|cost|total|balance|quantity|count|num|score|points|rate|ratio)(?:$|_)/i.test(column.name) && /(?:int|decimal|numeric|float|double|real)/i.test(column.type)) return 'measure'\n if (/(?:name|status|state|type|category|region|country|city|flag)(?:$|_)/i.test(column.name)) return 'dimension'\n return 'unknown'\n}\n\nfunction isIdentifierName(name: string): boolean {\n return /(?:^|_)(?:id|key|code|uuid|no)(?:$|_)/i.test(name)\n}\n\nfunction isIdentifierComment(comment: string | undefined): boolean {\n return comment !== undefined && /(?:\\bid\\b|\\bidentifier\\b|\u7F16\u53F7|\u7F16\u7801|\u6807\u8BC6)/i.test(comment)\n}\n\nfunction formatIssues(error: z.ZodError): string {\n return error.issues.slice(0, 3).map(issue => `${issue.path.join('.')} ${issue.message}`).join('; ')\n}\n\nfunction parseJson(text: string): unknown {\n const trimmed = text.trim().replace(/^```(?:json)?\\s*/i, '').replace(/\\s*```$/, '')\n const start = trimmed.indexOf('{')\n const end = trimmed.lastIndexOf('}')\n if (start < 0 || end <= start) throw new Error('model returned no JSON object')\n return JSON.parse(trimmed.slice(start, end + 1))\n}\n\nfunction safeError(error: unknown): string {\n return (error instanceof Error ? error.message : String(error)).replaceAll(/[\\r\\n]+/g, ' ').slice(0, 160)\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport { defineTool } from '@deepseek-ai/dsh-tools'\nimport type { ConnectStore } from '../store.js'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport { providerFor } from '../datasource/index.js'\nimport { metadataYaml } from './governance.js'\nimport { queryLimit } from '../datasource/provider.js'\n\nconst jsonOutput = {\n schema: { type: 'json' as const },\n render: (_args: unknown, value: unknown) => [{ type: 'text' as const, text: JSON.stringify(value, null, 2) }],\n}\n\nexport function registerMetadataTools(ctx: Context, store: ConnectStore): Array<() => void> {\n return [\n ctx.tools.register(defineTool({\n name: 'dsh_connect_list_data_sources',\n description: 'List configured data sources that have metadata available. This exposes connection names and metadata counts, never credentials or host addresses.',\n parameters: {},\n output: jsonOutput,\n isConcurrencySafe: () => true,\n async execute() {\n const views = await store.dataSourceViews()\n return views.filter(source => source.enabled).map(source => ({\n id: source.id,\n name: source.name,\n type: source.type,\n database: source.database,\n profileCount: source.profileCount,\n lastScanStatus: source.latestJob?.status ?? 'never-scanned',\n }))\n },\n presentCall: () => ({ card: 'generic', title: 'List data sources', kind: 'read' }),\n })),\n ctx.tools.register(defineTool({\n name: 'dsh_connect_search_metadata',\n description: 'Search recognized table, view, and column metadata. Use this to understand available data structures; it does not query business rows or execute SQL.',\n parameters: {\n query: { type: 'string', required: true, description: 'Name, semantic term, description, tag, or column text to search.' },\n sourceId: { type: 'string', description: 'Optional exact data source id from dsh_connect_list_data_sources.' },\n limit: { type: 'integer', description: 'Optional result limit from 1 to 20. Default 10.' },\n },\n output: jsonOutput,\n isConcurrencySafe: () => true,\n execute(args) {\n const query = args.query.trim().toLocaleLowerCase()\n if (query === '') throw new Error('query must not be blank')\n const limit = Math.min(20, Math.max(1, args.limit ?? 10))\n const results = store.profiles(args.sourceId).filter(profile => {\n const haystack = [\n profile.schemaName,\n profile.objectName,\n profile.term,\n profile.description,\n profile.tags.join(' '),\n profile.columns.map(column => `${column.name} ${column.comment ?? ''}`).join(' '),\n profile.semanticColumns.map(column => `${column.name} ${column.term} ${column.description}`).join(' '),\n ].join(' ').toLocaleLowerCase()\n return haystack.includes(query)\n }).slice(0, limit)\n return Promise.resolve(results.map(profile => ({\n id: profile.id,\n sourceId: profile.sourceId,\n schema: profile.schemaName,\n name: profile.objectName,\n type: profile.objectType,\n term: profile.term,\n description: profile.description,\n tags: profile.tags,\n confidence: profile.confidence,\n temporary: profile.temporary,\n ignored: profile.ignored,\n columns: profile.semanticColumns.map(column => ({ name: column.name, term: column.term })),\n })))\n },\n presentCall: args => ({ card: 'generic', title: `Search metadata: ${args.query}`, kind: 'search' }),\n })),\n ctx.tools.register(defineTool({\n name: 'dsh_connect_get_table_metadata',\n description: 'Read one recognized table or view metadata profile by the exact profile id returned by dsh_connect_search_metadata. It returns schema and semantic metadata, never sample rows.',\n parameters: {\n profileId: { type: 'string', required: true, description: 'Exact metadata profile id.' },\n },\n output: jsonOutput,\n isConcurrencySafe: () => true,\n execute(args) {\n const profile = store.profile(args.profileId)\n if (profile === undefined) throw new Error('Metadata profile not found')\n return Promise.resolve({\n id: profile.id,\n sourceId: profile.sourceId,\n schema: profile.schemaName,\n name: profile.objectName,\n type: profile.objectType,\n ...(profile.engine === undefined ? {} : { engine: profile.engine }),\n ...(profile.comment === undefined ? {} : { databaseComment: profile.comment }),\n ddl: profile.ddl,\n columns: profile.columns.map(column => {\n const semantic = profile.semanticColumns.find(item => item.name === column.name)\n return {\n name: column.name,\n type: column.type,\n nullable: column.nullable,\n primaryKey: column.primaryKey,\n ...(column.defaultValue === undefined ? {} : { defaultValue: column.defaultValue }),\n ...(column.comment === undefined ? {} : { comment: column.comment }),\n ...(column.references === undefined ? {} : { references: column.references }),\n ...(semantic === undefined ? {} : { semantic }),\n }\n }),\n term: profile.term,\n description: profile.description,\n tags: profile.tags,\n confidence: profile.confidence,\n confidenceReason: profile.confidenceReason,\n temporary: profile.temporary,\n ignored: profile.ignored,\n profiledAt: profile.profiledAt,\n })\n },\n presentCall: () => ({ card: 'generic', title: 'Read table metadata', kind: 'read' }),\n })),\n ctx.tools.register(defineTool({\n name: 'dsh_connect_query_data_source',\n description: 'Execute a bounded read-only SELECT or WITH query against a configured data source. Never use this for writes or schema changes.',\n parameters: {\n sourceId: { type: 'string', required: true, description: 'Exact data source id.' },\n sql: { type: 'string', required: true, description: 'One SELECT or WITH query. No semicolon or comments.' },\n limit: { type: 'integer', description: 'Maximum rows, 1 to 1000. Default 100.' },\n },\n output: jsonOutput,\n isConcurrencySafe: () => false,\n async execute(args, exec) {\n const source = store.dataSource(args.sourceId)\n if (source === undefined) throw new Error('Data source not found')\n if (!source.enabled) throw new Error('Data source is disabled')\n const password = await ctx.credentials.resolve(credentialRef(source.credentialRef))\n if (password === undefined) throw new Error('Database credential is not configured')\n return JSON.parse(JSON.stringify(await providerFor(source.type).query(source, password.value, args.sql, queryLimit(args.limit), exec.signal)))\n },\n presentCall: args => ({ card: 'generic', title: `Query ${args.sourceId}`, kind: 'read' }),\n })),\n ctx.tools.register(defineTool({\n name: 'dsh_connect_export_metadata_yaml',\n description: 'Export recognized metadata and metrics as YAML text for review or version control.',\n parameters: { sourceId: { type: 'string', required: true } },\n output: { schema: { type: 'string' as const }, render: (_args: unknown, value: unknown) => [{ type: 'text' as const, text: String(value) }] },\n isConcurrencySafe: () => true,\n async execute(args) { return metadataYaml(store.profiles(args.sourceId), store.metrics(args.sourceId), args.sourceId) },\n presentCall: () => ({ card: 'generic', title: 'Export metadata YAML', kind: 'read' }),\n })),\n ]\n}\n", "import type {\n MetadataProfile,\n MetricDefinition,\n MetricSuggestion,\n} from '../../types.js'\n\nexport function recommendMetrics(profiles: MetadataProfile[], sourceId: string, existing: MetricDefinition[]): MetricSuggestion[] {\n const result: MetricSuggestion[] = []\n const known = new Set(existing.filter(metric => metric.sourceId === sourceId).map(metric => `${metric.profileId}:${metric.columnName}:${metric.aggregation}`))\n for (const profile of profiles) {\n if (profile.sourceId !== sourceId || profile.ignored) continue\n const identifier = profile.columns.find(column => column.primaryKey)\n if (!known.has(`${profile.id}::count`)) {\n result.push({\n profileId: profile.id,\n name: `${profile.objectName}_count`,\n term: `${profile.term || profile.objectName}\u6570\u91CF`,\n description: `\u7EDF\u8BA1${profile.term || profile.objectName}\u8BB0\u5F55\u6570`,\n aggregation: 'count',\n columnName: '',\n expression: 'COUNT(*)',\n unit: '\u6761',\n reason: '\u6BCF\u4E2A\u4E1A\u52A1\u8868\u90FD\u53EF\u63D0\u4F9B\u8BB0\u5F55\u6570\u6307\u6807',\n })\n }\n for (const column of profile.columns) {\n if (column.primaryKey || !isNumeric(column.type) || known.has(`${profile.id}:${column.name}:sum`)) continue\n const label = profile.semanticColumns.find(item => item.name === column.name)?.term || column.comment || column.name\n const lower = column.name.toLowerCase()\n const aggregation = /(?:amount|price|cost|total|balance|quantity|count|num|score|points|\u91D1\u989D|\u6570\u91CF|\u4F59\u989D|\u79EF\u5206)/i.test(lower) ? 'sum' : 'avg'\n result.push({\n profileId: profile.id,\n name: `${profile.objectName}_${column.name}_${aggregation}`,\n term: `${profile.term || profile.objectName}${label}${aggregation === 'sum' ? '\u5408\u8BA1' : '\u5E73\u5747\u503C'}`,\n description: `${aggregation === 'sum' ? '\u6C47\u603B' : '\u8BA1\u7B97\u5E73\u5747'}\u5B57\u6BB5 ${label}`,\n aggregation,\n columnName: column.name,\n expression: `${aggregation.toUpperCase()}(${quoteIdentifier(column.name)})`,\n unit: '',\n reason: `\u5B57\u6BB5\u7C7B\u578B ${column.type} \u9002\u5408${aggregation === 'sum' ? '\u6C42\u548C' : '\u6C42\u5E73\u5747'}`,\n })\n if (result.length >= 50) return result\n }\n if (identifier === undefined && result.length >= 50) break\n }\n return result.slice(0, 50)\n}\n\nexport function metadataYaml(profiles: MetadataProfile[], metrics: MetricDefinition[], sourceId: string): string {\n const lines = ['version: 1', `sourceId: ${yamlScalar(sourceId)}`, 'tables:']\n for (const profile of profiles.filter(item => item.sourceId === sourceId)) {\n lines.push(` - id: ${yamlScalar(profile.id)}`, ` name: ${yamlScalar(`${profile.schemaName}.${profile.objectName}`)}`, ` type: ${yamlScalar(profile.objectType)}`, ` term: ${yamlScalar(profile.term)}`, ` description: ${yamlScalar(profile.description)}`, ` synonyms: ${yamlList(profile.synonyms)}`, ` tags: ${yamlList(profile.tags)}`, ` ignored: ${String(profile.ignored)}`, ' columns:')\n for (const column of profile.columns) {\n const semantic = profile.semanticColumns.find(item => item.name === column.name)\n lines.push(` - name: ${yamlScalar(column.name)}`, ` type: ${yamlScalar(column.type)}`, ` nullable: ${String(column.nullable)}`, ` primaryKey: ${String(column.primaryKey)}`, ` term: ${yamlScalar(semantic?.term ?? column.comment ?? '')}`, ` description: ${yamlScalar(semantic?.description ?? '')}`, ` synonyms: ${yamlList(semantic?.synonyms ?? [])}`, ` enums: ${yamlList(semantic?.enums ?? [])}`)\n }\n }\n lines.push('metrics:')\n for (const metric of metrics.filter(item => item.sourceId === sourceId)) {\n lines.push(` - id: ${yamlScalar(metric.id)}`, ` name: ${yamlScalar(metric.name)}`, ` term: ${yamlScalar(metric.term)}`, ` profileId: ${yamlScalar(metric.profileId)}`, ` aggregation: ${yamlScalar(metric.aggregation)}`, ` columnName: ${yamlScalar(metric.columnName)}`, ` expression: ${yamlScalar(metric.expression)}`, ` description: ${yamlScalar(metric.description)}`)\n }\n return `${lines.join('\\n')}\\n`\n}\nfunction isNumeric(type: string): boolean { return /(?:int|decimal|numeric|number|float|double|real|money|serial)/i.test(type) }\nfunction quoteIdentifier(value: string): string { return `\"${value.replaceAll('\"', '\"\"')}\"` }\nfunction yamlScalar(value: string): string { return JSON.stringify(value ?? '') }\nfunction yamlList(values: string[]): string { return `[${values.map(yamlScalar).join(', ')}]` }\n", "import { randomUUID } from 'node:crypto'\nimport type { Context } from '@deepseek-ai/cordis'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport type { RpcResult } from '@deepseek-ai/dsh-host-apiproxy/api'\nimport { z } from 'zod'\nimport {\n apiDefinitionSchema,\n apiMethodSchema,\n apiParameterSchema,\n dataSourceSchema,\n databaseTypeSchema,\n type ApiAuth,\n type ApiDefinition,\n type DataSourceDefinition,\n type MetadataProfile,\n} from '../types.js'\nimport { ConnectStore } from './store.js'\nimport { providerFor } from './datasource/index.js'\nimport { metadataYaml, recommendMetrics } from './metadata/governance.js'\nimport { MetadataProfiler } from './metadata/profiler.js'\nimport { ApiToolRegistry } from './http/tools.js'\nimport { SecureHttpExecutor } from './http/executor.js'\nimport type { ConversationApiInput } from './http/conversation-api.js'\nimport { assertSafeHeaderName, parseConfiguredBaseUrl } from './http/security.js'\n\nconst idInput = z.object({ id: z.string().uuid() })\nconst sourceInput = z.object({ sourceId: z.string().uuid() })\nconst scanInput = z.object({ sourceId: z.string().uuid(), mode: z.enum(['incremental', 'rebuild-ai', 'full']).default('incremental') })\nconst metadataListInput = z.object({ sourceId: z.string().uuid().optional() })\nconst profileInput = z.object({ id: z.string().min(1) })\nconst apiTestInput = z.object({ id: z.string().uuid(), args: z.record(z.string(), z.unknown()).default({}) })\nconst queryInput = z.object({ sourceId: z.string().uuid(), sql: z.string().min(1).max(20_000), limit: z.number().int().min(1).max(1000).default(100) })\nconst metricsListInput = z.object({ sourceId: z.string().uuid() })\nconst metricSaveInput = z.object({\n id: z.string().uuid().optional(), sourceId: z.string().uuid(), profileId: z.string().min(1),\n name: z.string().min(1).max(120), term: z.string().min(1).max(120), description: z.string().max(500).default(''),\n aggregation: z.enum(['count', 'sum', 'avg', 'min', 'max', 'formula']), columnName: z.string().max(255).default(''),\n expression: z.string().max(2000), unit: z.string().max(50).default(''), tags: z.array(z.string().max(50)).max(20).default([]), enabled: z.boolean().default(true),\n})\nconst metricBatchSaveInput = z.object({ metrics: z.array(metricSaveInput).min(1).max(5000) })\nconst profileUpdateInput = z.object({\n id: z.string().min(1), term: z.string().max(100).optional(), description: z.string().max(500).optional(), tags: z.array(z.string().max(50)).max(20).optional(),\n synonyms: z.array(z.string().max(100)).max(30).optional(), ignored: z.boolean().optional(), semanticColumns: z.array(z.object({ name: z.string(), term: z.string().max(100), description: z.string().max(300), synonyms: z.array(z.string().max(100)).max(20).default([]), enums: z.array(z.string().max(100)).max(50).default([]), role: z.enum(['identifier', 'dimension', 'measure', 'time', 'unknown']).default('unknown') })).optional(),\n})\n\nconst saveDataSourceInput = z.object({\n id: z.string().uuid().optional(),\n name: z.string().min(1).max(100),\n type: databaseTypeSchema,\n host: z.string().min(1).max(255),\n port: z.number().int().min(1).max(65535),\n database: z.string().min(1).max(255),\n username: z.string().min(1).max(255),\n secret: z.string().min(1).optional(),\n schemaInclude: z.array(z.string().min(1).max(255)).max(100).default([]),\n tls: z.boolean().default(false),\n sampleRows: z.number().int().min(0).max(3).default(0),\n aiEnrichment: z.boolean().default(false),\n enabled: z.boolean().default(true),\n})\n\nconst saveAuthInput = z.discriminatedUnion('type', [\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('bearer') }),\n z.object({ type: z.literal('api-key'), location: z.enum(['header', 'query']), name: z.string().min(1).max(100) }),\n z.object({ type: z.literal('basic'), username: z.string().min(1).max(200) }),\n])\n\nconst saveApiInput = z.object({\n id: z.string().uuid().optional(),\n name: z.string().min(1).max(100),\n slug: z.string().min(2).max(48).regex(/^[a-z][a-z0-9_]*$/),\n description: z.string().min(1).max(1000),\n method: apiMethodSchema,\n baseUrl: z.string().url().max(2048),\n pathTemplate: z.string().min(1).max(2048).default('/'),\n parameters: z.array(apiParameterSchema).max(50).default([]),\n auth: saveAuthInput,\n secret: z.string().min(1).optional(),\n timeoutMs: z.number().int().min(1000).max(120000).default(30000),\n maxResponseBytes: z.number().int().min(1024).max(2 * 1024 * 1024).default(131072),\n responsePointer: z.string().max(500).default(''),\n allowPrivateNetwork: z.boolean().default(false),\n enabled: z.boolean().default(true),\n})\n\nexport class ConnectRpc {\n private readonly executor: SecureHttpExecutor\n\n constructor(\n private readonly ctx: Context,\n private readonly store: ConnectStore,\n private readonly profiler: MetadataProfiler,\n private readonly tools: ApiToolRegistry,\n ) {\n this.executor = new SecureHttpExecutor(ctx)\n }\n\n async handle(endpoint: string, payload: unknown, signal: AbortSignal): Promise<RpcResult<unknown>> {\n try {\n switch (endpoint) {\n case 'sources/list': return ok(await this.store.dataSourceViews())\n case 'sources/save': return ok(await this.saveDataSource(saveDataSourceInput.parse(payload)))\n case 'sources/delete': return ok(await this.deleteDataSource(idInput.parse(payload).id))\n case 'sources/test': {\n const source = this.requireSource(idInput.parse(payload).id)\n await this.profiler.test(source, signal)\n return ok({ connected: true })\n }\n case 'sources/scan': {\n const input = scanInput.parse(payload)\n return ok(await this.profiler.start(input.sourceId, input.mode))\n }\n case 'sources/cancel': {\n return ok(await this.profiler.cancel(sourceInput.parse(payload).sourceId))\n }\n case 'sources/query': {\n const input = queryInput.parse(payload)\n const source = this.requireSource(input.sourceId)\n if (!source.enabled) throw new Error('Data source is disabled')\n const password = await this.ctx.credentials.resolve(credentialRef(source.credentialRef))\n if (password === undefined) throw new Error('Database credential is not configured')\n return ok(await providerFor(source.type).query(source, password.value, input.sql, input.limit, signal))\n }\n case 'jobs/list': return ok(this.store.jobs(sourceInput.parse(payload).sourceId))\n case 'metadata/list': return ok(this.store.profiles(metadataListInput.parse(payload).sourceId))\n case 'metadata/get': {\n const profile = this.store.profile(profileInput.parse(payload).id)\n if (profile === undefined) throw new Error('Metadata profile not found')\n return ok(profile)\n }\n case 'metadata/update': return ok(await this.updateMetadata(profileUpdateInput.parse(payload)))\n case 'metadata/yaml': {\n const input = sourceInput.parse(payload)\n return ok(metadataYaml(this.store.profiles(input.sourceId), this.store.metrics(input.sourceId), input.sourceId))\n }\n case 'metadata/changes': {\n const input = z.object({\n sourceId: z.string().uuid(),\n profileId: z.string().min(1).optional(),\n offset: z.number().int().min(0).default(0),\n limit: z.number().int().min(1).max(100).default(20),\n }).parse(payload)\n return ok(this.store.changePage(input.sourceId, input.profileId, input.offset, input.limit))\n }\n case 'metrics/list': return ok(this.store.metrics(metricsListInput.parse(payload).sourceId))\n case 'metrics/recommend': {\n const input = metricsListInput.parse(payload)\n return ok(recommendMetrics(this.store.profiles(input.sourceId), input.sourceId, this.store.metrics(input.sourceId)))\n }\n case 'metrics/save': return ok(await this.saveMetric(metricSaveInput.parse(payload)))\n case 'metrics/save-batch': {\n const input = metricBatchSaveInput.parse(payload)\n const saved = []\n for (const metric of input.metrics) saved.push(await this.saveMetric(metric))\n return ok({ saved: saved.length })\n }\n case 'metrics/delete': {\n const metric = this.store.metric(idInput.parse(payload).id)\n if (metric === undefined) throw new Error('Metric not found')\n await this.store.deleteMetric(metric.id)\n await this.store.putChange({ id: randomUUID(), sourceId: metric.sourceId, profileId: metric.profileId, action: 'update', summary: `\u5220\u9664\u6307\u6807\uFF1A${metric.term}`, before: { metric }, changedAt: Date.now() })\n return ok({ deleted: true })\n }\n case 'apis/list': return ok(await this.store.apiDefinitionViews())\n case 'apis/save': return ok(await this.saveApi(saveApiInput.parse(payload)))\n case 'apis/delete': return ok(await this.deleteApi(idInput.parse(payload).id))\n case 'apis/test': {\n const input = apiTestInput.parse(payload)\n const definition = this.requireApi(input.id)\n return ok(await this.executor.execute(definition, input.args, signal))\n }\n default: return badRequest(`Unknown dsh-connect endpoint: ${endpoint}`)\n }\n } catch (error) {\n if (signal.aborted) return { ok: false, error: { code: 'cancelled', message: 'Request cancelled', details: {} } }\n if (error instanceof z.ZodError) return badRequest('Invalid dsh-connect request', error.issues)\n return { ok: false, error: { code: 'internal', message: safeError(error), details: {} } }\n }\n }\n\n validateConversationApi(input: ConversationApiInput): void {\n const prepared = this.prepareConversationApi(input)\n if (this.store.apiDefinitions().some(api => api.slug === prepared.slug)) {\n throw new Error(`API slug already exists: ${prepared.slug}`)\n }\n const baseUrl = parseConfiguredBaseUrl(prepared.baseUrl)\n if (baseUrl.search !== '') throw new Error('Base URL query strings are not allowed; declare query parameters instead')\n if (prepared.pathTemplate.includes('?')) throw new Error('Path template query strings are not allowed; declare query parameters instead')\n validateApiInput(prepared)\n }\n\n async createConversationApi(input: ConversationApiInput) {\n const prepared = this.prepareConversationApi(input)\n this.validateConversationApi(input)\n return this.saveApi(prepared, { allowMissingCredential: true })\n }\n\n private async saveDataSource(input: z.infer<typeof saveDataSourceInput>) {\n const existing = input.id === undefined ? undefined : this.store.dataSource(input.id)\n if (input.id !== undefined && existing === undefined) throw new Error('Data source not found')\n const duplicate = this.store.dataSources().find(source => source.name === input.name && source.id !== input.id)\n if (duplicate !== undefined) throw new Error(`Data source name already exists: ${input.name}`)\n const id = existing?.id ?? randomUUID()\n const credentialName = existing?.credentialRef ?? databaseCredentialRef(id)\n if (existing === undefined && input.secret === undefined) throw new Error('Password is required for a new data source')\n if (input.secret !== undefined) await this.ctx.credentials.set(credentialRef(credentialName), input.secret)\n const now = Date.now()\n const definition = dataSourceSchema.parse({\n id,\n name: input.name.trim(),\n type: input.type,\n host: input.host.trim(),\n port: input.port,\n database: input.database.trim(),\n username: input.username.trim(),\n credentialRef: credentialName,\n schemaInclude: input.schemaInclude.map(value => value.trim()).filter(Boolean),\n tls: input.tls,\n sampleRows: input.sampleRows,\n aiEnrichment: input.aiEnrichment,\n enabled: input.enabled,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n })\n await this.store.putDataSource(definition)\n return (await this.store.dataSourceViews()).find(source => source.id === id)\n }\n\n private async deleteDataSource(id: string) {\n const existing = this.requireSource(id)\n await this.profiler.cancel(id)\n await this.store.deleteDataSource(id)\n await this.unsetIfWritable(existing.credentialRef)\n return { deleted: true }\n }\n\n private async saveApi(\n input: z.infer<typeof saveApiInput>,\n options: { allowMissingCredential?: boolean } = {},\n ) {\n const existing = input.id === undefined ? undefined : this.store.apiDefinition(input.id)\n if (input.id !== undefined && existing === undefined) throw new Error('API definition not found')\n const duplicate = this.store.apiDefinitions().find(api => api.slug === input.slug && api.id !== input.id)\n if (duplicate !== undefined) throw new Error(`API slug already exists: ${input.slug}`)\n validateApiInput(input)\n const id = existing?.id ?? randomUUID()\n const nextAuth = await this.resolveApiAuth(id, input.auth, input.secret, existing?.auth, options.allowMissingCredential ?? false)\n const now = Date.now()\n const definition = apiDefinitionSchema.parse({\n id,\n name: input.name.trim(),\n slug: input.slug,\n description: input.description.trim(),\n method: input.method,\n baseUrl: input.baseUrl,\n pathTemplate: input.pathTemplate,\n parameters: input.parameters,\n auth: nextAuth,\n timeoutMs: input.timeoutMs,\n maxResponseBytes: input.maxResponseBytes,\n responsePointer: input.responsePointer,\n allowPrivateNetwork: input.allowPrivateNetwork,\n enabled: input.enabled,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n })\n await this.store.putApiDefinition(definition)\n try {\n this.tools.replace(this.store.apiDefinitions())\n } catch (error) {\n if (existing === undefined) await this.store.deleteApiDefinition(id)\n else await this.store.putApiDefinition(existing)\n this.tools.replace(this.store.apiDefinitions())\n throw error\n }\n if (existing !== undefined && existing.auth.type !== 'none' && nextAuth.type === 'none') {\n await this.unsetIfWritable(existing.auth.credentialRef)\n }\n return (await this.store.apiDefinitionViews()).find(api => api.id === id)\n }\n\n private async deleteApi(id: string) {\n const existing = this.requireApi(id)\n await this.store.deleteApiDefinition(id)\n this.tools.replace(this.store.apiDefinitions())\n if (existing.auth.type !== 'none') await this.unsetIfWritable(existing.auth.credentialRef)\n return { deleted: true }\n }\n\n private async resolveApiAuth(\n id: string,\n input: z.infer<typeof saveAuthInput>,\n secret: string | undefined,\n existing: ApiAuth | undefined,\n allowMissingCredential: boolean,\n ): Promise<ApiAuth> {\n if (input.type === 'none') return { type: 'none' }\n const ref = existing?.type === 'none' || existing === undefined ? apiCredentialRef(id) : existing.credentialRef\n const configured = (await this.ctx.credentials.describe(credentialRef(ref))).configured\n if (!configured && secret === undefined && !allowMissingCredential) throw new Error('Credential is required for this authentication method')\n if (secret !== undefined) await this.ctx.credentials.set(credentialRef(ref), secret)\n if (input.type === 'bearer') return { type: 'bearer', credentialRef: ref }\n if (input.type === 'basic') return { type: 'basic', credentialRef: ref, username: input.username }\n return { type: 'api-key', credentialRef: ref, location: input.location, name: input.name }\n }\n\n private prepareConversationApi(input: ConversationApiInput): z.infer<typeof saveApiInput> {\n const auth = input.authType === 'none'\n ? { type: 'none' as const }\n : input.authType === 'bearer'\n ? { type: 'bearer' as const }\n : input.authType === 'basic'\n ? { type: 'basic' as const, username: input.basicUsername ?? '' }\n : { type: 'api-key' as const, location: input.authLocation ?? 'header', name: input.authName ?? '' }\n return saveApiInput.parse({\n name: input.name,\n slug: input.slug,\n description: input.description,\n method: input.method,\n baseUrl: input.baseUrl,\n pathTemplate: input.pathTemplate,\n parameters: input.parameters,\n auth,\n timeoutMs: input.timeoutMs,\n maxResponseBytes: input.maxResponseBytes,\n responsePointer: input.responsePointer,\n allowPrivateNetwork: false,\n enabled: input.authType === 'none',\n })\n }\n\n private requireSource(id: string): DataSourceDefinition {\n const source = this.store.dataSource(id)\n if (source === undefined) throw new Error('Data source not found')\n return source\n }\n\n private requireApi(id: string): ApiDefinition {\n const definition = this.store.apiDefinition(id)\n if (definition === undefined) throw new Error('API definition not found')\n return definition\n }\n\n private async updateMetadata(input: z.infer<typeof profileUpdateInput>): Promise<MetadataProfile> {\n const existing = this.store.profile(input.id)\n if (existing === undefined) throw new Error('Metadata profile not found')\n const next: MetadataProfile = {\n ...existing,\n ...(input.term === undefined ? {} : { term: input.term.trim() }),\n ...(input.description === undefined ? {} : { description: input.description.trim() }),\n ...(input.tags === undefined ? {} : { tags: [...new Set(input.tags.map(tag => tag.trim()).filter(Boolean))] }),\n ...(input.synonyms === undefined ? {} : { synonyms: [...new Set(input.synonyms.map(value => value.trim()).filter(Boolean))] }),\n ...(input.ignored === undefined ? {} : { ignored: input.ignored, ignoredOverride: input.ignored }),\n ...(input.semanticColumns === undefined ? {} : { semanticColumns: input.semanticColumns }),\n editedAt: Date.now(),\n }\n await this.store.putProfile(next)\n await this.store.putChange({ id: randomUUID(), sourceId: next.sourceId, profileId: next.id, action: 'update', summary: '\u624B\u52A8\u66F4\u65B0\u5143\u6570\u636E', before: { term: existing.term, description: existing.description, tags: existing.tags, synonyms: existing.synonyms, ignored: existing.ignored }, after: { term: next.term, description: next.description, tags: next.tags, synonyms: next.synonyms, ignored: next.ignored }, changedAt: Date.now() })\n return next\n }\n\n private async saveMetric(input: z.infer<typeof metricSaveInput>) {\n const existing = input.id === undefined ? undefined : this.store.metric(input.id)\n if (input.id !== undefined && existing === undefined) throw new Error('Metric not found')\n if (this.store.profile(input.profileId)?.sourceId !== input.sourceId) throw new Error('Metric profile does not belong to this data source')\n if (this.store.metrics(input.sourceId).some(metric => metric.name === input.name && metric.id !== input.id)) throw new Error(`Metric name already exists: ${input.name}`)\n const now = Date.now()\n const metric = {\n ...input,\n id: existing?.id ?? randomUUID(),\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n }\n await this.store.putMetric(metric)\n await this.store.putChange({ id: randomUUID(), sourceId: metric.sourceId, profileId: metric.profileId, action: 'update', summary: `${existing === undefined ? '\u521B\u5EFA' : '\u66F4\u65B0'}\u6307\u6807\uFF1A${metric.term}`, ...(existing === undefined ? {} : { before: { metric: existing } }), after: { metric }, changedAt: Date.now() })\n return metric\n }\n\n private async unsetIfWritable(ref: string): Promise<void> {\n const info = await this.ctx.credentials.describe(credentialRef(ref))\n if (info.configured && info.writable) await this.ctx.credentials.unset(credentialRef(ref))\n }\n}\n\nfunction validateApiInput(input: z.infer<typeof saveApiInput>): void {\n parseConfiguredBaseUrl(input.baseUrl)\n if (input.responsePointer !== '' && !input.responsePointer.startsWith('/')) {\n throw new Error('Response pointer must be empty or start with /')\n }\n const names = new Set<string>()\n for (const parameter of input.parameters) {\n if (names.has(parameter.name)) throw new Error(`Duplicate API parameter: ${parameter.name}`)\n names.add(parameter.name)\n if (parameter.location === 'header') assertSafeHeaderName(parameter.name)\n if (parameter.location === 'path' && !input.pathTemplate.includes(`{${parameter.name}}`)) {\n throw new Error(`Path parameter ${parameter.name} has no matching placeholder`)\n }\n }\n for (const match of input.pathTemplate.matchAll(/\\{([^}]+)\\}/g)) {\n const name = match[1]\n if (name === undefined || !input.parameters.some(parameter => parameter.name === name && parameter.location === 'path')) {\n throw new Error(`Path placeholder ${name ?? ''} has no path parameter definition`)\n }\n }\n if (input.auth.type === 'api-key' && input.auth.location === 'header') assertSafeHeaderName(input.auth.name)\n}\n\nfunction databaseCredentialRef(id: string): string {\n return `DSH_CONNECT_DB_${id.replaceAll('-', '_').toUpperCase()}_PASSWORD`\n}\n\nfunction apiCredentialRef(id: string): string {\n return `DSH_CONNECT_API_${id.replaceAll('-', '_').toUpperCase()}_SECRET`\n}\n\nfunction ok<T>(value: T): RpcResult<T> {\n return { ok: true, value }\n}\n\nfunction badRequest(message: string, issues: z.core.$ZodIssue[] = []): RpcResult<never> {\n return { ok: false, error: { code: 'bad-request', message, details: { issues } } }\n}\n\nfunction safeError(error: unknown): string {\n return (error instanceof Error ? error.message : String(error)).replaceAll(/[\\r\\n]+/g, ' ').slice(0, 1000)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["z", "credentialRef", "profileId", "name", "name", "z", "z", "credentialRef", "connect", "groupColumns", "quote", "connect", "groupColumns", "quote", "z", "name", "safeError", "credentialRef", "defineTool", "credentialRef", "defineTool", "credentialRef", "randomUUID", "credentialRef", "z", "z", "credentialRef", "randomUUID", "safeError", "metric", "name", "z"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
2
|
+
import type { ConnectClient } from './rpc.js';
|
|
3
|
+
interface ConnectSettingsFace {
|
|
4
|
+
connectClient: ConnectClient;
|
|
5
|
+
}
|
|
6
|
+
export type ConnectSettingsProps = PropsRuntime<'settings.section'> & InjectFace<ConnectSettingsFace>;
|
|
7
|
+
export declare function ConnectSettings(props: ConnectSettingsProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ConnectSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectSettings.d.ts","sourceRoot":"","sources":["../../../src/client/ConnectSettings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AA0BhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAK7C,UAAU,mBAAmB;IAC3B,aAAa,EAAE,aAAa,CAAA;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;AAIrG,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BA0L1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAO3E,eAAO,MAAM,IAAI,uBAAuB,CAAA;AACxC,eAAO,MAAM,MAAM,UAA0B,CAAA;AAE7C,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAc9C"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ClientConnectionRpc } from '@deepseek-ai/dsh-client-connection/client';
|
|
2
|
+
export declare class ConnectClient {
|
|
3
|
+
private readonly rpc;
|
|
4
|
+
constructor(rpc: ClientConnectionRpc);
|
|
5
|
+
call<T>(endpoint: string, payload?: unknown): Promise<T>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/client/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAEpF,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,mBAAmB;IAE/C,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,GAAG,OAAO,CAAC,CAAC,CAAC;CAKnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/client/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAuD3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAO7D"}
|