beercan 0.4.7 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +62 -4
  2. package/dist/config.d.ts +30 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +40 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/heartbeat.d.ts +57 -0
  7. package/dist/core/heartbeat.d.ts.map +1 -0
  8. package/dist/core/heartbeat.js +179 -0
  9. package/dist/core/heartbeat.js.map +1 -0
  10. package/dist/core/job-queue.d.ts +3 -0
  11. package/dist/core/job-queue.d.ts.map +1 -1
  12. package/dist/core/job-queue.js +2 -0
  13. package/dist/core/job-queue.js.map +1 -1
  14. package/dist/core/reflection.d.ts +38 -0
  15. package/dist/core/reflection.d.ts.map +1 -0
  16. package/dist/core/reflection.js +287 -0
  17. package/dist/core/reflection.js.map +1 -0
  18. package/dist/core/role-templates.d.ts.map +1 -1
  19. package/dist/core/role-templates.js +40 -0
  20. package/dist/core/role-templates.js.map +1 -1
  21. package/dist/core/runner.d.ts +3 -1
  22. package/dist/core/runner.d.ts.map +1 -1
  23. package/dist/core/runner.js +17 -1
  24. package/dist/core/runner.js.map +1 -1
  25. package/dist/events/daemon.d.ts.map +1 -1
  26. package/dist/events/daemon.js +5 -0
  27. package/dist/events/daemon.js.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +44 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/memory/hybrid-search.d.ts +3 -2
  33. package/dist/memory/hybrid-search.d.ts.map +1 -1
  34. package/dist/memory/hybrid-search.js +13 -2
  35. package/dist/memory/hybrid-search.js.map +1 -1
  36. package/dist/memory/index.d.ts +5 -0
  37. package/dist/memory/index.d.ts.map +1 -1
  38. package/dist/memory/index.js +26 -2
  39. package/dist/memory/index.js.map +1 -1
  40. package/dist/skills/index.d.ts +4 -0
  41. package/dist/skills/index.d.ts.map +1 -1
  42. package/dist/skills/index.js +8 -0
  43. package/dist/skills/index.js.map +1 -1
  44. package/dist/storage/database.d.ts +6 -0
  45. package/dist/storage/database.d.ts.map +1 -1
  46. package/dist/storage/database.js +47 -2
  47. package/dist/storage/database.js.map +1 -1
  48. package/dist/tools/builtin/filesystem.d.ts.map +1 -1
  49. package/dist/tools/builtin/filesystem.js +3 -0
  50. package/dist/tools/builtin/filesystem.js.map +1 -1
  51. package/dist/tools/builtin/integration.d.ts +20 -0
  52. package/dist/tools/builtin/integration.d.ts.map +1 -0
  53. package/dist/tools/builtin/integration.js +220 -0
  54. package/dist/tools/builtin/integration.js.map +1 -0
  55. package/dist/tools/builtin/scheduling.d.ts +62 -0
  56. package/dist/tools/builtin/scheduling.d.ts.map +1 -0
  57. package/dist/tools/builtin/scheduling.js +280 -0
  58. package/dist/tools/builtin/scheduling.js.map +1 -0
  59. package/dist/tools/builtin/skills.d.ts +10 -0
  60. package/dist/tools/builtin/skills.d.ts.map +1 -0
  61. package/dist/tools/builtin/skills.js +195 -0
  62. package/dist/tools/builtin/skills.js.map +1 -0
  63. package/dist/tools/builtin/spawning.d.ts +33 -0
  64. package/dist/tools/builtin/spawning.d.ts.map +1 -0
  65. package/dist/tools/builtin/spawning.js +243 -0
  66. package/dist/tools/builtin/spawning.js.map +1 -0
  67. package/package.json +1 -1
