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.
- package/LICENSE +1 -1
- package/README.md +241 -104
- package/dist/agent/agent-sdk.js +136 -65
- package/dist/agent/agent-sdk.js.map +1 -1
- package/dist/agent.js +4 -1
- package/dist/agent.js.map +1 -1
- package/dist/bootstrap.js +148 -331
- package/dist/bootstrap.js.map +1 -1
- package/dist/channels/handler.js +109 -1
- package/dist/channels/handler.js.map +1 -1
- package/dist/cli/cmd-agents.js +186 -24
- package/dist/cli/cmd-agents.js.map +1 -1
- package/dist/cli/cmd-bootstrap.js +4 -4
- package/dist/cli/cmd-bootstrap.js.map +1 -1
- package/dist/cli/cmd-install.js +80 -0
- package/dist/cli/cmd-install.js.map +1 -0
- package/dist/cli/cmd-pairing.js +14 -15
- package/dist/cli/cmd-pairing.js.map +1 -1
- package/dist/cli/cmd-reset.js +10 -12
- package/dist/cli/cmd-reset.js.map +1 -1
- package/dist/cli/cmd-sessions.js +10 -13
- package/dist/cli/cmd-sessions.js.map +1 -1
- package/dist/cli/cmd-status.js +67 -0
- package/dist/cli/cmd-status.js.map +1 -0
- package/dist/cli/cmd-uninstall.js +79 -0
- package/dist/cli/cmd-uninstall.js.map +1 -0
- package/dist/cli/cmd-update.js +47 -0
- package/dist/cli/cmd-update.js.map +1 -0
- package/dist/cli.js +44 -26
- package/dist/cli.js.map +1 -1
- package/dist/core/config.js +53 -8
- package/dist/core/config.js.map +1 -1
- package/dist/core/log.js +33 -13
- package/dist/core/log.js.map +1 -1
- package/dist/core/update-check.js +11 -13
- package/dist/core/update-check.js.map +1 -1
- package/dist/core/version.js +4 -0
- package/dist/core/version.js.map +1 -0
- package/dist/runtime/orchestrate.js +25 -15
- package/dist/runtime/orchestrate.js.map +1 -1
- package/dist/serve.js +22 -7
- package/dist/serve.js.map +1 -1
- package/dist/setup.js +259 -231
- package/dist/setup.js.map +1 -1
- package/dist/telegram/admin-bot.js +325 -1
- package/dist/telegram/admin-bot.js.map +1 -1
- package/dist/telegram/agent-bot.js +143 -2
- package/dist/telegram/agent-bot.js.map +1 -1
- package/dist/telegram/resolve.js +11 -2
- package/dist/telegram/resolve.js.map +1 -1
- package/dist/telegram/wizards.js +361 -12
- package/dist/telegram/wizards.js.map +1 -1
- package/dist/telegram.js +2 -0
- package/dist/telegram.js.map +1 -1
- package/dist/usage.js +106 -0
- package/dist/usage.js.map +1 -1
- package/dist/workspace.js +20 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +7 -4
- package/dist/agent/agent-openai.js +0 -206
- package/dist/agent/agent-openai.js.map +0 -1
- package/dist/approval-forward.js +0 -42
- package/dist/approval-forward.js.map +0 -1
- package/dist/approvals.js +0 -151
- package/dist/approvals.js.map +0 -1
- package/dist/camelagi-gateway.mjs +0 -93611
- package/dist/camelagi-gateway.mjs.map +0 -7
- package/dist/compact.js +0 -92
- package/dist/compact.js.map +0 -1
- package/dist/config.js +0 -153
- package/dist/config.js.map +0 -1
- package/dist/constants.js +0 -21
- package/dist/constants.js.map +0 -1
- package/dist/cron.js +0 -81
- package/dist/cron.js.map +0 -1
- package/dist/errors.js +0 -5
- package/dist/errors.js.map +0 -1
- package/dist/hooks.js +0 -72
- package/dist/hooks.js.map +0 -1
- package/dist/lanes.js +0 -62
- package/dist/lanes.js.map +0 -1
- package/dist/policy.js +0 -22
- package/dist/policy.js.map +0 -1
- package/dist/queue.js +0 -45
- package/dist/queue.js.map +0 -1
- package/dist/retry.js +0 -96
- package/dist/retry.js.map +0 -1
- package/dist/runs.js +0 -83
- package/dist/runs.js.map +0 -1
- package/dist/skills.js +0 -89
- package/dist/skills.js.map +0 -1
- package/dist/subagent.js +0 -71
- package/dist/subagent.js.map +0 -1
- package/dist/telegram-admin.js +0 -800
- package/dist/telegram-admin.js.map +0 -1
- package/dist/tools/edit.js +0 -29
- package/dist/tools/edit.js.map +0 -1
- package/dist/tools/exec.js +0 -38
- package/dist/tools/exec.js.map +0 -1
- package/dist/tools/fetch.js +0 -28
- package/dist/tools/fetch.js.map +0 -1
- package/dist/tools/index.js +0 -16
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/read.js +0 -26
- package/dist/tools/read.js.map +0 -1
- package/dist/tools/search.js +0 -62
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/subagent.js +0 -48
- package/dist/tools/subagent.js.map +0 -1
- package/dist/tools/write.js +0 -22
- package/dist/tools/write.js.map +0 -1
- package/dist/types.js +0 -3
- 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
|
package/dist/compact.js.map
DELETED
|
@@ -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
|
package/dist/config.js.map
DELETED
|
@@ -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
|
package/dist/constants.js.map
DELETED
|
@@ -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
package/dist/errors.js.map
DELETED
|
@@ -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
|
package/dist/policy.js.map
DELETED
|
@@ -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"}
|