@caelo-cms/mcp-server 0.10.41 → 0.10.43

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.
@@ -6,7 +6,22 @@ export interface StartAdminOpts {
6
6
  readonly transport?: Transport;
7
7
  /** Poll interval while waiting on an approval; tests shorten it. */
8
8
  readonly approvalPollMs?: number;
9
+ /**
10
+ * #678 — how often the live catalogue is re-read so a changed admin
11
+ * (an upgrade, an activated plugin) reaches the client through
12
+ * `notifications/tools/list_changed`. Default
13
+ * `CAELO_MCP_CATALOGUE_REFRESH_MS` or 5 minutes; 0 disables the timer
14
+ * (an unknown tool name still triggers a refresh).
15
+ */
16
+ readonly catalogueRefreshMs?: number;
9
17
  }
18
+ /** The refresh interval: the option, else the env var, else 5 minutes. */
19
+ export declare function resolveCatalogueRefreshMs(option: number | undefined, env?: string | undefined): number;
20
+ /**
21
+ * What a client sees of the catalogue; when it changes, the tool list
22
+ * changed. Order-independent so a re-sorted catalogue is not a change.
23
+ */
24
+ export declare function catalogueSignature(tools: readonly RemoteTool[]): string;
10
25
  /**
11
26
  * MCP `instructions` for the admin server (#552). Clients such as Claude
12
27
  * Code put this into the agent's context on connect, so a freshly
@@ -15,5 +30,12 @@ export interface StartAdminOpts {
15
30
  * context it works without the site's rules and brand voice.
16
31
  */
17
32
  export declare const ADMIN_MCP_INSTRUCTIONS: string;
33
+ interface RemoteTool {
34
+ readonly name: string;
35
+ readonly description: string;
36
+ readonly inputSchema: Record<string, unknown>;
37
+ readonly gated?: boolean;
38
+ }
18
39
  export declare function startAdminMcpServer(opts: StartAdminOpts): Promise<void>;
40
+ export {};
19
41
  //# sourceMappingURL=admin-server.d.ts.map
@@ -1 +1 @@
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"}
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;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAID,0EAA0E;AAC1E,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,GAAE,MAAM,GAAG,SAAsD,GACnE,MAAM,CAIR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAMvE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,QAOvB,CAAC;AAEb,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAiGD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwP7E"}
@@ -32,6 +32,23 @@ import { z } from "zod";
32
32
  import { describeApprovalOutcome, resolveApprovalWaitMs, waitForApproval, } from "./approval-wait.js";
33
33
  import { postAdmin, resolveTimeoutMs } from "./http.js";
34
34
  import { UPLOAD_IMAGES_TOOL, uploadImages } from "./image-upload.js";
