@ziggs-ai/ziggs-mcp 0.22.2 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/protocol/delegateProtocol.d.ts +1 -1
- package/dist/protocol/delegateProtocol.js +1 -1
- package/dist/surface.d.ts +1 -0
- package/dist/surface.js +4 -2
- package/dist/toolAliases.js +3 -0
- package/dist/tools.js +28 -6
- package/package.json +2 -2
- package/skills/ziggs/.cursorrules +1 -1
- package/skills/ziggs/SKILL.md +1 -1
- package/skills/ziggs/references/inbox-rhythm.md +1 -1
- package/skills/ziggs/references/reporting-convention.md +1 -1
|
@@ -34,7 +34,7 @@ export declare const PROTOCOL: {
|
|
|
34
34
|
readonly ack: "Reading never advances the watermark; once you have handled what an envelope carried, hand it back with ziggs_inbox_ack — pass its `ackTo` VERBATIM (it is opaque — never construct or edit one) together with `handledResourceIds` for every delivery ASSIGNED to you (assigneeId = you; requests too) in that window. Rows without your stamp are context another window handles — read them, never ack them as yours.";
|
|
35
35
|
readonly neverRewind: "Never rewind an ack to an older value.";
|
|
36
36
|
/** Tasks are the unit of work. */
|
|
37
|
-
readonly task: "Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).";
|
|
37
|
+
readonly task: "Honor task.control when opening work or handling a task change. For pause or stop, stop starting actions for that task, settle in-flight work, then call ziggs_task_acknowledge_control with its current requestId and supported=true. If you cannot honor it, report supported=false. Never attest that another runtime stopped. Continue unrelated conversation and tasks. Resume allows this task to run again. Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).";
|
|
38
38
|
/**
|
|
39
39
|
* Hire-room brief is a self work order. No new worker protocol, no wake
|
|
40
40
|
* store, no blocked state. Waiting-on-person is a receipt. A held graph
|
|
@@ -34,7 +34,7 @@ export const PROTOCOL = {
|
|
|
34
34
|
ack: 'Reading never advances the watermark; once you have handled what an envelope carried, hand it back with ziggs_inbox_ack — pass its `ackTo` VERBATIM (it is opaque — never construct or edit one) together with `handledResourceIds` for every delivery ASSIGNED to you (assigneeId = you; requests too) in that window. Rows without your stamp are context another window handles — read them, never ack them as yours.',
|
|
35
35
|
neverRewind: 'Never rewind an ack to an older value.',
|
|
36
36
|
/** Tasks are the unit of work. */
|
|
37
|
-
task: 'Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).',
|
|
37
|
+
task: 'Honor task.control when opening work or handling a task change. For pause or stop, stop starting actions for that task, settle in-flight work, then call ziggs_task_acknowledge_control with its current requestId and supported=true. If you cannot honor it, report supported=false. Never attest that another runtime stopped. Continue unrelated conversation and tasks. Resume allows this task to run again. Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).',
|
|
38
38
|
/**
|
|
39
39
|
* Hire-room brief is a self work order. No new worker protocol, no wake
|
|
40
40
|
* store, no blocked state. Waiting-on-person is a receipt. A held graph
|
package/dist/surface.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { type CatalogEntry } from './toolCatalog.js';
|
|
|
14
14
|
* - `ziggs_open` is how it opens a returned artifact/chat/task/agreement id.
|
|
15
15
|
* The inbox returns references, never content; `readPlan` names this tool
|
|
16
16
|
* with the ordinary id. `ziggs_context_read` remains the paged/via listing.
|
|
17
|
+
* - `ziggs_chat_open` starts or reuses contact; an absent room is not a refusal.
|
|
17
18
|
* - `ziggs_chat_send` and `ziggs_task_set_result` are the two ways to answer:
|
|
18
19
|
* conversation, and finished work. An agent that can read its mail and
|
|
19
20
|
* cannot reply is worse off than one that pays for a schema it never used.
|
package/dist/surface.js
CHANGED
|
@@ -20,6 +20,7 @@ import { catalogEntry, catalogFor, catalogRow, describeEntry, removeCatalogEntry
|
|
|
20
20
|
* - `ziggs_open` is how it opens a returned artifact/chat/task/agreement id.
|
|
21
21
|
* The inbox returns references, never content; `readPlan` names this tool
|
|
22
22
|
* with the ordinary id. `ziggs_context_read` remains the paged/via listing.
|
|
23
|
+
* - `ziggs_chat_open` starts or reuses contact; an absent room is not a refusal.
|
|
23
24
|
* - `ziggs_chat_send` and `ziggs_task_set_result` are the two ways to answer:
|
|
24
25
|
* conversation, and finished work. An agent that can read its mail and
|
|
25
26
|
* cannot reply is worse off than one that pays for a schema it never used.
|
|
@@ -40,6 +41,7 @@ export const NATIVE_TOOLS = [
|
|
|
40
41
|
'ziggs_inbox_ack',
|
|
41
42
|
'ziggs_open',
|
|
42
43
|
'ziggs_context_read',
|
|
44
|
+
'ziggs_chat_open',
|
|
43
45
|
'ziggs_chat_send',
|
|
44
46
|
'ziggs_task_set_result',
|
|
45
47
|
// And every irreversible tool — see DESTRUCTIVE_STAY_NATIVE below.
|
|
@@ -98,7 +100,7 @@ const ZIGGS_API = 'the Ziggs API (https://api.ziggsai.com, reference at https://
|
|
|
98
100
|
const TOOLS_DESCRIPTION = 'Every Ziggs tool that exists: name plus one line, for the whole surface. ' +
|
|
99
101
|
'A handful of everyday tools are already loaded natively; the rest live here. Each row says whether the tool is read-only, whether the host already holds it (`native`), and how to call it (`call`). ' +
|
|
100
102
|
'Pass `describe` with one or more tool names to get their full descriptions, input schemas, and the same `call` line — do that before calling a tool you have not used in this session, so you pass the right arguments. ' +
|
|
101
|
-
'Pass `search` to filter
|
|
103
|
+
'Pass `search` to filter by name, title, or common intent (e.g. "contact", "permission", "grant", "artifact"). If a narrow search misses what you need, omit search to see the complete catalog. ' +
|
|
102
104
|
'Nothing is hidden: if a capability exists, its name is in this list.';
|
|
103
105
|
const TOOL_READ_DESCRIPTION = `Call a read-only Ziggs tool by name, against ${ZIGGS_API}. ` +
|
|
104
106
|
'This reaches every read-only tool ziggs_tools lists, native or not. It never changes anything: a tool that writes is refused here and pointed at ziggs_tool_write. ' +
|
|
@@ -250,7 +252,7 @@ export function applySurfacePolicy(server) {
|
|
|
250
252
|
search: z
|
|
251
253
|
.string()
|
|
252
254
|
.optional()
|
|
253
|
-
.describe('
|
|
255
|
+
.describe('Filter tools by name, title, or common intent such as contact, teammate, permission, or grant. Omit to list every tool.'),
|
|
254
256
|
}, readOnly('List every Ziggs tool'), async ({ describe, search }) => {
|
|
255
257
|
try {
|
|
256
258
|
if (describe?.length) {
|
package/dist/toolAliases.js
CHANGED
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
* nothing.
|
|
24
24
|
*/
|
|
25
25
|
export const SEARCH_ALIASES = {
|
|
26
|
+
ziggs_chat_open: ['contact', 'teammate', 'colleague', 'start conversation', 'create chat', 'message someone'],
|
|
27
|
+
ziggs_agent_search: ['teammate', 'colleague', 'directory', 'find person'],
|
|
28
|
+
ziggs_context_request: ['grant', 'permission', 'restricted', 'request access', 'unlock document'],
|
|
26
29
|
ziggs_agreement_buy: [
|
|
27
30
|
'hire',
|
|
28
31
|
'commission', // retired name
|
package/dist/tools.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { getAgreement, getMyAgreements, listMyChats, respondToAgreement, revokeAgreement, counterAgreement, fulfillAgreement, sendChatMessage, ConnectionsClient, PaymentsClient, ContextReadClient, GrantsClient, InboxClient, createTask, updateTaskState, replaceTaskPlan, updateTaskPlanSteps, listTasks, getTask, getBackendUrl, fetchMyOrgs, fetchSessionAccess, isMcpOAuthDelegateSession, GRANTS_CAPABILITIES, AGREEMENT_VERB_CAPABILITIES, CONTEXT_GRANT_SCOPE_KINDS, contextReadCapability, openCapability, accessExplainCapability, contextExpandReachCapability, contextDiscoverGrantableCapability, recordArtifactCapability, listArtifactsCapability, findArtifactsCapability, shareArtifactCapability, attachArtifactCapability, uploadArtifactUrlCapability, completeArtifactFileCapability, downloadArtifactCapability, openConversationCapability, connectionProxyCapability, requestConnectionCapability, agreementClaimCapability, agreementSubcontractCapability, listTasksCapability, cancelTaskCapability, marketplaceViewCapability, parseListFields, pickListedRows, projectChatListRows, sessionOrientation, presentSendResult, presentTaskOutcome, } from '@ziggs-ai/api-client';
|
|
3
|
+
import { getAgreement, getMyAgreements, listMyChats, respondToAgreement, revokeAgreement, counterAgreement, fulfillAgreement, sendChatMessage, ConnectionsClient, PaymentsClient, ContextReadClient, GrantsClient, InboxClient, createTask, updateTaskState, acknowledgeTaskControl, replaceTaskPlan, updateTaskPlanSteps, listTasks, getTask, getBackendUrl, fetchMyOrgs, fetchSessionAccess, isMcpOAuthDelegateSession, GRANTS_CAPABILITIES, AGREEMENT_VERB_CAPABILITIES, CONTEXT_GRANT_SCOPE_KINDS, contextReadCapability, openCapability, accessExplainCapability, contextExpandReachCapability, contextDiscoverGrantableCapability, recordArtifactCapability, listArtifactsCapability, findArtifactsCapability, shareArtifactCapability, attachArtifactCapability, uploadArtifactUrlCapability, completeArtifactFileCapability, downloadArtifactCapability, openConversationCapability, connectionProxyCapability, requestConnectionCapability, agreementClaimCapability, agreementSubcontractCapability, listTasksCapability, cancelTaskCapability, marketplaceViewCapability, parseListFields, pickListedRows, projectChatListRows, sessionOrientation, presentSendResult, presentTaskOutcome, } from '@ziggs-ai/api-client';
|
|
4
4
|
import { decodeOperatorKeyClaims } from './operatorKey.js';
|
|
5
5
|
import { registerTrustTools } from './trustTools.js';
|
|
6
6
|
import { registerPaymentTools } from './paymentTools.js';
|
|
@@ -347,21 +347,28 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
347
347
|
}
|
|
348
348
|
});
|
|
349
349
|
}
|
|
350
|
-
registerStrictTool(server, 'ziggs_context_snapshot', '
|
|
351
|
-
chatId: z.string().describe('Chat id
|
|
350
|
+
registerStrictTool(server, 'ziggs_context_snapshot', 'Read the exact work context from a task, agreement, or scoped chat: trigger, governing ancestors, direct dependencies, and bounded history/artifact inventory. Follow required expansion references before dependent work. Page scoped messages with the returned cursor and agreementId.', {
|
|
351
|
+
chatId: z.string().optional().describe('Chat id for conversation history'),
|
|
352
|
+
taskId: z.string().optional().describe('Exact task to load bottom-up, without a chat'),
|
|
353
|
+
agreementId: z.string().optional().describe('Exact agreement scope; required if no task or chat is named'),
|
|
354
|
+
messageId: z.string().optional().describe('Exact incoming message that determines the work scope'),
|
|
355
|
+
artifactId: z.string().optional().describe('Exact triggering artifact to include alongside the work context'),
|
|
352
356
|
maxMessages: z.number().optional().describe('Optional message history cap'),
|
|
353
357
|
contextGrantId: z
|
|
354
358
|
.string()
|
|
355
359
|
.optional()
|
|
356
360
|
.describe('Optional grant id when reading under a context grant'),
|
|
357
|
-
}, readOnly('Catch up on a chat'), async ({ chatId, maxMessages, contextGrantId }) => {
|
|
361
|
+
}, readOnly('Catch up on a chat'), async ({ chatId, taskId, agreementId, messageId, artifactId, maxMessages, contextGrantId }) => {
|
|
358
362
|
try {
|
|
363
|
+
if (!chatId && !taskId && !agreementId)
|
|
364
|
+
throw new Error('Name a taskId, agreementId, or chatId');
|
|
359
365
|
// The chat being read IS the lane: a snapshot of someone else's room
|
|
360
366
|
// is a call inside that engagement, and stating it is what lets a hired
|
|
361
367
|
// delegate read the room it was hired into. Falls back to the
|
|
362
368
|
// connection's lane when no chat is named.
|
|
363
369
|
const client = new ContextReadClient(creds.operatorKey, creds.agentId, undefined, chatId || creds.laneId);
|
|
364
|
-
const result = await client.snapshot(chatId
|
|
370
|
+
const result = await client.snapshot(chatId ?? `agrn-${agreementId ?? taskId}`, {
|
|
371
|
+
taskId, agreementId, messageId, artifactId,
|
|
365
372
|
maxMessages,
|
|
366
373
|
contextGrantId,
|
|
367
374
|
});
|
|
@@ -422,6 +429,7 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
422
429
|
return textResult({
|
|
423
430
|
count: chats.length,
|
|
424
431
|
chats: projectChatListRows(chats, fields),
|
|
432
|
+
note: 'These are existing rooms, not everyone you can contact. To contact a known person or agent, use ziggs_chat_open with their returned participant id; use ziggs_agent_search to find a teammate by name. The server checks whether contact is allowed. No existing room does not mean contact is forbidden.',
|
|
425
433
|
});
|
|
426
434
|
}
|
|
427
435
|
catch (e) {
|
|
@@ -442,6 +450,9 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
442
450
|
.string()
|
|
443
451
|
.optional()
|
|
444
452
|
.describe("Receiver id for the message. Prefer a real user/agent id when you have one. Cross-org masked counterparties arrive as opaque `rpb_*` refs — echo that same ref back here; the backend resolves it in-room (do not look it up, wake, or pay against it). Optional: with exactly one other participant the recipient is inferred; a same-room reply can take the last other writer. Several participants and no last writer is a refusal that names the destinations — never a silent broadcast. A named receiver must already hold write here; naming somebody is not how they get in. Pass 'human' to broadcast to the people in the room."),
|
|
453
|
+
conversationAgreementId: z.string().optional().describe('Agreement authorizing this service message; select explicitly when several agreements share a room.'),
|
|
454
|
+
taskId: z.string().optional().describe('Task being discussed; its agreement determines this message’s work scope.'),
|
|
455
|
+
replyToMessageId: z.string().optional().describe('Exact message being answered; its agreement must match any selected task or agreement.'),
|
|
445
456
|
text: z.string(),
|
|
446
457
|
entryType: z
|
|
447
458
|
.string()
|
|
@@ -451,7 +462,7 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
451
462
|
.string()
|
|
452
463
|
.optional()
|
|
453
464
|
.describe('Retry-safe key. Reuse the SAME key when re-sending the SAME logical message (e.g. after a network error/timeout) so it is stored and delivered exactly once — the backend dedupes on chatId + messageId. Use a fresh key (or omit) for a genuinely new message.'),
|
|
454
|
-
}, write('Send a chat message'), async ({ chatId, to, receiverId, text, entryType, idempotencyKey }) => {
|
|
465
|
+
}, write('Send a chat message'), async ({ chatId, to, receiverId, text, entryType, idempotencyKey, conversationAgreementId, taskId, replyToMessageId }) => {
|
|
455
466
|
try {
|
|
456
467
|
const roomId = typeof chatId === 'string' ? chatId.trim() : '';
|
|
457
468
|
const personId = typeof to === 'string' ? to.trim() : '';
|
|
@@ -472,6 +483,9 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
472
483
|
messageId: idempotencyKey
|
|
473
484
|
? `mcp_idem_${idempotencyKey}`
|
|
474
485
|
: `mcp_${randomUUID()}`,
|
|
486
|
+
conversationAgreementId,
|
|
487
|
+
taskId,
|
|
488
|
+
replyToMessageId,
|
|
475
489
|
entryType: entryType ?? 'message',
|
|
476
490
|
contentType: 'text',
|
|
477
491
|
}, creds);
|
|
@@ -1030,6 +1044,14 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
1030
1044
|
return toolError(e);
|
|
1031
1045
|
}
|
|
1032
1046
|
});
|
|
1047
|
+
registerStrictTool(server, 'ziggs_task_acknowledge_control', 'Acknowledge the current task control after stopping new work and settling in-flight actions. Read control.requestId with ziggs_task_get. Pause holds only this task; Stop has already cancelled it. Use supported=false if you cannot honor it. Resume permits a new execution; it does not undo completed actions. Only the executor or its authorized reply delegate can attest. Never acknowledge another runtime on its behalf.', { taskId: z.string(), requestId: z.string().uuid(), supported: z.boolean() }, write('Acknowledge task execution control'), async ({ taskId, requestId, supported }) => {
|
|
1048
|
+
try {
|
|
1049
|
+
return textResult(await acknowledgeTaskControl(taskId, requestId, supported, creds));
|
|
1050
|
+
}
|
|
1051
|
+
catch (error) {
|
|
1052
|
+
return toolError(error);
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1033
1055
|
registerCapability(server, listTasksCapability, creds);
|
|
1034
1056
|
registerCapability(server, cancelTaskCapability, creds);
|
|
1035
1057
|
registerStrictTool(server, 'ziggs_task_get', 'Fetch a single task by id (GET /tasks/:id). Use this when a human hands you a taskId directly (e.g. "work on task_…") so you can read the work-order — its description, plan, assignee, state, and result — before acting. Same operator-key scope as ziggs_task_list; pairs with ziggs_task_set_result to close the task.', { taskId: z.string() }, readOnly('Read one task'), async ({ taskId }) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ziggs-ai/ziggs-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "MCP server for Claude Code, Cursor, and other MCP hosts — act as your Ziggs delegate agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
42
|
-
"@ziggs-ai/api-client": "0.
|
|
42
|
+
"@ziggs-ai/api-client": "0.23.0",
|
|
43
43
|
"dotenv": "^16.6.1",
|
|
44
44
|
"zod": "^3.24.2",
|
|
45
45
|
"zod-to-json-schema": "^3.25.1"
|
|
@@ -6,7 +6,7 @@ You are a delegate agent on a Ziggs team. The MCP tools are the connection; oper
|
|
|
6
6
|
- Only the everyday tools are loaded; the rest of the surface is one call away. ziggs_tools lists every tool that exists (name + one line, whether it is read-only, whether the host already holds it, and how to call it), ziggs_tools describe=["<name>"] returns its full schema and a call line, ziggs_tool_read and ziggs_tool_write reach every reversible tool by name — native or not — and irreversible tools are called by their own name only. Nothing is hidden: check ziggs_tools before concluding a capability is missing.
|
|
7
7
|
- Flow: inbox → read → act → ack.
|
|
8
8
|
- Reading never advances the watermark; once you have handled what an envelope carried, hand it back with ziggs_inbox_ack — pass its `ackTo` VERBATIM (it is opaque — never construct or edit one) together with `handledResourceIds` for every delivery ASSIGNED to you (assigneeId = you; requests too) in that window. Rows without your stamp are context another window handles — read them, never ack them as yours. Never rewind an ack to an older value.
|
|
9
|
-
- Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
9
|
+
- Honor task.control when opening work or handling a task change. For pause or stop, stop starting actions for that task, settle in-flight work, then call ziggs_task_acknowledge_control with its current requestId and supported=true. If you cannot honor it, report supported=false. Never attest that another runtime stopped. Continue unrelated conversation and tasks. Resume allows this task to run again. Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
10
10
|
- A brief from the principal in a hire room is a work order: create a task on yourself under that agreement (ziggs_task_create). A stranger's brief still gets a drafted agreement, not a task. Do not invent worker_next, a wake store, or a blocked task state. Waiting-on-person is a receipt. A held graph is not your work until dependencies release; failed or cancelled deps are not inputs. Withdraw a held graph by cancelling the root (ziggs_task_cancel). A live hire does not take a second hire or an in-place amend.
|
|
11
11
|
- Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a request (ziggs_agreement_request) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_buy when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected. LINK proposals (connect requests) are the exception to claim-only: they carry draft terms and are always negotiable — counter freely; the humans sign the final shape.
|
|
12
12
|
- Deliver finished work where the parties agreed it goes: in chat, as a task result, or as an artifact. When the work rides a task, close it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }) too, because an agent picking the work up from its own inbox reads that result and not the conversation. A PERSON reads it in the working conversation you already have with them — send it there as well, and only there; the result record is for the next agent, not for them. Record heavy deliverables as artifacts (ziggs_artifact_record, contentType result, taskId to bind it) rather than pasting them into a message.
|
package/skills/ziggs/SKILL.md
CHANGED
|
@@ -25,7 +25,7 @@ _You are a delegate agent on a Ziggs team. The MCP tools are the connection; ope
|
|
|
25
25
|
- Only the everyday tools are loaded; the rest of the surface is one call away. ziggs_tools lists every tool that exists (name + one line, whether it is read-only, whether the host already holds it, and how to call it), ziggs_tools describe=["<name>"] returns its full schema and a call line, ziggs_tool_read and ziggs_tool_write reach every reversible tool by name — native or not — and irreversible tools are called by their own name only. Nothing is hidden: check ziggs_tools before concluding a capability is missing.
|
|
26
26
|
- Flow: inbox → read → act → ack.
|
|
27
27
|
- Reading never advances the watermark; once you have handled what an envelope carried, hand it back with ziggs_inbox_ack — pass its `ackTo` VERBATIM (it is opaque — never construct or edit one) together with `handledResourceIds` for every delivery ASSIGNED to you (assigneeId = you; requests too) in that window. Rows without your stamp are context another window handles — read them, never ack them as yours. Never rewind an ack to an older value.
|
|
28
|
-
- Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
28
|
+
- Honor task.control when opening work or handling a task change. For pause or stop, stop starting actions for that task, settle in-flight work, then call ziggs_task_acknowledge_control with its current requestId and supported=true. If you cannot honor it, report supported=false. Never attest that another runtime stopped. Continue unrelated conversation and tasks. Resume allows this task to run again. Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
29
29
|
- A brief from the principal in a hire room is a work order: create a task on yourself under that agreement (ziggs_task_create). A stranger's brief still gets a drafted agreement, not a task. Do not invent worker_next, a wake store, or a blocked task state. Waiting-on-person is a receipt. A held graph is not your work until dependencies release; failed or cancelled deps are not inputs. Withdraw a held graph by cancelling the root (ziggs_task_cancel). A live hire does not take a second hire or an in-place amend.
|
|
30
30
|
- Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a request (ziggs_agreement_request) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_buy when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected. LINK proposals (connect requests) are the exception to claim-only: they carry draft terms and are always negotiable — counter freely; the humans sign the final shape.
|
|
31
31
|
- Deliver finished work where the parties agreed it goes: in chat, as a task result, or as an artifact. When the work rides a task, close it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }) too, because an agent picking the work up from its own inbox reads that result and not the conversation. A PERSON reads it in the working conversation you already have with them — send it there as well, and only there; the result record is for the next agent, not for them. Record heavy deliverables as artifacts (ziggs_artifact_record, contentType result, taskId to bind it) rather than pasting them into a message.
|
|
@@ -8,7 +8,7 @@ _You are a delegate agent on a Ziggs team. The MCP tools are the connection; ope
|
|
|
8
8
|
- Only the everyday tools are loaded; the rest of the surface is one call away. ziggs_tools lists every tool that exists (name + one line, whether it is read-only, whether the host already holds it, and how to call it), ziggs_tools describe=["<name>"] returns its full schema and a call line, ziggs_tool_read and ziggs_tool_write reach every reversible tool by name — native or not — and irreversible tools are called by their own name only. Nothing is hidden: check ziggs_tools before concluding a capability is missing.
|
|
9
9
|
- Flow: inbox → read → act → ack.
|
|
10
10
|
- Reading never advances the watermark; once you have handled what an envelope carried, hand it back with ziggs_inbox_ack — pass its `ackTo` VERBATIM (it is opaque — never construct or edit one) together with `handledResourceIds` for every delivery ASSIGNED to you (assigneeId = you; requests too) in that window. Rows without your stamp are context another window handles — read them, never ack them as yours. Never rewind an ack to an older value.
|
|
11
|
-
- Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
11
|
+
- Honor task.control when opening work or handling a task change. For pause or stop, stop starting actions for that task, settle in-flight work, then call ziggs_task_acknowledge_control with its current requestId and supported=true. If you cannot honor it, report supported=false. Never attest that another runtime stopped. Continue unrelated conversation and tasks. Resume allows this task to run again. Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
12
12
|
- A brief from the principal in a hire room is a work order: create a task on yourself under that agreement (ziggs_task_create). A stranger's brief still gets a drafted agreement, not a task. Do not invent worker_next, a wake store, or a blocked task state. Waiting-on-person is a receipt. A held graph is not your work until dependencies release; failed or cancelled deps are not inputs. Withdraw a held graph by cancelling the root (ziggs_task_cancel). A live hire does not take a second hire or an in-place amend.
|
|
13
13
|
- Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a request (ziggs_agreement_request) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_buy when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected. LINK proposals (connect requests) are the exception to claim-only: they carry draft terms and are always negotiable — counter freely; the humans sign the final shape.
|
|
14
14
|
- Deliver finished work where the parties agreed it goes: in chat, as a task result, or as an artifact. When the work rides a task, close it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }) too, because an agent picking the work up from its own inbox reads that result and not the conversation. A PERSON reads it in the working conversation you already have with them — send it there as well, and only there; the result record is for the next agent, not for them. Record heavy deliverables as artifacts (ziggs_artifact_record, contentType result, taskId to bind it) rather than pasting them into a message.
|
|
@@ -8,7 +8,7 @@ _You are a delegate agent on a Ziggs team. The MCP tools are the connection; ope
|
|
|
8
8
|
- Only the everyday tools are loaded; the rest of the surface is one call away. ziggs_tools lists every tool that exists (name + one line, whether it is read-only, whether the host already holds it, and how to call it), ziggs_tools describe=["<name>"] returns its full schema and a call line, ziggs_tool_read and ziggs_tool_write reach every reversible tool by name — native or not — and irreversible tools are called by their own name only. Nothing is hidden: check ziggs_tools before concluding a capability is missing.
|
|
9
9
|
- Flow: inbox → read → act → ack.
|
|
10
10
|
- Reading never advances the watermark; once you have handled what an envelope carried, hand it back with ziggs_inbox_ack — pass its `ackTo` VERBATIM (it is opaque — never construct or edit one) together with `handledResourceIds` for every delivery ASSIGNED to you (assigneeId = you; requests too) in that window. Rows without your stamp are context another window handles — read them, never ack them as yours. Never rewind an ack to an older value.
|
|
11
|
-
- Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
11
|
+
- Honor task.control when opening work or handling a task change. For pause or stop, stop starting actions for that task, settle in-flight work, then call ziggs_task_acknowledge_control with its current requestId and supported=true. If you cannot honor it, report supported=false. Never attest that another runtime stopped. Continue unrelated conversation and tasks. Resume allows this task to run again. Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress by naming the steps that changed with ziggs_task_update_steps. Restructure the checklist with ziggs_task_replace_plan (full list).
|
|
12
12
|
- A brief from the principal in a hire room is a work order: create a task on yourself under that agreement (ziggs_task_create). A stranger's brief still gets a drafted agreement, not a task. Do not invent worker_next, a wake store, or a blocked task state. Waiting-on-person is a receipt. A held graph is not your work until dependencies release; failed or cancelled deps are not inputs. Withdraw a held graph by cancelling the root (ziggs_task_cancel). A live hire does not take a second hire or an in-place amend.
|
|
13
13
|
- Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a request (ziggs_agreement_request) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_buy when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected. LINK proposals (connect requests) are the exception to claim-only: they carry draft terms and are always negotiable — counter freely; the humans sign the final shape.
|
|
14
14
|
- Deliver finished work where the parties agreed it goes: in chat, as a task result, or as an artifact. When the work rides a task, close it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }) too, because an agent picking the work up from its own inbox reads that result and not the conversation. A PERSON reads it in the working conversation you already have with them — send it there as well, and only there; the result record is for the next agent, not for them. Record heavy deliverables as artifacts (ziggs_artifact_record, contentType result, taskId to bind it) rather than pasting them into a message.
|