@aauth/proxy 0.1.3

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 (54) hide show
  1. package/README.md +75 -0
  2. package/dist/agent.d.ts +37 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +220 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/host.d.ts +6 -0
  7. package/dist/host.d.ts.map +1 -0
  8. package/dist/host.js +27 -0
  9. package/dist/host.js.map +1 -0
  10. package/dist/identity-local.d.ts +10 -0
  11. package/dist/identity-local.d.ts.map +1 -0
  12. package/dist/identity-local.js +70 -0
  13. package/dist/identity-local.js.map +1 -0
  14. package/dist/identity.d.ts +13 -0
  15. package/dist/identity.d.ts.map +1 -0
  16. package/dist/identity.js +11 -0
  17. package/dist/identity.js.map +1 -0
  18. package/dist/index.d.ts +15 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +13 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/registry.d.ts +34 -0
  23. package/dist/registry.d.ts.map +1 -0
  24. package/dist/registry.js +60 -0
  25. package/dist/registry.js.map +1 -0
  26. package/dist/resource.d.ts +38 -0
  27. package/dist/resource.d.ts.map +1 -0
  28. package/dist/resource.js +159 -0
  29. package/dist/resource.js.map +1 -0
  30. package/dist/server.d.ts +3 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +119 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/store.d.ts +28 -0
  35. package/dist/store.d.ts.map +1 -0
  36. package/dist/store.js +64 -0
  37. package/dist/store.js.map +1 -0
  38. package/dist/tools.d.ts +28 -0
  39. package/dist/tools.d.ts.map +1 -0
  40. package/dist/tools.js +253 -0
  41. package/dist/tools.js.map +1 -0
  42. package/dist/vocab/index.d.ts +6 -0
  43. package/dist/vocab/index.d.ts.map +1 -0
  44. package/dist/vocab/index.js +19 -0
  45. package/dist/vocab/index.js.map +1 -0
  46. package/dist/vocab/openapi.d.ts +43 -0
  47. package/dist/vocab/openapi.d.ts.map +1 -0
  48. package/dist/vocab/openapi.js +113 -0
  49. package/dist/vocab/openapi.js.map +1 -0
  50. package/dist/vocab/types.d.ts +47 -0
  51. package/dist/vocab/types.d.ts.map +1 -0
  52. package/dist/vocab/types.js +11 -0
  53. package/dist/vocab/types.js.map +1 -0
  54. package/package.json +59 -0
