reeboot 1.3.3 → 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 (86) 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/config.d.ts +7 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +2 -1
  12. package/dist/config.js.map +1 -1
  13. package/dist/context.d.ts.map +1 -1
  14. package/dist/context.js +3 -0
  15. package/dist/context.js.map +1 -1
  16. package/dist/extensions/confirm-destructive.d.ts +9 -0
  17. package/dist/extensions/confirm-destructive.d.ts.map +1 -0
  18. package/dist/extensions/confirm-destructive.js +43 -0
  19. package/dist/extensions/confirm-destructive.js.map +1 -0
  20. package/dist/extensions/custom-compaction.d.ts +17 -0
  21. package/dist/extensions/custom-compaction.d.ts.map +1 -0
  22. package/dist/extensions/custom-compaction.js +99 -0
  23. package/dist/extensions/custom-compaction.js.map +1 -0
  24. package/dist/extensions/loader.d.ts.map +1 -1
  25. package/dist/extensions/loader.js +24 -16
  26. package/dist/extensions/loader.js.map +1 -1
  27. package/dist/extensions/protected-paths.d.ts +9 -0
  28. package/dist/extensions/protected-paths.d.ts.map +1 -0
  29. package/dist/extensions/protected-paths.js +24 -0
  30. package/dist/extensions/protected-paths.js.map +1 -0
  31. package/dist/extensions/scheduler-tool.d.ts +31 -0
  32. package/dist/extensions/scheduler-tool.d.ts.map +1 -0
  33. package/dist/extensions/scheduler-tool.js +341 -0
  34. package/dist/extensions/scheduler-tool.js.map +1 -0
  35. package/dist/extensions/session-name.d.ts +11 -0
  36. package/dist/extensions/session-name.d.ts.map +1 -0
  37. package/dist/extensions/session-name.js +25 -0
  38. package/dist/extensions/session-name.js.map +1 -0
  39. package/dist/extensions/skill-manager.d.ts +49 -0
  40. package/dist/extensions/skill-manager.d.ts.map +1 -0
  41. package/dist/extensions/skill-manager.js +368 -0
  42. package/dist/extensions/skill-manager.js.map +1 -0
  43. package/dist/extensions/token-meter.d.ts +11 -0
  44. package/dist/extensions/token-meter.d.ts.map +1 -0
  45. package/dist/extensions/token-meter.js +46 -0
  46. package/dist/extensions/token-meter.js.map +1 -0
  47. package/dist/extensions/web-search.d.ts +39 -0
  48. package/dist/extensions/web-search.d.ts.map +1 -0
  49. package/dist/extensions/web-search.js +366 -0
  50. package/dist/extensions/web-search.js.map +1 -0
  51. package/dist/index.js +7 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/server.d.ts.map +1 -1
  54. package/dist/server.js +3 -3
  55. package/dist/server.js.map +1 -1
  56. package/dist/setup-wizard.d.ts +1 -0
  57. package/dist/setup-wizard.d.ts.map +1 -1
  58. package/dist/setup-wizard.js +4 -3
  59. package/dist/setup-wizard.js.map +1 -1
  60. package/dist/utils/agent-dir.d.ts +11 -0
  61. package/dist/utils/agent-dir.d.ts.map +1 -0
  62. package/dist/utils/agent-dir.js +26 -0
  63. package/dist/utils/agent-dir.js.map +1 -0
  64. package/dist/wizard/detect-pi-auth.d.ts +19 -0
  65. package/dist/wizard/detect-pi-auth.d.ts.map +1 -0
  66. package/dist/wizard/detect-pi-auth.js +36 -0
  67. package/dist/wizard/detect-pi-auth.js.map +1 -0
  68. package/dist/wizard/index.d.ts.map +1 -1
  69. package/dist/wizard/index.js +1 -0
  70. package/dist/wizard/index.js.map +1 -1
  71. package/dist/wizard/probe-searxng.d.ts +9 -0
  72. package/dist/wizard/probe-searxng.d.ts.map +1 -0
  73. package/dist/wizard/probe-searxng.js +30 -0
  74. package/dist/wizard/probe-searxng.js.map +1 -0
  75. package/dist/wizard/steps/launch.d.ts +1 -0
  76. package/dist/wizard/steps/launch.d.ts.map +1 -1
  77. package/dist/wizard/steps/launch.js +5 -4
  78. package/dist/wizard/steps/launch.js.map +1 -1
  79. package/dist/wizard/steps/provider.d.ts +1 -0
  80. package/dist/wizard/steps/provider.d.ts.map +1 -1
  81. package/dist/wizard/steps/provider.js +18 -1
  82. package/dist/wizard/steps/provider.js.map +1 -1
  83. package/dist/wizard/steps/web-search.js +33 -10
  84. package/dist/wizard/steps/web-search.js.map +1 -1
  85. package/extensions/web-search.ts +2 -3
  86. package/package.json +1 -1
@@ -15,10 +15,13 @@ import { homedir } from 'os';
15
15
  import { join, dirname, resolve } from 'path';
16
16
  import { fileURLToPath } from 'url';
