🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@valv/core

Package Overview
Dependencies
Maintainers
2
Versions
16
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@valv/core - npm Package Compare versions

Comparing version
0.9.0
to
0.10.0
+1
-0
dist/dialects.d.ts
import type { Dialect } from "./dialect";
export declare const postgresDialect: Dialect;
export declare const mysqlDialect: Dialect;
export declare const sqliteDialect: Dialect;
//# sourceMappingURL=dialects.d.ts.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"dialects.d.ts","sourceRoot":"","sources":["../src/dialects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BxC,eAAO,MAAM,eAAe,EAAE,OAI7B,CAAA;AAsBD,eAAO,MAAM,YAAY,EAAE,OAK1B,CAAA"}
{"version":3,"file":"dialects.d.ts","sourceRoot":"","sources":["../src/dialects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+BxC,eAAO,MAAM,eAAe,EAAE,OAI7B,CAAA;AAsBD,eAAO,MAAM,YAAY,EAAE,OAK1B,CAAA;AA8BD,eAAO,MAAM,aAAa,EAAE,OAM3B,CAAA"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mysqlDialect = exports.postgresDialect = void 0;
// Standard SQL dialects that ship with core. Postgres and MySQL live here
// (rather than in an adapter) because more than one adapter targets each — the
// driver-based @valv/postgres and @valv/mysql, plus the Prisma adapter's
// postgres/mysql providers — so a single definition per dialect avoids drift.
exports.sqliteDialect = exports.mysqlDialect = exports.postgresDialect = void 0;
// Standard SQL dialects that ship with core. Postgres, MySQL and SQLite live
// here (rather than in an adapter) because more than one adapter targets each —
// the driver-based @valv/postgres, @valv/mysql and @valv/sqlite, plus the Prisma
// adapter's postgres/mysql/sqlite providers — so a single definition per dialect
// avoids drift.
const doubleQuote = (id) => '"' + id.replace(/"/g, '""') + '"';

@@ -56,2 +57,35 @@ const backtick = (id) => "`" + id.replace(/`/g, "``") + "`";

};
// SQLite truncates with strftime, zeroing the components below the chosen grain.
// Note strftime spells minutes %M (MySQL's DATE_FORMAT spells them %i), so this
// map can't be shared with DATE_FORMAT above despite looking nearly identical.
//
// strftime reads a timestamp as ISO-8601 text or a Julian day number, and always
// computes in UTC — so unlike Postgres and MySQL there is no session zone for the
// adapter to pin. SQLite has no date type, though: a column declared DATE /
// DATETIME / TIMESTAMP (what introspection maps to `date`) holds whatever the
// writer put there. Unix-epoch integers are the common exception and strftime
// reads them as Julian days, silently bucketing to the wrong era rather than
// erroring. Declare such columns as `number` and bucket them arithmetically.
const STRFTIME_FORMAT = {
minute: "%Y-%m-%d %H:%M:00",
hour: "%Y-%m-%d %H:00:00",
day: "%Y-%m-%d",
month: "%Y-%m-01",
year: "%Y-01-01",
};
const dateTruncSqlite = {
args: [{ kind: "column" }, { kind: "enum", values: TRUNC_UNITS }],
returns: "date",
render: ([c, unit]) => `strftime('${STRFTIME_FORMAT[unit]}', ${c})`,
};
// SQLite: "id" double-quote quoting (the SQL standard spelling, which SQLite
// accepts alongside its backtick and bracket variants), ? positional
// placeholders (type ignored — SQLite binds positionally).
exports.sqliteDialect = {
quoteId: doubleQuote,
placeholder: () => "?",
functions: { dateTrunc: dateTruncSqlite },
// SQLite has no ILIKE; its LIKE is already case-insensitive for ASCII.
ilike: "LIKE",
};
//# sourceMappingURL=dialects.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"dialects.js","sourceRoot":"","sources":["../src/dialects.ts"],"names":[],"mappings":";;;AAGA,0EAA0E;AAC1E,+EAA+E;AAC/E,yEAAyE;AACzE,8EAA8E;AAE9E,MAAM,WAAW,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAA;AAC9E,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAA;AAE3E,gFAAgF;AAChF,kFAAkF;AAClF,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA;AAEvE,kFAAkF;AAClF,gFAAgF;AAChF,qEAAqE;AACrE,iFAAiF;AACjF,iFAAiF;AACjF,gFAAgF;AAChF,MAAM,WAAW,GAAU;IACzB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjE,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,IAAI,MAAM,CAAC,GAAG;CACrD,CAAA;AAED,uEAAuE;AACvE,yEAAyE;AACzE,gBAAgB;AACH,QAAA,eAAe,GAAY;IACtC,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;IACvC,SAAS,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;CACtC,CAAA;AAED,4EAA4E;AAC5E,6EAA6E;AAC7E,kFAAkF;AAClF,qDAAqD;AACrD,MAAM,WAAW,GAAiD;IAChE,MAAM,EAAE,mBAAmB;IAC3B,IAAI,EAAE,mBAAmB;IACzB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,UAAU;CACjB,CAAA;AACD,MAAM,cAAc,GAAU;IAC5B,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjE,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CACpB,eAAe,CAAC,MAAM,WAAW,CAAC,IAAoC,CAAC,IAAI;CAC9E,CAAA;AAED,0EAA0E;AAC1E,uCAAuC;AAC1B,QAAA,YAAY,GAAY;IACnC,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG;IACtB,SAAS,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;IACxC,KAAK,EAAE,MAAM,EAAE,iEAAiE;CACjF,CAAA"}
{"version":3,"file":"dialects.js","sourceRoot":"","sources":["../src/dialects.ts"],"names":[],"mappings":"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"}

@@ -9,3 +9,3 @@ export { Valv } from "./valv";

export type { Dialect } from "./dialect";
export { postgresDialect, mysqlDialect } from "./dialects";
export { postgresDialect, mysqlDialect, sqliteDialect } from "./dialects";
export { BASE_FUNCTIONS } from "./functions";

@@ -12,0 +12,0 @@ export type { FnDef, ArgSpec, FnReturn } from "./functions";

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,UAAU,GACX,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC7E,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,KAAK,EACL,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,gBAAgB,GACjB,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,YAAY,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,SAAS,EACT,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAGhE,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACxD,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,cAAc,CAAA"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,UAAU,GACX,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC7E,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,KAAK,EACL,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,gBAAgB,GACjB,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,YAAY,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,SAAS,EACT,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAGhE,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACxD,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,cAAc,CAAA"}

@@ -36,3 +36,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.gemini = exports.openai = exports.anthropic = exports.formats = exports.ValidationError = exports.PolicyViolationError = exports.serializeResult = exports.AGENT_INSTRUCTIONS = exports.resultSchema = exports.BASE_FUNCTIONS = exports.mysqlDialect = exports.postgresDialect = exports.emitDelete = exports.emitUpdate = exports.emitInsert = exports.emit = exports.parseDelete = exports.parseUpdate = exports.parseInsert = exports.parseQuery = exports.Valv = void 0;
exports.gemini = exports.openai = exports.anthropic = exports.formats = exports.ValidationError = exports.PolicyViolationError = exports.serializeResult = exports.AGENT_INSTRUCTIONS = exports.resultSchema = exports.BASE_FUNCTIONS = exports.sqliteDialect = exports.mysqlDialect = exports.postgresDialect = exports.emitDelete = exports.emitUpdate = exports.emitInsert = exports.emit = exports.parseDelete = exports.parseUpdate = exports.parseInsert = exports.parseQuery = exports.Valv = void 0;
var valv_1 = require("./valv");

@@ -53,2 +53,3 @@ Object.defineProperty(exports, "Valv", { enumerable: true, get: function () { return valv_1.Valv; } });

Object.defineProperty(exports, "mysqlDialect", { enumerable: true, get: function () { return dialects_1.mysqlDialect; } });
Object.defineProperty(exports, "sqliteDialect", { enumerable: true, get: function () { return dialects_1.sqliteDialect; } });
var functions_1 = require("./functions");

@@ -55,0 +56,0 @@ Object.defineProperty(exports, "BASE_FUNCTIONS", { enumerable: true, get: function () { return functions_1.BASE_FUNCTIONS; } });

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA6B;AAApB,4FAAA,IAAI,OAAA;AASb,qCAA6E;AAApE,qGAAA,UAAU,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,sGAAA,WAAW,OAAA;AA4B1D,+BAAiE;AAAxD,4FAAA,IAAI,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,kGAAA,UAAU,OAAA;AAEjD,uCAA0D;AAAjD,2GAAA,eAAe,OAAA;AAAE,wGAAA,YAAY,OAAA;AACtC,yCAA4C;AAAnC,2GAAA,cAAc,OAAA;AAEvB,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AAErB,iCAA4C;AAAnC,2GAAA,kBAAkB,OAAA;AAa3B,2CAA8C;AAArC,6GAAA,eAAe,OAAA;AACxB,mCAAgE;AAAvD,8GAAA,oBAAoB,OAAA;AAAE,yGAAA,eAAe,OAAA;AAE9C,iFAAiF;AACjF,wDAAuC;AACvC,2CAAwD;AAA/C,uGAAA,SAAS,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,oGAAA,MAAM,OAAA"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA6B;AAApB,4FAAA,IAAI,OAAA;AASb,qCAA6E;AAApE,qGAAA,UAAU,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,sGAAA,WAAW,OAAA;AA4B1D,+BAAiE;AAAxD,4FAAA,IAAI,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,kGAAA,UAAU,OAAA;AAEjD,uCAAyE;AAAhE,2GAAA,eAAe,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,yGAAA,aAAa,OAAA;AACrD,yCAA4C;AAAnC,2GAAA,cAAc,OAAA;AAEvB,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AAErB,iCAA4C;AAAnC,2GAAA,kBAAkB,OAAA;AAa3B,2CAA8C;AAArC,6GAAA,eAAe,OAAA;AACxB,mCAAgE;AAAvD,8GAAA,oBAAoB,OAAA;AAAE,yGAAA,eAAe,OAAA;AAE9C,iFAAiF;AACjF,wDAAuC;AACvC,2CAAwD;AAA/C,uGAAA,SAAS,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,oGAAA,MAAM,OAAA"}

@@ -21,2 +21,3 @@ import type { SchemaMap, ResourceSchema } from "../catalog";

nullable: boolean;
description?: string;
enumValues?: string[];

@@ -23,0 +24,0 @@ }[];

@@ -1,1 +0,1 @@

