@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/src/schema.ts
CHANGED
|
@@ -707,6 +707,23 @@ const DATA_RESTORE_POINT_BODY = z.union([
|
|
|
707
707
|
z.strictObject({ bookmark: z.string().min(1).max(200) })
|
|
708
708
|
]);
|
|
709
709
|
|
|
710
|
+
// The database's own settings. `timeZone` is an IANA zone (America/Bogota),
|
|
711
|
+
// or null for UTC: datetimes come back in it for callers that send none.
|
|
712
|
+
const DATA_DATABASE_PATCH = z.strictObject({
|
|
713
|
+
timeZone: z
|
|
714
|
+
.string()
|
|
715
|
+
.max(100)
|
|
716
|
+
.refine(zone => {
|
|
717
|
+
try {
|
|
718
|
+
new Intl.DateTimeFormat('en-US', { timeZone: zone });
|
|
719
|
+
return true;
|
|
720
|
+
} catch {
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
}, 'Use an IANA time zone, such as America/Bogota.')
|
|
724
|
+
.nullable()
|
|
725
|
+
});
|
|
726
|
+
|
|
710
727
|
const DATA_EXPORT_BODY = z.strictObject({
|
|
711
728
|
format: z.enum(['jsonl', 'csv']).optional()
|
|
712
729
|
});
|
|
@@ -726,11 +743,99 @@ const DATA_CHANGE_LIST_QUERY = z.strictObject({
|
|
|
726
743
|
cursor: z.uuid().optional()
|
|
727
744
|
});
|
|
728
745
|
|
|
746
|
+
// Named queries: a SELECT the owner writes once, with named parameters
|
|
747
|
+
// (`:from`), checked to only read when it is saved.
|
|
748
|
+
const DATA_QUERY_PARAM = z.strictObject({
|
|
749
|
+
name: DATA_IDENTIFIER,
|
|
750
|
+
type: z.enum(['text', 'integer', 'decimal', 'boolean', 'date', 'datetime']),
|
|
751
|
+
description: z.string().max(300).nullish(),
|
|
752
|
+
required: z.boolean().optional()
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
const DATA_QUERY_INPUT = z.strictObject({
|
|
756
|
+
name: DATA_IDENTIFIER,
|
|
757
|
+
description: z.string().max(300).nullish(),
|
|
758
|
+
sql: z.string().min(1).max(10_000),
|
|
759
|
+
params: z.array(DATA_QUERY_PARAM).max(20).optional(),
|
|
760
|
+
// Channel bots may run it from data-query.
|
|
761
|
+
assistant: z.boolean().optional()
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
const DATA_QUERY_RUN_BODY = z.strictObject({
|
|
765
|
+
params: z.record(z.string(), z.unknown()).optional(),
|
|
766
|
+
limit: z.number().int().min(1).max(500).optional(),
|
|
767
|
+
timeZone: z.string().max(100).optional()
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
// A trigger, as the dashboard, the API and ganju.json's "triggers" write it:
|
|
771
|
+
// a table, an event, an optional condition and exactly one action. The
|
|
772
|
+
// object checks the rest (columns, fields used in texts) against the schema.
|
|
773
|
+
const DATA_TRIGGER_NAME = z
|
|
774
|
+
.string()
|
|
775
|
+
.regex(
|
|
776
|
+
/^[a-z][a-z0-9_-]{0,62}$/,
|
|
777
|
+
'Lowercase letters, digits, _ and -, starting with a letter'
|
|
778
|
+
);
|
|
779
|
+
const DATA_TRIGGER_TEMPLATE = z.strictObject({
|
|
780
|
+
name: z.string().min(1).max(512),
|
|
781
|
+
language: z.string().min(1).max(20),
|
|
782
|
+
// Each {{n}} of the template in order: fixed text or a {{field}} of the row.
|
|
783
|
+
params: z.array(z.string().max(1024)).max(20).optional()
|
|
784
|
+
});
|
|
785
|
+
const DATA_TRIGGER_INPUT = z.strictObject({
|
|
786
|
+
name: DATA_TRIGGER_NAME.optional(),
|
|
787
|
+
description: z.string().max(300).nullish(),
|
|
788
|
+
table: DATA_IDENTIFIER,
|
|
789
|
+
on: z.enum(['insert', 'update', 'delete']),
|
|
790
|
+
// { column: { changedTo | changedFrom | equals: value, changed: true } },
|
|
791
|
+
// combined with { all: [...] } or { any: [...] }.
|
|
792
|
+
when: z.record(z.string(), z.unknown()).nullish(),
|
|
793
|
+
enabled: z.boolean().optional(),
|
|
794
|
+
// false: refuse to save over an existing trigger of this name.
|
|
795
|
+
replace: z.boolean().optional(),
|
|
796
|
+
// Runs a minute; past it events wait in the queue. 60 by default.
|
|
797
|
+
rateLimit: z.number().int().min(1).max(600).optional(),
|
|
798
|
+
function: z.string().min(1).max(64).optional(),
|
|
799
|
+
webhook: z.url().max(2000).optional(),
|
|
800
|
+
chat: z
|
|
801
|
+
.strictObject({
|
|
802
|
+
channelId: z.string().min(1).max(100),
|
|
803
|
+
chatId: z.union([z.string().min(1).max(200), z.number().int()]),
|
|
804
|
+
text: z.string().min(1).max(2000)
|
|
805
|
+
})
|
|
806
|
+
.optional(),
|
|
807
|
+
email: z
|
|
808
|
+
.strictObject({
|
|
809
|
+
to: z.union([z.email(), z.array(z.email()).min(1).max(10)]),
|
|
810
|
+
subject: z.string().min(1).max(200).optional(),
|
|
811
|
+
text: z.string().min(1).max(2000)
|
|
812
|
+
})
|
|
813
|
+
.optional(),
|
|
814
|
+
customer: z
|
|
815
|
+
.strictObject({
|
|
816
|
+
text: z.string().min(1).max(2000),
|
|
817
|
+
template: DATA_TRIGGER_TEMPLATE.optional()
|
|
818
|
+
})
|
|
819
|
+
.optional()
|
|
820
|
+
});
|
|
821
|
+
const DATA_TRIGGER_PATCH = z.strictObject({ enabled: z.boolean() });
|
|
822
|
+
const DATA_TRIGGER_DEPLOY_BODY = z.strictObject({
|
|
823
|
+
triggers: z.array(DATA_TRIGGER_INPUT).max(50)
|
|
824
|
+
});
|
|
825
|
+
const DATA_TRIGGER_RUN_LIST_QUERY = z.object({
|
|
826
|
+
limit: z.coerce.number().int().min(1).max(50).optional()
|
|
827
|
+
});
|
|
828
|
+
|
|
729
829
|
const DATA_TABLE_PARAMS = DATA_DATABASE_GET.extend({ table: DATA_IDENTIFIER });
|
|
730
830
|
const DATA_COLUMN_PARAMS = DATA_TABLE_PARAMS.extend({
|
|
731
831
|
column: DATA_IDENTIFIER
|
|
732
832
|
});
|
|
733
833
|
const DATA_ROW_PARAMS = DATA_TABLE_PARAMS.extend({ id: DATA_ROW_ID });
|
|
834
|
+
const DATA_QUERY_PATH_PARAMS = DATA_DATABASE_GET.extend({ name: DATA_IDENTIFIER });
|
|
835
|
+
const DATA_TRIGGER_PATH_PARAMS = DATA_DATABASE_GET.extend({ name: DATA_TRIGGER_NAME });
|
|
836
|
+
const DATA_TRIGGER_RUN_PARAMS = DATA_TRIGGER_PATH_PARAMS.extend({
|
|
837
|
+
runId: z.string().min(1).max(64)
|
|
838
|
+
});
|
|
734
839
|
|
|
735
840
|
const ARTIFACT_UPLOAD_RESOURCE_FILE = z.object({
|
|
736
841
|
resourceId: z.uuid(),
|
|
@@ -1362,7 +1467,20 @@ const CUSTOM_CODE_TOOL = z.object({
|
|
|
1362
1467
|
description: z.string().max(2000).optional(),
|
|
1363
1468
|
inputSchema: SCHEMA_DEFINITION.default({ type: 'object', properties: {} }),
|
|
1364
1469
|
outputSchema: SCHEMA_DEFINITION.optional(),
|
|
1365
|
-
annotations: TOOL_ANNOTATIONS.optional()
|
|
1470
|
+
annotations: TOOL_ANNOTATIONS.optional(),
|
|
1471
|
+
// What this function may do through ctx.data. Absent means everything: it
|
|
1472
|
+
// is the owner's code. Narrowing matters most for a function a channel bot
|
|
1473
|
+
// calls after reading customer text, and the broker enforces it, since
|
|
1474
|
+
// anything in the script can be edited.
|
|
1475
|
+
// false: deployed and run by triggers, but never offered to the assistant
|
|
1476
|
+
// (left out of tools/list, and not counted toward its tools).
|
|
1477
|
+
expose: z.boolean().optional(),
|
|
1478
|
+
data: z
|
|
1479
|
+
.strictObject({
|
|
1480
|
+
access: z.enum(['read', 'write']).optional(),
|
|
1481
|
+
tables: z.array(z.string().min(1).max(63)).max(50).optional()
|
|
1482
|
+
})
|
|
1483
|
+
.optional()
|
|
1366
1484
|
});
|
|
1367
1485
|
|
|
1368
1486
|
// The manifest a `ganju deploy` (or the dashboard) uploads alongside a bundle.
|
|
@@ -1611,6 +1729,31 @@ const CUSTOM_CODE_BROKER_SECRET = z.object({
|
|
|
1611
1729
|
name: z.string().min(1).max(200)
|
|
1612
1730
|
});
|
|
1613
1731
|
|
|
1732
|
+
// One ctx.data call. `call` is the token the dispatcher signed for the
|
|
1733
|
+
// function being run, which the script hands back: the broker reads the
|
|
1734
|
+
// function's name from it, never from the script, and applies that
|
|
1735
|
+
// function's `data` narrowing.
|
|
1736
|
+
const CUSTOM_CODE_BROKER_DATA = z.object({
|
|
1737
|
+
call: z.string().min(1).max(4000),
|
|
1738
|
+
op: z.enum(['describe', 'query', 'write', 'run']),
|
|
1739
|
+
args: z.record(z.string(), z.unknown()).default({})
|
|
1740
|
+
});
|
|
1741
|
+
|
|
1742
|
+
// ctx.channels: a message to a customer the bot has spoken with, or a post
|
|
1743
|
+
// to a chat the bot is in. `call` names the function, as for ctx.data.
|
|
1744
|
+
const CUSTOM_CODE_BROKER_CHANNELS_SEND = z.object({
|
|
1745
|
+
call: z.string().min(1).max(4000),
|
|
1746
|
+
participantId: z.string().min(1).max(100),
|
|
1747
|
+
text: z.string().min(1).max(4000).optional(),
|
|
1748
|
+
template: DATA_TRIGGER_TEMPLATE.optional()
|
|
1749
|
+
});
|
|
1750
|
+
const CUSTOM_CODE_BROKER_CHANNELS_POST = z.object({
|
|
1751
|
+
call: z.string().min(1).max(4000),
|
|
1752
|
+
channelId: z.string().min(1).max(100),
|
|
1753
|
+
chatId: z.union([z.string().min(1).max(200), z.number().int()]),
|
|
1754
|
+
text: z.string().min(1).max(4000)
|
|
1755
|
+
});
|
|
1756
|
+
|
|
1614
1757
|
const CUSTOM_CODE_BROKER_RESOURCE_SEARCH = z.object({
|
|
1615
1758
|
query: z.string().min(1).max(2000),
|
|
1616
1759
|
limit: z.number().int().positive().max(20).default(5)
|
|
@@ -1971,6 +2114,17 @@ export const Schema = {
|
|
|
1971
2114
|
DATA_EXPORT_FILE_QUERY,
|
|
1972
2115
|
DATA_CHANGE_LIST_QUERY,
|
|
1973
2116
|
DATA_TABLE_PARAMS,
|
|
2117
|
+
DATA_DATABASE_PATCH,
|
|
2118
|
+
DATA_QUERY_PARAM,
|
|
2119
|
+
DATA_QUERY_INPUT,
|
|
2120
|
+
DATA_QUERY_RUN_BODY,
|
|
2121
|
+
DATA_QUERY_PATH_PARAMS,
|
|
2122
|
+
DATA_TRIGGER_INPUT,
|
|
2123
|
+
DATA_TRIGGER_PATCH,
|
|
2124
|
+
DATA_TRIGGER_DEPLOY_BODY,
|
|
2125
|
+
DATA_TRIGGER_RUN_LIST_QUERY,
|
|
2126
|
+
DATA_TRIGGER_PATH_PARAMS,
|
|
2127
|
+
DATA_TRIGGER_RUN_PARAMS,
|
|
1974
2128
|
DATA_COLUMN_PARAMS,
|
|
1975
2129
|
DATA_ROW_PARAMS,
|
|
1976
2130
|
ARTIFACT_REMOVE_RESOURCE,
|
|
@@ -2034,6 +2188,9 @@ export const Schema = {
|
|
|
2034
2188
|
CUSTOM_CODE_INVOKE_RESPONSE,
|
|
2035
2189
|
CUSTOM_CODE_BROKER_CONNECTION,
|
|
2036
2190
|
CUSTOM_CODE_BROKER_SECRET,
|
|
2191
|
+
CUSTOM_CODE_BROKER_DATA,
|
|
2192
|
+
CUSTOM_CODE_BROKER_CHANNELS_SEND,
|
|
2193
|
+
CUSTOM_CODE_BROKER_CHANNELS_POST,
|
|
2037
2194
|
CUSTOM_CODE_BROKER_RESOURCE_SEARCH,
|
|
2038
2195
|
CUSTOM_CODE_BROKER_RESOURCE_READ,
|
|
2039
2196
|
CUSTOM_CODE_BROKER_RESOURCE_CREATE,
|
package/src/sdkConstants.ts
CHANGED
|
@@ -29,6 +29,9 @@ export const CUSTOM_CODE_BROKER_PATH_RESOURCES_LIST = '/resources/list';
|
|
|
29
29
|
export const CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE = '/resources/create';
|
|
30
30
|
export const CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE = '/resources/delete';
|
|
31
31
|
export const CUSTOM_CODE_BROKER_PATH_SEND_FILE = '/send-file';
|
|
32
|
+
export const CUSTOM_CODE_BROKER_PATH_DATA = '/data';
|
|
33
|
+
export const CUSTOM_CODE_BROKER_PATH_CHANNELS_SEND = '/channels/send';
|
|
34
|
+
export const CUSTOM_CODE_BROKER_PATH_CHANNELS_POST = '/channels/post';
|
|
32
35
|
|
|
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
|