17
17
  const __dirname = dirname(fileURLToPath(import.meta.url));
18
- // Resolve the extensions/ and skills/ directories at the reeboot package root
19
- // Compiled output is at dist/ so we go up two levels: dist/extensions/ dist/ → reeboot/ then across to extensions/
18
+ // Resolve the extensions/ and skills/ directories at the reeboot package root.
19
+ // __dirname is dist/extensions/ (compiled output location).
20
+ // All bundled extensions are compiled to dist/extensions/*.js via the main tsc.
21
+ // In vitest (source mode), __dirname = src/extensions/ so .js files don't exist —
22
+ // importExt() falls back to .ts for that case.
20
23
  const PACKAGE_ROOT = resolve(__dirname, '../../');
21
- const BUNDLED_EXTENSIONS_DIR = join(PACKAGE_ROOT, 'extensions');
24
+ const BUNDLED_EXTENSIONS_DIR = join(__dirname);
22
25
  const BUNDLED_SKILLS_DIR = join(PACKAGE_ROOT, 'skills');
23
26
  // ─── getBundledFactories ─────────────────────────────────────────────────────
24
27
  // Returns the list of bundled ExtensionFactory functions based on config toggles.
@@ -43,7 +46,7 @@ export function getBundledFactories(config) {
43
46
  if (sandboxEnabled) {
44
47
  factories.push((pi) => {
45
48
  // Lazy-load so missing deps don't break startup in CI / test
46
- const sandboxPath = join(BUNDLED_EXTENSIONS_DIR, 'sandbox', 'index.ts');
49
+ const sandboxPath = join(PACKAGE_ROOT, 'extensions', 'sandbox', 'index.ts');
47
50
  try {
48
51
  // Extensions are loaded by DefaultResourceLoader as file paths; we register
49
52
  // a no-op factory here and let the loader discover the file-based extension.
@@ -54,65 +57,70 @@ export function getBundledFactories(config) {
54
57
  }
55
58
  // Simple file-based extensions registered as inline factories for reliability.
56
59
  // We use dynamic import factories so TypeScript strict mode is satisfied.
60
+ // Helper: try compiled .js first (production dist/extensions/),
61
+ // fall back to .ts (vitest runs from src/extensions/ without compilation)
62
+ const importExt = (name) => import(join(BUNDLED_EXTENSIONS_DIR, `${name}.js`))
63
+ .catch(() => import(join(BUNDLED_EXTENSIONS_DIR, `${name}.ts`)))
64
+ .catch(() => null);
57
65
  if (confirmEnabled) {
58
66
  factories.push(async (pi) => {
59
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'confirm-destructive.ts')).catch(() => null);
67
+ const mod = await importExt('confirm-destructive');
60
68
  if (mod?.default)
61
69
  mod.default(pi);
62
70
  });
63
71
  }
64
72
  if (protectedEnabled) {
65
73
  factories.push(async (pi) => {
66
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'protected-paths.ts')).catch(() => null);
74
+ const mod = await importExt('protected-paths');
67
75
  if (mod?.default)
68
76
  mod.default(pi);
69
77
  });
70
78
  }
71
79
  if (sessionNameEnabled) {
72
80
  factories.push(async (pi) => {
73
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'session-name.ts')).catch(() => null);
81
+ const mod = await importExt('session-name');
74
82
  if (mod?.default)
75
83
  mod.default(pi);
76
84
  });
77
85
  }
78
86
  if (compactionEnabled) {
79
87
  factories.push(async (pi) => {
80
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'custom-compaction.ts')).catch(() => null);
88
+ const mod = await importExt('custom-compaction');
81
89
  if (mod?.default)
82
90
  mod.default(pi);
83
91
  });
84
92
  }
85
93
  if (gitCheckpointEnabled) {
86
94
  factories.push(async (pi) => {
87
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'git-checkpoint.ts')).catch(() => null);
95
+ const mod = await importExt('git-checkpoint');
88
96
  if (mod?.default)
89
97
  mod.default(pi);
90
98
  });
91
99
  }
92
100
  if (schedulerEnabled) {
93
101
  factories.push(async (pi) => {
94
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'scheduler-tool.ts')).catch(() => null);
102
+ const mod = await importExt('scheduler-tool');
95
103
  if (mod?.default)
96
104
  mod.default(pi);
97
105
  });
98
106
  }
99
107
  if (tokenMeterEnabled) {
100
108
  factories.push(async (pi) => {
101
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'token-meter.ts')).catch(() => null);
109
+ const mod = await importExt('token-meter');
102
110
  if (mod?.default)
103
111
  mod.default(pi);
104
112
  });
105
113
  }
106
114
  if (webSearchEnabled) {
107
115
  factories.push(async (pi) => {
108
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'web-search.ts')).catch(() => null);
116
+ const mod = await importExt('web-search');
109
117
  if (mod?.default)
110
- await mod.default(pi);
118
+ await mod.default(pi, config);
111
119
  });
112
120
  }
