viyv-db-client 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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 viyv
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,31 @@
1
+ import type { ViyvClient } from './client.js';
2
+ /** Structurally compatible with viyv-agent-ui DataSourceMeta */
3
+ export interface ViyvDataSourceMeta {
4
+ id: string;
5
+ name: string;
6
+ type: 'sql';
7
+ description?: string;
8
+ tables: Array<{
9
+ name: string;
10
+ columns: Array<{
11
+ name: string;
12
+ type: string;
13
+ nullable: boolean;
14
+ description?: string;
15
+ }>;
16
+ rowCount?: number;
17
+ description?: string;
18
+ }>;
19
+ }
20
+ /** Structurally compatible with viyv-agent-ui DataConnector */
21
+ export interface ViyvDataConnector {
22
+ readonly meta: ViyvDataSourceMeta;
23
+ describe(): Promise<ViyvDataSourceMeta>;
24
+ query(params: Record<string, unknown>): Promise<unknown>;
25
+ }
26
+ export declare function createDataConnector(client: ViyvClient, options: {
27
+ id: string;
28
+ name: string;
29
+ description?: string;
30
+ }): ViyvDataConnector;
31
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACH;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,iBAAiB,CA8CnB"}
@@ -0,0 +1,44 @@
1
+ export function createDataConnector(client, options) {
2
+ let cachedMeta = null;
3
+ async function buildMeta() {
4
+ const tables = await client.overview();
5
+ return {
6
+ id: options.id,
7
+ name: options.name,
8
+ type: 'sql',
9
+ description: options.description,
10
+ tables: tables.map((t) => ({
11
+ name: t.name,
12
+ columns: t.columns.map((c) => ({
13
+ name: c.name,
14
+ type: c.type,
15
+ nullable: c.nullable,
16
+ description: c.description ?? undefined,
17
+ })),
18
+ rowCount: t.rowCount,
19
+ description: t.purpose ?? undefined,
20
+ })),
21
+ };
22
+ }
23
+ return {
24
+ get meta() {
25
+ return (cachedMeta ?? {
26
+ id: options.id,
27
+ name: options.name,
28
+ type: 'sql',
29
+ tables: [],
30
+ });
31
+ },
32
+ async describe() {
33
+ cachedMeta = await buildMeta();
34
+ return cachedMeta;
35
+ },
36
+ async query(params) {
37
+ if (typeof params.sql !== 'string' || params.sql.length === 0) {
38
+ throw new Error('Missing "sql" parameter');
39
+ }
40
+ return client.sql(params.sql);
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,mBAAmB,CAClC,MAAkB,EAClB,OAA2D;IAE3D,IAAI,UAAU,GAA8B,IAAI,CAAC;IAEjD,KAAK,UAAU,SAAS;QACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO;YACN,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;iBACvC,CAAC,CAAC;gBACH,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,WAAW,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;aACnC,CAAC,CAAC;SACH,CAAC;IACH,CAAC;IAED,OAAO;QACN,IAAI,IAAI;YACP,OAAO,CACN,UAAU,IAAI;gBACb,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,KAAc;gBACpB,MAAM,EAAE,EAAE;aACV,CACD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,QAAQ;YACb,UAAU,GAAG,MAAM,SAAS,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,MAA+B;YAC1C,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { IDatabaseService, QueryResult, SemanticSearchOptions, SemanticSearchResult, TableDetail, TableInfo } from 'viyv-db-core';
2
+ import { QueryBuilder } from './query-builder.js';
3
+ /** Minimal subset of IDatabaseService used by ViyvClient */
4
+ export type ReadOnlyService = Pick<IDatabaseService, 'getSchema' | 'query' | 'queryTable' | 'close'> & {
5
+ semanticSearch?: IDatabaseService['semanticSearch'];
6
+ };
7
+ export declare class ViyvClient {
8
+ private readonly service;
9
+ constructor(service: ReadOnlyService);
10
+ listTables(): Promise<TableInfo[]>;
11
+ describeTable(name: string): Promise<TableDetail>;
12
+ overview(): Promise<TableDetail[]>;
13
+ from(table: string): QueryBuilder;
14
+ sql(query: string, params?: unknown[]): Promise<QueryResult>;
15
+ search(options: SemanticSearchOptions): Promise<SemanticSearchResult[]>;
16
+ close(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,IAAI,CACjC,gBAAgB,EAChB,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAC9C,GAAG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;CACpD,CAAC;AAEF,qBAAa,UAAU;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,eAAe;IAI/C,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKlC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAMjD,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAOxC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAM3B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAM5D,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IASvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
package/dist/client.js ADDED
@@ -0,0 +1,42 @@
1
+ import { QueryBuilder } from './query-builder.js';
2
+ export class ViyvClient {
3
+ service;
4
+ constructor(service) {
5
+ this.service = service;
6
+ }
7
+ // ── Schema(read-only)──
8
+ async listTables() {
9
+ const result = await this.service.getSchema('list');
10
+ return result.mode === 'list' ? result.tables : [];
11
+ }
12
+ async describeTable(name) {
13
+ const result = await this.service.getSchema('detail', { tableName: name });
14
+ if (result.mode !== 'detail')
15
+ throw new Error('Unexpected result');
16
+ return result.table;
17
+ }
18
+ async overview() {
19
+ const result = await this.service.getSchema('overview');
20
+ return result.mode === 'overview' ? result.tables : [];
21
+ }
22
+ // ── Structured query(main API)──
23
+ from(table) {
24
+ return new QueryBuilder(this.service, table);
25
+ }
26
+ // ── SQL query(SELECT only)──
27
+ async sql(query, params) {
28
+ return this.service.query(query, params);
29
+ }
30
+ // ── Semantic search ──
31
+ async search(options) {
32
+ if (!this.service.semanticSearch) {
33
+ throw new Error('Semantic search is not available on this service');
34
+ }
35
+ return this.service.semanticSearch(options);
36
+ }
37
+ // ── Lifecycle ──
38
+ async close() {
39
+ await this.service.close();
40
+ }
41
+ }
42
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,MAAM,OAAO,UAAU;IACO;IAA7B,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEzD,yBAAyB;IAEzB,KAAK,CAAC,UAAU;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,kCAAkC;IAElC,IAAI,CAAC,KAAa;QACjB,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,8BAA8B;IAE9B,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,MAAkB;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,wBAAwB;IAExB,KAAK,CAAC,MAAM,CAAC,OAA8B;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,kBAAkB;IAElB,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACD"}
@@ -0,0 +1,14 @@
1
+ import type { ReadOnlyService } from './client.js';
2
+ import { ViyvClient } from './client.js';
3
+ import type { ClientConfig } from './types.js';
4
+ /** Main factory: PG connection → ViyvClient */
5
+ export declare function createViyvClient(config: ClientConfig): Promise<ViyvClient>;
6
+ /** DI factory: existing IDatabaseService (or subset) → ViyvClient */
7
+ export declare function createViyvClientFromService(service: ReadOnlyService): ViyvClient;
8
+ export { ViyvClient } from './client.js';
9
+ export type { ReadOnlyService } from './client.js';
10
+ export { QueryBuilder } from './query-builder.js';
11
+ export { createDataConnector } from './adapter.js';
12
+ export type { ViyvDataConnector, ViyvDataSourceMeta } from './adapter.js';
13
+ export type { ClientConfig } from './types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,+CAA+C;AAC/C,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAchF;AAED,qEAAqE;AACrE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CAEhF;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ import { PostgresConfigSchema, createPostgresService } from 'viyv-db-postgres';
2
+ import { ViyvClient } from './client.js';
3
+ /** Main factory: PG connection → ViyvClient */
4
+ export async function createViyvClient(config) {
5
+ // Client defaults differ from MCP server: read-only, smaller pool
6
+ const pgConfig = PostgresConfigSchema.parse({
7
+ postgresUrl: config.postgresUrl,
8
+ tenantId: config.tenantId,
9
+ accessLevel: config.accessLevel ?? 'read',
10
+ rowLimit: config.rowLimit,
11
+ queryTimeoutMs: config.queryTimeoutMs,
12
+ autoInitialize: config.autoInitialize,
13
+ poolMin: config.poolMin ?? 1,
14
+ poolMax: config.poolMax ?? 5,
15
+ });
16
+ const service = await createPostgresService(pgConfig, config.embeddingProvider);
17
+ return new ViyvClient(service);
18
+ }
19
+ /** DI factory: existing IDatabaseService (or subset) → ViyvClient */
20
+ export function createViyvClientFromService(service) {
21
+ return new ViyvClient(service);
22
+ }
23
+ export { ViyvClient } from './client.js';
24
+ export { QueryBuilder } from './query-builder.js';
25
+ export { createDataConnector } from './adapter.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IAC1D,kEAAkE;IAClE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM;QACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChF,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,2BAA2B,CAAC,OAAwB;IACnE,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { IDatabaseService, QueryResult } from 'viyv-db-core';
2
+ type QueryService = Pick<IDatabaseService, 'queryTable'>;
3
+ export declare class QueryBuilder {
4
+ private readonly service;
5
+ private readonly table;
6
+ private readonly options;
7
+ constructor(service: QueryService, table: string);
8
+ select(columns: string[]): this;
9
+ where(conditions: Record<string, unknown>): this;
10
+ orderBy(column: string, direction?: 'asc' | 'desc'): this;
11
+ limit(n: number): this;
12
+ offset(n: number): this;
13
+ execute(): Promise<QueryResult>;
14
+ rows(): Promise<Record<string, unknown>[]>;
15
+ /** Execute with limit=1, return first row or null. Does NOT mutate the builder. */
16
+ first(): Promise<Record<string, unknown> | null>;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAqB,MAAM,cAAc,CAAC;AAErF,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAEzD,qBAAa,YAAY;IAIvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAG/B,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM;IAG/B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK/B,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKhD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,KAAK,GAAG,MAAc,GAAG,IAAI;IAMhE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKtB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKjB,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAI/B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAKhD,mFAAmF;IAC7E,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAItD"}
@@ -0,0 +1,43 @@
1
+ export class QueryBuilder {
2
+ service;
3
+ table;
4
+ options = {};
5
+ constructor(service, table) {
6
+ this.service = service;
7
+ this.table = table;
8
+ }
9
+ select(columns) {
10
+ this.options.columns = columns;
11
+ return this;
12
+ }
13
+ where(conditions) {
14
+ this.options.where = { ...this.options.where, ...conditions };
15
+ return this;
16
+ }
17
+ orderBy(column, direction = 'asc') {
18
+ const existing = this.options.orderBy ?? [];
19
+ this.options.orderBy = [...existing, { column, direction }];
20
+ return this;
21
+ }
22
+ limit(n) {
23
+ this.options.limit = n;
24
+ return this;
25
+ }
26
+ offset(n) {
27
+ this.options.offset = n;
28
+ return this;
29
+ }
30
+ async execute() {
31
+ return this.service.queryTable(this.table, this.options);
32
+ }
33
+ async rows() {
34
+ const result = await this.execute();
35
+ return result.rows;
36
+ }
37
+ /** Execute with limit=1, return first row or null. Does NOT mutate the builder. */
38
+ async first() {
39
+ const result = await this.service.queryTable(this.table, { ...this.options, limit: 1 });
40
+ return result.rows[0] ?? null;
41
+ }
42
+ }
43
+ //# sourceMappingURL=query-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,YAAY;IAIN;IACA;IAJD,OAAO,GAAsB,EAAE,CAAC;IAEjD,YACkB,OAAqB,EACrB,KAAa;QADb,YAAO,GAAP,OAAO,CAAc;QACrB,UAAK,GAAL,KAAK,CAAQ;IAC5B,CAAC;IAEJ,MAAM,CAAC,OAAiB;QACvB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAmC;QACxC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,YAA4B,KAAK;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,CAAS;QACd,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,CAAC,CAAS;QACf,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,KAAK;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC/B,CAAC;CACD"}
@@ -0,0 +1,13 @@
1
+ import type { AccessLevel, IEmbeddingProvider } from 'viyv-db-core';
2
+ export interface ClientConfig {
3
+ postgresUrl: string;
4
+ tenantId?: string;
5
+ accessLevel?: AccessLevel;
6
+ rowLimit?: number;
7
+ queryTimeoutMs?: number;
8
+ autoInitialize?: boolean;
9
+ poolMin?: number;
10
+ poolMax?: number;
11
+ embeddingProvider?: IEmbeddingProvider;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;CACvC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "viyv-db-client",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Client library for querying viyv-db",
6
+ "license": "MIT",
7
+ "author": "viyv",
8
+ "engines": {
9
+ "node": ">=20"
10
+ },
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "!dist/__tests__"
22
+ ],
23
+ "dependencies": {
24
+ "viyv-db-postgres": "0.1.0",
25
+ "viyv-db-core": "0.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "typescript": "^5.7.0",
29
+ "vitest": "^2.1.0"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run",
35
+ "clean": "rm -rf dist"
36
+ }
37
+ }