@astrasyncai/verification-gateway 1.0.0 → 2.0.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 (101) hide show
  1. package/dist/adapter-interface/interface.d.mts +71 -0
  2. package/dist/adapter-interface/interface.d.ts +71 -0
  3. package/dist/adapter-interface/interface.js +36 -0
  4. package/dist/adapter-interface/interface.js.map +1 -0
  5. package/dist/adapter-interface/interface.mjs +10 -0
  6. package/dist/adapter-interface/interface.mjs.map +1 -0
  7. package/dist/adapter-interface/purpose-mapping.d.mts +28 -0
  8. package/dist/adapter-interface/purpose-mapping.d.ts +28 -0
  9. package/dist/adapter-interface/purpose-mapping.js +117 -0
  10. package/dist/adapter-interface/purpose-mapping.js.map +1 -0
  11. package/dist/adapter-interface/purpose-mapping.mjs +89 -0
  12. package/dist/adapter-interface/purpose-mapping.mjs.map +1 -0
  13. package/dist/adapters/express.d.mts +2 -2
  14. package/dist/adapters/express.d.ts +2 -2
  15. package/dist/adapters/express.js +46 -9
  16. package/dist/adapters/express.js.map +1 -1
  17. package/dist/adapters/express.mjs +46 -9
  18. package/dist/adapters/express.mjs.map +1 -1
  19. package/dist/adapters/nextjs.d.mts +2 -2
  20. package/dist/adapters/nextjs.d.ts +2 -2
  21. package/dist/adapters/nextjs.js +19 -9
  22. package/dist/adapters/nextjs.js.map +1 -1
  23. package/dist/adapters/nextjs.mjs +19 -9
  24. package/dist/adapters/nextjs.mjs.map +1 -1
  25. package/dist/adapters/sdk.d.mts +2 -2
  26. package/dist/adapters/sdk.d.ts +2 -2
  27. package/dist/adapters/sdk.js +20 -4
  28. package/dist/adapters/sdk.js.map +1 -1
  29. package/dist/adapters/sdk.mjs +20 -4
  30. package/dist/adapters/sdk.mjs.map +1 -1
  31. package/dist/agent/index.d.mts +2 -0
  32. package/dist/agent/index.d.ts +2 -0
  33. package/dist/agent/index.js +354 -0
  34. package/dist/agent/index.js.map +1 -0
  35. package/dist/agent/index.mjs +323 -0
  36. package/dist/agent/index.mjs.map +1 -0
  37. package/dist/browser/browser-adapter.d.mts +106 -0
  38. package/dist/browser/browser-adapter.d.ts +106 -0
  39. package/dist/browser/browser-adapter.js +286 -0
  40. package/dist/browser/browser-adapter.js.map +1 -0
  41. package/dist/browser/browser-adapter.mjs +259 -0
  42. package/dist/browser/browser-adapter.mjs.map +1 -0
  43. package/dist/cli/index.d.mts +241 -0
  44. package/dist/cli/index.d.ts +241 -0
  45. package/dist/cli/index.js +3734 -0
  46. package/dist/cli/index.js.map +1 -0
  47. package/dist/cli/index.mjs +3688 -0
  48. package/dist/cli/index.mjs.map +1 -0
  49. package/dist/cursor/cursor-adapter.d.mts +92 -0
  50. package/dist/cursor/cursor-adapter.d.ts +92 -0
  51. package/dist/cursor/cursor-adapter.js +273 -0
  52. package/dist/cursor/cursor-adapter.js.map +1 -0
  53. package/dist/cursor/cursor-adapter.mjs +246 -0
  54. package/dist/cursor/cursor-adapter.mjs.map +1 -0
  55. package/dist/{express-DUDYpvNZ.d.mts → express-Cp4eg77F.d.mts} +1 -1
  56. package/dist/{express-BhD3mWsL.d.ts → express-DIEyq1Tz.d.ts} +1 -1
  57. package/dist/gateway/gateway.d.mts +70 -0
  58. package/dist/gateway/gateway.d.ts +70 -0
  59. package/dist/gateway/gateway.js +3726 -0
  60. package/dist/gateway/gateway.js.map +1 -0
  61. package/dist/gateway/gateway.mjs +3706 -0
  62. package/dist/gateway/gateway.mjs.map +1 -0
  63. package/dist/git-trigger/git-hooks.d.mts +69 -0
  64. package/dist/git-trigger/git-hooks.d.ts +69 -0
  65. package/dist/git-trigger/git-hooks.js +244 -0
  66. package/dist/git-trigger/git-hooks.js.map +1 -0
  67. package/dist/git-trigger/git-hooks.mjs +221 -0
  68. package/dist/git-trigger/git-hooks.mjs.map +1 -0
  69. package/dist/index-BhTbGU-o.d.mts +206 -0
  70. package/dist/index-Bhfxq9xI.d.ts +206 -0
  71. package/dist/index-CNkmHmpi.d.ts +89 -0
  72. package/dist/index-CoLebmwv.d.mts +89 -0
  73. package/dist/index.d.mts +8 -295
  74. package/dist/index.d.ts +8 -295
  75. package/dist/index.js +60 -21
  76. package/dist/index.js.map +1 -1
  77. package/dist/index.mjs +60 -21
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/local-evaluator/evaluator.d.mts +55 -0
  80. package/dist/local-evaluator/evaluator.d.ts +55 -0
  81. package/dist/local-evaluator/evaluator.js +272 -0
  82. package/dist/local-evaluator/evaluator.js.map +1 -0
  83. package/dist/local-evaluator/evaluator.mjs +244 -0
  84. package/dist/local-evaluator/evaluator.mjs.map +1 -0
  85. package/dist/{nextjs-C9FPOjSh.d.ts → nextjs-Cag7libc.d.ts} +1 -1
  86. package/dist/{nextjs-BtqyLSVQ.d.mts → nextjs-_C_FcJY5.d.mts} +1 -1
  87. package/dist/{sdk-BkVigGjF.d.ts → sdk-CMPDFUjo.d.ts} +3 -1
  88. package/dist/{sdk-xCbZgeZx.d.mts → sdk-DAJahT3p.d.mts} +3 -1
  89. package/dist/transport/index.d.mts +2 -0
  90. package/dist/transport/index.d.ts +2 -0
  91. package/dist/transport/index.js +211 -0
  92. package/dist/transport/index.js.map +1 -0
  93. package/dist/transport/index.mjs +176 -0
  94. package/dist/transport/index.mjs.map +1 -0
  95. package/dist/{types-CS6v75-d.d.mts → types-Bf8pML07.d.mts} +9 -1
  96. package/dist/{types-CS6v75-d.d.ts → types-Bf8pML07.d.ts} +9 -1
  97. package/dist/types-BvpGdsv1.d.mts +153 -0
  98. package/dist/types-Ce2mFJkO.d.ts +153 -0
  99. package/dist/ui/index.d.mts +1 -1
  100. package/dist/ui/index.d.ts +1 -1
  101. package/package.json +46 -1
