@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.
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +26 -2
- package/dist/customCodeToken.d.ts +15 -0
- package/dist/customCodeToken.d.ts.map +1 -1
- package/dist/customCodeToken.js +49 -1
- package/dist/data.d.ts +6 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +53 -1
- package/dist/dataApi.d.ts +200 -1
- package/dist/dataApi.d.ts.map +1 -1
- package/dist/dataApi.js +106 -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/dataDdl.d.ts.map +1 -1
- package/dist/dataDdl.js +3 -1
- package/dist/dataEngine.d.ts.map +1 -1
- package/dist/dataEngine.js +86 -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 +44 -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/dataTriggers.d.ts +203 -0
- package/dist/dataTriggers.d.ts.map +1 -0
- package/dist/dataTriggers.js +760 -0
- package/dist/dataTypes.d.ts +3 -0
- package/dist/dataTypes.d.ts.map +1 -1
- package/dist/index.d.ts +201 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/localizeDataError.d.ts +18 -0
- package/dist/localizeDataError.d.ts.map +1 -0
- package/dist/localizeDataError.js +359 -0
- package/dist/schema.d.ts +201 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +149 -1
- package/dist/sdkConstants.d.ts +3 -0
- package/dist/sdkConstants.d.ts.map +1 -1
- package/dist/sdkConstants.js +4 -1
- package/package.json +1 -1
- package/src/constants.ts +30 -2
- package/src/customCodeToken.ts +87 -0
- package/src/data.ts +74 -0
- package/src/dataApi.ts +129 -2
- package/src/dataCompiler.ts +5 -1
- package/src/dataCsv.ts +99 -0
- package/src/dataDdl.ts +3 -1
- package/src/dataEngine.ts +94 -4
- package/src/dataImport.ts +3 -0
- package/src/dataQueries.ts +730 -0
- package/src/dataRpc.ts +26 -0
- package/src/dataTools.ts +338 -0
- package/src/dataTriggers.ts +1134 -0
- package/src/dataTypes.ts +9 -0
- package/src/index.ts +11 -1
- package/src/localizeDataError.ts +593 -0
- package/src/schema.ts +158 -1
- package/src/sdkConstants.ts +3 -0
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;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
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,
|
package/dist/sdkConstants.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
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_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
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
|
|
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,
|
package/src/customCodeToken.ts
CHANGED
|
@@ -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';
|