@hasna/todos 0.11.81 → 0.11.82

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.
@@ -21,7 +21,7 @@
21
21
  * subnet routing — pure API-client path per the locked architecture.
22
22
  */
23
23
  import { type HasnaStorageClient } from "@hasna/contracts/client/storage";
24
- import type { Task, TaskFilter } from "../types/index.js";
24
+ import type { Agent, Plan, Project, Task, TaskComment, TaskFilter } from "../types/index.js";
25
25
  type Env = Record<string, string | undefined>;
26
26
  /**
27
27
  * Resolve the todos cloud storage client from the environment. Returns a ready
@@ -60,6 +60,25 @@ export interface CloudStats {
60
60
  * local SQLite island.
61
61
  */
62
62
  export declare function cloudGetStats(client: HasnaStorageClient): Promise<CloudStats>;
63
+ /** List registered agents from the cloud (`GET /v1/agents`). */
64
+ export declare function cloudListAgents(client: HasnaStorageClient): Promise<Agent[]>;
65
+ /** List projects from the cloud (`GET /v1/projects`). */
66
+ export declare function cloudListProjects(client: HasnaStorageClient): Promise<Project[]>;
67
+ /** List plans from the cloud (`GET /v1/plans`), optionally scoped to a project. */
68
+ export declare function cloudListPlans(client: HasnaStorageClient, projectId?: string): Promise<Plan[]>;
69
+ /**
70
+ * Add a comment to a task in the cloud (`POST /v1/tasks/:id/comments`). The server
71
+ * validates that the task exists and returns 404 (surfaced as a thrown error by the
72
+ * transport) when it does not — so a comment on a missing cloud task fails loudly
73
+ * instead of silently succeeding.
74
+ */
75
+ export declare function cloudAddComment(client: HasnaStorageClient, taskId: string, input: {
76
+ content: string;
77
+ agent_id?: string;
78
+ session_id?: string;
79
+ type?: string;
80
+ progress_pct?: number;
81
+ }): Promise<TaskComment>;
63
82
  /**
64
83
  * Count tasks matching a filter. The `/v1/tasks` list response now returns a
65
84
  * SQL-side `total` (full match count, independent of limit/offset), so we ask for
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-router.d.ts","sourceRoot":"","sources":["../../src/cli/cloud-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE1D,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAI9C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,GAAwB,GAAG,kBAAkB,GAAG,IAAI,CAiB5F;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,GAAG,GAAE,GAAwB,GAAG,OAAO,CAErE;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAwBD,8EAA8E;AAC9E,wBAAsB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAIzG;AAED,iEAAiE;AACjE,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAG/F;AAED,oEAAoE;AACpE,wBAAsB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/G;AAED,6CAA6C;AAC7C,wBAAsB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3H;AAED,wEAAwE;AACxE,wBAAsB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG9F;AAED,sFAAsF;AACtF,wBAAsB,eAAe,CACnC,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,EAC/C,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAGnF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ1G"}
1
+ {"version":3,"file":"cloud-router.d.ts","sourceRoot":"","sources":["../../src/cli/cloud-router.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAkZrD"}
1
+ {"version":3,"file":"agent-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAmZrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"plan-template-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan-template-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BzC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,QAqe5D"}
1
+ {"version":3,"file":"plan-template-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan-template-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,QAwe5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/project-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoJzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA24BvD"}
1
+ {"version":3,"file":"project-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/project-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqJzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA05BvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/query-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6NzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA61FrD"}
1
+ {"version":3,"file":"query-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/query-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8NzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAg4FrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwMzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA+jCpD"}
1
+ {"version":3,"file":"task-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwMzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAglCpD"}
package/dist/cli/index.js CHANGED
@@ -8548,6 +8548,29 @@ async function cloudGetStats(client) {
8548
8548
  const raw = await client.transport.get("/stats");
8549
8549
  return raw ?? {};
8550
8550
  }
8551
+ async function cloudListAgents(client) {
8552
+ const res = await client.list("agents");
8553
+ const envelope = res.raw;
8554
+ return Array.isArray(envelope?.agents) ? envelope.agents : res.items;
8555
+ }
8556
+ async function cloudListProjects(client) {
8557
+ const res = await client.list("projects");
8558
+ const envelope = res.raw;
8559
+ return Array.isArray(envelope?.projects) ? envelope.projects : res.items;
8560
+ }
8561
+ async function cloudListPlans(client, projectId) {
8562
+ const query = projectId ? { project_id: projectId } : {};
8563
+ const res = await client.list("plans", { query });
8564
+ const envelope = res.raw;
8565
+ return Array.isArray(envelope?.plans) ? envelope.plans : res.items;
8566
+ }
8567
+ async function cloudAddComment(client, taskId, input) {
8568
+ const raw = await client.transport.post(`/tasks/${encodeURIComponent(taskId)}/comments`, input);
8569
+ if (raw && typeof raw === "object" && "comment" in raw) {
8570
+ return raw.comment;
8571
+ }
8572
+ return raw;
8573
+ }
8551
8574
  async function cloudCountTasks(client, filter = {}) {
8552
8575
  const { limit: _drop, offset: _o, ...rest } = filter;
8553
8576
  const res = await client.list("tasks", { query: { ...toListQuery(rest), limit: 1 } });
@@ -20505,11 +20528,23 @@ function registerTaskCommands(program2) {
20505
20528
  if (active.length > 0)
20506
20529
  resolvedId = active[0].id;
20507
20530
  }
20531
+ const cloud = getTodosCloudClient();
20532
+ if (!resolvedId && cloud && globalOpts.agent) {
20533
+ const active = await cloudListTasks(cloud, { status: "in_progress", assigned_to: globalOpts.agent, limit: 1 });
20534
+ if (active.length > 0)
20535
+ resolvedId = active[0].id;
20536
+ }
20508
20537
  if (!resolvedId) {
20509
20538
  console.error(chalk2.red("No task ID given and no active task found. Pass an ID or use --agent."));
20510
20539
  process.exit(1);
20511
20540
  }
20512
- const task2 = getTaskWithRelations(resolvedId);
20541
+ let task2;
20542
+ if (cloud) {
20543
+ const remote = await cloudGetTask(cloud, resolvedId);
20544
+ task2 = remote ? { subtasks: [], dependencies: [], blocked_by: [], comments: [], checklist: [], ...remote, tags: remote.tags ?? [] } : null;
20545
+ } else {
20546
+ task2 = getTaskWithRelations(resolvedId);
20547
+ }
20513
20548
  if (!task2) {
20514
20549
  console.error(chalk2.red(`Task not found: ${id || resolvedId}`));
20515
20550
  process.exit(1);
@@ -21643,9 +21678,10 @@ function resolvePlanCliRef(ref, projectId) {
21643
21678
  process.exit(1);
21644
21679
  }
21645
21680
  function registerPlanTemplateCommands(program2) {
21646
- program2.command("plans").description("List and manage plans").option("--add <name>", "Create a plan").option("--slug <slug>", "Readable plan slug (with --add)").option("-d, --description <text>", "Plan description (with --add)").option("--show <id-or-slug>", "Show plan details with its tasks").option("--artifact <id-or-slug>", "Show local Markdown artifact diagnostics for a plan").option("--write-artifacts", "Write local Markdown artifacts for all project-scoped plans in scope").option("--delete <id>", "Delete a plan").option("--complete <id>", "Mark a plan as completed").action((opts) => {
21681
+ program2.command("plans").description("List and manage plans").option("--add <name>", "Create a plan").option("--slug <slug>", "Readable plan slug (with --add)").option("-d, --description <text>", "Plan description (with --add)").option("--show <id-or-slug>", "Show plan details with its tasks").option("--artifact <id-or-slug>", "Show local Markdown artifact diagnostics for a plan").option("--write-artifacts", "Write local Markdown artifacts for all project-scoped plans in scope").option("--delete <id>", "Delete a plan").option("--complete <id>", "Mark a plan as completed").action(async (opts) => {
21647
21682
  const globalOpts = program2.opts();
21648
- const projectId = autoProject(globalOpts);
21683
+ const cloud = getTodosCloudClient();
21684
+ const projectId = cloud ? undefined : autoProject(globalOpts);
21649
21685
  if (opts.add) {
21650
21686
  let plan;
21651
21687
  try {
@@ -21804,7 +21840,7 @@ function registerPlanTemplateCommands(program2) {
21804
21840
  }
21805
21841
  return;
21806
21842
  }
21807
- const plans = listPlans(projectId);
21843
+ const plans = cloud ? await cloudListPlans(cloud, projectId) : listPlans(projectId);
21808
21844
  if (globalOpts.json) {
21809
21845
  output(plans, true);
21810
21846
  return;
@@ -22129,6 +22165,7 @@ var init_plan_template_commands = __esm(() => {
22129
22165
  init_tasks();
22130
22166
  init_plan_artifacts();
22131
22167
  init_helpers();
22168
+ init_cloud_router();
22132
22169
  });
22133
22170
 
22134
22171
  // src/lib/local-fields.ts
@@ -31376,10 +31413,11 @@ function registerProjectCommands(program2) {
31376
31413
  handleError(e);
31377
31414
  }
31378
31415
  });
31379
- program2.command("comment <id> <text>").alias("log-progress").description("Add a comment to a task (alias: log-progress, for recording intermediate progress)").option("--pct <percent>", "Progress percentage (0-100) to record alongside the note").action((id, text, opts) => {
31416
+ program2.command("comment <id> <text>").alias("log-progress").description("Add a comment to a task (alias: log-progress, for recording intermediate progress)").option("--pct <percent>", "Progress percentage (0-100) to record alongside the note").action(async (id, text, opts) => {
31380
31417
  const globalOpts = program2.opts();
31381
31418
  const resolvedId = resolveTaskId(id);
31382
31419
  let content = text;
31420
+ let progressPct;
31383
31421
  if (opts.pct !== undefined) {
31384
31422
  const pct = parseInt(opts.pct, 10);
31385
31423
  if (!Number.isFinite(pct) || pct < 0 || pct > 100) {
@@ -31387,17 +31425,28 @@ function registerProjectCommands(program2) {
31387
31425
  process.exit(1);
31388
31426
  }
31389
31427
  content = `[progress ${pct}%] ${text}`;
31428
+ progressPct = pct;
31390
31429
  }
31391
- const comment = addComment({
31392
- task_id: resolvedId,
31393
- content,
31394
- agent_id: globalOpts.agent,
31395
- session_id: globalOpts.session
31396
- });
31397
- if (globalOpts.json) {
31398
- output(comment, true);
31399
- } else {
31400
- console.log(chalk4.green("Comment added."));
31430
+ try {
31431
+ const cloud = getTodosCloudClient();
31432
+ const comment = cloud ? await cloudAddComment(cloud, resolvedId, {
31433
+ content,
31434
+ agent_id: globalOpts.agent,
31435
+ session_id: globalOpts.session,
31436
+ ...progressPct !== undefined ? { type: "progress", progress_pct: progressPct } : {}
31437
+ }) : addComment({
31438
+ task_id: resolvedId,
31439
+ content,
31440
+ agent_id: globalOpts.agent,
31441
+ session_id: globalOpts.session
31442
+ });
31443
+ if (globalOpts.json) {
31444
+ output(comment, true);
31445
+ } else {
31446
+ console.log(chalk4.green("Comment added."));
31447
+ }
31448
+ } catch (e) {
31449
+ handleError(e);
31401
31450
  }
31402
31451
  });
31403
31452
  program2.command("search <query>").description("Search local tasks, or run/save a cross-entity search view").option("--status <status>", "Filter by status").option("--priority <p>", "Filter by priority").option("--assigned <agent>", "Filter by assigned agent").option("--agent-id <agent>", "Filter by creator/run/comment agent").option("--task-list <id>", "Filter by task list").option("--plan <id>", "Filter by plan").option("--task <id>", "Filter runs/comments by task").option("--tag <tag>", "Filter by task tag (repeatable or comma-separated)", collectOption, []).option("--field-label <label>", "Filter by local field label (repeatable or comma-separated)", collectOption, []).option("--field-owner <owner>", "Filter by local field owner").option("--field-area <area>", "Filter by local field area").option("--field-severity <severity>", "Filter by local field severity").option("--field-custom <json>", "Filter by local custom fields as JSON").option("--since <date>", "Only tasks updated after this date (ISO)").option("--created-after <date>", "Only records created after this date (ISO)").option("--blocked", "Only blocked tasks (incomplete dependencies)").option("--has-deps", "Only tasks with dependencies").option("--depends-on <id>", "Only tasks that depend on a task").option("--blocks <id>", "Only tasks that block a task").option("--scope <scope>", "Search scope: tasks, projects, plans, runs, comments, all", "tasks").option("--limit <n>", "Maximum results", "100").option("--filter <json>", "Merge an advanced saved-search filter JSON object").option("--save-as <name>", "Save this search as a named view").option("--description <text>", "Saved view description").option("--all-projects", "Do not auto-scope the search to the current project").action((query, opts) => {
@@ -31651,7 +31700,8 @@ function registerProjectCommands(program2) {
31651
31700
  }
31652
31701
  return;
31653
31702
  }
31654
- const projects = listProjects();
31703
+ const cloud = getTodosCloudClient();
31704
+ const projects = cloud ? await cloudListProjects(cloud) : listProjects();
31655
31705
  if (globalOpts.json) {
31656
31706
  output(projects, true);
31657
31707
  return;
@@ -32057,6 +32107,7 @@ var init_project_commands = __esm(() => {
32057
32107
  init_database();
32058
32108
  init_projects();
32059
32109
  init_comments();
32110
+ init_cloud_router();
32060
32111
  init_saved_search_views();
32061
32112
  init_sync();
32062
32113
  init_config2();
@@ -32826,7 +32877,8 @@ Use ${chalk5.cyan(`--agent ${result.id}`)} on future commands.`);
32826
32877
  program2.command("agents").description("List registered agents").action(async () => {
32827
32878
  const globalOpts = program2.opts();
32828
32879
  try {
32829
- const agents = listAgents();
32880
+ const cloud = getTodosCloudClient();
32881
+ const agents = cloud ? await cloudListAgents(cloud) : listAgents();
32830
32882
  if (globalOpts.json) {
32831
32883
  output(agents, true);
32832
32884
  return;
@@ -33095,6 +33147,7 @@ var init_agent_commands = __esm(() => {
33095
33147
  init_task_lists();
33096
33148
  init_tasks();
33097
33149
  init_helpers();
33150
+ init_cloud_router();
33098
33151
  });
33099
33152
 
33100
33153
  // src/lib/retention-cleanup.ts
@@ -37343,6 +37396,7 @@ function createLocalSqliteTodosStorageAdapter(options = {}) {
37343
37396
  audit: {
37344
37397
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId) => logTaskChange(taskId, action, field, oldValue, newValue, agentId, database()),
37345
37398
  addComment: (input) => addComment(input, database()),
37399
+ getComments: (taskId) => listComments(taskId, database()),
37346
37400
  getTaskHistory: (taskId) => getTaskHistory(taskId, database()),
37347
37401
  getRecentActivity: (limit) => getRecentActivity(limit, database())
37348
37402
  },
@@ -38356,6 +38410,7 @@ function createPostgresTodosStorageAdapter(options) {
38356
38410
  audit: {
38357
38411
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId, context) => logTaskChange2(taskId, action, field, oldValue, newValue, agentId, store, context),
38358
38412
  addComment: (input, context) => addComment2(input, store, context),
38413
+ getComments: async (taskId) => (await store.list("comments")).filter((comment) => comment.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
38359
38414
  getTaskHistory: async (taskId) => (await store.list("audit_history")).filter((entry2) => entry2.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
38360
38415
  getRecentActivity: async (limit = 20) => (await store.list("audit_history")).sort((a, b) => b.created_at.localeCompare(a.created_at)).slice(0, limit)
38361
38416
  },
@@ -39685,6 +39740,31 @@ async function handleV1Request(req, url) {
39685
39740
  return error(405, `method ${method} not allowed on /v1/tasks`);
39686
39741
  }
39687
39742
  if (action) {
39743
+ if (action === "comments") {
39744
+ if (method === "GET") {
39745
+ const comments = await store.audit.getComments(id);
39746
+ return json2({ comments, count: comments.length });
39747
+ }
39748
+ if (method === "POST") {
39749
+ const body2 = await readJson(req) ?? {};
39750
+ if (typeof body2.content !== "string" || !body2.content.trim()) {
39751
+ return error(400, "content is required");
39752
+ }
39753
+ const target = await store.tasks.get(id);
39754
+ if (!target)
39755
+ return error(404, "task not found");
39756
+ const comment = await store.audit.addComment({
39757
+ task_id: id,
39758
+ content: body2.content,
39759
+ agent_id: body2.agent_id ?? principal.agent ?? undefined,
39760
+ session_id: body2.session_id,
39761
+ type: body2.type,
39762
+ progress_pct: body2.progress_pct
39763
+ }, contextFromPrincipal(principal, body2));
39764
+ return json2({ comment }, 201);
39765
+ }
39766
+ return error(405, `method ${method} not allowed on /v1/tasks/:id/comments`);
39767
+ }
39688
39768
  const body = await readJson(req) ?? {};
39689
39769
  const agentId = body.agent_id || principal.agent || "todos-serve";
39690
39770
  if (action === "start" && method === "POST") {
@@ -49865,6 +49945,11 @@ Tasks:` : null,
49865
49945
  author: exports_external3.string().optional().describe("Author agent ID or name")
49866
49946
  }, async ({ task_id, body, author }) => {
49867
49947
  try {
49948
+ const cloud = getTodosCloudClient();
49949
+ if (cloud) {
49950
+ await cloudAddComment(cloud, task_id, { content: body, agent_id: author });
49951
+ return { content: [{ type: "text", text: `Comment added to ${task_id.slice(0, 8)}: ${body.slice(0, 50)}${body.length > 50 ? "..." : ""}` }] };
49952
+ }
49868
49953
  const resolvedId = resolveId(task_id);
49869
49954
  const resolvedAuthor = author ? resolveId(author, "agents") : undefined;
49870
49955
  const comment = addComment({ task_id: resolvedId, content: body, agent_id: resolvedAuthor });
@@ -50775,6 +50860,56 @@ function registerTaskWorkflowTools(server, ctx) {
50775
50860
  max_description_chars: exports_external3.number().optional().describe("Max task description chars in compact mode (default: 180)")
50776
50861
  }, async ({ agent_id, project_id, task_list_id, explain_blocked, detail, max_description_chars }) => {
50777
50862
  try {
50863
+ const cloud = getTodosCloudClient();
50864
+ if (cloud) {
50865
+ const baseFilter = {};
50866
+ if (project_id)
50867
+ baseFilter.project_id = project_id;
50868
+ if (task_list_id)
50869
+ baseFilter.task_list_id = task_list_id;
50870
+ const [stats, pending, in_progress, completed, activeTasks, nextTasks] = await Promise.all([
50871
+ cloudGetStats(cloud),
50872
+ cloudCountTasks(cloud, { ...baseFilter, status: "pending" }),
50873
+ cloudCountTasks(cloud, { ...baseFilter, status: "in_progress" }),
50874
+ cloudCountTasks(cloud, { ...baseFilter, status: "completed" }),
50875
+ cloudListTasks(cloud, { ...baseFilter, status: "in_progress", limit: 5 }),
50876
+ cloudListTasks(cloud, { ...baseFilter, status: "pending", limit: 1 })
50877
+ ]);
50878
+ const cloudStatus = {
50879
+ source: "cloud",
50880
+ total: stats.tasks ?? pending + in_progress + completed,
50881
+ pending,
50882
+ in_progress,
50883
+ completed,
50884
+ active_work: activeTasks,
50885
+ next_task: nextTasks[0] ?? null,
50886
+ stale_count: 0,
50887
+ overdue_recurring: 0
50888
+ };
50889
+ const next_task2 = nextTasks[0] ?? null;
50890
+ const payload2 = {
50891
+ status: cloudStatus,
50892
+ next_task: next_task2,
50893
+ overdue_count: 0,
50894
+ latest_handoff: null,
50895
+ as_of: new Date().toISOString()
50896
+ };
50897
+ if (detail === "full") {
50898
+ return { content: [{ type: "text", text: JSON.stringify(payload2, null, 2) }] };
50899
+ }
50900
+ return {
50901
+ content: [{
50902
+ type: "text",
50903
+ text: compactJson({
50904
+ status: compactStatus(cloudStatus),
50905
+ next_task: next_task2 ? compactTask(next_task2, max_description_chars || 180) : null,
50906
+ overdue_count: 0,
50907
+ latest_handoff: null,
50908
+ as_of: payload2.as_of
50909
+ })
50910
+ }]
50911
+ };
50912
+ }
50778
50913
  const { getStatus: getStatus2, getNextTask: getNextTask3, getOverdueTasks: getOverdueTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
50779
50914
  const { getLatestHandoff: getLatestHandoff2 } = (init_handoffs(), __toCommonJS(exports_handoffs));
50780
50915
  const filters = {};
@@ -51210,6 +51345,27 @@ ${lines.join(`
51210
51345
  if (shouldRegisterTool("get_health")) {
51211
51346
  server.tool("get_health", "Get system health: task counts by status, active agents, project summary.", async () => {
51212
51347
  try {
51348
+ const cloud = getTodosCloudClient();
51349
+ if (cloud) {
51350
+ const [stats, pending2, inProgress2, completed2, cancelled2, projects2, agents2] = await Promise.all([
51351
+ cloudGetStats(cloud),
51352
+ cloudCountTasks(cloud, { status: "pending" }),
51353
+ cloudCountTasks(cloud, { status: "in_progress" }),
51354
+ cloudCountTasks(cloud, { status: "completed" }),
51355
+ cloudCountTasks(cloud, { status: "cancelled" }),
51356
+ cloudListProjects(cloud),
51357
+ cloudListAgents(cloud)
51358
+ ]);
51359
+ const projectCount = stats.projects ?? projects2.length;
51360
+ const lines2 = [
51361
+ `=== System Health (cloud) ===`,
51362
+ `Tasks: ${pending2} pending | ${inProgress2} in progress | ${completed2} completed | ${cancelled2} cancelled`,
51363
+ `Projects: ${projectCount} total`,
51364
+ `Agents: ${agents2.length} registered`
51365
+ ];
51366
+ return { content: [{ type: "text", text: lines2.join(`
51367
+ `) }] };
51368
+ }
51213
51369
  const { countTasks: countTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
51214
51370
  const { listProjects: listProjects2 } = (init_projects(), __toCommonJS(exports_projects));
51215
51371
  const { listAgents: listAgents2 } = (init_agents(), __toCommonJS(exports_agents));
@@ -51248,6 +51404,7 @@ ${lines.join(`
51248
51404
  }
51249
51405
  var init_task_auto_tools = __esm(() => {
51250
51406
  init_zod();
51407
+ init_cloud_router();
51251
51408
  });
51252
51409
 
51253
51410
  // src/lib/context-packs.ts
@@ -52570,6 +52727,11 @@ No blocked tasks.`,
52570
52727
  author: exports_external3.string().optional().describe("Author agent ID or name")
52571
52728
  }, async ({ task_id, body, author }) => {
52572
52729
  try {
52730
+ const cloud = getTodosCloudClient();
52731
+ if (cloud) {
52732
+ await cloudAddComment(cloud, task_id, { content: body, agent_id: author });
52733
+ return { content: [{ type: "text", text: `Comment added to ${task_id.slice(0, 8)}` }] };
52734
+ }
52573
52735
  const { addComment: addComment3 } = (init_comments(), __toCommonJS(exports_comments));
52574
52736
  const resolvedId = resolveId(task_id);
52575
52737
  const resolvedAuthor = author ? resolveId(author, "agents") : undefined;
@@ -62330,7 +62492,8 @@ No names available. Wait for an active agent to go stale (30min timeout).`
62330
62492
  include_archived: exports_external3.boolean().optional().describe("Include archived agents in the list (default: false)")
62331
62493
  }, async ({ include_archived }) => {
62332
62494
  try {
62333
- const agents = listAgents({ include_archived: include_archived ?? false });
62495
+ const cloud = getTodosCloudClient();
62496
+ const agents = cloud ? await cloudListAgents(cloud) : listAgents({ include_archived: include_archived ?? false });
62334
62497
  if (agents.length === 0) {
62335
62498
  return { content: [{ type: "text", text: "No agents registered." }] };
62336
62499
  }
@@ -62550,6 +62713,7 @@ var init_agents2 = __esm(() => {
62550
62713
  init_agents();
62551
62714
  init_config2();
62552
62715
  init_database();
62716
+ init_cloud_router();
62553
62717
  });
62554
62718
 
62555
62719
  // src/mcp/tools/templates.ts
@@ -68219,11 +68383,42 @@ function registerQueryCommands(program2) {
68219
68383
  program2.command("status").description("Show full project health snapshot").option("--agent <id>", "Include next task for this agent").option("--project <id>", "Filter to project").option("-j, --json", "Output as JSON").action(async (opts) => {
68220
68384
  const globalOpts = program2.opts();
68221
68385
  const json3 = opts.json || globalOpts.json;
68222
- const db = getDatabase();
68223
68386
  const filters = {};
68224
68387
  if (opts.project)
68225
68388
  filters.project_id = opts.project;
68226
- const s = getStatus(Object.keys(filters).length ? filters : undefined, opts.agent, undefined, db);
68389
+ const cloud = getTodosCloudClient();
68390
+ let s;
68391
+ if (cloud) {
68392
+ const baseFilter = opts.project ? { project_id: opts.project } : {};
68393
+ const [stats2, pending, in_progress, completed, activeTasks, nextTasks] = await Promise.all([
68394
+ cloudGetStats(cloud),
68395
+ cloudCountTasks(cloud, { ...baseFilter, status: "pending" }),
68396
+ cloudCountTasks(cloud, { ...baseFilter, status: "in_progress" }),
68397
+ cloudCountTasks(cloud, { ...baseFilter, status: "completed" }),
68398
+ cloudListTasks(cloud, { ...baseFilter, status: "in_progress", limit: 5 }),
68399
+ cloudListTasks(cloud, { ...baseFilter, status: "pending", limit: 1 })
68400
+ ]);
68401
+ s = {
68402
+ source: "cloud",
68403
+ pending,
68404
+ in_progress,
68405
+ completed,
68406
+ total: stats2.tasks ?? pending + in_progress + completed,
68407
+ active_work: activeTasks.map((t) => ({
68408
+ id: t.id,
68409
+ short_id: t.short_id ?? null,
68410
+ title: t.title,
68411
+ assigned_to: t.assigned_to ?? null,
68412
+ locked_by: t.locked_by ?? null
68413
+ })),
68414
+ next_task: nextTasks[0] ?? null,
68415
+ stale_count: 0,
68416
+ overdue_recurring: 0
68417
+ };
68418
+ } else {
68419
+ const db = getDatabase();
68420
+ s = getStatus(Object.keys(filters).length ? filters : undefined, opts.agent, undefined, db);
68421
+ }
68227
68422
  if (json3) {
68228
68423
  console.log(JSON.stringify(s, null, 2));
68229
68424
  return;
@@ -70617,6 +70812,7 @@ var init_query_commands = __esm(() => {
70617
70812
  init_workflow_states();
70618
70813
  init_local_reports();
70619
70814
  init_helpers();
70815
+ init_cloud_router();
70620
70816
  init_types();
70621
70817
  });
70622
70818
 
package/dist/index.js CHANGED
@@ -23220,6 +23220,7 @@ function createLocalSqliteTodosStorageAdapter(options = {}) {
23220
23220
  audit: {
23221
23221
  logTaskChange: (taskId, action, field2, oldValue, newValue, agentId) => logTaskChange(taskId, action, field2, oldValue, newValue, agentId, database()),
23222
23222
  addComment: (input) => addComment(input, database()),
23223
+ getComments: (taskId) => listComments(taskId, database()),
23223
23224
  getTaskHistory: (taskId) => getTaskHistory(taskId, database()),
23224
23225
  getRecentActivity: (limit) => getRecentActivity(limit, database())
23225
23226
  },
@@ -23570,6 +23571,7 @@ function createPostgresTodosStorageAdapter(options) {
23570
23571
  audit: {
23571
23572
  logTaskChange: (taskId, action, field2, oldValue, newValue, agentId, context) => logTaskChange2(taskId, action, field2, oldValue, newValue, agentId, store, context),
23572
23573
  addComment: (input, context) => addComment2(input, store, context),
23574
+ getComments: async (taskId) => (await store.list("comments")).filter((comment) => comment.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
23573
23575
  getTaskHistory: async (taskId) => (await store.list("audit_history")).filter((entry2) => entry2.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
23574
23576
  getRecentActivity: async (limit = 20) => (await store.list("audit_history")).sort((a, b) => b.created_at.localeCompare(a.created_at)).slice(0, limit)
23575
23577
  },
package/dist/mcp/index.js CHANGED
@@ -22837,6 +22837,23 @@ async function cloudGetStats(client) {
22837
22837
  const raw = await client.transport.get("/stats");
22838
22838
  return raw ?? {};
22839
22839
  }
22840
+ async function cloudListAgents(client) {
22841
+ const res = await client.list("agents");
22842
+ const envelope = res.raw;
22843
+ return Array.isArray(envelope?.agents) ? envelope.agents : res.items;
22844
+ }
22845
+ async function cloudListProjects(client) {
22846
+ const res = await client.list("projects");
22847
+ const envelope = res.raw;
22848
+ return Array.isArray(envelope?.projects) ? envelope.projects : res.items;
22849
+ }
22850
+ async function cloudAddComment(client, taskId, input) {
22851
+ const raw = await client.transport.post(`/tasks/${encodeURIComponent(taskId)}/comments`, input);
22852
+ if (raw && typeof raw === "object" && "comment" in raw) {
22853
+ return raw.comment;
22854
+ }
22855
+ return raw;
22856
+ }
22840
22857
  async function cloudCountTasks(client, filter = {}) {
22841
22858
  const { limit: _drop, offset: _o, ...rest } = filter;
22842
22859
  const res = await client.list("tasks", { query: { ...toListQuery(rest), limit: 1 } });
@@ -30183,6 +30200,11 @@ Tasks:` : null,
30183
30200
  author: exports_external.string().optional().describe("Author agent ID or name")
30184
30201
  }, async ({ task_id, body, author }) => {
30185
30202
  try {
30203
+ const cloud = getTodosCloudClient();
30204
+ if (cloud) {
30205
+ await cloudAddComment(cloud, task_id, { content: body, agent_id: author });
30206
+ return { content: [{ type: "text", text: `Comment added to ${task_id.slice(0, 8)}: ${body.slice(0, 50)}${body.length > 50 ? "..." : ""}` }] };
30207
+ }
30186
30208
  const resolvedId = resolveId(task_id);
30187
30209
  const resolvedAuthor = author ? resolveId(author, "agents") : undefined;
30188
30210
  const comment = addComment({ task_id: resolvedId, content: body, agent_id: resolvedAuthor });
@@ -31093,6 +31115,56 @@ function registerTaskWorkflowTools(server, ctx) {
31093
31115
  max_description_chars: exports_external.number().optional().describe("Max task description chars in compact mode (default: 180)")
31094
31116
  }, async ({ agent_id, project_id, task_list_id, explain_blocked, detail, max_description_chars }) => {
31095
31117
  try {
31118
+ const cloud = getTodosCloudClient();
31119
+ if (cloud) {
31120
+ const baseFilter = {};
31121
+ if (project_id)
31122
+ baseFilter.project_id = project_id;
31123
+ if (task_list_id)
31124
+ baseFilter.task_list_id = task_list_id;
31125
+ const [stats, pending, in_progress, completed, activeTasks, nextTasks] = await Promise.all([
31126
+ cloudGetStats(cloud),
31127
+ cloudCountTasks(cloud, { ...baseFilter, status: "pending" }),
31128
+ cloudCountTasks(cloud, { ...baseFilter, status: "in_progress" }),
31129
+ cloudCountTasks(cloud, { ...baseFilter, status: "completed" }),
31130
+ cloudListTasks(cloud, { ...baseFilter, status: "in_progress", limit: 5 }),
31131
+ cloudListTasks(cloud, { ...baseFilter, status: "pending", limit: 1 })
31132
+ ]);
31133
+ const cloudStatus = {
31134
+ source: "cloud",
31135
+ total: stats.tasks ?? pending + in_progress + completed,
31136
+ pending,
31137
+ in_progress,
31138
+ completed,
31139
+ active_work: activeTasks,
31140
+ next_task: nextTasks[0] ?? null,
31141
+ stale_count: 0,
31142
+ overdue_recurring: 0
31143
+ };
31144
+ const next_task2 = nextTasks[0] ?? null;
31145
+ const payload2 = {
31146
+ status: cloudStatus,
31147
+ next_task: next_task2,
31148
+ overdue_count: 0,
31149
+ latest_handoff: null,
31150
+ as_of: new Date().toISOString()
31151
+ };
31152
+ if (detail === "full") {
31153
+ return { content: [{ type: "text", text: JSON.stringify(payload2, null, 2) }] };
31154
+ }
31155
+ return {
31156
+ content: [{
31157
+ type: "text",
31158
+ text: compactJson({
31159
+ status: compactStatus(cloudStatus),
31160
+ next_task: next_task2 ? compactTask(next_task2, max_description_chars || 180) : null,
31161
+ overdue_count: 0,
31162
+ latest_handoff: null,
31163
+ as_of: payload2.as_of
31164
+ })
31165
+ }]
31166
+ };
31167
+ }
31096
31168
  const { getStatus: getStatus2, getNextTask: getNextTask2, getOverdueTasks: getOverdueTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
31097
31169
  const { getLatestHandoff: getLatestHandoff2 } = (init_handoffs(), __toCommonJS(exports_handoffs));
31098
31170
  const filters = {};
@@ -31922,6 +31994,27 @@ ${lines.join(`
31922
31994
  if (shouldRegisterTool("get_health")) {
31923
31995
  server.tool("get_health", "Get system health: task counts by status, active agents, project summary.", async () => {
31924
31996
  try {
31997
+ const cloud = getTodosCloudClient();
31998
+ if (cloud) {
31999
+ const [stats, pending2, inProgress2, completed2, cancelled2, projects2, agents2] = await Promise.all([
32000
+ cloudGetStats(cloud),
32001
+ cloudCountTasks(cloud, { status: "pending" }),
32002
+ cloudCountTasks(cloud, { status: "in_progress" }),
32003
+ cloudCountTasks(cloud, { status: "completed" }),
32004
+ cloudCountTasks(cloud, { status: "cancelled" }),
32005
+ cloudListProjects(cloud),
32006
+ cloudListAgents(cloud)
32007
+ ]);
32008
+ const projectCount = stats.projects ?? projects2.length;
32009
+ const lines2 = [
32010
+ `=== System Health (cloud) ===`,
32011
+ `Tasks: ${pending2} pending | ${inProgress2} in progress | ${completed2} completed | ${cancelled2} cancelled`,
32012
+ `Projects: ${projectCount} total`,
32013
+ `Agents: ${agents2.length} registered`
32014
+ ];
32015
+ return { content: [{ type: "text", text: lines2.join(`
32016
+ `) }] };
32017
+ }
31925
32018
  const { countTasks: countTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
31926
32019
  const { listProjects: listProjects2 } = (init_projects(), __toCommonJS(exports_projects));
31927
32020
  const { listAgents: listAgents2 } = (init_agents(), __toCommonJS(exports_agents));
@@ -31960,6 +32053,7 @@ ${lines.join(`
31960
32053
  }
31961
32054
  var init_task_auto_tools = __esm(() => {
31962
32055
  init_zod();
32056
+ init_cloud_router();
31963
32057
  });
31964
32058
 
31965
32059
  // src/lib/context-packs.ts
@@ -33282,6 +33376,11 @@ No blocked tasks.`,
33282
33376
  author: exports_external.string().optional().describe("Author agent ID or name")
33283
33377
  }, async ({ task_id, body, author }) => {
33284
33378
  try {
33379
+ const cloud = getTodosCloudClient();
33380
+ if (cloud) {
33381
+ await cloudAddComment(cloud, task_id, { content: body, agent_id: author });
33382
+ return { content: [{ type: "text", text: `Comment added to ${task_id.slice(0, 8)}` }] };
33383
+ }
33285
33384
  const { addComment: addComment2 } = (init_comments(), __toCommonJS(exports_comments));
33286
33385
  const resolvedId = resolveId(task_id);
33287
33386
  const resolvedAuthor = author ? resolveId(author, "agents") : undefined;
@@ -44189,7 +44288,8 @@ No names available. Wait for an active agent to go stale (30min timeout).`
44189
44288
  include_archived: exports_external.boolean().optional().describe("Include archived agents in the list (default: false)")
44190
44289
  }, async ({ include_archived }) => {
44191
44290
  try {
44192
- const agents = listAgents({ include_archived: include_archived ?? false });
44291
+ const cloud = getTodosCloudClient();
44292
+ const agents = cloud ? await cloudListAgents(cloud) : listAgents({ include_archived: include_archived ?? false });
44193
44293
  if (agents.length === 0) {
44194
44294
  return { content: [{ type: "text", text: "No agents registered." }] };
44195
44295
  }
@@ -44409,6 +44509,7 @@ var init_agents2 = __esm(() => {
44409
44509
  init_agents();
44410
44510
  init_config2();
44411
44511
  init_database();
44512
+ init_cloud_router();
44412
44513
  });
44413
44514
 
44414
44515
  // src/db/builtin-templates.ts
@@ -46022,6 +46123,7 @@ function createLocalSqliteTodosStorageAdapter(options = {}) {
46022
46123
  audit: {
46023
46124
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId) => logTaskChange(taskId, action, field, oldValue, newValue, agentId, database()),
46024
46125
  addComment: (input) => addComment(input, database()),
46126
+ getComments: (taskId) => listComments(taskId, database()),
46025
46127
  getTaskHistory: (taskId) => getTaskHistory(taskId, database()),
46026
46128
  getRecentActivity: (limit) => getRecentActivity(limit, database())
46027
46129
  },
@@ -48038,6 +48140,7 @@ function createPostgresTodosStorageAdapter(options) {
48038
48140
  audit: {
48039
48141
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId, context) => logTaskChange2(taskId, action, field, oldValue, newValue, agentId, store, context),
48040
48142
  addComment: (input, context) => addComment2(input, store, context),
48143
+ getComments: async (taskId) => (await store.list("comments")).filter((comment) => comment.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
48041
48144
  getTaskHistory: async (taskId) => (await store.list("audit_history")).filter((entry2) => entry2.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
48042
48145
  getRecentActivity: async (limit = 20) => (await store.list("audit_history")).sort((a, b) => b.created_at.localeCompare(a.created_at)).slice(0, limit)
48043
48146
  },
@@ -49367,6 +49470,31 @@ async function handleV1Request(req, url) {
49367
49470
  return error(405, `method ${method} not allowed on /v1/tasks`);
49368
49471
  }
49369
49472
  if (action) {
49473
+ if (action === "comments") {
49474
+ if (method === "GET") {
49475
+ const comments = await store.audit.getComments(id);
49476
+ return json2({ comments, count: comments.length });
49477
+ }
49478
+ if (method === "POST") {
49479
+ const body2 = await readJson(req) ?? {};
49480
+ if (typeof body2.content !== "string" || !body2.content.trim()) {
49481
+ return error(400, "content is required");
49482
+ }
49483
+ const target = await store.tasks.get(id);
49484
+ if (!target)
49485
+ return error(404, "task not found");
49486
+ const comment = await store.audit.addComment({
49487
+ task_id: id,
49488
+ content: body2.content,
49489
+ agent_id: body2.agent_id ?? principal.agent ?? undefined,
49490
+ session_id: body2.session_id,
49491
+ type: body2.type,
49492
+ progress_pct: body2.progress_pct
49493
+ }, contextFromPrincipal(principal, body2));
49494
+ return json2({ comment }, 201);
49495
+ }
49496
+ return error(405, `method ${method} not allowed on /v1/tasks/:id/comments`);
49497
+ }
49370
49498
  const body = await readJson(req) ?? {};
49371
49499
  const agentId = body.agent_id || principal.agent || "todos-serve";
49372
49500
  if (action === "start" && method === "POST") {
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,GAAG,IAAI,CAwbjJ"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,GAAG,IAAI,CA6bjJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-adv-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-adv-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,UAAU,cAAc;IACtB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,QA8mB1E"}
1
+ {"version":3,"file":"task-adv-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-adv-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,UAAU,cAAc;IACtB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,QAunB1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-auto-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-auto-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QA8V5E"}
1
+ {"version":3,"file":"task-auto-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-auto-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAoX5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAmJjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QA43FlF"}
1
+ {"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAmJjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QAo4FlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-workflow-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QA+VpF"}
1
+ {"version":3,"file":"task-workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-workflow-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QAkZpF"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.11.81",
3
+ "packageVersion": "0.11.82",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "bc87cdfeb8453260c82e7a6aecf33d8d52ef9892",
6
- "generatedAt": "2026-07-08T11:32:21.756Z"
5
+ "gitCommit": "c6e5695eeb5700d03c6c7f70b722fdb18dc60e32",
6
+ "generatedAt": "2026-07-08T13:21:23.262Z"
7
7
  }
@@ -989,6 +989,7 @@ function createPostgresTodosStorageAdapter(options) {
989
989
  audit: {
990
990
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId, context) => logTaskChange(taskId, action, field, oldValue, newValue, agentId, store, context),
991
991
  addComment: (input, context) => addComment(input, store, context),
992
+ getComments: async (taskId) => (await store.list("comments")).filter((comment) => comment.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
992
993
  getTaskHistory: async (taskId) => (await store.list("audit_history")).filter((entry2) => entry2.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
993
994
  getRecentActivity: async (limit = 20) => (await store.list("audit_history")).sort((a, b) => b.created_at.localeCompare(a.created_at)).slice(0, limit)
994
995
  },
@@ -14825,6 +14826,7 @@ function createLocalSqliteTodosStorageAdapter(options = {}) {
14825
14826
  audit: {
14826
14827
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId) => logTaskChange2(taskId, action, field, oldValue, newValue, agentId, database()),
14827
14828
  addComment: (input) => addComment2(input, database()),
14829
+ getComments: (taskId) => listComments(taskId, database()),
14828
14830
  getTaskHistory: (taskId) => getTaskHistory(taskId, database()),
14829
14831
  getRecentActivity: (limit) => getRecentActivity(limit, database())
14830
14832
  },
@@ -15616,6 +15618,31 @@ async function handleV1Request(req, url) {
15616
15618
  return error(405, `method ${method} not allowed on /v1/tasks`);
15617
15619
  }
15618
15620
  if (action) {
15621
+ if (action === "comments") {
15622
+ if (method === "GET") {
15623
+ const comments = await store.audit.getComments(id);
15624
+ return json2({ comments, count: comments.length });
15625
+ }
15626
+ if (method === "POST") {
15627
+ const body2 = await readJson(req) ?? {};
15628
+ if (typeof body2.content !== "string" || !body2.content.trim()) {
15629
+ return error(400, "content is required");
15630
+ }
15631
+ const target = await store.tasks.get(id);
15632
+ if (!target)
15633
+ return error(404, "task not found");
15634
+ const comment = await store.audit.addComment({
15635
+ task_id: id,
15636
+ content: body2.content,
15637
+ agent_id: body2.agent_id ?? principal.agent ?? undefined,
15638
+ session_id: body2.session_id,
15639
+ type: body2.type,
15640
+ progress_pct: body2.progress_pct
15641
+ }, contextFromPrincipal(principal, body2));
15642
+ return json2({ comment }, 201);
15643
+ }
15644
+ return error(405, `method ${method} not allowed on /v1/tasks/:id/comments`);
15645
+ }
15619
15646
  const body = await readJson(req) ?? {};
15620
15647
  const agentId = body.agent_id || principal.agent || "todos-serve";
15621
15648
  if (action === "start" && method === "POST") {
@@ -43550,6 +43577,23 @@ async function cloudGetStats(client) {
43550
43577
  const raw = await client.transport.get("/stats");
43551
43578
  return raw ?? {};
43552
43579
  }
43580
+ async function cloudListAgents(client) {
43581
+ const res = await client.list("agents");
43582
+ const envelope = res.raw;
43583
+ return Array.isArray(envelope?.agents) ? envelope.agents : res.items;
43584
+ }
43585
+ async function cloudListProjects(client) {
43586
+ const res = await client.list("projects");
43587
+ const envelope = res.raw;
43588
+ return Array.isArray(envelope?.projects) ? envelope.projects : res.items;
43589
+ }
43590
+ async function cloudAddComment(client, taskId, input) {
43591
+ const raw = await client.transport.post(`/tasks/${encodeURIComponent(taskId)}/comments`, input);
43592
+ if (raw && typeof raw === "object" && "comment" in raw) {
43593
+ return raw.comment;
43594
+ }
43595
+ return raw;
43596
+ }
43553
43597
  async function cloudCountTasks(client, filter = {}) {
43554
43598
  const { limit: _drop, offset: _o, ...rest } = filter;
43555
43599
  const res = await client.list("tasks", { query: { ...toListQuery(rest), limit: 1 } });
@@ -50896,6 +50940,11 @@ Tasks:` : null,
50896
50940
  author: exports_external.string().optional().describe("Author agent ID or name")
50897
50941
  }, async ({ task_id, body, author }) => {
50898
50942
  try {
50943
+ const cloud = getTodosCloudClient();
50944
+ if (cloud) {
50945
+ await cloudAddComment(cloud, task_id, { content: body, agent_id: author });
50946
+ return { content: [{ type: "text", text: `Comment added to ${task_id.slice(0, 8)}: ${body.slice(0, 50)}${body.length > 50 ? "..." : ""}` }] };
50947
+ }
50899
50948
  const resolvedId = resolveId(task_id);
50900
50949
  const resolvedAuthor = author ? resolveId(author, "agents") : undefined;
50901
50950
  const comment = addComment2({ task_id: resolvedId, content: body, agent_id: resolvedAuthor });
@@ -51806,6 +51855,56 @@ function registerTaskWorkflowTools(server, ctx) {
51806
51855
  max_description_chars: exports_external.number().optional().describe("Max task description chars in compact mode (default: 180)")
51807
51856
  }, async ({ agent_id, project_id, task_list_id, explain_blocked, detail, max_description_chars }) => {
51808
51857
  try {
51858
+ const cloud = getTodosCloudClient();
51859
+ if (cloud) {
51860
+ const baseFilter = {};
51861
+ if (project_id)
51862
+ baseFilter.project_id = project_id;
51863
+ if (task_list_id)
51864
+ baseFilter.task_list_id = task_list_id;
51865
+ const [stats, pending, in_progress, completed, activeTasks, nextTasks] = await Promise.all([
51866
+ cloudGetStats(cloud),
51867
+ cloudCountTasks(cloud, { ...baseFilter, status: "pending" }),
51868
+ cloudCountTasks(cloud, { ...baseFilter, status: "in_progress" }),
51869
+ cloudCountTasks(cloud, { ...baseFilter, status: "completed" }),
51870
+ cloudListTasks(cloud, { ...baseFilter, status: "in_progress", limit: 5 }),
51871
+ cloudListTasks(cloud, { ...baseFilter, status: "pending", limit: 1 })
51872
+ ]);
51873
+ const cloudStatus = {
51874
+ source: "cloud",
51875
+ total: stats.tasks ?? pending + in_progress + completed,
51876
+ pending,
51877
+ in_progress,
51878
+ completed,
51879
+ active_work: activeTasks,
51880
+ next_task: nextTasks[0] ?? null,
51881
+ stale_count: 0,
51882
+ overdue_recurring: 0
51883
+ };
51884
+ const next_task2 = nextTasks[0] ?? null;
51885
+ const payload2 = {
51886
+ status: cloudStatus,
51887
+ next_task: next_task2,
51888
+ overdue_count: 0,
51889
+ latest_handoff: null,
51890
+ as_of: new Date().toISOString()
51891
+ };
51892
+ if (detail === "full") {
51893
+ return { content: [{ type: "text", text: JSON.stringify(payload2, null, 2) }] };
51894
+ }
51895
+ return {
51896
+ content: [{
51897
+ type: "text",
51898
+ text: compactJson({
51899
+ status: compactStatus(cloudStatus),
51900
+ next_task: next_task2 ? compactTask(next_task2, max_description_chars || 180) : null,
51901
+ overdue_count: 0,
51902
+ latest_handoff: null,
51903
+ as_of: payload2.as_of
51904
+ })
51905
+ }]
51906
+ };
51907
+ }
51809
51908
  const { getStatus: getStatus2, getNextTask: getNextTask3, getOverdueTasks: getOverdueTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
51810
51909
  const { getLatestHandoff: getLatestHandoff2 } = (init_handoffs(), __toCommonJS(exports_handoffs));
51811
51910
  const filters = {};
@@ -52241,6 +52340,27 @@ ${lines.join(`
52241
52340
  if (shouldRegisterTool("get_health")) {
52242
52341
  server.tool("get_health", "Get system health: task counts by status, active agents, project summary.", async () => {
52243
52342
  try {
52343
+ const cloud = getTodosCloudClient();
52344
+ if (cloud) {
52345
+ const [stats, pending2, inProgress2, completed2, cancelled2, projects2, agents2] = await Promise.all([
52346
+ cloudGetStats(cloud),
52347
+ cloudCountTasks(cloud, { status: "pending" }),
52348
+ cloudCountTasks(cloud, { status: "in_progress" }),
52349
+ cloudCountTasks(cloud, { status: "completed" }),
52350
+ cloudCountTasks(cloud, { status: "cancelled" }),
52351
+ cloudListProjects(cloud),
52352
+ cloudListAgents(cloud)
52353
+ ]);
52354
+ const projectCount = stats.projects ?? projects2.length;
52355
+ const lines2 = [
52356
+ `=== System Health (cloud) ===`,
52357
+ `Tasks: ${pending2} pending | ${inProgress2} in progress | ${completed2} completed | ${cancelled2} cancelled`,
52358
+ `Projects: ${projectCount} total`,
52359
+ `Agents: ${agents2.length} registered`
52360
+ ];
52361
+ return { content: [{ type: "text", text: lines2.join(`
52362
+ `) }] };
52363
+ }
52244
52364
  const { countTasks: countTasks2 } = (init_tasks(), __toCommonJS(exports_tasks));
52245
52365
  const { listProjects: listProjects2 } = (init_projects(), __toCommonJS(exports_projects));
52246
52366
  const { listAgents: listAgents2 } = (init_agents(), __toCommonJS(exports_agents));
@@ -52279,6 +52399,7 @@ ${lines.join(`
52279
52399
  }
52280
52400
  var init_task_auto_tools = __esm(() => {
52281
52401
  init_zod();
52402
+ init_cloud_router();
52282
52403
  });
52283
52404
 
52284
52405
  // src/lib/context-packs.ts
@@ -53601,6 +53722,11 @@ No blocked tasks.`,
53601
53722
  author: exports_external.string().optional().describe("Author agent ID or name")
53602
53723
  }, async ({ task_id, body, author }) => {
53603
53724
  try {
53725
+ const cloud = getTodosCloudClient();
53726
+ if (cloud) {
53727
+ await cloudAddComment(cloud, task_id, { content: body, agent_id: author });
53728
+ return { content: [{ type: "text", text: `Comment added to ${task_id.slice(0, 8)}` }] };
53729
+ }
53604
53730
  const { addComment: addComment3 } = (init_comments(), __toCommonJS(exports_comments));
53605
53731
  const resolvedId = resolveId(task_id);
53606
53732
  const resolvedAuthor = author ? resolveId(author, "agents") : undefined;
@@ -88254,7 +88380,8 @@ No names available. Wait for an active agent to go stale (30min timeout).`
88254
88380
  include_archived: exports_external.boolean().optional().describe("Include archived agents in the list (default: false)")
88255
88381
  }, async ({ include_archived }) => {
88256
88382
  try {
88257
- const agents = listAgents({ include_archived: include_archived ?? false });
88383
+ const cloud = getTodosCloudClient();
88384
+ const agents = cloud ? await cloudListAgents(cloud) : listAgents({ include_archived: include_archived ?? false });
88258
88385
  if (agents.length === 0) {
88259
88386
  return { content: [{ type: "text", text: "No agents registered." }] };
88260
88387
  }
@@ -88474,6 +88601,7 @@ var init_agents2 = __esm(() => {
88474
88601
  init_agents();
88475
88602
  init_config2();
88476
88603
  init_database();
88604
+ init_cloud_router();
88477
88605
  });
88478
88606
 
88479
88607
  // src/db/builtin-templates.ts
@@ -1 +1 @@
1
- {"version":3,"file":"v1.d.ts","sourceRoot":"","sources":["../../src/server/v1.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAuB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AA4B1F;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAgB1E;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAYpE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAuPtF"}
1
+ {"version":3,"file":"v1.d.ts","sourceRoot":"","sources":["../../src/server/v1.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAuB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AA4B1F;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAgB1E;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAYpE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA6RtF"}
@@ -118,6 +118,7 @@ export interface UpdateTemplateInput {
118
118
  export interface TodosAuditStore {
119
119
  logTaskChange(taskId: string, action: string, field?: string, oldValue?: string | null, newValue?: string | null, agentId?: string | null, context?: TodosStorageContext): MaybePromise<TaskHistory>;
120
120
  addComment(input: CreateCommentInput, context?: TodosStorageContext): MaybePromise<TaskComment>;
121
+ getComments(taskId: string, context?: TodosStorageContext): MaybePromise<TaskComment[]>;
121
122
  getTaskHistory(taskId: string, context?: TodosStorageContext): MaybePromise<TaskHistory[]>;
122
123
  getRecentActivity(limit?: number, context?: TodosStorageContext): MaybePromise<TaskHistory[]>;
123
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/storage/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/storage/interfaces.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/local-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6D3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3D,MAAM,WAAW,2CAA2C;IAC1D,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,wBAAgB,oCAAoC,CAClD,OAAO,GAAE,2CAAgD,GACxD,mBAAmB,CAqFrB"}
1
+ {"version":3,"file":"local-sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/local-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6D3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3D,MAAM,WAAW,2CAA2C;IAC1D,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,wBAAgB,oCAAoC,CAClD,OAAO,GAAE,2CAAgD,GACxD,mBAAmB,CAsFrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-adapter.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAIV,mBAAmB,EAUpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,KAAK,wBAAwB,EAE9B,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,wCAAwC;IACvD,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuBD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,mBAAmB,CA6FrB"}
1
+ {"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-adapter.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAIV,mBAAmB,EAUpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,KAAK,wBAAwB,EAE9B,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,wCAAwC;IACvD,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuBD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,mBAAmB,CAgGrB"}
package/dist/storage.js CHANGED
@@ -11602,6 +11602,7 @@ function createLocalSqliteTodosStorageAdapter(options = {}) {
11602
11602
  audit: {
11603
11603
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId) => logTaskChange(taskId, action, field, oldValue, newValue, agentId, database()),
11604
11604
  addComment: (input) => addComment(input, database()),
11605
+ getComments: (taskId) => listComments(taskId, database()),
11605
11606
  getTaskHistory: (taskId) => getTaskHistory(taskId, database()),
11606
11607
  getRecentActivity: (limit) => getRecentActivity(limit, database())
11607
11608
  },
@@ -11952,6 +11953,7 @@ function createPostgresTodosStorageAdapter(options) {
11952
11953
  audit: {
11953
11954
  logTaskChange: (taskId, action, field, oldValue, newValue, agentId, context) => logTaskChange2(taskId, action, field, oldValue, newValue, agentId, store, context),
11954
11955
  addComment: (input, context) => addComment2(input, store, context),
11956
+ getComments: async (taskId) => (await store.list("comments")).filter((comment) => comment.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
11955
11957
  getTaskHistory: async (taskId) => (await store.list("audit_history")).filter((entry2) => entry2.task_id === taskId).sort((a, b) => a.created_at.localeCompare(b.created_at)),
11956
11958
  getRecentActivity: async (limit = 20) => (await store.list("audit_history")).sort((a, b) => b.created_at.localeCompare(a.created_at)).slice(0, limit)
11957
11959
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.11.81",
3
+ "version": "0.11.82",
4
4
  "description": "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",