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
package/dist/cli.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { runInit } from "./commands/init.js";
|
|
4
|
+
import { runStart } from "./commands/start.js";
|
|
5
|
+
import { runDoctor } from "./commands/doctor.js";
|
|
6
|
+
import { runDryRun } from "./commands/dry-run.js";
|
|
7
|
+
import { runStatus } from "./commands/status.js";
|
|
8
|
+
import { runHealthCmd } from "./commands/health.js";
|
|
9
|
+
import { runMigrate } from "./commands/migrate.js";
|
|
10
|
+
import { runDashboard } from "./commands/dashboard.js";
|
|
11
|
+
import { runTrigger } from "./commands/trigger.js";
|
|
12
|
+
import { runUpdate, maybeNoticeAtExit } from "./commands/update.js";
|
|
13
|
+
import { runSetup, autoBootstrapIfNeeded, DEFAULT_PROFILE_NAME } from "./commands/setup.js";
|
|
14
|
+
import { runUninstall } from "./commands/uninstall.js";
|
|
15
|
+
import { cmdSkillPort, cmdMcpPort, listDesktopServers } from "./commands/port.js";
|
|
16
|
+
import { runModel } from "./commands/model.js";
|
|
17
|
+
import { runEffort } from "./commands/effort.js";
|
|
18
|
+
import { runGuide } from "./commands/guide.js";
|
|
19
|
+
import { runServe } from "./commands/serve.js";
|
|
20
|
+
import { runPersonaCmd } from "./commands/persona.js";
|
|
21
|
+
import { runCompact } from "./commands/compact.js";
|
|
22
|
+
import * as subagent from "./commands/subagent.js";
|
|
23
|
+
import { currentVersion } from "./updater.js";
|
|
24
|
+
import { printBanner } from "./banner.js";
|
|
25
|
+
import * as mcp from "./commands/mcp.js";
|
|
26
|
+
import * as skill from "./commands/skill.js";
|
|
27
|
+
import * as profile from "./commands/profile.js";
|
|
28
|
+
import * as daemon from "./commands/daemon.js";
|
|
29
|
+
import * as channel from "./commands/channel.js";
|
|
30
|
+
const pkg = { name: "bajaclaw", version: currentVersion() };
|
|
31
|
+
function defaultProfile(explicit) {
|
|
32
|
+
return explicit ?? process.env.BAJACLAW_PROFILE ?? DEFAULT_PROFILE_NAME;
|
|
33
|
+
}
|
|
34
|
+
const program = new Command();
|
|
35
|
+
program.name(pkg.name).description("BajaClaw — autonomous agents on your terms").version(pkg.version);
|
|
36
|
+
program
|
|
37
|
+
.command("init [name]")
|
|
38
|
+
.description("Scaffold a new agent profile")
|
|
39
|
+
.option("--template <name>", "outreach|research|support|social|code|custom", "custom")
|
|
40
|
+
.option("--model <id>", "auto|claude-opus-4-7|claude-sonnet-4-6|claude-haiku-4-5", "auto")
|
|
41
|
+
.option("--effort <level>", "low|medium|high", "medium")
|
|
42
|
+
.option("--force", "overwrite existing profile")
|
|
43
|
+
.action(async (name, opts) => {
|
|
44
|
+
const n = name ?? process.env.BAJACLAW_PROFILE;
|
|
45
|
+
if (!n) {
|
|
46
|
+
console.error("usage: bajaclaw init <name>");
|
|
47
|
+
process.exit(2);
|
|
48
|
+
}
|
|
49
|
+
await runInit({ name: n, template: opts.template, model: opts.model, effort: opts.effort, force: !!opts.force });
|
|
50
|
+
});
|
|
51
|
+
program
|
|
52
|
+
.command("start [profile]")
|
|
53
|
+
.description("Run one cycle (auto-bootstraps the default profile on first run)")
|
|
54
|
+
.option("--task <text>", "override task")
|
|
55
|
+
.option("--dry-run", "assemble prompt and print, no exec")
|
|
56
|
+
.action(async (p, opts) => {
|
|
57
|
+
const target = defaultProfile(p);
|
|
58
|
+
if (target === DEFAULT_PROFILE_NAME)
|
|
59
|
+
await autoBootstrapIfNeeded();
|
|
60
|
+
await runStart({ profile: target, task: opts.task, dryRun: !!opts.dryRun });
|
|
61
|
+
});
|
|
62
|
+
program.command("dry-run [profile]").description("Show assembled prompt without executing")
|
|
63
|
+
.option("--task <text>")
|
|
64
|
+
.action(async (p, opts) => runDryRun(defaultProfile(p), opts.task));
|
|
65
|
+
program.command("doctor").description("Check toolchain + backend").action(runDoctor);
|
|
66
|
+
program.command("status [profile]").description("Summary stats").action(async (p) => runStatus(p));
|
|
67
|
+
program.command("health [profile]").description("Breaker + rate limit + recent cycles").action(async (p) => runHealthCmd(defaultProfile(p)));
|
|
68
|
+
program.command("dashboard [profile]").description("Serve dashboard HTML").action(async (p) => runDashboard(defaultProfile(p)));
|
|
69
|
+
program.command("migrate [profile]").description("Import from a foreign profile directory (strips legacy artifacts)")
|
|
70
|
+
.requiredOption("--from-yonderclaw <dir>", "path to yonderclaw directory")
|
|
71
|
+
.action(async (p, opts) => runMigrate(defaultProfile(p), opts.fromYonderclaw));
|
|
72
|
+
program.command("trigger [profile]")
|
|
73
|
+
.description("Enqueue an event/task")
|
|
74
|
+
.argument("<event>")
|
|
75
|
+
.option("--body <text>")
|
|
76
|
+
.action(async (p, event, opts) => runTrigger(defaultProfile(p), event, opts.body));
|
|
77
|
+
// MCP group
|
|
78
|
+
const mcpCmd = program.command("mcp").description("MCP consume + serve");
|
|
79
|
+
mcpCmd.command("list [profile]").action(async (p) => mcp.cmdList(defaultProfile(p)));
|
|
80
|
+
mcpCmd.command("add [profile]").requiredOption("--command <cmd>").option("--args <args...>", "").option("--env <kv...>", "")
|
|
81
|
+
.argument("<name>")
|
|
82
|
+
.action(async (p, name, opts) => {
|
|
83
|
+
const env = {};
|
|
84
|
+
for (const pair of (opts.env ?? [])) {
|
|
85
|
+
const [k, ...rest] = pair.split("=");
|
|
86
|
+
if (k)
|
|
87
|
+
env[k] = rest.join("=");
|
|
88
|
+
}
|
|
89
|
+
await mcp.cmdAdd(defaultProfile(p), name, opts.command, opts.args ?? [], env);
|
|
90
|
+
});
|
|
91
|
+
mcpCmd.command("remove [profile]").argument("<name>").action(async (p, name) => mcp.cmdRemove(defaultProfile(p), name));
|
|
92
|
+
mcpCmd.command("serve").option("--stdio").option("--port <n>").option("--profile <name>")
|
|
93
|
+
.action(async (opts) => mcp.cmdServe({ profile: opts.profile, port: opts.port ? Number(opts.port) : undefined, stdio: !!opts.stdio }));
|
|
94
|
+
mcpCmd.command("register [profile]").action(async (p) => mcp.cmdRegister(p));
|
|
95
|
+
mcpCmd.command("port")
|
|
96
|
+
.description("Port MCP servers from the desktop config into BajaClaw's user MCP config")
|
|
97
|
+
.option("--names <names...>", "specific server name(s) (default: all non-self)")
|
|
98
|
+
.option("--force", "overwrite existing entries")
|
|
99
|
+
.option("--list", "list available desktop servers without porting")
|
|
100
|
+
.action(async (opts) => {
|
|
101
|
+
if (opts.list) {
|
|
102
|
+
const names = listDesktopServers();
|
|
103
|
+
if (names.length === 0)
|
|
104
|
+
console.log("(none)");
|
|
105
|
+
else
|
|
106
|
+
for (const n of names)
|
|
107
|
+
console.log(n);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
await cmdMcpPort({ names: opts.names, force: !!opts.force });
|
|
111
|
+
});
|
|
112
|
+
// Skills group
|
|
113
|
+
const skillCmd = program.command("skill").description("Skills across scopes");
|
|
114
|
+
skillCmd.command("list [profile]").action(async (p) => skill.cmdList(defaultProfile(p)));
|
|
115
|
+
skillCmd.command("new").argument("<name>").option("--profile <p>").option("--scope <s>", "user|profile", "user")
|
|
116
|
+
.action(async (name, opts) => skill.cmdNew(name, opts.scope, opts.profile));
|
|
117
|
+
skillCmd.command("install").argument("<source>").option("--scope <s>", "user|profile", "user").option("--profile <p>")
|
|
118
|
+
.action(async (source, opts) => skill.cmdInstall(source, opts.scope, opts.profile));
|
|
119
|
+
skillCmd.command("review").action(skill.cmdReview);
|
|
120
|
+
skillCmd.command("promote")
|
|
121
|
+
.description("Move an auto-generated skill from review into the user scope")
|
|
122
|
+
.argument("<name>")
|
|
123
|
+
.option("--force", "overwrite existing skill with the same name")
|
|
124
|
+
.action(async (name, opts) => skill.cmdPromote(name, { force: !!opts.force }));
|
|
125
|
+
skillCmd.command("port")
|
|
126
|
+
.description("Port skills from the desktop CLI scope into BajaClaw's scope")
|
|
127
|
+
.option("--source <dir>", "source dir (default: ~/.claude/skills)")
|
|
128
|
+
.option("--scope <s>", "destination scope: user|profile|agent", "user")
|
|
129
|
+
.option("--profile <p>", "profile name (required for scope=profile|agent)")
|
|
130
|
+
.option("--link", "symlink instead of copy (live reflects upstream)")
|
|
131
|
+
.option("--force", "overwrite existing skills")
|
|
132
|
+
.option("--names <names...>", "specific skill name(s) to port (default: all)")
|
|
133
|
+
.action(async (opts) => cmdSkillPort({
|
|
134
|
+
source: opts.source,
|
|
135
|
+
scope: opts.scope,
|
|
136
|
+
profile: opts.profile,
|
|
137
|
+
link: !!opts.link,
|
|
138
|
+
force: !!opts.force,
|
|
139
|
+
names: opts.names,
|
|
140
|
+
}));
|
|
141
|
+
// Profile group
|
|
142
|
+
const profCmd = program.command("profile").description("Manage profiles");
|
|
143
|
+
profCmd.command("list").action(profile.cmdList);
|
|
144
|
+
profCmd.command("create").argument("<name>").option("--template <t>", "", "custom").action(async (n, o) => profile.cmdCreate(n, o.template));
|
|
145
|
+
profCmd.command("switch").argument("<name>").action(profile.cmdSwitch);
|
|
146
|
+
profCmd.command("delete").argument("<name>").option("--yes").action(async (n, o) => profile.cmdDelete(n, !!o.yes));
|
|
147
|
+
// Daemon group
|
|
148
|
+
const daemonCmd = program.command("daemon").description("Heartbeat daemon");
|
|
149
|
+
daemonCmd.command("start [profile]").option("--fg").action(async (p, o) => daemon.cmdStart(defaultProfile(p), !!o.fg));
|
|
150
|
+
daemonCmd.command("stop [profile]").action(async (p) => daemon.cmdStop(defaultProfile(p)));
|
|
151
|
+
daemonCmd.command("status [profile]").action(async (p) => daemon.cmdStatus(defaultProfile(p)));
|
|
152
|
+
daemonCmd.command("logs [profile]").option("--lines <n>", "", "50").action(async (p, o) => daemon.cmdLogs(defaultProfile(p), Number(o.lines)));
|
|
153
|
+
daemonCmd.command("restart [profile]").action(async (p) => daemon.cmdRestart(defaultProfile(p)));
|
|
154
|
+
daemonCmd.command("install [profile]").action(async (p) => daemon.cmdInstall(defaultProfile(p)));
|
|
155
|
+
daemonCmd.command("run [profile]").action(async (p) => daemon.cmdRun(defaultProfile(p)));
|
|
156
|
+
// Channel group
|
|
157
|
+
const chanCmd = program.command("channel").description("Messaging channels");
|
|
158
|
+
chanCmd.command("add [profile]").argument("<kind>").requiredOption("--token <t>").option("--channel-id <id>")
|
|
159
|
+
.action(async (p, kind, o) => channel.cmdAdd(defaultProfile(p), kind, o.token, o.channelId));
|
|
160
|
+
chanCmd.command("remove [profile]").argument("<kind>").action(async (p, kind) => channel.cmdRemove(defaultProfile(p), kind));
|
|
161
|
+
chanCmd.command("list [profile]").action(async (p) => channel.cmdList(defaultProfile(p)));
|
|
162
|
+
// Update
|
|
163
|
+
program.command("update").description("Check for and install a newer version")
|
|
164
|
+
.option("--check", "only check; don't install")
|
|
165
|
+
.option("--yes", "apply without confirmation")
|
|
166
|
+
.action(async (opts) => runUpdate({ check: !!opts.check, yes: !!opts.yes }));
|
|
167
|
+
// Setup — idempotent first-run bootstrap. Safe to rerun. Interactive
|
|
168
|
+
// persona wizard on a TTY the first time; non-interactive otherwise.
|
|
169
|
+
program.command("setup").description("Idempotent first-run bootstrap (profile, MCP register, persona wizard, health check)")
|
|
170
|
+
.option("--profile <name>", "profile name (default: 'default')")
|
|
171
|
+
.option("--template <t>", "template: outreach|research|support|social|code|custom", "custom")
|
|
172
|
+
.option("--model <id>", "model id (default: auto)", "auto")
|
|
173
|
+
.option("--skip-mcp-register", "don't touch desktop MCP config")
|
|
174
|
+
.option("--silent", "no output")
|
|
175
|
+
.option("--interactive", "force interactive wizard even if persona exists")
|
|
176
|
+
.option("--non-interactive", "skip the wizard; just scaffold with defaults")
|
|
177
|
+
.action(async (opts) => runSetup({
|
|
178
|
+
profile: opts.profile,
|
|
179
|
+
template: opts.template,
|
|
180
|
+
model: opts.model,
|
|
181
|
+
skipMcpRegister: !!opts.skipMcpRegister,
|
|
182
|
+
silent: !!opts.silent,
|
|
183
|
+
interactive: !!opts.interactive,
|
|
184
|
+
nonInteractive: !!opts.nonInteractive,
|
|
185
|
+
}));
|
|
186
|
+
// Compact — run memory compaction (or show what would run)
|
|
187
|
+
program.command("compact [profile]")
|
|
188
|
+
.description("Compact memory (summarize old entries, prune stale cycle rows)")
|
|
189
|
+
.option("--dry-run", "show trigger state and policy without running")
|
|
190
|
+
.option("--force", "run even if no trigger fired")
|
|
191
|
+
.option("--schedule <mode>", "set schedule mode: threshold|daily|both|off")
|
|
192
|
+
.option("--threshold <frac>", "set threshold fraction (0-1), e.g. 0.75")
|
|
193
|
+
.option("--daily-at <HH:MM>", "set daily UTC time, e.g. 00:00")
|
|
194
|
+
.option("--keep <n>", "set keepRecentPerKind (int)")
|
|
195
|
+
.option("--prune-days <n>", "set pruneCycleDays (int, 0 disables)")
|
|
196
|
+
.option("--enable", "enable compaction")
|
|
197
|
+
.option("--disable", "disable compaction")
|
|
198
|
+
.action(async (p, opts) => {
|
|
199
|
+
const set = {};
|
|
200
|
+
if (opts.schedule)
|
|
201
|
+
set.schedule = opts.schedule;
|
|
202
|
+
if (opts.threshold)
|
|
203
|
+
set.threshold = Number(opts.threshold);
|
|
204
|
+
if (opts.dailyAt)
|
|
205
|
+
set.dailyAtUtc = String(opts.dailyAt);
|
|
206
|
+
if (opts.keep)
|
|
207
|
+
set.keepRecentPerKind = Number(opts.keep);
|
|
208
|
+
if (opts.pruneDays)
|
|
209
|
+
set.pruneCycleDays = Number(opts.pruneDays);
|
|
210
|
+
if (opts.enable)
|
|
211
|
+
set.enabled = true;
|
|
212
|
+
if (opts.disable)
|
|
213
|
+
set.enabled = false;
|
|
214
|
+
await runCompact({
|
|
215
|
+
profile: defaultProfile(p),
|
|
216
|
+
force: !!opts.force,
|
|
217
|
+
dryRun: !!opts.dryRun,
|
|
218
|
+
set: Object.keys(set).length > 0 ? set : undefined,
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
// Persona — view or re-run the wizard
|
|
222
|
+
program.command("persona [profile]")
|
|
223
|
+
.description("Show or edit the agent's persona (name, tone, user name, focus)")
|
|
224
|
+
.option("--edit", "re-run the interactive wizard")
|
|
225
|
+
.option("--reset", "discard current persona and start fresh")
|
|
226
|
+
.action(async (p, opts) => runPersonaCmd({ profile: p, edit: !!opts.edit, reset: !!opts.reset }));
|
|
227
|
+
// Sub-agent group
|
|
228
|
+
const subCmd = program.command("subagent").description("Sub-agent management (orchestrator + scoped helpers)");
|
|
229
|
+
subCmd.command("create <name>")
|
|
230
|
+
.description("Scaffold a sub-agent under a parent profile")
|
|
231
|
+
.requiredOption("--parent <p>", "parent profile (orchestrator)")
|
|
232
|
+
.option("--template <t>", "template (default: custom)", "custom")
|
|
233
|
+
.option("--model <id>", "model (default: auto)")
|
|
234
|
+
.option("--allowed-tools <list>", "comma-separated allowed tools")
|
|
235
|
+
.option("--disallowed-tools <list>", "comma-separated disallowed tools")
|
|
236
|
+
.option("--description <text>", "one-line purpose (seeded into SOUL.md)")
|
|
237
|
+
.action(async (name, opts) => subagent.cmdCreate({
|
|
238
|
+
name,
|
|
239
|
+
parent: opts.parent,
|
|
240
|
+
template: opts.template,
|
|
241
|
+
model: opts.model,
|
|
242
|
+
allowedTools: opts.allowedTools ? String(opts.allowedTools).split(",").map((s) => s.trim()).filter(Boolean) : undefined,
|
|
243
|
+
disallowedTools: opts.disallowedTools ? String(opts.disallowedTools).split(",").map((s) => s.trim()).filter(Boolean) : undefined,
|
|
244
|
+
description: opts.description,
|
|
245
|
+
}));
|
|
246
|
+
subCmd.command("list [parent]")
|
|
247
|
+
.description("List sub-agents under a parent (or the whole tree if omitted)")
|
|
248
|
+
.action(async (p) => subagent.cmdList(p));
|
|
249
|
+
// Delegate — orchestrators call this via Bash to hand off a task
|
|
250
|
+
program.command("delegate <subagent> <task>")
|
|
251
|
+
.description("Run one cycle on a sub-agent and stream its response text to stdout")
|
|
252
|
+
.option("--json", "output full CycleOutput JSON instead of just text")
|
|
253
|
+
.action(async (sub, task, opts) => subagent.cmdDelegate(sub, task, { json: !!opts.json }));
|
|
254
|
+
// Uninstall — full teardown.
|
|
255
|
+
program.command("uninstall").description("Remove all BajaClaw state (profiles, scheduler, MCP, memory sync)")
|
|
256
|
+
.option("--yes", "actually perform the teardown")
|
|
257
|
+
.option("--keep-data", "keep ~/.bajaclaw/ data; only remove integrations")
|
|
258
|
+
.action(async (opts) => runUninstall({ yes: !!opts.yes, keepData: !!opts.keepData }));
|
|
259
|
+
// Model — show or set per profile
|
|
260
|
+
program.command("model [value] [profile]")
|
|
261
|
+
.description("Show or set the model for a profile (no value: lists known models)")
|
|
262
|
+
.action(async (value, p) => runModel(value, { profile: p }));
|
|
263
|
+
// Effort — show or set per profile
|
|
264
|
+
program.command("effort [value] [profile]")
|
|
265
|
+
.description("Show or set the effort level (low/medium/high) for a profile")
|
|
266
|
+
.action(async (value, p) => runEffort(value, { profile: p }));
|
|
267
|
+
// Guide — print a self-setup walkthrough
|
|
268
|
+
program.command("guide [topic]")
|
|
269
|
+
.description("Print a self-setup walkthrough, or list available guides")
|
|
270
|
+
.option("--profile <name>", "profile to use for skill lookup")
|
|
271
|
+
.action(async (topic, opts) => runGuide(topic, { profile: opts.profile }));
|
|
272
|
+
// Serve — OpenAI-compatible HTTP endpoint
|
|
273
|
+
program.command("serve")
|
|
274
|
+
.description("Serve BajaClaw over an OpenAI-compatible HTTP API")
|
|
275
|
+
.option("--host <host>", "bind host (default 127.0.0.1)")
|
|
276
|
+
.option("--port <n>", "bind port (default 8765)")
|
|
277
|
+
.option("--api-key <key>", "require this bearer token (required for non-localhost bind)")
|
|
278
|
+
.option("--expose <names...>", "allowlist of profile names (default: all)")
|
|
279
|
+
.option("--stream-delay <ms>", "delay between streamed chunks (default 20)")
|
|
280
|
+
.action(async (opts) => runServe({
|
|
281
|
+
host: opts.host,
|
|
282
|
+
port: opts.port ? Number(opts.port) : undefined,
|
|
283
|
+
apiKey: opts.apiKey,
|
|
284
|
+
exposedProfiles: opts.expose,
|
|
285
|
+
streamDelayMs: opts.streamDelay ? Number(opts.streamDelay) : undefined,
|
|
286
|
+
}));
|
|
287
|
+
// Banner
|
|
288
|
+
program.command("banner").description("Print the ASCII banner").action(() => {
|
|
289
|
+
printBanner(pkg.version, { force: true });
|
|
290
|
+
});
|
|
291
|
+
program.hook("postAction", async () => {
|
|
292
|
+
// Non-blocking notice at the end of any command. Skipped for noisy or
|
|
293
|
+
// self-referential commands.
|
|
294
|
+
const cmd = process.argv[2];
|
|
295
|
+
if (cmd === "update" || cmd === "banner" || cmd === "uninstall" || cmd === "setup")
|
|
296
|
+
return;
|
|
297
|
+
await maybeNoticeAtExit();
|
|
298
|
+
});
|
|
299
|
+
program.parseAsync(process.argv).catch((e) => {
|
|
300
|
+
console.error(`error: ${e.message}`);
|
|
301
|
+
process.exit(1);
|
|
302
|
+
});
|
|
303
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function cmdAdd(profile: string, kind: "telegram" | "discord", token: string, channelId?: string): Promise<void>;
|
|
2
|
+
export declare function cmdRemove(profile: string, kind: "telegram" | "discord"): Promise<void>;
|
|
3
|
+
export declare function cmdList(profile: string): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, saveConfig } from "../config.js";
|
|
3
|
+
export async function cmdAdd(profile, kind, token, channelId) {
|
|
4
|
+
const cfg = loadConfig(profile);
|
|
5
|
+
const entry = { kind, token, channelId, allowlist: [] };
|
|
6
|
+
cfg.channels = [...(cfg.channels ?? []).filter((c) => c.kind !== kind), entry];
|
|
7
|
+
saveConfig(cfg);
|
|
8
|
+
console.log(chalk.green(`✓ added ${kind} channel to ${profile}`));
|
|
9
|
+
}
|
|
10
|
+
export async function cmdRemove(profile, kind) {
|
|
11
|
+
const cfg = loadConfig(profile);
|
|
12
|
+
cfg.channels = (cfg.channels ?? []).filter((c) => c.kind !== kind);
|
|
13
|
+
saveConfig(cfg);
|
|
14
|
+
console.log(chalk.green(`✓ removed ${kind} channel from ${profile}`));
|
|
15
|
+
}
|
|
16
|
+
export async function cmdList(profile) {
|
|
17
|
+
const cfg = loadConfig(profile);
|
|
18
|
+
const chans = cfg.channels ?? [];
|
|
19
|
+
if (chans.length === 0) {
|
|
20
|
+
console.log(chalk.dim("no channels."));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
for (const c of chans) {
|
|
24
|
+
console.log(`${chalk.bold(c.kind.padEnd(10))} token=${c.token.slice(0, 8)}…${c.channelId ? ` channelId=${c.channelId}` : ""}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAe,EAAE,IAA4B,EAAE,KAAa,EAAE,SAAkB;IAC3G,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACvE,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/E,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,eAAe,OAAO,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,IAA4B;IAC3E,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnE,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClI,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// `bajaclaw compact [profile]` — run memory compaction now.
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { openDb } from "../db.js";
|
|
4
|
+
import { loadConfig, saveConfig } from "../config.js";
|
|
5
|
+
import { compact, shouldCompact, mergeCompactionDefaults } from "../memory/compact.js";
|
|
6
|
+
import { Logger } from "../logger.js";
|
|
7
|
+
export async function runCompact(opts) {
|
|
8
|
+
const cfg = loadConfig(opts.profile);
|
|
9
|
+
if (opts.set) {
|
|
10
|
+
const next = { ...mergeCompactionDefaults(cfg.compaction), ...opts.set };
|
|
11
|
+
cfg.compaction = next;
|
|
12
|
+
saveConfig(cfg);
|
|
13
|
+
console.log(chalk.green(`✓ saved compaction policy for ${opts.profile}`));
|
|
14
|
+
printPolicy(next);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const db = openDb(opts.profile);
|
|
18
|
+
const log = new Logger(opts.profile);
|
|
19
|
+
try {
|
|
20
|
+
if (opts.dryRun) {
|
|
21
|
+
const decision = shouldCompact(db, cfg.compaction);
|
|
22
|
+
const row = db
|
|
23
|
+
.prepare("SELECT COUNT(*) AS n, COALESCE(SUM(LENGTH(content)), 0) AS s FROM memories")
|
|
24
|
+
.get();
|
|
25
|
+
const policy = mergeCompactionDefaults(cfg.compaction);
|
|
26
|
+
console.log(chalk.bold(`compaction (${opts.profile})`));
|
|
27
|
+
printPolicy(policy);
|
|
28
|
+
console.log("");
|
|
29
|
+
console.log(` memories: ${row.n.toLocaleString()}`);
|
|
30
|
+
console.log(` pool size: ${row.s.toLocaleString()} chars`);
|
|
31
|
+
console.log(` would run: ${decision.yes ? chalk.green("yes") : chalk.dim("no")} ${chalk.dim(decision.reason)}`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!opts.force) {
|
|
35
|
+
const decision = shouldCompact(db, cfg.compaction);
|
|
36
|
+
if (!decision.yes) {
|
|
37
|
+
console.log(chalk.dim(`no trigger — ${decision.reason}. Use --force to run anyway.`));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.dim(`trigger: ${decision.reason}`));
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk.cyan("compacting…"));
|
|
43
|
+
const r = await compact(db, cfg.compaction, log);
|
|
44
|
+
console.log(chalk.green(`✓ compacted in ${r.durationMs}ms`));
|
|
45
|
+
console.log(` memories: ${r.memoriesBefore.toLocaleString()} → ${r.memoriesAfter.toLocaleString()}`);
|
|
46
|
+
console.log(` cycles pruned: ${r.cyclesPruned.toLocaleString()}`);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
db.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function printPolicy(p) {
|
|
53
|
+
console.log(chalk.dim(" enabled: ") + (p.enabled ? "yes" : "no"));
|
|
54
|
+
console.log(chalk.dim(" schedule: ") + p.schedule);
|
|
55
|
+
console.log(chalk.dim(" threshold: ") + `${Math.round(p.threshold * 100)}% of 200k-token context window`);
|
|
56
|
+
console.log(chalk.dim(" daily at: ") + `${p.dailyAtUtc} UTC`);
|
|
57
|
+
console.log(chalk.dim(" keep per kind: ") + String(p.keepRecentPerKind));
|
|
58
|
+
console.log(chalk.dim(" prune cycles >: ") + `${p.pruneCycleDays} days`);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=compact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function cmdStart(profile: string, foreground?: boolean): Promise<void>;
|
|
2
|
+
export declare function cmdStop(profile: string): Promise<void>;
|
|
3
|
+
export declare function cmdStatus(profile: string): Promise<void>;
|
|
4
|
+
export declare function cmdLogs(profile: string, lines?: number): Promise<void>;
|
|
5
|
+
export declare function cmdRestart(profile: string): Promise<void>;
|
|
6
|
+
export declare function cmdInstall(profile: string): Promise<void>;
|
|
7
|
+
export declare function cmdRun(profile: string): Promise<void>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { writeFileSync, readFileSync, existsSync, unlinkSync, openSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import { profileDir, ensureDir } from "../paths.js";
|
|
7
|
+
import { Logger } from "../logger.js";
|
|
8
|
+
import { pickAdapter } from "../scheduler/index.js";
|
|
9
|
+
import { runCycle } from "../agent.js";
|
|
10
|
+
import { openDb } from "../db.js";
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
// __dirname is <repo>/src/commands (tsx) or <repo>/dist/commands (built).
|
|
13
|
+
const LAUNCHER = join(__dirname, "..", "..", "bin", "bajaclaw.js");
|
|
14
|
+
function pidPath(profile) {
|
|
15
|
+
return join(profileDir(profile), "daemon.pid");
|
|
16
|
+
}
|
|
17
|
+
function logPath(profile) {
|
|
18
|
+
return join(profileDir(profile), "daemon.log");
|
|
19
|
+
}
|
|
20
|
+
export async function cmdStart(profile, foreground = false) {
|
|
21
|
+
const pidFile = pidPath(profile);
|
|
22
|
+
if (existsSync(pidFile)) {
|
|
23
|
+
const pid = Number(readFileSync(pidFile, "utf8").trim());
|
|
24
|
+
if (pid && isRunning(pid)) {
|
|
25
|
+
console.log(chalk.yellow(`daemon already running (pid ${pid})`));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
unlinkSync(pidFile);
|
|
29
|
+
}
|
|
30
|
+
ensureDir(profileDir(profile));
|
|
31
|
+
if (foreground)
|
|
32
|
+
return runLoop(profile);
|
|
33
|
+
const bin = process.execPath;
|
|
34
|
+
const out = openSync(logPath(profile), "a");
|
|
35
|
+
const child = spawn(bin, [LAUNCHER, "daemon", "run", profile], {
|
|
36
|
+
detached: true,
|
|
37
|
+
stdio: ["ignore", out, out],
|
|
38
|
+
env: { ...process.env, BAJACLAW_DAEMON: "1" },
|
|
39
|
+
});
|
|
40
|
+
writeFileSync(pidFile, String(child.pid));
|
|
41
|
+
child.unref();
|
|
42
|
+
console.log(chalk.green(`✓ daemon started (pid ${child.pid}). logs: ${logPath(profile)}`));
|
|
43
|
+
}
|
|
44
|
+
export async function cmdStop(profile) {
|
|
45
|
+
const pidFile = pidPath(profile);
|
|
46
|
+
if (!existsSync(pidFile)) {
|
|
47
|
+
console.log(chalk.dim("no pid file — daemon not running?"));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const pid = Number(readFileSync(pidFile, "utf8").trim());
|
|
51
|
+
try {
|
|
52
|
+
process.kill(pid, "SIGTERM");
|
|
53
|
+
}
|
|
54
|
+
catch { /* already gone */ }
|
|
55
|
+
unlinkSync(pidFile);
|
|
56
|
+
console.log(chalk.green(`✓ stopped pid ${pid}`));
|
|
57
|
+
}
|
|
58
|
+
export async function cmdStatus(profile) {
|
|
59
|
+
const pidFile = pidPath(profile);
|
|
60
|
+
if (!existsSync(pidFile)) {
|
|
61
|
+
console.log(chalk.dim("stopped"));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const pid = Number(readFileSync(pidFile, "utf8").trim());
|
|
65
|
+
console.log(isRunning(pid) ? chalk.green(`running (pid ${pid})`) : chalk.yellow(`stale pid ${pid}`));
|
|
66
|
+
}
|
|
67
|
+
export async function cmdLogs(profile, lines = 50) {
|
|
68
|
+
const p = logPath(profile);
|
|
69
|
+
if (!existsSync(p)) {
|
|
70
|
+
console.log(chalk.dim("no logs yet."));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const body = readFileSync(p, "utf8");
|
|
74
|
+
const split = body.split(/\r?\n/);
|
|
75
|
+
console.log(split.slice(-lines).join("\n"));
|
|
76
|
+
}
|
|
77
|
+
export async function cmdRestart(profile) {
|
|
78
|
+
await cmdStop(profile).catch(() => undefined);
|
|
79
|
+
await cmdStart(profile);
|
|
80
|
+
}
|
|
81
|
+
export async function cmdInstall(profile) {
|
|
82
|
+
const adapter = pickAdapter();
|
|
83
|
+
await adapter.install(profile, "heartbeat", "*/15 * * * *", [process.execPath, LAUNCHER, "start", profile]);
|
|
84
|
+
console.log(chalk.green(`✓ installed heartbeat for ${profile}`));
|
|
85
|
+
}
|
|
86
|
+
export async function cmdRun(profile) {
|
|
87
|
+
// Foreground supervisor: runs loop, restarts on crash with exponential backoff.
|
|
88
|
+
await runLoop(profile);
|
|
89
|
+
}
|
|
90
|
+
async function runLoop(profile) {
|
|
91
|
+
const log = new Logger(profile);
|
|
92
|
+
let backoff = 1000;
|
|
93
|
+
const maxBackoff = 5 * 60 * 1000;
|
|
94
|
+
log.info("daemon.start", { pid: process.pid });
|
|
95
|
+
process.on("SIGTERM", () => { log.info("daemon.sigterm"); process.exit(0); });
|
|
96
|
+
process.on("SIGINT", () => { log.info("daemon.sigint"); process.exit(0); });
|
|
97
|
+
// Simple loop: check for due schedules + pending tasks every 30s.
|
|
98
|
+
while (true) {
|
|
99
|
+
try {
|
|
100
|
+
const db = openDb(profile);
|
|
101
|
+
const pending = db.prepare("SELECT COUNT(*) c FROM tasks WHERE status='pending'").get();
|
|
102
|
+
db.close();
|
|
103
|
+
if (pending.c > 0) {
|
|
104
|
+
await runCycle({ profile });
|
|
105
|
+
}
|
|
106
|
+
backoff = 1000;
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
log.error("daemon.loop.err", { error: e.message });
|
|
110
|
+
await sleep(backoff);
|
|
111
|
+
backoff = Math.min(backoff * 2, maxBackoff);
|
|
112
|
+
}
|
|
113
|
+
// Poll once a minute. Idle daemon = zero backend calls.
|
|
114
|
+
await sleep(60_000);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function sleep(ms) { return new Promise((r) => setTimeout(r, ms)); }
|
|
118
|
+
function isRunning(pid) {
|
|
119
|
+
if (!pid)
|
|
120
|
+
return false;
|
|
121
|
+
try {
|
|
122
|
+
process.kill(pid, 0);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,0EAA0E;AAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AAEnE,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AACD,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,GAAG,GAAG,CAAC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,UAAU,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/B,IAAI,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE;QAC7D,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC;QAC3B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;KAC9C,CAAC,CAAC;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,KAAK,CAAC,GAAG,YAAY,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAClG,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClE,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,KAAK,GAAG,EAAE;IACvD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACvE,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAe;IAC1C,gFAAgF;IAChF,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACjC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,kEAAkE;IAClE,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAmB,CAAC;YACzG,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;QACD,wDAAwD;QACxD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,IAAmB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3F,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runDashboard(profile: string): Promise<void>;
|