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.
- 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 +11 -14
- 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/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
|
package/dist/skills.js.map
DELETED
|
@@ -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
|
package/dist/subagent.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../src/subagent.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EAAE,QAAQ,EAAkB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAanE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;AAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAoB,EACpB,YAAoB,EACpB,IAAY,EACZ,IAOC;IAED,MAAM,EAAE,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,YAAY,EAAE,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAmB;QAC7B,EAAE;QACF,SAAS;QACT,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,SAAS;KAClB,CAAC;IACF,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAEhC,uBAAuB;IACvB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAEtC,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACxE,IAAI,SAAS;gBAAE,OAAO,GAAG,SAAS,CAAC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;YACjD,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;YAC9B,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO;YACrC,SAAS;SACV,CAAC,EACF;YACE,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC;YACjC,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI;SACnC,CACF,CAAC;QAEF,WAAW,CAAC,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,WAAW,CAAC,SAAS,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,uBAAuB;IACrC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
|