reeboot 1.3.2 → 1.3.4

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 (94) hide show
  1. package/container/entrypoint.sh +55 -3
  2. package/dist/agent-runner/index.d.ts.map +1 -1
  3. package/dist/agent-runner/index.js +3 -9
  4. package/dist/agent-runner/index.js.map +1 -1
  5. package/dist/agent-runner/pi-runner.d.ts +3 -1
  6. package/dist/agent-runner/pi-runner.d.ts.map +1 -1
  7. package/dist/agent-runner/pi-runner.js +81 -7
  8. package/dist/agent-runner/pi-runner.js.map +1 -1
  9. package/dist/channels/whatsapp.d.ts.map +1 -1
  10. package/dist/channels/whatsapp.js +10 -1
  11. package/dist/channels/whatsapp.js.map +1 -1
  12. package/dist/config.d.ts +7 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +2 -1
  15. package/dist/config.js.map +1 -1
  16. package/dist/context.d.ts.map +1 -1
  17. package/dist/context.js +3 -0
  18. package/dist/context.js.map +1 -1
  19. package/dist/db/schema.d.ts.map +1 -1
  20. package/dist/db/schema.js +2 -2
  21. package/dist/db/schema.js.map +1 -1
  22. package/dist/extensions/confirm-destructive.d.ts +9 -0
  23. package/dist/extensions/confirm-destructive.d.ts.map +1 -0
  24. package/dist/extensions/confirm-destructive.js +43 -0
  25. package/dist/extensions/confirm-destructive.js.map +1 -0
  26. package/dist/extensions/custom-compaction.d.ts +17 -0
  27. package/dist/extensions/custom-compaction.d.ts.map +1 -0
  28. package/dist/extensions/custom-compaction.js +99 -0
  29. package/dist/extensions/custom-compaction.js.map +1 -0
  30. package/dist/extensions/loader.d.ts.map +1 -1
  31. package/dist/extensions/loader.js +24 -16
  32. package/dist/extensions/loader.js.map +1 -1
  33. package/dist/extensions/protected-paths.d.ts +9 -0
  34. package/dist/extensions/protected-paths.d.ts.map +1 -0
  35. package/dist/extensions/protected-paths.js +24 -0
  36. package/dist/extensions/protected-paths.js.map +1 -0
  37. package/dist/extensions/scheduler-tool.d.ts +31 -0
  38. package/dist/extensions/scheduler-tool.d.ts.map +1 -0
  39. package/dist/extensions/scheduler-tool.js +341 -0
  40. package/dist/extensions/scheduler-tool.js.map +1 -0
  41. package/dist/extensions/session-name.d.ts +11 -0
  42. package/dist/extensions/session-name.d.ts.map +1 -0
  43. package/dist/extensions/session-name.js +25 -0
  44. package/dist/extensions/session-name.js.map +1 -0
  45. package/dist/extensions/skill-manager.d.ts +49 -0
  46. package/dist/extensions/skill-manager.d.ts.map +1 -0
  47. package/dist/extensions/skill-manager.js +368 -0
  48. package/dist/extensions/skill-manager.js.map +1 -0
  49. package/dist/extensions/token-meter.d.ts +11 -0
  50. package/dist/extensions/token-meter.d.ts.map +1 -0
  51. package/dist/extensions/token-meter.js +46 -0
  52. package/dist/extensions/token-meter.js.map +1 -0
  53. package/dist/extensions/web-search.d.ts +39 -0
  54. package/dist/extensions/web-search.d.ts.map +1 -0
  55. package/dist/extensions/web-search.js +366 -0
  56. package/dist/extensions/web-search.js.map +1 -0
  57. package/dist/index.js +9 -2
  58. package/dist/index.js.map +1 -1
  59. package/dist/server.d.ts.map +1 -1
  60. package/dist/server.js +3 -3
  61. package/dist/server.js.map +1 -1
  62. package/dist/setup-wizard.d.ts +1 -0
  63. package/dist/setup-wizard.d.ts.map +1 -1
  64. package/dist/setup-wizard.js +4 -3
  65. package/dist/setup-wizard.js.map +1 -1
  66. package/dist/utils/agent-dir.d.ts +11 -0
  67. package/dist/utils/agent-dir.d.ts.map +1 -0
  68. package/dist/utils/agent-dir.js +26 -0
  69. package/dist/utils/agent-dir.js.map +1 -0
  70. package/dist/wizard/detect-pi-auth.d.ts +19 -0
  71. package/dist/wizard/detect-pi-auth.d.ts.map +1 -0
  72. package/dist/wizard/detect-pi-auth.js +36 -0
  73. package/dist/wizard/detect-pi-auth.js.map +1 -0
  74. package/dist/wizard/index.d.ts.map +1 -1
  75. package/dist/wizard/index.js +1 -0
  76. package/dist/wizard/index.js.map +1 -1
  77. package/dist/wizard/probe-searxng.d.ts +9 -0
  78. package/dist/wizard/probe-searxng.d.ts.map +1 -0
  79. package/dist/wizard/probe-searxng.js +30 -0
  80. package/dist/wizard/probe-searxng.js.map +1 -0
  81. package/dist/wizard/steps/channels.js +7 -35
  82. package/dist/wizard/steps/channels.js.map +1 -1
  83. package/dist/wizard/steps/launch.d.ts +1 -0
  84. package/dist/wizard/steps/launch.d.ts.map +1 -1
  85. package/dist/wizard/steps/launch.js +5 -4
  86. package/dist/wizard/steps/launch.js.map +1 -1
  87. package/dist/wizard/steps/provider.d.ts +1 -0
  88. package/dist/wizard/steps/provider.d.ts.map +1 -1
  89. package/dist/wizard/steps/provider.js +18 -1
  90. package/dist/wizard/steps/provider.js.map +1 -1
  91. package/dist/wizard/steps/web-search.js +33 -10
  92. package/dist/wizard/steps/web-search.js.map +1 -1
  93. package/extensions/web-search.ts +2 -3
  94. package/package.json +4 -2
