@hasna/todos 0.11.28 → 0.11.29

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/dist/cli/index.js CHANGED
@@ -6,60 +6,39 @@ var __defProp = Object.defineProperty;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- function __accessProp(key) {
10
- return this[key];
11
- }
12
- var __toESMCache_node;
13
- var __toESMCache_esm;
14
9
  var __toESM = (mod, isNodeMode, target) => {
15
- var canCache = mod != null && typeof mod === "object";
16
- if (canCache) {
17
- var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
18
- var cached = cache.get(mod);
19
- if (cached)
20
- return cached;
21
- }
22
10
  target = mod != null ? __create(__getProtoOf(mod)) : {};
23
11
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
24
12
  for (let key of __getOwnPropNames(mod))
25
13
  if (!__hasOwnProp.call(to, key))
26
14
  __defProp(to, key, {
27
- get: __accessProp.bind(mod, key),
15
+ get: () => mod[key],
28
16
  enumerable: true
29
17
  });
30
- if (canCache)
31
- cache.set(mod, to);
32
18
  return to;
33
19
  };
20
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
34
21
  var __toCommonJS = (from) => {
35
- var entry = (__moduleCache ??= new WeakMap).get(from), desc;
22
+ var entry = __moduleCache.get(from), desc;
36
23
  if (entry)
37
24
  return entry;
38
25
  entry = __defProp({}, "__esModule", { value: true });
39
- if (from && typeof from === "object" || typeof from === "function") {
40
- for (var key of __getOwnPropNames(from))
41
- if (!__hasOwnProp.call(entry, key))
42
- __defProp(entry, key, {
43
- get: __accessProp.bind(from, key),
44
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
45
- });
46
- }
26
+ if (from && typeof from === "object" || typeof from === "function")
27
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
28
+ get: () => from[key],
29
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
30
+ }));
47
31
  __moduleCache.set(from, entry);
48
32
  return entry;
49
33
  };
50
- var __moduleCache;
51
34
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
52
- var __returnValue = (v) => v;
53
- function __exportSetter(name, newValue) {
54
- this[name] = __returnValue.bind(null, newValue);
55
- }
56
35
  var __export = (target, all) => {
57
36
  for (var name in all)
58
37
  __defProp(target, name, {
59
38
  get: all[name],
60
39
  enumerable: true,
61
40
  configurable: true,
62
- set: __exportSetter.bind(all, name)
41
+ set: (newValue) => all[name] = () => newValue
63
42
  });
64
43
  };
65
44
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -2444,6 +2423,32 @@ function ensureSchema(db) {
2444
2423
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_tasks_synced ON tasks(synced_at)");
2445
2424
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_projects_machine ON projects(machine_id)");
2446
2425
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_agents_machine ON agents(machine_id)");
2426
+ ensureTable("task_time_logs", `
2427
+ CREATE TABLE task_time_logs (
2428
+ id TEXT PRIMARY KEY,
2429
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
2430
+ agent_id TEXT,
2431
+ started_at TEXT,
2432
+ ended_at TEXT,
2433
+ minutes INTEGER NOT NULL,
2434
+ notes TEXT,
2435
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2436
+ )`);
2437
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_time_logs_task ON task_time_logs(task_id)");
2438
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_time_logs_agent ON task_time_logs(agent_id)");
2439
+ ensureColumn("tasks", "actual_minutes", "INTEGER");
2440
+ ensureTable("task_watchers", `
2441
+ CREATE TABLE task_watchers (
2442
+ id TEXT PRIMARY KEY,
2443
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
2444
+ agent_id TEXT NOT NULL,
2445
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
2446
+ UNIQUE(task_id, agent_id)
2447
+ )`);
2448
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_watchers_task ON task_watchers(task_id)");
2449
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_watchers_agent ON task_watchers(agent_id)");
2450
+ ensureColumn("task_dependencies", "external_project_id", "TEXT");
2451
+ ensureColumn("task_dependencies", "external_task_id", "TEXT");
2447
2452
  }