{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAMzC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,CAAA;IACxB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EACvC,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC5C,aAAa,EAAE,UAAU,GAAG,WAAW,EACvC,GAAG,EAAE,QAAQ,GACZ,eAAe,EAAE,CAenB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAK3E;AAKD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAQ3F;AAUD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAA;IAClF,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC5D;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAmB9F"}
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAMzC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,CAAA;IACxB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EACvC,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC5C,aAAa,EAAE,UAAU,GAAG,WAAW,EACvC,GAAG,EAAE,QAAQ,GACZ,eAAe,EAAE,CAenB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAK3E;AAKD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAQ3F;AAUD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,OAAO,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KACtB,EAAE,CAAA;IACH,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC5D;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAwB9F"}

@@ -69,2 +69,7 @@ "use strict";

nullable: f.isNullable,
// A catalog author's note about what the column actually means — units,
// what NULL signifies, which values are worth grouping by. Without this
// the model sees only a name and a coarse type, which is rarely enough
// to pick the right column on a schema it has never seen.
...(f.description ? { description: f.description } : {}),
// Enum columns advertise their valid values so the model filters/writes

@@ -71,0 +76,0 @@ // with a real one instead of guessing.

@@ -1,1 +0,1 @@

{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"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"}
{
"name": "@valv/core",
"version": "0.9.0",
"version": "0.10.0",
"description": "ORM + Access Control Layer for AI Agents",

@@ -23,3 +23,3 @@ "keywords": [

"type": "git",
"url": "https://github.com/vistal-dev/vistal.git",
"url": "https://github.com/valv-dev/valv.git",
"directory": "packages/core"

@@ -26,0 +26,0 @@ },

import { SchemaMap, PolicyFn } from "../types";
import { ResolvedQuery } from "./types";
import type { PaginationConfig } from "../valv";
export type OperationType = "find" | "findOne" | "create" | "update" | "delete" | "aggregate";
export declare function parseToolName(toolName: string): {
operation: OperationType;
resource: string;
};
export declare function buildResolvedQuery<TContext>(toolName: string, input: unknown, schema: SchemaMap, policies: Record<string, PolicyFn<TContext>>, ctx: TContext, defaultPolicy: "deny-all" | "allow-all", paginationConfig?: PaginationConfig): ResolvedQuery;
//# sourceMappingURL=builder.d.ts.map
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/ir/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAe,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,aAAa,EAA+B,MAAM,SAAS,CAAA;AAKpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAA;AAE7F,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAiB9F;AAkBD,wBAAgB,kBAAkB,CAAC,QAAQ,EACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC5C,GAAG,EAAE,QAAQ,EACb,aAAa,EAAE,UAAU,GAAG,WAAW,EACvC,gBAAgB,GAAE,gBAAsD,GACvE,aAAa,CAkOf"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseToolName = parseToolName;
exports.buildResolvedQuery = buildResolvedQuery;
const engine_1 = require("../policy/engine");
const filters_1 = require("./filters");
const errors_1 = require("../errors");
const cursor_1 = require("./cursor");
function parseToolName(toolName) {
const prefixes = [
["query_", "find"],
["get_", "findOne"],
["create_", "create"],
["update_", "update"],
["delete_", "delete"],
["aggregate_", "aggregate"],
];
for (const [prefix, operation] of prefixes) {
if (toolName.startsWith(prefix)) {
return { operation, resource: toolName.slice(prefix.length) };
}
}
throw new errors_1.ValidationError(`Unknown tool name format: ${toolName}`);
}
function operationToPolicy(op) {
switch (op) {
case "find":
case "findOne":
return "read";
case "aggregate":
return "aggregate";
case "create":
return "create";
case "update":
return "update";
case "delete":
return "delete";
}
}
function buildResolvedQuery(toolName, input, schema, policies, ctx, defaultPolicy, paginationConfig = { maxLimit: 100, defaultLimit: 50 }) {
const { operation, resource } = parseToolName(toolName);
const resourceSchema = schema.resources[resource];
if (!resourceSchema) {
throw new errors_1.ValidationError(`Unknown resource: ${resource}`);
}
const policyOp = operationToPolicy(operation);
const evaluated = (0, engine_1.evaluatePolicy)(policies[resource], ctx, policyOp, defaultPolicy, resourceSchema);
if (!evaluated.allowed) {
throw new errors_1.PolicyViolationError(`Operation "${operation}" on "${resource}" is not permitted by policy`);
}
const inp = (input ?? {});
// Parse filters from LLM input
let llmFilter;
if (inp.filters && typeof inp.filters === "object") {
llmFilter = parseFilters(inp.filters, evaluated.allowedFields, resource, resourceSchema.fields);
}
// Merge policy row filter + forced write fields (for update guard) + LLM filter
let baseFilter = (0, engine_1.mergeFilters)(evaluated.rowFilter, llmFilter);
// Resolve includes
let include;
if (inp.include && Array.isArray(inp.include)) {
include = {};
for (const relationName of inp.include) {
if (!evaluated.allowedRelations.includes(relationName)) {
throw new errors_1.ValidationError(`Relation "${relationName}" is not allowed`);
}
const relation = resourceSchema.relations[relationName];
if (!relation) {
throw new errors_1.ValidationError(`Unknown relation "${relationName}" on resource "${resource}"`);
}
const relatedSchema = schema.resources[relation.targetResource];
const relatedEvaluated = (0, engine_1.evaluatePolicy)(policies[relation.targetResource], ctx, "read", defaultPolicy, relatedSchema);
const relatedFields = relatedEvaluated.allowed
? relatedEvaluated.allowedFields
: relatedSchema
? Object.values(relatedSchema.fields)
.filter((f) => !f.sensitive)
.map((f) => f.name)
: [];
include[relationName] = {
resource: relation.targetResource,
type: relation.type,
foreignKey: relation.foreignKey,
fields: relatedFields,
filters: relatedEvaluated.rowFilter,
};
}
}
const fields = [...evaluated.allowedFields];
const pkField = Object.values(resourceSchema.fields).find((f) => f.isId)?.name ?? "id";
const query = {
resource,
operation,
filters: baseFilter,
fields,
include,
};
// Sort
if (inp.sort && typeof inp.sort === "object") {
const sort = inp.sort;
const sortField = sort.field;
if (!evaluated.allowedFields.includes(sortField)) {
throw new errors_1.ValidationError(`Sort field "${sortField}" is not allowed`);
}
query.sort = {
field: sortField,
direction: sort.direction ?? "asc",
};
}
// Pagination — applies to every find so the default page size always caps reads.
if (operation === "find") {
const explicitSort = query.sort;
// The cursor is self-describing: decode it first so it can drive the sort.
let keyset;
if (typeof inp.cursor === "string" && inp.cursor.length > 0) {
keyset = (0, cursor_1.decodeCursor)(inp.cursor);
if (keyset.sortField !== pkField && !evaluated.allowedFields.includes(keyset.sortField)) {
throw new errors_1.ValidationError(`Cursor sort field "${keyset.sortField}" is not allowed`);
}
}
if (keyset) {
if (explicitSort) {
// A cursor + an explicit sort must agree — the keyset is meaningless otherwise.
if (explicitSort.field !== keyset.sortField ||
explicitSort.direction !== keyset.direction) {
throw new errors_1.ValidationError("Cursor does not match the requested sort");
}
}
else {
// Continue paging under the sort the cursor was issued with.
query.sort = { field: keyset.sortField, direction: keyset.direction };
}
}
else if (!query.sort) {
// No cursor, no explicit sort → default to the primary key for stable order.
query.sort = { field: pkField, direction: "asc" };
}
const cursorField = query.sort.field;
if (keyset && resourceSchema.fields[cursorField]?.isNullable) {
throw new errors_1.ValidationError(`Cursor pagination is not supported on nullable sort field "${cursorField}"`);
}
const rawLimit = typeof inp.limit === "number" ? inp.limit : paginationConfig.defaultLimit;
const limit = Math.min(Math.max(1, Math.floor(rawLimit)), paginationConfig.maxLimit);
query.pagination = {
limit,
// Cursor wins over offset — only honor offset when paging without a cursor.
offset: keyset
? undefined
: typeof inp.offset === "number"
? Math.max(0, inp.offset)
: undefined,
cursor: typeof inp.cursor === "string" ? inp.cursor : undefined,
keyset,
primaryKey: pkField,
cursorField,
};
// The adapter needs the pk + sort field on each row to build nextCursor,
// even when policy didn't expose them. Track injected ones so they can be
// stripped from returned rows.
const internalFields = [];
for (const f of [pkField, cursorField]) {
if (!fields.includes(f)) {
fields.push(f);
internalFields.push(f);
}
}
if (internalFields.length > 0)
query.internalFields = internalFields;
}
// Aggregations
if (operation === "aggregate") {
if (inp.aggregations && Array.isArray(inp.aggregations)) {
for (const agg of inp.aggregations) {
if (agg.fn !== "count" &&
agg.field !== "*" &&
!evaluated.allowedFields.includes(agg.field)) {
throw new errors_1.ValidationError(`Aggregation field "${agg.field}" is not allowed on resource "${resource}"`);
}
}
query.aggregations = inp.aggregations;
}
if (inp.groupBy && Array.isArray(inp.groupBy)) {
const disallowed = inp.groupBy.filter((f) => !evaluated.allowedFields.includes(f));
if (disallowed.length > 0) {
throw new errors_1.ValidationError(`groupBy fields not allowed: ${disallowed.join(", ")}`);
}
query.groupBy = inp.groupBy;
}
}
// Data for create/update
if (operation === "create" || operation === "update") {
const data = {};
if (operation === "update" && inp.id !== undefined) {
const idFilter = { type: "eq", field: "id", value: inp.id };
query.filters = (0, engine_1.mergeFilters)(baseFilter, idFilter);
}
for (const [key, value] of Object.entries(inp)) {
if (["id", "filters", "include", "sort", "limit", "offset"].includes(key))
continue;
if (!evaluated.allowedFields.includes(key)) {
throw new errors_1.ValidationError(`Field "${key}" is not allowed for write`);
}
data[key] = value;
}
// Forced write fields override LLM input (policy wins). The UPDATE WHERE
// guard is already carried by evaluated.rowFilter (merged into baseFilter
// above and then with the id below), so only the data injection happens here.
if (evaluated.forcedWriteFields) {
Object.assign(data, evaluated.forcedWriteFields);
}
query.data = data;
}
// For findOne, use id as eq filter merged with policy filter
if (operation === "findOne" && inp.id !== undefined) {
const idFilter = { type: "eq", field: "id", value: inp.id };
query.filters = (0, engine_1.mergeFilters)(evaluated.rowFilter, idFilter);
}
return query;
}
function parseFilters(filtersObj, allowedFields, resource, fieldSchemas) {
// LLM-supplied filters share the policy filter language but are confined to
// the policy's allowed fields and don't get boolean combinators.
return (0, filters_1.objectToFilterNode)(filtersObj, {
fieldSchemas,
allowField: (field) => {
if (!allowedFields.includes(field)) {
throw new errors_1.ValidationError(`Field "${field}" is not allowed for filtering on resource "${resource}"`);
}
},
});
}
//# sourceMappingURL=builder.js.map
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/ir/builder.ts"],"names":[],"mappings":"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"}
/**
* Keyset encoded into an opaque pagination cursor. The adapter builds a
* `WHERE (sortField, id) > (sortValue, id)` predicate from this to continue
* paging after the last returned row. `id` is the primary-key tiebreaker so
* paging is stable even when `sortField` has duplicate values.
*/
export interface CursorKeyset {
sortField: string;
direction: "asc" | "desc";
sortValue: unknown;
id: unknown;
}
/** Encode a keyset into an opaque base64url token. */
export declare function encodeCursor(keyset: CursorKeyset): string;
/**
* Decode an opaque pagination cursor back into its keyset. Throws a
* `ValidationError` for any malformed or tampered token rather than letting a
* raw `SyntaxError` escape.
*/
export declare function decodeCursor(token: string): CursorKeyset;
//# sourceMappingURL=cursor.d.ts.map
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/ir/cursor.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;IACzB,SAAS,EAAE,OAAO,CAAA;IAClB,EAAE,EAAE,OAAO,CAAA;CACZ;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CA0BxD"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.encodeCursor = encodeCursor;
exports.decodeCursor = decodeCursor;
const errors_1 = require("../errors");
/** Encode a keyset into an opaque base64url token. */
function encodeCursor(keyset) {
return Buffer.from(JSON.stringify(keyset), "utf8").toString("base64url");
}
/**
* Decode an opaque pagination cursor back into its keyset. Throws a
* `ValidationError` for any malformed or tampered token rather than letting a
* raw `SyntaxError` escape.
*/
function decodeCursor(token) {
let parsed;
try {
const json = Buffer.from(token, "base64url").toString("utf8");
parsed = JSON.parse(json);
}
catch {
throw new errors_1.ValidationError("Invalid pagination cursor");
}
if (!parsed ||
typeof parsed !== "object" ||
typeof parsed.sortField !== "string" ||
!("sortValue" in parsed) ||
!("id" in parsed)) {
throw new errors_1.ValidationError("Invalid pagination cursor");
}
const obj = parsed;
return {
sortField: obj.sortField,
direction: obj.direction === "desc" ? "desc" : "asc",
sortValue: obj.sortValue,
id: obj.id,
};
}
//# sourceMappingURL=cursor.js.map
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/ir/cursor.ts"],"names":[],"mappings":";;AAgBA,oCAEC;AAOD,oCA0BC;AAnDD,sCAA2C;AAe3C,sDAAsD;AACtD,SAAgB,YAAY,CAAC,MAAoB;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,KAAa;IACxC,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC7D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,wBAAe,CAAC,2BAA2B,CAAC,CAAA;IACxD,CAAC;IAED,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAQ,MAAkC,CAAC,SAAS,KAAK,QAAQ;QACjE,CAAC,CAAC,WAAW,IAAK,MAAkC,CAAC;QACrD,CAAC,CAAC,IAAI,IAAK,MAAkC,CAAC,EAC9C,CAAC;QACD,MAAM,IAAI,wBAAe,CAAC,2BAA2B,CAAC,CAAA;IACxD,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAA;IAC7C,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAmB;QAClC,SAAS,EAAE,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QACpD,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,EAAE,EAAE,GAAG,CAAC,EAAE;KACX,CAAA;AACH,CAAC"}
import { FieldSchema } from "../types";
import { FilterNode } from "./types";
export interface FilterBuildOptions {
allowField?: (field: string) => void;
fieldSchemas?: Record<string, FieldSchema>;
allowBoolean?: boolean;
}
/**
* Converts a single `field: value` entry into a FilterNode, using the same
* operator vocabulary the LLM-facing tool schemas expose
* (`{ gte }`, `{ contains }`, `{ in }`, arrays, scalars, null).
*/
export declare function valueToFilterNode(field: string, value: unknown, fieldSchema?: FieldSchema): FilterNode;
/**
* Builds a composite FilterNode from an object of field conditions. Multiple
* keys are AND-ed. With `allowBoolean`, the reserved keys `OR`/`AND`/`NOT`
* compose nested boolean nodes.
*/
export declare function objectToFilterNode(obj: Record<string, unknown>, opts?: FilterBuildOptions): FilterNode | undefined;
//# sourceMappingURL=filters.d.ts.map
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/ir/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGpC,MAAM,WAAW,kBAAkB;IAGjC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAEpC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAG1C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,UAAU,CAuDZ;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,GAAE,kBAAuB,GAC5B,UAAU,GAAG,SAAS,CA8BxB"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.valueToFilterNode = valueToFilterNode;
exports.objectToFilterNode = objectToFilterNode;
const errors_1 = require("../errors");
const BOOLEAN_KEYS = new Set(["OR", "AND", "NOT"]);
/**
* Converts a single `field: value` entry into a FilterNode, using the same
* operator vocabulary the LLM-facing tool schemas expose
* (`{ gte }`, `{ contains }`, `{ in }`, arrays, scalars, null).
*/
function valueToFilterNode(field, value, fieldSchema) {
if (value === null) {
return { type: "null", field, isNull: true };
}
if (typeof value === "object" && !Array.isArray(value)) {
const obj = value;
// Equality aliases — the canonical form is a bare value, but models commonly
// reach for `{ eq }` / `{ equals }`, so accept them rather than mangling the query.
if ("eq" in obj) {
validateEnum(field, [obj.eq], fieldSchema);
return { type: "eq", field, value: obj.eq };
}
if ("equals" in obj) {
validateEnum(field, [obj.equals], fieldSchema);
return { type: "eq", field, value: obj.equals };
}
if ("ne" in obj) {
return { type: "not", filter: { type: "eq", field, value: obj.ne } };
}
if ("gte" in obj || "lte" in obj || "gt" in obj || "lt" in obj) {
return { type: "range", field, ...obj };
}
if ("contains" in obj) {
return { type: "like", field, value: obj.contains, mode: "contains" };
}
if ("startsWith" in obj) {
return { type: "like", field, value: obj.startsWith, mode: "startsWith" };
}
if ("endsWith" in obj) {
return { type: "like", field, value: obj.endsWith, mode: "endsWith" };
}
if ("in" in obj && Array.isArray(obj.in)) {
validateEnum(field, obj.in, fieldSchema);
return { type: "in", field, values: obj.in };
}
// Unknown operator object — reject with an actionable message instead of
// passing it through as an equality against a literal object (which would
// produce a malformed adapter query).
throw new errors_1.ValidationError(`Unsupported filter for field "${field}": {${Object.keys(obj).join(", ")}}. ` +
`Use a bare value for equality, or an operator object with one of: ` +
`eq, ne, gt, gte, lt, lte, in, contains, startsWith, endsWith.`);
}
if (Array.isArray(value)) {
validateEnum(field, value, fieldSchema);
return { type: "in", field, values: value };
}
validateEnum(field, [value], fieldSchema);
return { type: "eq", field, value };
}
/**
* Builds a composite FilterNode from an object of field conditions. Multiple
* keys are AND-ed. With `allowBoolean`, the reserved keys `OR`/`AND`/`NOT`
* compose nested boolean nodes.
*/
function objectToFilterNode(obj, opts = {}) {
const nodes = [];
for (const [key, value] of Object.entries(obj)) {
if (opts.allowBoolean && BOOLEAN_KEYS.has(key)) {
if (key === "NOT") {
if (value && typeof value === "object" && !Array.isArray(value)) {
const inner = objectToFilterNode(value, opts);
if (inner)
nodes.push({ type: "not", filter: inner });
}
continue;
}
if (Array.isArray(value)) {
const sub = value
.map((v) => objectToFilterNode(v, opts))
.filter((n) => n !== undefined);
if (sub.length > 0) {
nodes.push({ type: key === "OR" ? "or" : "and", filters: sub });
}
}
continue;
}
opts.allowField?.(key);
nodes.push(valueToFilterNode(key, value, opts.fieldSchemas?.[key]));
}
if (nodes.length === 0)
return undefined;
if (nodes.length === 1)
return nodes[0];
return { type: "and", filters: nodes };
}
function validateEnum(field, values, fieldSchema) {
if (fieldSchema?.type === "enum" && fieldSchema.enumValues) {
for (const v of values) {
if (!fieldSchema.enumValues.includes(v)) {
throw new errors_1.ValidationError(`Invalid enum value "${v}" for field "${field}"`);
}
}
}
}
//# sourceMappingURL=filters.js.map
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/ir/filters.ts"],"names":[],"mappings":"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"}
import type { CursorKeyset } from "./cursor";
export interface ResolvedQuery {
resource: string;
operation: "find" | "findOne" | "create" | "update" | "delete" | "aggregate";
filters?: FilterNode;
fields: string[];
internalFields?: string[];
include?: Record<string, ResolvedInclude>;
sort?: SortClause;
pagination?: PaginationClause;
aggregations?: AggregationClause[];
groupBy?: string[];
having?: FilterNode;
data?: Record<string, unknown>;
}
export interface ResolvedInclude {
resource: string;
type: "belongsTo" | "hasMany" | "manyToMany";
foreignKey: string;
fields: string[];
filters?: FilterNode;
}
export type FilterNode = EqFilter | InFilter | RangeFilter | LikeFilter | NullFilter | AndFilter | OrFilter | NotFilter;
export interface EqFilter {
type: "eq";
field: string;
value: unknown;
}
export interface InFilter {
type: "in";
field: string;
values: unknown[];
}
export interface RangeFilter {
type: "range";
field: string;
gte?: unknown;
lte?: unknown;
gt?: unknown;
lt?: unknown;
}
export interface LikeFilter {
type: "like";
field: string;
value: string;
mode?: "contains" | "startsWith" | "endsWith";
}
export interface NullFilter {
type: "null";
field: string;
isNull: boolean;
}
export interface AndFilter {
type: "and";
filters: FilterNode[];
}
export interface OrFilter {
type: "or";
filters: FilterNode[];
}
export interface NotFilter {
type: "not";
filter: FilterNode;
}
export interface SortClause {
field: string;
direction: "asc" | "desc";
}
export interface PaginationClause {
limit?: number;
offset?: number;
cursor?: string;
keyset?: CursorKeyset;
primaryKey: string;
cursorField: string;
}
export interface AggregationClause {
fn: "count" | "sum" | "avg" | "min" | "max";
field: string;
alias: string;
}
//# sourceMappingURL=types.d.ts.map
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ir/types.ts"],"names":[],"mappings":"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"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ir/types.ts"],"names":[],"mappings":""}
import { PolicyFn, ResourceSchema } from "../types";
import { FilterNode } from "../ir/types";
export type PolicyOperation = "read" | "write" | "create" | "update" | "delete" | "aggregate";
export interface EvaluatedPolicy {
allowed: boolean;
rowFilter?: FilterNode;
allowedFields: string[];
allowedRelations: string[];
forcedWriteFields?: Record<string, unknown>;
}
export declare function evaluatePolicy<TContext>(policy: PolicyFn<TContext> | undefined, ctx: TContext, operation: PolicyOperation, defaultPolicy: "deny-all" | "allow-all", schema?: ResourceSchema): EvaluatedPolicy;
export declare function rowFilterFromObject(obj: Record<string, unknown>): FilterNode;
export declare function mergeFilters(policyFilter: FilterNode | undefined, llmFilter: FilterNode | undefined): FilterNode | undefined;
//# sourceMappingURL=engine.d.ts.map
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/policy/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA4B,cAAc,EAAE,MAAM,UAAU,CAAA;AAC7E,OAAO,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAInD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAA;AAE7F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5C;AAyBD,wBAAgB,cAAc,CAAC,QAAQ,EACrC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,EACtC,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,eAAe,EAC1B,aAAa,EAAE,UAAU,GAAG,WAAW,EACvC,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,CAmFjB;AAwCD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAU5E;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,UAAU,GAAG,SAAS,EACpC,SAAS,EAAE,UAAU,GAAG,SAAS,GAChC,UAAU,GAAG,SAAS,CAMxB"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.evaluatePolicy = evaluatePolicy;
exports.rowFilterFromObject = rowFilterFromObject;
exports.mergeFilters = mergeFilters;
const filters_1 = require("../ir/filters");
const errors_1 = require("../errors");
// Resolve the rule for an operation, applying the shorthand fallbacks:
// create/update fall back to `write`, aggregate falls back to `read`.
function resolveRule(result, operation) {
switch (operation) {
case "create":
return result.create ?? result.write;
case "update":
return result.update ?? result.write;
case "write":
return result.write;
case "aggregate":
return result.aggregate ?? result.read;
case "read":
return result.read;
case "delete":
return result.delete;
}
}
function isScalar(v) {
return v === null || ["string", "number", "boolean", "bigint"].includes(typeof v);
}
function evaluatePolicy(policy, ctx, operation, defaultPolicy, schema) {
let result = {};
if (policy) {
result = policy(ctx);
}
const opValue = resolveRule(result, operation);
const isWriteOp = operation === "create" || operation === "update" || operation === "write";
let allowed;
let rowFilter;
let forcedWriteFields;
if (opValue === undefined) {
allowed = defaultPolicy === "allow-all";
}
else if (opValue === true) {
allowed = true;
}
else if (opValue === false) {
allowed = false;
}
else {
// Object value — a predicate.
allowed = true;
const obj = opValue;
if (operation === "create") {
// Inserts have no WHERE clause: only concrete scalar values can be forced
// into the row. Operator/combinator entries are rejected (see helper).
forcedWriteFields = extractForcedFields(obj, schema, true);
}
else if (isWriteOp) {
// update (or the `write` shorthand): force scalar equalities into the row
// AND use the full predicate as a WHERE guard.
forcedWriteFields = extractForcedFields(obj, schema, false);
rowFilter = (0, filters_1.objectToFilterNode)(obj, { allowBoolean: true });
}
else {
// read / delete / aggregate: predicate is a pure row filter.
rowFilter = (0, filters_1.objectToFilterNode)(obj, { allowBoolean: true });
}
}
if (!allowed) {
return { allowed: false, allowedFields: [], allowedRelations: [] };
}
const allFields = schema ? Object.keys(schema.fields) : [];
const sensitiveFields = schema
? Object.values(schema.fields)
.filter((f) => f.sensitive)
.map((f) => f.name)
: [];
let allowedFields;
const fieldPolicy = result.fields;
if (fieldPolicy?.allow) {
allowedFields = fieldPolicy.allow.filter((f) => !sensitiveFields.includes(f));
}
else if (fieldPolicy?.deny) {
const denySet = new Set([...fieldPolicy.deny, ...sensitiveFields]);
allowedFields = allFields.filter((f) => !denySet.has(f));
}
else {
allowedFields = allFields.filter((f) => !sensitiveFields.includes(f));
}
// Operation-specific field visibility: read-only fields are dropped from the
// write set, write-only fields are dropped from the read set.
if (isWriteOp && fieldPolicy?.readOnly) {
const readOnly = new Set(fieldPolicy.readOnly);
allowedFields = allowedFields.filter((f) => !readOnly.has(f));
}
else if (!isWriteOp && fieldPolicy?.writeOnly) {
const writeOnly = new Set(fieldPolicy.writeOnly);
allowedFields = allowedFields.filter((f) => !writeOnly.has(f));
}
const allRelations = schema ? Object.keys(schema.relations) : [];
const relationsPolicy = result.relations;
let allowedRelations;
if (relationsPolicy) {
allowedRelations = allRelations.filter((r) => relationsPolicy[r] !== false);
}
else {
allowedRelations = allRelations;
}
return { allowed, rowFilter, allowedFields, allowedRelations, forcedWriteFields };
}
// Pulls the scalar equality pairs out of a write predicate — these are the only
// values that can be force-written into a row. For inserts (`strict`), an
// operator filter or combinator on a *required* field can never be satisfied,
// so we fail loudly rather than silently produce an unscoped insert.
function extractForcedFields(obj, schema, strict) {
const forced = {};
for (const [field, value] of Object.entries(obj)) {
if (field === "OR" || field === "AND" || field === "NOT") {
if (strict) {
throw new errors_1.ValidationError(`create policy cannot use the "${field}" combinator — inserts only support forced field values`);
}
continue;
}
if (isScalar(value)) {
forced[field] = value;
continue;
}
if (strict && isRequiredField(field, schema)) {
throw new errors_1.ValidationError(`create policy uses an operator filter on required field "${field}", which an insert cannot satisfy`);
}
}
return forced;
}
function isRequiredField(field, schema) {
const f = schema?.fields[field];
if (!f)
return false;
return !f.isId && !f.isNullable && !f.hasDefaultValue;
}
function rowFilterFromObject(obj) {
const filters = Object.entries(obj).map(([field, value]) => ({
type: "eq",
field,
value,
}));
if (filters.length === 1)
return filters[0];
return { type: "and", filters };
}
function mergeFilters(policyFilter, llmFilter) {
if (!policyFilter && !llmFilter)
return undefined;
if (!policyFilter)
return llmFilter;
if (!llmFilter)
return policyFilter;
return { type: "and", filters: [policyFilter, llmFilter] };
}
//# sourceMappingURL=engine.js.map
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/policy/engine.ts"],"names":[],"mappings":"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"}
import { SchemaMap, PolicyFn, FieldSchema } from "../types";
import type { GetToolsOptions, PaginationConfig } from "../valv";
/** Fallback pagination bounds for direct callers; production flows pass config from ValvConfig. */
export declare const DEFAULT_PAGINATION: PaginationConfig;
export declare const CONSOLIDATED_VERBS: readonly ["query", "get", "create", "update", "delete", "aggregate"];
export declare const CONSOLIDATED_META: readonly ["list_resources", "describe_resource"];
export declare const RESERVED_TOOL_NAMES: string[];
/**
* Provider-neutral tool definition. This is the single source of truth from
* which every provider-specific shape (Anthropic, OpenAI, Gemini, …) is derived
* by a formatter. `parameters` is a JSON Schema object describing the input.
*/
export interface NeutralTool {
name: string;
description: string;
parameters: object;
}
export declare function generateTools<TContext>(schema: SchemaMap, policies: Record<string, PolicyFn<TContext>>, ctx: TContext, defaultPolicy: "deny-all" | "allow-all", paginationConfig?: PaginationConfig, options?: GetToolsOptions): NeutralTool[];
export declare function generateConsolidatedTools<TContext>(schema: SchemaMap, policies: Record<string, PolicyFn<TContext>>, ctx: TContext, defaultPolicy: "deny-all" | "allow-all", paginationConfig?: PaginationConfig, options?: GetToolsOptions): NeutralTool[];
export declare function buildFieldSchema(field: FieldSchema): Record<string, unknown>;
//# sourceMappingURL=generator.d.ts.map
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/tools/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEhE,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,EAAE,gBAAsD,CAAA;AAEvF,eAAO,MAAM,kBAAkB,sEAOrB,CAAA;AACV,eAAO,MAAM,iBAAiB,kDAAmD,CAAA;AACjF,eAAO,MAAM,mBAAmB,EAAoD,MAAM,EAAE,CAAA;AAE5F;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAaD,wBAAgB,aAAa,CAAC,QAAQ,EACpC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC5C,GAAG,EAAE,QAAQ,EACb,aAAa,EAAE,UAAU,GAAG,WAAW,EACvC,gBAAgB,GAAE,gBAAqC,EACvD,OAAO,CAAC,EAAE,eAAe,GACxB,WAAW,EAAE,CAqEf;AAgTD,wBAAgB,yBAAyB,CAAC,QAAQ,EAChD,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC5C,GAAG,EAAE,QAAQ,EACb,aAAa,EAAE,UAAU,GAAG,WAAW,EACvC,gBAAgB,GAAE,gBAAqC,EACvD,OAAO,CAAC,EAAE,eAAe,GACxB,WAAW,EAAE,CA4Pf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqB5E"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RESERVED_TOOL_NAMES = exports.CONSOLIDATED_META = exports.CONSOLIDATED_VERBS = exports.DEFAULT_PAGINATION = void 0;
exports.generateTools = generateTools;
exports.generateConsolidatedTools = generateConsolidatedTools;
exports.buildFieldSchema = buildFieldSchema;
const engine_1 = require("../policy/engine");
/** Fallback pagination bounds for direct callers; production flows pass config from ValvConfig. */
exports.DEFAULT_PAGINATION = { maxLimit: 100, defaultLimit: 50 };
exports.CONSOLIDATED_VERBS = [
"query",
"get",
"create",
"update",
"delete",
"aggregate",
];
exports.CONSOLIDATED_META = ["list_resources", "describe_resource"];
exports.RESERVED_TOOL_NAMES = [...exports.CONSOLIDATED_VERBS, ...exports.CONSOLIDATED_META];
// A create tool is only generated if every required field (non-id, non-nullable,
// no default) is either writable by the caller or force-injected by policy —
// otherwise the LLM could never produce a valid insert.
function createIsSatisfiable(resource, createPolicy) {
const forcedFields = createPolicy.forcedWriteFields ?? {};
return Object.entries(resource.fields).every(([name, field]) => {
if (field.isId || field.isNullable || field.hasDefaultValue)
return true;
return createPolicy.allowedFields.includes(name) || name in forcedFields;
});
}
function generateTools(schema, policies, ctx, defaultPolicy, paginationConfig = exports.DEFAULT_PAGINATION, options) {
const tools = [];
const resourceNames = options?.resources ?? Object.keys(schema.resources);
for (const resourceName of resourceNames) {
const resource = schema.resources[resourceName];
if (!resource)
continue;
const readPolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "read", defaultPolicy, resource);
const createPolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "create", defaultPolicy, resource);
const updatePolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "update", defaultPolicy, resource);
const deletePolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "delete", defaultPolicy, resource);
const aggregatePolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "aggregate", defaultPolicy, resource);
if (readPolicy.allowed) {
tools.push(buildQueryTool(resourceName, resource, readPolicy, paginationConfig));
tools.push(buildGetTool(resourceName, resource, readPolicy));
}
if (createPolicy.allowed && createIsSatisfiable(resource, createPolicy)) {
tools.push(buildCreateTool(resourceName, resource, createPolicy));
}
if (updatePolicy.allowed) {
tools.push(buildUpdateTool(resourceName, resource, updatePolicy));
}
if (deletePolicy.allowed) {
tools.push(buildDeleteTool(resourceName, resource));
}
// Aggregate tool if there are numeric fields the caller may read.
if (aggregatePolicy.allowed) {
const numericFields = aggregatePolicy.allowedFields.filter((f) => resource.fields[f]?.type === "number");
if (numericFields.length > 0) {
tools.push(buildAggregateTool(resourceName, resource, aggregatePolicy, numericFields));
}
}
if (options?.maxTools && tools.length >= options.maxTools)
break;
}
return tools;
}
function buildQueryTool(resourceName, resource, policy, paginationConfig) {
const description = resource.description
? `Query multiple ${resourceName} records. ${resource.description}`
: `Query multiple ${resourceName} records with filters, sorting, and pagination.`;
return {
name: `query_${resourceName}`,
description,
parameters: {
type: "object",
properties: {
filters: buildFiltersSchema(resource, policy.allowedFields),
include: buildIncludeSchema(policy.allowedRelations),
sort: buildSortSchema(policy.allowedFields),
...buildPaginationSchema(paginationConfig),
},
additionalProperties: false,
},
};
}
// Shared pagination params for query tools (per-resource and consolidated).
function buildPaginationSchema(cfg) {
return {
limit: {
type: "number",
description: `Maximum number of records to return (default ${cfg.defaultLimit}, max ${cfg.maxLimit})`,
minimum: 1,
maximum: cfg.maxLimit,
},
offset: {
type: "number",
description: "Number of records to skip (ignored if cursor is supplied; prefer cursor for pagination)",
},
cursor: {
type: "string",
description: "Opaque pagination cursor from a previous result's nextCursor. Pass it alone to fetch the next page — it already carries the sort, so do not resend `sort` (or resend the identical one).",
},
};
}
function buildGetTool(resourceName, resource, policy) {
const idField = Object.values(resource.fields).find((f) => f.isId);
const idSchema = idField ? buildFieldSchema(idField) : { type: "string" };
const description = resource.description
? `Get a single ${resourceName} by ID. ${resource.description}`
: `Get a single ${resourceName} by ID.`;
return {
name: `get_${resourceName}`,
description,
parameters: {
type: "object",
properties: {
id: { ...idSchema, description: `ID of the ${resourceName} to retrieve` },
include: buildIncludeSchema(policy.allowedRelations),
},
required: ["id"],
additionalProperties: false,
},
};
}
function buildCreateTool(resourceName, resource, policy) {
const forcedKeys = new Set(Object.keys(policy.forcedWriteFields ?? {}));
const writableFields = policy.allowedFields.filter((f) => {
const field = resource.fields[f];
return field && !field.isId && !forcedKeys.has(f);
});
const properties = {};
const required = [];
for (const fieldName of writableFields) {
const field = resource.fields[fieldName];
if (!field)
continue;
properties[fieldName] = buildFieldSchema(field);
// Only required if not nullable and has no DB default
if (!field.isNullable && !field.hasDefaultValue)
required.push(fieldName);
}
return {
name: `create_${resourceName}`,
description: `Create a new ${resourceName} record.`,
parameters: {
type: "object",
properties,
required: required.length > 0 ? required : undefined,
additionalProperties: false,
},
};
}
function buildUpdateTool(resourceName, resource, policy) {
const idField = Object.values(resource.fields).find((f) => f.isId);
const idSchema = idField ? buildFieldSchema(idField) : { type: "string" };
const forcedKeys = new Set(Object.keys(policy.forcedWriteFields ?? {}));
const writableFields = policy.allowedFields.filter((f) => {
const field = resource.fields[f];
return field && !field.isId && !forcedKeys.has(f);
});
const properties = {
id: { ...idSchema, description: `ID of the ${resourceName} to update` },
};
for (const fieldName of writableFields) {
const field = resource.fields[fieldName];
if (!field)
continue;
properties[fieldName] = buildFieldSchema(field);
}
return {
name: `update_${resourceName}`,
description: `Update an existing ${resourceName} record by ID.`,
parameters: {
type: "object",
properties,
required: ["id"],
additionalProperties: false,
},
};
}
function buildDeleteTool(resourceName, resource) {
const idField = Object.values(resource.fields).find((f) => f.isId);
const idSchema = idField ? buildFieldSchema(idField) : { type: "string" };
return {
name: `delete_${resourceName}`,
description: `Delete a ${resourceName} record by ID.`,
parameters: {
type: "object",
properties: {
id: { ...idSchema, description: `ID of the ${resourceName} to delete` },
},
required: ["id"],
additionalProperties: false,
},
};
}
function buildAggregateTool(resourceName, resource, policy, numericFields) {
return {
name: `aggregate_${resourceName}`,
description: `Aggregate ${resourceName} records (count, sum, avg, min, max with optional groupBy).`,
parameters: {
type: "object",
properties: {
aggregations: {
type: "array",
description: "List of aggregation operations to perform",
items: {
type: "object",
properties: {
fn: { type: "string", enum: ["count", "sum", "avg", "min", "max"] },
field: { type: "string", enum: numericFields },
alias: { type: "string" },
},
required: ["fn", "field", "alias"],
additionalProperties: false,
},
},
filters: buildFiltersSchema(resource, policy.allowedFields),
groupBy: {
type: "array",
items: { type: "string", enum: policy.allowedFields },
description: "Fields to group by",
},
},
required: ["aggregations"],
additionalProperties: false,
},
};
}
function buildFiltersSchema(resource, allowedFields) {
const properties = {};
for (const fieldName of allowedFields) {
const field = resource.fields[fieldName];
if (!field)
continue;
const description = field.description ?? `Filter by ${fieldName}`;
if (field.type === "enum" && field.enumValues) {
properties[fieldName] = {
oneOf: [
{ type: "string", enum: field.enumValues, description },
{
type: "object",
properties: {
in: { type: "array", items: { type: "string", enum: field.enumValues } },
},
additionalProperties: false,
description: `Filter by multiple ${fieldName} values`,
},
],
};
}
else if (field.type === "number" || field.type === "date") {
properties[fieldName] = {
oneOf: [
buildFieldSchema(field),
{
type: "object",
properties: {
gte: buildFieldSchema(field),
lte: buildFieldSchema(field),
gt: buildFieldSchema(field),
lt: buildFieldSchema(field),
},
additionalProperties: false,
description: `Range filter for ${fieldName}`,
},
],
};
}
else if (field.type === "string") {
properties[fieldName] = {
oneOf: [
{ type: "string", description },
{
type: "object",
properties: {
contains: { type: "string" },
startsWith: { type: "string" },
endsWith: { type: "string" },
in: { type: "array", items: { type: "string" } },
},
additionalProperties: false,
description: `String filter for ${fieldName}`,
},
],
};
}
else {
properties[fieldName] = { ...buildFieldSchema(field), description };
}
}
return {
type: "object",
properties,
additionalProperties: false,
description: "Filter conditions",
};
}
function buildIncludeSchema(allowedRelations) {
if (allowedRelations.length === 0) {
return {
type: "array",
items: { type: "string", enum: [] },
description: "Relations to include",
};
}
return {
type: "array",
items: { type: "string", enum: allowedRelations },
description: "Relations to include",
};
}
function buildSortSchema(allowedFields) {
return {
type: "object",
properties: {
field: { type: "string", enum: allowedFields },
direction: { type: "string", enum: ["asc", "desc"] },
},
required: ["field", "direction"],
additionalProperties: false,
description: "Sort order",
};
}
function generateConsolidatedTools(schema, policies, ctx, defaultPolicy, paginationConfig = exports.DEFAULT_PAGINATION, options) {
const tools = [];
const candidateNames = options?.resources ?? Object.keys(schema.resources);
const queryResources = [];
const createResources = [];
const updateResources = [];
const deleteResources = [];
const aggregateResources = [];
for (const resourceName of candidateNames) {
const resource = schema.resources[resourceName];
if (!resource)
continue;
const readPolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "read", defaultPolicy, resource);
if (readPolicy.allowed)
queryResources.push(resourceName);
const aggregatePolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "aggregate", defaultPolicy, resource);
if (aggregatePolicy.allowed) {
const numericFields = aggregatePolicy.allowedFields.filter((f) => resource.fields[f]?.type === "number");
if (numericFields.length > 0)
aggregateResources.push(resourceName);
}
const createPolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "create", defaultPolicy, resource);
if (createPolicy.allowed && createIsSatisfiable(resource, createPolicy)) {
createResources.push(resourceName);
}
const updatePolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "update", defaultPolicy, resource);
if (updatePolicy.allowed)
updateResources.push(resourceName);
const deletePolicy = (0, engine_1.evaluatePolicy)(policies[resourceName], ctx, "delete", defaultPolicy, resource);
if (deletePolicy.allowed)
deleteResources.push(resourceName);
}
const allAccessible = [
...new Set([...queryResources, ...createResources, ...updateResources, ...deleteResources]),
];
if (allAccessible.length === 0)
return tools;
tools.push({
name: "list_resources",
description: "List all accessible resources and which operations are available for each.",
parameters: { type: "object", properties: {}, additionalProperties: false },
});
tools.push({
name: "describe_resource",
description: "Return the field schema and allowed operations for a specific resource. Call this before query/create/update to learn valid field names.",
parameters: {
type: "object",
properties: {
resource: {
type: "string",
enum: allAccessible,
description: "The resource to describe",
},
},
required: ["resource"],
additionalProperties: false,
},
});
if (queryResources.length > 0) {
tools.push({
name: "query",
description: "Query multiple records of a resource. Call describe_resource first to learn valid filter/sort field names.",
parameters: {
type: "object",
properties: {
resource: { type: "string", enum: queryResources, description: "The resource to query" },
filters: {
type: "object",
additionalProperties: true,
description: "Filter conditions (use field names from describe_resource)",
},
sort: {
type: "object",
properties: {
field: { type: "string", description: "Field to sort by" },
direction: { type: "string", enum: ["asc", "desc"] },
},
required: ["field", "direction"],
additionalProperties: false,
},
include: {
type: "array",
items: { type: "string" },
description: "Relation names to include",
},
...buildPaginationSchema(paginationConfig),
},
required: ["resource"],
additionalProperties: false,
},
});
tools.push({
name: "get",
description: "Get a single record of a resource by ID.",
parameters: {
type: "object",
properties: {
resource: { type: "string", enum: queryResources, description: "The resource to fetch" },
id: { description: "ID of the record to retrieve" },
include: {
type: "array",
items: { type: "string" },
description: "Relation names to include",
},
},
required: ["resource", "id"],
additionalProperties: false,
},
});
}
if (createResources.length > 0) {
tools.push({
name: "create",
description: "Create a new record. Call describe_resource first to learn required and optional field names.",
parameters: {
type: "object",
properties: {
resource: {
type: "string",
enum: createResources,
description: "The resource to create",
},
data: {
type: "object",
additionalProperties: true,
description: "Field values for the new record",
},
},
required: ["resource", "data"],
additionalProperties: false,
},
});
}
if (updateResources.length > 0) {
tools.push({
name: "update",
description: "Update an existing record by ID. Call describe_resource first to learn valid field names.",
parameters: {
type: "object",
properties: {
resource: {
type: "string",
enum: updateResources,
description: "The resource to update",
},
id: { description: "ID of the record to update" },
data: { type: "object", additionalProperties: true, description: "Fields to update" },
},
required: ["resource", "id", "data"],
additionalProperties: false,
},
});
}
if (deleteResources.length > 0) {
tools.push({
name: "delete",
description: "Delete a record by ID.",
parameters: {
type: "object",
properties: {
resource: {
type: "string",
enum: deleteResources,
description: "The resource to delete from",
},
id: { description: "ID of the record to delete" },
},
required: ["resource", "id"],
additionalProperties: false,
},
});
}
if (aggregateResources.length > 0) {
tools.push({
name: "aggregate",
description: "Aggregate records (count, sum, avg, min, max with optional groupBy). Call describe_resource first to learn valid field names.",
parameters: {
type: "object",
properties: {
resource: {
type: "string",
enum: aggregateResources,
description: "The resource to aggregate",
},
aggregations: {
type: "array",
description: "List of aggregation operations to perform",
items: {
type: "object",
properties: {
fn: { type: "string", enum: ["count", "sum", "avg", "min", "max"] },
field: {
type: "string",
description: "Field to aggregate (use numeric fields from describe_resource)",
},
alias: { type: "string" },
},
required: ["fn", "field", "alias"],
additionalProperties: false,
},
},
filters: { type: "object", additionalProperties: true, description: "Filter conditions" },
groupBy: { type: "array", items: { type: "string" }, description: "Fields to group by" },
},
required: ["resource", "aggregations"],
additionalProperties: false,
},
});
}
return tools;
}
function buildFieldSchema(field) {
const base = {};
if (field.description)
base.description = field.description;
switch (field.type) {
case "string":
case "uuid":
return { ...base, type: "string" };
case "number":
return { ...base, type: "number" };
case "boolean":
return { ...base, type: "boolean" };
case "date":
return { ...base, type: "string", format: "date-time" };
case "json":
return { ...base, type: "object" };
case "enum":
return { ...base, type: "string", enum: field.enumValues ?? [] };
default:
return { ...base, type: "string" };
}
}
//# sourceMappingURL=generator.js.map
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/tools/generator.ts"],"names":[],"mappings":";;;AAwCA,sCA4EC;AAgTD,8DAmQC;AAED,4CAqBC;AA7rBD,6CAAkE;AAGlE,mGAAmG;AACtF,QAAA,kBAAkB,GAAqB,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;AAE1E,QAAA,kBAAkB,GAAG;IAChC,OAAO;IACP,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,WAAW;CACH,CAAA;AACG,QAAA,iBAAiB,GAAG,CAAC,gBAAgB,EAAE,mBAAmB,CAAU,CAAA;AACpE,QAAA,mBAAmB,GAAG,CAAC,GAAG,0BAAkB,EAAE,GAAG,yBAAiB,CAAa,CAAA;AAa5F,iFAAiF;AACjF,6EAA6E;AAC7E,wDAAwD;AACxD,SAAS,mBAAmB,CAAC,QAAwB,EAAE,YAA6B;IAClF,MAAM,YAAY,GAAG,YAAY,CAAC,iBAAiB,IAAI,EAAE,CAAA;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7D,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,eAAe;YAAE,OAAO,IAAI,CAAA;QACxE,OAAO,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,YAAY,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAgB,aAAa,CAC3B,MAAiB,EACjB,QAA4C,EAC5C,GAAa,EACb,aAAuC,EACvC,mBAAqC,0BAAkB,EACvD,OAAyB;IAEzB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,aAAa,GAAG,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAEzE,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ;YAAE,SAAQ;QAEvB,MAAM,UAAU,GAAG,IAAA,uBAAc,EAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAA;QAC/F,MAAM,YAAY,GAAG,IAAA,uBAAc,EACjC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAA;QACD,MAAM,YAAY,GAAG,IAAA,uBAAc,EACjC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAA;QACD,MAAM,YAAY,GAAG,IAAA,uBAAc,EACjC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAA;QACD,MAAM,eAAe,GAAG,IAAA,uBAAc,EACpC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,WAAW,EACX,aAAa,EACb,QAAQ,CACT,CAAA;QAED,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAA;YAChF,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;QAC9D,CAAC;QAED,IAAI,YAAY,CAAC,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAA;QACnE,CAAC;QAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAA;QACnE,CAAC;QAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAA;QACrD,CAAC;QAED,kEAAkE;QAClE,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAC7C,CAAA;YACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAA;YACxF,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAK;IAClE,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,cAAc,CACrB,YAAoB,EACpB,QAAwB,EACxB,MAAuB,EACvB,gBAAkC;IAElC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW;QACtC,CAAC,CAAC,kBAAkB,YAAY,aAAa,QAAQ,CAAC,WAAW,EAAE;QACnE,CAAC,CAAC,kBAAkB,YAAY,iDAAiD,CAAA;IAEnF,OAAO;QACL,IAAI,EAAE,SAAS,YAAY,EAAE;QAC7B,WAAW;QACX,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;gBAC3D,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACpD,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3C,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;aAC3C;YACD,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAA;AACH,CAAC;AAED,4EAA4E;AAC5E,SAAS,qBAAqB,CAAC,GAAqB;IAClD,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gDAAgD,GAAG,CAAC,YAAY,SAAS,GAAG,CAAC,QAAQ,GAAG;YACrG,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,GAAG,CAAC,QAAQ;SACtB;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,yFAAyF;SAC5F;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,0LAA0L;SAC7L;KACF,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CACnB,YAAoB,EACpB,QAAwB,EACxB,MAAuB;IAEvB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACzE,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW;QACtC,CAAC,CAAC,gBAAgB,YAAY,WAAW,QAAQ,CAAC,WAAW,EAAE;QAC/D,CAAC,CAAC,gBAAgB,YAAY,SAAS,CAAA;IAEzC,OAAO;QACL,IAAI,EAAE,OAAO,YAAY,EAAE;QAC3B,WAAW;QACX,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,aAAa,YAAY,cAAc,EAAE;gBACzE,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC;aACrD;YACD,QAAQ,EAAE,CAAC,IAAI,CAAC;YAChB,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CACtB,YAAoB,EACpB,QAAwB,EACxB,MAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAA;IACvE,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAChC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,MAAM,UAAU,GAA4B,EAAE,CAAA;IAC9C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,UAAU,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAC/C,sDAAsD;QACtD,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,eAAe;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU,YAAY,EAAE;QAC9B,WAAW,EAAE,gBAAgB,YAAY,UAAU;QACnD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACpD,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CACtB,YAAoB,EACpB,QAAwB,EACxB,MAAuB;IAEvB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACzE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAA;IAEvE,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAChC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,MAAM,UAAU,GAA4B;QAC1C,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,aAAa,YAAY,YAAY,EAAE;KACxE,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,UAAU,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU,YAAY,EAAE;QAC9B,WAAW,EAAE,sBAAsB,YAAY,gBAAgB;QAC/D,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ,EAAE,CAAC,IAAI,CAAC;YAChB,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,YAAoB,EAAE,QAAwB;IACrE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAEzE,OAAO;QACL,IAAI,EAAE,UAAU,YAAY,EAAE;QAC9B,WAAW,EAAE,YAAY,YAAY,gBAAgB;QACrD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,aAAa,YAAY,YAAY,EAAE;aACxE;YACD,QAAQ,EAAE,CAAC,IAAI,CAAC;YAChB,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAoB,EACpB,QAAwB,EACxB,MAAuB,EACvB,aAAuB;IAEvB,OAAO;QACL,IAAI,EAAE,aAAa,YAAY,EAAE;QACjC,WAAW,EAAE,aAAa,YAAY,6DAA6D;QACnG,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,2CAA2C;oBACxD,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE;4BACnE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;4BAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC1B;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;wBAClC,oBAAoB,EAAE,KAAK;qBAC5B;iBACF;gBACD,OAAO,EAAE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;gBAC3D,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,aAAa,EAAE;oBACrD,WAAW,EAAE,oBAAoB;iBAClC;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;YAC1B,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAwB,EACxB,aAAuB;IAEvB,MAAM,UAAU,GAA4B,EAAE,CAAA;IAE9C,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,SAAQ;QAEpB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,aAAa,SAAS,EAAE,CAAA;QAEjE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9C,UAAU,CAAC,SAAS,CAAC,GAAG;gBACtB,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE;oBACvD;wBACE,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE;yBACzE;wBACD,oBAAoB,EAAE,KAAK;wBAC3B,WAAW,EAAE,sBAAsB,SAAS,SAAS;qBACtD;iBACF;aACF,CAAA;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5D,UAAU,CAAC,SAAS,CAAC,GAAG;gBACtB,KAAK,EAAE;oBACL,gBAAgB,CAAC,KAAK,CAAC;oBACvB;wBACE,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC;4BAC5B,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC;4BAC5B,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC;4BAC3B,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC;yBAC5B;wBACD,oBAAoB,EAAE,KAAK;wBAC3B,WAAW,EAAE,oBAAoB,SAAS,EAAE;qBAC7C;iBACF;aACF,CAAA;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,UAAU,CAAC,SAAS,CAAC,GAAG;gBACtB,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE;oBAC/B;wBACE,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC5B,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;yBACjD;wBACD,oBAAoB,EAAE,KAAK;wBAC3B,WAAW,EAAE,qBAAqB,SAAS,EAAE;qBAC9C;iBACF;aACF,CAAA;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;QACrE,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,oBAAoB,EAAE,KAAK;QAC3B,WAAW,EAAE,mBAAmB;KACjC,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,gBAA0B;IACpD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;YACnC,WAAW,EAAE,sBAAsB;SACpC,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;QACjD,WAAW,EAAE,sBAAsB;KACpC,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,aAAuB;IAC9C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;YAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;SACrD;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;QAChC,oBAAoB,EAAE,KAAK;QAC3B,WAAW,EAAE,YAAY;KAC1B,CAAA;AACH,CAAC;AAED,SAAgB,yBAAyB,CACvC,MAAiB,EACjB,QAA4C,EAC5C,GAAa,EACb,aAAuC,EACvC,mBAAqC,0BAAkB,EACvD,OAAyB;IAEzB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,cAAc,GAAG,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAE1E,MAAM,cAAc,GAAa,EAAE,CAAA;IACnC,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,kBAAkB,GAAa,EAAE,CAAA;IAEvC,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ;YAAE,SAAQ;QAEvB,MAAM,UAAU,GAAG,IAAA,uBAAc,EAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAA;QAC/F,IAAI,UAAU,CAAC,OAAO;YAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEzD,MAAM,eAAe,GAAG,IAAA,uBAAc,EACpC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,WAAW,EACX,aAAa,EACb,QAAQ,CACT,CAAA;QACD,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAC7C,CAAA;YACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;gBAAE,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,YAAY,GAAG,IAAA,uBAAc,EACjC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAA;QACD,IAAI,YAAY,CAAC,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;YACxE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACpC,CAAC;QAED,MAAM,YAAY,GAAG,IAAA,uBAAc,EACjC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAA;QACD,IAAI,YAAY,CAAC,OAAO;YAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE5D,MAAM,YAAY,GAAG,IAAA,uBAAc,EACjC,QAAQ,CAAC,YAAY,CAAC,EACtB,GAAG,EACH,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAA;QACD,IAAI,YAAY,CAAC,OAAO;YAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,aAAa,GAAG;QACpB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,eAAe,EAAE,GAAG,eAAe,EAAE,GAAG,eAAe,CAAC,CAAC;KAC5F,CAAA;IACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAE5C,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,4EAA4E;QACzF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;KAC5E,CAAC,CAAA;IAEF,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,0IAA0I;QAC5I,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,0BAA0B;iBACxC;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;YACtB,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAC,CAAA;IAEF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,OAAO;YACb,WAAW,EACT,4GAA4G;YAC9G,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,uBAAuB,EAAE;oBACxF,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,oBAAoB,EAAE,IAAI;wBAC1B,WAAW,EAAE,4DAA4D;qBAC1E;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;4BAC1D,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;yBACrD;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;wBAChC,oBAAoB,EAAE,KAAK;qBAC5B;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,2BAA2B;qBACzC;oBACD,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;iBAC3C;gBACD,QAAQ,EAAE,CAAC,UAAU,CAAC;gBACtB,oBAAoB,EAAE,KAAK;aAC5B;SACF,CAAC,CAAA;QAEF,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,0CAA0C;YACvD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,uBAAuB,EAAE;oBACxF,EAAE,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE;oBACnD,OAAO,EAAE;wBACP,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,2BAA2B;qBACzC;iBACF;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;gBAC5B,oBAAoB,EAAE,KAAK;aAC5B;SACF,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,+FAA+F;YACjG,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,eAAe;wBACrB,WAAW,EAAE,wBAAwB;qBACtC;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,oBAAoB,EAAE,IAAI;wBAC1B,WAAW,EAAE,iCAAiC;qBAC/C;iBACF;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;gBAC9B,oBAAoB,EAAE,KAAK;aAC5B;SACF,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,2FAA2F;YAC7F,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,eAAe;wBACrB,WAAW,EAAE,wBAAwB;qBACtC;oBACD,EAAE,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;oBACjD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE;iBACtF;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;gBACpC,oBAAoB,EAAE,KAAK;aAC5B;SACF,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,wBAAwB;YACrC,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,eAAe;wBACrB,WAAW,EAAE,6BAA6B;qBAC3C;oBACD,EAAE,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;iBAClD;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;gBAC5B,oBAAoB,EAAE,KAAK;aAC5B;SACF,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,+HAA+H;YACjI,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,kBAAkB;wBACxB,WAAW,EAAE,2BAA2B;qBACzC;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,OAAO;wBACb,WAAW,EAAE,2CAA2C;wBACxD,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE;gCACnE,KAAK,EAAE;oCACL,IAAI,EAAE,QAAQ;oCACd,WAAW,EAAE,gEAAgE;iCAC9E;gCACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BAC1B;4BACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;4BAClC,oBAAoB,EAAE,KAAK;yBAC5B;qBACF;oBACD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE;oBACzF,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;iBACzF;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;gBACtC,oBAAoB,EAAE,KAAK;aAC5B;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAkB;IACjD,MAAM,IAAI,GAA4B,EAAE,CAAA;IACxC,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAA;IAE3D,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QACpC,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QACpC,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QACrC,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;QACzD,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QACpC,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAA;QAClE;YACE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACtC,CAAC;AACH,CAAC"}
export interface SchemaMap {
resources: Record<string, ResourceSchema>;
}
export interface ResourceSchema {
name: string;
tableName: string;
fields: Record<string, FieldSchema>;
relations: Record<string, RelationSchema>;
description?: string;
}
export interface FieldSchema {
name: string;
type: FieldType;
isNullable: boolean;
isId: boolean;
hasDefaultValue?: boolean;
enumValues?: string[];
description?: string;
sensitive?: boolean;
}
export type FieldType = "string" | "number" | "boolean" | "date" | "enum" | "uuid" | "json";
export interface RelationSchema {
name: string;
targetResource: string;
type: "belongsTo" | "hasMany" | "manyToMany";
foreignKey: string;
junctionTable?: string;
}
export type PolicyFn<TContext = DefaultContext> = (ctx: TContext) => PolicyResult;
export type PolicyRule = boolean | Record<string, unknown>;
export interface PolicyResult {
read?: PolicyRule;
write?: PolicyRule;
create?: PolicyRule;
update?: PolicyRule;
delete?: PolicyRule;
aggregate?: PolicyRule;
fields?: FieldPolicy;
relations?: Record<string, boolean>;
}
export interface FieldPolicy {
allow?: string[];
deny?: string[];
readOnly?: string[];
writeOnly?: string[];
}
export interface DefaultContext {
user: {
id: string;
role: string;
[key: string]: unknown;
};
tenant?: {
id: string;
[key: string]: unknown;
};
[key: string]: unknown;
}
type _CamelToSnake<S extends string> = S extends `${infer Head}${infer Tail}` ? Head extends Uppercase<Head> ? Head extends Lowercase<Head> ? `${Head}${_CamelToSnake<Tail>}` : `_${Lowercase<Head>}${_CamelToSnake<Tail>}` : `${Head}${_CamelToSnake<Tail>}` : S;
/**
* Derives valv resource names (snake_case) from a Prisma client type.
*
* @example
* const valv = new Valv<DefaultContext, InferResources<typeof prisma>>({ ... })
* // policy() and getTools() are now type-safe with autocomplete for resource names
*/
export type InferResources<TClient> = _CamelToSnake<Exclude<keyof TClient, `$${string}` | symbol | number> & string>;
export {};
//# sourceMappingURL=types.d.ts.map
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
/**
* Generate TypeScript source from a view's resultSchema, so the static types
* and the runtime schema can't disagree:
*
* ```ts
* const view = await valv.view("query_order", args, ctx)
* fs.writeFileSync("order-view.ts", generateViewTypes(view.resultSchema, "Order"))
* // → export interface OrderRow { id: string; status: "pending" | ...; ... }
* // export interface OrderResult { data: OrderRow[]; hasMore: boolean; nextCursor?: string }
* ```
*
* Handles exactly the vocabulary buildResultSchema emits: objects, arrays,
* anyOf-null unions, enums, and the JSON primitives.
*/
export declare function generateViewTypes(resultSchema: object, typeName: string): string;
//# sourceMappingURL=codegen.d.ts.map
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/view/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBhF"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateViewTypes = generateViewTypes;
/**
* Generate TypeScript source from a view's resultSchema, so the static types
* and the runtime schema can't disagree:
*
* ```ts
* const view = await valv.view("query_order", args, ctx)
* fs.writeFileSync("order-view.ts", generateViewTypes(view.resultSchema, "Order"))
* // → export interface OrderRow { id: string; status: "pending" | ...; ... }
* // export interface OrderResult { data: OrderRow[]; hasMore: boolean; nextCursor?: string }
* ```
*
* Handles exactly the vocabulary buildResultSchema emits: objects, arrays,
* anyOf-null unions, enums, and the JSON primitives.
*/
function generateViewTypes(resultSchema, typeName) {
const envelope = resultSchema;
const rowSchema = envelope.properties?.data?.items;
if (!rowSchema) {
throw new Error("generateViewTypes() expects a schema produced by view.resultSchema");
}
const rowName = `${typeName}Row`;
const lines = [];
lines.push(`export interface ${rowName} ${schemaToType(rowSchema, 0)}`);
lines.push("");
lines.push(`export interface ${typeName}Result {`);
lines.push(` data: ${rowName}[]`);
lines.push(` hasMore: boolean`);
if (envelope.properties?.nextCursor)
lines.push(` nextCursor?: string`);
lines.push(`}`);
lines.push("");
return lines.join("\n");
}
function schemaToType(schema, depth) {
const s = schema;
if (Array.isArray(s.anyOf)) {
return s.anyOf.map((variant) => schemaToType(variant, depth)).join(" | ");
}
switch (s.type) {
case "null":
return "null";
case "boolean":
return "boolean";
case "number":
case "integer":
return "number";
case "string":
if (Array.isArray(s.enum)) {
return s.enum.map((v) => JSON.stringify(v)).join(" | ");
}
return "string";
case "array":
return `${wrapUnion(schemaToType(s.items ?? {}, depth))}[]`;
case "object": {
const properties = s.properties;
if (!properties)
return "Record<string, unknown>";
const required = new Set(s.required ?? []);
const indent = " ".repeat(depth + 1);
const fields = Object.entries(properties).map(([key, value]) => {
const opt = required.has(key) ? "" : "?";
return `${indent}${safePropertyKey(key)}${opt}: ${schemaToType(value, depth + 1)}`;
});
return `{\n${fields.join("\n")}\n${" ".repeat(depth)}}`;
}
default:
return "unknown";
}
}
// Union types need parens before [] — (A | null)[] not A | null[].
function wrapUnion(type) {
return type.includes(" | ") ? `(${type})` : type;
}
function safePropertyKey(key) {
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);
}
//# sourceMappingURL=codegen.js.map
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/view/codegen.ts"],"names":[],"mappings":";;AAcA,8CAoBC;AAlCD;;;;;;;;;;;;;GAaG;AACH,SAAgB,iBAAiB,CAAC,YAAoB,EAAE,QAAgB;IACtE,MAAM,QAAQ,GAAG,YAEhB,CAAA;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAA;IAClD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,QAAQ,KAAK,CAAA;IAChC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IACvE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,UAAU,CAAC,CAAA;IAClD,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,CAAA;IAClC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAChC,IAAI,QAAQ,CAAC,UAAU,EAAE,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,KAAa;IACjD,MAAM,CAAC,GAAG,MAAiC,CAAA;IAE3C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAQ,CAAC,CAAC,KAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzF,CAAC;IAED,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,MAAM,CAAA;QACf,KAAK,SAAS;YACZ,OAAO,SAAS,CAAA;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAA;QACjB,KAAK,QAAQ;YACX,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAQ,CAAC,CAAC,IAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvE,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,KAAK,OAAO;YACV,OAAO,GAAG,SAAS,CAAC,YAAY,CAAE,CAAC,CAAC,KAAgB,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,IAAI,CAAA;QACzE,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,UAAU,GAAG,CAAC,CAAC,UAAgD,CAAA;YACrE,IAAI,CAAC,UAAU;gBAAE,OAAO,yBAAyB,CAAA;YACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAE,CAAC,CAAC,QAAqB,IAAI,EAAE,CAAC,CAAA;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;gBACxC,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAA;YACpF,CAAC,CAAC,CAAA;YACF,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAA;QAC1D,CAAC;QACD;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AAC3E,CAAC"}
import type { View, ViewResult, ViewSubscription } from "./types";
export interface ComposeSubscribeOptions {
/** Poll interval passed to each input view. */
intervalMs?: number;
/** Called on input execution errors and transform errors. */
onError?: (error: Error) => void;
}
export interface ComposedView<R> {
execute(): Promise<R>;
subscribe(onData: (result: R) => void, options?: ComposeSubscribeOptions): ViewSubscription;
}
type ViewResults<Vs extends readonly View<unknown>[]> = {
[K in keyof Vs]: Vs[K] extends View<infer T> ? ViewResult<T> : never;
};
/**
* Combine multiple views with a pure transform — the live answer to multi-step
* agent queries. Whatever the LLM computed across several tool calls gets
* reified as app code over policy-enforced inputs:
*
* ```ts
* const topSpenders = compose([ordersView, usersView], (orders, users) =>
* rankBySpend(orders.data, users.data),
* )
* topSpenders.subscribe((ranking) => leaderboard.update(ranking))
* ```
*
* subscribe() subscribes to every input and recomputes when any of them
* changes, emitting only when the transformed output actually changed. The
* inputs stay policy-enforced; the transform is application code, so nothing
* agent-generated ever executes.
*/
export declare function compose<Vs extends readonly View<any>[], R>(views: readonly [...Vs], transform: (...results: ViewResults<Vs>) => R): ComposedView<R>;
export {};
//# sourceMappingURL=compose.d.ts.map
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/view/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEjE,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAA;IACrB,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAAA;CAC5F;AAED,KAAK,WAAW,CAAC,EAAE,SAAS,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI;KACrD,CAAC,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK;CACrE,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAgB,OAAO,CAAC,EAAE,SAAS,SAAS,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EACxD,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EACvB,SAAS,EAAE,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,GAC5C,YAAY,CAAC,CAAC,CAAC,CA8CjB"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.compose = compose;
/**
* Combine multiple views with a pure transform — the live answer to multi-step
* agent queries. Whatever the LLM computed across several tool calls gets
* reified as app code over policy-enforced inputs:
*
* ```ts
* const topSpenders = compose([ordersView, usersView], (orders, users) =>
* rankBySpend(orders.data, users.data),
* )
* topSpenders.subscribe((ranking) => leaderboard.update(ranking))
* ```
*
* subscribe() subscribes to every input and recomputes when any of them
* changes, emitting only when the transformed output actually changed. The
* inputs stay policy-enforced; the transform is application code, so nothing
* agent-generated ever executes.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function compose(views, transform) {
const execute = async () => {
const results = await Promise.all(views.map((v) => v.execute()));
return transform(...results);
};
return {
execute,
subscribe(onData, options) {
const latest = views.map(() => undefined);
let lastSnapshot;
let stopped = false;
const recompute = () => {
// Wait until every input has produced at least one result.
if (stopped || latest.some((r) => r === undefined))
return;
try {
const out = transform(...latest);
const snapshot = JSON.stringify(out);
if (snapshot === lastSnapshot)
return;
lastSnapshot = snapshot;
onData(out);
}
catch (err) {
options?.onError?.(err);
}
};
const subs = views.map((view, i) => view.subscribe((result) => {
latest[i] = result;
recompute();
}, { intervalMs: options?.intervalMs, onError: options?.onError }));
return {
stop() {
if (stopped)
return;
stopped = true;
for (const s of subs)
s.stop();
},
};
},
};
}
//# sourceMappingURL=compose.js.map
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/view/compose.ts"],"names":[],"mappings":";;AAoCA,0BAiDC;AAnED;;;;;;;;;;;;;;;;GAgBG;AACH,8DAA8D;AAC9D,SAAgB,OAAO,CACrB,KAAuB,EACvB,SAA6C;IAE7C,MAAM,OAAO,GAAG,KAAK,IAAgB,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAChE,OAAO,SAAS,CAAC,GAAI,OAA2B,CAAC,CAAA;IACnD,CAAC,CAAA;IAED,OAAO;QACL,OAAO;QACP,SAAS,CAAC,MAAM,EAAE,OAAO;YACvB,MAAM,MAAM,GAA2C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACjF,IAAI,YAAgC,CAAA;YACpC,IAAI,OAAO,GAAG,KAAK,CAAA;YAEnB,MAAM,SAAS,GAAG,GAAS,EAAE;gBAC3B,2DAA2D;gBAC3D,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;oBAAE,OAAM;gBAC1D,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,SAAS,CAAC,GAAI,MAA0B,CAAC,CAAA;oBACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;oBACpC,IAAI,QAAQ,KAAK,YAAY;wBAAE,OAAM;oBACrC,YAAY,GAAG,QAAQ,CAAA;oBACvB,MAAM,CAAC,GAAG,CAAC,CAAA;gBACb,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,EAAE,OAAO,EAAE,CAAC,GAAY,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC,CAAA;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CACjC,IAAI,CAAC,SAAS,CACZ,CAAC,MAAM,EAAE,EAAE;gBACT,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;gBAClB,SAAS,EAAE,CAAA;YACb,CAAC,EACD,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAC/D,CACF,CAAA;YAED,OAAO;gBACL,IAAI;oBACF,IAAI,OAAO;wBAAE,OAAM;oBACnB,OAAO,GAAG,IAAI,CAAA;oBACd,KAAK,MAAM,CAAC,IAAI,IAAI;wBAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAChC,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
import type { View, ViewResult, ViewSubscription } from "./types";
/**
* A declarative reshape of a view's rows: group, aggregate, sort, limit.
* Deliberately data-only — safe to accept from an agent (e.g. the model emits
* the spec for the chart it wants) because it is validated against the source
* view's result schema and can only reshape rows, never execute code.
*/
export interface DeriveSpec {
groupBy?: string[];
aggregations: Array<{
alias: string;
fn: "count" | "sum" | "avg" | "min" | "max";
/** Source row field. Optional for `count` (counts rows). */
field?: string;
}>;
sort?: {
field: string;
direction?: "asc" | "desc";
};
limit?: number;
}
export interface DerivedView<R = Record<string, unknown>> {
readonly spec: DeriveSpec;
/** JSON Schema of the derived envelope. */
readonly resultSchema: object;
execute(): Promise<ViewResult<R>>;
subscribe(onData: (result: ViewResult<R>) => void, options?: {
intervalMs?: number;
emitInitial?: boolean;
onError?: (error: Error) => void;
}): ViewSubscription;
}
/**
* Derive a live, reshaped view from a source view — e.g. turn the agent's
* `query_order` into a revenue-by-status series:
*
* ```ts
* const revenue = deriveView(ordersView, {
* groupBy: ["status"],
* aggregations: [{ alias: "revenue", fn: "sum", field: "total" }],
* sort: { field: "revenue", direction: "desc" },
* })
* revenue.subscribe(({ data }) => chart.update(data))
* ```
*
* The computation happens client-side over the source rows; for large tables
* prefer an `aggregate_*` view so the database does the work.
*
* The second type parameter asserts the derived row shape (the runtime source
* of truth is `resultSchema`): `deriveView<OrderRow, SeriesRow>(view, spec)`.
*/
export declare function deriveView<T, R = Record<string, unknown>>(source: View<T>, spec: DeriveSpec): DerivedView<R>;
//# sourceMappingURL=derive.d.ts.map
{"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../src/view/derive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAGjE;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,YAAY,EAAE,KAAK,CAAC;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;QAC3C,4DAA4D;QAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;IACF,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAA;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,SAAS,CACP,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EACvC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE,GACzF,gBAAgB,CAAA;CACpB;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,IAAI,EAAE,UAAU,GACf,WAAW,CAAC,CAAC,CAAC,CAwEhB"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deriveView = deriveView;
const errors_1 = require("../errors");
const SAFE_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;
// Specs may come from an agent — never let an alias write to the prototype chain.
const FORBIDDEN_KEYS = new Set(["__proto__", "constructor", "prototype"]);
const AGG_FNS = new Set(["count", "sum", "avg", "min", "max"]);
/**
* Derive a live, reshaped view from a source view — e.g. turn the agent's
* `query_order` into a revenue-by-status series:
*
* ```ts
* const revenue = deriveView(ordersView, {
* groupBy: ["status"],
* aggregations: [{ alias: "revenue", fn: "sum", field: "total" }],
* sort: { field: "revenue", direction: "desc" },
* })
* revenue.subscribe(({ data }) => chart.update(data))
* ```
*
* The computation happens client-side over the source rows; for large tables
* prefer an `aggregate_*` view so the database does the work.
*
* The second type parameter asserts the derived row shape (the runtime source
* of truth is `resultSchema`): `deriveView<OrderRow, SeriesRow>(view, spec)`.
*/
function deriveView(source, spec) {
const rowProperties = sourceRowProperties(source);
validateSpec(spec, rowProperties);
const apply = (rows) => {
const groupBy = spec.groupBy ?? [];
const groups = new Map();
for (const row of rows) {
const key = JSON.stringify(groupBy.map((g) => row[g]));
const bucket = groups.get(key);
if (bucket)
bucket.push(row);
else
groups.set(key, [row]);
}
let out = [];
for (const bucket of groups.values()) {
const row = {};
for (const g of groupBy)
row[g] = bucket[0][g];
for (const agg of spec.aggregations) {
row[agg.alias] = aggregate(bucket, agg.fn, agg.field);
}
out.push(row);
}
if (spec.sort) {
const { field } = spec.sort;
const mul = spec.sort.direction === "desc" ? -1 : 1;
out.sort((a, b) => {
const av = a[field];
const bv = b[field];
if (av === bv)
return 0;
if (av === null || av === undefined)
return mul;
if (bv === null || bv === undefined)
return -mul;
return av < bv ? -mul : mul;
});
}
if (spec.limit !== undefined)
out = out.slice(0, spec.limit);
return out;
};
const wrap = (result) => ({
data: apply(result.data),
hasMore: false,
});
const resultSchema = buildDerivedSchema(spec, rowProperties);
return {
spec,
resultSchema,
execute: async () => wrap(await source.execute()),
subscribe(onData, options) {
// Diff on the derived output: a source change that doesn't move the
// derived numbers (e.g. an untouched column changed) must not emit.
let lastSnapshot;
let emittedOnce = false;
const emitInitial = options?.emitInitial !== false;
return source.subscribe((result) => {
const derived = wrap(result);
const snapshot = JSON.stringify(derived);
const first = !emittedOnce;
emittedOnce = true;
if (snapshot === lastSnapshot)
return;
lastSnapshot = snapshot;
if (first && !emitInitial)
return;
onData(derived);
}, { intervalMs: options?.intervalMs, onError: options?.onError });
},
};
}
function aggregate(rows, fn, field) {
if (fn === "count") {
return field
? rows.filter((r) => r[field] !== null && r[field] !== undefined).length
: rows.length;
}
const values = rows.map((r) => r[field]).filter((v) => typeof v === "number");
if (values.length === 0)
return null;
switch (fn) {
case "sum":
return values.reduce((a, b) => a + b, 0);
case "avg":
return values.reduce((a, b) => a + b, 0) / values.length;
case "min":
return values.reduce((a, b) => Math.min(a, b));
case "max":
return values.reduce((a, b) => Math.max(a, b));
}
}
function sourceRowProperties(source) {
const envelope = source.resultSchema;
return envelope.properties?.data?.items?.properties ?? {};
}
function validateSpec(spec, rowProperties) {
if (!Array.isArray(spec.aggregations) || spec.aggregations.length === 0) {
throw new errors_1.ValidationError("deriveView() requires at least one aggregation");
}
const aliases = new Set();
for (const agg of spec.aggregations) {
if (!AGG_FNS.has(agg.fn)) {
throw new errors_1.ValidationError(`Unknown aggregation fn "${agg.fn}"`);
}
if (!SAFE_KEY.test(agg.alias) || FORBIDDEN_KEYS.has(agg.alias)) {
throw new errors_1.ValidationError(`Invalid aggregation alias "${agg.alias}"`);
}
if (agg.fn !== "count" && !agg.field) {
throw new errors_1.ValidationError(`Aggregation "${agg.alias}" (${agg.fn}) requires a field`);
}
if (agg.field && !(agg.field in rowProperties)) {
throw new errors_1.ValidationError(`Aggregation field "${agg.field}" is not in the source view`);
}
aliases.add(agg.alias);
}
for (const g of spec.groupBy ?? []) {
if (!(g in rowProperties)) {
throw new errors_1.ValidationError(`groupBy field "${g}" is not in the source view`);
}
}
if (spec.sort) {
const sortable = new Set([...(spec.groupBy ?? []), ...aliases]);
if (!sortable.has(spec.sort.field)) {
throw new errors_1.ValidationError(`Sort field "${spec.sort.field}" must be a groupBy field or an aggregation alias`);
}
}
if (spec.limit !== undefined && (!Number.isInteger(spec.limit) || spec.limit < 1)) {
throw new errors_1.ValidationError("limit must be a positive integer");
}
}
function buildDerivedSchema(spec, rowProperties) {
const properties = {};
for (const g of spec.groupBy ?? [])
properties[g] = rowProperties[g];
for (const agg of spec.aggregations) {
properties[agg.alias] = { type: agg.fn === "count" ? "integer" : "number" };
}
return {
type: "object",
properties: {
data: {
type: "array",
items: {
type: "object",
properties,
required: Object.keys(properties),
additionalProperties: false,
},
},
hasMore: { type: "boolean" },
},
required: ["data", "hasMore"],
};
}
//# sourceMappingURL=derive.js.map
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/view/derive.ts"],"names":[],"mappings":"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"}
import type { ViewResult, SubscribeOptions, ViewSubscription } from "./types";
export declare const DEFAULT_VIEW_INTERVAL_MS = 5000;
export declare const DEFAULT_MAX_BACKOFF_MS = 60000;
/** Caps concurrent view executions across a Valv instance so a fleet of
* dashboards cannot stampede the database. */
export declare class Semaphore {
private max;
private active;
private queue;
constructor(max: number);
run<R>(fn: () => Promise<R>): Promise<R>;
}
/**
* One execution loop per View, fanned out to any number of subscribers.
*
* - Polling: a single recursive setTimeout — overlap-free, with exponential
* backoff on consecutive errors and optional jitter. The effective interval
* is the minimum across active subscribers.
* - Native: when the adapter provides change notifications, they replace the
* timer; bursts are coalesced by the in-flight guard.
* - Each subscriber tracks the last snapshot it saw, so late subscribers get
* the cached result immediately and only genuinely new data afterwards.
*/
export declare class ViewEngine<T> {
private executeFn;
private nativeSubscribe?;
private limiter?;
private subscribers;
private running;
private timer;
private inFlight;
private pendingNotify;
private consecutiveErrors;
private lastResult;
private lastSnapshot;
private unsubscribeNative;
constructor(executeFn: () => Promise<ViewResult<T>>, nativeSubscribe?: ((onChange: () => void) => () => void) | undefined, limiter?: Semaphore | undefined);
subscribe(onData: (result: ViewResult<T>) => void, options?: SubscribeOptions): ViewSubscription;
private start;
private stop;
private nextDelay;
private tick;
private emitTo;
}
//# sourceMappingURL=engine.d.ts.map
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/view/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAc,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEzF,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAC5C,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAE5C;+CAC+C;AAC/C,qBAAa,SAAS;IAIR,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,KAAK,CAAwB;gBAEjB,GAAG,EAAE,MAAM;IAEzB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAY/C;AAeD;;;;;;;;;;GAUG;AACH,qBAAa,UAAU,CAAC,CAAC;IAYrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,eAAe,CAAC;IACxB,OAAO,CAAC,OAAO,CAAC;IAblB,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,iBAAiB,CAA0B;gBAGzC,SAAS,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACvC,eAAe,CAAC,GAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,aAAA,EACtD,OAAO,CAAC,EAAE,SAAS,YAAA;IAG7B,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,gBAAgB;IAkChG,OAAO,CAAC,KAAK;IAqBb,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,SAAS;YAaH,IAAI;IAyClB,OAAO,CAAC,MAAM;CAOf"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ViewEngine = exports.Semaphore = exports.DEFAULT_MAX_BACKOFF_MS = exports.DEFAULT_VIEW_INTERVAL_MS = void 0;
exports.DEFAULT_VIEW_INTERVAL_MS = 5000;
exports.DEFAULT_MAX_BACKOFF_MS = 60000;
/** Caps concurrent view executions across a Valv instance so a fleet of
* dashboards cannot stampede the database. */
class Semaphore {
constructor(max) {
this.max = max;
this.active = 0;
this.queue = [];
}
async run(fn) {
if (this.active >= this.max) {
await new Promise((resolve) => this.queue.push(resolve));
}
this.active++;
try {
return await fn();
}
finally {
this.active--;
this.queue.shift()?.();
}
}
}
exports.Semaphore = Semaphore;
/**
* One execution loop per View, fanned out to any number of subscribers.
*
* - Polling: a single recursive setTimeout — overlap-free, with exponential
* backoff on consecutive errors and optional jitter. The effective interval
* is the minimum across active subscribers.
* - Native: when the adapter provides change notifications, they replace the
* timer; bursts are coalesced by the in-flight guard.
* - Each subscriber tracks the last snapshot it saw, so late subscribers get
* the cached result immediately and only genuinely new data afterwards.
*/
class ViewEngine {
constructor(executeFn, nativeSubscribe, limiter) {
this.executeFn = executeFn;
this.nativeSubscribe = nativeSubscribe;
this.limiter = limiter;
this.subscribers = new Set();
this.running = false;
this.inFlight = false;
this.pendingNotify = false;
this.consecutiveErrors = 0;
}
subscribe(onData, options) {
const sub = {
onData,
onError: options?.onError,
emitInitial: options?.emitInitial !== false,
intervalMs: options?.intervalMs ?? exports.DEFAULT_VIEW_INTERVAL_MS,
jitter: options?.jitter ?? 0,
diffKey: options?.diffKey,
baselined: false,
};
this.subscribers.add(sub);
// The engine already has data (another subscriber's poll): serve it from
// cache instead of waiting for the next tick.
if (this.lastResult !== undefined && this.lastSnapshot !== undefined) {
if (sub.emitInitial)
this.emitTo(sub, this.lastResult);
sub.baselined = true;
sub.seenSnapshot = this.lastSnapshot;
sub.seenData = this.lastResult.data;
}
this.start();
let stopped = false;
return {
stop: () => {
if (stopped)
return;
stopped = true;
this.subscribers.delete(sub);
if (this.subscribers.size === 0)
this.stop();
},
};
}
start() {
if (this.running)
return;
this.running = true;
if (this.nativeSubscribe) {
void this.tick().then(() => {
if (this.running && !this.unsubscribeNative) {
this.unsubscribeNative = this.nativeSubscribe(() => void this.tick());
}
});
return;
}
const loop = async () => {
await this.tick();
if (!this.running)
return;
this.timer = setTimeout(() => void loop(), this.nextDelay());
};
void loop();
}
stop() {
this.running = false;
if (this.timer !== undefined)
clearTimeout(this.timer);
this.timer = undefined;
this.unsubscribeNative?.();
this.unsubscribeNative = undefined;
this.consecutiveErrors = 0;
}
nextDelay() {
let interval = exports.DEFAULT_VIEW_INTERVAL_MS;
let jitter = 0;
for (const sub of this.subscribers) {
interval = Math.min(interval, sub.intervalMs);
jitter = Math.max(jitter, sub.jitter);
}
// Exponential backoff while the query keeps failing, capped at 60s.
const backoff = Math.min(interval * 2 ** this.consecutiveErrors, exports.DEFAULT_MAX_BACKOFF_MS);
const jitterFactor = jitter > 0 ? 1 + (Math.random() * 2 - 1) * jitter : 1;
return Math.max(interval, backoff) * jitterFactor;
}
async tick() {
// Coalesce notifications that arrive while a query is in flight.
if (this.inFlight) {
this.pendingNotify = true;
return;
}
this.inFlight = true;
try {
const result = this.limiter ? await this.limiter.run(this.executeFn) : await this.executeFn();
this.consecutiveErrors = 0;
if (!this.running)
return;
const snapshot = JSON.stringify(result);
this.lastSnapshot = snapshot;
this.lastResult = result;
for (const sub of [...this.subscribers]) {
if (!sub.baselined) {
if (sub.emitInitial)
this.emitTo(sub, result);
sub.baselined = true;
}
else if (sub.seenSnapshot !== snapshot) {
this.emitTo(sub, result);
}
else {
continue;
}
sub.seenSnapshot = snapshot;
sub.seenData = result.data;
}
}
catch (err) {
this.consecutiveErrors++;
if (!this.running)
return;
for (const sub of [...this.subscribers])
sub.onError?.(err);
}
finally {
this.inFlight = false;
if (this.pendingNotify) {
this.pendingNotify = false;
void this.tick();
}
}
}
emitTo(sub, result) {
if (!sub.diffKey) {
sub.onData(result);
return;
}
sub.onData({ ...result, changes: computeChanges(sub.seenData, result.data, sub.diffKey) });
}
}
exports.ViewEngine = ViewEngine;
function computeChanges(prev, next, key) {
const prevByKey = new Map();
for (const row of prev ?? []) {
prevByKey.set(row[key], row);
}
const added = [];
const updated = [];
const seen = new Set();
for (const row of next) {
const k = row[key];
seen.add(k);
if (!prevByKey.has(k)) {
added.push(row);
}
else if (JSON.stringify(prevByKey.get(k)) !== JSON.stringify(row)) {
updated.push(row);
}
}
const removed = (prev ?? []).filter((row) => !seen.has(row[key]));
return { added, removed, updated };
}
//# sourceMappingURL=engine.js.map
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/view/engine.ts"],"names":[],"mappings":"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"}
import type { ResolvedQuery } from "../ir/types";
import type { SchemaMap } from "../types";
/**
* Build a JSON Schema describing the envelope a View's execute() returns,
* derived from the resolved (policy-filtered) query and the introspected
* schema. Property types match the serialized form (Date → date-time string,
* Decimal → number, BigInt → string).
*/
export declare function buildResultSchema(query: ResolvedQuery, schema: SchemaMap): object;
//# sourceMappingURL=result-schema.d.ts.map
{"version":3,"file":"result-schema.d.ts","sourceRoot":"","sources":["../../src/view/result-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,UAAU,CAAA;AAGtD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAejF"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildResultSchema = buildResultSchema;
const generator_1 = require("../tools/generator");
/**
* Build a JSON Schema describing the envelope a View's execute() returns,
* derived from the resolved (policy-filtered) query and the introspected
* schema. Property types match the serialized form (Date → date-time string,
* Decimal → number, BigInt → string).
*/
function buildResultSchema(query, schema) {
const rowSchema = query.operation === "aggregate"
? buildAggregateRowSchema(query, schema)
: buildRowSchema(query, schema);
return {
type: "object",
properties: {
data: { type: "array", items: rowSchema },
hasMore: { type: "boolean" },
nextCursor: { type: "string" },
},
required: ["data", "hasMore"],
};
}
function resultFieldSchema(field) {
const base = (0, generator_1.buildFieldSchema)(field);
// anyOf rather than a type array so schemas carrying `format`/`enum` stay valid
return field.isNullable ? { anyOf: [base, { type: "null" }] } : base;
}
function buildRowSchema(query, schema) {
const resource = schema.resources[query.resource];
const internal = new Set(query.internalFields ?? []);
const properties = {};
for (const fieldName of query.fields) {
if (internal.has(fieldName))
continue;
const field = resource?.fields[fieldName];
if (field)
properties[fieldName] = resultFieldSchema(field);
}
for (const [relName, inc] of Object.entries(query.include ?? {})) {
const related = schema.resources[inc.resource];
const relProperties = {};
for (const fieldName of inc.fields) {
const field = related?.fields[fieldName];
if (field)
relProperties[fieldName] = resultFieldSchema(field);
}
const relRow = {
type: "object",
properties: relProperties,
required: Object.keys(relProperties),
additionalProperties: false,
};
properties[relName] =
inc.type === "belongsTo"
? { anyOf: [relRow, { type: "null" }] }
: { type: "array", items: relRow };
}
return {
type: "object",
properties,
required: Object.keys(properties),
additionalProperties: false,
};
}
// Describes the flat-alias row shape the IR promises ({ groupByField, alias }),
// returned by both the ClickHouse and Prisma adapters.
function buildAggregateRowSchema(query, schema) {
const resource = schema.resources[query.resource];
const properties = {};
for (const fieldName of query.groupBy ?? []) {
const field = resource?.fields[fieldName];
if (field)
properties[fieldName] = resultFieldSchema(field);
}
for (const agg of query.aggregations ?? []) {
properties[agg.alias] = { type: agg.fn === "count" ? "integer" : "number" };
}
return {
type: "object",
properties,
required: Object.keys(properties),
additionalProperties: false,
};
}
//# sourceMappingURL=result-schema.js.map
{"version":3,"file":"result-schema.js","sourceRoot":"","sources":["../../src/view/result-schema.ts"],"names":[],"mappings":"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"}
import type { ViewResult, SubscribeOptions, ViewSubscription } from "./types";
export declare const DEFAULT_VIEW_INTERVAL_MS = 5000;
/**
* Drive a view subscription: re-execute, diff against the previous snapshot,
* and emit only on change. When `nativeSubscribe` is provided (adapter change
* notifications), it replaces the polling timer — each notification triggers a
* re-execute + diff, so native streams never bypass the policy pipeline.
*/
export declare function startSubscription<T>(executeFn: () => Promise<ViewResult<T>>, onData: (result: ViewResult<T>) => void, options: SubscribeOptions | undefined, nativeSubscribe?: (onChange: () => void) => () => void): ViewSubscription;
//# sourceMappingURL=subscription.d.ts.map
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/view/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE7E,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAE5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,SAAS,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACvC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EACvC,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,GACrD,gBAAgB,CAiDlB"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DEFAULT_VIEW_INTERVAL_MS = void 0;
exports.startSubscription = startSubscription;
exports.DEFAULT_VIEW_INTERVAL_MS = 5000;
/**
* Drive a view subscription: re-execute, diff against the previous snapshot,
* and emit only on change. When `nativeSubscribe` is provided (adapter change
* notifications), it replaces the polling timer — each notification triggers a
* re-execute + diff, so native streams never bypass the policy pipeline.
*/
function startSubscription(executeFn, onData, options, nativeSubscribe) {
const intervalMs = options?.intervalMs ?? exports.DEFAULT_VIEW_INTERVAL_MS;
const emitInitial = options?.emitInitial !== false;
let stopped = false;
let firstTick = true;
let lastSnapshot;
let timer;
let unsubscribe;
async function tick() {
try {
const result = await executeFn();
if (stopped)
return;
const snapshot = JSON.stringify(result);
const changed = snapshot !== lastSnapshot;
const shouldEmit = firstTick ? emitInitial : changed;
lastSnapshot = snapshot;
firstTick = false;
if (shouldEmit)
onData(result);
}
catch (err) {
if (stopped)
return;
firstTick = false;
options?.onError?.(err);
}
}
if (nativeSubscribe) {
void tick().then(() => {
if (!stopped)
unsubscribe = nativeSubscribe(() => void tick());
});
}
else {
// setTimeout rescheduled after each execution completes — overlap-free by
// construction even when a query runs longer than the interval.
const loop = async () => {
await tick();
if (!stopped)
timer = setTimeout(() => void loop(), intervalMs);
};
void loop();
}
return {
stop() {
if (stopped)
return;
stopped = true;
if (timer !== undefined)
clearTimeout(timer);
unsubscribe?.();
},
};
}
//# sourceMappingURL=subscription.js.map
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/view/subscription.ts"],"names":[],"mappings":";;;AAUA,8CAsDC;AA9DY,QAAA,wBAAwB,GAAG,IAAI,CAAA;AAE5C;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,SAAuC,EACvC,MAAuC,EACvC,OAAqC,EACrC,eAAsD;IAEtD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,gCAAwB,CAAA;IAClE,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,KAAK,KAAK,CAAA;IAElD,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,SAAS,GAAG,IAAI,CAAA;IACpB,IAAI,YAAgC,CAAA;IACpC,IAAI,KAAgD,CAAA;IACpD,IAAI,WAAqC,CAAA;IAEzC,KAAK,UAAU,IAAI;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;YAChC,IAAI,OAAO;gBAAE,OAAM;YACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACvC,MAAM,OAAO,GAAG,QAAQ,KAAK,YAAY,CAAA;YACzC,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAA;YACpD,YAAY,GAAG,QAAQ,CAAA;YACvB,SAAS,GAAG,KAAK,CAAA;YACjB,IAAI,UAAU;gBAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,OAAO;gBAAE,OAAM;YACnB,SAAS,GAAG,KAAK,CAAA;YACjB,OAAO,EAAE,OAAO,EAAE,CAAC,GAAY,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACpB,IAAI,CAAC,OAAO;gBAAE,WAAW,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,0EAA0E;QAC1E,gEAAgE;QAChE,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;YACrC,MAAM,IAAI,EAAE,CAAA;YACZ,IAAI,CAAC,OAAO;gBAAE,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,UAAU,CAAC,CAAA;QACjE,CAAC,CAAA;QACD,KAAK,IAAI,EAAE,CAAA;IACb,CAAC;IAED,OAAO;QACL,IAAI;YACF,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YAC5C,WAAW,EAAE,EAAE,CAAA;QACjB,CAAC;KACF,CAAA;AACH,CAAC"}
/** Row-level deltas between two emissions, computed when `diffKey` is set. */
export interface RowChanges<T = Record<string, unknown>> {
added: T[];
removed: T[];
updated: T[];
}
/** The uniform envelope returned by View.execute(), regardless of operation.
* find passes the adapter envelope through; findOne wraps the single row
* (or none); aggregate wraps the grouped rows. */
export interface ViewResult<T = Record<string, unknown>> {
data: T[];
hasMore: boolean;
nextCursor?: string;
/** Present on subscription emissions when `diffKey` is set. */
changes?: RowChanges<T>;
}
export interface SubscribeOptions {
/** Poll interval in ms. Ignored when the adapter provides native subscribe. Default 5000. */
intervalMs?: number;
/** Emit the first result immediately instead of waiting for a change. Default true. */
emitInitial?: boolean;
/** Called on execution errors; polling continues (with backoff). Errors are swallowed if omitted. */
onError?: (error: Error) => void;
/** Random jitter applied to each poll delay, as a fraction of the interval
* (0–1). Spreads load when many dashboards poll the same database. Default 0. */
jitter?: number;
/** Row identity field (e.g. "id"). When set, emissions include `changes` —
* row-level added/removed/updated deltas for smooth chart updates. */
diffKey?: string;
}
export interface ViewSubscription {
/** Stop polling / unsubscribe. Idempotent. */
stop(): void;
}
/**
* The persistable form of a view: plain JSON, safe to store in a database or
* config. Deliberately excludes the context — ctx is the security boundary and
* must be re-resolved when the view is rehydrated with `valv.viewFromJSON`.
*/
export interface SerializedView {
valv: "view";
v: 1;
toolName: string;
args: unknown;
}
/** A named view definition for the registry (`valv.registerView`). */
export interface ViewDefinition {
toolName: string;
args?: unknown;
description?: string;
}
/**
* A captured agent query: re-executable through the full policy pipeline
* without the LLM in the loop, with a runtime JSON Schema of its result shape.
* Created via `valv.view(toolName, args, ctx)`.
*/
export interface View<T = Record<string, unknown>> {
readonly toolName: string;
readonly args: unknown;
readonly resource: string;
readonly operation: "find" | "findOne" | "aggregate";
/** Registry name when opened via `valv.openView()`. */
readonly name?: string;
/** JSON Schema of the envelope execute() returns. Snapshot taken at view
* creation — if policies later narrow the allowed fields, rows simply omit
* the removed properties. */
readonly resultSchema: object;
/** Re-run the query. Policies are re-evaluated on every call. */
execute(): Promise<ViewResult<T>>;
/** Watch the query for changes: polls + diffs (or uses the adapter's native
* change notifications when available) and calls onData only when the
* result actually changed. All subscribers on the same View share one
* polling loop. */
subscribe(onData: (result: ViewResult<T>) => void, options?: SubscribeOptions): ViewSubscription;
/** Persistable form (no ctx). Rehydrate with `valv.viewFromJSON(json, ctx)`. */
toJSON(): SerializedView;
}
//# sourceMappingURL=types.d.ts.map
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/view/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrD,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,OAAO,EAAE,CAAC,EAAE,CAAA;CACb;AAED;;mDAEmD;AACnD,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrD,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qGAAqG;IACrG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC;sFACkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;2EACuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,IAAI,IAAI,IAAI,CAAA;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,CAAC,CAAA;IACJ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAA;IACpD,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;kCAE8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,iEAAiE;IACjE,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC;;;wBAGoB;IACpB,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAA;IAChG,gFAAgF;IAChF,MAAM,IAAI,cAAc,CAAA;CACzB"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/view/types.ts"],"names":[],"mappings":""}
import { SchemaMap, PolicyFn, PolicyResult, DefaultContext } from "./types";
import { ResolvedQuery } from "./ir/types";
import type { View, ViewDefinition } from "./view/types";
import * as formats from "./formatters";
import { ToolFormatter } from "./formatters";
export interface VistalConfig<TContext = DefaultContext, TResources extends string = string> {
adapter: VistalAdapter;
defaultPolicy?: "deny-all" | "allow-all";
/** Warn (false, default) or throw (true) when policy() is called with an unknown resource name */
strictPolicyKeys?: boolean;
/** Fallback policy resolver for resources without an explicit policy() call */
resolvePolicy?: (resource: TResources, ctx: TContext) => PolicyResult;
/** Called after every executeTool invocation, successful or not */
onQuery?: (event: QueryEvent<TContext, TResources>) => void;
/** Hard cap on `limit` for query tools. Default 100. */
maxLimit?: number;
/** Default `limit` applied when the model omits one. Default 50. */
defaultLimit?: number;
/** Cap on concurrent view executions (polling + native re-runs) across this
* instance, so many live dashboards can't stampede the database. Default 16. */
maxConcurrentViewQueries?: number;
}
/** Resolved pagination bounds threaded into the builder and tool generators. */
export interface PaginationConfig {
maxLimit: number;
defaultLimit: number;
}
export interface QueryEvent<TContext, TResources extends string = string> {
toolName: string;
resource: TResources;
operation: string;
ctx: TContext;
durationMs: number;
error?: Error;
/** "tool" for agent tool calls, "view" for View.execute()/subscribe() re-runs. */
source?: "tool" | "view";
}
export interface GetToolsOptions<TResources extends string = string> {
resources?: TResources[];
maxTools?: number;
mode?: "per-resource" | "consolidated";
}
export interface LLMTool {
name: string;
description: string;
input_schema: object;
}
export interface ExecutableTool extends LLMTool {
execute: (args: unknown) => Promise<unknown>;
}
/**
* A provider-formatted tool. `definition` is the clean provider-specific shape
* to hand to the model API; `name` and `execute` are kept alongside it for
* dispatching tool calls regardless of where the provider nests the name.
*/
export interface FormattedTool<T = unknown> {
definition: T;
name: string;
execute: (args: unknown) => Promise<unknown>;
}
export interface ResourceField {
name: string;
type: string;
isId: boolean;
isNullable: boolean;
hasDefaultValue: boolean;
sensitive: boolean;
}
export interface ResourceRelation {
name: string;
target: string;
type: "belongsTo" | "hasMany" | "manyToMany";
}
export interface ResourceDescriptor {
name: string;
fields: ResourceField[];
relations: ResourceRelation[];
policyStub: string;
}
export interface VistalAdapter {
introspect(): Promise<SchemaMap>;
execute(query: ResolvedQuery): Promise<unknown>;
/**
* Optional native change notifications for live views. Called with the
* policy-resolved query to watch; invoke `onChange` whenever the underlying
* data may have changed — the view then re-executes through the policy
* pipeline and diffs, so notifications never carry data past the policy.
* Returns an unsubscribe function. When absent, views fall back to polling.
*/
subscribe?(query: ResolvedQuery, onChange: () => void): () => void;
}
export declare class Vistal<TContext = DefaultContext, TResources extends string = string> {
private adapter;
private defaultPolicy;
private policies;
private schemaCache;
private strictPolicyKeys;
private resolvePolicyFn?;
private onQueryFn?;
private pagination;
private viewDefs;
private viewLimiter;
constructor(config: VistalConfig<TContext, TResources>);
/** Register an access policy for a resource. Use "*" as a wildcard fallback. */
policy(resource: TResources | "*", fn: PolicyFn<TContext>): this;
/**
* Provider-formatted tools.
*
* `anthropic` / `openai` / `gemini` / `format` return `{ definition, name,
* execute }[]` — `definition` is the provider's tool shape, `name`/`execute`
* are kept alongside for dispatching tool calls.
*
* `vercel` is different: it returns a ready-to-use Vercel AI SDK `ToolSet`
* (a record keyed by tool name, each value built with `tool()` + `jsonSchema()`
* and `execute` already wired) so it drops straight into `generateText`.
*
* ```ts
* const tools = await vistal.tools.openai(ctx)
* // tools.map(t => t.definition) → pass to the API
* // on a tool call: tools.find(t => t.name === call.name)!.execute(args)
*
* const tools = await vistal.tools.vercel(ctx)
* await generateText({ model, tools, prompt }) // no wrapping needed
* ```
*/
get tools(): {
anthropic: (ctx: TContext, options?: GetToolsOptions<TResources>) => Promise<FormattedTool<formats.AnthropicTool>[]>;
openai: (ctx: TContext, options?: GetToolsOptions<TResources>) => Promise<FormattedTool<formats.OpenAITool>[]>;
gemini: (ctx: TContext, options?: GetToolsOptions<TResources>) => Promise<FormattedTool<formats.GeminiTool>[]>;
vercel: (ctx: TContext, options?: GetToolsOptions<TResources>) => Promise<Record<string, any>>;
format: <T>(ctx: TContext, formatter: ToolFormatter<T>, options?: GetToolsOptions<TResources>) => Promise<FormattedTool<T>[]>;
};
/**
* Build a Vercel AI SDK `ToolSet` — `{ [name]: tool({ description, parameters,
* execute }) }` — ready to pass as `tools` to `generateText`/`streamText`.
* Requires the optional peer dependency `ai`. Tool errors are caught and
* returned as `{ error }` so the agent can recover instead of aborting.
*/
private vercelTools;
/** Generate provider-neutral tool definitions shaped by the evaluated policy. */
private neutralTools;
private formatTools;
/**
* Generate Anthropic-shaped tool definitions (`{ name, description,
* input_schema }`). For other providers use the `tools` namespace.
*/
getTools(ctx: TContext, options?: GetToolsOptions<TResources>): Promise<LLMTool[]>;
/** Returns tools with execute() attached and result serialization (Decimal/Date/BigInt) built in. */
executableTools(ctx: TContext, options?: GetToolsOptions<TResources>): Promise<ExecutableTool[]>;
executeTool(toolName: string, input: unknown, ctx: TContext): Promise<unknown>;
private executeToolInternal;
/**
* Capture an agent query (a read tool call) as a reusable, policy-enforced
* view the application can re-execute and subscribe to without the LLM in
* the loop — e.g. to drive a live chart from a query the agent built.
*
* Accepts per-resource tool names (`query_order`) and consolidated calls
* (`query` + `{ resource: "order", ... }`). Only read operations are
* allowed; writes and meta tools throw a ValidationError. Invalid args or a
* denied policy throw immediately at creation. Policies are re-evaluated on
* every execute()/poll, and results are serialized (Decimal/Date/BigInt) to
* JSON-safe values.
*
* ```ts
* const view = await vistal.view<Order>("query_order", call.args, ctx)
* view.resultSchema // JSON Schema of { data, hasMore, nextCursor? }
* const { data } = await view.execute()
* const sub = view.subscribe((r) => chart.update(r.data), { intervalMs: 5000 })
* sub.stop()
* ```
*/
view<T = Record<string, unknown>>(toolName: string, args: unknown, ctx: TContext): Promise<View<T>>;
/**
* Rehydrate a persisted view (`view.toJSON()`). The context is deliberately
* not part of the serialized form — resolve it fresh for the caller opening
* the view, exactly as you would for a tool call.
*/
viewFromJSON<T = Record<string, unknown>>(json: unknown, ctx: TContext): Promise<View<T>>;
/**
* Register a named view definition — a governed catalog of queries that may
* be opened as live views. Useful to allow-list what dashboards can run and
* to share definitions across processes.
*/
registerView(name: string, def: ViewDefinition): this;
/** Open a registered view under a context. Throws on unknown names. */
openView<T = Record<string, unknown>>(name: string, ctx: TContext): Promise<View<T>>;
/** List registered view definitions. */
listViews(): Array<{
name: string;
} & ViewDefinition>;
private resourceOperations;
private listResourcesResult;
private describeResourceResult;
loadSchema(): Promise<SchemaMap>;
/** Returns the list of resource names discovered from the schema. */
resources(): Promise<TResources[]>;
/** Returns schema info + policy stubs for all resources — useful for discovering resource names. */
describe(): Promise<ResourceDescriptor[]>;
private buildEffectivePolicies;
private validatePolicyKeys;
}
//# sourceMappingURL=vistal.d.ts.map
{"version":3,"file":"vistal.d.ts","sourceRoot":"","sources":["../src/vistal.ts"],"names":[],"mappings":"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"}
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Vistal = void 0;
const builder_1 = require("./ir/builder");
const result_schema_1 = require("./view/result-schema");
const engine_1 = require("./view/engine");
const generator_1 = require("./tools/generator");
const engine_2 = require("./policy/engine");
const serializer_1 = require("./serializer");
const formats = __importStar(require("./formatters"));
const errors_1 = require("./errors");
class Vistal {
constructor(config) {
this.policies = {};
this.schemaCache = null;
this.viewDefs = {};
this.adapter = config.adapter;
this.defaultPolicy = config.defaultPolicy ?? "deny-all";
this.strictPolicyKeys = config.strictPolicyKeys ?? false;
this.resolvePolicyFn = config.resolvePolicy;
this.onQueryFn = config.onQuery;
this.pagination = {
maxLimit: config.maxLimit ?? generator_1.DEFAULT_PAGINATION.maxLimit,
defaultLimit: config.defaultLimit ?? generator_1.DEFAULT_PAGINATION.defaultLimit,
};
this.viewLimiter = new engine_1.Semaphore(config.maxConcurrentViewQueries ?? 16);
}
/** Register an access policy for a resource. Use "*" as a wildcard fallback. */
policy(resource, fn) {
this.policies[resource] = fn;
return this;
}
/**
* Provider-formatted tools.
*
* `anthropic` / `openai` / `gemini` / `format` return `{ definition, name,
* execute }[]` — `definition` is the provider's tool shape, `name`/`execute`
* are kept alongside for dispatching tool calls.
*
* `vercel` is different: it returns a ready-to-use Vercel AI SDK `ToolSet`
* (a record keyed by tool name, each value built with `tool()` + `jsonSchema()`
* and `execute` already wired) so it drops straight into `generateText`.
*
* ```ts
* const tools = await vistal.tools.openai(ctx)
* // tools.map(t => t.definition) → pass to the API
* // on a tool call: tools.find(t => t.name === call.name)!.execute(args)
*
* const tools = await vistal.tools.vercel(ctx)
* await generateText({ model, tools, prompt }) // no wrapping needed
* ```
*/
get tools() {
return {
anthropic: (ctx, options) => this.formatTools(ctx, formats.anthropic, options),
openai: (ctx, options) => this.formatTools(ctx, formats.openai, options),
gemini: (ctx, options) => this.formatTools(ctx, formats.gemini, options),
vercel: (ctx, options) => this.vercelTools(ctx, options),
format: (ctx, formatter, options) => this.formatTools(ctx, formatter, options),
};
}
/**
* Build a Vercel AI SDK `ToolSet` — `{ [name]: tool({ description, parameters,
* execute }) }` — ready to pass as `tools` to `generateText`/`streamText`.
* Requires the optional peer dependency `ai`. Tool errors are caught and
* returned as `{ error }` so the agent can recover instead of aborting.
*/
async vercelTools(ctx, options) {
let ai;
try {
const specifier = "ai";
ai = await Promise.resolve(`${specifier}`).then(s => __importStar(require(s)));
}
catch {
throw new Error('[vistal] tools.vercel() requires the "ai" package (Vercel AI SDK). Install it with: npm install ai');
}
const neutral = await this.neutralTools(ctx, options);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const tools = {};
for (const t of neutral) {
tools[t.name] = ai.tool({
description: t.description,
parameters: ai.jsonSchema(t.parameters),
execute: async (args) => {
try {
return (0, serializer_1.serializeResult)(await this.executeTool(t.name, args, ctx));
}
catch (err) {
return { error: safeErrorMessage(err) };
}
},
});
}
return tools;
}
/** Generate provider-neutral tool definitions shaped by the evaluated policy. */
async neutralTools(ctx, options) {
const schema = await this.loadSchema();
this.validatePolicyKeys(schema);
const policies = this.buildEffectivePolicies(schema);
if (options?.mode === "consolidated") {
return (0, generator_1.generateConsolidatedTools)(schema, policies, ctx, this.defaultPolicy, this.pagination, options);
}
return (0, generator_1.generateTools)(schema, policies, ctx, this.defaultPolicy, this.pagination, options);
}
async formatTools(ctx, formatter, options) {
const neutral = await this.neutralTools(ctx, options);
return neutral.map((t) => ({
definition: formatter(t),
name: t.name,
execute: async (args) => (0, serializer_1.serializeResult)(await this.executeTool(t.name, args, ctx)),
}));
}
/**
* Generate Anthropic-shaped tool definitions (`{ name, description,
* input_schema }`). For other providers use the `tools` namespace.
*/
async getTools(ctx, options) {
const neutral = await this.neutralTools(ctx, options);
return neutral.map((t) => formats.anthropic(t));
}
/** Returns tools with execute() attached and result serialization (Decimal/Date/BigInt) built in. */
async executableTools(ctx, options) {
const llmTools = await this.getTools(ctx, options);
return llmTools.map((t) => ({
...t,
execute: async (args) => {
const result = await this.executeTool(t.name, args, ctx);
return (0, serializer_1.serializeResult)(result);
},
}));
}
async executeTool(toolName, input, ctx) {
return this.executeToolInternal(toolName, input, ctx, "tool");
}
async executeToolInternal(toolName, input, ctx, source) {
const start = Date.now();
let caughtError;
let resolvedResource = toolName.includes("_")
? toolName.slice(toolName.indexOf("_") + 1)
: toolName;
try {
const schema = await this.loadSchema();
const policies = this.buildEffectivePolicies(schema);
const inp = (input ?? {});
if (toolName === "list_resources") {
return await this.listResourcesResult(schema, policies, ctx);
}
if (toolName === "describe_resource") {
const resource = inp.resource;
if (!resource)
throw new errors_1.ValidationError('describe_resource requires a "resource" argument');
resolvedResource = resource;
return await this.describeResourceResult(resource, schema, policies, ctx);
}
if (generator_1.CONSOLIDATED_VERBS.includes(toolName)) {
const { internalName, normalizedInput, resource } = normalizeConsolidatedCall(toolName, inp);
resolvedResource = resource;
const query = (0, builder_1.buildResolvedQuery)(internalName, normalizedInput, schema, policies, ctx, this.defaultPolicy, this.pagination);
return await this.adapter.execute(query);
}
const query = (0, builder_1.buildResolvedQuery)(toolName, input, schema, policies, ctx, this.defaultPolicy, this.pagination);
return await this.adapter.execute(query);
}
catch (e) {
caughtError = e;
throw e;
}
finally {
if (this.onQueryFn) {
const underscoreIdx = toolName.indexOf("_");
const operation = underscoreIdx === -1 ? toolName : toolName.slice(0, underscoreIdx);
this.onQueryFn({
toolName,
resource: resolvedResource,
operation,
ctx,
durationMs: Date.now() - start,
error: caughtError,
source,
});
}
}
}
/**
* Capture an agent query (a read tool call) as a reusable, policy-enforced
* view the application can re-execute and subscribe to without the LLM in
* the loop — e.g. to drive a live chart from a query the agent built.
*
* Accepts per-resource tool names (`query_order`) and consolidated calls
* (`query` + `{ resource: "order", ... }`). Only read operations are
* allowed; writes and meta tools throw a ValidationError. Invalid args or a
* denied policy throw immediately at creation. Policies are re-evaluated on
* every execute()/poll, and results are serialized (Decimal/Date/BigInt) to
* JSON-safe values.
*
* ```ts
* const view = await vistal.view<Order>("query_order", call.args, ctx)
* view.resultSchema // JSON Schema of { data, hasMore, nextCursor? }
* const { data } = await view.execute()
* const sub = view.subscribe((r) => chart.update(r.data), { intervalMs: 5000 })
* sub.stop()
* ```
*/
async view(toolName, args, ctx) {
const schema = await this.loadSchema();
const policies = this.buildEffectivePolicies(schema);
if (toolName === "list_resources" || toolName === "describe_resource") {
throw new errors_1.ValidationError(`view() does not support the meta tool "${toolName}"`);
}
// Clone so caller mutations after creation don't change what re-executes.
const frozenArgs = typeof args === "object" && args !== null && !Array.isArray(args)
? { ...args }
: args;
let internalName = toolName;
let normalizedInput = frozenArgs;
if (generator_1.CONSOLIDATED_VERBS.includes(toolName)) {
const normalized = normalizeConsolidatedCall(toolName, (frozenArgs ?? {}));
internalName = normalized.internalName;
normalizedInput = normalized.normalizedInput;
}
const { operation } = (0, builder_1.parseToolName)(internalName);
if (operation !== "find" && operation !== "findOne" && operation !== "aggregate") {
throw new errors_1.ValidationError(`view() only supports read operations (query/get/aggregate); got "${toolName}"`);
}
// Built eagerly so bad args or a denied policy fail at creation, and to
// derive the result schema. execute() rebuilds it per call to stay current
// with policies that read mutable ctx.
const initialQuery = (0, builder_1.buildResolvedQuery)(internalName, normalizedInput, schema, policies, ctx, this.defaultPolicy, this.pagination);
const resultSchema = (0, result_schema_1.buildResultSchema)(initialQuery, schema);
const execute = async () => {
const raw = (0, serializer_1.serializeResult)(await this.executeToolInternal(toolName, frozenArgs, ctx, "view"));
return normalizeEnvelope(raw, operation);
};
// One engine per View: all subscribers share a single polling loop (or a
// single native subscription), created lazily on the first subscribe.
const adapter = this.adapter;
let engine;
return {
toolName,
args: frozenArgs,
resource: initialQuery.resource,
operation,
resultSchema,
execute,
subscribe: (onData, options) => {
engine ?? (engine = new engine_1.ViewEngine(execute, adapter.subscribe ? (onChange) => adapter.subscribe(initialQuery, onChange) : undefined, this.viewLimiter));
return engine.subscribe(onData, options);
},
toJSON: () => ({ vistal: "view", v: 1, toolName, args: frozenArgs }),
};
}
/**
* Rehydrate a persisted view (`view.toJSON()`). The context is deliberately
* not part of the serialized form — resolve it fresh for the caller opening
* the view, exactly as you would for a tool call.
*/
async viewFromJSON(json, ctx) {
const v = json;
if (!v || v.vistal !== "view" || v.v !== 1 || typeof v.toolName !== "string") {
throw new errors_1.ValidationError('viewFromJSON() expects the shape produced by view.toJSON(): { vistal: "view", v: 1, toolName, args }');
}
return this.view(v.toolName, v.args, ctx);
}
/**
* Register a named view definition — a governed catalog of queries that may
* be opened as live views. Useful to allow-list what dashboards can run and
* to share definitions across processes.
*/
registerView(name, def) {
this.viewDefs[name] = def;
return this;
}
/** Open a registered view under a context. Throws on unknown names. */
async openView(name, ctx) {
const def = this.viewDefs[name];
if (!def) {
const known = Object.keys(this.viewDefs);
throw new errors_1.ValidationError(`Unknown view "${name}". Registered views: ${known.length ? known.join(", ") : "(none)"}`);
}
const view = await this.view(def.toolName, def.args, ctx);
return { ...view, name };
}
/** List registered view definitions. */
listViews() {
return Object.entries(this.viewDefs).map(([name, def]) => ({ name, ...def }));
}
// Resolves the operations a context may perform on a resource, using the
// granular policy buckets (create/update/aggregate), so it matches exactly the
// tools generated by generateConsolidatedTools.
resourceOperations(resourceName, resource, policies, ctx) {
const ev = (op) => (0, engine_2.evaluatePolicy)(policies[resourceName], ctx, op, this.defaultPolicy, resource);
const readPolicy = ev("read");
const aggregatePolicy = ev("aggregate");
const createPolicy = ev("create");
const updatePolicy = ev("update");
const deletePolicy = ev("delete");
const ops = [];
if (readPolicy.allowed)
ops.push("query", "get");
if (aggregatePolicy.allowed &&
aggregatePolicy.allowedFields.some((f) => resource.fields[f]?.type === "number")) {
ops.push("aggregate");
}
if (createPolicy.allowed) {
const forcedFields = createPolicy.forcedWriteFields ?? {};
const allCovered = Object.entries(resource.fields).every(([name, field]) => {
if (field.isId || field.isNullable || field.hasDefaultValue)
return true;
return createPolicy.allowedFields.includes(name) || name in forcedFields;
});
if (allCovered)
ops.push("create");
}
if (updatePolicy.allowed)
ops.push("update");
if (deletePolicy.allowed)
ops.push("delete");
return { ops, readPolicy, aggregatePolicy, createPolicy, updatePolicy };
}
async listResourcesResult(schema, policies, ctx) {
const result = [];
for (const [resourceName, resource] of Object.entries(schema.resources)) {
const { ops } = this.resourceOperations(resourceName, resource, policies, ctx);
if (ops.length > 0)
result.push({ name: resourceName, description: resource.description, operations: ops });
}
return result;
}
async describeResourceResult(resourceName, schema, policies, ctx) {
const resource = schema.resources[resourceName];
if (!resource)
throw new errors_1.ValidationError(`Unknown resource: "${resourceName}"`);
const { ops, readPolicy, createPolicy, updatePolicy } = this.resourceOperations(resourceName, resource, policies, ctx);
// Writable fields come from whichever write op is permitted; create/update
// share the same field policy, so prefer update when both exist.
const writeEval = updatePolicy.allowed
? updatePolicy
: createPolicy.allowed
? createPolicy
: undefined;
const readableFields = new Set(readPolicy.allowed ? readPolicy.allowedFields : []);
const writableFields = new Set(writeEval ? writeEval.allowedFields.filter((f) => !resource.fields[f]?.isId) : []);
const fields = Object.values(resource.fields)
.filter((f) => readableFields.has(f.name) || writableFields.has(f.name))
.map((f) => ({
name: f.name,
type: f.type,
...(f.enumValues ? { enumValues: f.enumValues } : {}),
nullable: f.isNullable,
isId: f.isId,
readable: readableFields.has(f.name),
writable: writableFields.has(f.name),
}));
const allowedRelations = readPolicy.allowed ? readPolicy.allowedRelations : [];
const relations = allowedRelations
.map((relName) => {
const rel = resource.relations[relName];
return rel ? { name: rel.name, target: rel.targetResource, type: rel.type } : null;
})
.filter(Boolean);
return {
name: resourceName,
description: resource.description,
operations: ops,
fields,
relations,
};
}
async loadSchema() {
if (!this.schemaCache) {
this.schemaCache = await this.adapter.introspect();
}
return this.schemaCache;
}
/** Returns the list of resource names discovered from the schema. */
async resources() {
const schema = await this.loadSchema();
return Object.keys(schema.resources);
}
/** Returns schema info + policy stubs for all resources — useful for discovering resource names. */
async describe() {
const schema = await this.loadSchema();
return Object.values(schema.resources).map((r) => ({
name: r.name,
fields: Object.values(r.fields).map((f) => ({
name: f.name,
type: f.type,
isId: f.isId,
isNullable: f.isNullable,
hasDefaultValue: f.hasDefaultValue ?? false,
sensitive: f.sensitive ?? false,
})),
relations: Object.values(r.relations).map((rel) => ({
name: rel.name,
target: rel.targetResource,
type: rel.type,
})),
policyStub: buildPolicyStub(r.name),
}));
}
buildEffectivePolicies(schema) {
const wildcard = this.policies["*"];
const resolver = this.resolvePolicyFn;
if (!wildcard && !resolver)
return this.policies;
const effective = { ...this.policies };
for (const resourceName of Object.keys(schema.resources)) {
if (!effective[resourceName]) {
if (wildcard) {
effective[resourceName] = wildcard;
}
else if (resolver) {
const captured = resourceName;
effective[resourceName] = (ctx) => resolver(captured, ctx);
}
}
}
delete effective["*"];
return effective;
}
validatePolicyKeys(schema) {
const resourceNames = new Set(Object.keys(schema.resources));
for (const key of Object.keys(this.policies)) {
if (key === "*")
continue;
if (!resourceNames.has(key)) {
const msg = `[vistal] policy() called with unknown resource "${key}". Known resources: ${[...resourceNames].join(", ")}. Use await vistal.describe() to list them.`;
if (this.strictPolicyKeys)
throw new Error(msg);
else
console.warn(msg);
}
}
}
}
exports.Vistal = Vistal;
// Vistal's own errors are author-written, safe, and actionable for the model to
// recover from. Any other error (e.g. a raw DB driver error) may carry internal
// details — file paths, query dumps — so it is replaced with a generic message.
// The full error is still delivered to onQuery for server-side logging.
// Turns a consolidated call ("query" + { resource, ... }) into the internal
// per-resource form ("query_order" + flattened input). For create/update the
// nested `data` object is merged into the input.
function normalizeConsolidatedCall(toolName, inp) {
const resource = inp.resource;
if (!resource)
throw new errors_1.ValidationError(`"${toolName}" requires a "resource" argument`);
let normalizedInput;
if (toolName === "create" || toolName === "update") {
const { resource: _r, data, ...rest } = inp;
normalizedInput = {
...rest,
...(typeof data === "object" && data !== null ? data : {}),
};
}
else {
const { resource: _r, ...rest } = inp;
normalizedInput = rest;
}
return { internalName: `${toolName}_${resource}`, normalizedInput, resource };
}
// Adapters return different shapes per operation; views expose one envelope.
function normalizeEnvelope(raw, operation) {
if (operation === "findOne") {
return { data: raw == null ? [] : [raw], hasMore: false };
}
if (Array.isArray(raw)) {
return { data: raw, hasMore: false };
}
if (raw !== null && typeof raw === "object" && Array.isArray(raw.data)) {
const env = raw;
return {
data: env.data,
hasMore: env.hasMore ?? false,
...(env.nextCursor !== undefined ? { nextCursor: env.nextCursor } : {}),
};
}
// Aggregate without groupBy may come back as a single object of aliases.
return { data: raw == null ? [] : [raw], hasMore: false };
}
function safeErrorMessage(err) {
if (err instanceof errors_1.ValidationError || err instanceof errors_1.PolicyViolationError) {
return err.message;
}
return "The query could not be completed due to an internal error.";
}
function buildPolicyStub(resourceName) {
return [
`vistal.policy("${resourceName}", (ctx) => ({`,
` read: true, // or false, or { field: ctx.value } for row-level filter`,
` write: false, // or true, or { field: ctx.value } to auto-inject forced fields`,
` delete: false,`,
` // fields: { deny: ["sensitive_field"] },`,
` // relations: { relName: false },`,
`}))`,
].join("\n");
}
//# sourceMappingURL=vistal.js.map
{"version":3,"file":"vistal.js","sourceRoot":"","sources":["../src/vistal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,0CAAgE;AAChE,wDAAwD;AACxD,0CAAqD;AAQrD,iDAO0B;AAC1B,4CAAiE;AACjE,6CAA8C;AAC9C,sDAAuC;AAEvC,qCAAgE;AAmGhE,MAAa,MAAM;IAYjB,YAAY,MAA0C;QAT9C,aAAQ,GAAuC,EAAE,CAAA;QACjD,gBAAW,GAAqB,IAAI,CAAA;QAKpC,aAAQ,GAAmC,EAAE,CAAA;QAInD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,UAAU,CAAA;QACvD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,KAAK,CAAA;QACxD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,aAAa,CAAA;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,UAAU,GAAG;YAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,8BAAkB,CAAC,QAAQ;YACxD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,8BAAkB,CAAC,YAAY;SACrE,CAAA;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAS,CAAC,MAAM,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,QAA0B,EAAE,EAAsB;QACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,IAAI,KAAK;QACP,OAAO;YACL,SAAS,EAAE,CAAC,GAAa,EAAE,OAAqC,EAAE,EAAE,CAClE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;YACnD,MAAM,EAAE,CAAC,GAAa,EAAE,OAAqC,EAAE,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAChD,MAAM,EAAE,CAAC,GAAa,EAAE,OAAqC,EAAE,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAChD,MAAM,EAAE,CAAC,GAAa,EAAE,OAAqC,EAAE,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;YAChC,MAAM,EAAE,CACN,GAAa,EACb,SAA2B,EAC3B,OAAqC,EACrC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC;SAC/C,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,WAAW,CACvB,GAAa,EACb,OAAqC;QAGrC,IAAI,EAAgF,CAAA;QACpF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAA;YACtB,EAAE,GAAG,yBAAa,SAAS,uCAAC,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACrD,8DAA8D;QAC9D,MAAM,KAAK,GAAwB,EAAE,CAAA;QACrC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;gBACvC,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;oBAC/B,IAAI,CAAC;wBACH,OAAO,IAAA,4BAAe,EAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;oBACnE,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAA;oBACzC,CAAC;gBACH,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,iFAAiF;IACzE,KAAK,CAAC,YAAY,CACxB,GAAa,EACb,OAAqC;QAErC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QACpD,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;YACrC,OAAO,IAAA,qCAAyB,EAC9B,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,UAAU,EACf,OAAO,CACR,CAAA;QACH,CAAC;QACD,OAAO,IAAA,yBAAa,EAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC3F,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,GAAa,EACb,SAA2B,EAC3B,OAAqC;QAErC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACrD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE,CAAC,IAAA,4BAAe,EAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;SAC7F,CAAC,CAAC,CAAA;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAa,EAAE,OAAqC;QACjE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACrD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,qGAAqG;IACrG,KAAK,CAAC,eAAe,CACnB,GAAa,EACb,OAAqC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAClD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,CAAC;YACJ,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;gBACxD,OAAO,IAAA,4BAAe,EAAC,MAAM,CAAC,CAAA;YAChC,CAAC;SACF,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,KAAc,EAAE,GAAa;QAC/D,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IAC/D,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,QAAgB,EAChB,KAAc,EACd,GAAa,EACb,MAAuB;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,IAAI,WAA8B,CAAA;QAClC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAA;QAEZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;YACpD,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAA;YAEpD,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBAClC,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC9D,CAAC;YAED,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA8B,CAAA;gBACnD,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,wBAAe,CAAC,kDAAkD,CAAC,CAAA;gBAC5F,gBAAgB,GAAG,QAAQ,CAAA;gBAC3B,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC3E,CAAC;YAED,IAAK,8BAAwC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;gBAC5F,gBAAgB,GAAG,QAAQ,CAAA;gBAC3B,MAAM,KAAK,GAAG,IAAA,4BAAkB,EAC9B,YAAY,EACZ,eAAe,EACf,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,UAAU,CAChB,CAAA;gBACD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC1C,CAAC;YAED,MAAM,KAAK,GAAG,IAAA,4BAAkB,EAC9B,QAAQ,EACR,KAAK,EACL,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,UAAU,CAChB,CAAA;YACD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,WAAW,GAAG,CAAU,CAAA;YACxB,MAAM,CAAC,CAAA;QACT,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBAC3C,MAAM,SAAS,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;gBACpF,IAAI,CAAC,SAAS,CAAC;oBACb,QAAQ;oBACR,QAAQ,EAAE,gBAA8B;oBACxC,SAAS;oBACT,GAAG;oBACH,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBAC9B,KAAK,EAAE,WAAW;oBAClB,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,IAAI,CACR,QAAgB,EAChB,IAAa,EACb,GAAa;QAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAEpD,IAAI,QAAQ,KAAK,gBAAgB,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YACtE,MAAM,IAAI,wBAAe,CAAC,0CAA0C,QAAQ,GAAG,CAAC,CAAA;QAClF,CAAC;QAED,0EAA0E;QAC1E,MAAM,UAAU,GACd,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAC/D,CAAC,CAAC,EAAE,GAAI,IAAgC,EAAE;YAC1C,CAAC,CAAC,IAAI,CAAA;QAEV,IAAI,YAAY,GAAG,QAAQ,CAAA;QAC3B,IAAI,eAAe,GAAY,UAAU,CAAA;QACzC,IAAK,8BAAwC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjE,MAAM,UAAU,GAAG,yBAAyB,CAC1C,QAAQ,EACR,CAAC,UAAU,IAAI,EAAE,CAA4B,CAC9C,CAAA;YACD,YAAY,GAAG,UAAU,CAAC,YAAY,CAAA;YACtC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAA;QAC9C,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,uBAAa,EAAC,YAAY,CAAC,CAAA;QACjD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YACjF,MAAM,IAAI,wBAAe,CACvB,oEAAoE,QAAQ,GAAG,CAChF,CAAA;QACH,CAAC;QAED,wEAAwE;QACxE,2EAA2E;QAC3E,uCAAuC;QACvC,MAAM,YAAY,GAAG,IAAA,4BAAkB,EACrC,YAAY,EACZ,eAAe,EACf,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,UAAU,CAChB,CAAA;QACD,MAAM,YAAY,GAAG,IAAA,iCAAiB,EAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAE5D,MAAM,OAAO,GAAG,KAAK,IAA4B,EAAE;YACjD,MAAM,GAAG,GAAG,IAAA,4BAAe,EAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;YAC9F,OAAO,iBAAiB,CAAI,GAAG,EAAE,SAAS,CAAC,CAAA;QAC7C,CAAC,CAAA;QAED,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,MAAiC,CAAA;QACrC,OAAO;YACL,QAAQ;YACR,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,SAAS;YACT,YAAY;YACZ,OAAO;YACP,SAAS,EAAE,CAAC,MAAuC,EAAE,OAA0B,EAAE,EAAE;gBACjF,MAAM,KAAN,MAAM,GAAK,IAAI,mBAAU,CACvB,OAAO,EACP,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,SAAU,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EACxF,IAAI,CAAC,WAAW,CACjB,EAAA;gBACD,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC1C,CAAC;YACD,MAAM,EAAE,GAAmB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SACrF,CAAA;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAA8B,IAAa,EAAE,GAAa;QAC1E,MAAM,CAAC,GAAG,IAAsC,CAAA;QAChD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7E,MAAM,IAAI,wBAAe,CACvB,sGAAsG,CACvG,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC9C,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAY,EAAE,GAAmB;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,QAAQ,CAA8B,IAAY,EAAE,GAAa;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACxC,MAAM,IAAI,wBAAe,CACvB,iBAAiB,IAAI,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC1F,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC5D,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED,wCAAwC;IACxC,SAAS;QACP,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;IAC/E,CAAC;IAED,yEAAyE;IACzE,+EAA+E;IAC/E,gDAAgD;IACxC,kBAAkB,CACxB,YAAoB,EACpB,QAAwC,EACxC,QAA4C,EAC5C,GAAa;QAQb,MAAM,EAAE,GAAG,CAAC,EAAwC,EAAE,EAAE,CACtD,IAAA,uBAAc,EAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;QAE/E,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;QAC7B,MAAM,eAAe,GAAG,EAAE,CAAC,WAAW,CAAC,CAAA;QACvC,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAA;QACjC,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAA;QACjC,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAA;QAEjC,MAAM,GAAG,GAAa,EAAE,CAAA;QACxB,IAAI,UAAU,CAAC,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAChD,IACE,eAAe,CAAC,OAAO;YACvB,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,EAChF,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACvB,CAAC;QACD,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,YAAY,CAAC,iBAAiB,IAAI,EAAE,CAAA;YACzD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACzE,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,eAAe;oBAAE,OAAO,IAAI,CAAA;gBACxE,OAAO,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,YAAY,CAAA;YAC1E,CAAC,CAAC,CAAA;YACF,IAAI,UAAU;gBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC;QACD,IAAI,YAAY,CAAC,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,YAAY,CAAC,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE5C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,CAAA;IACzE,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,MAAiB,EACjB,QAA4C,EAC5C,GAAa;QAEb,MAAM,MAAM,GAAmE,EAAE,CAAA;QACjF,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACxE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC9E,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;QAC3F,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,YAAoB,EACpB,MAAiB,EACjB,QAA4C,EAC5C,GAAa;QAEb,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,wBAAe,CAAC,sBAAsB,YAAY,GAAG,CAAC,CAAA;QAE/E,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAC7E,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,GAAG,CACJ,CAAA;QAED,2EAA2E;QAC3E,iEAAiE;QACjE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;YACpC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,YAAY,CAAC,OAAO;gBACpB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,SAAS,CAAA;QACf,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAClF,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAClF,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACvE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,QAAQ,EAAE,CAAC,CAAC,UAAU;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACpC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;SACrC,CAAC,CAAC,CAAA;QAEL,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9E,MAAM,SAAS,GAAG,gBAAgB;aAC/B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACf,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACvC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACpF,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC,CAAA;QAElB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,UAAU,EAAE,GAAG;YACf,MAAM;YACN,SAAS;SACV,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAiB,CAAA;IACtD,CAAC;IAED,oGAAoG;IACpG,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,KAAK;gBAC3C,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,KAAK;aAChC,CAAC,CAAC;YACH,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAClD,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,cAAc;gBAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC;YACH,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;SACpC,CAAC,CAAC,CAAA;IACL,CAAC;IAEO,sBAAsB,CAAC,MAAiB;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAA;QAErC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAA;QAEhD,MAAM,SAAS,GAAuC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC1E,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,IAAI,QAAQ,EAAE,CAAC;oBACb,SAAS,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAA;gBACpC,CAAC;qBAAM,IAAI,QAAQ,EAAE,CAAC;oBACpB,MAAM,QAAQ,GAAG,YAA0B,CAAA;oBAC3C,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,GAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,kBAAkB,CAAC,MAAiB;QAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,KAAK,GAAG;gBAAE,SAAQ;YACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,mDAAmD,GAAG,uBAAuB,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C,CAAA;gBACnK,IAAI,IAAI,CAAC,gBAAgB;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;;oBAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAzjBD,wBAyjBC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,iDAAiD;AACjD,SAAS,yBAAyB,CAChC,QAAgB,EAChB,GAA4B;IAE5B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA8B,CAAA;IACnD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,wBAAe,CAAC,IAAI,QAAQ,kCAAkC,CAAC,CAAA;IACxF,IAAI,eAAwC,CAAA;IAC5C,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAA;QAC3C,eAAe,GAAG;YAChB,GAAG,IAAI;YACP,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAA;QACrC,eAAe,GAAG,IAAI,CAAA;IACxB,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA;AAC/E,CAAC;AAED,6EAA6E;AAC7E,SAAS,iBAAiB,CAAI,GAAY,EAAE,SAAiB;IAC3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,GAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC7C,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,GAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/F,MAAM,GAAG,GAAG,GAA4D,CAAA;QACxE,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK;YAC7B,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAA;IACH,CAAC;IACD,yEAAyE;IACzE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAChE,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,YAAY,wBAAe,IAAI,GAAG,YAAY,6BAAoB,EAAE,CAAC;QAC1E,OAAO,GAAG,CAAC,OAAO,CAAA;IACpB,CAAC;IACD,OAAO,4DAA4D,CAAA;AACrE,CAAC;AAED,SAAS,eAAe,CAAC,YAAoB;IAC3C,OAAO;QACL,kBAAkB,YAAY,gBAAgB;QAC9C,4EAA4E;QAC5E,mFAAmF;QACnF,kBAAkB;QAClB,6CAA6C;QAC7C,qCAAqC;QACrC,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}