@orchagent/cli 0.3.41 → 0.3.42

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.
@@ -110,7 +110,7 @@ ${runExample}
110
110
 
111
111
  | Field | Type | Description |
112
112
  |-------|------|-------------|
113
- | \`input\` | string | The input to process |
113
+ | \`${type === 'agentic' ? 'task' : 'input'}\` | string | ${type === 'agentic' ? 'The task to perform' : 'The input to process'} |
114
114
 
115
115
  ## Output
116
116
 
@@ -125,7 +125,6 @@ const AGENTIC_MANIFEST_TEMPLATE = `{
125
125
  "type": "agentic",
126
126
  "supported_providers": ["anthropic"],
127
127
  "max_turns": 25,
128
- "timeout_seconds": 300,
129
128
  "custom_tools": [
130
129
  {
131
130
  "name": "run_tests",
@@ -349,11 +349,21 @@ function registerPublishCommand(program) {
349
349
  if (manifest.type === 'agentic') {
350
350
  // Validate custom_tools format
351
351
  if (manifest.custom_tools) {
352
+ const reservedNames = new Set(['bash', 'read_file', 'write_file', 'list_files', 'submit_result']);
353
+ const seenNames = new Set();
352
354
  for (const tool of manifest.custom_tools) {
353
355
  if (!tool.name || !tool.command) {
354
356
  throw new errors_1.CliError(`Invalid custom_tool: each tool must have 'name' and 'command' fields.\n` +
355
357
  `Found: ${JSON.stringify(tool)}`);
356
358
  }
359
+ if (reservedNames.has(tool.name)) {
360
+ throw new errors_1.CliError(`Custom tool '${tool.name}' conflicts with a built-in tool name.\n` +
361
+ `Reserved names: ${[...reservedNames].join(', ')}`);
362
+ }
363
+ if (seenNames.has(tool.name)) {
364
+ throw new errors_1.CliError(`Duplicate custom tool name: '${tool.name}'`);
365
+ }
366
+ seenNames.add(tool.name);
357
367
  }
358
368
  }
359
369
  // Validate max_turns
@@ -620,6 +630,7 @@ function registerPublishCommand(program) {
620
630
  entrypoint: manifest.type === 'agentic' ? undefined : manifest.entrypoint,
621
631
  exclude: manifest.bundle?.exclude,
622
632
  include: includePatterns.length > 0 ? includePatterns : undefined,
633
+ skipEntrypointCheck: manifest.type === 'agentic',
623
634
  });
624
635
  process.stdout.write(` Created bundle: ${bundleResult.fileCount} files, ${(bundleResult.sizeBytes / 1024).toFixed(1)}KB\n`);
625
636
  // Validate bundle size
@@ -903,6 +903,13 @@ Paid Agents:
903
903
  ` Install for AI tools: orchagent skill install ${org}/${parsed.agent}\n` +
904
904
  ` Use with an agent: orchagent run <agent> --skills ${org}/${parsed.agent}`);
905
905
  }
906
+ // Agentic agents require a sandbox with tool use — cannot run locally
907
+ if (agentData.type === 'agentic') {
908
+ throw new errors_1.CliError('Agentic agents cannot be run locally.\n\n' +
909
+ 'Agentic agents require a sandbox environment with tool use capabilities.\n\n' +
910
+ 'Use server execution instead:\n' +
911
+ ` orchagent call ${org}/${parsed.agent}@${parsed.version} --data '{"task": "..."}'`);
912
+ }
906
913
  // Check for dependencies (orchestrator agents)
907
914
  if (agentData.dependencies && agentData.dependencies.length > 0) {
908
915
  const depStatuses = await (0, spinner_1.withSpinner)('Checking dependencies...', async () => checkDependencies(resolved, agentData.dependencies), { successText: `Found ${agentData.dependencies.length} dependencies` });
@@ -119,14 +119,16 @@ async function createCodeBundle(sourceDir, outputPath, options = {}) {
119
119
  if (!stat.isDirectory()) {
120
120
  throw new Error(`Source path is not a directory: ${sourceDir}`);
121
121
  }
122
- // Verify entrypoint exists if specified
123
- const entrypoint = options.entrypoint || 'main.py';
124
- const entrypointPath = path_1.default.join(sourceDir, entrypoint);
125
- try {
126
- await promises_1.default.access(entrypointPath);
127
- }
128
- catch {
129
- throw new Error(`Entrypoint file not found: ${entrypoint}`);
122
+ // Verify entrypoint exists if specified (skip for agentic agents that have no code)
123
+ if (!options.skipEntrypointCheck) {
124
+ const entrypoint = options.entrypoint || 'main.py';
125
+ const entrypointPath = path_1.default.join(sourceDir, entrypoint);
126
+ try {
127
+ await promises_1.default.access(entrypointPath);
128
+ }
129
+ catch {
130
+ throw new Error(`Entrypoint file not found: ${entrypoint}`);
131
+ }
130
132
  }
131
133
  // Create output directory if needed
132
134
  const outputDir = path_1.default.dirname(outputPath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orchagent/cli",
3
- "version": "0.3.41",
3
+ "version": "0.3.42",
4
4
  "description": "Command-line interface for the orchagent AI agent marketplace",
5
5
  "license": "MIT",
6
6
  "author": "orchagent <hello@orchagent.io>",