@camelai/camelrun 0.10.1 → 0.11.1

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @camelai/camelrun
2
2
 
3
- The Camel Run CLI: deploy and manage agents on the [camelAI agent runtime](https://agents.camelai.dev)
3
+ The camelRun CLI: deploy and manage agents on [camelRun](https://run.camelai.com)
4
4
  from a terminal, a script or CI, and give a coding agent the same powers over MCP.
5
5
 
6
6
  ```sh
@@ -35,7 +35,7 @@ on a person (`camelrun inputs`, `camelrun answer`).
35
35
  The hosted MCP server needs nothing installed; sign in when the client asks:
36
36
 
37
37
  ```sh
38
- claude mcp add --transport http camelrun https://agents.camelai.dev/mcp
38
+ claude mcp add --transport http camelrun https://run.camelai.com/mcp
39
39
  ```
40
40
 
41
41
  Or run it locally, where its `deploy` also reads your repository's manifests:
@@ -45,4 +45,4 @@ claude mcp add camelrun -- npx -y @camelai/camelrun mcp
45
45
  ```
46
46
 
47
47
  Every command, the manifest's fields and the MCP tools:
48
- [CLI and MCP server](https://agents.camelai.dev/docs/reference/cli.md).
48
+ [CLI and MCP server](https://run.camelai.com/docs/reference/cli.md).
package/dist/cli.js CHANGED
@@ -7,7 +7,7 @@ import { DEFAULT_FILES, template } from "./manifest.js";
7
7
  import { findManifest, loadManifests } from "./manifest-files.js";
8
8
  import * as ops from "./ops.js";
9
9
  import { VERSION } from "./version.js";
10
- const HELP = `camelrun: deploy and manage agents on Camel Run, the camelAI agent runtime
10
+ const HELP = `camelrun: deploy and manage agents on camelRun
11
11
 
12
12
  Usage: camelrun <command> [options]
13
13
 
@@ -47,13 +47,13 @@ Definitions (a definition is its key or its id, def_…)
47
47
 
48
48
  MCP
49
49
  mcp Serve these commands as an MCP server over stdio
50
- (or connect clients to the hosted one: https://agents.camelai.dev/mcp)
50
+ (or connect clients to the hosted one: https://run.camelai.com/mcp)
51
51
 
52
52
  Options
53
53
  --json Print JSON (the default when stdout is not a terminal)
54
54
  --api-key <key>, --url <url> Instead of CAMELAI_API_KEY / CAMELAI_URL / the saved login
55
55
 
56
- Docs: https://agents.camelai.dev/llms.txt`;
56
+ Docs: https://run.camelai.com/llms.txt`;
57
57
  const OPTIONS = {
58
58
  json: { type: "boolean" }, help: { type: "boolean", short: "h" }, version: { type: "boolean", short: "v" },
59
59
  "api-key": { type: "string" }, url: { type: "string" },
@@ -197,9 +197,9 @@ async function login(flags, io, print) {
197
197
  let apiKey = flags["api-key"] || io.env.CAMELAI_API_KEY;
198
198
  if (!apiKey) {
199
199
  if (!process.stdin.isTTY)
200
- throw new UsageError("Pass --api-key art_… (or set CAMELAI_API_KEY); create one under API tokens at https://agents.camelai.dev/console");
200
+ throw new UsageError("Pass --api-key art_… (or set CAMELAI_API_KEY); create one under API tokens at https://run.camelai.com/console");
201
201
  const prompt = createInterface({ input: process.stdin, output: process.stderr });
202
- apiKey = (await prompt.question("API key (from https://agents.camelai.dev/console, API tokens): ")).trim();
202
+ apiKey = (await prompt.question("API key (from https://run.camelai.com/console, API tokens): ")).trim();
203
203
  prompt.close();
204
204
  }
205
205
  const url = flags.url || io.env.CAMELAI_URL || DEFAULT_URL;
package/dist/config.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
- export const DEFAULT_URL = "https://agents.camelai.dev";
4
+ export const DEFAULT_URL = "https://run.camelai.com";
5
5
  /** Where `camelrun login` keeps the key: $CAMELRUN_CONFIG, else $XDG_CONFIG_HOME/camelrun, else ~/.config/camelrun. */
6
6
  export function configPath(env = process.env) {
7
7
  if (env.CAMELRUN_CONFIG)
@@ -37,6 +37,6 @@ export function resolve(flags, env = process.env) {
37
37
  const saved = readSaved(env);
38
38
  const apiKey = flags.apiKey || env.CAMELAI_API_KEY || saved.apiKey;
39
39
  if (!apiKey)
40
- throw new Error("No API key: run `camelrun login`, or set CAMELAI_API_KEY (create one under API tokens at https://agents.camelai.dev/console)");
40
+ throw new Error("No API key: run `camelrun login`, or set CAMELAI_API_KEY (create one under API tokens at https://run.camelai.com/console)");
41
41
  return { apiKey, url: flags.url || env.CAMELAI_URL || saved.url || DEFAULT_URL };
42
42
  }
package/dist/manifest.js CHANGED
@@ -83,9 +83,9 @@ export function interpolate(value, env, where) {
83
83
  return value;
84
84
  }
85
85
  export function template(key, model) {
86
- return `# An agent on the camelAI agent runtime. Deploy it with \`camelrun deploy\`; deploying again
86
+ return `# An agent on camelRun. Deploy it with \`camelrun deploy\`; deploying again
87
87
  # updates the definition in place (the same key is the same definition).
88
- # Fields: https://agents.camelai.dev/docs/guides/definitions.md
88
+ # Fields: https://run.camelai.com/docs/guides/definitions.md
89
89
  key: ${key}
90
90
  name: ${key}
91
91
  ${model ? `model: ${model}` : "# model: anthropic/claude-sonnet-5-5 # camelrun models --available lists yours"}
package/dist/mcp.js CHANGED
@@ -5,6 +5,9 @@ import { findManifest, loadManifests } from "./manifest-files.js";
5
5
  import { errorText, INSTRUCTIONS, resultText, tools } from "./tools.js";
6
6
  import { VERSION } from "./version.js";
7
7
  import { readFileSync } from "node:fs";
8
+ /** A result's most characters: past it the rest is cut, so one long history or spec cannot fill a model's context. */
9
+ export const MAX_RESULT = 100_000;
10
+ const capped = (text) => text.length <= MAX_RESULT ? text : `${text.slice(0, MAX_RESULT)}\n\n[Cut at ${MAX_RESULT} characters of ${text.length}: ask for less, such as a smaller limit.]`;
8
11
  /** Serve the CLI's operations as MCP tools over stdio. Credentials are read on each call, so a login takes effect at once. */
9
12
  export async function serve(api, options) {
10
13
  const server = createServer(api, options);
@@ -21,16 +24,16 @@ export async function serve(api, options) {
21
24
  */
22
25
  export function createServer(api, options = {}) {
23
26
  const { cwd } = options;
24
- const server = new McpServer({ name: "camelrun", title: "Camel Run", version: VERSION }, { instructions: INSTRUCTIONS });
27
+ const server = new McpServer({ name: "camelrun", title: "camelRun", version: VERSION }, { instructions: INSTRUCTIONS });
25
28
  const local = cwd === undefined ? undefined : {
26
29
  env: process.env,
27
30
  readFile: (path) => readFileSync(resolve(cwd, path), "utf8"),
28
31
  load: (file) => loadManifests(file ? (isAbsolute(file) ? file : resolve(cwd, file)) : findManifest(cwd)),
29
32
  };
30
33
  for (const tool of tools(api, { local })) {
31
- server.registerTool(tool.name, { description: tool.description, inputSchema: tool.input, annotations: tool.annotations }, (async (args) => {
34
+ server.registerTool(tool.name, { title: tool.title, description: tool.description, inputSchema: tool.input, annotations: { title: tool.title, ...tool.annotations } }, (async (args) => {
32
35
  try {
33
- return { content: [{ type: "text", text: resultText(await tool.run(args)) }] };
36
+ return { content: [{ type: "text", text: capped(resultText(await tool.run(args))) }] };
34
37
  }
35
38
  catch (error) {
36
39
  return { isError: true, content: [{ type: "text", text: errorText(error) }] };
package/dist/tools.js CHANGED
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { enc } from "./api.js";
3
3
  import { parseManifests } from "./manifest.js";
4
4
  import * as ops from "./ops.js";
5
- export const INSTRUCTIONS = `Deploy and manage agents on Camel Run, the camelAI agent runtime (https://agents.camelai.dev).
5
+ export const INSTRUCTIONS = `Deploy and manage agents on camelRun (https://run.camelai.com).
6
6
 
7
7
  - An agent is durable and keyed: the same key is the same agent, with its history, until deleted. Tools take an agent's key or its id (client_…).
8
8
  - A definition is a reusable configuration (model, system prompt, built-ins, MCP servers, OpenAPI specs). Keep it in the repository as agent.yaml and deploy it with deploy: the same key is the same definition, and deploying again makes a new revision. apply: true also moves live agents to it between their turns.
@@ -14,23 +14,27 @@ const wait = z.number().min(0).max(300).optional().describe("Seconds to wait for
14
14
  /** Every tool, for `api`. */
15
15
  export function tools(api, options = {}) {
16
16
  const list = [];
17
- const tool = (name, description, input, run, annotations = {}) => {
18
- list.push({ name, description, input, annotations, run });
17
+ const tool = (name, title, description, input, run, annotations) => {
18
+ list.push({ name, title, description, input, annotations, run });
19
19
  };
20
- const read = { readOnlyHint: true };
21
- tool("whoami", "The tenant the API key belongs to, the runtime's URL and the default model.", {}, async () => {
20
+ const read = { readOnlyHint: true, destructiveHint: false, openWorldHint: false };
21
+ // Adds to the account and changes nothing already there.
22
+ const add = { readOnlyHint: false, destructiveHint: false, openWorldHint: false };
23
+ // Overwrites, deletes or stops something, or cannot be taken back.
24
+ const destructive = { readOnlyHint: false, destructiveHint: true, openWorldHint: false };
25
+ tool("whoami", "Show account", "The camelRun account (tenant) these credentials act for, the runtime's URL and the default model. Changes nothing.", {}, async () => {
22
26
  const client = api();
23
27
  return { ...await client.me(), url: client.url };
24
28
  }, read);
25
- tool("list_models", "Models agents can use: pass a model's id as `model`.", { available: z.boolean().optional().describe("Only models the account has a key for (default true)") }, async ({ available }) => {
29
+ tool("list_models", "List models", "The models agents can use, with context window, reasoning support and price: pass a model's id as `model` to create_agent, configure_agent or a manifest. Changes nothing.", { available: z.boolean().optional().describe("Only models the account has a key for (default true)") }, async ({ available }) => {
26
30
  const models = await api().get(`/v1/models${available === false ? "" : "?available=true"}`);
27
31
  return models.map(({ id, name, contextWindow, reasoning, cost, available }) => ({ id, name, available, contextWindow, reasoning, cost }));
28
32
  }, read);
29
33
  const local = options.local;
30
34
  const hosted = !local;
31
- tool("deploy", "Deploy agent manifests: upsert each definition by its key (a new revision only when it changed) and make the keyed agents it lists. " +
35
+ tool("deploy", "Deploy agent manifest", "Deploy agent manifests: upsert each definition by its key (a new revision only when it changed, replacing the current one) and make or update the keyed agents it lists. Use dryRun first to show what would change. " +
32
36
  (hosted
33
- ? "Give `manifest`, the YAML itself (as an agent.yaml holds it). This server reads no files and no environment variables: put the system prompt in systemPrompt and any OpenAPI spec in spec."
37
+ ? "Give `manifest`, the YAML itself (as an agent.yaml holds it). This server reads no files and no environment variables: put the system prompt in systemPrompt and any OpenAPI spec in spec. Never ask a person to paste credentials into the conversation: a manifest whose tool servers need secrets is deployed with the camelrun CLI, which reads them from its environment."
34
38
  : "Give `file` (a path to an agent.yaml; default ./agent.yaml) or `manifest` (the YAML itself). `${NAME}` in strings reads this server's environment."), {
35
39
  ...(hosted ? {} : { file: z.string().optional().describe("Path to the manifest, relative to the working directory") }),
36
40
  manifest: hosted ? z.string().describe("The manifest's YAML") : z.string().optional().describe("The manifest's YAML, instead of a file"),
@@ -47,29 +51,29 @@ export function tools(api, options = {}) {
47
51
  : local.load(file);
48
52
  const results = await ops.deploy(api(), manifests, { apply, dryRun });
49
53
  return dryRun ? results.map((result, index) => ({ ...result, definition: ops.redact(manifests[index].definition) })) : results;
50
- });
51
- tool("list_definitions", "The account's definitions.", {}, async () => {
54
+ }, destructive);
55
+ tool("list_definitions", "List definitions", "The account's definitions (reusable agent configurations): id, key, revision, model and built-in tools. Changes nothing.", {}, async () => {
52
56
  const list = await api().get("/v1/definitions");
53
57
  return list.map(({ id, name, revision, model, builtins, updatedAt }) => ({ id, name, revision, model, builtins, updatedAt }));
54
58
  }, read);
55
- tool("get_definition", "A definition in full: model, prompt, built-ins and tool sources (never their credentials).", { definition }, async ({ definition }) => {
59
+ tool("get_definition", "Get definition", "A definition in full: model, system prompt, built-ins and tool sources (never their credentials). Changes nothing.", { definition }, async ({ definition }) => {
56
60
  const client = api();
57
61
  return client.get(`/v1/definitions/${await client.definitionId(definition)}`);
58
62
  }, read);
59
- tool("definition_agents", "The agents made from a definition, and the revision each has.", { definition }, async ({ definition }) => {
63
+ tool("definition_agents", "List a definition's agents", "The agents made from a definition, and the revision each has. Changes nothing.", { definition }, async ({ definition }) => {
60
64
  const client = api();
61
65
  return client.get(`/v1/definitions/${await client.definitionId(definition)}/agents`);
62
66
  }, read);
63
- tool("delete_definition", "Delete a definition. Its agents are left as they are.", { definition }, async ({ definition }) => {
67
+ tool("delete_definition", "Delete definition", "Delete a definition and its revisions; this cannot be undone, so confirm with the person first. Agents made from it keep running as they are.", { definition }, async ({ definition }) => {
64
68
  const client = api();
65
69
  return client.call("DELETE", `/v1/definitions/${await client.definitionId(definition)}`);
66
- }, { destructiveHint: true });
67
- tool("list_agents", "The account's agents: key, id, model, and whether each is running.", {}, () => api().get("/v1/agents"), read);
68
- tool("get_agent", "An agent's configuration, the definition revision it has, and every source of its tools with what each offers.", { agent }, async ({ agent }) => {
70
+ }, destructive);
71
+ tool("list_agents", "List agents", "The account's agents: key, id, model, and whether each is running. Changes nothing.", {}, () => api().get("/v1/agents"), read);
72
+ tool("get_agent", "Get agent", "An agent's configuration, the definition revision it has, and every source of its tools with what each offers. Changes nothing.", { agent }, async ({ agent }) => {
69
73
  const client = api();
70
74
  return client.get(`/v1/agents/${enc(await client.agentId(agent))}`);
71
75
  }, read);
72
- tool("create_agent", "Make the agent for a key, or find it: from a definition, or with its own model and system prompt. The same key is the same agent; it lives until deleted.", {
76
+ tool("create_agent", "Create agent", "Make the agent for a key: from a definition, or with its own model and system prompt. The same key is the same agent, so calling it again for a key that exists updates that agent to the configuration given, keeping its history. It lives until deleted.", {
73
77
  key: z.string().regex(/^[A-Za-z0-9_-]{1,80}$/).describe("Your name for the agent: 1 to 80 letters, digits, _ and -"),
74
78
  definition: definition.optional(),
75
79
  model: z.string().optional().describe("A model id from list_models"),
@@ -77,8 +81,8 @@ export function tools(api, options = {}) {
77
81
  systemPromptAppend: z.string().optional().describe("Text after the prompt, e.g. this agent's own context"),
78
82
  name: z.string().optional(),
79
83
  builtins: z.array(z.enum(["web_fetch", "web_search", "schedule", "ask_user"])).optional().describe("Without a definition: tools the runtime answers itself"),
80
- }, ({ key, ...config }) => ops.upsertAgent(api(), key, config), { idempotentHint: true });
81
- tool("configure_agent", "Change one agent's model, system prompt, prompt addition or thinking level between its runs; its history is kept.", {
84
+ }, ({ key, ...config }) => ops.upsertAgent(api(), key, config), { ...destructive, idempotentHint: true });
85
+ tool("configure_agent", "Configure agent", "Change one agent's model, system prompt, prompt addition or thinking level between its runs, replacing the current values; its history is kept.", {
82
86
  agent,
83
87
  model: z.string().optional(),
84
88
  systemPrompt: z.string().optional(),
@@ -89,48 +93,48 @@ export function tools(api, options = {}) {
89
93
  if (!Object.keys(given).length)
90
94
  throw new Error("Nothing to change");
91
95
  return ops.configure(api(), agent, given);
92
- });
93
- tool("delete_agent", "Delete an agent: it stops at once, and its history and files are purged. Its key makes a fresh agent next time.", { agent }, async ({ agent }) => {
96
+ }, destructive);
97
+ tool("delete_agent", "Delete agent", "Delete an agent: it stops at once, and its history and files are purged; this cannot be undone, so confirm with the person first. Its key makes a fresh agent next time.", { agent }, async ({ agent }) => {
94
98
  const client = api();
95
99
  return client.call("DELETE", `/v1/agents/${enc(await client.agentId(agent))}`);
96
- }, { destructiveHint: true });
97
- tool("run_agent", "Send an agent a message and wait for its run: the reply, the input it waits on, or why it failed. A run still going after `wait` seconds comes back as running; call get_run.", {
100
+ }, destructive);
101
+ tool("run_agent", "Run agent", "Send an agent a message and wait for its run: the reply, the input it waits on, or why it failed. A run still going after `wait` seconds comes back as running; call get_run. The agent acts with the tools it was given (such as web search and its MCP servers), and the run uses the account's model credit.", {
98
102
  agent, message: z.string(), wait,
99
103
  from: z.string().optional().describe("Who is sending, as a user id in the application"),
100
104
  steer: z.boolean().optional().describe("If a run is going, have it read this after its current step instead of queuing it"),
101
105
  allowDisconnected: z.boolean().optional().describe("Run even though the application serving its attached tools is not connected; those calls then fail"),
102
106
  requestId: z.string().optional().describe("Retrying with the same id is the same run"),
103
- }, ({ agent, message, wait, ...options }) => ops.run(api(), agent, message, { ...options, wait: wait ?? 50 }));
104
- tool("get_run", "A run's status and result, waiting up to `wait` seconds for it to end.", { agent, requestId: z.string(), wait }, async ({ agent, requestId, wait }) => {
107
+ }, ({ agent, message, wait, ...options }) => ops.run(api(), agent, message, { ...options, wait: wait ?? 50 }), { ...add, openWorldHint: true });
108
+ tool("get_run", "Get run", "A run's status and result, waiting up to `wait` seconds for it to end. Changes nothing.", { agent, requestId: z.string(), wait }, async ({ agent, requestId, wait }) => {
105
109
  const client = api();
106
110
  return ops.waitFor(client, await client.agentId(agent), requestId, wait ?? 50);
107
111
  }, read);
108
- tool("agent_history", "An agent's latest messages, in whole turns: text, tool calls and tool results.", { agent, limit: z.number().int().min(1).max(500).optional().describe("Default 20") }, ({ agent, limit }) => ops.history(api(), agent, limit), read);
109
- tool("abort_agent", "Stop an agent's running turn.", { agent }, async ({ agent }) => {
112
+ tool("agent_history", "Read agent history", "An agent's latest messages, in whole turns: text, tool calls and tool results. Changes nothing.", { agent, limit: z.number().int().min(1).max(500).optional().describe("Default 20") }, ({ agent, limit }) => ops.history(api(), agent, limit), read);
113
+ tool("abort_agent", "Stop agent's turn", "Stop an agent's running turn; the turn's unfinished work is cancelled. The agent and its history stay.", { agent }, async ({ agent }) => {
110
114
  const client = api();
111
115
  return client.call("POST", `/v1/agents/${enc(await client.agentId(agent))}/abort`, {});
112
- });
113
- tool("list_inputs", "Questions, approvals and forms waiting on a person: one agent's, or every agent's.", { agent: agent.optional() }, async ({ agent }) => {
116
+ }, destructive);
117
+ tool("list_inputs", "List pending inputs", "Questions, approvals and forms waiting on a person: one agent's, or every agent's. Changes nothing.", { agent: agent.optional() }, async ({ agent }) => {
114
118
  const client = api();
115
119
  return agent ? client.get(`/v1/agents/${enc(await client.agentId(agent))}/inputs?state=pending`) : client.get("/v1/inputs?state=pending");
116
120
  }, read);
117
- tool("answer_input", "Answer an input and wait for the run it resumes. An approval takes true or false; a question the chosen label or your own words (several questions: {\"<question>\": \"<answer>\"}); a form its fields; \"decline\" declines. Only answer with what the person decided.", { agent, inputId: z.string(), value: z.union([z.boolean(), z.string(), z.array(z.string()), z.record(z.string(), z.unknown())]), from: z.string().optional().describe("Who is answering, as a user id in the application"), wait }, ({ agent, inputId, value, from, wait }) => ops.answer(api(), agent, inputId, value, { from, wait: wait ?? 50 }));
118
- tool("list_schedules", "An agent's scheduled wake-ups.", { agent }, async ({ agent }) => {
121
+ tool("answer_input", "Answer input", "Answer an input and wait for the run it resumes. An approval takes true or false; a question the chosen label or your own words (several questions: {\"<question>\": \"<answer>\"}); a form its fields; \"decline\" declines. Only answer with what the person decided: an answer cannot be taken back, and an approval lets the agent go ahead with what it asked to do.", { agent, inputId: z.string(), value: z.union([z.boolean(), z.string(), z.array(z.string()), z.record(z.string(), z.unknown())]), from: z.string().optional().describe("Who is answering, as a user id in the application"), wait }, ({ agent, inputId, value, from, wait }) => ops.answer(api(), agent, inputId, value, { from, wait: wait ?? 50 }), { ...destructive, openWorldHint: true });
122
+ tool("list_schedules", "List schedules", "An agent's scheduled wake-ups. Changes nothing.", { agent }, async ({ agent }) => {
119
123
  const client = api();
120
124
  return client.get(`/v1/agents/${enc(await client.agentId(agent))}/schedules`);
121
125
  }, read);
122
- tool("add_schedule", "Wake an agent later with a message: once (inSeconds or at), or repeatedly (everySeconds, at least 60).", {
126
+ tool("add_schedule", "Add schedule", "Wake an agent later with a message: once (inSeconds or at), or repeatedly (everySeconds, at least 60). Each wake-up is a run that uses the account's model credit.", {
123
127
  agent, text: z.string(),
124
128
  inSeconds: z.number().optional(), at: z.string().optional().describe("ISO time"), everySeconds: z.number().int().min(60).optional(),
125
129
  }, async ({ agent, ...schedule }) => {
126
130
  const client = api();
127
131
  return client.call("POST", `/v1/agents/${enc(await client.agentId(agent))}/schedules`, schedule);
128
- });
129
- tool("delete_schedule", "Cancel a scheduled wake-up.", { agent, scheduleId: z.string() }, async ({ agent, scheduleId }) => {
132
+ }, add);
133
+ tool("delete_schedule", "Delete schedule", "Cancel a scheduled wake-up; this cannot be undone.", { agent, scheduleId: z.string() }, async ({ agent, scheduleId }) => {
130
134
  const client = api();
131
135
  return client.call("DELETE", `/v1/agents/${enc(await client.agentId(agent))}/schedules/${enc(scheduleId)}`);
132
- }, { destructiveHint: true });
133
- tool("read_docs", "The runtime's documentation as Markdown: with no path, the index (llms.txt); else a page such as guides/definitions.md, guides/tools.md or reference/cli.md.", {
136
+ }, destructive);
137
+ tool("read_docs", "Read camelRun docs", "camelRun's own documentation as Markdown: with no path, the index (llms.txt); else a page such as guides/definitions.md, guides/tools.md or reference/cli.md. Changes nothing.", {
134
138
  path: z.string().regex(/^(?!.*\.\.)[A-Za-z0-9/_.-]*$/).optional(),
135
139
  }, ({ path }) => api().text(path ? `/docs/${path.replace(/^\/?(docs\/)?/, "")}` : "/llms.txt"), read);
136
140
  return list;
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@camelai/camelrun",
3
- "version": "0.10.1",
4
- "description": "Camel Run CLI: deploy and manage agents on the camelAI agent runtime from a terminal, or from a coding agent over MCP (camelrun mcp).",
3
+ "version": "0.11.1",
4
+ "description": "camelRun CLI: deploy and manage agents on camelRun from a terminal, or from a coding agent over MCP (camelrun mcp).",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/qaml-ai/agent-runtime.git",
9
+ "url": "git+https://github.com/qaml-ai/run.git",
10
10
  "directory": "packages/cli"
11
11
  },
12
- "homepage": "https://agents.camelai.dev",
12
+ "homepage": "https://run.camelai.com",
13
13
  "publishConfig": {
14
14
  "registry": "https://registry.npmjs.org",
15
15
  "access": "public"