@ganju/utils 0.0.16 → 0.0.18

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 (68) hide show
  1. package/dist/constants.d.ts +9 -0
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +26 -2
  4. package/dist/customCodeToken.d.ts +15 -0
  5. package/dist/customCodeToken.d.ts.map +1 -1
  6. package/dist/customCodeToken.js +49 -1
  7. package/dist/data.d.ts +6 -0
  8. package/dist/data.d.ts.map +1 -1
  9. package/dist/data.js +53 -1
  10. package/dist/dataApi.d.ts +200 -1
  11. package/dist/dataApi.d.ts.map +1 -1
  12. package/dist/dataApi.js +106 -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/dataDdl.d.ts.map +1 -1
  19. package/dist/dataDdl.js +3 -1
  20. package/dist/dataEngine.d.ts.map +1 -1
  21. package/dist/dataEngine.js +86 -4
  22. package/dist/dataImport.d.ts +2 -0
  23. package/dist/dataImport.d.ts.map +1 -1
  24. package/dist/dataImport.js +4 -1
  25. package/dist/dataQueries.d.ts +73 -0
  26. package/dist/dataQueries.d.ts.map +1 -0
  27. package/dist/dataQueries.js +513 -0
  28. package/dist/dataRpc.d.ts +44 -0
  29. package/dist/dataRpc.d.ts.map +1 -1
  30. package/dist/dataTools.d.ts +40 -0
  31. package/dist/dataTools.d.ts.map +1 -0
  32. package/dist/dataTools.js +280 -0
  33. package/dist/dataTriggers.d.ts +203 -0
  34. package/dist/dataTriggers.d.ts.map +1 -0
  35. package/dist/dataTriggers.js +760 -0
  36. package/dist/dataTypes.d.ts +3 -0
  37. package/dist/dataTypes.d.ts.map +1 -1
  38. package/dist/index.d.ts +201 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -0
  41. package/dist/localizeDataError.d.ts +18 -0
  42. package/dist/localizeDataError.d.ts.map +1 -0
  43. package/dist/localizeDataError.js +359 -0
  44. package/dist/schema.d.ts +201 -0
  45. package/dist/schema.d.ts.map +1 -1
  46. package/dist/schema.js +149 -1
  47. package/dist/sdkConstants.d.ts +3 -0
  48. package/dist/sdkConstants.d.ts.map +1 -1
  49. package/dist/sdkConstants.js +4 -1
  50. package/package.json +1 -1
  51. package/src/constants.ts +30 -2
  52. package/src/customCodeToken.ts +87 -0
  53. package/src/data.ts +74 -0
  54. package/src/dataApi.ts +129 -2
  55. package/src/dataCompiler.ts +5 -1
  56. package/src/dataCsv.ts +99 -0
  57. package/src/dataDdl.ts +3 -1
  58. package/src/dataEngine.ts +94 -4
  59. package/src/dataImport.ts +3 -0
  60. package/src/dataQueries.ts +730 -0
  61. package/src/dataRpc.ts +26 -0
  62. package/src/dataTools.ts +338 -0
  63. package/src/dataTriggers.ts +1134 -0
  64. package/src/dataTypes.ts +9 -0
  65. package/src/index.ts +11 -1
  66. package/src/localizeDataError.ts +593 -0
  67. package/src/schema.ts +158 -1
  68. package/src/sdkConstants.ts +3 -0
