camelagi 0.5.0 → 0.5.17

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 +186 -24
  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/compact.js DELETED
@@ -1,92 +0,0 @@
1
- // Context compaction: summarize old messages when context gets too large
2
- import { chatDirect } from "./model.js";
3
- import fs from "node:fs";
4
- import path from "node:path";
5
- import { workspacePaths } from "./workspace.js";
6
- import { CHARS_PER_TOKEN, COMPACTION_TRIGGER_RATIO, MEMORY_FLUSH_MAX_CHARS } from "./core/constants.js";
7
- function estimateTokens(messages) {
8
- let chars = 0;
9
- for (const msg of messages) {
10
- chars += msg.content.length;
11
- }
12
- return Math.ceil(chars / CHARS_PER_TOKEN);
13
- }
14
- function splitHistory(messages, keepTurns) {
15
- if (keepTurns <= 0)
16
- return { old: messages, recent: [] };
17
- const turnStarts = [];
18
- for (let i = 0; i < messages.length; i++) {
19
- if (messages[i].role === "user") {
20
- turnStarts.push(i);
21
- }
22
- }
23
- if (turnStarts.length <= keepTurns) {
24
- return { old: [], recent: messages };
25
- }
26
- const cutoff = turnStarts[turnStarts.length - keepTurns];
27
- return {
28
- old: messages.slice(0, cutoff),
29
- recent: messages.slice(cutoff),
30
- };
31
- }
32
- const COMPACT_PROMPT = `Summarize the following conversation history concisely. Preserve:
33
- - Key facts, decisions, and context established
34
- - Important file paths, names, and technical details mentioned
35
- - Current state of any ongoing tasks
36
- - User preferences or instructions given
37
-
38
- Be concise but don't lose critical context. Output only the summary, no preamble.`;
39
- export async function compactHistory(client, model, history, opts) {
40
- if (!opts.enabled)
41
- return null;
42
- const tokens = estimateTokens(history);
43
- if (tokens < opts.maxTokens * COMPACTION_TRIGGER_RATIO)
44
- return null;
45
- const { old, recent } = splitHistory(history, opts.keepTurns);
46
- if (old.length === 0)
47
- return null;
48
- await memoryFlush(client, model, old);
49
- const oldText = old.map((m) => {
50
- return `[${m.role}]: ${m.content}`;
51
- }).join("\n\n");
52
- const summaryResult = await chatDirect(client, model, COMPACT_PROMPT, oldText);
53
- const summaryMessage = {
54
- role: "user",
55
- content: `[Previous conversation summary]\n${summaryResult.content}\n[End of summary — conversation continues below]`,
56
- };
57
- return [summaryMessage, ...recent];
58
- }
59
- // --- Memory flush ---
60
- const FLUSH_PROMPT = `You are about to lose the following conversation history due to context compaction.
61
- Extract any durable facts worth remembering: decisions made, user preferences discovered,
62
- project details, file paths, names, dates, or anything the user would expect you to know later.
63
-
64
- Format as concise bullet points. If nothing is worth saving, reply with "NOTHING".`;
65
- async function memoryFlush(client, model, oldMessages) {
66
- if (oldMessages.length === 0)
67
- return;
68
- try {
69
- const oldText = oldMessages.map((m) => {
70
- return `[${m.role}]: ${m.content}`;
71
- }).join("\n\n");
72
- if (oldText.length < 200)
73
- return;
74
- const response = await chatDirect(client, model, FLUSH_PROMPT, oldText.slice(0, MEMORY_FLUSH_MAX_CHARS));
75
- const extracted = response.content;
76
- if (extracted.trim() === "NOTHING" || extracted.trim().length < 10)
77
- return;
78
- const { workspaceDir } = workspacePaths;
79
- const memoryDir = path.join(workspaceDir, "memory");
80
- fs.mkdirSync(memoryDir, { recursive: true });
81
- const today = new Date().toISOString().split("T")[0];
82
- const dailyFile = path.join(memoryDir, `${today}.md`);
83
- const header = fs.existsSync(dailyFile) ? "" : `# ${today}\n\n`;
84
- const timestamp = new Date().toTimeString().split(" ")[0];
85
- const entry = `${header}## ${timestamp} (auto-flush)\n\n${extracted}\n\n`;
86
- fs.appendFileSync(dailyFile, entry);
87
- }
88
- catch {
89
- // Memory flush is best-effort
90
- }
91
- }
92
- //# sourceMappingURL=compact.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compact.js","sourceRoot":"","sources":["../src/compact.ts"],"names":[],"mappings":"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"}
package/dist/config.js DELETED
@@ -1,153 +0,0 @@
1
- // Config: env vars + optional YAML file at ~/.opencamel/config.yaml
2
- import { z } from "zod";
3
- import fs from "node:fs";
4
- import path from "node:path";
5
- import os from "node:os";
6
- import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
7
- import "dotenv/config";
8
- const configDir = path.join(os.homedir(), ".opencamel");
9
- const configFile = path.join(configDir, "config.yaml");
10
- const sessionsDir = path.join(configDir, "sessions");
11
- export const paths = { configDir, configFile, sessionsDir };
12
- const schema = z.object({
13
- provider: z.enum(["anthropic", "openai"]).default("anthropic"),
14
- model: z.string().default("claude-sonnet-4-20250514"),
15
- apiKey: z.string().optional(),
16
- baseUrl: z.string().optional(),
17
- systemPrompt: z.string().default("You are OpenCamel, a helpful AI assistant. You have access to tools for running shell commands, reading/writing files, and fetching URLs. Use them when needed to help the user."),
18
- thinking: z.enum(["off", "low", "medium", "high"]).default("off"),
19
- effort: z.enum(["low", "medium", "high", "max"]).default("high"),
20
- maxBudgetUsd: z.number().optional(),
21
- maxTurns: z.number().default(25),
22
- timeoutSeconds: z.number().default(300),
23
- serve: z.object({
24
- port: z.number().default(18789),
25
- host: z.string().default("127.0.0.1"),
26
- token: z.string().optional(),
27
- }).default(() => ({ port: 18789, host: "127.0.0.1" })),
28
- telegram: z.object({
29
- botToken: z.string().optional(),
30
- allowedUsers: z.array(z.number()).default([]),
31
- groups: z.object({
32
- mentionOnly: z.boolean().default(true),
33
- }).default(() => ({ mentionOnly: true })),
34
- chats: z.record(z.string(), z.object({
35
- name: z.string().optional(),
36
- model: z.string().optional(),
37
- systemPrompt: z.string().optional(),
38
- maxTurns: z.number().optional(),
39
- thinking: z.enum(["off", "low", "medium", "high"]).optional(),
40
- effort: z.enum(["low", "medium", "high", "max"]).optional(),
41
- })).default(() => ({})),
42
- }).default(() => ({ allowedUsers: [], groups: { mentionOnly: true }, chats: {} })),
43
- compaction: z.object({
44
- enabled: z.boolean().default(true),
45
- maxTokens: z.number().default(80_000),
46
- keepTurns: z.number().default(6),
47
- }).default(() => ({ enabled: true, maxTokens: 80_000, keepTurns: 6 })),
48
- tools: z.object({
49
- allow: z.array(z.string()).default([]),
50
- deny: z.array(z.string()).default([]),
51
- }).default(() => ({ allow: [], deny: [] })),
52
- skills: z.object({
53
- enabled: z.boolean().default(true),
54
- deny: z.array(z.string()).default([]),
55
- }).default(() => ({ enabled: true, deny: [] })),
56
- hooks: z.object({
57
- enabled: z.boolean().default(false),
58
- }).default(() => ({ enabled: false })),
59
- approvals: z.object({
60
- mode: z.enum(["off", "smart", "always"]).default("off"),
61
- allowlist: z.array(z.string()).default([]),
62
- timeoutSeconds: z.number().default(120),
63
- fallback: z.enum(["deny", "allow"]).default("deny"),
64
- /** Telegram chat ID to forward approval requests to when running headless */
65
- forwardTo: z.number().optional(),
66
- }).default(() => ({ mode: "off", allowlist: [], timeoutSeconds: 120, fallback: "deny" })),
67
- retry: z.object({
68
- maxRetries: z.number().default(3),
69
- backoffMs: z.number().default(1000),
70
- }).default(() => ({ maxRetries: 3, backoffMs: 1000 })),
71
- lanes: z.object({
72
- main: z.number().default(3),
73
- cron: z.number().default(1),
74
- subagent: z.number().default(5),
75
- }).default(() => ({ main: 3, cron: 1, subagent: 5 })),
76
- agents: z.record(z.string(), z.object({
77
- name: z.string(),
78
- admin: z.boolean().default(false),
79
- model: z.string().optional(),
80
- systemPrompt: z.string().optional(),
81
- thinking: z.enum(["off", "low", "medium", "high"]).optional(),
82
- effort: z.enum(["low", "medium", "high", "max"]).optional(),
83
- maxTurns: z.number().optional(),
84
- telegram: z.object({
85
- botToken: z.string(),
86
- allowedUsers: z.array(z.number()).default([]),
87
- groups: z.object({
88
- mentionOnly: z.boolean().default(true),
89
- }).default(() => ({ mentionOnly: true })),
90
- }).optional(),
91
- })).default(() => ({})),
92
- boot: z.boolean().default(true),
93
- cron: z.array(z.object({
94
- id: z.string(),
95
- name: z.string().default(""),
96
- schedule: z.string(),
97
- prompt: z.string(),
98
- session: z.string().optional(),
99
- enabled: z.boolean().default(true),
100
- })).default([]),
101
- });
102
- export function loadConfig(overrides = {}) {
103
- let fileConfig = {};
104
- if (fs.existsSync(configFile)) {
105
- const raw = fs.readFileSync(configFile, "utf-8");
106
- fileConfig = parseYaml(raw) ?? {};
107
- }
108
- // env vars override file config
109
- const merged = {
110
- ...fileConfig,
111
- ...(process.env.OPENCAMEL_PROVIDER && { provider: process.env.OPENCAMEL_PROVIDER }),
112
- ...(process.env.OPENCAMEL_MODEL && { model: process.env.OPENCAMEL_MODEL }),
113
- ...(process.env.ANTHROPIC_API_KEY && { apiKey: process.env.ANTHROPIC_API_KEY }),
114
- ...(process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY && { apiKey: process.env.OPENAI_API_KEY }),
115
- ...(process.env.OPENCAMEL_BASE_URL && { baseUrl: process.env.OPENCAMEL_BASE_URL }),
116
- ...overrides,
117
- };
118
- // env vars for serve/telegram sections
119
- const m = merged;
120
- if (process.env.OPENCAMEL_TOKEN) {
121
- const existing = (m.serve ?? {});
122
- m.serve = { ...existing, token: process.env.OPENCAMEL_TOKEN };
123
- }
124
- if (process.env.TELEGRAM_BOT_TOKEN) {
125
- const existing = (m.telegram ?? {});
126
- m.telegram = { ...existing, botToken: process.env.TELEGRAM_BOT_TOKEN };
127
- }
128
- return schema.parse(merged);
129
- }
130
- export function saveConfig(values) {
131
- fs.mkdirSync(configDir, { recursive: true });
132
- let existing = {};
133
- if (fs.existsSync(configFile)) {
134
- existing = parseYaml(fs.readFileSync(configFile, "utf-8")) ?? {};
135
- }
136
- const merged = { ...existing, ...values };
137
- try {
138
- fs.writeFileSync(configFile, stringifyYaml(merged));
139
- }
140
- catch (err) {
141
- const msg = err instanceof Error ? err.message : String(err);
142
- throw new Error(`Failed to save config to ${configFile}: ${msg}`);
143
- }
144
- }
145
- export function ensureDirs() {
146
- fs.mkdirSync(configDir, { recursive: true });
147
- fs.mkdirSync(sessionsDir, { recursive: true });
148
- fs.mkdirSync(path.join(configDir, "workspace"), { recursive: true });
149
- fs.mkdirSync(path.join(configDir, "hooks"), { recursive: true });
150
- fs.mkdirSync(path.join(configDir, "skills"), { recursive: true });
151
- fs.mkdirSync(path.join(configDir, "usage"), { recursive: true });
152
- }
153
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/constants.js DELETED
@@ -1,21 +0,0 @@
1
- // Shared constants — single source of truth for magic numbers
2
- // Token estimation
3
- export const CHARS_PER_TOKEN = 4;
4
- // Output limits
5
- export const MAX_TOOL_OUTPUT_CHARS = 50_000;
6
- export const MAX_STDERR_CHARS = 10_000;
7
- // System prompt limits
8
- export const MAX_BOOTSTRAP_FILE_CHARS = 20_000;
9
- export const MAX_BOOTSTRAP_TOTAL_CHARS = 150_000;
10
- export const MAX_SKILLS_TOTAL_CHARS = 30_000;
11
- // Timeouts
12
- export const HOOK_TIMEOUT_MS = 10_000;
13
- export const HEARTBEAT_INTERVAL_MS = 30_000;
14
- export const QUEUE_WAIT_TIMEOUT_MS = 15_000;
15
- // Compaction
16
- export const COMPACTION_TRIGGER_RATIO = 0.8;
17
- export const MEMORY_FLUSH_MAX_CHARS = 30_000;
18
- // API defaults
19
- export const DEFAULT_MAX_TOKENS = 4096;
20
- export const DEFAULT_MAX_TURNS = 25;
21
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,mBAAmB;AACnB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,uBAAuB;AACvB,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,WAAW;AACX,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,aAAa;AACb,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,eAAe;AACf,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC"}
package/dist/cron.js DELETED
@@ -1,81 +0,0 @@
1
- // Cron: scheduled agent runs
2
- import { runAgent } from "./agent.js";
3
- import { loadMessages, saveMessage } from "./session.js";
4
- const activeJobs = new Map();
5
- function parseInterval(schedule) {
6
- const match = schedule.match(/^(\d+)(s|m|h|d)$/);
7
- if (!match)
8
- return null;
9
- const value = parseInt(match[1], 10);
10
- switch (match[2]) {
11
- case "s": return value * 1000;
12
- case "m": return value * 60_000;
13
- case "h": return value * 3_600_000;
14
- case "d": return value * 86_400_000;
15
- default: return null;
16
- }
17
- }
18
- function parseCronInterval(schedule) {
19
- const interval = parseInterval(schedule);
20
- if (interval)
21
- return interval;
22
- const parts = schedule.split(/\s+/);
23
- if (parts.length !== 5)
24
- return 60_000;
25
- const [min] = parts;
26
- if (min.startsWith("*/")) {
27
- const every = parseInt(min.slice(2), 10);
28
- return every * 60_000;
29
- }
30
- return 60_000;
31
- }
32
- export function startCronJob(job, config, systemPrompt, opts) {
33
- if (activeJobs.has(job.id)) {
34
- stopCronJob(job.id);
35
- }
36
- const intervalMs = parseCronInterval(job.schedule);
37
- const sid = job.session ?? `cron-${job.id}`;
38
- const run = async () => {
39
- try {
40
- const history = loadMessages(sid);
41
- const result = await runAgent(config.apiKey, config.model, systemPrompt, history, job.prompt, {
42
- maxTurns: opts?.maxTurns ?? 10,
43
- timeoutMs: opts?.timeoutMs ?? 120_000,
44
- provider: config.provider,
45
- baseUrl: config.baseUrl,
46
- });
47
- saveMessage(sid, { role: "user", content: job.prompt }, "cron");
48
- if (result.response) {
49
- saveMessage(sid, { role: "assistant", content: result.response }, "cron");
50
- }
51
- opts?.onRun?.(job.id, result.response);
52
- }
53
- catch (err) {
54
- const error = err instanceof Error ? err : new Error(String(err));
55
- opts?.onError?.(job.id, error);
56
- }
57
- };
58
- const timer = setInterval(run, intervalMs);
59
- activeJobs.set(job.id, { job, timer });
60
- void run();
61
- }
62
- export function stopCronJob(id) {
63
- const active = activeJobs.get(id);
64
- if (!active)
65
- return false;
66
- clearInterval(active.timer);
67
- activeJobs.delete(id);
68
- return true;
69
- }
70
- export function stopAllCronJobs() {
71
- for (const [id] of activeJobs) {
72
- stopCronJob(id);
73
- }
74
- }
75
- export function listCronJobs() {
76
- return Array.from(activeJobs.values()).map((a) => a.job);
77
- }
78
- export function isCronRunning(id) {
79
- return activeJobs.has(id);
80
- }
81
- //# sourceMappingURL=cron.js.map
package/dist/cron.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"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"}
package/dist/errors.js DELETED
@@ -1,5 +0,0 @@
1
- // Error utilities
2
- export function errorMessage(err) {
3
- return err instanceof Error ? err.message : String(err);
4
- }
5
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
package/dist/hooks.js DELETED
@@ -1,72 +0,0 @@
1
- // Lifecycle hooks: shell scripts or JS handlers from ~/.opencamel/hooks/
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- import { execSync } from "node:child_process";
5
- import { paths } from "./core/config.js";
6
- import { HOOK_TIMEOUT_MS, MAX_STDERR_CHARS } from "./core/constants.js";
7
- const hooksDir = path.join(paths.configDir, "hooks");
8
- /**
9
- * Load all hook scripts from ~/.opencamel/hooks/
10
- * Naming convention: {point}.{name}.sh or {point}.{name}.js
11
- * Examples: before_tool.log.sh, after_response.notify.sh
12
- */
13
- export function loadHooks() {
14
- if (!fs.existsSync(hooksDir))
15
- return [];
16
- const entries = [];
17
- const files = fs.readdirSync(hooksDir);
18
- for (const file of files) {
19
- if (!file.endsWith(".sh") && !file.endsWith(".js"))
20
- continue;
21
- const parts = file.split(".");
22
- if (parts.length < 3)
23
- continue;
24
- const point = parts[0];
25
- if (!["before_prompt", "after_response", "before_tool", "after_tool"].includes(point))
26
- continue;
27
- const name = parts.slice(1, -1).join(".");
28
- entries.push({
29
- name,
30
- point,
31
- script: path.join(hooksDir, file),
32
- });
33
- }
34
- return entries;
35
- }
36
- /**
37
- * Run all hooks for a given point.
38
- * Context is passed via environment variables (OPENCAMEL_HOOK_*).
39
- */
40
- export async function runHooks(point, context, hooks) {
41
- const all = hooks ?? loadHooks();
42
- const matching = all.filter((h) => h.point === point);
43
- if (matching.length === 0)
44
- return;
45
- const env = {
46
- ...process.env,
47
- OPENCAMEL_HOOK_POINT: point,
48
- ...(context.sessionId && { OPENCAMEL_HOOK_SESSION: context.sessionId }),
49
- ...(context.message && { OPENCAMEL_HOOK_MESSAGE: context.message }),
50
- ...(context.response && { OPENCAMEL_HOOK_RESPONSE: context.response.slice(0, MAX_STDERR_CHARS) }),
51
- ...(context.toolName && { OPENCAMEL_HOOK_TOOL: context.toolName }),
52
- ...(context.toolArgs && { OPENCAMEL_HOOK_TOOL_ARGS: JSON.stringify(context.toolArgs) }),
53
- ...(context.toolResult && { OPENCAMEL_HOOK_TOOL_RESULT: context.toolResult.slice(0, MAX_STDERR_CHARS) }),
54
- };
55
- for (const hook of matching) {
56
- try {
57
- execSync(hook.script, {
58
- env,
59
- timeout: HOOK_TIMEOUT_MS,
60
- stdio: "pipe",
61
- });
62
- }
63
- catch (err) {
64
- const msg = err instanceof Error ? err.message : String(err);
65
- process.stderr.write(`Hook ${hook.name} failed: ${msg}\n`);
66
- }
67
- }
68
- }
69
- export function ensureHooksDir() {
70
- fs.mkdirSync(hooksDir, { recursive: true });
71
- }
72
- //# sourceMappingURL=hooks.js.map
package/dist/hooks.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/lanes.js DELETED
@@ -1,62 +0,0 @@
1
- // Concurrency lanes: limit parallel agent runs by type
2
- export var Lane;
3
- (function (Lane) {
4
- Lane["Main"] = "main";
5
- Lane["Cron"] = "cron";
6
- Lane["Subagent"] = "subagent";
7
- })(Lane || (Lane = {}));
8
- const lanes = new Map();
9
- export function configureLane(lane, limit) {
10
- const existing = lanes.get(lane);
11
- if (existing) {
12
- existing.limit = limit;
13
- }
14
- else {
15
- lanes.set(lane, { limit, active: 0, queue: [] });
16
- }
17
- }
18
- /**
19
- * Acquire a slot in a lane. Returns a release function.
20
- * If the lane is full, waits until a slot is available.
21
- */
22
- export async function acquireLane(lane) {
23
- let config = lanes.get(lane);
24
- if (!config) {
25
- // Default: unlimited
26
- config = { limit: Infinity, active: 0, queue: [] };
27
- lanes.set(lane, config);
28
- }
29
- if (config.active < config.limit) {
30
- config.active++;
31
- return () => releaseLane(lane);
32
- }
33
- // Wait for a slot
34
- await new Promise((resolve) => {
35
- config.queue.push(resolve);
36
- });
37
- config.active++;
38
- return () => releaseLane(lane);
39
- }
40
- function releaseLane(lane) {
41
- const config = lanes.get(lane);
42
- if (!config)
43
- return;
44
- config.active--;
45
- // Wake up next waiter
46
- const next = config.queue.shift();
47
- if (next)
48
- next();
49
- }
50
- /** Get current lane stats */
51
- export function getLaneStats() {
52
- const stats = {};
53
- for (const [lane, config] of lanes) {
54
- stats[lane] = {
55
- active: config.active,
56
- limit: config.limit === Infinity ? -1 : config.limit,
57
- queued: config.queue.length,
58
- };
59
- }
60
- return stats;
61
- }
62
- //# sourceMappingURL=lanes.js.map
package/dist/lanes.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"lanes.js","sourceRoot":"","sources":["../src/lanes.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,MAAM,CAAN,IAAY,IAIX;AAJD,WAAY,IAAI;IACd,qBAAa,CAAA;IACb,qBAAa,CAAA;IACb,6BAAqB,CAAA;AACvB,CAAC,EAJW,IAAI,KAAJ,IAAI,QAIf;AAQD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,KAAa;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAU;IAC1C,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,qBAAqB;QACrB,MAAM,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,kBAAkB;IAClB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,EAAE,CAAC;IAChB,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,IAAU;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,sBAAsB;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAClC,IAAI,IAAI;QAAE,IAAI,EAAE,CAAC;AACnB,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAsE,EAAE,CAAC;IACpF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;YACpD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/policy.js DELETED
@@ -1,22 +0,0 @@
1
- // Tool policy: allow/deny filtering for tools
2
- /**
3
- * Filter tools based on allow/deny policy.
4
- * - If deny list is non-empty, remove matching tools first.
5
- * - If allow list is non-empty, only keep matching tools.
6
- * - Empty lists = no filtering.
7
- */
8
- export function filterTools(tools, policy) {
9
- let filtered = tools;
10
- // Apply deny list first
11
- if (policy.deny.length > 0) {
12
- const denySet = new Set(policy.deny.map((n) => n.toLowerCase()));
13
- filtered = filtered.filter((t) => !denySet.has(t.name.toLowerCase()));
14
- }
15
- // Apply allow list
16
- if (policy.allow.length > 0) {
17
- const allowSet = new Set(policy.allow.map((n) => n.toLowerCase()));
18
- filtered = filtered.filter((t) => allowSet.has(t.name.toLowerCase()));
19
- }
20
- return filtered;
21
- }
22
- //# sourceMappingURL=policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAS9C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,KAAgC,EAChC,MAAkB;IAElB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,wBAAwB;IACxB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,mBAAmB;IACnB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACnE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/dist/queue.js DELETED
@@ -1,45 +0,0 @@
1
- // Message queue: per-session queue for inbound messages while agent is running
2
- import { isRunActive, waitForRunEnd } from "./runs.js";
3
- const queues = new Map();
4
- export function enqueueMessage(sessionId, text) {
5
- return new Promise((resolve, reject) => {
6
- if (!queues.has(sessionId))
7
- queues.set(sessionId, []);
8
- queues.get(sessionId).push({ text, resolve, reject, enqueuedAt: Date.now() });
9
- });
10
- }
11
- export function getQueueLength(sessionId) {
12
- return queues.get(sessionId)?.length ?? 0;
13
- }
14
- export function drainQueue(sessionId) {
15
- const queue = queues.get(sessionId);
16
- if (!queue || queue.length === 0)
17
- return [];
18
- queues.delete(sessionId);
19
- return queue;
20
- }
21
- export function clearQueue(sessionId) {
22
- const queue = queues.get(sessionId);
23
- if (queue) {
24
- for (const msg of queue) {
25
- msg.reject(new Error("Queue cleared"));
26
- }
27
- queues.delete(sessionId);
28
- }
29
- }
30
- /**
31
- * If a run is active for this session, enqueue the message and wait for
32
- * the active run to finish. Returns `{ queued: true }` so the caller
33
- * knows NOT to start a new run — the message is already stored for
34
- * later processing. Returns `{ queued: false }` when no run is active.
35
- */
36
- export async function queueOrProcess(sessionId, text) {
37
- if (!isRunActive(sessionId)) {
38
- return { queued: false };
39
- }
40
- // Run is active — enqueue and wait for run to end
41
- const promise = enqueueMessage(sessionId, text);
42
- await waitForRunEnd(sessionId);
43
- return { queued: true, promise };
44
- }
45
- //# sourceMappingURL=queue.js.map
package/dist/queue.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AASvD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;AAElD,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,IAAY;IAEZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,IAAY;IAEZ,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,kDAAkD;IAClD,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}