terse-cli 0.1.76 → 0.2.1
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/_tmp_create_project.d.ts +2 -0
- package/dist/_tmp_create_project.d.ts.map +1 -0
- package/dist/_tmp_create_project.js +17 -0
- package/dist/_tmp_create_project.js.map +1 -0
- package/dist/_tmp_delete_agent.d.ts +2 -0
- package/dist/_tmp_delete_agent.d.ts.map +1 -0
- package/dist/_tmp_delete_agent.js +14 -0
- package/dist/_tmp_delete_agent.js.map +1 -0
- package/dist/_tmp_manual_trigger.d.ts +2 -0
- package/dist/_tmp_manual_trigger.d.ts.map +1 -0
- package/dist/_tmp_manual_trigger.js +17 -0
- package/dist/_tmp_manual_trigger.js.map +1 -0
- package/dist/_tmp_patch_active.d.ts +2 -0
- package/dist/_tmp_patch_active.d.ts.map +1 -0
- package/dist/_tmp_patch_active.js +21 -0
- package/dist/_tmp_patch_active.js.map +1 -0
- package/dist/codegen.d.ts +15 -0
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +466 -81
- package/dist/codegen.js.map +1 -1
- package/dist/commands/deployTheme.d.ts +28 -0
- package/dist/commands/deployTheme.d.ts.map +1 -0
- package/dist/commands/deployTheme.js +68 -0
- package/dist/commands/deployTheme.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +47 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/fsExec.d.ts +8 -0
- package/dist/commands/fsExec.d.ts.map +1 -0
- package/dist/commands/fsExec.js +46 -0
- package/dist/commands/fsExec.js.map +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +11 -0
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/integrate.d.ts +6 -0
- package/dist/commands/integrate.d.ts.map +1 -1
- package/dist/commands/integrate.js +79 -2
- package/dist/commands/integrate.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +2 -23
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/serve.d.ts +1 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +2 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/terseCliTheme.d.ts +28 -0
- package/dist/commands/terseCliTheme.d.ts.map +1 -0
- package/dist/commands/terseCliTheme.js +68 -0
- package/dist/commands/terseCliTheme.js.map +1 -0
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +3 -21
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/tool.d.ts +6 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +34 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/data/standardSlackEmoji.d.ts +2 -0
- package/dist/data/standardSlackEmoji.d.ts.map +1 -0
- package/dist/data/standardSlackEmoji.js +1978 -0
- package/dist/data/standardSlackEmoji.js.map +1 -0
- package/dist/data/standardSlackEmoji.json +1974 -0
- package/dist/deploy.d.ts +2 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +61 -38
- package/dist/deploy.js.map +1 -1
- package/dist/generate.d.ts +2 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +67 -69
- package/dist/generate.js.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +2 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +45 -96
- package/dist/init.js.map +1 -1
- package/dist/integrate.d.ts +1 -0
- package/dist/integrate.d.ts.map +1 -1
- package/dist/integrate.js +191 -11
- package/dist/integrate.js.map +1 -1
- package/dist/nonInteractive.d.ts +4 -2
- package/dist/nonInteractive.d.ts.map +1 -1
- package/dist/nonInteractive.js +5 -2
- package/dist/nonInteractive.js.map +1 -1
- package/dist/perf.d.ts +9 -0
- package/dist/perf.d.ts.map +1 -0
- package/dist/perf.js +59 -0
- package/dist/perf.js.map +1 -0
- package/dist/providers/codegen.test.d.ts +2 -0
- package/dist/providers/codegen.test.d.ts.map +1 -0
- package/dist/providers/codegen.test.js +45 -0
- package/dist/providers/codegen.test.js.map +1 -0
- package/dist/providers/codegenTypes.d.ts +1 -0
- package/dist/providers/codegenTypes.d.ts.map +1 -1
- package/dist/providers/python/PythonProvider.js +1 -0
- package/dist/providers/python/PythonProvider.js.map +1 -1
- package/dist/providers/python/PythonProvider.test.d.ts +2 -0
- package/dist/providers/python/PythonProvider.test.d.ts.map +1 -0
- package/dist/providers/python/PythonProvider.test.js +169 -0
- package/dist/providers/python/PythonProvider.test.js.map +1 -0
- package/dist/providers/typescript/prepareCodegenData.d.ts +1 -0
- package/dist/providers/typescript/prepareCodegenData.d.ts.map +1 -1
- package/dist/providers/typescript/prepareCodegenData.js +1 -0
- package/dist/providers/typescript/prepareCodegenData.js.map +1 -1
- package/dist/providers/typescript/prepareCodegenData.test.d.ts +2 -0
- package/dist/providers/typescript/prepareCodegenData.test.d.ts.map +1 -0
- package/dist/providers/typescript/prepareCodegenData.test.js +54 -0
- package/dist/providers/typescript/prepareCodegenData.test.js.map +1 -0
- package/dist/providers/typescript/projectedTypes.d.ts +11 -0
- package/dist/providers/typescript/projectedTypes.d.ts.map +1 -0
- package/dist/providers/typescript/projectedTypes.js +53 -0
- package/dist/providers/typescript/projectedTypes.js.map +1 -0
- package/dist/providers/typescript/triggerPayloads.d.ts +7 -0
- package/dist/providers/typescript/triggerPayloads.d.ts.map +1 -0
- package/dist/providers/typescript/triggerPayloads.js +60 -0
- package/dist/providers/typescript/triggerPayloads.js.map +1 -0
- package/dist/run.d.ts +2 -11
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +42 -153
- package/dist/run.js.map +1 -1
- package/dist/sampleEventId.d.ts +0 -4
- package/dist/sampleEventId.d.ts.map +1 -1
- package/dist/sampleEventId.js +0 -4
- package/dist/sampleEventId.js.map +1 -1
- package/dist/serializedEvent.d.ts +3 -0
- package/dist/serializedEvent.d.ts.map +1 -0
- package/dist/serializedEvent.js +40 -0
- package/dist/serializedEvent.js.map +1 -0
- package/dist/shared/ApiRoutes.d.ts +19 -0
- package/dist/shared/ApiRoutes.d.ts.map +1 -1
- package/dist/shared/ApiRoutes.js +17 -1
- package/dist/shared/ApiRoutes.js.map +1 -1
- package/dist/shared/Configs.d.ts +24 -2
- package/dist/shared/Configs.d.ts.map +1 -1
- package/dist/shared/Configs.js +32 -2
- package/dist/shared/Configs.js.map +1 -1
- package/dist/shared/Integrations.d.ts +18 -1
- package/dist/shared/Integrations.d.ts.map +1 -1
- package/dist/shared/Integrations.js +10 -1
- package/dist/shared/Integrations.js.map +1 -1
- package/dist/shared/InvalidationKeys.d.ts +1 -0
- package/dist/shared/InvalidationKeys.d.ts.map +1 -1
- package/dist/shared/InvalidationKeys.js +3 -0
- package/dist/shared/InvalidationKeys.js.map +1 -1
- package/dist/shared/ModelEvents.d.ts +9 -0
- package/dist/shared/ModelEvents.d.ts.map +1 -1
- package/dist/shared/ModelEvents.js +15 -0
- package/dist/shared/ModelEvents.js.map +1 -1
- package/dist/shared/ToolDisplayUtils.d.ts.map +1 -1
- package/dist/shared/ToolDisplayUtils.js +107 -11
- package/dist/shared/ToolDisplayUtils.js.map +1 -1
- package/dist/shared/types.d.ts +1013 -108
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/test.d.ts +2 -1
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +43 -23
- package/dist/test.js.map +1 -1
- package/dist/toolCatalog.d.ts +12 -0
- package/dist/toolCatalog.d.ts.map +1 -0
- package/dist/toolCatalog.js +33 -0
- package/dist/toolCatalog.js.map +1 -0
- package/dist/util.d.ts +2 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +3 -3
- package/dist/util.js.map +1 -1
- package/package.json +3 -3
- package/templates/typescript/codegen/partials/header.hbs +5 -0
- package/dist/jsonOutput.d.ts +0 -19
- package/dist/jsonOutput.d.ts.map +0 -1
- package/dist/jsonOutput.js +0 -25
- package/dist/jsonOutput.js.map +0 -1
- package/dist/providers/typescript/parkSignals.d.ts +0 -7
- package/dist/providers/typescript/parkSignals.d.ts.map +0 -1
- package/dist/providers/typescript/parkSignals.js +0 -45
- package/dist/providers/typescript/parkSignals.js.map +0 -1
- package/dist/replay.d.ts +0 -3
- package/dist/replay.d.ts.map +0 -1
- package/dist/replay.js +0 -20
- package/dist/replay.js.map +0 -1
- package/dist/urls.d.ts +0 -3
- package/dist/urls.d.ts.map +0 -1
- package/dist/urls.js +0 -27
- package/dist/urls.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareCodegenData.test.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/prepareCodegenData.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { jsonSchemaToTs } from "./prepareCodegenData.js";
|
|
4
|
+
test("required nullable properties render as optional while preserving null", () => {
|
|
5
|
+
const schema = {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
thread_ts: {
|
|
9
|
+
anyOf: [{ type: "string" }, { type: "null" }],
|
|
10
|
+
},
|
|
11
|
+
blocks: {
|
|
12
|
+
anyOf: [{ type: "string" }, { type: "null" }],
|
|
13
|
+
},
|
|
14
|
+
message: {
|
|
15
|
+
type: "string",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
required: ["thread_ts", "blocks", "message"],
|
|
19
|
+
};
|
|
20
|
+
assert.equal(jsonSchemaToTs(schema, 0), `{
|
|
21
|
+
thread_ts?: string | null
|
|
22
|
+
blocks?: string | null
|
|
23
|
+
message: string
|
|
24
|
+
}`);
|
|
25
|
+
});
|
|
26
|
+
test("optional nullable properties stay optional", () => {
|
|
27
|
+
const schema = {
|
|
28
|
+
type: "object",
|
|
29
|
+
properties: {
|
|
30
|
+
cursor: {
|
|
31
|
+
anyOf: [{ type: "string" }, { type: "null" }],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: [],
|
|
35
|
+
};
|
|
36
|
+
assert.equal(jsonSchemaToTs(schema, 0), `{
|
|
37
|
+
cursor?: string | null
|
|
38
|
+
}`);
|
|
39
|
+
});
|
|
40
|
+
test("required non-nullable properties stay required", () => {
|
|
41
|
+
const schema = {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
channelId: {
|
|
45
|
+
type: "string",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
required: ["channelId"],
|
|
49
|
+
};
|
|
50
|
+
assert.equal(jsonSchemaToTs(schema, 0), `{
|
|
51
|
+
channelId: string
|
|
52
|
+
}`);
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=prepareCodegenData.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareCodegenData.test.js","sourceRoot":"","sources":["../../../src/providers/typescript/prepareCodegenData.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;IAC/E,MAAM,MAAM,GAAe;QACvB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,SAAS,EAAE;gBACP,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAChD;YACD,MAAM,EAAE;gBACJ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAChD;YACD,OAAO,EAAE;gBACL,IAAI,EAAE,QAAQ;aACjB;SACJ;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC;KAC/C,CAAA;IAED,MAAM,CAAC,KAAK,CACR,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,EACzB;;;;EAIN,CACG,CAAA;AACL,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACpD,MAAM,MAAM,GAAe;QACvB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,MAAM,EAAE;gBACJ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAChD;SACJ;QACD,QAAQ,EAAE,EAAE;KACf,CAAA;IAED,MAAM,CAAC,KAAK,CACR,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,EACzB;;EAEN,CACG,CAAA;AACL,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,MAAM,MAAM,GAAe;QACvB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,SAAS,EAAE;gBACP,IAAI,EAAE,QAAQ;aACjB;SACJ;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KAC1B,CAAA;IAED,MAAM,CAAC,KAAK,CACR,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,EACzB;;EAEN,CACG,CAAA;AACL,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare function projectSchemaToTsDeclaration(options: ProjectSchemaOptions): Promise<string>;
|
|
3
|
+
export interface ProjectSchemaOptions {
|
|
4
|
+
typeName: string;
|
|
5
|
+
schema: z.core.$ZodType;
|
|
6
|
+
io: "input" | "output";
|
|
7
|
+
omitProperties?: readonly string[];
|
|
8
|
+
fieldTypeOverrides?: ReadonlyMap<z.core.$ZodType, string>;
|
|
9
|
+
propertyTypeOverrides?: Readonly<Record<string, string>>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=projectedTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectedTypes.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/projectedTypes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQjG;AA8CD,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;IACvB,EAAE,EAAE,OAAO,GAAG,QAAQ,CAAA;IACtB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACzD,qBAAqB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC3D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { compile } from "json-schema-to-typescript";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export async function projectSchemaToTsDeclaration(options) {
|
|
4
|
+
const jsonSchema = toCompilableJsonSchema(options);
|
|
5
|
+
const declaration = await compile(jsonSchema, options.typeName, {
|
|
6
|
+
bannerComment: "",
|
|
7
|
+
additionalProperties: false,
|
|
8
|
+
style: { tabWidth: 4, semi: false, printWidth: 120 }
|
|
9
|
+
});
|
|
10
|
+
return declaration.trimEnd();
|
|
11
|
+
}
|
|
12
|
+
function toCompilableJsonSchema(options) {
|
|
13
|
+
const rawSchema = z.toJSONSchema(options.schema, {
|
|
14
|
+
io: options.io,
|
|
15
|
+
unrepresentable: "any",
|
|
16
|
+
reused: "inline",
|
|
17
|
+
override: ctx => {
|
|
18
|
+
const tsType = options.fieldTypeOverrides?.get(ctx.zodSchema) ?? dateTsType(ctx.zodSchema);
|
|
19
|
+
if (tsType !== undefined) {
|
|
20
|
+
const jsonSchema = ctx.jsonSchema;
|
|
21
|
+
jsonSchema.tsType = tsType;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// JSON roundtrip converts zod's JSON Schema type to json-schema-to-typescript's without a cast
|
|
26
|
+
const jsonSchema = JSON.parse(JSON.stringify(rawSchema));
|
|
27
|
+
for (const property of options.omitProperties ?? []) {
|
|
28
|
+
omitProperty(jsonSchema, property);
|
|
29
|
+
}
|
|
30
|
+
for (const [property, tsType] of Object.entries(options.propertyTypeOverrides ?? {})) {
|
|
31
|
+
overridePropertyType(jsonSchema, property, tsType);
|
|
32
|
+
}
|
|
33
|
+
return jsonSchema;
|
|
34
|
+
}
|
|
35
|
+
// z.date() is unrepresentable in JSON Schema; the nonstandard tsType keyword tells the compiler to print Date
|
|
36
|
+
function dateTsType(schema) {
|
|
37
|
+
return schema._zod.def.type === "date" ? "Date" : undefined;
|
|
38
|
+
}
|
|
39
|
+
function omitProperty(jsonSchema, property) {
|
|
40
|
+
if (jsonSchema.properties) {
|
|
41
|
+
delete jsonSchema.properties[property];
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(jsonSchema.required)) {
|
|
44
|
+
jsonSchema.required = jsonSchema.required.filter(name => name !== property);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function overridePropertyType(jsonSchema, property, tsType) {
|
|
48
|
+
const existing = jsonSchema.properties?.[property];
|
|
49
|
+
if (!jsonSchema.properties || existing === undefined)
|
|
50
|
+
return;
|
|
51
|
+
jsonSchema.properties[property] = typeof existing === "object" && existing.description ? { description: existing.description, tsType } : { tsType };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=projectedTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectedTypes.js","sourceRoot":"","sources":["../../../src/providers/typescript/projectedTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function buildTriggerPayloadSection(importedNames: ReadonlySet<string>): Promise<TriggerPayloadSection>;
|
|
2
|
+
export interface TriggerPayloadSection {
|
|
3
|
+
declarations: string[];
|
|
4
|
+
projectedNames: ReadonlySet<string>;
|
|
5
|
+
extraImports: ReadonlySet<string>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=triggerPayloads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggerPayloads.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/triggerPayloads.ts"],"names":[],"mappings":"AAMA,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CASnH;AAqDD,MAAM,WAAW,qBAAqB;IAClC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACnC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACpC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { triggerPayloadProjections } from "terse-types";
|
|
2
|
+
import { CliError } from "../../cliError.js";
|
|
3
|
+
import { projectSchemaToTsDeclaration } from "./projectedTypes.js";
|
|
4
|
+
export async function buildTriggerPayloadSection(importedNames) {
|
|
5
|
+
const projectedNames = collectProjectedNames(importedNames);
|
|
6
|
+
const orderedNames = Object.keys(triggerPayloadProjections).filter(name => projectedNames.has(name));
|
|
7
|
+
const declarations = await Promise.all(orderedNames.map(name => buildDeclaration(name, triggerPayloadProjections[name])));
|
|
8
|
+
return {
|
|
9
|
+
declarations,
|
|
10
|
+
projectedNames,
|
|
11
|
+
extraImports: collectExtraImports(orderedNames)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function collectProjectedNames(importedNames) {
|
|
15
|
+
const projected = new Set();
|
|
16
|
+
const visit = (name) => {
|
|
17
|
+
const projection = triggerPayloadProjections[name];
|
|
18
|
+
if (!projection || projected.has(name))
|
|
19
|
+
return;
|
|
20
|
+
projected.add(name);
|
|
21
|
+
if (projection.kind === "union")
|
|
22
|
+
projection.members.forEach(visit);
|
|
23
|
+
};
|
|
24
|
+
importedNames.forEach(visit);
|
|
25
|
+
return projected;
|
|
26
|
+
}
|
|
27
|
+
async function buildDeclaration(name, projection) {
|
|
28
|
+
switch (projection.kind) {
|
|
29
|
+
case "union":
|
|
30
|
+
return `export type ${name} = ${projection.members.join(" | ")}`;
|
|
31
|
+
case "schema":
|
|
32
|
+
return wrapInSdkTrigger(name, projection.typeParams ?? "", await projectSchemaToTsDeclaration({
|
|
33
|
+
typeName: name,
|
|
34
|
+
schema: projection.schema,
|
|
35
|
+
io: "output",
|
|
36
|
+
propertyTypeOverrides: projection.fieldTypes
|
|
37
|
+
}));
|
|
38
|
+
default:
|
|
39
|
+
throw projection;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function wrapInSdkTrigger(name, typeParams, declaration) {
|
|
43
|
+
const interfacePrefix = `export interface ${name} `;
|
|
44
|
+
if (!declaration.startsWith(interfacePrefix)) {
|
|
45
|
+
throw new CliError("trigger_projection_shape", `Projected trigger payload ${name} did not compile to an interface declaration.`);
|
|
46
|
+
}
|
|
47
|
+
return `export type ${name}${typeParams} = SDKTrigger<${declaration.slice(interfacePrefix.length)}>`;
|
|
48
|
+
}
|
|
49
|
+
function collectExtraImports(projectedNames) {
|
|
50
|
+
const extraImports = new Set();
|
|
51
|
+
for (const name of projectedNames) {
|
|
52
|
+
const projection = triggerPayloadProjections[name];
|
|
53
|
+
if (projection.kind !== "schema")
|
|
54
|
+
continue;
|
|
55
|
+
extraImports.add("SDKTrigger");
|
|
56
|
+
projection.importTypes?.forEach(importType => extraImports.add(importType));
|
|
57
|
+
}
|
|
58
|
+
return extraImports;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=triggerPayloads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggerPayloads.js","sourceRoot":"","sources":["../../../src/providers/typescript/triggerPayloads.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Create a TerseAgent scoped to a job's skills and execute onTrigger.
|
|
5
|
-
* Tools are registered from the codegen factory on globalThis (needed because
|
|
6
|
-
* tsx may load a separate module instance of terse-sdk).
|
|
7
|
-
*/
|
|
8
|
-
export declare function executeJob(job: CreateJobParameters, event: SerializedEvent, options?: {
|
|
9
|
-
verbose?: boolean;
|
|
10
|
-
}): Promise<void>;
|
|
11
|
-
export declare function run(jobName?: string, eventJson?: string, eventFile?: string): Promise<void>;
|
|
1
|
+
import type { LanguageProvider } from "./providers/LanguageProvider.js";
|
|
2
|
+
export declare function run(jobName?: string, eventJson?: string, eventFile?: string, provider?: LanguageProvider, entryFile?: string): Promise<void>;
|
|
12
3
|
//# sourceMappingURL=run.d.ts.map
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,gBAAoC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrK"}
|
package/dist/run.js
CHANGED
|
@@ -1,58 +1,10 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
1
|
import chalk from "chalk";
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { ApiRoutes, buildRoute, sdkRunTriggerEventResponseSchema, serializedEventSchema } from "terse-types";
|
|
4
|
+
import { fetchWithAuth, readApiKey } from "./api.js";
|
|
6
5
|
import { loadJob } from "./loadJob.js";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import { BACKEND_URL } from "./config.js";
|
|
10
|
-
/**
|
|
11
|
-
* Create a TerseAgent scoped to a job's skills and execute onTrigger.
|
|
12
|
-
* Tools are registered from the codegen factory on globalThis (needed because
|
|
13
|
-
* tsx may load a separate module instance of terse-sdk).
|
|
14
|
-
*/
|
|
15
|
-
export async function executeJob(job, event, options) {
|
|
16
|
-
const inputEvent = convertSerializedEventToInputEvent(event);
|
|
17
|
-
const isVerbose = options?.verbose ?? false;
|
|
18
|
-
const apiKey = process.env.TERSE_API_KEY ?? null;
|
|
19
|
-
let sessionId;
|
|
20
|
-
let closeSession;
|
|
21
|
-
if (isVerbose && apiKey) {
|
|
22
|
-
const session = await openSessionStream(apiKey);
|
|
23
|
-
sessionId = session.sessionId;
|
|
24
|
-
closeSession = session.close;
|
|
25
|
-
}
|
|
26
|
-
const agent = new TerseAgent(job.skills, BACKEND_URL, sessionId);
|
|
27
|
-
const createTools = globalThis.__terse_createTools;
|
|
28
|
-
if (createTools) {
|
|
29
|
-
Object.defineProperty(agent, "tools", { value: createTools(agent) });
|
|
30
|
-
}
|
|
31
|
-
try {
|
|
32
|
-
if (job.filter) {
|
|
33
|
-
const shouldRun = await job.filter(inputEvent);
|
|
34
|
-
if (!shouldRun) {
|
|
35
|
-
console.log(chalk.dim(`\n Job "${job.name}" skipped (filter returned false).\n`));
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
if (isVerbose) {
|
|
40
|
-
console.log(chalk.cyan(` Job "${job.name}" started`));
|
|
41
|
-
}
|
|
42
|
-
await job.onTrigger(inputEvent, agent);
|
|
43
|
-
console.log(chalk.green(`\n Job "${job.name}" completed successfully.\n`));
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
console.error(chalk.red(`\n Job "${job.name}" threw an error:\n`));
|
|
47
|
-
console.error(err);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
closeSession?.();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
export async function run(jobName, eventJson, eventFile) {
|
|
55
|
-
assertProjectRoot();
|
|
6
|
+
import { resolveProvider } from "./providers/resolveProvider.js";
|
|
7
|
+
export async function run(jobName, eventJson, eventFile, provider = resolveProvider(), entryFile) {
|
|
56
8
|
if (eventFile && !eventJson) {
|
|
57
9
|
try {
|
|
58
10
|
eventJson = fs.readFileSync(eventFile, "utf-8");
|
|
@@ -63,121 +15,58 @@ export async function run(jobName, eventJson, eventFile) {
|
|
|
63
15
|
process.exit(1);
|
|
64
16
|
}
|
|
65
17
|
}
|
|
66
|
-
|
|
18
|
+
readApiKey();
|
|
19
|
+
let rawEvent;
|
|
20
|
+
if (eventJson) {
|
|
21
|
+
try {
|
|
22
|
+
rawEvent = JSON.parse(eventJson);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error(chalk.red("Error: --event must be valid JSON."));
|
|
26
|
+
console.error(chalk.dim(error instanceof Error ? error.message : String(error)));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
rawEvent = await resolveEventFromRunId();
|
|
32
|
+
}
|
|
33
|
+
if (!rawEvent) {
|
|
67
34
|
console.error(chalk.red("Error: --event <json> or --event-file <path> is required.\n"));
|
|
68
|
-
console.error(chalk.dim(
|
|
35
|
+
console.error(chalk.dim(' Usage: terse run --event \'{"integrationType":"...","eventType":"...","formattedContent":"...","debugLog":"...","data":{...}}\''));
|
|
69
36
|
console.error(chalk.dim(" terse run --event-file ./event.json"));
|
|
70
37
|
console.error(chalk.dim(" Tip: Use `terse test` to interactively pick a sample event.\n"));
|
|
71
38
|
process.exit(1);
|
|
72
39
|
}
|
|
73
|
-
|
|
74
|
-
const { job } = await loadJob(jobName);
|
|
75
|
-
console.log(chalk.cyan(`\n Running job: ${job.name}\n`));
|
|
40
|
+
const { job } = await loadJob(provider, jobName, entryFile);
|
|
76
41
|
let parsed;
|
|
77
42
|
try {
|
|
78
|
-
parsed =
|
|
43
|
+
parsed = serializedEventSchema.parse(rawEvent);
|
|
79
44
|
}
|
|
80
|
-
catch {
|
|
81
|
-
console.error(chalk.red("Error: --event
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error(chalk.red("Error: --event does not match the canonical Trigger schema."));
|
|
47
|
+
console.error(chalk.dim(error instanceof Error ? error.message : String(error)));
|
|
82
48
|
process.exit(1);
|
|
83
49
|
}
|
|
84
|
-
await executeJob(job, parsed);
|
|
50
|
+
await provider.executeJob(job, parsed, { entryFile });
|
|
85
51
|
}
|
|
86
|
-
async function
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (!res.ok || !res.body) {
|
|
91
|
-
throw new Error(`Failed to open session event stream (HTTP ${res.status})`);
|
|
52
|
+
async function resolveEventFromRunId() {
|
|
53
|
+
const runId = process.env.TERSE_RUN_ID?.trim();
|
|
54
|
+
if (!runId) {
|
|
55
|
+
return undefined;
|
|
92
56
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
buffer = sessionId._remainingBuffer;
|
|
98
|
-
startEventConsumer(reader, decoder, buffer);
|
|
99
|
-
return {
|
|
100
|
-
sessionId: sessionId.value,
|
|
101
|
-
close: () => reader.cancel().catch(() => { })
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
async function readSessionId(reader, decoder, buffer) {
|
|
105
|
-
while (true) {
|
|
106
|
-
const { done, value } = await reader.read();
|
|
107
|
-
if (done)
|
|
108
|
-
throw new Error("Session stream ended before sending sessionId");
|
|
109
|
-
buffer += decoder.decode(value, { stream: true });
|
|
110
|
-
const lines = buffer.split("\n");
|
|
111
|
-
buffer = lines.pop() ?? "";
|
|
112
|
-
for (const line of lines) {
|
|
113
|
-
if (!line.startsWith("data: "))
|
|
114
|
-
continue;
|
|
115
|
-
const event = safeParseJson(line.slice(6));
|
|
116
|
-
if (event?.type === "session_started" && typeof event.sessionId === "string") {
|
|
117
|
-
return { value: event.sessionId, _remainingBuffer: buffer };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
function startEventConsumer(reader, decoder, initialBuffer) {
|
|
123
|
-
let buffer = initialBuffer;
|
|
124
|
-
(async () => {
|
|
125
|
-
try {
|
|
126
|
-
while (true) {
|
|
127
|
-
const { done, value } = await reader.read();
|
|
128
|
-
if (done)
|
|
129
|
-
break;
|
|
130
|
-
buffer += decoder.decode(value, { stream: true });
|
|
131
|
-
const lines = buffer.split("\n");
|
|
132
|
-
buffer = lines.pop() ?? "";
|
|
133
|
-
for (const line of lines) {
|
|
134
|
-
if (!line.startsWith("data: "))
|
|
135
|
-
continue;
|
|
136
|
-
const event = safeParseJson(line.slice(6));
|
|
137
|
-
if (event)
|
|
138
|
-
logSessionEvent(event);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
// Stream cancelled by close() — expected
|
|
144
|
-
}
|
|
145
|
-
})();
|
|
146
|
-
}
|
|
147
|
-
function logSessionEvent(event) {
|
|
148
|
-
switch (event.type) {
|
|
149
|
-
case "tool_call_started":
|
|
150
|
-
console.log(chalk.blue(` [tool:start] ${event.toolCallStarted}`));
|
|
151
|
-
break;
|
|
152
|
-
case "tool_call_completed": {
|
|
153
|
-
const parsed = safeParseJson(event.toolCallCompleted);
|
|
154
|
-
const toolName = parsed?.tool || "unknown_tool";
|
|
155
|
-
const status = parsed?.status || "unknown";
|
|
156
|
-
const symbol = status === "completed" ? chalk.green("ok") : chalk.red("failed");
|
|
157
|
-
console.log(` [tool:done] ${toolName} (${symbol})`);
|
|
158
|
-
break;
|
|
159
|
-
}
|
|
160
|
-
case "action": {
|
|
161
|
-
const action = event.action;
|
|
162
|
-
const actionName = action?.action || "action";
|
|
163
|
-
const target = action?.target ? ` -> ${action.target}` : "";
|
|
164
|
-
console.log(chalk.magenta(` [action] ${actionName}${target}`));
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
case "final_output":
|
|
168
|
-
console.log(chalk.green(`\n [final_output] ${event.finalOutput}\n`));
|
|
169
|
-
break;
|
|
170
|
-
case "error":
|
|
171
|
-
console.log(chalk.red(` [error] ${event.message}`));
|
|
172
|
-
break;
|
|
57
|
+
const apiKey = process.env.TERSE_API_KEY ?? null;
|
|
58
|
+
if (!apiKey) {
|
|
59
|
+
console.error(chalk.red(`Error: TERSE_RUN_ID is set but TERSE_API_KEY is missing, so the trigger event for run ${runId} cannot be fetched.`));
|
|
60
|
+
process.exit(1);
|
|
173
61
|
}
|
|
174
|
-
}
|
|
175
|
-
function safeParseJson(value) {
|
|
176
62
|
try {
|
|
177
|
-
|
|
63
|
+
const response = await fetchWithAuth(buildRoute(ApiRoutes.SDK.RUN_TRIGGER_EVENT, { runId }), apiKey);
|
|
64
|
+
return sdkRunTriggerEventResponseSchema.parse(response).event;
|
|
178
65
|
}
|
|
179
|
-
catch {
|
|
180
|
-
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error(chalk.red(`Error: Could not fetch the trigger event for run ${runId}.`));
|
|
68
|
+
console.error(chalk.dim(error instanceof Error ? error.message : String(error)));
|
|
69
|
+
process.exit(1);
|
|
181
70
|
}
|
|
182
71
|
}
|
|
183
72
|
//# sourceMappingURL=run.js.map
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/dist/sampleEventId.d.ts
CHANGED
|
@@ -4,10 +4,6 @@ import type { SerializedEvent } from "terse-types";
|
|
|
4
4
|
* the underlying Trigger payload (`event.data`) is identical — we deliberately
|
|
5
5
|
* avoid hashing display strings like `formattedContent` because the server
|
|
6
6
|
* renders relative timestamps that drift between calls.
|
|
7
|
-
*
|
|
8
|
-
* For synthetic cron/webhook events the CLI builds in test.ts, the caller is
|
|
9
|
-
* responsible for ensuring each trigger produces a distinct `data` (e.g. by
|
|
10
|
-
* stamping a `_syntheticTriggerIndex`).
|
|
11
7
|
*/
|
|
12
8
|
export declare function hashEventKey(event: SerializedEvent): string;
|
|
13
9
|
//# sourceMappingURL=sampleEventId.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampleEventId.d.ts","sourceRoot":"","sources":["../src/sampleEventId.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD
|
|
1
|
+
{"version":3,"file":"sampleEventId.d.ts","sourceRoot":"","sources":["../src/sampleEventId.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAO3D"}
|
package/dist/sampleEventId.js
CHANGED
|
@@ -4,10 +4,6 @@ import { createHash } from "node:crypto";
|
|
|
4
4
|
* the underlying Trigger payload (`event.data`) is identical — we deliberately
|
|
5
5
|
* avoid hashing display strings like `formattedContent` because the server
|
|
6
6
|
* renders relative timestamps that drift between calls.
|
|
7
|
-
*
|
|
8
|
-
* For synthetic cron/webhook events the CLI builds in test.ts, the caller is
|
|
9
|
-
* responsible for ensuring each trigger produces a distinct `data` (e.g. by
|
|
10
|
-
* stamping a `_syntheticTriggerIndex`).
|
|
11
7
|
*/
|
|
12
8
|
export function hashEventKey(event) {
|
|
13
9
|
const material = JSON.stringify({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampleEventId.js","sourceRoot":"","sources":["../src/sampleEventId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC
|
|
1
|
+
{"version":3,"file":"sampleEventId.js","sourceRoot":"","sources":["../src/sampleEventId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAsB;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;KACnB,CAAC,CAAA;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC3E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializedEvent.d.ts","sourceRoot":"","sources":["../src/serializedEvent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAExF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { serializedEventSchema } from "terse-types";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { CliError } from "./cliError.js";
|
|
4
|
+
export function parseSerializedEventJson(raw, flagLabel) {
|
|
5
|
+
return validateSerializedEvent(parseJson(raw, flagLabel));
|
|
6
|
+
}
|
|
7
|
+
function parseJson(raw, flagLabel) {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(raw);
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
throw new CliError("invalid_event_json", `${flagLabel} must be valid JSON.`, {
|
|
13
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function validateSerializedEvent(parsed) {
|
|
18
|
+
const result = serializedEventSchema.safeParse(parsed);
|
|
19
|
+
if (result.success)
|
|
20
|
+
return result.data;
|
|
21
|
+
throw new CliError("invalid_event_shape", "Event JSON does not match the canonical Trigger schema.", {
|
|
22
|
+
detail: `${EXPECTED_ENVELOPE_HINT}\n\nValidation issues:\n${z.prettifyError(result.error)}`
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const EXPECTED_ENVELOPE_HINT = `Expected envelope (webhook example):
|
|
26
|
+
{
|
|
27
|
+
"integrationType": "webhook",
|
|
28
|
+
"eventType": "webhook",
|
|
29
|
+
"formattedContent": "<any string>",
|
|
30
|
+
"debugLog": "<any string>",
|
|
31
|
+
"data": {
|
|
32
|
+
"integrationType": "webhook",
|
|
33
|
+
"eventType": "webhook",
|
|
34
|
+
"body": <your provider payload>,
|
|
35
|
+
"headers": { "content-type": "application/json" },
|
|
36
|
+
"method": "POST"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
Tip: \`terse test show <id> --json\` prints a valid event.`;
|
|
40
|
+
//# sourceMappingURL=serializedEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializedEvent.js","sourceRoot":"","sources":["../src/serializedEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,SAAiB;IACnE,OAAO,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,SAAiB;IAC7C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,GAAG,SAAS,sBAAsB,EAAE;YACzE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC3D,CAAC,CAAA;IACN,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAe;IAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,IAAI,CAAA;IACtC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,yDAAyD,EAAE;QACjG,MAAM,EAAE,GAAG,sBAAsB,2BAA2B,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KAC9F,CAAC,CAAA;AACN,CAAC;AAED,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;2DAc4B,CAAA"}
|
|
@@ -139,6 +139,9 @@ export declare const ApiRoutes: {
|
|
|
139
139
|
readonly INTEGRATIONS: "/workos-integration/integrations";
|
|
140
140
|
readonly WEBHOOK_SECRET: "/workos-integration/webhook-secret";
|
|
141
141
|
};
|
|
142
|
+
readonly SNOWFLAKE: {
|
|
143
|
+
readonly INTEGRATIONS: "/snowflake/integrations";
|
|
144
|
+
};
|
|
142
145
|
readonly ATTIO: {
|
|
143
146
|
readonly INTEGRATIONS: "/attio/integrations";
|
|
144
147
|
readonly OAUTH_CALLBACK: "/attio/oauth/callback";
|
|
@@ -245,8 +248,24 @@ export declare const ApiRoutes: {
|
|
|
245
248
|
readonly TOOL_EXECUTE: "/sdk/tool-execute";
|
|
246
249
|
readonly TOOL_DEFINITIONS: "/sdk/tool-definitions";
|
|
247
250
|
readonly AGENT_RUN: "/sdk/agent-run";
|
|
251
|
+
readonly APPROVAL_DECISION: "/sdk/approval-decision";
|
|
248
252
|
readonly SESSION_EVENTS: "/sdk/session-events";
|
|
249
253
|
readonly DEPLOY: "/sdk/deploy";
|
|
254
|
+
readonly DEVICE_TOKEN_EXCHANGE: "/sdk/auth/device-token-exchange";
|
|
255
|
+
readonly INTEGRATION_FIELDS: {
|
|
256
|
+
readonly pattern: "/sdk/integrations/:integrationType/fields";
|
|
257
|
+
readonly build: (integrationType: string) => string;
|
|
258
|
+
readonly params: {
|
|
259
|
+
readonly integrationType: "string";
|
|
260
|
+
};
|
|
261
|
+
};
|
|
262
|
+
readonly INTEGRATION_FORM_SUBMIT: {
|
|
263
|
+
readonly pattern: "/sdk/integrations/:integrationType/form-submit";
|
|
264
|
+
readonly build: (integrationType: string) => string;
|
|
265
|
+
readonly params: {
|
|
266
|
+
readonly integrationType: "string";
|
|
267
|
+
};
|
|
268
|
+
};
|
|
250
269
|
};
|
|
251
270
|
readonly NOTIFICATION_SETTINGS: "/notification-settings";
|
|
252
271
|
readonly SENT_NOTIFICATIONS: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiRoutes.d.ts","sourceRoot":"","sources":["../../src/shared/ApiRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;6CAyBc,MAAM;;;;;;;;;;;;sCAcb,MAAM;;;;;;;oCAKR,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CA0FE,MAAM;;;;;;;4CAKN,MAAM,cAAc,MAAM
|
|
1
|
+
{"version":3,"file":"ApiRoutes.d.ts","sourceRoot":"","sources":["../../src/shared/ApiRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;6CAyBc,MAAM;;;;;;;;;;;;sCAcb,MAAM;;;;;;;oCAKR,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CA0FE,MAAM;;;;;;;4CAKN,MAAM,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;;;4CA4B1B,MAAM;;;;;;;;;;;iCAWjB,MAAM;;;;;;;;;sCAQD,MAAM;;;;;;;sCAKN,MAAM,MAAM,MAAM;;;;;;;;sCAKlB,MAAM,MAAM,MAAM;;;;;;;;sCAKlB,MAAM,MAAM,MAAM;;;;;;;;sCAKlB,MAAM;;;;;;;;;;;;;;;;8CAoBE,MAAM;;;;;;;;;;;;iCAYnB,MAAM;;;;;;;;;;iCAUN,MAAM;;;;;;;;;;;;;;;;;;8CAkBO,MAAM;;;;;;;8CAKN,MAAM;;;;;;;;;;;;;;;;;;;wCAsBZ,MAAM;;;;;;;qCAKT,MAAM;;;;;;;sCAKL,MAAM;;;;;;;4CAKA,MAAM;;;;;;;;;sCASZ,MAAM;;;;;;;2CAKD,MAAM;;;;;;;;;;;;iCAchB,MAAM;;;;;;;;;wCASC,MAAM;;;;;;CAI3B,CAAA"}
|