@@ -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;AAmoCxB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BpB,CAAC;AAYH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCxB,CAAC;AAoQH,QAAA,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DpC,CAAC;AA4BL,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAkDzB,CAAC;AAuHH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0JlB,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,92 @@ 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
+ });
641
+ // A trigger, as the dashboard, the API and ganju.json's "triggers" write it:
642
+ // a table, an event, an optional condition and exactly one action. The
643
+ // object checks the rest (columns, fields used in texts) against the schema.
644
+ const DATA_TRIGGER_NAME = zod_1.z
645
+ .string()
646
+ .regex(/^[a-z][a-z0-9_-]{0,62}$/, 'Lowercase letters, digits, _ and -, starting with a letter');
647
+ const DATA_TRIGGER_TEMPLATE = zod_1.z.strictObject({
648
+ name: zod_1.z.string().min(1).max(512),
649
+ language: zod_1.z.string().min(1).max(20),
650
+ // Each {{n}} of the template in order: fixed text or a {{field}} of the row.
651
+ params: zod_1.z.array(zod_1.z.string().max(1024)).max(20).optional()
652
+ });
653
+ const DATA_TRIGGER_INPUT = zod_1.z.strictObject({
654
+ name: DATA_TRIGGER_NAME.optional(),
655
+ description: zod_1.z.string().max(300).nullish(),
656
+ table: DATA_IDENTIFIER,
657
+ on: zod_1.z.enum(['insert', 'update', 'delete']),
658
+ // { column: { changedTo | changedFrom | equals: value, changed: true } },
659
+ // combined with { all: [...] } or { any: [...] }.
660
+ when: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).nullish(),
661
+ enabled: zod_1.z.boolean().optional(),
662
+ // false: refuse to save over an existing trigger of this name.
663
+ replace: zod_1.z.boolean().optional(),
664
+ // Runs a minute; past it events wait in the queue. 60 by default.
665
+ rateLimit: zod_1.z.number().int().min(1).max(600).optional(),
666
+ function: zod_1.z.string().min(1).max(64).optional(),
667
+ webhook: zod_1.z.url().max(2000).optional(),
668
+ chat: zod_1.z
669
+ .strictObject({
670
+ channelId: zod_1.z.string().min(1).max(100),
671
+ chatId: zod_1.z.union([zod_1.z.string().min(1).max(200), zod_1.z.number().int()]),
672
+ text: zod_1.z.string().min(1).max(2000)
673
+ })
674
+ .optional(),
675
+ email: zod_1.z
676
+ .strictObject({
677
+ to: zod_1.z.union([zod_1.z.email(), zod_1.z.array(zod_1.z.email()).min(1).max(10)]),
678
+ subject: zod_1.z.string().min(1).max(200).optional(),
679
+ text: zod_1.z.string().min(1).max(2000)
680
+ })
681
+ .optional(),
682
+ customer: zod_1.z
683
+ .strictObject({
684
+ text: zod_1.z.string().min(1).max(2000),
685
+ template: DATA_TRIGGER_TEMPLATE.optional()
686
+ })
687
+ .optional()
688
+ });
689
+ const DATA_TRIGGER_PATCH = zod_1.z.strictObject({ enabled: zod_1.z.boolean() });
690
+ const DATA_TRIGGER_DEPLOY_BODY = zod_1.z.strictObject({
691
+ triggers: zod_1.z.array(DATA_TRIGGER_INPUT).max(50)
692
+ });
693
+ const DATA_TRIGGER_RUN_LIST_QUERY = zod_1.z.object({
694
+ limit: zod_1.z.coerce.number().int().min(1).max(50).optional()
695
+ });
603
696
  const DATA_TABLE_PARAMS = DATA_DATABASE_GET.extend({ table: DATA_IDENTIFIER });
604
697
  const DATA_COLUMN_PARAMS = DATA_TABLE_PARAMS.extend({
605
698
  column: DATA_IDENTIFIER
606
699
  });
607
700
  const DATA_ROW_PARAMS = DATA_TABLE_PARAMS.extend({ id: DATA_ROW_ID });