package/dist/tools.js ADDED
@@ -0,0 +1,253 @@
1
+ // The eight-tool v1 discovery surface (design.md §"Tool surface"), built against
2
+ // an injected dependency bundle so both the stdio bin and any HTTP host share
3
+ // one core. Each tool's description embeds the L1 snapshot taken at build time
4
+ // so the common path needs no extra round-trip.
5
+ //
6
+ // Transport-agnostic: no fs, no stdio, no child_process. The stdio bin
7
+ // (server.ts) supplies fs/local-keys deps + a browser-launch onInteraction;
8
+ // other hosts supply their own backends and surface interaction URLs however
9
+ // their transport allows.
10
+ import { z } from 'zod';
11
+ import { invokeAtResource, invokeAtResourceComplete } from './agent.js';
12
+ import { canonicalizeHost } from './host.js';
13
+ import { fetchRegistry } from './registry.js';
14
+ import { fetchResource, getOperationsForResource, listOperationsForResource, toL1Entry, } from './resource.js';
15
+ const text = (s) => ({ content: [{ type: 'text', text: s }] });
16
+ const json = (v) => text(JSON.stringify(v, null, 2));
17
+ const BOOTSTRAP_GUIDANCE = `The agent proxy has no AAuth identity on this machine yet.
18
+
19
+ To set one up, run:
20
+
21
+ npx @aauth/bootstrap list
22
+
23
+ …then follow the setup skill:
24
+
25
+ npx @aauth/bootstrap skill setup
26
+
27
+ That guide walks through generating a keypair (Secure Enclave / YubiKey / software),
28
+ binding a Person Server, and publishing the JWKS. When it's done, call this tool again.`;
29
+ // Registers the agent proxy's eight tools on `server`. Async because the L1 snapshot
30
+ // embedded in tool descriptions is read once at build time from the (possibly
31
+ // async) store.
32
+ export async function buildProxyTools(server, deps) {
33
+ const { l1, registryCache, identity, docCache } = deps;
34
+ // Identity is resolved lazily per call; the provider owns any caching (which
35
+ // must be per-principal — a shared process-global cache would leak identities
36
+ // across tenants in a multi-user host).
37
+ async function getConfig() {
38
+ const status = await identity.resolve({ local: deps.agentLocal?.() });
39
+ if (status.kind === 'needsBootstrap')
40
+ return { ok: false };
41
+ return { ok: true, cfg: status.cfg };
42
+ }
43
+ // Snapshot of L1 for tool descriptions, taken once at registration. Keeps the
44
+ // always-loaded context cheap; list_resources is the authoritative fresh view.
45
+ const snapshot = (await l1.list()).map((e) => e.resource);
46
+ const l1Snapshot = snapshot.length === 0 ? 'no resources added yet' : snapshot.join(', ');
47
+ const describeWithL1 = (base) => `${base}\n\nCurrently added resources: ${l1Snapshot}`;
48
+ async function requireL1(resource) {
49
+ const canonical = canonicalizeHost(resource);
50
+ if (!canonical)
51
+ return { ok: false, msg: `Invalid resource host: ${resource}` };
52
+ const entry = await l1.get(canonical.host);
53
+ if (!entry)
54
+ return {
55
+ ok: false,
56
+ msg: `Resource not added: ${canonical.host}. Call add_resource("${canonical.host}") first.`,
57
+ };
58
+ return { ok: true, l1: entry };
59
+ }
60
+ // Surface an interaction: hand it to the side-channel (e.g. open a browser)
61
+ // and return the URL as text so the LLM can relay it regardless of transport.
62
+ function surfaceInteraction(url, code, retryTool) {
63
+ const full = `${url}?code=${code}`;
64
+ deps.onInteraction?.(url, code);
65
+ return text(`Authorization required. Open this URL to continue (your client may open it automatically), then call ${retryTool} again:\n${full}`);
66
+ }
67
+ // ── Resource lifecycle ──
68
+ server.registerTool('find_resources', {
69
+ description: describeWithL1('Search the AAuth registry for discoverable resources by free-text query against name/description. Returns each result tagged `added: true` if already in your local resource set.'),
70
+ inputSchema: { query: z.string().optional() },
71
+ }, async ({ query }) => {
72
+ const c = await getConfig();
73
+ if (!c.ok)
74
+ return text(BOOTSTRAP_GUIDANCE);
75
+ try {
76
+ const index = await fetchRegistry(c.cfg, registryCache);
77
+ const q = (query ?? '').trim().toLowerCase();
78
+ const added = new Set((await l1.list()).map((e) => e.resource));
79
+ const filtered = index.resources
80
+ .filter((r) => {
81
+ if (!q)
82
+ return true;
83
+ return (r.name.toLowerCase().includes(q) ||
84
+ r.description.toLowerCase().includes(q) ||
85
+ r.issuer.toLowerCase().includes(q));
86
+ })
87
+ .map((r) => {
88
+ const host = canonicalizeHost(r.issuer)?.host ?? r.issuer;
89
+ return {
90
+ resource: host,
91
+ name: r.name,
92
+ description: r.description,
93
+ access_mode: r.access_mode,
94
+ added: added.has(host),
95
+ ...(r.logo_uri ? { logo_uri: r.logo_uri } : {}),
96
+ };
97
+ });
98
+ return json(filtered);
99
+ }
100
+ catch (err) {
101
+ return text(`registry error: ${err.message}`);
102
+ }
103
+ });
104
+ server.registerTool('add_resource', {
105
+ description: describeWithL1('Add an AAuth resource to your local set. Pass a bare host, host:port, or full URL — the agent proxy canonicalizes. Fetches the resource\'s well-known doc, validates, picks supported vocabularies. After adding: agent-token resources are immediately invokable; aauth-access-token/auth-token resources need `connect` or a first `invoke` that surfaces the auth URL.'),
106
+ inputSchema: { resource: z.string() },
107
+ }, async ({ resource }) => {
108
+ try {
109
+ const fetched = await fetchResource(resource);
110
+ const entry = toL1Entry(fetched);
111
+ await l1.upsert(entry);
112
+ return json({
113
+ added: entry.resource,
114
+ access_mode: entry.access_mode,
115
+ vocabularies: entry.picked_vocabs.map((v) => v.vocabUri),
116
+ connect_required: entry.access_mode !== 'agent-token',
117
+ });
118
+ }
119
+ catch (err) {
120
+ return text(`add_resource error: ${err.message}`);
121
+ }
122
+ });
123
+ server.registerTool('list_resources', {
124
+ description: 'Return your locally added resources with name, description, access_mode, last_used, and how many vocabularies the agent proxy picked. Cheap; safe to call anytime.',
125
+ }, async () => {
126
+ const entries = (await l1.list()).map((e) => ({
127
+ resource: e.resource,
128
+ name: e.name,
129
+ description: e.description,
130
+ access_mode: e.access_mode,
131
+ vocabularies: e.picked_vocabs.map((v) => v.vocabUri),
132
+ added: e.added,
133
+ last_used: e.last_used,
134
+ }));
135
+ return json(entries);
136
+ });
137
+ server.registerTool('remove_resource', {
138
+ description: describeWithL1('Remove a resource from your local set. Agent-proxy-local only — does NOT revoke any user grants at the Person Server; re-adding picks up existing grants transparently.'),
139
+ inputSchema: { resource: z.string() },
140
+ }, async ({ resource }) => {
141
+ const canonical = canonicalizeHost(resource);
142
+ if (!canonical)
143
+ return text(`invalid host: ${resource}`);
144
+ const removed = await l1.remove(canonical.host);
145
+ return text(removed ? `removed ${canonical.host}` : `not found: ${canonical.host}`);
146
+ });
147
+ server.registerTool('connect', {
148
+ description: describeWithL1('Pre-authorize a resource — trigger a Person Server consent step if needed. No-op for agent-token resources. For aauth-access-token/auth-token resources, invokes a probe operation to surface the auth URL; returns "already connected" if the auth succeeds.'),
149
+ inputSchema: { resource: z.string() },
150
+ }, async ({ resource }) => {
151
+ const c = await getConfig();
152
+ if (!c.ok)
153
+ return text(BOOTSTRAP_GUIDANCE);
154
+ const found = await requireL1(resource);
155
+ if (!found.ok)
156
+ return text(found.msg);
157
+ const { l1: entry } = found;
158
+ if (entry.access_mode === 'agent-token') {
159
+ return text(`${entry.resource}: already connected (agent-token access mode)`);
160
+ }
161
+ const ops = await listOperationsForResource(entry, undefined, docCache);
162
+ const probe = ops.find((o) => o.kind === 'sync.request' && o.method === 'GET');
163
+ if (!probe)
164
+ return text(`${entry.resource}: no probe operation available for connect`);
165
+ const result = await invokeAtResource(c.cfg, entry, probe.opId, {});
166
+ if (result.kind === 'interaction') {
167
+ return surfaceInteraction(result.interaction.url, result.interaction.code, 'connect');
168
+ }
169
+ if (result.status >= 200 && result.status < 300) {
170
+ await l1.touch(entry.resource);
171
+ return text(`${entry.resource}: connected.`);
172
+ }
173
+ return text(`${entry.resource}: connect probe returned ${result.status} — ${JSON.stringify(result.body)}`);
174
+ });
175
+ // ── Operations ──
176
+ server.registerTool('list_operations', {
177
+ description: describeWithL1('List operations a resource exposes. Optional `query` is either free-text (matched against opId/summary/tags) or an OpenAPI path prefix (e.g. "/crm/v3/objects/contacts/*"). Returns summaries only — schemas are fetched via get_operations to keep token cost flat. Each op carries `kind` (sync.request/async.send/async.receive).'),
178
+ inputSchema: { resource: z.string(), query: z.string().optional() },
179
+ }, async ({ resource, query }) => {
180
+ const found = await requireL1(resource);
181
+ if (!found.ok)
182
+ return text(found.msg);
183
+ try {
184
+ const ops = await listOperationsForResource(found.l1, query, docCache);
185
+ return json(ops);
186
+ }
187
+ catch (err) {
188
+ return text(`list_operations error: ${err.message}`);
189
+ }
190
+ });
191
+ server.registerTool('get_operations', {
192
+ description: describeWithL1('Batch fetch full schemas (params, request body, response) for one or more operations on a resource. Separate from list_operations because schemas dominate token cost.'),
193
+ inputSchema: { resource: z.string(), op_ids: z.array(z.string()) },
194
+ }, async ({ resource, op_ids }) => {
195
+ const found = await requireL1(resource);
196
+ if (!found.ok)
197
+ return text(found.msg);
198
+ try {
199
+ const details = await getOperationsForResource(found.l1, op_ids, docCache);
200
+ return json(details);
201
+ }
202
+ catch (err) {
203
+ return text(`get_operations error: ${err.message}`);
204
+ }
205
+ });
206
+ server.registerTool('invoke', {
207
+ description: describeWithL1('Invoke an operation on a resource. Pass `path_params`, `query`, `body` (object) as needed. On first call to an unauthorized aauth-access-token resource, returns an auth URL — open it, then call invoke again. async.receive operations return `subscribe_requires_subagent` (v.next).'),
208
+ inputSchema: {
209
+ resource: z.string(),
210
+ op_id: z.string(),
211
+ path_params: z.record(z.string(), z.string()).optional(),
212
+ query: z.string().optional(),
213
+ body: z.record(z.string(), z.unknown()).optional(),
214
+ },
215
+ }, async ({ resource, op_id, path_params, query, body }, extra) => {
216
+ const c = await getConfig();
217
+ if (!c.ok)
218
+ return text(BOOTSTRAP_GUIDANCE);
219
+ const found = await requireL1(resource);
220
+ if (!found.ok)
221
+ return text(found.msg);
222
+ const invokeArgs = { pathParams: path_params, query, body };
223
+ try {
224
+ // 'await' mode: block — relay + poll the interaction to completion, return
225
+ // the result on this original call. (HTTP hosts holding a long call open.)
226
+ if (deps.interaction?.mode === 'await') {
227
+ const inter = deps.interaction;
228
+ // Per-request context so host callbacks can push to the client (e.g.
229
+ // emit notifications/progress carrying the interaction URL + heartbeats).
230
+ const ctx = {
231
+ sendNotification: (n) => extra.sendNotification(n),
232
+ progressToken: extra._meta?.progressToken,
233
+ };
234
+ const completed = await invokeAtResourceComplete(c.cfg, found.l1, op_id, (url, code) => inter.onInteraction?.(url, code, ctx), invokeArgs, 5, inter.pollTimeoutMs ?? 180_000, (elapsedMs) => inter.onPoll?.(elapsedMs, ctx));
235
+ if (completed.status >= 200 && completed.status < 300)
236
+ await l1.touch(found.l1.resource);
237
+ return json(completed);
238
+ }
239
+ // 'surface' mode (default): non-blocking — return the URL as text.
240
+ const result = await invokeAtResource(c.cfg, found.l1, op_id, invokeArgs);
241
+ if (result.kind === 'interaction') {
242
+ return surfaceInteraction(result.interaction.url, result.interaction.code, 'invoke');
243
+ }
244
+ if (result.status >= 200 && result.status < 300)
245
+ await l1.touch(found.l1.resource);
246
+ return json({ status: result.status, body: result.body });
247
+ }
248
+ catch (err) {
249
+ return text(`invoke error: ${err.message}`);
250
+ }
251
+ });
252
+ }
253
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { VocabAdapter } from './types.js';
2
+ export * from './types.js';
3
+ export { OpenAPIAdapter } from './openapi.js';
4
+ export declare function getAdapter(vocabUri: string): VocabAdapter | undefined;
5
+ export declare function supportedVocabUris(): string[];
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vocab/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAS7C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAErE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -0,0 +1,19 @@
1
+ // Vocabulary adapter registry. The agent proxy picks adapters at resource-load time by
2
+ // walking `r3_vocabularies` from the well-known doc and selecting every URN
3
+ // it has an adapter for.
4
+ import { OpenAPIAdapter } from './openapi.js';
5
+ export * from './types.js';
6
+ export { OpenAPIAdapter } from './openapi.js';
7
+ const ADAPTERS = {
8
+ 'urn:aauth:vocabulary:openapi': new OpenAPIAdapter(),
9
+ // 'urn:aauth:vocabulary:asyncapi': new AsyncAPIAdapter(), // Phase 3
10
+ // 'urn:aauth:vocabulary:mcp-tools': new MCPToolsAdapter(), // future
11
+ // 'urn:aauth:vocabulary:graphql': new GraphQLAdapter(), // future
12
+ };
13
+ export function getAdapter(vocabUri) {
14
+ return ADAPTERS[vocabUri];
15
+ }
16
+ export function supportedVocabUris() {
17
+ return Object.keys(ADAPTERS);
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vocab/index.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,4EAA4E;AAC5E,yBAAyB;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAG7C,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,QAAQ,GAAiC;IAC7C,8BAA8B,EAAE,IAAI,cAAc,EAAE;IACpD,uEAAuE;IACvE,sEAAsE;IACtE,sEAAsE;CACvE,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { InvocationPlan, InvokeArgs, OpDetail, OpSummary, VocabAdapter } from './types.js';
2
+ declare const HTTP_METHODS: readonly ["get", "post", "put", "delete", "patch", "head", "options"];
3
+ type HttpMethod = (typeof HTTP_METHODS)[number];
4
+ interface OpenAPIOperation {
5
+ operationId?: string;
6
+ summary?: string;
7
+ description?: string;
8
+ tags?: string[];
9
+ parameters?: unknown[];
10
+ requestBody?: unknown;
11
+ responses?: Record<string, unknown>;
12
+ }
13
+ type OpenAPIPathItem = Partial<Record<HttpMethod, OpenAPIOperation>> & {
14
+ parameters?: unknown[];
15
+ };
16
+ interface OpenAPIDoc {
17
+ openapi?: string;
18
+ paths: Record<string, OpenAPIPathItem>;
19
+ components?: Record<string, unknown>;
20
+ }
21
+ interface ResolvedOp {
22
+ opId: string;
23
+ method: string;
24
+ path: string;
25
+ summary?: string;
26
+ tags?: string[];
27
+ parameters?: unknown[];
28
+ requestBody?: unknown;
29
+ responses?: Record<string, unknown>;
30
+ }
31
+ export interface OpenAPIVocabDoc {
32
+ raw: OpenAPIDoc;
33
+ ops: Map<string, ResolvedOp>;
34
+ }
35
+ export declare class OpenAPIAdapter implements VocabAdapter<OpenAPIVocabDoc> {
36
+ readonly vocabUri = "urn:aauth:vocabulary:openapi";
37
+ load(url: string): Promise<OpenAPIVocabDoc>;
38
+ listOperations(doc: OpenAPIVocabDoc, query?: string): OpSummary[];
39
+ getOperations(doc: OpenAPIVocabDoc, opIds: string[]): OpDetail[];
40
+ buildInvocation(doc: OpenAPIVocabDoc, opId: string, args: InvokeArgs): InvocationPlan;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/vocab/openapi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAA;AAEnB,QAAA,MAAM,YAAY,uEAAwE,CAAA;AAC1F,KAAK,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/C,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED,KAAK,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,GAAG;IACrE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;CACvB,CAAA;AAED,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CAC7B;AA6CD,qBAAa,cAAe,YAAW,YAAY,CAAC,eAAe,CAAC;IAClE,QAAQ,CAAC,QAAQ,kCAAiC;IAE5C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOjD,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAiBjE,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE;IAoBhE,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,cAAc;CAkBtF"}
@@ -0,0 +1,113 @@
1
+ // OpenAPI 3.x vocabulary adapter. All ops are `sync.request`.
2
+ //
3
+ // listOperations supports two query modes:
4
+ // - free-text: matched against opId, summary, tags (case-insensitive substring)
5
+ // - path prefix: query starts with '/'; optional trailing /* — matches path prefix
6
+ // Both are bounded; the caller decides on a result cap.
7
+ const HTTP_METHODS = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];
8
+ function indexOperations(doc) {
9
+ const ops = new Map();
10
+ for (const [path, item] of Object.entries(doc.paths ?? {})) {
11
+ if (!item)
12
+ continue;
13
+ for (const method of HTTP_METHODS) {
14
+ const op = item[method];
15
+ if (!op?.operationId)
16
+ continue;
17
+ ops.set(op.operationId, {
18
+ opId: op.operationId,
19
+ method: method.toUpperCase(),
20
+ path,
21
+ summary: op.summary ?? op.description,
22
+ tags: op.tags,
23
+ parameters: [...(item.parameters ?? []), ...(op.parameters ?? [])],
24
+ requestBody: op.requestBody,
25
+ responses: op.responses,
26
+ });
27
+ }
28
+ }
29
+ return ops;
30
+ }
31
+ function matches(op, query) {
32
+ if (!query)
33
+ return true;
34
+ // Path prefix mode: '/foo' or '/foo/*' — match against the op's path.
35
+ if (query.startsWith('/')) {
36
+ const prefix = query.endsWith('/*') ? query.slice(0, -2) : query;
37
+ return op.path.toLowerCase().startsWith(prefix.toLowerCase());
38
+ }
39
+ const q = query.toLowerCase();
40
+ return (op.opId.toLowerCase().includes(q) ||
41
+ (op.summary?.toLowerCase().includes(q) ?? false) ||
42
+ (op.tags?.some((t) => t.toLowerCase().includes(q)) ?? false));
43
+ }
44
+ function applyPathParams(path, pathParams = {}) {
45
+ return path.replace(/\{(\w+)\}/g, (_m, name) => encodeURIComponent(pathParams[name] ?? ''));
46
+ }
47
+ export class OpenAPIAdapter {
48
+ vocabUri = 'urn:aauth:vocabulary:openapi';
49
+ async load(url) {
50
+ const res = await fetch(url);
51
+ if (!res.ok)
52
+ throw new Error(`openapi load ${url}: ${res.status}`);
53
+ const raw = (await res.json());
54
+ return { raw, ops: indexOperations(raw) };
55
+ }
56
+ listOperations(doc, query) {
57
+ const q = query ?? '';
58
+ const out = [];
59
+ for (const op of doc.ops.values()) {
60
+ if (!matches(op, q))
61
+ continue;
62
+ out.push({
63
+ opId: op.opId,
64
+ kind: 'sync.request',
65
+ summary: op.summary,
66
+ method: op.method,
67
+ path: op.path,
68
+ tags: op.tags,
69
+ });
70
+ }
71
+ return out;
72
+ }
73
+ getOperations(doc, opIds) {
74
+ const out = [];
75
+ for (const opId of opIds) {
76
+ const op = doc.ops.get(opId);
77
+ if (!op)
78
+ continue;
79
+ out.push({
80
+ opId: op.opId,
81
+ kind: 'sync.request',
82
+ summary: op.summary,
83
+ method: op.method,
84
+ path: op.path,
85
+ tags: op.tags,
86
+ paramsSchema: op.parameters,
87
+ bodySchema: op.requestBody,
88
+ responseSchema: op.responses,
89
+ });
90
+ }
91
+ return out;
92
+ }
93
+ buildInvocation(doc, opId, args) {
94
+ const op = doc.ops.get(opId);
95
+ if (!op)
96
+ throw new Error(`openapi: unknown operation ${opId}`);
97
+ const path = applyPathParams(op.path, args.pathParams);
98
+ const body = args.body;
99
+ return {
100
+ kind: 'sync.request',
101
+ method: op.method,
102
+ path,
103
+ ...(args.query !== undefined ? { query: args.query } : {}),
104
+ ...(body !== undefined
105
+ ? {
106
+ headers: { 'content-type': args.contentType ?? 'application/json' },
107
+ body: typeof body === 'string' ? body : JSON.stringify(body),
108
+ }
109
+ : {}),
110
+ };
111
+ }
112
+ }
113
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/vocab/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export type OpKind = 'sync.request' | 'async.send' | 'async.receive';
2
+ export interface OpSummary {
3
+ opId: string;
4
+ kind: OpKind;
5
+ summary?: string;
6
+ method?: string;
7
+ path?: string;
8
+ channel?: string;
9
+ tags?: string[];
10
+ }
11
+ export interface OpDetail extends OpSummary {
12
+ paramsSchema?: unknown;
13
+ bodySchema?: unknown;
14
+ responseSchema?: unknown;
15
+ }
16
+ export type InvocationPlan = {
17
+ kind: 'sync.request';
18
+ method: string;
19
+ path: string;
20
+ query?: string;
21
+ headers?: Record<string, string>;
22
+ body?: string;
23
+ } | {
24
+ kind: 'async.send';
25
+ channel: string;
26
+ message: unknown;
27
+ headers?: Record<string, string>;
28
+ } | {
29
+ kind: 'async.receive';
30
+ channel: string;
31
+ filter?: unknown;
32
+ };
33
+ export interface InvokeArgs {
34
+ pathParams?: Record<string, string>;
35
+ query?: string;
36
+ body?: unknown;
37
+ contentType?: string;
38
+ message?: unknown;
39
+ }
40
+ export interface VocabAdapter<Doc = unknown> {
41
+ readonly vocabUri: string;
42
+ load(url: string): Promise<Doc>;
43
+ listOperations(doc: Doc, query?: string): OpSummary[];
44
+ getOperations(doc: Doc, opIds: string[]): OpDetail[];
45
+ buildInvocation(doc: Doc, opId: string, args: InvokeArgs): InvocationPlan;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vocab/types.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe,CAAA;AAEpE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,QAAS,SAAQ,SAAS;IAKzC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GACD;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,GACD;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAKL,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,GAAG,GAAG,OAAO;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAA;IACrD,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;IACpD,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,cAAc,CAAA;CAC1E"}
@@ -0,0 +1,11 @@
1
+ // Vocabulary adapter contract. A resource advertises one or more vocabularies
2
+ // in `r3_vocabularies` ({ urn → vocab_doc_url }). Each adapter knows how to:
3
+ // - fetch + parse the doc
4
+ // - enumerate operations as bounded summaries (for list_operations)
5
+ // - return full schemas for chosen op_ids (for get_operations)
6
+ // - turn (opId, args) into an InvocationPlan the agent proxy's `invoke` can execute
7
+ //
8
+ // See design.md §"Vocabularies". The LLM never sees `vocab` — it sees
9
+ // `kind` (sync.request | async.send | async.receive) on each OpSummary.
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vocab/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,4BAA4B;AAC5B,sEAAsE;AACtE,iEAAiE;AACjE,sFAAsF;AACtF,EAAE;AACF,sEAAsE;AACtE,wEAAwE"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@aauth/proxy",
3
+ "version": "0.1.3",
4
+ "description": "The user's AAuth agent in MCP form — discovery, identity, interaction relay",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "default": "./dist/index.js"
10
+ },
11
+ "./local": {
12
+ "types": "./dist/identity-local.d.ts",
13
+ "default": "./dist/identity-local.js"
14
+ }
15
+ },
16
+ "bin": {
17
+ "aauth-proxy": "./dist/server.js"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "typecheck": "tsc --noEmit",
25
+ "test": "vitest run",
26
+ "dev": "tsx src/server.ts",
27
+ "prepublishOnly": "npm run build"
28
+ },
29
+ "keywords": [
30
+ "aauth",
31
+ "mcp",
32
+ "agent",
33
+ "identity"
34
+ ],
35
+ "author": "Dick Hardt <dick.hardt@hello.coop>",
36
+ "license": "MIT",
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "engines": {
41
+ "node": ">=22"
42
+ },
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/aauth-dev/proxy"
46
+ },
47
+ "dependencies": {
48
+ "@aauth/local-keys": "^1.1.0",
49
+ "@hellocoop/httpsig": "^1.6.0",
50
+ "@modelcontextprotocol/sdk": "^1.29.0",
51
+ "zod": "^4.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^20.0.0",
55
+ "tsx": "^4.19.0",
56
+ "typescript": "^5.7.0",
57
+ "vitest": "^3.0.0"
58
+ }
59
+ }