@inkeep/agents-cli 0.51.0 → 0.53.0
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/agents-cli/package.js +6 -0
- package/dist/commands/config.js +1 -1
- package/dist/commands/dev.js +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/{pull-v3 → pull-v4}/component-parser.js +6 -12
- package/dist/commands/{pull-v3/utils → pull-v4}/component-registry.js +1 -1
- package/dist/commands/pull-v4/generators/agent-generator.js +258 -0
- package/dist/commands/pull-v4/generators/artifact-component-generator.js +69 -0
- package/dist/commands/pull-v4/generators/context-config-generator.js +264 -0
- package/dist/commands/pull-v4/generators/credential-generator.js +30 -0
- package/dist/commands/pull-v4/generators/data-component-generator.js +50 -0
- package/dist/commands/pull-v4/generators/environment-generator.js +123 -0
- package/dist/commands/pull-v4/generators/external-agent-generator.js +56 -0
- package/dist/commands/pull-v4/generators/function-tool-generator.js +48 -0
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js +91 -0
- package/dist/commands/pull-v4/generators/project-generator.js +125 -0
- package/dist/commands/{pull-v3/components → pull-v4/generators}/skill-generator.js +1 -1
- package/dist/commands/pull-v4/generators/status-component-generator.js +35 -0
- package/dist/commands/pull-v4/generators/sub-agent-generator.js +269 -0
- package/dist/commands/pull-v4/generators/trigger-generator.js +58 -0
- package/dist/commands/pull-v4/introspect/index.js +365 -0
- package/dist/commands/pull-v4/introspect/test-helpers.js +143 -0
- package/dist/commands/pull-v4/introspect-generator.js +706 -0
- package/dist/commands/pull-v4/module-merge.js +405 -0
- package/dist/commands/pull-v4/utils.js +235 -0
- package/dist/commands/push.js +1 -1
- package/dist/commands/update.js +2 -2
- package/dist/index.js +18 -44
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/array.js +18 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/base.js +180 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/character.js +8 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/css.js +12 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/json.js +60 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/line.js +37 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/sentence.js +31 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/word.js +118 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/index.js +11 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/patch/create.js +141 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/util/string.js +63 -0
- package/dist/utils/ci-environment.js +1 -1
- package/dist/utils/config.js +1 -1
- package/dist/utils/environment-loader.js +1 -1
- package/dist/utils/file-finder.js +1 -1
- package/dist/utils/mcp-runner.js +1 -1
- package/dist/utils/profile-config.js +1 -1
- package/dist/utils/profiles/profile-manager.js +1 -1
- package/dist/utils/project-directory.js +1 -1
- package/dist/utils/project-loader.js +1 -1
- package/dist/utils/version-check.js +6 -15
- package/package.json +5 -7
- package/dist/commands/pull-v3/component-updater.js +0 -768
- package/dist/commands/pull-v3/components/agent-generator.js +0 -255
- package/dist/commands/pull-v3/components/artifact-component-generator.js +0 -143
- package/dist/commands/pull-v3/components/context-config-generator.js +0 -190
- package/dist/commands/pull-v3/components/credential-generator.js +0 -89
- package/dist/commands/pull-v3/components/data-component-generator.js +0 -102
- package/dist/commands/pull-v3/components/environment-generator.js +0 -173
- package/dist/commands/pull-v3/components/external-agent-generator.js +0 -75
- package/dist/commands/pull-v3/components/function-tool-generator.js +0 -92
- package/dist/commands/pull-v3/components/mcp-tool-generator.js +0 -86
- package/dist/commands/pull-v3/components/project-generator.js +0 -157
- package/dist/commands/pull-v3/components/status-component-generator.js +0 -92
- package/dist/commands/pull-v3/components/sub-agent-generator.js +0 -295
- package/dist/commands/pull-v3/components/trigger-generator.js +0 -185
- package/dist/commands/pull-v3/index.js +0 -510
- package/dist/commands/pull-v3/introspect-generator.js +0 -286
- package/dist/commands/pull-v3/llm-content-merger.js +0 -192
- package/dist/commands/pull-v3/new-component-generator.js +0 -279
- package/dist/commands/pull-v3/project-comparator.js +0 -914
- package/dist/commands/pull-v3/project-index-generator.js +0 -32
- package/dist/commands/pull-v3/project-validator.js +0 -358
- package/dist/commands/pull-v3/targeted-typescript-placeholders.js +0 -173
- package/dist/commands/pull-v3/utils/component-tracker.js +0 -165
- package/dist/commands/pull-v3/utils/generator-utils.js +0 -146
- package/dist/commands/pull-v3/utils/model-provider-detector.js +0 -50
- package/dist/utils/url.js +0 -26
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { addValueToObject, createFactoryDefinition, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/commands/pull-v4/generators/credential-generator.ts
|
|
5
|
+
const CredentialSchema = z.object({
|
|
6
|
+
credentialId: z.string().nonempty(),
|
|
7
|
+
name: z.string().nonempty(),
|
|
8
|
+
type: z.string().nonempty(),
|
|
9
|
+
credentialStoreId: z.string().nonempty(),
|
|
10
|
+
description: z.string().optional(),
|
|
11
|
+
retrievalParams: z.unknown().optional()
|
|
12
|
+
});
|
|
13
|
+
function generateCredentialDefinition(data) {
|
|
14
|
+
const result = CredentialSchema.safeParse(data);
|
|
15
|
+
if (!result.success) throw new Error(`Validation failed for credential:\n${z.prettifyError(result.error)}`);
|
|
16
|
+
const parsed = result.data;
|
|
17
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
18
|
+
importName: "credential",
|
|
19
|
+
variableName: toCamelCase(parsed.credentialId)
|
|
20
|
+
});
|
|
21
|
+
const { credentialId, ...rest } = parsed;
|
|
22
|
+
for (const [k, v] of Object.entries({
|
|
23
|
+
id: credentialId,
|
|
24
|
+
...rest
|
|
25
|
+
})) addValueToObject(configObject, k, v);
|
|
26
|
+
return sourceFile;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { generateCredentialDefinition };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { addStringProperty, addValueToObject, convertJsonSchemaToZodSafe, createFactoryDefinition, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/commands/pull-v4/generators/data-component-generator.ts
|
|
5
|
+
const DataComponentSchema = z.object({
|
|
6
|
+
dataComponentId: z.string().nonempty(),
|
|
7
|
+
name: z.string().nonempty(),
|
|
8
|
+
description: z.string().nullable().optional(),
|
|
9
|
+
props: z.unknown().optional(),
|
|
10
|
+
schema: z.unknown().optional(),
|
|
11
|
+
render: z.looseObject({
|
|
12
|
+
component: z.string().optional(),
|
|
13
|
+
mockData: z.looseObject({}).optional()
|
|
14
|
+
}).nullable().optional()
|
|
15
|
+
});
|
|
16
|
+
function generateDataComponentDefinition(data) {
|
|
17
|
+
const result = DataComponentSchema.safeParse(data);
|
|
18
|
+
if (!result.success) throw new Error(`Validation failed for data component:\n${z.prettifyError(result.error)}`);
|
|
19
|
+
const parsed = result.data;
|
|
20
|
+
const props = parsed.props !== void 0 ? parsed.props : parsed.schema;
|
|
21
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
22
|
+
importName: "dataComponent",
|
|
23
|
+
variableName: toCamelCase(parsed.dataComponentId)
|
|
24
|
+
});
|
|
25
|
+
if (props !== void 0) sourceFile.addImportDeclaration({
|
|
26
|
+
namedImports: ["z"],
|
|
27
|
+
moduleSpecifier: "zod"
|
|
28
|
+
});
|
|
29
|
+
writeDataComponentConfig(configObject, parsed, props);
|
|
30
|
+
return sourceFile;
|
|
31
|
+
}
|
|
32
|
+
function writeDataComponentConfig(configObject, data, props) {
|
|
33
|
+
addStringProperty(configObject, "id", data.dataComponentId);
|
|
34
|
+
addStringProperty(configObject, "name", data.name);
|
|
35
|
+
if (typeof data.description === "string") addStringProperty(configObject, "description", data.description);
|
|
36
|
+
if (props !== void 0) configObject.addPropertyAssignment({
|
|
37
|
+
name: "props",
|
|
38
|
+
initializer: convertJsonSchemaToZodSafe(props)
|
|
39
|
+
});
|
|
40
|
+
if (data.render) addRenderProperty(configObject, data.render);
|
|
41
|
+
}
|
|
42
|
+
function addRenderProperty(configObject, render) {
|
|
43
|
+
if (render.component) addValueToObject(configObject, "render", {
|
|
44
|
+
component: render.component,
|
|
45
|
+
mockData: render.mockData
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
export { generateDataComponentDefinition };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { addStringProperty, createFactoryDefinition, formatInlineLiteral, formatPropertyName, isPlainObject } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { SyntaxKind } from "ts-morph";
|
|
4
|
+
|
|
5
|
+
//#region src/commands/pull-v4/generators/environment-generator.ts
|
|
6
|
+
const EnvironmentSettingsSchema = z.looseObject({ credentials: z.record(z.string(), z.unknown()).nullable().optional() });
|
|
7
|
+
const EnvironmentIndexSchema = z.array(z.string());
|
|
8
|
+
function generateEnvironmentSettingsImports(environmentData) {
|
|
9
|
+
const imports = [`import { registerEnvironmentSettings } from '@inkeep/agents-sdk';`];
|
|
10
|
+
if (needsCredentialStoreType(environmentData)) imports.push(`import { CredentialStoreType } from '@inkeep/agents-core';`);
|
|
11
|
+
return imports;
|
|
12
|
+
}
|
|
13
|
+
function generateEnvironmentIndexImports(environments) {
|
|
14
|
+
const result = EnvironmentIndexSchema.safeParse(environments);
|
|
15
|
+
if (!result.success) throw new Error(`Validation failed for environments index:\n${z.prettifyError(result.error)}`);
|
|
16
|
+
const imports = [`import { createEnvironmentSettings } from '@inkeep/agents-sdk';`];
|
|
17
|
+
for (const environmentName of result.data) imports.push(`import { ${environmentName} } from './${environmentName}.env';`);
|
|
18
|
+
return imports;
|
|
19
|
+
}
|
|
20
|
+
function generateEnvironmentSettingsDefinition(environmentName, environmentData) {
|
|
21
|
+
const environmentNameResult = z.string().nonempty().safeParse(environmentName);
|
|
22
|
+
if (!environmentNameResult.success) throw new Error(`Validation failed for environment name:\n${z.prettifyError(environmentNameResult.error)}`);
|
|
23
|
+
const result = EnvironmentSettingsSchema.safeParse(environmentData);
|
|
24
|
+
if (!result.success) throw new Error(`Validation failed for environment settings:\n${z.prettifyError(result.error)}`);
|
|
25
|
+
const parsed = result.data;
|
|
26
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
27
|
+
importName: "registerEnvironmentSettings",
|
|
28
|
+
variableName: environmentNameResult.data
|
|
29
|
+
});
|
|
30
|
+
const hasCredentialStoreType = needsCredentialStoreType(parsed);
|
|
31
|
+
if (hasCredentialStoreType) sourceFile.addImportDeclaration({
|
|
32
|
+
namedImports: ["CredentialStoreType"],
|
|
33
|
+
moduleSpecifier: "@inkeep/agents-core"
|
|
34
|
+
});
|
|
35
|
+
addCredentialsProperty(configObject, parsed.credentials, hasCredentialStoreType);
|
|
36
|
+
return sourceFile;
|
|
37
|
+
}
|
|
38
|
+
function generateEnvironmentIndexDefinition(environments) {
|
|
39
|
+
const result = EnvironmentIndexSchema.safeParse(environments);
|
|
40
|
+
if (!result.success) throw new Error(`Validation failed for environments index:\n${z.prettifyError(result.error)}`);
|
|
41
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
42
|
+
importName: "createEnvironmentSettings",
|
|
43
|
+
variableName: "envSettings"
|
|
44
|
+
});
|
|
45
|
+
for (const environmentName of result.data) sourceFile.addImportDeclaration({
|
|
46
|
+
namedImports: [environmentName],
|
|
47
|
+
moduleSpecifier: `./${environmentName}.env`
|
|
48
|
+
});
|
|
49
|
+
for (const environmentName of result.data) configObject.addShorthandPropertyAssignment({ name: environmentName });
|
|
50
|
+
return sourceFile;
|
|
51
|
+
}
|
|
52
|
+
function generateEnvironmentSettingsFile(environmentName, environmentData) {
|
|
53
|
+
return generateEnvironmentSettingsDefinition(environmentName, environmentData);
|
|
54
|
+
}
|
|
55
|
+
function generateEnvironmentIndexFile(environments) {
|
|
56
|
+
return generateEnvironmentIndexDefinition(environments);
|
|
57
|
+
}
|
|
58
|
+
function needsCredentialStoreType(environmentData) {
|
|
59
|
+
if (!isPlainObject(environmentData.credentials)) return false;
|
|
60
|
+
return Object.values(environmentData.credentials).some((credential) => isPlainObject(credential) && typeof credential.type === "string" && [
|
|
61
|
+
"memory",
|
|
62
|
+
"env",
|
|
63
|
+
"keychain"
|
|
64
|
+
].includes(credential.type));
|
|
65
|
+
}
|
|
66
|
+
function addCredentialsProperty(configObject, credentials, hasCredentialStoreType) {
|
|
67
|
+
if (!isPlainObject(credentials) || !Object.keys(credentials).length) {
|
|
68
|
+
configObject.addPropertyAssignment({
|
|
69
|
+
name: "credentials",
|
|
70
|
+
initializer: "{}"
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const credentialsObject = configObject.addPropertyAssignment({
|
|
75
|
+
name: "credentials",
|
|
76
|
+
initializer: "{}"
|
|
77
|
+
}).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
78
|
+
for (const [credentialKey, credentialValue] of Object.entries(credentials)) {
|
|
79
|
+
if (!isPlainObject(credentialValue)) continue;
|
|
80
|
+
writeCredential(credentialsObject.addPropertyAssignment({
|
|
81
|
+
name: formatPropertyName(credentialKey),
|
|
82
|
+
initializer: "{}"
|
|
83
|
+
}).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression), credentialValue, hasCredentialStoreType);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function writeCredential(credentialObject, credentialData, hasCredentialStoreType) {
|
|
87
|
+
if (credentialData.id !== void 0) addStringProperty(credentialObject, "id", credentialData.id);
|
|
88
|
+
if (credentialData.name !== void 0 && credentialData.name !== null) addStringProperty(credentialObject, "name", credentialData.name);
|
|
89
|
+
if (credentialData.type !== void 0) if (hasCredentialStoreType && typeof credentialData.type === "string" && [
|
|
90
|
+
"memory",
|
|
91
|
+
"env",
|
|
92
|
+
"keychain"
|
|
93
|
+
].includes(credentialData.type)) credentialObject.addPropertyAssignment({
|
|
94
|
+
name: "type",
|
|
95
|
+
initializer: `CredentialStoreType.${credentialData.type}`
|
|
96
|
+
});
|
|
97
|
+
else credentialObject.addPropertyAssignment({
|
|
98
|
+
name: "type",
|
|
99
|
+
initializer: formatInlineLiteral(credentialData.type)
|
|
100
|
+
});
|
|
101
|
+
if (credentialData.credentialStoreId !== void 0) addStringProperty(credentialObject, "credentialStoreId", credentialData.credentialStoreId);
|
|
102
|
+
if (credentialData.description !== void 0 && credentialData.description !== null) addStringProperty(credentialObject, "description", credentialData.description);
|
|
103
|
+
addRetrievalParams(credentialObject, credentialData.retrievalParams);
|
|
104
|
+
}
|
|
105
|
+
function addRetrievalParams(credentialObject, retrievalParams) {
|
|
106
|
+
if (!isPlainObject(retrievalParams)) return;
|
|
107
|
+
const retrievalParamsProperty = credentialObject.addPropertyAssignment({
|
|
108
|
+
name: "retrievalParams",
|
|
109
|
+
initializer: "{}"
|
|
110
|
+
});
|
|
111
|
+
const retrievalParamsObject = retrievalParamsProperty.getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
112
|
+
for (const [key, value] of Object.entries(retrievalParams)) {
|
|
113
|
+
if (value === void 0 || value === null) continue;
|
|
114
|
+
retrievalParamsObject.addPropertyAssignment({
|
|
115
|
+
name: formatPropertyName(key),
|
|
116
|
+
initializer: formatInlineLiteral(value)
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (!retrievalParamsObject.getProperties().length) retrievalParamsProperty.remove();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//#endregion
|
|
123
|
+
export { generateEnvironmentIndexDefinition, generateEnvironmentIndexFile, generateEnvironmentIndexImports, generateEnvironmentSettingsDefinition, generateEnvironmentSettingsFile, generateEnvironmentSettingsImports };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { addStringProperty, createFactoryDefinition, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { SyntaxKind } from "ts-morph";
|
|
4
|
+
|
|
5
|
+
//#region src/commands/pull-v4/generators/external-agent-generator.ts
|
|
6
|
+
const ExternalAgentSchema = z.looseObject({
|
|
7
|
+
externalAgentId: z.string().nonempty(),
|
|
8
|
+
name: z.string().nonempty(),
|
|
9
|
+
description: z.string().nullable().optional(),
|
|
10
|
+
baseUrl: z.string().nonempty(),
|
|
11
|
+
credentialReference: z.union([z.string(), z.looseObject({
|
|
12
|
+
id: z.string().optional(),
|
|
13
|
+
name: z.string().optional(),
|
|
14
|
+
description: z.string().optional()
|
|
15
|
+
})]).optional()
|
|
16
|
+
});
|
|
17
|
+
function generateExternalAgentDefinition(data) {
|
|
18
|
+
const result = ExternalAgentSchema.safeParse(data);
|
|
19
|
+
if (!result.success) throw new Error(`Validation failed for external agent:\n${z.prettifyError(result.error)}`);
|
|
20
|
+
const parsed = result.data;
|
|
21
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
22
|
+
importName: "externalAgent",
|
|
23
|
+
variableName: toCamelCase(parsed.externalAgentId)
|
|
24
|
+
});
|
|
25
|
+
if (typeof parsed.credentialReference === "string") sourceFile.addImportDeclaration({
|
|
26
|
+
namedImports: [toCamelCase(parsed.credentialReference)],
|
|
27
|
+
moduleSpecifier: `../credentials/${parsed.credentialReference}`
|
|
28
|
+
});
|
|
29
|
+
writeExternalAgentConfig(configObject, parsed);
|
|
30
|
+
return sourceFile;
|
|
31
|
+
}
|
|
32
|
+
function writeExternalAgentConfig(configObject, data) {
|
|
33
|
+
addStringProperty(configObject, "id", data.externalAgentId);
|
|
34
|
+
addStringProperty(configObject, "name", data.name);
|
|
35
|
+
if (data.description !== null && data.description !== void 0) addStringProperty(configObject, "description", data.description);
|
|
36
|
+
else addStringProperty(configObject, "description", `External agent ${data.externalAgentId}`);
|
|
37
|
+
addStringProperty(configObject, "baseUrl", data.baseUrl);
|
|
38
|
+
if (typeof data.credentialReference === "string") {
|
|
39
|
+
configObject.addPropertyAssignment({
|
|
40
|
+
name: "credentialReference",
|
|
41
|
+
initializer: toCamelCase(data.credentialReference)
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!data.credentialReference) return;
|
|
46
|
+
const credentialReferenceObject = configObject.addPropertyAssignment({
|
|
47
|
+
name: "credentialReference",
|
|
48
|
+
initializer: "{}"
|
|
49
|
+
}).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
50
|
+
if (data.credentialReference.id !== void 0) addStringProperty(credentialReferenceObject, "id", data.credentialReference.id);
|
|
51
|
+
if (data.credentialReference.name !== void 0) addStringProperty(credentialReferenceObject, "name", data.credentialReference.name);
|
|
52
|
+
if (data.credentialReference.description !== void 0) addStringProperty(credentialReferenceObject, "description", data.credentialReference.description);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { generateExternalAgentDefinition };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { addValueToObject, createFactoryDefinition, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/commands/pull-v4/generators/function-tool-generator.ts
|
|
5
|
+
const FunctionToolSchema = z.looseObject({
|
|
6
|
+
functionToolId: z.string().nonempty(),
|
|
7
|
+
name: z.string().nonempty(),
|
|
8
|
+
description: z.string().optional(),
|
|
9
|
+
inputSchema: z.unknown().optional(),
|
|
10
|
+
schema: z.unknown().optional(),
|
|
11
|
+
executeCode: z.string().optional(),
|
|
12
|
+
execute: z.string().optional()
|
|
13
|
+
}).superRefine((value, context) => {
|
|
14
|
+
if (value.inputSchema === void 0 && value.schema === void 0) context.addIssue({
|
|
15
|
+
code: "custom",
|
|
16
|
+
message: "inputSchema is required",
|
|
17
|
+
path: ["inputSchema"]
|
|
18
|
+
});
|
|
19
|
+
if (value.executeCode === void 0 && value.execute === void 0) context.addIssue({
|
|
20
|
+
code: "custom",
|
|
21
|
+
message: "executeCode is required",
|
|
22
|
+
path: ["executeCode"]
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
function generateFunctionToolDefinition(data) {
|
|
26
|
+
const result = FunctionToolSchema.safeParse(data);
|
|
27
|
+
if (!result.success) throw new Error(`Validation failed for function tool:\n${z.prettifyError(result.error)}`);
|
|
28
|
+
const parsed = result.data;
|
|
29
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
30
|
+
importName: "functionTool",
|
|
31
|
+
variableName: toCamelCase(parsed.functionToolId)
|
|
32
|
+
});
|
|
33
|
+
writeFunctionToolConfig(configObject, parsed);
|
|
34
|
+
return sourceFile;
|
|
35
|
+
}
|
|
36
|
+
function writeFunctionToolConfig(configObject, { functionToolId, executeCode, inputSchema, schema, ...rest }) {
|
|
37
|
+
for (const [k, v] of Object.entries({
|
|
38
|
+
...rest,
|
|
39
|
+
inputSchema: inputSchema ?? schema
|
|
40
|
+
})) addValueToObject(configObject, k, v);
|
|
41
|
+
if (executeCode) configObject.addPropertyAssignment({
|
|
42
|
+
name: "execute",
|
|
43
|
+
initializer: executeCode
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
export { generateFunctionToolDefinition };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { addValueToObject, createFactoryDefinition, formatInlineLiteral, formatStringLiteral, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/commands/pull-v4/generators/mcp-tool-generator.ts
|
|
5
|
+
const McpToolSchema = z.object({
|
|
6
|
+
mcpToolId: z.string().nonempty(),
|
|
7
|
+
name: z.string().nonempty(),
|
|
8
|
+
description: z.string().nullable().optional(),
|
|
9
|
+
config: z.looseObject({ mcp: z.looseObject({
|
|
10
|
+
server: z.looseObject({ url: z.string().optional() }).optional(),
|
|
11
|
+
transport: z.unknown().optional(),
|
|
12
|
+
activeTools: z.array(z.unknown()).optional()
|
|
13
|
+
}).optional() }).optional(),
|
|
14
|
+
serverUrl: z.string().optional(),
|
|
15
|
+
transport: z.object({ type: z.string() }).optional(),
|
|
16
|
+
activeTools: z.array(z.unknown()).optional(),
|
|
17
|
+
imageUrl: z.string().nullish(),
|
|
18
|
+
headers: z.unknown().optional(),
|
|
19
|
+
credential: z.unknown().optional(),
|
|
20
|
+
credentialReferenceId: z.string().nullish()
|
|
21
|
+
}).superRefine((value, context) => {
|
|
22
|
+
if (!resolveServerUrl(value)) context.addIssue({
|
|
23
|
+
code: "custom",
|
|
24
|
+
message: "serverUrl is required (from config.mcp.server.url or serverUrl)",
|
|
25
|
+
path: ["serverUrl"]
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
function generateMcpToolDefinition(data) {
|
|
29
|
+
const result = McpToolSchema.safeParse(data);
|
|
30
|
+
if (!result.success) throw new Error(`Validation failed for MCP tool:\n${z.prettifyError(result.error)}`);
|
|
31
|
+
const parsed = result.data;
|
|
32
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
33
|
+
importName: "mcpTool",
|
|
34
|
+
variableName: toCamelCase(parsed.mcpToolId)
|
|
35
|
+
});
|
|
36
|
+
if (parsed.credentialReferenceId && parsed.credential === void 0) sourceFile.addImportDeclaration({
|
|
37
|
+
namedImports: ["envSettings"],
|
|
38
|
+
moduleSpecifier: "../environments"
|
|
39
|
+
});
|
|
40
|
+
writeMcpToolConfig(configObject, parsed);
|
|
41
|
+
return sourceFile;
|
|
42
|
+
}
|
|
43
|
+
function writeMcpToolConfig(configObject, { mcpToolId, description, serverUrl, config, transport, activeTools, credential, credentialReferenceId, ...rest }) {
|
|
44
|
+
for (const [k, v] of Object.entries({
|
|
45
|
+
id: mcpToolId,
|
|
46
|
+
...rest,
|
|
47
|
+
description: description ?? void 0,
|
|
48
|
+
serverUrl: resolveServerUrl({
|
|
49
|
+
config,
|
|
50
|
+
serverUrl
|
|
51
|
+
}),
|
|
52
|
+
transport: resolveTransport({
|
|
53
|
+
config,
|
|
54
|
+
transport
|
|
55
|
+
}),
|
|
56
|
+
activeTools: resolveActiveTools({
|
|
57
|
+
config,
|
|
58
|
+
activeTools
|
|
59
|
+
})
|
|
60
|
+
})) addValueToObject(configObject, k, v);
|
|
61
|
+
if (credential !== void 0 && credential !== null) {
|
|
62
|
+
if (typeof credential === "string") {
|
|
63
|
+
configObject.addPropertyAssignment({
|
|
64
|
+
name: "credential",
|
|
65
|
+
initializer: credential
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
configObject.addPropertyAssignment({
|
|
70
|
+
name: "credential",
|
|
71
|
+
initializer: formatInlineLiteral(credential)
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (credentialReferenceId) configObject.addPropertyAssignment({
|
|
76
|
+
name: "credential",
|
|
77
|
+
initializer: `envSettings.getEnvironmentCredential(${formatStringLiteral(credentialReferenceId)})`
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function resolveServerUrl(data) {
|
|
81
|
+
return data.config?.mcp?.server?.url ?? data.serverUrl;
|
|
82
|
+
}
|
|
83
|
+
function resolveTransport(data) {
|
|
84
|
+
return data.config?.mcp?.transport ?? data.transport;
|
|
85
|
+
}
|
|
86
|
+
function resolveActiveTools(data) {
|
|
87
|
+
return data.config?.mcp?.activeTools ?? data.activeTools;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { generateMcpToolDefinition };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { addReferenceGetterProperty, addValueToObject, convertNullToUndefined, createFactoryDefinition, createUniqueReferenceName, formatStringLiteral, hasReferences, resolveReferenceName, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/commands/pull-v4/generators/project-generator.ts
|
|
5
|
+
const ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());
|
|
6
|
+
const ReferenceOverridesSchema = z.object({
|
|
7
|
+
agents: ReferenceNameByIdSchema.optional(),
|
|
8
|
+
tools: ReferenceNameByIdSchema.optional(),
|
|
9
|
+
externalAgents: ReferenceNameByIdSchema.optional(),
|
|
10
|
+
dataComponents: ReferenceNameByIdSchema.optional(),
|
|
11
|
+
artifactComponents: ReferenceNameByIdSchema.optional(),
|
|
12
|
+
credentialReferences: ReferenceNameByIdSchema.optional()
|
|
13
|
+
});
|
|
14
|
+
const ProjectSchema = z.looseObject({
|
|
15
|
+
projectId: z.string().nonempty(),
|
|
16
|
+
name: z.string().nonempty(),
|
|
17
|
+
description: z.string().optional(),
|
|
18
|
+
models: z.looseObject({
|
|
19
|
+
base: z.looseObject({ model: z.string().nonempty() }),
|
|
20
|
+
structuredOutput: z.looseObject({}).optional(),
|
|
21
|
+
summarizer: z.looseObject({}).optional()
|
|
22
|
+
}),
|
|
23
|
+
stopWhen: z.preprocess(convertNullToUndefined, z.strictObject({
|
|
24
|
+
transferCountIs: z.int().optional(),
|
|
25
|
+
stepCountIs: z.int().optional()
|
|
26
|
+
}).optional()),
|
|
27
|
+
skills: z.array(z.string()).optional(),
|
|
28
|
+
agents: z.array(z.string()).optional(),
|
|
29
|
+
tools: z.array(z.string()).optional(),
|
|
30
|
+
externalAgents: z.array(z.string()).optional(),
|
|
31
|
+
dataComponents: z.array(z.string()).optional(),
|
|
32
|
+
artifactComponents: z.array(z.string()).optional(),
|
|
33
|
+
credentialReferences: z.array(z.string()).optional(),
|
|
34
|
+
referenceOverrides: ReferenceOverridesSchema.optional()
|
|
35
|
+
});
|
|
36
|
+
function generateProjectDefinition(data) {
|
|
37
|
+
const result = ProjectSchema.safeParse(data);
|
|
38
|
+
if (!result.success) throw new Error(`Validation failed for project:
|
|
39
|
+
${z.prettifyError(result.error)}`);
|
|
40
|
+
const parsed = result.data;
|
|
41
|
+
const projectVariableName = toCamelCase(parsed.projectId);
|
|
42
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
43
|
+
importName: "project",
|
|
44
|
+
variableName: projectVariableName
|
|
45
|
+
});
|
|
46
|
+
const reservedReferenceNames = new Set([projectVariableName]);
|
|
47
|
+
if (hasReferences(parsed.skills)) {
|
|
48
|
+
sourceFile.getImportDeclarationOrThrow("@inkeep/agents-sdk").addNamedImport("loadSkills");
|
|
49
|
+
sourceFile.addImportDeclaration({
|
|
50
|
+
defaultImport: "path",
|
|
51
|
+
moduleSpecifier: "node:path"
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const { projectId, skills, agents, tools, externalAgents, dataComponents, artifactComponents, credentialReferences, referenceOverrides, ...rest } = parsed;
|
|
55
|
+
for (const [key, value] of Object.entries({
|
|
56
|
+
id: projectId,
|
|
57
|
+
...rest
|
|
58
|
+
})) addValueToObject(configObject, key, value);
|
|
59
|
+
if (hasReferences(skills)) configObject.addPropertyAssignment({
|
|
60
|
+
name: "skills",
|
|
61
|
+
initializer: `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`
|
|
62
|
+
});
|
|
63
|
+
if (hasReferences(agents)) {
|
|
64
|
+
const resolvedReferences = createResolvedReferences(agents, referenceOverrides?.agents, reservedReferenceNames, "Agent");
|
|
65
|
+
addReferenceImports(sourceFile, resolvedReferences, "./agents");
|
|
66
|
+
addReferenceGetterProperty(configObject, "agents", toReferenceNames(resolvedReferences));
|
|
67
|
+
}
|
|
68
|
+
if (hasReferences(tools)) {
|
|
69
|
+
const resolvedReferences = createResolvedReferences(tools, referenceOverrides?.tools, reservedReferenceNames, "Tool");
|
|
70
|
+
addReferenceImports(sourceFile, resolvedReferences, "./tools");
|
|
71
|
+
addReferenceGetterProperty(configObject, "tools", toReferenceNames(resolvedReferences));
|
|
72
|
+
}
|
|
73
|
+
if (hasReferences(externalAgents)) {
|
|
74
|
+
const resolvedReferences = createResolvedReferences(externalAgents, referenceOverrides?.externalAgents, reservedReferenceNames, "ExternalAgent");
|
|
75
|
+
addReferenceImports(sourceFile, resolvedReferences, "./external-agents");
|
|
76
|
+
addReferenceGetterProperty(configObject, "externalAgents", toReferenceNames(resolvedReferences));
|
|
77
|
+
}
|
|
78
|
+
if (hasReferences(dataComponents)) {
|
|
79
|
+
const resolvedReferences = createResolvedReferences(dataComponents, referenceOverrides?.dataComponents, reservedReferenceNames, "DataComponent");
|
|
80
|
+
addReferenceImports(sourceFile, resolvedReferences, "./data-components");
|
|
81
|
+
addReferenceGetterProperty(configObject, "dataComponents", toReferenceNames(resolvedReferences));
|
|
82
|
+
}
|
|
83
|
+
if (hasReferences(artifactComponents)) {
|
|
84
|
+
const resolvedReferences = createResolvedReferences(artifactComponents, referenceOverrides?.artifactComponents, reservedReferenceNames, "ArtifactComponent");
|
|
85
|
+
addReferenceImports(sourceFile, resolvedReferences, "./artifact-components");
|
|
86
|
+
addReferenceGetterProperty(configObject, "artifactComponents", toReferenceNames(resolvedReferences));
|
|
87
|
+
}
|
|
88
|
+
if (hasReferences(credentialReferences)) {
|
|
89
|
+
const resolvedReferences = createResolvedReferences(credentialReferences, referenceOverrides?.credentialReferences, reservedReferenceNames, "CredentialReference");
|
|
90
|
+
addReferenceImports(sourceFile, resolvedReferences, "./credentials");
|
|
91
|
+
addReferenceGetterProperty(configObject, "credentialReferences", toReferenceNames(resolvedReferences));
|
|
92
|
+
}
|
|
93
|
+
return sourceFile;
|
|
94
|
+
}
|
|
95
|
+
function addReferenceImports(sourceFile, references, basePath) {
|
|
96
|
+
for (const reference of references) sourceFile.addImportDeclaration({
|
|
97
|
+
namedImports: [reference.importName === reference.localName ? reference.importName : {
|
|
98
|
+
name: reference.importName,
|
|
99
|
+
alias: reference.localName
|
|
100
|
+
}],
|
|
101
|
+
moduleSpecifier: `${basePath}/${reference.id}`
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function toReferenceNames(references) {
|
|
105
|
+
return references.map((reference) => reference.localName);
|
|
106
|
+
}
|
|
107
|
+
function createResolvedReferences(references, referenceOverrides, reservedReferenceNames, suffix) {
|
|
108
|
+
const seenIds = /* @__PURE__ */ new Set();
|
|
109
|
+
const resolvedReferences = [];
|
|
110
|
+
for (const referenceId of references) {
|
|
111
|
+
if (seenIds.has(referenceId)) continue;
|
|
112
|
+
seenIds.add(referenceId);
|
|
113
|
+
const importName = resolveReferenceName(referenceId, [referenceOverrides]);
|
|
114
|
+
const localName = createUniqueReferenceName(importName, reservedReferenceNames, suffix);
|
|
115
|
+
resolvedReferences.push({
|
|
116
|
+
id: referenceId,
|
|
117
|
+
importName,
|
|
118
|
+
localName
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return resolvedReferences;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
//#endregion
|
|
125
|
+
export { generateProjectDefinition };
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { stringify } from "yaml";
|
|
3
3
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
4
|
|
|
5
|
-
//#region src/commands/pull-
|
|
5
|
+
//#region src/commands/pull-v4/generators/skill-generator.ts
|
|
6
6
|
function formatMetadata(metadata) {
|
|
7
7
|
return `metadata:\n${stringify(metadata).split("\n").filter((line) => line.trim() !== "").map((line) => ` ${line}`).join("\n")}`;
|
|
8
8
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { addValueToObject, convertJsonSchemaToZodSafe, createFactoryDefinition, toCamelCase } from "../utils.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/commands/pull-v4/generators/status-component-generator.ts
|
|
5
|
+
const StatusComponentSchema = z.looseObject({
|
|
6
|
+
statusComponentId: z.string().nonempty(),
|
|
7
|
+
type: z.string().nonempty(),
|
|
8
|
+
description: z.string().optional(),
|
|
9
|
+
detailsSchema: z.unknown().optional(),
|
|
10
|
+
schema: z.unknown().optional()
|
|
11
|
+
});
|
|
12
|
+
function generateStatusComponentDefinition(data) {
|
|
13
|
+
const result = StatusComponentSchema.safeParse(data);
|
|
14
|
+
if (!result.success) throw new Error(`Validation failed for status component:\n${z.prettifyError(result.error)}`);
|
|
15
|
+
const parsed = result.data;
|
|
16
|
+
const detailsSchema = parsed.detailsSchema !== void 0 ? parsed.detailsSchema : parsed.schema;
|
|
17
|
+
const { sourceFile, configObject } = createFactoryDefinition({
|
|
18
|
+
importName: "statusComponent",
|
|
19
|
+
variableName: toCamelCase(parsed.statusComponentId)
|
|
20
|
+
});
|
|
21
|
+
if (detailsSchema !== void 0) sourceFile.addImportDeclaration({
|
|
22
|
+
namedImports: ["z"],
|
|
23
|
+
moduleSpecifier: "zod"
|
|
24
|
+
});
|
|
25
|
+
const { statusComponentId, id, detailsSchema: _, schema: _2, ...rest } = parsed;
|
|
26
|
+
for (const [k, v] of Object.entries(rest)) addValueToObject(configObject, k, v);
|
|
27
|
+
if (detailsSchema) configObject.addPropertyAssignment({
|
|
28
|
+
name: "detailsSchema",
|
|
29
|
+
initializer: convertJsonSchemaToZodSafe(detailsSchema)
|
|
30
|
+
});
|
|
31
|
+
return sourceFile;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { generateStatusComponentDefinition };
|