reeboot 1.3.3 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/container/entrypoint.sh +55 -3
- package/dist/agent-runner/index.d.ts.map +1 -1
- package/dist/agent-runner/index.js +3 -9
- package/dist/agent-runner/index.js.map +1 -1
- package/dist/agent-runner/pi-runner.d.ts +3 -1
- package/dist/agent-runner/pi-runner.d.ts.map +1 -1
- package/dist/agent-runner/pi-runner.js +81 -7
- package/dist/agent-runner/pi-runner.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +3 -0
- package/dist/context.js.map +1 -1
- package/dist/extensions/confirm-destructive.d.ts +9 -0
- package/dist/extensions/confirm-destructive.d.ts.map +1 -0
- package/dist/extensions/confirm-destructive.js +43 -0
- package/dist/extensions/confirm-destructive.js.map +1 -0
- package/dist/extensions/custom-compaction.d.ts +17 -0
- package/dist/extensions/custom-compaction.d.ts.map +1 -0
- package/dist/extensions/custom-compaction.js +99 -0
- package/dist/extensions/custom-compaction.js.map +1 -0
- package/dist/extensions/loader.d.ts.map +1 -1
- package/dist/extensions/loader.js +24 -16
- package/dist/extensions/loader.js.map +1 -1
- package/dist/extensions/protected-paths.d.ts +9 -0
- package/dist/extensions/protected-paths.d.ts.map +1 -0
- package/dist/extensions/protected-paths.js +24 -0
- package/dist/extensions/protected-paths.js.map +1 -0
- package/dist/extensions/scheduler-tool.d.ts +31 -0
- package/dist/extensions/scheduler-tool.d.ts.map +1 -0
- package/dist/extensions/scheduler-tool.js +349 -0
- package/dist/extensions/scheduler-tool.js.map +1 -0
- package/dist/extensions/session-name.d.ts +11 -0
- package/dist/extensions/session-name.d.ts.map +1 -0
- package/dist/extensions/session-name.js +25 -0
- package/dist/extensions/session-name.js.map +1 -0
- package/dist/extensions/skill-manager.d.ts +49 -0
- package/dist/extensions/skill-manager.d.ts.map +1 -0
- package/dist/extensions/skill-manager.js +368 -0
- package/dist/extensions/skill-manager.js.map +1 -0
- package/dist/extensions/token-meter.d.ts +11 -0
- package/dist/extensions/token-meter.d.ts.map +1 -0
- package/dist/extensions/token-meter.js +46 -0
- package/dist/extensions/token-meter.js.map +1 -0
- package/dist/extensions/web-search.d.ts +39 -0
- package/dist/extensions/web-search.d.ts.map +1 -0
- package/dist/extensions/web-search.js +368 -0
- package/dist/extensions/web-search.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/setup-wizard.d.ts +1 -0
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +4 -3
- package/dist/setup-wizard.js.map +1 -1
- package/dist/utils/agent-dir.d.ts +11 -0
- package/dist/utils/agent-dir.d.ts.map +1 -0
- package/dist/utils/agent-dir.js +26 -0
- package/dist/utils/agent-dir.js.map +1 -0
- package/dist/wizard/detect-pi-auth.d.ts +19 -0
- package/dist/wizard/detect-pi-auth.d.ts.map +1 -0
- package/dist/wizard/detect-pi-auth.js +36 -0
- package/dist/wizard/detect-pi-auth.js.map +1 -0
- package/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +1 -0
- package/dist/wizard/index.js.map +1 -1
- package/dist/wizard/probe-searxng.d.ts +9 -0
- package/dist/wizard/probe-searxng.d.ts.map +1 -0
- package/dist/wizard/probe-searxng.js +30 -0
- package/dist/wizard/probe-searxng.js.map +1 -0
- package/dist/wizard/steps/launch.d.ts +1 -0
- package/dist/wizard/steps/launch.d.ts.map +1 -1
- package/dist/wizard/steps/launch.js +5 -4
- package/dist/wizard/steps/launch.js.map +1 -1
- package/dist/wizard/steps/provider.d.ts +1 -0
- package/dist/wizard/steps/provider.d.ts.map +1 -1
- package/dist/wizard/steps/provider.js +18 -1
- package/dist/wizard/steps/provider.js.map +1 -1
- package/dist/wizard/steps/web-search.js +33 -10
- package/dist/wizard/steps/web-search.js.map +1 -1
- package/extensions/web-search.ts +2 -3
- package/package.json +2 -2
|
@@ -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
|
-
//
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,qBAAqB,EAAuB,MAAM,+BAA+B,CAAC;AAE3F,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAIpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,qBAAqB,EAAuB,MAAM,+BAA+B,CAAC;AAE3F,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAIpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,+EAA+E;AAC/E,4DAA4D;AAC5D,gFAAgF;AAChF,kFAAkF;AAClF,+CAA+C;AAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClD,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAExD,gFAAgF;AAChF,kFAAkF;AAClF,wBAAwB;AAExB,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,IAAI,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC;IAE5C,4CAA4C;IAC5C,MAAM,cAAc,GAAS,IAAI,CAAC,OAAO,IAAe,IAAI,CAAC;IAC7D,MAAM,cAAc,GAAS,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC;IAC9D,MAAM,gBAAgB,GAAO,IAAI,CAAC,eAAe,IAAO,IAAI,CAAC;IAC7D,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,IAAQ,KAAK,CAAC;IAC9D,MAAM,kBAAkB,GAAK,IAAI,CAAC,YAAY,IAAU,IAAI,CAAC;IAC7D,MAAM,iBAAiB,GAAM,IAAI,CAAC,iBAAiB,IAAK,IAAI,CAAC;IAC7D,MAAM,gBAAgB,GAAO,IAAI,CAAC,cAAc,IAAQ,IAAI,CAAC;IAC7D,MAAM,iBAAiB,GAAM,IAAI,CAAC,WAAW,IAAW,IAAI,CAAC;IAC7D,MAAM,gBAAgB,GAAQ,IAAY,CAAC,UAAU,IAAI,IAAI,CAAC;IAC9D,MAAM,mBAAmB,GAAK,IAAY,CAAC,aAAa,IAAI,IAAI,CAAC;IAEjE,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,mEAAmE;IACnE,4EAA4E;IAC5E,mDAAmD;IACnD,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACpB,6DAA6D;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC5E,IAAI,CAAC;gBACH,4EAA4E;gBAC5E,6EAA6E;gBAC7E,qGAAqG;YACvG,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IAC/E,0EAA0E;IAE1E,gEAAgE;IAChE,0EAA0E;IAC1E,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CACjC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;SAC/C,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;SAC/D,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEvB,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACnD,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC/C,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;YAC5C,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACjD,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC9C,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC9C,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;YAC3C,IAAI,GAAG,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,GAAG,EAAE,OAAO;gBAAE,MAAO,GAAG,CAAC,OAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,GAAG,EAAE,OAAO;gBAAE,MAAO,GAAG,CAAC,OAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,YAAY,CAAC,OAAsB,EAAE,MAAc;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEvD,gFAAgF;IAChF,MAAM,wBAAwB,GAAa,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC;IAC5C,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QACzB,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,IAAI,qBAAqB,CAAC;QAC/B,GAAG,EAAE,OAAO,CAAC,aAAa;QAC1B,QAAQ;QACR,kBAAkB;QAClB,wBAAwB;QACxB,oBAAoB,EAAE,CAAC,kBAAkB,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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,QAwSxC"}
|
|
@@ -0,0 +1,349 @@
|
|
|
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
|
+
promptSnippet: 'Set a one-shot non-blocking delay that fires a new agent turn',
|
|
142
|
+
parameters: Type.Object({
|
|
143
|
+
seconds: Type.Number({ description: 'Delay in seconds (1–3600)' }),
|
|
144
|
+
message: Type.String({ description: 'Message to include when the timer fires' }),
|
|
145
|
+
id: Type.Optional(Type.String({ description: 'Timer id (optional). Same id cancels previous timer.' })),
|
|
146
|
+
}),
|
|
147
|
+
execute: async (_callId, params) => {
|
|
148
|
+
const id = params.id ?? `timer-${Date.now()}`;
|
|
149
|
+
try {
|
|
150
|
+
manager.setTimer(pi, params.seconds, params.message, id);
|
|
151
|
+
return {
|
|
152
|
+
content: [
|
|
153
|
+
{
|
|
154
|
+
type: 'text',
|
|
155
|
+
text: `Timer "${id}" set for ${params.seconds}s: "${params.message}"`,
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
details: { id, seconds: params.seconds, message: params.message },
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: 'text', text: err.message }],
|
|
164
|
+
details: {},
|
|
165
|
+
isError: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
// ─── heartbeat tool ───────────────────────────────────────────────────────
|
|
171
|
+
pi.registerTool({
|
|
172
|
+
name: 'heartbeat',
|
|
173
|
+
label: 'Heartbeat',
|
|
174
|
+
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.',
|
|
175
|
+
promptSnippet: 'Manage a recurring periodic turn trigger',
|
|
176
|
+
parameters: Type.Object({
|
|
177
|
+
action: Type.Union([Type.Literal('start'), Type.Literal('stop'), Type.Literal('status')], {
|
|
178
|
+
description: 'Action to perform',
|
|
179
|
+
}),
|
|
180
|
+
interval_seconds: Type.Optional(Type.Number({ description: 'Interval in seconds (10–3600). Required for start.' })),
|
|
181
|
+
message: Type.Optional(Type.String({ description: 'Message to include on each tick. Required for start.' })),
|
|
182
|
+
}),
|
|
183
|
+
execute: async (_callId, params) => {
|
|
184
|
+
if (params.action === 'start') {
|
|
185
|
+
const intervalSeconds = params.interval_seconds ?? 60;
|
|
186
|
+
const message = params.message ?? 'Heartbeat tick';
|
|
187
|
+
try {
|
|
188
|
+
manager.startHeartbeat(pi, intervalSeconds, message);
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: 'text',
|
|
193
|
+
text: `Heartbeat started: every ${intervalSeconds}s, message="${message}"`,
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
details: { intervalSeconds, message },
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
return {
|
|
201
|
+
content: [{ type: 'text', text: err.message }],
|
|
202
|
+
details: {},
|
|
203
|
+
isError: true,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (params.action === 'stop') {
|
|
208
|
+
manager.stopHeartbeat();
|
|
209
|
+
return {
|
|
210
|
+
content: [{ type: 'text', text: 'Heartbeat stopped.' }],
|
|
211
|
+
details: {},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// status
|
|
215
|
+
const status = manager.getHeartbeatStatus();
|
|
216
|
+
return {
|
|
217
|
+
content: [{ type: 'text', text: status }],
|
|
218
|
+
details: {},
|
|
219
|
+
};
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
// ─── schedule_task ────────────────────────────────────────────────────────
|
|
223
|
+
pi.registerTool({
|
|
224
|
+
name: 'schedule_task',
|
|
225
|
+
label: 'Schedule Task',
|
|
226
|
+
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.',
|
|
227
|
+
promptSnippet: 'Schedule a task by cron, interval, or datetime',
|
|
228
|
+
parameters: Type.Object({
|
|
229
|
+
schedule: Type.String({
|
|
230
|
+
description: 'Schedule: cron expression, ISO datetime, or interval like "every 30m", "hourly", "daily"',
|
|
231
|
+
}),
|
|
232
|
+
prompt: Type.String({ description: 'Prompt to dispatch to the agent on schedule' }),
|
|
233
|
+
contextId: Type.Optional(Type.String({ description: 'Context to run in (default: main)' })),
|
|
234
|
+
context_mode: Type.Optional(Type.String({ description: 'Context mode: "shared" (default) or "isolated"' })),
|
|
235
|
+
}),
|
|
236
|
+
execute: async (_id, params) => {
|
|
237
|
+
const tools = getTools();
|
|
238
|
+
return tools.schedule_task(params);
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
// ─── list_tasks ───────────────────────────────────────────────────────────
|
|
242
|
+
pi.registerTool({
|
|
243
|
+
name: 'list_tasks',
|
|
244
|
+
label: 'List Tasks',
|
|
245
|
+
description: 'List all scheduled tasks with rich status: id, schedule, prompt, status, next run time (relative), last result, context mode.',
|
|
246
|
+
promptSnippet: 'List all scheduled tasks with status and next run time',
|
|
247
|
+
parameters: Type.Object({}),
|
|
248
|
+
execute: async () => {
|
|
249
|
+
const tools = getTools();
|
|
250
|
+
return tools.list_tasks({});
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
// ─── cancel_task ─────────────────────────────────────────────────────────
|
|
254
|
+
pi.registerTool({
|
|
255
|
+
name: 'cancel_task',
|
|
256
|
+
label: 'Cancel Task',
|
|
257
|
+
description: 'Cancel and delete a scheduled task by its ID.',
|
|
258
|
+
promptSnippet: 'Cancel and delete a scheduled task by ID',
|
|
259
|
+
parameters: Type.Object({
|
|
260
|
+
task_id: Type.String({ description: 'Task ID to cancel (from list_tasks)' }),
|
|
261
|
+
}),
|
|
262
|
+
execute: async (_id, params) => {
|
|
263
|
+
const tools = getTools();
|
|
264
|
+
return tools.cancel_task(params);
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
// ─── pause_task ───────────────────────────────────────────────────────────
|
|
268
|
+
pi.registerTool({
|
|
269
|
+
name: 'pause_task',
|
|
270
|
+
label: 'Pause Task',
|
|
271
|
+
description: 'Pause a scheduled task. The task will not run until resumed.',
|
|
272
|
+
promptSnippet: 'Pause a scheduled task without deleting it',
|
|
273
|
+
parameters: Type.Object({
|
|
274
|
+
task_id: Type.String({ description: 'Task ID to pause (from list_tasks)' }),
|
|
275
|
+
}),
|
|
276
|
+
execute: async (_id, params) => {
|
|
277
|
+
const tools = getTools();
|
|
278
|
+
return tools.pause_task(params);
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
// ─── resume_task ──────────────────────────────────────────────────────────
|
|
282
|
+
pi.registerTool({
|
|
283
|
+
name: 'resume_task',
|
|
284
|
+
label: 'Resume Task',
|
|
285
|
+
description: 'Resume a paused task. next_run is recomputed from now.',
|
|
286
|
+
promptSnippet: 'Resume a paused task, recomputing its next run',
|
|
287
|
+
parameters: Type.Object({
|
|
288
|
+
task_id: Type.String({ description: 'Task ID to resume (from list_tasks)' }),
|
|
289
|
+
}),
|
|
290
|
+
execute: async (_id, params) => {
|
|
291
|
+
const tools = getTools();
|
|
292
|
+
return tools.resume_task(params);
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
// ─── update_task ──────────────────────────────────────────────────────────
|
|
296
|
+
pi.registerTool({
|
|
297
|
+
name: 'update_task',
|
|
298
|
+
label: 'Update Task',
|
|
299
|
+
description: "Update a task's prompt, schedule, or context_mode. If schedule changes, next_run is recomputed.",
|
|
300
|
+
promptSnippet: "Update a task's prompt, schedule, or context mode",
|
|
301
|
+
parameters: Type.Object({
|
|
302
|
+
task_id: Type.String({ description: 'Task ID to update (from list_tasks)' }),
|
|
303
|
+
schedule: Type.Optional(Type.String({ description: 'New schedule string' })),
|
|
304
|
+
prompt: Type.Optional(Type.String({ description: 'New prompt' })),
|
|
305
|
+
context_mode: Type.Optional(Type.String({ description: 'New context mode: "shared" or "isolated"' })),
|
|
306
|
+
}),
|
|
307
|
+
execute: async (_id, params) => {
|
|
308
|
+
const tools = getTools();
|
|
309
|
+
return tools.update_task(params);
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
// ─── /tasks slash command ─────────────────────────────────────────────────
|
|
313
|
+
pi.registerCommand({
|
|
314
|
+
name: 'tasks',
|
|
315
|
+
description: 'Task management. Use "/tasks due" to list overdue tasks, or "/tasks" to list all active tasks.',
|
|
316
|
+
execute: async (args) => {
|
|
317
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
318
|
+
const { getDb } = require('../db/index.js');
|
|
319
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
320
|
+
const { getTasksDue, formatTasksDue } = require('../scheduler.js');
|
|
321
|
+
const db = getDb();
|
|
322
|
+
const subCmd = args?.trim().toLowerCase();
|
|
323
|
+
if (subCmd === 'due') {
|
|
324
|
+
const due = getTasksDue(db);
|
|
325
|
+
return formatTasksDue(due);
|
|
326
|
+
}
|
|
327
|
+
// List all active tasks
|
|
328
|
+
const tasks = db
|
|
329
|
+
.prepare("SELECT * FROM tasks WHERE status='active' ORDER BY next_run ASC")
|
|
330
|
+
.all();
|
|
331
|
+
if (tasks.length === 0) {
|
|
332
|
+
return 'No active tasks.';
|
|
333
|
+
}
|
|
334
|
+
const now = Date.now();
|
|
335
|
+
const lines = tasks.map((t) => {
|
|
336
|
+
const nextRunMs = t.next_run ? new Date(t.next_run).getTime() : null;
|
|
337
|
+
const overdue = nextRunMs && nextRunMs <= now;
|
|
338
|
+
const rel = overdue
|
|
339
|
+
? 'OVERDUE'
|
|
340
|
+
: nextRunMs
|
|
341
|
+
? `in ${Math.round((nextRunMs - now) / 60_000)}m`
|
|
342
|
+
: 'unknown';
|
|
343
|
+
return `[${t.id}] ${(t.schedule_value || t.schedule).padEnd(20)} → ${t.prompt.slice(0, 40)} | next: ${rel}`;
|
|
344
|
+
});
|
|
345
|
+
return lines.join('\n');
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
//# 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
|