@agent-deck/backend 1.10.6 → 1.11.1
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/.tsbuildinfo +1 -1
- package/dist/data/oauth-provider-guides.js +1 -1
- package/dist/data/oauth-provider-guides.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +27 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-session-binding.d.ts +18 -0
- package/dist/mcp-session-binding.d.ts.map +1 -1
- package/dist/mcp-session-binding.js +25 -0
- package/dist/mcp-session-binding.js.map +1 -1
- package/dist/mcp-tools/elicitation.d.ts +129 -0
- package/dist/mcp-tools/elicitation.d.ts.map +1 -0
- package/dist/mcp-tools/elicitation.js +231 -0
- package/dist/mcp-tools/elicitation.js.map +1 -0
- package/dist/mcp-tools/policy.d.ts.map +1 -1
- package/dist/mcp-tools/policy.js +2 -0
- package/dist/mcp-tools/policy.js.map +1 -1
- package/dist/mcp-tools/register.d.ts +14 -0
- package/dist/mcp-tools/register.d.ts.map +1 -1
- package/dist/mcp-tools/register.js +109 -129
- package/dist/mcp-tools/register.js.map +1 -1
- package/dist/playbooks/stub-sync.d.ts +55 -12
- package/dist/playbooks/stub-sync.d.ts.map +1 -1
- package/dist/playbooks/stub-sync.js +136 -197
- package/dist/playbooks/stub-sync.js.map +1 -1
- package/dist/routes/trusted-session.d.ts.map +1 -1
- package/dist/routes/trusted-session.js +240 -6
- package/dist/routes/trusted-session.js.map +1 -1
- package/dist/trusted-session/route-policy-registry.d.ts.map +1 -1
- package/dist/trusted-session/route-policy-registry.js +22 -0
- package/dist/trusted-session/route-policy-registry.js.map +1 -1
- package/dist/trusted-session/store.d.ts +174 -2
- package/dist/trusted-session/store.d.ts.map +1 -1
- package/dist/trusted-session/store.js +459 -2
- package/dist/trusted-session/store.js.map +1 -1
- package/package.json +2 -2
- package/static-ui/assets/{index-BArFQUL8.js → index-Ca-b9mcS.js} +4 -4
- package/static-ui/assets/index-zR2BCPPK.css +1 -0
- package/static-ui/index.html +2 -2
- package/static-ui/assets/index-CbccleVj.css +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NOT-213: host-native MCP form elicitation for deck-switch approval.
|
|
4
|
+
*
|
|
5
|
+
* Presentation order (deck-switching redesign spec 2.3): host-native MCP
|
|
6
|
+
* form first, bootstrapped browser approval second, menubar pending-request
|
|
7
|
+
* recovery third. This adapter is the first surface: after `switch_deck`
|
|
8
|
+
* creates a pending request, it presents one choice — This session only,
|
|
9
|
+
* This workspace by default, or Decline — through the host's structured
|
|
10
|
+
* input UI when the connected client advertises form elicitation.
|
|
11
|
+
*
|
|
12
|
+
* Design notes:
|
|
13
|
+
* - The adapter is transport-agnostic and SDK-free: capability detection
|
|
14
|
+
* takes the client's reported capabilities object, and elicitation /
|
|
15
|
+
* approval submission are injected. The production provider lives in
|
|
16
|
+
* mcp-server.ts (per-session McpServer) and register.ts.
|
|
17
|
+
* - Decision and commit authority stay server-side. The form carries only
|
|
18
|
+
* the opaque request id (echoed back) and the chosen scope; the adapter
|
|
19
|
+
* pins both to the request it just created before submitting, and the
|
|
20
|
+
* approval API re-validates ownership, scope, and pending status. A
|
|
21
|
+
* forged scope or request id is rejected there (400/404/403).
|
|
22
|
+
* - Cancellation (dismissed form) never touches the approval API: the
|
|
23
|
+
* request stays pending for browser/menubar recovery and the response
|
|
24
|
+
* explains how to reopen it.
|
|
25
|
+
* - Unsupported capability, timeout, transport error, malformed response,
|
|
26
|
+
* or an unavailable commit path all degrade to the browser-fallback
|
|
27
|
+
* presentation hint with the deck unchanged.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.DeckSwitchApprovalCommitUnavailable = exports.DECK_SWITCH_SCOPE_LABELS = exports.DECK_SWITCH_ELICITATION_TIMEOUT_MS = void 0;
|
|
31
|
+
exports.isDeckSwitchApprovalScope = isDeckSwitchApprovalScope;
|
|
32
|
+
exports.supportsFormElicitation = supportsFormElicitation;
|
|
33
|
+
exports.buildDeckSwitchElicitationInput = buildDeckSwitchElicitationInput;
|
|
34
|
+
exports.buildCancelRecoveryPayload = buildCancelRecoveryPayload;
|
|
35
|
+
exports.presentDeckSwitchApproval = presentDeckSwitchApproval;
|
|
36
|
+
exports.submitDeckSwitchApprovalViaBackend = submitDeckSwitchApprovalViaBackend;
|
|
37
|
+
const admin_secret_1 = require("../trusted-session/admin-secret");
|
|
38
|
+
/** How long the tool call waits for the human to answer the native form. */
|
|
39
|
+
exports.DECK_SWITCH_ELICITATION_TIMEOUT_MS = 60_000;
|
|
40
|
+
const APPROVAL_SCOPES = new Set([
|
|
41
|
+
'session',
|
|
42
|
+
'workspace-default',
|
|
43
|
+
'decline',
|
|
44
|
+
]);
|
|
45
|
+
function isDeckSwitchApprovalScope(value) {
|
|
46
|
+
return typeof value === 'string' && APPROVAL_SCOPES.has(value);
|
|
47
|
+
}
|
|
48
|
+
/** Human labels shown in the native form (enumNames). */
|
|
49
|
+
exports.DECK_SWITCH_SCOPE_LABELS = {
|
|
50
|
+
session: 'This session only',
|
|
51
|
+
'workspace-default': 'This workspace by default',
|
|
52
|
+
decline: 'Decline',
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Capability gate: true only when the connected client advertises
|
|
56
|
+
* `elicitation.form` (SDK ClientCapabilities shape). Anything else —
|
|
57
|
+
* missing, malformed, or url-only — means the browser fallback owns
|
|
58
|
+
* the approval.
|
|
59
|
+
*/
|
|
60
|
+
function supportsFormElicitation(capabilities) {
|
|
61
|
+
if (!capabilities || typeof capabilities !== 'object') {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const elicitation = capabilities.elicitation;
|
|
65
|
+
if (!elicitation || typeof elicitation !== 'object') {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const form = elicitation.form;
|
|
69
|
+
return !!form && typeof form === 'object';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build the `elicitation/create` form params for one pending request.
|
|
73
|
+
* The message reuses the creation response's display-safe labels; the
|
|
74
|
+
* schema carries only the opaque request id (as the default) and the
|
|
75
|
+
* scope enum with all three human labels. No URLs, no secrets.
|
|
76
|
+
*/
|
|
77
|
+
function buildDeckSwitchElicitationInput(creation) {
|
|
78
|
+
const requestId = String(creation.requestId ?? '');
|
|
79
|
+
const current = typeof creation.currentDeckName === 'string' ? creation.currentDeckName : 'current deck';
|
|
80
|
+
const requested = typeof creation.requestedDeckName === 'string' ? creation.requestedDeckName : 'requested deck';
|
|
81
|
+
const body = typeof creation.presentation?.body === 'string' ? creation.presentation.body : null;
|
|
82
|
+
const message = body ?? `Agent requested a deck switch from "${current}" to "${requested}". The active deck is unchanged until a human approves.`;
|
|
83
|
+
return {
|
|
84
|
+
message,
|
|
85
|
+
requestedSchema: {
|
|
86
|
+
type: 'object',
|
|
87
|
+
properties: {
|
|
88
|
+
requestId: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
title: 'Request ID',
|
|
91
|
+
description: 'Pending deck-switch request this decision applies to.',
|
|
92
|
+
default: requestId,
|
|
93
|
+
},
|
|
94
|
+
scope: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
title: 'Approval scope',
|
|
97
|
+
description: `Approve the switch to "${requested}" for this session only or as the workspace default, or decline it.`,
|
|
98
|
+
enum: ['session', 'workspace-default', 'decline'],
|
|
99
|
+
enumNames: [
|
|
100
|
+
exports.DECK_SWITCH_SCOPE_LABELS.session,
|
|
101
|
+
exports.DECK_SWITCH_SCOPE_LABELS['workspace-default'],
|
|
102
|
+
exports.DECK_SWITCH_SCOPE_LABELS.decline,
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
required: ['requestId', 'scope'],
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Cancel payload: the request is still pending, the deck is unchanged,
|
|
112
|
+
* and the agent gets a secret-free, URL-free note explaining where the
|
|
113
|
+
* human can reopen the decision (browser approval page, menubar inbox).
|
|
114
|
+
*/
|
|
115
|
+
function buildCancelRecoveryPayload(creation) {
|
|
116
|
+
const requestId = String(creation.requestId ?? '');
|
|
117
|
+
const current = typeof creation.currentDeckName === 'string' ? creation.currentDeckName : 'current deck';
|
|
118
|
+
const requested = typeof creation.requestedDeckName === 'string' ? creation.requestedDeckName : 'requested deck';
|
|
119
|
+
return {
|
|
120
|
+
requestId,
|
|
121
|
+
status: 'pending',
|
|
122
|
+
currentDeckName: creation.currentDeckName,
|
|
123
|
+
requestedDeckName: creation.requestedDeckName,
|
|
124
|
+
expiresAt: creation.expiresAt,
|
|
125
|
+
channel: 'browser',
|
|
126
|
+
message: `Approval dismissed with no decision. Request ${requestId} is still pending and the active deck ` +
|
|
127
|
+
`("${current}") is unchanged. Approve the switch to "${requested}" ("This session only" or ` +
|
|
128
|
+
`"This workspace by default") or decline it from the browser approval page or the menubar ` +
|
|
129
|
+
`pending-requests inbox.`,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Present one pending deck-switch request through the host-native form.
|
|
134
|
+
* Never throws for elicitation-level failures: those degrade to the
|
|
135
|
+
* browser-fallback payload. Approval API rejections propagate so the
|
|
136
|
+
* caller surfaces them without retrying.
|
|
137
|
+
*/
|
|
138
|
+
async function presentDeckSwitchApproval(deps) {
|
|
139
|
+
const { creation, runtimeSessionId } = deps;
|
|
140
|
+
let supported = false;
|
|
141
|
+
try {
|
|
142
|
+
supported = deps.supportsFormElicitation();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
supported = false;
|
|
146
|
+
}
|
|
147
|
+
if (!supported) {
|
|
148
|
+
return { handled: 'fallback', payload: creation };
|
|
149
|
+
}
|
|
150
|
+
let result;
|
|
151
|
+
try {
|
|
152
|
+
result = await deps.elicitForm(buildDeckSwitchElicitationInput(creation));
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Timeout, transport error, or schema mismatch (SDK validates the
|
|
156
|
+
// accepted content against requestedSchema and throws McpError).
|
|
157
|
+
return { handled: 'fallback', payload: creation };
|
|
158
|
+
}
|
|
159
|
+
if (!result || typeof result !== 'object' || typeof result.action !== 'string') {
|
|
160
|
+
return { handled: 'fallback', payload: creation };
|
|
161
|
+
}
|
|
162
|
+
const requestId = String(creation.requestId ?? '');
|
|
163
|
+
if (result.action === 'cancel') {
|
|
164
|
+
return { handled: 'pending-recovery', payload: buildCancelRecoveryPayload(creation) };
|
|
165
|
+
}
|
|
166
|
+
const submit = async (decision) => {
|
|
167
|
+
try {
|
|
168
|
+
const payload = await deps.submitApproval({ requestId, runtimeSessionId, decision });
|
|
169
|
+
return { handled: 'resolved', payload };
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// The server cannot submit (no commit credential): the request is
|
|
173
|
+
// still pending, so the browser fallback is the honest answer.
|
|
174
|
+
if (error instanceof DeckSwitchApprovalCommitUnavailable) {
|
|
175
|
+
return { handled: 'fallback', payload: creation };
|
|
176
|
+
}
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
if (result.action === 'decline') {
|
|
181
|
+
// Host-level decline without a submitted scope: the human declined
|
|
182
|
+
// the switch itself.
|
|
183
|
+
return submit('decline');
|
|
184
|
+
}
|
|
185
|
+
if (result.action !== 'accept') {
|
|
186
|
+
return { handled: 'fallback', payload: creation };
|
|
187
|
+
}
|
|
188
|
+
const content = result.content;
|
|
189
|
+
if (!content || typeof content !== 'object') {
|
|
190
|
+
return { handled: 'fallback', payload: creation };
|
|
191
|
+
}
|
|
192
|
+
// Pin the echoed request id to the request just created: a forged or
|
|
193
|
+
// mismatched id must never commit, here or elsewhere.
|
|
194
|
+
if (typeof content.requestId !== 'string' || content.requestId !== requestId) {
|
|
195
|
+
return { handled: 'fallback', payload: creation };
|
|
196
|
+
}
|
|
197
|
+
if (!isDeckSwitchApprovalScope(content.scope)) {
|
|
198
|
+
return { handled: 'fallback', payload: creation };
|
|
199
|
+
}
|
|
200
|
+
return submit(content.scope);
|
|
201
|
+
}
|
|
202
|
+
/** The server holds no credential that the approval API accepts. */
|
|
203
|
+
class DeckSwitchApprovalCommitUnavailable extends Error {
|
|
204
|
+
constructor(message = 'Deck-switch approval commit unavailable: no server credential for the approval API') {
|
|
205
|
+
super(message);
|
|
206
|
+
this.name = 'DeckSwitchApprovalCommitUnavailable';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.DeckSwitchApprovalCommitUnavailable = DeckSwitchApprovalCommitUnavailable;
|
|
210
|
+
/**
|
|
211
|
+
* Submit one elicited decision to the NOT-207 resolve endpoint. The MCP
|
|
212
|
+
* server authenticates as a dashboard principal with the host's admin
|
|
213
|
+
* secret (same credential the backend itself accepts for dashboard
|
|
214
|
+
* callers); the endpoint still enforces request ownership, scope, and
|
|
215
|
+
* pending status, so forged ids/scopes are rejected there.
|
|
216
|
+
*/
|
|
217
|
+
async function submitDeckSwitchApprovalViaBackend(deps) {
|
|
218
|
+
const secret = await (deps.readSecret ?? admin_secret_1.readAdminSecretFromEnvOrFile)();
|
|
219
|
+
if (!secret) {
|
|
220
|
+
throw new DeckSwitchApprovalCommitUnavailable();
|
|
221
|
+
}
|
|
222
|
+
return deps.callBackendAPI(`/api/trusted-session/deck-switch/${encodeURIComponent(deps.requestId)}/resolve`, {
|
|
223
|
+
method: 'POST',
|
|
224
|
+
headers: {
|
|
225
|
+
'Content-Type': 'application/json',
|
|
226
|
+
Authorization: `Bearer ${secret}`,
|
|
227
|
+
},
|
|
228
|
+
body: JSON.stringify({ runtimeSessionId: deps.runtimeSessionId, decision: deps.decision }),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=elicitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation.js","sourceRoot":"","sources":["../../src/mcp-tools/elicitation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO;;;;;;EAWhD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,uBAAuB;;;;;;EAM3D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;EAU1G;
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO;;;;;;EAWhD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,uBAAuB;;;;;;EAM3D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;EAU1G;AAqBD,+FAA+F;AAC/F,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,GAAG,IAAI,CAAC,CAa1G;AAED,wBAAgB,mBAAmB,IAAI,UAAU,CAAC,OAAO,cAAc,CAAC,GAAG,IAAI,CAK9E"}
|
package/dist/mcp-tools/policy.js
CHANGED
|
@@ -51,6 +51,8 @@ function bodyMessage(code) {
|
|
|
51
51
|
return 'Resource is outside the bound deck';
|
|
52
52
|
case 'DECK_FIXED':
|
|
53
53
|
return "This connection's deck was set when it was launched and cannot be changed by the agent. Change it where the connection is configured (for example the Agent Dealer profile).";
|
|
54
|
+
case 'SWITCH_APPROVAL_REQUIRED':
|
|
55
|
+
return 'This session already has a deck. Agents cannot switch decks directly — call switch_deck to request a switch and wait for the human to approve it as This session only or This workspace by default. The active deck is unchanged and no reload is needed.';
|
|
54
56
|
default:
|
|
55
57
|
return code;
|
|
56
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/mcp-tools/policy.ts"],"names":[],"mappings":";;AAQA,gDAWC;AAED,wCAMC;AAED,4CAUC;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/mcp-tools/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import type { ElicitationResult } from './elicitation';
|
|
2
3
|
import type { StubBindSyncResult } from '../playbooks/stub-sync';
|
|
3
4
|
import { McpToolProfile } from './profile';
|
|
4
5
|
type RegisterToolFn = (name: string, config: {
|
|
@@ -52,6 +53,19 @@ export type McpToolHost = {
|
|
|
52
53
|
};
|
|
53
54
|
badgeBySession: Map<string, string>;
|
|
54
55
|
backendUrl: string;
|
|
56
|
+
/**
|
|
57
|
+
* NOT-213: host-native approval form. Absent when the MCP server has no
|
|
58
|
+
* elicitation provider wired for this session — the tool then keeps the
|
|
59
|
+
* established browser fallback. Present but reporting unsupported also
|
|
60
|
+
* falls back.
|
|
61
|
+
*/
|
|
62
|
+
elicitation?: {
|
|
63
|
+
supportsFormElicitation(): boolean;
|
|
64
|
+
elicitForm(input: {
|
|
65
|
+
message: string;
|
|
66
|
+
requestedSchema: Record<string, unknown>;
|
|
67
|
+
}): Promise<ElicitationResult>;
|
|
68
|
+
};
|
|
55
69
|
toolResult(data: unknown): {
|
|
56
70
|
content: Array<{
|
|
57
71
|
type: 'text';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/register.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/register.ts"],"names":[],"mappings":"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"}
|