@@ -0,0 +1,323 @@
1
+ // src/transport/http.ts
2
+ var HEADER_PREFIX = "X-Astra-";
3
+ function setHttpHeaders(headers, credentials) {
4
+ const result = { ...headers };
5
+ result[`${HEADER_PREFIX}ID`] = credentials.agentId;
6
+ if (credentials.verifyUrl) {
7
+ result[`${HEADER_PREFIX}Verify`] = credentials.verifyUrl;
8
+ }
9
+ if (credentials.challengeUrl) {
10
+ result[`${HEADER_PREFIX}Challenge`] = credentials.challengeUrl;
11
+ }
12
+ if (credentials.pdlss?.purpose) {
13
+ const purposeValue = credentials.pdlss.purpose.action ? `${credentials.pdlss.purpose.category}:${credentials.pdlss.purpose.action}` : credentials.pdlss.purpose.category;
14
+ result[`${HEADER_PREFIX}Purpose`] = purposeValue;
15
+ }
16
+ if (credentials.pdlss?.duration?.maxSessionDuration) {
17
+ result[`${HEADER_PREFIX}Duration`] = String(credentials.pdlss.duration.maxSessionDuration);
18
+ }
19
+ if (credentials.pdlss?.scope?.jurisdiction) {
20
+ result[`${HEADER_PREFIX}Scope`] = credentials.pdlss.scope.jurisdiction;
21
+ }
22
+ return result;
23
+ }
24
+
25
+ // src/transport/a2a.ts
26
+ function setA2AMetadata(task, credentials) {
27
+ const astrasync = {
28
+ agentId: credentials.agentId
29
+ };
30
+ if (credentials.verifyUrl) astrasync.verifyUrl = credentials.verifyUrl;
31
+ if (credentials.challengeUrl) astrasync.challengeUrl = credentials.challengeUrl;
32
+ if (credentials.pdlss?.purpose) astrasync.purpose = credentials.pdlss.purpose;
33
+ if (credentials.pdlss?.duration) astrasync.duration = credentials.pdlss.duration;
34
+ if (credentials.pdlss?.scope) astrasync.scope = credentials.pdlss.scope;
35
+ return {
36
+ ...task,
37
+ metadata: {
38
+ ...task.metadata,
39
+ astrasync
40
+ }
41
+ };
42
+ }
43
+
44
+ // src/transport/mcp.ts
45
+ function setMcpMeta(params, credentials) {
46
+ const astrasync = {
47
+ agentId: credentials.agentId
48
+ };
49
+ if (credentials.verifyUrl) astrasync.verifyUrl = credentials.verifyUrl;
50
+ if (credentials.challengeUrl) astrasync.challengeUrl = credentials.challengeUrl;
51
+ if (credentials.pdlss?.purpose) astrasync.purpose = credentials.pdlss.purpose;
52
+ if (credentials.pdlss?.duration) astrasync.duration = credentials.pdlss.duration;
53
+ if (credentials.pdlss?.scope) astrasync.scope = credentials.pdlss.scope;
54
+ return {
55
+ ...params,
56
+ _meta: {
57
+ ...params._meta,
58
+ astrasync
59
+ }
60
+ };
61
+ }
62
+
63
+ // src/transport/index.ts
64
+ function applyCredentials(protocol, target, credentials) {
65
+ switch (protocol) {
66
+ case "http":
67
+ return setHttpHeaders(target, credentials);
68
+ case "a2a":
69
+ return setA2AMetadata(target, credentials);
70
+ case "mcp":
71
+ return setMcpMeta(target, credentials);
72
+ default:
73
+ return target;
74
+ }
75
+ }
76
+
77
+ // src/agent/client.ts
78
+ var AgentClient = class {
79
+ constructor(config) {
80
+ this.credentials = {
81
+ agentId: config.agentId,
82
+ verifyUrl: config.verifyUrl ?? "https://api.astrasync.ai/agents/verify-access",
83
+ challengeUrl: config.challengeUrl,
84
+ pdlss: config.pdlss
85
+ };
86
+ }
87
+ /**
88
+ * Make an HTTP request with AstraSync headers automatically injected.
89
+ */
90
+ async fetch(url, options) {
91
+ const { purpose, action, ...fetchOptions } = options ?? {};
92
+ const creds = { ...this.credentials };
93
+ if (purpose) {
94
+ creds.pdlss = {
95
+ ...creds.pdlss,
96
+ purpose: { category: purpose, action }
97
+ };
98
+ }
99
+ const existingHeaders = {};
100
+ if (fetchOptions.headers) {
101
+ if (fetchOptions.headers instanceof Headers) {
102
+ fetchOptions.headers.forEach((value, key) => {
103
+ existingHeaders[key] = value;
104
+ });
105
+ } else if (Array.isArray(fetchOptions.headers)) {
106
+ for (const [key, value] of fetchOptions.headers) {
107
+ existingHeaders[key] = value;
108
+ }
109
+ } else {
110
+ Object.assign(existingHeaders, fetchOptions.headers);
111
+ }
112
+ }
113
+ const enrichedHeaders = setHttpHeaders(existingHeaders, creds);
114
+ return fetch(url, {
115
+ ...fetchOptions,
116
+ headers: enrichedHeaders
117
+ });
118
+ }
119
+ /**
120
+ * Prepare A2A task metadata with AstraSync credentials.
121
+ */
122
+ prepareA2AMetadata(task, overrides) {
123
+ const creds = this.buildCredentials(overrides);
124
+ return setA2AMetadata(task, creds);
125
+ }
126
+ /**
127
+ * Prepare MCP params with AstraSync _meta.
128
+ */
129
+ prepareMcpMeta(params, overrides) {
130
+ const creds = this.buildCredentials(overrides);
131
+ return setMcpMeta(params, creds);
132
+ }
133
+ /**
134
+ * Generic: apply credentials to any protocol.
135
+ */
136
+ applyCredentials(protocol, target, overrides) {
137
+ const creds = this.buildCredentials(overrides);
138
+ return applyCredentials(protocol, target, creds);
139
+ }
140
+ buildCredentials(overrides) {
141
+ if (!overrides?.purpose) return this.credentials;
142
+ return {
143
+ ...this.credentials,
144
+ pdlss: {
145
+ ...this.credentials.pdlss,
146
+ purpose: { category: overrides.purpose, action: overrides.action }
147
+ }
148
+ };
149
+ }
150
+ };
151
+
152
+ // src/agent/challenge-handler.ts
153
+ var ChallengeHandler = class {
154
+ constructor(config) {
155
+ this.pendingCounterparties = /* @__PURE__ */ new Set();
156
+ this.agentId = config.agentId;
157
+ }
158
+ /**
159
+ * Register a counterparty as pending (before initiating contact).
160
+ */
161
+ registerPending(counterpartyId) {
162
+ this.pendingCounterparties.add(counterpartyId);
163
+ }
164
+ /**
165
+ * Remove a counterparty from pending list (after interaction complete).
166
+ */
167
+ removePending(counterpartyId) {
168
+ this.pendingCounterparties.delete(counterpartyId);
169
+ }
170
+ /**
171
+ * Get current pending counterparties list.
172
+ */
173
+ getPendingList() {
174
+ return [...this.pendingCounterparties];
175
+ }
176
+ /**
177
+ * Express middleware for the challenge endpoint.
178
+ * Mount at: app.post('/astrasync/challenge', handler.expressMiddleware())
179
+ */
180
+ expressMiddleware() {
181
+ return (req, res) => {
182
+ const result = this.handleChallenge(req.body);
183
+ res.status(result.status).json(result.body);
184
+ };
185
+ }
186
+ /**
187
+ * Generic handler (framework-agnostic).
188
+ * Returns { status, body } for the caller to send.
189
+ */
190
+ handleChallenge(body) {
191
+ if (!body || typeof body !== "object") {
192
+ return {
193
+ status: 400,
194
+ body: {
195
+ challengeId: "",
196
+ acknowledged: false,
197
+ pendingCounterparties: [],
198
+ respondedAt: (/* @__PURE__ */ new Date()).toISOString(),
199
+ error: "Invalid challenge payload"
200
+ }
201
+ };
202
+ }
203
+ const payload = body;
204
+ if (!payload.challengeId || !payload.issuedAt || !payload.expiresAt) {
205
+ return {
206
+ status: 400,
207
+ body: {
208
+ challengeId: payload.challengeId ?? "",
209
+ acknowledged: false,
210
+ pendingCounterparties: [],
211
+ respondedAt: (/* @__PURE__ */ new Date()).toISOString(),
212
+ error: "Missing required challenge fields"
213
+ }
214
+ };
215
+ }
216
+ const now = /* @__PURE__ */ new Date();
217
+ const expiresAt = new Date(payload.expiresAt);
218
+ if (now > expiresAt) {
219
+ return {
220
+ status: 410,
221
+ body: {
222
+ challengeId: payload.challengeId,
223
+ acknowledged: false,
224
+ pendingCounterparties: [],
225
+ respondedAt: now.toISOString(),
226
+ error: "Challenge has expired"
227
+ }
228
+ };
229
+ }
230
+ return {
231
+ status: 200,
232
+ body: {
233
+ challengeId: payload.challengeId,
234
+ acknowledged: true,
235
+ pendingCounterparties: this.getPendingList(),
236
+ respondedAt: now.toISOString()
237
+ }
238
+ };
239
+ }
240
+ };
241
+
242
+ // src/agent/pdlss-formatter.ts
243
+ function formatPDLSSForTransport(pdlss) {
244
+ const transport = {};
245
+ if (pdlss.purpose?.categories?.length) {
246
+ transport.purpose = {
247
+ category: pdlss.purpose.categories[0],
248
+ action: pdlss.purpose.allowedActions?.[0]
249
+ };
250
+ }
251
+ if (pdlss.duration) {
252
+ const candidates = [];
253
+ if (pdlss.duration.maxSessionDuration) candidates.push(pdlss.duration.maxSessionDuration);
254
+ if (pdlss.duration.ttl) candidates.push(pdlss.duration.ttl);
255
+ if (candidates.length > 0) {
256
+ transport.duration = { maxSessionDuration: Math.min(...candidates) };
257
+ }
258
+ }
259
+ if (pdlss.scope?.jurisdictions?.length) {
260
+ transport.scope = { jurisdiction: pdlss.scope.jurisdictions[0] };
261
+ }
262
+ return transport;
263
+ }
264
+ function parsePDLSSFromTransport(transport) {
265
+ const pdlss = {};
266
+ if (transport.purpose) {
267
+ pdlss.purpose = {
268
+ categories: [transport.purpose.category],
269
+ allowedActions: transport.purpose.action ? [transport.purpose.action] : void 0
270
+ };
271
+ }
272
+ if (transport.duration) {
273
+ pdlss.duration = {
274
+ maxSessionDuration: transport.duration.maxSessionDuration
275
+ };
276
+ }
277
+ if (transport.scope) {
278
+ pdlss.scope = {
279
+ jurisdictions: transport.scope.jurisdiction ? [transport.scope.jurisdiction] : void 0
280
+ };
281
+ }
282
+ return pdlss;
283
+ }
284
+
285
+ // src/agent/decision-client.ts
286
+ async function recordDecision(config, params) {
287
+ const { sessionId, ...body } = params;
288
+ const baseUrl = config.apiBaseUrl.replace(/\/$/, "");
289
+ const url = `${baseUrl}/agents/verify-access/${encodeURIComponent(sessionId)}/decision`;
290
+ const headers = {
291
+ "Content-Type": "application/json"
292
+ };
293
+ if (config.apiKey) {
294
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
295
+ }
296
+ if (config.customHeaders) {
297
+ Object.assign(headers, config.customHeaders);
298
+ }
299
+ const response = await fetch(url, {
300
+ method: "POST",
301
+ headers,
302
+ body: JSON.stringify(body)
303
+ });
304
+ if (!response.ok) {
305
+ const errorText = await response.text().catch(() => "Unknown error");
306
+ throw new Error(
307
+ `Failed to record decision for session ${sessionId}: ${response.status} ${errorText}`
308
+ );
309
+ }
310
+ const result = await response.json();
311
+ return {
312
+ recorded: result.recorded ?? true,
313
+ blockchainTxHash: result.blockchainTxHash
314
+ };
315
+ }
316
+ export {
317
+ AgentClient,
318
+ ChallengeHandler,
319
+ formatPDLSSForTransport,
320
+ parsePDLSSFromTransport,
321
+ recordDecision
322
+ };
323
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/transport/http.ts","../../src/transport/a2a.ts","../../src/transport/mcp.ts","../../src/transport/index.ts","../../src/agent/client.ts","../../src/agent/challenge-handler.ts","../../src/agent/pdlss-formatter.ts","../../src/agent/decision-client.ts"],"sourcesContent":["/**\n * HTTP Transport Adapter\n *\n * Maps AstraSync credentials to/from HTTP headers (X-Astra-* convention).\n */\n\nimport type { AstraSyncCredentials } from '../types';\n\nconst HEADER_PREFIX = 'X-Astra-';\n\n/**\n * Inject AstraSync credentials into HTTP headers.\n */\nexport function setHttpHeaders(\n headers: Record<string, string>,\n credentials: AstraSyncCredentials,\n): Record<string, string> {\n const result = { ...headers };\n\n result[`${HEADER_PREFIX}ID`] = credentials.agentId;\n\n if (credentials.verifyUrl) {\n result[`${HEADER_PREFIX}Verify`] = credentials.verifyUrl;\n }\n\n if (credentials.challengeUrl) {\n result[`${HEADER_PREFIX}Challenge`] = credentials.challengeUrl;\n }\n\n if (credentials.pdlss?.purpose) {\n const purposeValue = credentials.pdlss.purpose.action\n ? `${credentials.pdlss.purpose.category}:${credentials.pdlss.purpose.action}`\n : credentials.pdlss.purpose.category;\n result[`${HEADER_PREFIX}Purpose`] = purposeValue;\n }\n\n if (credentials.pdlss?.duration?.maxSessionDuration) {\n result[`${HEADER_PREFIX}Duration`] = String(credentials.pdlss.duration.maxSessionDuration);\n }\n\n if (credentials.pdlss?.scope?.jurisdiction) {\n result[`${HEADER_PREFIX}Scope`] = credentials.pdlss.scope.jurisdiction;\n }\n\n return result;\n}\n\n/**\n * Extract AstraSync credentials from HTTP headers.\n */\nexport function extractHttpCredentials(\n headers: Record<string, string | string[] | undefined>,\n): AstraSyncCredentials | null {\n const getValue = (key: string): string | undefined => {\n const v = headers[key] ?? headers[key.toLowerCase()];\n return Array.isArray(v) ? v[0] : v;\n };\n\n const agentId = getValue(`${HEADER_PREFIX}ID`) ?? getValue('x-astra-id');\n if (!agentId) return null;\n\n const credentials: AstraSyncCredentials = { agentId };\n\n const verifyUrl = getValue(`${HEADER_PREFIX}Verify`) ?? getValue('x-astra-verify');\n if (verifyUrl) credentials.verifyUrl = verifyUrl;\n\n const challengeUrl = getValue(`${HEADER_PREFIX}Challenge`) ?? getValue('x-astra-challenge');\n if (challengeUrl) credentials.challengeUrl = challengeUrl;\n\n const purpose = getValue(`${HEADER_PREFIX}Purpose`) ?? getValue('x-astra-purpose');\n if (purpose) {\n const [category, action] = purpose.split(':');\n credentials.pdlss = {\n ...credentials.pdlss,\n purpose: { category, action },\n };\n }\n\n const duration = getValue(`${HEADER_PREFIX}Duration`) ?? getValue('x-astra-duration');\n if (duration) {\n credentials.pdlss = {\n ...credentials.pdlss,\n duration: { maxSessionDuration: parseInt(duration, 10) },\n };\n }\n\n const scope = getValue(`${HEADER_PREFIX}Scope`) ?? getValue('x-astra-scope');\n if (scope) {\n credentials.pdlss = {\n ...credentials.pdlss,\n scope: { jurisdiction: scope },\n };\n }\n\n return credentials;\n}\n","/**\n * A2A (Agent-to-Agent) Transport Adapter\n *\n * Maps AstraSync credentials to/from A2A task metadata.astrasync block.\n */\n\nimport type { AstraSyncCredentials } from '../types';\n\ninterface A2ATask {\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface AstraSyncMetadata {\n agentId: string;\n verifyUrl?: string;\n challengeUrl?: string;\n purpose?: { category: string; action?: string };\n duration?: { maxSessionDuration?: number };\n scope?: { jurisdiction?: string };\n}\n\n/**\n * Add AstraSync credentials to an A2A task's metadata block.\n */\nexport function setA2AMetadata(\n task: A2ATask,\n credentials: AstraSyncCredentials,\n): A2ATask {\n const astrasync: AstraSyncMetadata = {\n agentId: credentials.agentId,\n };\n\n if (credentials.verifyUrl) astrasync.verifyUrl = credentials.verifyUrl;\n if (credentials.challengeUrl) astrasync.challengeUrl = credentials.challengeUrl;\n if (credentials.pdlss?.purpose) astrasync.purpose = credentials.pdlss.purpose;\n if (credentials.pdlss?.duration) astrasync.duration = credentials.pdlss.duration;\n if (credentials.pdlss?.scope) astrasync.scope = credentials.pdlss.scope;\n\n return {\n ...task,\n metadata: {\n ...task.metadata,\n astrasync,\n },\n };\n}\n\n/**\n * Extract AstraSync credentials from an A2A task's metadata block.\n */\nexport function extractA2ACredentials(task: A2ATask): AstraSyncCredentials | null {\n const meta = task.metadata?.astrasync as AstraSyncMetadata | undefined;\n if (!meta?.agentId) return null;\n\n const credentials: AstraSyncCredentials = {\n agentId: meta.agentId,\n };\n\n if (meta.verifyUrl) credentials.verifyUrl = meta.verifyUrl;\n if (meta.challengeUrl) credentials.challengeUrl = meta.challengeUrl;\n\n if (meta.purpose || meta.duration || meta.scope) {\n credentials.pdlss = {};\n if (meta.purpose) credentials.pdlss.purpose = meta.purpose;\n if (meta.duration) credentials.pdlss.duration = meta.duration;\n if (meta.scope) credentials.pdlss.scope = meta.scope;\n }\n\n return credentials;\n}\n","/**\n * MCP (Model Context Protocol) Transport Adapter\n *\n * Maps AstraSync credentials to/from MCP params._meta.astrasync block.\n */\n\nimport type { AstraSyncCredentials } from '../types';\n\ninterface McpParams {\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface AstraSyncMeta {\n agentId: string;\n verifyUrl?: string;\n challengeUrl?: string;\n purpose?: { category: string; action?: string };\n duration?: { maxSessionDuration?: number };\n scope?: { jurisdiction?: string };\n}\n\n/**\n * Add AstraSync credentials to MCP params' _meta block.\n */\nexport function setMcpMeta(\n params: McpParams,\n credentials: AstraSyncCredentials,\n): McpParams {\n const astrasync: AstraSyncMeta = {\n agentId: credentials.agentId,\n };\n\n if (credentials.verifyUrl) astrasync.verifyUrl = credentials.verifyUrl;\n if (credentials.challengeUrl) astrasync.challengeUrl = credentials.challengeUrl;\n if (credentials.pdlss?.purpose) astrasync.purpose = credentials.pdlss.purpose;\n if (credentials.pdlss?.duration) astrasync.duration = credentials.pdlss.duration;\n if (credentials.pdlss?.scope) astrasync.scope = credentials.pdlss.scope;\n\n return {\n ...params,\n _meta: {\n ...params._meta,\n astrasync,\n },\n };\n}\n\n/**\n * Extract AstraSync credentials from MCP params' _meta block.\n */\nexport function extractMcpCredentials(params: McpParams): AstraSyncCredentials | null {\n const meta = params._meta?.astrasync as AstraSyncMeta | undefined;\n if (!meta?.agentId) return null;\n\n const credentials: AstraSyncCredentials = {\n agentId: meta.agentId,\n };\n\n if (meta.verifyUrl) credentials.verifyUrl = meta.verifyUrl;\n if (meta.challengeUrl) credentials.challengeUrl = meta.challengeUrl;\n\n if (meta.purpose || meta.duration || meta.scope) {\n credentials.pdlss = {};\n if (meta.purpose) credentials.pdlss.purpose = meta.purpose;\n if (meta.duration) credentials.pdlss.duration = meta.duration;\n if (meta.scope) credentials.pdlss.scope = meta.scope;\n }\n\n return credentials;\n}\n","/**\n * Cross-Protocol Transport Module\n *\n * Provides adapters for injecting/extracting AstraSync credentials\n * across HTTP, A2A, and MCP protocols.\n */\n\nimport type { AstraSyncCredentials, ProtocolTransport } from '../types';\nimport { setHttpHeaders, extractHttpCredentials } from './http';\nimport { setA2AMetadata, extractA2ACredentials } from './a2a';\nimport { setMcpMeta, extractMcpCredentials } from './mcp';\n\nexport { setHttpHeaders, extractHttpCredentials } from './http';\nexport { setA2AMetadata, extractA2ACredentials } from './a2a';\nexport { setMcpMeta, extractMcpCredentials } from './mcp';\n\n/**\n * Auto-detect protocol from request/context shape.\n */\nexport function detectProtocol(context: Record<string, unknown>): ProtocolTransport {\n // A2A: has metadata block with task-like structure\n if (context.metadata && typeof context.metadata === 'object') {\n return 'a2a';\n }\n\n // MCP: has _meta block (MCP convention)\n if (context._meta && typeof context._meta === 'object') {\n return 'mcp';\n }\n\n // Default to HTTP\n return 'http';\n}\n\n/**\n * Apply credentials to any protocol target.\n */\nexport function applyCredentials(\n protocol: ProtocolTransport,\n target: Record<string, unknown>,\n credentials: AstraSyncCredentials,\n): Record<string, unknown> {\n switch (protocol) {\n case 'http':\n return setHttpHeaders(target as Record<string, string>, credentials);\n case 'a2a':\n return setA2AMetadata(target, credentials);\n case 'mcp':\n return setMcpMeta(target, credentials);\n default:\n return target;\n }\n}\n\n/**\n * Extract credentials from any protocol context.\n */\nexport function extractCredentialsFromProtocol(\n protocol: ProtocolTransport,\n context: Record<string, unknown>,\n): AstraSyncCredentials | null {\n switch (protocol) {\n case 'http':\n return extractHttpCredentials(context as Record<string, string | string[] | undefined>);\n case 'a2a':\n return extractA2ACredentials(context);\n case 'mcp':\n return extractMcpCredentials(context);\n default:\n return null;\n }\n}\n","/**\n * AgentClient — Credential Presentation\n *\n * Agent-side SDK for automatically injecting AstraSync credentials\n * into outgoing requests across all supported protocols.\n */\n\nimport type { AstraSyncCredentials, ProtocolTransport } from '../types';\nimport { setHttpHeaders } from '../transport/http';\nimport { setA2AMetadata } from '../transport/a2a';\nimport { setMcpMeta } from '../transport/mcp';\nimport { applyCredentials } from '../transport';\n\ninterface AgentClientConfig {\n agentId: string;\n verifyUrl?: string;\n challengeUrl?: string;\n pdlss?: AstraSyncCredentials['pdlss'];\n}\n\ninterface FetchOptions extends RequestInit {\n purpose?: string;\n action?: string;\n}\n\nexport class AgentClient {\n private credentials: AstraSyncCredentials;\n\n constructor(config: AgentClientConfig) {\n this.credentials = {\n agentId: config.agentId,\n verifyUrl: config.verifyUrl ?? 'https://api.astrasync.ai/agents/verify-access',\n challengeUrl: config.challengeUrl,\n pdlss: config.pdlss,\n };\n }\n\n /**\n * Make an HTTP request with AstraSync headers automatically injected.\n */\n async fetch(url: string, options?: FetchOptions): Promise<Response> {\n const { purpose, action, ...fetchOptions } = options ?? {};\n\n // Build credentials with optional overrides\n const creds: AstraSyncCredentials = { ...this.credentials };\n if (purpose) {\n creds.pdlss = {\n ...creds.pdlss,\n purpose: { category: purpose, action },\n };\n }\n\n // Inject AstraSync headers\n const existingHeaders: Record<string, string> = {};\n if (fetchOptions.headers) {\n if (fetchOptions.headers instanceof Headers) {\n fetchOptions.headers.forEach((value, key) => {\n existingHeaders[key] = value;\n });\n } else if (Array.isArray(fetchOptions.headers)) {\n for (const [key, value] of fetchOptions.headers) {\n existingHeaders[key] = value;\n }\n } else {\n Object.assign(existingHeaders, fetchOptions.headers);\n }\n }\n\n const enrichedHeaders = setHttpHeaders(existingHeaders, creds);\n\n return fetch(url, {\n ...fetchOptions,\n headers: enrichedHeaders,\n });\n }\n\n /**\n * Prepare A2A task metadata with AstraSync credentials.\n */\n prepareA2AMetadata(\n task: Record<string, unknown>,\n overrides?: { purpose?: string; action?: string },\n ): Record<string, unknown> {\n const creds = this.buildCredentials(overrides);\n return setA2AMetadata(task, creds);\n }\n\n /**\n * Prepare MCP params with AstraSync _meta.\n */\n prepareMcpMeta(\n params: Record<string, unknown>,\n overrides?: { purpose?: string; action?: string },\n ): Record<string, unknown> {\n const creds = this.buildCredentials(overrides);\n return setMcpMeta(params, creds);\n }\n\n /**\n * Generic: apply credentials to any protocol.\n */\n applyCredentials(\n protocol: ProtocolTransport,\n target: Record<string, unknown>,\n overrides?: { purpose?: string; action?: string },\n ): Record<string, unknown> {\n const creds = this.buildCredentials(overrides);\n return applyCredentials(protocol, target, creds);\n }\n\n private buildCredentials(overrides?: { purpose?: string; action?: string }): AstraSyncCredentials {\n if (!overrides?.purpose) return this.credentials;\n\n return {\n ...this.credentials,\n pdlss: {\n ...this.credentials.pdlss,\n purpose: { category: overrides.purpose, action: overrides.action },\n },\n };\n }\n}\n","/**\n * ChallengeHandler — Agent-Side Runtime Challenge Responder\n *\n * Handles incoming runtime challenges from AstraSync's verification service.\n * Agents register pending counterparties before initiating contact,\n * then this handler validates and responds to challenges.\n */\n\ninterface ChallengePayload {\n challengeId: string;\n type: string;\n counterpartyId?: string | null;\n counterpartyUrl?: string | null;\n question?: string;\n issuedAt: string;\n expiresAt: string;\n}\n\ninterface ChallengeResponse {\n status: number;\n body: {\n challengeId: string;\n acknowledged: boolean;\n pendingCounterparties: string[];\n respondedAt: string;\n error?: string;\n };\n}\n\ninterface ChallengeHandlerConfig {\n agentId: string;\n}\n\nexport class ChallengeHandler {\n private agentId: string;\n private pendingCounterparties: Set<string> = new Set();\n\n constructor(config: ChallengeHandlerConfig) {\n this.agentId = config.agentId;\n }\n\n /**\n * Register a counterparty as pending (before initiating contact).\n */\n registerPending(counterpartyId: string): void {\n this.pendingCounterparties.add(counterpartyId);\n }\n\n /**\n * Remove a counterparty from pending list (after interaction complete).\n */\n removePending(counterpartyId: string): void {\n this.pendingCounterparties.delete(counterpartyId);\n }\n\n /**\n * Get current pending counterparties list.\n */\n getPendingList(): string[] {\n return [...this.pendingCounterparties];\n }\n\n /**\n * Express middleware for the challenge endpoint.\n * Mount at: app.post('/astrasync/challenge', handler.expressMiddleware())\n */\n expressMiddleware(): (req: { body: unknown }, res: { status: (code: number) => { json: (body: unknown) => void } }) => void {\n return (req, res) => {\n const result = this.handleChallenge(req.body);\n res.status(result.status).json(result.body);\n };\n }\n\n /**\n * Generic handler (framework-agnostic).\n * Returns { status, body } for the caller to send.\n */\n handleChallenge(body: unknown): ChallengeResponse {\n // Validate payload shape\n if (!body || typeof body !== 'object') {\n return {\n status: 400,\n body: {\n challengeId: '',\n acknowledged: false,\n pendingCounterparties: [],\n respondedAt: new Date().toISOString(),\n error: 'Invalid challenge payload',\n },\n };\n }\n\n const payload = body as ChallengePayload;\n\n if (!payload.challengeId || !payload.issuedAt || !payload.expiresAt) {\n return {\n status: 400,\n body: {\n challengeId: payload.challengeId ?? '',\n acknowledged: false,\n pendingCounterparties: [],\n respondedAt: new Date().toISOString(),\n error: 'Missing required challenge fields',\n },\n };\n }\n\n // Check if challenge has expired\n const now = new Date();\n const expiresAt = new Date(payload.expiresAt);\n if (now > expiresAt) {\n return {\n status: 410,\n body: {\n challengeId: payload.challengeId,\n acknowledged: false,\n pendingCounterparties: [],\n respondedAt: now.toISOString(),\n error: 'Challenge has expired',\n },\n };\n }\n\n // Respond with current pending list\n return {\n status: 200,\n body: {\n challengeId: payload.challengeId,\n acknowledged: true,\n pendingCounterparties: this.getPendingList(),\n respondedAt: now.toISOString(),\n },\n };\n }\n}\n","/**\n * PDLSS Formatter — Transport Format Conversion\n *\n * Converts between full PDLSS boundaries and compact transport format\n * used in HTTP headers, A2A metadata, and MCP _meta blocks.\n */\n\nimport type { AstraSyncCredentials } from '../types';\n\n/**\n * Full PDLSS configuration (as returned by the backend).\n */\nexport interface PDLSSConfig {\n purpose?: {\n categories?: string[];\n allowedActions?: string[];\n deniedActions?: string[];\n };\n duration?: {\n maxSessionDuration?: number;\n ttl?: number;\n allowedDays?: number[];\n allowedHours?: { start: number; end: number };\n };\n limits?: {\n autonomousThreshold?: number;\n stepUpThreshold?: number;\n approvalThreshold?: number;\n currency?: string;\n };\n scope?: {\n jurisdictions?: string[];\n resources?: string[];\n resourceTypes?: string[];\n };\n selfInstantiation?: {\n allowed: boolean;\n maxDepth?: number;\n maxSubAgents?: number;\n };\n}\n\n/**\n * Compact transport format (embedded in headers/metadata).\n */\nexport type TransportPDLSS = NonNullable<AstraSyncCredentials['pdlss']>;\n\n/**\n * Convert full PDLSS boundaries into compact transport format.\n * Used by AgentClient when building credential headers/metadata.\n */\nexport function formatPDLSSForTransport(pdlss: PDLSSConfig): TransportPDLSS {\n const transport: TransportPDLSS = {};\n\n // Purpose: pick the primary category and first allowed action\n if (pdlss.purpose?.categories?.length) {\n transport.purpose = {\n category: pdlss.purpose.categories[0],\n action: pdlss.purpose.allowedActions?.[0],\n };\n }\n\n // Duration: use the shorter of maxSessionDuration and ttl\n if (pdlss.duration) {\n const candidates: number[] = [];\n if (pdlss.duration.maxSessionDuration) candidates.push(pdlss.duration.maxSessionDuration);\n if (pdlss.duration.ttl) candidates.push(pdlss.duration.ttl);\n if (candidates.length > 0) {\n transport.duration = { maxSessionDuration: Math.min(...candidates) };\n }\n }\n\n // Scope: use the primary jurisdiction\n if (pdlss.scope?.jurisdictions?.length) {\n transport.scope = { jurisdiction: pdlss.scope.jurisdictions[0] };\n }\n\n return transport;\n}\n\n/**\n * Parse transport format back into full PDLSS config.\n * Used by counterparty-side when receiving credentials.\n */\nexport function parsePDLSSFromTransport(transport: TransportPDLSS): PDLSSConfig {\n const pdlss: PDLSSConfig = {};\n\n if (transport.purpose) {\n pdlss.purpose = {\n categories: [transport.purpose.category],\n allowedActions: transport.purpose.action ? [transport.purpose.action] : undefined,\n };\n }\n\n if (transport.duration) {\n pdlss.duration = {\n maxSessionDuration: transport.duration.maxSessionDuration,\n };\n }\n\n if (transport.scope) {\n pdlss.scope = {\n jurisdictions: transport.scope.jurisdiction ? [transport.scope.jurisdiction] : undefined,\n };\n }\n\n return pdlss;\n}\n","/**\n * Decision Client — Counterparty-Side Decision Recording\n *\n * Helper for counterparties to record their grant/deny decisions\n * back to AstraSync after receiving a verification result.\n */\n\nimport type { GatewayConfig } from '../types';\n\ninterface RecordDecisionParams {\n sessionId: string;\n decision: 'granted' | 'denied';\n reason?: string;\n tokenIssued?: boolean;\n auditId?: string;\n}\n\ninterface RecordDecisionResult {\n recorded: boolean;\n blockchainTxHash?: string;\n}\n\n/**\n * Record a counterparty's grant/deny decision for a verification session.\n * POST to /agents/verify-access/:sessionId/decision\n */\nexport async function recordDecision(\n config: GatewayConfig,\n params: RecordDecisionParams,\n): Promise<RecordDecisionResult> {\n const { sessionId, ...body } = params;\n const baseUrl = config.apiBaseUrl.replace(/\\/$/, '');\n const url = `${baseUrl}/agents/verify-access/${encodeURIComponent(sessionId)}/decision`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n if (config.customHeaders) {\n Object.assign(headers, config.customHeaders);\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to record decision for session ${sessionId}: ${response.status} ${errorText}`,\n );\n }\n\n const result = await response.json();\n\n return {\n recorded: result.recorded ?? true,\n blockchainTxHash: result.blockchainTxHash,\n };\n}\n"],"mappings":";AAQA,IAAM,gBAAgB;AAKf,SAAS,eACd,SACA,aACwB;AACxB,QAAM,SAAS,EAAE,GAAG,QAAQ;AAE5B,SAAO,GAAG,aAAa,IAAI,IAAI,YAAY;AAE3C,MAAI,YAAY,WAAW;AACzB,WAAO,GAAG,aAAa,QAAQ,IAAI,YAAY;AAAA,EACjD;AAEA,MAAI,YAAY,cAAc;AAC5B,WAAO,GAAG,aAAa,WAAW,IAAI,YAAY;AAAA,EACpD;AAEA,MAAI,YAAY,OAAO,SAAS;AAC9B,UAAM,eAAe,YAAY,MAAM,QAAQ,SAC3C,GAAG,YAAY,MAAM,QAAQ,QAAQ,IAAI,YAAY,MAAM,QAAQ,MAAM,KACzE,YAAY,MAAM,QAAQ;AAC9B,WAAO,GAAG,aAAa,SAAS,IAAI;AAAA,EACtC;AAEA,MAAI,YAAY,OAAO,UAAU,oBAAoB;AACnD,WAAO,GAAG,aAAa,UAAU,IAAI,OAAO,YAAY,MAAM,SAAS,kBAAkB;AAAA,EAC3F;AAEA,MAAI,YAAY,OAAO,OAAO,cAAc;AAC1C,WAAO,GAAG,aAAa,OAAO,IAAI,YAAY,MAAM,MAAM;AAAA,EAC5D;AAEA,SAAO;AACT;;;ACpBO,SAAS,eACd,MACA,aACS;AACT,QAAM,YAA+B;AAAA,IACnC,SAAS,YAAY;AAAA,EACvB;AAEA,MAAI,YAAY,UAAW,WAAU,YAAY,YAAY;AAC7D,MAAI,YAAY,aAAc,WAAU,eAAe,YAAY;AACnE,MAAI,YAAY,OAAO,QAAS,WAAU,UAAU,YAAY,MAAM;AACtE,MAAI,YAAY,OAAO,SAAU,WAAU,WAAW,YAAY,MAAM;AACxE,MAAI,YAAY,OAAO,MAAO,WAAU,QAAQ,YAAY,MAAM;AAElE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,KAAK;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACrBO,SAAS,WACd,QACA,aACW;AACX,QAAM,YAA2B;AAAA,IAC/B,SAAS,YAAY;AAAA,EACvB;AAEA,MAAI,YAAY,UAAW,WAAU,YAAY,YAAY;AAC7D,MAAI,YAAY,aAAc,WAAU,eAAe,YAAY;AACnE,MAAI,YAAY,OAAO,QAAS,WAAU,UAAU,YAAY,MAAM;AACtE,MAAI,YAAY,OAAO,SAAU,WAAU,WAAW,YAAY,MAAM;AACxE,MAAI,YAAY,OAAO,MAAO,WAAU,QAAQ,YAAY,MAAM;AAElE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;;;ACTO,SAAS,iBACd,UACA,QACA,aACyB;AACzB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,eAAe,QAAkC,WAAW;AAAA,IACrE,KAAK;AACH,aAAO,eAAe,QAAQ,WAAW;AAAA,IAC3C,KAAK;AACH,aAAO,WAAW,QAAQ,WAAW;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;;;AC3BO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,QAA2B;AACrC,SAAK,cAAc;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO,aAAa;AAAA,MAC/B,cAAc,OAAO;AAAA,MACrB,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,KAAa,SAA2C;AAClE,UAAM,EAAE,SAAS,QAAQ,GAAG,aAAa,IAAI,WAAW,CAAC;AAGzD,UAAM,QAA8B,EAAE,GAAG,KAAK,YAAY;AAC1D,QAAI,SAAS;AACX,YAAM,QAAQ;AAAA,QACZ,GAAG,MAAM;AAAA,QACT,SAAS,EAAE,UAAU,SAAS,OAAO;AAAA,MACvC;AAAA,IACF;AAGA,UAAM,kBAA0C,CAAC;AACjD,QAAI,aAAa,SAAS;AACxB,UAAI,aAAa,mBAAmB,SAAS;AAC3C,qBAAa,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC3C,0BAAgB,GAAG,IAAI;AAAA,QACzB,CAAC;AAAA,MACH,WAAW,MAAM,QAAQ,aAAa,OAAO,GAAG;AAC9C,mBAAW,CAAC,KAAK,KAAK,KAAK,aAAa,SAAS;AAC/C,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF,OAAO;AACL,eAAO,OAAO,iBAAiB,aAAa,OAAO;AAAA,MACrD;AAAA,IACF;AAEA,UAAM,kBAAkB,eAAe,iBAAiB,KAAK;AAE7D,WAAO,MAAM,KAAK;AAAA,MAChB,GAAG;AAAA,MACH,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,MACA,WACyB;AACzB,UAAM,QAAQ,KAAK,iBAAiB,SAAS;AAC7C,WAAO,eAAe,MAAM,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,QACA,WACyB;AACzB,UAAM,QAAQ,KAAK,iBAAiB,SAAS;AAC7C,WAAO,WAAW,QAAQ,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,iBACE,UACA,QACA,WACyB;AACzB,UAAM,QAAQ,KAAK,iBAAiB,SAAS;AAC7C,WAAO,iBAAiB,UAAU,QAAQ,KAAK;AAAA,EACjD;AAAA,EAEQ,iBAAiB,WAAyE;AAChG,QAAI,CAAC,WAAW,QAAS,QAAO,KAAK;AAErC,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,OAAO;AAAA,QACL,GAAG,KAAK,YAAY;AAAA,QACpB,SAAS,EAAE,UAAU,UAAU,SAAS,QAAQ,UAAU,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF;;;ACxFO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAY,QAAgC;AAF5C,SAAQ,wBAAqC,oBAAI,IAAI;AAGnD,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,gBAA8B;AAC5C,SAAK,sBAAsB,IAAI,cAAc;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,gBAA8B;AAC1C,SAAK,sBAAsB,OAAO,cAAc;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA2B;AACzB,WAAO,CAAC,GAAG,KAAK,qBAAqB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAA4H;AAC1H,WAAO,CAAC,KAAK,QAAQ;AACnB,YAAM,SAAS,KAAK,gBAAgB,IAAI,IAAI;AAC5C,UAAI,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,MAAkC;AAEhD,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,aAAa;AAAA,UACb,cAAc;AAAA,UACd,uBAAuB,CAAC;AAAA,UACxB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU;AAEhB,QAAI,CAAC,QAAQ,eAAe,CAAC,QAAQ,YAAY,CAAC,QAAQ,WAAW;AACnE,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,aAAa,QAAQ,eAAe;AAAA,UACpC,cAAc;AAAA,UACd,uBAAuB,CAAC;AAAA,UACxB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,YAAY,IAAI,KAAK,QAAQ,SAAS;AAC5C,QAAI,MAAM,WAAW;AACnB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,aAAa,QAAQ;AAAA,UACrB,cAAc;AAAA,UACd,uBAAuB,CAAC;AAAA,UACxB,aAAa,IAAI,YAAY;AAAA,UAC7B,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,aAAa,QAAQ;AAAA,QACrB,cAAc;AAAA,QACd,uBAAuB,KAAK,eAAe;AAAA,QAC3C,aAAa,IAAI,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;;ACnFO,SAAS,wBAAwB,OAAoC;AAC1E,QAAM,YAA4B,CAAC;AAGnC,MAAI,MAAM,SAAS,YAAY,QAAQ;AACrC,cAAU,UAAU;AAAA,MAClB,UAAU,MAAM,QAAQ,WAAW,CAAC;AAAA,MACpC,QAAQ,MAAM,QAAQ,iBAAiB,CAAC;AAAA,IAC1C;AAAA,EACF;AAGA,MAAI,MAAM,UAAU;AAClB,UAAM,aAAuB,CAAC;AAC9B,QAAI,MAAM,SAAS,mBAAoB,YAAW,KAAK,MAAM,SAAS,kBAAkB;AACxF,QAAI,MAAM,SAAS,IAAK,YAAW,KAAK,MAAM,SAAS,GAAG;AAC1D,QAAI,WAAW,SAAS,GAAG;AACzB,gBAAU,WAAW,EAAE,oBAAoB,KAAK,IAAI,GAAG,UAAU,EAAE;AAAA,IACrE;AAAA,EACF;AAGA,MAAI,MAAM,OAAO,eAAe,QAAQ;AACtC,cAAU,QAAQ,EAAE,cAAc,MAAM,MAAM,cAAc,CAAC,EAAE;AAAA,EACjE;AAEA,SAAO;AACT;AAMO,SAAS,wBAAwB,WAAwC;AAC9E,QAAM,QAAqB,CAAC;AAE5B,MAAI,UAAU,SAAS;AACrB,UAAM,UAAU;AAAA,MACd,YAAY,CAAC,UAAU,QAAQ,QAAQ;AAAA,MACvC,gBAAgB,UAAU,QAAQ,SAAS,CAAC,UAAU,QAAQ,MAAM,IAAI;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,UAAU,UAAU;AACtB,UAAM,WAAW;AAAA,MACf,oBAAoB,UAAU,SAAS;AAAA,IACzC;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACnB,UAAM,QAAQ;AAAA,MACZ,eAAe,UAAU,MAAM,eAAe,CAAC,UAAU,MAAM,YAAY,IAAI;AAAA,IACjF;AAAA,EACF;AAEA,SAAO;AACT;;;ACjFA,eAAsB,eACpB,QACA,QAC+B;AAC/B,QAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,QAAM,UAAU,OAAO,WAAW,QAAQ,OAAO,EAAE;AACnD,QAAM,MAAM,GAAG,OAAO,yBAAyB,mBAAmB,SAAS,CAAC;AAE5E,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,EAClB;AAEA,MAAI,OAAO,QAAQ;AACjB,YAAQ,eAAe,IAAI,UAAU,OAAO,MAAM;AAAA,EACpD;AAEA,MAAI,OAAO,eAAe;AACxB,WAAO,OAAO,SAAS,OAAO,aAAa;AAAA,EAC7C;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,eAAe;AACnE,UAAM,IAAI;AAAA,MACR,yCAAyC,SAAS,KAAK,SAAS,MAAM,IAAI,SAAS;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,SAAO;AAAA,IACL,UAAU,OAAO,YAAY;AAAA,IAC7B,kBAAkB,OAAO;AAAA,EAC3B;AACF;","names":[]}
@@ -0,0 +1,106 @@
1
+ import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.mjs';
2
+ import { P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-BvpGdsv1.mjs';
3
+ import '../gateway/gateway.mjs';
4
+ import '../types-Bf8pML07.mjs';
5
+
6
+ /**
7
+ * @astrasyncai/adapter-openclaw-browser
8
+ *
9
+ * Layer 4 adapter for browser-based AI agents (e.g. OpenClaw browser extension).
10
+ * Intercepts page navigation, form submissions, and network requests
11
+ * made by the agent in the browser DOM.
12
+ *
13
+ * The adapter does NOT depend on chrome types. The browser extension
14
+ * passes the chrome/browser API via a minimal interface at initialize() time.
15
+ *
16
+ * ~300 lines — thin, disposable, platform-specific.
17
+ */
18
+
19
+ interface WebRequestDetails {
20
+ requestId: string;
21
+ url: string;
22
+ method: string;
23
+ type: string;
24
+ tabId: number;
25
+ initiator?: string;
26
+ documentUrl?: string;
27
+ }
28
+ interface BlockingResponse {
29
+ cancel?: boolean;
30
+ redirectUrl?: string;
31
+ }
32
+ interface RequestFilter {
33
+ urls: string[];
34
+ types?: string[];
35
+ }
36
+ interface BrowserExtensionAPI {
37
+ webRequest: {
38
+ onBeforeRequest: {
39
+ addListener(callback: (details: WebRequestDetails) => BlockingResponse | void, filter: RequestFilter, extraInfoSpec?: string[]): void;
40
+ removeListener(callback: (details: WebRequestDetails) => BlockingResponse | void): void;
41
+ };
42
+ };
43
+ webNavigation: {
44
+ onBeforeNavigate: {
45
+ addListener(callback: (details: NavigationDetails) => void): void;
46
+ removeListener(callback: (details: NavigationDetails) => void): void;
47
+ };
48
+ };
49
+ runtime: {
50
+ sendMessage(message: unknown): Promise<unknown>;
51
+ onMessage: {
52
+ addListener(callback: (message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void): void;
53
+ removeListener(callback: (...args: unknown[]) => void): void;
54
+ };
55
+ };
56
+ notifications?: {
57
+ create(id: string, options: {
58
+ type: string;
59
+ title: string;
60
+ message: string;
61
+ iconUrl?: string;
62
+ }): void;
63
+ };
64
+ }
65
+ interface NavigationDetails {
66
+ tabId: number;
67
+ url: string;
68
+ frameId: number;
69
+ }
70
+ interface BrowserAdapterOptions {
71
+ /** The browser extension API object (chrome or browser) */
72
+ browserAPI: BrowserExtensionAPI;
73
+ /** URL patterns to intercept (default: ['<all_urls>']) */
74
+ urlPatterns?: string[];
75
+ /** Request types to intercept (default: main_frame, xmlhttprequest, sub_frame) */
76
+ requestTypes?: string[];
77
+ /** Callback for MANUAL_REVIEW decisions */
78
+ onApprovalRequired?: (context: PDLSSContext, decision: VerificationDecision) => Promise<boolean>;
79
+ }
80
+ declare class BrowserAdapter implements PlatformAdapter {
81
+ readonly interfaceVersion = 1;
82
+ private gateway;
83
+ private browserAPI;
84
+ private options;
85
+ private requestListener;
86
+ private navigationListener;
87
+ private messageListener;
88
+ private _isRunning;
89
+ constructor(options?: Partial<BrowserAdapterOptions>);
90
+ get isRunning(): boolean;
91
+ initialize(config: AdapterConfig): Promise<void>;
92
+ shutdown(): Promise<void>;
93
+ interceptAction(action: AgentAction): Promise<InterceptResult>;
94
+ extractContext(action: AgentAction): PDLSSContext;
95
+ enforceDecision(decision: VerificationDecision): Promise<void>;
96
+ private handleWebRequest;
97
+ private handleNavigation;
98
+ private handleContentScriptAction;
99
+ /**
100
+ * Synchronous evaluation using the gateway's local evaluator.
101
+ * Falls back to ALLOW if async-only (online mode).
102
+ */
103
+ private evaluateSync;
104
+ }
105
+
106
+ export { type BlockingResponse, BrowserAdapter, type BrowserAdapterOptions, type BrowserExtensionAPI, type NavigationDetails, type RequestFilter, type WebRequestDetails };
@@ -0,0 +1,106 @@
1
+ import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.js';
2
+ import { P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-Ce2mFJkO.js';
3
+ import '../gateway/gateway.js';
4
+ import '../types-Bf8pML07.js';
5
+
6
+ /**
7
+ * @astrasyncai/adapter-openclaw-browser
8
+ *
9
+ * Layer 4 adapter for browser-based AI agents (e.g. OpenClaw browser extension).
10
+ * Intercepts page navigation, form submissions, and network requests
11
+ * made by the agent in the browser DOM.
12
+ *
13
+ * The adapter does NOT depend on chrome types. The browser extension
14
+ * passes the chrome/browser API via a minimal interface at initialize() time.
15
+ *
16
+ * ~300 lines — thin, disposable, platform-specific.
17
+ */
18
+
19
+ interface WebRequestDetails {
20
+ requestId: string;
21
+ url: string;
22
+ method: string;
23
+ type: string;
24
+ tabId: number;
25
+ initiator?: string;
26
+ documentUrl?: string;
27
+ }
28
+ interface BlockingResponse {
29
+ cancel?: boolean;
30
+ redirectUrl?: string;
31
+ }
32
+ interface RequestFilter {
33
+ urls: string[];
34
+ types?: string[];
35
+ }
36
+ interface BrowserExtensionAPI {
37
+ webRequest: {
38
+ onBeforeRequest: {
39
+ addListener(callback: (details: WebRequestDetails) => BlockingResponse | void, filter: RequestFilter, extraInfoSpec?: string[]): void;
40
+ removeListener(callback: (details: WebRequestDetails) => BlockingResponse | void): void;
41
+ };
42
+ };
43
+ webNavigation: {
44
+ onBeforeNavigate: {
45
+ addListener(callback: (details: NavigationDetails) => void): void;
46
+ removeListener(callback: (details: NavigationDetails) => void): void;
47
+ };
48
+ };
49
+ runtime: {
50
+ sendMessage(message: unknown): Promise<unknown>;
51
+ onMessage: {
52
+ addListener(callback: (message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void): void;
53
+ removeListener(callback: (...args: unknown[]) => void): void;
54
+ };
55
+ };
56
+ notifications?: {
57
+ create(id: string, options: {
58
+ type: string;
59
+ title: string;
60
+ message: string;
61
+ iconUrl?: string;
62
+ }): void;
63
+ };
64
+ }
65
+ interface NavigationDetails {
66
+ tabId: number;
67
+ url: string;
68
+ frameId: number;
69
+ }
70
+ interface BrowserAdapterOptions {
71
+ /** The browser extension API object (chrome or browser) */
72
+ browserAPI: BrowserExtensionAPI;
73
+ /** URL patterns to intercept (default: ['<all_urls>']) */
74
+ urlPatterns?: string[];
75
+ /** Request types to intercept (default: main_frame, xmlhttprequest, sub_frame) */
76
+ requestTypes?: string[];
77
+ /** Callback for MANUAL_REVIEW decisions */
78
+ onApprovalRequired?: (context: PDLSSContext, decision: VerificationDecision) => Promise<boolean>;
79
+ }
80
+ declare class BrowserAdapter implements PlatformAdapter {
81
+ readonly interfaceVersion = 1;
82
+ private gateway;
83
+ private browserAPI;
84
+ private options;
85
+ private requestListener;
86
+ private navigationListener;
87
+ private messageListener;
88
+ private _isRunning;
89
+ constructor(options?: Partial<BrowserAdapterOptions>);
90
+ get isRunning(): boolean;
91
+ initialize(config: AdapterConfig): Promise<void>;
92
+ shutdown(): Promise<void>;
93
+ interceptAction(action: AgentAction): Promise<InterceptResult>;
94
+ extractContext(action: AgentAction): PDLSSContext;
95
+ enforceDecision(decision: VerificationDecision): Promise<void>;
96
+ private handleWebRequest;
97
+ private handleNavigation;
98
+ private handleContentScriptAction;
99
+ /**
100
+ * Synchronous evaluation using the gateway's local evaluator.
101
+ * Falls back to ALLOW if async-only (online mode).
102
+ */
103
+ private evaluateSync;
104
+ }
105
+
106
+ export { type BlockingResponse, BrowserAdapter, type BrowserAdapterOptions, type BrowserExtensionAPI, type NavigationDetails, type RequestFilter, type WebRequestDetails };