@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.
Files changed (57) hide show
  1. package/dist/constants.d.ts +3 -0
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +12 -1
  4. package/dist/customCodeToken.d.ts +11 -0
  5. package/dist/customCodeToken.d.ts.map +1 -1
  6. package/dist/customCodeToken.js +41 -1
  7. package/dist/data.d.ts +4 -0
  8. package/dist/data.d.ts.map +1 -1
  9. package/dist/data.js +26 -1
  10. package/dist/dataApi.d.ts +68 -1
  11. package/dist/dataApi.d.ts.map +1 -1
  12. package/dist/dataApi.js +45 -1
  13. package/dist/dataCompiler.d.ts.map +1 -1
  14. package/dist/dataCompiler.js +5 -1
  15. package/dist/dataCsv.d.ts +20 -0
  16. package/dist/dataCsv.d.ts.map +1 -0
  17. package/dist/dataCsv.js +102 -0
  18. package/dist/dataEngine.d.ts.map +1 -1
  19. package/dist/dataEngine.js +24 -4
  20. package/dist/dataImport.d.ts +2 -0
  21. package/dist/dataImport.d.ts.map +1 -1
  22. package/dist/dataImport.js +4 -1
  23. package/dist/dataQueries.d.ts +73 -0
  24. package/dist/dataQueries.d.ts.map +1 -0
  25. package/dist/dataQueries.js +513 -0
  26. package/dist/dataRpc.d.ts +19 -0
  27. package/dist/dataRpc.d.ts.map +1 -1
  28. package/dist/dataTools.d.ts +40 -0
  29. package/dist/dataTools.d.ts.map +1 -0
  30. package/dist/dataTools.js +280 -0
  31. package/dist/dataTypes.d.ts +2 -0
  32. package/dist/dataTypes.d.ts.map +1 -1
  33. package/dist/index.d.ts +86 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -0
  36. package/dist/schema.d.ts +91 -0
  37. package/dist/schema.d.ts.map +1 -1
  38. package/dist/schema.js +65 -1
  39. package/dist/sdkConstants.d.ts +1 -0
  40. package/dist/sdkConstants.d.ts.map +1 -1
  41. package/dist/sdkConstants.js +2 -1
  42. package/package.json +1 -1
  43. package/src/constants.ts +13 -1
  44. package/src/customCodeToken.ts +74 -0
  45. package/src/data.ts +34 -0
  46. package/src/dataApi.ts +53 -2
  47. package/src/dataCompiler.ts +5 -1
  48. package/src/dataCsv.ts +99 -0
  49. package/src/dataEngine.ts +24 -4
  50. package/src/dataImport.ts +3 -0
  51. package/src/dataQueries.ts +730 -0
  52. package/src/dataRpc.ts +11 -0
  53. package/src/dataTools.ts +338 -0
  54. package/src/dataTypes.ts +6 -0
  55. package/src/index.ts +9 -1
  56. package/src/schema.ts +69 -1
  57. 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>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0hCxB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcpB,CAAC;AAYH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCxB,CAAC;AA2OH,QAAA,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DpC,CAAC;AA4BL,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAkDzB,CAAC;AAuHH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4IlB,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"}
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,
@@ -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;AAY9D,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAOlE,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AAKxD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,0BAA0B,OAAQ,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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ganju/utils",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
4
4
  "description": "Shared constants, schemas and helpers for Ganju",
5
5
  "license": "Apache-2.0",
6
6
  "author": "MontoyaAndres <andresmontoyafcb@gmail.com>",
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,
@@ -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,
@@ -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.restricted ? table.access : 'full';
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);