@inkeep/agents-cli 0.59.3 → 0.60.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 +1 -1
- package/dist/commands/pull-v4/collector-common.js +128 -0
- package/dist/commands/pull-v4/collector-common.js.map +1 -0
- package/dist/commands/pull-v4/collector-reference-helpers.js +323 -0
- package/dist/commands/pull-v4/collector-reference-helpers.js.map +1 -0
- package/dist/commands/pull-v4/component-parser.js +2 -1
- package/dist/commands/pull-v4/component-parser.js.map +1 -1
- package/dist/commands/pull-v4/file-scope.js +43 -0
- package/dist/commands/pull-v4/file-scope.js.map +1 -0
- package/dist/commands/pull-v4/generation-resolver.js +305 -0
- package/dist/commands/pull-v4/generation-resolver.js.map +1 -0
- package/dist/commands/pull-v4/generation-types.js +56 -0
- package/dist/commands/pull-v4/generation-types.js.map +1 -0
- package/dist/commands/pull-v4/generators/agent-generator.helpers.js +4 -10
- package/dist/commands/pull-v4/generators/agent-generator.helpers.js.map +1 -1
- package/dist/commands/pull-v4/generators/agent-generator.js +154 -81
- package/dist/commands/pull-v4/generators/agent-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/artifact-component-generator.js +48 -27
- package/dist/commands/pull-v4/generators/artifact-component-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/context-config-generator.js +147 -129
- package/dist/commands/pull-v4/generators/context-config-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/credential-generator.js +36 -14
- package/dist/commands/pull-v4/generators/credential-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/data-component-generator.js +55 -19
- package/dist/commands/pull-v4/generators/data-component-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/environment-generator.js +29 -33
- package/dist/commands/pull-v4/generators/environment-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/environment-settings-generator.js +57 -0
- package/dist/commands/pull-v4/generators/environment-settings-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/external-agent-generator.js +51 -23
- package/dist/commands/pull-v4/generators/external-agent-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/function-tool-generator.js +50 -14
- package/dist/commands/pull-v4/generators/function-tool-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/helpers/agent.js +129 -0
- package/dist/commands/pull-v4/generators/helpers/agent.js.map +1 -0
- package/dist/commands/pull-v4/generators/helpers/sub-agent.js +65 -0
- package/dist/commands/pull-v4/generators/helpers/sub-agent.js.map +1 -0
- package/dist/commands/pull-v4/generators/index.js +38 -0
- package/dist/commands/pull-v4/generators/index.js.map +1 -0
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js +48 -27
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/project-generator.js +144 -110
- package/dist/commands/pull-v4/generators/project-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/scheduled-trigger-generator.js +66 -0
- package/dist/commands/pull-v4/generators/scheduled-trigger-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/status-component-generator.js +55 -20
- package/dist/commands/pull-v4/generators/status-component-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js +4 -1
- package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js.map +1 -1
- package/dist/commands/pull-v4/generators/sub-agent-generator.js +282 -166
- package/dist/commands/pull-v4/generators/sub-agent-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/trigger-generator.js +62 -27
- package/dist/commands/pull-v4/generators/trigger-generator.js.map +1 -1
- package/dist/commands/pull-v4/import-plan.js +40 -0
- package/dist/commands/pull-v4/import-plan.js.map +1 -0
- package/dist/commands/pull-v4/introspect/index.js +11 -7
- package/dist/commands/pull-v4/introspect/index.js.map +1 -1
- package/dist/commands/pull-v4/introspect-generator.js +15 -1218
- package/dist/commands/pull-v4/introspect-generator.js.map +1 -1
- package/dist/commands/pull-v4/module-merge.js +14 -5
- package/dist/commands/pull-v4/module-merge.js.map +1 -1
- package/dist/commands/pull-v4/reference-resolution.js +111 -0
- package/dist/commands/pull-v4/reference-resolution.js.map +1 -0
- package/dist/commands/pull-v4/simple-factory-generator.js +54 -0
- package/dist/commands/pull-v4/simple-factory-generator.js.map +1 -0
- package/dist/commands/pull-v4/{generators/skill-generator.js → skill.js} +18 -6
- package/dist/commands/pull-v4/skill.js.map +1 -0
- package/dist/commands/pull-v4/typescript-file-writer.js +78 -0
- package/dist/commands/pull-v4/typescript-file-writer.js.map +1 -0
- package/dist/commands/pull-v4/utils/code-values.js +64 -0
- package/dist/commands/pull-v4/utils/code-values.js.map +1 -0
- package/dist/commands/pull-v4/utils/factory-writer.js +128 -0
- package/dist/commands/pull-v4/utils/factory-writer.js.map +1 -0
- package/dist/commands/pull-v4/utils/index.js +8 -0
- package/dist/commands/pull-v4/utils/naming.js +74 -0
- package/dist/commands/pull-v4/utils/naming.js.map +1 -0
- package/dist/commands/pull-v4/utils/schema-rendering.js +20 -0
- package/dist/commands/pull-v4/utils/schema-rendering.js.map +1 -0
- package/dist/commands/pull-v4/utils/shared.js +18 -0
- package/dist/commands/pull-v4/utils/shared.js.map +1 -0
- package/dist/commands/pull-v4/utils/templates.js +58 -0
- package/dist/commands/pull-v4/utils/templates.js.map +1 -0
- package/package.json +4 -4
- package/dist/commands/pull-v4/generators/skill-generator.js.map +0 -1
- package/dist/commands/pull-v4/scheduled-trigger-generator.js +0 -38
- package/dist/commands/pull-v4/scheduled-trigger-generator.js.map +0 -1
- package/dist/commands/pull-v4/utils.js +0 -320
- package/dist/commands/pull-v4/utils.js.map +0 -1
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { hasReferences } from "../utils/shared.js";
|
|
2
|
+
import { formatStringLiteral } from "../utils/templates.js";
|
|
3
|
+
import { codeExpression, createReferenceGetterValue } from "../utils/code-values.js";
|
|
4
|
+
import { toCamelCase } from "../utils/naming.js";
|
|
5
|
+
import { addValueToObject } from "../utils/factory-writer.js";
|
|
6
|
+
import "../utils/index.js";
|
|
7
|
+
import { getObjectKeys } from "../collector-common.js";
|
|
8
|
+
import { collectProjectReferenceOverrides, collectProjectReferencePathOverrides } from "../collector-reference-helpers.js";
|
|
9
|
+
import { addResolvedReferenceImports, resolveReferenceBindingsFromIds, toReferenceNames } from "../reference-resolution.js";
|
|
10
|
+
import { generateFactorySourceFile } from "../simple-factory-generator.js";
|
|
2
11
|
import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
|
|
3
12
|
import { z } from "zod";
|
|
13
|
+
import { join } from "node:path";
|
|
4
14
|
|
|
5
15
|
//#region src/commands/pull-v4/generators/project-generator.ts
|
|
6
16
|
const ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());
|
|
@@ -42,117 +52,141 @@ const ProjectSchema = z.strictObject({
|
|
|
42
52
|
referencePathOverrides: ReferencePathOverridesSchema.optional()
|
|
43
53
|
});
|
|
44
54
|
function generateProjectDefinition(data) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
return generateFactorySourceFile(data, {
|
|
56
|
+
schema: ProjectSchema,
|
|
57
|
+
factory: {
|
|
58
|
+
importName: "project",
|
|
59
|
+
variableName: (parsed) => toCamelCase(parsed.projectId)
|
|
60
|
+
},
|
|
61
|
+
render({ parsed, sourceFile, configObject }) {
|
|
62
|
+
const projectVariableName = toCamelCase(parsed.projectId);
|
|
63
|
+
const reservedReferenceNames = new Set([projectVariableName]);
|
|
64
|
+
if (hasReferences(parsed.skills)) {
|
|
65
|
+
sourceFile.getImportDeclarationOrThrow("@inkeep/agents-sdk").addNamedImport("loadSkills");
|
|
66
|
+
sourceFile.addImportDeclaration({
|
|
67
|
+
defaultImport: "path",
|
|
68
|
+
moduleSpecifier: "node:path"
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const { projectId, skills, agents, tools, externalAgents, dataComponents, artifactComponents, credentialReferences, referenceOverrides, referencePathOverrides, ...rest } = parsed;
|
|
72
|
+
const projectConfig = {
|
|
73
|
+
id: projectId,
|
|
74
|
+
...rest
|
|
75
|
+
};
|
|
76
|
+
if (hasReferences(skills)) projectConfig.skills = codeExpression(`() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`);
|
|
77
|
+
if (hasReferences(agents)) {
|
|
78
|
+
const resolvedReferences = resolveReferenceBindingsFromIds({
|
|
79
|
+
ids: agents,
|
|
80
|
+
reservedNames: reservedReferenceNames,
|
|
81
|
+
conflictSuffix: "Agent",
|
|
82
|
+
referenceOverrides: referenceOverrides?.agents,
|
|
83
|
+
referencePathOverrides: referencePathOverrides?.agents
|
|
84
|
+
});
|
|
85
|
+
addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {
|
|
86
|
+
return `./agents/${reference.modulePath}`;
|
|
87
|
+
});
|
|
88
|
+
projectConfig.agents = createReferenceGetterValue(toReferenceNames(resolvedReferences));
|
|
89
|
+
}
|
|
90
|
+
if (hasReferences(tools)) {
|
|
91
|
+
const resolvedReferences = resolveReferenceBindingsFromIds({
|
|
92
|
+
ids: tools,
|
|
93
|
+
reservedNames: reservedReferenceNames,
|
|
94
|
+
conflictSuffix: "Tool",
|
|
95
|
+
collisionStrategy: "numeric-for-duplicates",
|
|
96
|
+
referenceOverrides: referenceOverrides?.tools,
|
|
97
|
+
referencePathOverrides: referencePathOverrides?.tools
|
|
98
|
+
});
|
|
99
|
+
addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {
|
|
100
|
+
return `./tools/${reference.modulePath}`;
|
|
101
|
+
});
|
|
102
|
+
projectConfig.tools = createReferenceGetterValue(toReferenceNames(resolvedReferences));
|
|
103
|
+
}
|
|
104
|
+
if (hasReferences(externalAgents)) {
|
|
105
|
+
const resolvedReferences = resolveReferenceBindingsFromIds({
|
|
106
|
+
ids: externalAgents,
|
|
107
|
+
reservedNames: reservedReferenceNames,
|
|
108
|
+
conflictSuffix: "ExternalAgent",
|
|
109
|
+
referenceOverrides: referenceOverrides?.externalAgents,
|
|
110
|
+
referencePathOverrides: referencePathOverrides?.externalAgents
|
|
111
|
+
});
|
|
112
|
+
addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {
|
|
113
|
+
return `./external-agents/${reference.modulePath}`;
|
|
114
|
+
});
|
|
115
|
+
projectConfig.externalAgents = createReferenceGetterValue(toReferenceNames(resolvedReferences));
|
|
116
|
+
}
|
|
117
|
+
if (hasReferences(dataComponents)) {
|
|
118
|
+
const resolvedReferences = resolveReferenceBindingsFromIds({
|
|
119
|
+
ids: dataComponents,
|
|
120
|
+
reservedNames: reservedReferenceNames,
|
|
121
|
+
conflictSuffix: "DataComponent",
|
|
122
|
+
referenceOverrides: referenceOverrides?.dataComponents,
|
|
123
|
+
referencePathOverrides: referencePathOverrides?.dataComponents
|
|
124
|
+
});
|
|
125
|
+
addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {
|
|
126
|
+
return `./data-components/${reference.modulePath}`;
|
|
127
|
+
});
|
|
128
|
+
projectConfig.dataComponents = createReferenceGetterValue(toReferenceNames(resolvedReferences));
|
|
129
|
+
}
|
|
130
|
+
if (hasReferences(artifactComponents)) {
|
|
131
|
+
const resolvedReferences = resolveReferenceBindingsFromIds({
|
|
132
|
+
ids: artifactComponents,
|
|
133
|
+
reservedNames: reservedReferenceNames,
|
|
134
|
+
conflictSuffix: "ArtifactComponent",
|
|
135
|
+
referenceOverrides: referenceOverrides?.artifactComponents,
|
|
136
|
+
referencePathOverrides: referencePathOverrides?.artifactComponents
|
|
137
|
+
});
|
|
138
|
+
addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {
|
|
139
|
+
return `./artifact-components/${reference.modulePath}`;
|
|
140
|
+
});
|
|
141
|
+
projectConfig.artifactComponents = createReferenceGetterValue(toReferenceNames(resolvedReferences));
|
|
142
|
+
}
|
|
143
|
+
if (hasReferences(credentialReferences)) {
|
|
144
|
+
const resolvedReferences = resolveReferenceBindingsFromIds({
|
|
145
|
+
ids: credentialReferences,
|
|
146
|
+
reservedNames: reservedReferenceNames,
|
|
147
|
+
conflictSuffix: "CredentialReference",
|
|
148
|
+
collisionStrategy: "numeric",
|
|
149
|
+
referenceOverrides: referenceOverrides?.credentialReferences,
|
|
150
|
+
referencePathOverrides: referencePathOverrides?.credentialReferences
|
|
151
|
+
});
|
|
152
|
+
addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {
|
|
153
|
+
return `./credentials/${reference.modulePath}`;
|
|
154
|
+
});
|
|
155
|
+
projectConfig.credentialReferences = createReferenceGetterValue(toReferenceNames(resolvedReferences));
|
|
156
|
+
}
|
|
157
|
+
for (const [key, value] of Object.entries(projectConfig)) addValueToObject(configObject, key, value);
|
|
158
|
+
}
|
|
53
159
|
});
|
|
54
|
-
const reservedReferenceNames = new Set([projectVariableName]);
|
|
55
|
-
if (hasReferences(parsed.skills)) {
|
|
56
|
-
sourceFile.getImportDeclarationOrThrow("@inkeep/agents-sdk").addNamedImport("loadSkills");
|
|
57
|
-
sourceFile.addImportDeclaration({
|
|
58
|
-
defaultImport: "path",
|
|
59
|
-
moduleSpecifier: "node:path"
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
const { projectId, skills, agents, tools, externalAgents, dataComponents, artifactComponents, credentialReferences, referenceOverrides, referencePathOverrides, ...rest } = parsed;
|
|
63
|
-
const credentialReferenceResolved = hasReferences(credentialReferences) ? createResolvedReferences(credentialReferences, referenceOverrides?.credentialReferences, referencePathOverrides?.credentialReferences, reservedReferenceNames, "CredentialReference", "numeric") : void 0;
|
|
64
|
-
for (const [key, value] of Object.entries({
|
|
65
|
-
id: projectId,
|
|
66
|
-
...rest
|
|
67
|
-
})) addValueToObject(configObject, key, value);
|
|
68
|
-
if (hasReferences(skills)) configObject.addPropertyAssignment({
|
|
69
|
-
name: "skills",
|
|
70
|
-
initializer: `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`
|
|
71
|
-
});
|
|
72
|
-
if (hasReferences(agents)) {
|
|
73
|
-
const resolvedReferences = createResolvedReferences(agents, referenceOverrides?.agents, referencePathOverrides?.agents, reservedReferenceNames, "Agent");
|
|
74
|
-
addReferenceImports(sourceFile, resolvedReferences, "./agents");
|
|
75
|
-
addReferenceGetterProperty(configObject, "agents", toReferenceNames(resolvedReferences));
|
|
76
|
-
}
|
|
77
|
-
if (hasReferences(tools)) {
|
|
78
|
-
const resolvedReferences = createResolvedReferences(tools, referenceOverrides?.tools, referencePathOverrides?.tools, reservedReferenceNames, "Tool", "numeric-for-duplicates");
|
|
79
|
-
addReferenceImports(sourceFile, resolvedReferences, "./tools");
|
|
80
|
-
addReferenceGetterProperty(configObject, "tools", toReferenceNames(resolvedReferences));
|
|
81
|
-
}
|
|
82
|
-
if (hasReferences(externalAgents)) {
|
|
83
|
-
const resolvedReferences = createResolvedReferences(externalAgents, referenceOverrides?.externalAgents, referencePathOverrides?.externalAgents, reservedReferenceNames, "ExternalAgent");
|
|
84
|
-
addReferenceImports(sourceFile, resolvedReferences, "./external-agents");
|
|
85
|
-
addReferenceGetterProperty(configObject, "externalAgents", toReferenceNames(resolvedReferences));
|
|
86
|
-
}
|
|
87
|
-
if (hasReferences(dataComponents)) {
|
|
88
|
-
const resolvedReferences = createResolvedReferences(dataComponents, referenceOverrides?.dataComponents, referencePathOverrides?.dataComponents, reservedReferenceNames, "DataComponent");
|
|
89
|
-
addReferenceImports(sourceFile, resolvedReferences, "./data-components");
|
|
90
|
-
addReferenceGetterProperty(configObject, "dataComponents", toReferenceNames(resolvedReferences));
|
|
91
|
-
}
|
|
92
|
-
if (hasReferences(artifactComponents)) {
|
|
93
|
-
const resolvedReferences = createResolvedReferences(artifactComponents, referenceOverrides?.artifactComponents, referencePathOverrides?.artifactComponents, reservedReferenceNames, "ArtifactComponent");
|
|
94
|
-
addReferenceImports(sourceFile, resolvedReferences, "./artifact-components");
|
|
95
|
-
addReferenceGetterProperty(configObject, "artifactComponents", toReferenceNames(resolvedReferences));
|
|
96
|
-
}
|
|
97
|
-
if (hasReferences(credentialReferences)) {
|
|
98
|
-
const resolvedReferences = credentialReferenceResolved ?? [];
|
|
99
|
-
addReferenceImports(sourceFile, resolvedReferences, "./credentials");
|
|
100
|
-
addReferenceGetterProperty(configObject, "credentialReferences", toReferenceNames(resolvedReferences));
|
|
101
|
-
}
|
|
102
|
-
return sourceFile;
|
|
103
|
-
}
|
|
104
|
-
function addReferenceImports(sourceFile, references, basePath) {
|
|
105
|
-
for (const reference of references) sourceFile.addImportDeclaration({
|
|
106
|
-
namedImports: [reference.importName === reference.localName ? reference.importName : {
|
|
107
|
-
name: reference.importName,
|
|
108
|
-
alias: reference.localName
|
|
109
|
-
}],
|
|
110
|
-
moduleSpecifier: `${basePath}/${reference.modulePath}`
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
function toReferenceNames(references) {
|
|
114
|
-
return references.map((reference) => reference.localName);
|
|
115
|
-
}
|
|
116
|
-
function createResolvedReferences(references, referenceOverrides, referencePathOverrides, reservedReferenceNames, suffix, collisionStrategy = "descriptive") {
|
|
117
|
-
const seenIds = /* @__PURE__ */ new Set();
|
|
118
|
-
const normalizedReferences = [];
|
|
119
|
-
for (const referenceId of references) {
|
|
120
|
-
if (seenIds.has(referenceId)) continue;
|
|
121
|
-
seenIds.add(referenceId);
|
|
122
|
-
normalizedReferences.push({
|
|
123
|
-
id: referenceId,
|
|
124
|
-
importName: resolveReferenceName(referenceId, [referenceOverrides]),
|
|
125
|
-
modulePath: resolveReferenceModulePath(referenceId, referencePathOverrides?.[referenceId])
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
const importNameCounts = /* @__PURE__ */ new Map();
|
|
129
|
-
for (const reference of normalizedReferences) importNameCounts.set(reference.importName, (importNameCounts.get(reference.importName) ?? 0) + 1);
|
|
130
|
-
return normalizedReferences.map((reference) => {
|
|
131
|
-
const localName = collisionStrategy === "numeric" || collisionStrategy === "numeric-for-duplicates" && (importNameCounts.get(reference.importName) ?? 0) > 1 ? createNumericReferenceName(reference.importName, reservedReferenceNames) : createUniqueReferenceName(reference.importName, reservedReferenceNames, suffix);
|
|
132
|
-
return {
|
|
133
|
-
id: reference.id,
|
|
134
|
-
importName: reference.importName,
|
|
135
|
-
localName,
|
|
136
|
-
modulePath: reference.modulePath
|
|
137
|
-
};
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
function createNumericReferenceName(baseName, reservedNames) {
|
|
141
|
-
if (!reservedNames.has(baseName)) {
|
|
142
|
-
reservedNames.add(baseName);
|
|
143
|
-
return baseName;
|
|
144
|
-
}
|
|
145
|
-
let index = 1;
|
|
146
|
-
while (reservedNames.has(`${baseName}${index}`)) index += 1;
|
|
147
|
-
const uniqueName = `${baseName}${index}`;
|
|
148
|
-
reservedNames.add(uniqueName);
|
|
149
|
-
return uniqueName;
|
|
150
|
-
}
|
|
151
|
-
function resolveReferenceModulePath(referenceId, referencePathOverride) {
|
|
152
|
-
if (referencePathOverride && referencePathOverride.length > 0) return referencePathOverride.replace(/\.tsx?$/, "");
|
|
153
|
-
return buildComponentFileName(referenceId).replace(/\.tsx?$/, "");
|
|
154
160
|
}
|
|
161
|
+
const task = {
|
|
162
|
+
type: "project",
|
|
163
|
+
collect(context) {
|
|
164
|
+
const referenceOverrides = collectProjectReferenceOverrides(context);
|
|
165
|
+
const referencePathOverrides = collectProjectReferencePathOverrides(context);
|
|
166
|
+
return [{
|
|
167
|
+
id: context.project.id,
|
|
168
|
+
filePath: context.resolver.resolveOutputFilePath("project", context.project.id, join(context.paths.projectRoot, "index.ts")),
|
|
169
|
+
payload: {
|
|
170
|
+
projectId: context.project.id,
|
|
171
|
+
name: context.project.name,
|
|
172
|
+
description: context.project.description,
|
|
173
|
+
models: context.project.models,
|
|
174
|
+
stopWhen: context.project.stopWhen,
|
|
175
|
+
skills: getObjectKeys(context.project.skills),
|
|
176
|
+
agents: [...context.completeAgentIds],
|
|
177
|
+
tools: getObjectKeys(context.project.tools),
|
|
178
|
+
externalAgents: getObjectKeys(context.project.externalAgents),
|
|
179
|
+
dataComponents: getObjectKeys(context.project.dataComponents),
|
|
180
|
+
artifactComponents: getObjectKeys(context.project.artifactComponents),
|
|
181
|
+
credentialReferences: getObjectKeys(context.project.credentialReferences),
|
|
182
|
+
...referenceOverrides && { referenceOverrides },
|
|
183
|
+
...referencePathOverrides && { referencePathOverrides }
|
|
184
|
+
}
|
|
185
|
+
}];
|
|
186
|
+
},
|
|
187
|
+
generate: generateProjectDefinition
|
|
188
|
+
};
|
|
155
189
|
|
|
156
190
|
//#endregion
|
|
157
|
-
export { generateProjectDefinition };
|
|
191
|
+
export { generateProjectDefinition, task };
|
|
158
192
|
//# sourceMappingURL=project-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/project-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n addReferenceGetterProperty,\n addValueToObject,\n buildComponentFileName,\n createFactoryDefinition,\n createUniqueReferenceName,\n formatStringLiteral,\n hasReferences,\n resolveReferenceName,\n toCamelCase,\n} from '../utils';\n\nconst ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());\n\nconst ReferenceOverridesSchema = z.object({\n agents: ReferenceNameByIdSchema.optional(),\n tools: ReferenceNameByIdSchema.optional(),\n externalAgents: ReferenceNameByIdSchema.optional(),\n dataComponents: ReferenceNameByIdSchema.optional(),\n artifactComponents: ReferenceNameByIdSchema.optional(),\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\nconst ReferencePathOverridesSchema = z.object({\n agents: ReferenceNameByIdSchema.optional(),\n tools: ReferenceNameByIdSchema.optional(),\n externalAgents: ReferenceNameByIdSchema.optional(),\n dataComponents: ReferenceNameByIdSchema.optional(),\n artifactComponents: ReferenceNameByIdSchema.optional(),\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\ninterface ResolvedReference {\n id: string;\n importName: string;\n localName: string;\n modulePath: string;\n}\n\ntype CollisionStrategy = 'descriptive' | 'numeric' | 'numeric-for-duplicates';\n\nconst MySchema = FullProjectDefinitionSchema.pick({\n name: true,\n description: true,\n models: true,\n stopWhen: true,\n});\n\nconst ProjectSchema = z.strictObject({\n projectId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v || undefined, MySchema.shape.description),\n // Invalid input: expected object, received null\n stopWhen: z.preprocess(\n (v) => (v && Object.keys(v).length && v) || undefined,\n MySchema.shape.stopWhen\n ),\n skills: z.array(z.string()).optional(),\n agents: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional(),\n externalAgents: z.array(z.string()).optional(),\n dataComponents: z.array(z.string()).optional(),\n artifactComponents: z.array(z.string()).optional(),\n credentialReferences: z.array(z.string()).optional(),\n referenceOverrides: ReferenceOverridesSchema.optional(),\n referencePathOverrides: ReferencePathOverridesSchema.optional(),\n});\n\ntype ProjectInput = z.input<typeof ProjectSchema>;\n\nexport function generateProjectDefinition(data: ProjectInput): SourceFile {\n const result = ProjectSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for project:\n${z.prettifyError(result.error)}`);\n }\n\n const parsed = result.data;\n const projectVariableName = toCamelCase(parsed.projectId);\n const { sourceFile, configObject } = createFactoryDefinition({\n importName: 'project',\n variableName: projectVariableName,\n });\n const reservedReferenceNames = new Set([projectVariableName]);\n if (hasReferences(parsed.skills)) {\n sourceFile.getImportDeclarationOrThrow('@inkeep/agents-sdk').addNamedImport('loadSkills');\n sourceFile.addImportDeclaration({\n defaultImport: 'path',\n moduleSpecifier: 'node:path',\n });\n }\n\n const {\n projectId,\n skills,\n agents,\n tools,\n externalAgents,\n dataComponents,\n artifactComponents,\n credentialReferences,\n referenceOverrides,\n referencePathOverrides,\n ...rest\n } = parsed;\n\n const credentialReferenceResolved = hasReferences(credentialReferences)\n ? createResolvedReferences(\n credentialReferences,\n referenceOverrides?.credentialReferences,\n referencePathOverrides?.credentialReferences,\n reservedReferenceNames,\n 'CredentialReference',\n 'numeric'\n )\n : undefined;\n\n for (const [key, value] of Object.entries({\n id: projectId,\n ...rest,\n })) {\n addValueToObject(configObject, key, value);\n }\n\n if (hasReferences(skills)) {\n configObject.addPropertyAssignment({\n name: 'skills',\n initializer: `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`,\n });\n }\n\n if (hasReferences(agents)) {\n const resolvedReferences = createResolvedReferences(\n agents,\n referenceOverrides?.agents,\n referencePathOverrides?.agents,\n reservedReferenceNames,\n 'Agent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './agents');\n addReferenceGetterProperty(configObject, 'agents', toReferenceNames(resolvedReferences));\n }\n\n if (hasReferences(tools)) {\n const resolvedReferences = createResolvedReferences(\n tools,\n referenceOverrides?.tools,\n referencePathOverrides?.tools,\n reservedReferenceNames,\n 'Tool',\n 'numeric-for-duplicates'\n );\n addReferenceImports(sourceFile, resolvedReferences, './tools');\n addReferenceGetterProperty(configObject, 'tools', toReferenceNames(resolvedReferences));\n }\n\n if (hasReferences(externalAgents)) {\n const resolvedReferences = createResolvedReferences(\n externalAgents,\n referenceOverrides?.externalAgents,\n referencePathOverrides?.externalAgents,\n reservedReferenceNames,\n 'ExternalAgent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './external-agents');\n addReferenceGetterProperty(\n configObject,\n 'externalAgents',\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(dataComponents)) {\n const resolvedReferences = createResolvedReferences(\n dataComponents,\n referenceOverrides?.dataComponents,\n referencePathOverrides?.dataComponents,\n reservedReferenceNames,\n 'DataComponent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './data-components');\n addReferenceGetterProperty(\n configObject,\n 'dataComponents',\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(artifactComponents)) {\n const resolvedReferences = createResolvedReferences(\n artifactComponents,\n referenceOverrides?.artifactComponents,\n referencePathOverrides?.artifactComponents,\n reservedReferenceNames,\n 'ArtifactComponent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './artifact-components');\n addReferenceGetterProperty(\n configObject,\n 'artifactComponents',\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(credentialReferences)) {\n const resolvedReferences = credentialReferenceResolved ?? [];\n addReferenceImports(sourceFile, resolvedReferences, './credentials');\n addReferenceGetterProperty(\n configObject,\n 'credentialReferences',\n toReferenceNames(resolvedReferences)\n );\n }\n\n return sourceFile;\n}\n\nfunction addReferenceImports(\n sourceFile: SourceFile,\n references: ResolvedReference[],\n basePath: string\n): void {\n for (const reference of references) {\n sourceFile.addImportDeclaration({\n namedImports: [\n reference.importName === reference.localName\n ? reference.importName\n : { name: reference.importName, alias: reference.localName },\n ],\n moduleSpecifier: `${basePath}/${reference.modulePath}`,\n });\n }\n}\n\nfunction toReferenceNames(references: ResolvedReference[]): string[] {\n return references.map((reference) => reference.localName);\n}\n\nfunction createResolvedReferences(\n references: string[],\n referenceOverrides: Record<string, string> | undefined,\n referencePathOverrides: Record<string, string> | undefined,\n reservedReferenceNames: Set<string>,\n suffix: string,\n collisionStrategy: CollisionStrategy = 'descriptive'\n): ResolvedReference[] {\n const seenIds = new Set<string>();\n const normalizedReferences: Array<{\n id: string;\n importName: string;\n modulePath: string;\n }> = [];\n\n for (const referenceId of references) {\n if (seenIds.has(referenceId)) {\n continue;\n }\n seenIds.add(referenceId);\n\n normalizedReferences.push({\n id: referenceId,\n importName: resolveReferenceName(referenceId, [referenceOverrides]),\n modulePath: resolveReferenceModulePath(referenceId, referencePathOverrides?.[referenceId]),\n });\n }\n\n const importNameCounts = new Map<string, number>();\n for (const reference of normalizedReferences) {\n importNameCounts.set(\n reference.importName,\n (importNameCounts.get(reference.importName) ?? 0) + 1\n );\n }\n\n return normalizedReferences.map((reference) => {\n const shouldUseNumeric =\n collisionStrategy === 'numeric' ||\n (collisionStrategy === 'numeric-for-duplicates' &&\n (importNameCounts.get(reference.importName) ?? 0) > 1);\n\n const localName = shouldUseNumeric\n ? createNumericReferenceName(reference.importName, reservedReferenceNames)\n : createUniqueReferenceName(reference.importName, reservedReferenceNames, suffix);\n\n return {\n id: reference.id,\n importName: reference.importName,\n localName,\n modulePath: reference.modulePath,\n };\n });\n}\n\nfunction createNumericReferenceName(baseName: string, reservedNames: Set<string>): string {\n if (!reservedNames.has(baseName)) {\n reservedNames.add(baseName);\n return baseName;\n }\n\n let index = 1;\n while (reservedNames.has(`${baseName}${index}`)) {\n index += 1;\n }\n\n const uniqueName = `${baseName}${index}`;\n reservedNames.add(uniqueName);\n return uniqueName;\n}\n\nfunction resolveReferenceModulePath(\n referenceId: string,\n referencePathOverride: string | undefined\n): string {\n if (referencePathOverride && referencePathOverride.length > 0) {\n return referencePathOverride.replace(/\\.tsx?$/, '');\n }\n\n const fileName = buildComponentFileName(referenceId);\n return fileName.replace(/\\.tsx?$/, '');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"project-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/project-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { getObjectKeys } from '../collector-common';\nimport {\n collectProjectReferenceOverrides,\n collectProjectReferencePathOverrides,\n} from '../collector-reference-helpers';\nimport type { GenerationTask } from '../generation-types';\nimport {\n addResolvedReferenceImports,\n resolveReferenceBindingsFromIds,\n toReferenceNames,\n} from '../reference-resolution';\nimport { generateFactorySourceFile } from '../simple-factory-generator';\nimport {\n addValueToObject,\n codeExpression,\n createReferenceGetterValue,\n formatStringLiteral,\n hasReferences,\n toCamelCase,\n} from '../utils';\n\nconst ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());\n\nconst ReferenceOverridesSchema = z.object({\n agents: ReferenceNameByIdSchema.optional(),\n tools: ReferenceNameByIdSchema.optional(),\n externalAgents: ReferenceNameByIdSchema.optional(),\n dataComponents: ReferenceNameByIdSchema.optional(),\n artifactComponents: ReferenceNameByIdSchema.optional(),\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\nconst ReferencePathOverridesSchema = z.object({\n agents: ReferenceNameByIdSchema.optional(),\n tools: ReferenceNameByIdSchema.optional(),\n externalAgents: ReferenceNameByIdSchema.optional(),\n dataComponents: ReferenceNameByIdSchema.optional(),\n artifactComponents: ReferenceNameByIdSchema.optional(),\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\nconst MySchema = FullProjectDefinitionSchema.pick({\n name: true,\n description: true,\n models: true,\n stopWhen: true,\n});\n\nconst ProjectSchema = z.strictObject({\n projectId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v || undefined, MySchema.shape.description),\n // Invalid input: expected object, received null\n stopWhen: z.preprocess(\n (v) => (v && Object.keys(v).length && v) || undefined,\n MySchema.shape.stopWhen\n ),\n skills: z.array(z.string()).optional(),\n agents: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional(),\n externalAgents: z.array(z.string()).optional(),\n dataComponents: z.array(z.string()).optional(),\n artifactComponents: z.array(z.string()).optional(),\n credentialReferences: z.array(z.string()).optional(),\n referenceOverrides: ReferenceOverridesSchema.optional(),\n referencePathOverrides: ReferencePathOverridesSchema.optional(),\n});\n\ntype ProjectInput = z.input<typeof ProjectSchema>;\n\nexport function generateProjectDefinition(data: ProjectInput): SourceFile {\n return generateFactorySourceFile(data, {\n schema: ProjectSchema,\n factory: {\n importName: 'project',\n variableName: (parsed) => toCamelCase(parsed.projectId),\n },\n render({ parsed, sourceFile, configObject }) {\n const projectVariableName = toCamelCase(parsed.projectId);\n const reservedReferenceNames = new Set([projectVariableName]);\n if (hasReferences(parsed.skills)) {\n sourceFile.getImportDeclarationOrThrow('@inkeep/agents-sdk').addNamedImport('loadSkills');\n sourceFile.addImportDeclaration({\n defaultImport: 'path',\n moduleSpecifier: 'node:path',\n });\n }\n\n const {\n projectId,\n skills,\n agents,\n tools,\n externalAgents,\n dataComponents,\n artifactComponents,\n credentialReferences,\n referenceOverrides,\n referencePathOverrides,\n ...rest\n } = parsed;\n\n const projectConfig: Record<string, unknown> = {\n id: projectId,\n ...rest,\n };\n\n if (hasReferences(skills)) {\n projectConfig.skills = codeExpression(\n `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`\n );\n }\n\n if (hasReferences(agents)) {\n const resolvedReferences = resolveReferenceBindingsFromIds({\n ids: agents,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'Agent',\n referenceOverrides: referenceOverrides?.agents,\n referencePathOverrides: referencePathOverrides?.agents,\n });\n addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {\n return `./agents/${reference.modulePath}`;\n });\n projectConfig.agents = createReferenceGetterValue(toReferenceNames(resolvedReferences));\n }\n\n if (hasReferences(tools)) {\n const resolvedReferences = resolveReferenceBindingsFromIds({\n ids: tools,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'Tool',\n collisionStrategy: 'numeric-for-duplicates',\n referenceOverrides: referenceOverrides?.tools,\n referencePathOverrides: referencePathOverrides?.tools,\n });\n addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {\n return `./tools/${reference.modulePath}`;\n });\n projectConfig.tools = createReferenceGetterValue(toReferenceNames(resolvedReferences));\n }\n\n if (hasReferences(externalAgents)) {\n const resolvedReferences = resolveReferenceBindingsFromIds({\n ids: externalAgents,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'ExternalAgent',\n referenceOverrides: referenceOverrides?.externalAgents,\n referencePathOverrides: referencePathOverrides?.externalAgents,\n });\n addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {\n return `./external-agents/${reference.modulePath}`;\n });\n projectConfig.externalAgents = createReferenceGetterValue(\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(dataComponents)) {\n const resolvedReferences = resolveReferenceBindingsFromIds({\n ids: dataComponents,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'DataComponent',\n referenceOverrides: referenceOverrides?.dataComponents,\n referencePathOverrides: referencePathOverrides?.dataComponents,\n });\n addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {\n return `./data-components/${reference.modulePath}`;\n });\n projectConfig.dataComponents = createReferenceGetterValue(\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(artifactComponents)) {\n const resolvedReferences = resolveReferenceBindingsFromIds({\n ids: artifactComponents,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'ArtifactComponent',\n referenceOverrides: referenceOverrides?.artifactComponents,\n referencePathOverrides: referencePathOverrides?.artifactComponents,\n });\n addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {\n return `./artifact-components/${reference.modulePath}`;\n });\n projectConfig.artifactComponents = createReferenceGetterValue(\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(credentialReferences)) {\n const resolvedReferences = resolveReferenceBindingsFromIds({\n ids: credentialReferences,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'CredentialReference',\n collisionStrategy: 'numeric',\n referenceOverrides: referenceOverrides?.credentialReferences,\n referencePathOverrides: referencePathOverrides?.credentialReferences,\n });\n addResolvedReferenceImports(sourceFile, resolvedReferences, (reference) => {\n return `./credentials/${reference.modulePath}`;\n });\n projectConfig.credentialReferences = createReferenceGetterValue(\n toReferenceNames(resolvedReferences)\n );\n }\n\n for (const [key, value] of Object.entries(projectConfig)) {\n addValueToObject(configObject, key, value);\n }\n },\n });\n}\n\nexport const task = {\n type: 'project',\n collect(context) {\n const referenceOverrides = collectProjectReferenceOverrides(context);\n const referencePathOverrides = collectProjectReferencePathOverrides(context);\n\n return [\n {\n id: context.project.id,\n filePath: context.resolver.resolveOutputFilePath(\n 'project',\n context.project.id,\n join(context.paths.projectRoot, 'index.ts')\n ),\n payload: {\n projectId: context.project.id,\n name: context.project.name,\n description: context.project.description,\n models: context.project.models,\n stopWhen: context.project.stopWhen,\n skills: getObjectKeys(context.project.skills),\n agents: [...context.completeAgentIds],\n tools: getObjectKeys(context.project.tools),\n externalAgents: getObjectKeys(context.project.externalAgents),\n dataComponents: getObjectKeys(context.project.dataComponents),\n artifactComponents: getObjectKeys(context.project.artifactComponents),\n credentialReferences: getObjectKeys(context.project.credentialReferences),\n ...(referenceOverrides && { referenceOverrides }),\n ...(referencePathOverrides && { referencePathOverrides }),\n } as Parameters<typeof generateProjectDefinition>[0],\n },\n ];\n },\n generate: generateProjectDefinition,\n} satisfies GenerationTask<Parameters<typeof generateProjectDefinition>[0]>;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { toTriggerReferenceName } from "../utils/naming.js";
|
|
2
|
+
import "../utils/index.js";
|
|
3
|
+
import { buildSequentialNameFileNames } from "../generation-resolver.js";
|
|
4
|
+
import { generateSimpleFactoryDefinition } from "../simple-factory-generator.js";
|
|
5
|
+
import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { SyntaxKind } from "ts-morph";
|
|
9
|
+
|
|
10
|
+
//#region src/commands/pull-v4/generators/scheduled-trigger-generator.ts
|
|
11
|
+
const MySchema = FullProjectDefinitionSchema.shape.agents.valueType.shape.scheduledTriggers.unwrap().valueType.omit({
|
|
12
|
+
id: true,
|
|
13
|
+
runAsUserId: true,
|
|
14
|
+
createdBy: true
|
|
15
|
+
});
|
|
16
|
+
const ScheduledTriggerSchema = z.strictObject({
|
|
17
|
+
scheduledTriggerId: z.string().nonempty(),
|
|
18
|
+
...MySchema.shape,
|
|
19
|
+
description: z.preprocess((v) => v ?? void 0, MySchema.shape.description),
|
|
20
|
+
runAt: z.preprocess((v) => v ?? void 0, MySchema.shape.runAt),
|
|
21
|
+
payload: z.preprocess((v) => v ?? void 0, MySchema.shape.payload)
|
|
22
|
+
});
|
|
23
|
+
function generateScheduledTriggerDefinition({ id, runAsUserId, createdBy, ...data }) {
|
|
24
|
+
return generateSimpleFactoryDefinition(data, {
|
|
25
|
+
schema: ScheduledTriggerSchema,
|
|
26
|
+
factory: {
|
|
27
|
+
importName: "ScheduledTrigger",
|
|
28
|
+
variableName: (parsed) => toTriggerReferenceName(parsed.name),
|
|
29
|
+
syntaxKind: SyntaxKind.NewExpression
|
|
30
|
+
},
|
|
31
|
+
buildConfig(parsed) {
|
|
32
|
+
const { scheduledTriggerId, ...rest } = parsed;
|
|
33
|
+
return {
|
|
34
|
+
id: scheduledTriggerId,
|
|
35
|
+
...rest
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const task = {
|
|
41
|
+
type: "scheduled-trigger",
|
|
42
|
+
collect(context) {
|
|
43
|
+
if (!context.project.agents) return [];
|
|
44
|
+
const records = [];
|
|
45
|
+
for (const agentId of context.completeAgentIds) {
|
|
46
|
+
const agentData = context.project.agents[agentId];
|
|
47
|
+
if (!agentData?.scheduledTriggers) continue;
|
|
48
|
+
const scheduledTriggerEntries = Object.entries(agentData.scheduledTriggers);
|
|
49
|
+
const fileNamesByScheduledTriggerId = buildSequentialNameFileNames(scheduledTriggerEntries);
|
|
50
|
+
for (const [scheduledTriggerId, scheduledTriggerData] of scheduledTriggerEntries) records.push({
|
|
51
|
+
id: scheduledTriggerId,
|
|
52
|
+
filePath: context.resolver.resolveOutputFilePath("scheduledTriggers", scheduledTriggerId, join(context.paths.agentsDir, "scheduled-triggers", fileNamesByScheduledTriggerId[scheduledTriggerId])),
|
|
53
|
+
payload: {
|
|
54
|
+
scheduledTriggerId,
|
|
55
|
+
...scheduledTriggerData
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return records;
|
|
60
|
+
},
|
|
61
|
+
generate: generateScheduledTriggerDefinition
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
export { generateScheduledTriggerDefinition, task };
|
|
66
|
+
//# sourceMappingURL=scheduled-trigger-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduled-trigger-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/scheduled-trigger-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport { type SourceFile, SyntaxKind } from 'ts-morph';\nimport { z } from 'zod';\nimport { buildSequentialNameFileNames } from '../generation-resolver';\nimport type { GenerationTask } from '../generation-types';\nimport { generateSimpleFactoryDefinition } from '../simple-factory-generator';\nimport { toTriggerReferenceName } from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.agents.valueType.shape.scheduledTriggers\n .unwrap()\n .valueType.omit({\n id: true,\n runAsUserId: true,\n createdBy: true,\n });\n\nconst ScheduledTriggerSchema = z.strictObject({\n scheduledTriggerId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v ?? undefined, MySchema.shape.description),\n runAt: z.preprocess((v) => v ?? undefined, MySchema.shape.runAt),\n payload: z.preprocess((v) => v ?? undefined, MySchema.shape.payload),\n});\n\ntype ScheduledTriggerInput = z.input<typeof ScheduledTriggerSchema>;\n\nexport function generateScheduledTriggerDefinition({\n id,\n runAsUserId,\n createdBy,\n ...data\n}: ScheduledTriggerInput & Record<string, unknown>): SourceFile {\n return generateSimpleFactoryDefinition(data, {\n schema: ScheduledTriggerSchema,\n factory: {\n importName: 'ScheduledTrigger',\n variableName: (parsed) => toTriggerReferenceName(parsed.name),\n syntaxKind: SyntaxKind.NewExpression,\n },\n buildConfig(parsed) {\n const { scheduledTriggerId, ...rest } = parsed;\n return {\n id: scheduledTriggerId,\n ...rest,\n };\n },\n });\n}\n\nexport const task = {\n type: 'scheduled-trigger',\n collect(context) {\n if (!context.project.agents) {\n return [];\n }\n\n const records = [];\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n if (!agentData?.scheduledTriggers) {\n continue;\n }\n\n const scheduledTriggerEntries = Object.entries(agentData.scheduledTriggers);\n const fileNamesByScheduledTriggerId = buildSequentialNameFileNames(scheduledTriggerEntries);\n\n for (const [scheduledTriggerId, scheduledTriggerData] of scheduledTriggerEntries) {\n records.push({\n id: scheduledTriggerId,\n filePath: context.resolver.resolveOutputFilePath(\n 'scheduledTriggers',\n scheduledTriggerId,\n join(\n context.paths.agentsDir,\n 'scheduled-triggers',\n fileNamesByScheduledTriggerId[scheduledTriggerId]\n )\n ),\n payload: {\n scheduledTriggerId,\n ...scheduledTriggerData,\n } as Parameters<typeof generateScheduledTriggerDefinition>[0],\n });\n }\n }\n\n return records;\n },\n generate: generateScheduledTriggerDefinition,\n} satisfies GenerationTask<Parameters<typeof generateScheduledTriggerDefinition>[0]>;\n"],"mappings":";;;;;;;;;;AASA,MAAM,WAAW,4BAA4B,MAAM,OAAO,UAAU,MAAM,kBACvE,QAAQ,CACR,UAAU,KAAK;CACd,IAAI;CACJ,aAAa;CACb,WAAW;CACZ,CAAC;AAEJ,MAAM,yBAAyB,EAAE,aAAa;CAC5C,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,GAAG,SAAS;CACZ,aAAa,EAAE,YAAY,MAAM,KAAK,QAAW,SAAS,MAAM,YAAY;CAC5E,OAAO,EAAE,YAAY,MAAM,KAAK,QAAW,SAAS,MAAM,MAAM;CAChE,SAAS,EAAE,YAAY,MAAM,KAAK,QAAW,SAAS,MAAM,QAAQ;CACrE,CAAC;AAIF,SAAgB,mCAAmC,EACjD,IACA,aACA,WACA,GAAG,QAC2D;AAC9D,QAAO,gCAAgC,MAAM;EAC3C,QAAQ;EACR,SAAS;GACP,YAAY;GACZ,eAAe,WAAW,uBAAuB,OAAO,KAAK;GAC7D,YAAY,WAAW;GACxB;EACD,YAAY,QAAQ;GAClB,MAAM,EAAE,oBAAoB,GAAG,SAAS;AACxC,UAAO;IACL,IAAI;IACJ,GAAG;IACJ;;EAEJ,CAAC;;AAGJ,MAAa,OAAO;CAClB,MAAM;CACN,QAAQ,SAAS;AACf,MAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;EAGX,MAAM,UAAU,EAAE;AAClB,OAAK,MAAM,WAAW,QAAQ,kBAAkB;GAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;AACzC,OAAI,CAAC,WAAW,kBACd;GAGF,MAAM,0BAA0B,OAAO,QAAQ,UAAU,kBAAkB;GAC3E,MAAM,gCAAgC,6BAA6B,wBAAwB;AAE3F,QAAK,MAAM,CAAC,oBAAoB,yBAAyB,wBACvD,SAAQ,KAAK;IACX,IAAI;IACJ,UAAU,QAAQ,SAAS,sBACzB,qBACA,oBACA,KACE,QAAQ,MAAM,WACd,sBACA,8BAA8B,oBAC/B,CACF;IACD,SAAS;KACP;KACA,GAAG;KACJ;IACF,CAAC;;AAIN,SAAO;;CAET,UAAU;CACX"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { codeExpression } from "../utils/code-values.js";
|
|
2
|
+
import { buildComponentFileName, toCamelCase } from "../utils/naming.js";
|
|
3
|
+
import { addValueToObject } from "../utils/factory-writer.js";
|
|
4
|
+
import { convertJsonSchemaToZodSafe } from "../utils/schema-rendering.js";
|
|
5
|
+
import "../utils/index.js";
|
|
6
|
+
import { asRecord, resolveStatusComponentId } from "../collector-common.js";
|
|
7
|
+
import { generateFactorySourceFile } from "../simple-factory-generator.js";
|
|
2
8
|
import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
|
|
3
9
|
import { z } from "zod";
|
|
10
|
+
import { join } from "node:path";
|
|
4
11
|
|
|
5
12
|
//#region src/commands/pull-v4/generators/status-component-generator.ts
|
|
6
13
|
const MySchema = FullProjectDefinitionSchema.shape.statusUpdates.unwrap().shape.statusComponents.unwrap().element;
|
|
@@ -9,27 +16,55 @@ const StatusComponentSchema = z.strictObject({
|
|
|
9
16
|
...MySchema.shape
|
|
10
17
|
});
|
|
11
18
|
function generateStatusComponentDefinition({ id, ...data }) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
return generateFactorySourceFile(data, {
|
|
20
|
+
schema: StatusComponentSchema,
|
|
21
|
+
factory: {
|
|
22
|
+
importName: "statusComponent",
|
|
23
|
+
variableName: (parsed) => toCamelCase(parsed.statusComponentId)
|
|
24
|
+
},
|
|
25
|
+
render({ parsed, sourceFile, configObject }) {
|
|
26
|
+
const { statusComponentId: _, detailsSchema, ...rest } = parsed;
|
|
27
|
+
for (const [k, v] of Object.entries(rest)) addValueToObject(configObject, k, v);
|
|
28
|
+
if (detailsSchema) {
|
|
29
|
+
sourceFile.addImportDeclaration({
|
|
30
|
+
namedImports: ["z"],
|
|
31
|
+
moduleSpecifier: "zod"
|
|
32
|
+
});
|
|
33
|
+
addValueToObject(configObject, "detailsSchema", codeExpression(convertJsonSchemaToZodSafe(detailsSchema)));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
18
36
|
});
|
|
19
|
-
for (const [k, v] of Object.entries(rest)) addValueToObject(configObject, k, v);
|
|
20
|
-
if (detailsSchema) {
|
|
21
|
-
sourceFile.addImportDeclaration({
|
|
22
|
-
namedImports: ["z"],
|
|
23
|
-
moduleSpecifier: "zod"
|
|
24
|
-
});
|
|
25
|
-
configObject.addPropertyAssignment({
|
|
26
|
-
name: "detailsSchema",
|
|
27
|
-
initializer: convertJsonSchemaToZodSafe(detailsSchema)
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
return sourceFile;
|
|
31
37
|
}
|
|
38
|
+
const task = {
|
|
39
|
+
type: "status-component",
|
|
40
|
+
collect(context) {
|
|
41
|
+
if (!context.project.agents) return [];
|
|
42
|
+
const statusComponentRecordsById = /* @__PURE__ */ new Map();
|
|
43
|
+
for (const agentId of context.completeAgentIds) {
|
|
44
|
+
const agentData = context.project.agents[agentId];
|
|
45
|
+
const statusUpdates = asRecord(agentData?.statusUpdates);
|
|
46
|
+
const statusComponents = Array.isArray(statusUpdates?.statusComponents) ? statusUpdates.statusComponents : [];
|
|
47
|
+
for (const statusComponentData of statusComponents) {
|
|
48
|
+
const payload = asRecord(statusComponentData);
|
|
49
|
+
if (!payload) continue;
|
|
50
|
+
const statusComponentId = resolveStatusComponentId(payload);
|
|
51
|
+
if (!statusComponentId || statusComponentRecordsById.has(statusComponentId)) continue;
|
|
52
|
+
const statusComponentName = typeof payload.name === "string" ? payload.name : void 0;
|
|
53
|
+
statusComponentRecordsById.set(statusComponentId, {
|
|
54
|
+
id: statusComponentId,
|
|
55
|
+
filePath: context.resolver.resolveOutputFilePath("statusComponents", statusComponentId, join(context.paths.statusComponentsDir, buildComponentFileName(statusComponentId, statusComponentName))),
|
|
56
|
+
payload: {
|
|
57
|
+
statusComponentId,
|
|
58
|
+
...payload
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return [...statusComponentRecordsById.values()];
|
|
64
|
+
},
|
|
65
|
+
generate: generateStatusComponentDefinition
|
|
66
|
+
};
|
|
32
67
|
|
|
33
68
|
//#endregion
|
|
34
|
-
export { generateStatusComponentDefinition };
|
|
69
|
+
export { generateStatusComponentDefinition, task };
|
|
35
70
|
//# sourceMappingURL=status-component-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-component-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/status-component-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n addValueToObject,\n
|
|
1
|
+
{"version":3,"file":"status-component-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/status-component-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { asRecord, resolveStatusComponentId } from '../collector-common';\nimport type { GenerationTask } from '../generation-types';\nimport { generateFactorySourceFile } from '../simple-factory-generator';\nimport {\n addValueToObject,\n buildComponentFileName,\n codeExpression,\n convertJsonSchemaToZodSafe,\n toCamelCase,\n} from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.statusUpdates\n .unwrap()\n .shape.statusComponents.unwrap().element;\n\nconst StatusComponentSchema = z.strictObject({\n statusComponentId: z.string().nonempty(),\n ...MySchema.shape,\n});\n\ntype StatusComponentInput = z.input<typeof StatusComponentSchema>;\n\nexport function generateStatusComponentDefinition({\n id,\n ...data\n}: StatusComponentInput & Record<string, unknown>): SourceFile {\n return generateFactorySourceFile(data, {\n schema: StatusComponentSchema,\n factory: {\n importName: 'statusComponent',\n variableName: (parsed) => toCamelCase(parsed.statusComponentId),\n },\n render({ parsed, sourceFile, configObject }) {\n const { statusComponentId: _, detailsSchema, ...rest } = parsed;\n\n for (const [k, v] of Object.entries(rest)) {\n addValueToObject(configObject, k, v);\n }\n if (detailsSchema) {\n sourceFile.addImportDeclaration({\n namedImports: ['z'],\n moduleSpecifier: 'zod',\n });\n addValueToObject(\n configObject,\n 'detailsSchema',\n codeExpression(convertJsonSchemaToZodSafe(detailsSchema))\n );\n }\n },\n });\n}\n\nexport const task = {\n type: 'status-component',\n collect(context) {\n if (!context.project.agents) {\n return [];\n }\n\n const statusComponentRecordsById = new Map<\n string,\n ReturnType<\n GenerationTask<Parameters<typeof generateStatusComponentDefinition>[0]>['collect']\n >[number]\n >();\n\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n const statusUpdates = asRecord(agentData?.statusUpdates);\n const statusComponents = Array.isArray(statusUpdates?.statusComponents)\n ? statusUpdates.statusComponents\n : [];\n\n for (const statusComponentData of statusComponents) {\n const payload = asRecord(statusComponentData);\n if (!payload) {\n continue;\n }\n\n const statusComponentId = resolveStatusComponentId(payload);\n if (!statusComponentId || statusComponentRecordsById.has(statusComponentId)) {\n continue;\n }\n\n const statusComponentName = typeof payload.name === 'string' ? payload.name : undefined;\n statusComponentRecordsById.set(statusComponentId, {\n id: statusComponentId,\n filePath: context.resolver.resolveOutputFilePath(\n 'statusComponents',\n statusComponentId,\n join(\n context.paths.statusComponentsDir,\n buildComponentFileName(statusComponentId, statusComponentName)\n )\n ),\n payload: {\n statusComponentId,\n ...payload,\n } as Parameters<typeof generateStatusComponentDefinition>[0],\n });\n }\n }\n\n return [...statusComponentRecordsById.values()];\n },\n generate: generateStatusComponentDefinition,\n} satisfies GenerationTask<Parameters<typeof generateStatusComponentDefinition>[0]>;\n"],"mappings":";;;;;;;;;;;;AAeA,MAAM,WAAW,4BAA4B,MAAM,cAChD,QAAQ,CACR,MAAM,iBAAiB,QAAQ,CAAC;AAEnC,MAAM,wBAAwB,EAAE,aAAa;CAC3C,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,GAAG,SAAS;CACb,CAAC;AAIF,SAAgB,kCAAkC,EAChD,IACA,GAAG,QAC0D;AAC7D,QAAO,0BAA0B,MAAM;EACrC,QAAQ;EACR,SAAS;GACP,YAAY;GACZ,eAAe,WAAW,YAAY,OAAO,kBAAkB;GAChE;EACD,OAAO,EAAE,QAAQ,YAAY,gBAAgB;GAC3C,MAAM,EAAE,mBAAmB,GAAG,eAAe,GAAG,SAAS;AAEzD,QAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,CACvC,kBAAiB,cAAc,GAAG,EAAE;AAEtC,OAAI,eAAe;AACjB,eAAW,qBAAqB;KAC9B,cAAc,CAAC,IAAI;KACnB,iBAAiB;KAClB,CAAC;AACF,qBACE,cACA,iBACA,eAAe,2BAA2B,cAAc,CAAC,CAC1D;;;EAGN,CAAC;;AAGJ,MAAa,OAAO;CAClB,MAAM;CACN,QAAQ,SAAS;AACf,MAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;EAGX,MAAM,6CAA6B,IAAI,KAKpC;AAEH,OAAK,MAAM,WAAW,QAAQ,kBAAkB;GAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;GACzC,MAAM,gBAAgB,SAAS,WAAW,cAAc;GACxD,MAAM,mBAAmB,MAAM,QAAQ,eAAe,iBAAiB,GACnE,cAAc,mBACd,EAAE;AAEN,QAAK,MAAM,uBAAuB,kBAAkB;IAClD,MAAM,UAAU,SAAS,oBAAoB;AAC7C,QAAI,CAAC,QACH;IAGF,MAAM,oBAAoB,yBAAyB,QAAQ;AAC3D,QAAI,CAAC,qBAAqB,2BAA2B,IAAI,kBAAkB,CACzE;IAGF,MAAM,sBAAsB,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAC9E,+BAA2B,IAAI,mBAAmB;KAChD,IAAI;KACJ,UAAU,QAAQ,SAAS,sBACzB,oBACA,mBACA,KACE,QAAQ,MAAM,qBACd,uBAAuB,mBAAmB,oBAAoB,CAC/D,CACF;KACD,SAAS;MACP;MACA,GAAG;MACJ;KACF,CAAC;;;AAIN,SAAO,CAAC,GAAG,2BAA2B,QAAQ,CAAC;;CAEjD,UAAU;CACX"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isPlainObject } from "../utils/shared.js";
|
|
2
|
+
import { formatInlineLiteral } from "../utils/code-values.js";
|
|
3
|
+
import { resolveReferenceName, toCamelCase } from "../utils/naming.js";
|
|
4
|
+
import "../utils/index.js";
|
|
2
5
|
|
|
3
6
|
//#region src/commands/pull-v4/generators/sub-agent-generator.helpers.ts
|
|
4
7
|
function resolveSubAgentName(subAgentId, name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-generator.helpers.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/sub-agent-generator.helpers.ts"],"sourcesContent":["import { formatInlineLiteral, isPlainObject, resolveReferenceName, toCamelCase } from '../utils';\n\ninterface DelegateReferenceOverrides {\n subAgents?: Record<string, string>;\n agents?: Record<string, string>;\n externalAgents?: Record<string, string>;\n}\n\nexport function resolveSubAgentName(subAgentId: string, name?: string): string {\n if (name !== undefined) {\n return name;\n }\n\n return subAgentId\n .replace(/[-_]/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function resolveSubAgentVariableName(subAgentId: string, name?: string): string {\n const seed = name || subAgentId;\n return toCamelCase(seed);\n}\n\nexport function collectCanUseReferences(\n canUse?: unknown[],\n toolReferenceOverrides?: Record<string, string>\n): string[] {\n if (!Array.isArray(canUse)) {\n return [];\n }\n\n const references: string[] = [];\n for (const item of canUse) {\n if (typeof item === 'string') {\n references.push(resolveReferenceName(item, [toolReferenceOverrides]));\n continue;\n }\n\n if (!isPlainObject(item)) {\n continue;\n }\n\n const toolId = typeof item.toolId === 'string' ? item.toolId : undefined;\n if (!toolId) {\n continue;\n }\n\n const toolReference = resolveReferenceName(toolId, [toolReferenceOverrides]);\n const withConfig: Record<string, unknown> = {};\n const selectedTools =\n Array.isArray(item.toolSelection) && item.toolSelection.length\n ? item.toolSelection\n : Array.isArray(item.selectedTools) && item.selectedTools.length\n ? item.selectedTools\n : undefined;\n\n if (selectedTools) {\n withConfig.selectedTools = selectedTools;\n }\n\n if (isPlainObject(item.headers) && Object.keys(item.headers).length) {\n withConfig.headers = item.headers;\n }\n\n if (isPlainObject(item.toolPolicies) && Object.keys(item.toolPolicies).length) {\n withConfig.toolPolicies = item.toolPolicies;\n }\n\n if (Object.keys(withConfig).length > 0) {\n references.push(`${toolReference}.with(${formatInlineLiteral(withConfig)})`);\n continue;\n }\n\n references.push(toolReference);\n }\n\n return references;\n}\n\nexport function collectCanDelegateToReferences(\n canDelegateTo: unknown[] | undefined,\n referenceOverrides: DelegateReferenceOverrides\n): string[] {\n if (!Array.isArray(canDelegateTo)) {\n return [];\n }\n\n const references: string[] = [];\n for (const item of canDelegateTo) {\n if (typeof item === 'string') {\n references.push(\n resolveReferenceName(item, [\n referenceOverrides.subAgents,\n referenceOverrides.agents,\n referenceOverrides.externalAgents,\n ])\n );\n continue;\n }\n\n if (!isPlainObject(item)) {\n continue;\n }\n\n const subAgentId = typeof item.subAgentId === 'string' ? item.subAgentId : undefined;\n const agentId = typeof item.agentId === 'string' ? item.agentId : undefined;\n const externalAgentId =\n typeof item.externalAgentId === 'string' ? item.externalAgentId : undefined;\n const targetId = subAgentId || agentId || externalAgentId;\n\n if (!targetId) {\n continue;\n }\n\n const targetReference = subAgentId\n ? resolveReferenceName(subAgentId, [referenceOverrides.subAgents])\n : agentId\n ? resolveReferenceName(agentId, [referenceOverrides.agents])\n : resolveReferenceName(targetId, [referenceOverrides.externalAgents]);\n\n if (isPlainObject(item.headers) && Object.keys(item.headers).length > 0) {\n references.push(\n `${targetReference}.with(${formatInlineLiteral({\n headers: item.headers,\n })})`\n );\n continue;\n }\n\n references.push(targetReference);\n }\n\n return references;\n}\n\nexport function collectSkills(skills?: unknown[]): string[] {\n if (!Array.isArray(skills)) {\n return [];\n }\n\n const formattedSkills: string[] = [];\n for (const skill of skills) {\n if (typeof skill === 'string') {\n formattedSkills.push(formatInlineLiteral(skill));\n continue;\n }\n\n if (!isPlainObject(skill)) {\n continue;\n }\n\n const skillId =\n typeof skill.id === 'string'\n ? skill.id\n : typeof skill.skillId === 'string'\n ? skill.skillId\n : undefined;\n if (!skillId) {\n continue;\n }\n\n const formattedSkill: Record<string, unknown> = { id: skillId };\n if (typeof skill.index === 'number' && Number.isInteger(skill.index)) {\n formattedSkill.index = skill.index;\n }\n if (typeof skill.alwaysLoaded === 'boolean') {\n formattedSkill.alwaysLoaded = skill.alwaysLoaded;\n }\n\n formattedSkills.push(formatInlineLiteral(formattedSkill));\n }\n\n return formattedSkills;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sub-agent-generator.helpers.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/sub-agent-generator.helpers.ts"],"sourcesContent":["import { formatInlineLiteral, isPlainObject, resolveReferenceName, toCamelCase } from '../utils';\n\ninterface DelegateReferenceOverrides {\n subAgents?: Record<string, string>;\n agents?: Record<string, string>;\n externalAgents?: Record<string, string>;\n}\n\nexport function resolveSubAgentName(subAgentId: string, name?: string): string {\n if (name !== undefined) {\n return name;\n }\n\n return subAgentId\n .replace(/[-_]/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function resolveSubAgentVariableName(subAgentId: string, name?: string): string {\n const seed = name || subAgentId;\n return toCamelCase(seed);\n}\n\nexport function collectCanUseReferences(\n canUse?: unknown[],\n toolReferenceOverrides?: Record<string, string>\n): string[] {\n if (!Array.isArray(canUse)) {\n return [];\n }\n\n const references: string[] = [];\n for (const item of canUse) {\n if (typeof item === 'string') {\n references.push(resolveReferenceName(item, [toolReferenceOverrides]));\n continue;\n }\n\n if (!isPlainObject(item)) {\n continue;\n }\n\n const toolId = typeof item.toolId === 'string' ? item.toolId : undefined;\n if (!toolId) {\n continue;\n }\n\n const toolReference = resolveReferenceName(toolId, [toolReferenceOverrides]);\n const withConfig: Record<string, unknown> = {};\n const selectedTools =\n Array.isArray(item.toolSelection) && item.toolSelection.length\n ? item.toolSelection\n : Array.isArray(item.selectedTools) && item.selectedTools.length\n ? item.selectedTools\n : undefined;\n\n if (selectedTools) {\n withConfig.selectedTools = selectedTools;\n }\n\n if (isPlainObject(item.headers) && Object.keys(item.headers).length) {\n withConfig.headers = item.headers;\n }\n\n if (isPlainObject(item.toolPolicies) && Object.keys(item.toolPolicies).length) {\n withConfig.toolPolicies = item.toolPolicies;\n }\n\n if (Object.keys(withConfig).length > 0) {\n references.push(`${toolReference}.with(${formatInlineLiteral(withConfig)})`);\n continue;\n }\n\n references.push(toolReference);\n }\n\n return references;\n}\n\nexport function collectCanDelegateToReferences(\n canDelegateTo: unknown[] | undefined,\n referenceOverrides: DelegateReferenceOverrides\n): string[] {\n if (!Array.isArray(canDelegateTo)) {\n return [];\n }\n\n const references: string[] = [];\n for (const item of canDelegateTo) {\n if (typeof item === 'string') {\n references.push(\n resolveReferenceName(item, [\n referenceOverrides.subAgents,\n referenceOverrides.agents,\n referenceOverrides.externalAgents,\n ])\n );\n continue;\n }\n\n if (!isPlainObject(item)) {\n continue;\n }\n\n const subAgentId = typeof item.subAgentId === 'string' ? item.subAgentId : undefined;\n const agentId = typeof item.agentId === 'string' ? item.agentId : undefined;\n const externalAgentId =\n typeof item.externalAgentId === 'string' ? item.externalAgentId : undefined;\n const targetId = subAgentId || agentId || externalAgentId;\n\n if (!targetId) {\n continue;\n }\n\n const targetReference = subAgentId\n ? resolveReferenceName(subAgentId, [referenceOverrides.subAgents])\n : agentId\n ? resolveReferenceName(agentId, [referenceOverrides.agents])\n : resolveReferenceName(targetId, [referenceOverrides.externalAgents]);\n\n if (isPlainObject(item.headers) && Object.keys(item.headers).length > 0) {\n references.push(\n `${targetReference}.with(${formatInlineLiteral({\n headers: item.headers,\n })})`\n );\n continue;\n }\n\n references.push(targetReference);\n }\n\n return references;\n}\n\nexport function collectSkills(skills?: unknown[]): string[] {\n if (!Array.isArray(skills)) {\n return [];\n }\n\n const formattedSkills: string[] = [];\n for (const skill of skills) {\n if (typeof skill === 'string') {\n formattedSkills.push(formatInlineLiteral(skill));\n continue;\n }\n\n if (!isPlainObject(skill)) {\n continue;\n }\n\n const skillId =\n typeof skill.id === 'string'\n ? skill.id\n : typeof skill.skillId === 'string'\n ? skill.skillId\n : undefined;\n if (!skillId) {\n continue;\n }\n\n const formattedSkill: Record<string, unknown> = { id: skillId };\n if (typeof skill.index === 'number' && Number.isInteger(skill.index)) {\n formattedSkill.index = skill.index;\n }\n if (typeof skill.alwaysLoaded === 'boolean') {\n formattedSkill.alwaysLoaded = skill.alwaysLoaded;\n }\n\n formattedSkills.push(formatInlineLiteral(formattedSkill));\n }\n\n return formattedSkills;\n}\n"],"mappings":"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"}
|