@@ -0,0 +1,280 @@
1
+ import cron from "node-cron";
2
+ import { getConfig } from "../../config.js";
3
+ export function createSchedulingTools(deps, getBloopContext) {
4
+ return [
5
+ { definition: createScheduleDef, handler: createCreateScheduleHandler(deps, getBloopContext) },
6
+ { definition: createTriggerDef, handler: createCreateTriggerHandler(deps, getBloopContext) },
7
+ { definition: listSchedulesDef, handler: createListSchedulesHandler(deps, getBloopContext) },
8
+ { definition: listTriggersDef, handler: createListTriggersHandler(deps, getBloopContext) },
9
+ { definition: removeScheduleDef, handler: createRemoveScheduleHandler(deps, getBloopContext) },
10
+ { definition: removeTriggerDef, handler: createRemoveTriggerHandler(deps, getBloopContext) },
11
+ ];
12
+ }
13
+ // ── Cron frequency validation ───────────────────────────────
14
+ /**
15
+ * Check if a cron expression fires more frequently than the minimum interval.
16
+ * Uses node-cron's getTasks to generate next occurrences and measure gaps.
17
+ */
18
+ export function isCronTooFrequent(expr, minIntervalMinutes) {
19
+ // Parse common patterns that are obviously too frequent
20
+ const parts = expr.trim().split(/\s+/);
21
+ if (parts.length < 5)
22
+ return false; // Invalid, let cron.validate handle it
23
+ const minuteField = parts[0];
24
+ // "* * * * *" = every minute
25
+ if (minuteField === "*")
26
+ return minIntervalMinutes > 1;
27
+ // "*/N * * * *" = every N minutes
28
+ const stepMatch = minuteField.match(/^\*\/(\d+)$/);
29
+ if (stepMatch) {
30
+ const step = parseInt(stepMatch[1]);
31
+ return step < minIntervalMinutes;
32
+ }
33
+ // Comma-separated minutes: "0,5,10,15,..."
34
+ if (minuteField.includes(",")) {
35
+ const minutes = minuteField.split(",").map(Number).filter((n) => !isNaN(n)).sort((a, b) => a - b);
36
+ if (minutes.length >= 2) {
37
+ // Check minimum gap between consecutive minutes
38
+ for (let i = 1; i < minutes.length; i++) {
39
+ if (minutes[i] - minutes[i - 1] < minIntervalMinutes)
40
+ return true;
41
+ }
42
+ // Also check wrap-around gap (e.g., 55,0 = 5 min gap)
43
+ const wrapGap = 60 - minutes[minutes.length - 1] + minutes[0];
44
+ if (wrapGap < minIntervalMinutes && wrapGap > 0)
45
+ return true;
46
+ }
47
+ }
48
+ // Range: "0-30 * * * *" — every minute in range
49
+ if (minuteField.includes("-") && !minuteField.includes("/")) {
50
+ return minIntervalMinutes > 1;
51
+ }
52
+ return false;
53
+ }
54
+ // ── create_schedule ─────────────────────────────────────────
55
+ const createScheduleDef = {
56
+ name: "create_schedule",
57
+ description: "Create a cron schedule for recurring bloop execution. " +
58
+ "The schedule will fire at the specified cron interval and run a bloop with the given goal.",
59
+ inputSchema: {
60
+ type: "object",
61
+ properties: {
62
+ cron_expression: {
63
+ type: "string",
64
+ description: "Cron expression (e.g., '0 9 * * 1-5' for weekday mornings, '*/30 * * * *' for every 30 min)",
65
+ },
66
+ goal: { type: "string", description: "Goal for each scheduled bloop run" },
67
+ team: { type: "string", description: "Team preset (default: solo)" },
68
+ description: { type: "string", description: "Human-readable description of this schedule" },
69
+ },
70
+ required: ["cron_expression", "goal"],
71
+ },
72
+ };
73
+ function createCreateScheduleHandler(deps, getCtx) {
74
+ return async (input) => {
75
+ const ctx = getCtx();
76
+ if (!ctx)
77
+ throw new Error("No active bloop context");
78
+ const config = getConfig();
79
+ const cronExpr = input.cron_expression;
80
+ const goal = input.goal;
81
+ // Validate cron expression
82
+ if (!cron.validate(cronExpr)) {
83
+ throw new Error(`Invalid cron expression: ${cronExpr}`);
84
+ }
85
+ // Check frequency
86
+ if (isCronTooFrequent(cronExpr, config.minCronIntervalMinutes)) {
87
+ throw new Error(`Cron expression fires too frequently. Minimum interval is ${config.minCronIntervalMinutes} minutes.`);
88
+ }
89
+ // Check max schedules per project
90
+ const existing = deps.getScheduler().listSchedules(ctx.projectSlug);
91
+ if (existing.length >= config.maxSchedulesPerProject) {
92
+ throw new Error(`Max schedules reached (${config.maxSchedulesPerProject}) for project "${ctx.projectSlug}".`);
93
+ }
94
+ const schedule = deps.getScheduler().addSchedule({
95
+ projectId: ctx.projectId,
96
+ projectSlug: ctx.projectSlug,
97
+ cronExpression: cronExpr,
98
+ goal,
99
+ team: input.team,
100
+ description: input.description,
101
+ });
102
+ return `Schedule created. ID: ${schedule.id}\nCron: ${cronExpr}\nGoal: ${goal}`;
103
+ };
104
+ }
105
+ // ── create_trigger ──────────────────────────────────────────
106
+ const createTriggerDef = {
107
+ name: "create_trigger",
108
+ description: "Create an event trigger that spawns a bloop when a matching event fires. " +
109
+ "Use {{data.field}} in the goal template for event data interpolation.",
110
+ inputSchema: {
111
+ type: "object",
112
+ properties: {
113
+ event_type: {
114
+ type: "string",
115
+ description: "Event type to match (e.g., 'bloop:completed', 'webhook:github')",
116
+ },
117
+ filter_pattern: {
118
+ type: "string",
119
+ description: "Regex pattern for event type matching (default: '.*')",
120
+ },
121
+ goal_template: {
122
+ type: "string",
123
+ description: "Goal template with {{data.field}} placeholders for event data interpolation",
124
+ },
125
+ team: { type: "string", description: "Team preset (default: solo)" },
126
+ },
127
+ required: ["event_type", "goal_template"],
128
+ },
129
+ };
130
+ function createCreateTriggerHandler(deps, getCtx) {
131
+ return async (input) => {
132
+ const ctx = getCtx();
133
+ if (!ctx)
134
+ throw new Error("No active bloop context");
135
+ const config = getConfig();
136
+ // Validate regex pattern if provided
137
+ const filterPattern = input.filter_pattern;
138
+ if (filterPattern) {
139
+ try {
140
+ new RegExp(filterPattern);
141
+ }
142
+ catch {
143
+ throw new Error(`Invalid regex pattern: ${filterPattern}`);
144
+ }
145
+ }
146
+ // Check max triggers per project
147
+ const existing = deps.getEventManager().getTriggerManager().listTriggers(ctx.projectSlug);
148
+ if (existing.length >= config.maxTriggersPerProject) {
149
+ throw new Error(`Max triggers reached (${config.maxTriggersPerProject}) for project "${ctx.projectSlug}".`);
150
+ }
151
+ const trigger = deps.getEventManager().getTriggerManager().addTrigger({
152
+ projectId: ctx.projectId,
153
+ projectSlug: ctx.projectSlug,
154
+ eventType: input.event_type,
155
+ filterPattern,
156
+ goalTemplate: input.goal_template,
157
+ team: input.team,
158
+ });
159
+ return `Trigger created. ID: ${trigger.id}\nEvent: ${input.event_type}\nGoal template: ${input.goal_template}`;
160
+ };
161
+ }
162
+ // ── list_schedules ──────────────────────────────────────────
163
+ const listSchedulesDef = {
164
+ name: "list_schedules",
165
+ description: "List all cron schedules for the current project.",
166
+ inputSchema: {
167
+ type: "object",
168
+ properties: {},
169
+ required: [],
170
+ },
171
+ };
172
+ function createListSchedulesHandler(deps, getCtx) {
173
+ return async () => {
174
+ const ctx = getCtx();
175
+ if (!ctx)
176
+ throw new Error("No active bloop context");
177
+ const schedules = deps.getScheduler().listSchedules(ctx.projectSlug);
178
+ if (schedules.length === 0)
179
+ return "No schedules found for this project.";
180
+ const lines = schedules.map((s, i) => {
181
+ const parts = [
182
+ `${i + 1}. [${s.enabled ? "enabled" : "disabled"}] ${s.cronExpression}`,
183
+ ` Goal: ${s.goal}`,
184
+ ` Team: ${s.team} | ID: ${s.id}`,
185
+ ];
186
+ if (s.description)
187
+ parts.push(` Description: ${s.description}`);
188
+ if (s.lastRunAt)
189
+ parts.push(` Last run: ${s.lastRunAt}`);
190
+ return parts.join("\n");
191
+ });
192
+ return `Schedules (${schedules.length}):\n${lines.join("\n\n")}`;
193
+ };
194
+ }
195
+ // ── list_triggers ───────────────────────────────────────────
196
+ const listTriggersDef = {
197
+ name: "list_triggers",
198
+ description: "List all event triggers for the current project.",
199
+ inputSchema: {
200
+ type: "object",
201
+ properties: {},
202
+ required: [],
203
+ },
204
+ };
205
+ function createListTriggersHandler(deps, getCtx) {
206
+ return async () => {
207
+ const ctx = getCtx();
208
+ if (!ctx)
209
+ throw new Error("No active bloop context");
210
+ const triggers = deps.getEventManager().getTriggerManager().listTriggers(ctx.projectSlug);
211
+ if (triggers.length === 0)
212
+ return "No triggers found for this project.";
213
+ const lines = triggers.map((t, i) => {
214
+ return [
215
+ `${i + 1}. [${t.enabled ? "enabled" : "disabled"}] ${t.eventType}`,
216
+ ` Pattern: ${t.filterPattern}`,
217
+ ` Goal: ${t.goalTemplate}`,
218
+ ` Team: ${t.team} | ID: ${t.id}`,
219
+ ].join("\n");
220
+ });
221
+ return `Triggers (${triggers.length}):\n${lines.join("\n\n")}`;
222
+ };
223
+ }
224
+ // ── remove_schedule ─────────────────────────────────────────
225
+ const removeScheduleDef = {
226
+ name: "remove_schedule",
227
+ description: "Remove a cron schedule by ID. Can only remove schedules in the current project.",
228
+ inputSchema: {
229
+ type: "object",
230
+ properties: {
231
+ schedule_id: { type: "string", description: "Schedule ID to remove" },
232
+ },
233
+ required: ["schedule_id"],
234
+ },
235
+ };
236
+ function createRemoveScheduleHandler(deps, getCtx) {
237
+ return async (input) => {
238
+ const ctx = getCtx();
239
+ if (!ctx)
240
+ throw new Error("No active bloop context");
241
+ const scheduleId = input.schedule_id;
242
+ // Verify ownership
243
+ const schedules = deps.getScheduler().listSchedules(ctx.projectSlug);
244
+ const found = schedules.find((s) => s.id === scheduleId);
245
+ if (!found) {
246
+ throw new Error(`Schedule not found in project "${ctx.projectSlug}": ${scheduleId}`);
247
+ }
248
+ deps.getScheduler().removeSchedule(scheduleId);
249
+ return `Schedule removed: ${scheduleId}`;
250
+ };
251
+ }
252
+ // ── remove_trigger ──────────────────────────────────────────
253
+ const removeTriggerDef = {
254
+ name: "remove_trigger",
255
+ description: "Remove an event trigger by ID. Can only remove triggers in the current project.",
256
+ inputSchema: {
257
+ type: "object",
258
+ properties: {
259
+ trigger_id: { type: "string", description: "Trigger ID to remove" },
260
+ },
261
+ required: ["trigger_id"],
262
+ },
263
+ };
264
+ function createRemoveTriggerHandler(deps, getCtx) {
265
+ return async (input) => {
266
+ const ctx = getCtx();
267
+ if (!ctx)
268
+ throw new Error("No active bloop context");
269
+ const triggerId = input.trigger_id;
270
+ // Verify ownership
271
+ const triggers = deps.getEventManager().getTriggerManager().listTriggers(ctx.projectSlug);
272
+ const found = triggers.find((t) => t.id === triggerId);
273
+ if (!found) {
274
+ throw new Error(`Trigger not found in project "${ctx.projectSlug}": ${triggerId}`);
275
+ }
276
+ deps.getEventManager().getTriggerManager().removeTrigger(triggerId);
277
+ return `Trigger removed: ${triggerId}`;
278
+ };
279
+ }
280
+ //# sourceMappingURL=scheduling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduling.js","sourceRoot":"","sources":["../../../src/tools/builtin/scheduling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolDefinition } from "../../schemas.js";
2
+ import type { ToolHandler } from "../registry.js";
3
+ import type { BloopContext } from "./memory.js";
4
+ import type { SkillManager } from "../../skills/index.js";
5
+ import type { BeerCanDB } from "../../storage/database.js";
6
+ export declare function createSkillTools(skillManager: SkillManager, getBloopContext: () => BloopContext | null, db: BeerCanDB, dataDir?: string): Array<{
7
+ definition: ToolDefinition;
8
+ handler: ToolHandler;
9
+ }>;
10
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAS,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAU3D,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,MAAM,YAAY,GAAG,IAAI,EAC1C,EAAE,EAAE,SAAS,EACb,OAAO,CAAC,EAAE,MAAM,GACf,KAAK,CAAC;IAAE,UAAU,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC,CAQ7D"}
@@ -0,0 +1,195 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { getConfig } from "../../config.js";
4
+ // ── Skill & Project Context Tool Factory ────────────────────
5
+ const VALID_SKILL_NAME = /^[a-z0-9][a-z0-9-]*$/;
6
+ const MAX_SKILLS = 50;
7
+ const MAX_CONTEXT_VALUE_SIZE = 10 * 1024; // 10KB
8
+ const RESTRICTED_CONTEXT_KEYS = new Set(["id", "slug", "name", "createdAt"]);
9
+ export function createSkillTools(skillManager, getBloopContext, db, dataDir) {
10
+ const resolvedDataDir = dataDir ?? getConfig().dataDir;
11
+ return [
12
+ { definition: createSkillDef, handler: createCreateSkillHandler(skillManager, getBloopContext, resolvedDataDir) },
13
+ { definition: updateSkillDef, handler: createUpdateSkillHandler(skillManager, getBloopContext, resolvedDataDir) },
14
+ { definition: listSkillsDef, handler: createListSkillsHandler(skillManager, getBloopContext) },
15
+ { definition: updateProjectContextDef, handler: createUpdateProjectContextHandler(getBloopContext, db) },
16
+ ];
17
+ }
18
+ // ── create_skill ────────────────────────────────────────────
19
+ const createSkillDef = {
20
+ name: "create_skill",
21
+ description: "Create a new skill that provides step-by-step instructions and context for agents. " +
22
+ "Skills are auto-matched when a bloop goal contains trigger keywords.",
23
+ inputSchema: {
24
+ type: "object",
25
+ properties: {
26
+ name: { type: "string", description: "Skill name (lowercase, hyphens allowed, e.g., 'analyze-logs')" },
27
+ description: { type: "string", description: "What this skill does" },
28
+ triggers: {
29
+ type: "array",
30
+ items: { type: "string" },
31
+ description: "Keywords that activate this skill (e.g., ['analyze logs', 'check logs'])",
32
+ },
33
+ instructions: { type: "string", description: "Step-by-step instructions for agents" },
34
+ required_tools: {
35
+ type: "array",
36
+ items: { type: "string" },
37
+ description: "Tools the agent needs (e.g., ['exec_command', 'read_file'])",
38
+ },
39
+ config: {
40
+ type: "object",
41
+ description: "Optional configuration (env vars, endpoints, etc.)",
42
+ },
43
+ },
44
+ required: ["name", "description", "triggers", "instructions"],
45
+ },
46
+ };
47
+ function createCreateSkillHandler(skillManager, getCtx, dataDir) {
48
+ return async (input) => {
49
+ const ctx = getCtx();
50
+ if (!ctx)
51
+ throw new Error("No active bloop context");
52
+ const name = input.name;
53
+ // Validate name
54
+ if (!VALID_SKILL_NAME.test(name)) {
55
+ throw new Error(`Invalid skill name: "${name}". Must be lowercase alphanumeric with hyphens (e.g., 'analyze-logs').`);
56
+ }
57
+ // Check if already exists
58
+ if (skillManager.getSkill(name)) {
59
+ throw new Error(`Skill "${name}" already exists. Use update_skill to modify it.`);
60
+ }
61
+ // Check max skills
62
+ if (skillManager.listSkills().length >= MAX_SKILLS) {
63
+ throw new Error(`Max skills reached (${MAX_SKILLS}). Remove some before creating new ones.`);
64
+ }
65
+ const skill = {
66
+ name,
67
+ description: input.description,
68
+ triggers: input.triggers,
69
+ instructions: input.instructions,
70
+ requiredTools: input.required_tools ?? [],
71
+ config: input.config ?? {},
72
+ enabled: true,
73
+ };
74
+ // Write to disk
75
+ const skillsDir = path.join(dataDir, "skills");
76
+ fs.mkdirSync(skillsDir, { recursive: true });
77
+ const skillPath = path.join(skillsDir, `${name}.json`);
78
+ fs.writeFileSync(skillPath, JSON.stringify(skill, null, 2));
79
+ // Register in memory
80
+ skillManager.registerSkill(skill);
81
+ return `Skill "${name}" created and registered.\nFile: ${skillPath}\nTriggers: ${skill.triggers.join(", ")}`;
82
+ };
83
+ }
84
+ // ── update_skill ────────────────────────────────────────────
85
+ const updateSkillDef = {
86
+ name: "update_skill",
87
+ description: "Update an existing skill's properties.",
88
+ inputSchema: {
89
+ type: "object",
90
+ properties: {
91
+ name: { type: "string", description: "Skill name to update" },
92
+ description: { type: "string", description: "New description" },
93
+ triggers: { type: "array", items: { type: "string" }, description: "New trigger keywords" },
94
+ instructions: { type: "string", description: "New instructions" },
95
+ required_tools: { type: "array", items: { type: "string" }, description: "New required tools" },
96
+ },
97
+ required: ["name"],
98
+ },
99
+ };
100
+ function createUpdateSkillHandler(skillManager, getCtx, dataDir) {
101
+ return async (input) => {
102
+ const ctx = getCtx();
103
+ if (!ctx)
104
+ throw new Error("No active bloop context");
105
+ const name = input.name;
106
+ const existing = skillManager.getSkill(name);
107
+ if (!existing)
108
+ throw new Error(`Skill not found: "${name}"`);
109
+ // Merge updates
110
+ const updated = {
111
+ ...existing,
112
+ description: input.description ?? existing.description,
113
+ triggers: input.triggers ?? existing.triggers,
114
+ instructions: input.instructions ?? existing.instructions,
115
+ requiredTools: input.required_tools ?? existing.requiredTools,
116
+ };
117
+ // Write to disk
118
+ const skillPath = path.join(dataDir, "skills", `${name}.json`);
119
+ if (fs.existsSync(skillPath)) {
120
+ fs.writeFileSync(skillPath, JSON.stringify(updated, null, 2));
121
+ }
122
+ // Update in memory
123
+ skillManager.registerSkill(updated);
124
+ return `Skill "${name}" updated.`;
125
+ };
126
+ }
127
+ // ── list_skills ─────────────────────────────────────────────
128
+ const listSkillsDef = {
129
+ name: "list_skills",
130
+ description: "List all available skills with their triggers and descriptions.",
131
+ inputSchema: {
132
+ type: "object",
133
+ properties: {},
134
+ required: [],
135
+ },
136
+ };
137
+ function createListSkillsHandler(skillManager, getCtx) {
138
+ return async () => {
139
+ const ctx = getCtx();
140
+ if (!ctx)
141
+ throw new Error("No active bloop context");
142
+ const skills = skillManager.listSkills();
143
+ if (skills.length === 0)
144
+ return "No skills registered.";
145
+ const lines = skills.map((s, i) => {
146
+ return [
147
+ `${i + 1}. ${s.name} [${s.enabled ? "enabled" : "disabled"}]`,
148
+ ` ${s.description}`,
149
+ ` Triggers: ${s.triggers.join(", ")}`,
150
+ ` Tools: ${s.requiredTools.join(", ") || "none"}`,
151
+ ].join("\n");
152
+ });
153
+ return `Skills (${skills.length}):\n${lines.join("\n\n")}`;
154
+ };
155
+ }
156
+ // ── update_project_context ──────────────────────────────────
157
+ const updateProjectContextDef = {
158
+ name: "update_project_context",
159
+ description: "Update the current project's context configuration. " +
160
+ "Use to adjust project settings, enable features, or store agent preferences.",
161
+ inputSchema: {
162
+ type: "object",
163
+ properties: {
164
+ key: { type: "string", description: "Context key to set (e.g., 'reflectionEnabled', 'heartbeat')" },
165
+ value: { description: "Value to set (any JSON-serializable value)" },
166
+ },
167
+ required: ["key", "value"],
168
+ },
169
+ };
170
+ function createUpdateProjectContextHandler(getCtx, db) {
171
+ return async (input) => {
172
+ const ctx = getCtx();
173
+ if (!ctx)
174
+ throw new Error("No active bloop context");
175
+ const key = input.key;
176
+ const value = input.value;
177
+ // Restricted keys
178
+ if (RESTRICTED_CONTEXT_KEYS.has(key)) {
179
+ throw new Error(`Cannot modify restricted key: "${key}"`);
180
+ }
181
+ // Value size limit
182
+ const serialized = JSON.stringify(value);
183
+ if (serialized.length > MAX_CONTEXT_VALUE_SIZE) {
184
+ throw new Error(`Value too large (${serialized.length} bytes). Max: ${MAX_CONTEXT_VALUE_SIZE} bytes.`);
185
+ }
186
+ const project = db.getProjectBySlug(ctx.projectSlug);
187
+ if (!project)
188
+ throw new Error(`Project not found: ${ctx.projectSlug}`);
189
+ project.context[key] = value;
190
+ project.updatedAt = new Date().toISOString();
191
+ db.updateProject(project);
192
+ return `Project context updated: ${key} = ${serialized.slice(0, 200)}`;
193
+ };
194
+ }
195
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/tools/builtin/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { ToolDefinition } from "../../schemas.js";
2
+ import type { ToolHandler } from "../registry.js";
3
+ import type { BloopContext } from "./memory.js";
4
+ import type { BeerCanDB } from "../../storage/database.js";
5
+ import type { MemoryManager } from "../../memory/index.js";
6
+ interface SpawningDeps {
7
+ enqueueBloop: (opts: {
8
+ projectSlug: string;
9
+ goal: string;
10
+ team?: string;
11
+ priority?: number;
12
+ parentBloopId?: string;
13
+ source?: "manual" | "cron" | "event";
14
+ extraContext?: string;
15
+ }) => string;
16
+ listProjects: () => Array<{
17
+ name: string;
18
+ slug: string;
19
+ description?: string;
20
+ workDir?: string;
21
+ context: Record<string, unknown>;
22
+ }>;
23
+ getProject: (slug: string) => {
24
+ context: Record<string, unknown>;
25
+ } | null;
26
+ getBloop: (id: string) => any | null;
27
+ }
28
+ export declare function createSpawningTools(deps: SpawningDeps, getBloopContext: () => BloopContext | null, db: BeerCanDB, memory: MemoryManager): Array<{
29
+ definition: ToolDefinition;
30
+ handler: ToolHandler;
31
+ }>;
32
+ export {};
33
+ //# sourceMappingURL=spawning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawning.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/spawning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D,UAAU,YAAY;IACpB,YAAY,EAAE,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,KAAK,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,KAAK,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC,CAAC;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1E,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC;CACtC;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,eAAe,EAAE,MAAM,YAAY,GAAG,IAAI,EAC1C,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,aAAa,GACpB,KAAK,CAAC;IAAE,UAAU,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC,CAS7D"}