2448
2453
  function backfillTaskTags(db) {
2449
2454
  try {
@@ -3171,6 +3176,39 @@ var init_schema = __esm(() => {
3171
3176
  CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_short_id ON tasks(short_id, machine_id) WHERE short_id IS NOT NULL AND machine_id IS NOT NULL;
3172
3177
  CREATE INDEX IF NOT EXISTS idx_tasks_short_id_lookup ON tasks(short_id) WHERE short_id IS NOT NULL;
3173
3178
  INSERT OR IGNORE INTO _migrations (id) VALUES (44);
3179
+ `,
3180
+ `
3181
+ CREATE TABLE IF NOT EXISTS task_time_logs (
3182
+ id TEXT PRIMARY KEY,
3183
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
3184
+ agent_id TEXT,
3185
+ started_at TEXT,
3186
+ ended_at TEXT,
3187
+ minutes INTEGER NOT NULL,
3188
+ notes TEXT,
3189
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
3190
+ );
3191
+ CREATE INDEX IF NOT EXISTS idx_task_time_logs_task ON task_time_logs(task_id);
3192
+ CREATE INDEX IF NOT EXISTS idx_task_time_logs_agent ON task_time_logs(agent_id);
3193
+ ALTER TABLE tasks ADD COLUMN actual_minutes INTEGER;
3194
+ INSERT OR IGNORE INTO _migrations (id) VALUES (45);
3195
+ `,
3196
+ `
3197
+ CREATE TABLE IF NOT EXISTS task_watchers (
3198
+ id TEXT PRIMARY KEY,
3199
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
3200
+ agent_id TEXT NOT NULL,
3201
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
3202
+ UNIQUE(task_id, agent_id)
3203
+ );
3204
+ CREATE INDEX IF NOT EXISTS idx_task_watchers_task ON task_watchers(task_id);
3205
+ CREATE INDEX IF NOT EXISTS idx_task_watchers_agent ON task_watchers(agent_id);
3206
+ INSERT OR IGNORE INTO _migrations (id) VALUES (46);
3207
+ `,
3208
+ `
3209
+ ALTER TABLE task_dependencies ADD COLUMN external_project_id TEXT;
3210
+ ALTER TABLE task_dependencies ADD COLUMN external_task_id TEXT;
3211
+ INSERT OR IGNORE INTO _migrations (id) VALUES (47);
3174
3212
  `
3175
3213
  ];
3176
3214
  });
@@ -4161,6 +4199,7 @@ var init_recurrence = __esm(() => {
4161
4199
  // src/db/webhooks.ts
4162
4200
  var exports_webhooks = {};
4163
4201
  __export(exports_webhooks, {
4202
+ validateWebhookUrl: () => validateWebhookUrl,
4164
4203
  listWebhooks: () => listWebhooks,
4165
4204
  listDeliveries: () => listDeliveries,
4166
4205
  getWebhook: () => getWebhook,
@@ -4168,6 +4207,40 @@ __export(exports_webhooks, {
4168
4207
  deleteWebhook: () => deleteWebhook,
4169
4208
  createWebhook: () => createWebhook
4170
4209
  });
4210
+ function validateWebhookUrl(urlString) {
4211
+ try {
4212
+ const url = new URL(urlString);
4213
+ if (url.protocol !== "https:") {
4214
+ throw new Error("Webhook URLs must use HTTPS");
4215
+ }
4216
+ const hostname = url.hostname.toLowerCase();
4217
+ if (hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || hostname === "0.0.0.0") {
4218
+ throw new Error("Webhook URLs cannot target localhost");
4219
+ }
4220
+ if (hostname === "169.254.169.254" || hostname.startsWith("169.254.")) {
4221
+ throw new Error("Webhook URLs cannot target cloud metadata endpoints");
4222
+ }
4223
+ const privateRanges = [
4224
+ /^10\./,
4225
+ /^172\.(1[6-9]|2\d|3[01])\./,
4226
+ /^192\.168\./,
4227
+ /^127\./,
4228
+ /^169\.254\./,
4229
+ /^fc00:/i,
4230
+ /^fe80:/i
4231
+ ];
4232
+ for (const range of privateRanges) {
4233
+ if (range.test(hostname)) {
4234
+ throw new Error("Webhook URLs cannot target private IP ranges");
4235
+ }
4236
+ }
4237
+ } catch (e) {
4238
+ if (e instanceof Error && e.message.startsWith("Webhook URLs")) {
4239
+ throw e;
4240
+ }
4241
+ throw new Error(`Invalid webhook URL: ${urlString}`);
4242
+ }
4243
+ }
4171
4244
  function rowToWebhook(row) {
4172
4245
  return {
4173
4246
  ...row,
@@ -4181,6 +4254,7 @@ function rowToWebhook(row) {
4181
4254
  }
4182
4255
  function createWebhook(input, db) {
4183
4256
  const d = db || getDatabase();
4257
+ validateWebhookUrl(input.url);
4184
4258
  const id = uuid();
4185
4259
  d.run(`INSERT INTO webhooks (id, url, events, secret, project_id, task_list_id, agent_id, task_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
4186
4260
  id,
@@ -4779,7 +4853,9 @@ var init_checklists = __esm(() => {
4779
4853
  // src/db/tasks.ts
4780
4854
  var exports_tasks = {};
4781
4855
  __export(exports_tasks, {
4856
+ watchTask: () => watchTask,
4782
4857
  updateTask: () => updateTask,
4858
+ unwatchTask: () => unwatchTask,
4783
4859
  unlockTask: () => unlockTask,
4784
4860
  unarchiveTask: () => unarchiveTask,
4785
4861
  stealTask: () => stealTask,
@@ -4788,12 +4864,17 @@ __export(exports_tasks, {
4788
4864
  setTaskPriority: () => setTaskPriority,
4789
4865
  removeDependency: () => removeDependency,
4790
4866
  redistributeStaleTasks: () => redistributeStaleTasks,
4867
+ notifyWatchers: () => notifyWatchers,
4791
4868
  moveTask: () => moveTask,
4869
+ logTime: () => logTime,
4792
4870
  logCost: () => logCost,
4793
4871
  lockTask: () => lockTask,
4794
4872
  listTasks: () => listTasks,
4873
+ getTimeReport: () => getTimeReport,
4874
+ getTimeLogs: () => getTimeLogs,
4795
4875
  getTasksChangedSince: () => getTasksChangedSince,
4796
4876
  getTaskWithRelations: () => getTaskWithRelations,
4877
+ getTaskWatchers: () => getTaskWatchers,
4797
4878
  getTaskStats: () => getTaskStats,
4798
4879
  getTaskGraph: () => getTaskGraph,
4799
4880
  getTaskDependents: () => getTaskDependents,
@@ -5976,6 +6057,58 @@ function getOverdueTasks(projectId, db) {
5976
6057
  const rows = d.query(query).all(...params);
5977
6058
  return rows.map(rowToTask);
5978
6059
  }
6060
+ function logTime(input, db) {
6061
+ const d = db || getDatabase();
6062
+ const id = uuid();
6063
+ const ts = now();
6064
+ d.run(`INSERT INTO task_time_logs (id, task_id, agent_id, minutes, started_at, ended_at, notes, created_at)
6065
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, input.task_id, input.agent_id || null, input.minutes, input.started_at || null, input.ended_at || null, input.notes || null, ts]);
6066
+ return { id, task_id: input.task_id, agent_id: input.agent_id || null, minutes: input.minutes, started_at: input.started_at || null, ended_at: input.ended_at || null, notes: input.notes || null, created_at: ts };
6067
+ }
6068
+ function getTimeLogs(taskId, db) {
6069
+ const d = db || getDatabase();
6070
+ return d.query(`SELECT * FROM task_time_logs WHERE task_id = ? ORDER BY created_at DESC`).all(taskId);
6071
+ }
6072
+ function getTimeReport(opts, db) {
6073
+ const d = db || getDatabase();
6074
+ let query = `SELECT t.id as task_id, t.title, t.estimated_minutes, t.actual_minutes FROM tasks t WHERE t.status = 'completed'`;
6075
+ const params = [];
6076
+ if (opts?.project_id) {
6077
+ query += ` AND t.project_id = ?`;
6078
+ params.push(opts.project_id);
6079
+ }
6080
+ if (opts?.agent_id) {
6081
+ query += ` AND t.assigned_to = ?`;
6082
+ params.push(opts.agent_id);
6083
+ }
6084
+ if (opts?.since) {
6085
+ query += ` AND t.completed_at >= ?`;
6086
+ params.push(opts.since);
6087
+ }
6088
+ const rows = d.query(query).all(...params);
6089
+ return rows.map((row) => ({ ...row, time_logs: getTimeLogs(row.task_id, d) }));
6090
+ }
6091
+ function watchTask(taskId, agentId, db) {
6092
+ const d = db || getDatabase();
6093
+ const id = uuid();
6094
+ const ts = now();
6095
+ d.run(`INSERT OR IGNORE INTO task_watchers (id, task_id, agent_id, created_at) VALUES (?, ?, ?, ?)`, [id, taskId, agentId, ts]);
6096
+ const existing = d.query(`SELECT * FROM task_watchers WHERE task_id = ? AND agent_id = ?`).get(taskId, agentId);
6097
+ return existing;
6098
+ }
6099
+ function unwatchTask(taskId, agentId, db) {
6100
+ const d = db || getDatabase();
6101
+ const result = d.run(`DELETE FROM task_watchers WHERE task_id = ? AND agent_id = ?`, [taskId, agentId]);
6102
+ return result.changes > 0;
6103
+ }
6104
+ function getTaskWatchers(taskId, db) {
6105
+ const d = db || getDatabase();
6106
+ return d.query(`SELECT * FROM task_watchers WHERE task_id = ?`).all(taskId);
6107
+ }
6108
+ function notifyWatchers(taskId, event, data, db) {
6109
+ const watchers = getTaskWatchers(taskId, db);
6110
+ dispatchWebhook(`task.watcher.${event}`, { task_id: taskId, watchers: watchers.map((w) => w.agent_id), ...data }, db).catch(() => {});
6111
+ }
5979
6112
  var init_tasks = __esm(() => {
5980
6113
  init_types();
5981
6114
  init_database();
@@ -6062,6 +6195,9 @@ function registerAgent(input, db) {
6062
6195
  if (callerHasNoSession && existingHasActiveSession) {
6063
6196
  return buildConflictError(existing, lastSeenMs, input.pool, d);
6064
6197
  }
6198
+ if (input.project_id && existing.session_id && isActive && existing.active_project_id && existing.active_project_id !== input.project_id) {
6199
+ return buildConflictError(existing, lastSeenMs, input.pool, d);
6200
+ }
6065
6201
  }
6066
6202
  const updates = ["last_seen_at = ?", "status = 'active'"];
6067
6203
  const params = [now()];
@@ -6077,14 +6213,18 @@ function registerAgent(input, db) {
6077
6213
  updates.push("description = ?");
6078
6214
  params.push(input.description);
6079
6215
  }
6216
+ if (input.project_id && input.session_id) {
6217
+ updates.push("active_project_id = ?");
6218
+ params.push(input.project_id);
6219
+ }
6080
6220
  params.push(existing.id);
6081
6221
  d.run(`UPDATE agents SET ${updates.join(", ")} WHERE id = ?`, params);
6082
6222
  return getAgent(existing.id, d);
6083
6223
  }
6084
6224
  const id = shortUuid();
6085
6225
  const timestamp = now();
6086
- d.run(`INSERT INTO agents (id, name, description, role, title, level, permissions, capabilities, reports_to, org_id, metadata, created_at, last_seen_at, session_id, working_dir)
6087
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
6226
+ d.run(`INSERT INTO agents (id, name, description, role, title, level, permissions, capabilities, reports_to, org_id, metadata, created_at, last_seen_at, session_id, working_dir, active_project_id)
6227
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
6088
6228
  id,
6089
6229
  normalizedName,
6090
6230
  input.description || null,
@@ -6099,7 +6239,8 @@ function registerAgent(input, db) {
6099
6239
  timestamp,
6100
6240
  timestamp,
6101
6241
  input.session_id || null,
6102
- input.working_dir || null
6242
+ input.working_dir || null,
6243
+ input.project_id && input.session_id ? input.project_id : null
6103
6244
  ]);
6104
6245
  return getAgent(id, d);
6105
6246
  }
@@ -11889,7 +12030,7 @@ var init_zod = __esm(() => {
11889
12030
  init_external();
11890
12031
  });
11891
12032
 
11892
- // node_modules/@hasna/cloud/dist/index.js
12033
+ // ../../../../node_modules/@hasna/cloud/dist/index.js
11893
12034
  var exports_dist = {};
11894
12035
  __export(exports_dist, {
11895
12036
  translateSql: () => translateSql,
@@ -11984,11 +12125,11 @@ import { join as join52 } from "path";
11984
12125
  import { join as join62, dirname as dirname2 } from "path";
11985
12126
  import { existsSync as existsSync62, writeFileSync as writeFileSync22, unlinkSync, mkdirSync as mkdirSync32 } from "fs";
11986
12127
  import { homedir as homedir5, platform } from "os";
11987
- function __accessProp2(key) {
12128
+ function __accessProp(key) {
11988
12129
  return this[key];
11989
12130
  }
11990
- function __exportSetter2(name, newValue) {
11991
- this[name] = __returnValue2.bind(null, newValue);
12131
+ function __exportSetter(name, newValue) {
12132
+ this[name] = __returnValue.bind(null, newValue);
11992
12133
  }
11993
12134
  function translateSql(sql, dialect) {
11994
12135
  if (dialect === "sqlite")
@@ -14445,7 +14586,7 @@ async function ensureAllPgDatabases() {
14445
14586
  }
14446
14587
  return results;
14447
14588
  }
14448
- function registerCloudTools(server, serviceName) {
14589
+ function registerCloudTools(server, serviceName, opts = {}) {
14449
14590
  server.tool(`${serviceName}_cloud_status`, "Show cloud configuration and connection health", {}, async () => {
14450
14591
  const config = getCloudConfig();
14451
14592
  const lines = [
@@ -14478,8 +14619,13 @@ function registerCloudTools(server, serviceName) {
14478
14619
  isError: true
14479
14620
  };
14480
14621
  }
14481
- const local = new SqliteAdapter(getDbPath2(serviceName));
14622
+ const local = new SqliteAdapter(opts.dbPath ?? getDbPath2(serviceName));
14482
14623
  const cloud = new PgAdapterAsync(getConnectionString(serviceName));
14624
+ if (opts.migrations?.length) {
14625
+ for (const sql of opts.migrations) {
14626
+ await cloud.run(sql);
14627
+ }
14628
+ }
14483
14629
  const tableList = tablesStr ? tablesStr.split(",").map((t) => t.trim()) : listSqliteTables(local);
14484
14630
  const results = await syncPush(local, cloud, { tables: tableList });
14485
14631
  local.close();
@@ -14501,7 +14647,7 @@ function registerCloudTools(server, serviceName) {
14501
14647
  isError: true
14502
14648
  };
14503
14649
  }
14504
- const local = new SqliteAdapter(getDbPath2(serviceName));
14650
+ const local = new SqliteAdapter(opts.dbPath ?? getDbPath2(serviceName));
14505
14651
  const cloud = new PgAdapterAsync(getConnectionString(serviceName));
14506
14652
  let tableList;
14507
14653
  if (tablesStr) {
@@ -14624,10 +14770,10 @@ function registerCloudCommands(program2, serviceName) {
14624
14770
  }
14625
14771
  });
14626
14772
  }
14627
- var __create2, __getProtoOf2, __defProp2, __getOwnPropNames2, __hasOwnProp2, __toESMCache_node2, __toESMCache_esm2, __toESM2 = (mod, isNodeMode, target) => {
14773
+ var __create2, __getProtoOf2, __defProp2, __getOwnPropNames2, __hasOwnProp2, __toESMCache_node, __toESMCache_esm, __toESM2 = (mod, isNodeMode, target) => {
14628
14774
  var canCache = mod != null && typeof mod === "object";
14629
14775
  if (canCache) {
14630
- var cache = isNodeMode ? __toESMCache_node2 ??= new WeakMap : __toESMCache_esm2 ??= new WeakMap;
14776
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
14631
14777
  var cached2 = cache.get(mod);
14632
14778
  if (cached2)
14633
14779
  return cached2;
@@ -14637,19 +14783,19 @@ var __create2, __getProtoOf2, __defProp2, __getOwnPropNames2, __hasOwnProp2, __t
14637
14783
  for (let key of __getOwnPropNames2(mod))
14638
14784
  if (!__hasOwnProp2.call(to, key))
14639
14785
  __defProp2(to, key, {
14640
- get: __accessProp2.bind(mod, key),
14786
+ get: __accessProp.bind(mod, key),
14641
14787
  enumerable: true
14642
14788
  });
14643
14789
  if (canCache)
14644
14790
  cache.set(mod, to);
14645
14791
  return to;
14646
- }, __commonJS2 = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports), __returnValue2 = (v) => v, __export2 = (target, all) => {
14792
+ }, __commonJS2 = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports), __returnValue = (v) => v, __export2 = (target, all) => {
14647
14793
  for (var name in all)
14648
14794
  __defProp2(target, name, {
14649
14795
  get: all[name],
14650
14796
  enumerable: true,
14651
14797
  configurable: true,
14652
- set: __exportSetter2.bind(all, name)
14798
+ set: __exportSetter.bind(all, name)
14653
14799
  });
14654
14800
  }, __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), __require2, require_postgres_array, require_arrayParser, require_postgres_date, require_mutable, require_postgres_interval, require_postgres_bytea, require_textParsers, require_pg_int8, require_binaryParsers, require_builtins, require_pg_types, require_defaults, require_utils, require_utils_legacy, require_utils_webcrypto, require_utils2, require_cert_signatures, require_sasl, require_type_overrides, require_pg_connection_string, require_connection_parameters, require_result, require_query, require_messages, require_buffer_writer, require_serializer, require_buffer_reader, require_parser, require_dist, require_empty, require_stream, require_connection, require_split2, require_helper, require_lib, require_client, require_pg_pool, require_query2, require_client2, require_lib2, import_lib, Client, Pool, Connection, types2, Query, DatabaseError, escapeIdentifier, escapeLiteral, Result, TypeOverrides, defaults, esm_default, init_esm, init_adapter, util3, objectUtil2, ZodParsedType2, getParsedType2 = (data) => {
14655
14801
  const t = typeof data;
@@ -23710,7 +23856,8 @@ function registerWebhookTools(server, { shouldRegisterTool, formatError }) {
23710
23856
  task_id: exports_external.string().optional().describe("Only fire for events on this specific task")
23711
23857
  }, async (params) => {
23712
23858
  try {
23713
- const { createWebhook: createWebhook2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
23859
+ const { createWebhook: createWebhook2, validateWebhookUrl: validateWebhookUrl2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
23860
+ validateWebhookUrl2(params.url);
23714
23861
  const wh = createWebhook2(params);
23715
23862
  const scope = [wh.project_id && `project:${wh.project_id}`, wh.task_list_id && `list:${wh.task_list_id}`, wh.agent_id && `agent:${wh.agent_id}`, wh.task_id && `task:${wh.task_id}`].filter(Boolean).join(", ");
23716
23863
  return { content: [{ type: "text", text: `Webhook created: ${wh.id.slice(0, 8)} | ${wh.url} | events: ${wh.events.length === 0 ? "all" : wh.events.join(",")}${scope ? ` | scope: ${scope}` : ""}` }] };
@@ -25979,6 +26126,39 @@ var init_pg_migrations = __esm(() => {
25979
26126
  CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_short_id ON tasks(short_id, machine_id) WHERE short_id IS NOT NULL AND machine_id IS NOT NULL;
25980
26127
  CREATE INDEX IF NOT EXISTS idx_tasks_short_id_lookup ON tasks(short_id) WHERE short_id IS NOT NULL;
25981
26128
  INSERT INTO _migrations (id) VALUES (40) ON CONFLICT DO NOTHING;
26129
+ `,
26130
+ `
26131
+ CREATE TABLE IF NOT EXISTS task_time_logs (
26132
+ id TEXT PRIMARY KEY,
26133
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
26134
+ agent_id TEXT,
26135
+ started_at TIMESTAMPTZ,
26136
+ ended_at TIMESTAMPTZ,
26137
+ minutes INTEGER NOT NULL,
26138
+ notes TEXT,
26139
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
26140
+ );
26141
+ CREATE INDEX IF NOT EXISTS idx_task_time_logs_task ON task_time_logs(task_id);
26142
+ CREATE INDEX IF NOT EXISTS idx_task_time_logs_agent ON task_time_logs(agent_id);
26143
+ ALTER TABLE tasks ADD COLUMN actual_minutes INTEGER;
26144
+ INSERT INTO _migrations (id) VALUES (41) ON CONFLICT DO NOTHING;
26145
+ `,
26146
+ `
26147
+ CREATE TABLE IF NOT EXISTS task_watchers (
26148
+ id TEXT PRIMARY KEY,
26149
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
26150
+ agent_id TEXT NOT NULL,
26151
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
26152
+ UNIQUE(task_id, agent_id)
26153
+ );
26154
+ CREATE INDEX IF NOT EXISTS idx_task_watchers_task ON task_watchers(task_id);
26155
+ CREATE INDEX IF NOT EXISTS idx_task_watchers_agent ON task_watchers(agent_id);
26156
+ INSERT INTO _migrations (id) VALUES (42) ON CONFLICT DO NOTHING;
26157
+ `,
26158
+ `
26159
+ ALTER TABLE task_dependencies ADD COLUMN external_project_id TEXT;
26160
+ ALTER TABLE task_dependencies ADD COLUMN external_task_id TEXT;
26161
+ INSERT INTO _migrations (id) VALUES (43) ON CONFLICT DO NOTHING;
25982
26162
  `
25983
26163
  ];
25984
26164
  });
@@ -27968,7 +28148,7 @@ Blocks:
27968
28148
  }
27969
28149
  if (shouldRegisterTool("bulk_create_tasks")) {
27970
28150
  server.tool("bulk_create_tasks", "Create multiple tasks atomically with dependency support.", {
27971
- tasks: exports_external.array(exports_external.object({
28151
+ tasks: exports_external.preprocess((val) => typeof val === "string" ? JSON.parse(val) : val, exports_external.array(exports_external.object({
27972
28152
  temp_id: exports_external.string().optional(),
27973
28153
  title: exports_external.string(),
27974
28154
  description: exports_external.string().optional(),
@@ -27982,7 +28162,7 @@ Blocks:
27982
28162
  tags: exports_external.array(exports_external.string()).optional(),
27983
28163
  estimated_minutes: exports_external.number().optional(),
27984
28164
  depends_on_temp_ids: exports_external.array(exports_external.string()).optional()
27985
- })),
28165
+ }))),
27986
28166
  project_id: exports_external.string().optional(),
27987
28167
  plan_id: exports_external.string().optional(),
27988
28168
  task_list_id: exports_external.string().optional()
@@ -29718,6 +29898,143 @@ ${lines.join(`
29718
29898
  }
29719
29899
  });
29720
29900
  }
29901
+ if (shouldRegisterTool("log_time")) {
29902
+ server.tool("log_time", "Log time spent on a task.", {
29903
+ task_id: exports_external.string().describe("Task ID to log time against"),
29904
+ minutes: exports_external.number().min(1).describe("Minutes spent"),
29905
+ agent_id: exports_external.string().optional().describe("Agent logging the time"),
29906
+ started_at: exports_external.string().optional().describe("ISO timestamp when work started"),
29907
+ ended_at: exports_external.string().optional().describe("ISO timestamp when work ended"),
29908
+ notes: exports_external.string().optional().describe("Notes about what was done")
29909
+ }, async ({ task_id, minutes, agent_id, started_at, ended_at, notes }) => {
29910
+ try {
29911
+ const { logTime: logTime2 } = (init_tasks(), __toCommonJS(exports_tasks));
29912
+ logTime2({ task_id: resolveId(task_id), minutes, agent_id, started_at, ended_at, notes });
29913
+ return { content: [{ type: "text", text: `Logged ${minutes} min on task ${task_id.slice(0, 8)}` }] };
29914
+ } catch (e) {
29915
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
29916
+ }
29917
+ });
29918
+ }
29919
+ if (shouldRegisterTool("get_time_report")) {
29920
+ server.tool("get_time_report", "Get time tracking report: actual vs estimated minutes for completed tasks.", {
29921
+ project_id: exports_external.string().optional().describe("Filter by project"),
29922
+ agent_id: exports_external.string().optional().describe("Filter by assignee"),
29923
+ since: exports_external.string().optional().describe("ISO date \u2014 only tasks completed after this date")
29924
+ }, async ({ project_id, agent_id, since }) => {
29925
+ try {
29926
+ const { getTimeReport: getTimeReport2 } = (init_tasks(), __toCommonJS(exports_tasks));
29927
+ const report = getTimeReport2({ project_id: project_id ? resolveId(project_id, "projects") : undefined, agent_id, since });
29928
+ if (report.length === 0)
29929
+ return { content: [{ type: "text", text: "No completed tasks found." }] };
29930
+ const lines = report.map((r) => {
29931
+ const est = r.estimated_minutes ?? "?";
29932
+ const actual = r.actual_minutes ?? "?";
29933
+ const diff = r.estimated_minutes != null && r.actual_minutes != null ? ` (${r.actual_minutes - r.estimated_minutes >= 0 ? "+" : ""}${r.actual_minutes - r.estimated_minutes})` : "";
29934
+ return `${r.title.slice(0, 50)}: estimated ${est}min, actual ${actual}min${diff}`;
29935
+ });
29936
+ return { content: [{ type: "text", text: `Time Report:
29937
+ ${lines.join(`
29938
+ `)}` }] };
29939
+ } catch (e) {
29940
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
29941
+ }
29942
+ });
29943
+ }
29944
+ if (shouldRegisterTool("watch_task")) {
29945
+ server.tool("watch_task", "Subscribe to notifications for a task.", {
29946
+ task_id: exports_external.string().describe("Task ID to watch"),
29947
+ agent_id: exports_external.string().optional().describe("Agent subscribing (defaults to context agent)")
29948
+ }, async ({ task_id, agent_id }) => {
29949
+ try {
29950
+ const { watchTask: watchTask2 } = (init_tasks(), __toCommonJS(exports_tasks));
29951
+ watchTask2(resolveId(task_id), agent_id || "");
29952
+ return { content: [{ type: "text", text: `Now watching task ${task_id.slice(0, 8)}` }] };
29953
+ } catch (e) {
29954
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
29955
+ }
29956
+ });
29957
+ }
29958
+ if (shouldRegisterTool("unwatch_task")) {
29959
+ server.tool("unwatch_task", "Unsubscribe from notifications for a task.", {
29960
+ task_id: exports_external.string().describe("Task ID to unwatch"),
29961
+ agent_id: exports_external.string().optional().describe("Agent unsubscribing (defaults to context agent)")
29962
+ }, async ({ task_id, agent_id }) => {
29963
+ try {
29964
+ const { unwatchTask: unwatchTask2 } = (init_tasks(), __toCommonJS(exports_tasks));
29965
+ unwatchTask2(resolveId(task_id), agent_id || "");
29966
+ return { content: [{ type: "text", text: `Stopped watching task ${task_id.slice(0, 8)}` }] };
29967
+ } catch (e) {
29968
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
29969
+ }
29970
+ });
29971
+ }
29972
+ if (shouldRegisterTool("get_task_watchers")) {
29973
+ server.tool("get_task_watchers", "List agents watching a task.", {
29974
+ task_id: exports_external.string().describe("Task ID")
29975
+ }, async ({ task_id }) => {
29976
+ try {
29977
+ const { getTaskWatchers: getTaskWatchers2 } = (init_tasks(), __toCommonJS(exports_tasks));
29978
+ const watchers = getTaskWatchers2(resolveId(task_id));
29979
+ if (watchers.length === 0)
29980
+ return { content: [{ type: "text", text: "No watchers." }] };
29981
+ return { content: [{ type: "text", text: `Watching (${watchers.length}): ${watchers.map((w) => w.agent_id).join(", ")}` }] };
29982
+ } catch (e) {
29983
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
29984
+ }
29985
+ });
29986
+ }
29987
+ if (shouldRegisterTool("todos_retro")) {
29988
+ server.tool("todos_retro", "Post-completion retrospective: stats on completed tasks, low-confidence completions, avg time vs estimate, and patterns.", {
29989
+ project_id: exports_external.string().optional().describe("Filter by project"),
29990
+ plan_id: exports_external.string().optional().describe("Filter by plan"),
29991
+ task_list_id: exports_external.string().optional().describe("Filter by task list"),
29992
+ since: exports_external.string().optional().describe("ISO date \u2014 only tasks completed after this date"),
29993
+ agent_id: exports_external.string().optional().describe("Filter by assignee")
29994
+ }, async ({ project_id, plan_id, task_list_id, since, agent_id }) => {
29995
+ try {
29996
+ const { listTasks: listTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
29997
+ const { patrolTasks: patrolTasks2 } = (init_patrol(), __toCommonJS(exports_patrol));
29998
+ const completed = listTasks2({ status: "completed", project_id, plan_id, task_list_id, assigned_to: agent_id, limit: 500 }, undefined);
29999
+ const filtered = since ? completed.filter((t) => t.completed_at && t.completed_at >= since) : completed;
30000
+ const total = filtered.length;
30001
+ const lowConf = filtered.filter((t) => t.confidence != null && t.confidence < 0.7).length;
30002
+ const withEstimate = filtered.filter((t) => t.estimated_minutes != null && t.actual_minutes != null);
30003
+ const avgDiff = withEstimate.length > 0 ? withEstimate.reduce((acc, t) => acc + (t.actual_minutes - t.estimated_minutes), 0) / withEstimate.length : 0;
30004
+ const patrolResult = patrolTasks2({ project_id: project_id ? resolveId(project_id, "projects") : undefined });
30005
+ const stuck = patrolResult.issues.filter((i) => i.type === "stuck").length;
30006
+ const lines = [
30007
+ `Retro (${total} completed tasks${since ? ` since ${since}` : ""})`,
30008
+ `Low confidence: ${lowConf}/${total}`,
30009
+ `Avg time vs estimate: ${avgDiff >= 0 ? "+" : ""}${avgDiff.toFixed(1)}min`,
30010
+ `Currently stuck: ${stuck}`
30011
+ ];
30012
+ return { content: [{ type: "text", text: lines.join(`
30013
+ `) }] };
30014
+ } catch (e) {
30015
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
30016
+ }
30017
+ });
30018
+ }
30019
+ if (shouldRegisterTool("todos_inbox")) {
30020
+ server.tool("todos_inbox", "Get unassigned tasks (GTD inbox) \u2014 tasks with no assignee, not yet started.", {
30021
+ project_id: exports_external.string().optional().describe("Filter by project"),
30022
+ limit: exports_external.number().optional().describe("Max results (default: 20)")
30023
+ }, async ({ project_id, limit }) => {
30024
+ try {
30025
+ const { listTasks: listTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
30026
+ const tasks = listTasks2({ status: "pending", project_id, assigned_to: "", limit: limit || 20 }, undefined);
30027
+ if (tasks.length === 0)
30028
+ return { content: [{ type: "text", text: "Inbox is empty." }] };
30029
+ const lines = tasks.map((t) => `[${t.priority}] ${t.title.slice(0, 60)} (${t.id.slice(0, 8)})`);
30030
+ return { content: [{ type: "text", text: `Inbox (${tasks.length}):
30031
+ ${lines.join(`
30032
+ `)}` }] };
30033
+ } catch (e) {
30034
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
30035
+ }
30036
+ });
30037
+ }
29721
30038
  if (shouldRegisterTool("get_agent_metrics")) {
29722
30039
  server.tool("get_agent_metrics", "Get performance metrics for an agent: completion rate, speed, confidence, review scores.", {
29723
30040
  agent_id: exports_external.string().describe("Agent ID or name"),
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/db/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/db/agents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,EA6mBjC,CAAC"}
1
+ {"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,EAipBjC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,eAAO,MAAM,UAAU,UAuuBtB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA8BhD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAwX/C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA4BnD"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,eAAO,MAAM,UAAU,UA2wBtB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA8BhD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAwZ/C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA4BnD"}