35
+ const DEFAULT_CATALOGUE_REFRESH_MS = 5 * 60_000;
36
+ /** The refresh interval: the option, else the env var, else 5 minutes. */
37
+ export function resolveCatalogueRefreshMs(option, env = process.env.CAELO_MCP_CATALOGUE_REFRESH_MS) {
38
+ if (option !== undefined)
39
+ return option;
40
+ const n = env === undefined ? Number.NaN : Number(env);
41
+ return Number.isFinite(n) && n >= 0 ? n : DEFAULT_CATALOGUE_REFRESH_MS;
42
+ }
43
+ /**
44
+ * What a client sees of the catalogue; when it changes, the tool list
45
+ * changed. Order-independent so a re-sorted catalogue is not a change.
46
+ */
47
+ export function catalogueSignature(tools) {
48
+ return JSON.stringify([...tools]
49
+ .sort((a, b) => a.name.localeCompare(b.name))
50
+ .map((t) => [t.name, t.description, t.inputSchema, t.gated === true]));
51
+ }
35
52
  /**
36
53
  * MCP `instructions` for the admin server (#552). Clients such as Claude
37
54
  * Code put this into the agent's context on connect, so a freshly
@@ -105,18 +122,58 @@ const GET_CONTEXT_TOOL = {
105
122
  inputSchema: { type: "object", properties: {} },
106
123
  };
107
124
  export async function startAdminMcpServer(opts) {
108
- // Fetch the live catalogue up front — a bad URL or a chat-scoped token
109
- // should fail loudly at startup, not on the first tool call.
110
- const catalogue = await postAdmin({
125
+ const fetchCatalogue = () => postAdmin({
111
126
  adminUrl: opts.adminUrl,
112
127
  token: opts.token,
113
128
  path: "/api/mcp/tools",
114
129
  body: {},
115
130
  timeoutMs: resolveTimeoutMs(60_000),
116
131
  });
117
- const remoteByName = new Map(catalogue.tools.map((t) => [t.name, t]));
132
+ // Fetch the live catalogue up front — a bad URL or a chat-scoped token
133
+ // should fail loudly at startup, not on the first tool call.
134
+ let catalogue = await fetchCatalogue();
135
+ let remoteByName = new Map(catalogue.tools.map((t) => [t.name, t]));
136
+ let signature = catalogueSignature(catalogue.tools);
118
137
  let currentSession = null;
119
- const server = new Server({ name: "caelo-admin-mcp", version: "0.1.0" }, { capabilities: { tools: {} }, instructions: ADMIN_MCP_INSTRUCTIONS });
138
+ // #678 — the catalogue is the ADMIN's: an upgrade or an activated plugin
139
+ // changes it while this process runs. `listChanged` tells the client to
140
+ // re-list when we say so, instead of the operator reconnecting (/mcp).
141
+ const server = new Server({ name: "caelo-admin-mcp", version: "0.1.0" }, { capabilities: { tools: { listChanged: true } }, instructions: ADMIN_MCP_INSTRUCTIONS });
142
+ let connected = false;
143
+ let refreshing = null;
144
+ /** Re-read the catalogue; true (and a list_changed to the client) when it changed. */
145
+ const refreshCatalogue = () => {
146
+ refreshing ??= (async () => {
147
+ const next = await fetchCatalogue();
148
+ const nextSignature = catalogueSignature(next.tools);
149
+ if (nextSignature === signature)
150
+ return false;
151
+ catalogue = next;
152
+ remoteByName = new Map(next.tools.map((t) => [t.name, t]));
153
+ signature = nextSignature;
154
+ if (connected)
155
+ await server.sendToolListChanged();
156
+ return true;
157
+ })().finally(() => {
158
+ refreshing = null;
159
+ });
160
+ return refreshing;
161
+ };
162
+ const refreshMs = resolveCatalogueRefreshMs(opts.catalogueRefreshMs);
163
+ const timer = refreshMs > 0
164
+ ? setInterval(() => {
165
+ refreshCatalogue().catch((e) => {
166
+ // stderr: stdout is the stdio transport. A failed refresh keeps
167
+ // the last catalogue; the next tick (or an unknown tool) retries.
168
+ console.error(`[caelo-admin-mcp] tool catalogue refresh failed: ${e instanceof Error ? e.message : String(e)}`);
169
+ });
170
+ }, refreshMs)
171
+ : null;
172
+ timer?.unref?.();
173
+ server.onclose = () => {
174
+ if (timer)
175
+ clearInterval(timer);
176
+ };
120
177
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
121
178
  tools: [
122
179
  UPLOAD_IMAGES_TOOL,
@@ -215,7 +272,12 @@ export async function startAdminMcpServer(opts) {
215
272
  ],
216
273
  };
217
274
  }
218
- const remote = remoteByName.get(name);
275
+ let remote = remoteByName.get(name);
276
+ if (!remote) {
277
+ // The admin may have gained the tool since we last listed (#678).
278
+ await refreshCatalogue();
279
+ remote = remoteByName.get(name);
280
+ }
219
281
  if (!remote) {
220
282
  return errorResult(`unknown tool: ${name}`);
221
283
  }
@@ -286,6 +348,7 @@ export async function startAdminMcpServer(opts) {
286
348
  }
287
349
  });
288
350
  await server.connect(opts.transport ?? new StdioServerTransport());
351
+ connected = true;
289
352
  }
290
353
  /** An outcome as an MCP tool result; a failed apply is an error result. */
