camelagi 0.5.0 → 0.5.16

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 (113) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +241 -104
  3. package/dist/agent/agent-sdk.js +136 -65
  4. package/dist/agent/agent-sdk.js.map +1 -1
  5. package/dist/agent.js +4 -1
  6. package/dist/agent.js.map +1 -1
  7. package/dist/bootstrap.js +148 -331
  8. package/dist/bootstrap.js.map +1 -1
  9. package/dist/channels/handler.js +109 -1
  10. package/dist/channels/handler.js.map +1 -1
  11. package/dist/cli/cmd-agents.js +11 -14
  12. package/dist/cli/cmd-agents.js.map +1 -1
  13. package/dist/cli/cmd-bootstrap.js +4 -4
  14. package/dist/cli/cmd-bootstrap.js.map +1 -1
  15. package/dist/cli/cmd-install.js +80 -0
  16. package/dist/cli/cmd-install.js.map +1 -0
  17. package/dist/cli/cmd-pairing.js +14 -15
  18. package/dist/cli/cmd-pairing.js.map +1 -1
  19. package/dist/cli/cmd-reset.js +10 -12
  20. package/dist/cli/cmd-reset.js.map +1 -1
  21. package/dist/cli/cmd-sessions.js +10 -13
  22. package/dist/cli/cmd-sessions.js.map +1 -1
  23. package/dist/cli/cmd-status.js +67 -0
  24. package/dist/cli/cmd-status.js.map +1 -0
  25. package/dist/cli/cmd-uninstall.js +79 -0
  26. package/dist/cli/cmd-uninstall.js.map +1 -0
  27. package/dist/cli/cmd-update.js +47 -0
  28. package/dist/cli/cmd-update.js.map +1 -0
  29. package/dist/cli.js +44 -26
  30. package/dist/cli.js.map +1 -1
  31. package/dist/core/config.js +53 -8
  32. package/dist/core/config.js.map +1 -1
  33. package/dist/core/log.js +33 -13
  34. package/dist/core/log.js.map +1 -1
  35. package/dist/core/update-check.js +11 -13
  36. package/dist/core/update-check.js.map +1 -1
  37. package/dist/core/version.js +4 -0
  38. package/dist/core/version.js.map +1 -0
  39. package/dist/runtime/orchestrate.js +25 -15
  40. package/dist/runtime/orchestrate.js.map +1 -1
  41. package/dist/serve.js +22 -7
  42. package/dist/serve.js.map +1 -1
  43. package/dist/setup.js +259 -231
  44. package/dist/setup.js.map +1 -1
  45. package/dist/telegram/admin-bot.js +325 -1
  46. package/dist/telegram/admin-bot.js.map +1 -1
  47. package/dist/telegram/agent-bot.js +143 -2
  48. package/dist/telegram/agent-bot.js.map +1 -1
  49. package/dist/telegram/resolve.js +11 -2
  50. package/dist/telegram/resolve.js.map +1 -1
  51. package/dist/telegram/wizards.js +361 -12
  52. package/dist/telegram/wizards.js.map +1 -1
  53. package/dist/telegram.js +2 -0
  54. package/dist/telegram.js.map +1 -1
  55. package/dist/usage.js +106 -0
  56. package/dist/usage.js.map +1 -1
  57. package/dist/workspace.js +20 -0
  58. package/dist/workspace.js.map +1 -1
  59. package/package.json +7 -4
  60. package/dist/agent/agent-openai.js +0 -206
  61. package/dist/agent/agent-openai.js.map +0 -1
  62. package/dist/approval-forward.js +0 -42
  63. package/dist/approval-forward.js.map +0 -1
  64. package/dist/approvals.js +0 -151
  65. package/dist/approvals.js.map +0 -1
  66. package/dist/camelagi-gateway.mjs +0 -93611
  67. package/dist/camelagi-gateway.mjs.map +0 -7
  68. package/dist/compact.js +0 -92
  69. package/dist/compact.js.map +0 -1
  70. package/dist/config.js +0 -153
  71. package/dist/config.js.map +0 -1
  72. package/dist/constants.js +0 -21
  73. package/dist/constants.js.map +0 -1
  74. package/dist/cron.js +0 -81
  75. package/dist/cron.js.map +0 -1
  76. package/dist/errors.js +0 -5
  77. package/dist/errors.js.map +0 -1
  78. package/dist/hooks.js +0 -72
  79. package/dist/hooks.js.map +0 -1
  80. package/dist/lanes.js +0 -62
  81. package/dist/lanes.js.map +0 -1
  82. package/dist/policy.js +0 -22
  83. package/dist/policy.js.map +0 -1
  84. package/dist/queue.js +0 -45
  85. package/dist/queue.js.map +0 -1
  86. package/dist/retry.js +0 -96
  87. package/dist/retry.js.map +0 -1
  88. package/dist/runs.js +0 -83
  89. package/dist/runs.js.map +0 -1
  90. package/dist/skills.js +0 -89
  91. package/dist/skills.js.map +0 -1
  92. package/dist/subagent.js +0 -71
  93. package/dist/subagent.js.map +0 -1
  94. package/dist/telegram-admin.js +0 -800
  95. package/dist/telegram-admin.js.map +0 -1
  96. package/dist/tools/edit.js +0 -29
  97. package/dist/tools/edit.js.map +0 -1
  98. package/dist/tools/exec.js +0 -38
  99. package/dist/tools/exec.js.map +0 -1
  100. package/dist/tools/fetch.js +0 -28
  101. package/dist/tools/fetch.js.map +0 -1
  102. package/dist/tools/index.js +0 -16
  103. package/dist/tools/index.js.map +0 -1
  104. package/dist/tools/read.js +0 -26
  105. package/dist/tools/read.js.map +0 -1
  106. package/dist/tools/search.js +0 -62
  107. package/dist/tools/search.js.map +0 -1
  108. package/dist/tools/subagent.js +0 -48
  109. package/dist/tools/subagent.js.map +0 -1
  110. package/dist/tools/write.js +0 -22
  111. package/dist/tools/write.js.map +0 -1
  112. package/dist/types.js +0 -3
  113. package/dist/types.js.map +0 -1
