@inkeep/agents-cli 0.58.10 → 0.58.12
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 +3 -2
- package/dist/agents-cli/package.js.map +1 -0
- package/dist/api.js +7 -11
- package/dist/api.js.map +1 -0
- package/dist/commands/add-ui.js +2 -1
- package/dist/commands/add-ui.js.map +1 -0
- package/dist/commands/add.js +2 -1
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/config.js +2 -1
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dev.js +2 -1
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/init.js +2 -1
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list-agents.js +2 -1
- package/dist/commands/list-agents.js.map +1 -0
- package/dist/commands/login.js +2 -1
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +2 -1
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/profile.js +2 -1
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/pull-v4/component-parser.js +2 -1
- package/dist/commands/pull-v4/component-parser.js.map +1 -0
- package/dist/commands/pull-v4/component-registry.js +2 -1
- package/dist/commands/pull-v4/component-registry.js.map +1 -0
- package/dist/commands/pull-v4/generators/agent-generator.helpers.js +186 -0
- package/dist/commands/pull-v4/generators/agent-generator.helpers.js.map +1 -0
- package/dist/commands/pull-v4/generators/agent-generator.js +70 -209
- package/dist/commands/pull-v4/generators/agent-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/artifact-component-generator.js +13 -16
- package/dist/commands/pull-v4/generators/artifact-component-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/context-config-generator.js +38 -24
- package/dist/commands/pull-v4/generators/context-config-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/credential-generator.js +14 -10
- package/dist/commands/pull-v4/generators/credential-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/data-component-generator.js +10 -12
- package/dist/commands/pull-v4/generators/data-component-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/environment-generator.js +11 -91
- package/dist/commands/pull-v4/generators/environment-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/external-agent-generator.js +22 -39
- package/dist/commands/pull-v4/generators/external-agent-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/function-tool-generator.js +19 -31
- package/dist/commands/pull-v4/generators/function-tool-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js +30 -71
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/project-generator.js +64 -31
- package/dist/commands/pull-v4/generators/project-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/skill-generator.js +4 -1
- package/dist/commands/pull-v4/generators/skill-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/status-component-generator.js +19 -19
- package/dist/commands/pull-v4/generators/status-component-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js +84 -0
- package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js.map +1 -0
- package/dist/commands/pull-v4/generators/sub-agent-generator.js +82 -113
- package/dist/commands/pull-v4/generators/sub-agent-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/trigger-generator.js +21 -30
- package/dist/commands/pull-v4/generators/trigger-generator.js.map +1 -0
- package/dist/commands/pull-v4/introspect/demo-project.js +1616 -0
- package/dist/commands/pull-v4/introspect/demo-project.js.map +1 -0
- package/dist/commands/pull-v4/introspect/index.js +17 -16
- package/dist/commands/pull-v4/introspect/index.js.map +1 -0
- package/dist/commands/pull-v4/introspect/test-helpers.js +5 -3
- package/dist/commands/pull-v4/introspect/test-helpers.js.map +1 -0
- package/dist/commands/pull-v4/introspect-generator.js +606 -93
- package/dist/commands/pull-v4/introspect-generator.js.map +1 -0
- package/dist/commands/pull-v4/module-merge.js +2 -1
- package/dist/commands/pull-v4/module-merge.js.map +1 -0
- package/dist/commands/pull-v4/scheduled-trigger-generator.js +16 -17
- package/dist/commands/pull-v4/scheduled-trigger-generator.js.map +1 -0
- package/dist/commands/pull-v4/utils.js +90 -28
- package/dist/commands/pull-v4/utils.js.map +1 -0
- package/dist/commands/push.js +2 -1
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.js +2 -1
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/whoami.js +2 -1
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -0
- package/dist/env.js +2 -1
- package/dist/env.js.map +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -0
- package/dist/instrumentation.js +2 -1
- package/dist/instrumentation.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/array.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/array.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/base.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/base.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/character.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/character.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/css.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/css.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/json.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/json.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/line.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/line.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/sentence.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/sentence.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/word.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/word.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/patch/create.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/patch/create.js.map +1 -0
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/util/string.js +2 -1
- package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/util/string.js.map +1 -0
- package/dist/utils/background-version-check.js +2 -1
- package/dist/utils/background-version-check.js.map +1 -0
- package/dist/utils/ci-environment.js +2 -1
- package/dist/utils/ci-environment.js.map +1 -0
- package/dist/utils/cli-pipeline.js +2 -1
- package/dist/utils/cli-pipeline.js.map +1 -0
- package/dist/utils/config.js +2 -1
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/credentials.js +2 -1
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/environment-loader.js +2 -1
- package/dist/utils/environment-loader.js.map +1 -0
- package/dist/utils/file-finder.js +2 -1
- package/dist/utils/file-finder.js.map +1 -0
- package/dist/utils/json-comparator.js +2 -1
- package/dist/utils/json-comparator.js.map +1 -0
- package/dist/utils/json-comparison.js +2 -1
- package/dist/utils/json-comparison.js.map +1 -0
- package/dist/utils/mcp-runner.js +2 -1
- package/dist/utils/mcp-runner.js.map +1 -0
- package/dist/utils/model-config.js +2 -1
- package/dist/utils/model-config.js.map +1 -0
- package/dist/utils/package-manager.js +2 -1
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/profile-config.js +2 -1
- package/dist/utils/profile-config.js.map +1 -0
- package/dist/utils/profiles/profile-manager.js +2 -1
- package/dist/utils/profiles/profile-manager.js.map +1 -0
- package/dist/utils/profiles/types.js +2 -1
- package/dist/utils/profiles/types.js.map +1 -0
- package/dist/utils/project-directory.js +2 -1
- package/dist/utils/project-directory.js.map +1 -0
- package/dist/utils/project-loader.js +2 -1
- package/dist/utils/project-loader.js.map +1 -0
- package/dist/utils/schema-introspection.js +2 -1
- package/dist/utils/schema-introspection.js.map +1 -0
- package/dist/utils/templates.js +2 -1
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/tsx-loader.js +2 -1
- package/dist/utils/tsx-loader.js.map +1 -0
- package/dist/utils/version-check.js +2 -1
- package/dist/utils/version-check.js.map +1 -0
- package/package.json +3 -3
|
@@ -39,22 +39,66 @@ function createFactoryDefinition({ importName, variableName: name, fileName = "d
|
|
|
39
39
|
namedImports: [importName],
|
|
40
40
|
moduleSpecifier
|
|
41
41
|
});
|
|
42
|
+
const localVariableName = resolveNonCollidingName(name, collectTakenNames(sourceFile));
|
|
43
|
+
const shouldAliasExport = localVariableName !== name;
|
|
42
44
|
const { configObject } = addFactoryConfigVariable({
|
|
43
45
|
sourceFile,
|
|
44
46
|
importName,
|
|
45
|
-
variableName:
|
|
46
|
-
isExported:
|
|
47
|
+
variableName: localVariableName,
|
|
48
|
+
isExported: !shouldAliasExport,
|
|
47
49
|
syntaxKind
|
|
48
50
|
});
|
|
51
|
+
if (shouldAliasExport) sourceFile.addExportDeclaration({ namedExports: [{
|
|
52
|
+
name: localVariableName,
|
|
53
|
+
alias: name
|
|
54
|
+
}] });
|
|
49
55
|
return {
|
|
50
56
|
sourceFile,
|
|
51
57
|
configObject
|
|
52
58
|
};
|
|
53
59
|
}
|
|
60
|
+
function collectTakenNames(sourceFile) {
|
|
61
|
+
const takenNames = /* @__PURE__ */ new Set();
|
|
62
|
+
for (const importDeclaration of sourceFile.getImportDeclarations()) {
|
|
63
|
+
const defaultImport = importDeclaration.getDefaultImport()?.getText();
|
|
64
|
+
if (defaultImport) takenNames.add(defaultImport);
|
|
65
|
+
const namespaceImport = importDeclaration.getNamespaceImport()?.getText();
|
|
66
|
+
if (namespaceImport) takenNames.add(namespaceImport);
|
|
67
|
+
for (const namedImport of importDeclaration.getNamedImports()) {
|
|
68
|
+
const localName = namedImport.getAliasNode()?.getText() ?? namedImport.getName();
|
|
69
|
+
takenNames.add(localName);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const variableDeclaration of sourceFile.getVariableDeclarations()) takenNames.add(variableDeclaration.getName());
|
|
73
|
+
return takenNames;
|
|
74
|
+
}
|
|
75
|
+
function resolveNonCollidingName(baseName, reservedNames, startIndex = 1) {
|
|
76
|
+
if (!reservedNames.has(baseName)) {
|
|
77
|
+
reservedNames.add(baseName);
|
|
78
|
+
return baseName;
|
|
79
|
+
}
|
|
80
|
+
let index = startIndex;
|
|
81
|
+
while (reservedNames.has(`${baseName}${index}`)) index += 1;
|
|
82
|
+
const uniqueName = `${baseName}${index}`;
|
|
83
|
+
reservedNames.add(uniqueName);
|
|
84
|
+
return uniqueName;
|
|
85
|
+
}
|
|
54
86
|
function toCamelCase(input) {
|
|
55
|
-
const result = input.
|
|
87
|
+
const result = input.toLowerCase().replaceAll(/\W/g, " ").trim().replaceAll(/[\s_]+(.)/g, (_, char) => char.toUpperCase()).replace(/^[0-9]/, "_$&");
|
|
56
88
|
return result.charAt(0).toLowerCase() + result.slice(1);
|
|
57
89
|
}
|
|
90
|
+
function toToolReferenceName(input) {
|
|
91
|
+
const base = toCamelCase(input);
|
|
92
|
+
return base.endsWith("Tool") ? base : `${base}Tool`;
|
|
93
|
+
}
|
|
94
|
+
function toCredentialReferenceName(input) {
|
|
95
|
+
const base = toCamelCase(input);
|
|
96
|
+
return base.endsWith("Credential") ? base : `${base}Credential`;
|
|
97
|
+
}
|
|
98
|
+
function toTriggerReferenceName(input) {
|
|
99
|
+
const base = toCamelCase(input);
|
|
100
|
+
return base.endsWith("Trigger") ? base : `${base}Trigger`;
|
|
101
|
+
}
|
|
58
102
|
function toKebabCase(input) {
|
|
59
103
|
return input.trim().replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
|
|
60
104
|
}
|
|
@@ -88,11 +132,47 @@ function createUniqueReferenceName(baseName, reservedNames, conflictSuffix) {
|
|
|
88
132
|
reservedNames.add(baseCandidate);
|
|
89
133
|
return baseCandidate;
|
|
90
134
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
135
|
+
return resolveNonCollidingName(baseCandidate, reservedNames, 2);
|
|
136
|
+
}
|
|
137
|
+
function resolveImportedReference(importName, reservedNames, conflictSuffix, isLocal = false) {
|
|
138
|
+
if (isLocal) {
|
|
139
|
+
reservedNames.add(importName);
|
|
140
|
+
return { referenceName: importName };
|
|
141
|
+
}
|
|
142
|
+
const referenceName = createUniqueReferenceName(importName, reservedNames, conflictSuffix);
|
|
143
|
+
return {
|
|
144
|
+
referenceName,
|
|
145
|
+
namedImport: importName === referenceName ? importName : {
|
|
146
|
+
name: importName,
|
|
147
|
+
alias: referenceName
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function resolveContextTemplateImports(options) {
|
|
152
|
+
const namedImports = [];
|
|
153
|
+
let contextReferenceName;
|
|
154
|
+
let headersReferenceName;
|
|
155
|
+
if (options.shouldResolveContextReference) {
|
|
156
|
+
const contextImportName = options.contextConfigReference?.name ?? options.defaultContextImportName;
|
|
157
|
+
if (contextImportName) {
|
|
158
|
+
const contextImportRef = resolveImportedReference(contextImportName, options.reservedNames, "ContextConfig", options.contextConfigReference?.local === true);
|
|
159
|
+
contextReferenceName = contextImportRef.referenceName;
|
|
160
|
+
if (contextImportRef.namedImport) namedImports.push(contextImportRef.namedImport);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (options.shouldResolveHeadersReference) {
|
|
164
|
+
const headersImportName = options.contextConfigHeadersReference?.name ?? options.defaultHeadersImportName;
|
|
165
|
+
if (headersImportName) {
|
|
166
|
+
const headersImportRef = resolveImportedReference(headersImportName, options.reservedNames, "Headers", options.contextConfigHeadersReference?.local === true);
|
|
167
|
+
headersReferenceName = headersImportRef.referenceName;
|
|
168
|
+
if (headersImportRef.namedImport) namedImports.push(headersImportRef.namedImport);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
contextReferenceName,
|
|
173
|
+
headersReferenceName,
|
|
174
|
+
namedImports
|
|
175
|
+
};
|
|
96
176
|
}
|
|
97
177
|
function resolveReferenceName(referenceId, referenceOverrides) {
|
|
98
178
|
for (const overrideMap of referenceOverrides) {
|
|
@@ -184,22 +264,6 @@ function addReferenceGetterProperty(configObject, key, refs) {
|
|
|
184
264
|
initializer: "() => []"
|
|
185
265
|
}).getInitializerIfKindOrThrow(SyntaxKind.ArrowFunction).getBody().asKindOrThrow(SyntaxKind.ArrayLiteralExpression).addElements(refs);
|
|
186
266
|
}
|
|
187
|
-
function addObjectEntries(target, value) {
|
|
188
|
-
for (const [key, entryValue] of Object.entries(value)) {
|
|
189
|
-
if (entryValue === void 0) continue;
|
|
190
|
-
if (isPlainObject(entryValue)) {
|
|
191
|
-
addObjectEntries(target.addPropertyAssignment({
|
|
192
|
-
name: formatPropertyName(key),
|
|
193
|
-
initializer: "{}"
|
|
194
|
-
}).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression), entryValue);
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
target.addPropertyAssignment({
|
|
198
|
-
name: formatPropertyName(key),
|
|
199
|
-
initializer: formatInlineLiteral(entryValue)
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
267
|
function addStringProperty(configObject, key, value) {
|
|
204
268
|
configObject.addPropertyAssignment({
|
|
205
269
|
name: key,
|
|
@@ -247,12 +311,10 @@ async function expectSnapshots(definitionV4) {
|
|
|
247
311
|
const snapshotDir = path.basename(snapshotState.testFilePath).replace("-generator.test.ts", "");
|
|
248
312
|
await expect(definitionV4).toMatchFileSnapshot(`__snapshots__/${snapshotDir}/${currentTestName}-v4.txt`);
|
|
249
313
|
}
|
|
250
|
-
function convertNullToUndefined(v) {
|
|
251
|
-
return v == null ? void 0 : v;
|
|
252
|
-
}
|
|
253
314
|
function hasReferences(references) {
|
|
254
315
|
return Array.isArray(references) && references.length > 0;
|
|
255
316
|
}
|
|
256
317
|
|
|
257
318
|
//#endregion
|
|
258
|
-
export { TEMPLATE_VARIABLE_REGEX, addFactoryConfigVariable,
|
|
319
|
+
export { TEMPLATE_VARIABLE_REGEX, addFactoryConfigVariable, addReferenceGetterProperty, addStringProperty, addValueToObject, buildComponentFileName, collectTemplateVariableNames, convertJsonSchemaToZodSafe, createFactoryDefinition, createInMemoryProject, createUniqueReferenceName, expectSnapshots, formatInlineLiteral, formatPropertyName, formatStringLiteral, formatTemplate, hasReferences, isHumanReadableId, isPlainObject, resolveContextTemplateImports, resolveImportedReference, resolveNonCollidingName, resolveReferenceName, toCamelCase, toCredentialReferenceName, toKebabCase, toToolReferenceName, toTriggerReferenceName };
|
|
320
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../src/commands/pull-v4/utils.ts"],"sourcesContent":["import path from 'node:path';\nimport { jsonSchemaToZod } from 'json-schema-to-zod';\nimport {\n type ArrayLiteralExpression,\n IndentationText,\n NewLineKind,\n type ObjectLiteralExpression,\n Project,\n QuoteKind,\n type SourceFile,\n SyntaxKind,\n VariableDeclarationKind,\n} from 'ts-morph';\n\nexport function createInMemoryProject(): Project {\n return new Project({\n useInMemoryFileSystem: true,\n // we don't need them, this improves performance and makes tests fast\n skipLoadingLibFiles: true,\n manipulationSettings: {\n indentationText: IndentationText.TwoSpaces,\n quoteKind: QuoteKind.Single,\n newLineKind: NewLineKind.LineFeed,\n useTrailingCommas: true,\n },\n });\n}\n\ninterface CreateFactoryDefinitionOptions\n extends Pick<AddFactoryConfigVariableOptions, 'syntaxKind' | 'importName' | 'variableName'> {\n /** @default \"definition.ts\" */\n fileName?: string;\n /** @default \"@inkeep/agents-sdk\" */\n moduleSpecifier?: string;\n}\n\ninterface AddFactoryConfigVariableOptions {\n sourceFile: SourceFile;\n importName: string;\n variableName: string;\n isExported?: boolean;\n /** @default SyntaxKind.CallExpression */\n syntaxKind?: SyntaxKind.CallExpression | SyntaxKind.NewExpression;\n}\n\n/**\n * Create variable in following pattern\n *\n * (export)? const VARIABLE_NAME = (new)?IMPORT_NAME({})\n */\nexport function addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName,\n isExported,\n syntaxKind = SyntaxKind.CallExpression,\n}: AddFactoryConfigVariableOptions): {\n configObject: ObjectLiteralExpression;\n} {\n const initializer = `${syntaxKind === SyntaxKind.NewExpression ? 'new ' : ''}${importName}({})`;\n const variableStatement = sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported,\n declarations: [{ name: variableName, initializer }],\n });\n const [declaration] = variableStatement.getDeclarations();\n const invocation = declaration.getInitializerIfKindOrThrow(syntaxKind);\n const [configArg] = invocation.getArguments();\n\n return {\n configObject: configArg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression),\n };\n}\n\nexport function createFactoryDefinition({\n importName,\n variableName: name,\n fileName = 'definition.ts',\n moduleSpecifier = '@inkeep/agents-sdk',\n syntaxKind,\n}: CreateFactoryDefinitionOptions): {\n sourceFile: SourceFile;\n configObject: ObjectLiteralExpression;\n} {\n const sourceFile = createInMemoryProject().createSourceFile(fileName, '', {\n overwrite: true,\n });\n sourceFile.addImportDeclaration({ namedImports: [importName], moduleSpecifier });\n const localVariableName = resolveNonCollidingName(name, collectTakenNames(sourceFile));\n const shouldAliasExport = localVariableName !== name;\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName: localVariableName,\n isExported: !shouldAliasExport,\n syntaxKind,\n });\n if (shouldAliasExport) {\n sourceFile.addExportDeclaration({\n namedExports: [{ name: localVariableName, alias: name }],\n });\n }\n\n return {\n sourceFile,\n configObject,\n };\n}\n\nfunction collectTakenNames(sourceFile: SourceFile): Set<string> {\n const takenNames = new Set<string>();\n\n for (const importDeclaration of sourceFile.getImportDeclarations()) {\n const defaultImport = importDeclaration.getDefaultImport()?.getText();\n if (defaultImport) {\n takenNames.add(defaultImport);\n }\n\n const namespaceImport = importDeclaration.getNamespaceImport()?.getText();\n if (namespaceImport) {\n takenNames.add(namespaceImport);\n }\n\n for (const namedImport of importDeclaration.getNamedImports()) {\n const localName = namedImport.getAliasNode()?.getText() ?? namedImport.getName();\n takenNames.add(localName);\n }\n }\n\n for (const variableDeclaration of sourceFile.getVariableDeclarations()) {\n takenNames.add(variableDeclaration.getName());\n }\n\n return takenNames;\n}\n\nexport function resolveNonCollidingName(\n baseName: string,\n reservedNames: Set<string>,\n startIndex = 1\n): string {\n if (!reservedNames.has(baseName)) {\n reservedNames.add(baseName);\n return baseName;\n }\n\n let index = startIndex;\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\nexport function toCamelCase(input: string): string {\n const result = input\n .toLowerCase()\n .replaceAll(/\\W/g, ' ')\n .trim()\n .replaceAll(/[\\s_]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[0-9]/, '_$&');\n\n return result.charAt(0).toLowerCase() + result.slice(1);\n}\n\nexport function toToolReferenceName(input: string): string {\n const base = toCamelCase(input);\n return base.endsWith('Tool') ? base : `${base}Tool`;\n}\n\nexport function toCredentialReferenceName(input: string): string {\n const base = toCamelCase(input);\n return base.endsWith('Credential') ? base : `${base}Credential`;\n}\n\nexport function toTriggerReferenceName(input: string): string {\n const base = toCamelCase(input);\n return base.endsWith('Trigger') ? base : `${base}Trigger`;\n}\n\nexport function toKebabCase(input: string): string {\n return input\n .trim()\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst CUID_RE = /^c[a-z0-9]{24,}$/;\nconst NANOID_RE = /^[a-z0-9]{16,}$/;\n\nexport function isHumanReadableId(id: string): boolean {\n if (UUID_RE.test(id) || CUID_RE.test(id) || NANOID_RE.test(id)) {\n return false;\n }\n\n const segments = id.split(/[-_]/);\n if (segments.length === 1 && id.length > 8) {\n const hasLetters = /[a-zA-Z]/.test(id);\n const hasDigits = /[0-9]/.test(id);\n if (hasLetters && hasDigits) {\n return false;\n }\n }\n\n const wordLikeSegments = segments.filter((s) => /^[a-zA-Z]+\\d{0,2}$/.test(s));\n return wordLikeSegments.length / segments.length >= 0.5;\n}\n\nconst ID_SUFFIX_LENGTH = 8;\n\nexport function buildComponentFileName(id: string, name?: string): string {\n if (!name || isHumanReadableId(id)) {\n return `${id}.ts`;\n }\n\n const kebabName = toKebabCase(name);\n if (!kebabName || kebabName === id) {\n return `${id}.ts`;\n }\n\n const shortId = id.slice(-ID_SUFFIX_LENGTH);\n return `${kebabName}-${shortId}.ts`;\n}\n\nexport function createUniqueReferenceName(\n baseName: string,\n reservedNames: Set<string>,\n conflictSuffix: string\n): string {\n if (!reservedNames.has(baseName)) {\n reservedNames.add(baseName);\n return baseName;\n }\n\n const baseCandidate = `${baseName}${conflictSuffix}`;\n if (!reservedNames.has(baseCandidate)) {\n reservedNames.add(baseCandidate);\n return baseCandidate;\n }\n\n return resolveNonCollidingName(baseCandidate, reservedNames, 2);\n}\n\nexport function resolveImportedReference(\n importName: string,\n reservedNames: Set<string>,\n conflictSuffix: string,\n isLocal = false\n): {\n referenceName: string;\n namedImport?: string | { name: string; alias: string };\n} {\n if (isLocal) {\n reservedNames.add(importName);\n return { referenceName: importName };\n }\n\n const referenceName = createUniqueReferenceName(importName, reservedNames, conflictSuffix);\n return {\n referenceName,\n namedImport:\n importName === referenceName ? importName : { name: importName, alias: referenceName },\n };\n}\n\ninterface NamedTemplateReference {\n name: string;\n local?: boolean;\n}\n\nexport function resolveContextTemplateImports(options: {\n reservedNames: Set<string>;\n shouldResolveContextReference: boolean;\n shouldResolveHeadersReference: boolean;\n contextConfigReference?: NamedTemplateReference;\n contextConfigHeadersReference?: NamedTemplateReference;\n defaultContextImportName?: string;\n defaultHeadersImportName?: string;\n}): {\n contextReferenceName?: string;\n headersReferenceName?: string;\n namedImports: Array<string | { name: string; alias: string }>;\n} {\n const namedImports: Array<string | { name: string; alias: string }> = [];\n let contextReferenceName: string | undefined;\n let headersReferenceName: string | undefined;\n\n if (options.shouldResolveContextReference) {\n const contextImportName =\n options.contextConfigReference?.name ?? options.defaultContextImportName;\n if (contextImportName) {\n const contextImportRef = resolveImportedReference(\n contextImportName,\n options.reservedNames,\n 'ContextConfig',\n options.contextConfigReference?.local === true\n );\n contextReferenceName = contextImportRef.referenceName;\n if (contextImportRef.namedImport) {\n namedImports.push(contextImportRef.namedImport);\n }\n }\n }\n\n if (options.shouldResolveHeadersReference) {\n const headersImportName =\n options.contextConfigHeadersReference?.name ?? options.defaultHeadersImportName;\n if (headersImportName) {\n const headersImportRef = resolveImportedReference(\n headersImportName,\n options.reservedNames,\n 'Headers',\n options.contextConfigHeadersReference?.local === true\n );\n headersReferenceName = headersImportRef.referenceName;\n if (headersImportRef.namedImport) {\n namedImports.push(headersImportRef.namedImport);\n }\n }\n }\n\n return {\n contextReferenceName,\n headersReferenceName,\n namedImports,\n };\n}\n\ntype ReferenceOverrideMap = Record<string, string>;\n\nexport function resolveReferenceName(\n referenceId: string,\n referenceOverrides: Array<ReferenceOverrideMap | undefined>\n): string {\n for (const overrideMap of referenceOverrides) {\n const overrideName = overrideMap?.[referenceId];\n if (overrideName) {\n return overrideName;\n }\n }\n\n return toCamelCase(referenceId);\n}\n\nexport function convertJsonSchemaToZodSafe(\n schema: unknown,\n options?: { conversionOptions?: Parameters<typeof jsonSchemaToZod>[1] }\n): string {\n if (!isPlainObject(schema)) {\n console.warn('Schema conversion skipped: non-object schema provided, using z.any()');\n return 'z.any()';\n }\n try {\n return jsonSchemaToZod(schema, options?.conversionOptions);\n } catch (error) {\n console.warn(\n `Schema conversion failed: ${error instanceof Error ? error.message : String(error)}. Falling back to z.any()`\n );\n return 'z.any()';\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nconst QUOTE = Object.freeze({\n single: \"'\",\n double: '\"',\n template: '`',\n});\n\ntype Quote = (typeof QUOTE)[keyof typeof QUOTE];\n\nexport const TEMPLATE_VARIABLE_REGEX = /\\{\\{(?!\\{)(?<variableName>[^{}]+)}}/g;\n\ninterface TemplateReplacementReferences {\n contextReference?: string;\n headersReference?: string;\n}\n\nexport function formatStringLiteral(value: string): string {\n const hasSingleQuote = value.includes(QUOTE.single);\n const hasDoubleQuote = value.includes(QUOTE.double);\n const quote =\n value.includes('\\n') || value.includes('${') || (hasSingleQuote && hasDoubleQuote)\n ? QUOTE.template\n : hasSingleQuote\n ? QUOTE.double\n : QUOTE.single;\n return escapeStringLiteral(value, quote);\n}\n\nexport function collectTemplateVariableNames(value: string): string[] {\n const variables: string[] = [];\n for (const match of value.matchAll(TEMPLATE_VARIABLE_REGEX)) {\n const variableName = match.groups?.variableName?.trim();\n if (variableName) {\n variables.push(variableName);\n }\n }\n return variables;\n}\n\nexport function formatTemplate(value: string, references: TemplateReplacementReferences): string {\n if (!value.length) {\n return value;\n }\n\n let didReplace = false;\n const rewrittenValue = value.replace(\n TEMPLATE_VARIABLE_REGEX,\n (match: string, ...args: unknown[]): string => {\n const maybeGroups = args.at(-1);\n const variableName =\n isPlainObject(maybeGroups) && typeof maybeGroups.variableName === 'string'\n ? maybeGroups.variableName.trim()\n : undefined;\n\n if (!variableName) {\n return match;\n }\n\n if (variableName.startsWith('headers.')) {\n const headerPath = variableName.slice('headers.'.length);\n if (!headerPath || !references.headersReference) {\n return match;\n }\n didReplace = true;\n return `\\${${references.headersReference}.toTemplate(${JSON.stringify(headerPath)})}`;\n }\n\n if (!references.contextReference) {\n return match;\n }\n\n didReplace = true;\n return `\\${${references.contextReference}.toTemplate(${JSON.stringify(variableName)})}`;\n }\n );\n\n return didReplace ? rewrittenValue : value;\n}\n\nfunction escapeStringLiteral(value: string, quote: Quote): string {\n return [\n quote, //\n value.replaceAll('\\\\', '\\\\\\\\').replaceAll(quote, `\\\\${quote}`),\n quote,\n ].join('');\n}\n\nexport function formatPropertyName(key: string): string {\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return key;\n }\n return formatStringLiteral(key);\n}\n\nexport function formatInlineLiteral(value: unknown): string {\n if (typeof value === 'string') {\n return formatStringLiteral(value);\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (value === null) {\n return 'null';\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => formatInlineLiteral(item)).join(', ')}]`;\n }\n if (isPlainObject(value)) {\n const entries = Object.entries(value).filter(([, entryValue]) => entryValue !== undefined);\n if (!entries.length) {\n return '{}';\n }\n return `{ ${entries\n .map(([key, entryValue]) => `${formatPropertyName(key)}: ${formatInlineLiteral(entryValue)}`)\n .join(', ')} }`;\n }\n return 'undefined';\n}\n\nexport function addReferenceGetterProperty(\n configObject: ObjectLiteralExpression,\n key: string,\n refs: string[]\n): void {\n const property = configObject.addPropertyAssignment({\n name: key,\n initializer: '() => []',\n });\n const getter = property.getInitializerIfKindOrThrow(SyntaxKind.ArrowFunction);\n const body = getter.getBody().asKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n body.addElements(refs);\n}\n\nexport function addStringProperty(\n configObject: ObjectLiteralExpression,\n key: string,\n value: string\n): void {\n configObject.addPropertyAssignment({\n name: key,\n initializer: formatStringLiteral(value),\n });\n}\n\nexport function addValueToObject(obj: ObjectLiteralExpression, key: string, value: unknown): void {\n if (value === undefined) return;\n\n if (isPlainObject(value)) {\n const p = obj.addPropertyAssignment({ name: formatPropertyName(key), initializer: '{}' });\n const child = p.getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n for (const [k, v] of Object.entries(value)) addValueToObject(child, k, v);\n return;\n }\n\n if (Array.isArray(value)) {\n const p = obj.addPropertyAssignment({ name: formatPropertyName(key), initializer: '[]' });\n const arr = p.getInitializerIfKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n for (const item of value) {\n addValueToArray(arr, item);\n }\n return;\n }\n\n obj.addPropertyAssignment({\n name: formatPropertyName(key),\n initializer: formatInlineLiteral(value),\n });\n}\n\nfunction addValueToArray(arr: ArrayLiteralExpression, value: unknown) {\n if (isPlainObject(value)) {\n const expr = arr.addElement('{}');\n const child = expr.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n for (const [k, v] of Object.entries(value)) {\n addValueToObject(child, k, v);\n }\n return;\n }\n\n if (Array.isArray(value)) {\n const expr = arr.addElement('[]');\n const child = expr.asKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n for (const item of value) {\n addValueToArray(child, item);\n }\n return;\n }\n\n arr.addElement(formatInlineLiteral(value));\n}\n\nexport async function expectSnapshots(definitionV4: string): Promise<void> {\n const { currentTestName, snapshotState } = expect.getState();\n\n const snapshotDir = path.basename(snapshotState.testFilePath).replace('-generator.test.ts', '');\n await expect(definitionV4).toMatchFileSnapshot(\n `__snapshots__/${snapshotDir}/${currentTestName}-v4.txt`\n );\n}\n\nexport function hasReferences<T>(references?: T[]): references is T[] {\n return Array.isArray(references) && references.length > 0;\n}\n"],"mappings":"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"}
|
package/dist/commands/push.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","names":[],"sources":["../../src/commands/push.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { env } from '../env';\nimport { performBackgroundVersionCheck } from '../utils/background-version-check';\nimport { initializeCommand } from '../utils/cli-pipeline';\nimport { findAllConfigFiles, findConfigFile } from '../utils/config';\nimport { loadEnvironmentCredentials } from '../utils/environment-loader';\nimport { loadProject } from '../utils/project-loader';\n\nexport interface PushOptions {\n project?: string;\n config?: string;\n profile?: string;\n env?: string;\n json?: boolean;\n all?: boolean;\n tag?: string;\n quiet?: boolean;\n}\n\ninterface BatchPushResult {\n projectDir: string;\n projectId?: string;\n projectName?: string;\n success: boolean;\n error?: string;\n}\n\nexport async function pushCommand(options: PushOptions): Promise<void> {\n // Perform background version check (non-blocking)\n performBackgroundVersionCheck();\n\n // Handle --all flag for batch operations\n if (options.all) {\n await pushAllProjects(options);\n return;\n }\n\n // Use standardized CLI pipeline for initialization\n const { config } = await initializeCommand({\n configPath: options.config,\n profileName: options.profile,\n tag: options.tag,\n showSpinner: true,\n spinnerText: 'Loading configuration...',\n logConfig: true,\n quiet: options.quiet,\n });\n\n // Declare spinner at function scope so it's accessible in catch block\n const s = p.spinner();\n\n try {\n // Determine project directory - look for index.ts in current directory\n s.start('Detecting project...');\n let projectDir: string;\n\n if (options.project) {\n // If project path is explicitly specified, use it\n projectDir = resolve(process.cwd(), options.project);\n if (!existsSync(join(projectDir, 'index.ts'))) {\n s.stop(`No index.ts found in specified project directory: ${projectDir}`);\n process.exit(1);\n }\n } else {\n // Look for index.ts in current directory first\n const currentDir = process.cwd();\n if (existsSync(join(currentDir, 'index.ts'))) {\n projectDir = currentDir;\n } else {\n // Try to find config file and use its directory\n const configFile = findConfigFile(currentDir, options.tag);\n if (configFile) {\n const configDir = dirname(configFile);\n if (existsSync(join(configDir, 'index.ts'))) {\n projectDir = configDir;\n } else {\n s.stop('No index.ts found in config directory');\n console.error(\n chalk.yellow(\n 'Please run this command from a directory containing index.ts or use --project <path>'\n )\n );\n process.exit(1);\n }\n } else {\n s.stop('No index.ts found in current directory');\n console.error(\n chalk.yellow(\n 'Please run this command from a directory containing index.ts or use --project <path>'\n )\n );\n process.exit(1);\n }\n }\n }\n\n s.stop(`Project found: ${projectDir}`);\n\n // Set environment if provided\n if (options.env) {\n // Note: Setting process.env directly here because it needs to be available for child processes\n process.env.INKEEP_ENV = options.env;\n s.start(`Setting environment to '${options.env}'...`);\n }\n\n // Set environment variables for the SDK to use during project construction\n // This ensures the project is created with the correct tenant ID from the start\n const originalTenantId = process.env.INKEEP_TENANT_ID;\n const originalApiUrl = process.env.INKEEP_API_URL;\n\n process.env.INKEEP_TENANT_ID = config.tenantId;\n process.env.INKEEP_API_URL = config.agentsApiUrl;\n\n // Load project from index.ts\n s.start('Loading project from index.ts...');\n const project = await loadProject(projectDir);\n\n // Restore original environment variables\n if (originalTenantId !== undefined) {\n process.env.INKEEP_TENANT_ID = originalTenantId;\n } else {\n delete process.env.INKEEP_TENANT_ID;\n }\n if (originalApiUrl !== undefined) {\n process.env.INKEEP_API_URL = originalApiUrl;\n } else {\n delete process.env.INKEEP_API_URL;\n }\n\n s.stop('Project loaded successfully');\n\n // Set configuration on the project (still needed for consistency)\n if (typeof project.setConfig === 'function') {\n project.setConfig(\n config.tenantId,\n config.agentsApiUrl,\n undefined, // models - not needed here as they come from the project definition\n config.agentsApiKey\n );\n }\n\n // Load environment credentials if --env flag is provided\n if (options.env && typeof project.setCredentials === 'function') {\n s.start(`Loading credentials for environment '${options.env}'...`);\n\n try {\n const credentials = await loadEnvironmentCredentials(projectDir, options.env);\n project.setCredentials(credentials);\n\n s.stop('Project loaded with credentials');\n console.log(chalk.gray(` • Environment: ${options.env}`));\n console.log(chalk.gray(` • Credentials loaded: ${Object.keys(credentials).length}`));\n } catch (error: unknown) {\n s.stop('Failed to load environment credentials');\n console.error(chalk.red('Error:'), (error as Error).message);\n process.exit(1);\n }\n }\n\n // Dump project data to JSON file if --json flag is set\n if (options.json) {\n s.start('Generating project data JSON...');\n\n try {\n // Generate the project definition without initializing\n const projectDefinition = await project.getFullDefinition();\n\n // Create the JSON file path\n const jsonFilePath = join(projectDir, `project.json`);\n\n // Write the project data to JSON file\n const fs = await import('node:fs/promises');\n await fs.writeFile(jsonFilePath, JSON.stringify(projectDefinition, null, 2));\n\n s.stop(`Project data saved to ${jsonFilePath}`);\n console.log(chalk.gray(` • File: ${jsonFilePath}`));\n console.log(chalk.gray(` • Size: ${JSON.stringify(projectDefinition).length} bytes`));\n\n // Show a summary of what was saved\n const agentCount = Object.keys(projectDefinition.agents || {}).length;\n const toolCount = Object.keys(projectDefinition.tools || {}).length;\n const subAgentCount = Object.values(projectDefinition.agents || {}).reduce(\n (total, agent) => {\n return total + Object.keys(agent.subAgents || {}).length;\n },\n 0\n );\n\n console.log(chalk.cyan('\\n📊 Project Data Summary:'));\n console.log(chalk.gray(` • Agent: ${agentCount}`));\n console.log(chalk.gray(` • Tools: ${toolCount}`));\n console.log(chalk.gray(` • SubAgent: ${subAgentCount}`));\n\n // Exit after generating JSON (don't initialize the project)\n console.log(chalk.green('\\n✨ JSON file generated successfully!'));\n process.exit(0);\n } catch (error: unknown) {\n s.stop('Failed to generate JSON file');\n console.error(chalk.red('Error:'), (error as Error).message);\n process.exit(1);\n }\n }\n\n // Initialize the project (this will push to the backend)\n s.start('Initializing project...');\n await project.init();\n\n // Get project details\n const projectId = project.getId();\n const projectName = project.getName();\n const stats = project.getStats();\n\n s.stop(`Project \"${projectName}\" (${projectId}) pushed successfully`);\n\n // Display summary\n console.log(chalk.cyan('\\n📊 Project Summary:'));\n console.log(chalk.gray(` • Project ID: ${projectId}`));\n console.log(chalk.gray(` • Name: ${projectName}`));\n console.log(chalk.gray(` • Agent: ${stats.agentCount}`));\n console.log(chalk.gray(` • Tenant: ${stats.tenantId}`));\n\n // Display agent details if exsits\n const agents = project.getAgents();\n if (agents.length > 0) {\n console.log(chalk.cyan('\\n📊 Agent Details:'));\n for (const agent of agents) {\n const agentStats = agent.getStats();\n console.log(\n chalk.gray(` • ${agent.getName()} (${agent.getId()}): ${agentStats.agentCount} agents`)\n );\n }\n }\n\n // Display credential tracking information\n try {\n const credentialTracking = await project.getCredentialTracking();\n const credentialCount = Object.keys(credentialTracking.credentials).length;\n\n if (credentialCount > 0) {\n console.log(chalk.cyan('\\n🔐 Credentials:'));\n console.log(chalk.gray(` • Total credentials: ${credentialCount}`));\n\n // Show credential details\n for (const [credId, credData] of Object.entries(credentialTracking.credentials)) {\n const usageInfo = credentialTracking.usage[credId] || [];\n const credType = credData.type || 'unknown';\n const storeId = credData.credentialStoreId || 'unknown';\n\n console.log(chalk.gray(` • ${credId} (${credType}, store: ${storeId})`));\n\n if (usageInfo.length > 0) {\n const usageByType: Record<string, number> = {};\n for (const usage of usageInfo) {\n usageByType[usage.type] = (usageByType[usage.type] || 0) + 1;\n }\n\n const usageSummary = Object.entries(usageByType)\n .map(([type, count]) => `${count} ${type}${count > 1 ? 's' : ''}`)\n .join(', ');\n\n console.log(chalk.gray(` Used by: ${usageSummary}`));\n }\n }\n }\n } catch (_error) {\n // Silently fail if credential tracking is not available\n if (env.DEBUG) {\n console.error(chalk.yellow('Could not retrieve credential tracking information'));\n }\n }\n\n // Display project URL if available\n if (config.manageUiUrl) {\n const projectUrl = `${config.manageUiUrl}/${config.tenantId}/projects/${projectId}`;\n console.log(chalk.cyan('\\n🔗 Project URL:'));\n console.log(chalk.blue.underline(` ${projectUrl}`));\n }\n\n // Provide next steps\n console.log(chalk.green('\\n✨ Next steps:'));\n console.log(chalk.gray(` • View all agents: inkeep list-agent`));\n\n // Force exit to avoid hanging due to OpenTelemetry or other background tasks\n process.exit(0);\n } catch (_error: unknown) {\n s.stop('Failed to push project');\n const error = _error as Error;\n console.error(chalk.red('Error:'), error.message);\n\n if (error.stack && env.DEBUG) {\n console.error(chalk.gray(error.stack));\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Check if an index.ts file exports a project (has __type = 'project')\n */\nasync function isProjectDirectory(dir: string): Promise<boolean> {\n const indexPath = join(dir, 'index.ts');\n if (!existsSync(indexPath)) {\n return false;\n }\n\n try {\n // Dynamically import to check for project export\n const { importWithTypeScriptSupport } = await import('../utils/tsx-loader');\n const module = await importWithTypeScriptSupport(indexPath);\n\n // Check if any export has __type = 'project'\n for (const key of Object.keys(module)) {\n const value = module[key];\n if (value && typeof value === 'object' && value.__type === 'project') {\n return true;\n }\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Find all directories containing index.ts that export a project\n */\nasync function findAllProjectDirs(\n rootDir: string,\n excludeDirs: string[] = ['node_modules', '.git', 'dist', 'build', '.temp-validation']\n): Promise<string[]> {\n const projectDirs: string[] = [];\n\n async function scanDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n return;\n }\n\n let items: string[];\n try {\n items = readdirSync(dir);\n } catch {\n return;\n }\n\n // Check if this directory has an index.ts that exports a project\n if (existsSync(join(dir, 'index.ts'))) {\n const isProject = await isProjectDirectory(dir);\n if (isProject) {\n projectDirs.push(dir);\n // Don't recurse into subdirectories of a project\n return;\n }\n }\n\n // Recurse into subdirectories\n for (const item of items) {\n const fullPath = join(dir, item);\n\n // Skip excluded directories\n if (excludeDirs.includes(item)) {\n continue;\n }\n\n try {\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n await scanDirectory(fullPath);\n }\n } catch {\n // Skip files/directories we can't stat\n }\n }\n }\n\n await scanDirectory(rootDir);\n return projectDirs.sort();\n}\n\n/**\n * Push all projects found in current directory tree\n */\nasync function pushAllProjects(options: PushOptions): Promise<void> {\n console.log(chalk.blue('\\n🚀 Batch Push: Finding all projects...\\n'));\n\n // Strategy 1: Find all config files and check for index.ts in same directory\n const configFiles = findAllConfigFiles(process.cwd(), options.tag);\n const projectDirsFromConfig: string[] = [];\n for (const configFile of configFiles) {\n const dir = dirname(configFile);\n if (existsSync(join(dir, 'index.ts'))) {\n projectDirsFromConfig.push(dir);\n }\n }\n\n // Strategy 2: Find all index.ts files that export a project and can find a config (supports shared config)\n const allIndexDirs = await findAllProjectDirs(process.cwd());\n const projectDirsFromIndex: string[] = [];\n for (const dir of allIndexDirs) {\n // Skip if already found via config file in same directory\n if (projectDirsFromConfig.includes(dir)) {\n continue;\n }\n // Check if this directory can find a config file (walking up the tree)\n const configFile = findConfigFile(dir, options.tag);\n if (configFile) {\n projectDirsFromIndex.push(dir);\n }\n }\n\n // Combine both strategies\n const projectDirs = [...projectDirsFromConfig, ...projectDirsFromIndex].sort();\n\n if (projectDirs.length === 0) {\n const configPattern = options.tag ? `${options.tag}.__inkeep.config.ts__` : 'inkeep.config.ts';\n console.error(chalk.red('No valid projects found.'));\n console.log(\n chalk.yellow(\n `\\nHint: Projects must have an index.ts file and access to an ${configPattern} file`\n )\n );\n console.log(chalk.yellow(' (either in the same directory or in a parent directory).'));\n process.exit(1);\n }\n\n console.log(chalk.gray(`Found ${projectDirs.length} project(s) to push:\\n`));\n for (const dir of projectDirs) {\n const relativePath = dir === process.cwd() ? '.' : dir.replace(`${process.cwd()}/`, '');\n console.log(chalk.gray(` • ${relativePath}`));\n }\n console.log();\n\n const results: BatchPushResult[] = [];\n const total = projectDirs.length;\n\n for (let i = 0; i < projectDirs.length; i++) {\n const projectDir = projectDirs[i];\n const relativePath =\n projectDir === process.cwd() ? '.' : projectDir.replace(`${process.cwd()}/`, '');\n const progress = `[${i + 1}/${total}]`;\n\n console.log(chalk.cyan(`${progress} Pushing ${relativePath}...`));\n\n const result = await pushSingleProject(projectDir, options);\n results.push(result);\n\n if (result.success) {\n console.log(\n chalk.green(` ✓ ${result.projectName || result.projectId || basename(projectDir)}`)\n );\n } else {\n console.log(chalk.red(` ✗ ${basename(projectDir)}: ${result.error}`));\n }\n }\n\n // Print summary\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n console.log(chalk.cyan('\\n📊 Batch Push Summary:'));\n console.log(chalk.green(` ✓ Succeeded: ${succeeded}`));\n if (failed > 0) {\n console.log(chalk.red(` ✗ Failed: ${failed}`));\n\n console.log(chalk.red('\\nFailed projects:'));\n for (const result of results) {\n if (!result.success) {\n const relativePath =\n result.projectDir === process.cwd()\n ? '.'\n : result.projectDir.replace(`${process.cwd()}/`, '');\n console.log(chalk.red(` • ${relativePath}: ${result.error}`));\n }\n }\n }\n\n process.exit(failed > 0 ? 1 : 0);\n}\n\n/**\n * Push a single project (used by batch operations)\n */\nasync function pushSingleProject(\n projectDir: string,\n options: PushOptions\n): Promise<BatchPushResult> {\n try {\n // Find config file for this project directory\n const configFile = findConfigFile(projectDir, options.tag);\n\n // Use standardized CLI pipeline for initialization\n const { config } = await initializeCommand({\n configPath: configFile || undefined,\n profileName: options.profile,\n tag: options.tag,\n showSpinner: false,\n logConfig: false,\n });\n\n // Set environment variables for the SDK\n const originalTenantId = process.env.INKEEP_TENANT_ID;\n const originalApiUrl = process.env.INKEEP_API_URL;\n\n process.env.INKEEP_TENANT_ID = config.tenantId;\n process.env.INKEEP_API_URL = config.agentsApiUrl;\n\n // Load project from index.ts\n const project = await loadProject(projectDir);\n\n // Restore original environment variables\n if (originalTenantId !== undefined) {\n process.env.INKEEP_TENANT_ID = originalTenantId;\n } else {\n delete process.env.INKEEP_TENANT_ID;\n }\n if (originalApiUrl !== undefined) {\n process.env.INKEEP_API_URL = originalApiUrl;\n } else {\n delete process.env.INKEEP_API_URL;\n }\n\n // Set configuration on the project\n if (typeof project.setConfig === 'function') {\n project.setConfig(config.tenantId, config.agentsApiUrl, undefined, config.agentsApiKey);\n }\n\n // Load environment credentials if --env flag is provided\n if (options.env && typeof project.setCredentials === 'function') {\n const credentials = await loadEnvironmentCredentials(projectDir, options.env);\n project.setCredentials(credentials);\n }\n\n // Initialize the project (this will push to the backend)\n await project.init();\n\n return {\n projectDir,\n projectId: project.getId(),\n projectName: project.getName(),\n success: true,\n };\n } catch (error) {\n return {\n projectDir,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n"],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","names":[],"sources":["../../src/commands/status.ts"],"sourcesContent":["import chalk from 'chalk';\nimport {\n checkKeychainAvailability,\n getCredentialExpiryInfo,\n loadCredentials,\n} from '../utils/credentials';\nimport { ProfileManager } from '../utils/profiles';\n\nexport interface StatusOptions {\n profile?: string;\n}\n\nexport async function statusCommand(options: StatusOptions = {}): Promise<void> {\n const profileManager = new ProfileManager();\n\n // Resolve profile to use\n let profileName: string;\n let credentialKey: string;\n let agentsApiUrl: string;\n let manageUiUrl: string;\n let environment: string;\n\n try {\n if (options.profile) {\n const profile = profileManager.getProfile(options.profile);\n if (!profile) {\n console.error(chalk.red(`Profile '${options.profile}' not found.`));\n console.log(chalk.gray('Run \"inkeep profile list\" to see available profiles.'));\n process.exit(1);\n }\n profileName = options.profile;\n credentialKey = profile.credential;\n agentsApiUrl = profile.remote.api;\n manageUiUrl = profile.remote.manageUi;\n environment = profile.environment;\n } else {\n const activeProfile = profileManager.getActiveProfile();\n profileName = activeProfile.name;\n credentialKey = activeProfile.credential;\n agentsApiUrl = activeProfile.remote.api;\n manageUiUrl = activeProfile.remote.manageUi;\n environment = activeProfile.environment;\n }\n } catch {\n // No profile configured\n console.log(chalk.yellow('No profile configured.'));\n console.log(chalk.gray('Run \"inkeep profile add\" to create a profile.'));\n console.log(chalk.gray('Or run \"inkeep login\" to authenticate with default settings.'));\n return;\n }\n\n console.log();\n console.log(chalk.bold('Current Profile:'), chalk.cyan(profileName));\n console.log();\n\n // Check keychain availability\n const { available: keychainAvailable, reason } = await checkKeychainAvailability();\n\n if (!keychainAvailable) {\n console.log(chalk.bold('Auth:'), chalk.yellow('keychain unavailable'));\n console.log(chalk.gray(` Reason: ${reason || 'unknown'}`));\n console.log(chalk.gray(' For CI/CD environments, use INKEEP_API_KEY instead.'));\n console.log();\n } else {\n // Check credentials\n const credentials = await loadCredentials(credentialKey);\n\n if (!credentials) {\n console.log(chalk.bold('Auth:'), chalk.red('not authenticated'));\n console.log(chalk.gray(` Credential: ${credentialKey} (not found)`));\n console.log(chalk.gray(' Run \"inkeep login\" to authenticate.'));\n console.log();\n } else {\n const expiryInfo = getCredentialExpiryInfo(credentials);\n\n if (expiryInfo.isExpired) {\n console.log(chalk.bold('Auth:'), chalk.red('expired'));\n console.log(chalk.gray(` User: ${credentials.userEmail}`));\n if (credentials.organizationName) {\n console.log(chalk.gray(` Organization: ${credentials.organizationName}`));\n }\n console.log(chalk.gray(` Credential: ${credentialKey}`));\n console.log(chalk.red(' Session expired. Run \"inkeep login\" to re-authenticate.'));\n console.log();\n } else {\n const expiresText = expiryInfo.expiresIn\n ? chalk.gray(` (expires in ${expiryInfo.expiresIn})`)\n : '';\n console.log(chalk.bold('Auth:'), chalk.green('authenticated') + expiresText);\n console.log(chalk.gray(` User: ${credentials.userEmail}`));\n if (credentials.organizationName) {\n console.log(chalk.gray(` Organization: ${credentials.organizationName}`));\n }\n console.log(chalk.gray(` Credential: ${credentialKey}`));\n console.log();\n }\n }\n }\n\n // Show remote URLs\n console.log(chalk.bold('Remote:'));\n console.log(chalk.gray(` Agents API: ${agentsApiUrl}`));\n console.log(chalk.gray(` Manage UI: ${manageUiUrl}`));\n console.log();\n\n // Show environment\n console.log(chalk.bold('Environment:'), environment);\n console.log();\n}\n"],"mappings":"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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","names":[],"sources":["../../src/commands/update.ts"],"sourcesContent":["import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { detectPackageManager, executeUpdate, type PackageManager } from '../utils/package-manager';\nimport { checkForUpdate, PACKAGE_CHANGELOG } from '../utils/version-check';\n\nexport interface UpdateOptions {\n check?: boolean;\n force?: boolean;\n}\n\n/**\n * Update command - updates the CLI to the latest version\n */\nexport async function updateCommand(options: UpdateOptions = {}): Promise<void> {\n const s = p.spinner();\n s.start('Checking for updates...');\n\n try {\n // Check for updates\n const versionInfo = await checkForUpdate();\n s.stop();\n\n // Display current version info\n console.log(chalk.cyan('\\n📦 Version Information:'));\n console.log(chalk.gray(` • Current version: ${versionInfo.current}`));\n console.log(chalk.gray(` • Latest version: ${versionInfo.latest}`));\n\n // If only checking, exit here\n if (options.check) {\n if (versionInfo.needsUpdate) {\n console.log(chalk.yellow('\\n⚠️ An update is available!'));\n console.log(chalk.gray(` • Run ${chalk.cyan('inkeep update')} to update`));\n } else {\n console.log(chalk.green('\\n✅ You are on the latest version'));\n }\n return;\n }\n\n // If no update needed and not forced\n if (!versionInfo.needsUpdate && !options.force) {\n console.log(chalk.green('\\n✅ You are already on the latest version'));\n return;\n }\n\n // If force updating to the same version\n if (!versionInfo.needsUpdate && options.force) {\n console.log(chalk.yellow('\\n⚠️ Forcing reinstall of current version...'));\n }\n\n // Display changelog link\n console.log(chalk.cyan('\\n📖 Changelog:'));\n console.log(chalk.gray(` • ${PACKAGE_CHANGELOG}`));\n\n // Detect package manager\n s.start('Detecting package manager...');\n const detectedManager = await detectPackageManager();\n s.stop();\n\n let packageManager: PackageManager;\n\n if (!detectedManager) {\n console.log(chalk.yellow('\\n⚠️ Could not auto-detect package manager'));\n const manager = (await p.select({\n message: 'Which package manager did you use to install the CLI?',\n options: [\n { label: 'npm', value: 'npm' },\n { label: 'pnpm', value: 'pnpm' },\n { label: 'bun', value: 'bun' },\n { label: 'yarn', value: 'yarn' },\n ],\n })) as PackageManager;\n\n if (p.isCancel(manager)) {\n p.cancel('Update cancelled');\n process.exit(1);\n }\n\n packageManager = manager;\n } else {\n packageManager = detectedManager;\n console.log(chalk.gray(`\\n🔍 Detected package manager: ${chalk.cyan(packageManager)}`));\n }\n\n // Confirm update unless --force flag is used\n if (!options.force) {\n const confirm = await p.confirm({\n message: `Update @inkeep/agents-cli from ${versionInfo.current} to ${versionInfo.latest}?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Update cancelled');\n process.exit(1);\n }\n }\n\n // Execute update\n s.start(`Updating @inkeep/agents-cli to ${versionInfo.latest}...`);\n await executeUpdate(packageManager);\n s.stop(`Updated to version ${versionInfo.latest}`);\n\n console.log(chalk.green('\\n✨ Update completed successfully!'));\n console.log(chalk.gray(` • New version: ${versionInfo.latest}`));\n console.log(chalk.gray(` • Package manager: ${packageManager}`));\n } catch (error) {\n s.stop('Update failed');\n console.error(chalk.red('\\n❌ Error:'), (error as Error).message);\n\n if (\n (error as Error).message.includes('EACCES') ||\n (error as Error).message.includes('permission')\n ) {\n console.log(chalk.yellow('\\n💡 Tip: Try running the command with elevated permissions:'));\n console.log(chalk.gray(' • sudo inkeep update'));\n }\n\n process.exit(1);\n }\n}\n"],"mappings":";;;;;;;;;AAaA,eAAsB,cAAc,UAAyB,EAAE,EAAiB;CAC9E,MAAM,IAAI,EAAE,SAAS;AACrB,GAAE,MAAM,0BAA0B;AAElC,KAAI;EAEF,MAAM,cAAc,MAAM,gBAAgB;AAC1C,IAAE,MAAM;AAGR,UAAQ,IAAI,MAAM,KAAK,4BAA4B,CAAC;AACpD,UAAQ,IAAI,MAAM,KAAK,wBAAwB,YAAY,UAAU,CAAC;AACtE,UAAQ,IAAI,MAAM,KAAK,wBAAwB,YAAY,SAAS,CAAC;AAGrE,MAAI,QAAQ,OAAO;AACjB,OAAI,YAAY,aAAa;AAC3B,YAAQ,IAAI,MAAM,OAAO,gCAAgC,CAAC;AAC1D,YAAQ,IAAI,MAAM,KAAK,WAAW,MAAM,KAAK,gBAAgB,CAAC,YAAY,CAAC;SAE3E,SAAQ,IAAI,MAAM,MAAM,oCAAoC,CAAC;AAE/D;;AAIF,MAAI,CAAC,YAAY,eAAe,CAAC,QAAQ,OAAO;AAC9C,WAAQ,IAAI,MAAM,MAAM,4CAA4C,CAAC;AACrE;;AAIF,MAAI,CAAC,YAAY,eAAe,QAAQ,MACtC,SAAQ,IAAI,MAAM,OAAO,gDAAgD,CAAC;AAI5E,UAAQ,IAAI,MAAM,KAAK,kBAAkB,CAAC;AAC1C,UAAQ,IAAI,MAAM,KAAK,OAAO,oBAAoB,CAAC;AAGnD,IAAE,MAAM,+BAA+B;EACvC,MAAM,kBAAkB,MAAM,sBAAsB;AACpD,IAAE,MAAM;EAER,IAAI;AAEJ,MAAI,CAAC,iBAAiB;AACpB,WAAQ,IAAI,MAAM,OAAO,8CAA8C,CAAC;GACxE,MAAM,UAAW,MAAM,EAAE,OAAO;IAC9B,SAAS;IACT,SAAS;KACP;MAAE,OAAO;MAAO,OAAO;MAAO;KAC9B;MAAE,OAAO;MAAQ,OAAO;MAAQ;KAChC;MAAE,OAAO;MAAO,OAAO;MAAO;KAC9B;MAAE,OAAO;MAAQ,OAAO;MAAQ;KACjC;IACF,CAAC;AAEF,OAAI,EAAE,SAAS,QAAQ,EAAE;AACvB,MAAE,OAAO,mBAAmB;AAC5B,YAAQ,KAAK,EAAE;;AAGjB,oBAAiB;SACZ;AACL,oBAAiB;AACjB,WAAQ,IAAI,MAAM,KAAK,kCAAkC,MAAM,KAAK,eAAe,GAAG,CAAC;;AAIzF,MAAI,CAAC,QAAQ,OAAO;GAClB,MAAM,UAAU,MAAM,EAAE,QAAQ;IAC9B,SAAS,kCAAkC,YAAY,QAAQ,MAAM,YAAY,OAAO;IACxF,cAAc;IACf,CAAC;AAEF,OAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,MAAE,OAAO,mBAAmB;AAC5B,YAAQ,KAAK,EAAE;;;AAKnB,IAAE,MAAM,kCAAkC,YAAY,OAAO,KAAK;AAClE,QAAM,cAAc,eAAe;AACnC,IAAE,KAAK,sBAAsB,YAAY,SAAS;AAElD,UAAQ,IAAI,MAAM,MAAM,qCAAqC,CAAC;AAC9D,UAAQ,IAAI,MAAM,KAAK,oBAAoB,YAAY,SAAS,CAAC;AACjE,UAAQ,IAAI,MAAM,KAAK,wBAAwB,iBAAiB,CAAC;UAC1D,OAAO;AACd,IAAE,KAAK,gBAAgB;AACvB,UAAQ,MAAM,MAAM,IAAI,aAAa,EAAG,MAAgB,QAAQ;AAEhE,MACG,MAAgB,QAAQ,SAAS,SAAS,IAC1C,MAAgB,QAAQ,SAAS,aAAa,EAC/C;AACA,WAAQ,IAAI,MAAM,OAAO,+DAA+D,CAAC;AACzF,WAAQ,IAAI,MAAM,KAAK,yBAAyB,CAAC;;AAGnD,UAAQ,KAAK,EAAE"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","names":[],"sources":["../../src/commands/whoami.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { loadCredentials } from '../utils/credentials';\n\nexport async function whoamiCommand(): Promise<void> {\n const credentials = await loadCredentials();\n\n if (!credentials) {\n console.log(chalk.yellow('Not logged in'));\n console.log(chalk.gray('Run `inkeep login` to authenticate'));\n return;\n }\n\n // Check if session has expired\n let isExpired = false;\n if (credentials.expiresAt) {\n const expiresAt = new Date(credentials.expiresAt);\n isExpired = expiresAt < new Date();\n }\n\n console.log();\n console.log(chalk.bold('Current User:'));\n console.log(` Email: ${chalk.cyan(credentials.userEmail)}`);\n\n if (credentials.organizationName) {\n console.log(` Organization: ${chalk.cyan(credentials.organizationName)}`);\n } else if (credentials.organizationId) {\n console.log(` Organization ID: ${chalk.cyan(credentials.organizationId)}`);\n }\n\n if (isExpired) {\n console.log(` Status: ${chalk.red('Expired')}`);\n console.log();\n console.log(chalk.yellow('Your session has expired. Run `inkeep login` to re-authenticate.'));\n } else {\n console.log(` Status: ${chalk.green('Active')}`);\n if (credentials.expiresAt) {\n const expiresAt = new Date(credentials.expiresAt);\n console.log(` Expires: ${chalk.gray(expiresAt.toLocaleDateString())}`);\n }\n }\n\n if (credentials.createdAt) {\n const createdAt = new Date(credentials.createdAt);\n console.log(` Logged in: ${chalk.gray(createdAt.toLocaleDateString())}`);\n }\n\n console.log();\n}\n"],"mappings":";;;;AAGA,eAAsB,gBAA+B;CACnD,MAAM,cAAc,MAAM,iBAAiB;AAE3C,KAAI,CAAC,aAAa;AAChB,UAAQ,IAAI,MAAM,OAAO,gBAAgB,CAAC;AAC1C,UAAQ,IAAI,MAAM,KAAK,qCAAqC,CAAC;AAC7D;;CAIF,IAAI,YAAY;AAChB,KAAI,YAAY,UAEd,aADkB,IAAI,KAAK,YAAY,UAAU,mBACzB,IAAI,MAAM;AAGpC,SAAQ,KAAK;AACb,SAAQ,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACxC,SAAQ,IAAI,YAAY,MAAM,KAAK,YAAY,UAAU,GAAG;AAE5D,KAAI,YAAY,iBACd,SAAQ,IAAI,mBAAmB,MAAM,KAAK,YAAY,iBAAiB,GAAG;UACjE,YAAY,eACrB,SAAQ,IAAI,sBAAsB,MAAM,KAAK,YAAY,eAAe,GAAG;AAG7E,KAAI,WAAW;AACb,UAAQ,IAAI,aAAa,MAAM,IAAI,UAAU,GAAG;AAChD,UAAQ,KAAK;AACb,UAAQ,IAAI,MAAM,OAAO,mEAAmE,CAAC;QACxF;AACL,UAAQ,IAAI,aAAa,MAAM,MAAM,SAAS,GAAG;AACjD,MAAI,YAAY,WAAW;GACzB,MAAM,YAAY,IAAI,KAAK,YAAY,UAAU;AACjD,WAAQ,IAAI,cAAc,MAAM,KAAK,UAAU,oBAAoB,CAAC,GAAG;;;AAI3E,KAAI,YAAY,WAAW;EACzB,MAAM,YAAY,IAAI,KAAK,YAAY,UAAU;AACjD,UAAQ,IAAI,gBAAgB,MAAM,KAAK,UAAU,oBAAoB,CAAC,GAAG;;AAG3E,SAAQ,KAAK"}
|
package/dist/config.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["// Nested API configuration format (new)\nexport interface ApiConfig {\n /**\n * API endpoint URL\n */\n url: string;\n /**\n * API key\n */\n apiKey?: string;\n}\n\n// Flat configuration format (legacy, for backward compatibility)\nexport interface FlatInkeepConfig {\n tenantId: string;\n /**\n * @deprecated Use the nested `agentsApi.url` format instead\n */\n agentsApiUrl: string;\n manageUiUrl?: string;\n outputDirectory?: string;\n}\n\n// Nested configuration format (new)\nexport interface NestedInkeepConfig {\n /**\n * Tenant identifier\n */\n tenantId: string;\n /**\n * API configuration\n * @default http://localhost:3002\n */\n agentsApi: ApiConfig;\n /**\n * Management UI URL\n * @default http://localhost:3000\n */\n manageUiUrl?: string;\n /**\n * Output directory for generated files\n */\n outputDirectory?: string;\n}\n\n// Union type supporting both formats\nexport type InkeepConfig = FlatInkeepConfig | NestedInkeepConfig;\n\nexport function defineConfig(config: InkeepConfig): InkeepConfig {\n return config;\n}\n"],"mappings":";AAgDA,SAAgB,aAAa,QAAoC;AAC/D,QAAO"}
|
package/dist/env.js
CHANGED
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","names":[],"sources":["../src/env.ts"],"sourcesContent":["import { loadEnvironmentFiles } from '@inkeep/agents-core';\nimport { z } from 'zod';\n\n// Load environment files to get secrets (API keys, bypass tokens)\n// These files are loaded from:\n// 1. Current directory .env (where the CLI command is run)\n// 2. Parent directories .env (searching upwards)\n// 3. ~/.inkeep/config (user global config)\n//\n// NOTE: We load these for secrets, but the CLI will IGNORE the URL configuration\n// values (INKEEP_AGENTS_MANAGE_API_URL, INKEEP_AGENTS_RUN_API_URL) from .env files.\n// URL configuration should only come from inkeep.config.ts or CLI flags.\nloadEnvironmentFiles();\n\nconst envSchema: z.ZodType<Env> = z.object({\n // Debug Configuration\n DEBUG: z.string().optional().describe('Enable debug mode for verbose logging'),\n\n // AI Provider API Keys (loaded from .env files relative to where CLI is executed)\n ANTHROPIC_API_KEY: z\n .string()\n .optional()\n .describe('Anthropic API key for Claude models. Get from https://console.anthropic.com/'),\n OPENAI_API_KEY: z\n .string()\n .optional()\n .describe('OpenAI API key for GPT models. Get from https://platform.openai.com/'),\n GOOGLE_GENERATIVE_AI_API_KEY: z\n .string()\n .optional()\n .describe('Google Generative AI API key for Gemini models'),\n\n // Langfuse Configuration (LLM observability)\n LANGFUSE_SECRET_KEY: z.string().optional().describe('Langfuse secret key for LLM observability'),\n LANGFUSE_PUBLIC_KEY: z.string().optional().describe('Langfuse public key for LLM observability'),\n LANGFUSE_BASEURL: z\n .string()\n .optional()\n .default('https://cloud.langfuse.com')\n .describe('Langfuse server base URL'),\n LANGFUSE_ENABLED: z\n .string()\n .optional()\n .transform((val) => val === 'true')\n .describe('Enable Langfuse LLM observability (set to \"true\" to enable)'),\n});\n\nconst parseEnv = (): Env => {\n try {\n const parsedEnv = envSchema.parse(process.env);\n return parsedEnv;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const missingVars = error.issues.map((issue) => issue.path.join('.'));\n throw new Error(\n `❌ Invalid environment variables: ${missingVars.join(', ')}\\n${error.message}`\n );\n }\n throw error;\n }\n};\n\nexport const env: Env = parseEnv();\n\nexport interface Env {\n DEBUG?: string;\n ANTHROPIC_API_KEY?: string;\n OPENAI_API_KEY?: string;\n GOOGLE_GENERATIVE_AI_API_KEY?: string;\n LANGFUSE_SECRET_KEY?: string;\n LANGFUSE_PUBLIC_KEY?: string;\n LANGFUSE_BASEURL: string;\n LANGFUSE_ENABLED: boolean;\n}\n"],"mappings":";;;;AAYA,sBAAsB;AAEtB,MAAM,YAA4B,EAAE,OAAO;CAEzC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,wCAAwC;CAG9E,mBAAmB,EAChB,QAAQ,CACR,UAAU,CACV,SAAS,+EAA+E;CAC3F,gBAAgB,EACb,QAAQ,CACR,UAAU,CACV,SAAS,uEAAuE;CACnF,8BAA8B,EAC3B,QAAQ,CACR,UAAU,CACV,SAAS,iDAAiD;CAG7D,qBAAqB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,4CAA4C;CAChG,qBAAqB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,4CAA4C;CAChG,kBAAkB,EACf,QAAQ,CACR,UAAU,CACV,QAAQ,6BAA6B,CACrC,SAAS,2BAA2B;CACvC,kBAAkB,EACf,QAAQ,CACR,UAAU,CACV,WAAW,QAAQ,QAAQ,OAAO,CAClC,SAAS,gEAA8D;CAC3E,CAAC;AAEF,MAAM,iBAAsB;AAC1B,KAAI;AAEF,SADkB,UAAU,MAAM,QAAQ,IAAI;UAEvC,OAAO;AACd,MAAI,iBAAiB,EAAE,UAAU;GAC/B,MAAM,cAAc,MAAM,OAAO,KAAK,UAAU,MAAM,KAAK,KAAK,IAAI,CAAC;AACrE,SAAM,IAAI,MACR,oCAAoC,YAAY,KAAK,KAAK,CAAC,IAAI,MAAM,UACtE;;AAEH,QAAM;;;AAIV,MAAa,MAAW,UAAU"}
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport './env'; // Load environment files first (needed by instrumentation)\nimport './instrumentation'; // Initialize Langfuse tracing second\n\n// Silence config loading logs for cleaner CLI output\nimport { getLogger } from '@inkeep/agents-core';\n\nconst configLogger = getLogger('config');\nconfigLogger.updateOptions({ level: 'silent' });\n\nimport { Command } from 'commander';\nimport { addCommand } from './commands/add';\nimport { configGetCommand, configListCommand, configSetCommand } from './commands/config';\nimport { devCommand } from './commands/dev';\nimport { initCommand } from './commands/init';\nimport { listAgentsCommand } from './commands/list-agents';\nimport { loginCommand } from './commands/login';\nimport { logoutCommand } from './commands/logout';\nimport {\n profileAddCommand,\n profileCurrentCommand,\n profileListCommand,\n profileRemoveCommand,\n profileUseCommand,\n} from './commands/profile';\nimport { pullV4Command } from './commands/pull-v4/introspect';\nimport { pushCommand } from './commands/push';\nimport { statusCommand } from './commands/status';\nimport { updateCommand } from './commands/update';\nimport { whoamiCommand } from './commands/whoami';\nimport { PACKAGE_VERSION } from './utils/version-check';\n\nconst program = new Command();\n\nprogram.name('inkeep').description('CLI tool for Inkeep Agent Framework').version(PACKAGE_VERSION);\n\nprogram\n .command('add [template]')\n .description('Add a new template to the project')\n .option('--project <template>', 'Project template to add')\n .option('--mcp <template>', 'MCP template to add')\n .option(\n '--ui [component-id]',\n 'Add UI component(s) to apps/agents-ui/src/ui (omit id to add all)'\n )\n .option('--list', 'List available UI components (use with --ui)')\n .option('--target-path <path>', 'Target path to add the template to')\n .option('--local-prefix <path_prefix>', 'Use local templates from the given path prefix')\n .option('--config <path>', 'Path to configuration file')\n .option('--profile <name>', 'Profile to use for authentication')\n .option('--quiet', 'Suppress profile/config logging')\n .action(async (template, options) => {\n await addCommand({ template, ...options });\n });\n\nprogram\n .command('init [path]')\n .description('Initialize a new Inkeep project (runs cloud onboarding wizard by default)')\n .option('--local', 'Use local/self-hosted mode instead of cloud onboarding')\n .option('--no-interactive', 'Skip interactive prompts')\n .option('--config <path>', 'Path to use as template for new configuration')\n .action(async (path, options) => {\n await initCommand({ path, ...options });\n });\n\nconst configCommand = program.command('config').description('Manage Inkeep configuration');\n\nconfigCommand\n .command('get [key]')\n .description('Get configuration value(s)')\n .option('--config <path>', 'Path to configuration file')\n .option('--config-file-path <path>', 'Path to configuration file (deprecated, use --config)')\n .action(async (key, options) => {\n const config = options.config || options.configFilePath;\n await configGetCommand(key, { config });\n });\n\nconfigCommand\n .command('set <key> <value>')\n .description('Set a configuration value')\n .option('--config <path>', 'Path to configuration file')\n .option('--config-file-path <path>', 'Path to configuration file (deprecated, use --config)')\n .action(async (key, value, options) => {\n const config = options.config || options.configFilePath;\n await configSetCommand(key, value, { config });\n });\n\nconfigCommand\n .command('list')\n .description('List all configuration values')\n .option('--config <path>', 'Path to configuration file')\n .option('--config-file-path <path>', 'Path to configuration file (deprecated, use --config)')\n .action(async (options) => {\n const config = options.config || options.configFilePath;\n await configListCommand({ config });\n });\n\nprogram\n .command('push')\n .description('Push a project configuration to the backend')\n .option('--project <project-id>', 'Project ID or path to project directory')\n .option('--config <path>', 'Path to configuration file')\n .option('--profile <name>', 'Profile to use for remote URLs and authentication')\n .option('--tenant-id <id>', 'Override tenant ID')\n .option('--agents-api-url <url>', 'Override agents API URL')\n .option(\n '--env <environment>',\n 'Environment to use for credential resolution (e.g., development, production)'\n )\n .option('--json', 'Generate project data JSON file instead of pushing to backend')\n .option('--all', 'Push all projects found in current directory tree')\n .option(\n '--tag <tag>',\n 'Use tagged config file (e.g., --tag prod loads prod.__inkeep.config.ts__)'\n )\n .option('--quiet', 'Suppress profile/config logging')\n .action(pushCommand);\n\nprogram\n .command('pull')\n .description('Pull project configuration with clean, efficient code generation')\n .option(\n '--project <project-id>',\n 'Project ID to pull (or path to project directory). If in project directory, validates against local project ID.'\n )\n .option('--config <path>', 'Path to configuration file')\n .option('--profile <name>', 'Profile to use for remote URLs and authentication')\n .option(\n '--env <environment>',\n 'Environment file to generate (development, staging, production). Defaults to development'\n )\n .option('--json', 'Output project data as JSON instead of generating files')\n .option('--debug', 'Enable debug logging')\n .option('--verbose', 'Enable verbose logging')\n .option('--force', 'Force regeneration even if no changes detected')\n .option('--all', 'Pull all projects for current tenant')\n .option(\n '--tag <tag>',\n 'Use tagged config file (e.g., --tag prod loads prod.__inkeep.config.ts__)'\n )\n .option('--quiet', 'Suppress profile/config logging')\n .action(async (options) => {\n await pullV4Command(options);\n });\n\nprogram\n .command('list-agent')\n .description('List all available agents for a specific project')\n .requiredOption('--project <project-id>', 'Project ID to list agent for')\n .option('--tenant-id <tenant-id>', 'Tenant ID')\n .option('--agents-api-url <url>', 'Agents API URL')\n .option('--config <path>', 'Path to configuration file')\n .option('--config-file-path <path>', 'Path to configuration file (deprecated, use --config)')\n .action(async (options) => {\n const config = options.config || options.configFilePath;\n await listAgentsCommand({ ...options, config });\n });\n\nprogram\n .command('dev')\n .description('Start the Inkeep dashboard server')\n .option('--port <port>', 'Port to run the server on', '3000')\n .option('--host <host>', 'Host to bind the server to', 'localhost')\n .option('--build', 'Build the Dashboard UI for production', false)\n .option('--export', 'Export the Next.js project source files', false)\n .option('--output-dir <dir>', 'Output directory for build files', './inkeep-dev')\n .option('--path', 'Output the path to the Dashboard UI', false)\n .option('--open-browser', 'Open the browser', false)\n .action(async (options) => {\n await devCommand({\n port: parseInt(options.port, 10),\n host: options.host,\n build: options.build,\n outputDir: options.outputDir,\n path: options.path,\n export: options.export,\n openBrowser: options.openBrowser,\n });\n });\n\nprogram\n .command('update')\n .description('Update @inkeep/agents-cli to the latest version')\n .option('--check', 'Check for updates without installing')\n .option('--force', 'Force update even if already on latest version')\n .action(updateCommand);\n\n// Authentication commands\nprogram\n .command('login')\n .description('Authenticate with Inkeep Cloud')\n .option('--profile <name>', 'Profile to authenticate (defaults to active profile)')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Log out of Inkeep Cloud')\n .option('--profile <name>', 'Profile to log out (defaults to active profile)')\n .action(logoutCommand);\n\nprogram\n .command('status')\n .description('Show current profile, authentication state, and remote URLs')\n .option('--profile <name>', 'Profile to show status for (defaults to active profile)')\n .action(statusCommand);\n\nprogram\n .command('whoami')\n .description('Display current authentication status (alias for status)')\n .action(whoamiCommand);\n\n// Profile management commands\nconst profileCommand = program\n .command('profile')\n .description('Manage CLI profiles for connecting to different remotes');\n\nprofileCommand.command('list').description('List all profiles').action(profileListCommand);\n\nprofileCommand.command('add [name]').description('Add a new profile').action(profileAddCommand);\n\nprofileCommand\n .command('use <name>')\n .description('Set the active profile')\n .action(profileUseCommand);\n\nprofileCommand\n .command('current')\n .description('Display the active profile details')\n .action(profileCurrentCommand);\n\nprofileCommand\n .command('remove <name>')\n .description('Remove a profile')\n .action(profileRemoveCommand);\n\nprogram.parse();\n"],"mappings":"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"}
|
package/dist/instrumentation.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","names":[],"sources":["../src/instrumentation.ts"],"sourcesContent":["/**\n * OpenTelemetry instrumentation setup for Langfuse\n * This file sets up LLM observability for the CLI using Langfuse\n *\n * Initialization happens automatically when this file is imported\n * in the entry point (index.ts), before any AI SDK calls are made.\n */\n\nimport { registerOTel } from '@vercel/otel';\nimport { LangfuseExporter } from 'langfuse-vercel';\n\n// Load environment configuration first\n// Note: We need to check env vars directly since this runs before env.ts parsing\nconst langfuseEnabled = process.env.LANGFUSE_ENABLED === 'true';\nconst langfuseSecretKey = process.env.LANGFUSE_SECRET_KEY;\nconst langfusePublicKey = process.env.LANGFUSE_PUBLIC_KEY;\n\n/**\n * Check if Langfuse is properly configured\n */\nexport function isLangfuseConfigured(): boolean {\n return !!(langfuseEnabled && langfuseSecretKey && langfusePublicKey);\n}\n\n/**\n * Initialize OpenTelemetry with Langfuse exporter\n * This will be called automatically when the module is imported\n */\nexport function initializeInstrumentation(): void {\n // Only initialize if Langfuse is enabled and properly configured\n if (!isLangfuseConfigured()) {\n if (process.env.DEBUG) {\n console.log('[Langfuse] Tracing disabled - missing configuration');\n }\n return;\n }\n\n try {\n registerOTel({\n serviceName: 'inkeep-agents-cli',\n traceExporter: new LangfuseExporter({\n secretKey: langfuseSecretKey,\n publicKey: langfusePublicKey,\n baseUrl: process.env.LANGFUSE_BASEURL || 'https://cloud.langfuse.com',\n }),\n });\n\n if (process.env.DEBUG) {\n console.log('[Langfuse] Tracing initialized successfully');\n }\n } catch (error) {\n console.warn('[Langfuse] Failed to initialize tracing:', error);\n }\n}\n\n// Auto-initialize when the module is imported\ninitializeInstrumentation();\n"],"mappings":";;;;;;;;;;;AAaA,MAAM,kBAAkB,QAAQ,IAAI,qBAAqB;AACzD,MAAM,oBAAoB,QAAQ,IAAI;AACtC,MAAM,oBAAoB,QAAQ,IAAI;;;;AAKtC,SAAgB,uBAAgC;AAC9C,QAAO,CAAC,EAAE,mBAAmB,qBAAqB;;;;;;AAOpD,SAAgB,4BAAkC;AAEhD,KAAI,CAAC,sBAAsB,EAAE;AAC3B,MAAI,QAAQ,IAAI,MACd,SAAQ,IAAI,sDAAsD;AAEpE;;AAGF,KAAI;AACF,eAAa;GACX,aAAa;GACb,eAAe,IAAI,iBAAiB;IAClC,WAAW;IACX,WAAW;IACX,SAAS,QAAQ,IAAI,oBAAoB;IAC1C,CAAC;GACH,CAAC;AAEF,MAAI,QAAQ,IAAI,MACd,SAAQ,IAAI,8CAA8C;UAErD,OAAO;AACd,UAAQ,KAAK,4CAA4C,MAAM;;;AAKnE,2BAA2B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.js","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/array.js"],"sourcesContent":["import Diff from './base.js';\nclass ArrayDiff extends Diff {\n tokenize(value) {\n return value.slice();\n }\n join(value) {\n return value;\n }\n removeEmpty(value) {\n return value;\n }\n}\nexport const arrayDiff = new ArrayDiff();\nexport function diffArrays(oldArr, newArr, options) {\n return arrayDiff.diff(oldArr, newArr, options);\n}\n"],"x_google_ignoreList":[0],"mappings":";;;AACA,IAAM,YAAN,cAAwB,KAAK;CACzB,SAAS,OAAO;AACZ,SAAO,MAAM,OAAO;;CAExB,KAAK,OAAO;AACR,SAAO;;CAEX,YAAY,OAAO;AACf,SAAO;;;AAGf,MAAa,YAAY,IAAI,WAAW"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","names":["value"],"sources":["../../../../../../../../../node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/base.js"],"sourcesContent":["export default class Diff {\n diff(oldStr, newStr, \n // Type below is not accurate/complete - see above for full possibilities - but it compiles\n options = {}) {\n let callback;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n else if ('callback' in options) {\n callback = options.callback;\n }\n // Allow subclasses to massage the input prior to running\n const oldString = this.castInput(oldStr, options);\n const newString = this.castInput(newStr, options);\n const oldTokens = this.removeEmpty(this.tokenize(oldString, options));\n const newTokens = this.removeEmpty(this.tokenize(newString, options));\n return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);\n }\n diffWithOptionsObj(oldTokens, newTokens, options, callback) {\n var _a;\n const done = (value) => {\n value = this.postProcess(value, options);\n if (callback) {\n setTimeout(function () { callback(value); }, 0);\n return undefined;\n }\n else {\n return value;\n }\n };\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let editLength = 1;\n let maxEditLength = newLen + oldLen;\n if (options.maxEditLength != null) {\n maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n }\n const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;\n const abortAfterTimestamp = Date.now() + maxExecutionTime;\n const bestPath = [{ oldPos: -1, lastComponent: undefined }];\n // Seed editLength = 0, i.e. the content starts with the same values\n let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);\n if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // Identity per the equality and tokenizer\n return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));\n }\n // Once we hit the right edge of the edit graph on some diagonal k, we can\n // definitely reach the end of the edit graph in no more than k edits, so\n // there's no point in considering any moves to diagonal k+1 any more (from\n // which we're guaranteed to need at least k+1 more edits).\n // Similarly, once we've reached the bottom of the edit graph, there's no\n // point considering moves to lower diagonals.\n // We record this fact by setting minDiagonalToConsider and\n // maxDiagonalToConsider to some finite value once we've hit the edge of\n // the edit graph.\n // This optimization is not faithful to the original algorithm presented in\n // Myers's paper, which instead pointlessly extends D-paths off the end of\n // the edit graph - see page 7 of Myers's paper which notes this point\n // explicitly and illustrates it with a diagram. This has major performance\n // implications for some common scenarios. For instance, to compute a diff\n // where the new text simply appends d characters on the end of the\n // original text of length n, the true Myers algorithm will take O(n+d^2)\n // time while this optimization needs only O(n+d) time.\n let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;\n // Main worker method. checks all permutations of a given edit length for acceptance.\n const execEditLength = () => {\n for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {\n let basePath;\n const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];\n if (removePath) {\n // No one else is going to attempt to use this value, clear it\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath - 1] = undefined;\n }\n let canAdd = false;\n if (addPath) {\n // what newPos will be after we do an insertion:\n const addPathNewPos = addPath.oldPos - diagonalPath;\n canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;\n }\n const canRemove = removePath && removePath.oldPos + 1 < oldLen;\n if (!canAdd && !canRemove) {\n // If this path is a terminal then prune\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath] = undefined;\n continue;\n }\n // Select the diagonal that we want to branch from. We select the prior\n // path whose position in the old string is the farthest from the origin\n // and does not pass the bounds of the diff graph\n if (!canRemove || (canAdd && removePath.oldPos < addPath.oldPos)) {\n basePath = this.addToPath(addPath, true, false, 0, options);\n }\n else {\n basePath = this.addToPath(removePath, false, true, 1, options);\n }\n newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);\n if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // If we have hit the end of both strings, then we are done\n return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;\n }\n else {\n bestPath[diagonalPath] = basePath;\n if (basePath.oldPos + 1 >= oldLen) {\n maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);\n }\n if (newPos + 1 >= newLen) {\n minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);\n }\n }\n }\n editLength++;\n };\n // Performs the length of edit iteration. Is a bit fugly as this has to support the\n // sync and async mode which is never fun. Loops over execEditLength until a value\n // is produced, or until the edit length exceeds options.maxEditLength (if given),\n // in which case it will return undefined.\n if (callback) {\n (function exec() {\n setTimeout(function () {\n if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {\n return callback(undefined);\n }\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n }());\n }\n else {\n while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {\n const ret = execEditLength();\n if (ret) {\n return ret;\n }\n }\n }\n }\n addToPath(path, added, removed, oldPosInc, options) {\n const last = path.lastComponent;\n if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: last.count + 1, added: added, removed: removed, previousComponent: last.previousComponent }\n };\n }\n else {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: 1, added: added, removed: removed, previousComponent: last }\n };\n }\n }\n extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {\n newPos++;\n oldPos++;\n commonCount++;\n if (options.oneChangePerToken) {\n basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n }\n if (commonCount && !options.oneChangePerToken) {\n basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n basePath.oldPos = oldPos;\n return newPos;\n }\n equals(left, right, options) {\n if (options.comparator) {\n return options.comparator(left, right);\n }\n else {\n return left === right\n || (!!options.ignoreCase && left.toLowerCase() === right.toLowerCase());\n }\n }\n removeEmpty(array) {\n const ret = [];\n for (let i = 0; i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n return ret;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n castInput(value, options) {\n return value;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n tokenize(value, options) {\n return Array.from(value);\n }\n join(chars) {\n // Assumes ValueT is string, which is the case for most subclasses.\n // When it's false, e.g. in diffArrays, this method needs to be overridden (e.g. with a no-op)\n // Yes, the casts are verbose and ugly, because this pattern - of having the base class SORT OF\n // assume tokens and values are strings, but not completely - is weird and janky.\n return chars.join('');\n }\n postProcess(changeObjects, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options) {\n return changeObjects;\n }\n get useLongestToken() {\n return false;\n }\n buildValues(lastComponent, newTokens, oldTokens) {\n // First we convert our linked list of components in reverse order to an\n // array in the right order:\n const components = [];\n let nextComponent;\n while (lastComponent) {\n components.push(lastComponent);\n nextComponent = lastComponent.previousComponent;\n delete lastComponent.previousComponent;\n lastComponent = nextComponent;\n }\n components.reverse();\n const componentLen = components.length;\n let componentPos = 0, newPos = 0, oldPos = 0;\n for (; componentPos < componentLen; componentPos++) {\n const component = components[componentPos];\n if (!component.removed) {\n if (!component.added && this.useLongestToken) {\n let value = newTokens.slice(newPos, newPos + component.count);\n value = value.map(function (value, i) {\n const oldValue = oldTokens[oldPos + i];\n return oldValue.length > value.length ? oldValue : value;\n });\n component.value = this.join(value);\n }\n else {\n component.value = this.join(newTokens.slice(newPos, newPos + component.count));\n }\n newPos += component.count;\n // Common case\n if (!component.added) {\n oldPos += component.count;\n }\n }\n else {\n component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));\n oldPos += component.count;\n }\n }\n return components;\n }\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character.js","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/character.js"],"sourcesContent":["import Diff from './base.js';\nclass CharacterDiff extends Diff {\n}\nexport const characterDiff = new CharacterDiff();\nexport function diffChars(oldStr, newStr, options) {\n return characterDiff.diff(oldStr, newStr, options);\n}\n"],"x_google_ignoreList":[0],"mappings":";;;AACA,IAAM,gBAAN,cAA4B,KAAK;AAEjC,MAAa,gBAAgB,IAAI,eAAe"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/css.js"],"sourcesContent":["import Diff from './base.js';\nclass CssDiff extends Diff {\n tokenize(value) {\n return value.split(/([{}:;,]|\\s+)/);\n }\n}\nexport const cssDiff = new CssDiff();\nexport function diffCss(oldStr, newStr, options) {\n return cssDiff.diff(oldStr, newStr, options);\n}\n"],"x_google_ignoreList":[0],"mappings":";;;AACA,IAAM,UAAN,cAAsB,KAAK;CACvB,SAAS,OAAO;AACZ,SAAO,MAAM,MAAM,gBAAgB;;;AAG3C,MAAa,UAAU,IAAI,SAAS"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","names":["key"],"sources":["../../../../../../../../../node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/json.js"],"sourcesContent":["import Diff from './base.js';\nimport { tokenize } from './line.js';\nclass JsonDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n get useLongestToken() {\n // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n return true;\n }\n castInput(value, options) {\n const { undefinedReplacement, stringifyReplacer = (k, v) => typeof v === 'undefined' ? undefinedReplacement : v } = options;\n return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), null, ' ');\n }\n equals(left, right, options) {\n return super.equals(left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'), options);\n }\n}\nexport const jsonDiff = new JsonDiff();\nexport function diffJson(oldStr, newStr, options) {\n return jsonDiff.diff(oldStr, newStr, options);\n}\n// This function handles the presence of circular references by bailing out when encountering an\n// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\nexport function canonicalize(obj, stack, replacementStack, replacer, key) {\n stack = stack || [];\n replacementStack = replacementStack || [];\n if (replacer) {\n obj = replacer(key === undefined ? '' : key, obj);\n }\n let i;\n for (i = 0; i < stack.length; i += 1) {\n if (stack[i] === obj) {\n return replacementStack[i];\n }\n }\n let canonicalizedObj;\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n stack.push(obj);\n canonicalizedObj = new Array(obj.length);\n replacementStack.push(canonicalizedObj);\n for (i = 0; i < obj.length; i += 1) {\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, String(i));\n }\n stack.pop();\n replacementStack.pop();\n return canonicalizedObj;\n }\n if (obj && obj.toJSON) {\n obj = obj.toJSON();\n }\n if (typeof obj === 'object' && obj !== null) {\n stack.push(obj);\n canonicalizedObj = {};\n replacementStack.push(canonicalizedObj);\n const sortedKeys = [];\n let key;\n for (key in obj) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n sortedKeys.push(key);\n }\n }\n sortedKeys.sort();\n for (i = 0; i < sortedKeys.length; i += 1) {\n key = sortedKeys[i];\n canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack, replacer, key);\n }\n stack.pop();\n replacementStack.pop();\n }\n else {\n canonicalizedObj = obj;\n }\n return canonicalizedObj;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;AAEA,IAAM,WAAN,cAAuB,KAAK;CACxB,cAAc;AACV,QAAM,GAAG,UAAU;AACnB,OAAK,WAAW;;CAEpB,IAAI,kBAAkB;AAGlB,SAAO;;CAEX,UAAU,OAAO,SAAS;EACtB,MAAM,EAAE,sBAAsB,qBAAqB,GAAG,MAAM,OAAO,MAAM,cAAc,uBAAuB,MAAM;AACpH,SAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,aAAa,OAAO,MAAM,MAAM,kBAAkB,EAAE,MAAM,KAAK;;CAE7H,OAAO,MAAM,OAAO,SAAS;AACzB,SAAO,MAAM,OAAO,KAAK,QAAQ,cAAc,KAAK,EAAE,MAAM,QAAQ,cAAc,KAAK,EAAE,QAAQ;;;AAGzG,MAAa,WAAW,IAAI,UAAU;AAMtC,SAAgB,aAAa,KAAK,OAAO,kBAAkB,UAAU,KAAK;AACtE,SAAQ,SAAS,EAAE;AACnB,oBAAmB,oBAAoB,EAAE;AACzC,KAAI,SACA,OAAM,SAAS,QAAQ,SAAY,KAAK,KAAK,IAAI;CAErD,IAAI;AACJ,MAAK,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,EAC/B,KAAI,MAAM,OAAO,IACb,QAAO,iBAAiB;CAGhC,IAAI;AACJ,KAAI,qBAAqB,OAAO,UAAU,SAAS,KAAK,IAAI,EAAE;AAC1D,QAAM,KAAK,IAAI;AACf,qBAAmB,IAAI,MAAM,IAAI,OAAO;AACxC,mBAAiB,KAAK,iBAAiB;AACvC,OAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,EAC7B,kBAAiB,KAAK,aAAa,IAAI,IAAI,OAAO,kBAAkB,UAAU,OAAO,EAAE,CAAC;AAE5F,QAAM,KAAK;AACX,mBAAiB,KAAK;AACtB,SAAO;;AAEX,KAAI,OAAO,IAAI,OACX,OAAM,IAAI,QAAQ;AAEtB,KAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AACzC,QAAM,KAAK,IAAI;AACf,qBAAmB,EAAE;AACrB,mBAAiB,KAAK,iBAAiB;EACvC,MAAM,aAAa,EAAE;EACrB,IAAIA;AACJ,OAAKA,SAAO;;AAER,MAAI,OAAO,UAAU,eAAe,KAAK,KAAKA,MAAI,CAC9C,YAAW,KAAKA,MAAI;AAG5B,aAAW,MAAM;AACjB,OAAK,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AACvC,WAAM,WAAW;AACjB,oBAAiBA,SAAO,aAAa,IAAIA,QAAM,OAAO,kBAAkB,UAAUA,MAAI;;AAE1F,QAAM,KAAK;AACX,mBAAiB,KAAK;OAGtB,oBAAmB;AAEvB,QAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line.js","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/line.js"],"sourcesContent":["import Diff from './base.js';\nimport { generateOptions } from '../util/params.js';\nclass LineDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n equals(left, right, options) {\n // If we're ignoring whitespace, we need to normalise lines by stripping\n // whitespace before checking equality. (This has an annoying interaction\n // with newlineIsToken that requires special handling: if newlines get their\n // own token, then we DON'T want to trim the *newline* tokens down to empty\n // strings, since this would cause us to treat whitespace-only line content\n // as equal to a separator between lines, which would be weird and\n // inconsistent with the documented behavior of the options.)\n if (options.ignoreWhitespace) {\n if (!options.newlineIsToken || !left.includes('\\n')) {\n left = left.trim();\n }\n if (!options.newlineIsToken || !right.includes('\\n')) {\n right = right.trim();\n }\n }\n else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {\n if (left.endsWith('\\n')) {\n left = left.slice(0, -1);\n }\n if (right.endsWith('\\n')) {\n right = right.slice(0, -1);\n }\n }\n return super.equals(left, right, options);\n }\n}\nexport const lineDiff = new LineDiff();\nexport function diffLines(oldStr, newStr, options) {\n return lineDiff.diff(oldStr, newStr, options);\n}\nexport function diffTrimmedLines(oldStr, newStr, options) {\n options = generateOptions(options, { ignoreWhitespace: true });\n return lineDiff.diff(oldStr, newStr, options);\n}\n// Exported standalone so it can be used from jsonDiff too.\nexport function tokenize(value, options) {\n if (options.stripTrailingCr) {\n // remove one \\r before \\n to match GNU diff's --strip-trailing-cr behavior\n value = value.replace(/\\r\\n/g, '\\n');\n }\n const retLines = [], linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n // Ignore the final empty token that occurs if the string ends with a new line\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n }\n // Merge the content and line separators into single tokens\n for (let i = 0; i < linesAndNewlines.length; i++) {\n const line = linesAndNewlines[i];\n if (i % 2 && !options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n }\n else {\n retLines.push(line);\n }\n }\n return retLines;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;AAEA,IAAM,WAAN,cAAuB,KAAK;CACxB,cAAc;AACV,QAAM,GAAG,UAAU;AACnB,OAAK,WAAW;;CAEpB,OAAO,MAAM,OAAO,SAAS;AAQzB,MAAI,QAAQ,kBAAkB;AAC1B,OAAI,CAAC,QAAQ,kBAAkB,CAAC,KAAK,SAAS,KAAK,CAC/C,QAAO,KAAK,MAAM;AAEtB,OAAI,CAAC,QAAQ,kBAAkB,CAAC,MAAM,SAAS,KAAK,CAChD,SAAQ,MAAM,MAAM;aAGnB,QAAQ,sBAAsB,CAAC,QAAQ,gBAAgB;AAC5D,OAAI,KAAK,SAAS,KAAK,CACnB,QAAO,KAAK,MAAM,GAAG,GAAG;AAE5B,OAAI,MAAM,SAAS,KAAK,CACpB,SAAQ,MAAM,MAAM,GAAG,GAAG;;AAGlC,SAAO,MAAM,OAAO,MAAM,OAAO,QAAQ;;;AAGjD,MAAa,WAAW,IAAI,UAAU;AACtC,SAAgB,UAAU,QAAQ,QAAQ,SAAS;AAC/C,QAAO,SAAS,KAAK,QAAQ,QAAQ,QAAQ;;AAOjD,SAAgB,SAAS,OAAO,SAAS;AACrC,KAAI,QAAQ,gBAER,SAAQ,MAAM,QAAQ,SAAS,KAAK;CAExC,MAAM,WAAW,EAAE,EAAE,mBAAmB,MAAM,MAAM,YAAY;AAEhE,KAAI,CAAC,iBAAiB,iBAAiB,SAAS,GAC5C,kBAAiB,KAAK;AAG1B,MAAK,IAAI,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;EAC9C,MAAM,OAAO,iBAAiB;AAC9B,MAAI,IAAI,KAAK,CAAC,QAAQ,eAClB,UAAS,SAAS,SAAS,MAAM;MAGjC,UAAS,KAAK,KAAK;;AAG3B,QAAO"}
|