@ziggs-ai/agent-sdk 0.1.12 → 0.2.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.
Files changed (218) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +41 -2
  3. package/dist/AgentHost.d.ts +201 -0
  4. package/dist/AgentHost.js +652 -0
  5. package/dist/adapters/AnthropicAdapter.d.ts +39 -0
  6. package/dist/adapters/AnthropicAdapter.js +200 -0
  7. package/dist/adapters/McpAdapter.d.ts +199 -0
  8. package/dist/adapters/McpAdapter.js +468 -0
  9. package/dist/adapters/OpenAIAdapter.d.ts +26 -0
  10. package/dist/adapters/OpenAIAdapter.js +158 -0
  11. package/dist/adapters/index.js +2 -0
  12. package/dist/agent/Agent.d.ts +78 -0
  13. package/dist/agent/Agent.js +58 -0
  14. package/dist/agent/ClaudeSdkAgent.d.ts +38 -0
  15. package/dist/agent/ClaudeSdkAgent.js +322 -0
  16. package/dist/agent/claudeCognition.d.ts +67 -0
  17. package/dist/agent/claudeCognition.js +103 -0
  18. package/dist/agent/claudeSdkProtocol.d.ts +11 -0
  19. package/dist/agent/claudeSdkTools.d.ts +19 -0
  20. package/dist/agent/claudeSdkTools.js +57 -0
  21. package/dist/agent/hostedAgentConnection.d.ts +15 -0
  22. package/dist/agent/hostedAgentConnection.js +29 -0
  23. package/dist/agent/toolManagerToSdkMcp.d.ts +12 -0
  24. package/dist/agent/toolManagerToSdkMcp.js +123 -0
  25. package/dist/brain/index.d.ts +50 -0
  26. package/dist/brain/index.js +45 -0
  27. package/dist/cognition/validateContext.d.ts +11 -0
  28. package/dist/cognition/validateContext.js +117 -0
  29. package/dist/context/applyEffects.d.ts +2 -0
  30. package/dist/context/applyEffects.js +89 -0
  31. package/dist/context/batch.d.ts +2 -0
  32. package/dist/context/batch.js +18 -0
  33. package/dist/context/classifyEnvelope.d.ts +1 -0
  34. package/dist/context/classifyEnvelope.js +58 -0
  35. package/dist/context/routingLabels.d.ts +4 -0
  36. package/dist/context/routingLabels.js +48 -0
  37. package/dist/defineAgent.d.ts +14 -0
  38. package/dist/defineAgent.js +68 -0
  39. package/dist/formatters/AgreementFormatter.d.ts +18 -0
  40. package/dist/formatters/AgreementFormatter.js +130 -0
  41. package/dist/formatters/HistoryFormatter.d.ts +26 -0
  42. package/dist/formatters/HistoryFormatter.js +173 -0
  43. package/dist/formatters/index.js +2 -0
  44. package/{src/index.ts → dist/index.d.ts} +7 -53
  45. package/dist/index.js +66 -0
  46. package/dist/ingress/normalizeIncoming.d.ts +65 -0
  47. package/dist/ingress/normalizeIncoming.js +88 -0
  48. package/dist/memory/MemoryStore.d.ts +55 -0
  49. package/dist/memory/MemoryStore.js +78 -0
  50. package/dist/pricing/fleetDefaults.d.ts +46 -0
  51. package/dist/pricing/fleetDefaults.js +168 -0
  52. package/dist/pricing/fleetEvalFree.d.ts +7 -0
  53. package/dist/pricing/fleetEvalFree.js +24 -0
  54. package/dist/pricing/fleetFreeTierA.gen.d.ts +6 -0
  55. package/{src/pricing/fleetFreeTierA.gen.ts → dist/pricing/fleetFreeTierA.gen.js} +5 -6
  56. package/dist/pricing/fleetTierByAgentId.gen.d.ts +7 -0
  57. package/dist/pricing/fleetTierByAgentId.gen.js +768 -0
  58. package/dist/runtime/AgentMachine.d.ts +143 -0
  59. package/dist/runtime/AgentMachine.js +400 -0
  60. package/dist/runtime/PromptBuilder.d.ts +96 -0
  61. package/dist/runtime/PromptBuilder.js +439 -0
  62. package/{src/runtime/bootstrapCtx.ts → dist/runtime/bootstrapCtx.d.ts} +1 -22
  63. package/dist/runtime/bootstrapCtx.js +37 -0
  64. package/dist/runtime/buildOutcome.d.ts +68 -0
  65. package/dist/runtime/buildOutcome.js +464 -0
  66. package/dist/runtime/defaults.d.ts +54 -0
  67. package/dist/runtime/defaults.js +47 -0
  68. package/dist/runtime/deriveRespondsToProposals.d.ts +9 -0
  69. package/dist/runtime/deriveRespondsToProposals.js +38 -0
  70. package/dist/runtime/kickoff.d.ts +15 -0
  71. package/dist/runtime/kickoff.js +112 -0
  72. package/dist/runtime/runMechanical.d.ts +25 -0
  73. package/dist/runtime/runMechanical.js +74 -0
  74. package/dist/runtime/runTurn.d.ts +63 -0
  75. package/dist/runtime/runTurn.js +800 -0
  76. package/dist/runtime/validateWorkflow.d.ts +17 -0
  77. package/dist/runtime/validateWorkflow.js +209 -0
  78. package/dist/server/ConnectionPool.d.ts +68 -0
  79. package/dist/server/ConnectionPool.js +166 -0
  80. package/dist/server/EventQueue.d.ts +33 -0
  81. package/dist/server/EventQueue.js +98 -0
  82. package/dist/server/InboxCatchUp.d.ts +24 -0
  83. package/dist/server/InboxCatchUp.js +213 -0
  84. package/dist/server/OutboxBuffer.d.ts +33 -0
  85. package/dist/server/OutboxBuffer.js +68 -0
  86. package/dist/server/SeenMessages.d.ts +13 -0
  87. package/dist/server/SeenMessages.js +31 -0
  88. package/dist/server/StateTimers.d.ts +34 -0
  89. package/dist/server/StateTimers.js +70 -0
  90. package/dist/server/ZiggsEffectHandler.d.ts +79 -0
  91. package/dist/server/ZiggsEffectHandler.js +319 -0
  92. package/dist/server/agreements/AgreementService.d.ts +50 -0
  93. package/dist/server/agreements/AgreementService.js +85 -0
  94. package/dist/server/createHealthServer.d.ts +7 -0
  95. package/dist/server/createHealthServer.js +75 -0
  96. package/dist/server/proactive/ProactiveTrigger.d.ts +33 -0
  97. package/dist/server/proactive/ProactiveTrigger.js +71 -0
  98. package/dist/server/runLauncher.d.ts +28 -0
  99. package/dist/server/runLauncher.js +93 -0
  100. package/dist/server/tasks/TaskService.d.ts +25 -0
  101. package/dist/server/tasks/TaskService.js +103 -0
  102. package/dist/server/tasks/index.js +1 -0
  103. package/dist/server/telemetryIngest.d.ts +24 -0
  104. package/dist/server/telemetryIngest.js +62 -0
  105. package/dist/server/tools/index.d.ts +24 -0
  106. package/{src/server/tools/index.ts → dist/server/tools/index.js} +4 -24
  107. package/dist/server/tools/tier1/protocolRunner.d.ts +39 -0
  108. package/dist/server/tools/tier1/protocolRunner.js +288 -0
  109. package/dist/server/tools/tier1/protocolTools.d.ts +12 -0
  110. package/dist/server/tools/tier1/protocolTools.js +37 -0
  111. package/dist/server/tools/tier2/connectionTools.d.ts +4 -0
  112. package/dist/server/tools/tier2/connectionTools.js +63 -0
  113. package/dist/server/tools/tier2/contextTools.d.ts +4 -0
  114. package/dist/server/tools/tier2/contextTools.js +46 -0
  115. package/dist/server/tools/tier2/discoveryTools.d.ts +4 -0
  116. package/dist/server/tools/tier2/discoveryTools.js +25 -0
  117. package/dist/server/tools/tier2/marketplaceTools.d.ts +3 -0
  118. package/dist/server/tools/tier2/marketplaceTools.js +22 -0
  119. package/dist/server/tools/tier2/paymentTools.d.ts +12 -0
  120. package/dist/server/tools/tier2/paymentTools.js +165 -0
  121. package/dist/server/ziggsconnect/ZiggsConnectClient.d.ts +35 -0
  122. package/dist/server/ziggsconnect/ZiggsConnectClient.js +95 -0
  123. package/dist/server/ziggscontext/ZiggsContextClient.d.ts +48 -0
  124. package/dist/server/ziggscontext/ZiggsContextClient.js +90 -0
  125. package/dist/server/ziggspay/ZiggsPayClient.d.ts +82 -0
  126. package/dist/server/ziggspay/ZiggsPayClient.js +188 -0
  127. package/dist/shared/ids.d.ts +1 -0
  128. package/dist/shared/ids.js +3 -0
  129. package/dist/shared/runtimeLog.d.ts +18 -0
  130. package/dist/shared/runtimeLog.js +68 -0
  131. package/dist/shared/types.d.ts +22 -0
  132. package/dist/shared/types.js +23 -0
  133. package/dist/tasks/protocolRegistry.d.ts +16 -0
  134. package/dist/tasks/protocolRegistry.js +20 -0
  135. package/dist/tools/ToolManager.d.ts +12 -0
  136. package/dist/tools/ToolManager.js +74 -0
  137. package/dist/tools/ToolProvider.d.ts +6 -0
  138. package/dist/tools/ToolProvider.js +21 -0
  139. package/dist/tools/defineTool.d.ts +27 -0
  140. package/dist/tools/defineTool.js +62 -0
  141. package/{src/tools/index.ts → dist/tools/index.d.ts} +0 -1
  142. package/dist/tools/index.js +6 -0
  143. package/dist/tools/recordReport.d.ts +41 -0
  144. package/dist/tools/recordReport.js +30 -0
  145. package/dist/types.d.ts +466 -0
  146. package/dist/types.js +7 -0
  147. package/dist/utils/jsonExtractor.d.ts +2 -0
  148. package/dist/utils/jsonExtractor.js +111 -0
  149. package/package.json +13 -5
  150. package/src/AgentHost.ts +0 -814
  151. package/src/adapters/AnthropicAdapter.ts +0 -238
  152. package/src/adapters/McpAdapter.ts +0 -678
  153. package/src/adapters/OpenAIAdapter.ts +0 -194
  154. package/src/agent/Agent.ts +0 -112
  155. package/src/agent/ClaudeSdkAgent.ts +0 -401
  156. package/src/agent/claudeCognition.ts +0 -139
  157. package/src/agent/claudeSdkTools.ts +0 -81
  158. package/src/agent/hostedAgentConnection.ts +0 -41
  159. package/src/agent/toolManagerToSdkMcp.ts +0 -136
  160. package/src/cognition/validateContext.ts +0 -95
  161. package/src/context/applyEffects.ts +0 -80
  162. package/src/context/batch.ts +0 -19
  163. package/src/context/classifyEnvelope.ts +0 -38
  164. package/src/context/routingLabels.ts +0 -46
  165. package/src/defineAgent.ts +0 -77
  166. package/src/formatters/AgreementFormatter.ts +0 -111
  167. package/src/formatters/HistoryFormatter.ts +0 -172
  168. package/src/ingress/normalizeIncoming.ts +0 -162
  169. package/src/memory/MemoryStore.ts +0 -104
  170. package/src/pricing/fleetDefaults.ts +0 -225
  171. package/src/pricing/fleetEvalFree.ts +0 -24
  172. package/src/pricing/fleetTierByAgentId.gen.ts +0 -775
  173. package/src/runtime/AgentMachine.ts +0 -484
  174. package/src/runtime/PromptBuilder.ts +0 -522
  175. package/src/runtime/buildOutcome.ts +0 -563
  176. package/src/runtime/defaults.ts +0 -86
  177. package/src/runtime/deriveRespondsToProposals.ts +0 -35
  178. package/src/runtime/kickoff.ts +0 -117
  179. package/src/runtime/runMechanical.ts +0 -106
  180. package/src/runtime/runTurn.ts +0 -870
  181. package/src/runtime/validateWorkflow.ts +0 -221
  182. package/src/server/ConnectionPool.ts +0 -206
  183. package/src/server/EventQueue.ts +0 -133
  184. package/src/server/InboxCatchUp.ts +0 -291
  185. package/src/server/OutboxBuffer.ts +0 -90
  186. package/src/server/SeenMessages.ts +0 -27
  187. package/src/server/StateTimers.ts +0 -85
  188. package/src/server/ZiggsEffectHandler.ts +0 -427
  189. package/src/server/agreements/AgreementService.ts +0 -118
  190. package/src/server/createHealthServer.ts +0 -85
  191. package/src/server/proactive/ProactiveTrigger.ts +0 -83
  192. package/src/server/runLauncher.ts +0 -146
  193. package/src/server/tasks/TaskService.ts +0 -111
  194. package/src/server/telemetryIngest.ts +0 -91
  195. package/src/server/tools/tier1/protocolRunner.ts +0 -353
  196. package/src/server/tools/tier1/protocolTools.ts +0 -114
  197. package/src/server/tools/tier2/connectionTools.ts +0 -75
  198. package/src/server/tools/tier2/contextTools.ts +0 -63
  199. package/src/server/tools/tier2/discoveryTools.ts +0 -34
  200. package/src/server/tools/tier2/marketplaceTools.ts +0 -27
  201. package/src/server/tools/tier2/paymentTools.ts +0 -170
  202. package/src/server/ziggsconnect/ZiggsConnectClient.ts +0 -126
  203. package/src/server/ziggscontext/ZiggsContextClient.ts +0 -129
  204. package/src/server/ziggspay/ZiggsPayClient.ts +0 -193
  205. package/src/shared/ids.ts +0 -3
  206. package/src/shared/runtimeLog.ts +0 -72
  207. package/src/shared/types.ts +0 -29
  208. package/src/tasks/protocolRegistry.ts +0 -25
  209. package/src/tools/ToolManager.ts +0 -95
  210. package/src/tools/ToolProvider.ts +0 -19
  211. package/src/tools/defineTool.ts +0 -90
  212. package/src/tools/recordReport.ts +0 -82
  213. package/src/types.ts +0 -483
  214. package/src/utils/jsonExtractor.ts +0 -100
  215. /package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -0
  216. /package/{src/agent/claudeSdkProtocol.ts → dist/agent/claudeSdkProtocol.js} +0 -0
  217. /package/{src/formatters/index.ts → dist/formatters/index.d.ts} +0 -0
  218. /package/{src/server/tasks/index.ts → dist/server/tasks/index.d.ts} +0 -0
