@ganju/utils 0.0.16 → 0.0.17
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/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -1
- package/dist/customCodeToken.d.ts +11 -0
- package/dist/customCodeToken.d.ts.map +1 -1
- package/dist/customCodeToken.js +41 -1
- package/dist/data.d.ts +4 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +26 -1
- package/dist/dataApi.d.ts +68 -1
- package/dist/dataApi.d.ts.map +1 -1
- package/dist/dataApi.js +45 -1
- package/dist/dataCompiler.d.ts.map +1 -1
- package/dist/dataCompiler.js +5 -1
- package/dist/dataCsv.d.ts +20 -0
- package/dist/dataCsv.d.ts.map +1 -0
- package/dist/dataCsv.js +102 -0
- package/dist/dataEngine.d.ts.map +1 -1
- package/dist/dataEngine.js +24 -4
- package/dist/dataImport.d.ts +2 -0
- package/dist/dataImport.d.ts.map +1 -1
- package/dist/dataImport.js +4 -1
- package/dist/dataQueries.d.ts +73 -0
- package/dist/dataQueries.d.ts.map +1 -0
- package/dist/dataQueries.js +513 -0
- package/dist/dataRpc.d.ts +19 -0
- package/dist/dataRpc.d.ts.map +1 -1
- package/dist/dataTools.d.ts +40 -0
- package/dist/dataTools.d.ts.map +1 -0
- package/dist/dataTools.js +280 -0
- package/dist/dataTypes.d.ts +2 -0
- package/dist/dataTypes.d.ts.map +1 -1
- package/dist/index.d.ts +86 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/schema.d.ts +91 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +65 -1
- package/dist/sdkConstants.d.ts +1 -0
- package/dist/sdkConstants.d.ts.map +1 -1
- package/dist/sdkConstants.js +2 -1
- package/package.json +1 -1
- package/src/constants.ts +13 -1
- package/src/customCodeToken.ts +74 -0
- package/src/data.ts +34 -0
- package/src/dataApi.ts +53 -2
- package/src/dataCompiler.ts +5 -1
- package/src/dataCsv.ts +99 -0
- package/src/dataEngine.ts +24 -4
- package/src/dataImport.ts +3 -0
- package/src/dataQueries.ts +730 -0
- package/src/dataRpc.ts +11 -0
- package/src/dataTools.ts +338 -0
- package/src/dataTypes.ts +6 -0
- package/src/index.ts +9 -1
- package/src/schema.ts +69 -1
- package/src/sdkConstants.ts +1 -0
package/dist/schema.d.ts
CHANGED
|
@@ -313,6 +313,13 @@ declare const CUSTOM_CODE_TOOL: z.ZodObject<{
|
|
|
313
313
|
idempotentHint: z.ZodOptional<z.ZodBoolean>;
|
|
314
314
|
openWorldHint: z.ZodOptional<z.ZodBoolean>;
|
|
315
315
|
}, z.core.$strict>>;
|
|
316
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
317
|
+
access: z.ZodOptional<z.ZodEnum<{
|
|
318
|
+
read: "read";
|
|
319
|
+
write: "write";
|
|
320
|
+
}>>;
|
|
321
|
+
tables: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
322
|
+
}, z.core.$strict>>;
|
|
316
323
|
}, z.core.$strip>;
|
|
317
324
|
declare const CUSTOM_CODE_MANIFEST: z.ZodObject<{
|
|
318
325
|
tools: z.ZodArray<z.ZodObject<{
|
|
@@ -353,6 +360,13 @@ declare const CUSTOM_CODE_MANIFEST: z.ZodObject<{
|
|
|
353
360
|
idempotentHint: z.ZodOptional<z.ZodBoolean>;
|
|
354
361
|
openWorldHint: z.ZodOptional<z.ZodBoolean>;
|
|
355
362
|
}, z.core.$strict>>;
|
|
363
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
364
|
+
access: z.ZodOptional<z.ZodEnum<{
|
|
365
|
+
read: "read";
|
|
366
|
+
write: "write";
|
|
367
|
+
}>>;
|
|
368
|
+
tables: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
369
|
+
}, z.core.$strict>>;
|
|
356
370
|
}, z.core.$strip>>;
|
|
357
371
|
}, z.core.$strip>;
|
|
358
372
|
declare const CUSTOM_CODE_BROKER_RESOURCE_CREATE: z.ZodObject<{
|
|
@@ -1394,6 +1408,52 @@ export declare const Schema: {
|
|
|
1394
1408
|
organizationId: z.ZodUUID;
|
|
1395
1409
|
table: z.ZodString;
|
|
1396
1410
|
}, z.core.$strip>;
|
|
1411
|
+
DATA_DATABASE_PATCH: z.ZodObject<{
|
|
1412
|
+
timeZone: z.ZodNullable<z.ZodString>;
|
|
1413
|
+
}, z.core.$strict>;
|
|
1414
|
+
DATA_QUERY_PARAM: z.ZodObject<{
|
|
1415
|
+
name: z.ZodString;
|
|
1416
|
+
type: z.ZodEnum<{
|
|
1417
|
+
boolean: "boolean";
|
|
1418
|
+
text: "text";
|
|
1419
|
+
integer: "integer";
|
|
1420
|
+
decimal: "decimal";
|
|
1421
|
+
date: "date";
|
|
1422
|
+
datetime: "datetime";
|
|
1423
|
+
}>;
|
|
1424
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1425
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
1426
|
+
}, z.core.$strict>;
|
|
1427
|
+
DATA_QUERY_INPUT: z.ZodObject<{
|
|
1428
|
+
name: z.ZodString;
|
|
1429
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1430
|
+
sql: z.ZodString;
|
|
1431
|
+
params: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
1432
|
+
name: z.ZodString;
|
|
1433
|
+
type: z.ZodEnum<{
|
|
1434
|
+
boolean: "boolean";
|
|
1435
|
+
text: "text";
|
|
1436
|
+
integer: "integer";
|
|
1437
|
+
decimal: "decimal";
|
|
1438
|
+
date: "date";
|
|
1439
|
+
datetime: "datetime";
|
|
1440
|
+
}>;
|
|
1441
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1442
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
1443
|
+
}, z.core.$strict>>>;
|
|
1444
|
+
assistant: z.ZodOptional<z.ZodBoolean>;
|
|
1445
|
+
}, z.core.$strict>;
|
|
1446
|
+
DATA_QUERY_RUN_BODY: z.ZodObject<{
|
|
1447
|
+
params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
1448
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
1449
|
+
timeZone: z.ZodOptional<z.ZodString>;
|
|
1450
|
+
}, z.core.$strict>;
|
|
1451
|
+
DATA_QUERY_PATH_PARAMS: z.ZodObject<{
|
|
1452
|
+
projectId: z.ZodUUID;
|
|
1453
|
+
userId: z.ZodUUID;
|
|
1454
|
+
organizationId: z.ZodUUID;
|
|
1455
|
+
name: z.ZodString;
|
|
1456
|
+
}, z.core.$strip>;
|
|
1397
1457
|
DATA_COLUMN_PARAMS: z.ZodObject<{
|
|
1398
1458
|
projectId: z.ZodUUID;
|
|
1399
1459
|
userId: z.ZodUUID;
|
|
@@ -2272,6 +2332,13 @@ export declare const Schema: {
|
|
|
2272
2332
|
idempotentHint: z.ZodOptional<z.ZodBoolean>;
|
|
2273
2333
|
openWorldHint: z.ZodOptional<z.ZodBoolean>;
|
|
2274
2334
|
}, z.core.$strict>>;
|
|
2335
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
2336
|
+
access: z.ZodOptional<z.ZodEnum<{
|
|
2337
|
+
read: "read";
|
|
2338
|
+
write: "write";
|
|
2339
|
+
}>>;
|
|
2340
|
+
tables: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
2341
|
+
}, z.core.$strict>>;
|
|
2275
2342
|
}, z.core.$strip>;
|
|
2276
2343
|
TOOL_ANNOTATIONS: z.ZodObject<{
|
|
2277
2344
|
readOnlyHint: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -2318,6 +2385,13 @@ export declare const Schema: {
|
|
|
2318
2385
|
idempotentHint: z.ZodOptional<z.ZodBoolean>;
|
|
2319
2386
|
openWorldHint: z.ZodOptional<z.ZodBoolean>;
|
|
2320
2387
|
}, z.core.$strict>>;
|
|
2388
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
2389
|
+
access: z.ZodOptional<z.ZodEnum<{
|
|
2390
|
+
read: "read";
|
|
2391
|
+
write: "write";
|
|
2392
|
+
}>>;
|
|
2393
|
+
tables: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
2394
|
+
}, z.core.$strict>>;
|
|
2321
2395
|
}, z.core.$strip>>;
|
|
2322
2396
|
}, z.core.$strip>;
|
|
2323
2397
|
ARTIFACT_CUSTOM_CODE_CREATE_VERSION: z.ZodObject<{
|
|
@@ -2360,6 +2434,13 @@ export declare const Schema: {
|
|
|
2360
2434
|
idempotentHint: z.ZodOptional<z.ZodBoolean>;
|
|
2361
2435
|
openWorldHint: z.ZodOptional<z.ZodBoolean>;
|
|
2362
2436
|
}, z.core.$strict>>;
|
|
2437
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
2438
|
+
access: z.ZodOptional<z.ZodEnum<{
|
|
2439
|
+
read: "read";
|
|
2440
|
+
write: "write";
|
|
2441
|
+
}>>;
|
|
2442
|
+
tables: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
2443
|
+
}, z.core.$strict>>;
|
|
2363
2444
|
}, z.core.$strip>>;
|
|
2364
2445
|
}, z.core.$strip>;
|
|
2365
2446
|
config: z.ZodOptional<z.ZodObject<{
|
|
@@ -2479,6 +2560,16 @@ export declare const Schema: {
|
|
|
2479
2560
|
CUSTOM_CODE_BROKER_SECRET: z.ZodObject<{
|
|
2480
2561
|
name: z.ZodString;
|
|
2481
2562
|
}, z.core.$strip>;
|
|
2563
|
+
CUSTOM_CODE_BROKER_DATA: z.ZodObject<{
|
|
2564
|
+
call: z.ZodString;
|
|
2565
|
+
op: z.ZodEnum<{
|
|
2566
|
+
query: "query";
|
|
2567
|
+
write: "write";
|
|
2568
|
+
describe: "describe";
|
|
2569
|
+
run: "run";
|
|
2570
|
+
}>;
|
|
2571
|
+
args: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
2572
|
+
}, z.core.$strip>;
|
|
2482
2573
|
CUSTOM_CODE_BROKER_RESOURCE_SEARCH: z.ZodObject<{
|
|
2483
2574
|
query: z.ZodString;
|
|
2484
2575
|
limit: z.ZodDefault<z.ZodNumber>;
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAokCxB,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgGrB,CAAC;AAyDN,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4CpB,CAAC;AAWH,QAAA,MAAM,kBAAkB;;;;;;;;;;iBA+CtB,CAAC;AAqCH,QAAA,MAAM,gBAAgB;;;;;kBAOX,CAAC;AAEZ,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBpB,CAAC;AAYH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCxB,CAAC;AAqPH,QAAA,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DpC,CAAC;AA4BL,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAkDzB,CAAC;AAuHH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJlB,CAAC;AAGF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAIlE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAMtE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAGtE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAMtE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAIvE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAC5C,OAAO,kCAAkC,CAC1C,CAAC;AAKF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IAIrB,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;CAChD;AAKD,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC1E;AAMD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACtC"}
|
package/dist/schema.js
CHANGED
|
@@ -585,6 +585,23 @@ const DATA_RESTORE_POINT_BODY = zod_1.z.union([
|
|
|
585
585
|
}),
|
|
586
586
|
zod_1.z.strictObject({ bookmark: zod_1.z.string().min(1).max(200) })
|
|
587
587
|
]);
|
|
588
|
+
// The database's own settings. `timeZone` is an IANA zone (America/Bogota),
|
|
589
|
+
// or null for UTC: datetimes come back in it for callers that send none.
|
|
590
|
+
const DATA_DATABASE_PATCH = zod_1.z.strictObject({
|
|
591
|
+
timeZone: zod_1.z
|
|
592
|
+
.string()
|
|
593
|
+
.max(100)
|
|
594
|
+
.refine(zone => {
|
|
595
|
+
try {
|
|
596
|
+
new Intl.DateTimeFormat('en-US', { timeZone: zone });
|
|
597
|
+
return true;
|
|
598
|
+
}
|
|
599
|
+
catch {
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
}, 'Use an IANA time zone, such as America/Bogota.')
|
|
603
|
+
.nullable()
|
|
604
|
+
});
|
|
588
605
|
const DATA_EXPORT_BODY = zod_1.z.strictObject({
|
|
589
606
|
format: zod_1.z.enum(['jsonl', 'csv']).optional()
|
|
590
607
|
});
|
|
@@ -600,11 +617,33 @@ const DATA_CHANGE_LIST_QUERY = zod_1.z.strictObject({
|
|
|
600
617
|
limit: zod_1.z.coerce.number().int().min(1).max(100).optional(),
|
|
601
618
|
cursor: zod_1.z.uuid().optional()
|
|
602
619
|
});
|
|
620
|
+
// Named queries: a SELECT the owner writes once, with named parameters
|
|
621
|
+
// (`:from`), checked to only read when it is saved.
|
|
622
|
+
const DATA_QUERY_PARAM = zod_1.z.strictObject({
|
|
623
|
+
name: DATA_IDENTIFIER,
|
|
624
|
+
type: zod_1.z.enum(['text', 'integer', 'decimal', 'boolean', 'date', 'datetime']),
|
|
625
|
+
description: zod_1.z.string().max(300).nullish(),
|
|
626
|
+
required: zod_1.z.boolean().optional()
|
|
627
|
+
});
|
|
628
|
+
const DATA_QUERY_INPUT = zod_1.z.strictObject({
|
|
629
|
+
name: DATA_IDENTIFIER,
|
|
630
|
+
description: zod_1.z.string().max(300).nullish(),
|
|
631
|
+
sql: zod_1.z.string().min(1).max(10_000),
|
|
632
|
+
params: zod_1.z.array(DATA_QUERY_PARAM).max(20).optional(),
|
|
633
|
+
// Channel bots may run it from data-query.
|
|
634
|
+
assistant: zod_1.z.boolean().optional()
|
|
635
|
+
});
|
|
636
|
+
const DATA_QUERY_RUN_BODY = zod_1.z.strictObject({
|
|
637
|
+
params: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
|
|
638
|
+
limit: zod_1.z.number().int().min(1).max(500).optional(),
|
|
639
|
+
timeZone: zod_1.z.string().max(100).optional()
|
|
640
|
+
});
|
|
603
641
|
const DATA_TABLE_PARAMS = DATA_DATABASE_GET.extend({ table: DATA_IDENTIFIER });
|
|
604
642
|
const DATA_COLUMN_PARAMS = DATA_TABLE_PARAMS.extend({
|
|
605
643
|
column: DATA_IDENTIFIER
|
|
606
644
|
});
|
|
607
645
|
const DATA_ROW_PARAMS = DATA_TABLE_PARAMS.extend({ id: DATA_ROW_ID });
|
|
646
|
+
const DATA_QUERY_PATH_PARAMS = DATA_DATABASE_GET.extend({ name: DATA_IDENTIFIER });
|
|
608
647
|
const ARTIFACT_UPLOAD_RESOURCE_FILE = zod_1.z.object({
|
|
609
648
|
resourceId: zod_1.z.uuid(),
|
|
610
649
|
projectId: zod_1.z.uuid(),
|
|
@@ -1153,7 +1192,17 @@ const CUSTOM_CODE_TOOL = zod_1.z.object({
|
|
|
1153
1192
|
description: zod_1.z.string().max(2000).optional(),
|
|
1154
1193
|
inputSchema: SCHEMA_DEFINITION.default({ type: 'object', properties: {} }),
|
|
1155
1194
|
outputSchema: SCHEMA_DEFINITION.optional(),
|
|
1156
|
-
annotations: TOOL_ANNOTATIONS.optional()
|
|
1195
|
+
annotations: TOOL_ANNOTATIONS.optional(),
|
|
1196
|
+
// What this function may do through ctx.data. Absent means everything: it
|
|
1197
|
+
// is the owner's code. Narrowing matters most for a function a channel bot
|
|
1198
|
+
// calls after reading customer text, and the broker enforces it, since
|
|
1199
|
+
// anything in the script can be edited.
|
|
1200
|
+
data: zod_1.z
|
|
1201
|
+
.strictObject({
|
|
1202
|
+
access: zod_1.z.enum(['read', 'write']).optional(),
|
|
1203
|
+
tables: zod_1.z.array(zod_1.z.string().min(1).max(63)).max(50).optional()
|
|
1204
|
+
})
|
|
1205
|
+
.optional()
|
|
1157
1206
|
});
|
|
1158
1207
|
// The manifest a `ganju deploy` (or the dashboard) uploads alongside a bundle.
|
|
1159
1208
|
// Names must be unique within one script: apps/mcp registers them into a single
|
|
@@ -1379,6 +1428,15 @@ const CUSTOM_CODE_BROKER_SECRET = zod_1.z.object({
|
|
|
1379
1428
|
// (they carry no id inside the script). See CREDENTIAL_PROVIDER_CUSTOM_CODE.
|
|
1380
1429
|
name: zod_1.z.string().min(1).max(200)
|
|
1381
1430
|
});
|
|
1431
|
+
// One ctx.data call. `call` is the token the dispatcher signed for the
|
|
1432
|
+
// function being run, which the script hands back: the broker reads the
|
|
1433
|
+
// function's name from it, never from the script, and applies that
|
|
1434
|
+
// function's `data` narrowing.
|
|
1435
|
+
const CUSTOM_CODE_BROKER_DATA = zod_1.z.object({
|
|
1436
|
+
call: zod_1.z.string().min(1).max(4000),
|
|
1437
|
+
op: zod_1.z.enum(['describe', 'query', 'write', 'run']),
|
|
1438
|
+
args: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).default({})
|
|
1439
|
+
});
|
|
1382
1440
|
const CUSTOM_CODE_BROKER_RESOURCE_SEARCH = zod_1.z.object({
|
|
1383
1441
|
query: zod_1.z.string().min(1).max(2000),
|
|
1384
1442
|
limit: zod_1.z.number().int().positive().max(20).default(5)
|
|
@@ -1706,6 +1764,11 @@ exports.Schema = {
|
|
|
1706
1764
|
DATA_EXPORT_FILE_QUERY,
|
|
1707
1765
|
DATA_CHANGE_LIST_QUERY,
|
|
1708
1766
|
DATA_TABLE_PARAMS,
|
|
1767
|
+
DATA_DATABASE_PATCH,
|
|
1768
|
+
DATA_QUERY_PARAM,
|
|
1769
|
+
DATA_QUERY_INPUT,
|
|
1770
|
+
DATA_QUERY_RUN_BODY,
|
|
1771
|
+
DATA_QUERY_PATH_PARAMS,
|
|
1709
1772
|
DATA_COLUMN_PARAMS,
|
|
1710
1773
|
DATA_ROW_PARAMS,
|
|
1711
1774
|
ARTIFACT_REMOVE_RESOURCE,
|
|
@@ -1769,6 +1832,7 @@ exports.Schema = {
|
|
|
1769
1832
|
CUSTOM_CODE_INVOKE_RESPONSE,
|
|
1770
1833
|
CUSTOM_CODE_BROKER_CONNECTION,
|
|
1771
1834
|
CUSTOM_CODE_BROKER_SECRET,
|
|
1835
|
+
CUSTOM_CODE_BROKER_DATA,
|
|
1772
1836
|
CUSTOM_CODE_BROKER_RESOURCE_SEARCH,
|
|
1773
1837
|
CUSTOM_CODE_BROKER_RESOURCE_READ,
|
|
1774
1838
|
CUSTOM_CODE_BROKER_RESOURCE_CREATE,
|
package/dist/sdkConstants.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare const CUSTOM_CODE_BROKER_PATH_RESOURCES_LIST = "/resources/list";
|
|
|
9
9
|
export declare const CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE = "/resources/create";
|
|
10
10
|
export declare const CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE = "/resources/delete";
|
|
11
11
|
export declare const CUSTOM_CODE_BROKER_PATH_SEND_FILE = "/send-file";
|
|
12
|
+
export declare const CUSTOM_CODE_BROKER_PATH_DATA = "/data";
|
|
12
13
|
export declare const CUSTOM_CODE_BINDING_VERSION = "GANJU_SCRIPT_VERSION";
|
|
13
14
|
export declare const CUSTOM_CODE_HEALTH_TOOL = "__ganju_health";
|
|
14
15
|
export declare const CUSTOM_CODE_MAX_LOGS = 50;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkConstants.d.ts","sourceRoot":"","sources":["../src/sdkConstants.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAC5D,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AAKzD,eAAO,MAAM,yBAAyB,kCAAkC,CAAC;AACzE,eAAO,MAAM,kCAAkC,gBAAgB,CAAC;AAChE,eAAO,MAAM,8BAA8B,YAAY,CAAC;AACxD,eAAO,MAAM,wCAAwC,sBAAsB,CAAC;AAC5E,eAAO,MAAM,sCAAsC,oBAAoB,CAAC;AACxE,eAAO,MAAM,sCAAsC,oBAAoB,CAAC;AACxE,eAAO,MAAM,wCAAwC,sBAAsB,CAAC;AAC5E,eAAO,MAAM,wCAAwC,sBAAsB,CAAC;AAC5E,eAAO,MAAM,iCAAiC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sdkConstants.d.ts","sourceRoot":"","sources":["../src/sdkConstants.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAC5D,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AAKzD,eAAO,MAAM,yBAAyB,kCAAkC,CAAC;AACzE,eAAO,MAAM,kCAAkC,gBAAgB,CAAC;AAChE,eAAO,MAAM,8BAA8B,YAAY,CAAC;AACxD,eAAO,MAAM,wCAAwC,sBAAsB,CAAC;AAC5E,eAAO,MAAM,sCAAsC,oBAAoB,CAAC;AACxE,eAAO,MAAM,sCAAsC,oBAAoB,CAAC;AACxE,eAAO,MAAM,wCAAwC,sBAAsB,CAAC;AAC5E,eAAO,MAAM,wCAAwC,sBAAsB,CAAC;AAC5E,eAAO,MAAM,iCAAiC,eAAe,CAAC;AAC9D,eAAO,MAAM,4BAA4B,UAAU,CAAC;AAYpD,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAOlE,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AAKxD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,0BAA0B,OAAQ,CAAC"}
|
package/dist/sdkConstants.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// The rule for this file: nothing lands here unless the SDK reads it at runtime,
|
|
12
12
|
// and it imports nothing.
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.CUSTOM_CODE_MAX_LOG_LENGTH = exports.CUSTOM_CODE_MAX_LOGS = exports.CUSTOM_CODE_HEALTH_TOOL = exports.CUSTOM_CODE_BINDING_VERSION = exports.CUSTOM_CODE_BROKER_PATH_SEND_FILE = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_LIST = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_READ = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_SEARCH = exports.CUSTOM_CODE_BROKER_PATH_SECRET = exports.CUSTOM_CODE_BROKER_PATH_CONNECTION = exports.CUSTOM_CODE_BROKER_ORIGIN = exports.CUSTOM_CODE_BINDING_BROKER = exports.CUSTOM_CODE_BINDING_TOKEN = void 0;
|
|
14
|
+
exports.CUSTOM_CODE_MAX_LOG_LENGTH = exports.CUSTOM_CODE_MAX_LOGS = exports.CUSTOM_CODE_HEALTH_TOOL = exports.CUSTOM_CODE_BINDING_VERSION = exports.CUSTOM_CODE_BROKER_PATH_DATA = exports.CUSTOM_CODE_BROKER_PATH_SEND_FILE = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_LIST = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_READ = exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_SEARCH = exports.CUSTOM_CODE_BROKER_PATH_SECRET = exports.CUSTOM_CODE_BROKER_PATH_CONNECTION = exports.CUSTOM_CODE_BROKER_ORIGIN = exports.CUSTOM_CODE_BINDING_BROKER = exports.CUSTOM_CODE_BINDING_TOKEN = void 0;
|
|
15
15
|
// Bindings injected into every user script at upload time. The token is a
|
|
16
16
|
// secret_text binding rotated on each publish; the broker is a service binding.
|
|
17
17
|
// Names are part of the SDK's contract with the script, so they can't be
|
|
@@ -30,6 +30,7 @@ exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_LIST = '/resources/list';
|
|
|
30
30
|
exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE = '/resources/create';
|
|
31
31
|
exports.CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE = '/resources/delete';
|
|
32
32
|
exports.CUSTOM_CODE_BROKER_PATH_SEND_FILE = '/send-file';
|
|
33
|
+
exports.CUSTOM_CODE_BROKER_PATH_DATA = '/data';
|
|
33
34
|
// Injected at upload time and echoed back by the health probe below. Uploading a
|
|
34
35
|
// script into the dispatch namespace is not read-your-writes: dispatching to the
|
|
35
36
|
// name immediately afterwards can still reach the previous edition. Tool names
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE,
|
|
23
23
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE,
|
|
24
24
|
CUSTOM_CODE_BROKER_PATH_SEND_FILE,
|
|
25
|
+
CUSTOM_CODE_BROKER_PATH_DATA,
|
|
25
26
|
CUSTOM_CODE_HEALTH_TOOL,
|
|
26
27
|
CUSTOM_CODE_MAX_LOGS,
|
|
27
28
|
CUSTOM_CODE_MAX_LOG_LENGTH
|
|
@@ -1574,7 +1575,10 @@ const RESERVED_TOOL_NAME_PREFIXES = [
|
|
|
1574
1575
|
'slack-',
|
|
1575
1576
|
CALENDAR_TOOL_KEY_PREFIX,
|
|
1576
1577
|
CALCOM_TOOL_KEY_PREFIX,
|
|
1577
|
-
WEB_TOOL_KEY_PREFIX
|
|
1578
|
+
WEB_TOOL_KEY_PREFIX,
|
|
1579
|
+
// data-describe, data-query, data-write and data-admin, registered for a
|
|
1580
|
+
// project with a database.
|
|
1581
|
+
'data-'
|
|
1578
1582
|
];
|
|
1579
1583
|
|
|
1580
1584
|
// The keys that don't belong to a prefixed group: the RAG core the channel
|
|
@@ -1865,6 +1869,11 @@ const MCP_CHANNEL_PLATFORM_HEADER = 'x-ganju-channel-platform';
|
|
|
1865
1869
|
// the chat it ran in.
|
|
1866
1870
|
const MCP_CHANNEL_CONVERSATION_HEADER = 'x-ganju-channel-conversation-id';
|
|
1867
1871
|
const MCP_CHANNEL_CLIENT_USER_AGENT = 'ganju-channel/0.0.1';
|
|
1872
|
+
// The participant a channel turn is for: customer-scoped tables fill and
|
|
1873
|
+
// filter their rows with it. Trusted only on the channel's own auth paths.
|
|
1874
|
+
const MCP_CHANNEL_PARTICIPANT_HEADER = 'x-ganju-channel-participant-id';
|
|
1875
|
+
// The zone the channel resolves dates in; the data tools answer in it.
|
|
1876
|
+
const MCP_CHANNEL_TIME_ZONE_HEADER = 'x-ganju-channel-time-zone';
|
|
1868
1877
|
const JWKS_KV_KEY = 'jwks:v1';
|
|
1869
1878
|
const JWKS_TTL_SECONDS = 600;
|
|
1870
1879
|
|
|
@@ -3087,6 +3096,7 @@ export const constants = {
|
|
|
3087
3096
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE,
|
|
3088
3097
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE,
|
|
3089
3098
|
CUSTOM_CODE_BROKER_PATH_SEND_FILE,
|
|
3099
|
+
CUSTOM_CODE_BROKER_PATH_DATA,
|
|
3090
3100
|
CUSTOM_CODE_OUTBOUND_PARAM_ARTIFACT_ID,
|
|
3091
3101
|
CUSTOM_CODE_OUTBOUND_PARAM_ALLOWED_HOSTS,
|
|
3092
3102
|
CUSTOM_CODE_PLATFORM_HOSTS,
|
|
@@ -3129,6 +3139,8 @@ export const constants = {
|
|
|
3129
3139
|
MCP_CHANNEL_PLATFORM_HEADER,
|
|
3130
3140
|
MCP_CHANNEL_CONVERSATION_HEADER,
|
|
3131
3141
|
MCP_CHANNEL_CLIENT_USER_AGENT,
|
|
3142
|
+
MCP_CHANNEL_PARTICIPANT_HEADER,
|
|
3143
|
+
MCP_CHANNEL_TIME_ZONE_HEADER,
|
|
3132
3144
|
MCP_SESSION_HEADER,
|
|
3133
3145
|
MCP_REQUEST_METHOD_INITIALIZE,
|
|
3134
3146
|
MCP_REQUEST_METHOD_PING,
|
package/src/customCodeToken.ts
CHANGED
|
@@ -178,6 +178,80 @@ export const verifyCustomCodeToken = async (
|
|
|
178
178
|
};
|
|
179
179
|
};
|
|
180
180
|
|
|
181
|
+
// Names the function one dispatch runs.
|
|
182
|
+
//
|
|
183
|
+
// The tool token names the artifact and version but not the function: one
|
|
184
|
+
// script serves every function, and it would otherwise say itself which one
|
|
185
|
+
// is calling. What a function may do with the database (its manifest's
|
|
186
|
+
// `data`) needs a name the script can't choose, so the dispatcher signs one
|
|
187
|
+
// per call and passes it in with the input; the script only hands it back.
|
|
188
|
+
// Signed with a key derived from the same secret, so a call token is never
|
|
189
|
+
// a tool token or the other way round.
|
|
190
|
+
export interface CustomCodeCallPayload {
|
|
191
|
+
v: string;
|
|
192
|
+
artifactId: string;
|
|
193
|
+
versionId: string;
|
|
194
|
+
tool: string;
|
|
195
|
+
exp: number;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const callSecret = (secret: string) => `${secret}:call`;
|
|
199
|
+
|
|
200
|
+
export const mintCustomCodeCallToken = async (
|
|
201
|
+
payload: Omit<CustomCodeCallPayload, 'v' | 'exp'> & { ttlMs: number },
|
|
202
|
+
secret: string,
|
|
203
|
+
issuedAt: number = Date.now()
|
|
204
|
+
): Promise<string> => {
|
|
205
|
+
const body: CustomCodeCallPayload = {
|
|
206
|
+
v: constants.CUSTOM_CODE_TOKEN_VERSION,
|
|
207
|
+
artifactId: payload.artifactId,
|
|
208
|
+
versionId: payload.versionId,
|
|
209
|
+
tool: payload.tool,
|
|
210
|
+
exp: Math.ceil((issuedAt + payload.ttlMs) / 1000)
|
|
211
|
+
};
|
|
212
|
+
const encodedPayload = toBase64Url(
|
|
213
|
+
bytesToBase64(encoder.encode(JSON.stringify(body)))
|
|
214
|
+
);
|
|
215
|
+
const signature = await signPayload(encodedPayload, callSecret(secret));
|
|
216
|
+
return `${encodedPayload}.${signature}`;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
export const verifyCustomCodeCallToken = async (
|
|
220
|
+
token: string,
|
|
221
|
+
secret: string,
|
|
222
|
+
now: number = Date.now()
|
|
223
|
+
): Promise<CustomCodeCallPayload | null> => {
|
|
224
|
+
const separator = token.lastIndexOf('.');
|
|
225
|
+
if (separator <= 0) return null;
|
|
226
|
+
const encodedPayload = token.slice(0, separator);
|
|
227
|
+
try {
|
|
228
|
+
const key = await importKey(callSecret(secret));
|
|
229
|
+
const valid = await crypto.subtle.verify(
|
|
230
|
+
'HMAC',
|
|
231
|
+
key,
|
|
232
|
+
new Uint8Array(base64ToBytes(fromBase64Url(token.slice(separator + 1)))),
|
|
233
|
+
encoder.encode(encodedPayload)
|
|
234
|
+
);
|
|
235
|
+
if (!valid) return null;
|
|
236
|
+
const candidate = JSON.parse(
|
|
237
|
+
new TextDecoder().decode(base64ToBytes(fromBase64Url(encodedPayload)))
|
|
238
|
+
) as Partial<CustomCodeCallPayload>;
|
|
239
|
+
if (
|
|
240
|
+
candidate.v !== constants.CUSTOM_CODE_TOKEN_VERSION ||
|
|
241
|
+
typeof candidate.artifactId !== 'string' ||
|
|
242
|
+
typeof candidate.versionId !== 'string' ||
|
|
243
|
+
typeof candidate.tool !== 'string' ||
|
|
244
|
+
typeof candidate.exp !== 'number' ||
|
|
245
|
+
candidate.exp * 1000 <= now
|
|
246
|
+
) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return candidate as CustomCodeCallPayload;
|
|
250
|
+
} catch {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
|
|
181
255
|
/**
|
|
182
256
|
* The legacy dispatch-namespace script name for an artifact: `artifact_<id>`.
|
|
183
257
|
*
|
package/src/data.ts
CHANGED
|
@@ -64,6 +64,26 @@ export {
|
|
|
64
64
|
exportRows
|
|
65
65
|
} from './dataEngine';
|
|
66
66
|
export type { SqlRow, SqlRunner } from './dataEngine';
|
|
67
|
+
export {
|
|
68
|
+
DATA_QUERY_PARAM_TYPES,
|
|
69
|
+
DATA_MAX_QUERIES,
|
|
70
|
+
DATA_MAX_QUERY_SQL,
|
|
71
|
+
DATA_MAX_QUERY_PARAMS,
|
|
72
|
+
DATA_DEFAULT_QUERY_ROWS,
|
|
73
|
+
compileQuerySql,
|
|
74
|
+
checkQueryPlan,
|
|
75
|
+
listQueries,
|
|
76
|
+
queriesFor,
|
|
77
|
+
saveQuery,
|
|
78
|
+
dropQuery,
|
|
79
|
+
runQuery
|
|
80
|
+
} from './dataQueries';
|
|
81
|
+
export type {
|
|
82
|
+
DataQuery,
|
|
83
|
+
DataQueryInput,
|
|
84
|
+
DataQueryParam,
|
|
85
|
+
DataQueryParamType
|
|
86
|
+
} from './dataQueries';
|
|
67
87
|
export type {
|
|
68
88
|
ProjectDatabaseRpc,
|
|
69
89
|
DatabaseInfo,
|
|
@@ -72,3 +92,17 @@ export type {
|
|
|
72
92
|
ExportState,
|
|
73
93
|
RestoreResult
|
|
74
94
|
} from './dataRpc';
|
|
95
|
+
export {
|
|
96
|
+
DATA_TOOL_DESCRIBE,
|
|
97
|
+
DATA_TOOL_QUERY,
|
|
98
|
+
DATA_TOOL_WRITE,
|
|
99
|
+
DATA_TOOL_ADMIN,
|
|
100
|
+
DATA_TOOL_NAMES,
|
|
101
|
+
DATA_TOOL_TITLES,
|
|
102
|
+
DATA_TOOL_MAX_LIMIT,
|
|
103
|
+
DATA_ADMIN_ACTIONS,
|
|
104
|
+
hasDataToolTables,
|
|
105
|
+
dataToolDefinitions,
|
|
106
|
+
dataAdminToolDefinition
|
|
107
|
+
} from './dataTools';
|
|
108
|
+
export type { DataToolDefinition, DataAdminAction } from './dataTools';
|
package/src/dataApi.ts
CHANGED
|
@@ -16,7 +16,7 @@ export interface DataApiRoute {
|
|
|
16
16
|
path: string;
|
|
17
17
|
summary: string;
|
|
18
18
|
description?: string;
|
|
19
|
-
tag: 'Database' | 'Tables' | 'Rows' | 'History and export';
|
|
19
|
+
tag: 'Database' | 'Tables' | 'Rows' | 'Queries' | 'History and export';
|
|
20
20
|
body?: z.ZodType;
|
|
21
21
|
query?: z.ZodObject;
|
|
22
22
|
// What a 200/201 answers with, in a sentence.
|
|
@@ -29,6 +29,7 @@ export interface DataApiRoute {
|
|
|
29
29
|
const {
|
|
30
30
|
DATA_DATABASE_CREATE,
|
|
31
31
|
DATA_DATABASE_DELETE,
|
|
32
|
+
DATA_DATABASE_PATCH,
|
|
32
33
|
DATA_TABLE_INPUT,
|
|
33
34
|
DATA_TABLE_PATCH,
|
|
34
35
|
DATA_COLUMN_INPUT,
|
|
@@ -46,7 +47,9 @@ const {
|
|
|
46
47
|
DATA_EXPORT_BODY,
|
|
47
48
|
DATA_EXPORT_QUERY,
|
|
48
49
|
DATA_EXPORT_FILE_QUERY,
|
|
49
|
-
DATA_CHANGE_LIST_QUERY
|
|
50
|
+
DATA_CHANGE_LIST_QUERY,
|
|
51
|
+
DATA_QUERY_INPUT,
|
|
52
|
+
DATA_QUERY_RUN_BODY
|
|
50
53
|
} = Schema;
|
|
51
54
|
|
|
52
55
|
export const DATA_API_ROUTES = {
|
|
@@ -70,6 +73,16 @@ export const DATA_API_ROUTES = {
|
|
|
70
73
|
returns: '{ database }',
|
|
71
74
|
status: 201
|
|
72
75
|
},
|
|
76
|
+
updateDatabase: {
|
|
77
|
+
method: 'patch',
|
|
78
|
+
path: '',
|
|
79
|
+
tag: 'Database',
|
|
80
|
+
summary: "Change the database's settings",
|
|
81
|
+
description:
|
|
82
|
+
'`timeZone`, an IANA zone such as `America/Bogota`, or null for UTC. Datetimes come back in it for callers that send no `timeZone` of their own: the assistant, functions and scripts. Datetimes without an offset are read in it too.',
|
|
83
|
+
body: DATA_DATABASE_PATCH,
|
|
84
|
+
returns: '{ database }'
|
|
85
|
+
},
|
|
73
86
|
remove: {
|
|
74
87
|
method: 'delete',
|
|
75
88
|
path: '',
|
|
@@ -253,6 +266,43 @@ export const DATA_API_ROUTES = {
|
|
|
253
266
|
body: DATA_WRITE_BODY,
|
|
254
267
|
returns: '{ results }'
|
|
255
268
|
},
|
|
269
|
+
listQueries: {
|
|
270
|
+
method: 'get',
|
|
271
|
+
path: '/query',
|
|
272
|
+
tag: 'Queries',
|
|
273
|
+
summary: 'Named queries',
|
|
274
|
+
description:
|
|
275
|
+
'Each with its SQL, parameters, the tables it reads and its plan (`SCAN orders` means it reads the whole table).',
|
|
276
|
+
returns: '{ queries }'
|
|
277
|
+
},
|
|
278
|
+
saveQuery: {
|
|
279
|
+
method: 'post',
|
|
280
|
+
path: '/query',
|
|
281
|
+
tag: 'Queries',
|
|
282
|
+
summary: 'Save a named query',
|
|
283
|
+
description:
|
|
284
|
+
"One `SELECT` (or `WITH … SELECT`) with named parameters such as `:from`, each declared in `params` with its type. It is compiled, never run, and refused unless it only reads this database's tables. Saving under an existing name replaces it. `assistant: true` lets channel bots run it from data-query.",
|
|
285
|
+
body: DATA_QUERY_INPUT,
|
|
286
|
+
returns: '{ query }',
|
|
287
|
+
status: 201
|
|
288
|
+
},
|
|
289
|
+
dropQuery: {
|
|
290
|
+
method: 'delete',
|
|
291
|
+
path: '/query/:name',
|
|
292
|
+
tag: 'Queries',
|
|
293
|
+
summary: 'Delete a named query',
|
|
294
|
+
returns: '{ dropped }'
|
|
295
|
+
},
|
|
296
|
+
runQuery: {
|
|
297
|
+
method: 'post',
|
|
298
|
+
path: '/query/:name/run',
|
|
299
|
+
tag: 'Queries',
|
|
300
|
+
summary: 'Run a named query',
|
|
301
|
+
description:
|
|
302
|
+
'With its `params`, up to `limit` rows (100 by default, 500 at most) and 1 MB; `truncated` says it stopped early. A query that would scan a table over 200,000 rows is refused.',
|
|
303
|
+
body: DATA_QUERY_RUN_BODY,
|
|
304
|
+
returns: '{ query, rows, truncated? }'
|
|
305
|
+
},
|
|
256
306
|
startExport: {
|
|
257
307
|
method: 'post',
|
|
258
308
|
path: '/export',
|
|
@@ -397,6 +447,7 @@ export const dataOpenApi = (serverUrl: string) => {
|
|
|
397
447
|
{ name: 'Database' },
|
|
398
448
|
{ name: 'Tables' },
|
|
399
449
|
{ name: 'Rows' },
|
|
450
|
+
{ name: 'Queries' },
|
|
400
451
|
{ name: 'History and export' }
|
|
401
452
|
],
|
|
402
453
|
paths,
|
package/src/dataCompiler.ts
CHANGED
|
@@ -83,7 +83,11 @@ export const unknownColumn = (table: DataTable, name: string) =>
|
|
|
83
83
|
// Access
|
|
84
84
|
|
|
85
85
|
export const accessOf = (caller: DataCaller, table: DataTable): DataAccess =>
|
|
86
|
-
caller.
|
|
86
|
+
caller.tables && !caller.tables.includes(table.name)
|
|
87
|
+
? 'none'
|
|
88
|
+
: caller.restricted
|
|
89
|
+
? table.access
|
|
90
|
+
: 'full';
|
|
87
91
|
|
|
88
92
|
export const visibleTables = (schema: DataSchema, caller: DataCaller) =>
|
|
89
93
|
schema.tables.filter(table => DATA_ACCESS_RANK[accessOf(caller, table)] >= 1);
|