background-agents 0.1.2 → 1.0.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/README.md +46 -297
- package/app/assets/icon.png +0 -0
- package/app/assets/tray-icon.png +0 -0
- package/app/assets/tray-icon.svg +4 -0
- package/app/dist/main.js +932 -0
- package/app/dist/preload.cjs +70 -0
- package/bin/background-agents.js +298 -0
- package/lib/ui.js +110 -0
- package/package.json +31 -57
- package/dist/agents/claude/index.d.ts +0 -11
- package/dist/agents/claude/index.d.ts.map +0 -1
- package/dist/agents/claude/index.js +0 -78
- package/dist/agents/claude/index.js.map +0 -1
- package/dist/agents/claude/parser.d.ts +0 -16
- package/dist/agents/claude/parser.d.ts.map +0 -1
- package/dist/agents/claude/parser.js +0 -87
- package/dist/agents/claude/parser.js.map +0 -1
- package/dist/agents/claude/tools.d.ts +0 -7
- package/dist/agents/claude/tools.d.ts.map +0 -1
- package/dist/agents/claude/tools.js +0 -15
- package/dist/agents/claude/tools.js.map +0 -1
- package/dist/agents/codex/index.d.ts +0 -11
- package/dist/agents/codex/index.d.ts.map +0 -1
- package/dist/agents/codex/index.js +0 -60
- package/dist/agents/codex/index.js.map +0 -1
- package/dist/agents/codex/parser.d.ts +0 -12
- package/dist/agents/codex/parser.d.ts.map +0 -1
- package/dist/agents/codex/parser.js +0 -108
- package/dist/agents/codex/parser.js.map +0 -1
- package/dist/agents/codex/tools.d.ts +0 -11
- package/dist/agents/codex/tools.d.ts.map +0 -1
- package/dist/agents/codex/tools.js +0 -40
- package/dist/agents/codex/tools.js.map +0 -1
- package/dist/agents/eliza/bundle-content.d.ts +0 -6
- package/dist/agents/eliza/bundle-content.d.ts.map +0 -1
- package/dist/agents/eliza/bundle-content.js +0 -7
- package/dist/agents/eliza/bundle-content.js.map +0 -1
- package/dist/agents/eliza/cli.bundle.js +0 -579
- package/dist/agents/eliza/cli.d.ts +0 -10
- package/dist/agents/eliza/cli.d.ts.map +0 -1
- package/dist/agents/eliza/cli.js +0 -342
- package/dist/agents/eliza/cli.js.map +0 -1
- package/dist/agents/eliza/index.d.ts +0 -22
- package/dist/agents/eliza/index.d.ts.map +0 -1
- package/dist/agents/eliza/index.js +0 -54
- package/dist/agents/eliza/index.js.map +0 -1
- package/dist/agents/eliza/parser.d.ts +0 -16
- package/dist/agents/eliza/parser.d.ts.map +0 -1
- package/dist/agents/eliza/parser.js +0 -67
- package/dist/agents/eliza/parser.js.map +0 -1
- package/dist/agents/eliza/patterns.d.ts +0 -41
- package/dist/agents/eliza/patterns.d.ts.map +0 -1
- package/dist/agents/eliza/patterns.js +0 -259
- package/dist/agents/eliza/patterns.js.map +0 -1
- package/dist/agents/eliza/tools.d.ts +0 -7
- package/dist/agents/eliza/tools.d.ts.map +0 -1
- package/dist/agents/eliza/tools.js +0 -14
- package/dist/agents/eliza/tools.js.map +0 -1
- package/dist/agents/gemini/index.d.ts +0 -11
- package/dist/agents/gemini/index.d.ts.map +0 -1
- package/dist/agents/gemini/index.js +0 -46
- package/dist/agents/gemini/index.js.map +0 -1
- package/dist/agents/gemini/parser.d.ts +0 -31
- package/dist/agents/gemini/parser.d.ts.map +0 -1
- package/dist/agents/gemini/parser.js +0 -106
- package/dist/agents/gemini/parser.js.map +0 -1
- package/dist/agents/gemini/tools.d.ts +0 -7
- package/dist/agents/gemini/tools.d.ts.map +0 -1
- package/dist/agents/gemini/tools.js +0 -23
- package/dist/agents/gemini/tools.js.map +0 -1
- package/dist/agents/goose/index.d.ts +0 -11
- package/dist/agents/goose/index.d.ts.map +0 -1
- package/dist/agents/goose/index.js +0 -73
- package/dist/agents/goose/index.js.map +0 -1
- package/dist/agents/goose/parser.d.ts +0 -24
- package/dist/agents/goose/parser.d.ts.map +0 -1
- package/dist/agents/goose/parser.js +0 -86
- package/dist/agents/goose/parser.js.map +0 -1
- package/dist/agents/goose/tools.d.ts +0 -10
- package/dist/agents/goose/tools.d.ts.map +0 -1
- package/dist/agents/goose/tools.js +0 -30
- package/dist/agents/goose/tools.js.map +0 -1
- package/dist/agents/index.d.ts +0 -27
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js +0 -46
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/opencode/index.d.ts +0 -12
- package/dist/agents/opencode/index.d.ts.map +0 -1
- package/dist/agents/opencode/index.js +0 -53
- package/dist/agents/opencode/index.js.map +0 -1
- package/dist/agents/opencode/parser.d.ts +0 -15
- package/dist/agents/opencode/parser.d.ts.map +0 -1
- package/dist/agents/opencode/parser.js +0 -71
- package/dist/agents/opencode/parser.js.map +0 -1
- package/dist/agents/opencode/tools.d.ts +0 -7
- package/dist/agents/opencode/tools.d.ts.map +0 -1
- package/dist/agents/opencode/tools.js +0 -10
- package/dist/agents/opencode/tools.js.map +0 -1
- package/dist/agents/openhands/index.d.ts +0 -17
- package/dist/agents/openhands/index.d.ts.map +0 -1
- package/dist/agents/openhands/index.js +0 -67
- package/dist/agents/openhands/index.js.map +0 -1
- package/dist/agents/openhands/parser.d.ts +0 -16
- package/dist/agents/openhands/parser.d.ts.map +0 -1
- package/dist/agents/openhands/parser.js +0 -93
- package/dist/agents/openhands/parser.js.map +0 -1
- package/dist/agents/openhands/tools.d.ts +0 -7
- package/dist/agents/openhands/tools.d.ts.map +0 -1
- package/dist/agents/openhands/tools.js +0 -24
- package/dist/agents/openhands/tools.js.map +0 -1
- package/dist/agents/pi/index.d.ts +0 -14
- package/dist/agents/pi/index.d.ts.map +0 -1
- package/dist/agents/pi/index.js +0 -54
- package/dist/agents/pi/index.js.map +0 -1
- package/dist/agents/pi/parser.d.ts +0 -21
- package/dist/agents/pi/parser.d.ts.map +0 -1
- package/dist/agents/pi/parser.js +0 -91
- package/dist/agents/pi/parser.js.map +0 -1
- package/dist/agents/pi/tools.d.ts +0 -8
- package/dist/agents/pi/tools.d.ts.map +0 -1
- package/dist/agents/pi/tools.js +0 -16
- package/dist/agents/pi/tools.js.map +0 -1
- package/dist/agents/picocode/index.d.ts +0 -18
- package/dist/agents/picocode/index.d.ts.map +0 -1
- package/dist/agents/picocode/index.js +0 -68
- package/dist/agents/picocode/index.js.map +0 -1
- package/dist/agents/picocode/parser.d.ts +0 -19
- package/dist/agents/picocode/parser.d.ts.map +0 -1
- package/dist/agents/picocode/parser.js +0 -104
- package/dist/agents/picocode/parser.js.map +0 -1
- package/dist/agents/picocode/tools.d.ts +0 -9
- package/dist/agents/picocode/tools.d.ts.map +0 -1
- package/dist/agents/picocode/tools.js +0 -27
- package/dist/agents/picocode/tools.js.map +0 -1
- package/dist/background/index.d.ts +0 -6
- package/dist/background/index.d.ts.map +0 -1
- package/dist/background/index.js +0 -5
- package/dist/background/index.js.map +0 -1
- package/dist/background/session.d.ts +0 -47
- package/dist/background/session.d.ts.map +0 -1
- package/dist/background/session.js +0 -481
- package/dist/background/session.js.map +0 -1
- package/dist/background/types.d.ts +0 -55
- package/dist/background/types.d.ts.map +0 -1
- package/dist/background/types.js +0 -5
- package/dist/background/types.js.map +0 -1
- package/dist/core/agent.d.ts +0 -95
- package/dist/core/agent.d.ts.map +0 -1
- package/dist/core/agent.js +0 -8
- package/dist/core/agent.js.map +0 -1
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -6
- package/dist/core/index.js.map +0 -1
- package/dist/core/registry.d.ts +0 -48
- package/dist/core/registry.d.ts.map +0 -1
- package/dist/core/registry.js +0 -68
- package/dist/core/registry.js.map +0 -1
- package/dist/core/tools.d.ts +0 -31
- package/dist/core/tools.d.ts.map +0 -1
- package/dist/core/tools.js +0 -82
- package/dist/core/tools.js.map +0 -1
- package/dist/debug.d.ts +0 -7
- package/dist/debug.d.ts.map +0 -1
- package/dist/debug.js +0 -19
- package/dist/debug.js.map +0 -1
- package/dist/factory.d.ts +0 -28
- package/dist/factory.d.ts.map +0 -1
- package/dist/factory.js +0 -44
- package/dist/factory.js.map +0 -1
- package/dist/index.d.ts +0 -48
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -62
- package/dist/index.js.map +0 -1
- package/dist/providers/base.d.ts +0 -187
- package/dist/providers/base.d.ts.map +0 -1
- package/dist/providers/base.js +0 -619
- package/dist/providers/base.js.map +0 -1
- package/dist/providers/claude.d.ts +0 -14
- package/dist/providers/claude.d.ts.map +0 -1
- package/dist/providers/claude.js +0 -122
- package/dist/providers/claude.js.map +0 -1
- package/dist/providers/codex.d.ts +0 -14
- package/dist/providers/codex.d.ts.map +0 -1
- package/dist/providers/codex.js +0 -160
- package/dist/providers/codex.js.map +0 -1
- package/dist/providers/gemini.d.ts +0 -16
- package/dist/providers/gemini.d.ts.map +0 -1
- package/dist/providers/gemini.js +0 -101
- package/dist/providers/gemini.js.map +0 -1
- package/dist/providers/index.d.ts +0 -6
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -6
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/opencode.d.ts +0 -14
- package/dist/providers/opencode.d.ts.map +0 -1
- package/dist/providers/opencode.js +0 -100
- package/dist/providers/opencode.js.map +0 -1
- package/dist/sandbox/daytona.d.ts +0 -8
- package/dist/sandbox/daytona.d.ts.map +0 -1
- package/dist/sandbox/daytona.js +0 -181
- package/dist/sandbox/daytona.js.map +0 -1
- package/dist/sandbox/index.d.ts +0 -14
- package/dist/sandbox/index.d.ts.map +0 -1
- package/dist/sandbox/index.js +0 -15
- package/dist/sandbox/index.js.map +0 -1
- package/dist/session.d.ts +0 -75
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -117
- package/dist/session.js.map +0 -1
- package/dist/types/events.d.ts +0 -114
- package/dist/types/events.d.ts.map +0 -1
- package/dist/types/events.js +0 -50
- package/dist/types/events.js.map +0 -1
- package/dist/types/index.d.ts +0 -3
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/types/provider.d.ts +0 -67
- package/dist/types/provider.d.ts.map +0 -1
- package/dist/types/provider.js +0 -5
- package/dist/types/provider.js.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -3
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/install.d.ts +0 -37
- package/dist/utils/install.d.ts.map +0 -1
- package/dist/utils/install.js +0 -122
- package/dist/utils/install.js.map +0 -1
- package/dist/utils/json.d.ts +0 -8
- package/dist/utils/json.d.ts.map +0 -1
- package/dist/utils/json.js +0 -15
- package/dist/utils/json.js.map +0 -1
- package/src/index.ts +0 -156
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/preload.ts
|
|
4
|
+
var import_electron = require("electron");
|
|
5
|
+
import_electron.contextBridge.exposeInMainWorld("electron", {
|
|
6
|
+
// Platform info
|
|
7
|
+
platform: process.platform,
|
|
8
|
+
// Notifications
|
|
9
|
+
showNotification: (options) => {
|
|
10
|
+
import_electron.ipcRenderer.send("show-notification", options);
|
|
11
|
+
},
|
|
12
|
+
// Badge count
|
|
13
|
+
updateBadge: (count) => {
|
|
14
|
+
import_electron.ipcRenderer.send("update-badge", count);
|
|
15
|
+
},
|
|
16
|
+
// Window control
|
|
17
|
+
toggleWindow: () => {
|
|
18
|
+
import_electron.ipcRenderer.send("toggle-window");
|
|
19
|
+
},
|
|
20
|
+
// Auth token (secure storage)
|
|
21
|
+
getAuthToken: () => import_electron.ipcRenderer.invoke("get-auth-token"),
|
|
22
|
+
setAuthToken: (token) => import_electron.ipcRenderer.invoke("set-auth-token", token),
|
|
23
|
+
// External links
|
|
24
|
+
openExternal: (url) => {
|
|
25
|
+
import_electron.ipcRenderer.send("open-external", url);
|
|
26
|
+
},
|
|
27
|
+
// Local repo sync (Backgrounder folder)
|
|
28
|
+
getGitSyncSettings: () => import_electron.ipcRenderer.invoke("git-sync:get-settings"),
|
|
29
|
+
setGitSyncSettings: (settings) => import_electron.ipcRenderer.invoke("git-sync:set-settings", settings),
|
|
30
|
+
pickSyncDirectory: () => import_electron.ipcRenderer.invoke("git-sync:pick-directory"),
|
|
31
|
+
getRepoSyncState: (repo) => import_electron.ipcRenderer.invoke("git-sync:get-repo-state", repo),
|
|
32
|
+
openRepoFolder: (data) => import_electron.ipcRenderer.invoke("git-sync:open-repo-folder", data),
|
|
33
|
+
setActiveChat: (data) => import_electron.ipcRenderer.invoke("git-sync:set-active-chat", data),
|
|
34
|
+
syncBranch: (data) => import_electron.ipcRenderer.invoke("git-sync:sync-branch", data),
|
|
35
|
+
// License auto-detection
|
|
36
|
+
getClaudeLicenseAutoDetect: () => import_electron.ipcRenderer.invoke("get-claude-license-auto-detect"),
|
|
37
|
+
getLicenseDetectSettings: () => import_electron.ipcRenderer.invoke("get-license-detect-settings"),
|
|
38
|
+
setLicenseDetectSettings: (settings) => import_electron.ipcRenderer.invoke("set-license-detect-settings", settings),
|
|
39
|
+
// Event listeners
|
|
40
|
+
onDeepLink: (callback) => {
|
|
41
|
+
const handler = (_event, data) => callback(data);
|
|
42
|
+
import_electron.ipcRenderer.on("deep-link", handler);
|
|
43
|
+
return () => import_electron.ipcRenderer.removeListener("deep-link", handler);
|
|
44
|
+
},
|
|
45
|
+
onNavigateToChat: (callback) => {
|
|
46
|
+
const handler = (_event, chatId) => callback(chatId);
|
|
47
|
+
import_electron.ipcRenderer.on("navigate-to-chat", handler);
|
|
48
|
+
return () => import_electron.ipcRenderer.removeListener("navigate-to-chat", handler);
|
|
49
|
+
},
|
|
50
|
+
onGitPushed: (callback) => {
|
|
51
|
+
const handler = (_event, data) => callback(data);
|
|
52
|
+
import_electron.ipcRenderer.on("git-pushed", handler);
|
|
53
|
+
return () => import_electron.ipcRenderer.removeListener("git-pushed", handler);
|
|
54
|
+
},
|
|
55
|
+
onShortcut: (callback) => {
|
|
56
|
+
const handler = (_event, action) => callback(action);
|
|
57
|
+
import_electron.ipcRenderer.on("shortcut", handler);
|
|
58
|
+
return () => import_electron.ipcRenderer.removeListener("shortcut", handler);
|
|
59
|
+
},
|
|
60
|
+
onSyncStatus: (callback) => {
|
|
61
|
+
const handler = (_event, data) => callback(data);
|
|
62
|
+
import_electron.ipcRenderer.on("sync-status", handler);
|
|
63
|
+
return () => import_electron.ipcRenderer.removeListener("sync-status", handler);
|
|
64
|
+
},
|
|
65
|
+
onSyncError: (callback) => {
|
|
66
|
+
const handler = (_event, data) => callback(data);
|
|
67
|
+
import_electron.ipcRenderer.on("sync-error", handler);
|
|
68
|
+
return () => import_electron.ipcRenderer.removeListener("sync-error", handler);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
// Background Agents desktop launcher.
|
|
5
|
+
//
|
|
6
|
+
// `npx background-agents` resolves the latest published version of this package,
|
|
7
|
+
// then this script spawns the bundled Electron app (packages/launcher/app),
|
|
8
|
+
// pointed at the production backend by default. The heavy Electron runtime is a
|
|
9
|
+
// normal npm dependency, so npm/npx downloads it (with its own progress bar) on
|
|
10
|
+
// first run and caches it for subsequent launches.
|
|
11
|
+
|
|
12
|
+
const path = require("path");
|
|
13
|
+
const fs = require("fs");
|
|
14
|
+
const https = require("https");
|
|
15
|
+
const { spawn } = require("child_process");
|
|
16
|
+
|
|
17
|
+
const { colors, symbols, Spinner, line, showCursor } = require("../lib/ui");
|
|
18
|
+
const pkg = require("../package.json");
|
|
19
|
+
|
|
20
|
+
const PROD_URL = "https://backgrounder.dev";
|
|
21
|
+
const DEV_URL = "http://localhost:4000";
|
|
22
|
+
const APP_ENTRY = path.join(__dirname, "..", "app", "dist", "main.js");
|
|
23
|
+
const READY_MARKER = "background-agents:ready";
|
|
24
|
+
|
|
25
|
+
function parseArgs(argv) {
|
|
26
|
+
const opts = {
|
|
27
|
+
url: null,
|
|
28
|
+
dev: false,
|
|
29
|
+
verbose: false,
|
|
30
|
+
help: false,
|
|
31
|
+
version: false,
|
|
32
|
+
};
|
|
33
|
+
for (let i = 0; i < argv.length; i++) {
|
|
34
|
+
const arg = argv[i];
|
|
35
|
+
if (arg === "-h" || arg === "--help") opts.help = true;
|
|
36
|
+
else if (arg === "-v" || arg === "--version") opts.version = true;
|
|
37
|
+
else if (arg === "--dev") opts.dev = true;
|
|
38
|
+
else if (arg === "--verbose") opts.verbose = true;
|
|
39
|
+
else if (arg === "--url") opts.url = argv[++i];
|
|
40
|
+
else if (arg.startsWith("--url=")) opts.url = arg.slice("--url=".length);
|
|
41
|
+
}
|
|
42
|
+
return opts;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function printBanner() {
|
|
46
|
+
line();
|
|
47
|
+
line(
|
|
48
|
+
` ${colors.bold(colors.magenta("Background Agents"))} ${colors.dim(
|
|
49
|
+
"desktop launcher v" + pkg.version
|
|
50
|
+
)}`
|
|
51
|
+
);
|
|
52
|
+
line(` ${colors.dim("https://backgrounder.dev")}`);
|
|
53
|
+
line();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function printHelp() {
|
|
57
|
+
printBanner();
|
|
58
|
+
line(` ${colors.bold("Usage")}`);
|
|
59
|
+
line(` npx ${pkg.name} [options]`);
|
|
60
|
+
line();
|
|
61
|
+
line(` ${colors.bold("Options")}`);
|
|
62
|
+
line(` --url <url> Backend URL to load (default: ${PROD_URL})`);
|
|
63
|
+
line(` --dev Use the local dev server (${DEV_URL})`);
|
|
64
|
+
line(` --verbose Stream the desktop app's logs to this terminal`);
|
|
65
|
+
line(` -v, --version Print the launcher version`);
|
|
66
|
+
line(` -h, --help Show this help`);
|
|
67
|
+
line();
|
|
68
|
+
line(` ${colors.bold("Environment")}`);
|
|
69
|
+
line(` BACKGROUND_AGENTS_URL Same as --url (the --url flag wins)`);
|
|
70
|
+
line();
|
|
71
|
+
line(
|
|
72
|
+
` ${colors.dim(
|
|
73
|
+
"Tip: run `npx " + pkg.name + "@latest` to always get the newest version."
|
|
74
|
+
)}`
|
|
75
|
+
);
|
|
76
|
+
line();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The `electron` package returns the absolute path to its binary when required
|
|
80
|
+
// from a normal Node process (i.e. not from inside Electron itself).
|
|
81
|
+
function resolveElectron() {
|
|
82
|
+
let electronPath;
|
|
83
|
+
try {
|
|
84
|
+
electronPath = require("electron");
|
|
85
|
+
} catch (_err) {
|
|
86
|
+
return {
|
|
87
|
+
error:
|
|
88
|
+
"Electron runtime is not installed. Reinstall with: npx " +
|
|
89
|
+
pkg.name +
|
|
90
|
+
"@latest",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (typeof electronPath !== "string" || !fs.existsSync(electronPath)) {
|
|
94
|
+
return {
|
|
95
|
+
error:
|
|
96
|
+
"The Electron binary is missing or its download was skipped.\n" +
|
|
97
|
+
" Reinstall without ELECTRON_SKIP_BINARY_DOWNLOAD set, e.g.: npx background-agents@latest",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { electronPath };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Non-blocking check of the npm registry for a newer launcher version.
|
|
104
|
+
function checkLatestVersion(timeoutMs = 1500) {
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
const req = https.get(
|
|
107
|
+
`https://registry.npmjs.org/${encodeURIComponent(pkg.name)}/latest`,
|
|
108
|
+
{ headers: { accept: "application/json" }, timeout: timeoutMs },
|
|
109
|
+
(res) => {
|
|
110
|
+
if (res.statusCode !== 200) {
|
|
111
|
+
res.resume();
|
|
112
|
+
resolve(null);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let data = "";
|
|
116
|
+
res.setEncoding("utf8");
|
|
117
|
+
res.on("data", (chunk) => (data += chunk));
|
|
118
|
+
res.on("end", () => {
|
|
119
|
+
try {
|
|
120
|
+
resolve(JSON.parse(data).version || null);
|
|
121
|
+
} catch (_err) {
|
|
122
|
+
resolve(null);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
req.on("error", () => resolve(null));
|
|
128
|
+
req.on("timeout", () => {
|
|
129
|
+
req.destroy();
|
|
130
|
+
resolve(null);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function semverGt(a, b) {
|
|
136
|
+
const pa = String(a).split(".").map((n) => parseInt(n, 10) || 0);
|
|
137
|
+
const pb = String(b).split(".").map((n) => parseInt(n, 10) || 0);
|
|
138
|
+
for (let i = 0; i < 3; i++) {
|
|
139
|
+
if (pa[i] > pb[i]) return true;
|
|
140
|
+
if (pa[i] < pb[i]) return false;
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function main() {
|
|
146
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
147
|
+
|
|
148
|
+
if (opts.help) {
|
|
149
|
+
printHelp();
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (opts.version) {
|
|
153
|
+
line(pkg.version);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
printBanner();
|
|
158
|
+
|
|
159
|
+
if (!fs.existsSync(APP_ENTRY)) {
|
|
160
|
+
line(
|
|
161
|
+
` ${symbols.error} ${colors.red(
|
|
162
|
+
"App bundle is missing — this package was built incorrectly."
|
|
163
|
+
)}`
|
|
164
|
+
);
|
|
165
|
+
line(` ${colors.dim("Expected: " + APP_ENTRY)}`);
|
|
166
|
+
process.exitCode = 1;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const { electronPath, error } = resolveElectron();
|
|
171
|
+
if (error) {
|
|
172
|
+
line(` ${symbols.error} ${colors.red(error)}`);
|
|
173
|
+
process.exitCode = 1;
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const backendUrl =
|
|
178
|
+
opts.url ||
|
|
179
|
+
(opts.dev ? DEV_URL : process.env.BACKGROUND_AGENTS_URL || PROD_URL);
|
|
180
|
+
|
|
181
|
+
const latestPromise = checkLatestVersion();
|
|
182
|
+
|
|
183
|
+
const spinner = new Spinner();
|
|
184
|
+
spinner.start(`Launching Background Agents ${colors.dim("→ " + backendUrl)}`);
|
|
185
|
+
|
|
186
|
+
const env = Object.assign({}, process.env, {
|
|
187
|
+
BACKGROUND_AGENTS_URL: backendUrl,
|
|
188
|
+
// Avoid Electron attaching to / spawning a console window on Windows.
|
|
189
|
+
ELECTRON_NO_ATTACH_CONSOLE: "1",
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
const child = spawn(electronPath, [APP_ENTRY], {
|
|
193
|
+
env,
|
|
194
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
195
|
+
windowsHide: false,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
let ready = false;
|
|
199
|
+
let exited = false;
|
|
200
|
+
|
|
201
|
+
function announceRunning() {
|
|
202
|
+
if (ready) return;
|
|
203
|
+
ready = true;
|
|
204
|
+
clearTimeout(readyFallback);
|
|
205
|
+
spinner.succeed(
|
|
206
|
+
`Background Agents is running ${colors.dim("→ " + backendUrl)}`
|
|
207
|
+
);
|
|
208
|
+
line(
|
|
209
|
+
` ${colors.dim("Close the app window (or press Ctrl+C here) to quit.")}`
|
|
210
|
+
);
|
|
211
|
+
latestPromise.then((latest) => {
|
|
212
|
+
if (!exited && latest && semverGt(latest, pkg.version)) {
|
|
213
|
+
line();
|
|
214
|
+
line(
|
|
215
|
+
` ${symbols.info} ${colors.yellow(
|
|
216
|
+
"A newer version is available"
|
|
217
|
+
)} ${colors.dim("(" + pkg.version + " → " + latest + ")")}`
|
|
218
|
+
);
|
|
219
|
+
line(
|
|
220
|
+
` ${colors.dim("Update with: ")}${colors.cyan(
|
|
221
|
+
"npx " + pkg.name + "@latest"
|
|
222
|
+
)}`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function handleOutput(buffer, stream) {
|
|
229
|
+
const text = buffer.toString();
|
|
230
|
+
if (text.includes(READY_MARKER)) announceRunning();
|
|
231
|
+
if (opts.verbose) {
|
|
232
|
+
const cleaned = text.split(READY_MARKER).join("").replace(/\n{2,}/g, "\n");
|
|
233
|
+
if (cleaned.trim()) stream.write(colors.dim(cleaned));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
child.stdout.on("data", (b) => handleOutput(b, process.stdout));
|
|
238
|
+
child.stderr.on("data", (b) => handleOutput(b, process.stderr));
|
|
239
|
+
|
|
240
|
+
// Fallback: if the app never prints the ready marker (older build, or output
|
|
241
|
+
// buffered), assume it's up after a short grace period so the UI doesn't hang.
|
|
242
|
+
const readyFallback = setTimeout(announceRunning, 8000);
|
|
243
|
+
if (readyFallback.unref) readyFallback.unref();
|
|
244
|
+
|
|
245
|
+
let shuttingDown = false;
|
|
246
|
+
function shutdown(signal) {
|
|
247
|
+
if (shuttingDown) return;
|
|
248
|
+
shuttingDown = true;
|
|
249
|
+
clearTimeout(readyFallback);
|
|
250
|
+
try {
|
|
251
|
+
child.kill(signal || "SIGTERM");
|
|
252
|
+
} catch (_err) {
|
|
253
|
+
/* ignore */
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
258
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
259
|
+
|
|
260
|
+
child.on("error", (err) => {
|
|
261
|
+
exited = true;
|
|
262
|
+
clearTimeout(readyFallback);
|
|
263
|
+
if (!ready) spinner.fail("Failed to launch Background Agents");
|
|
264
|
+
showCursor();
|
|
265
|
+
line(` ${symbols.error} ${colors.red(err.message)}`);
|
|
266
|
+
process.exitCode = 1;
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
child.on("exit", (code, signal) => {
|
|
270
|
+
exited = true;
|
|
271
|
+
clearTimeout(readyFallback);
|
|
272
|
+
showCursor();
|
|
273
|
+
if (!ready) {
|
|
274
|
+
spinner.fail("Background Agents exited before it finished starting");
|
|
275
|
+
if (code) {
|
|
276
|
+
line(
|
|
277
|
+
` ${colors.dim(
|
|
278
|
+
"The app exited with code " +
|
|
279
|
+
code +
|
|
280
|
+
". Re-run with --verbose to see its logs."
|
|
281
|
+
)}`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
line(` ${symbols.arrow} ${colors.dim("Background Agents closed.")}`);
|
|
286
|
+
}
|
|
287
|
+
process.exitCode = signal ? 0 : code == null ? 0 : code;
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
try {
|
|
292
|
+
main();
|
|
293
|
+
} catch (err) {
|
|
294
|
+
showCursor();
|
|
295
|
+
// eslint-disable-next-line no-console
|
|
296
|
+
console.error(err);
|
|
297
|
+
process.exitCode = 1;
|
|
298
|
+
}
|
package/lib/ui.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Tiny dependency-free terminal UI: colors + a spinner. Keeping this free of
|
|
4
|
+
// npm deps means `npx background-agents` installs fast (only Electron is heavy).
|
|
5
|
+
|
|
6
|
+
const useColor =
|
|
7
|
+
process.env.NO_COLOR == null &&
|
|
8
|
+
process.env.TERM !== "dumb" &&
|
|
9
|
+
(Boolean(process.stdout.isTTY) || process.env.FORCE_COLOR != null);
|
|
10
|
+
|
|
11
|
+
function wrap(open, close) {
|
|
12
|
+
return (s) => (useColor ? `[${open}m${s}[${close}m` : String(s));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const colors = {
|
|
16
|
+
bold: wrap(1, 22),
|
|
17
|
+
dim: wrap(2, 22),
|
|
18
|
+
red: wrap(31, 39),
|
|
19
|
+
green: wrap(32, 39),
|
|
20
|
+
yellow: wrap(33, 39),
|
|
21
|
+
blue: wrap(34, 39),
|
|
22
|
+
magenta: wrap(35, 39),
|
|
23
|
+
cyan: wrap(36, 39),
|
|
24
|
+
gray: wrap(90, 39),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const symbols = {
|
|
28
|
+
success: colors.green("✔"),
|
|
29
|
+
error: colors.red("✖"),
|
|
30
|
+
warn: colors.yellow("⚠"),
|
|
31
|
+
info: colors.cyan("ℹ"),
|
|
32
|
+
arrow: colors.gray("›"),
|
|
33
|
+
bullet: colors.gray("•"),
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const isTTY = Boolean(process.stdout.isTTY);
|
|
37
|
+
|
|
38
|
+
const HIDE_CURSOR = "[?25l";
|
|
39
|
+
const SHOW_CURSOR = "[?25h";
|
|
40
|
+
const CLEAR_LINE = "\r[2K";
|
|
41
|
+
|
|
42
|
+
function showCursor() {
|
|
43
|
+
if (isTTY) process.stdout.write(SHOW_CURSOR);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
class Spinner {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
49
|
+
this.index = 0;
|
|
50
|
+
this.timer = null;
|
|
51
|
+
this.text = "";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
start(text) {
|
|
55
|
+
this.text = text;
|
|
56
|
+
if (!isTTY) {
|
|
57
|
+
process.stdout.write(` ${text}\n`);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
if (this.timer) return this;
|
|
61
|
+
process.stdout.write(HIDE_CURSOR);
|
|
62
|
+
this.render();
|
|
63
|
+
this.timer = setInterval(() => this.render(), 80);
|
|
64
|
+
if (this.timer.unref) this.timer.unref();
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
render() {
|
|
69
|
+
const frame = colors.cyan(this.frames[this.index]);
|
|
70
|
+
this.index = (this.index + 1) % this.frames.length;
|
|
71
|
+
process.stdout.write(`${CLEAR_LINE} ${frame} ${this.text}`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
update(text) {
|
|
75
|
+
this.text = text;
|
|
76
|
+
if (!isTTY) process.stdout.write(` ${text}\n`);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
stop(symbol, text) {
|
|
81
|
+
if (this.timer) {
|
|
82
|
+
clearInterval(this.timer);
|
|
83
|
+
this.timer = null;
|
|
84
|
+
}
|
|
85
|
+
const message = text != null ? text : this.text;
|
|
86
|
+
const line = ` ${symbol} ${message}`;
|
|
87
|
+
if (isTTY) process.stdout.write(`${CLEAR_LINE}${line}\n${SHOW_CURSOR}`);
|
|
88
|
+
else process.stdout.write(`${line}\n`);
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
succeed(text) {
|
|
93
|
+
return this.stop(symbols.success, text);
|
|
94
|
+
}
|
|
95
|
+
fail(text) {
|
|
96
|
+
return this.stop(symbols.error, text);
|
|
97
|
+
}
|
|
98
|
+
warn(text) {
|
|
99
|
+
return this.stop(symbols.warn, text);
|
|
100
|
+
}
|
|
101
|
+
info(text) {
|
|
102
|
+
return this.stop(symbols.info, text);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function line(text = "") {
|
|
107
|
+
process.stdout.write(`${text}\n`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = { colors, symbols, Spinner, line, isTTY, showCursor };
|
package/package.json
CHANGED
|
@@ -1,68 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "background-agents",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Launch the Background Agents desktop app with one command — npx background-agents. Always runs the latest published version.",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"background-agents": "bin/background-agents.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"lib",
|
|
12
|
+
"app",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
8
18
|
"scripts": {
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
"lint": "eslint src --ext .ts",
|
|
17
|
-
"clean": "rm -rf dist",
|
|
18
|
-
"prepublishOnly": "npm run build",
|
|
19
|
-
"generate:jsonl-refs": "npx tsx scripts/generate-jsonl-references.ts"
|
|
19
|
+
"bundle": "node scripts/bundle-app.mjs",
|
|
20
|
+
"prepack": "node scripts/bundle-app.mjs",
|
|
21
|
+
"start": "node bin/background-agents.js",
|
|
22
|
+
"typecheck": "node --check bin/background-agents.js && node --check lib/ui.js"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"electron": "^33.2.1"
|
|
20
26
|
},
|
|
21
27
|
"keywords": [
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"gemini",
|
|
28
|
-
"pi",
|
|
29
|
-
"sdk"
|
|
28
|
+
"background-agents",
|
|
29
|
+
"electron",
|
|
30
|
+
"launcher",
|
|
31
|
+
"npx",
|
|
32
|
+
"desktop"
|
|
30
33
|
],
|
|
31
|
-
"author": "",
|
|
32
34
|
"license": "MIT",
|
|
35
|
+
"author": "James Murdza",
|
|
36
|
+
"homepage": "https://backgrounder.dev",
|
|
33
37
|
"repository": {
|
|
34
38
|
"type": "git",
|
|
35
|
-
"url": "
|
|
36
|
-
"directory": "packages/
|
|
37
|
-
},
|
|
38
|
-
"homepage": "https://github.com/jamesmurdza/upstream-agents/tree/main/packages/agents",
|
|
39
|
-
"bugs": {
|
|
40
|
-
"url": "https://github.com/jamesmurdza/upstream-agents/issues"
|
|
41
|
-
},
|
|
42
|
-
"publishConfig": {
|
|
43
|
-
"access": "public"
|
|
44
|
-
},
|
|
45
|
-
"devDependencies": {
|
|
46
|
-
"@types/node": "^20.10.0",
|
|
47
|
-
"esbuild": "^0.20.0",
|
|
48
|
-
"typescript": "^5.3.0",
|
|
49
|
-
"vitest": "^1.0.0"
|
|
50
|
-
},
|
|
51
|
-
"engines": {
|
|
52
|
-
"node": ">=18.0.0"
|
|
53
|
-
},
|
|
54
|
-
"files": [
|
|
55
|
-
"dist",
|
|
56
|
-
"README.md",
|
|
57
|
-
"next.config.codeagentsdk.cjs"
|
|
58
|
-
],
|
|
59
|
-
"exports": {
|
|
60
|
-
".": "./src/index.ts",
|
|
61
|
-
"./*": "./src/*",
|
|
62
|
-
"./next.config": "./next.config.codeagentsdk.cjs"
|
|
63
|
-
},
|
|
64
|
-
"dependencies": {
|
|
65
|
-
"@daytonaio/sdk": "^0.150.0",
|
|
66
|
-
"dotenv": "^17.3.1"
|
|
39
|
+
"url": "https://github.com/jamesmurdza/background-agents.git",
|
|
40
|
+
"directory": "packages/launcher"
|
|
67
41
|
}
|
|
68
42
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code CLI Agent Definition
|
|
3
|
-
*/
|
|
4
|
-
import type { AgentDefinition } from "../../core/agent";
|
|
5
|
-
/**
|
|
6
|
-
* Claude Code CLI agent definition.
|
|
7
|
-
*
|
|
8
|
-
* Interacts with the Claude CLI tool which outputs JSON lines in stream-json format.
|
|
9
|
-
*/
|
|
10
|
-
export declare const claudeAgent: AgentDefinition;
|
|
11
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/claude/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAyC,MAAM,kBAAkB,CAAA;AAwC9F;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,eAqDzB,CAAA"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code CLI Agent Definition
|
|
3
|
-
*/
|
|
4
|
-
import { parseClaudeLine } from "./parser";
|
|
5
|
-
import { CLAUDE_TOOL_MAPPINGS } from "./tools";
|
|
6
|
-
/** Claude credentials directory */
|
|
7
|
-
const CLAUDE_CREDENTIALS_DIR = "/home/daytona/.claude";
|
|
8
|
-
/** Claude credentials file */
|
|
9
|
-
const CLAUDE_CREDENTIALS_FILE = "/home/daytona/.claude/.credentials.json";
|
|
10
|
-
/** Environment variable name for Claude Code credentials */
|
|
11
|
-
const CLAUDE_CODE_CREDENTIALS_ENV = "CLAUDE_CODE_CREDENTIALS";
|
|
12
|
-
/**
|
|
13
|
-
* Claude agent-specific setup: write credentials from environment variable.
|
|
14
|
-
*
|
|
15
|
-
* When CLAUDE_CODE_CREDENTIALS environment variable is set, this function
|
|
16
|
-
* writes its contents to ~/.claude/.credentials.json. This allows credentials
|
|
17
|
-
* to be passed via environment variable instead of writing the file manually.
|
|
18
|
-
*
|
|
19
|
-
* The value should be the JSON content of the credentials file, e.g.:
|
|
20
|
-
* {"claudeAiOauth":{"accessToken":"sk-ant-oa..."}}
|
|
21
|
-
*/
|
|
22
|
-
async function claudeSetup(sandbox, env) {
|
|
23
|
-
const credentialsJson = env[CLAUDE_CODE_CREDENTIALS_ENV];
|
|
24
|
-
if (!credentialsJson || !sandbox.executeCommand)
|
|
25
|
-
return;
|
|
26
|
-
// Escape single quotes for shell command
|
|
27
|
-
const safeCredentials = credentialsJson.replace(/'/g, "'\\''");
|
|
28
|
-
// Create directory and write credentials file with secure permissions
|
|
29
|
-
await sandbox.executeCommand(`mkdir -p '${CLAUDE_CREDENTIALS_DIR}' && echo '${safeCredentials}' > '${CLAUDE_CREDENTIALS_FILE}' && chmod 600 '${CLAUDE_CREDENTIALS_FILE}'`, 30);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Claude Code CLI agent definition.
|
|
33
|
-
*
|
|
34
|
-
* Interacts with the Claude CLI tool which outputs JSON lines in stream-json format.
|
|
35
|
-
*/
|
|
36
|
-
export const claudeAgent = {
|
|
37
|
-
name: "claude",
|
|
38
|
-
toolMappings: CLAUDE_TOOL_MAPPINGS,
|
|
39
|
-
capabilities: {
|
|
40
|
-
supportsSystemPrompt: true,
|
|
41
|
-
supportsResume: true,
|
|
42
|
-
setup: claudeSetup,
|
|
43
|
-
},
|
|
44
|
-
buildCommand(options) {
|
|
45
|
-
const args = [];
|
|
46
|
-
// Print mode for non-interactive usage
|
|
47
|
-
args.push("-p");
|
|
48
|
-
// Add output format flag for JSON streaming (requires --verbose)
|
|
49
|
-
args.push("--output-format", "stream-json", "--verbose");
|
|
50
|
-
// Skip permission prompts when already running in a sandbox
|
|
51
|
-
args.push("--dangerously-skip-permissions");
|
|
52
|
-
// Apply system prompt via native CLI flag when provided
|
|
53
|
-
if (options.systemPrompt) {
|
|
54
|
-
args.push("--system-prompt", options.systemPrompt);
|
|
55
|
-
}
|
|
56
|
-
// Add model if specified (e.g., "sonnet", "opus", "claude-sonnet-4-5-20250929")
|
|
57
|
-
if (options.model) {
|
|
58
|
-
args.push("--model", options.model);
|
|
59
|
-
}
|
|
60
|
-
// Resume session if provided
|
|
61
|
-
if (options.sessionId) {
|
|
62
|
-
args.push("--resume", options.sessionId);
|
|
63
|
-
}
|
|
64
|
-
// Add the prompt if provided
|
|
65
|
-
if (options.prompt) {
|
|
66
|
-
args.push(options.prompt);
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
cmd: "claude",
|
|
70
|
-
args,
|
|
71
|
-
env: options.env,
|
|
72
|
-
};
|
|
73
|
-
},
|
|
74
|
-
parse(line, _context) {
|
|
75
|
-
return parseClaudeLine(line, this.toolMappings);
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/claude/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE9C,mCAAmC;AACnC,MAAM,sBAAsB,GAAG,uBAAuB,CAAA;AACtD,8BAA8B;AAC9B,MAAM,uBAAuB,GAAG,yCAAyC,CAAA;AACzE,4DAA4D;AAC5D,MAAM,2BAA2B,GAAG,yBAAyB,CAAA;AAE7D;;;;;;;;;GASG;AACH,KAAK,UAAU,WAAW,CACxB,OAAyB,EACzB,GAA2B;IAE3B,MAAM,eAAe,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACxD,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,cAAc;QAAE,OAAM;IAEvD,yCAAyC;IACzC,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAE9D,sEAAsE;IACtE,MAAM,OAAO,CAAC,cAAc,CAC1B,aAAa,sBAAsB,cAAc,eAAe,QAAQ,uBAAuB,mBAAmB,uBAAuB,GAAG,EAC5I,EAAE,CACH,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,IAAI,EAAE,QAAQ;IAEd,YAAY,EAAE,oBAAoB;IAElC,YAAY,EAAE;QACZ,oBAAoB,EAAE,IAAI;QAC1B,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,WAAW;KACnB;IAED,YAAY,CAAC,OAAmB;QAC9B,MAAM,IAAI,GAAa,EAAE,CAAA;QAEzB,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEf,iEAAiE;QACjE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,CAAC,CAAA;QAExD,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;QAE3C,wDAAwD;QACxD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;QACpD,CAAC;QAED,gFAAgF;QAChF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;QAC1C,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO;YACL,GAAG,EAAE,QAAQ;YACb,IAAI;YACJ,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,QAAsB;QACxC,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IACjD,CAAC;CACF,CAAA"}
|