@vendoai/store 0.1.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -0
- package/dist/blobs.d.ts +5 -0
- package/dist/blobs.d.ts.map +1 -0
- package/dist/blobs.js +62 -0
- package/dist/blobs.js.map +1 -0
- package/dist/crypto.d.ts +10 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +44 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db.d.ts +26 -26
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +335 -86
- package/dist/db.js.map +1 -0
- package/dist/erase.d.ts +33 -0
- package/dist/erase.d.ts.map +1 -0
- package/dist/erase.js +107 -0
- package/dist/erase.js.map +1 -0
- package/dist/helpers/approvals.d.ts +12 -0
- package/dist/helpers/approvals.d.ts.map +1 -0
- package/dist/helpers/approvals.js +37 -0
- package/dist/helpers/approvals.js.map +1 -0
- package/dist/helpers/apps.d.ts +15 -0
- package/dist/helpers/apps.d.ts.map +1 -0
- package/dist/helpers/apps.js +42 -0
- package/dist/helpers/apps.js.map +1 -0
- package/dist/helpers/audit.d.ts +24 -0
- package/dist/helpers/audit.d.ts.map +1 -0
- package/dist/helpers/audit.js +79 -0
- package/dist/helpers/audit.js.map +1 -0
- package/dist/helpers/grants.d.ts +14 -0
- package/dist/helpers/grants.d.ts.map +1 -0
- package/dist/helpers/grants.js +46 -0
- package/dist/helpers/grants.js.map +1 -0
- package/dist/helpers/rows.d.ts +30 -0
- package/dist/helpers/rows.d.ts.map +1 -0
- package/dist/helpers/rows.js +191 -0
- package/dist/helpers/rows.js.map +1 -0
- package/dist/helpers/runs.d.ts +19 -0
- package/dist/helpers/runs.d.ts.map +1 -0
- package/dist/helpers/runs.js +47 -0
- package/dist/helpers/runs.js.map +1 -0
- package/dist/helpers/state.d.ts +9 -0
- package/dist/helpers/state.d.ts.map +1 -0
- package/dist/helpers/state.js +22 -0
- package/dist/helpers/state.js.map +1 -0
- package/dist/helpers/subjects.d.ts +32 -0
- package/dist/helpers/subjects.d.ts.map +1 -0
- package/dist/helpers/subjects.js +78 -0
- package/dist/helpers/subjects.js.map +1 -0
- package/dist/helpers/threads.d.ts +19 -0
- package/dist/helpers/threads.d.ts.map +1 -0
- package/dist/helpers/threads.js +38 -0
- package/dist/helpers/threads.js.map +1 -0
- package/dist/helpers/types.d.ts +60 -0
- package/dist/helpers/types.d.ts.map +1 -0
- package/dist/helpers/types.js +2 -0
- package/dist/helpers/types.js.map +1 -0
- package/dist/helpers/utils.d.ts +37 -0
- package/dist/helpers/utils.d.ts.map +1 -0
- package/dist/helpers/utils.js +94 -0
- package/dist/helpers/utils.js.map +1 -0
- package/dist/index.d.ts +13 -11
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -15
- package/dist/index.js.map +1 -0
- package/dist/records.d.ts +7 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +208 -0
- package/dist/records.js.map +1 -0
- package/dist/routing.d.ts +7 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +393 -0
- package/dist/routing.js.map +1 -0
- package/dist/schema.d.ts +18 -1420
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +206 -114
- package/dist/schema.js.map +1 -0
- package/dist/secrets.d.ts +13 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +86 -0
- package/dist/secrets.js.map +1 -0
- package/dist/sessions.d.ts +53 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +85 -0
- package/dist/sessions.js.map +1 -0
- package/dist/store.d.ts +24 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +49 -0
- package/dist/store.js.map +1 -0
- package/dist/validate.d.ts +25 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +144 -0
- package/dist/validate.js.map +1 -0
- package/package.json +15 -14
- package/dist/automation-store.d.ts +0 -62
- package/dist/automation-store.js +0 -675
- package/dist/connections-store.d.ts +0 -25
- package/dist/connections-store.js +0 -102
- package/dist/decision-store.d.ts +0 -8
- package/dist/decision-store.js +0 -39
- package/dist/meta.d.ts +0 -5
- package/dist/meta.js +0 -20
- package/dist/thread-store.d.ts +0 -5
- package/dist/thread-store.js +0 -209
- package/dist/vendo-registry.d.ts +0 -5
- package/dist/vendo-registry.js +0 -52
- package/migrations/.gitkeep +0 -0
- package/migrations/0000_living_kate_bishop.sql +0 -110
- package/migrations/0001_brainy_tinkerer.sql +0 -13
- package/migrations/meta/0000_snapshot.json +0 -757
- package/migrations/meta/0001_snapshot.json +0 -859
- package/migrations/meta/_journal.json +0 -20
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { StoreAdapter } from "@vendoai/core";
|
|
2
|
+
import { type Db, type StoreConfig } from "./db.js";
|
|
3
|
+
/** 02-store §1 */
|
|
4
|
+
export interface VendoStore extends StoreAdapter {
|
|
5
|
+
ensureSchema(): Promise<void>;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
raw(): unknown;
|
|
8
|
+
}
|
|
9
|
+
/** Per-handle internals kept OFF the public store object (02-store §4 keeps
|
|
10
|
+
* the encryption key out of reach of anything holding the store). */
|
|
11
|
+
interface StoreInternals {
|
|
12
|
+
db: Db;
|
|
13
|
+
encryptionKey: Buffer | undefined;
|
|
14
|
+
allowPlaintextSecrets: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function dbFor(store: VendoStore): Db;
|
|
17
|
+
/** Package-internal (secrets.ts): the secrets configuration bound to a store
|
|
18
|
+
* handle. A closed (or unknown) handle reads as no key and no plaintext
|
|
19
|
+
* allowance, so secret access fails closed. */
|
|
20
|
+
export declare function secretsConfigFor(store: VendoStore): Pick<StoreInternals, "encryptionKey" | "allowPlaintextSecrets">;
|
|
21
|
+
/** 02-store §1 */
|
|
22
|
+
export declare function createStore(config?: StoreConfig): VendoStore;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,YAAY,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAY,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAK9D,kBAAkB;AAClB,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,GAAG,IAAI,OAAO,CAAC;CAChB;AAED;sEACsE;AACtE,UAAU,cAAc;IACtB,EAAE,EAAE,EAAE,CAAC;IACP,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAID,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAI3C;AAED;;gDAEgD;AAChD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,eAAe,GAAG,uBAAuB,CAAC,CAEnH;AAED,kBAAkB;AAClB,wBAAgB,WAAW,CAAC,MAAM,GAAE,WAAgB,GAAG,UAAU,CA2BhE"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createBlobStore } from "./blobs.js";
|
|
2
|
+
import { validateEncryptionKey } from "./crypto.js";
|
|
3
|
+
import { createDb } from "./db.js";
|
|
4
|
+
import { createRecordStore } from "./records.js";
|
|
5
|
+
import { createReservedRecordStore } from "./routing.js";
|
|
6
|
+
import { ensureSchema as migrateSchema } from "./schema.js";
|
|
7
|
+
const internals = new WeakMap();
|
|
8
|
+
export function dbFor(store) {
|
|
9
|
+
const found = internals.get(store);
|
|
10
|
+
if (!found)
|
|
11
|
+
throw new Error("Unknown VendoStore handle");
|
|
12
|
+
return found.db;
|
|
13
|
+
}
|
|
14
|
+
/** Package-internal (secrets.ts): the secrets configuration bound to a store
|
|
15
|
+
* handle. A closed (or unknown) handle reads as no key and no plaintext
|
|
16
|
+
* allowance, so secret access fails closed. */
|
|
17
|
+
export function secretsConfigFor(store) {
|
|
18
|
+
return internals.get(store) ?? { encryptionKey: undefined, allowPlaintextSecrets: false };
|
|
19
|
+
}
|
|
20
|
+
/** 02-store §1 */
|
|
21
|
+
export function createStore(config = {}) {
|
|
22
|
+
const encryptionKey = config.encryption ? validateEncryptionKey(config.encryption.key) : undefined;
|
|
23
|
+
const db = createDb(config);
|
|
24
|
+
const store = {
|
|
25
|
+
records(collection) {
|
|
26
|
+
return createReservedRecordStore(db, collection) ?? createRecordStore(db, collection);
|
|
27
|
+
},
|
|
28
|
+
blobs(namespace) {
|
|
29
|
+
return createBlobStore(db, namespace);
|
|
30
|
+
},
|
|
31
|
+
async ensureSchema() {
|
|
32
|
+
await migrateSchema(db);
|
|
33
|
+
},
|
|
34
|
+
async close() {
|
|
35
|
+
internals.delete(store);
|
|
36
|
+
await db.close();
|
|
37
|
+
},
|
|
38
|
+
raw() {
|
|
39
|
+
return db.raw();
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
internals.set(store, {
|
|
43
|
+
db,
|
|
44
|
+
encryptionKey,
|
|
45
|
+
allowPlaintextSecrets: encryptionKey === undefined && config.allowUnencryptedSecrets === true,
|
|
46
|
+
});
|
|
47
|
+
return store;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAA6B,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAiB5D,MAAM,SAAS,GAAG,IAAI,OAAO,EAA0B,CAAC;AAExD,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED;;gDAEgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC;AAC5F,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,WAAW,CAAC,SAAsB,EAAE;IAClD,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnG,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAe;QACxB,OAAO,CAAC,UAAkB;YACxB,OAAO,yBAAyB,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACxF,CAAC;QACD,KAAK,CAAC,SAAiB;YACrB,OAAO,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,KAAK;YACT,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QACD,GAAG;YACD,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;IACF,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE;QACnB,EAAE;QACF,aAAa;QACb,qBAAqB,EAAE,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,uBAAuB,KAAK,IAAI;KAC9F,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type AppDocument, type ApprovalRequest, type AuditEvent, type Json, type PermissionGrant } from "@vendoai/core";
|
|
2
|
+
import type { AppRow, ApprovalRow, RunRow, ThreadRow } from "./helpers/types.js";
|
|
3
|
+
export interface ApprovalData {
|
|
4
|
+
request: ApprovalRequest;
|
|
5
|
+
status: ApprovalRow["status"];
|
|
6
|
+
decidedAt?: string;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
consumedAt?: string;
|
|
9
|
+
}
|
|
10
|
+
export type ThreadData = Pick<ThreadRow, "subject" | "messages" | "title">;
|
|
11
|
+
export type RunData = Omit<RunRow, "id">;
|
|
12
|
+
export type AppData = Pick<AppRow, "subject" | "enabled" | "doc">;
|
|
13
|
+
export declare function invalid(message: string): never;
|
|
14
|
+
export declare function requireJson(value: unknown, label: string): Json;
|
|
15
|
+
export declare function requireRecordId(id: unknown): string;
|
|
16
|
+
export declare function requireMatchingId(recordId: string, embeddedId: string, label: string): void;
|
|
17
|
+
export declare function parsePermissionGrant(value: unknown): PermissionGrant;
|
|
18
|
+
export declare function parseApprovalRequest(value: unknown): ApprovalRequest;
|
|
19
|
+
export declare function parseAuditEvent(value: unknown): AuditEvent;
|
|
20
|
+
export declare function parseAppDocument(value: unknown): AppDocument;
|
|
21
|
+
export declare function parseApprovalData(value: unknown, id: string): ApprovalData;
|
|
22
|
+
export declare function parseThreadData(value: unknown, id: string): ThreadData;
|
|
23
|
+
export declare function parseRunData(value: unknown, id: string): RunData;
|
|
24
|
+
export declare function parseAppData(value: unknown, id: string): AppData;
|
|
25
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,CAAC;AAC3E,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACzC,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC;AAElE,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAE9C;AAoDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG/D;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAGnD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAEpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAkB1E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,CAStE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAoBhE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAOhE"}
|
package/dist/validate.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { VendoError, appDocumentSchema, appIdSchema, approvalRequestSchema, auditEventSchema, isoDateTimeSchema, permissionGrantSchema, runIdSchema, threadIdSchema, } from "@vendoai/core";
|
|
2
|
+
export function invalid(message) {
|
|
3
|
+
throw new VendoError("validation", message);
|
|
4
|
+
}
|
|
5
|
+
function object(value, label) {
|
|
6
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
7
|
+
return invalid(`${label} must be an object`);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function parseSchema(schema, value, label) {
|
|
12
|
+
const result = schema.safeParse(value);
|
|
13
|
+
if (!result.success)
|
|
14
|
+
invalid(`${label}: ${result.error.issues[0]?.message ?? "invalid value"}`);
|
|
15
|
+
return result.data;
|
|
16
|
+
}
|
|
17
|
+
function optionalString(value, label) {
|
|
18
|
+
if (value === undefined)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (typeof value !== "string")
|
|
21
|
+
invalid(`${label} must be a string`);
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function optionalDate(value, label) {
|
|
25
|
+
if (value === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
return parseSchema(isoDateTimeSchema, value, label);
|
|
28
|
+
}
|
|
29
|
+
function isJson(value, seen = new Set()) {
|
|
30
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
31
|
+
return true;
|
|
32
|
+
if (typeof value === "number")
|
|
33
|
+
return Number.isFinite(value);
|
|
34
|
+
if (Array.isArray(value)) {
|
|
35
|
+
if (seen.has(value))
|
|
36
|
+
return false;
|
|
37
|
+
seen.add(value);
|
|
38
|
+
const valid = value.every((entry) => isJson(entry, seen));
|
|
39
|
+
seen.delete(value);
|
|
40
|
+
return valid;
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === "object") {
|
|
43
|
+
if (seen.has(value))
|
|
44
|
+
return false;
|
|
45
|
+
const prototype = Object.getPrototypeOf(value);
|
|
46
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
47
|
+
return false;
|
|
48
|
+
seen.add(value);
|
|
49
|
+
const valid = Object.values(value).every((entry) => isJson(entry, seen));
|
|
50
|
+
seen.delete(value);
|
|
51
|
+
return valid;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
export function requireJson(value, label) {
|
|
56
|
+
if (!isJson(value))
|
|
57
|
+
invalid(`${label} must be JSON-serializable`);
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
export function requireRecordId(id) {
|
|
61
|
+
if (typeof id !== "string")
|
|
62
|
+
invalid("record id must be a string");
|
|
63
|
+
return id;
|
|
64
|
+
}
|
|
65
|
+
export function requireMatchingId(recordId, embeddedId, label) {
|
|
66
|
+
if (embeddedId !== recordId)
|
|
67
|
+
invalid(`${label} must equal record id`);
|
|
68
|
+
}
|
|
69
|
+
export function parsePermissionGrant(value) {
|
|
70
|
+
return parseSchema(permissionGrantSchema, value, "permission grant");
|
|
71
|
+
}
|
|
72
|
+
export function parseApprovalRequest(value) {
|
|
73
|
+
return parseSchema(approvalRequestSchema, value, "approval request");
|
|
74
|
+
}
|
|
75
|
+
export function parseAuditEvent(value) {
|
|
76
|
+
return parseSchema(auditEventSchema, value, "audit event");
|
|
77
|
+
}
|
|
78
|
+
export function parseAppDocument(value) {
|
|
79
|
+
return parseSchema(appDocumentSchema, value, "app document");
|
|
80
|
+
}
|
|
81
|
+
export function parseApprovalData(value, id) {
|
|
82
|
+
const input = object(value, "approval data");
|
|
83
|
+
const request = parseApprovalRequest(input["request"]);
|
|
84
|
+
requireMatchingId(id, request.id, "approval request id");
|
|
85
|
+
const status = input["status"];
|
|
86
|
+
if (status !== "pending" && status !== "approved" && status !== "denied") {
|
|
87
|
+
invalid("approval status must be pending, approved, or denied");
|
|
88
|
+
}
|
|
89
|
+
const decidedAt = optionalDate(input["decidedAt"], "approval decidedAt");
|
|
90
|
+
const sessionId = optionalString(input["sessionId"], "approval sessionId");
|
|
91
|
+
const consumedAt = optionalDate(input["consumedAt"], "approval consumedAt");
|
|
92
|
+
return {
|
|
93
|
+
request,
|
|
94
|
+
status,
|
|
95
|
+
...(decidedAt === undefined ? {} : { decidedAt }),
|
|
96
|
+
...(sessionId === undefined ? {} : { sessionId }),
|
|
97
|
+
...(consumedAt === undefined ? {} : { consumedAt }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function parseThreadData(value, id) {
|
|
101
|
+
parseSchema(threadIdSchema, id, "thread id");
|
|
102
|
+
const input = object(value, "thread data");
|
|
103
|
+
if (typeof input["subject"] !== "string")
|
|
104
|
+
invalid("thread subject must be a string");
|
|
105
|
+
if (!Array.isArray(input["messages"]))
|
|
106
|
+
invalid("thread messages must be an array");
|
|
107
|
+
const messages = input["messages"].map((message, index) => requireJson(message, `thread message ${index}`));
|
|
108
|
+
const title = input["title"];
|
|
109
|
+
if (title !== undefined && typeof title !== "string")
|
|
110
|
+
invalid("thread title must be a string");
|
|
111
|
+
return { subject: input["subject"], messages, ...(title === undefined ? {} : { title }) };
|
|
112
|
+
}
|
|
113
|
+
export function parseRunData(value, id) {
|
|
114
|
+
parseSchema(runIdSchema, id, "run id");
|
|
115
|
+
const input = object(value, "run data");
|
|
116
|
+
const appId = parseSchema(appIdSchema, input["appId"], "run appId");
|
|
117
|
+
const triggerInput = object(input["trigger"], "run trigger");
|
|
118
|
+
const kind = triggerInput["kind"];
|
|
119
|
+
if (kind !== "schedule" && kind !== "host-event" && kind !== "external") {
|
|
120
|
+
invalid("run trigger kind is invalid");
|
|
121
|
+
}
|
|
122
|
+
const event = optionalString(triggerInput["event"], "run trigger event");
|
|
123
|
+
const trigger = { kind, ...(event === undefined ? {} : { event }) };
|
|
124
|
+
const status = input["status"];
|
|
125
|
+
if (status !== "running" && status !== "ok" && status !== "error"
|
|
126
|
+
&& status !== "stopped" && status !== "pending-approval") {
|
|
127
|
+
invalid("run status is invalid");
|
|
128
|
+
}
|
|
129
|
+
const record = requireJson(input["record"], "run record");
|
|
130
|
+
const startedAt = parseSchema(isoDateTimeSchema, input["startedAt"], "run startedAt");
|
|
131
|
+
const finishedAt = optionalDate(input["finishedAt"], "run finishedAt");
|
|
132
|
+
return { appId, trigger, status, record, startedAt, ...(finishedAt === undefined ? {} : { finishedAt }) };
|
|
133
|
+
}
|
|
134
|
+
export function parseAppData(value, id) {
|
|
135
|
+
const input = object(value, "app data");
|
|
136
|
+
if (typeof input["subject"] !== "string")
|
|
137
|
+
invalid("app subject must be a string");
|
|
138
|
+
if (typeof input["enabled"] !== "boolean")
|
|
139
|
+
invalid("app enabled must be a boolean");
|
|
140
|
+
const doc = parseAppDocument(input["doc"]);
|
|
141
|
+
requireMatchingId(id, doc.id, "app document id");
|
|
142
|
+
return { subject: input["subject"], enabled: input["enabled"], doc };
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vendoai/store",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "Persistence under everything: core's StoreAdapter on Postgres — PGlite zero-config default, real Postgres in prod, one schema.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
7
7
|
"agent",
|
|
8
8
|
"persistence",
|
|
9
9
|
"postgres",
|
|
10
10
|
"pglite",
|
|
11
|
-
"
|
|
11
|
+
"vendo"
|
|
12
12
|
],
|
|
13
13
|
"license": "Apache-2.0",
|
|
14
14
|
"repository": {
|
|
15
15
|
"type": "git",
|
|
16
16
|
"url": "git+https://github.com/runvendo/vendo.git",
|
|
17
|
-
"directory": "packages/
|
|
17
|
+
"directory": "packages/store"
|
|
18
18
|
},
|
|
19
19
|
"homepage": "https://vendo.run",
|
|
20
20
|
"bugs": "https://github.com/runvendo/vendo/issues",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"type": "module",
|
|
28
|
+
"sideEffects": false,
|
|
28
29
|
"main": "./dist/index.js",
|
|
29
30
|
"types": "./dist/index.d.ts",
|
|
30
31
|
"exports": {
|
|
@@ -35,24 +36,24 @@
|
|
|
35
36
|
},
|
|
36
37
|
"files": [
|
|
37
38
|
"dist",
|
|
38
|
-
"
|
|
39
|
+
"README.md"
|
|
39
40
|
],
|
|
40
41
|
"dependencies": {
|
|
41
|
-
"@electric-sql/pglite": "^0.
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"@vendoai/core": "0.1.0",
|
|
45
|
-
"@vendoai/runtime": "0.1.0"
|
|
42
|
+
"@electric-sql/pglite": "^0.5.4",
|
|
43
|
+
"pg": "^8.22.0",
|
|
44
|
+
"@vendoai/core": "0.4.1"
|
|
46
45
|
},
|
|
47
46
|
"devDependencies": {
|
|
48
|
-
"@types/
|
|
49
|
-
"
|
|
47
|
+
"@types/node": "^22.0.0",
|
|
48
|
+
"@types/pg": "^8.11.10",
|
|
50
49
|
"typescript": "^5.6.0",
|
|
51
50
|
"vitest": "^2.1.0"
|
|
52
51
|
},
|
|
53
52
|
"scripts": {
|
|
54
53
|
"build": "tsc -p tsconfig.json",
|
|
55
|
-
"
|
|
56
|
-
"
|
|
54
|
+
"conformance": "tsc -p tsconfig.json && vitest run src/conformance.test.ts src/contract-routing.conformance.test.ts src/security/audit-append-only.conformance.test.ts src/security/secrets-aad.conformance.test.ts src/flip-guards.conformance.test.ts src/erase.conformance.test.ts src/postgres-gate.test.ts",
|
|
55
|
+
"test": "tsc -p tsconfig.json && vitest run",
|
|
56
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
57
|
+
"test:coverage": "tsc -p tsconfig.json && vitest run --coverage"
|
|
57
58
|
}
|
|
58
59
|
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { AutomationRecord as CoreAutomationRecord, AutomationRun as CoreAutomationRun, Principal } from "@vendoai/core";
|
|
2
|
-
import { type AutomationEngineStore, type AutomationRecord, type AutomationRun, type AutomationSpec, type AutomationVersion, type CreateAutomationInput, type CreateParkedActionInput, type CreateRunInput, type FinalizeRunInput, type ListParkedActionsFilter, type ParkedAction, type ParkedActionResolution, type PendingApproval, type TriggerKind, type UpdateAutomationInput } from "@vendoai/runtime";
|
|
3
|
-
import type { VendoDb } from "./db.js";
|
|
4
|
-
/** Postgres text timestamp -> the ISO 8601 string the runtime writes/expects. */
|
|
5
|
-
export declare function toIso(value: string): string;
|
|
6
|
-
/** Durable port of `InMemoryAutomationStore`; see the module doc for the two
|
|
7
|
-
* methods that genuinely need database semantics. */
|
|
8
|
-
export declare class DrizzleAutomationStore implements AutomationEngineStore {
|
|
9
|
-
private readonly handle;
|
|
10
|
-
private readonly clock;
|
|
11
|
-
constructor(handle: VendoDb, opts?: {
|
|
12
|
-
now?: () => string;
|
|
13
|
-
});
|
|
14
|
-
private now;
|
|
15
|
-
private get db();
|
|
16
|
-
private withTransaction;
|
|
17
|
-
save(scope: Principal, automation: Omit<CoreAutomationRecord, "id" | "createdAt" | "updatedAt">): Promise<AutomationRecord>;
|
|
18
|
-
get(scope: Principal, id: string): Promise<AutomationRecord | undefined>;
|
|
19
|
-
list(scope: Principal): Promise<AutomationRecord[]>;
|
|
20
|
-
recordRun(scope: Principal, run: CoreAutomationRun): Promise<void>;
|
|
21
|
-
listRuns(scope: Principal, automationId: string): Promise<AutomationRun[]>;
|
|
22
|
-
create(scope: Principal, input: CreateAutomationInput): Promise<{
|
|
23
|
-
automation: AutomationRecord;
|
|
24
|
-
version: AutomationVersion;
|
|
25
|
-
}>;
|
|
26
|
-
update(scope: Principal, id: string, input: UpdateAutomationInput): Promise<{
|
|
27
|
-
automation: AutomationRecord;
|
|
28
|
-
version: AutomationVersion;
|
|
29
|
-
}>;
|
|
30
|
-
getVersion(scope: Principal, id: string, version: number): Promise<AutomationVersion | undefined>;
|
|
31
|
-
setStatus(scope: Principal, id: string, status: CoreAutomationRecord["status"], opts?: {
|
|
32
|
-
disabledReason?: AutomationRecord["disabledReason"];
|
|
33
|
-
}): Promise<void>;
|
|
34
|
-
delete(scope: Principal, id: string): Promise<void>;
|
|
35
|
-
findEnabledByTrigger(scope: Principal, lookup: {
|
|
36
|
-
kind: TriggerKind;
|
|
37
|
-
key: string | null;
|
|
38
|
-
}): Promise<AutomationRecord[]>;
|
|
39
|
-
createRun(scope: Principal, input: CreateRunInput): Promise<AutomationRun>;
|
|
40
|
-
updateRun(scope: Principal, id: string, patch: Partial<Pick<AutomationRun, "outcome" | "steps" | "pendingApproval" | "error" | "parkedCount">>): Promise<AutomationRun>;
|
|
41
|
-
finalizeRun(scope: Principal, id: string, input: FinalizeRunInput): Promise<AutomationRun>;
|
|
42
|
-
getRun(scope: Principal, id: string): Promise<AutomationRun | undefined>;
|
|
43
|
-
/** Capture-then-clear in ONE statement (a plain `RETURNING pending_approval`
|
|
44
|
-
* after an `UPDATE … SET pending_approval = NULL` returns the new NULL,
|
|
45
|
-
* not the value it cleared) — `FOR UPDATE SKIP LOCKED` makes exactly one
|
|
46
|
-
* concurrent caller win. */
|
|
47
|
-
claimPendingApproval(scope: Principal, runId: string): Promise<PendingApproval | undefined>;
|
|
48
|
-
cancelPendingRuns(scope: Principal, automationId: string): Promise<void>;
|
|
49
|
-
listEnabledSchedules(): Promise<Array<{
|
|
50
|
-
automationId: string;
|
|
51
|
-
trigger: Extract<AutomationSpec["trigger"], {
|
|
52
|
-
type: "schedule";
|
|
53
|
-
}>;
|
|
54
|
-
principal: Principal;
|
|
55
|
-
}>>;
|
|
56
|
-
createParkedAction(scope: Principal, input: CreateParkedActionInput): Promise<ParkedAction>;
|
|
57
|
-
listParkedActions(scope: Principal, filter: ListParkedActionsFilter): Promise<ParkedAction[]>;
|
|
58
|
-
getParkedAction(scope: Principal, id: string): Promise<ParkedAction | undefined>;
|
|
59
|
-
resolveParkedAction(scope: Principal, id: string, resolution: ParkedActionResolution, resolvedAt: string): Promise<ParkedAction>;
|
|
60
|
-
private mustGet;
|
|
61
|
-
private mustGetRun;
|
|
62
|
-
}
|