@agentistics/mcp 2.40.0 → 2.42.0
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/agentistics-mcp.js +16 -5
- package/package.json +1 -1
package/dist/agentistics-mcp.js
CHANGED
|
@@ -586,14 +586,17 @@ var TOOLS = [
|
|
|
586
586
|
},
|
|
587
587
|
{
|
|
588
588
|
name: "agentistics_task_subtask",
|
|
589
|
-
description: "BETA — the task board is new and still changing; its shapes may move between releases. Add a subtask, or change one. Pass `title` to add; pass `id` with `done`, `status`, `assignee`, `dueDate`, `startDate` or `
|
|
589
|
+
description: "BETA — the task board is new and still changing; its shapes may move between releases. Add a subtask, or change one. Pass `title` to add; pass `id` with `done`, `status`, `assignee`, `dueDate`, `startDate`, `blockedBy` or `parentGroupId` to edit one. A subtask carries the same columns its parent does; its own cost, tokens, rounds and harness are rolled up from the sessions filed under it — the PARENT task's rollup is the sum of all its subtasks' sessions. A subtask CAN be blocked by another subtask of the SAME parent (pass `blockedBy` as the full list of sibling subtask ids that must be `done` first; a sibling outside this task, or the subtask itself, is dropped rather than accepted) — this is separate from agentistics_task_blocked_by, which blocks a whole TASK on other tasks. **`done` REQUIRES the subtask to have at least one session filed under it** and is refused (422, `done_needs_session`) without one — EXCEPT for a group MEMBER (`parentGroupId` set), which can never hold a session of its own (see below) and therefore reaches `done` through this same edit with no session required; a GROUP itself (`isGroup: true`) and an ordinary loose subtask both still need one. To put a session ON a subtask use agentistics_task_session with `subtaskId` — a subtask holds ANY NUMBER of sessions, so the link lives on the session, not in a field here. **SUBTASK GROUPS are a real hierarchy level, not a label**: pass `isGroup: true` with `title` to create a GROUP — a peer row that CAN hold a session, exactly like a loose subtask. Pass `id` (a subtask) with `parentGroupId` (a group's own subtask id, from the SAME parent task) to make it a MEMBER of that group — join with the group's id, leave with `parentGroupId: ''`. A refused reference (the id names no subtask, names one that is not `isGroup: true`, names a different task, or the subtask being patched is itself a group) is refused as `invalid_group` (422). **Joining a group is ALSO refused (422, `subtask_has_sessions`) when the subtask already has a session filed on it** — a member gets no rollup bucket of its own, so that session's cost would silently drop out of every visible breakdown while the task's own total kept counting it; detach the session first. **A MEMBER can never hold a session of its own** — filing on one is refused by agentistics_task_session with `subtask_in_group` (422); only the group itself accounts for a session, and a member's own status/assignee/dates/comments still exist and feed the group's progress percentage.",
|
|
590
590
|
inputSchema: {
|
|
591
591
|
type: "object",
|
|
592
592
|
properties: {
|
|
593
593
|
ref: { type: "string" },
|
|
594
594
|
title: { type: "string" },
|
|
595
595
|
id: { type: "string" },
|
|
596
|
-
done: {
|
|
596
|
+
done: {
|
|
597
|
+
type: "boolean",
|
|
598
|
+
description: "Send ALONE with `id` (no other field) for the tick — `{id, done}` is a fast path straight to the done/todo transition. Sent TOGETHER with `parentGroupId` (or any other named field below) in the same call, `done` is silently dropped rather than applied — this tool forwards only the named fields when one is present. Send them as two separate calls instead: join/leave the group first, then set `done` in its own call."
|
|
599
|
+
},
|
|
597
600
|
status: {
|
|
598
601
|
type: "string",
|
|
599
602
|
enum: ["backlog", "todo", "in_progress", "blocked", "in_review", "done", "abandoned"]
|
|
@@ -605,6 +608,14 @@ var TOOLS = [
|
|
|
605
608
|
type: "array",
|
|
606
609
|
items: { type: "string" },
|
|
607
610
|
description: "Full replacement list of SIBLING subtask ids (same parent task) that must be done before this one. Requires `id` — a subtask being created has no siblings to name yet."
|
|
611
|
+
},
|
|
612
|
+
isGroup: {
|
|
613
|
+
type: "boolean",
|
|
614
|
+
description: "Create this subtask as a GROUP instead of an ordinary subtask. Only meaningful together with `title` (creation) — a group's shape cannot be changed afterwards."
|
|
615
|
+
},
|
|
616
|
+
parentGroupId: {
|
|
617
|
+
type: "string",
|
|
618
|
+
description: "Join this subtask (named by `id`) to the group whose id this names — a group of the SAME parent task. Pass an empty string to leave the current group. Refused (422, `invalid_group`) if the id is not an actual group of this task, or if this subtask is itself a group. Refused (422, `subtask_has_sessions`) if this subtask already has a session filed on it — detach it first. **Do not send `done` in this same call** — see `done`'s own description; make it a second call."
|
|
608
619
|
}
|
|
609
620
|
},
|
|
610
621
|
required: ["ref"]
|
|
@@ -694,7 +705,7 @@ var TOOLS = [
|
|
|
694
705
|
},
|
|
695
706
|
{
|
|
696
707
|
name: "agentistics_task_session",
|
|
697
|
-
description: "BETA — the task board is new and still changing; its shapes may move between releases. File a SESSION under a task, which is what makes the task measurable: its cost, tokens, rounds and harness all come from the sessions filed under it. Pass `subtaskId` to file it under one of the task's subtasks (the unit of WORK, for a task broken into steps); omit
|
|
708
|
+
description: "BETA — the task board is new and still changing; its shapes may move between releases. File a SESSION under a task, which is what makes the task measurable: its cost, tokens, rounds and harness all come from the sessions filed under it. Pass `subtaskId` to file it under one of the task's subtasks (the unit of WORK, for a task broken into steps) — this INCLUDES a subtask GROUP (see agentistics_task_subtask's `isGroup`), which holds a session exactly like any other subtask; omit `subtaskId` to file the session directly on the task itself (the unit of DELIVERY, for a task simple enough not to need subtasks). Both can be used on the same task — some sessions direct, some under subtasks — and each subtask's own rollup plus the directly-filed sessions' own rollup are both readable via agentistics_task's `subtaskRollups` (keyed by subtask id, with `id: null` for the direct ones), so the breakdown never disappears. **Filing on a subtask that is a MEMBER of a group (has a `parentGroupId`) is refused (422, `subtask_in_group`)** — a member can never hold a session, only the group itself can; file on the group's own id instead. Use agentistics_task to read the subtasks, or agentistics_task_subtask to create one, then pass `ref` + `sessionId` (a managed session id or conversation id) + optionally `subtaskId`. Pass `detach` with a session id to unfile one. The task inherits the session's repository when it has none.",
|
|
698
709
|
inputSchema: {
|
|
699
710
|
type: "object",
|
|
700
711
|
properties: {
|
|
@@ -956,10 +967,10 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
956
967
|
}
|
|
957
968
|
case "agentistics_task_subtask": {
|
|
958
969
|
const a = args;
|
|
959
|
-
const cols = ["status", "assignee", "dueDate", "startDate", "title"];
|
|
970
|
+
const cols = ["status", "assignee", "dueDate", "startDate", "title", "parentGroupId"];
|
|
960
971
|
const named = cols.filter((c) => typeof a?.[c] === "string");
|
|
961
972
|
const blockedBy = Array.isArray(a?.blockedBy) ? { blockedBy: a.blockedBy } : {};
|
|
962
|
-
const payload = a?.id !== undefined ? named.length > 0 || Array.isArray(a?.blockedBy) ? { id: a.id, ...Object.fromEntries(named.map((c) => [c, a[c]])), ...blockedBy } : { id: a.id, done: a?.done === true } : { title: a?.title };
|
|
973
|
+
const payload = a?.id !== undefined ? named.length > 0 || Array.isArray(a?.blockedBy) ? { id: a.id, ...Object.fromEntries(named.map((c) => [c, a[c]])), ...blockedBy } : { id: a.id, done: a?.done === true } : { title: a?.title, ...a?.isGroup === true ? { isGroup: true } : {} };
|
|
963
974
|
const body = await apiSend("POST", `/api/tasks/${encodeURIComponent(String(a?.ref))}/subtasks`, payload);
|
|
964
975
|
return { content: [{ type: "text", text: JSON.stringify(body, null, 2) }] };
|
|
965
976
|
}
|