package/dist/retry.js DELETED
@@ -1,96 +0,0 @@
1
- // Error classification + retry logic for agent runs
2
- export function classifyError(err) {
3
- const msg = err.message.toLowerCase();
4
- // User abort (not retryable — distinct from timeout)
5
- if (msg === "aborted" || msg === "the operation was aborted" || msg === "this operation was aborted") {
6
- return "abort";
7
- }
8
- // Auth errors
9
- if (msg.includes("401") || msg.includes("403") || msg.includes("unauthorized")
10
- || msg.includes("invalid api key") || msg.includes("token expired")) {
11
- return "auth";
12
- }
13
- // Billing
14
- if (msg.includes("402") || msg.includes("insufficient") || msg.includes("payment required")
15
- || msg.includes("billing")) {
16
- return "billing";
17
- }
18
- // Rate limit
19
- if (msg.includes("429") || msg.includes("rate limit") || msg.includes("too many requests")
20
- || msg.includes("quota") || msg.includes("resource exhausted")) {
21
- return "rate_limit";
22
- }
23
- // Context overflow
24
- if (msg.includes("context") && (msg.includes("exceeded") || msg.includes("too large"))
25
- || msg.includes("prompt is too long") || msg.includes("request too large")
26
- || msg.includes("maximum context length")) {
27
- return "overflow";
28
- }
29
- // Timeout
30
- if (msg.includes("timeout") || msg.includes("deadline exceeded") || msg.includes("aborted")
31
- || msg.includes("abort")) {
32
- return "timeout";
33
- }
34
- // Format errors (bad request shape)
35
- if (msg.includes("400") || msg.includes("invalid request") || msg.includes("validation")) {
36
- return "format";
37
- }
38
- // Transient server errors (retryable)
39
- if (msg.includes("500") || msg.includes("502") || msg.includes("503")
40
- || msg.includes("service unavailable") || msg.includes("internal server error")) {
41
- return "rate_limit"; // Treat as retryable
42
- }
43
- return "unknown";
44
- }
45
- export function isRetryable(kind) {
46
- return kind === "rate_limit" || kind === "timeout";
47
- }
48
- /**
49
- * Wrap an async function with retry logic.
50
- * - rate_limit/timeout: retry with exponential backoff
51
- * - overflow: call onCompact() then retry once
52
- * - auth/billing/format: fail immediately
53
- */
54
- export async function withRetry(fn, opts) {
55
- let lastError;
56
- let overflowRetried = false;
57
- for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
58
- try {
59
- return await fn();
60
- }
61
- catch (err) {
62
- lastError = err instanceof Error ? err : new Error(String(err));
63
- const kind = classifyError(lastError);
64
- // Non-retryable errors
65
- if (kind === "auth" || kind === "billing" || kind === "format" || kind === "abort") {
66
- throw lastError;
67
- }
68
- // Overflow: compact and retry once
69
- if (kind === "overflow" && !overflowRetried && opts.onCompact) {
70
- overflowRetried = true;
71
- opts.onRetry?.(attempt, kind, lastError);
72
- await opts.onCompact();
73
- continue;
74
- }
75
- // Last attempt — don't retry
76
- if (attempt === opts.maxRetries)
77
- break;
78
- // Retryable: backoff
79
- if (isRetryable(kind)) {
80
- opts.onRetry?.(attempt, kind, lastError);
81
- const delay = opts.backoffMs * Math.pow(2, attempt);
82
- await new Promise((r) => setTimeout(r, delay));
83
- continue;
84
- }
85
- // Unknown errors: retry once then fail
86
- if (kind === "unknown" && attempt === 0) {
87
- opts.onRetry?.(attempt, kind, lastError);
88
- await new Promise((r) => setTimeout(r, opts.backoffMs));
89
- continue;
90
- }
91
- break;
92
- }
93
- }
94
- throw lastError;
95
- }
96
- //# sourceMappingURL=retry.js.map
package/dist/retry.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
package/dist/runs.js DELETED
@@ -1,83 +0,0 @@
1
- // Run tracking: prevents concurrent runs on the same session
2
- import { QUEUE_WAIT_TIMEOUT_MS } from "./core/constants.js";
3
- // Primary index: runId -> handle
4
- const runsByRunId = new Map();
5
- // Secondary index: sessionId -> runId (latest)
6
- const sessionToRunId = new Map();
7
- const waiters = new Map();
8
- let runCounter = 0;
9
- export function generateRunId() {
10
- return `run-${Date.now()}-${++runCounter}`;
11
- }
12
- export function setActiveRun(sessionId, handle) {
13
- // Abort any existing run for this session
14
- const existingRunId = sessionToRunId.get(sessionId);
15
- if (existingRunId) {
16
- const existing = runsByRunId.get(existingRunId);
17
- if (existing)
18
- existing.abort();
19
- runsByRunId.delete(existingRunId);
20
- }
21
- runsByRunId.set(handle.runId, handle);
22
- sessionToRunId.set(sessionId, handle.runId);
23
- }
24
- export function clearActiveRun(runId) {
25
- const handle = runsByRunId.get(runId);
26
- if (!handle)
27
- return;
28
- runsByRunId.delete(runId);
29
- // Only clear session mapping if this is still the latest run
30
- if (sessionToRunId.get(handle.sessionId) === runId) {
31
- sessionToRunId.delete(handle.sessionId);
32
- }
33
- // Notify waiters for this session
34
- const sessionWaiters = waiters.get(handle.sessionId);
35
- if (sessionWaiters) {
36
- for (const resolve of sessionWaiters)
37
- resolve(true);
38
- waiters.delete(handle.sessionId);
39
- }
40
- }
41
- export function isRunActive(sessionId) {
42
- const runId = sessionToRunId.get(sessionId);
43
- return runId !== undefined && runsByRunId.has(runId);
44
- }
45
- export function getActiveRun(sessionId) {
46
- const runId = sessionToRunId.get(sessionId);
47
- return runId ? runsByRunId.get(runId) : undefined;
48
- }
49
- export function abortRun(sessionId) {
50
- const runId = sessionToRunId.get(sessionId);
51
- if (!runId)
52
- return false;
53
- const handle = runsByRunId.get(runId);
54
- if (handle) {
55
- handle.abort();
56
- clearActiveRun(runId);
57
- return true;
58
- }
59
- return false;
60
- }
61
- export function waitForRunEnd(sessionId, timeoutMs = QUEUE_WAIT_TIMEOUT_MS) {
62
- if (!isRunActive(sessionId))
63
- return Promise.resolve(true);
64
- return new Promise((resolve) => {
65
- const timer = setTimeout(() => {
66
- const set = waiters.get(sessionId);
67
- if (set)
68
- set.delete(wrappedResolve);
69
- resolve(false);
70
- }, timeoutMs);
71
- const wrappedResolve = (ended) => {
72
- clearTimeout(timer);
73
- resolve(ended);
74
- };
75
- if (!waiters.has(sessionId))
76
- waiters.set(sessionId, new Set());
77
- waiters.get(sessionId).add(wrappedResolve);
78
- });
79
- }
80
- export function getActiveRunCount() {
81
- return runsByRunId.size;
82
- }
83
- //# sourceMappingURL=runs.js.map
package/dist/runs.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
package/dist/skills.js DELETED
@@ -1,89 +0,0 @@
1
- // Skills system: load skill definitions from ~/.opencamel/skills/
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- import { paths } from "./core/config.js";
5
- import { MAX_SKILLS_TOTAL_CHARS } from "./core/constants.js";
6
- const skillsDir = path.join(paths.configDir, "skills");
7
- /**
8
- * Load all skills from ~/.opencamel/skills/
9
- * Each skill is a directory containing SKILL.md with optional frontmatter.
10
- *
11
- * Format:
12
- * ~/.opencamel/skills/my-skill/SKILL.md
13
- *
14
- * Frontmatter (optional):
15
- * ---
16
- * name: my-skill
17
- * description: Does something useful
18
- * ---
19
- * # Skill content here...
20
- */
21
- export function loadSkills() {
22
- if (!fs.existsSync(skillsDir))
23
- return [];
24
- const skills = [];
25
- const dirs = fs.readdirSync(skillsDir, { withFileTypes: true });
26
- for (const dir of dirs) {
27
- if (!dir.isDirectory())
28
- continue;
29
- const skillFile = path.join(skillsDir, dir.name, "SKILL.md");
30
- if (!fs.existsSync(skillFile))
31
- continue;
32
- const raw = fs.readFileSync(skillFile, "utf-8").trim();
33
- if (!raw)
34
- continue;
35
- const { frontmatter, content } = parseFrontmatter(raw);
36
- skills.push({
37
- name: frontmatter.name ?? dir.name,
38
- description: frontmatter.description ?? "",
39
- content,
40
- path: skillFile,
41
- });
42
- }
43
- return skills;
44
- }
45
- /**
46
- * Format skills for injection into the system prompt.
47
- */
48
- export function formatSkillsForPrompt(skills, maxChars = MAX_SKILLS_TOTAL_CHARS) {
49
- if (skills.length === 0)
50
- return "";
51
- const sections = ["## Active Skills\n"];
52
- let totalChars = 0;
53
- for (const skill of skills) {
54
- const section = `### ${skill.name}${skill.description ? ` — ${skill.description}` : ""}\n\n${skill.content}\n`;
55
- if (totalChars + section.length > maxChars)
56
- break;
57
- totalChars += section.length;
58
- sections.push(section);
59
- }
60
- return sections.join("\n");
61
- }
62
- function parseFrontmatter(raw) {
63
- const frontmatter = {};
64
- if (!raw.startsWith("---")) {
65
- return { frontmatter, content: raw };
66
- }
67
- const endIdx = raw.indexOf("---", 3);
68
- if (endIdx === -1) {
69
- return { frontmatter, content: raw };
70
- }
71
- const yaml = raw.slice(3, endIdx).trim();
72
- const content = raw.slice(endIdx + 3).trim();
73
- for (const line of yaml.split("\n")) {
74
- const colonIdx = line.indexOf(":");
75
- if (colonIdx === -1)
76
- continue;
77
- const key = line.slice(0, colonIdx).trim();
78
- const value = line.slice(colonIdx + 1).trim();
79
- frontmatter[key] = value;
80
- }
81
- return { frontmatter, content };
82
- }
83
- export function ensureSkillsDir() {
84
- fs.mkdirSync(skillsDir, { recursive: true });
85
- }
86
- export function listSkillNames() {
87
- return loadSkills().map((s) => s.name);
88
- }
89
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
package/dist/subagent.js DELETED
@@ -1,71 +0,0 @@
1
- // Subagent: spawn child agent runs in isolated sessions
2
- import { runAgent } from "./agent.js";
3
- import { loadMessages, saveMessage } from "./session.js";
4
- import { compactHistory } from "./compact.js";
5
- import { withRetry } from "./retry.js";
6
- import { acquireLane, Lane } from "./lanes.js";
7
- import { HumanMessage, AIMessage } from "@langchain/core/messages";
8
- const activeSubagents = new Map();
9
- let counter = 0;
10
- /** Spawn a subagent that runs a task in an isolated session */
11
- export async function spawnSubagent(model, systemPrompt, task, opts) {
12
- const id = `sub-${++counter}-${Date.now()}`;
13
- const sessionId = `subagent-${id}`;
14
- const handle = {
15
- id,
16
- sessionId,
17
- task,
18
- startedAt: Date.now(),
19
- status: "running",
20
- };
21
- activeSubagents.set(id, handle);
22
- // Run in subagent lane
23
- const release = await acquireLane(Lane.Subagent);
24
- try {
25
- let history = loadMessages(sessionId);
26
- if (opts?.compaction) {
27
- const compacted = await compactHistory(model, history, opts.compaction);
28
- if (compacted)
29
- history = compacted;
30
- }
31
- const result = await withRetry(() => runAgent(model, systemPrompt, history, task, {
32
- maxTurns: opts?.maxTurns ?? 15,
33
- timeoutMs: opts?.timeoutMs ?? 120_000,
34
- sessionId,
35
- }), {
36
- maxRetries: opts?.maxRetries ?? 2,
37
- backoffMs: opts?.backoffMs ?? 1000,
38
- });
39
- saveMessage(sessionId, new HumanMessage(task), "subagent");
40
- if (result.response) {
41
- saveMessage(sessionId, new AIMessage(result.response), "subagent");
42
- }
43
- handle.status = "done";
44
- handle.result = result.response;
45
- }
46
- catch (err) {
47
- handle.status = "failed";
48
- handle.error = err.message;
49
- }
50
- finally {
51
- release();
52
- }
53
- return handle;
54
- }
55
- /** List all subagent handles */
56
- export function listSubagents() {
57
- return Array.from(activeSubagents.values());
58
- }
59
- /** Get a specific subagent handle */
60
- export function getSubagent(id) {
61
- return activeSubagents.get(id);
62
- }
63
- /** Clean up completed subagent records */
64
- export function clearCompletedSubagents() {
65
- for (const [id, handle] of activeSubagents) {
66
- if (handle.status !== "running") {
67
- activeSubagents.delete(id);
68
- }
69
- }
70
- }
71
- //# sourceMappingURL=subagent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../src/subagent.ts"],"names":[],"mappings":"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"}