@ziggs-ai/agent-sdk 0.1.11 → 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 (211) 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/claudeSdkProtocol.js +27 -0
  20. package/dist/agent/claudeSdkTools.d.ts +19 -0
  21. package/dist/agent/claudeSdkTools.js +57 -0
  22. package/dist/agent/hostedAgentConnection.d.ts +15 -0
  23. package/dist/agent/hostedAgentConnection.js +29 -0
  24. package/dist/agent/toolManagerToSdkMcp.d.ts +12 -0
  25. package/dist/agent/toolManagerToSdkMcp.js +123 -0
  26. package/dist/brain/index.d.ts +50 -0
  27. package/dist/brain/index.js +45 -0
  28. package/dist/cognition/validateContext.d.ts +11 -0
  29. package/dist/cognition/validateContext.js +117 -0
  30. package/dist/context/applyEffects.d.ts +2 -0
  31. package/dist/context/applyEffects.js +89 -0
  32. package/dist/context/batch.d.ts +2 -0
  33. package/dist/context/batch.js +18 -0
  34. package/dist/context/classifyEnvelope.d.ts +1 -0
  35. package/dist/context/classifyEnvelope.js +58 -0
  36. package/dist/context/routingLabels.d.ts +4 -0
  37. package/dist/context/routingLabels.js +48 -0
  38. package/dist/defineAgent.d.ts +14 -0
  39. package/dist/defineAgent.js +68 -0
  40. package/dist/formatters/AgreementFormatter.d.ts +18 -0
  41. package/dist/formatters/AgreementFormatter.js +130 -0
  42. package/dist/formatters/HistoryFormatter.d.ts +26 -0
  43. package/dist/formatters/HistoryFormatter.js +173 -0
  44. package/dist/formatters/index.js +2 -0
  45. package/{src/index.ts → dist/index.d.ts} +13 -53
  46. package/dist/index.js +66 -0
  47. package/dist/ingress/normalizeIncoming.d.ts +65 -0
  48. package/dist/ingress/normalizeIncoming.js +88 -0
  49. package/dist/memory/MemoryStore.d.ts +55 -0
  50. package/dist/memory/MemoryStore.js +78 -0
  51. package/dist/pricing/fleetDefaults.d.ts +46 -0
  52. package/dist/pricing/fleetDefaults.js +168 -0
  53. package/dist/pricing/fleetEvalFree.d.ts +7 -0
  54. package/dist/pricing/fleetEvalFree.js +24 -0
  55. package/dist/pricing/fleetFreeTierA.gen.d.ts +6 -0
  56. package/{src/pricing/fleetFreeTierA.gen.ts → dist/pricing/fleetFreeTierA.gen.js} +5 -6
  57. package/dist/pricing/fleetTierByAgentId.gen.d.ts +7 -0
  58. package/dist/pricing/fleetTierByAgentId.gen.js +768 -0
  59. package/dist/runtime/AgentMachine.d.ts +143 -0
  60. package/dist/runtime/AgentMachine.js +400 -0
  61. package/dist/runtime/PromptBuilder.d.ts +96 -0
  62. package/dist/runtime/PromptBuilder.js +439 -0
  63. package/dist/runtime/bootstrapCtx.d.ts +18 -0
  64. package/dist/runtime/bootstrapCtx.js +37 -0
  65. package/dist/runtime/buildOutcome.d.ts +68 -0
  66. package/dist/runtime/buildOutcome.js +464 -0
  67. package/dist/runtime/defaults.d.ts +54 -0
  68. package/dist/runtime/defaults.js +47 -0
  69. package/dist/runtime/deriveRespondsToProposals.d.ts +9 -0
  70. package/dist/runtime/deriveRespondsToProposals.js +38 -0
  71. package/dist/runtime/kickoff.d.ts +15 -0
  72. package/dist/runtime/kickoff.js +112 -0
  73. package/dist/runtime/runMechanical.d.ts +25 -0
  74. package/dist/runtime/runMechanical.js +74 -0
  75. package/dist/runtime/runTurn.d.ts +63 -0
  76. package/dist/runtime/runTurn.js +800 -0
  77. package/dist/runtime/validateWorkflow.d.ts +17 -0
  78. package/dist/runtime/validateWorkflow.js +209 -0
  79. package/dist/server/ConnectionPool.d.ts +68 -0
  80. package/dist/server/ConnectionPool.js +166 -0
  81. package/dist/server/EventQueue.d.ts +33 -0
  82. package/dist/server/EventQueue.js +98 -0
  83. package/dist/server/InboxCatchUp.d.ts +24 -0
  84. package/dist/server/InboxCatchUp.js +213 -0
  85. package/dist/server/OutboxBuffer.d.ts +33 -0
  86. package/dist/server/OutboxBuffer.js +68 -0
  87. package/dist/server/SeenMessages.d.ts +13 -0
  88. package/dist/server/SeenMessages.js +31 -0
  89. package/dist/server/StateTimers.d.ts +34 -0
  90. package/dist/server/StateTimers.js +70 -0
  91. package/dist/server/ZiggsEffectHandler.d.ts +79 -0
  92. package/dist/server/ZiggsEffectHandler.js +319 -0
  93. package/dist/server/agreements/AgreementService.d.ts +50 -0
  94. package/dist/server/agreements/AgreementService.js +85 -0
  95. package/dist/server/createHealthServer.d.ts +7 -0
  96. package/dist/server/createHealthServer.js +75 -0
  97. package/dist/server/proactive/ProactiveTrigger.d.ts +33 -0
  98. package/dist/server/proactive/ProactiveTrigger.js +71 -0
  99. package/dist/server/runLauncher.d.ts +28 -0
  100. package/dist/server/runLauncher.js +93 -0
  101. package/dist/server/tasks/TaskService.d.ts +25 -0
  102. package/dist/server/tasks/TaskService.js +103 -0
  103. package/dist/server/tasks/index.js +1 -0
  104. package/dist/server/telemetryIngest.d.ts +24 -0
  105. package/dist/server/telemetryIngest.js +62 -0
  106. package/dist/server/tools/index.d.ts +24 -0
  107. package/{src/server/tools/index.ts → dist/server/tools/index.js} +4 -24
  108. package/dist/server/tools/tier1/protocolRunner.d.ts +39 -0
  109. package/dist/server/tools/tier1/protocolRunner.js +288 -0
  110. package/dist/server/tools/tier1/protocolTools.d.ts +12 -0
  111. package/dist/server/tools/tier1/protocolTools.js +37 -0
  112. package/dist/server/tools/tier2/connectionTools.d.ts +4 -0
  113. package/dist/server/tools/tier2/connectionTools.js +63 -0
  114. package/dist/server/tools/tier2/contextTools.d.ts +4 -0
  115. package/dist/server/tools/tier2/contextTools.js +46 -0
  116. package/dist/server/tools/tier2/discoveryTools.d.ts +4 -0
  117. package/dist/server/tools/tier2/discoveryTools.js +25 -0
  118. package/dist/server/tools/tier2/marketplaceTools.d.ts +3 -0
  119. package/dist/server/tools/tier2/marketplaceTools.js +22 -0
  120. package/dist/server/tools/tier2/paymentTools.d.ts +12 -0
  121. package/dist/server/tools/tier2/paymentTools.js +165 -0
  122. package/dist/server/ziggsconnect/ZiggsConnectClient.d.ts +35 -0
  123. package/dist/server/ziggsconnect/ZiggsConnectClient.js +95 -0
  124. package/dist/server/ziggscontext/ZiggsContextClient.d.ts +48 -0
  125. package/dist/server/ziggscontext/ZiggsContextClient.js +90 -0
  126. package/dist/server/ziggspay/ZiggsPayClient.d.ts +82 -0
  127. package/dist/server/ziggspay/ZiggsPayClient.js +188 -0
  128. package/dist/shared/ids.d.ts +1 -0
  129. package/dist/shared/ids.js +3 -0
  130. package/dist/shared/runtimeLog.d.ts +18 -0
  131. package/dist/shared/runtimeLog.js +68 -0
  132. package/dist/shared/types.d.ts +22 -0
  133. package/dist/shared/types.js +23 -0
  134. package/dist/tasks/protocolRegistry.d.ts +16 -0
  135. package/dist/tasks/protocolRegistry.js +20 -0
  136. package/dist/tools/ToolManager.d.ts +12 -0
  137. package/dist/tools/ToolManager.js +74 -0
  138. package/dist/tools/ToolProvider.d.ts +6 -0
  139. package/dist/tools/ToolProvider.js +21 -0
  140. package/dist/tools/defineTool.d.ts +27 -0
  141. package/dist/tools/defineTool.js +62 -0
  142. package/{src/tools/index.ts → dist/tools/index.d.ts} +0 -1
  143. package/dist/tools/index.js +6 -0
  144. package/dist/tools/recordReport.d.ts +41 -0
  145. package/dist/tools/recordReport.js +30 -0
  146. package/dist/types.d.ts +466 -0
  147. package/dist/types.js +7 -0
  148. package/dist/utils/jsonExtractor.d.ts +2 -0
  149. package/dist/utils/jsonExtractor.js +111 -0
  150. package/package.json +17 -7
  151. package/src/AgentHost.ts +0 -545
  152. package/src/adapters/AnthropicAdapter.ts +0 -206
  153. package/src/adapters/McpAdapter.ts +0 -348
  154. package/src/adapters/OpenAIAdapter.ts +0 -187
  155. package/src/agent/Agent.ts +0 -104
  156. package/src/cognition/validateContext.ts +0 -95
  157. package/src/context/applyEffects.ts +0 -80
  158. package/src/context/batch.ts +0 -19
  159. package/src/context/classifyEnvelope.ts +0 -38
  160. package/src/context/routingLabels.ts +0 -46
  161. package/src/defineAgent.ts +0 -70
  162. package/src/formatters/AgreementFormatter.ts +0 -111
  163. package/src/formatters/HistoryFormatter.ts +0 -172
  164. package/src/ingress/normalizeIncoming.ts +0 -162
  165. package/src/memory/MemoryStore.ts +0 -104
  166. package/src/pricing/fleetDefaults.ts +0 -225
  167. package/src/pricing/fleetEvalFree.ts +0 -24
  168. package/src/pricing/fleetTierByAgentId.gen.ts +0 -775
  169. package/src/runtime/AgentMachine.ts +0 -402
  170. package/src/runtime/PromptBuilder.ts +0 -485
  171. package/src/runtime/buildOutcome.ts +0 -563
  172. package/src/runtime/defaults.ts +0 -75
  173. package/src/runtime/kickoff.ts +0 -117
  174. package/src/runtime/runTurn.ts +0 -813
  175. package/src/runtime/validateWorkflow.ts +0 -202
  176. package/src/server/ConnectionPool.ts +0 -206
  177. package/src/server/EventQueue.ts +0 -133
  178. package/src/server/InboxCatchUp.ts +0 -254
  179. package/src/server/OutboxBuffer.ts +0 -90
  180. package/src/server/SeenMessages.ts +0 -27
  181. package/src/server/StateTimers.ts +0 -85
  182. package/src/server/ZiggsEffectHandler.ts +0 -418
  183. package/src/server/agreements/AgreementService.ts +0 -118
  184. package/src/server/createHealthServer.ts +0 -85
  185. package/src/server/proactive/ProactiveTrigger.ts +0 -83
  186. package/src/server/runLauncher.ts +0 -146
  187. package/src/server/tasks/TaskService.ts +0 -110
  188. package/src/server/telemetryIngest.ts +0 -91
  189. package/src/server/tools/tier1/protocolRunner.ts +0 -144
  190. package/src/server/tools/tier1/protocolTools.ts +0 -99
  191. package/src/server/tools/tier2/connectionTools.ts +0 -75
  192. package/src/server/tools/tier2/contextTools.ts +0 -63
  193. package/src/server/tools/tier2/discoveryTools.ts +0 -34
  194. package/src/server/tools/tier2/marketplaceTools.ts +0 -27
  195. package/src/server/tools/tier2/paymentTools.ts +0 -170
  196. package/src/server/ziggsconnect/ZiggsConnectClient.ts +0 -126
  197. package/src/server/ziggscontext/ZiggsContextClient.ts +0 -129
  198. package/src/server/ziggspay/ZiggsPayClient.ts +0 -193
  199. package/src/shared/ids.ts +0 -3
  200. package/src/shared/runtimeLog.ts +0 -72
  201. package/src/shared/types.ts +0 -29
  202. package/src/tasks/protocolRegistry.ts +0 -25
  203. package/src/tools/ToolManager.ts +0 -95
  204. package/src/tools/ToolProvider.ts +0 -19
  205. package/src/tools/defineTool.ts +0 -90
  206. package/src/tools/recordReport.ts +0 -82
  207. package/src/types.ts +0 -456
  208. package/src/utils/jsonExtractor.ts +0 -100
  209. /package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -0
  210. /package/{src/formatters/index.ts → dist/formatters/index.d.ts} +0 -0
  211. /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;