113
121
  if (skillManagerEnabled) {
114
122
  factories.push(async (pi) => {
115
- const mod = await import(join(BUNDLED_EXTENSIONS_DIR, 'skill-manager.ts')).catch(() => null);
123
+ const mod = await importExt('skill-manager');
116
124
  if (mod?.default)
117
125
  await mod.default(pi, config);
118
126
  });
@@ -121,13 +129,13 @@ export function getBundledFactories(config) {
121
129
  }
122
130
  // ─── createLoader ─────────────────────────────────────────────────────────────
123
131
  export function createLoader(context, config) {
124
- const agentDir = join(homedir(), '.reeboot');
132
+ const agentDir = join(homedir(), '.reeboot', 'agent');
125
133
  const extensionFactories = getBundledFactories(config);
126
134
  // For sandbox, use additionalExtensionPaths so DefaultResourceLoader handles it
127
135
  const additionalExtensionPaths = [];
128
136
  const core = config?.extensions?.core ?? {};
129
137
  if (core.sandbox ?? true) {
130
- additionalExtensionPaths.push(join(BUNDLED_EXTENSIONS_DIR, 'sandbox', 'index.ts'));
138
+ additionalExtensionPaths.push(join(PACKAGE_ROOT, 'extensions', 'sandbox', 'index.ts'));
131
139
  }
132
140
  return new DefaultResourceLoader({
133
141
  cwd: context.workspacePath,
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extensions/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extensions/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Protected Paths Extension
3
+ *
4
+ * Blocks write and edit operations to protected paths.
5
+ * Useful for preventing accidental modifications to sensitive files.
6
+ */
7
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
8
+ export default function (pi: ExtensionAPI): void;
9
+ //# sourceMappingURL=protected-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-paths.d.ts","sourceRoot":"","sources":["../../src/extensions/protected-paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAoBxC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Protected Paths Extension
3
+ *
4
+ * Blocks write and edit operations to protected paths.
5
+ * Useful for preventing accidental modifications to sensitive files.
6
+ */
7
+ export default function (pi) {
8
+ const protectedPaths = [".env", ".git/", "node_modules/"];
9
+ pi.on("tool_call", async (event, ctx) => {
10
+ if (event.toolName !== "write" && event.toolName !== "edit") {
11
+ return undefined;
12
+ }
13
+ const path = event.input.path;
14
+ const isProtected = protectedPaths.some((p) => path.includes(p));
15
+ if (isProtected) {
16
+ if (ctx.hasUI) {
17
+ ctx.ui.notify(`Blocked write to protected path: ${path}`, "warning");
18
+ }
19
+ return { block: true, reason: `Path "${path}" is protected` };
20
+ }
21
+ return undefined;
22
+ });
23
+ }
24
+ //# sourceMappingURL=protected-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-paths.js","sourceRoot":"","sources":["../../src/extensions/protected-paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,OAAO,WAAW,EAAgB;IACxC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAE1D,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAc,CAAC;QACxC,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oCAAoC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAC/D,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Scheduler Tool Extension
3
+ *
4
+ * Registers schedule_task, list_tasks, cancel_task, pause_task, resume_task,
5
+ * update_task tools backed by SQLite, plus the /tasks slash command.
6
+ * Uses getDb() for DB access and integrates with the Scheduler singleton.
7
+ *
8
+ * Also registers:
9
+ * - timer: one-shot non-blocking wait (fires pi.sendMessage triggerTurn)
10
+ * - heartbeat: periodic non-blocking wake-up (start/stop/status)
11
+ * - bash pre-hook: sleep interceptor (blocks sleep when sole/last command)
12
+ * - session_shutdown: cleans up all in-session timers and heartbeat
13
+ */
14
+ import type { ExtensionAPI } from '@mariozechner/pi-coding-agent';
15
+ /**
16
+ * Returns true if sleep is the sole command or the last command in a chain.
17
+ * Splits on && and single | (not || which is OR-fallback).
18
+ */
19
+ export declare function isSleepOnlyOrLast(command: string): boolean;
20
+ export declare class TimerManager {
21
+ private _timers;
22
+ private _heartbeat;
23
+ setTimer(pi: ExtensionAPI, seconds: number, message: string, id: string): void;
24
+ cancelTimer(id: string): void;
25
+ startHeartbeat(pi: ExtensionAPI, intervalSeconds: number, message: string): void;
26
+ stopHeartbeat(): void;
27
+ getHeartbeatStatus(): string;
28
+ clearAll(): void;
29
+ }
30
+ export default function (pi: ExtensionAPI): void;
31
+ //# sourceMappingURL=scheduler-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-tool.d.ts","sourceRoot":"","sources":["../../src/extensions/scheduler-tool.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAIlE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM1D;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAoD;IACnE,OAAO,CAAC,UAAU,CAMF;IAIhB,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAoB9E,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAU7B,cAAc,CAAC,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IA6BhF,aAAa,IAAI,IAAI;IAOrB,kBAAkB,IAAI,MAAM;IAQ5B,QAAQ,IAAI,IAAI;CAKjB;AAID,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAgSxC"}
@@ -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"}