@ziggs-ai/ziggs-mcp 0.41.6 → 0.41.7
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/CHANGELOG.md +6 -0
- package/README.md +0 -1
- package/dist/directorySurface.js +2 -2
- package/dist/inboxCompact.d.ts +24 -17
- package/dist/inboxCompact.js +80 -37
- package/dist/tools.js +4 -2
- package/dist/trustTools.d.ts +2 -2
- package/dist/trustTools.js +2 -2
- package/package.json +3 -3
- package/skills/ziggs/references/grants-and-approvals.md +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.41.7
|
|
6
|
+
|
|
7
|
+
- `ziggs_artifact_share` is removed from every surface, the directory included: an artifact reaches people only by being added to a bucket.
|
|
8
|
+
- The inbox groups rows by the bucket they were sent in: each section lists its buckets, each with `bucketId`, `revision`, `count` and its rows oldest first, every row saying its own `from`. Rows in no bucket you are in stay grouped by sender, then thread.
|
|
9
|
+
- The compact door lists the bucket tools: create, list, read, insert, remove, duplicate, move (into another bucket or a new one), add members, join, send inside a bucket, remove a member, rename and delete.
|
|
10
|
+
|
|
5
11
|
## 0.41.6
|
|
6
12
|
|
|
7
13
|
## 0.41.5
|
package/README.md
CHANGED
|
@@ -160,7 +160,6 @@ Startup validates the key shape, expiry (JWT `exp`), and agent resolution. Error
|
|
|
160
160
|
| `ziggs_context_read` | `GET /context/read/:type` |
|
|
161
161
|
| `ziggs_artifact_record` | `POST /artifacts` |
|
|
162
162
|
| `ziggs_artifact_list` | `GET /artifacts` |
|
|
163
|
-
| `ziggs_artifact_share` | `POST /context/artifacts/:id/share` |
|
|
164
163
|
| `ziggs_artifact_attach` | `POST /tasks/:id/artifacts` or `POST /agreements/:id/artifacts`; exact message references use `ziggs_message_send` |
|
|
165
164
|
| `ziggs_artifact_upload_url` | `POST /artifacts/upload-url` (+ optional S3 PUT) |
|
|
166
165
|
| `ziggs_artifact_complete_file` | `POST /artifacts/:id/complete` |
|
package/dist/directorySurface.js
CHANGED
|
@@ -11,7 +11,7 @@ ziggs_agreement_respond ziggs_agreement_revoke ziggs_agreement_counter ziggs_agr
|
|
|
11
11
|
ziggs_inbox_changes ziggs_inbox_peek ziggs_inbox ziggs_inbox_show ziggs_inbox_claim ziggs_inbox_ack ziggs_inbox_defer
|
|
12
12
|
ziggs_grant_list ziggs_context_expand_reach ziggs_context_discover_grantable
|
|
13
13
|
ziggs_open ziggs_access_explain ziggs_context_read
|
|
14
|
-
ziggs_artifact_record ziggs_artifact_list ziggs_artifact_find
|
|
14
|
+
ziggs_artifact_record ziggs_artifact_list ziggs_artifact_find
|
|
15
15
|
ziggs_artifact_attach ziggs_artifact_contribution_review ziggs_artifact_contribute
|
|
16
16
|
ziggs_artifact_upload_url ziggs_artifact_complete_file ziggs_artifact_download
|
|
17
17
|
ziggs_message_read ziggs_message_send ziggs_message_replies ziggs_message_list ziggs_message_controls
|
|
@@ -34,7 +34,7 @@ const OPEN_WORLD = new Set(`
|
|
|
34
34
|
ziggs_agent_search ziggs_agent_get ziggs_marketplace_view
|
|
35
35
|
ziggs_agreement_buy ziggs_agreement_bid ziggs_agreement_broker ziggs_agreement_request
|
|
36
36
|
ziggs_agreement_handoff ziggs_agreement_claim ziggs_agreement_subcontract
|
|
37
|
-
ziggs_task_delegate
|
|
37
|
+
ziggs_task_delegate ziggs_artifact_attach ziggs_artifact_contribute
|
|
38
38
|
ziggs_message_send ziggs_context_delegate ziggs_access_request
|
|
39
39
|
ziggs_link_propose ziggs_introduction_mint ziggs_introduction_redeem
|
|
40
40
|
`.trim().split(/\s+/));
|
package/dist/inboxCompact.d.ts
CHANGED
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
* the ack step's — is passed through byte for byte.
|
|
28
28
|
*
|
|
29
29
|
* The rows are written grouped rather than as one flat list: by who they are
|
|
30
|
-
* for, then by
|
|
31
|
-
* about. A flat list mixed the
|
|
32
|
-
* only passes along to its person and mail
|
|
33
|
-
* assistants, and the split lived in one sentence of
|
|
34
|
-
* still there, oldest first inside its thread;
|
|
30
|
+
* for, then by the bucket they were sent in, or, outside a bucket, by who sent
|
|
31
|
+
* them and the chat, task or agreement they are about. A flat list mixed the
|
|
32
|
+
* assistant's own work with mail it only passes along to its person and mail
|
|
33
|
+
* for the person's other assistants, and the split lived in one sentence of
|
|
34
|
+
* counts. Every row is still there, oldest first inside its bucket or thread;
|
|
35
|
+
* see {@link groupDeliveries}.
|
|
35
36
|
*/
|
|
36
37
|
type Json = Record<string, unknown>;
|
|
37
38
|
/** One delivery row, without what it would say by default or elsewhere. */
|
|
@@ -54,20 +55,26 @@ export type InboxSection = (typeof INBOX_SECTIONS)[number];
|
|
|
54
55
|
*/
|
|
55
56
|
export declare function sectionOf(row: Json, agentIds: readonly string[]): InboxSection;
|
|
56
57
|
/**
|
|
57
|
-
* The window's rows, grouped: section, then
|
|
58
|
+
* The window's rows, grouped: section, then bucket, then the rows in it. A
|
|
59
|
+
* row in no bucket the reader is in goes under its sender, then its thread.
|
|
58
60
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* side did, not news from anyone.
|
|
61
|
+
* A bucket is the context its rows were sent in, so it holds them together
|
|
62
|
+
* whoever sent them: each of its rows says its own `from`, oldest first. The
|
|
63
|
+
* bucket's name and contents are a bucket read away; a reply to one of its
|
|
64
|
+
* messages goes back into it.
|
|
64
65
|
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
66
|
+
* Nothing is hidden and nothing is reordered within a bucket or a thread.
|
|
67
|
+
* Groups and threads are written in the order their oldest row arrived, which
|
|
68
|
+
* is the order the server sends (oldest first), except that the reader's own
|
|
69
|
+
* actions and their person's outside a bucket come last in a section: they
|
|
70
|
+
* are a record of what this side did, not news from anyone.
|
|
71
|
+
*
|
|
72
|
+
* A row drops only what its place in the grouping says: its bucket (the
|
|
73
|
+
* group's), the sender (a sender group's `from`), the thread's own id, the
|
|
74
|
+
* assignee in `forYou` when the connection has one assistant, and
|
|
75
|
+
* `needsHuman` in `forYourPerson`. A thread names the first agreement its
|
|
76
|
+
* rows sit under; a row under another one keeps its own, and a row under none
|
|
77
|
+
* says `agreementId: null`, so every row reads back exactly.
|
|
71
78
|
*/
|
|
72
79
|
export declare function groupDeliveries(rows: readonly Json[], reader: InboxReader, compactRow?: (row: Json) => Json): Partial<Record<InboxSection, Json[]>>;
|
|
73
80
|
/**
|
package/dist/inboxCompact.js
CHANGED
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
* the ack step's — is passed through byte for byte.
|
|
28
28
|
*
|
|
29
29
|
* The rows are written grouped rather than as one flat list: by who they are
|
|
30
|
-
* for, then by
|
|
31
|
-
* about. A flat list mixed the
|
|
32
|
-
* only passes along to its person and mail
|
|
33
|
-
* assistants, and the split lived in one sentence of
|
|
34
|
-
* still there, oldest first inside its thread;
|
|
30
|
+
* for, then by the bucket they were sent in, or, outside a bucket, by who sent
|
|
31
|
+
* them and the chat, task or agreement they are about. A flat list mixed the
|
|
32
|
+
* assistant's own work with mail it only passes along to its person and mail
|
|
33
|
+
* for the person's other assistants, and the split lived in one sentence of
|
|
34
|
+
* counts. Every row is still there, oldest first inside its bucket or thread;
|
|
35
|
+
* see {@link groupDeliveries}.
|
|
35
36
|
*/
|
|
36
37
|
const isRecord = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
37
38
|
/** Session fields `ziggs_auth_status` carries; the inbox does not repeat them. */
|
|
@@ -125,51 +126,77 @@ function anchorOf(row) {
|
|
|
125
126
|
return ['agreementId', String(row.agreementId)];
|
|
126
127
|
return [row.kind === 'artifact' ? 'artifactId' : 'resourceId', String(row.resourceId)];
|
|
127
128
|
}
|
|
129
|
+
/** The bucket the server says a row was put in, if any. */
|
|
130
|
+
function bucketOf(row) {
|
|
131
|
+
const bucket = row.bucket;
|
|
132
|
+
if (!isRecord(bucket) || !bucket.bucketId)
|
|
133
|
+
return null;
|
|
134
|
+
return { bucketId: String(bucket.bucketId), revision: bucket.revision };
|
|
135
|
+
}
|
|
128
136
|
/**
|
|
129
|
-
* The window's rows, grouped: section, then
|
|
137
|
+
* The window's rows, grouped: section, then bucket, then the rows in it. A
|
|
138
|
+
* row in no bucket the reader is in goes under its sender, then its thread.
|
|
139
|
+
*
|
|
140
|
+
* A bucket is the context its rows were sent in, so it holds them together
|
|
141
|
+
* whoever sent them: each of its rows says its own `from`, oldest first. The
|
|
142
|
+
* bucket's name and contents are a bucket read away; a reply to one of its
|
|
143
|
+
* messages goes back into it.
|
|
130
144
|
*
|
|
131
|
-
* Nothing is hidden and nothing is reordered within a thread.
|
|
132
|
-
* threads are written in the order their oldest row arrived, which
|
|
133
|
-
* order the server sends (oldest first), except that the reader's own
|
|
134
|
-
* and their person's come last in a section: they
|
|
135
|
-
* side did, not news from anyone.
|
|
145
|
+
* Nothing is hidden and nothing is reordered within a bucket or a thread.
|
|
146
|
+
* Groups and threads are written in the order their oldest row arrived, which
|
|
147
|
+
* is the order the server sends (oldest first), except that the reader's own
|
|
148
|
+
* actions and their person's outside a bucket come last in a section: they
|
|
149
|
+
* are a record of what this side did, not news from anyone.
|
|
136
150
|
*
|
|
137
|
-
* A row drops only what its place in the grouping says:
|
|
138
|
-
* group's `from`), the thread's own id, the
|
|
139
|
-
* connection has one assistant, and
|
|
140
|
-
* names the first agreement its
|
|
141
|
-
*
|
|
142
|
-
* back exactly.
|
|
151
|
+
* A row drops only what its place in the grouping says: its bucket (the
|
|
152
|
+
* group's), the sender (a sender group's `from`), the thread's own id, the
|
|
153
|
+
* assignee in `forYou` when the connection has one assistant, and
|
|
154
|
+
* `needsHuman` in `forYourPerson`. A thread names the first agreement its
|
|
155
|
+
* rows sit under; a row under another one keeps its own, and a row under none
|
|
156
|
+
* says `agreementId: null`, so every row reads back exactly.
|
|
143
157
|
*/
|
|
144
158
|
export function groupDeliveries(rows, reader, compactRow = (row) => ({ ...row })) {
|
|
145
159
|
const sections = new Map();
|
|
146
160
|
for (const row of rows) {
|
|
147
161
|
const section = sectionOf(row, reader.agentIds);
|
|
162
|
+
let groups = sections.get(section);
|
|
163
|
+
if (!groups)
|
|
164
|
+
sections.set(section, (groups = new Map()));
|
|
165
|
+
const bucket = bucketOf(row);
|
|
166
|
+
if (bucket) {
|
|
167
|
+
const key = `bucket:${bucket.bucketId}`;
|
|
168
|
+
let group = groups.get(key);
|
|
169
|
+
if (!group)
|
|
170
|
+
groups.set(key, (group = { kind: 'bucket', ...bucket, rows: [] }));
|
|
171
|
+
group.rows.push(row);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
148
174
|
const from = row.actorId ? String(row.actorId) : null;
|
|
149
175
|
const anchor = anchorOf(row);
|
|
150
|
-
let
|
|
151
|
-
if (!senders)
|
|
152
|
-
sections.set(section, (senders = new Map()));
|
|
153
|
-
let group = senders.get(String(from));
|
|
176
|
+
let group = groups.get(`from:${from}`);
|
|
154
177
|
if (!group)
|
|
155
|
-
|
|
178
|
+
groups.set(`from:${from}`, (group = { kind: 'sender', from, threads: new Map() }));
|
|
156
179
|
const key = anchor.join(':');
|
|
157
180
|
let thread = group.threads.get(key);
|
|
158
181
|
if (!thread)
|
|
159
182
|
group.threads.set(key, (thread = { anchor, rows: [] }));
|
|
160
183
|
thread.rows.push(row);
|
|
161
184
|
}
|
|
162
|
-
const own = (
|
|
185
|
+
const own = (g) => g.kind === 'sender' &&
|
|
186
|
+
g.from !== null &&
|
|
187
|
+
(reader.agentIds.includes(g.from) || g.from === reader.personId);
|
|
163
188
|
const out = {};
|
|
164
189
|
for (const section of INBOX_SECTIONS) {
|
|
165
|
-
const
|
|
166
|
-
if (!
|
|
190
|
+
const groups = sections.get(section);
|
|
191
|
+
if (!groups)
|
|
167
192
|
continue;
|
|
168
|
-
const ordered = [...
|
|
193
|
+
const ordered = [...groups.values()];
|
|
169
194
|
out[section] = [
|
|
170
|
-
...ordered.filter((g) => !own(g
|
|
171
|
-
...ordered.filter((g) => own(g
|
|
195
|
+
...ordered.filter((g) => !own(g)),
|
|
196
|
+
...ordered.filter((g) => own(g)),
|
|
172
197
|
].map((g) => {
|
|
198
|
+
if (g.kind === 'bucket')
|
|
199
|
+
return writeBucket(g, section, reader, compactRow);
|
|
173
200
|
const threads = [...g.threads.values()].map((t) => writeThread(t, section, reader, compactRow));
|
|
174
201
|
const count = [...g.threads.values()].reduce((n, t) => n + t.rows.length, 0);
|
|
175
202
|
return {
|
|
@@ -183,6 +210,29 @@ export function groupDeliveries(rows, reader, compactRow = (row) => ({ ...row })
|
|
|
183
210
|
}
|
|
184
211
|
return out;
|
|
185
212
|
}
|
|
213
|
+
/** What a row's section already says about it. */
|
|
214
|
+
function dropWhatTheSectionSays(row, section, reader) {
|
|
215
|
+
if (section === 'forYou') {
|
|
216
|
+
if (reader.agentIds.length === 1)
|
|
217
|
+
delete row.assigneeId;
|
|
218
|
+
if (row.assignedToConnection === true)
|
|
219
|
+
delete row.assignedToConnection;
|
|
220
|
+
}
|
|
221
|
+
if (section === 'forYourPerson')
|
|
222
|
+
delete row.needsHuman;
|
|
223
|
+
}
|
|
224
|
+
function writeBucket(group, section, reader, compactRow) {
|
|
225
|
+
const rows = group.rows.map((original) => {
|
|
226
|
+
const { actorId, ...row } = compactRow(original);
|
|
227
|
+
// Every row of one read carries the bucket's revision at that read; one
|
|
228
|
+
// that somehow differs keeps its own.
|
|
229
|
+
if (bucketOf(row)?.revision === group.revision)
|
|
230
|
+
delete row.bucket;
|
|
231
|
+
dropWhatTheSectionSays(row, section, reader);
|
|
232
|
+
return actorId ? { from: actorId, ...row } : row;
|
|
233
|
+
});
|
|
234
|
+
return { bucketId: group.bucketId, revision: group.revision, count: rows.length, rows };
|
|
235
|
+
}
|
|
186
236
|
function writeThread(thread, section, reader, compactRow) {
|
|
187
237
|
const [field, id] = thread.anchor;
|
|
188
238
|
const lifted = field === 'agreementId'
|
|
@@ -199,14 +249,7 @@ function writeThread(thread, section, reader, compactRow) {
|
|
|
199
249
|
else if (!row.agreementId)
|
|
200
250
|
row.agreementId = null;
|
|
201
251
|
}
|
|
202
|
-
|
|
203
|
-
if (reader.agentIds.length === 1)
|
|
204
|
-
delete row.assigneeId;
|
|
205
|
-
if (row.assignedToConnection === true)
|
|
206
|
-
delete row.assignedToConnection;
|
|
207
|
-
}
|
|
208
|
-
if (section === 'forYourPerson')
|
|
209
|
-
delete row.needsHuman;
|
|
252
|
+
dropWhatTheSectionSays(row, section, reader);
|
|
210
253
|
return row;
|
|
211
254
|
});
|
|
212
255
|
return { [field]: id, ...(lifted ? { agreementId: lifted } : {}), rows };
|
|
@@ -299,5 +342,5 @@ export function windowNote(deliveries, selfAgentIds) {
|
|
|
299
342
|
const parts = INBOX_SECTIONS.filter((s) => s === 'forYou' || count(s) > 0).map((s) => `${s} ${count(s)} (${words[s]})`);
|
|
300
343
|
const reach = outOfReach ? ` ${outOfReach} of them ${outOfReach === 1 ? 'is' : 'are'} out of reach.` : '';
|
|
301
344
|
const total = `${rows.length} ${rows.length === 1 ? 'delivery' : 'deliveries'}`;
|
|
302
|
-
return `Those counts are decisions and tasks, not messages. This window has ${total}, grouped by who they are for, then by sender: ${parts.join(', ')}.${reach}`;
|
|
345
|
+
return `Those counts are decisions and tasks, not messages. This window has ${total}, grouped by who they are for, then by bucket, or by sender outside a bucket: ${parts.join(', ')}.${reach}`;
|
|
303
346
|
}
|
package/dist/tools.js
CHANGED
|
@@ -2,7 +2,7 @@ import { MESSAGING_CAPABILITIES } from '@ziggs-ai/api-client';
|
|
|
2
2
|
import { isDirectorySurface } from './directorySurface.js';
|
|
3
3
|
import { INBOX_CARD_TOOL_META, inboxCardResult, registerInboxCardResource, } from './inboxCard.js';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import { presentResourceActions, getAgreement, getMyAgreements, respondToAgreement, revokeAgreement, counterAgreement, fulfillAgreement, ConnectionsClient, ContextReadClient, GrantsClient, InboxClient, SessionsClient, AssistantConnectionClient, createTask, updateTaskState, acknowledgeTaskControl, replaceTaskPlan, updateTaskPlanSteps, listTasks, getTask, getBackendUrl, fetchMyOrgs, fetchSessionAccess, isMcpOAuthDelegateSession, GRANTS_CAPABILITIES, AGREEMENT_TERMS_PARAMS, AGREEMENT_VERB_CAPABILITIES, LISTING_DOOR_CAPABILITIES, CONTEXT_GRANT_SCOPE_KINDS, contextReadCapability, openCapability, accessExplainCapability, contextExpandReachCapability, contextDiscoverGrantableCapability, recordArtifactCapability, listArtifactsCapability, findArtifactsCapability,
|
|
5
|
+
import { presentResourceActions, getAgreement, getMyAgreements, respondToAgreement, revokeAgreement, counterAgreement, fulfillAgreement, ConnectionsClient, ContextReadClient, GrantsClient, InboxClient, SessionsClient, AssistantConnectionClient, createTask, updateTaskState, acknowledgeTaskControl, replaceTaskPlan, updateTaskPlanSteps, listTasks, getTask, getBackendUrl, fetchMyOrgs, fetchSessionAccess, isMcpOAuthDelegateSession, GRANTS_CAPABILITIES, BUCKET_CAPABILITIES, AGREEMENT_TERMS_PARAMS, AGREEMENT_VERB_CAPABILITIES, LISTING_DOOR_CAPABILITIES, CONTEXT_GRANT_SCOPE_KINDS, contextReadCapability, openCapability, accessExplainCapability, contextExpandReachCapability, contextDiscoverGrantableCapability, recordArtifactCapability, listArtifactsCapability, findArtifactsCapability, attachArtifactCapability, reviewArtifactContributionCapability, contributeArtifactCapability, uploadArtifactUrlCapability, completeArtifactFileCapability, downloadArtifactCapability, connectionProxyCapability, requestConnectionCapability, agreementClaimCapability, agreementSubcontractCapability, listTasksCapability, cancelTaskCapability, delegateTaskCapability, marketplaceViewCapability, parseListFields, pickListedRows, listedFieldNote, sessionOrientation, presentTaskOutcome, explainRefusedRead, RESOURCE_HIDDEN_MESSAGE, SOURCES_DESCRIPTION, } from '@ziggs-ai/api-client';
|
|
6
6
|
import { decodeOperatorKeyClaims } from './operatorKey.js';
|
|
7
7
|
import { registerTrustTools } from './trustTools.js';
|
|
8
8
|
import { registerPaymentTools } from './paymentTools.js';
|
|
@@ -801,6 +801,9 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
801
801
|
}
|
|
802
802
|
});
|
|
803
803
|
registerCapabilities(server, GRANTS_CAPABILITIES, creds);
|
|
804
|
+
// Buckets: compact door only until runs work in buckets; the directory
|
|
805
|
+
// allow-list leaves them out.
|
|
806
|
+
registerCapabilities(server, BUCKET_CAPABILITIES, creds);
|
|
804
807
|
registerCapability(server, contextExpandReachCapability, creds);
|
|
805
808
|
registerCapability(server, contextDiscoverGrantableCapability, creds);
|
|
806
809
|
registerCapability(server, openCapability, creds);
|
|
@@ -827,7 +830,6 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
827
830
|
// question and carries its own honesty: what it searched, and what it could
|
|
828
831
|
// not.
|
|
829
832
|
registerCapability(server, findArtifactsCapability, creds);
|
|
830
|
-
registerCapability(server, shareArtifactCapability, creds);
|
|
831
833
|
registerCapability(server, attachArtifactCapability, creds);
|
|
832
834
|
registerCapability(server, reviewArtifactContributionCapability, creds);
|
|
833
835
|
registerCapability(server, contributeArtifactCapability, creds);
|
package/dist/trustTools.d.ts
CHANGED
|
@@ -5,6 +5,6 @@ import type { ZiggsMcpConfig } from './config.js';
|
|
|
5
5
|
* The SDK-twin tools (search/get, links, delegate) come from the shared
|
|
6
6
|
* capability layer; only revoking a grant stays MCP-local. Issuing one is a
|
|
7
7
|
* person's act (POST /context/grants takes a signed-in session), so there is
|
|
8
|
-
* no agent tool for it: an
|
|
9
|
-
*
|
|
8
|
+
* no agent tool for it: an artifact reaches people through a bucket, and an
|
|
9
|
+
* agent passes on a slice of its own grant with context_delegate. */
|
|
10
10
|
export declare function registerTrustTools(server: McpServer, creds: Creds, cfg?: ZiggsMcpConfig): void;
|
package/dist/trustTools.js
CHANGED
|
@@ -9,8 +9,8 @@ const DEFAULT_WEB_URL = 'https://ziggsai.com';
|
|
|
9
9
|
* The SDK-twin tools (search/get, links, delegate) come from the shared
|
|
10
10
|
* capability layer; only revoking a grant stays MCP-local. Issuing one is a
|
|
11
11
|
* person's act (POST /context/grants takes a signed-in session), so there is
|
|
12
|
-
* no agent tool for it: an
|
|
13
|
-
*
|
|
12
|
+
* no agent tool for it: an artifact reaches people through a bucket, and an
|
|
13
|
+
* agent passes on a slice of its own grant with context_delegate. */
|
|
14
14
|
export function registerTrustTools(server, creds, cfg) {
|
|
15
15
|
const webUrl = cfg?.ZIGGS_WEB_URL?.replace(/\/$/, '') ?? DEFAULT_WEB_URL;
|
|
16
16
|
registerCapabilities(server, DISCOVERY_CAPABILITIES, creds);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ziggs-ai/ziggs-mcp",
|
|
3
|
-
"version": "0.41.
|
|
3
|
+
"version": "0.41.7",
|
|
4
4
|
"description": "MCP server for Claude Code, Cursor, and other MCP hosts — act as your Ziggs delegate agent",
|
|
5
5
|
"homepage": "https://ziggsai.com/docs",
|
|
6
6
|
"bugs": {
|
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
54
|
-
"@ziggs-ai/api-client": "0.40.
|
|
54
|
+
"@ziggs-ai/api-client": "0.40.6",
|
|
55
55
|
"dotenv": "^16.6.1",
|
|
56
56
|
"zod": "^3.24.2",
|
|
57
57
|
"zod-to-json-schema": "^3.25.1"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@ziggs-ai/agent-sdk": "0.46.
|
|
60
|
+
"@ziggs-ai/agent-sdk": "0.46.4"
|
|
61
61
|
},
|
|
62
62
|
"engines": {
|
|
63
63
|
"node": ">=20"
|
|
@@ -56,7 +56,7 @@ counterparty owner approves it, and unpublished delegates can then reach each ot
|
|
|
56
56
|
3. Target human approves via **`ziggs_agreement_respond`** (action `approve`) when the
|
|
57
57
|
pending link agreement shows in their inbox / `ziggs_link_list`. This is the same generic
|
|
58
58
|
approval tool used for hire and service proposals: there is no separate link-response tool.
|
|
59
|
-
4. **`ziggs_message_send`** with explicit readers, delivery recipients and any requested answer. To
|
|
59
|
+
4. **`ziggs_message_send`** with explicit readers, delivery recipients and any requested answer. To give someone an artifact, add it to a bucket with them (**`ziggs_bucket_insert`**, or **`ziggs_bucket_create`** with items); use **`ziggs_context_delegate`** for a bounded slice of a grant you hold. Contact, sharing and work remain separate operations.
|
|
60
60
|
5. To read their context, they grant it or you ask with **`ziggs_access_request`**.
|
|
61
61
|
6. `ziggs_context_revoke_grant` when context access should end; **`ziggs_agreement_revoke`** when
|
|
62
62
|
the agreement should end (any kind: hire, service, request, offer, or link).
|
|
@@ -83,4 +83,4 @@ which workspace it is, and call `ziggs_introduction_redeem` with `confirm: true`
|
|
|
83
83
|
## Web UI (Settings → Connections)
|
|
84
84
|
|
|
85
85
|
Confusingly named after the *other* "connection" (this is the agent-link handshake UI, not
|
|
86
|
-
`ziggs_connection_proxy` third-party connections). After an agent link appears under **Connected**, use your Claude delegate (MCP) for **`ziggs_message_send`**,
|
|
86
|
+
`ziggs_connection_proxy` third-party connections). After an agent link appears under **Connected**, use your Claude delegate (MCP) for **`ziggs_message_send`**, a bucket with them, or **`ziggs_context_delegate`**. The web UI manages handshake only, not chat or context grants.
|