agent-planner-mcp 1.5.17 → 1.6.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/AGENT_GUIDE.md +3 -3
- package/README.md +20 -13
- package/SKILL.md +30 -7
- package/package.json +1 -1
- package/src/index.js +5 -1
- package/src/server-http.js +4 -1
- package/src/server-instructions.js +26 -0
- package/src/tools/bdi/beliefs.js +2 -1
- package/src/tools/bdi/intentions.js +33 -17
- package/src/tools/bdi/utility.js +17 -9
package/AGENT_GUIDE.md
CHANGED
|
@@ -83,11 +83,11 @@ The single most important decision when calling a creation tool.
|
|
|
83
83
|
|
|
84
84
|
| Origin | Default | Why |
|
|
85
85
|
|---|---|---|
|
|
86
|
-
| **Human said so in chat** | `status='active'` (
|
|
87
|
-
| **You're acting autonomously** | `status='draft'` (
|
|
86
|
+
| **Human said so in chat** | `status='active'` (pass explicitly) | User already approved by asking. Don't bury their request in drafts. |
|
|
87
|
+
| **You're acting autonomously** | `status='draft'` (the default — just omit) | Let the human review before it activates. Drafts surface in the dashboard pending queue. |
|
|
88
88
|
| **You're uncertain** | use `queue_decision` instead | Drafts are for "I'm proposing structure"; the queue is for "I need an answer." |
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
Draft plans are a hard gate: task status changes and claims on a draft are rejected (409) until the plan is activated. **You can activate it yourself** — `update_plan({status: 'active'})` — whenever a human directed the work (in chat, in the task's instructions, or by assigning it to you). The gate exists to make activation an explicit, auditable step, not to route everything through the UI. Only when you're acting autonomously with no human direction should you leave it draft and `queue_decision` to request activation. Plan completion is derived: a plan reads as `completed` automatically when its work hits 100%; it cannot be set directly.
|
|
91
91
|
|
|
92
92
|
## Workflow templates
|
|
93
93
|
|
package/README.md
CHANGED
|
@@ -232,8 +232,8 @@ Add the same JSON config to your Cline MCP settings in VS Code.
|
|
|
232
232
|
|
|
233
233
|
## Key Features
|
|
234
234
|
|
|
235
|
-
- **
|
|
236
|
-
- **Full mutation surface
|
|
235
|
+
- **39 BDI-aligned tools** for state, goals, committed actions, and workspace/blueprint management — no CRUD shapes, every tool answers a whole agentic question
|
|
236
|
+
- **Full mutation surface** — agents and humans-via-agents can manage every plan/node/org property, plus workspaces and reusable blueprints, without leaving the conversation; UI is optional inspection
|
|
237
237
|
- **Draft-status seam** — autonomous agent creation lands as drafts surfacing in the dashboard pending queue; human-directed creation defaults to active
|
|
238
238
|
- **Dependency graph** — cycle detection, impact analysis, critical path
|
|
239
239
|
- **Progressive context** — 4-layer context assembly with token budgeting
|
|
@@ -242,10 +242,11 @@ Add the same JSON config to your Cline MCP settings in VS Code.
|
|
|
242
242
|
- **Task claims** — TTL-based locking for multi-agent coordination
|
|
243
243
|
- **Organizations** — multi-tenant isolation with member management
|
|
244
244
|
|
|
245
|
-
## Available Tools (v1.
|
|
245
|
+
## Available Tools (v1.5)
|
|
246
246
|
|
|
247
247
|
### Beliefs (read state)
|
|
248
248
|
- `briefing` — bundled mission control state in one call
|
|
249
|
+
- `list_plans` — list plans with optional status/visibility/text filters; returns ids, status, last update, and link counts so you can pick a plan without round-tripping `briefing`
|
|
249
250
|
- `task_context` — single task at progressive depth 1-4
|
|
250
251
|
- `goal_state` — single goal deep-dive (details + quality + progress + bottlenecks + gaps)
|
|
251
252
|
- `recall_knowledge` — knowledge graph query (facts, entities, episodes, contradictions)
|
|
@@ -256,7 +257,8 @@ Add the same JSON config to your Cline MCP settings in VS Code.
|
|
|
256
257
|
- `list_goals` — goals with health rollup
|
|
257
258
|
- `update_goal` — atomic goal update (subsumes link/unlink/achievers)
|
|
258
259
|
- `create_goal` — create a new top-level goal (no parent)
|
|
259
|
-
- `derive_subgoal`
|
|
260
|
+
- `derive_subgoal` — create a sub-goal under an existing parent
|
|
261
|
+
- `record_criterion_progress` — record the latest observed value of a goal's success criterion (e.g. a metric moved 40→72); the write that makes goal attainment real
|
|
260
262
|
|
|
261
263
|
### Intentions — execution
|
|
262
264
|
- `claim_next_task` — pick + claim + load context (one call)
|
|
@@ -266,24 +268,32 @@ Add the same JSON config to your Cline MCP settings in VS Code.
|
|
|
266
268
|
- `resolve_decision` — pick up human's answer (atomically materializes any `proposed_subtasks`)
|
|
267
269
|
- `add_learning` — record knowledge episode
|
|
268
270
|
|
|
269
|
-
### Intentions — creation
|
|
271
|
+
### Intentions — creation
|
|
270
272
|
- `form_intention` — create plan + initial tree under a goal, atomically
|
|
271
273
|
- `extend_intention` — add children under an existing parent (lightweight)
|
|
272
274
|
- `propose_research_chain` — RPI triple with 2 blocking edges, in one call
|
|
273
275
|
|
|
274
|
-
### Intentions — structural mutation
|
|
276
|
+
### Intentions — structural mutation
|
|
275
277
|
- `update_plan` — edit any plan property
|
|
276
278
|
- `update_node` — edit any node property except status
|
|
277
279
|
- `move_node` — reparent within plan; cycle-safe
|
|
278
280
|
- `link_intentions` / `unlink_intentions` — manage dependency edges
|
|
279
281
|
- `delete_plan` / `delete_node` — soft-delete via `status='archived'` (recoverable)
|
|
280
282
|
|
|
281
|
-
### Intentions — sharing & collaboration
|
|
283
|
+
### Intentions — sharing & collaboration
|
|
282
284
|
- `share_plan` — atomic visibility + add/remove collaborators
|
|
283
285
|
- `invite_member` — add user to org (by user_id or email)
|
|
284
286
|
- `update_member_role` — owner-only role change
|
|
285
287
|
- `remove_member` — owner/admin removes non-owner member
|
|
286
288
|
|
|
289
|
+
### Workspaces & Blueprints
|
|
290
|
+
- `list_workspaces` — list workspaces (goal/plan folders) in an organization
|
|
291
|
+
- `create_workspace` — create a new workspace inside an organization (slug auto-generated and de-duped)
|
|
292
|
+
- `list_blueprints` — list blueprints visible to you (owned + public/unlisted), filterable by scope/visibility
|
|
293
|
+
- `save_as_blueprint` — snapshot a live plan as a reusable plan-scope blueprint (structure + agent_instructions + dependencies; excludes run-state)
|
|
294
|
+
- `fork_blueprint` — fork a plan-scope blueprint into a target workspace as a new plan (statuses reset, lineage recorded)
|
|
295
|
+
- `delete_blueprint` — hard-delete a blueprint you own (already-forked plans are unaffected)
|
|
296
|
+
|
|
287
297
|
### Utility
|
|
288
298
|
- `get_started` — dynamic reference for new agents
|
|
289
299
|
|
|
@@ -307,12 +317,10 @@ npx agent-planner-mcp
|
|
|
307
317
|
For remote access (ChatGPT, cloud deployments, multi-agent systems):
|
|
308
318
|
```bash
|
|
309
319
|
MCP_TRANSPORT=http npx agent-planner-mcp
|
|
310
|
-
# Listens on http://127.0.0.1:3100
|
|
320
|
+
# Listens on http://127.0.0.1:3100 (override with PORT)
|
|
311
321
|
```
|
|
312
322
|
|
|
313
|
-
Production endpoint: `https://agentplanner.io/mcp`
|
|
314
|
-
|
|
315
|
-
See [HTTP_MODE.md](./HTTP_MODE.md) for details.
|
|
323
|
+
Transport is Streamable HTTP (MCP 2025-03-26); auth via `Authorization: ApiKey <your-token>`. Production endpoint: `https://agentplanner.io/mcp` (discovery at `https://agentplanner.io/.well-known/mcp.json`).
|
|
316
324
|
|
|
317
325
|
## Local Development
|
|
318
326
|
|
|
@@ -341,5 +349,4 @@ MIT License - see [LICENSE](./LICENSE) for details.
|
|
|
341
349
|
## Support
|
|
342
350
|
|
|
343
351
|
- [GitHub Issues](https://github.com/TAgents/agent-planner-mcp/issues)
|
|
344
|
-
- [
|
|
345
|
-
- [PDR.md](./PDR.md) for technical design
|
|
352
|
+
- [GitHub Releases](https://github.com/TAgents/agent-planner-mcp/releases) for version history and release notes
|
package/SKILL.md
CHANGED
|
@@ -173,15 +173,16 @@ v1.0 closes the creation gap. There are three distinct flows depending on who in
|
|
|
173
173
|
|
|
174
174
|
### Scenario A: Human directs you in conversation
|
|
175
175
|
|
|
176
|
-
User says "create a plan to ship the new auth flow under the security goal
|
|
176
|
+
User says "create a plan to ship the new auth flow under the security goal."
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
Pass **`status='active'` explicitly** — the human asked for it, just do it. (The default is `draft`: omitting status creates a proposal that waits for human activation.)
|
|
179
179
|
|
|
180
180
|
```
|
|
181
181
|
form_intention({
|
|
182
182
|
goal_id: '<security-goal-id>',
|
|
183
183
|
title: 'Ship new auth flow',
|
|
184
184
|
rationale: 'User-requested plan to migrate auth to passkeys',
|
|
185
|
+
status: 'active', // human-directed — omit for autonomous proposals (draft)
|
|
185
186
|
tree: [
|
|
186
187
|
{ node_type: 'phase', title: 'Discovery', children: [
|
|
187
188
|
{ ref: 'research', title: 'Research passkey libraries', task_mode: 'research' },
|
|
@@ -196,10 +197,9 @@ form_intention({
|
|
|
196
197
|
// return created_without_dependencies + a warning instead.
|
|
197
198
|
```
|
|
198
199
|
|
|
199
|
-
|
|
200
|
-
update_plan({
|
|
201
|
-
|
|
202
|
-
```
|
|
200
|
+
Completion is not a write: a plan reads as `completed` automatically once its
|
|
201
|
+
work hits 100% (`update_plan({status: 'completed'})` is rejected). To close out
|
|
202
|
+
a plan that won't be finished, archive it: `update_plan({ plan_id, status: 'archived' })`.
|
|
203
203
|
|
|
204
204
|
### Scenario B: You're acting autonomously (scheduled loop, etc.)
|
|
205
205
|
|
|
@@ -215,7 +215,10 @@ derive_subgoal({
|
|
|
215
215
|
status: 'draft',
|
|
216
216
|
})
|
|
217
217
|
// Surfaces in dashboard pending. Human approves via update_goal({status: 'active'})
|
|
218
|
-
// or in the UI.
|
|
218
|
+
// or in the UI. Draft plans reject task execution and claims (409) until activated.
|
|
219
|
+
// If the human later directs you to proceed, activate it yourself:
|
|
220
|
+
// update_plan({status: 'active'}) — the gate makes activation explicit, not human-only.
|
|
221
|
+
// Completion is derived — a plan reads as completed when its work hits 100%.
|
|
219
222
|
```
|
|
220
223
|
|
|
221
224
|
### Scenario C: You're uncertain and want explicit input
|
|
@@ -337,6 +340,26 @@ recall_knowledge({
|
|
|
337
340
|
- **v0.8.x → v0.9.0** — clean break. 63 legacy CRUD tools collapsed into 15 BDI-aligned tools. See [docs/MIGRATION_v0.9.md](docs/MIGRATION_v0.9.md) for the full mapping.
|
|
338
341
|
- **v0.9.x → v1.0.0** — additive. v0.9 read/update tools unchanged. Adds the full mutation surface (creation, structural edits, sharing, collaboration) so humans can steer entirely through agent conversation. The previously planned `ap_admin_*` namespace is no longer needed — those operations are now first-class BDI tools, with the draft-status seam keeping autonomous agent creation reviewable. See [docs/MIGRATION_v1.0.md](docs/MIGRATION_v1.0.md).
|
|
339
342
|
|
|
343
|
+
## UI vocabulary → data model → tools
|
|
344
|
+
|
|
345
|
+
The web UI (agentplanner.io) and these tools are the same system in two languages. When a human refers to something they see on a screen, map it here:
|
|
346
|
+
|
|
347
|
+
| UI term | What it is | Tools |
|
|
348
|
+
|---|---|---|
|
|
349
|
+
| **Workspace** | Org-scoped folder that owns goals + plans | `list_workspaces`, `create_workspace` |
|
|
350
|
+
| **Blueprint** | Dehydrated, reusable plan shape; forks into a workspace | `list_blueprints`, `save_as_blueprint`, `fork_blueprint`, `delete_blueprint` |
|
|
351
|
+
| **Mission / Mission Control** | Home overview: goal health, decision queue, activity | `briefing` |
|
|
352
|
+
| **Goal** (a *Desire*) | What you're pursuing | `create_goal`, `derive_subgoal`, `list_goals`, `goal_state`, `update_goal` |
|
|
353
|
+
| **Plan** (an *Intention*) | Committed plan of action that achieves a goal | `form_intention` (create), `extend_intention` (add nodes), `update_plan`, `update_node`, `move_node` |
|
|
354
|
+
| **Knowledge / episode** (a *Belief*) | Facts the agents have learned | `add_learning`, `recall_knowledge` |
|
|
355
|
+
| **Health** | Per-goal `on_track` / `at_risk` / `stale` | `briefing`, `list_goals`, `goal_state` |
|
|
356
|
+
| **Tension / Contradiction** | A coherence conflict — new knowledge contradicts existing facts or tasks (UI "Tensions" card) | `plan_analysis` (coherence), `recall_knowledge` (current vs superseded facts) |
|
|
357
|
+
| **Decision queue / "Awaiting you"** | Human approvals pending | `queue_decision`, `resolve_decision` |
|
|
358
|
+
| **Committed vs Proposed** | A goal is *committed* once promoted (`promoted_at` set), *proposed* before | `update_goal({ committed })` |
|
|
359
|
+
| **Attainment vs Execution** | *Attainment* = success criteria met; *Execution* = tasks completed. Distinct numbers. | `record_criterion_progress` (attainment), `update_task` (execution) |
|
|
360
|
+
| **Critical path / Bottlenecks** | Longest blocking chain / high-fan-out incomplete tasks | `plan_analysis` |
|
|
361
|
+
| **RPI chain** | Research → Plan → Implement decomposition | `propose_research_chain` |
|
|
362
|
+
|
|
340
363
|
## Principles
|
|
341
364
|
|
|
342
365
|
- Tools are intent-shaped, not CRUD-shaped — name what you want to accomplish, not which row to mutate
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -3,6 +3,7 @@ const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
|
3
3
|
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
4
4
|
const { MCPHTTPServer } = require('./server-http');
|
|
5
5
|
const { setupTools } = require('./tools');
|
|
6
|
+
const { SERVER_INSTRUCTIONS } = require('./server-instructions');
|
|
6
7
|
const { version } = require('../package.json');
|
|
7
8
|
require('dotenv').config();
|
|
8
9
|
|
|
@@ -77,7 +78,10 @@ async function main() {
|
|
|
77
78
|
}, {
|
|
78
79
|
capabilities: {
|
|
79
80
|
tools: {}
|
|
80
|
-
}
|
|
81
|
+
},
|
|
82
|
+
// Shown to the model on connect — the no-skill safety net mapping plain
|
|
83
|
+
// intents to the BDI tool names + pointing at get_started.
|
|
84
|
+
instructions: SERVER_INSTRUCTIONS
|
|
81
85
|
});
|
|
82
86
|
|
|
83
87
|
console.error('MCP Server created');
|
package/src/server-http.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
const express = require('express');
|
|
16
16
|
const { SessionManager } = require('./session-manager');
|
|
17
17
|
const { setupTools } = require('./tools');
|
|
18
|
+
const { SERVER_INSTRUCTIONS } = require('./server-instructions');
|
|
18
19
|
const { createApiClient } = require('./api-client');
|
|
19
20
|
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
20
21
|
const { createOAuthMetadata, mcpAuthMetadataRouter, getOAuthProtectedResourceMetadataUrl } = require('@modelcontextprotocol/sdk/server/auth/router.js');
|
|
@@ -522,7 +523,9 @@ class MCPHTTPServer {
|
|
|
522
523
|
}, {
|
|
523
524
|
capabilities: {
|
|
524
525
|
tools: {}
|
|
525
|
-
}
|
|
526
|
+
},
|
|
527
|
+
// Shown to the model on connect — the no-skill safety net (see index.js).
|
|
528
|
+
instructions: SERVER_INSTRUCTIONS
|
|
526
529
|
});
|
|
527
530
|
|
|
528
531
|
// Get per-session API client (bound to user's token), or create one for initialize requests
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-level MCP instructions — surfaced to the model the moment the server
|
|
3
|
+
* connects, independent of any externally-loaded skill. This is the safety net
|
|
4
|
+
* for agents that do NOT have the AgentPlanner SKILL.md: it maps plain intents
|
|
5
|
+
* to the BDI tool names (which were renamed at v0.9, e.g. "create a plan" is
|
|
6
|
+
* `form_intention`, not `create_plan`) and points to `get_started` for the rest.
|
|
7
|
+
*
|
|
8
|
+
* Keep this short — it's read on every connect. Deeper guidance lives in
|
|
9
|
+
* `get_started` (auto-derived from the live tool set, so it can't drift).
|
|
10
|
+
*/
|
|
11
|
+
const SERVER_INSTRUCTIONS = [
|
|
12
|
+
'AgentPlanner uses an intent-shaped, BDI-aligned tool vocabulary (renamed at v0.9 — there is no create_plan/quick_plan/create_node/quick_status).',
|
|
13
|
+
'New here or unsure which tool? Call `get_started` first — it returns the full tool map and recommended workflows.',
|
|
14
|
+
'',
|
|
15
|
+
'Common intents → tool:',
|
|
16
|
+
'- Create a goal → `create_goal` (a sub-goal → `derive_subgoal`)',
|
|
17
|
+
'- Create a plan with its task tree → `form_intention` (add tasks later → `extend_intention`; an R→P→I chain → `propose_research_chain`)',
|
|
18
|
+
'- Find and claim the next task → `claim_next_task`',
|
|
19
|
+
'- Update status / log progress / finish a task → `update_task` (folds the old quick_status + quick_log + add_log + release)',
|
|
20
|
+
'- Read a goal (details, progress, quality, bottlenecks) → `goal_state`; all goals’ health → `briefing` / `list_goals`',
|
|
21
|
+
'- Read a task in context → `task_context`; analyze a plan (critical path, bottlenecks, impact, coherence) → `plan_analysis`',
|
|
22
|
+
'- Record / recall knowledge → `add_learning` / `recall_knowledge`',
|
|
23
|
+
'- Queue a human decision → `queue_decision`; resolve one → `resolve_decision`',
|
|
24
|
+
].join('\n');
|
|
25
|
+
|
|
26
|
+
module.exports = { SERVER_INSTRUCTIONS };
|
package/src/tools/bdi/beliefs.js
CHANGED
|
@@ -617,7 +617,8 @@ const planAnalysisDefinition = {
|
|
|
617
617
|
name: 'plan_analysis',
|
|
618
618
|
description:
|
|
619
619
|
"Advanced plan reads: impact analysis (delay/block/remove), critical path, " +
|
|
620
|
-
"bottleneck list, or coherence check."
|
|
620
|
+
"bottleneck list, or coherence check. Replaces the legacy analyze_impact / " +
|
|
621
|
+
"get_critical_path / run_coherence_check / check_coherence_pending tools.",
|
|
621
622
|
inputSchema: {
|
|
622
623
|
type: 'object',
|
|
623
624
|
properties: {
|
|
@@ -791,14 +791,23 @@ const formIntentionDefinition = {
|
|
|
791
791
|
name: 'form_intention',
|
|
792
792
|
description:
|
|
793
793
|
"Create a plan that achieves a goal, including an initial phase/task " +
|
|
794
|
-
"tree, in one call.
|
|
794
|
+
"tree, in one call. This is the canonical way to CREATE A PLAN (replaces the " +
|
|
795
|
+
"legacy quick_plan / create_plan / import_plan_markdown; inline nodes replace " +
|
|
796
|
+
"create_node / quick_task; depends_on replaces create_dependency). " +
|
|
797
|
+
"Declare execution order inline: give nodes a `ref` and " +
|
|
795
798
|
"list prerequisite refs/titles in `depends_on` to create 'blocks' edges in " +
|
|
796
799
|
"the same call — don't ship a bare hierarchy. The response returns a " +
|
|
797
800
|
"`structure` summary and warns (`created_without_dependencies`) when a " +
|
|
798
|
-
"multi-task plan has no edges. Defaults to status='
|
|
799
|
-
"
|
|
800
|
-
"
|
|
801
|
-
"
|
|
801
|
+
"multi-task plan has no edges. Defaults to status='draft': a draft is a " +
|
|
802
|
+
"proposal — it surfaces in the human's pending queue, and task execution " +
|
|
803
|
+
"and claims are rejected (409) until the plan is activated. Pass " +
|
|
804
|
+
"status='active' when a human directed this plan in conversation and " +
|
|
805
|
+
"wants work to start immediately; you may also activate a draft later " +
|
|
806
|
+
"via update_plan(status='active') on the same basis. Acting " +
|
|
807
|
+
"autonomously with no human direction? Leave it draft and " +
|
|
808
|
+
"queue_decision to request activation. Plan completion is derived from " +
|
|
809
|
+
"task completion — plans read as 'completed' automatically at 100%; it " +
|
|
810
|
+
"cannot be set directly.",
|
|
802
811
|
inputSchema: {
|
|
803
812
|
type: 'object',
|
|
804
813
|
properties: {
|
|
@@ -809,7 +818,7 @@ const formIntentionDefinition = {
|
|
|
809
818
|
status: {
|
|
810
819
|
type: 'string',
|
|
811
820
|
enum: ['draft', 'active'],
|
|
812
|
-
default: '
|
|
821
|
+
default: 'draft',
|
|
813
822
|
},
|
|
814
823
|
visibility: {
|
|
815
824
|
type: 'string',
|
|
@@ -885,7 +894,7 @@ async function createSubtree(apiClient, planId, parentId, children, results, ctx
|
|
|
885
894
|
}
|
|
886
895
|
|
|
887
896
|
async function formIntentionHandler(args, apiClient) {
|
|
888
|
-
const { goal_id, title, description, rationale, status = '
|
|
897
|
+
const { goal_id, title, description, rationale, status = 'draft', visibility = 'private', tree = [] } = args;
|
|
889
898
|
|
|
890
899
|
if (apiClient.agentLoop?.createIntention) {
|
|
891
900
|
const treeError = validateTreeShape(tree);
|
|
@@ -961,19 +970,22 @@ async function formIntentionHandler(args, apiClient) {
|
|
|
961
970
|
}
|
|
962
971
|
}
|
|
963
972
|
|
|
964
|
-
// 3.
|
|
973
|
+
// 3. Create tree (top-level children parent to root via omitted parent_id).
|
|
974
|
+
const nodeResults = [];
|
|
975
|
+
const ctx = { refMap: new Map(), titleMap: new Map(), edgeIntents: [] };
|
|
976
|
+
await createSubtree(apiClient, plan.id, null, tree, nodeResults, ctx);
|
|
977
|
+
|
|
978
|
+
// 4. Link plan to goal (best-effort) — AFTER the tree exists. The link
|
|
979
|
+
// endpoint cascades 'achieves' edges to all CURRENT task nodes, so linking
|
|
980
|
+
// before node creation wired zero achievers (goal_state then showed empty
|
|
981
|
+
// linked_tasks and fell back to coarse linked-plan stats). Order matters.
|
|
965
982
|
try {
|
|
966
983
|
await apiClient.goals.linkPlan(goal_id, plan.id);
|
|
967
984
|
} catch (err) {
|
|
968
985
|
// Non-fatal — plan exists, link can be retried by user.
|
|
969
986
|
}
|
|
970
987
|
|
|
971
|
-
//
|
|
972
|
-
const nodeResults = [];
|
|
973
|
-
const ctx = { refMap: new Map(), titleMap: new Map(), edgeIntents: [] };
|
|
974
|
-
await createSubtree(apiClient, plan.id, null, tree, nodeResults, ctx);
|
|
975
|
-
|
|
976
|
-
// 4. Wire inline dependency edges. depends_on:[X] on N means X blocks N.
|
|
988
|
+
// 5. Wire inline dependency edges. depends_on:[X] on N means X blocks N.
|
|
977
989
|
const resolveRef = (ref) => {
|
|
978
990
|
if (ctx.refMap.has(ref)) return ctx.refMap.get(ref);
|
|
979
991
|
const byTitle = ctx.titleMap.get(ref);
|
|
@@ -1049,7 +1061,7 @@ const extendIntentionDefinition = {
|
|
|
1049
1061
|
"Add children under an existing phase or task. Use when an agent has " +
|
|
1050
1062
|
"implicit authority to decompose work (e.g., a parent task they have " +
|
|
1051
1063
|
"claimed). For high-stakes structural proposals, use queue_decision " +
|
|
1052
|
-
"with proposed_subtasks instead.
|
|
1064
|
+
"with proposed_subtasks instead.",
|
|
1053
1065
|
inputSchema: {
|
|
1054
1066
|
type: 'object',
|
|
1055
1067
|
properties: {
|
|
@@ -1120,7 +1132,7 @@ const proposeResearchChainDefinition = {
|
|
|
1120
1132
|
"Create a Research → Plan → Implement triple under an existing parent " +
|
|
1121
1133
|
"task or phase. The Research task feeds Plan; Plan feeds Implement " +
|
|
1122
1134
|
"(via 'blocks' dependency edges). Use when tackling work with " +
|
|
1123
|
-
"significant unknowns.
|
|
1135
|
+
"significant unknowns.",
|
|
1124
1136
|
inputSchema: {
|
|
1125
1137
|
type: 'object',
|
|
1126
1138
|
properties: {
|
|
@@ -1363,7 +1375,11 @@ const updatePlanDefinition = {
|
|
|
1363
1375
|
description: { type: 'string' },
|
|
1364
1376
|
status: {
|
|
1365
1377
|
type: 'string',
|
|
1366
|
-
enum: ['draft', 'active', '
|
|
1378
|
+
enum: ['draft', 'active', 'archived'],
|
|
1379
|
+
description:
|
|
1380
|
+
"Commitment lifecycle. 'completed' cannot be set — it is derived " +
|
|
1381
|
+
"automatically when the plan's work reaches 100%. To close out a " +
|
|
1382
|
+
"plan early, archive it.",
|
|
1367
1383
|
},
|
|
1368
1384
|
visibility: { type: 'string', enum: ['private', 'unlisted', 'public'] },
|
|
1369
1385
|
metadata: { type: 'object', description: "Shallow-merged into existing metadata." },
|
package/src/tools/bdi/utility.js
CHANGED
|
@@ -8,9 +8,11 @@ const { version: MCP_VERSION } = require('../../../package.json');
|
|
|
8
8
|
const getStartedDefinition = {
|
|
9
9
|
name: 'get_started',
|
|
10
10
|
description:
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
11
|
+
"Call this FIRST when you are new to AgentPlanner or unsure which tool to use " +
|
|
12
|
+
"(e.g. looking for create_plan / quick_plan — the answer is form_intention). " +
|
|
13
|
+
"Returns the live BDI tool-surface map and recommended workflows: mission " +
|
|
14
|
+
"control loop (Cowork), single-task session (Code/CLI), multi-agent claiming " +
|
|
15
|
+
"(OpenClaw). The map is derived from the actual tool set, so it can't drift.",
|
|
14
16
|
inputSchema: {
|
|
15
17
|
type: 'object',
|
|
16
18
|
properties: {
|
|
@@ -29,6 +31,17 @@ async function getStartedHandler(args, apiClient) {
|
|
|
29
31
|
api = { version: 'unavailable' };
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
// Derived from the actual module definitions so this map can't drift from the
|
|
35
|
+
// real tool set (it silently did — delete_blueprint and record_criterion_progress
|
|
36
|
+
// were both missing at points). Lazy require avoids any load-order cycle.
|
|
37
|
+
const namesOf = (mod) => (mod.definitions || []).map((d) => d.name);
|
|
38
|
+
const toolsByNamespace = {
|
|
39
|
+
beliefs: namesOf(require('./beliefs')),
|
|
40
|
+
desires: namesOf(require('./desires')),
|
|
41
|
+
intentions: namesOf(require('./intentions')),
|
|
42
|
+
workspaces: namesOf(require('./workspaces')),
|
|
43
|
+
};
|
|
44
|
+
|
|
32
45
|
return formatResponse({
|
|
33
46
|
as_of: asOf(),
|
|
34
47
|
mcp_version: MCP_VERSION,
|
|
@@ -39,12 +52,7 @@ async function getStartedHandler(args, apiClient) {
|
|
|
39
52
|
"AgentPlanner exposes a BDI-aligned MCP surface. Tools are grouped by " +
|
|
40
53
|
"Beliefs (state queries), Desires (goals), and Intentions (committed actions). " +
|
|
41
54
|
"Each tool answers one whole agentic question and returns an `as_of` timestamp.",
|
|
42
|
-
tools_by_namespace:
|
|
43
|
-
beliefs: ['briefing', 'list_plans', 'task_context', 'goal_state', 'recall_knowledge', 'search', 'plan_analysis'],
|
|
44
|
-
desires: ['list_goals', 'create_goal', 'update_goal', 'derive_subgoal', 'record_criterion_progress'],
|
|
45
|
-
intentions: ['form_intention', 'extend_intention', 'link_intentions', 'propose_research_chain', 'claim_next_task', 'update_task', 'update_node', 'release_task', 'queue_decision', 'resolve_decision', 'add_learning'],
|
|
46
|
-
workspaces: ['list_workspaces', 'create_workspace', 'list_blueprints', 'fork_blueprint', 'save_as_blueprint', 'delete_blueprint'],
|
|
47
|
-
},
|
|
55
|
+
tools_by_namespace: toolsByNamespace,
|
|
48
56
|
recommended_workflows: [
|
|
49
57
|
{
|
|
50
58
|
name: 'Set up new work a human asked for',
|