@@ -0,0 +1,165 @@
1
+ import { defineTool } from '../../../tools/defineTool.js';
2
+ import { ZiggsPayClient } from '../../ziggspay/ZiggsPayClient.js';
3
+ function clientFor(ctx) {
4
+ const operatorKey = ctx?.['operatorKey'];
5
+ if (!operatorKey)
6
+ throw new Error('operatorKey missing from tool context');
7
+ return new ZiggsPayClient({ operatorKey, actAsAgentId: ctx?.['agentId'] || undefined });
8
+ }
9
+ function rethrowWithContext(error, prefix) {
10
+ const e = error;
11
+ const wrapped = new Error(`${prefix}: ${e.message}`);
12
+ if (e.status !== undefined)
13
+ wrapped.status = e.status;
14
+ if (e.body !== undefined)
15
+ wrapped.body = e.body;
16
+ wrapped['cause'] = error;
17
+ throw wrapped;
18
+ }
19
+ function buildCaveats(args) {
20
+ const caveats = [];
21
+ if (args['maxAmount'] != null)
22
+ caveats.push({ type: 'max_amount', value: args['maxAmount'] });
23
+ if (args['dailyBudget'] != null)
24
+ caveats.push({ type: 'daily_budget', value: args['dailyBudget'] });
25
+ if (args['allowedRecipients'] != null)
26
+ caveats.push({ type: 'allowed_recipients', value: args['allowedRecipients'] });
27
+ if (args['expiresInSeconds'] != null)
28
+ caveats.push({ type: 'expires_at', value: Date.now() + args['expiresInSeconds'] * 1000 });
29
+ return caveats;
30
+ }
31
+ export const paymentBalanceTool = defineTool('payment_balance', {}, async (_args, ctx) => {
32
+ try {
33
+ return await clientFor(ctx).balance();
34
+ }
35
+ catch (e) {
36
+ rethrowWithContext(e, 'Failed to get balance');
37
+ }
38
+ }, { description: "Check the caller's current wallet balance and available balance (total minus active holds). Use before a transfer to confirm sufficient funds." });
39
+ export const paymentTransferTool = defineTool('payment_transfer', { toWalletId: { type: 'string', required: true }, amount: { type: 'number', required: true }, description: 'string', idempotencyKey: 'string', paymentGrantId: 'string' }, async (args, ctx) => {
40
+ if (!args['toWalletId'])
41
+ throw new Error('toWalletId is required');
42
+ if (!args['amount'] || args['amount'] <= 0)
43
+ throw new Error('amount must be positive');
44
+ const client = clientFor(ctx);
45
+ let result;
46
+ try {
47
+ result = await client.transfer({ to: args['toWalletId'], amount: Math.round(args['amount']), description: args['description'] || 'Agent-initiated transfer', idempotencyKey: args['idempotencyKey'], paymentGrantId: args['paymentGrantId'] });
48
+ }
49
+ catch (e) {
50
+ rethrowWithContext(e, 'Transfer failed');
51
+ }
52
+ if (result['status'] === 'approval_required') {
53
+ return { status: 'approval_required', approvalId: result['approvalId'] || null, expiresAt: result['expiresAt'] || null, reason: result['reason'] || null, amount: args['amount'], toWalletId: result['toWalletId'],
54
+ message: 'Transfer paused: the wallet owner must approve this amount.',
55
+ next_actions: [{ tool: 'payment_wait_for_approval', when: 'You expect a quick decision (≤2 min) and can wait inline.', args: { approvalId: result['approvalId'], timeoutMs: 120000 } }, { tool: 'task_update_plan_step', when: 'You want to abandon the transfer and route around it.' }] };
56
+ }
57
+ return { status: 'transferred', transactionId: result['transactionId'] || null, amount: args['amount'], toWalletId: result['toWalletId'] };
58
+ });
59
+ export const paymentWaitForApprovalTool = defineTool('payment_wait_for_approval', { approvalId: { type: 'string', required: true }, timeoutMs: 'number', pollMs: 'number' }, async (args, ctx) => {
60
+ if (!args['approvalId'])
61
+ throw new Error('approvalId is required');
62
+ try {
63
+ const result = await clientFor(ctx).waitForApproval(args['approvalId'], { timeoutMs: args['timeoutMs'], pollMs: args['pollMs'] });
64
+ return { status: result['status'], approvalId: args['approvalId'], transactionId: result['transactionId'] || null, approval: result['approval'] || null };
65
+ }
66
+ catch (e) {
67
+ rethrowWithContext(e, 'wait_for_approval failed');
68
+ }
69
+ });
70
+ export const paymentResolveWalletTool = defineTool('payment_resolve_wallet', { userId: 'string', agentId: 'string' }, async (args, ctx) => {
71
+ if (!args['userId'] && !args['agentId'])
72
+ throw new Error('Provide userId or agentId to resolve a wallet');
73
+ try {
74
+ const wallet = await clientFor(ctx).resolve({ userId: args['userId'], agentId: args['agentId'] });
75
+ return { walletId: wallet?.['walletId'] || null, ownerId: wallet?.['ownerId'] || null, currency: wallet?.['currency'] || 'pez', status: wallet?.['status'] || null };
76
+ }
77
+ catch (e) {
78
+ rethrowWithContext(e, 'Failed to resolve wallet');
79
+ }
80
+ }, { description: 'Look up a walletId by userId or agentId. Use before a transfer when you only know the recipient by their platform ID.' });
81
+ export const paymentHoldTool = defineTool('payment_hold', { amount: { type: 'number', required: true }, description: 'string', idempotencyKey: 'string' }, async (args, ctx) => {
82
+ if (!args['amount'] || args['amount'] <= 0)
83
+ throw new Error('amount must be positive');
84
+ try {
85
+ const result = await clientFor(ctx).hold({ amount: Math.round(args['amount']), description: args['description'] || 'Agent escrow hold', idempotencyKey: args['idempotencyKey'] });
86
+ return { status: 'held', transactionId: result['transaction']?.['transactionId'] || null, amount: args['amount'] };
87
+ }
88
+ catch (e) {
89
+ rethrowWithContext(e, 'Hold failed');
90
+ }
91
+ }, { description: 'Pre-authorize (escrow) funds without moving them. Use to reserve payment at agreement formation; release with payment_release once work is complete or to refund if work is cancelled.' });
92
+ export const paymentReleaseTool = defineTool('payment_release', { holdId: { type: 'string', required: true }, action: { type: 'string', required: true }, toWalletId: 'string', idempotencyKey: 'string' }, async (args, ctx) => {
93
+ if (!args['holdId'])
94
+ throw new Error('holdId is required');
95
+ if (args['action'] !== 'complete' && args['action'] !== 'refund')
96
+ throw new Error("action must be 'complete' or 'refund'");
97
+ if (args['action'] === 'complete' && !args['toWalletId'])
98
+ throw new Error('toWalletId is required when action=complete');
99
+ try {
100
+ const result = await clientFor(ctx).release({ holdId: args['holdId'], action: args['action'], toWalletId: args['toWalletId'], idempotencyKey: args['idempotencyKey'] });
101
+ return { status: args['action'] === 'complete' ? 'settled' : 'refunded', transactionId: result['transaction']?.['transactionId'] || null, holdId: args['holdId'], action: args['action'] };
102
+ }
103
+ catch (e) {
104
+ rethrowWithContext(e, 'Release failed');
105
+ }
106
+ }, { description: "Settle or refund an escrow hold. Use action='complete' to transfer held funds to toWalletId (work done), or action='refund' to return funds to the sender (work cancelled)." });
107
+ const issueGrantHandler = async (args, ctx) => {
108
+ if (!args['holderId'])
109
+ throw new Error('holderId is required');
110
+ try {
111
+ const caveats = buildCaveats(args);
112
+ const result = await clientFor(ctx).issueGrant({ holderId: args['holderId'], caveats });
113
+ const grant = result['grant'];
114
+ return { grantId: grant?.['grantId'] || null, holderId: grant?.['holderId'] || args['holderId'], caveats: grant?.['caveats'] || caveats, expiresAt: grant?.['expiresAt'] || null };
115
+ }
116
+ catch (e) {
117
+ rethrowWithContext(e, 'Failed to issue payment grant');
118
+ }
119
+ };
120
+ export const paymentIssueGrantTool = defineTool('payment_issue_grant', { holderId: { type: 'string', required: true }, maxAmount: 'number', dailyBudget: 'number', allowedRecipients: ['string'], expiresInSeconds: 'number' }, issueGrantHandler);
121
+ const attenuateGrantHandler = async (args, ctx) => {
122
+ const grantId = args['grantId'];
123
+ if (!grantId)
124
+ throw new Error('grantId is required');
125
+ if (!args['holderId'])
126
+ throw new Error('holderId is required');
127
+ try {
128
+ const caveats = buildCaveats(args);
129
+ const result = await clientFor(ctx).attenuateGrant({ grantId, holderId: args['holderId'], caveats });
130
+ const grant = result['grant'];
131
+ return { grantId: grant?.['grantId'] || null, parentGrantId: grant?.['parentGrantId'] || grantId, holderId: grant?.['holderId'] || args['holderId'], caveats: grant?.['caveats'] || caveats, expiresAt: grant?.['expiresAt'] || null };
132
+ }
133
+ catch (e) {
134
+ rethrowWithContext(e, 'Failed to attenuate payment grant');
135
+ }
136
+ };
137
+ export const paymentAttenuateGrantTool = defineTool('payment_attenuate_grant', { grantId: { type: 'string', required: true }, holderId: { type: 'string', required: true }, maxAmount: 'number', dailyBudget: 'number', allowedRecipients: ['string'], expiresInSeconds: 'number' }, attenuateGrantHandler);
138
+ const revokeGrantHandler = async (args, ctx) => {
139
+ const grantId = args['grantId'];
140
+ if (!grantId)
141
+ throw new Error('grantId is required');
142
+ try {
143
+ const result = await clientFor(ctx).revokeGrant(grantId);
144
+ return { status: 'revoked', grantId, revoked: result['revoked'] ?? null };
145
+ }
146
+ catch (e) {
147
+ rethrowWithContext(e, 'Failed to revoke payment grant');
148
+ }
149
+ };
150
+ export const paymentRevokeGrantTool = defineTool('payment_revoke_grant', { grantId: { type: 'string', required: true } }, revokeGrantHandler);
151
+ const listGrantsHandler = async (_args, ctx) => {
152
+ try {
153
+ const result = await clientFor(ctx).listGrants();
154
+ return { grants: result || [] };
155
+ }
156
+ catch (e) {
157
+ rethrowWithContext(e, 'Failed to list payment grants');
158
+ }
159
+ };
160
+ export const paymentListGrantsTool = defineTool('payment_list_grants', {}, listGrantsHandler);
161
+ export const PAYMENT_TOOLS = [
162
+ paymentBalanceTool, paymentTransferTool, paymentWaitForApprovalTool,
163
+ paymentHoldTool, paymentReleaseTool, paymentResolveWalletTool,
164
+ paymentIssueGrantTool, paymentAttenuateGrantTool, paymentRevokeGrantTool, paymentListGrantsTool,
165
+ ];
@@ -0,0 +1,35 @@
1
+ import 'dotenv/config';
2
+ export interface ZiggsConnectClientOptions {
3
+ operatorKey: string;
4
+ actAsAgentId?: string;
5
+ baseUrl?: string;
6
+ }
7
+ export interface ProxyParams {
8
+ connectionId: string;
9
+ grantId: string;
10
+ action: string;
11
+ payload?: unknown;
12
+ }
13
+ export declare class ZiggsConnectClient {
14
+ private operatorKey;
15
+ private actAsAgentId;
16
+ private baseUrl;
17
+ constructor({ operatorKey, actAsAgentId, baseUrl }: ZiggsConnectClientOptions);
18
+ /**
19
+ * Present a ConnectionGrant to the broker and perform a provider action.
20
+ * Returns the provider result — never the raw OAuth token.
21
+ */
22
+ proxy({ connectionId, grantId, action, payload }: ProxyParams): Promise<unknown>;
23
+ /**
24
+ * List ConnectionGrants held by this agent for a connection.
25
+ * Requires actAsAgentId; filters server rows to holderId === agent.
26
+ */
27
+ listGrants({ connectionId }: {
28
+ connectionId: string;
29
+ }): Promise<unknown[]>;
30
+ private _buildHeaders;
31
+ private _request;
32
+ private _get;
33
+ private _post;
34
+ }
35
+ export declare function createZiggsConnectClient(opts: ZiggsConnectClientOptions): ZiggsConnectClient;
@@ -0,0 +1,95 @@
1
+ import 'dotenv/config';
2
+ function getDefaultBaseUrl() {
3
+ return process.env.BACKEND_URL || process.env.ZIGGS_BACKEND_URL || 'http://localhost:3000';
4
+ }
5
+ function parseError(text, fallback) {
6
+ if (!text)
7
+ return fallback;
8
+ try {
9
+ const parsed = JSON.parse(text);
10
+ return parsed['message'] || parsed['error'] || text;
11
+ }
12
+ catch {
13
+ return text;
14
+ }
15
+ }
16
+ export class ZiggsConnectClient {
17
+ operatorKey;
18
+ actAsAgentId;
19
+ baseUrl;
20
+ constructor({ operatorKey, actAsAgentId, baseUrl }) {
21
+ if (!operatorKey || typeof operatorKey !== 'string') {
22
+ throw new Error('ZiggsConnectClient requires an operatorKey');
23
+ }
24
+ this.operatorKey = operatorKey;
25
+ this.actAsAgentId = actAsAgentId || null;
26
+ this.baseUrl = baseUrl || getDefaultBaseUrl();
27
+ }
28
+ /**
29
+ * Present a ConnectionGrant to the broker and perform a provider action.
30
+ * Returns the provider result — never the raw OAuth token.
31
+ */
32
+ async proxy({ connectionId, grantId, action, payload }) {
33
+ if (!connectionId)
34
+ throw new Error('proxy: connectionId is required');
35
+ if (!grantId)
36
+ throw new Error('proxy: grantId is required');
37
+ if (!action)
38
+ throw new Error('proxy: action is required');
39
+ if (!this.actAsAgentId) {
40
+ throw new Error('proxy: actAsAgentId is required — connection broker calls must impersonate the grant holder agent');
41
+ }
42
+ const res = (await this._post(`/connections/${encodeURIComponent(connectionId)}/proxy`, {
43
+ grantId,
44
+ action,
45
+ payload: payload ?? {},
46
+ }));
47
+ return res['result'] ?? res;
48
+ }
49
+ /**
50
+ * List ConnectionGrants held by this agent for a connection.
51
+ * Requires actAsAgentId; filters server rows to holderId === agent.
52
+ */
53
+ async listGrants({ connectionId }) {
54
+ if (!connectionId)
55
+ throw new Error('listGrants: connectionId is required');
56
+ if (!this.actAsAgentId) {
57
+ throw new Error('listGrants: actAsAgentId is required — grants are scoped to the impersonated agent');
58
+ }
59
+ const res = (await this._get(`/connections/${encodeURIComponent(connectionId)}/grants`));
60
+ const grants = res['grants'] || [];
61
+ return grants.filter((g) => g['holderId'] === this.actAsAgentId);
62
+ }
63
+ _buildHeaders(extra = {}) {
64
+ const h = { Authorization: `Bearer ${this.operatorKey}`, ...extra };
65
+ if (this.actAsAgentId)
66
+ h['X-Agent-Id'] = this.actAsAgentId;
67
+ return h;
68
+ }
69
+ async _request(method, path, body) {
70
+ const init = {
71
+ method,
72
+ headers: this._buildHeaders(body !== undefined ? { 'content-type': 'application/json' } : {}),
73
+ };
74
+ if (body !== undefined)
75
+ init.body = JSON.stringify(body);
76
+ const response = await fetch(`${this.baseUrl}${path}`, init);
77
+ const text = await response.text();
78
+ if (!response.ok) {
79
+ const err = new Error(parseError(text, `HTTP ${response.status}`));
80
+ err.status = response.status;
81
+ err.body = text;
82
+ throw err;
83
+ }
84
+ return text ? JSON.parse(text) : null;
85
+ }
86
+ _get(path) {
87
+ return this._request('GET', path, undefined);
88
+ }
89
+ _post(path, body) {
90
+ return this._request('POST', path, body ?? {});
91
+ }
92
+ }
93
+ export function createZiggsConnectClient(opts) {
94
+ return new ZiggsConnectClient(opts);
95
+ }
@@ -0,0 +1,48 @@
1
+ import 'dotenv/config';
2
+ export interface ZiggsContextClientOptions {
3
+ operatorKey: string;
4
+ actAsAgentId?: string;
5
+ baseUrl?: string;
6
+ }
7
+ export interface ContextReachDescriptor {
8
+ grantId: string;
9
+ scope: {
10
+ kind: 'chat' | 'agreement' | 'org';
11
+ id: string;
12
+ };
13
+ temporal: 'from-now' | 'from-start';
14
+ watermarkAt: string;
15
+ expiresAt: string | null;
16
+ parentGrantId: string | null;
17
+ createdAt: string;
18
+ }
19
+ export interface DelegateContextGrantParams {
20
+ parentGrantId: string;
21
+ holderId: string;
22
+ scope: {
23
+ kind: 'chat' | 'agreement' | 'org';
24
+ id: string;
25
+ };
26
+ temporal: 'from-now' | 'from-start';
27
+ expiresAt?: string | null;
28
+ watermarkAt?: string;
29
+ }
30
+ /**
31
+ * HTTP client for context grants (ZIG-413).
32
+ * Presentation model (signed bytes vs grant id) is intentionally not baked in here.
33
+ */
34
+ export declare class ZiggsContextClient {
35
+ private operatorKey;
36
+ private actAsAgentId;
37
+ private baseUrl;
38
+ constructor({ operatorKey, actAsAgentId, baseUrl }: ZiggsContextClientOptions);
39
+ /** ZIG-412: scope descriptors for what this agent can reach (no content). */
40
+ discover(): Promise<ContextReachDescriptor[]>;
41
+ /** Holder delegates a narrower child grant. */
42
+ delegate(params: DelegateContextGrantParams): Promise<unknown>;
43
+ private requireActAsAgent;
44
+ private _buildHeaders;
45
+ private _request;
46
+ private _get;
47
+ private _post;
48
+ }
@@ -0,0 +1,90 @@
1
+ import 'dotenv/config';
2
+ function getDefaultBaseUrl() {
3
+ return process.env.BACKEND_URL || process.env.ZIGGS_BACKEND_URL || 'http://localhost:3000';
4
+ }
5
+ function parseError(text, fallback) {
6
+ if (!text)
7
+ return fallback;
8
+ try {
9
+ const parsed = JSON.parse(text);
10
+ return parsed['message'] || parsed['error'] || text;
11
+ }
12
+ catch {
13
+ return text;
14
+ }
15
+ }
16
+ /**
17
+ * HTTP client for context grants (ZIG-413).
18
+ * Presentation model (signed bytes vs grant id) is intentionally not baked in here.
19
+ */
20
+ export class ZiggsContextClient {
21
+ operatorKey;
22
+ actAsAgentId;
23
+ baseUrl;
24
+ constructor({ operatorKey, actAsAgentId, baseUrl }) {
25
+ if (!operatorKey || typeof operatorKey !== 'string') {
26
+ throw new Error('ZiggsContextClient requires an operatorKey');
27
+ }
28
+ this.operatorKey = operatorKey;
29
+ this.actAsAgentId = actAsAgentId || null;
30
+ this.baseUrl = baseUrl || getDefaultBaseUrl();
31
+ }
32
+ /** ZIG-412: scope descriptors for what this agent can reach (no content). */
33
+ async discover() {
34
+ this.requireActAsAgent('discover');
35
+ const res = (await this._get('/context/discovery'));
36
+ return res['reach'] || [];
37
+ }
38
+ /** Holder delegates a narrower child grant. */
39
+ async delegate(params) {
40
+ this.requireActAsAgent('delegate');
41
+ if (!params.parentGrantId)
42
+ throw new Error('delegate: parentGrantId is required');
43
+ if (!params.holderId)
44
+ throw new Error('delegate: holderId is required');
45
+ if (!params.scope?.kind || !params.scope?.id) {
46
+ throw new Error('delegate: scope { kind, id } is required');
47
+ }
48
+ return this._post(`/context/grants/${encodeURIComponent(params.parentGrantId)}/delegate`, {
49
+ holderId: params.holderId,
50
+ scope: params.scope,
51
+ temporal: params.temporal,
52
+ expiresAt: params.expiresAt,
53
+ watermarkAt: params.watermarkAt,
54
+ });
55
+ }
56
+ requireActAsAgent(method) {
57
+ if (!this.actAsAgentId) {
58
+ throw new Error(`${method}: actAsAgentId is required — context grant calls must impersonate the grant holder agent`);
59
+ }
60
+ }
61
+ _buildHeaders(extra = {}) {
62
+ const h = { Authorization: `Bearer ${this.operatorKey}`, ...extra };
63
+ if (this.actAsAgentId)
64
+ h['X-Agent-Id'] = this.actAsAgentId;
65
+ return h;
66
+ }
67
+ async _request(method, path, body) {
68
+ const init = {
69
+ method,
70
+ headers: this._buildHeaders(body !== undefined ? { 'content-type': 'application/json' } : {}),
71
+ };
72
+ if (body !== undefined)
73
+ init.body = JSON.stringify(body);
74
+ const res = await fetch(`${this.baseUrl}${path}`, init);
75
+ const text = await res.text();
76
+ if (!res.ok) {
77
+ const err = new Error(parseError(text, `${method} ${path} failed (${res.status})`));
78
+ err.status = res.status;
79
+ err.body = text;
80
+ throw err;
81
+ }
82
+ return text ? JSON.parse(text) : {};
83
+ }
84
+ _get(path) {
85
+ return this._request('GET', path, undefined);
86
+ }
87
+ _post(path, body) {
88
+ return this._request('POST', path, body);
89
+ }
90
+ }
@@ -0,0 +1,82 @@
1
+ import 'dotenv/config';
2
+ export interface ZiggsPayClientOptions {
3
+ operatorKey: string;
4
+ actAsAgentId?: string;
5
+ baseUrl?: string;
6
+ }
7
+ export declare class ZiggsPayClient {
8
+ private operatorKey;
9
+ private actAsAgentId;
10
+ private baseUrl;
11
+ constructor({ operatorKey, actAsAgentId, baseUrl }: ZiggsPayClientOptions);
12
+ balance(): Promise<{
13
+ walletId: string | null;
14
+ currency: string;
15
+ balance: number;
16
+ availableBalance: number;
17
+ }>;
18
+ resolve({ userId, agentId }?: {
19
+ userId?: string;
20
+ agentId?: string;
21
+ }): Promise<unknown>;
22
+ transfer({ to, amount, idempotencyKey, description, paymentGrantId }: {
23
+ to: string;
24
+ amount: number;
25
+ idempotencyKey?: string;
26
+ description?: string;
27
+ paymentGrantId?: string;
28
+ }): Promise<unknown>;
29
+ hold({ amount, idempotencyKey, description }: {
30
+ amount: number;
31
+ idempotencyKey?: string;
32
+ description?: string;
33
+ }): Promise<unknown>;
34
+ release({ holdId, action, toWalletId, idempotencyKey }: {
35
+ holdId: string;
36
+ action?: string;
37
+ toWalletId?: string;
38
+ idempotencyKey?: string;
39
+ }): Promise<unknown>;
40
+ history(params?: {
41
+ limit?: number;
42
+ offset?: number;
43
+ type?: string;
44
+ }): Promise<unknown>;
45
+ issueGrant({ holderId, caveats }: {
46
+ holderId: string;
47
+ caveats?: unknown;
48
+ }): Promise<unknown>;
49
+ attenuateGrant({ grantId, holderId, caveats }: {
50
+ grantId: string;
51
+ holderId: string;
52
+ caveats?: unknown;
53
+ }): Promise<unknown>;
54
+ revokeGrant(grantId: string): Promise<unknown>;
55
+ listGrants(): Promise<unknown[]>;
56
+ createTopUpIntent({ amount, description, currency }?: {
57
+ amount?: number;
58
+ description?: string;
59
+ currency?: string;
60
+ }): Promise<unknown>;
61
+ confirmMockIntent(intentId: string): Promise<unknown>;
62
+ faucet({ amount, description, idempotencyKey }?: {
63
+ amount?: number;
64
+ description?: string;
65
+ idempotencyKey?: string;
66
+ }): Promise<unknown>;
67
+ approvals({ status }?: {
68
+ status?: string;
69
+ }): Promise<unknown[]>;
70
+ getApproval(approvalId: string): Promise<unknown | null>;
71
+ decide(approvalId: string, decision: string, note?: string): Promise<unknown>;
72
+ waitForApproval(approvalId: string, opts?: {
73
+ pollMs?: number;
74
+ timeoutMs?: number;
75
+ signal?: AbortSignal;
76
+ }): Promise<unknown>;
77
+ private _buildHeaders;
78
+ private _request;
79
+ private _get;
80
+ private _post;
81
+ }
82
+ export declare function createZiggsPayClient(opts: ZiggsPayClientOptions): ZiggsPayClient;