camelagi 0.5.0
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 +21 -0
- package/README.md +224 -0
- package/camelagi.mjs +2 -0
- package/config.example.yaml +107 -0
- package/dist/agent/agent-openai.js +206 -0
- package/dist/agent/agent-openai.js.map +1 -0
- package/dist/agent/agent-sdk.js +209 -0
- package/dist/agent/agent-sdk.js.map +1 -0
- package/dist/agent/tool-adapter.js +31 -0
- package/dist/agent/tool-adapter.js.map +1 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent.js +17 -0
- package/dist/agent.js.map +1 -0
- package/dist/approval-forward.js +42 -0
- package/dist/approval-forward.js.map +1 -0
- package/dist/approvals.js +151 -0
- package/dist/approvals.js.map +1 -0
- package/dist/boot.js +34 -0
- package/dist/boot.js.map +1 -0
- package/dist/bootstrap.js +451 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/camelagi-gateway.mjs +93611 -0
- package/dist/camelagi-gateway.mjs.map +7 -0
- package/dist/channels/adapter.js +10 -0
- package/dist/channels/adapter.js.map +1 -0
- package/dist/channels/discord.js +232 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/handler.js +349 -0
- package/dist/channels/handler.js.map +1 -0
- package/dist/channels/index.js +19 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/registry.js +71 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/telegram.js +83 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.js +3 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/chunker.js +102 -0
- package/dist/chunker.js.map +1 -0
- package/dist/cli/cmd-agents.js +65 -0
- package/dist/cli/cmd-agents.js.map +1 -0
- package/dist/cli/cmd-bootstrap.js +10 -0
- package/dist/cli/cmd-bootstrap.js.map +1 -0
- package/dist/cli/cmd-chat.js +32 -0
- package/dist/cli/cmd-chat.js.map +1 -0
- package/dist/cli/cmd-config.js +88 -0
- package/dist/cli/cmd-config.js.map +1 -0
- package/dist/cli/cmd-cron.js +120 -0
- package/dist/cli/cmd-cron.js.map +1 -0
- package/dist/cli/cmd-daemon.js +37 -0
- package/dist/cli/cmd-daemon.js.map +1 -0
- package/dist/cli/cmd-doctor.js +18 -0
- package/dist/cli/cmd-doctor.js.map +1 -0
- package/dist/cli/cmd-logs.js +30 -0
- package/dist/cli/cmd-logs.js.map +1 -0
- package/dist/cli/cmd-pairing.js +41 -0
- package/dist/cli/cmd-pairing.js.map +1 -0
- package/dist/cli/cmd-reset.js +39 -0
- package/dist/cli/cmd-reset.js.map +1 -0
- package/dist/cli/cmd-serve.js +30 -0
- package/dist/cli/cmd-serve.js.map +1 -0
- package/dist/cli/cmd-sessions.js +56 -0
- package/dist/cli/cmd-sessions.js.map +1 -0
- package/dist/cli/cmd-setup.js +11 -0
- package/dist/cli/cmd-setup.js.map +1 -0
- package/dist/cli/cmd-soul.js +43 -0
- package/dist/cli/cmd-soul.js.map +1 -0
- package/dist/cli/parse.js +50 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/registry.js +15 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli.js +103 -0
- package/dist/cli.js.map +1 -0
- package/dist/compact.js +92 -0
- package/dist/compact.js.map +1 -0
- package/dist/config.js +153 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/config.js +212 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.js +21 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors.js +5 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/log.js +41 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/models.js +123 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/update-check.js +51 -0
- package/dist/core/update-check.js.map +1 -0
- package/dist/cron.js +81 -0
- package/dist/cron.js.map +1 -0
- package/dist/daemon.js +109 -0
- package/dist/daemon.js.map +1 -0
- package/dist/doctor.js +194 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.js +5 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensions/approval-forward.js +42 -0
- package/dist/extensions/approval-forward.js.map +1 -0
- package/dist/extensions/approvals.js +144 -0
- package/dist/extensions/approvals.js.map +1 -0
- package/dist/extensions/cron.js +306 -0
- package/dist/extensions/cron.js.map +1 -0
- package/dist/extensions/hooks.js +72 -0
- package/dist/extensions/hooks.js.map +1 -0
- package/dist/extensions/skills.js +97 -0
- package/dist/extensions/skills.js.map +1 -0
- package/dist/gateway/csrf.js +44 -0
- package/dist/gateway/csrf.js.map +1 -0
- package/dist/gateway/logger.js +81 -0
- package/dist/gateway/logger.js.map +1 -0
- package/dist/gateway/rate-limit.js +33 -0
- package/dist/gateway/rate-limit.js.map +1 -0
- package/dist/gateway/routes.js +315 -0
- package/dist/gateway/routes.js.map +1 -0
- package/dist/gateway/state.js +54 -0
- package/dist/gateway/state.js.map +1 -0
- package/dist/gateway/ws-handler.js +200 -0
- package/dist/gateway/ws-handler.js.map +1 -0
- package/dist/gateway-entry.js +16 -0
- package/dist/gateway-entry.js.map +1 -0
- package/dist/hooks.js +72 -0
- package/dist/hooks.js.map +1 -0
- package/dist/lanes.js +62 -0
- package/dist/lanes.js.map +1 -0
- package/dist/model.js +30 -0
- package/dist/model.js.map +1 -0
- package/dist/policy.js +22 -0
- package/dist/policy.js.map +1 -0
- package/dist/queue.js +45 -0
- package/dist/queue.js.map +1 -0
- package/dist/retry.js +96 -0
- package/dist/retry.js.map +1 -0
- package/dist/runs.js +83 -0
- package/dist/runs.js.map +1 -0
- package/dist/runtime/compact.js +99 -0
- package/dist/runtime/compact.js.map +1 -0
- package/dist/runtime/lanes.js +66 -0
- package/dist/runtime/lanes.js.map +1 -0
- package/dist/runtime/orchestrate.js +121 -0
- package/dist/runtime/orchestrate.js.map +1 -0
- package/dist/runtime/queue.js +50 -0
- package/dist/runtime/queue.js.map +1 -0
- package/dist/runtime/retry.js +127 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/runtime/runs.js +105 -0
- package/dist/runtime/runs.js.map +1 -0
- package/dist/serve.js +209 -0
- package/dist/serve.js.map +1 -0
- package/dist/session.js +75 -0
- package/dist/session.js.map +1 -0
- package/dist/setup.js +254 -0
- package/dist/setup.js.map +1 -0
- package/dist/skills.js +89 -0
- package/dist/skills.js.map +1 -0
- package/dist/subagent.js +71 -0
- package/dist/subagent.js.map +1 -0
- package/dist/system-prompt.js +157 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/telegram/admin-bot.js +705 -0
- package/dist/telegram/admin-bot.js.map +1 -0
- package/dist/telegram/agent-bot.js +551 -0
- package/dist/telegram/agent-bot.js.map +1 -0
- package/dist/telegram/bot-approval.js +63 -0
- package/dist/telegram/bot-approval.js.map +1 -0
- package/dist/telegram/draft-stream.js +86 -0
- package/dist/telegram/draft-stream.js.map +1 -0
- package/dist/telegram/format.js +106 -0
- package/dist/telegram/format.js.map +1 -0
- package/dist/telegram/helpers.js +87 -0
- package/dist/telegram/helpers.js.map +1 -0
- package/dist/telegram/pairing-notify.js +52 -0
- package/dist/telegram/pairing-notify.js.map +1 -0
- package/dist/telegram/pairing.js +138 -0
- package/dist/telegram/pairing.js.map +1 -0
- package/dist/telegram/resolve.js +33 -0
- package/dist/telegram/resolve.js.map +1 -0
- package/dist/telegram/transcribe.js +77 -0
- package/dist/telegram/transcribe.js.map +1 -0
- package/dist/telegram/types.js +3 -0
- package/dist/telegram/types.js.map +1 -0
- package/dist/telegram/voice-wizard.js +84 -0
- package/dist/telegram/voice-wizard.js.map +1 -0
- package/dist/telegram/wizard.js +89 -0
- package/dist/telegram/wizard.js.map +1 -0
- package/dist/telegram/wizards.js +297 -0
- package/dist/telegram/wizards.js.map +1 -0
- package/dist/telegram-admin.js +800 -0
- package/dist/telegram-admin.js.map +1 -0
- package/dist/telegram.js +118 -0
- package/dist/telegram.js.map +1 -0
- package/dist/tools/cron.js +94 -0
- package/dist/tools/cron.js.map +1 -0
- package/dist/tools/edit.js +29 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/exec.js +38 -0
- package/dist/tools/exec.js.map +1 -0
- package/dist/tools/fetch.js +28 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory.js +164 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/patch.js +284 -0
- package/dist/tools/patch.js.map +1 -0
- package/dist/tools/read.js +26 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/search.js +62 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/subagent.js +48 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/write.js +22 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/tui/commands.js +450 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/components/assistant-message.js +26 -0
- package/dist/tui/components/assistant-message.js.map +1 -0
- package/dist/tui/components/chat-log.js +94 -0
- package/dist/tui/components/chat-log.js.map +1 -0
- package/dist/tui/components/custom-editor.js +40 -0
- package/dist/tui/components/custom-editor.js.map +1 -0
- package/dist/tui/components/hint-bar.js +13 -0
- package/dist/tui/components/hint-bar.js.map +1 -0
- package/dist/tui/components/tool-execution.js +73 -0
- package/dist/tui/components/tool-execution.js.map +1 -0
- package/dist/tui/components/user-message.js +19 -0
- package/dist/tui/components/user-message.js.map +1 -0
- package/dist/tui/components/welcome.js +147 -0
- package/dist/tui/components/welcome.js.map +1 -0
- package/dist/tui/context.js +3 -0
- package/dist/tui/context.js.map +1 -0
- package/dist/tui/theme.js +91 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/tui.js +389 -0
- package/dist/tui/tui.js.map +1 -0
- package/dist/tui/ws-handler.js +154 -0
- package/dist/tui/ws-handler.js.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.js +88 -0
- package/dist/usage.js.map +1 -0
- package/dist/workspace.js +245 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// Path 1: Claude Agent SDK (full agent with tools, thinking, subagents)
|
|
2
|
+
import { query, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
|
|
3
|
+
import { memorySearchTool, memoryGetTool, createScopedMemoryTools } from "../tools/memory.js";
|
|
4
|
+
import { agentMemoryDir } from "../workspace.js";
|
|
5
|
+
import { patchTool } from "../tools/patch.js";
|
|
6
|
+
import { cronTool } from "../tools/cron.js";
|
|
7
|
+
import { runHooks } from "../extensions/hooks.js";
|
|
8
|
+
import { recordUsage } from "../usage.js";
|
|
9
|
+
import { DEFAULT_MAX_TURNS } from "../core/constants.js";
|
|
10
|
+
import { checkApproval, waitForDecision, addToAllowlist } from "../extensions/approvals.js";
|
|
11
|
+
import { forwardApproval } from "../extensions/approval-forward.js";
|
|
12
|
+
import { adaptToolDef } from "./tool-adapter.js";
|
|
13
|
+
/** Get all custom tool definitions for an agent */
|
|
14
|
+
function getToolDefs(agentId) {
|
|
15
|
+
const memRoot = agentMemoryDir(agentId);
|
|
16
|
+
const scopedMemory = agentId
|
|
17
|
+
? createScopedMemoryTools(memRoot)
|
|
18
|
+
: { search: memorySearchTool, get: memoryGetTool };
|
|
19
|
+
return [scopedMemory.search, scopedMemory.get, patchTool, cronTool];
|
|
20
|
+
}
|
|
21
|
+
/** Create MCP server with CamelAGI-specific tools */
|
|
22
|
+
function createCamelAgiMcpServer(agentId) {
|
|
23
|
+
const defs = getToolDefs(agentId);
|
|
24
|
+
return createSdkMcpServer({
|
|
25
|
+
name: "camelagi",
|
|
26
|
+
tools: defs.map(adaptToolDef),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const BUILTIN_TOOLS = [
|
|
30
|
+
"Read", "Write", "Edit", "Bash",
|
|
31
|
+
"Glob", "Grep",
|
|
32
|
+
"WebSearch", "WebFetch",
|
|
33
|
+
"Agent",
|
|
34
|
+
];
|
|
35
|
+
export async function runAgentSdk(apiKey, model, systemPrompt, history, userMessage, opts) {
|
|
36
|
+
// Build effective prompt: if resuming, just use user message.
|
|
37
|
+
// Otherwise, prepend history as structured context in the prompt itself
|
|
38
|
+
// (the SDK manages its own conversation state via session resumption).
|
|
39
|
+
let effectivePrompt = userMessage;
|
|
40
|
+
if (!opts?.resumeSessionId && history.length > 0) {
|
|
41
|
+
const historyText = history
|
|
42
|
+
.map((m) => `[${m.role}]: ${m.content}`)
|
|
43
|
+
.join("\n\n");
|
|
44
|
+
effectivePrompt = `<previous_conversation>\n${historyText}\n</previous_conversation>\n\n${userMessage}`;
|
|
45
|
+
}
|
|
46
|
+
const emit = opts?.onEvent;
|
|
47
|
+
let toolIdCounter = 0;
|
|
48
|
+
const preToolHook = async (input) => {
|
|
49
|
+
const name = (input.tool_name ?? input.name ?? "tool");
|
|
50
|
+
const args = (input.tool_input ?? input.input ?? {});
|
|
51
|
+
const toolId = (input.tool_use_id ?? `tool-${++toolIdCounter}`);
|
|
52
|
+
if (opts?.hooksEnabled) {
|
|
53
|
+
await runHooks("before_tool", {
|
|
54
|
+
sessionId: opts.sessionId,
|
|
55
|
+
toolName: name,
|
|
56
|
+
toolArgs: args,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Approval check
|
|
60
|
+
if (opts?.approvals && opts.approvals.mode !== "off") {
|
|
61
|
+
const request = checkApproval(name, args, opts.approvals.mode, opts.approvals.allowlist);
|
|
62
|
+
if (request) {
|
|
63
|
+
emit?.({ type: "approval_request", id: request.id, toolName: name, preview: request.preview });
|
|
64
|
+
if (!emit) {
|
|
65
|
+
if (opts.approvals.forwardTo) {
|
|
66
|
+
const forwarded = await forwardApproval(request.id, name, request.preview, opts.approvals.forwardTo);
|
|
67
|
+
if (forwarded) {
|
|
68
|
+
const decision = await waitForDecision(request.id, opts.approvals.timeoutSeconds * 1000, opts.approvals.fallback);
|
|
69
|
+
if (decision === "allow-always")
|
|
70
|
+
addToAllowlist(name, args);
|
|
71
|
+
if (decision === "deny")
|
|
72
|
+
return { decision: "block", reason: "User denied this tool call" };
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
if (opts.approvals.fallback === "deny")
|
|
76
|
+
return { decision: "block", reason: "Tool call requires approval but forwarding failed" };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
if (opts.approvals.fallback === "deny")
|
|
81
|
+
return { decision: "block", reason: "Tool call requires approval but no approval channel is available" };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const decision = await waitForDecision(request.id, opts.approvals.timeoutSeconds * 1000, opts.approvals.fallback);
|
|
86
|
+
emit({ type: "approval_resolved", id: request.id, decision });
|
|
87
|
+
if (decision === "allow-always")
|
|
88
|
+
addToAllowlist(name, args);
|
|
89
|
+
else if (decision === "deny")
|
|
90
|
+
return { decision: "block", reason: "User denied this tool call" };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (emit) {
|
|
95
|
+
emit({ type: "tool_call", id: toolId, name, args });
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const argsStr = JSON.stringify(args).slice(0, 120);
|
|
99
|
+
process.stderr.write(`\x1b[36m → ${name}\x1b[0m\x1b[90m(${argsStr})\x1b[0m\n`);
|
|
100
|
+
}
|
|
101
|
+
return {};
|
|
102
|
+
};
|
|
103
|
+
const postToolHook = async (input) => {
|
|
104
|
+
const name = (input.tool_name ?? input.name ?? "tool");
|
|
105
|
+
const toolId = (input.tool_use_id ?? `tool-${toolIdCounter}`);
|
|
106
|
+
const resultText = String(input.tool_result ?? input.result ?? "");
|
|
107
|
+
const preview = resultText.slice(0, 150).replace(/\n/g, "↵");
|
|
108
|
+
if (opts?.hooksEnabled) {
|
|
109
|
+
await runHooks("after_tool", { sessionId: opts.sessionId, toolName: name, toolResult: resultText });
|
|
110
|
+
}
|
|
111
|
+
if (emit) {
|
|
112
|
+
emit({ type: "tool_result", id: toolId, name, preview });
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
process.stderr.write(`\x1b[90m ← ${preview}${resultText.length > 150 ? "…" : ""}\x1b[0m\n`);
|
|
116
|
+
}
|
|
117
|
+
return {};
|
|
118
|
+
};
|
|
119
|
+
const mcpServer = createCamelAgiMcpServer(opts?.agentId);
|
|
120
|
+
const thinking = opts?.thinking && opts.thinking !== "off"
|
|
121
|
+
? { type: "adaptive" }
|
|
122
|
+
: { type: "disabled" };
|
|
123
|
+
const disallowedTools = opts?.toolPolicy?.deny?.length ? opts.toolPolicy.deny : undefined;
|
|
124
|
+
const abortController = opts?.signal ? new AbortController() : undefined;
|
|
125
|
+
if (opts?.signal && abortController) {
|
|
126
|
+
if (opts.signal.aborted)
|
|
127
|
+
abortController.abort();
|
|
128
|
+
else
|
|
129
|
+
opts.signal.addEventListener("abort", () => abortController.abort(), { once: true });
|
|
130
|
+
}
|
|
131
|
+
let result = "";
|
|
132
|
+
let sdkSessionId;
|
|
133
|
+
const q = query({
|
|
134
|
+
prompt: effectivePrompt,
|
|
135
|
+
options: {
|
|
136
|
+
model,
|
|
137
|
+
systemPrompt,
|
|
138
|
+
allowedTools: [...BUILTIN_TOOLS],
|
|
139
|
+
...(disallowedTools && { disallowedTools }),
|
|
140
|
+
mcpServers: { camelagi: mcpServer, ...(opts?.mcpServers ?? {}) },
|
|
141
|
+
maxTurns: opts?.maxTurns ?? DEFAULT_MAX_TURNS,
|
|
142
|
+
permissionMode: "bypassPermissions",
|
|
143
|
+
allowDangerouslySkipPermissions: true,
|
|
144
|
+
cwd: process.cwd(),
|
|
145
|
+
env: { ANTHROPIC_API_KEY: apiKey },
|
|
146
|
+
thinking,
|
|
147
|
+
...(opts?.effort && { effort: opts.effort }),
|
|
148
|
+
...(opts?.maxBudgetUsd && { maxBudgetUsd: opts.maxBudgetUsd }),
|
|
149
|
+
...(opts?.resumeSessionId && { resume: opts.resumeSessionId }),
|
|
150
|
+
...(abortController && { abortController }),
|
|
151
|
+
includePartialMessages: !!emit,
|
|
152
|
+
settingSources: ["project"],
|
|
153
|
+
hooks: {
|
|
154
|
+
PreToolUse: [{ matcher: ".*", hooks: [preToolHook] }],
|
|
155
|
+
PostToolUse: [{ matcher: ".*", hooks: [postToolHook] }],
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
for await (const message of q) {
|
|
160
|
+
if (message.type === "result") {
|
|
161
|
+
const resultMsg = message;
|
|
162
|
+
result = resultMsg.result;
|
|
163
|
+
sdkSessionId = resultMsg.session_id;
|
|
164
|
+
if (resultMsg.usage && emit) {
|
|
165
|
+
emit({ type: "usage", inputTokens: resultMsg.usage.input_tokens ?? 0, outputTokens: resultMsg.usage.output_tokens ?? 0, cacheReadTokens: resultMsg.usage.cache_read_input_tokens, cacheWriteTokens: resultMsg.usage.cache_creation_input_tokens });
|
|
166
|
+
}
|
|
167
|
+
if (resultMsg.usage && opts?.sessionId) {
|
|
168
|
+
recordUsage(opts.sessionId, { inputTokens: resultMsg.usage.input_tokens ?? 0, outputTokens: resultMsg.usage.output_tokens ?? 0, cacheReadTokens: resultMsg.usage.cache_read_input_tokens ?? 0, cacheWriteTokens: resultMsg.usage.cache_creation_input_tokens ?? 0 });
|
|
169
|
+
}
|
|
170
|
+
emit?.({ type: "chunk", text: result });
|
|
171
|
+
}
|
|
172
|
+
else if (message.type === "system" && emit) {
|
|
173
|
+
const sysMsg = message;
|
|
174
|
+
if (sysMsg.subtype === "init" && sysMsg.session_id) {
|
|
175
|
+
sdkSessionId = sysMsg.session_id;
|
|
176
|
+
emit({ type: "init", sessionId: sysMsg.session_id });
|
|
177
|
+
}
|
|
178
|
+
else if (sysMsg.subtype === "task_started") {
|
|
179
|
+
emit({ type: "subagent_start", agentId: sysMsg.agent_id ?? "subagent", taskId: sysMsg.task_id });
|
|
180
|
+
}
|
|
181
|
+
else if (sysMsg.subtype === "task_progress") {
|
|
182
|
+
emit({ type: "subagent_progress", agentId: sysMsg.agent_id ?? "subagent", toolCount: sysMsg.tool_count, duration: sysMsg.duration_ms ? Math.round(sysMsg.duration_ms / 1000) : undefined });
|
|
183
|
+
}
|
|
184
|
+
else if (sysMsg.subtype === "task_notification") {
|
|
185
|
+
emit({ type: "subagent_done", agentId: sysMsg.agent_id ?? "subagent", toolUseId: sysMsg.tool_use_id });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (message.type === "stream_event" && emit) {
|
|
189
|
+
const streamMsg = message;
|
|
190
|
+
const event = streamMsg.event;
|
|
191
|
+
if (event.type === "content_block_start" && event.content_block?.type === "thinking") {
|
|
192
|
+
emit({ type: "thinking", state: "start" });
|
|
193
|
+
}
|
|
194
|
+
else if (event.type === "content_block_delta") {
|
|
195
|
+
if (event.delta?.type === "text_delta" && event.delta.text)
|
|
196
|
+
emit({ type: "stream_text", text: event.delta.text });
|
|
197
|
+
else if (event.delta?.type === "thinking_delta" && event.delta.thinking)
|
|
198
|
+
emit({ type: "thinking_delta", text: event.delta.thinking });
|
|
199
|
+
}
|
|
200
|
+
else if (event.type === "content_block_stop") {
|
|
201
|
+
emit({ type: "thinking", state: "end" });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const userMsg = { role: "user", content: userMessage };
|
|
206
|
+
const aiMsg = { role: "assistant", content: result };
|
|
207
|
+
return { response: result, newMessages: [userMsg, aiMsg], usage: null, sessionId: sdkSessionId };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=agent-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-sdk.js","sourceRoot":"","sources":["../../src/agent/agent-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Generic adapter: converts a ToolDef into Claude Agent SDK or OpenAI tool format
|
|
2
|
+
import { tool } from "@anthropic-ai/claude-agent-sdk";
|
|
3
|
+
/**
|
|
4
|
+
* Adapt an CamelAGI ToolDef to a Claude Agent SDK tool.
|
|
5
|
+
* The schema's `.shape` is passed directly — Zod shapes are compatible
|
|
6
|
+
* with the SDK's parameter definition format.
|
|
7
|
+
*/
|
|
8
|
+
export function adaptToolDef(def) {
|
|
9
|
+
return tool(def.name, def.description, def.schema.shape, async (args) => {
|
|
10
|
+
const result = await def.execute(args);
|
|
11
|
+
return { content: [{ type: "text", text: result }] };
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Adapt an CamelAGI ToolDef to OpenAI's function-calling format.
|
|
16
|
+
* Uses Zod 4's native .toJSONSchema() for reliable conversion.
|
|
17
|
+
*/
|
|
18
|
+
export function adaptToolDefToOpenAI(def) {
|
|
19
|
+
const jsonSchema = def.schema.toJSONSchema();
|
|
20
|
+
// Remove $schema key — OpenAI doesn't want it in parameters
|
|
21
|
+
delete jsonSchema.$schema;
|
|
22
|
+
return {
|
|
23
|
+
type: "function",
|
|
24
|
+
function: {
|
|
25
|
+
name: def.name,
|
|
26
|
+
description: def.description,
|
|
27
|
+
parameters: jsonSchema,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=tool-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-adapter.js","sourceRoot":"","sources":["../../src/agent/tool-adapter.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAatD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,IAAI,CACT,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,MAAM,CAAC,KAAK,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,EAA6B,CAAC;IACxE,4DAA4D;IAC5D,OAAO,UAAU,CAAC,OAAO,CAAC;IAE1B,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,UAAU,EAAE,UAAU;SACvB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA,oDAAoD"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Agent: routes all models through Claude Agent SDK
|
|
2
|
+
// This is a barrel that re-exports types and the main entry point.
|
|
3
|
+
import { runHooks } from "./extensions/hooks.js";
|
|
4
|
+
import { runAgentSdk } from "./agent/agent-sdk.js";
|
|
5
|
+
// Clear CLAUDECODE env var to prevent "nested session" error
|
|
6
|
+
delete process.env.CLAUDECODE;
|
|
7
|
+
export async function runAgent(apiKey, model, systemPrompt, history, userMessage, opts) {
|
|
8
|
+
if (opts?.hooksEnabled) {
|
|
9
|
+
await runHooks("before_prompt", { sessionId: opts.sessionId, message: userMessage });
|
|
10
|
+
}
|
|
11
|
+
const result = await runAgentSdk(apiKey, model, systemPrompt, history, userMessage, opts);
|
|
12
|
+
if (opts?.hooksEnabled) {
|
|
13
|
+
await runHooks("after_response", { sessionId: opts.sessionId, response: result.response });
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMnD,6DAA6D;AAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,KAAa,EACb,YAAoB,EACpB,OAAkB,EAClB,WAAmB,EACnB,IAAgB;IAEhB,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAE1F,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Approval forwarding: send approval requests to Telegram when running headless
|
|
2
|
+
//
|
|
3
|
+
// When a tool call needs approval but there's no interactive channel (HTTP API,
|
|
4
|
+
// cron, boot), forward the request to a configured Telegram chat with inline buttons.
|
|
5
|
+
//
|
|
6
|
+
// Config:
|
|
7
|
+
// approvals:
|
|
8
|
+
// forwardTo: 123456789 # your Telegram user/chat ID
|
|
9
|
+
import { InlineKeyboard } from "grammy";
|
|
10
|
+
// The first active bot is used for forwarding
|
|
11
|
+
let forwardBotRef = null;
|
|
12
|
+
/** Register a bot for forwarding approval requests (called by telegram.ts) */
|
|
13
|
+
export function registerForwardBot(bot) {
|
|
14
|
+
forwardBotRef = bot;
|
|
15
|
+
}
|
|
16
|
+
/** Unregister on shutdown */
|
|
17
|
+
export function unregisterForwardBot() {
|
|
18
|
+
forwardBotRef = null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Send an approval request to a Telegram chat with inline buttons.
|
|
22
|
+
* Returns true if sent successfully, false if no bot available.
|
|
23
|
+
*/
|
|
24
|
+
export async function forwardApproval(approvalId, toolName, preview, forwardTo) {
|
|
25
|
+
if (!forwardBotRef || !forwardTo)
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
const keyboard = new InlineKeyboard()
|
|
29
|
+
.text("✅ Allow", `approve:${approvalId}:allow-once`)
|
|
30
|
+
.text("♾️ Always", `approve:${approvalId}:allow-always`)
|
|
31
|
+
.text("❌ Deny", `approve:${approvalId}:deny`);
|
|
32
|
+
await forwardBotRef.api.sendMessage(forwardTo, `🔒 ${toolName}\n${preview}`, {
|
|
33
|
+
reply_markup: keyboard,
|
|
34
|
+
});
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(` [approval-forward] failed: ${err instanceof Error ? err.message : err}`);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=approval-forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-forward.js","sourceRoot":"","sources":["../src/approval-forward.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,gFAAgF;AAChF,sFAAsF;AACtF,EAAE;AACF,UAAU;AACV,eAAe;AACf,0DAA0D;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,8CAA8C;AAC9C,IAAI,aAAa,GAAe,IAAI,CAAC;AAErC,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACzC,aAAa,GAAG,GAAG,CAAC;AACtB,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,oBAAoB;IAClC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,QAAgB,EAChB,OAAe,EACf,SAAiB;IAEjB,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE;aAClC,IAAI,CAAC,SAAS,EAAE,WAAW,UAAU,aAAa,CAAC;aACnD,IAAI,CAAC,WAAW,EAAE,WAAW,UAAU,eAAe,CAAC;aACvD,IAAI,CAAC,QAAQ,EAAE,WAAW,UAAU,OAAO,CAAC,CAAC;QAEhD,MAAM,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,QAAQ,KAAK,OAAO,EAAE,EAAE;YAC3E,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Approval system: gate dangerous tool calls behind user confirmation
|
|
2
|
+
//
|
|
3
|
+
// Modes:
|
|
4
|
+
// off — bypass all (current default, zero friction)
|
|
5
|
+
// smart — auto-approve reads, ask for writes/exec
|
|
6
|
+
// always — ask for every tool call
|
|
7
|
+
//
|
|
8
|
+
// Flow:
|
|
9
|
+
// PreToolUse hook → checkApproval() → auto or ask
|
|
10
|
+
// If ask: emit approval_request event → waitForDecision() → user responds → submitDecision()
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { loadConfig, saveConfig } from "./core/config.js";
|
|
13
|
+
// Tools that "smart" mode auto-approves (read-only, no side effects)
|
|
14
|
+
const READ_ONLY_TOOLS = new Set([
|
|
15
|
+
"Read", "Glob", "Grep",
|
|
16
|
+
"WebSearch", "WebFetch",
|
|
17
|
+
"memory_search", "memory_get",
|
|
18
|
+
]);
|
|
19
|
+
const pending = new Map();
|
|
20
|
+
// --- Allowlist matching ---
|
|
21
|
+
function matchesAllowlist(toolName, args, allowlist) {
|
|
22
|
+
for (const entry of allowlist) {
|
|
23
|
+
const colonIdx = entry.indexOf(":");
|
|
24
|
+
if (colonIdx === -1) {
|
|
25
|
+
// Bare tool name: "Read", "Glob" — matches all calls to that tool
|
|
26
|
+
if (toolName === entry)
|
|
27
|
+
return true;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const entryTool = entry.slice(0, colonIdx);
|
|
31
|
+
const entryPattern = entry.slice(colonIdx + 1);
|
|
32
|
+
if (entryTool !== toolName)
|
|
33
|
+
continue;
|
|
34
|
+
// For Bash, match against the command string
|
|
35
|
+
if (toolName === "Bash") {
|
|
36
|
+
const cmd = String(args.command ?? "");
|
|
37
|
+
if (globMatch(entryPattern, cmd))
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
// For Write/Edit, match file path
|
|
41
|
+
else if (toolName === "Write" || toolName === "Edit") {
|
|
42
|
+
const filePath = String(args.file_path ?? "");
|
|
43
|
+
if (globMatch(entryPattern, filePath))
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
// For apply_patch, match if the pattern is "*" (blanket allow)
|
|
47
|
+
else if (toolName === "apply_patch") {
|
|
48
|
+
if (entryPattern === "*")
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/** Simple glob matching — supports * as wildcard */
|
|
55
|
+
function globMatch(pattern, text) {
|
|
56
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
57
|
+
return new RegExp("^" + escaped + "$").test(text);
|
|
58
|
+
}
|
|
59
|
+
// --- Preview builder ---
|
|
60
|
+
function buildPreview(toolName, args) {
|
|
61
|
+
if (toolName === "Bash")
|
|
62
|
+
return String(args.command ?? "").slice(0, 200);
|
|
63
|
+
if (toolName === "Write")
|
|
64
|
+
return `write → ${args.file_path ?? "?"}`;
|
|
65
|
+
if (toolName === "Edit")
|
|
66
|
+
return `edit → ${args.file_path ?? "?"}`;
|
|
67
|
+
if (toolName === "Agent")
|
|
68
|
+
return `spawn agent: ${String(args.prompt ?? "").slice(0, 100)}`;
|
|
69
|
+
if (toolName === "apply_patch")
|
|
70
|
+
return `patch (${String(args.patch ?? "").split("\n").length} lines)`;
|
|
71
|
+
return `${toolName}(${JSON.stringify(args).slice(0, 120)})`;
|
|
72
|
+
}
|
|
73
|
+
// --- Public API ---
|
|
74
|
+
/**
|
|
75
|
+
* Check if a tool call needs approval.
|
|
76
|
+
* Returns null if auto-approved, or an ApprovalRequest if the user must decide.
|
|
77
|
+
*/
|
|
78
|
+
export function checkApproval(toolName, args, mode, allowlist) {
|
|
79
|
+
if (mode === "off")
|
|
80
|
+
return null;
|
|
81
|
+
if (matchesAllowlist(toolName, args, allowlist))
|
|
82
|
+
return null;
|
|
83
|
+
if (mode === "smart" && READ_ONLY_TOOLS.has(toolName))
|
|
84
|
+
return null;
|
|
85
|
+
return {
|
|
86
|
+
id: randomUUID(),
|
|
87
|
+
toolName,
|
|
88
|
+
args,
|
|
89
|
+
preview: buildPreview(toolName, args),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Wait for a user's decision on a pending approval.
|
|
94
|
+
* Resolves when submitDecision() is called, or on timeout.
|
|
95
|
+
*/
|
|
96
|
+
export function waitForDecision(id, timeoutMs, fallback) {
|
|
97
|
+
return new Promise((resolve) => {
|
|
98
|
+
const timer = setTimeout(() => {
|
|
99
|
+
pending.delete(id);
|
|
100
|
+
resolve(fallback === "allow" ? "allow-once" : "deny");
|
|
101
|
+
}, timeoutMs);
|
|
102
|
+
pending.set(id, { resolve, timer });
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Submit a user's decision for a pending approval.
|
|
107
|
+
* Returns true if the approval was found and resolved.
|
|
108
|
+
*/
|
|
109
|
+
export function submitDecision(id, decision) {
|
|
110
|
+
const p = pending.get(id);
|
|
111
|
+
if (!p)
|
|
112
|
+
return false;
|
|
113
|
+
clearTimeout(p.timer);
|
|
114
|
+
pending.delete(id);
|
|
115
|
+
p.resolve(decision);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Add a pattern to the persistent allowlist based on tool + args.
|
|
120
|
+
* For Bash: adds "Bash:baseCommand *" (e.g. "Bash:git *")
|
|
121
|
+
* For Write/Edit: adds the exact file path
|
|
122
|
+
* For others: adds the bare tool name
|
|
123
|
+
*/
|
|
124
|
+
export function addToAllowlist(toolName, args) {
|
|
125
|
+
const config = loadConfig();
|
|
126
|
+
const current = [...(config.approvals.allowlist ?? [])];
|
|
127
|
+
let entry;
|
|
128
|
+
if (toolName === "Bash") {
|
|
129
|
+
const cmd = String(args.command ?? "").trim();
|
|
130
|
+
const baseCmd = cmd.split(/[\s|;&]/)[0]; // first word before space/pipe/chain
|
|
131
|
+
entry = baseCmd ? `Bash:${baseCmd} *` : "Bash";
|
|
132
|
+
}
|
|
133
|
+
else if (toolName === "Write" || toolName === "Edit") {
|
|
134
|
+
const filePath = String(args.file_path ?? "");
|
|
135
|
+
entry = filePath ? `${toolName}:${filePath}` : toolName;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
entry = toolName;
|
|
139
|
+
}
|
|
140
|
+
if (!current.includes(entry)) {
|
|
141
|
+
current.push(entry);
|
|
142
|
+
saveConfig({
|
|
143
|
+
approvals: { ...config.approvals, allowlist: current },
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Get count of pending approvals (for status display). */
|
|
148
|
+
export function pendingCount() {
|
|
149
|
+
return pending.size;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"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"}
|
package/dist/boot.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// BOOT.md: run startup script on gateway launch
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { workspacePaths } from "./workspace.js";
|
|
5
|
+
import { runAgent } from "./agent.js";
|
|
6
|
+
import { loadMessages, saveMessage } from "./session.js";
|
|
7
|
+
const BOOT_SESSION = "boot";
|
|
8
|
+
export async function runBoot(config, systemPrompt) {
|
|
9
|
+
const bootFile = path.join(workspacePaths.workspaceDir, "BOOT.md");
|
|
10
|
+
if (!fs.existsSync(bootFile))
|
|
11
|
+
return { status: "skipped" };
|
|
12
|
+
const content = fs.readFileSync(bootFile, "utf-8").trim();
|
|
13
|
+
if (!content)
|
|
14
|
+
return { status: "skipped" };
|
|
15
|
+
try {
|
|
16
|
+
const history = loadMessages(BOOT_SESSION);
|
|
17
|
+
const result = await runAgent(config.apiKey, config.model, systemPrompt, history, content, {
|
|
18
|
+
maxTurns: 10,
|
|
19
|
+
timeoutMs: 60_000,
|
|
20
|
+
sessionId: BOOT_SESSION,
|
|
21
|
+
provider: config.provider,
|
|
22
|
+
baseUrl: config.baseUrl,
|
|
23
|
+
});
|
|
24
|
+
saveMessage(BOOT_SESSION, { role: "user", content }, "boot");
|
|
25
|
+
if (result.response) {
|
|
26
|
+
saveMessage(BOOT_SESSION, { role: "assistant", content: result.response }, "boot");
|
|
27
|
+
}
|
|
28
|
+
return { status: "ran", response: result.response };
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
return { status: "failed", error: err instanceof Error ? err.message : String(err) };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=boot.js.map
|
package/dist/boot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,YAAY,GAAG,MAAM,CAAC;AAQ5B,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAEnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE3D,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAO,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;YAC1F,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,WAAW,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,WAAW,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACvF,CAAC;AACH,CAAC"}
|