@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 CHANGED
@@ -1,27 +1,83 @@
1
1
  # @amaster.ai/pi-task-scheduler
2
2
 
3
+ ![pi-task-scheduler preview](https://raw.githubusercontent.com/TGYD-helige/pi/master/packages/pi-task-scheduler/preview.png)
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
- ## Scope
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
- This package does not persist data by itself and does not know how to execute a
12
- pi chat turn. Applications provide both:
62
+ ## Integration Modes
13
63
 
14
- - a `ScheduledTaskStore` for persistence
15
- - a `SchedulerLock` for single-owner execution
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
- Storage adapters live in `@amaster.ai/pi-storage/scheduler`.
67
+ ### Mode 1: Extension auto-discovery (standalone / CLI)
19
68
 
20
- ## Extension
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
- The package exports a pi extension that integrates with the agent runtime:
75
+ ```
76
+ pi.extensions → session_start → creates file-based scheduler → registers tools + commands
77
+ ```
23
78
 
24
- - **Lifecycle**: creates a `PersistentTaskScheduler` on `session_start`, stops on `session_shutdown`
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
- Data is stored in `<agentDir>/data/` by default (`~/.pi/agent/data/`).
94
+ ### Mode 2: Dependency import (host-controlled)
40
95
 
41
- ## Example
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: new JsonScheduledTaskStore("/var/lib/pi/tasks.json"),
52
- lock: new FileSchedulerLock("/var/lib/pi/tasks.lock"),
53
- runner: async (task, run) => {
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:
@@ -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
@@ -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;AAepE,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA0BF,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAwQrE"}
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, resolveAgentDir } from '@amaster.ai/pi-shared/settings';
3
- import { Type } from 'typebox';
4
- import { PersistentTaskScheduler, resolveScheduledTaskDefinition, } from './index.js';
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
- return {
9
- enabled: raw?.enabled !== false,
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 config = resolveConfig(loadSettings(ctx.cwd));
29
- if (!config.enabled) {
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
- const storageMod = '@amaster.ai/pi-storage/scheduler';
35
- // @ts-ignore - circular dependency: storage imports types from this package
36
- const storageScheduler = await import(/* webpackIgnore: true */ storageMod);
37
- const store = new storageScheduler.JsonScheduledTaskStore(path.join(config.dataDir, 'tasks.json'));
38
- const lock = new storageScheduler.FileSchedulerLock(path.join(config.dataDir, 'scheduler.lock'));
39
- const runner = async (task) => {
40
- pi.sendUserMessage(task.prompt);
41
- };
42
- const instance = new PersistentTaskScheduler({ store, lock, runner });
43
- await instance.start();
44
- scheduler = instance;
45
- ctx.ui.setStatus(STATUS_KEY, instance.isActive() ? 'scheduler: active' : 'scheduler: idle');
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
- await scheduler?.stop();
65
+ if (ownsScheduler) {
66
+ await scheduler?.stop();
67
+ }
53
68
  scheduler = undefined;
69
+ ownsScheduler = false;
54
70
  });
55
- pi.registerCommand('pi-scheduler-status', {
56
- description: 'Show task scheduler status.',
57
- handler: async (_args, ctx) => {
58
- if (!scheduler) {
59
- ctx.ui.notify('Task scheduler is not running.', 'warning');
60
- return;
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 task = await scheduler.runNow(taskId);
90
- if (!task) {
91
- ctx.ui.notify(`Task not found: ${taskId}`, 'error');
92
- return;
93
- }
94
- ctx.ui.notify(`Triggered: ${task.name ?? task.id}`, 'info');
95
- },
96
- });
97
- // --- LLM-callable tools ---
98
- const taskTypeSchema = Type.Union([
99
- Type.Literal('cron'),
100
- Type.Literal('once'),
101
- Type.Literal('interval'),
102
- ]);
103
- pi.registerTool({
104
- name: 'scheduler_create',
105
- label: 'Scheduler',
106
- description: 'Create a scheduled task. Supports cron expressions, one-time (ISO timestamp or relative like "+10m"), and interval (e.g. "30s", "5m", "1h").',
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 definition = resolveScheduledTaskDefinition({
210
- type: (type ?? existing.type),
211
- schedule: schedule ?? existing.schedule,
212
- });
213
- Object.assign(update, definition);
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
- catch (error) {
216
- return textResult(`Invalid schedule: ${error instanceof Error ? error.message : String(error)}`);
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
@@ -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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"}