@@ -0,0 +1,341 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * Scheduler Tool Extension
4
+ *
5
+ * Registers schedule_task, list_tasks, cancel_task, pause_task, resume_task,
6
+ * update_task tools backed by SQLite, plus the /tasks slash command.
7
+ * Uses getDb() for DB access and integrates with the Scheduler singleton.
8
+ *
9
+ * Also registers:
10
+ * - timer: one-shot non-blocking wait (fires pi.sendMessage triggerTurn)
11
+ * - heartbeat: periodic non-blocking wake-up (start/stop/status)
12
+ * - bash pre-hook: sleep interceptor (blocks sleep when sole/last command)
13
+ * - session_shutdown: cleans up all in-session timers and heartbeat
14
+ */
15
+ import { Type } from '@sinclair/typebox';
16
+ // ─── isSleepOnlyOrLast ────────────────────────────────────────────────────────
17
+ /**
18
+ * Returns true if sleep is the sole command or the last command in a chain.
19
+ * Splits on && and single | (not || which is OR-fallback).
20
+ */
21
+ export function isSleepOnlyOrLast(command) {
22
+ // Split on && and | (pipe) — but not || (double pipe for fallback)
23
+ const parts = command.trim().split(/&&|(?<!\|)\|(?!\|)/).map((s) => s.trim()).filter(Boolean);
24
+ if (parts.length === 0)
25
+ return false;
26
+ const last = parts[parts.length - 1];
27
+ return last.startsWith('sleep ') || last === 'sleep';
28
+ }
29
+ // ─── TimerManager ─────────────────────────────────────────────────────────────
30
+ export class TimerManager {
31
+ _timers = new Map();
32
+ _heartbeat = null;
33
+ // ── Timer ──────────────────────────────────────────────────────────────────
34
+ setTimer(pi, seconds, message, id) {
35
+ if (seconds < 1 || seconds > 3600) {
36
+ throw new Error('seconds must be between 1 and 3600');
37
+ }
38
+ // Cancel existing timer with same id
39
+ const existing = this._timers.get(id);
40
+ if (existing)
41
+ clearTimeout(existing);
42
+ const handle = setTimeout(() => {
43
+ this._timers.delete(id);
44
+ pi.sendMessage({ content: `⏰ Timer ${id} fired: ${message}`, display: true }, { triggerTurn: true });
45
+ }, seconds * 1000);
46
+ this._timers.set(id, handle);
47
+ }
48
+ cancelTimer(id) {
49
+ const handle = this._timers.get(id);
50
+ if (handle) {
51
+ clearTimeout(handle);
52
+ this._timers.delete(id);
53
+ }
54
+ }
55
+ // ── Heartbeat ──────────────────────────────────────────────────────────────
56
+ startHeartbeat(pi, intervalSeconds, message) {
57
+ if (intervalSeconds < 10 || intervalSeconds > 3600) {
58
+ throw new Error('interval_seconds must be between 10 and 3600');
59
+ }
60
+ // Stop any existing heartbeat
61
+ this.stopHeartbeat();
62
+ let tickCount = 0;
63
+ const startedAt = new Date();
64
+ const handle = setInterval(() => {
65
+ tickCount++;
66
+ if (this._heartbeat)
67
+ this._heartbeat.tickCount = tickCount;
68
+ pi.sendMessage({ content: `💓 Heartbeat tick ${tickCount}: ${message}`, display: true }, { triggerTurn: true });
69
+ }, intervalSeconds * 1000);
70
+ this._heartbeat = {
71
+ interval: handle,
72
+ tickCount: 0,
73
+ message,
74
+ intervalSeconds,
75
+ startedAt,
76
+ };
77
+ }
78
+ stopHeartbeat() {
79
+ if (this._heartbeat) {
80
+ clearInterval(this._heartbeat.interval);
81
+ this._heartbeat = null;
82
+ }
83
+ }
84
+ getHeartbeatStatus() {
85
+ if (!this._heartbeat)
86
+ return 'No active heartbeat.';
87
+ const elapsed = Math.round((Date.now() - this._heartbeat.startedAt.getTime()) / 1000);
88
+ return `Active heartbeat: every ${this._heartbeat.intervalSeconds}s, message="${this._heartbeat.message}", ticks=${this._heartbeat.tickCount}, running for ${elapsed}s`;
89
+ }
90
+ // ── Cleanup ────────────────────────────────────────────────────────────────
91
+ clearAll() {
92
+ for (const h of this._timers.values())
93
+ clearTimeout(h);
94
+ this._timers.clear();
95
+ this.stopHeartbeat();
96
+ }
97
+ }
98
+ // ─── Extension default export ─────────────────────────────────────────────────
99
+ export default function (pi) {
100
+ // Lazily resolve DB and scheduler to avoid circular imports
101
+ function getTools() {
102
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
103
+ const { getDb } = require('../db/index.js');
104
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
105
+ const { createSchedulerTools } = require('../scheduler.js');
106
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
107
+ const { globalScheduler } = require('../scheduler-registry.js');
108
+ const db = getDb();
109
+ return createSchedulerTools(db, globalScheduler);
110
+ }
111
+ // ─── In-session timer manager ──────────────────────────────────────────────
112
+ const manager = new TimerManager();
113
+ // ─── session_shutdown cleanup ──────────────────────────────────────────────
114
+ pi.on('session_shutdown', () => {
115
+ manager.clearAll();
116
+ });
117
+ // ─── Sleep interceptor (bash pre-hook) ────────────────────────────────────
118
+ pi.on('user_bash', (event) => {
119
+ if (process.env.REEBOOT_SLEEP_INTERCEPTOR === '0')
120
+ return;
121
+ if (isSleepOnlyOrLast(event.command)) {
122
+ return {
123
+ result: {
124
+ content: [
125
+ {
126
+ type: 'text',
127
+ text: 'Blocking sleep command. Use timer(seconds, message) for non-blocking waits.',
128
+ },
129
+ ],
130
+ details: {},
131
+ isError: true,
132
+ },
133
+ };
134
+ }
135
+ });
136
+ // ─── timer tool ───────────────────────────────────────────────────────────
137
+ pi.registerTool({
138
+ name: 'timer',
139
+ label: 'Timer',
140
+ description: 'Set a one-shot non-blocking timer. Returns immediately. After the specified delay, fires a new agent turn with the given message. Use instead of sleep.',
141
+ parameters: Type.Object({
142
+ seconds: Type.Number({ description: 'Delay in seconds (1–3600)' }),
143
+ message: Type.String({ description: 'Message to include when the timer fires' }),
144
+ id: Type.Optional(Type.String({ description: 'Timer id (optional). Same id cancels previous timer.' })),
145
+ }),
146
+ execute: async (_callId, params) => {
147
+ const id = params.id ?? `timer-${Date.now()}`;
148
+ try {
149
+ manager.setTimer(pi, params.seconds, params.message, id);
150
+ return {
151
+ content: [
152
+ {
153
+ type: 'text',
154
+ text: `Timer "${id}" set for ${params.seconds}s: "${params.message}"`,
155
+ },
156
+ ],
157
+ details: { id, seconds: params.seconds, message: params.message },
158
+ };
159
+ }
160
+ catch (err) {
161
+ return {
162
+ content: [{ type: 'text', text: err.message }],
163
+ details: {},
164
+ isError: true,
165
+ };
166
+ }
167
+ },
168
+ });
169
+ // ─── heartbeat tool ───────────────────────────────────────────────────────
170
+ pi.registerTool({
171
+ name: 'heartbeat',
172
+ label: 'Heartbeat',
173
+ description: 'Manage a periodic non-blocking heartbeat. Actions: start (requires interval_seconds 10–3600 and message), stop, status. Only one heartbeat active at a time.',
174
+ parameters: Type.Object({
175
+ action: Type.Union([Type.Literal('start'), Type.Literal('stop'), Type.Literal('status')], {
176
+ description: 'Action to perform',
177
+ }),
178
+ interval_seconds: Type.Optional(Type.Number({ description: 'Interval in seconds (10–3600). Required for start.' })),
179
+ message: Type.Optional(Type.String({ description: 'Message to include on each tick. Required for start.' })),
180
+ }),
181
+ execute: async (_callId, params) => {
182
+ if (params.action === 'start') {
183
+ const intervalSeconds = params.interval_seconds ?? 60;
184
+ const message = params.message ?? 'Heartbeat tick';
185
+ try {
186
+ manager.startHeartbeat(pi, intervalSeconds, message);
187
+ return {
188
+ content: [
189
+ {
190
+ type: 'text',
191
+ text: `Heartbeat started: every ${intervalSeconds}s, message="${message}"`,
192
+ },
193
+ ],
194
+ details: { intervalSeconds, message },
195
+ };
196
+ }
197
+ catch (err) {
198
+ return {
199
+ content: [{ type: 'text', text: err.message }],
200
+ details: {},
201
+ isError: true,
202
+ };
203
+ }
204
+ }
205
+ if (params.action === 'stop') {
206
+ manager.stopHeartbeat();
207
+ return {
208
+ content: [{ type: 'text', text: 'Heartbeat stopped.' }],
209
+ details: {},
210
+ };
211
+ }
212
+ // status
213
+ const status = manager.getHeartbeatStatus();
214
+ return {
215
+ content: [{ type: 'text', text: status }],
216
+ details: {},
217
+ };
218
+ },
219
+ });
220
+ // ─── schedule_task ────────────────────────────────────────────────────────
221
+ pi.registerTool({
222
+ name: 'schedule_task',
223
+ label: 'Schedule Task',
224
+ description: 'Schedule a task. Provide a human-friendly schedule string (e.g. "every 30m", "daily", "0 9 * * *", "2026-04-01T09:00:00Z"), a prompt, and optionally contextId and context_mode.',
225
+ parameters: Type.Object({
226
+ schedule: Type.String({
227
+ description: 'Schedule: cron expression, ISO datetime, or interval like "every 30m", "hourly", "daily"',
228
+ }),
229
+ prompt: Type.String({ description: 'Prompt to dispatch to the agent on schedule' }),
230
+ contextId: Type.Optional(Type.String({ description: 'Context to run in (default: main)' })),
231
+ context_mode: Type.Optional(Type.String({ description: 'Context mode: "shared" (default) or "isolated"' })),
232
+ }),
233
+ execute: async (_id, params) => {
234
+ const tools = getTools();
235
+ return tools.schedule_task(params);
236
+ },
237
+ });
238
+ // ─── list_tasks ───────────────────────────────────────────────────────────
239
+ pi.registerTool({
240
+ name: 'list_tasks',
241
+ label: 'List Tasks',
242
+ description: 'List all scheduled tasks with rich status: id, schedule, prompt, status, next run time (relative), last result, context mode.',
243
+ parameters: Type.Object({}),
244
+ execute: async () => {
245
+ const tools = getTools();
246
+ return tools.list_tasks({});
247
+ },
248
+ });
249
+ // ─── cancel_task ─────────────────────────────────────────────────────────
250
+ pi.registerTool({
251
+ name: 'cancel_task',
252
+ label: 'Cancel Task',
253
+ description: 'Cancel and delete a scheduled task by its ID.',
254
+ parameters: Type.Object({
255
+ task_id: Type.String({ description: 'Task ID to cancel (from list_tasks)' }),
256
+ }),
257
+ execute: async (_id, params) => {
258
+ const tools = getTools();
259
+ return tools.cancel_task(params);
260
+ },
261
+ });
262
+ // ─── pause_task ───────────────────────────────────────────────────────────
263
+ pi.registerTool({
264
+ name: 'pause_task',
265
+ label: 'Pause Task',
266
+ description: 'Pause a scheduled task. The task will not run until resumed.',
267
+ parameters: Type.Object({
268
+ task_id: Type.String({ description: 'Task ID to pause (from list_tasks)' }),
269
+ }),
270
+ execute: async (_id, params) => {
271
+ const tools = getTools();
272
+ return tools.pause_task(params);
273
+ },
274
+ });
275
+ // ─── resume_task ──────────────────────────────────────────────────────────
276
+ pi.registerTool({
277
+ name: 'resume_task',
278
+ label: 'Resume Task',
279
+ description: 'Resume a paused task. next_run is recomputed from now.',
280
+ parameters: Type.Object({
281
+ task_id: Type.String({ description: 'Task ID to resume (from list_tasks)' }),
282
+ }),
283
+ execute: async (_id, params) => {
284
+ const tools = getTools();
285
+ return tools.resume_task(params);
286
+ },
287
+ });
288
+ // ─── update_task ──────────────────────────────────────────────────────────
289
+ pi.registerTool({
290
+ name: 'update_task',
291
+ label: 'Update Task',
292
+ description: "Update a task's prompt, schedule, or context_mode. If schedule changes, next_run is recomputed.",
293
+ parameters: Type.Object({
294
+ task_id: Type.String({ description: 'Task ID to update (from list_tasks)' }),
295
+ schedule: Type.Optional(Type.String({ description: 'New schedule string' })),
296
+ prompt: Type.Optional(Type.String({ description: 'New prompt' })),
297
+ context_mode: Type.Optional(Type.String({ description: 'New context mode: "shared" or "isolated"' })),
298
+ }),
299
+ execute: async (_id, params) => {
300
+ const tools = getTools();
301
+ return tools.update_task(params);
302
+ },
303
+ });
304
+ // ─── /tasks slash command ─────────────────────────────────────────────────
305
+ pi.registerCommand({
306
+ name: 'tasks',
307
+ description: 'Task management. Use "/tasks due" to list overdue tasks, or "/tasks" to list all active tasks.',
308
+ execute: async (args) => {
309
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
310
+ const { getDb } = require('../db/index.js');
311
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
312
+ const { getTasksDue, formatTasksDue } = require('../scheduler.js');
313
+ const db = getDb();
314
+ const subCmd = args?.trim().toLowerCase();
315
+ if (subCmd === 'due') {
316
+ const due = getTasksDue(db);
317
+ return formatTasksDue(due);
318
+ }
319
+ // List all active tasks
320
+ const tasks = db
321
+ .prepare("SELECT * FROM tasks WHERE status='active' ORDER BY next_run ASC")
322
+ .all();
323
+ if (tasks.length === 0) {
324
+ return 'No active tasks.';
325
+ }
326
+ const now = Date.now();
327
+ const lines = tasks.map((t) => {
328
+ const nextRunMs = t.next_run ? new Date(t.next_run).getTime() : null;
329
+ const overdue = nextRunMs && nextRunMs <= now;
330
+ const rel = overdue
331
+ ? 'OVERDUE'
332
+ : nextRunMs
333
+ ? `in ${Math.round((nextRunMs - now) / 60_000)}m`
334
+ : 'unknown';
335
+ return `[${t.id}] ${(t.schedule_value || t.schedule).padEnd(20)} → ${t.prompt.slice(0, 40)} | next: ${rel}`;
336
+ });
337
+ return lines.join('\n');
338
+ },
339
+ });
340
+ }
341
+ //# sourceMappingURL=scheduler-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-tool.js","sourceRoot":"","sources":["../../src/extensions/scheduler-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Session naming example.
3
+ *
4
+ * Shows setSessionName/getSessionName to give sessions friendly names
5
+ * that appear in the session selector instead of the first message.
6
+ *
7
+ * Usage: /session-name [name] - set or show session name
8
+ */
9
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
10
+ export default function (pi: ExtensionAPI): void;
11
+ //# sourceMappingURL=session-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-name.d.ts","sourceRoot":"","sources":["../../src/extensions/session-name.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAexC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Session naming example.
3
+ *
4
+ * Shows setSessionName/getSessionName to give sessions friendly names
5
+ * that appear in the session selector instead of the first message.
6
+ *
7
+ * Usage: /session-name [name] - set or show session name
8
+ */
9
+ export default function (pi) {
10
+ pi.registerCommand("session-name", {
11
+ description: "Set or show session name (usage: /session-name [new name])",
12
+ handler: async (args, ctx) => {
13
+ const name = args.trim();
14
+ if (name) {
15
+ pi.setSessionName(name);
16
+ ctx.ui.notify(`Session named: ${name}`, "info");
17
+ }
18
+ else {
19
+ const current = pi.getSessionName();
20
+ ctx.ui.notify(current ? `Session: ${current}` : "No session name set", "info");
21
+ }
22
+ },
23
+ });
24
+ }
25
+ //# sourceMappingURL=session-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-name.js","sourceRoot":"","sources":["../../src/extensions/session-name.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,CAAC,OAAO,WAAW,EAAgB;IACxC,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE;QAClC,WAAW,EAAE,4DAA4D;QACzE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAEzB,IAAI,IAAI,EAAE,CAAC;gBACV,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACxB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACP,MAAM,OAAO,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;gBACpC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Skill Manager Extension
3
+ *
4
+ * Manages permanent and ephemeral skills for the reeboot agent:
5
+ * - Permanent skills: registered via resources_discover at startup
6
+ * - Ephemeral skills: loaded on demand via load_skill tool, TTL-based expiry,
7
+ * injected into system prompt via before_agent_start
8
+ * - Persistence: active ephemeral skills stored in ~/.reeboot/active-skills.json
9
+ * - Catalog: resolves skill names from bundled catalog and extended catalog
10
+ */
11
+ import type { ExtensionAPI } from '@mariozechner/pi-coding-agent';
12
+ import type { Config } from '../src/config.js';
13
+ export interface ActiveSkill {
14
+ name: string;
15
+ skillDir: string;
16
+ description: string;
17
+ expiresAt: number;
18
+ }
19
+ interface SkillMeta {
20
+ name: string;
21
+ description: string;
22
+ }
23
+ /**
24
+ * Search each root for <root>/<name>/SKILL.md.
25
+ * Returns the skill directory path (not SKILL.md) or null.
26
+ * Case-insensitive name match.
27
+ */
28
+ export declare function findSkill(name: string, roots: string[]): string | null;
29
+ /**
30
+ * Read SKILL.md frontmatter and parse name + description.
31
+ * Uses simple regex; does not require a YAML library.
32
+ * Returns null on any parse error.
33
+ */
34
+ export declare function readSkillMeta(skillDir: string): SkillMeta | null;
35
+ export declare class ActiveSkillStore {
36
+ private _skills;
37
+ load(name: string, skillDir: string, description: string, ttlMs: number): void;
38
+ unload(name: string): boolean;
39
+ /** Returns only non-expired skills (does not mutate). */
40
+ getActive(): ActiveSkill[];
41
+ /** Removes expired skills and returns their names. */
42
+ pruneExpired(): string[];
43
+ /** Replace entire store from an array (used on restore). */
44
+ restoreFrom(skills: ActiveSkill[]): void;
45
+ toArray(): ActiveSkill[];
46
+ }
47
+ export declare function skillManagerExtension(pi: ExtensionAPI, config: Config, persistPath?: string): void;
48
+ export default skillManagerExtension;
49
+ //# sourceMappingURL=skill-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-manager.d.ts","sourceRoot":"","sources":["../../src/extensions/skill-manager.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAa/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAwBtE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAmBhE;AA6BD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAuC;IAEtD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,yDAAyD;IACzD,SAAS,IAAI,WAAW,EAAE;IAK1B,sDAAsD;IACtD,YAAY,IAAI,MAAM,EAAE;IAYxB,4DAA4D;IAC5D,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI;IAOxC,OAAO,IAAI,WAAW,EAAE;CAGzB;AAsCD,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAA6B,GACzC,IAAI,CA8MN;AAED,eAAe,qBAAqB,CAAC"}