@caelo-cms/mcp-server 0.10.38 → 0.10.40
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/admin-server.d.ts +2 -0
- package/dist/admin-server.d.ts.map +1 -1
- package/dist/admin-server.js +101 -1
- package/dist/admin-server.js.map +1 -1
- package/dist/approval-wait.d.ts +51 -0
- package/dist/approval-wait.d.ts.map +1 -0
- package/dist/approval-wait.js +58 -0
- package/dist/approval-wait.js.map +1 -0
- package/package.json +1 -1
package/dist/admin-server.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface StartAdminOpts {
|
|
|
4
4
|
readonly token: string;
|
|
5
5
|
/** Defaults to stdio; tests pass an in-memory transport. */
|
|
6
6
|
readonly transport?: Transport;
|
|
7
|
+
/** Poll interval while waiting on an approval; tests shorten it. */
|
|
8
|
+
readonly approvalPollMs?: number;
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
11
|
* MCP `instructions` for the admin server (#552). Clients such as Claude
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-server.d.ts","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin-server.d.ts","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAY/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,QAOvB,CAAC;AAwGb,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwM7E"}
|
package/dist/admin-server.js
CHANGED
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
* is held here in process state so the agent doesn't thread it through
|
|
18
18
|
* every call; it also rides the response so a restarted server can
|
|
19
19
|
* resume a specific session via `chatSessionId`.
|
|
20
|
+
* - `caelo_await_approval` — issue #658: keep waiting for the operator's
|
|
21
|
+
* decision on a proposal an approval-gated tool queued (the gated call
|
|
22
|
+
* itself already waits, bounded by `CAELO_MCP_APPROVAL_WAIT_MS`).
|
|
20
23
|
* - `caelo_get_context` — the composed site context (module model, tool
|
|
21
24
|
* playbook, staging rules, site memory, skills index) the agent should
|
|
22
25
|
* load once before working. For a checked-in variant, see
|
|
@@ -26,6 +29,7 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
26
29
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
27
30
|
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
28
31
|
import { z } from "zod";
|
|
32
|
+
import { describeApprovalOutcome, resolveApprovalWaitMs, waitForApproval, } from "./approval-wait.js";
|
|
29
33
|
import { postAdmin, resolveTimeoutMs } from "./http.js";
|
|
30
34
|
import { UPLOAD_IMAGES_TOOL, uploadImages } from "./image-upload.js";
|
|
31
35
|
/**
|
|
@@ -40,6 +44,7 @@ export const ADMIN_MCP_INSTRUCTIONS = [
|
|
|
40
44
|
"1. Call caelo_open_session once. It resumes the operator's most recent open session (pass newSession: true only when the operator asks for a fresh one; chatSessionId resumes a specific one). Every write lands in the site's shared draft (or the session's own experiment branch); you may stage finished work with stage_changes, but nothing reaches the live site until the operator clicks Publish live in the Caelo admin.",
|
|
41
45
|
"2. Call caelo_get_context once and follow it: it carries the site model, tool playbook, staging rules, site memory (brand voice, glossary) and the skills index.",
|
|
42
46
|
"3. Load every skill the context marks ALWAYS APPLIES with load_skill before the work it covers (e.g. before writing any visitor-facing copy).",
|
|
47
|
+
"Approval-gated tools (marked APPROVAL-GATED) wait for the operator to approve or reject in the Caelo admin and return the decision; if the wait times out, call caelo_await_approval with the proposalId. Never re-propose a pending proposal.",
|
|
43
48
|
"Tool errors name the next step to take; follow them instead of retrying unchanged.",
|
|
44
49
|
].join("\n");
|
|
45
50
|
const openSessionInput = z
|
|
@@ -74,6 +79,24 @@ const OPEN_SESSION_TOOL = {
|
|
|
74
79
|
},
|
|
75
80
|
},
|
|
76
81
|
};
|
|
82
|
+
const awaitApprovalInput = z.object({ proposalId: z.string().uuid() }).strict();
|
|
83
|
+
/** Issue #658 — keep waiting for a decision after a gated call's wait timed out. */
|
|
84
|
+
const AWAIT_APPROVAL_TOOL = {
|
|
85
|
+
name: "caelo_await_approval",
|
|
86
|
+
description: "Wait for the operator's Approve/Reject on a proposal you queued with an approval-gated tool, and return " +
|
|
87
|
+
"the decision (applied / rejected with reason / …). Use it when a gated tool's result says it is still " +
|
|
88
|
+
"waiting. You cannot approve anything yourself — only the operator can, in the Caelo admin.",
|
|
89
|
+
inputSchema: {
|
|
90
|
+
type: "object",
|
|
91
|
+
properties: {
|
|
92
|
+
proposalId: {
|
|
93
|
+
type: "string",
|
|
94
|
+
description: "The id from the gated tool's 'Queued proposal <id>' result.",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
required: ["proposalId"],
|
|
98
|
+
},
|
|
99
|
+
};
|
|
77
100
|
const GET_CONTEXT_TOOL = {
|
|
78
101
|
name: "caelo_get_context",
|
|
79
102
|
description: "Fetch the Caelo install's composed site context: how pages/modules/content instances fit together, " +
|
|
@@ -99,6 +122,7 @@ export async function startAdminMcpServer(opts) {
|
|
|
99
122
|
UPLOAD_IMAGES_TOOL,
|
|
100
123
|
OPEN_SESSION_TOOL,
|
|
101
124
|
GET_CONTEXT_TOOL,
|
|
125
|
+
AWAIT_APPROVAL_TOOL,
|
|
102
126
|
...catalogue.tools.map((t) => ({
|
|
103
127
|
name: t.name,
|
|
104
128
|
description: t.description,
|
|
@@ -106,9 +130,45 @@ export async function startAdminMcpServer(opts) {
|
|
|
106
130
|
})),
|
|
107
131
|
],
|
|
108
132
|
}));
|
|
109
|
-
|
|
133
|
+
/** Reads the operator's decision; the agent can never make it. */
|
|
134
|
+
const fetchOutcome = (proposalId) => () => postAdmin({
|
|
135
|
+
adminUrl: opts.adminUrl,
|
|
136
|
+
token: opts.token,
|
|
137
|
+
path: "/api/mcp/approval",
|
|
138
|
+
body: { proposalId },
|
|
139
|
+
timeoutMs: resolveTimeoutMs(30_000),
|
|
140
|
+
});
|
|
141
|
+
server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {
|
|
110
142
|
const name = req.params.name;
|
|
143
|
+
// Progress notifications keep progress-aware clients from timing the
|
|
144
|
+
// call out while it waits on the operator (only when they asked).
|
|
145
|
+
const progressToken = req.params._meta?.progressToken;
|
|
146
|
+
const onPending = progressToken === undefined
|
|
147
|
+
? undefined
|
|
148
|
+
: async (elapsedMs) => {
|
|
149
|
+
await extra.sendNotification({
|
|
150
|
+
method: "notifications/progress",
|
|
151
|
+
params: {
|
|
152
|
+
progressToken,
|
|
153
|
+
progress: Math.round(elapsedMs / 1000),
|
|
154
|
+
message: "Waiting for the operator to approve or reject in the Caelo admin…",
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
};
|
|
111
158
|
try {
|
|
159
|
+
if (name === AWAIT_APPROVAL_TOOL.name) {
|
|
160
|
+
const parsed = awaitApprovalInput.safeParse(req.params.arguments ?? {});
|
|
161
|
+
if (!parsed.success) {
|
|
162
|
+
return errorResult(`invalid arguments: ${parsed.error.message}`);
|
|
163
|
+
}
|
|
164
|
+
const outcome = await waitForApproval({
|
|
165
|
+
fetchOutcome: fetchOutcome(parsed.data.proposalId),
|
|
166
|
+
waitMs: resolveApprovalWaitMs(),
|
|
167
|
+
...(opts.approvalPollMs !== undefined ? { intervalMs: opts.approvalPollMs } : {}),
|
|
168
|
+
...(onPending ? { onPending } : {}),
|
|
169
|
+
});
|
|
170
|
+
return outcomeResult(outcome);
|
|
171
|
+
}
|
|
112
172
|
if (name === UPLOAD_IMAGES_TOOL.name)
|
|
113
173
|
return await uploadImages(opts, req.params.arguments);
|
|
114
174
|
if (name === OPEN_SESSION_TOOL.name) {
|
|
@@ -174,6 +234,28 @@ export async function startAdminMcpServer(opts) {
|
|
|
174
234
|
},
|
|
175
235
|
timeoutMs: resolveTimeoutMs(120_000),
|
|
176
236
|
});
|
|
237
|
+
if (result.approval) {
|
|
238
|
+
// Issue #658 — the call queued a proposal: wait for the operator's
|
|
239
|
+
// decision (bounded) and return it in THIS result, so the agent
|
|
240
|
+
// continues with the outcome instead of a "queued" note.
|
|
241
|
+
const outcome = await waitForApproval({
|
|
242
|
+
fetchOutcome: fetchOutcome(result.approval.proposalId),
|
|
243
|
+
waitMs: resolveApprovalWaitMs(),
|
|
244
|
+
...(opts.approvalPollMs !== undefined ? { intervalMs: opts.approvalPollMs } : {}),
|
|
245
|
+
...(onPending ? { onPending } : {}),
|
|
246
|
+
});
|
|
247
|
+
const decided = outcomeResult(outcome);
|
|
248
|
+
return {
|
|
249
|
+
...decided,
|
|
250
|
+
content: [
|
|
251
|
+
...decided.content,
|
|
252
|
+
{
|
|
253
|
+
type: "text",
|
|
254
|
+
text: JSON.stringify({ requestId: result.requestId, cached: result.cached }),
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
177
259
|
return {
|
|
178
260
|
...(result.ok ? {} : { isError: true }),
|
|
179
261
|
content: [
|
|
@@ -205,6 +287,24 @@ export async function startAdminMcpServer(opts) {
|
|
|
205
287
|
});
|
|
206
288
|
await server.connect(opts.transport ?? new StdioServerTransport());
|
|
207
289
|
}
|
|
290
|
+
/** An outcome as an MCP tool result; a failed apply is an error result. */
|
|
291
|
+
function outcomeResult(o) {
|
|
292
|
+
return {
|
|
293
|
+
...(o.outcome === "failed" ? { isError: true } : {}),
|
|
294
|
+
content: [
|
|
295
|
+
{ type: "text", text: describeApprovalOutcome(o) },
|
|
296
|
+
{
|
|
297
|
+
type: "text",
|
|
298
|
+
text: JSON.stringify({
|
|
299
|
+
proposalId: o.proposalId,
|
|
300
|
+
outcome: o.outcome,
|
|
301
|
+
detail: o.detail,
|
|
302
|
+
decidedAt: o.decidedAt,
|
|
303
|
+
}),
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
208
308
|
function errorResult(text) {
|
|
209
309
|
return { isError: true, content: [{ type: "text", text }] };
|
|
210
310
|
}
|
package/dist/admin-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWrE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,kEAAkE;IAClE,oaAAoa;IACpa,kKAAkK;IAClK,+IAA+I;IAC/I,gPAAgP;IAChP,oFAAoF;CACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAuCb,MAAM,gBAAgB,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACpC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAC3C,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,wGAAwG;QACxG,iHAAiH;QACjH,wGAAwG;QACxG,qGAAqG;QACrG,sGAAsG;QACtG,yCAAyC;IAC3C,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;YAC3F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;YACrF,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8DAA8D;aAC5E;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,oEAAoE;aAClF;SACF;KACF;CACO,CAAC;AAEX,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEhF,oFAAoF;AACpF,MAAM,mBAAmB,GAAG;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,0GAA0G;QAC1G,wGAAwG;QACxG,4FAA4F;IAC9F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6DAA6D;aAC3E;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;CACO,CAAC;AAEX,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,qGAAqG;QACrG,qGAAqG;QACrG,0FAA0F;IAC5F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;CACvC,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAoB;IAC5D,uEAAuE;IACvE,6DAA6D;IAC7D,MAAM,SAAS,GAAG,MAAM,SAAS,CAA0B;QACzD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,EAAE;QACR,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,IAAI,cAAc,GAA+B,IAAI,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC7C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,sBAAsB,EAAE,CACtE,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE;YACL,kBAAkB;YAClB,iBAAiB;YACjB,gBAAgB;YAChB,mBAAmB;YACnB,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;SACJ;KACF,CAAC,CAAC,CAAC;IAEJ,kEAAkE;IAClE,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,EAAE,CAAC,GAAG,EAAE,CAChD,SAAS,CAAkB;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,EAAE,UAAU,EAAE;QACpB,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEL,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,qEAAqE;QACrE,kEAAkE;QAClE,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC;QACtD,MAAM,SAAS,GACb,aAAa,KAAK,SAAS;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;gBAC1B,MAAM,KAAK,CAAC,gBAAgB,CAAC;oBAC3B,MAAM,EAAE,wBAAwB;oBAChC,MAAM,EAAE;wBACN,aAAa;wBACb,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;wBACtC,OAAO,EAAE,mEAAmE;qBAC7E;iBACF,CAAC,CAAC;YACL,CAAC,CAAC;QACR,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBACxE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,WAAW,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;oBACpC,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;oBAClD,MAAM,EAAE,qBAAqB,EAAE;oBAC/B,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC,CAAC;gBACH,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,IAAI,KAAK,kBAAkB,CAAC,IAAI;gBAAE,OAAO,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5F,IAAI,IAAI,KAAK,iBAAiB,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,WAAW,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,CAAC;gBACD,cAAc,GAAG,MAAM,SAAS,CAAsB;oBACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;iBACpC,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;gCACvC,CAAC,cAAc,CAAC,OAAO;oCACrB,CAAC,CAAC,qCAAqC,cAAc,CAAC,KAAK,gDAAgD;oCAC3G,CAAC,CAAC,2BAA2B,cAAc,CAAC,KAAK,KAAK,CAAC;gCACzD,sGAAsG;gCACtG,8FAA8F;yBACjG;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,KAAK,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAqB;oBAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE;oBACnC,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;iBACpC,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE;wBAC7C;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAC1D,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,WAAW,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,WAAW,CAChB,qFAAqF;oBACnF,qEAAqE,CACxE,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAsB;gBAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE;oBACJ,QAAQ,EAAE,IAAI;oBACd,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE;oBAChC,aAAa,EAAE,cAAc,CAAC,aAAa;iBAC5C;gBACD,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC;aACrC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,mEAAmE;gBACnE,gEAAgE;gBAChE,yDAAyD;gBACzD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;oBACpC,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACtD,MAAM,EAAE,qBAAqB,EAAE;oBAC/B,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvC,OAAO;oBACL,GAAG,OAAO;oBACV,OAAO,EAAE;wBACP,GAAG,OAAO,CAAC,OAAO;wBAClB;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;yBAC7E;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACvC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;oBACtC,GAAG,CAAC,MAAM,CAAC,KAAK;wBACd,CAAC,CAAC;4BACE;gCACE,IAAI,EAAE,OAAgB;gCACtB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gCACzB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;6BACjC;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,SAAS,EAAE,MAAM,CAAC,SAAS;4BAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC9E,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,WAAW,CAAC,GAAG,IAAI,YAAY,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,2EAA2E;AAC3E,SAAS,aAAa,CAAC,CAAkB;IAIvC,OAAO;QACL,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE;YAClD;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB,CAAC;aACH;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAI/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue #658 — wait for the operator's decision on a proposal the agent
|
|
3
|
+
* queued, so the gated tool call returns the OUTCOME instead of a bare
|
|
4
|
+
* "queued" note the agent cannot follow up on.
|
|
5
|
+
*
|
|
6
|
+
* The operator approves or rejects in the Caelo admin (usually the Live
|
|
7
|
+
* Edit chat, whose card says the request came from the external agent).
|
|
8
|
+
* The agent never decides — it only reads the outcome via
|
|
9
|
+
* `/api/mcp/approval` (§11.A: no auto-approve, each instance its own click).
|
|
10
|
+
*
|
|
11
|
+
* The wait is bounded (`CAELO_MCP_APPROVAL_WAIT_MS`, default 50s — below
|
|
12
|
+
* the MCP SDK client's default 60s request timeout) so an unattended admin
|
|
13
|
+
* cannot hang an agent and no client times out first; past it the result
|
|
14
|
+
* tells the agent to call `caelo_await_approval` to keep waiting.
|
|
15
|
+
*/
|
|
16
|
+
/** What `/api/mcp/approval` returns. */
|
|
17
|
+
export interface ApprovalOutcome {
|
|
18
|
+
readonly proposalId: string;
|
|
19
|
+
readonly domain: string;
|
|
20
|
+
readonly toolName: string;
|
|
21
|
+
readonly summary: string;
|
|
22
|
+
readonly outcome: "pending" | "applied" | "failed" | "rejected" | "superseded" | "withdrawn";
|
|
23
|
+
readonly detail: string | null;
|
|
24
|
+
readonly decidedAt: string | null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Under the MCP SDK client's default 60s request timeout (progress does not
|
|
28
|
+
* reset it unless the client opts in), so an ordinary client always gets
|
|
29
|
+
* the proposal id + the caelo_await_approval hint instead of a timeout.
|
|
30
|
+
*/
|
|
31
|
+
export declare const DEFAULT_APPROVAL_WAIT_MS = 50000;
|
|
32
|
+
export declare const APPROVAL_POLL_INTERVAL_MS = 3000;
|
|
33
|
+
/** The bounded wait, from `CAELO_MCP_APPROVAL_WAIT_MS` (0 = return at once). */
|
|
34
|
+
export declare function resolveApprovalWaitMs(): number;
|
|
35
|
+
export interface WaitDeps {
|
|
36
|
+
readonly fetchOutcome: () => Promise<ApprovalOutcome>;
|
|
37
|
+
readonly waitMs: number;
|
|
38
|
+
readonly intervalMs?: number;
|
|
39
|
+
readonly sleep?: (ms: number) => Promise<void>;
|
|
40
|
+
readonly now?: () => number;
|
|
41
|
+
/** Called after every still-pending poll (keeps progress-aware clients alive). */
|
|
42
|
+
readonly onPending?: (elapsedMs: number) => Promise<void> | void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Polls until the proposal is decided or `waitMs` elapsed; returns the
|
|
46
|
+
* last outcome read (still `pending` on timeout).
|
|
47
|
+
*/
|
|
48
|
+
export declare function waitForApproval(deps: WaitDeps): Promise<ApprovalOutcome>;
|
|
49
|
+
/** The text the agent reads for an outcome — always names its next step. */
|
|
50
|
+
export declare function describeApprovalOutcome(o: ApprovalOutcome): string;
|
|
51
|
+
//# sourceMappingURL=approval-wait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-wait.d.ts","sourceRoot":"","sources":["../src/approval-wait.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAC;IAC7F,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,MAAM,CAQ9C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAY9E;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAqBlE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Under the MCP SDK client's default 60s request timeout (progress does not
|
|
4
|
+
* reset it unless the client opts in), so an ordinary client always gets
|
|
5
|
+
* the proposal id + the caelo_await_approval hint instead of a timeout.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_APPROVAL_WAIT_MS = 50_000;
|
|
8
|
+
export const APPROVAL_POLL_INTERVAL_MS = 3_000;
|
|
9
|
+
/** The bounded wait, from `CAELO_MCP_APPROVAL_WAIT_MS` (0 = return at once). */
|
|
10
|
+
export function resolveApprovalWaitMs() {
|
|
11
|
+
const raw = process.env.CAELO_MCP_APPROVAL_WAIT_MS;
|
|
12
|
+
if (raw === undefined || raw === "")
|
|
13
|
+
return DEFAULT_APPROVAL_WAIT_MS;
|
|
14
|
+
const parsed = Number.parseInt(raw, 10);
|
|
15
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
16
|
+
throw new Error(`CAELO_MCP_APPROVAL_WAIT_MS must be a non-negative integer (ms), got '${raw}'`);
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Polls until the proposal is decided or `waitMs` elapsed; returns the
|
|
22
|
+
* last outcome read (still `pending` on timeout).
|
|
23
|
+
*/
|
|
24
|
+
export async function waitForApproval(deps) {
|
|
25
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
26
|
+
const now = deps.now ?? Date.now;
|
|
27
|
+
const interval = deps.intervalMs ?? APPROVAL_POLL_INTERVAL_MS;
|
|
28
|
+
const start = now();
|
|
29
|
+
let outcome = await deps.fetchOutcome();
|
|
30
|
+
while (outcome.outcome === "pending" && now() - start < deps.waitMs) {
|
|
31
|
+
await deps.onPending?.(now() - start);
|
|
32
|
+
await sleep(Math.min(interval, Math.max(0, deps.waitMs - (now() - start))));
|
|
33
|
+
outcome = await deps.fetchOutcome();
|
|
34
|
+
}
|
|
35
|
+
return outcome;
|
|
36
|
+
}
|
|
37
|
+
/** The text the agent reads for an outcome — always names its next step. */
|
|
38
|
+
export function describeApprovalOutcome(o) {
|
|
39
|
+
const what = `proposal ${o.proposalId} (${o.toolName}${o.summary ? `: ${o.summary}` : ""})`;
|
|
40
|
+
const detail = o.detail ? ` Detail: ${o.detail}` : "";
|
|
41
|
+
switch (o.outcome) {
|
|
42
|
+
case "pending":
|
|
43
|
+
return (`Still waiting for the operator's decision on ${what}. Nothing is applied yet. ` +
|
|
44
|
+
`Call caelo_await_approval with proposalId "${o.proposalId}" to keep waiting, or continue with ` +
|
|
45
|
+
`work that does not depend on it. Do not re-propose it.`);
|
|
46
|
+
case "applied":
|
|
47
|
+
return `APPROVED and applied: the operator approved ${what}; it is now in effect on the draft. Continue your work with it.${detail}`;
|
|
48
|
+
case "failed":
|
|
49
|
+
return `APPROVED but applying it failed: ${what}.${detail} Tell the operator; fix the cause before proposing again.`;
|
|
50
|
+
case "rejected":
|
|
51
|
+
return `REJECTED: the operator rejected ${what}. It was not applied.${detail} Do not retry it unchanged — ask the operator or adjust the plan.`;
|
|
52
|
+
case "superseded":
|
|
53
|
+
return `SUPERSEDED: ${what} was replaced by a newer proposal and not applied.${detail}`;
|
|
54
|
+
case "withdrawn":
|
|
55
|
+
return `WITHDRAWN: ${what} was cancelled and not applied.${detail}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=approval-wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-wait.js","sourceRoot":"","sources":["../src/approval-wait.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caelo-cms/mcp-server",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.40",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"description": "MCP servers for Caelo CMS: `caelo_chat` (talk to Caelo's own AI) and the admin-scoped Power-MCP (the full chat-runner tool catalogue, driven by your own agent). Lets Claude Code (or any MCP-aware client) drive a Caelo install from outside the browser.",
|