@sap/joule-studio-dev-cli 0.1.20-alpha.3

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.
Files changed (119) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +53 -0
  3. package/dist/bin/commands/a2a.js +12 -0
  4. package/dist/bin/commands/a2a.js.map +1 -0
  5. package/dist/bin/commands/asset.js +20 -0
  6. package/dist/bin/commands/asset.js.map +1 -0
  7. package/dist/bin/commands/auth.js +16 -0
  8. package/dist/bin/commands/auth.js.map +1 -0
  9. package/dist/bin/commands/init.js +20 -0
  10. package/dist/bin/commands/init.js.map +1 -0
  11. package/dist/bin/commands/mcp.js +42 -0
  12. package/dist/bin/commands/mcp.js.map +1 -0
  13. package/dist/bin/commands/pro-code.js +12 -0
  14. package/dist/bin/commands/pro-code.js.map +1 -0
  15. package/dist/bin/commands/skills.js +27 -0
  16. package/dist/bin/commands/skills.js.map +1 -0
  17. package/dist/bin/commands/solution.js +52 -0
  18. package/dist/bin/commands/solution.js.map +1 -0
  19. package/dist/bin/help.js +42 -0
  20. package/dist/bin/help.js.map +1 -0
  21. package/dist/bin/jl.js +59 -0
  22. package/dist/bin/jl.js.map +1 -0
  23. package/dist/bin/login.js +60 -0
  24. package/dist/bin/login.js.map +1 -0
  25. package/dist/bin/logout.js +21 -0
  26. package/dist/bin/logout.js.map +1 -0
  27. package/dist/lib/a2a/message.js +74 -0
  28. package/dist/lib/a2a/message.js.map +1 -0
  29. package/dist/lib/asset/create.js +38 -0
  30. package/dist/lib/asset/create.js.map +1 -0
  31. package/dist/lib/asset/delete.js +57 -0
  32. package/dist/lib/asset/delete.js.map +1 -0
  33. package/dist/lib/asset/discover.js +46 -0
  34. package/dist/lib/asset/discover.js.map +1 -0
  35. package/dist/lib/auth-crypto.js +146 -0
  36. package/dist/lib/auth-crypto.js.map +1 -0
  37. package/dist/lib/auth.js +488 -0
  38. package/dist/lib/auth.js.map +1 -0
  39. package/dist/lib/context.js +35 -0
  40. package/dist/lib/context.js.map +1 -0
  41. package/dist/lib/errors.js +47 -0
  42. package/dist/lib/errors.js.map +1 -0
  43. package/dist/lib/fs-utils.js +34 -0
  44. package/dist/lib/fs-utils.js.map +1 -0
  45. package/dist/lib/init/agents.js +55 -0
  46. package/dist/lib/init/agents.js.map +1 -0
  47. package/dist/lib/init/shared.js +172 -0
  48. package/dist/lib/init/shared.js.map +1 -0
  49. package/dist/lib/mcp/call.js +158 -0
  50. package/dist/lib/mcp/call.js.map +1 -0
  51. package/dist/lib/mcp/client.js +100 -0
  52. package/dist/lib/mcp/client.js.map +1 -0
  53. package/dist/lib/mcp/list.js +20 -0
  54. package/dist/lib/mcp/list.js.map +1 -0
  55. package/dist/lib/mcp/start.js +120 -0
  56. package/dist/lib/mcp/start.js.map +1 -0
  57. package/dist/lib/mcp/tools.js +162 -0
  58. package/dist/lib/mcp/tools.js.map +1 -0
  59. package/dist/lib/plugin.js +77 -0
  60. package/dist/lib/plugin.js.map +1 -0
  61. package/dist/lib/plugins/agent/index.js +32 -0
  62. package/dist/lib/plugins/agent/index.js.map +1 -0
  63. package/dist/lib/plugins/agent/templates/asset.yaml.hbs +31 -0
  64. package/dist/lib/plugins/agent-extension/index.js +32 -0
  65. package/dist/lib/plugins/agent-extension/index.js.map +1 -0
  66. package/dist/lib/plugins/agent-extension/templates/asset.yaml.hbs +15 -0
  67. package/dist/lib/plugins/base-ui/index.js +32 -0
  68. package/dist/lib/plugins/base-ui/index.js.map +1 -0
  69. package/dist/lib/plugins/base-ui/templates/asset.yaml.hbs +8 -0
  70. package/dist/lib/plugins/cap-app/index.js +32 -0
  71. package/dist/lib/plugins/cap-app/index.js.map +1 -0
  72. package/dist/lib/plugins/cap-app/templates/asset.yaml.hbs +37 -0
  73. package/dist/lib/plugins/data-product/index.js +32 -0
  74. package/dist/lib/plugins/data-product/index.js.map +1 -0
  75. package/dist/lib/plugins/data-product/templates/asset.yaml.hbs +9 -0
  76. package/dist/lib/plugins/domain-model-extension/index.js +37 -0
  77. package/dist/lib/plugins/domain-model-extension/index.js.map +1 -0
  78. package/dist/lib/plugins/domain-model-extension/templates/asset.yaml.hbs +15 -0
  79. package/dist/lib/plugins/mcp-server/index.js +36 -0
  80. package/dist/lib/plugins/mcp-server/index.js.map +1 -0
  81. package/dist/lib/plugins/mcp-server/templates/asset.yaml.hbs +9 -0
  82. package/dist/lib/plugins/n8n-workflow/index.js +52 -0
  83. package/dist/lib/plugins/n8n-workflow/index.js.map +1 -0
  84. package/dist/lib/plugins/n8n-workflow/templates/asset.yaml.hbs +18 -0
  85. package/dist/lib/plugins/n8n-workflow/validation/asset-validator.js +62 -0
  86. package/dist/lib/plugins/n8n-workflow/validation/asset-validator.js.map +1 -0
  87. package/dist/lib/plugins/n8n-workflow/validation/yaml-validator.js +51 -0
  88. package/dist/lib/plugins/n8n-workflow/validation/yaml-validator.js.map +1 -0
  89. package/dist/lib/plugins/vercel-app/index.js +32 -0
  90. package/dist/lib/plugins/vercel-app/index.js.map +1 -0
  91. package/dist/lib/plugins/vercel-app/templates/asset.yaml.hbs +12 -0
  92. package/dist/lib/rule.js +2 -0
  93. package/dist/lib/rule.js.map +1 -0
  94. package/dist/lib/schemas/solution-schema.json +178 -0
  95. package/dist/lib/solution/build.js +186 -0
  96. package/dist/lib/solution/build.js.map +1 -0
  97. package/dist/lib/solution/create.js +42 -0
  98. package/dist/lib/solution/create.js.map +1 -0
  99. package/dist/lib/solution/deploy.js +66 -0
  100. package/dist/lib/solution/deploy.js.map +1 -0
  101. package/dist/lib/solution/list.js +21 -0
  102. package/dist/lib/solution/list.js.map +1 -0
  103. package/dist/lib/solution/logs.js +130 -0
  104. package/dist/lib/solution/logs.js.map +1 -0
  105. package/dist/lib/solution/status.js +161 -0
  106. package/dist/lib/solution/status.js.map +1 -0
  107. package/dist/lib/solution/templates/solution.yaml.hbs +9 -0
  108. package/dist/lib/solution/util/build-file.js +4 -0
  109. package/dist/lib/solution/util/build-file.js.map +1 -0
  110. package/dist/lib/template.js +74 -0
  111. package/dist/lib/template.js.map +1 -0
  112. package/dist/lib/term.js +16 -0
  113. package/dist/lib/term.js.map +1 -0
  114. package/dist/lib/validate.js +287 -0
  115. package/dist/lib/validate.js.map +1 -0
  116. package/dist/lib/yaml.js +33 -0
  117. package/dist/lib/yaml.js.map +1 -0
  118. package/dist/package.json +77 -0
  119. package/package.json +77 -0
