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.
Files changed (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +639 -0
  3. package/bin/bajaclaw.js +35 -0
  4. package/bin/create-bajaclaw.js +17 -0
  5. package/dist/agent.d.ts +29 -0
  6. package/dist/agent.js +231 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/api/server.d.ts +15 -0
  9. package/dist/api/server.js +215 -0
  10. package/dist/api/server.js.map +1 -0
  11. package/dist/api/translate.d.ts +61 -0
  12. package/dist/api/translate.js +109 -0
  13. package/dist/api/translate.js.map +1 -0
  14. package/dist/banner.d.ts +7 -0
  15. package/dist/banner.js +31 -0
  16. package/dist/banner.js.map +1 -0
  17. package/dist/channels/gateway.d.ts +1 -0
  18. package/dist/channels/gateway.js +76 -0
  19. package/dist/channels/gateway.js.map +1 -0
  20. package/dist/claude.d.ts +9 -0
  21. package/dist/claude.js +170 -0
  22. package/dist/claude.js.map +1 -0
  23. package/dist/cli.d.ts +2 -0
  24. package/dist/cli.js +303 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/commands/channel.d.ts +3 -0
  27. package/dist/commands/channel.js +27 -0
  28. package/dist/commands/channel.js.map +1 -0
  29. package/dist/commands/compact.d.ts +8 -0
  30. package/dist/commands/compact.js +60 -0
  31. package/dist/commands/compact.js.map +1 -0
  32. package/dist/commands/daemon.d.ts +7 -0
  33. package/dist/commands/daemon.js +129 -0
  34. package/dist/commands/daemon.js.map +1 -0
  35. package/dist/commands/dashboard.d.ts +1 -0
  36. package/dist/commands/dashboard.js +78 -0
  37. package/dist/commands/dashboard.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +1 -0
  39. package/dist/commands/doctor.js +25 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/dry-run.d.ts +1 -0
  42. package/dist/commands/dry-run.js +5 -0
  43. package/dist/commands/dry-run.js.map +1 -0
  44. package/dist/commands/effort.d.ts +6 -0
  45. package/dist/commands/effort.js +33 -0
  46. package/dist/commands/effort.js.map +1 -0
  47. package/dist/commands/guide.d.ts +4 -0
  48. package/dist/commands/guide.js +52 -0
  49. package/dist/commands/guide.js.map +1 -0
  50. package/dist/commands/health.d.ts +1 -0
  51. package/dist/commands/health.js +20 -0
  52. package/dist/commands/health.js.map +1 -0
  53. package/dist/commands/init.d.ts +12 -0
  54. package/dist/commands/init.js +114 -0
  55. package/dist/commands/init.js.map +1 -0
  56. package/dist/commands/mcp.d.ts +9 -0
  57. package/dist/commands/mcp.js +63 -0
  58. package/dist/commands/mcp.js.map +1 -0
  59. package/dist/commands/migrate.d.ts +1 -0
  60. package/dist/commands/migrate.js +58 -0
  61. package/dist/commands/migrate.js.map +1 -0
  62. package/dist/commands/model.d.ts +5 -0
  63. package/dist/commands/model.js +31 -0
  64. package/dist/commands/model.js.map +1 -0
  65. package/dist/commands/persona.d.ts +6 -0
  66. package/dist/commands/persona.js +67 -0
  67. package/dist/commands/persona.js.map +1 -0
  68. package/dist/commands/port.d.ts +15 -0
  69. package/dist/commands/port.js +88 -0
  70. package/dist/commands/port.js.map +1 -0
  71. package/dist/commands/profile.d.ts +4 -0
  72. package/dist/commands/profile.js +41 -0
  73. package/dist/commands/profile.js.map +1 -0
  74. package/dist/commands/serve.d.ts +14 -0
  75. package/dist/commands/serve.js +62 -0
  76. package/dist/commands/serve.js.map +1 -0
  77. package/dist/commands/setup.d.ts +17 -0
  78. package/dist/commands/setup.js +228 -0
  79. package/dist/commands/setup.js.map +1 -0
  80. package/dist/commands/skill.d.ts +7 -0
  81. package/dist/commands/skill.js +137 -0
  82. package/dist/commands/skill.js.map +1 -0
  83. package/dist/commands/start.d.ts +6 -0
  84. package/dist/commands/start.js +25 -0
  85. package/dist/commands/start.js.map +1 -0
  86. package/dist/commands/status.d.ts +1 -0
  87. package/dist/commands/status.js +35 -0
  88. package/dist/commands/status.js.map +1 -0
  89. package/dist/commands/subagent.d.ts +14 -0
  90. package/dist/commands/subagent.js +173 -0
  91. package/dist/commands/subagent.js.map +1 -0
  92. package/dist/commands/trigger.d.ts +1 -0
  93. package/dist/commands/trigger.js +13 -0
  94. package/dist/commands/trigger.js.map +1 -0
  95. package/dist/commands/uninstall.d.ts +5 -0
  96. package/dist/commands/uninstall.js +165 -0
  97. package/dist/commands/uninstall.js.map +1 -0
  98. package/dist/commands/update.d.ts +7 -0
  99. package/dist/commands/update.js +49 -0
  100. package/dist/commands/update.js.map +1 -0
  101. package/dist/concurrency.d.ts +1 -0
  102. package/dist/concurrency.js +17 -0
  103. package/dist/concurrency.js.map +1 -0
  104. package/dist/config.d.ts +5 -0
  105. package/dist/config.js +42 -0
  106. package/dist/config.js.map +1 -0
  107. package/dist/db.d.ts +3 -0
  108. package/dist/db.js +124 -0
  109. package/dist/db.js.map +1 -0
  110. package/dist/delegation.d.ts +6 -0
  111. package/dist/delegation.js +21 -0
  112. package/dist/delegation.js.map +1 -0
  113. package/dist/health-check.d.ts +6 -0
  114. package/dist/health-check.js +38 -0
  115. package/dist/health-check.js.map +1 -0
  116. package/dist/logger.d.ts +11 -0
  117. package/dist/logger.js +53 -0
  118. package/dist/logger.js.map +1 -0
  119. package/dist/mcp/consumer.d.ts +15 -0
  120. package/dist/mcp/consumer.js +74 -0
  121. package/dist/mcp/consumer.js.map +1 -0
  122. package/dist/mcp/server.d.ts +6 -0
  123. package/dist/mcp/server.js +260 -0
  124. package/dist/mcp/server.js.map +1 -0
  125. package/dist/memory/claude-compat.d.ts +4 -0
  126. package/dist/memory/claude-compat.js +56 -0
  127. package/dist/memory/claude-compat.js.map +1 -0
  128. package/dist/memory/compact.d.ts +25 -0
  129. package/dist/memory/compact.js +195 -0
  130. package/dist/memory/compact.js.map +1 -0
  131. package/dist/memory/extract.d.ts +3 -0
  132. package/dist/memory/extract.js +56 -0
  133. package/dist/memory/extract.js.map +1 -0
  134. package/dist/memory/recall.d.ts +5 -0
  135. package/dist/memory/recall.js +47 -0
  136. package/dist/memory/recall.js.map +1 -0
  137. package/dist/model-picker.d.ts +33 -0
  138. package/dist/model-picker.js +104 -0
  139. package/dist/model-picker.js.map +1 -0
  140. package/dist/paths.d.ts +12 -0
  141. package/dist/paths.js +49 -0
  142. package/dist/paths.js.map +1 -0
  143. package/dist/persona-io.d.ts +5 -0
  144. package/dist/persona-io.js +29 -0
  145. package/dist/persona-io.js.map +1 -0
  146. package/dist/persona.d.ts +12 -0
  147. package/dist/persona.js +54 -0
  148. package/dist/persona.js.map +1 -0
  149. package/dist/prompt.d.ts +5 -0
  150. package/dist/prompt.js +56 -0
  151. package/dist/prompt.js.map +1 -0
  152. package/dist/safety.d.ts +17 -0
  153. package/dist/safety.js +47 -0
  154. package/dist/safety.js.map +1 -0
  155. package/dist/scheduler/cron.d.ts +4 -0
  156. package/dist/scheduler/cron.js +44 -0
  157. package/dist/scheduler/cron.js.map +1 -0
  158. package/dist/scheduler/index.d.ts +7 -0
  159. package/dist/scheduler/index.js +15 -0
  160. package/dist/scheduler/index.js.map +1 -0
  161. package/dist/scheduler/launchd.d.ts +4 -0
  162. package/dist/scheduler/launchd.js +73 -0
  163. package/dist/scheduler/launchd.js.map +1 -0
  164. package/dist/scheduler/schtasks.d.ts +4 -0
  165. package/dist/scheduler/schtasks.js +45 -0
  166. package/dist/scheduler/schtasks.js.map +1 -0
  167. package/dist/scheduler/systemd.d.ts +5 -0
  168. package/dist/scheduler/systemd.js +86 -0
  169. package/dist/scheduler/systemd.js.map +1 -0
  170. package/dist/self-improve.d.ts +4 -0
  171. package/dist/self-improve.js +48 -0
  172. package/dist/self-improve.js.map +1 -0
  173. package/dist/skills/auto-skiller.d.ts +21 -0
  174. package/dist/skills/auto-skiller.js +156 -0
  175. package/dist/skills/auto-skiller.js.map +1 -0
  176. package/dist/skills/loader.d.ts +3 -0
  177. package/dist/skills/loader.js +127 -0
  178. package/dist/skills/loader.js.map +1 -0
  179. package/dist/skills/matcher.d.ts +2 -0
  180. package/dist/skills/matcher.js +27 -0
  181. package/dist/skills/matcher.js.map +1 -0
  182. package/dist/skills/porter.d.ts +27 -0
  183. package/dist/skills/porter.js +109 -0
  184. package/dist/skills/porter.js.map +1 -0
  185. package/dist/types.d.ts +110 -0
  186. package/dist/types.js +2 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/updater.d.ts +25 -0
  189. package/dist/updater.js +185 -0
  190. package/dist/updater.js.map +1 -0
  191. package/package.json +53 -0
  192. package/scripts/postinstall.js +33 -0
  193. package/skills/configure-effort/SKILL.md +36 -0
  194. package/skills/configure-model/SKILL.md +41 -0
  195. package/skills/configure-tools/SKILL.md +51 -0
  196. package/skills/daily-briefing/SKILL.md +19 -0
  197. package/skills/delegate-to-subagent/SKILL.md +63 -0
  198. package/skills/email-triage/SKILL.md +21 -0
  199. package/skills/setup-api/SKILL.md +115 -0
  200. package/skills/setup-compaction/SKILL.md +102 -0
  201. package/skills/setup-daemon/SKILL.md +49 -0
  202. package/skills/setup-dashboard/SKILL.md +39 -0
  203. package/skills/setup-discord/SKILL.md +54 -0
  204. package/skills/setup-heartbeat/SKILL.md +51 -0
  205. package/skills/setup-mcp-port/SKILL.md +54 -0
  206. package/skills/setup-memory-sync/SKILL.md +45 -0
  207. package/skills/setup-profile/SKILL.md +44 -0
  208. package/skills/setup-self-update/SKILL.md +45 -0
  209. package/skills/setup-subagent/SKILL.md +102 -0
  210. package/skills/setup-telegram/SKILL.md +54 -0
  211. package/skills/setup-uninstall/SKILL.md +55 -0
  212. package/skills/web-research/SKILL.md +20 -0
  213. package/templates/code/AGENT.md +15 -0
  214. package/templates/code/HEARTBEAT.md +11 -0
  215. package/templates/code/SOUL.md +10 -0
  216. package/templates/code/bajaclaw.config.json +5 -0
  217. package/templates/code/scripts/launch.bat +4 -0
  218. package/templates/code/scripts/launch.sh +4 -0
  219. package/templates/custom/AGENT.md +14 -0
  220. package/templates/custom/HEARTBEAT.md +11 -0
  221. package/templates/custom/SOUL.md +10 -0
  222. package/templates/custom/bajaclaw.config.json +5 -0
  223. package/templates/custom/scripts/launch.bat +4 -0
  224. package/templates/custom/scripts/launch.sh +4 -0
  225. package/templates/outreach/AGENT.md +11 -0
  226. package/templates/outreach/HEARTBEAT.md +11 -0
  227. package/templates/outreach/SOUL.md +10 -0
  228. package/templates/outreach/bajaclaw.config.json +5 -0
  229. package/templates/outreach/scripts/launch.bat +4 -0
  230. package/templates/outreach/scripts/launch.sh +4 -0
  231. package/templates/research/AGENT.md +27 -0
  232. package/templates/research/HEARTBEAT.md +11 -0
  233. package/templates/research/SOUL.md +10 -0
  234. package/templates/research/bajaclaw.config.json +5 -0
  235. package/templates/research/scripts/launch.bat +4 -0
  236. package/templates/research/scripts/launch.sh +4 -0
  237. package/templates/social/AGENT.md +10 -0
  238. package/templates/social/HEARTBEAT.md +11 -0
  239. package/templates/social/SOUL.md +10 -0
  240. package/templates/social/bajaclaw.config.json +5 -0
  241. package/templates/social/scripts/launch.bat +4 -0
  242. package/templates/social/scripts/launch.sh +4 -0
  243. package/templates/support/AGENT.md +10 -0
  244. package/templates/support/HEARTBEAT.md +11 -0
  245. package/templates/support/SOUL.md +10 -0
  246. package/templates/support/bajaclaw.config.json +5 -0
  247. package/templates/support/scripts/launch.bat +4 -0
  248. package/templates/support/scripts/launch.sh +4 -0
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ // npx create-bajaclaw [name] — bootstrap BajaClaw.
3
+ // With no args: runs `bajaclaw setup` to create the default profile.
4
+ // With a name: runs `bajaclaw init <name>` to scaffold that specific profile.
5
+ import { spawnSync } from "node:child_process";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ const launcher = join(__dirname, "bajaclaw.js");
11
+
12
+ const userArgs = process.argv.slice(2);
13
+ const firstIsFlag = userArgs[0]?.startsWith("-");
14
+ const cmd = !userArgs[0] || firstIsFlag ? ["setup", ...userArgs] : ["init", ...userArgs];
15
+
16
+ const r = spawnSync(process.execPath, [launcher, ...cmd], { stdio: "inherit" });
17
+ process.exit(r.status ?? 1);
@@ -0,0 +1,29 @@
1
+ import type { AgentConfig } from "./types.js";
2
+ export interface CycleInput {
3
+ profile: string;
4
+ task?: string;
5
+ dryRun?: boolean;
6
+ modelOverride?: string;
7
+ }
8
+ export interface CycleOutput {
9
+ cycleId: number;
10
+ ok: boolean;
11
+ text: string;
12
+ costUsd?: number;
13
+ durationMs: number;
14
+ dryRun?: boolean;
15
+ prompt: string;
16
+ command?: string[];
17
+ error?: string;
18
+ }
19
+ export declare function runCycle(input: CycleInput): Promise<CycleOutput>;
20
+ interface AssembleInput {
21
+ task: string;
22
+ memories: string;
23
+ agentMd: string;
24
+ soulMd: string;
25
+ heartbeat: string;
26
+ skills: string;
27
+ }
28
+ export declare function assemblePrompt(input: AssembleInput): string;
29
+ export type { AgentConfig };
package/dist/agent.js ADDED
@@ -0,0 +1,231 @@
1
+ // 13-step cycle loop.
2
+ // Steps:
3
+ // 1. Load profile config
4
+ // 2. Open DB + check schema
5
+ // 3. Circuit-breaker + rate-limit gate
6
+ // 4. Select task from queue or heartbeat trigger
7
+ // 5. Recall relevant memories (FTS5)
8
+ // 6. Load AGENT.md, SOUL.md, HEARTBEAT.md
9
+ // 7. Match skills against task, inject top N
10
+ // 8. Build MCP config for subprocess
11
+ // 9. Assemble final prompt
12
+ // 10. Invoke the CLI backend (print mode, JSON output)
13
+ // 11. Parse response, persist cycle row
14
+ // 12. Extract durable memories (post-cycle)
15
+ // 13. Dispatch follow-up actions (channel replies, queued tasks, self-improve reflection)
16
+ import { readFileSync, existsSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { loadConfig } from "./config.js";
19
+ import { openDb } from "./db.js";
20
+ import { Logger } from "./logger.js";
21
+ import { runOnce } from "./claude.js";
22
+ import { profileDir } from "./paths.js";
23
+ import { shouldAllow, rateLimit, recordFailure, recordSuccess } from "./safety.js";
24
+ import { recall } from "./memory/recall.js";
25
+ import { extract } from "./memory/extract.js";
26
+ import { syncFromClaude } from "./memory/claude-compat.js";
27
+ import { shouldCompact, compact as compactMemory } from "./memory/compact.js";
28
+ import { loadAllSkills } from "./skills/loader.js";
29
+ import { matchSkills } from "./skills/matcher.js";
30
+ import { synthesize as synthesizeSkill } from "./skills/auto-skiller.js";
31
+ import { buildMcpConfig } from "./mcp/consumer.js";
32
+ import { pickModel, budgetFor } from "./model-picker.js";
33
+ import { serialize } from "./concurrency.js";
34
+ export async function runCycle(input) {
35
+ // Serialize cycles per-profile within this process. Prevents the HTTP
36
+ // API from spawning parallel `claude` subprocesses under load.
37
+ return serialize(input.profile, () => runCycleInner(input));
38
+ }
39
+ async function runCycleInner(input) {
40
+ const cfg = loadConfig(input.profile);
41
+ const db = openDb(input.profile);
42
+ const log = new Logger(input.profile);
43
+ const started = new Date().toISOString();
44
+ try {
45
+ const gate = shouldAllow(db);
46
+ if (!gate.allow)
47
+ throw new Error(gate.reason ?? "breaker");
48
+ const limit = rateLimit(db);
49
+ if (!limit.allow)
50
+ throw new Error(`rate limit exceeded (${limit.used}/hr)`);
51
+ const heartbeatDefault = "Heartbeat check. Review state, note anything worth action, and return a brief summary.";
52
+ const task = input.task ?? popTask(db) ?? heartbeatDefault;
53
+ const isHeartbeat = task === heartbeatDefault;
54
+ if (cfg.memorySync)
55
+ syncFromClaude(db, log);
56
+ // Memory compaction. Cheap pre-cycle check; heavy work only if a
57
+ // trigger fires (size > threshold × context window, or daily UTC
58
+ // time passed since last compaction). Skipped on dry runs so
59
+ // --dry-run never spawns extract/summarize backend calls.
60
+ if (!input.dryRun) {
61
+ const decision = shouldCompact(db, cfg.compaction);
62
+ if (decision.yes) {
63
+ log.info("compact.trigger", { reason: decision.reason });
64
+ try {
65
+ const r = await compactMemory(db, cfg.compaction, log);
66
+ log.info("compact.done", {
67
+ before: r.memoriesBefore,
68
+ after: r.memoriesAfter,
69
+ cyclesPruned: r.cyclesPruned,
70
+ durationMs: r.durationMs,
71
+ });
72
+ }
73
+ catch (e) {
74
+ log.warn("compact.fail", { error: e.message });
75
+ }
76
+ }
77
+ }
78
+ // Pick the model. Per-request override wins over profile config.
79
+ const effectiveModel = input.modelOverride ?? cfg.model;
80
+ const picked = pickModel({
81
+ configuredModel: effectiveModel,
82
+ task,
83
+ source: isHeartbeat ? "heartbeat" : undefined,
84
+ });
85
+ const budget = budgetFor(picked.tier);
86
+ // Tiered context: trivial cycles get less prompt, opus cycles get more.
87
+ const memories = recall(db, task, budget.memoryCount);
88
+ const systemDocs = loadSystemDocs(input.profile);
89
+ const allSkills = loadAllSkills(input.profile);
90
+ const matched = matchSkills(allSkills, task, budget.skillCount);
91
+ const mcpConfig = buildMcpConfig(input.profile);
92
+ const prompt = assemblePrompt({
93
+ task,
94
+ memories: memories
95
+ .map((m) => `- [${m.kind}] ${m.content.slice(0, budget.memoryCharsEach)}`)
96
+ .join("\n"),
97
+ agentMd: systemDocs.agent,
98
+ soulMd: systemDocs.soul,
99
+ heartbeat: isHeartbeat ? systemDocs.heartbeat : "",
100
+ skills: matched
101
+ .map((s) => `## Skill: ${s.name}\n${s.body}`)
102
+ .join("\n\n"),
103
+ });
104
+ const cycleId = insertCycle(db, {
105
+ started_at: started,
106
+ status: "running",
107
+ task,
108
+ prompt_preview: prompt.slice(0, 300),
109
+ });
110
+ log.info("cycle.start", {
111
+ cycleId,
112
+ task: task.slice(0, 80),
113
+ model: picked.model,
114
+ tier: picked.tier,
115
+ reason: picked.reason,
116
+ });
117
+ // maxTurns is the min of the budget and the user's configured cap.
118
+ const effectiveMaxTurns = Math.min(cfg.maxTurns ?? 10, budget.maxTurns);
119
+ const opts = {
120
+ model: picked.model,
121
+ effort: cfg.effort,
122
+ maxTurns: effectiveMaxTurns,
123
+ allowedTools: cfg.allowedTools,
124
+ disallowedTools: cfg.disallowedTools,
125
+ mcpConfig,
126
+ workdir: profileDir(input.profile),
127
+ printMode: true,
128
+ dryRun: input.dryRun,
129
+ };
130
+ const result = await runOnce(prompt, opts);
131
+ const finished = new Date().toISOString();
132
+ if (!result.ok) {
133
+ recordFailure(db);
134
+ db.prepare("UPDATE cycles SET finished_at=?, status=?, error=?, response_preview=? WHERE id=?").run(finished, "error", result.error ?? "unknown", result.text.slice(0, 500), cycleId);
135
+ log.error("cycle.fail", { cycleId, error: result.error });
136
+ return {
137
+ cycleId,
138
+ ok: false,
139
+ text: result.text,
140
+ durationMs: result.durationMs,
141
+ prompt,
142
+ command: result.command,
143
+ error: result.error,
144
+ };
145
+ }
146
+ recordSuccess(db);
147
+ db.prepare("UPDATE cycles SET finished_at=?, status=?, response_preview=?, cost_usd=?, input_tokens=?, output_tokens=?, turns=? WHERE id=?").run(finished, "ok", result.text.slice(0, 300), result.costUsd ?? null, result.inputTokens ?? null, result.outputTokens ?? null, result.turns ?? null, cycleId);
148
+ // Post-cycle memory extraction + auto-skill synthesis. Both are extra
149
+ // backend calls — skip them on cheap (Haiku) cycles and on trivially
150
+ // short responses to keep token usage tight.
151
+ const shouldDoPostWork = !result.dryRun && result.text.length >= 120 && picked.tier !== "haiku";
152
+ if (shouldDoPostWork) {
153
+ try {
154
+ await extract(db, cycleId, task, result.text, cfg);
155
+ }
156
+ catch (e) {
157
+ log.warn("memory.extract.fail", { error: e.message });
158
+ }
159
+ try {
160
+ const as = await synthesizeSkill({
161
+ cycleId,
162
+ task,
163
+ response: result.text,
164
+ events: result.events,
165
+ cfg: cfg.autoSkill,
166
+ }, log);
167
+ if (as.wrote)
168
+ log.info("auto-skill.wrote", { path: as.wrote, cycleId });
169
+ }
170
+ catch (e) {
171
+ log.warn("auto-skill.fail", { error: e.message });
172
+ }
173
+ }
174
+ log.info("cycle.ok", { cycleId, costUsd: result.costUsd, turns: result.turns });
175
+ return {
176
+ cycleId,
177
+ ok: true,
178
+ text: result.text,
179
+ costUsd: result.costUsd,
180
+ durationMs: result.durationMs,
181
+ dryRun: result.dryRun,
182
+ prompt,
183
+ command: result.command,
184
+ };
185
+ }
186
+ finally {
187
+ db.close();
188
+ }
189
+ }
190
+ function popTask(db) {
191
+ const row = db.prepare("SELECT id, body FROM tasks WHERE status='pending' ORDER BY CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END, created_at ASC LIMIT 1").get();
192
+ if (!row)
193
+ return null;
194
+ db.prepare("UPDATE tasks SET status='running' WHERE id=?").run(row.id);
195
+ return row.body;
196
+ }
197
+ function insertCycle(db, c) {
198
+ const info = db.prepare("INSERT INTO cycles(started_at,status,task,prompt_preview) VALUES(?,?,?,?)").run(c.started_at, c.status, c.task, c.prompt_preview);
199
+ return info.lastInsertRowid;
200
+ }
201
+ function loadSystemDocs(profile) {
202
+ const dir = profileDir(profile);
203
+ const read = (name) => {
204
+ const p = join(dir, name);
205
+ return existsSync(p) ? readFileSync(p, "utf8") : "";
206
+ };
207
+ // AGENT.md is the canonical name. Fall back to the older CLAUDE.md for
208
+ // migrated profiles.
209
+ const agent = read("AGENT.md") || read("CLAUDE.md");
210
+ return {
211
+ agent,
212
+ soul: read("SOUL.md"),
213
+ heartbeat: read("HEARTBEAT.md"),
214
+ };
215
+ }
216
+ export function assemblePrompt(input) {
217
+ const sections = [];
218
+ if (input.soulMd.trim())
219
+ sections.push(`# Agent Identity\n${input.soulMd.trim()}`);
220
+ if (input.agentMd.trim())
221
+ sections.push(`# Operating Guide\n${input.agentMd.trim()}`);
222
+ if (input.heartbeat.trim())
223
+ sections.push(`# Heartbeat Schedule\n${input.heartbeat.trim()}`);
224
+ if (input.memories.trim())
225
+ sections.push(`# Recalled Memories\n${input.memories.trim()}`);
226
+ if (input.skills.trim())
227
+ sections.push(`# Active Skills\n${input.skills.trim()}`);
228
+ sections.push(`# Current Task\n${input.task.trim()}`);
229
+ return sections.join("\n\n---\n\n");
230
+ }
231
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type Server } from "node:http";
2
+ export interface ApiConfig {
3
+ host?: string;
4
+ port?: number;
5
+ apiKey?: string | null;
6
+ exposedProfiles?: string[];
7
+ streamDelayMs?: number;
8
+ }
9
+ export interface ServeOptions extends ApiConfig {
10
+ onReady?: (addr: {
11
+ host: string;
12
+ port: number;
13
+ }) => void;
14
+ }
15
+ export declare function serveApi(opts?: ServeOptions): Server;
@@ -0,0 +1,215 @@
1
+ // HTTP server exposing BajaClaw as an OpenAI-compatible API.
2
+ //
3
+ // Endpoints:
4
+ // GET /health
5
+ // GET /v1/models — lists exposed profiles as models
6
+ // POST /v1/chat/completions — OpenAI chat (stream + non-stream)
7
+ // POST /v1/bajaclaw/cycle — native: { profile, task } -> full CycleOutput
8
+ // POST /v1/bajaclaw/tasks — native: enqueue without waiting
9
+ //
10
+ // Auth: if config.api.apiKey is set, require `Authorization: Bearer <key>`.
11
+ // Bind: defaults to 127.0.0.1 unless config.api.host is explicit.
12
+ import { createServer, } from "node:http";
13
+ import { existsSync, readdirSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { bajaclawHome } from "../paths.js";
16
+ import { loadConfig } from "../config.js";
17
+ import { runCycle } from "../agent.js";
18
+ import { openDb } from "../db.js";
19
+ import { taskFromMessages, resolveRequest, cycleToCompletion, chunkText, makeChunk, } from "./translate.js";
20
+ import { KNOWN_MODELS } from "../model-picker.js";
21
+ const DEFAULT_PORT = 8765;
22
+ const DEFAULT_HOST = "127.0.0.1";
23
+ const DEFAULT_STREAM_DELAY_MS = 20;
24
+ export function serveApi(opts = {}) {
25
+ const host = opts.host ?? DEFAULT_HOST;
26
+ const port = opts.port ?? DEFAULT_PORT;
27
+ const srv = createServer((req, res) => {
28
+ // Accept + CORS preflight.
29
+ res.setHeader("access-control-allow-origin", "*");
30
+ res.setHeader("access-control-allow-methods", "GET,POST,OPTIONS");
31
+ res.setHeader("access-control-allow-headers", "authorization,content-type");
32
+ if (req.method === "OPTIONS") {
33
+ res.statusCode = 204;
34
+ res.end();
35
+ return;
36
+ }
37
+ handle(req, res, opts).catch((err) => {
38
+ if (!res.headersSent) {
39
+ res.statusCode = 500;
40
+ res.setHeader("content-type", "application/json");
41
+ }
42
+ res.end(JSON.stringify({ error: { message: err.message, type: "server_error" } }));
43
+ });
44
+ });
45
+ srv.listen(port, host, () => {
46
+ opts.onReady?.({ host, port });
47
+ });
48
+ return srv;
49
+ }
50
+ async function handle(req, res, opts) {
51
+ const url = new URL(req.url ?? "/", "http://localhost");
52
+ if (url.pathname === "/health")
53
+ return sendJson(res, 200, { status: "ok" });
54
+ if (!checkAuth(req, res, opts.apiKey))
55
+ return;
56
+ if (req.method === "GET" && url.pathname === "/v1/models") {
57
+ return sendJson(res, 200, { object: "list", data: listProfilesAsModels(opts.exposedProfiles) });
58
+ }
59
+ if (req.method === "POST" && url.pathname === "/v1/chat/completions") {
60
+ const body = await readJson(req);
61
+ return handleChat(res, body, opts);
62
+ }
63
+ if (req.method === "POST" && url.pathname === "/v1/bajaclaw/cycle") {
64
+ const body = await readJson(req);
65
+ const profile = body.profile ?? "default";
66
+ if (!profileExposed(profile, opts.exposedProfiles))
67
+ return sendJson(res, 404, err("unknown profile"));
68
+ const out = await runCycle({ profile, task: body.task, dryRun: !!body.dryRun });
69
+ return sendJson(res, 200, out);
70
+ }
71
+ if (req.method === "POST" && url.pathname === "/v1/bajaclaw/tasks") {
72
+ const body = await readJson(req);
73
+ const profile = body.profile ?? "default";
74
+ if (!profileExposed(profile, opts.exposedProfiles))
75
+ return sendJson(res, 404, err("unknown profile"));
76
+ const db = openDb(profile);
77
+ try {
78
+ db.prepare("INSERT INTO tasks(created_at, priority, status, body, source) VALUES(?,?,?,?,?)").run(new Date().toISOString(), body.priority ?? "normal", "pending", body.task ?? "", "api");
79
+ }
80
+ finally {
81
+ db.close();
82
+ }
83
+ return sendJson(res, 202, { status: "enqueued" });
84
+ }
85
+ sendJson(res, 404, err("not found"));
86
+ }
87
+ async function handleChat(res, body, opts) {
88
+ if (!body || !Array.isArray(body.messages) || body.messages.length === 0) {
89
+ return sendJson(res, 400, err("messages[] required"));
90
+ }
91
+ const resolved = resolveRequest(body.model ?? "default");
92
+ if (!profileExposed(resolved.profile, opts.exposedProfiles)) {
93
+ return sendJson(res, 404, err(`unknown profile: ${resolved.profile}`));
94
+ }
95
+ const task = taskFromMessages(body.messages);
96
+ const wantStream = !!body.stream;
97
+ if (!wantStream) {
98
+ const out = await runCycle({ profile: resolved.profile, task, modelOverride: resolved.modelOverride });
99
+ const completion = cycleToCompletion(body.model ?? resolved.profile, out);
100
+ return sendJson(res, 200, completion);
101
+ }
102
+ // SSE pseudo-stream: run the cycle to completion, then chunk.
103
+ res.writeHead(200, {
104
+ "content-type": "text/event-stream",
105
+ "cache-control": "no-cache, no-transform",
106
+ connection: "keep-alive",
107
+ });
108
+ const id = `chatcmpl-bc-${Date.now()}`;
109
+ const model = body.model ?? resolved.profile;
110
+ const delay = opts.streamDelayMs ?? DEFAULT_STREAM_DELAY_MS;
111
+ writeEvent(res, makeChunk(id, model, { role: "assistant" }));
112
+ try {
113
+ const out = await runCycle({ profile: resolved.profile, task, modelOverride: resolved.modelOverride });
114
+ if (!out.ok) {
115
+ writeEvent(res, makeChunk(id, model, { content: out.text || out.error || "error" }, "error"));
116
+ }
117
+ else {
118
+ const chunks = chunkText(out.text);
119
+ for (const c of chunks) {
120
+ writeEvent(res, makeChunk(id, model, { content: c }));
121
+ if (delay > 0)
122
+ await sleep(delay);
123
+ }
124
+ writeEvent(res, makeChunk(id, model, {}, "stop"));
125
+ }
126
+ }
127
+ catch (e) {
128
+ writeEvent(res, makeChunk(id, model, { content: e.message }, "error"));
129
+ }
130
+ res.write("data: [DONE]\n\n");
131
+ res.end();
132
+ }
133
+ function listProfilesAsModels(exposed) {
134
+ const dir = join(bajaclawHome(), "profiles");
135
+ if (!existsSync(dir))
136
+ return [];
137
+ const all = readdirSync(dir).filter((n) => existsSync(join(dir, n, "config.json")));
138
+ const filter = exposed && exposed.length > 0 ? new Set(exposed) : null;
139
+ const names = filter ? all.filter((n) => filter.has(n)) : all;
140
+ const now = Math.floor(Date.now() / 1000);
141
+ const out = [];
142
+ // Bare profile names — use each profile's configured model.
143
+ for (const id of names) {
144
+ out.push({ id, object: "model", created: now, owned_by: "bajaclaw" });
145
+ }
146
+ // profile:model virtual entries — pick any model per request without
147
+ // touching profile config.
148
+ for (const id of names) {
149
+ for (const m of KNOWN_MODELS) {
150
+ out.push({ id: `${id}:${m.id}`, object: "model", created: now, owned_by: "bajaclaw" });
151
+ }
152
+ }
153
+ // Bare model-id shortcuts — apply to the default profile.
154
+ if (names.includes("default")) {
155
+ for (const m of KNOWN_MODELS) {
156
+ out.push({ id: m.id, object: "model", created: now, owned_by: "bajaclaw" });
157
+ }
158
+ }
159
+ return out;
160
+ }
161
+ function profileExposed(profile, exposed) {
162
+ if (!profileExists(profile))
163
+ return false;
164
+ if (!exposed || exposed.length === 0)
165
+ return true;
166
+ return exposed.includes(profile);
167
+ }
168
+ function profileExists(profile) {
169
+ try {
170
+ loadConfig(profile);
171
+ return true;
172
+ }
173
+ catch {
174
+ return false;
175
+ }
176
+ }
177
+ function checkAuth(req, res, apiKey) {
178
+ if (!apiKey)
179
+ return true;
180
+ const auth = req.headers["authorization"];
181
+ if (typeof auth !== "string" || !auth.toLowerCase().startsWith("bearer ")) {
182
+ sendJson(res, 401, err("missing bearer token"));
183
+ return false;
184
+ }
185
+ const given = auth.slice("bearer ".length).trim();
186
+ if (given !== apiKey) {
187
+ sendJson(res, 401, err("invalid token"));
188
+ return false;
189
+ }
190
+ return true;
191
+ }
192
+ async function readJson(req) {
193
+ const chunks = [];
194
+ for await (const c of req)
195
+ chunks.push(c);
196
+ const raw = Buffer.concat(chunks).toString("utf8");
197
+ if (!raw)
198
+ return {};
199
+ return JSON.parse(raw);
200
+ }
201
+ function sendJson(res, status, body) {
202
+ res.statusCode = status;
203
+ res.setHeader("content-type", "application/json");
204
+ res.end(JSON.stringify(body));
205
+ }
206
+ function err(msg) {
207
+ return { error: { message: msg, type: "invalid_request_error" } };
208
+ }
209
+ function writeEvent(res, event) {
210
+ res.write(`data: ${JSON.stringify(event)}\n\n`);
211
+ }
212
+ function sleep(ms) {
213
+ return new Promise((r) => setTimeout(r, ms));
214
+ }
215
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { CycleOutput } from "../agent.js";
2
+ export interface OpenAIMessage {
3
+ role: "system" | "user" | "assistant" | "tool";
4
+ content: string;
5
+ name?: string;
6
+ }
7
+ export interface OpenAIChatRequest {
8
+ model: string;
9
+ messages: OpenAIMessage[];
10
+ stream?: boolean;
11
+ temperature?: number;
12
+ max_tokens?: number;
13
+ user?: string;
14
+ }
15
+ export interface ChatChoice {
16
+ index: number;
17
+ message: {
18
+ role: "assistant";
19
+ content: string;
20
+ };
21
+ finish_reason: "stop" | "length" | "error";
22
+ }
23
+ export interface ChatCompletion {
24
+ id: string;
25
+ object: "chat.completion";
26
+ created: number;
27
+ model: string;
28
+ choices: ChatChoice[];
29
+ usage: {
30
+ prompt_tokens: number;
31
+ completion_tokens: number;
32
+ total_tokens: number;
33
+ };
34
+ }
35
+ export interface ChatCompletionChunk {
36
+ id: string;
37
+ object: "chat.completion.chunk";
38
+ created: number;
39
+ model: string;
40
+ choices: {
41
+ index: number;
42
+ delta: {
43
+ role?: "assistant";
44
+ content?: string;
45
+ };
46
+ finish_reason: null | "stop" | "length" | "error";
47
+ }[];
48
+ }
49
+ export interface ResolvedRequest {
50
+ profile: string;
51
+ modelOverride?: string;
52
+ }
53
+ export declare function resolveProfile(model: string): string;
54
+ export declare function resolveRequest(model: string, defaultProfile?: string): ResolvedRequest;
55
+ export declare function taskFromMessages(messages: OpenAIMessage[]): string;
56
+ export declare function cycleToCompletion(model: string, out: CycleOutput): ChatCompletion;
57
+ export declare function chunkText(text: string, chunkSize?: number): string[];
58
+ export declare function makeChunk(id: string, model: string, delta: {
59
+ role?: "assistant";
60
+ content?: string;
61
+ }, finish?: ChatCompletionChunk["choices"][number]["finish_reason"]): ChatCompletionChunk;