701
+ const DATA_QUERY_PATH_PARAMS = DATA_DATABASE_GET.extend({ name: DATA_IDENTIFIER });
702
+ const DATA_TRIGGER_PATH_PARAMS = DATA_DATABASE_GET.extend({ name: DATA_TRIGGER_NAME });
703
+ const DATA_TRIGGER_RUN_PARAMS = DATA_TRIGGER_PATH_PARAMS.extend({
704
+ runId: zod_1.z.string().min(1).max(64)
705
+ });
608
706
  const ARTIFACT_UPLOAD_RESOURCE_FILE = zod_1.z.object({
609
707
  resourceId: zod_1.z.uuid(),
610
708
  projectId: zod_1.z.uuid(),
@@ -1153,7 +1251,20 @@ const CUSTOM_CODE_TOOL = zod_1.z.object({
1153
1251
  description: zod_1.z.string().max(2000).optional(),
1154
1252
  inputSchema: SCHEMA_DEFINITION.default({ type: 'object', properties: {} }),
1155
1253
  outputSchema: SCHEMA_DEFINITION.optional(),
1156
- annotations: TOOL_ANNOTATIONS.optional()
1254
+ annotations: TOOL_ANNOTATIONS.optional(),
1255
+ // What this function may do through ctx.data. Absent means everything: it
1256
+ // is the owner's code. Narrowing matters most for a function a channel bot
1257
+ // calls after reading customer text, and the broker enforces it, since
1258
+ // anything in the script can be edited.
1259
+ // false: deployed and run by triggers, but never offered to the assistant
1260
+ // (left out of tools/list, and not counted toward its tools).
1261
+ expose: zod_1.z.boolean().optional(),
1262
+ data: zod_1.z
1263
+ .strictObject({
1264
+ access: zod_1.z.enum(['read', 'write']).optional(),
1265
+ tables: zod_1.z.array(zod_1.z.string().min(1).max(63)).max(50).optional()
1266
+ })
1267
+ .optional()
1157
1268
  });
1158
1269
  // The manifest a `ganju deploy` (or the dashboard) uploads alongside a bundle.
1159
1270
  // Names must be unique within one script: apps/mcp registers them into a single
@@ -1379,6 +1490,29 @@ const CUSTOM_CODE_BROKER_SECRET = zod_1.z.object({
1379
1490
  // (they carry no id inside the script). See CREDENTIAL_PROVIDER_CUSTOM_CODE.
1380
1491
  name: zod_1.z.string().min(1).max(200)
1381
1492
  });
1493
+ // One ctx.data call. `call` is the token the dispatcher signed for the
1494
+ // function being run, which the script hands back: the broker reads the
1495
+ // function's name from it, never from the script, and applies that
1496
+ // function's `data` narrowing.
1497
+ const CUSTOM_CODE_BROKER_DATA = zod_1.z.object({
1498
+ call: zod_1.z.string().min(1).max(4000),
1499
+ op: zod_1.z.enum(['describe', 'query', 'write', 'run']),
1500
+ args: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).default({})
1501
+ });
1502
+ // ctx.channels: a message to a customer the bot has spoken with, or a post
1503
+ // to a chat the bot is in. `call` names the function, as for ctx.data.
1504
+ const CUSTOM_CODE_BROKER_CHANNELS_SEND = zod_1.z.object({
1505
+ call: zod_1.z.string().min(1).max(4000),
1506
+ participantId: zod_1.z.string().min(1).max(100),
1507
+ text: zod_1.z.string().min(1).max(4000).optional(),
1508
+ template: DATA_TRIGGER_TEMPLATE.optional()
1509
+ });
1510
+ const CUSTOM_CODE_BROKER_CHANNELS_POST = zod_1.z.object({
1511
+ call: zod_1.z.string().min(1).max(4000),
1512
+ channelId: zod_1.z.string().min(1).max(100),
1513
+ chatId: zod_1.z.union([zod_1.z.string().min(1).max(200), zod_1.z.number().int()]),
1514
+ text: zod_1.z.string().min(1).max(4000)
1515
+ });
1382
1516
  const CUSTOM_CODE_BROKER_RESOURCE_SEARCH = zod_1.z.object({
1383
1517
  query: zod_1.z.string().min(1).max(2000),
1384
1518
  limit: zod_1.z.number().int().positive().max(20).default(5)
@@ -1706,6 +1840,17 @@ exports.Schema = {
1706
1840
  DATA_EXPORT_FILE_QUERY,
1707
1841
  DATA_CHANGE_LIST_QUERY,
1708
1842
  DATA_TABLE_PARAMS,
1843
+ DATA_DATABASE_PATCH,
1844
+ DATA_QUERY_PARAM,
1845
+ DATA_QUERY_INPUT,
1846
+ DATA_QUERY_RUN_BODY,
1847
+ DATA_QUERY_PATH_PARAMS,
1848
+ DATA_TRIGGER_INPUT,
1849
+ DATA_TRIGGER_PATCH,
1850
+ DATA_TRIGGER_DEPLOY_BODY,
1851
+ DATA_TRIGGER_RUN_LIST_QUERY,
1852
+ DATA_TRIGGER_PATH_PARAMS,
1853
+ DATA_TRIGGER_RUN_PARAMS,
1709
1854
  DATA_COLUMN_PARAMS,
1710
1855
  DATA_ROW_PARAMS,
1711
1856
  ARTIFACT_REMOVE_RESOURCE,
@@ -1769,6 +1914,9 @@ exports.Schema = {
1769
1914
  CUSTOM_CODE_INVOKE_RESPONSE,
1770
1915
  CUSTOM_CODE_BROKER_CONNECTION,
1771
1916
  CUSTOM_CODE_BROKER_SECRET,
1917
+ CUSTOM_CODE_BROKER_DATA,
1918
+ CUSTOM_CODE_BROKER_CHANNELS_SEND,
1919
+ CUSTOM_CODE_BROKER_CHANNELS_POST,
1772
1920
  CUSTOM_CODE_BROKER_RESOURCE_SEARCH,
1773
1921
  CUSTOM_CODE_BROKER_RESOURCE_READ,
1774
1922
  CUSTOM_CODE_BROKER_RESOURCE_CREATE,
@@ -9,6 +9,9 @@ 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";
13
+ export declare const CUSTOM_CODE_BROKER_PATH_CHANNELS_SEND = "/channels/send";
14
+ export declare const CUSTOM_CODE_BROKER_PATH_CHANNELS_POST = "/channels/post";
12
15
  export declare const CUSTOM_CODE_BINDING_VERSION = "GANJU_SCRIPT_VERSION";
13
16
  export declare const CUSTOM_CODE_HEALTH_TOOL = "__ganju_health";
14
17
  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;AACpD,eAAO,MAAM,qCAAqC,mBAAmB,CAAC;AACtE,eAAO,MAAM,qCAAqC,mBAAmB,CAAC;AAYtE,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_CHANNELS_POST = exports.CUSTOM_CODE_BROKER_PATH_CHANNELS_SEND = 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,9 @@ 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';
34
+ exports.CUSTOM_CODE_BROKER_PATH_CHANNELS_SEND = '/channels/send';
35
+ exports.CUSTOM_CODE_BROKER_PATH_CHANNELS_POST = '/channels/post';
33
36
  // Injected at upload time and echoed back by the health probe below. Uploading a
34
37
  // script into the dispatch namespace is not read-your-writes: dispatching to the
35
38
  // 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.18",
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,9 @@ 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,
26
+ CUSTOM_CODE_BROKER_PATH_CHANNELS_SEND,
27
+ CUSTOM_CODE_BROKER_PATH_CHANNELS_POST,
25
28
  CUSTOM_CODE_HEALTH_TOOL,
26
29
  CUSTOM_CODE_MAX_LOGS,
27
30
  CUSTOM_CODE_MAX_LOG_LENGTH
@@ -1574,7 +1577,10 @@ const RESERVED_TOOL_NAME_PREFIXES = [
1574
1577
  'slack-',
1575
1578
  CALENDAR_TOOL_KEY_PREFIX,
1576
1579
  CALCOM_TOOL_KEY_PREFIX,
1577
- WEB_TOOL_KEY_PREFIX
1580
+ WEB_TOOL_KEY_PREFIX,
1581
+ // data-describe, data-query, data-write and data-admin, registered for a
1582
+ // project with a database.
1583
+ 'data-'
1578
1584
  ];
1579
1585
 
1580
1586
  // The keys that don't belong to a prefixed group: the RAG core the channel
@@ -1865,6 +1871,11 @@ const MCP_CHANNEL_PLATFORM_HEADER = 'x-ganju-channel-platform';
1865
1871
  // the chat it ran in.
1866
1872
  const MCP_CHANNEL_CONVERSATION_HEADER = 'x-ganju-channel-conversation-id';
1867
1873
  const MCP_CHANNEL_CLIENT_USER_AGENT = 'ganju-channel/0.0.1';
1874
+ // The participant a channel turn is for: customer-scoped tables fill and
1875
+ // filter their rows with it. Trusted only on the channel's own auth paths.
1876
+ const MCP_CHANNEL_PARTICIPANT_HEADER = 'x-ganju-channel-participant-id';
1877
+ // The zone the channel resolves dates in; the data tools answer in it.
1878
+ const MCP_CHANNEL_TIME_ZONE_HEADER = 'x-ganju-channel-time-zone';
1868
1879
  const JWKS_KV_KEY = 'jwks:v1';
1869
1880
  const JWKS_TTL_SECONDS = 600;
1870
1881
 
@@ -2413,9 +2424,17 @@ const BILLING_METER_EMBEDDED = 'ganju_embedded_storage';
2413
2424
  // of ours quotes.
2414
2425
  const BILLING_METER_TOOL_CALLS = 'ganju_custom_tool_calls';
2415
2426
 
2427
+ // Project data, reported in full (not past an allowance) and attached at $0:
2428
+ // measured before they are priced. Storage is the period's peak in whole MB,
2429
+ // rows and trigger runs are counts.
2430
+ const BILLING_METER_DATA_STORAGE = 'ganju_data_storage';
2431
+ const BILLING_METER_DATA_ROWS_WRITTEN = 'ganju_data_rows_written';
2432
+ const BILLING_METER_DATA_ROWS_READ = 'ganju_data_rows_read';
2433
+ const BILLING_METER_DATA_TRIGGER_RUNS = 'ganju_data_trigger_runs';
2434
+
2416
2435
  // The metadata property every meter aggregates (`sum` over it). Ingested events
2417
2436
  // carry the increment under this key, so it has to agree with the aggregation
2418
- // configured on all four meters — which is why it lives beside their names
2437
+ // configured on every meter — which is why it lives beside their names
2419
2438
  // rather than at the call site.
2420
2439
  const BILLING_METER_UNITS_KEY = 'units';
2421
2440
 
@@ -2590,6 +2609,10 @@ export const constants = {
2590
2609
  BILLING_METER_SHARED_MESSAGES,
2591
2610
  BILLING_METER_EMBEDDED,
2592
2611
  BILLING_METER_TOOL_CALLS,
2612
+ BILLING_METER_DATA_STORAGE,
2613
+ BILLING_METER_DATA_ROWS_WRITTEN,
2614
+ BILLING_METER_DATA_ROWS_READ,
2615
+ BILLING_METER_DATA_TRIGGER_RUNS,
2593
2616
  BILLING_METER_UNITS_KEY,
2594
2617
  POLAR_API_BASE,
2595
2618
  POLAR_SANDBOX_API_BASE,
@@ -3087,6 +3110,9 @@ export const constants = {
3087
3110
  CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE,
3088
3111
  CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE,
3089
3112
  CUSTOM_CODE_BROKER_PATH_SEND_FILE,
3113
+ CUSTOM_CODE_BROKER_PATH_DATA,
3114
+ CUSTOM_CODE_BROKER_PATH_CHANNELS_SEND,
3115
+ CUSTOM_CODE_BROKER_PATH_CHANNELS_POST,
3090
3116
  CUSTOM_CODE_OUTBOUND_PARAM_ARTIFACT_ID,
3091
3117
  CUSTOM_CODE_OUTBOUND_PARAM_ALLOWED_HOSTS,
3092
3118
  CUSTOM_CODE_PLATFORM_HOSTS,
@@ -3129,6 +3155,8 @@ export const constants = {
3129
3155
  MCP_CHANNEL_PLATFORM_HEADER,
3130
3156
  MCP_CHANNEL_CONVERSATION_HEADER,
3131
3157
  MCP_CHANNEL_CLIENT_USER_AGENT,
3158
+ MCP_CHANNEL_PARTICIPANT_HEADER,
3159
+ MCP_CHANNEL_TIME_ZONE_HEADER,
3132
3160
  MCP_SESSION_HEADER,
3133
3161
  MCP_REQUEST_METHOD_INITIALIZE,
3134
3162
  MCP_REQUEST_METHOD_PING,
@@ -178,6 +178,93 @@ 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
+ // A run a database trigger started: its writes are the trigger's, never
197
+ // matched by that same trigger, and fire others one level deeper.
198
+ trigger?: { id: string; depth: number };
199
+ }
200
+
201
+ const callSecret = (secret: string) => `${secret}:call`;
202
+
203
+ export const mintCustomCodeCallToken = async (
204
+ payload: Omit<CustomCodeCallPayload, 'v' | 'exp'> & { ttlMs: number },
205
+ secret: string,
206
+ issuedAt: number = Date.now()
207
+ ): Promise<string> => {
208
+ const body: CustomCodeCallPayload = {
209
+ v: constants.CUSTOM_CODE_TOKEN_VERSION,
210
+ artifactId: payload.artifactId,
211
+ versionId: payload.versionId,
212
+ tool: payload.tool,
213
+ exp: Math.ceil((issuedAt + payload.ttlMs) / 1000),
214
+ ...(payload.trigger ? { trigger: payload.trigger } : {})
215
+ };
216
+ const encodedPayload = toBase64Url(
217
+ bytesToBase64(encoder.encode(JSON.stringify(body)))
218
+ );
219
+ const signature = await signPayload(encodedPayload, callSecret(secret));
220
+ return `${encodedPayload}.${signature}`;
221
+ };
222
+
223
+ export const verifyCustomCodeCallToken = async (
224
+ token: string,
225
+ secret: string,
226
+ now: number = Date.now()
227
+ ): Promise<CustomCodeCallPayload | null> => {
228
+ const separator = token.lastIndexOf('.');
229
+ if (separator <= 0) return null;
230
+ const encodedPayload = token.slice(0, separator);
231
+ try {
232
+ const key = await importKey(callSecret(secret));
233
+ const valid = await crypto.subtle.verify(
234
+ 'HMAC',
235
+ key,
236
+ new Uint8Array(base64ToBytes(fromBase64Url(token.slice(separator + 1)))),
237
+ encoder.encode(encodedPayload)
238
+ );
239
+ if (!valid) return null;
240
+ const candidate = JSON.parse(
241
+ new TextDecoder().decode(base64ToBytes(fromBase64Url(encodedPayload)))
242
+ ) as Partial<CustomCodeCallPayload>;
243
+ if (
244
+ candidate.v !== constants.CUSTOM_CODE_TOKEN_VERSION ||
245
+ typeof candidate.artifactId !== 'string' ||
246
+ typeof candidate.versionId !== 'string' ||
247
+ typeof candidate.tool !== 'string' ||
248
+ typeof candidate.exp !== 'number' ||
249
+ candidate.exp * 1000 <= now
250
+ ) {
251
+ return null;
252
+ }
253
+ const trigger = candidate.trigger;
254
+ if (
255
+ trigger !== undefined &&
256
+ (typeof trigger?.id !== 'string' ||
257
+ !Number.isInteger(trigger.depth) ||
258
+ trigger.depth < 1)
259
+ ) {
260
+ return null;
261
+ }
262
+ return candidate as CustomCodeCallPayload;
263
+ } catch {
264
+ return null;
265
+ }
266
+ };
267
+
181
268
  /**
182
269
  * The legacy dispatch-namespace script name for an artifact: `artifact_<id>`.
183
270
  *
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,57 @@ 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';
109
+ export {
110
+ DATA_TRIGGER_EVENTS,
111
+ DATA_TRIGGER_ACTIONS,
112
+ DATA_MAX_TRIGGERS,
113
+ DATA_TRIGGER_MAX_DEPTH,
114
+ DATA_TRIGGER_DEFAULT_RATE,
115
+ DATA_TRIGGER_MAX_RATE,
116
+ DATA_OUTBOX_BATCH,
117
+ DATA_TRIGGER_MAX_MESSAGE_BYTES,
118
+ utf8Bytes,
119
+ conditionMatches,
120
+ renderTriggerText,
121
+ normaliseTrigger,
122
+ listTriggers,
123
+ getTrigger,
124
+ saveTrigger,
125
+ dropTrigger,
126
+ setTriggerEnabled,
127
+ replaceManagedTriggers,
128
+ collectTriggerEvents,
129
+ readOutbox,
130
+ deleteOutbox,
131
+ outboxSize,
132
+ clearOutbox,
133
+ triggersUsingColumn,
134
+ renameColumnInTriggers
135
+ } from './dataTriggers';
136
+ export type {
137
+ DataTrigger,
138
+ DataTriggerAction,
139
+ DataTriggerActionType,
140
+ DataTriggerCondition,
141
+ DataTriggerEvent,
142
+ DataTriggerEventMessage,
143
+ DataTriggerInput,
144
+ DataTriggerTemplate,
145
+ DataTriggerTest,
146
+ DataTriggerWithSecret,
147
+ SavedTrigger
148
+ } from './dataTriggers';