@@ -0,0 +1,55 @@
1
+ import path from 'node:path';
2
+ import { MCP_COMMAND, MCP_SERVER_NAME, writeJsonFile, initSkills, initMcp } from './shared.js';
3
+ function agentEntry(agentConfig) {
4
+ return {
5
+ initSkills: (options = {}) => initSkills(options, agentConfig),
6
+ initMcp: (options = {}) => initMcp(options, agentConfig),
7
+ };
8
+ }
9
+ export const AGENTS = {
10
+ claude: agentEntry({
11
+ displayName: 'Claude Code',
12
+ agentDir: '.claude',
13
+ writeConfigs: async (targetPath, force) => {
14
+ await writeJsonFile(path.join(targetPath, '.mcp.json'), {
15
+ mcpServers: {
16
+ [MCP_SERVER_NAME]: {
17
+ type: 'stdio',
18
+ command: MCP_COMMAND[0],
19
+ args: MCP_COMMAND.slice(1),
20
+ },
21
+ },
22
+ }, force);
23
+ await writeJsonFile(path.join(targetPath, '.claude', 'settings.local.json'), {
24
+ $schema: 'https://json.schemastore.org/claude-code-settings.json',
25
+ permissions: {
26
+ allow: [`mcp__${MCP_SERVER_NAME}__*`],
27
+ },
28
+ enabledMcpjsonServers: [MCP_SERVER_NAME],
29
+ enableAllProjectMcpServers: true,
30
+ }, force);
31
+ },
32
+ }),
33
+ opencode: agentEntry({
34
+ displayName: 'OpenCode',
35
+ agentDir: '.agents',
36
+ writeConfigs: async (targetPath, force) => {
37
+ await writeJsonFile(path.join(targetPath, 'opencode.json'), {
38
+ $schema: 'https://opencode.ai/config.json',
39
+ mcp: {
40
+ [MCP_SERVER_NAME]: {
41
+ type: 'local',
42
+ command: MCP_COMMAND,
43
+ enabled: true,
44
+ },
45
+ },
46
+ permission: {
47
+ bash: 'ask',
48
+ edit: 'ask',
49
+ write: 'ask',
50
+ },
51
+ }, force);
52
+ },
53
+ }),
54
+ };
55
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../lib/init/agents.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAK9F,SAAS,UAAU,CAAC,WAAwB;IACxC,OAAO;QACH,UAAU,EAAE,CAAC,UAAuB,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC;QAC3E,OAAO,EAAE,CAAC,UAAuB,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;KACxE,CAAA;AACL,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,MAAM,EAAE,UAAU,CAAC;QACf,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;YACtC,MAAM,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAClC;gBACI,UAAU,EAAE;oBACR,CAAC,eAAe,CAAC,EAAE;wBACf,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;wBACvB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;qBAC7B;iBACJ;aACJ,EACD,KAAK,CACR,CAAA;YACD,MAAM,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,qBAAqB,CAAC,EACvD;gBACI,OAAO,EAAE,wDAAwD;gBACjE,WAAW,EAAE;oBACT,KAAK,EAAE,CAAC,QAAQ,eAAe,KAAK,CAAC;iBACxC;gBACD,qBAAqB,EAAE,CAAC,eAAe,CAAC;gBACxC,0BAA0B,EAAE,IAAI;aACnC,EACD,KAAK,CACR,CAAA;QACL,CAAC;KACJ,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;QACjB,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;YACtC,MAAM,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EACtC;gBACI,OAAO,EAAE,iCAAiC;gBAC1C,GAAG,EAAE;oBACD,CAAC,eAAe,CAAC,EAAE;wBACf,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,WAAW;wBACpB,OAAO,EAAE,IAAI;qBAChB;iBACJ;gBACD,UAAU,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,KAAK;iBACf;aACJ,EACD,KAAK,CACR,CAAA;QACL,CAAC;KACJ,CAAC;CACL,CAAA"}
@@ -0,0 +1,172 @@
1
+ import fs from 'node:fs';
2
+ import { readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { authorizedFetch } from '../auth.js';
5
+ import { CliError } from '../errors.js';
6
+ import term from '../term.js';
7
+ export const MCP_SERVER_NAME = 'joule-studio';
8
+ export const MCP_COMMAND = ['jl', 'mcp', 'start'];
9
+ export const API_PREFIX = '/destinations/DYN_AGENTS_SERVICE/api/v1';
10
+ export async function initSkills(options, agentConfig) {
11
+ const targetPath = path.resolve(options.path ?? process.cwd());
12
+ const force = !!options.force;
13
+ if (force) {
14
+ console.log(term.yellow('⚠ Force mode — existing skills will be overwritten'));
15
+ }
16
+ const skillsDir = agentConfig ? path.join(targetPath, agentConfig.agentDir, 'skills') : targetPath;
17
+ fs.mkdirSync(path.dirname(skillsDir), { recursive: true });
18
+ try {
19
+ await fetchSkills(skillsDir, force);
20
+ }
21
+ catch (err) {
22
+ throw new Error(`Could not fetch skills: ${err instanceof Error ? err.message : String(err)}`);
23
+ }
24
+ }
25
+ export async function initMcp(options, agentConfig) {
26
+ const targetPath = path.resolve(options.path ?? process.cwd());
27
+ const force = !!options.force;
28
+ if (force) {
29
+ console.log(term.yellow('⚠ Force mode — existing config values will be overwritten'));
30
+ }
31
+ fs.mkdirSync(targetPath, { recursive: true });
32
+ fs.mkdirSync(path.join(targetPath, agentConfig.agentDir), { recursive: true });
33
+ console.log(`\n${term.bold('Creating configuration files:')}`);
34
+ await agentConfig.writeConfigs(targetPath, force);
35
+ console.log(`\n${term.bold(agentConfig.displayName + ' MCP config initialized:')} ${targetPath}`);
36
+ }
37
+ export async function initAgent(options, agentConfig) {
38
+ await initSkills(options, agentConfig);
39
+ await initMcp(options, agentConfig);
40
+ const targetPath = path.resolve(options.path ?? process.cwd());
41
+ console.log(`\n${term.bold(agentConfig.displayName + ' project initialized:')} ${targetPath}`);
42
+ }
43
+ async function fetchSkills(skillsDir, force) {
44
+ console.log(`\n${term.bold('Fetching system skills...')}`);
45
+ const res = await authorizedFetch(`${API_PREFIX}/skills/systemSkills`);
46
+ if (!res.ok) {
47
+ throw new Error(`Failed to fetch skills (${res.status}).`);
48
+ }
49
+ const data = (await res.json());
50
+ const skills = data.value ?? [];
51
+ if (skills.length === 0) {
52
+ console.log(term.dim(' No system skills found.'));
53
+ return;
54
+ }
55
+ fs.mkdirSync(skillsDir, { recursive: true });
56
+ let written = 0;
57
+ let skipped = 0;
58
+ for (const skill of skills) {
59
+ if (!skill.name || !skill.content || !skill.enabled || !skill.ID) {
60
+ throw new CliError('SKILLS_FETCH_FAILED', `Skill is missing required fields: ${JSON.stringify(skill)}`);
61
+ }
62
+ const skillDir = path.resolve(skillsDir, String(skill.name));
63
+ if (!skillDir.startsWith(skillsDir + path.sep)) {
64
+ throw new CliError('SKILLS_FETCH_FAILED', `Skill has unsafe name: ${skill.name}`);
65
+ }
66
+ const exists = fs.existsSync(skillDir);
67
+ if (exists && !force) {
68
+ skipped++;
69
+ console.log(` ${term.yellow('⚠')} ${term.cyan(String(skill.name))} ${term.dim('— skipped')}`);
70
+ continue;
71
+ }
72
+ const resourcesUrl = `${API_PREFIX}/skills/systemSkills/${encodeURIComponent(String(skill.ID))}/resources`;
73
+ const resourcesRes = await authorizedFetch(resourcesUrl);
74
+ if (!resourcesRes.ok) {
75
+ throw new CliError('SKILLS_FETCH_FAILED', `Failed to fetch resources for skill ${skill.name} (${resourcesRes.status}).`);
76
+ }
77
+ const resourceList = (await resourcesRes.json()).value ?? [];
78
+ fs.mkdirSync(skillDir, { recursive: true });
79
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), String(skill.content));
80
+ const resourceCount = await writeSkillResources(skillDir, String(skill.name), resourceList);
81
+ written++;
82
+ const resourcePlural = resourceCount !== 1 ? 's' : '';
83
+ const resourceNote = resourceCount ? term.dim(` (+${resourceCount} resource${resourcePlural})`) : '';
84
+ const tag = exists ? term.dim(' — overwritten') : '';
85
+ console.log(` ${term.green('✓')} ${term.cyan(String(skill.name))}${resourceNote}${tag}`);
86
+ }
87
+ const skippedNote = skipped ? term.dim(`, ${skipped} skipped`) : '';
88
+ console.log(`${term.green('✓')} ${written} skill${written !== 1 ? 's' : ''} initialized${skippedNote} in ${term.cyan(displayPath(skillsDir))}.`);
89
+ }
90
+ async function writeSkillResources(skillDir, skillName, resourceList) {
91
+ await Promise.all(resourceList.map(async (resource) => {
92
+ if (!resource.path) {
93
+ throw new CliError('SKILLS_FETCH_FAILED', `Resource for skill ${skillName} is missing a path.`);
94
+ }
95
+ const resourcePath = path.resolve(skillDir, String(resource.path));
96
+ if (!resourcePath.startsWith(skillDir + path.sep)) {
97
+ throw new CliError('SKILLS_FETCH_FAILED', `Resource has unsafe path: ${resource.path}`);
98
+ }
99
+ const encodedPath = encodeURIComponent(String(resource.path));
100
+ const lookupUrl = `${API_PREFIX}/skills/lookupSkillResource(skillName='${encodeURIComponent(skillName)}',resourcePath='${encodedPath}')`;
101
+ const contentRes = await authorizedFetch(lookupUrl);
102
+ if (!contentRes.ok) {
103
+ throw new CliError('SKILLS_FETCH_FAILED', `Failed to fetch resource ${resource.path} for skill ${skillName} (${contentRes.status}).`);
104
+ }
105
+ const contentData = (await contentRes.json());
106
+ if (!contentData.content) {
107
+ throw new CliError('SKILLS_FETCH_FAILED', `Resource ${resource.path} for skill ${skillName} returned no content.`);
108
+ }
109
+ fs.mkdirSync(path.dirname(resourcePath), { recursive: true });
110
+ fs.writeFileSync(resourcePath, contentData.content);
111
+ }));
112
+ return resourceList.length;
113
+ }
114
+ export async function writeJsonFile(filePath, content, force) {
115
+ const wasNew = !fs.existsSync(filePath);
116
+ const skipped = [];
117
+ const overwritten = [];
118
+ let finalContent = content;
119
+ if (!wasNew) {
120
+ try {
121
+ const existing = JSON.parse(await readFile(filePath, 'utf-8'));
122
+ finalContent = deepMerge(existing, content, force, skipped, overwritten);
123
+ }
124
+ catch (err) {
125
+ console.warn(` ${term.yellow('⚠')} Could not read ${filePath}: ${err.message}`);
126
+ }
127
+ }
128
+ await writeFile(filePath, `${JSON.stringify(finalContent, null, 2)}\n`, 'utf-8');
129
+ const action = wasNew ? 'created' : 'merged';
130
+ const dimAction = term.dim(`— ${action}`);
131
+ console.log(` ${term.green('✓')} ${term.cyan(displayPath(filePath))} ${dimAction}`);
132
+ if (skipped.length) {
133
+ console.log(` ${term.yellow('⚠ Preserved existing values (use --force to overwrite):')}`);
134
+ for (const k of skipped) {
135
+ console.log(` - ${k}`);
136
+ }
137
+ }
138
+ if (overwritten.length) {
139
+ console.log(` ${term.cyan('ℹ Overwritten values:')}`);
140
+ for (const k of overwritten) {
141
+ console.log(` - ${k}`);
142
+ }
143
+ }
144
+ }
145
+ function deepMerge(target, source, force, skipped, overwritten, keyPath = '') {
146
+ const result = { ...target };
147
+ const isObj = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
148
+ for (const key of Object.keys(source)) {
149
+ const fullPath = keyPath ? `${keyPath}.${key}` : key;
150
+ if (key in result) {
151
+ if (isObj(source[key]) && isObj(result[key])) {
152
+ result[key] = deepMerge(result[key], source[key], force, skipped, overwritten, fullPath);
153
+ }
154
+ else if (force) {
155
+ overwritten.push(fullPath);
156
+ result[key] = source[key];
157
+ }
158
+ else {
159
+ skipped.push(fullPath);
160
+ }
161
+ }
162
+ else {
163
+ result[key] = source[key];
164
+ }
165
+ }
166
+ return result;
167
+ }
168
+ export function displayPath(filePath) {
169
+ const rel = path.relative(process.cwd(), filePath);
170
+ return rel.startsWith('..') ? filePath : rel;
171
+ }
172
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../lib/init/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { getAuthHeaders } from '../auth.js';
3
+ import { fetchMcpServers, mcpInit, mcpListTools, mcpRequest, pickFromList } from './client.js';
4
+ import { CliError } from '../errors.js';
5
+ import term from '../term.js';
6
+ function readStdin() {
7
+ return new Promise(resolve => {
8
+ const chunks = [];
9
+ process.stdin.on('data', c => chunks.push(c));
10
+ process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString()));
11
+ });
12
+ }
13
+ /* eslint-disable no-control-regex */
14
+ const ANSI_RE = /\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\x1b\][^\x1b]*\x1b\\|\x1b[^[\]]|[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g;
15
+ /* eslint-enable no-control-regex */
16
+ function stripAnsi(s) {
17
+ return s.replace(ANSI_RE, '');
18
+ }
19
+ function renderContent(content = []) {
20
+ for (const block of content) {
21
+ if (block.type === 'text') {
22
+ console.log(stripAnsi(block.text ?? ''));
23
+ }
24
+ else if (block.type === 'image') {
25
+ console.log(term.dim(`[image: ${block.mimeType}]`));
26
+ }
27
+ else {
28
+ console.log(JSON.stringify(block, null, 2));
29
+ }
30
+ }
31
+ }
32
+ export function castParam(value, type) {
33
+ const t = value.trim();
34
+ switch (type) {
35
+ case 'string':
36
+ return t;
37
+ case 'number':
38
+ return Number(t);
39
+ case 'integer':
40
+ return parseInt(t, 10);
41
+ case 'boolean':
42
+ return t === 'true';
43
+ case 'array':
44
+ case 'object':
45
+ return JSON.parse(t);
46
+ default:
47
+ return t;
48
+ }
49
+ }
50
+ async function resolveParams(kvArgs, paramsFile, isTTY, schema) {
51
+ if (kvArgs.length > 0) {
52
+ const params = {};
53
+ for (const arg of kvArgs) {
54
+ const eq = arg.indexOf('=');
55
+ const key = arg.slice(0, eq);
56
+ if (!/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(key)) {
57
+ throw new CliError('INVALID_PARAM', `Invalid param syntax: '${arg}'. Expected key=value where key is an identifier.`);
58
+ }
59
+ const type = schema?.properties?.[key]?.type;
60
+ params[key] = castParam(arg.slice(eq + 1), type);
61
+ }
62
+ return params;
63
+ }
64
+ if (paramsFile) {
65
+ let raw;
66
+ try {
67
+ raw = readFileSync(paramsFile, 'utf8');
68
+ }
69
+ catch {
70
+ throw new CliError('INVALID_PARAM', `Cannot read args file: ${paramsFile}`);
71
+ }
72
+ try {
73
+ return JSON.parse(raw);
74
+ }
75
+ catch {
76
+ throw new CliError('INVALID_PARAM', `Args file is not valid JSON: ${paramsFile}`);
77
+ }
78
+ }
79
+ if (!isTTY) {
80
+ const raw = await readStdin();
81
+ if (raw.trim())
82
+ return JSON.parse(raw);
83
+ }
84
+ return {};
85
+ }
86
+ export async function mcpCall(serverName, tool, kvParams, paramsFile) {
87
+ const store = await fetchMcpServers();
88
+ const isTTY = process.stdin.isTTY;
89
+ const kvArgs = kvParams.filter(a => a.includes('='));
90
+ const bareArgs = kvParams.filter(a => !a.includes('='));
91
+ if (paramsFile && kvArgs.length > 0) {
92
+ throw new CliError('INVALID_PARAM', '--params and key=value params are mutually exclusive');
93
+ }
94
+ if (bareArgs.length > 0) {
95
+ throw new CliError('INVALID_PARAM', `Invalid param syntax: '${bareArgs[0]}'. Expected key=value pairs.`);
96
+ }
97
+ let resolvedServerName;
98
+ let cfg;
99
+ if (serverName) {
100
+ cfg = store[serverName];
101
+ if (!cfg) {
102
+ throw new CliError('MCP_SERVER_NOT_FOUND', `Unknown MCP server '${serverName}'. Available: ${Object.keys(store).join(', ')}`);
103
+ }
104
+ resolvedServerName = serverName;
105
+ }
106
+ else {
107
+ if (!isTTY) {
108
+ throw new CliError('MCP_USAGE_ERROR', 'Usage: joule mcp call <server> <tool> [key=value ...]');
109
+ }
110
+ const entries = Object.entries(store);
111
+ [resolvedServerName, cfg] = await pickFromList(entries, 'server', ([n]) => term.bold(n));
112
+ console.log();
113
+ }
114
+ const headers = getAuthHeaders(cfg.backend);
115
+ await mcpInit(cfg.url, headers);
116
+ const tools = await mcpListTools(cfg.url, headers);
117
+ let resolvedTool;
118
+ if (tool) {
119
+ resolvedTool = tools.find(t => t.name === tool);
120
+ if (!resolvedTool) {
121
+ throw new CliError('MCP_TOOL_NOT_FOUND', `Unknown tool '${tool}'. Run: joule mcp tools ${resolvedServerName}`);
122
+ }
123
+ }
124
+ else {
125
+ if (!isTTY) {
126
+ throw new CliError('MCP_USAGE_ERROR', 'Usage: joule mcp call <server> <tool> [key=value ...]');
127
+ }
128
+ resolvedTool = await pickFromList(tools, 'tool', t => {
129
+ const title = t.title && t.title !== t.name ? term.dim(` — ${t.title}`) : '';
130
+ return `${term.bold(t.name)}${title}`;
131
+ });
132
+ console.log();
133
+ }
134
+ const params = await resolveParams(kvArgs, paramsFile, isTTY, resolvedTool.inputSchema);
135
+ const requiredParams = resolvedTool.inputSchema?.required ?? [];
136
+ const missingParams = requiredParams.filter(k => !(k in params));
137
+ if (missingParams.length) {
138
+ console.log(term.yellow('!') + ` Missing required params: ${missingParams.join(', ')}`);
139
+ console.log(term.dim('Schema:'));
140
+ for (const [k, v] of Object.entries(resolvedTool.inputSchema?.properties ?? {})) {
141
+ const req = requiredParams.includes(k) ? term.yellow(' *') : '';
142
+ console.log(` ${term.bold(k)}${req} ${term.dim(v.description ?? v.type ?? '')}`);
143
+ }
144
+ throw '';
145
+ }
146
+ const result = (await mcpRequest(cfg.url, headers, 'tools/call', 3, {
147
+ name: resolvedTool.name,
148
+ arguments: params,
149
+ }));
150
+ if (result?.isError) {
151
+ console.error(term.red('Tool returned an error:'));
152
+ renderContent(result.content);
153
+ }
154
+ else {
155
+ renderContent(result?.content ?? []);
156
+ }
157
+ }
158
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../../lib/mcp/call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import readline from 'node:readline';
2
+ import { authorizedFetch, getStoredUrl } from '../auth.js';
3
+ import { CliError } from '../errors.js';
4
+ const API_PREFIX = '/destinations/DYN_AGENTS_SERVICE/api/v1';
5
+ export async function fetchMcpServers() {
6
+ const backendUrl = getStoredUrl();
7
+ if (!backendUrl)
8
+ throw new CliError('AUTH_NOT_LOGGED_IN', 'Not logged in. Run: jl login <url>');
9
+ const res = await authorizedFetch(`${API_PREFIX}/mcpServers`);
10
+ if (!res.ok) {
11
+ throw `Failed to fetch MCP servers (${res.status}).`;
12
+ }
13
+ const data = (await res.json());
14
+ const servers = (Array.isArray(data) ? data : (data.value ?? data.items ?? data.data ?? []));
15
+ if (servers.length === 0) {
16
+ throw 'No MCP servers found on remote.';
17
+ }
18
+ const store = {};
19
+ for (const s of servers) {
20
+ const name = s.name ?? s.id;
21
+ if (!name) {
22
+ continue;
23
+ }
24
+ store[String(name)] = { url: `${backendUrl}${API_PREFIX}${s.url}`, backend: backendUrl };
25
+ }
26
+ return store;
27
+ }
28
+ const FETCH_TIMEOUT_MS = 30_000;
29
+ const INIT_PARAMS = {
30
+ protocolVersion: '2024-11-05',
31
+ capabilities: {},
32
+ clientInfo: { name: 'joule-cli', version: '1.0' },
33
+ };
34
+ function extractSSEData(text) {
35
+ const dataLines = text
36
+ .split(/\r?\n/)
37
+ .filter(l => l.startsWith('data:'))
38
+ .map(l => l.slice(5).replace(/^ /, ''));
39
+ if (!dataLines.length) {
40
+ throw 'MCP SSE response contained no data lines';
41
+ }
42
+ return dataLines.join('\n');
43
+ }
44
+ export async function mcpRequest(url, headers, method, id, params = {}) {
45
+ if (new URL(url).protocol !== 'https:') {
46
+ throw new CliError('AUTH_INSECURE_URL', `MCP server URL must use HTTPS: ${url}`);
47
+ }
48
+ const controller = new AbortController();
49
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
50
+ const res = await fetch(url, {
51
+ method: 'POST',
52
+ signal: controller.signal,
53
+ redirect: 'manual',
54
+ headers: { ...headers, 'Content-Type': 'application/json', 'Accept': 'application/json, text/event-stream' },
55
+ body: JSON.stringify({ jsonrpc: '2.0', method, id, params }),
56
+ }).finally(() => clearTimeout(timer));
57
+ if (res.status === 401 || res.status === 403 || (res.status >= 300 && res.status < 400)) {
58
+ const origin = new URL(url).origin;
59
+ throw `Not authenticated for ${origin}. Run: jl login ${origin}`;
60
+ }
61
+ if (!res.ok) {
62
+ throw `MCP request failed (${res.status}).`;
63
+ }
64
+ const text = await res.text();
65
+ const isSSE = (res.headers.get('content-type') ?? '').includes('text/event-stream');
66
+ const jsonText = isSSE ? extractSSEData(text) : text;
67
+ const parsed = JSON.parse(jsonText);
68
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
69
+ throw new CliError('MCP_INVALID_RESPONSE', 'MCP response is not a JSON object');
70
+ }
71
+ const data = parsed;
72
+ if (data.error !== null && typeof data.error !== 'undefined') {
73
+ const err = data.error;
74
+ const message = typeof err.message === 'string' ? err.message : 'MCP server returned an error';
75
+ throw new CliError('MCP_SERVER_ERROR', message);
76
+ }
77
+ return data.result;
78
+ }
79
+ export async function mcpInit(url, headers) {
80
+ return mcpRequest(url, headers, 'initialize', 1, INIT_PARAMS);
81
+ }
82
+ export async function mcpListTools(url, headers) {
83
+ const result = (await mcpRequest(url, headers, 'tools/list', 2));
84
+ return result?.tools ?? [];
85
+ }
86
+ export function pickFromList(items, label, display) {
87
+ items.forEach((item, i) => console.log(` ${i + 1}) ${display(item)}`));
88
+ return new Promise(resolve => {
89
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
90
+ rl.question(`\nPick a ${label}: `, ans => {
91
+ rl.close();
92
+ const idx = parseInt(ans.trim(), 10) - 1;
93
+ if (Number.isNaN(idx) || idx < 0 || idx >= items.length) {
94
+ throw `Invalid ${label} selection.`;
95
+ }
96
+ resolve(items[idx]);
97
+ });
98
+ });
99
+ }
100
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../lib/mcp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { authorizedFetch } from '../auth.js';
2
+ import term from '../term.js';
3
+ export async function mcpList() {
4
+ const res = await authorizedFetch('/destinations/DYN_AGENTS_SERVICE/api/v1/mcpServers');
5
+ if (!res.ok) {
6
+ throw `Failed to fetch MCP servers (${res.status}).`;
7
+ }
8
+ const data = (await res.json());
9
+ const servers = (Array.isArray(data) ? data : (data.value ?? data.items ?? data.data ?? []));
10
+ if (servers.length === 0) {
11
+ console.log(term.dim('No MCP servers found.'));
12
+ return;
13
+ }
14
+ for (const s of servers) {
15
+ const name = s.name ?? s.id ?? JSON.stringify(s);
16
+ const url = s.url ? term.dim(` — ${s.url}`) : '';
17
+ console.log(` ${term.bold(String(name))}${url}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../lib/mcp/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,IAAI,MAAM,YAAY,CAAA;AAE7B,MAAM,CAAC,KAAK,UAAU,OAAO;IACzB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,oDAAoD,CAAC,CAAA;IACvF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,gCAAgC,GAAG,CAAC,MAAM,IAAI,CAAA;IACxD,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC1D,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAGxF,CAAA;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAC9C,OAAM;IACV,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAChD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;IACrD,CAAC;AACL,CAAC"}