bajaclaw 0.10.1
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 +639 -0
- package/bin/bajaclaw.js +35 -0
- package/bin/create-bajaclaw.js +17 -0
- package/dist/agent.d.ts +29 -0
- package/dist/agent.js +231 -0
- package/dist/agent.js.map +1 -0
- package/dist/api/server.d.ts +15 -0
- package/dist/api/server.js +215 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/translate.d.ts +61 -0
- package/dist/api/translate.js +109 -0
- package/dist/api/translate.js.map +1 -0
- package/dist/banner.d.ts +7 -0
- package/dist/banner.js +31 -0
- package/dist/banner.js.map +1 -0
- package/dist/channels/gateway.d.ts +1 -0
- package/dist/channels/gateway.js +76 -0
- package/dist/channels/gateway.js.map +1 -0
- package/dist/claude.d.ts +9 -0
- package/dist/claude.js +170 -0
- package/dist/claude.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +303 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/channel.d.ts +3 -0
- package/dist/commands/channel.js +27 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/compact.d.ts +8 -0
- package/dist/commands/compact.js +60 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/daemon.d.ts +7 -0
- package/dist/commands/daemon.js +129 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/dashboard.d.ts +1 -0
- package/dist/commands/dashboard.js +78 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/dry-run.d.ts +1 -0
- package/dist/commands/dry-run.js +5 -0
- package/dist/commands/dry-run.js.map +1 -0
- package/dist/commands/effort.d.ts +6 -0
- package/dist/commands/effort.js +33 -0
- package/dist/commands/effort.js.map +1 -0
- package/dist/commands/guide.d.ts +4 -0
- package/dist/commands/guide.js +52 -0
- package/dist/commands/guide.js.map +1 -0
- package/dist/commands/health.d.ts +1 -0
- package/dist/commands/health.js +20 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.js +114 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.js +63 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/migrate.d.ts +1 -0
- package/dist/commands/migrate.js +58 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/model.d.ts +5 -0
- package/dist/commands/model.js +31 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/persona.d.ts +6 -0
- package/dist/commands/persona.js +67 -0
- package/dist/commands/persona.js.map +1 -0
- package/dist/commands/port.d.ts +15 -0
- package/dist/commands/port.js +88 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/profile.d.ts +4 -0
- package/dist/commands/profile.js +41 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.js +62 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/setup.d.ts +17 -0
- package/dist/commands/setup.js +228 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/skill.d.ts +7 -0
- package/dist/commands/skill.js +137 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/start.d.ts +6 -0
- package/dist/commands/start.js +25 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +35 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/subagent.d.ts +14 -0
- package/dist/commands/subagent.js +173 -0
- package/dist/commands/subagent.js.map +1 -0
- package/dist/commands/trigger.d.ts +1 -0
- package/dist/commands/trigger.js +13 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/commands/uninstall.d.ts +5 -0
- package/dist/commands/uninstall.js +165 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.js +49 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/concurrency.d.ts +1 -0
- package/dist/concurrency.js +17 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +3 -0
- package/dist/db.js +124 -0
- package/dist/db.js.map +1 -0
- package/dist/delegation.d.ts +6 -0
- package/dist/delegation.js +21 -0
- package/dist/delegation.js.map +1 -0
- package/dist/health-check.d.ts +6 -0
- package/dist/health-check.js +38 -0
- package/dist/health-check.js.map +1 -0
- package/dist/logger.d.ts +11 -0
- package/dist/logger.js +53 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/consumer.d.ts +15 -0
- package/dist/mcp/consumer.js +74 -0
- package/dist/mcp/consumer.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +260 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory/claude-compat.d.ts +4 -0
- package/dist/memory/claude-compat.js +56 -0
- package/dist/memory/claude-compat.js.map +1 -0
- package/dist/memory/compact.d.ts +25 -0
- package/dist/memory/compact.js +195 -0
- package/dist/memory/compact.js.map +1 -0
- package/dist/memory/extract.d.ts +3 -0
- package/dist/memory/extract.js +56 -0
- package/dist/memory/extract.js.map +1 -0
- package/dist/memory/recall.d.ts +5 -0
- package/dist/memory/recall.js +47 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/model-picker.d.ts +33 -0
- package/dist/model-picker.js +104 -0
- package/dist/model-picker.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +49 -0
- package/dist/paths.js.map +1 -0
- package/dist/persona-io.d.ts +5 -0
- package/dist/persona-io.js +29 -0
- package/dist/persona-io.js.map +1 -0
- package/dist/persona.d.ts +12 -0
- package/dist/persona.js +54 -0
- package/dist/persona.js.map +1 -0
- package/dist/prompt.d.ts +5 -0
- package/dist/prompt.js +56 -0
- package/dist/prompt.js.map +1 -0
- package/dist/safety.d.ts +17 -0
- package/dist/safety.js +47 -0
- package/dist/safety.js.map +1 -0
- package/dist/scheduler/cron.d.ts +4 -0
- package/dist/scheduler/cron.js +44 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/index.d.ts +7 -0
- package/dist/scheduler/index.js +15 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/launchd.d.ts +4 -0
- package/dist/scheduler/launchd.js +73 -0
- package/dist/scheduler/launchd.js.map +1 -0
- package/dist/scheduler/schtasks.d.ts +4 -0
- package/dist/scheduler/schtasks.js +45 -0
- package/dist/scheduler/schtasks.js.map +1 -0
- package/dist/scheduler/systemd.d.ts +5 -0
- package/dist/scheduler/systemd.js +86 -0
- package/dist/scheduler/systemd.js.map +1 -0
- package/dist/self-improve.d.ts +4 -0
- package/dist/self-improve.js +48 -0
- package/dist/self-improve.js.map +1 -0
- package/dist/skills/auto-skiller.d.ts +21 -0
- package/dist/skills/auto-skiller.js +156 -0
- package/dist/skills/auto-skiller.js.map +1 -0
- package/dist/skills/loader.d.ts +3 -0
- package/dist/skills/loader.js +127 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/matcher.d.ts +2 -0
- package/dist/skills/matcher.js +27 -0
- package/dist/skills/matcher.js.map +1 -0
- package/dist/skills/porter.d.ts +27 -0
- package/dist/skills/porter.js +109 -0
- package/dist/skills/porter.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +25 -0
- package/dist/updater.js +185 -0
- package/dist/updater.js.map +1 -0
- package/package.json +53 -0
- package/scripts/postinstall.js +33 -0
- package/skills/configure-effort/SKILL.md +36 -0
- package/skills/configure-model/SKILL.md +41 -0
- package/skills/configure-tools/SKILL.md +51 -0
- package/skills/daily-briefing/SKILL.md +19 -0
- package/skills/delegate-to-subagent/SKILL.md +63 -0
- package/skills/email-triage/SKILL.md +21 -0
- package/skills/setup-api/SKILL.md +115 -0
- package/skills/setup-compaction/SKILL.md +102 -0
- package/skills/setup-daemon/SKILL.md +49 -0
- package/skills/setup-dashboard/SKILL.md +39 -0
- package/skills/setup-discord/SKILL.md +54 -0
- package/skills/setup-heartbeat/SKILL.md +51 -0
- package/skills/setup-mcp-port/SKILL.md +54 -0
- package/skills/setup-memory-sync/SKILL.md +45 -0
- package/skills/setup-profile/SKILL.md +44 -0
- package/skills/setup-self-update/SKILL.md +45 -0
- package/skills/setup-subagent/SKILL.md +102 -0
- package/skills/setup-telegram/SKILL.md +54 -0
- package/skills/setup-uninstall/SKILL.md +55 -0
- package/skills/web-research/SKILL.md +20 -0
- package/templates/code/AGENT.md +15 -0
- package/templates/code/HEARTBEAT.md +11 -0
- package/templates/code/SOUL.md +10 -0
- package/templates/code/bajaclaw.config.json +5 -0
- package/templates/code/scripts/launch.bat +4 -0
- package/templates/code/scripts/launch.sh +4 -0
- package/templates/custom/AGENT.md +14 -0
- package/templates/custom/HEARTBEAT.md +11 -0
- package/templates/custom/SOUL.md +10 -0
- package/templates/custom/bajaclaw.config.json +5 -0
- package/templates/custom/scripts/launch.bat +4 -0
- package/templates/custom/scripts/launch.sh +4 -0
- package/templates/outreach/AGENT.md +11 -0
- package/templates/outreach/HEARTBEAT.md +11 -0
- package/templates/outreach/SOUL.md +10 -0
- package/templates/outreach/bajaclaw.config.json +5 -0
- package/templates/outreach/scripts/launch.bat +4 -0
- package/templates/outreach/scripts/launch.sh +4 -0
- package/templates/research/AGENT.md +27 -0
- package/templates/research/HEARTBEAT.md +11 -0
- package/templates/research/SOUL.md +10 -0
- package/templates/research/bajaclaw.config.json +5 -0
- package/templates/research/scripts/launch.bat +4 -0
- package/templates/research/scripts/launch.sh +4 -0
- package/templates/social/AGENT.md +10 -0
- package/templates/social/HEARTBEAT.md +11 -0
- package/templates/social/SOUL.md +10 -0
- package/templates/social/bajaclaw.config.json +5 -0
- package/templates/social/scripts/launch.bat +4 -0
- package/templates/social/scripts/launch.sh +4 -0
- package/templates/support/AGENT.md +10 -0
- package/templates/support/HEARTBEAT.md +11 -0
- package/templates/support/SOUL.md +10 -0
- package/templates/support/bajaclaw.config.json +5 -0
- package/templates/support/scripts/launch.bat +4 -0
- package/templates/support/scripts/launch.sh +4 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { check, currentVersion, newerAvailable, performUpdate, detectInstall } from "../updater.js";
|
|
3
|
+
export async function runUpdate(opts = {}) {
|
|
4
|
+
const info = await check({ force: true });
|
|
5
|
+
if (!info) {
|
|
6
|
+
console.error(chalk.red("update check failed (network unavailable?)"));
|
|
7
|
+
process.exitCode = 1;
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const loc = detectInstall();
|
|
11
|
+
console.log(`installed: ${chalk.bold(info.current)} (${loc.kind})`);
|
|
12
|
+
console.log(`latest: ${chalk.bold(info.latest ?? "unknown")}`);
|
|
13
|
+
if (!newerAvailable(info)) {
|
|
14
|
+
console.log(chalk.green("already up to date."));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (opts.check) {
|
|
18
|
+
console.log(chalk.yellow(`update available: ${info.current} → ${info.latest}`));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!opts.yes) {
|
|
22
|
+
console.log("");
|
|
23
|
+
console.log(`Update will run: ${chalk.dim(loc.kind === "git" ? "git pull + npm install + npm run build" : "npm install -g bajaclaw@latest")}`);
|
|
24
|
+
console.log(chalk.yellow("re-run with --yes to apply."));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(chalk.cyan("updating…"));
|
|
28
|
+
const r = await performUpdate(info);
|
|
29
|
+
if (r.ok) {
|
|
30
|
+
console.log(chalk.green(`✓ ${r.message}`));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.error(chalk.red(`✗ ${r.method}: ${r.message}`));
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function maybeNoticeAtExit() {
|
|
38
|
+
try {
|
|
39
|
+
const info = await check();
|
|
40
|
+
if (info && newerAvailable(info)) {
|
|
41
|
+
// Import lazily to keep startup light if not needed.
|
|
42
|
+
const { printNotice } = await import("../updater.js");
|
|
43
|
+
printNotice(info);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch { /* silent */ }
|
|
47
|
+
void currentVersion;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQpG,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB,EAAE;IACzD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;QAC/I,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,qDAAqD;YACrD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACtD,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,KAAK,cAAc,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function serialize<T>(profile: string, work: () => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// In-process cycle serialization. Ensures at most one cycle runs per
|
|
2
|
+
// profile within the same node process. Prevents the HTTP API from
|
|
3
|
+
// spawning parallel `claude` subprocesses under load — which would
|
|
4
|
+
// inflate backend usage and look a lot like automation abuse.
|
|
5
|
+
//
|
|
6
|
+
// Cross-process coordination (daemon vs manual CLI) is not done here —
|
|
7
|
+
// that would require a filesystem lock. In practice the daemon polls
|
|
8
|
+
// every 60s, CLI runs are rare, and the rate limiter is the backstop.
|
|
9
|
+
const queues = new Map();
|
|
10
|
+
export function serialize(profile, work) {
|
|
11
|
+
const prev = queues.get(profile) ?? Promise.resolve();
|
|
12
|
+
const next = prev.then(() => work());
|
|
13
|
+
// Keep the chain alive even if one work item threw.
|
|
14
|
+
queues.set(profile, next.catch(() => undefined));
|
|
15
|
+
return next;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../src/concurrency.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,mEAAmE;AACnE,mEAAmE;AACnE,8DAA8D;AAC9D,EAAE;AACF,uEAAuE;AACvE,qEAAqE;AACrE,sEAAsE;AAEtE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEnD,MAAM,UAAU,SAAS,CAAI,OAAe,EAAE,IAAsB;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,oDAAoD;IACpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AgentConfig } from "./types.js";
|
|
2
|
+
export declare function configPath(profile: string): string;
|
|
3
|
+
export declare function loadConfig(profile: string): AgentConfig;
|
|
4
|
+
export declare function saveConfig(cfg: AgentConfig): void;
|
|
5
|
+
export declare function mergedDefaults(partial: Partial<AgentConfig>): AgentConfig;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { profileDir, ensureDir } from "./paths.js";
|
|
4
|
+
const DEFAULT = {
|
|
5
|
+
// "auto" picks haiku/sonnet/opus per task via src/model-picker.ts.
|
|
6
|
+
// Override with a specific id to disable auto-selection.
|
|
7
|
+
model: "auto",
|
|
8
|
+
effort: "medium",
|
|
9
|
+
// Capped low by default to keep token usage tight. Auto-picked tiers
|
|
10
|
+
// further constrain turns per cycle. Bump explicitly for agents that
|
|
11
|
+
// legitimately need long tool chains.
|
|
12
|
+
maxTurns: 10,
|
|
13
|
+
dashboardPort: 7337,
|
|
14
|
+
memorySync: false,
|
|
15
|
+
compaction: {
|
|
16
|
+
enabled: true,
|
|
17
|
+
threshold: 0.75,
|
|
18
|
+
schedule: "both",
|
|
19
|
+
dailyAtUtc: "00:00",
|
|
20
|
+
keepRecentPerKind: 25,
|
|
21
|
+
pruneCycleDays: 30,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export function configPath(profile) {
|
|
25
|
+
return join(profileDir(profile), "config.json");
|
|
26
|
+
}
|
|
27
|
+
export function loadConfig(profile) {
|
|
28
|
+
const path = configPath(profile);
|
|
29
|
+
if (!existsSync(path)) {
|
|
30
|
+
throw new Error(`Profile not found: ${profile} (expected ${path}). Run \`bajaclaw init\`.`);
|
|
31
|
+
}
|
|
32
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
33
|
+
return { ...DEFAULT, ...raw, profile };
|
|
34
|
+
}
|
|
35
|
+
export function saveConfig(cfg) {
|
|
36
|
+
ensureDir(profileDir(cfg.profile));
|
|
37
|
+
writeFileSync(configPath(cfg.profile), JSON.stringify(cfg, null, 2));
|
|
38
|
+
}
|
|
39
|
+
export function mergedDefaults(partial) {
|
|
40
|
+
return { ...DEFAULT, ...partial };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,OAAO,GAAyB;IACpC,mEAAmE;IACnE,yDAAyD;IACzD,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,QAAQ;IAChB,qEAAqE;IACrE,qEAAqE;IACrE,sCAAsC;IACtC,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,OAAO;QACnB,iBAAiB,EAAE,EAAE;QACrB,cAAc,EAAE,EAAE;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,cAAc,IAAI,2BAA2B,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAiB,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA6B;IAC1D,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAiB,CAAC;AACnD,CAAC"}
|
package/dist/db.d.ts
ADDED
package/dist/db.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { profileDb, profileDir, ensureDir } from "./paths.js";
|
|
3
|
+
const MIGRATIONS = [
|
|
4
|
+
{
|
|
5
|
+
version: 1,
|
|
6
|
+
sql: `
|
|
7
|
+
CREATE TABLE IF NOT EXISTS cycles (
|
|
8
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
9
|
+
started_at TEXT NOT NULL,
|
|
10
|
+
finished_at TEXT,
|
|
11
|
+
status TEXT NOT NULL,
|
|
12
|
+
task TEXT NOT NULL,
|
|
13
|
+
prompt_preview TEXT,
|
|
14
|
+
response_preview TEXT,
|
|
15
|
+
cost_usd REAL,
|
|
16
|
+
input_tokens INTEGER,
|
|
17
|
+
output_tokens INTEGER,
|
|
18
|
+
turns INTEGER,
|
|
19
|
+
error TEXT
|
|
20
|
+
);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_cycles_started ON cycles(started_at);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_cycles_status ON cycles(status);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
25
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
26
|
+
kind TEXT NOT NULL,
|
|
27
|
+
content TEXT NOT NULL,
|
|
28
|
+
source TEXT NOT NULL,
|
|
29
|
+
source_cycle_id INTEGER,
|
|
30
|
+
created_at TEXT NOT NULL,
|
|
31
|
+
FOREIGN KEY (source_cycle_id) REFERENCES cycles(id)
|
|
32
|
+
);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_memories_kind ON memories(kind);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_memories_source ON memories(source);
|
|
35
|
+
|
|
36
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
37
|
+
content,
|
|
38
|
+
kind UNINDEXED,
|
|
39
|
+
memory_id UNINDEXED,
|
|
40
|
+
content='memories',
|
|
41
|
+
content_rowid='id'
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
45
|
+
INSERT INTO memories_fts(rowid, content, kind, memory_id) VALUES (new.id, new.content, new.kind, new.id);
|
|
46
|
+
END;
|
|
47
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
48
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, kind, memory_id) VALUES('delete', old.id, old.content, old.kind, old.id);
|
|
49
|
+
END;
|
|
50
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
51
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, kind, memory_id) VALUES('delete', old.id, old.content, old.kind, old.id);
|
|
52
|
+
INSERT INTO memories_fts(rowid, content, kind, memory_id) VALUES (new.id, new.content, new.kind, new.id);
|
|
53
|
+
END;
|
|
54
|
+
|
|
55
|
+
CREATE TABLE IF NOT EXISTS schedules (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
cron TEXT NOT NULL,
|
|
58
|
+
task TEXT NOT NULL,
|
|
59
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
60
|
+
last_run TEXT,
|
|
61
|
+
next_run TEXT
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
65
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
66
|
+
created_at TEXT NOT NULL,
|
|
67
|
+
priority TEXT NOT NULL DEFAULT 'normal',
|
|
68
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
69
|
+
body TEXT NOT NULL,
|
|
70
|
+
source TEXT,
|
|
71
|
+
cycle_id INTEGER,
|
|
72
|
+
FOREIGN KEY (cycle_id) REFERENCES cycles(id)
|
|
73
|
+
);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE IF NOT EXISTS circuit_state (
|
|
78
|
+
key TEXT PRIMARY KEY,
|
|
79
|
+
value TEXT NOT NULL,
|
|
80
|
+
updated_at TEXT NOT NULL
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
CREATE TABLE IF NOT EXISTS prompts (
|
|
84
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
85
|
+
name TEXT NOT NULL,
|
|
86
|
+
version INTEGER NOT NULL,
|
|
87
|
+
body TEXT NOT NULL,
|
|
88
|
+
created_at TEXT NOT NULL,
|
|
89
|
+
score REAL,
|
|
90
|
+
samples INTEGER DEFAULT 0,
|
|
91
|
+
UNIQUE(name, version)
|
|
92
|
+
);
|
|
93
|
+
`,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
export function openDb(profile) {
|
|
97
|
+
ensureDir(profileDir(profile));
|
|
98
|
+
const db = new Database(profileDb(profile));
|
|
99
|
+
db.pragma("journal_mode = WAL");
|
|
100
|
+
db.pragma("foreign_keys = ON");
|
|
101
|
+
db.pragma("synchronous = NORMAL");
|
|
102
|
+
migrate(db);
|
|
103
|
+
return db;
|
|
104
|
+
}
|
|
105
|
+
function migrate(db) {
|
|
106
|
+
db.exec("CREATE TABLE IF NOT EXISTS schema_version (version INTEGER PRIMARY KEY);");
|
|
107
|
+
const row = db.prepare("SELECT MAX(version) as v FROM schema_version").get();
|
|
108
|
+
const current = row.v ?? 0;
|
|
109
|
+
for (const m of MIGRATIONS) {
|
|
110
|
+
if (m.version > current) {
|
|
111
|
+
db.exec("BEGIN");
|
|
112
|
+
try {
|
|
113
|
+
db.exec(m.sql);
|
|
114
|
+
db.prepare("INSERT INTO schema_version(version) VALUES (?)").run(m.version);
|
|
115
|
+
db.exec("COMMIT");
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
db.exec("ROLLBACK");
|
|
119
|
+
throw e;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,UAAU,GAAuC;IACrD;QACE,OAAO,EAAE,CAAC;QACV,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuFJ;KACF;CACF,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,EAAM;IACrB,EAAE,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAA0B,CAAC;IACrG,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjB,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACf,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC5E,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpB,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ClaudeOptions, ClaudeResult } from "./types.js";
|
|
2
|
+
export interface DelegateOptions extends ClaudeOptions {
|
|
3
|
+
workdir: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function delegateCoding(task: string, opts: DelegateOptions): Promise<ClaudeResult>;
|
|
6
|
+
export declare const delegateToClaudeCode: typeof delegateCoding;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Delegate coding-heavy work to a dedicated CLI sub-session.
|
|
2
|
+
// Orchestrating BajaClaw agents never write code directly — they call this.
|
|
3
|
+
import { runOnce } from "./claude.js";
|
|
4
|
+
export async function delegateCoding(task, opts) {
|
|
5
|
+
const merged = {
|
|
6
|
+
model: opts.model ?? "claude-opus-4-7",
|
|
7
|
+
effort: opts.effort ?? "high",
|
|
8
|
+
maxTurns: opts.maxTurns ?? 40,
|
|
9
|
+
allowedTools: opts.allowedTools ?? ["Read", "Edit", "Write", "Bash", "Grep", "Glob"],
|
|
10
|
+
disallowedTools: opts.disallowedTools,
|
|
11
|
+
mcpConfig: opts.mcpConfig,
|
|
12
|
+
workdir: opts.workdir,
|
|
13
|
+
printMode: true,
|
|
14
|
+
systemPrompt: opts.systemPrompt ?? "You are a coding sub-agent invoked by BajaClaw. Complete the task, then summarize what you changed in the final message.",
|
|
15
|
+
timeout: opts.timeout ?? 30 * 60 * 1000,
|
|
16
|
+
};
|
|
17
|
+
return runOnce(task, merged);
|
|
18
|
+
}
|
|
19
|
+
// Backward-compatible alias for the older name.
|
|
20
|
+
export const delegateToClaudeCode = delegateCoding;
|
|
21
|
+
//# sourceMappingURL=delegation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation.js","sourceRoot":"","sources":["../src/delegation.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,4EAA4E;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,IAAqB;IACtE,MAAM,MAAM,GAAkB;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,iBAAiB;QACtC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACpF,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,0HAA0H;QAC7J,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;KACxC,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
import { claudeHome, claudeDesktopConfigPath, bajaclawHome } from "./paths.js";
|
|
4
|
+
import { findClaudeBinary, claudeVersion } from "./claude.js";
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
export async function runHealth() {
|
|
7
|
+
const out = [];
|
|
8
|
+
const nodeMajor = Number(process.versions.node.split(".")[0]);
|
|
9
|
+
out.push({
|
|
10
|
+
name: "node",
|
|
11
|
+
ok: nodeMajor >= 20,
|
|
12
|
+
detail: `v${process.versions.node} (need >= 20)`,
|
|
13
|
+
});
|
|
14
|
+
const bin = await findClaudeBinary();
|
|
15
|
+
out.push({ name: "cli backend", ok: !!bin, detail: bin ?? "`claude` not found in PATH" });
|
|
16
|
+
if (bin) {
|
|
17
|
+
const v = await claudeVersion();
|
|
18
|
+
// The backend prints its own brand in --version; show only the semver prefix.
|
|
19
|
+
const semver = v ? (v.match(/\d+\.\d+\.\d+\S*/) ?? [null])[0] : null;
|
|
20
|
+
out.push({ name: "cli version", ok: !!v, detail: semver ?? v ?? "unable to read version" });
|
|
21
|
+
}
|
|
22
|
+
out.push({ name: "cli state dir", ok: existsSync(claudeHome()), detail: claudeHome() });
|
|
23
|
+
out.push({ name: "bajaclaw home", ok: true, detail: bajaclawHome() });
|
|
24
|
+
const desk = claudeDesktopConfigPath();
|
|
25
|
+
out.push({ name: "desktop mcp config", ok: existsSync(desk), detail: desk });
|
|
26
|
+
try {
|
|
27
|
+
const db = new Database(":memory:");
|
|
28
|
+
db.exec("CREATE VIRTUAL TABLE t USING fts5(a);");
|
|
29
|
+
db.close();
|
|
30
|
+
out.push({ name: "sqlite + FTS5", ok: true, detail: "ok" });
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
out.push({ name: "sqlite + FTS5", ok: false, detail: e.message });
|
|
34
|
+
}
|
|
35
|
+
out.push({ name: "platform", ok: true, detail: platform() });
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=health-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../src/health-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAQtC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,GAAG,CAAC,IAAI,CAAC;QACP,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,SAAS,IAAI,EAAE;QACnB,MAAM,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,eAAe;KACjD,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,4BAA4B,EAAE,CAAC,CAAC;IAE1F,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,GAAG,MAAM,aAAa,EAAE,CAAC;QAChC,8EAA8E;QAC9E,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACxF,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAG,uBAAuB,EAAE,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACjD,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class Logger {
|
|
2
|
+
private profile;
|
|
3
|
+
constructor(profile: string);
|
|
4
|
+
private file;
|
|
5
|
+
log(level: "info" | "warn" | "error" | "debug", event: string, data?: Record<string, unknown>): void;
|
|
6
|
+
info(e: string, d?: Record<string, unknown>): void;
|
|
7
|
+
warn(e: string, d?: Record<string, unknown>): void;
|
|
8
|
+
error(e: string, d?: Record<string, unknown>): void;
|
|
9
|
+
debug(e: string, d?: Record<string, unknown>): void;
|
|
10
|
+
rotate(): void;
|
|
11
|
+
}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { appendFileSync, readdirSync, statSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { profileLogDir, ensureDir } from "./paths.js";
|
|
4
|
+
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;
|
|
5
|
+
export class Logger {
|
|
6
|
+
profile;
|
|
7
|
+
constructor(profile) {
|
|
8
|
+
this.profile = profile;
|
|
9
|
+
ensureDir(profileLogDir(profile));
|
|
10
|
+
}
|
|
11
|
+
file() {
|
|
12
|
+
const d = new Date().toISOString().slice(0, 10);
|
|
13
|
+
return join(profileLogDir(this.profile), `${d}.jsonl`);
|
|
14
|
+
}
|
|
15
|
+
log(level, event, data) {
|
|
16
|
+
const line = JSON.stringify({
|
|
17
|
+
ts: new Date().toISOString(),
|
|
18
|
+
level,
|
|
19
|
+
event,
|
|
20
|
+
profile: this.profile,
|
|
21
|
+
...data,
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
appendFileSync(this.file(), line + "\n");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// swallow — never crash on log errors
|
|
28
|
+
}
|
|
29
|
+
if (process.env.BAJACLAW_VERBOSE === "1" || level === "error") {
|
|
30
|
+
const out = level === "error" ? process.stderr : process.stdout;
|
|
31
|
+
out.write(`[${level}] ${event} ${data ? JSON.stringify(data) : ""}\n`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
info(e, d) { this.log("info", e, d); }
|
|
35
|
+
warn(e, d) { this.log("warn", e, d); }
|
|
36
|
+
error(e, d) { this.log("error", e, d); }
|
|
37
|
+
debug(e, d) { this.log("debug", e, d); }
|
|
38
|
+
rotate() {
|
|
39
|
+
const dir = profileLogDir(this.profile);
|
|
40
|
+
const cutoff = Date.now() - THIRTY_DAYS_MS;
|
|
41
|
+
for (const f of readdirSync(dir)) {
|
|
42
|
+
if (!f.endsWith(".jsonl"))
|
|
43
|
+
continue;
|
|
44
|
+
const full = join(dir, f);
|
|
45
|
+
try {
|
|
46
|
+
if (statSync(full).mtimeMs < cutoff)
|
|
47
|
+
unlinkSync(full);
|
|
48
|
+
}
|
|
49
|
+
catch { /* ignore */ }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface McpServerEntry {
|
|
2
|
+
command: string;
|
|
3
|
+
args?: string[];
|
|
4
|
+
env?: Record<string, string>;
|
|
5
|
+
}
|
|
6
|
+
export interface McpConfigFile {
|
|
7
|
+
mcpServers?: Record<string, McpServerEntry>;
|
|
8
|
+
}
|
|
9
|
+
export declare function readMcpFile(path: string): McpConfigFile;
|
|
10
|
+
export declare function userMcpPath(): string;
|
|
11
|
+
export declare function listConfigured(profile: string): Record<string, McpServerEntry>;
|
|
12
|
+
export declare function mergeMcp(profile: string): McpConfigFile;
|
|
13
|
+
export declare function buildMcpConfig(profile: string): string;
|
|
14
|
+
export declare function addServer(profile: string, name: string, entry: McpServerEntry): void;
|
|
15
|
+
export declare function removeServer(profile: string, name: string): boolean;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { claudeDesktopConfigPath, profileDir, bajaclawHome, ensureDir } from "../paths.js";
|
|
4
|
+
import { loadConfig } from "../config.js";
|
|
5
|
+
export function readMcpFile(path) {
|
|
6
|
+
if (!existsSync(path))
|
|
7
|
+
return {};
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function userMcpPath() {
|
|
16
|
+
return join(bajaclawHome(), "mcp-config.json");
|
|
17
|
+
}
|
|
18
|
+
export function listConfigured(profile) {
|
|
19
|
+
const merged = mergeMcp(profile);
|
|
20
|
+
return merged.mcpServers ?? {};
|
|
21
|
+
}
|
|
22
|
+
// Merge order (highest wins):
|
|
23
|
+
// 1. <profile>/agent-mcp-config.json
|
|
24
|
+
// 2. <profile>/mcp-config.json
|
|
25
|
+
// 3. ~/.bajaclaw/mcp-config.json (user-global BajaClaw MCP)
|
|
26
|
+
// 4. Desktop CLI MCP config — ONLY if mergeDesktopMcp: true in the profile.
|
|
27
|
+
//
|
|
28
|
+
// This keeps BajaClaw's MCP separate from the desktop CLI's by default.
|
|
29
|
+
// Use `bajaclaw mcp port` to copy servers from desktop into BajaClaw's scope,
|
|
30
|
+
// or set mergeDesktopMcp: true in config.json to auto-inherit.
|
|
31
|
+
export function mergeMcp(profile) {
|
|
32
|
+
const userFile = readMcpFile(userMcpPath());
|
|
33
|
+
const profileFile = readMcpFile(join(profileDir(profile), "mcp-config.json"));
|
|
34
|
+
const agentFile = readMcpFile(join(profileDir(profile), "agent-mcp-config.json"));
|
|
35
|
+
let desktop = {};
|
|
36
|
+
try {
|
|
37
|
+
const cfg = loadConfig(profile);
|
|
38
|
+
if (cfg.mergeDesktopMcp)
|
|
39
|
+
desktop = readMcpFile(claudeDesktopConfigPath());
|
|
40
|
+
}
|
|
41
|
+
catch { /* profile may not exist yet */ }
|
|
42
|
+
return {
|
|
43
|
+
mcpServers: {
|
|
44
|
+
...(desktop.mcpServers ?? {}),
|
|
45
|
+
...(userFile.mcpServers ?? {}),
|
|
46
|
+
...(profileFile.mcpServers ?? {}),
|
|
47
|
+
...(agentFile.mcpServers ?? {}),
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function buildMcpConfig(profile) {
|
|
52
|
+
const merged = mergeMcp(profile);
|
|
53
|
+
const dir = ensureDir(profileDir(profile));
|
|
54
|
+
const path = join(dir, ".mcp-merged.json");
|
|
55
|
+
writeFileSync(path, JSON.stringify(merged, null, 2));
|
|
56
|
+
return path;
|
|
57
|
+
}
|
|
58
|
+
export function addServer(profile, name, entry) {
|
|
59
|
+
const path = join(profileDir(profile), "mcp-config.json");
|
|
60
|
+
const current = readMcpFile(path);
|
|
61
|
+
current.mcpServers = { ...(current.mcpServers ?? {}), [name]: entry };
|
|
62
|
+
ensureDir(profileDir(profile));
|
|
63
|
+
writeFileSync(path, JSON.stringify(current, null, 2));
|
|
64
|
+
}
|
|
65
|
+
export function removeServer(profile, name) {
|
|
66
|
+
const path = join(profileDir(profile), "mcp-config.json");
|
|
67
|
+
const current = readMcpFile(path);
|
|
68
|
+
if (!current.mcpServers?.[name])
|
|
69
|
+
return false;
|
|
70
|
+
delete current.mcpServers[name];
|
|
71
|
+
writeFileSync(path, JSON.stringify(current, null, 2));
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=consumer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/mcp/consumer.ts"],"names":[],"mappings":"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"}
|