@valv/core
Advanced tools
| 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 +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"} |
+39
-5
| "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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"} |
+1
-1
@@ -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"} |
+2
-1
@@ -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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"} |
+2
-2
| { | ||
| "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":"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"} |
| 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":"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"} |
| 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":""} |
-202
| 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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"} |
-532
| "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":"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"} |
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
0
-100%256094
-45.65%98
-37.97%3094
-48.66%