@amaster.ai/pi-task-scheduler 0.1.2-beta.4 → 0.1.2-beta.41
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/README.md +95 -28
- package/dist/extension.d.ts +5 -2
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +140 -235
- package/dist/extension.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -6
- package/dist/index.js.map +1 -1
- package/dist/json-file.d.ts +3 -0
- package/dist/json-file.d.ts.map +1 -0
- package/dist/json-file.js +48 -0
- package/dist/json-file.js.map +1 -0
- package/dist/stores.d.ts +26 -0
- package/dist/stores.d.ts.map +1 -0
- package/dist/stores.js +148 -0
- package/dist/stores.js.map +1 -0
- package/dist/tools.d.ts +4 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +174 -0
- package/dist/tools.js.map +1 -0
- package/package.json +15 -10
- package/preview.png +0 -0
package/README.md
CHANGED
|
@@ -1,27 +1,83 @@
|
|
|
1
1
|
# @amaster.ai/pi-task-scheduler
|
|
2
2
|
|
|
3
|
+

|
|
4
|
+
|
|
3
5
|
Scheduled task domain types, execution scheduler, and pi agent extension.
|
|
4
6
|
|
|
5
7
|
The package owns schedule parsing, task lifecycle state, process-local timers,
|
|
6
8
|
runner callbacks, scheduler hooks, and LLM-callable tools for autonomous task
|
|
7
9
|
management.
|
|
8
10
|
|
|
9
|
-
##
|
|
11
|
+
## Storage
|
|
12
|
+
|
|
13
|
+
The package ships with a built-in file-based storage (default, zero external
|
|
14
|
+
dependencies):
|
|
15
|
+
|
|
16
|
+
- `JsonScheduledTaskStore` — persists tasks to a JSON file with atomic writes
|
|
17
|
+
- `FileSchedulerLock` — PID-based file lock for single-owner execution
|
|
18
|
+
|
|
19
|
+
For database-backed storage (multi-tenant, Prisma), use
|
|
20
|
+
`@amaster.ai/pi-storage/scheduler` which implements the same interfaces with
|
|
21
|
+
`DbScheduledTaskStore` and `RedisSchedulerLock`.
|
|
22
|
+
|
|
23
|
+
### Default (file storage)
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import {
|
|
27
|
+
PersistentTaskScheduler,
|
|
28
|
+
JsonScheduledTaskStore,
|
|
29
|
+
FileSchedulerLock,
|
|
30
|
+
} from "@amaster.ai/pi-task-scheduler";
|
|
31
|
+
|
|
32
|
+
const scheduler = new PersistentTaskScheduler({
|
|
33
|
+
store: new JsonScheduledTaskStore("/var/lib/pi/tasks.json"),
|
|
34
|
+
lock: new FileSchedulerLock("/var/lib/pi/tasks.lock"),
|
|
35
|
+
runner: async (task, run) => {
|
|
36
|
+
await runPrompt(task.prompt, { sessionId: run.sessionId });
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
await scheduler.start();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Custom storage
|
|
44
|
+
|
|
45
|
+
Implement `ScheduledTaskStore` and `SchedulerLock` interfaces for any backend
|
|
46
|
+
(database, Redis, etc.):
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { PersistentTaskScheduler } from "@amaster.ai/pi-task-scheduler";
|
|
50
|
+
|
|
51
|
+
const scheduler = new PersistentTaskScheduler({
|
|
52
|
+
store: myCustomStore, // implements ScheduledTaskStore
|
|
53
|
+
lock: myCustomLock, // implements SchedulerLock
|
|
54
|
+
runner: async (task, run) => {
|
|
55
|
+
await runPrompt(task.prompt, { sessionId: run.sessionId });
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await scheduler.start();
|
|
60
|
+
```
|
|
10
61
|
|
|
11
|
-
|
|
12
|
-
pi chat turn. Applications provide both:
|
|
62
|
+
## Integration Modes
|
|
13
63
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- a `ScheduledTaskRunner` callback for the actual work
|
|
64
|
+
The package provides two integration paths depending on who controls the
|
|
65
|
+
scheduler lifecycle.
|
|
17
66
|
|
|
18
|
-
|
|
67
|
+
### Mode 1: Extension auto-discovery (standalone / CLI)
|
|
19
68
|
|
|
20
|
-
|
|
69
|
+
When installed as an npm dependency with the `pi.extensions` field in
|
|
70
|
+
`package.json`, the runtime auto-discovers and loads the extension. The
|
|
71
|
+
extension creates its own `PersistentTaskScheduler` with file-based storage
|
|
72
|
+
(`JsonScheduledTaskStore` + `FileSchedulerLock`) — fully self-contained, no
|
|
73
|
+
external infrastructure needed.
|
|
21
74
|
|
|
22
|
-
|
|
75
|
+
```
|
|
76
|
+
pi.extensions → session_start → creates file-based scheduler → registers tools + commands
|
|
77
|
+
```
|
|
23
78
|
|
|
24
|
-
- **
|
|
79
|
+
- **Storage**: `<agentDir>/data/tasks.json` (configurable via `dataDir`)
|
|
80
|
+
- **Lifecycle**: scheduler starts on `session_start`, stops on `session_shutdown`
|
|
25
81
|
- **Commands**: `/pi-scheduler-status`, `/pi-scheduler-list`, `/pi-scheduler-run-now`
|
|
26
82
|
- **LLM Tools**: `scheduler_create`, `scheduler_list`, `scheduler_get`, `scheduler_update`, `scheduler_delete`, `scheduler_run_now`
|
|
27
83
|
|
|
@@ -30,39 +86,50 @@ Configuration via settings key `pi-scheduler`:
|
|
|
30
86
|
```json
|
|
31
87
|
{
|
|
32
88
|
"pi-scheduler": {
|
|
33
|
-
"enabled": true,
|
|
34
89
|
"dataDir": "/custom/path"
|
|
35
90
|
}
|
|
36
91
|
}
|
|
37
92
|
```
|
|
38
93
|
|
|
39
|
-
|
|
94
|
+
### Mode 2: Dependency import (host-controlled)
|
|
40
95
|
|
|
41
|
-
|
|
96
|
+
When the host process owns the scheduler instance (e.g. backed by a database),
|
|
97
|
+
it bypasses the extension and registers tools directly using
|
|
98
|
+
`createSchedulerTools`:
|
|
42
99
|
|
|
43
100
|
```ts
|
|
101
|
+
import { createSchedulerTools } from "@amaster.ai/pi-task-scheduler/tools";
|
|
44
102
|
import { PersistentTaskScheduler } from "@amaster.ai/pi-task-scheduler";
|
|
45
|
-
import {
|
|
46
|
-
FileSchedulerLock,
|
|
47
|
-
JsonScheduledTaskStore,
|
|
48
|
-
} from "@amaster.ai/pi-storage/scheduler";
|
|
49
103
|
|
|
50
104
|
const scheduler = new PersistentTaskScheduler({
|
|
51
|
-
store:
|
|
52
|
-
lock:
|
|
53
|
-
runner
|
|
54
|
-
await runPrompt(task.prompt, { sessionId: run.sessionId });
|
|
55
|
-
},
|
|
56
|
-
hooks: {
|
|
57
|
-
onTaskFailed: ({ task, error }) => {
|
|
58
|
-
console.warn("scheduled task failed", task.id, error);
|
|
59
|
-
},
|
|
60
|
-
},
|
|
105
|
+
store: myStore,
|
|
106
|
+
lock: myLock,
|
|
107
|
+
runner,
|
|
61
108
|
});
|
|
62
|
-
|
|
63
109
|
await scheduler.start();
|
|
110
|
+
|
|
111
|
+
// Returns ToolDefinition[] — register via your tool injection mechanism
|
|
112
|
+
const tools = createSchedulerTools(scheduler);
|
|
64
113
|
```
|
|
65
114
|
|
|
115
|
+
In this mode the auto-discovered extension should be filtered out to prevent
|
|
116
|
+
double tool registration. The host manages scheduler start/stop independently.
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
host creates scheduler → createSchedulerTools(scheduler) → tools injected into runtime
|
|
120
|
+
→ extension filtered from auto-discovery
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Choosing a mode
|
|
124
|
+
|
|
125
|
+
| | Extension (Mode 1) | Dependency (Mode 2) |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| Storage | File-based (JSON) | Host-controlled |
|
|
128
|
+
| Scheduler lifecycle | Extension manages | Host manages |
|
|
129
|
+
| Tool registration | Extension registers | Host registers |
|
|
130
|
+
| Multi-tenant | No | Yes |
|
|
131
|
+
| Use case | CLI / standalone agent | Server / custom host |
|
|
132
|
+
|
|
66
133
|
## Scheduling
|
|
67
134
|
|
|
68
135
|
Tasks support three schedule types:
|
package/dist/extension.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { type ScheduledTaskStore, type SchedulerLock, type TaskScheduler } from './index.js';
|
|
2
3
|
export type PiSchedulerExtensionConfig = {
|
|
3
|
-
enabled?: boolean;
|
|
4
4
|
dataDir?: string;
|
|
5
|
+
store?: ScheduledTaskStore;
|
|
6
|
+
lock?: SchedulerLock;
|
|
7
|
+
scheduler?: TaskScheduler;
|
|
5
8
|
};
|
|
6
|
-
export default function taskSchedulerExtension(pi: ExtensionAPI): void;
|
|
9
|
+
export default function taskSchedulerExtension(pi: ExtensionAPI, injectedConfig?: PiSchedulerExtensionConfig): void;
|
|
7
10
|
//# sourceMappingURL=extension.d.ts.map
|
package/dist/extension.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC;AA8BF,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,EAAE,EAAE,YAAY,EAChB,cAAc,CAAC,EAAE,0BAA0B,GAC1C,IAAI,CA4JN"}
|
package/dist/extension.js
CHANGED
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { loadPiSettings,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { loadPiSettings, resolveHome } from '@amaster.ai/pi-shared/settings';
|
|
3
|
+
import { PersistentTaskScheduler, } from './index.js';
|
|
4
|
+
import { FileSchedulerLock, JsonScheduledTaskStore } from './stores.js';
|
|
5
|
+
import { createSchedulerTools } from './tools.js';
|
|
5
6
|
const SETTINGS_KEY = 'pi-scheduler';
|
|
6
7
|
const STATUS_KEY = 'pi-scheduler';
|
|
7
8
|
function resolveConfig(raw) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
dataDir: raw?.dataDir?.trim() || path.join(resolveAgentDir(), 'data'),
|
|
9
|
+
const resolved = {
|
|
10
|
+
dataDir: raw?.dataDir?.trim() || path.join(resolveHome(), 'data'),
|
|
11
11
|
};
|
|
12
|
+
if (raw?.store)
|
|
13
|
+
resolved.store = raw.store;
|
|
14
|
+
if (raw?.lock)
|
|
15
|
+
resolved.lock = raw.lock;
|
|
16
|
+
if (raw?.scheduler)
|
|
17
|
+
resolved.scheduler = raw.scheduler;
|
|
18
|
+
return resolved;
|
|
12
19
|
}
|
|
13
20
|
function loadSettings(cwd) {
|
|
14
21
|
try {
|
|
15
22
|
const config = loadPiSettings(SETTINGS_KEY, {
|
|
16
23
|
cwd,
|
|
17
|
-
agentDir: resolveAgentDir(),
|
|
18
24
|
});
|
|
19
25
|
return Object.keys(config).length > 0 ? config : undefined;
|
|
20
26
|
}
|
|
@@ -22,257 +28,139 @@ function loadSettings(cwd) {
|
|
|
22
28
|
return undefined;
|
|
23
29
|
}
|
|
24
30
|
}
|
|
25
|
-
export default function taskSchedulerExtension(pi) {
|
|
31
|
+
export default function taskSchedulerExtension(pi, injectedConfig) {
|
|
26
32
|
let scheduler;
|
|
33
|
+
let ownsScheduler = false;
|
|
27
34
|
pi.on('session_start', async (_event, ctx) => {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
ctx.ui.setStatus(STATUS_KEY, 'scheduler: disabled');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
35
|
+
const fileConfig = loadSettings(ctx.cwd);
|
|
36
|
+
const config = resolveConfig({ ...fileConfig, ...injectedConfig });
|
|
33
37
|
try {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
if (config.scheduler) {
|
|
39
|
+
scheduler = config.scheduler;
|
|
40
|
+
ownsScheduler = false;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const store = config.store ?? new JsonScheduledTaskStore(path.join(config.dataDir, 'tasks.json'));
|
|
44
|
+
const lock = config.lock ?? new FileSchedulerLock(path.join(config.dataDir, 'scheduler.lock'));
|
|
45
|
+
const runner = async (task) => {
|
|
46
|
+
pi.sendUserMessage(task.prompt);
|
|
47
|
+
};
|
|
48
|
+
const instance = new PersistentTaskScheduler({ store, lock, runner });
|
|
49
|
+
await instance.start();
|
|
50
|
+
scheduler = instance;
|
|
51
|
+
ownsScheduler = true;
|
|
52
|
+
}
|
|
53
|
+
ctx.ui.setStatus(STATUS_KEY, scheduler.isActive() ? 'scheduler: active' : 'scheduler: idle');
|
|
54
|
+
// Register LLM-callable tools after scheduler is ready
|
|
55
|
+
const tools = createSchedulerTools(scheduler);
|
|
56
|
+
for (const tool of tools) {
|
|
57
|
+
pi.registerTool(tool);
|
|
58
|
+
}
|
|
46
59
|
}
|
|
47
60
|
catch {
|
|
48
61
|
ctx.ui.setStatus(STATUS_KEY, 'scheduler: unavailable');
|
|
49
62
|
}
|
|
50
63
|
});
|
|
51
64
|
pi.on('session_shutdown', async () => {
|
|
52
|
-
|
|
65
|
+
if (ownsScheduler) {
|
|
66
|
+
await scheduler?.stop();
|
|
67
|
+
}
|
|
53
68
|
scheduler = undefined;
|
|
69
|
+
ownsScheduler = false;
|
|
54
70
|
});
|
|
55
|
-
pi.registerCommand('
|
|
56
|
-
description: '
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
const status = await scheduler.status();
|
|
63
|
-
ctx.ui.notify(formatStatus(status), 'info');
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
pi.registerCommand('pi-scheduler-list', {
|
|
67
|
-
description: 'List scheduled tasks.',
|
|
68
|
-
handler: async (_args, ctx) => {
|
|
69
|
-
if (!scheduler) {
|
|
70
|
-
ctx.ui.notify('Task scheduler is not running.', 'warning');
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const tasks = await scheduler.list();
|
|
74
|
-
ctx.ui.notify(formatTaskList(tasks), 'info');
|
|
71
|
+
pi.registerCommand('cron', {
|
|
72
|
+
description: 'Manage scheduled tasks. Subcommands: status, list, get, run, enable, disable, delete.',
|
|
73
|
+
getArgumentCompletions: (prefix) => {
|
|
74
|
+
const subcommands = ['status', 'list', 'get', 'run', 'enable', 'disable', 'delete'];
|
|
75
|
+
const matches = subcommands.filter((s) => s.startsWith(prefix.trim().toLowerCase()));
|
|
76
|
+
return matches.map((s) => ({ label: s, value: s }));
|
|
75
77
|
},
|
|
76
|
-
});
|
|
77
|
-
pi.registerCommand('pi-scheduler-run-now', {
|
|
78
|
-
description: 'Run a scheduled task immediately by ID.',
|
|
79
78
|
handler: async (args, ctx) => {
|
|
80
|
-
const taskId = args.trim();
|
|
81
|
-
if (!taskId) {
|
|
82
|
-
ctx.ui.notify('Usage: /pi-scheduler-run-now <task-id>', 'warning');
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
79
|
if (!scheduler) {
|
|
86
80
|
ctx.ui.notify('Task scheduler is not running.', 'warning');
|
|
87
81
|
return;
|
|
88
82
|
}
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
promptSnippet: 'Create scheduled tasks (cron/once/interval) that run prompts on a schedule.',
|
|
108
|
-
parameters: Type.Object({
|
|
109
|
-
type: taskTypeSchema,
|
|
110
|
-
schedule: Type.String({
|
|
111
|
-
description: 'Schedule expression. Cron: "0 9 * * 1-5"; Once: ISO timestamp or "+10m"; Interval: "30s", "5m", "1h".',
|
|
112
|
-
}),
|
|
113
|
-
prompt: Type.String({ description: 'The prompt to execute when triggered.' }),
|
|
114
|
-
name: Type.Optional(Type.String({ description: 'Human-readable task name.' })),
|
|
115
|
-
description: Type.Optional(Type.String({ description: 'Task description.' })),
|
|
116
|
-
enabled: Type.Optional(Type.Boolean({ description: 'Whether the task is enabled. Default true.' })),
|
|
117
|
-
}),
|
|
118
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
119
|
-
if (!scheduler) {
|
|
120
|
-
return textResult('Task scheduler is not running. The extension may be disabled or failed to initialize.');
|
|
121
|
-
}
|
|
122
|
-
try {
|
|
123
|
-
const definition = resolveScheduledTaskDefinition({
|
|
124
|
-
type: params.type,
|
|
125
|
-
schedule: params.schedule,
|
|
126
|
-
});
|
|
127
|
-
const input = {
|
|
128
|
-
...definition,
|
|
129
|
-
prompt: params.prompt,
|
|
130
|
-
sessionId: ctx.sessionManager?.getSessionId?.() ?? 'unknown',
|
|
131
|
-
model: {
|
|
132
|
-
provider: 'anthropic',
|
|
133
|
-
model: ctx.model?.id ?? 'unknown',
|
|
134
|
-
},
|
|
135
|
-
toolPolicyProfile: 'default',
|
|
136
|
-
enabled: params.enabled !== false,
|
|
137
|
-
...(params.name ? { name: params.name } : {}),
|
|
138
|
-
...(params.description ? { description: params.description } : {}),
|
|
139
|
-
};
|
|
140
|
-
const task = await scheduler.create(input);
|
|
141
|
-
return textResult(JSON.stringify(formatTaskSummary(task), null, 2));
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
return textResult(`Failed to create task: ${error instanceof Error ? error.message : String(error)}`);
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
pi.registerTool({
|
|
149
|
-
name: 'scheduler_list',
|
|
150
|
-
label: 'Scheduler',
|
|
151
|
-
description: 'List all scheduled tasks with their status and next run time.',
|
|
152
|
-
promptSnippet: 'List all scheduled tasks.',
|
|
153
|
-
parameters: Type.Object({}),
|
|
154
|
-
async execute() {
|
|
155
|
-
if (!scheduler) {
|
|
156
|
-
return textResult('Task scheduler is not running.');
|
|
157
|
-
}
|
|
158
|
-
const tasks = await scheduler.list();
|
|
159
|
-
if (tasks.length === 0) {
|
|
160
|
-
return textResult('No scheduled tasks.');
|
|
161
|
-
}
|
|
162
|
-
const summary = tasks.map(formatTaskSummary);
|
|
163
|
-
return textResult(JSON.stringify(summary, null, 2));
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
|
-
pi.registerTool({
|
|
167
|
-
name: 'scheduler_get',
|
|
168
|
-
label: 'Scheduler',
|
|
169
|
-
description: 'Get detailed information about a scheduled task including run history.',
|
|
170
|
-
parameters: Type.Object({
|
|
171
|
-
taskId: Type.String({ description: 'The task ID to query.' }),
|
|
172
|
-
}),
|
|
173
|
-
async execute(_toolCallId, params) {
|
|
174
|
-
if (!scheduler) {
|
|
175
|
-
return textResult('Task scheduler is not running.');
|
|
176
|
-
}
|
|
177
|
-
const task = await scheduler.get(params.taskId);
|
|
178
|
-
if (!task) {
|
|
179
|
-
return textResult(`Task not found: ${params.taskId}`);
|
|
180
|
-
}
|
|
181
|
-
return textResult(JSON.stringify(task, null, 2));
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
pi.registerTool({
|
|
185
|
-
name: 'scheduler_update',
|
|
186
|
-
label: 'Scheduler',
|
|
187
|
-
description: 'Update a scheduled task. Can change schedule, prompt, name, or enable/disable.',
|
|
188
|
-
parameters: Type.Object({
|
|
189
|
-
taskId: Type.String({ description: 'The task ID to update.' }),
|
|
190
|
-
type: Type.Optional(taskTypeSchema),
|
|
191
|
-
schedule: Type.Optional(Type.String({ description: 'New schedule expression.' })),
|
|
192
|
-
prompt: Type.Optional(Type.String({ description: 'New prompt.' })),
|
|
193
|
-
name: Type.Optional(Type.String({ description: 'New name.' })),
|
|
194
|
-
description: Type.Optional(Type.String({ description: 'New description.' })),
|
|
195
|
-
enabled: Type.Optional(Type.Boolean({ description: 'Enable or disable the task.' })),
|
|
196
|
-
}),
|
|
197
|
-
async execute(_toolCallId, params) {
|
|
198
|
-
if (!scheduler) {
|
|
199
|
-
return textResult('Task scheduler is not running.');
|
|
200
|
-
}
|
|
201
|
-
const { taskId, type, schedule, ...rest } = params;
|
|
202
|
-
const update = { ...rest };
|
|
203
|
-
if (type !== undefined || schedule !== undefined) {
|
|
204
|
-
try {
|
|
205
|
-
const existing = await scheduler.get(taskId);
|
|
206
|
-
if (!existing) {
|
|
207
|
-
return textResult(`Task not found: ${taskId}`);
|
|
83
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
84
|
+
const subcommand = parts[0]?.toLowerCase() ?? 'status';
|
|
85
|
+
const rest = parts.slice(1).join(' ').trim();
|
|
86
|
+
switch (subcommand) {
|
|
87
|
+
case 'status': {
|
|
88
|
+
const status = await scheduler.status();
|
|
89
|
+
ctx.ui.notify(formatStatus(status), 'info');
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case 'list': {
|
|
93
|
+
const tasks = await scheduler.list();
|
|
94
|
+
ctx.ui.notify(formatTaskList(tasks), 'info');
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case 'get': {
|
|
98
|
+
if (!rest) {
|
|
99
|
+
ctx.ui.notify('Usage: /cron get <task-id>', 'warning');
|
|
100
|
+
break;
|
|
208
101
|
}
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
102
|
+
const task = await scheduler.get(rest);
|
|
103
|
+
if (!task) {
|
|
104
|
+
ctx.ui.notify(`Task not found: ${rest}`, 'error');
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
ctx.ui.notify(formatTaskDetail(task), 'info');
|
|
108
|
+
break;
|
|
214
109
|
}
|
|
215
|
-
|
|
216
|
-
|
|
110
|
+
case 'run': {
|
|
111
|
+
if (!rest) {
|
|
112
|
+
ctx.ui.notify('Usage: /cron run <task-id>', 'warning');
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
const task = await scheduler.runNow(rest);
|
|
116
|
+
if (!task) {
|
|
117
|
+
ctx.ui.notify(`Task not found: ${rest}`, 'error');
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
ctx.ui.notify(`Triggered: ${task.name ?? task.id}`, 'info');
|
|
121
|
+
break;
|
|
217
122
|
}
|
|
123
|
+
case 'enable': {
|
|
124
|
+
if (!rest) {
|
|
125
|
+
ctx.ui.notify('Usage: /cron enable <task-id>', 'warning');
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
const task = await scheduler.update(rest, { enabled: true });
|
|
129
|
+
if (!task) {
|
|
130
|
+
ctx.ui.notify(`Task not found: ${rest}`, 'error');
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
ctx.ui.notify(`Enabled: ${task.name ?? task.id}`, 'info');
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case 'disable': {
|
|
137
|
+
if (!rest) {
|
|
138
|
+
ctx.ui.notify('Usage: /cron disable <task-id>', 'warning');
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
const task = await scheduler.update(rest, { enabled: false });
|
|
142
|
+
if (!task) {
|
|
143
|
+
ctx.ui.notify(`Task not found: ${rest}`, 'error');
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
ctx.ui.notify(`Disabled: ${task.name ?? task.id}`, 'info');
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case 'delete': {
|
|
150
|
+
if (!rest) {
|
|
151
|
+
ctx.ui.notify('Usage: /cron delete <task-id>', 'warning');
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
const deleted = await scheduler.delete(rest);
|
|
155
|
+
ctx.ui.notify(deleted ? `Deleted: ${rest}` : `Task not found: ${rest}`, deleted ? 'info' : 'error');
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
default:
|
|
159
|
+
ctx.ui.notify('Unknown subcommand. Available: status, list, get, run, enable, disable, delete.', 'warning');
|
|
218
160
|
}
|
|
219
|
-
const task = await scheduler.update(taskId, update);
|
|
220
|
-
if (!task) {
|
|
221
|
-
return textResult(`Task not found: ${taskId}`);
|
|
222
|
-
}
|
|
223
|
-
return textResult(JSON.stringify(formatTaskSummary(task), null, 2));
|
|
224
|
-
},
|
|
225
|
-
});
|
|
226
|
-
pi.registerTool({
|
|
227
|
-
name: 'scheduler_delete',
|
|
228
|
-
label: 'Scheduler',
|
|
229
|
-
description: 'Delete a scheduled task.',
|
|
230
|
-
parameters: Type.Object({
|
|
231
|
-
taskId: Type.String({ description: 'The task ID to delete.' }),
|
|
232
|
-
}),
|
|
233
|
-
async execute(_toolCallId, params) {
|
|
234
|
-
if (!scheduler) {
|
|
235
|
-
return textResult('Task scheduler is not running.');
|
|
236
|
-
}
|
|
237
|
-
const deleted = await scheduler.delete(params.taskId);
|
|
238
|
-
return textResult(deleted ? `Deleted task: ${params.taskId}` : `Task not found: ${params.taskId}`);
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
pi.registerTool({
|
|
242
|
-
name: 'scheduler_run_now',
|
|
243
|
-
label: 'Scheduler',
|
|
244
|
-
description: 'Trigger immediate execution of a scheduled task.',
|
|
245
|
-
parameters: Type.Object({
|
|
246
|
-
taskId: Type.String({ description: 'The task ID to run immediately.' }),
|
|
247
|
-
}),
|
|
248
|
-
async execute(_toolCallId, params) {
|
|
249
|
-
if (!scheduler) {
|
|
250
|
-
return textResult('Task scheduler is not running.');
|
|
251
|
-
}
|
|
252
|
-
const task = await scheduler.runNow(params.taskId);
|
|
253
|
-
if (!task) {
|
|
254
|
-
return textResult(`Task not found: ${params.taskId}`);
|
|
255
|
-
}
|
|
256
|
-
return textResult(`Triggered: ${task.name ?? task.id}`);
|
|
257
161
|
},
|
|
258
162
|
});
|
|
259
163
|
}
|
|
260
|
-
function textResult(text) {
|
|
261
|
-
return { content: [{ type: 'text', text }], details: undefined };
|
|
262
|
-
}
|
|
263
|
-
function formatTaskSummary(task) {
|
|
264
|
-
return {
|
|
265
|
-
id: task.id,
|
|
266
|
-
name: task.name,
|
|
267
|
-
type: task.type,
|
|
268
|
-
schedule: task.schedule,
|
|
269
|
-
enabled: task.enabled,
|
|
270
|
-
lastStatus: task.lastStatus ?? 'pending',
|
|
271
|
-
nextRunAt: task.nextRunAt,
|
|
272
|
-
runCount: task.runCount,
|
|
273
|
-
prompt: task.prompt.length > 100 ? task.prompt.slice(0, 100) + '…' : task.prompt,
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
164
|
function formatStatus(status) {
|
|
277
165
|
const lines = [
|
|
278
166
|
`Active: ${status.active}`,
|
|
@@ -294,8 +182,25 @@ function formatTaskList(tasks) {
|
|
|
294
182
|
const name = t.name ?? t.id.slice(0, 8);
|
|
295
183
|
const status = t.enabled ? (t.lastStatus ?? 'pending') : 'disabled';
|
|
296
184
|
const next = t.nextRunAt ? ` next: ${t.nextRunAt}` : '';
|
|
297
|
-
return `${name} [${t.type}] ${status}${next}`;
|
|
185
|
+
return `${t.id.slice(0, 8)} ${name} [${t.type}] ${status}${next}`;
|
|
298
186
|
})
|
|
299
187
|
.join('\n');
|
|
300
188
|
}
|
|
189
|
+
function formatTaskDetail(task) {
|
|
190
|
+
const lines = [
|
|
191
|
+
`ID: ${task.id}`,
|
|
192
|
+
`Name: ${task.name ?? '(unnamed)'}`,
|
|
193
|
+
`Type: ${task.type}`,
|
|
194
|
+
`Schedule: ${task.schedule}`,
|
|
195
|
+
`Enabled: ${task.enabled}`,
|
|
196
|
+
`Status: ${task.lastStatus ?? 'pending'}`,
|
|
197
|
+
`Runs: ${task.runCount}`,
|
|
198
|
+
];
|
|
199
|
+
if (task.nextRunAt)
|
|
200
|
+
lines.push(`Next run: ${task.nextRunAt}`);
|
|
201
|
+
if (task.description)
|
|
202
|
+
lines.push(`Description: ${task.description}`);
|
|
203
|
+
lines.push(`Prompt: ${task.prompt}`);
|
|
204
|
+
return lines.join('\n');
|
|
205
|
+
}
|
|
301
206
|
//# sourceMappingURL=extension.js.map
|
package/dist/extension.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|