291
354
  function outcomeResult(o) {
@@ -1 +1 @@
1
- {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,16 @@ export interface WaitDeps {
41
41
  /** Called after every still-pending poll (keeps progress-aware clients alive). */
42
42
  readonly onPending?: (elapsedMs: number) => Promise<void> | void;
43
43
  }
44
+ /** Generic bounded poll: re-fetch every `intervalMs` until `done` or `waitMs` elapsed. */
45
+ export declare function pollUntil<T>(deps: {
46
+ readonly fetch: () => Promise<T>;
47
+ readonly done: (value: T) => boolean;
48
+ readonly waitMs: number;
49
+ readonly intervalMs?: number;
50
+ readonly sleep?: (ms: number) => Promise<void>;
51
+ readonly now?: () => number;
52
+ readonly onPending?: (elapsedMs: number) => Promise<void> | void;
53
+ }): Promise<T>;
44
54
  /**
45
55
  * Polls until the proposal is decided or `waitMs` elapsed; returns the
46
56
  * last outcome read (still `pending` on timeout).
@@ -1 +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"}
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,0FAA0F;AAC1F,wBAAsB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;IACrC,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,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClE,GAAG,OAAO,CAAC,CAAC,CAAC,CAYb;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAU9E;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAqBlE"}
@@ -17,22 +17,34 @@ export function resolveApprovalWaitMs() {
17
17
  }
18
18
  return parsed;
19
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) {
20
+ /** Generic bounded poll: re-fetch every `intervalMs` until `done` or `waitMs` elapsed. */
21
+ export async function pollUntil(deps) {
25
22
  const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
26
23
  const now = deps.now ?? Date.now;
27
24
  const interval = deps.intervalMs ?? APPROVAL_POLL_INTERVAL_MS;
28
25
  const start = now();
29
- let outcome = await deps.fetchOutcome();
30
- while (outcome.outcome === "pending" && now() - start < deps.waitMs) {
26
+ let value = await deps.fetch();
27
+ while (!deps.done(value) && now() - start < deps.waitMs) {
31
28
  await deps.onPending?.(now() - start);
32
29
  await sleep(Math.min(interval, Math.max(0, deps.waitMs - (now() - start))));
33
- outcome = await deps.fetchOutcome();
30
+ value = await deps.fetch();
34
31
  }
35
- return outcome;
32
+ return value;
33
+ }
34
+ /**
35
+ * Polls until the proposal is decided or `waitMs` elapsed; returns the
36
+ * last outcome read (still `pending` on timeout).
37
+ */
38
+ export async function waitForApproval(deps) {
39
+ return pollUntil({
40
+ fetch: deps.fetchOutcome,
41
+ done: (o) => o.outcome !== "pending",
42
+ waitMs: deps.waitMs,
43
+ ...(deps.intervalMs !== undefined ? { intervalMs: deps.intervalMs } : {}),
44
+ ...(deps.sleep ? { sleep: deps.sleep } : {}),
45
+ ...(deps.now ? { now: deps.now } : {}),
46
+ ...(deps.onPending ? { onPending: deps.onPending } : {}),
47
+ });
36
48
  }
37
49
  /** The text the agent reads for an outcome — always names its next step. */
38
50
  export function describeApprovalOutcome(o) {
@@ -1 +1 @@
1
- {"version":3,"file":"approval-wait.js","sourceRoot":"","sources":["../src/approval-wait.ts"],"names":[],"mappings":"AAAA,mCAAmC;AA6BnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C,gFAAgF;AAChF,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,wBAAwB,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,wEAAwE,GAAG,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAYD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,yBAAyB,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;IACpB,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACxC,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,uBAAuB,CAAC,CAAkB;IACxD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC5F,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,CACL,gDAAgD,IAAI,4BAA4B;gBAChF,8CAA8C,CAAC,CAAC,UAAU,sCAAsC;gBAChG,wDAAwD,CACzD,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO,+CAA+C,IAAI,kEAAkE,MAAM,EAAE,CAAC;QACvI,KAAK,QAAQ;YACX,OAAO,oCAAoC,IAAI,IAAI,MAAM,2DAA2D,CAAC;QACvH,KAAK,UAAU;YACb,OAAO,mCAAmC,IAAI,wBAAwB,MAAM,mEAAmE,CAAC;QAClJ,KAAK,YAAY;YACf,OAAO,eAAe,IAAI,qDAAqD,MAAM,EAAE,CAAC;QAC1F,KAAK,WAAW;YACd,OAAO,cAAc,IAAI,kCAAkC,MAAM,EAAE,CAAC;IACxE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"approval-wait.js","sourceRoot":"","sources":["../src/approval-wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /** A card the caelo_chat turn paused on. */
2
+ export interface PendingChatApproval {
3
+ readonly approvalId: string;
4
+ readonly toolName: string;
5
+ readonly preview: string;
6
+ }
7
+ /** What `/api/mcp/chat` returns. */
8
+ export interface SendChatResult {
9
+ readonly chatSessionId: string;
10
+ readonly requestId: string;
11
+ readonly assistant: string;
12
+ readonly toolCalls: ReadonlyArray<{
13
+ name: string;
14
+ summary: string;
15
+ succeeded: boolean;
16
+ }>;
17
+ readonly pendingProposals: number;
18
+ readonly costMicrocents: number;
19
+ readonly pendingApprovals: readonly PendingChatApproval[];
20
+ }
21
+ /** One card as `/api/mcp/chat/approval` reports it. */
22
+ export interface ChatApprovalView {
23
+ readonly approvalId: string;
24
+ readonly toolName: string;
25
+ readonly preview: string;
26
+ readonly status: "pending" | "approved" | "rejected" | "resumed" | "superseded";
27
+ readonly approved: boolean | null;
28
+ readonly reason: string | null;
29
+ }
30
+ /** What `/api/mcp/chat/approval` returns. */
31
+ export interface ChatApprovalState {
32
+ readonly state: "pending" | "decided" | "superseded" | "none";
33
+ readonly approvals: readonly ChatApprovalView[];
34
+ }
35
+ export interface SettleDeps {
36
+ readonly chatSessionId: string;
37
+ readonly fetchState: () => Promise<ChatApprovalState>;
38
+ /** Resume the agent's paused turn with the operator's decisions. */
39
+ readonly resume: () => Promise<SendChatResult>;
40
+ /** The whole call's budget: waiting AND the resumed turn must fit in it. */
41
+ readonly waitMs: number;
42
+ /**
43
+ * Time kept back for the resumed turn (its HTTP timeout). A decision seen
44
+ * later than `waitMs - resumeReserveMs` is not resumed in this call — the
45
+ * result says to continue with caelo_await_approval — so the call never
46
+ * outlives the MCP client's request timeout while approved work runs on
47
+ * without a reader (codex review).
48
+ */
49
+ readonly resumeReserveMs: number;
50
+ readonly intervalMs?: number;
51
+ readonly sleep?: (ms: number) => Promise<void>;
52
+ readonly now?: () => number;
53
+ readonly onPending?: (elapsedMs: number) => Promise<void> | void;
54
+ }
55
+ /** Where the paused turn stands after waiting. */
56
+ export type SettleResult = {
57
+ /** Every pause was decided and resumed; `turns` are the resumed replies. */
58
+ readonly kind: "settled";
59
+ readonly decided: readonly ChatApprovalView[];
60
+ readonly turns: readonly SendChatResult[];
61
+ } | {
62
+ /** The bound ran out with cards undecided. */
63
+ readonly kind: "pending";
64
+ readonly decided: readonly ChatApprovalView[];
65
+ readonly turns: readonly SendChatResult[];
66
+ readonly waiting: readonly ChatApprovalView[];
67
+ } | {
68
+ /** Every card is decided, but too little budget is left to resume now. */
69
+ readonly kind: "ready";
70
+ readonly decided: readonly ChatApprovalView[];
71
+ readonly turns: readonly SendChatResult[];
72
+ } | {
73
+ /** A newer message moved the chat past the paused turn. */
74
+ readonly kind: "superseded";
75
+ readonly decided: readonly ChatApprovalView[];
76
+ readonly turns: readonly SendChatResult[];
77
+ readonly dropped: readonly ChatApprovalView[];
78
+ };
79
+ /**
80
+ * Wait for the operator's decisions and resume the paused turn once, within
81
+ * the call's budget. If the resumed turn pauses again, the call returns that
82
+ * pause right away (codex review: another read could outlive the client's
83
+ * timeout); `caelo_await_approval` picks it up.
84
+ */
85
+ export declare function settleChatApprovals(deps: SettleDeps): Promise<SettleResult>;
86
+ /** One line per decided card, for the agent. */
87
+ export declare function describeDecisions(decided: readonly ChatApprovalView[]): string;
88
+ /** The note for cards the agent is still waiting on — always names the next step. */
89
+ export declare function describeWaiting(chatSessionId: string, waiting: readonly Pick<ChatApprovalView, "toolName">[]): string;
90
+ /** The note when the operator decided but this call has no time left to continue. */
91
+ export declare function describeReady(chatSessionId: string): string;
92
+ /** The note for cards a newer message in the chat dropped. */
93
+ export declare function describeSuperseded(dropped: readonly ChatApprovalView[]): string;
94
+ //# sourceMappingURL=chat-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-approval.d.ts","sourceRoot":"","sources":["../src/chat-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Issue #658 — caelo_chat: an approval-gated tool pauses the Caelo chat
4
+ * turn on approval cards the operator decides in the Caelo admin (the Live
5
+ * Edit chat shows them as the external agent's request). This is the
6
+ * agent's side of that pause:
7
+ *
8
+ * 1. the caelo_chat reply lists the cards (`pendingApprovals`);
9
+ * 2. the MCP server waits (bounded, `CAELO_MCP_APPROVAL_WAIT_MS`) until the
10
+ * operator decided every card (`/api/mcp/chat/approval`);
11
+ * 3. it resumes the agent's OWN paused turn (`/api/mcp/chat` with
12
+ * `resumeApprovals: true`) — the operator's click never starts a Live
13
+ * Edit AI turn — and returns that turn's reply, which carries the
14
+ * outcome (applied, or the model's reaction to a rejection);
15
+ * 4. past the bound it returns the cards plus the `caelo_await_approval`
16
+ * hint, which picks the wait up again.
17
+ *
18
+ * The agent never decides (CLAUDE.md §11.A): every endpoint here only reads
19
+ * the decision or continues after it.
20
+ */
21
+ import { pollUntil } from "./approval-wait.js";
22
+ /**
23
+ * Wait for the operator's decisions and resume the paused turn once, within
24
+ * the call's budget. If the resumed turn pauses again, the call returns that
25
+ * pause right away (codex review: another read could outlive the client's
26
+ * timeout); `caelo_await_approval` picks it up.
27
+ */
28
+ export async function settleChatApprovals(deps) {
29
+ const now = deps.now ?? Date.now;
30
+ const deadline = now() + deps.waitMs;
31
+ // Decisions are waited for only while a resume still fits after them.
32
+ const pollDeadline = deadline - deps.resumeReserveMs;
33
+ const state = await pollUntil({
34
+ fetch: deps.fetchState,
35
+ done: (s) => s.state !== "pending",
36
+ waitMs: Math.max(0, pollDeadline - now()),
37
+ ...(deps.intervalMs !== undefined ? { intervalMs: deps.intervalMs } : {}),
38
+ ...(deps.sleep ? { sleep: deps.sleep } : {}),
39
+ now,
40
+ ...(deps.onPending ? { onPending: deps.onPending } : {}),
41
+ });
42
+ if (state.state === "pending") {
43
+ return { kind: "pending", decided: [], turns: [], waiting: state.approvals };
44
+ }
45
+ if (state.state === "superseded") {
46
+ return { kind: "superseded", decided: [], turns: [], dropped: state.approvals };
47
+ }
48
+ if (state.state === "none")
49
+ return { kind: "settled", decided: [], turns: [] };
50
+ // Reads take time too: start the resume only while its whole timeout still
51
+ // fits in the call's budget.
52
+ if (deadline - now() < deps.resumeReserveMs)
53
+ return { kind: "ready", decided: [], turns: [] };
54
+ const decided = [...state.approvals];
55
+ const resumed = await deps.resume();
56
+ if (resumed.pendingApprovals.length === 0) {
57
+ return { kind: "settled", decided, turns: [resumed] };
58
+ }
59
+ return {
60
+ kind: "pending",
61
+ decided,
62
+ turns: [resumed],
63
+ waiting: resumed.pendingApprovals.map((a) => ({
64
+ ...a,
65
+ status: "pending",
66
+ approved: null,
67
+ reason: null,
68
+ })),
69
+ };
70
+ }
71
+ /** One line per decided card, for the agent. */
72
+ export function describeDecisions(decided) {
73
+ return decided
74
+ .map((a) => a.approved
75
+ ? `The operator APPROVED ${a.toolName}; your turn continued with it.`
76
+ : `The operator REJECTED ${a.toolName}${a.reason ? ` (reason: ${a.reason})` : ""}; it was not applied.`)
77
+ .join("\n");
78
+ }
79
+ /** The note for cards the agent is still waiting on — always names the next step. */
80
+ export function describeWaiting(chatSessionId, waiting) {
81
+ return (`Waiting for the operator to approve or reject ${waiting.map((a) => a.toolName).join(", ")} in the Caelo admin. ` +
82
+ `Nothing of it is applied yet. Call caelo_await_approval with chatSessionId "${chatSessionId}" to keep waiting ` +
83
+ "(your turn continues with the decision), or tell your user. Do not send the request again.");
84
+ }
85
+ /** The note when the operator decided but this call has no time left to continue. */
86
+ export function describeReady(chatSessionId) {
87
+ return ("The operator has decided. Call caelo_await_approval with chatSessionId " +
88
+ `"${chatSessionId}" now to continue your turn with the decision; nothing of it is applied until then.`);
89
+ }
90
+ /** The note for cards a newer message in the chat dropped. */
91
+ export function describeSuperseded(dropped) {
92
+ const names = dropped.map((a) => a.toolName).join(", ") || "the gated action";
93
+ return (`A newer message in the chat moved on before your turn resumed, so ${names} was not applied. ` +
94
+ "Send it again with caelo_chat if it is still needed.");
95
+ }
96
+ //# sourceMappingURL=chat-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-approval.js","sourceRoot":"","sources":["../src/chat-approval.ts"],"names":[],"mappings":"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"}
@@ -10,26 +10,29 @@
10
10
  * clients see a clean error instead of a hung connection.
11
11
  */
12
12
  import type { z } from "zod";
13
+ import type { ChatApprovalState, SendChatResult } from "./chat-approval.js";
13
14
  import type { uploadedImageSchema } from "./image-upload.js";
14
- export interface SendChatOpts {
15
+ interface AdminTarget {
15
16
  readonly adminUrl: string;
16
17
  readonly token: string;
18
+ }
19
+ export interface SendChatOpts extends AdminTarget {
17
20
  readonly message: string;
18
21
  readonly attachments?: z.infer<typeof uploadedImageSchema>[];
19
22
  readonly chatSessionId?: string;
20
23
  readonly pageId?: string;
21
24
  }
22
- export interface SendChatResult {
23
- readonly chatSessionId: string;
24
- readonly requestId: string;
25
- readonly assistant: string;
26
- readonly toolCalls: ReadonlyArray<{
27
- name: string;
28
- summary: string;
29
- succeeded: boolean;
30
- }>;
31
- readonly pendingProposals: number;
32
- readonly costMicrocents: number;
33
- }
34
25
  export declare function sendChat(opts: SendChatOpts): Promise<SendChatResult>;
26
+ /**
27
+ * Issue #658 — resume this token's paused turn once the operator decided
28
+ * every approval card of it. The reply is the resumed turn's.
29
+ */
30
+ export declare function resumeChat(opts: AdminTarget & {
31
+ readonly chatSessionId: string;
32
+ }): Promise<SendChatResult>;
33
+ /** Issue #658 — the operator's decisions on this token's paused turn (read-only). */
34
+ export declare function fetchChatApprovalState(opts: AdminTarget & {
35
+ readonly chatSessionId: string;
36
+ }): Promise<ChatApprovalState>;
37
+ export {};
35
38
  //# sourceMappingURL=chat-bridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bridge.d.ts","sourceRoot":"","sources":["../src/chat-bridge.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,EAAE,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAa1E"}
1
+ {"version":3,"file":"chat-bridge.d.ts","sourceRoot":"","sources":["../src/chat-bridge.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,UAAU,WAAW;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,EAAE,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,GAAG;IAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,cAAc,CAAC,CAQzB;AAED,qFAAqF;AACrF,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,WAAW,GAAG;IAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,iBAAiB,CAAC,CAQ5B"}
@@ -14,4 +14,27 @@ export async function sendChat(opts) {
14
14
  timeoutMs: resolveTimeoutMs(30_000),
15
15
  });
16
16
  }
17
+ /**
18
+ * Issue #658 — resume this token's paused turn once the operator decided
19
+ * every approval card of it. The reply is the resumed turn's.
20
+ */
21
+ export async function resumeChat(opts) {
22
+ return postAdmin({
23
+ adminUrl: opts.adminUrl,
24
+ token: opts.token,
25
+ path: "/api/mcp/chat",
26
+ body: { chatSessionId: opts.chatSessionId, resumeApprovals: true },
27
+ timeoutMs: resolveTimeoutMs(30_000),
28
+ });
29
+ }
30
+ /** Issue #658 — the operator's decisions on this token's paused turn (read-only). */
31
+ export async function fetchChatApprovalState(opts) {
32
+ return postAdmin({
33
+ adminUrl: opts.adminUrl,
34
+ token: opts.token,
35
+ path: "/api/mcp/chat/approval",
36
+ body: { chatSessionId: opts.chatSessionId },
37
+ timeoutMs: resolveTimeoutMs(30_000),
38
+ });
39
+ }
17
40
  //# sourceMappingURL=chat-bridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bridge.js","sourceRoot":"","sources":["../src/chat-bridge.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAenC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAqBxD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB;IAC/C,OAAO,SAAS,CAAiB;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;QACD,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"chat-bridge.js","sourceRoot":"","sources":["../src/chat-bridge.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAgBnC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAexD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB;IAC/C,OAAO,SAAS,CAAiB;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;QACD,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAsD;IAEtD,OAAO,SAAS,CAAiB;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE;QAClE,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAsD;IAEtD,OAAO,SAAS,CAAoB;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;QAC3C,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;AACL,CAAC"}
package/dist/server.d.ts CHANGED
@@ -4,6 +4,8 @@ export interface StartOpts {
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 chat-scope server (#552), injected into the
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAM/E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAItB,CAAC;AAWb,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA+GnE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAiB/E,MAAM,WAAW,SAAS;IACxB,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;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAKtB,CAAC;AAsFb,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgMnE"}
package/dist/server.js CHANGED
@@ -12,7 +12,10 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
13
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
14
14
  import { z } from "zod";
15
- import { sendChat } from "./chat-bridge.js";
15
+ import { resolveApprovalWaitMs } from "./approval-wait.js";
16
+ import { describeDecisions, describeReady, describeSuperseded, describeWaiting, settleChatApprovals, } from "./chat-approval.js";
17
+ import { fetchChatApprovalState, resumeChat, sendChat } from "./chat-bridge.js";
18
+ import { resolveTimeoutMs } from "./http.js";
16
19
  import { UPLOAD_IMAGES_TOOL, uploadedImageSchema, uploadImages } from "./image-upload.js";
17
20
  /**
18
21
  * MCP `instructions` for the chat-scope server (#552), injected into the
@@ -23,7 +26,72 @@ export const CHAT_MCP_INSTRUCTIONS = [
23
26
  "This server talks to a Caelo CMS site's own AI agent through caelo_chat; describe the outcome you want and the agent decides how to build it.",
24
27
  "Pass the chatSessionId from a reply to continue the same conversation; omit it only to start a new one.",
25
28
  "Changes land on that chat's preview branch; nothing reaches the live site until the operator publishes in the Caelo admin. Some actions wait for the operator's approval click there.",
29
+ "When a reply says the turn is waiting for the operator's approval, call caelo_await_approval with the chatSessionId: it waits for the decision and returns your turn's continuation. Never re-send the request; you cannot approve anything yourself.",
26
30
  ].join("\n");
31
+ const awaitApprovalInput = z.object({ chatSessionId: z.string().uuid() }).strict();
32
+ /** The resume request's timeout (`resumeChat`), reserved out of a call's budget. */
33
+ const resumeTimeoutMs = () => resolveTimeoutMs(30_000);
34
+ /** Headroom for the state reads around a resume in caelo_await_approval. */
35
+ const RESUME_SLACK_MS = 5_000;
36
+ /** Issue #658 — keep waiting on the approval cards a caelo_chat turn paused on. */
37
+ const AWAIT_APPROVAL_TOOL = {
38
+ name: "caelo_await_approval",
39
+ description: "Wait for the operator's Approve/Reject on the approval cards your caelo_chat turn paused on, then " +
40
+ "continue that turn and return its reply (the change applied, or the agent's reaction to a rejection). " +
41
+ "Use it when a caelo_chat reply says it is still waiting for approval. You cannot approve anything " +
42
+ "yourself — only the operator can, in the Caelo admin.",
43
+ inputSchema: {
44
+ type: "object",
45
+ properties: {
46
+ chatSessionId: {
47
+ type: "string",
48
+ description: "The chatSessionId from the caelo_chat reply that is waiting.",
49
+ },
50
+ },
51
+ required: ["chatSessionId"],
52
+ },
53
+ };
54
+ /**
55
+ * The tool result for a caelo_chat exchange: every reply in order (the first
56
+ * turn, then each resumed one), the decisions in between, and — while cards
57
+ * still wait — the next step.
58
+ */
59
+ function chatResult(first, settled, chatSessionId) {
60
+ const turns = first ? [first, ...settled.turns] : [...settled.turns];
61
+ const last = turns.at(-1);
62
+ const text = [
63
+ ...(first ? [first.assistant] : []),
64
+ ...(settled.decided.length > 0 ? [describeDecisions(settled.decided)] : []),
65
+ ...settled.turns.map((t) => t.assistant),
66
+ ...(settled.kind === "pending" ? [describeWaiting(chatSessionId, settled.waiting)] : []),
67
+ ...(settled.kind === "superseded" ? [describeSuperseded(settled.dropped)] : []),
68
+ ...(settled.kind === "ready" ? [describeReady(chatSessionId)] : []),
69
+ ]
70
+ .filter((t) => t.trim().length > 0)
71
+ .join("\n\n");
72
+ const reply = text.length > 0
73
+ ? text
74
+ : "Nothing of yours waits for the operator's approval in this chat; continue with caelo_chat.";
75
+ return {
76
+ content: [
77
+ { type: "text", text: reply },
78
+ {
79
+ type: "text",
80
+ text: JSON.stringify({
81
+ chatSessionId,
82
+ requestId: last?.requestId ?? null,
83
+ toolCalls: turns.flatMap((t) => t.toolCalls),
84
+ pendingProposals: last?.pendingProposals ?? 0,
85
+ costMicrocents: turns.reduce((sum, t) => sum + t.costMicrocents, 0),
86
+ // Non-empty while the turn waits on the operator.
87
+ pendingApprovals: settled.kind === "pending"
88
+ ? settled.waiting.map((a) => ({ approvalId: a.approvalId, toolName: a.toolName }))
89
+ : [],
90
+ }, null, 2),
91
+ },
92
+ ],
93
+ };
94
+ }
27
95
  const caeloChatInputSchema = z
28
96
  .object({
29
97
  attachments: z.array(uploadedImageSchema).max(4).optional(),
@@ -43,6 +111,7 @@ export async function startMcpServer(opts) {
43
111
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
44
112
  tools: [
45
113
  UPLOAD_IMAGES_TOOL,
114
+ AWAIT_APPROVAL_TOOL,
46
115
  {
47
116
  name: "caelo_chat",
48
117
  description: "Talk to your Caelo CMS install's AI agent. Same agent that powers the live-edit chat overlay — it can read pages, propose edits, queue Owner-approval proposals, summarise plugin data. Continues an existing chat session (when chatSessionId is supplied) or starts a fresh one. Returns the agent's reply text plus structured tool-call summaries.",
@@ -73,7 +142,33 @@ export async function startMcpServer(opts) {
73
142
  },
74
143
  ],
75
144
  }));
76
- server.setRequestHandler(CallToolRequestSchema, async (req) => {
145
+ server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {
146
+ // Progress notifications keep progress-aware clients from timing the
147
+ // call out while it waits on the operator (only when they asked).
148
+ const progressToken = req.params._meta?.progressToken;
149
+ const onPending = progressToken === undefined
150
+ ? undefined
151
+ : async (elapsedMs) => {
152
+ await extra.sendNotification({
153
+ method: "notifications/progress",
154
+ params: {
155
+ progressToken,
156
+ progress: Math.round(elapsedMs / 1000),
157
+ message: "Waiting for the operator to approve or reject in the Caelo admin…",
158
+ },
159
+ });
160
+ };
161
+ /** Wait for the operator, then continue the paused turn (issue #658). */
162
+ const settle = (chatSessionId, waitMs) => settleChatApprovals({
163
+ chatSessionId,
164
+ fetchState: () => fetchChatApprovalState({ ...opts, chatSessionId }),
165
+ resume: () => resumeChat({ ...opts, chatSessionId }),
166
+ waitMs,
167
+ // The resume POST's whole timeout stays inside the call's budget.
168
+ resumeReserveMs: resumeTimeoutMs(),
169
+ ...(opts.approvalPollMs !== undefined ? { intervalMs: opts.approvalPollMs } : {}),
170
+ ...(onPending ? { onPending } : {}),
171
+ });
77
172
  if (req.params.name === UPLOAD_IMAGES_TOOL.name) {
78
173
  try {
79
174
  return await uploadImages(opts, req.params.arguments);
@@ -82,6 +177,28 @@ export async function startMcpServer(opts) {
82
177
  return { isError: true, content: [{ type: "text", text: String(e) }] };
83
178
  }
84
179
  }
180
+ if (req.params.name === AWAIT_APPROVAL_TOOL.name) {
181
+ const parsed = awaitApprovalInput.safeParse(req.params.arguments ?? {});
182
+ if (!parsed.success) {
183
+ return {
184
+ isError: true,
185
+ content: [{ type: "text", text: `invalid arguments: ${parsed.error.message}` }],
186
+ };
187
+ }
188
+ try {
189
+ // Room for at least one resume, even with a short configured wait —
190
+ // otherwise a decided turn could never continue.
191
+ const settled = await settle(parsed.data.chatSessionId, Math.max(resolveApprovalWaitMs(), resumeTimeoutMs() + RESUME_SLACK_MS));
192
+ return chatResult(null, settled, parsed.data.chatSessionId);
193
+ }
194
+ catch (e) {
195
+ const msg = e instanceof Error ? e.message : String(e);
196
+ return {
197
+ isError: true,
198
+ content: [{ type: "text", text: `caelo_await_approval failed: ${msg}` }],
199
+ };
200
+ }
201
+ }
85
202
  if (req.params.name !== "caelo_chat") {
86
203
  return {
87
204
  isError: true,
@@ -96,6 +213,7 @@ export async function startMcpServer(opts) {
96
213
  };
97
214
  }
98
215
  try {
216
+ const startedAt = Date.now();
99
217
  const result = await sendChat({
100
218
  adminUrl: opts.adminUrl,
101
219
  token: opts.token,
@@ -104,24 +222,44 @@ export async function startMcpServer(opts) {
104
222
  ...(parsed.data.chatSessionId ? { chatSessionId: parsed.data.chatSessionId } : {}),
105
223
  ...(parsed.data.pageId ? { pageId: parsed.data.pageId } : {}),
106
224
  });
107
- // Two content blocks: human-readable assistant text + a JSON
108
- // structured block the calling agent can parse for the
109
- // requestId, tool calls, cost, pending proposals.
110
- return {
111
- content: [
112
- { type: "text", text: result.assistant },
113
- {
114
- type: "text",
115
- text: JSON.stringify({
116
- chatSessionId: result.chatSessionId,
117
- requestId: result.requestId,
118
- toolCalls: result.toolCalls,
119
- pendingProposals: result.pendingProposals,
120
- costMicrocents: result.costMicrocents,
121
- }, null, 2),
122
- },
123
- ],
124
- };
225
+ // Issue #658 — the turn paused on approval cards: wait for the
226
+ // operator's decision within what is left of the wait bound, then
227
+ // continue this same turn and return its reply too.
228
+ if (result.pendingApprovals.length === 0) {
229
+ return chatResult(result, { kind: "settled", decided: [], turns: [] }, result.chatSessionId);
230
+ }
231
+ let settled;
232
+ try {
233
+ settled = await settle(result.chatSessionId, Math.max(0, resolveApprovalWaitMs() - (Date.now() - startedAt)));
234
+ }
235
+ catch (e) {
236
+ // The turn ran and its session exists: keep both in the result so
237
+ // the agent can continue with caelo_await_approval instead of
238
+ // retrying into duplicate work (codex review).
239
+ const msg = e instanceof Error ? e.message : String(e);
240
+ const waiting = chatResult(result, {
241
+ kind: "pending",
242
+ decided: [],
243
+ turns: [],
244
+ waiting: result.pendingApprovals.map((a) => ({
245
+ ...a,
246
+ status: "pending",
247
+ approved: null,
248
+ reason: null,
249
+ })),
250
+ }, result.chatSessionId);
251
+ return {
252
+ ...waiting,
253
+ content: [
254
+ ...waiting.content,
255
+ {
256
+ type: "text",
257
+ text: `Checking the operator's decision failed (${msg}); the request still exists. Call caelo_await_approval with chatSessionId "${result.chatSessionId}".`,
258
+ },
259
+ ],
260
+ };
261
+ }
262
+ return chatResult(result, settled, result.chatSessionId);
125
263
  }
126
264
  catch (e) {
127
265
  const msg = e instanceof Error ? e.message : String(e);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.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.41",
3
+ "version": "0.10.43",
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.",
@@ -36,8 +36,8 @@
36
36
  "prepublishOnly": "tsc -b --force"
37
37
  },
38
38
  "dependencies": {
39
- "@modelcontextprotocol/sdk": "1.31.0",
40
- "google-auth-library": "11.1.0",
39
+ "@modelcontextprotocol/sdk": "1.32.1",
40
+ "google-auth-library": "11.2.0",
41
41
  "zod": "4.6.5"
42
42
  },
43
43
  "publishConfig": {