@adonis-agora/agent 0.76.2 → 0.77.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +9 -0
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/providers/mcp_provider.d.ts.map +1 -1
- package/dist/providers/mcp_provider.js +46 -10
- package/dist/providers/mcp_provider.js.map +1 -1
- package/dist/providers/poppy_connections_provider.d.ts +17 -0
- package/dist/providers/poppy_connections_provider.d.ts.map +1 -0
- package/dist/providers/poppy_connections_provider.js +186 -0
- package/dist/providers/poppy_connections_provider.js.map +1 -0
- package/dist/providers/poppy_provider.d.ts +12 -0
- package/dist/providers/poppy_provider.d.ts.map +1 -0
- package/dist/providers/poppy_provider.js +159 -0
- package/dist/providers/poppy_provider.js.map +1 -0
- package/dist/src/a2a/handler.d.ts.map +1 -1
- package/dist/src/a2a/handler.js +4 -2
- package/dist/src/a2a/handler.js.map +1 -1
- package/dist/src/a2a/turn.d.ts +27 -4
- package/dist/src/a2a/turn.d.ts.map +1 -1
- package/dist/src/a2a/turn.js +66 -12
- package/dist/src/a2a/turn.js.map +1 -1
- package/dist/src/action-proposal-approval.d.ts.map +1 -1
- package/dist/src/action-proposal-approval.js +3 -3
- package/dist/src/action-proposal-approval.js.map +1 -1
- package/dist/src/action-proposal-listeners.d.ts +12 -0
- package/dist/src/action-proposal-listeners.d.ts.map +1 -0
- package/dist/src/action-proposal-listeners.js +27 -0
- package/dist/src/action-proposal-listeners.js.map +1 -0
- package/dist/src/action-proposal-receipt.d.ts +4 -0
- package/dist/src/action-proposal-receipt.d.ts.map +1 -1
- package/dist/src/action-proposal-receipt.js +3 -1
- package/dist/src/action-proposal-receipt.js.map +1 -1
- package/dist/src/action-proposal-worker.d.ts +6 -1
- package/dist/src/action-proposal-worker.d.ts.map +1 -1
- package/dist/src/action-proposal-worker.js +10 -1
- package/dist/src/action-proposal-worker.js.map +1 -1
- package/dist/src/agent-loop.d.ts.map +1 -1
- package/dist/src/agent-loop.js +8 -5
- package/dist/src/agent-loop.js.map +1 -1
- package/dist/src/channels/handler.d.ts +10 -0
- package/dist/src/channels/handler.d.ts.map +1 -1
- package/dist/src/channels/handler.js +44 -1
- package/dist/src/channels/handler.js.map +1 -1
- package/dist/src/channels/texts.d.ts +9 -0
- package/dist/src/channels/texts.d.ts.map +1 -1
- package/dist/src/channels/texts.js +4 -0
- package/dist/src/channels/texts.js.map +1 -1
- package/dist/src/client/sse.d.ts.map +1 -1
- package/dist/src/client/sse.js +3 -0
- package/dist/src/client/sse.js.map +1 -1
- package/dist/src/define_config.d.ts +3 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/genui/kit/styles.d.ts.map +1 -1
- package/dist/src/genui/kit/styles.js +11 -2
- package/dist/src/genui/kit/styles.js.map +1 -1
- package/dist/src/genui/sandbox-styles.js +1 -1
- package/dist/src/genui/sandbox-styles.js.map +1 -1
- package/dist/src/genui/sandbox-theme.d.ts +6 -1
- package/dist/src/genui/sandbox-theme.d.ts.map +1 -1
- package/dist/src/genui/sandbox-theme.js +9 -5
- package/dist/src/genui/sandbox-theme.js.map +1 -1
- package/dist/src/genui/sandbox.d.ts.map +1 -1
- package/dist/src/genui/sandbox.js +1 -0
- package/dist/src/genui/sandbox.js.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/auth.d.ts +17 -0
- package/dist/src/mcp/auth.d.ts.map +1 -1
- package/dist/src/mcp/auth.js +56 -1
- package/dist/src/mcp/auth.js.map +1 -1
- package/dist/src/mcp/discovery.d.ts +13 -2
- package/dist/src/mcp/discovery.d.ts.map +1 -1
- package/dist/src/mcp/discovery.js +17 -2
- package/dist/src/mcp/discovery.js.map +1 -1
- package/dist/src/mcp/index.d.ts +1 -1
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/scope.d.ts +13 -0
- package/dist/src/mcp/scope.d.ts.map +1 -0
- package/dist/src/mcp/scope.js +24 -0
- package/dist/src/mcp/scope.js.map +1 -0
- package/dist/src/mcp/server.d.ts +6 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/poppy/auth.d.ts +77 -0
- package/dist/src/poppy/auth.d.ts.map +1 -0
- package/dist/src/poppy/auth.js +16 -0
- package/dist/src/poppy/auth.js.map +1 -0
- package/dist/src/poppy/conversations.d.ts +249 -0
- package/dist/src/poppy/conversations.d.ts.map +1 -0
- package/dist/src/poppy/conversations.js +1017 -0
- package/dist/src/poppy/conversations.js.map +1 -0
- package/dist/src/poppy/define_config.d.ts +98 -0
- package/dist/src/poppy/define_config.d.ts.map +1 -0
- package/dist/src/poppy/define_config.js +11 -0
- package/dist/src/poppy/define_config.js.map +1 -0
- package/dist/src/poppy/endpoints.d.ts +25 -0
- package/dist/src/poppy/endpoints.d.ts.map +1 -0
- package/dist/src/poppy/endpoints.js +31 -0
- package/dist/src/poppy/endpoints.js.map +1 -0
- package/dist/src/poppy/handler.d.ts +80 -0
- package/dist/src/poppy/handler.d.ts.map +1 -0
- package/dist/src/poppy/handler.js +362 -0
- package/dist/src/poppy/handler.js.map +1 -0
- package/dist/src/poppy/index.d.ts +17 -0
- package/dist/src/poppy/index.d.ts.map +1 -0
- package/dist/src/poppy/index.js +9 -0
- package/dist/src/poppy/index.js.map +1 -0
- package/dist/src/poppy/protocol.d.ts +132 -0
- package/dist/src/poppy/protocol.d.ts.map +1 -0
- package/dist/src/poppy/protocol.js +178 -0
- package/dist/src/poppy/protocol.js.map +1 -0
- package/dist/src/poppy/redis-store.d.ts +27 -0
- package/dist/src/poppy/redis-store.d.ts.map +1 -0
- package/dist/src/poppy/redis-store.js +148 -0
- package/dist/src/poppy/redis-store.js.map +1 -0
- package/dist/src/poppy/runtime.d.ts +6 -0
- package/dist/src/poppy/runtime.d.ts.map +1 -0
- package/dist/src/poppy/runtime.js +12 -0
- package/dist/src/poppy/runtime.js.map +1 -0
- package/dist/src/poppy/server_middleware.d.ts +11 -0
- package/dist/src/poppy/server_middleware.d.ts.map +1 -0
- package/dist/src/poppy/server_middleware.js +16 -0
- package/dist/src/poppy/server_middleware.js.map +1 -0
- package/dist/src/poppy/store.d.ts +207 -0
- package/dist/src/poppy/store.d.ts.map +1 -0
- package/dist/src/poppy/store.js +444 -0
- package/dist/src/poppy/store.js.map +1 -0
- package/dist/src/poppy-client/api.d.ts +36 -0
- package/dist/src/poppy-client/api.d.ts.map +1 -0
- package/dist/src/poppy-client/api.js +77 -0
- package/dist/src/poppy-client/api.js.map +1 -0
- package/dist/src/poppy-client/bin/poppy-agent.d.ts +3 -0
- package/dist/src/poppy-client/bin/poppy-agent.d.ts.map +1 -0
- package/dist/src/poppy-client/bin/poppy-agent.js +9 -0
- package/dist/src/poppy-client/bin/poppy-agent.js.map +1 -0
- package/dist/src/poppy-client/browser.d.ts +24 -0
- package/dist/src/poppy-client/browser.d.ts.map +1 -0
- package/dist/src/poppy-client/browser.js +83 -0
- package/dist/src/poppy-client/browser.js.map +1 -0
- package/dist/src/poppy-client/cli/main.d.ts +2 -0
- package/dist/src/poppy-client/cli/main.d.ts.map +1 -0
- package/dist/src/poppy-client/cli/main.js +776 -0
- package/dist/src/poppy-client/cli/main.js.map +1 -0
- package/dist/src/poppy-client/cli/prompt.d.ts +13 -0
- package/dist/src/poppy-client/cli/prompt.d.ts.map +1 -0
- package/dist/src/poppy-client/cli/prompt.js +50 -0
- package/dist/src/poppy-client/cli/prompt.js.map +1 -0
- package/dist/src/poppy-client/company.d.ts +87 -0
- package/dist/src/poppy-client/company.d.ts.map +1 -0
- package/dist/src/poppy-client/company.js +336 -0
- package/dist/src/poppy-client/company.js.map +1 -0
- package/dist/src/poppy-client/conversations.d.ts +89 -0
- package/dist/src/poppy-client/conversations.d.ts.map +1 -0
- package/dist/src/poppy-client/conversations.js +332 -0
- package/dist/src/poppy-client/conversations.js.map +1 -0
- package/dist/src/poppy-client/discovery.d.ts +41 -0
- package/dist/src/poppy-client/discovery.d.ts.map +1 -0
- package/dist/src/poppy-client/discovery.js +217 -0
- package/dist/src/poppy-client/discovery.js.map +1 -0
- package/dist/src/poppy-client/dpop.d.ts +19 -0
- package/dist/src/poppy-client/dpop.d.ts.map +1 -0
- package/dist/src/poppy-client/dpop.js +43 -0
- package/dist/src/poppy-client/dpop.js.map +1 -0
- package/dist/src/poppy-client/errors.d.ts +50 -0
- package/dist/src/poppy-client/errors.d.ts.map +1 -0
- package/dist/src/poppy-client/errors.js +55 -0
- package/dist/src/poppy-client/errors.js.map +1 -0
- package/dist/src/poppy-client/http.d.ts +40 -0
- package/dist/src/poppy-client/http.d.ts.map +1 -0
- package/dist/src/poppy-client/http.js +95 -0
- package/dist/src/poppy-client/http.js.map +1 -0
- package/dist/src/poppy-client/identity.d.ts +61 -0
- package/dist/src/poppy-client/identity.d.ts.map +1 -0
- package/dist/src/poppy-client/identity.js +111 -0
- package/dist/src/poppy-client/identity.js.map +1 -0
- package/dist/src/poppy-client/identity_server.d.ts +29 -0
- package/dist/src/poppy-client/identity_server.d.ts.map +1 -0
- package/dist/src/poppy-client/identity_server.js +84 -0
- package/dist/src/poppy-client/identity_server.js.map +1 -0
- package/dist/src/poppy-client/index.d.ts +19 -0
- package/dist/src/poppy-client/index.d.ts.map +1 -0
- package/dist/src/poppy-client/index.js +18 -0
- package/dist/src/poppy-client/index.js.map +1 -0
- package/dist/src/poppy-client/keys.d.ts +13 -0
- package/dist/src/poppy-client/keys.d.ts.map +1 -0
- package/dist/src/poppy-client/keys.js +31 -0
- package/dist/src/poppy-client/keys.js.map +1 -0
- package/dist/src/poppy-client/llm.d.ts +31 -0
- package/dist/src/poppy-client/llm.d.ts.map +1 -0
- package/dist/src/poppy-client/llm.js +230 -0
- package/dist/src/poppy-client/llm.js.map +1 -0
- package/dist/src/poppy-client/mcp.d.ts +16 -0
- package/dist/src/poppy-client/mcp.d.ts.map +1 -0
- package/dist/src/poppy-client/mcp.js +57 -0
- package/dist/src/poppy-client/mcp.js.map +1 -0
- package/dist/src/poppy-client/open_url.d.ts +3 -0
- package/dist/src/poppy-client/open_url.d.ts.map +1 -0
- package/dist/src/poppy-client/open_url.js +13 -0
- package/dist/src/poppy-client/open_url.js.map +1 -0
- package/dist/src/poppy-client/signin.d.ts +59 -0
- package/dist/src/poppy-client/signin.d.ts.map +1 -0
- package/dist/src/poppy-client/signin.js +210 -0
- package/dist/src/poppy-client/signin.js.map +1 -0
- package/dist/src/poppy-client/sse.d.ts +15 -0
- package/dist/src/poppy-client/sse.d.ts.map +1 -0
- package/dist/src/poppy-client/sse.js +74 -0
- package/dist/src/poppy-client/sse.js.map +1 -0
- package/dist/src/poppy-client/store.d.ts +89 -0
- package/dist/src/poppy-client/store.d.ts.map +1 -0
- package/dist/src/poppy-client/store.js +79 -0
- package/dist/src/poppy-client/store.js.map +1 -0
- package/dist/src/poppy-client/token_client.d.ts +69 -0
- package/dist/src/poppy-client/token_client.d.ts.map +1 -0
- package/dist/src/poppy-client/token_client.js +154 -0
- package/dist/src/poppy-client/token_client.js.map +1 -0
- package/dist/src/poppy-client/types.d.ts +184 -0
- package/dist/src/poppy-client/types.d.ts.map +1 -0
- package/dist/src/poppy-client/types.js +8 -0
- package/dist/src/poppy-client/types.js.map +1 -0
- package/dist/src/poppy-client/util.d.ts +42 -0
- package/dist/src/poppy-client/util.d.ts.map +1 -0
- package/dist/src/poppy-client/util.js +122 -0
- package/dist/src/poppy-client/util.js.map +1 -0
- package/dist/src/poppy-connections/config.d.ts +134 -0
- package/dist/src/poppy-connections/config.d.ts.map +1 -0
- package/dist/src/poppy-connections/config.js +44 -0
- package/dist/src/poppy-connections/config.js.map +1 -0
- package/dist/src/poppy-connections/crypto.d.ts +12 -0
- package/dist/src/poppy-connections/crypto.d.ts.map +1 -0
- package/dist/src/poppy-connections/crypto.js +36 -0
- package/dist/src/poppy-connections/crypto.js.map +1 -0
- package/dist/src/poppy-connections/http.d.ts +63 -0
- package/dist/src/poppy-connections/http.d.ts.map +1 -0
- package/dist/src/poppy-connections/http.js +217 -0
- package/dist/src/poppy-connections/http.js.map +1 -0
- package/dist/src/poppy-connections/index.d.ts +14 -0
- package/dist/src/poppy-connections/index.d.ts.map +1 -0
- package/dist/src/poppy-connections/index.js +17 -0
- package/dist/src/poppy-connections/index.js.map +1 -0
- package/dist/src/poppy-connections/resume.d.ts +46 -0
- package/dist/src/poppy-connections/resume.d.ts.map +1 -0
- package/dist/src/poppy-connections/resume.js +109 -0
- package/dist/src/poppy-connections/resume.js.map +1 -0
- package/dist/src/poppy-connections/runtime.d.ts +4 -0
- package/dist/src/poppy-connections/runtime.d.ts.map +1 -0
- package/dist/src/poppy-connections/runtime.js +9 -0
- package/dist/src/poppy-connections/runtime.js.map +1 -0
- package/dist/src/poppy-connections/server_middleware.d.ts +10 -0
- package/dist/src/poppy-connections/server_middleware.d.ts.map +1 -0
- package/dist/src/poppy-connections/server_middleware.js +14 -0
- package/dist/src/poppy-connections/server_middleware.js.map +1 -0
- package/dist/src/poppy-connections/service.d.ts +179 -0
- package/dist/src/poppy-connections/service.d.ts.map +1 -0
- package/dist/src/poppy-connections/service.js +648 -0
- package/dist/src/poppy-connections/service.js.map +1 -0
- package/dist/src/poppy-connections/store.d.ts +139 -0
- package/dist/src/poppy-connections/store.d.ts.map +1 -0
- package/dist/src/poppy-connections/store.js +260 -0
- package/dist/src/poppy-connections/store.js.map +1 -0
- package/dist/src/poppy-connections/tools.d.ts +65 -0
- package/dist/src/poppy-connections/tools.d.ts.map +1 -0
- package/dist/src/poppy-connections/tools.js +574 -0
- package/dist/src/poppy-connections/tools.js.map +1 -0
- package/dist/src/react/core/approvals/use-action-proposals.d.ts +6 -1
- package/dist/src/react/core/approvals/use-action-proposals.d.ts.map +1 -1
- package/dist/src/react/core/approvals/use-action-proposals.js +18 -3
- package/dist/src/react/core/approvals/use-action-proposals.js.map +1 -1
- package/dist/src/react/core/use-agent-chat.d.ts +6 -0
- package/dist/src/react/core/use-agent-chat.d.ts.map +1 -1
- package/dist/src/react/core/use-agent-chat.js +47 -1
- package/dist/src/react/core/use-agent-chat.js.map +1 -1
- package/dist/src/tool-presentation.d.ts +6 -0
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +1 -0
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +41 -2
- package/skills/agent-governance/SKILL.md +13 -2
- package/skills/agent-personas-agents/SKILL.md +1 -1
- package/skills/agent-tools/SKILL.md +20 -3
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { DiscoveryError } from './errors.js';
|
|
2
|
+
import { isLoopbackHost, normalizeDomain, requireSecureUrl, } from './util.js';
|
|
3
|
+
/** Major protocol versions this client implements (3.1). */
|
|
4
|
+
export const SUPPORTED_MAJOR_VERSIONS = ['0'];
|
|
5
|
+
const MAX_REDIRECTS = 5;
|
|
6
|
+
/** In-memory cache of JSON documents by URL, by `Cache-Control: max-age`. */
|
|
7
|
+
export class HttpJsonCache {
|
|
8
|
+
entries = new Map();
|
|
9
|
+
get(url) {
|
|
10
|
+
const e = this.entries.get(url);
|
|
11
|
+
if (!e)
|
|
12
|
+
return undefined;
|
|
13
|
+
if (e.expires < Date.now()) {
|
|
14
|
+
this.entries.delete(url);
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return e.value;
|
|
18
|
+
}
|
|
19
|
+
set(url, value, cacheControl) {
|
|
20
|
+
if (!cacheControl || /no-store|no-cache/i.test(cacheControl))
|
|
21
|
+
return;
|
|
22
|
+
const m = /max-age=(\d+)/i.exec(cacheControl);
|
|
23
|
+
if (!m)
|
|
24
|
+
return;
|
|
25
|
+
this.entries.set(url, { expires: Date.now() + Number(m[1]) * 1000, value });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Turns user input into the well-known URL. `example.com` → `https://example.com/...`.
|
|
30
|
+
* With `insecureDev`, an explicit `http://host:port` is kept, and a bare loopback host
|
|
31
|
+
* (`localhost:3333`) defaults to `http:`.
|
|
32
|
+
*/
|
|
33
|
+
export function wellKnownUrlFor(input, sec = {}) {
|
|
34
|
+
let base;
|
|
35
|
+
if (/^[a-z]+:\/\//i.test(input)) {
|
|
36
|
+
base = new URL(input);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const guess = new URL(`https://${input}`);
|
|
40
|
+
base = sec.insecureDev && isLoopbackHost(guess.hostname) ? new URL(`http://${input}`) : guess;
|
|
41
|
+
}
|
|
42
|
+
requireSecureUrl(base.toString(), 'Company domain', sec);
|
|
43
|
+
return new URL('/.well-known/poppy.json', base.origin);
|
|
44
|
+
}
|
|
45
|
+
async function fetchJson(url, what, opts) {
|
|
46
|
+
const cached = opts.cache?.get(url.toString());
|
|
47
|
+
if (cached !== undefined)
|
|
48
|
+
return { json: cached, finalUrl: url };
|
|
49
|
+
const doFetch = opts.fetch ?? ((i, init) => globalThis.fetch(i, init));
|
|
50
|
+
let current = url;
|
|
51
|
+
for (let hop = 0;; hop++) {
|
|
52
|
+
const res = await doFetch(current.toString(), {
|
|
53
|
+
redirect: 'manual',
|
|
54
|
+
headers: { accept: 'application/json' },
|
|
55
|
+
});
|
|
56
|
+
if (res.status >= 300 && res.status < 400 && res.headers.get('location')) {
|
|
57
|
+
if (hop >= MAX_REDIRECTS)
|
|
58
|
+
throw new DiscoveryError('too_many_redirects', `${what}: too many redirects`);
|
|
59
|
+
const next = new URL(res.headers.get('location'), current);
|
|
60
|
+
try {
|
|
61
|
+
// Every redirect MUST be to an HTTPS URL (3).
|
|
62
|
+
requireSecureUrl(next.toString(), `${what} redirect`, opts);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
throw new DiscoveryError('insecure_redirect', e.message);
|
|
66
|
+
}
|
|
67
|
+
current = next;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!res.ok) {
|
|
71
|
+
throw new DiscoveryError('fetch_failed', `${what}: HTTP ${res.status} from ${current}`);
|
|
72
|
+
}
|
|
73
|
+
let json;
|
|
74
|
+
try {
|
|
75
|
+
json = await res.json();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new DiscoveryError('invalid_json', `${what}: response is not JSON`);
|
|
79
|
+
}
|
|
80
|
+
opts.cache?.set(url.toString(), json, res.headers.get('cache-control'));
|
|
81
|
+
return { json, finalUrl: current };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function fail(code, message) {
|
|
85
|
+
throw new DiscoveryError(code, message);
|
|
86
|
+
}
|
|
87
|
+
function isObject(v) {
|
|
88
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
89
|
+
}
|
|
90
|
+
function checkUrl(value, what, sec) {
|
|
91
|
+
try {
|
|
92
|
+
return requireSecureUrl(value, what, sec).toString();
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
fail('invalid_document', e.message);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Validates `poppy.json` against 3.1. Unknown fields are ignored, never rejected. */
|
|
99
|
+
export function validatePoppyDocument(json, requestedHost, sec = {}) {
|
|
100
|
+
if (!isObject(json))
|
|
101
|
+
fail('invalid_document', 'poppy.json is not a JSON object');
|
|
102
|
+
const version = json.protocol_version;
|
|
103
|
+
if (typeof version !== 'string' || !/^\d+\.\d+$/.test(version)) {
|
|
104
|
+
fail('invalid_document', 'protocol_version must be "major.minor"');
|
|
105
|
+
}
|
|
106
|
+
const major = version.split('.')[0] ?? '';
|
|
107
|
+
if (!SUPPORTED_MAJOR_VERSIONS.includes(major)) {
|
|
108
|
+
fail('unsupported_protocol_version', `poppy.json protocol_version ${version} has major ${major}; this agent supports ${SUPPORTED_MAJOR_VERSIONS.join(', ')}`);
|
|
109
|
+
}
|
|
110
|
+
const org = json.organization;
|
|
111
|
+
if (!isObject(org) || typeof org.name !== 'string' || typeof org.domain !== 'string') {
|
|
112
|
+
fail('invalid_document', 'organization.name and organization.domain are required');
|
|
113
|
+
}
|
|
114
|
+
// organization.domain must match the host we requested, ignoring a leading www. The host
|
|
115
|
+
// after a redirect doesn't count (3.1). Ports only appear in --insecure-dev setups.
|
|
116
|
+
const requested = normalizeDomain(requestedHost);
|
|
117
|
+
const requestedNoPort = normalizeDomain(requestedHost.replace(/:\d+$/, ''));
|
|
118
|
+
const claimed = normalizeDomain(org.domain);
|
|
119
|
+
if (claimed !== requested && claimed !== requestedNoPort) {
|
|
120
|
+
fail('domain_mismatch', `organization.domain "${org.domain}" does not match the requested host "${requestedHost}"`);
|
|
121
|
+
}
|
|
122
|
+
const hasAgent = json.agent !== undefined;
|
|
123
|
+
const hasApis = json.apis !== undefined;
|
|
124
|
+
const hasWeb = json.web !== undefined;
|
|
125
|
+
if (!hasAgent && !hasApis && !hasWeb) {
|
|
126
|
+
fail('invalid_document', 'poppy.json must have at least one of agent, apis, web');
|
|
127
|
+
}
|
|
128
|
+
if (hasWeb) {
|
|
129
|
+
if (!isObject(json.web))
|
|
130
|
+
fail('invalid_document', 'web must be an object');
|
|
131
|
+
if (json.web.browser_session_endpoint !== undefined) {
|
|
132
|
+
checkUrl(json.web.browser_session_endpoint, 'web.browser_session_endpoint', sec);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const needsAuth = hasAgent || hasApis || (isObject(json.web) && json.web.browser_session_endpoint);
|
|
136
|
+
if (needsAuth && json.auth === undefined) {
|
|
137
|
+
fail('invalid_document', 'auth is required when agent, apis or web.browser_session_endpoint is present');
|
|
138
|
+
}
|
|
139
|
+
if (json.auth !== undefined) {
|
|
140
|
+
const auth = json.auth;
|
|
141
|
+
if (!isObject(auth))
|
|
142
|
+
fail('invalid_document', 'auth must be an object');
|
|
143
|
+
checkUrl(auth.issuer, 'auth.issuer', sec);
|
|
144
|
+
for (const type of ['direct', 'device', 'mediated']) {
|
|
145
|
+
const t = auth[type];
|
|
146
|
+
if (t === undefined)
|
|
147
|
+
continue;
|
|
148
|
+
if (!isObject(t) ||
|
|
149
|
+
!Array.isArray(t.scopes) ||
|
|
150
|
+
!t.scopes.every((s) => typeof s === 'string')) {
|
|
151
|
+
fail('invalid_document', `auth.${type}.scopes must be a list of strings`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (isObject(auth.mediated)) {
|
|
155
|
+
checkUrl(auth.mediated.endpoint, 'auth.mediated.endpoint', sec);
|
|
156
|
+
const fields = auth.mediated.fields;
|
|
157
|
+
if (!Array.isArray(fields) ||
|
|
158
|
+
!fields.every((f) => isObject(f) && typeof f.name === 'string' && typeof f.label === 'string')) {
|
|
159
|
+
fail('invalid_document', 'auth.mediated.fields must list { name, label, secret }');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (hasAgent) {
|
|
164
|
+
if (!isObject(json.agent) || !Array.isArray(json.agent.protocols)) {
|
|
165
|
+
fail('invalid_document', 'agent.protocols must be a list');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (hasApis && !Array.isArray(json.apis))
|
|
169
|
+
fail('invalid_document', 'apis must be a list');
|
|
170
|
+
return json;
|
|
171
|
+
}
|
|
172
|
+
/** RFC 8414 section 3: the well-known suffix goes between the host and the issuer's path. */
|
|
173
|
+
export function authServerMetadataUrl(issuer) {
|
|
174
|
+
const u = new URL(issuer);
|
|
175
|
+
const path = u.pathname === '/' ? '' : u.pathname.replace(/\/$/, '');
|
|
176
|
+
return new URL(`${u.origin}/.well-known/oauth-authorization-server${path}`);
|
|
177
|
+
}
|
|
178
|
+
/** Validates the issuer metadata against 3.2. */
|
|
179
|
+
export function validateMetadata(json, doc, sec = {}) {
|
|
180
|
+
if (!isObject(json))
|
|
181
|
+
fail('invalid_metadata', 'authorization server metadata is not an object');
|
|
182
|
+
const auth = doc.auth;
|
|
183
|
+
if (json.issuer !== auth.issuer) {
|
|
184
|
+
fail('issuer_mismatch', `metadata issuer "${String(json.issuer)}" != auth.issuer "${auth.issuer}"`);
|
|
185
|
+
}
|
|
186
|
+
const domains = json.poppy_domains;
|
|
187
|
+
if (!Array.isArray(domains)) {
|
|
188
|
+
fail('domain_not_listed', 'metadata has no poppy_domains, so it does not vouch for this domain');
|
|
189
|
+
}
|
|
190
|
+
const wanted = doc.organization.domain.toLowerCase();
|
|
191
|
+
if (!domains.some((d) => typeof d === 'string' && d.toLowerCase() === wanted)) {
|
|
192
|
+
fail('domain_not_listed', `poppy_domains of ${auth.issuer} does not include "${doc.organization.domain}"`);
|
|
193
|
+
}
|
|
194
|
+
checkUrl(json.token_endpoint, 'token_endpoint', sec);
|
|
195
|
+
checkUrl(json.revocation_endpoint, 'revocation_endpoint', sec);
|
|
196
|
+
if (auth.direct)
|
|
197
|
+
checkUrl(json.authorization_endpoint, 'authorization_endpoint', sec);
|
|
198
|
+
if (auth.device)
|
|
199
|
+
checkUrl(json.device_authorization_endpoint, 'device_authorization_endpoint', sec);
|
|
200
|
+
return json;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Discovery (section 3): fetches `/.well-known/poppy.json` (HTTPS-only redirects), validates
|
|
204
|
+
* it, then fetches and validates the issuer's RFC 8414 metadata (3.2).
|
|
205
|
+
*/
|
|
206
|
+
export async function discover(input, opts = {}) {
|
|
207
|
+
const wellKnown = wellKnownUrlFor(input, opts);
|
|
208
|
+
const { json } = await fetchJson(wellKnown, 'poppy.json', opts);
|
|
209
|
+
const document = validatePoppyDocument(json, wellKnown.host, opts);
|
|
210
|
+
let metadata;
|
|
211
|
+
if (document.auth) {
|
|
212
|
+
const { json: meta } = await fetchJson(authServerMetadataUrl(document.auth.issuer), 'authorization server metadata', opts);
|
|
213
|
+
metadata = validateMetadata(meta, document, opts);
|
|
214
|
+
}
|
|
215
|
+
return { domain: wellKnown.host, wellKnownUrl: wellKnown.toString(), document, metadata };
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/poppy-client/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type StoredKey } from './keys.js';
|
|
2
|
+
/** `htu`: the request URL without query or fragment (RFC 9449 4.2). */
|
|
3
|
+
export declare function htuOf(url: string | URL): string;
|
|
4
|
+
/**
|
|
5
|
+
* A DPoP key (RFC 9449). The agent keeps one per User per Company (4.3); it is never published.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DpopKey {
|
|
8
|
+
readonly stored: StoredKey;
|
|
9
|
+
constructor(stored: StoredKey);
|
|
10
|
+
static generate(): Promise<DpopKey>;
|
|
11
|
+
/** A fresh proof for one request. `accessToken` adds `ath`; token-endpoint proofs have none. */
|
|
12
|
+
proof(input: {
|
|
13
|
+
htm: string;
|
|
14
|
+
htu: string | URL;
|
|
15
|
+
accessToken?: string | undefined;
|
|
16
|
+
nonce?: string | undefined;
|
|
17
|
+
}): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=dpop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpop.d.ts","sourceRoot":"","sources":["../../../src/poppy-client/dpop.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAGhG,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,MAAM,CAK/C;AAED;;GAEG;AACH,qBAAa,OAAO;IACN,QAAQ,CAAC,MAAM,EAAE,SAAS;IAAtC,YAAqB,MAAM,EAAE,SAAS,EAAI;IAE1C,OAAa,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAExC;IAED,gGAAgG;IAC1F,KAAK,CAAC,KAAK,EAAE;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlB;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SignJWT } from 'jose';
|
|
2
|
+
import { bareEcPublicJwk, generateEs256Key, importSigningKey } from './keys.js';
|
|
3
|
+
import { nowSeconds, randomId, sha256b64url } from './util.js';
|
|
4
|
+
/** `htu`: the request URL without query or fragment (RFC 9449 4.2). */
|
|
5
|
+
export function htuOf(url) {
|
|
6
|
+
const u = new URL(url);
|
|
7
|
+
u.search = '';
|
|
8
|
+
u.hash = '';
|
|
9
|
+
return u.toString();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A DPoP key (RFC 9449). The agent keeps one per User per Company (4.3); it is never published.
|
|
13
|
+
*/
|
|
14
|
+
export class DpopKey {
|
|
15
|
+
stored;
|
|
16
|
+
constructor(stored) {
|
|
17
|
+
this.stored = stored;
|
|
18
|
+
}
|
|
19
|
+
static async generate() {
|
|
20
|
+
return new DpopKey(await generateEs256Key());
|
|
21
|
+
}
|
|
22
|
+
/** A fresh proof for one request. `accessToken` adds `ath`; token-endpoint proofs have none. */
|
|
23
|
+
async proof(input) {
|
|
24
|
+
const payload = {
|
|
25
|
+
jti: randomId(),
|
|
26
|
+
htm: input.htm.toUpperCase(),
|
|
27
|
+
htu: htuOf(input.htu),
|
|
28
|
+
iat: nowSeconds(),
|
|
29
|
+
};
|
|
30
|
+
if (input.accessToken)
|
|
31
|
+
payload.ath = sha256b64url(input.accessToken);
|
|
32
|
+
if (input.nonce)
|
|
33
|
+
payload.nonce = input.nonce;
|
|
34
|
+
return new SignJWT(payload)
|
|
35
|
+
.setProtectedHeader({
|
|
36
|
+
typ: 'dpop+jwt',
|
|
37
|
+
alg: 'ES256',
|
|
38
|
+
jwk: bareEcPublicJwk(this.stored.publicJwk),
|
|
39
|
+
})
|
|
40
|
+
.sign(await importSigningKey(this.stored));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=dpop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpop.js","sourceRoot":"","sources":["../../../src/poppy-client/dpop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAkB,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE/D,uEAAuE;AACvE,MAAM,UAAU,KAAK,CAAC,GAAiB;IACrC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;IACd,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IACZ,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,OAAO;IACG,MAAM;IAA3B,YAAqB,MAAiB;sBAAjB,MAAM;IAAc,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,QAAQ;QACnB,OAAO,IAAI,OAAO,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,KAAK,CAAC,KAKX;QACC,MAAM,OAAO,GAA4B;YACvC,GAAG,EAAE,QAAQ,EAAE;YACf,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;YAC5B,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;YACrB,GAAG,EAAE,UAAU,EAAE;SAClB,CAAC;QACF,IAAI,KAAK,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC7C,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;aACxB,kBAAkB,CAAC;YAClB,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;SAC5C,CAAC;aACD,IAAI,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Base error for everything this client raises on a protocol-level failure. */
|
|
2
|
+
export declare class PoppyError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly status?: number | undefined;
|
|
5
|
+
readonly description?: string | undefined;
|
|
6
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
7
|
+
constructor(code: string, message?: string | undefined, opts?: {
|
|
8
|
+
status?: number | undefined;
|
|
9
|
+
description?: string | undefined;
|
|
10
|
+
details?: Record<string, unknown> | undefined;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/** Discovery failed or a document didn't pass the checks of section 3. */
|
|
14
|
+
export declare class DiscoveryError extends PoppyError {
|
|
15
|
+
constructor(code: string, message: string);
|
|
16
|
+
}
|
|
17
|
+
/** OAuth error response from the token, device, or revocation endpoint (4.2). */
|
|
18
|
+
export declare class OAuthError extends PoppyError {
|
|
19
|
+
readonly retryAfter?: number | undefined;
|
|
20
|
+
constructor(code: string, opts?: {
|
|
21
|
+
status?: number | undefined;
|
|
22
|
+
description?: string | undefined;
|
|
23
|
+
retryAfter?: number | undefined;
|
|
24
|
+
details?: Record<string, unknown> | undefined;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A resource (API, conversation, mediated sign-in) rejected the token, via `WWW-Authenticate`
|
|
29
|
+
* (section 6): `invalid_token`, `sign_in_required`, `insufficient_scope`, DPoP errors.
|
|
30
|
+
*/
|
|
31
|
+
export declare class ResourceAuthError extends PoppyError {
|
|
32
|
+
/** Scopes the Company says are needed, for `insufficient_scope`. */
|
|
33
|
+
readonly scope?: string | undefined;
|
|
34
|
+
constructor(code: string, opts?: {
|
|
35
|
+
status?: number | undefined;
|
|
36
|
+
description?: string | undefined;
|
|
37
|
+
scope?: string | undefined;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** A conversation error with a JSON `error` body (7.13). */
|
|
41
|
+
export declare class ConversationError extends PoppyError {
|
|
42
|
+
/** For `direct_conversation_open`: the open Direct Conversation. */
|
|
43
|
+
readonly conversationId?: string | undefined;
|
|
44
|
+
constructor(code: string, opts?: {
|
|
45
|
+
status?: number | undefined;
|
|
46
|
+
description?: string | undefined;
|
|
47
|
+
conversationId?: string | undefined;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/poppy-client/errors.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAEvD,YACE,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;KAC1C,EAQP;CACF;AAED,0EAA0E;AAC1E,qBAAa,cAAe,SAAQ,UAAU;IAC5C,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAGxC;CACF;AAED,iFAAiF;AACjF,qBAAa,UAAW,SAAQ,UAAU;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,YACE,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;KAC1C,EAKP;CACF;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,YACE,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACvB,EAKP;CACF;AAED,4DAA4D;AAC5D,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,oEAAoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,YACE,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC,EAKP;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Base error for everything this client raises on a protocol-level failure. */
|
|
2
|
+
export class PoppyError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
status;
|
|
5
|
+
description;
|
|
6
|
+
details;
|
|
7
|
+
constructor(code, message, opts = {}) {
|
|
8
|
+
super(message ?? (opts.description ? `${code}: ${opts.description}` : code));
|
|
9
|
+
this.name = 'PoppyError';
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.status = opts.status;
|
|
12
|
+
this.description = opts.description;
|
|
13
|
+
this.details = opts.details;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Discovery failed or a document didn't pass the checks of section 3. */
|
|
17
|
+
export class DiscoveryError extends PoppyError {
|
|
18
|
+
constructor(code, message) {
|
|
19
|
+
super(code, message);
|
|
20
|
+
this.name = 'DiscoveryError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** OAuth error response from the token, device, or revocation endpoint (4.2). */
|
|
24
|
+
export class OAuthError extends PoppyError {
|
|
25
|
+
retryAfter;
|
|
26
|
+
constructor(code, opts = {}) {
|
|
27
|
+
super(code, undefined, opts);
|
|
28
|
+
this.name = 'OAuthError';
|
|
29
|
+
this.retryAfter = opts.retryAfter;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A resource (API, conversation, mediated sign-in) rejected the token, via `WWW-Authenticate`
|
|
34
|
+
* (section 6): `invalid_token`, `sign_in_required`, `insufficient_scope`, DPoP errors.
|
|
35
|
+
*/
|
|
36
|
+
export class ResourceAuthError extends PoppyError {
|
|
37
|
+
/** Scopes the Company says are needed, for `insufficient_scope`. */
|
|
38
|
+
scope;
|
|
39
|
+
constructor(code, opts = {}) {
|
|
40
|
+
super(code, undefined, opts);
|
|
41
|
+
this.name = 'ResourceAuthError';
|
|
42
|
+
this.scope = opts.scope;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** A conversation error with a JSON `error` body (7.13). */
|
|
46
|
+
export class ConversationError extends PoppyError {
|
|
47
|
+
/** For `direct_conversation_open`: the open Direct Conversation. */
|
|
48
|
+
conversationId;
|
|
49
|
+
constructor(code, opts = {}) {
|
|
50
|
+
super(code, undefined, opts);
|
|
51
|
+
this.name = 'ConversationError';
|
|
52
|
+
this.conversationId = opts.conversationId;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/poppy-client/errors.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,MAAM,CAAsB;IAC5B,WAAW,CAAsB;IACjC,OAAO,CAAuC;IAEvD,YACE,IAAY,EACZ,OAA4B,EAC5B,IAAI,GAIA,EAAE;QAEN,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;CACF;AAED,0EAA0E;AAC1E,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,UAAW,SAAQ,UAAU;IAC/B,UAAU,CAAsB;IACzC,YACE,IAAY,EACZ,IAAI,GAKA,EAAE;QAEN,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,oEAAoE;IAC3D,KAAK,CAAsB;IACpC,YACE,IAAY,EACZ,IAAI,GAIA,EAAE;QAEN,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;CACF;AAED,4DAA4D;AAC5D,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,oEAAoE;IAC3D,cAAc,CAAsB;IAC7C,YACE,IAAY,EACZ,IAAI,GAIA,EAAE;QAEN,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { DpopKey } from './dpop.js';
|
|
2
|
+
import { type FetchLike } from './util.js';
|
|
3
|
+
export interface HttpOptions {
|
|
4
|
+
fetch?: FetchLike | undefined;
|
|
5
|
+
/** Longest `Retry-After` we wait out automatically before giving up (seconds). */
|
|
6
|
+
maxRetryAfterSeconds?: number | undefined;
|
|
7
|
+
log?: ((line: string) => void) | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface PoppyRequestInit {
|
|
10
|
+
method?: string | undefined;
|
|
11
|
+
headers?: Record<string, string> | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* The body, or a builder called once per attempt. Token requests pass a builder so each
|
|
14
|
+
* retry carries brand-new assertions (fresh `jti`s), never a replayed one.
|
|
15
|
+
*/
|
|
16
|
+
body?: (string | (() => Promise<string>)) | undefined;
|
|
17
|
+
/** Signs a DPoP proof for every attempt when set. */
|
|
18
|
+
dpop?: DpopKey | undefined;
|
|
19
|
+
/** Sent as `Authorization: {scheme} {token}`. Never put in the URL (4.3). */
|
|
20
|
+
accessToken?: string | undefined;
|
|
21
|
+
scheme?: 'DPoP' | 'Bearer' | undefined;
|
|
22
|
+
signal?: AbortSignal | undefined;
|
|
23
|
+
redirect?: 'follow' | 'manual' | 'error' | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The one place requests leave this client. It signs DPoP proofs, remembers `DPoP-Nonce`
|
|
27
|
+
* values per origin and retries once on `use_dpop_nonce` (RFC 9449 section 8/9), and waits
|
|
28
|
+
* out a 429 `Retry-After` once (4.3, "Rate limits").
|
|
29
|
+
*/
|
|
30
|
+
export declare class PoppyHttp {
|
|
31
|
+
readonly fetch: FetchLike;
|
|
32
|
+
private readonly nonces;
|
|
33
|
+
private readonly maxRetryAfter;
|
|
34
|
+
private readonly log?;
|
|
35
|
+
constructor(opts?: HttpOptions);
|
|
36
|
+
request(url: string, init?: PoppyRequestInit): Promise<Response>;
|
|
37
|
+
}
|
|
38
|
+
/** Reads a JSON body, tolerating an empty one. */
|
|
39
|
+
export declare function readJson<T = Record<string, unknown>>(res: Response): Promise<T | undefined>;
|
|
40
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/poppy-client/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,KAAK,SAAS,EAAwC,MAAM,WAAW,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACtD,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;CACtD;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAuC;IAE5D,YAAY,IAAI,GAAE,WAAgB,EAIjC;IAEK,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsDzE;CACF;AAaD,kDAAkD;AAClD,wBAAsB,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAQjG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { PoppyError } from './errors.js';
|
|
2
|
+
import { parseRetryAfter, sleep, wwwAuthError } from './util.js';
|
|
3
|
+
/**
|
|
4
|
+
* The one place requests leave this client. It signs DPoP proofs, remembers `DPoP-Nonce`
|
|
5
|
+
* values per origin and retries once on `use_dpop_nonce` (RFC 9449 section 8/9), and waits
|
|
6
|
+
* out a 429 `Retry-After` once (4.3, "Rate limits").
|
|
7
|
+
*/
|
|
8
|
+
export class PoppyHttp {
|
|
9
|
+
fetch;
|
|
10
|
+
nonces = new Map();
|
|
11
|
+
maxRetryAfter;
|
|
12
|
+
log;
|
|
13
|
+
constructor(opts = {}) {
|
|
14
|
+
this.fetch = opts.fetch ?? ((input, init) => globalThis.fetch(input, init));
|
|
15
|
+
this.maxRetryAfter = opts.maxRetryAfterSeconds ?? 30;
|
|
16
|
+
this.log = opts.log;
|
|
17
|
+
}
|
|
18
|
+
async request(url, init = {}) {
|
|
19
|
+
const method = (init.method ?? 'GET').toUpperCase();
|
|
20
|
+
const origin = new URL(url).origin;
|
|
21
|
+
let nonceRetried = false;
|
|
22
|
+
let rateRetried = false;
|
|
23
|
+
for (;;) {
|
|
24
|
+
const headers = new Headers(init.headers);
|
|
25
|
+
const scheme = init.scheme ?? (init.dpop ? 'DPoP' : 'Bearer');
|
|
26
|
+
if (init.accessToken)
|
|
27
|
+
headers.set('authorization', `${scheme} ${init.accessToken}`);
|
|
28
|
+
if (init.dpop) {
|
|
29
|
+
headers.set('dpop', await init.dpop.proof({
|
|
30
|
+
htm: method,
|
|
31
|
+
htu: url,
|
|
32
|
+
accessToken: scheme === 'DPoP' ? init.accessToken : undefined,
|
|
33
|
+
nonce: this.nonces.get(origin),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
const body = typeof init.body === 'function' ? await init.body() : init.body;
|
|
37
|
+
const res = await this.fetch(url, {
|
|
38
|
+
method,
|
|
39
|
+
headers,
|
|
40
|
+
...(body !== undefined ? { body } : {}),
|
|
41
|
+
...(init.signal !== undefined ? { signal: init.signal } : {}),
|
|
42
|
+
// A redirect would change `htu`, so DPoP requests never follow one silently.
|
|
43
|
+
redirect: init.redirect ?? (init.dpop ? 'manual' : 'follow'),
|
|
44
|
+
});
|
|
45
|
+
const nonce = res.headers.get('dpop-nonce');
|
|
46
|
+
if (nonce)
|
|
47
|
+
this.nonces.set(origin, nonce);
|
|
48
|
+
if (init.dpop && nonce && !nonceRetried && (await isUseDpopNonce(res))) {
|
|
49
|
+
nonceRetried = true;
|
|
50
|
+
this.log?.(`DPoP nonce required by ${origin}; retrying with the nonce`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (res.status === 429 && !rateRetried) {
|
|
54
|
+
const wait = parseRetryAfter(res.headers.get('retry-after'));
|
|
55
|
+
if (wait !== undefined && wait <= this.maxRetryAfter) {
|
|
56
|
+
rateRetried = true;
|
|
57
|
+
this.log?.(`rate limited by ${origin}; waiting ${wait}s (Retry-After)`);
|
|
58
|
+
await sleep(wait * 1000, init.signal);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
throw new PoppyError('rate_limited', `rate limited by ${origin}`, {
|
|
62
|
+
status: 429,
|
|
63
|
+
details: { retry_after: wait },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return res;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function isUseDpopNonce(res) {
|
|
71
|
+
if (res.status !== 400 && res.status !== 401)
|
|
72
|
+
return false;
|
|
73
|
+
if (wwwAuthError(res.headers.get('www-authenticate')).error === 'use_dpop_nonce')
|
|
74
|
+
return true;
|
|
75
|
+
try {
|
|
76
|
+
const body = (await res.clone().json());
|
|
77
|
+
return body?.error === 'use_dpop_nonce';
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Reads a JSON body, tolerating an empty one. */
|
|
84
|
+
export async function readJson(res) {
|
|
85
|
+
const text = await res.text();
|
|
86
|
+
if (!text)
|
|
87
|
+
return undefined;
|
|
88
|
+
try {
|
|
89
|
+
return JSON.parse(text);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/poppy-client/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type StoredKey } from './keys.js';
|
|
2
|
+
import type { ClientMetadata } from './types.js';
|
|
3
|
+
import { type SecurityOptions } from './util.js';
|
|
4
|
+
export interface IdentityConfig {
|
|
5
|
+
/** Where the identity documents are served, e.g. `https://agent.example`. */
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
clientName: string;
|
|
8
|
+
/** Defaults to `{baseUrl}/logo.svg`, which `serve-identity` serves. */
|
|
9
|
+
logoUri?: string | undefined;
|
|
10
|
+
/** Signing keys; the first one signs. Public halves go in `jwks_uri`. */
|
|
11
|
+
keys: StoredKey[];
|
|
12
|
+
/** Extensions this agent supports (3.3). None by default. */
|
|
13
|
+
extensions?: Record<string, {
|
|
14
|
+
version: string;
|
|
15
|
+
}> | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Lifetime of every assertion this agent signs. The browser assertion caps at 60s (section 5). */
|
|
18
|
+
export declare const ASSERTION_TTL_SECONDS = 60;
|
|
19
|
+
/**
|
|
20
|
+
* The Personal Agent's identity (4.1): its `client_id` URL, its metadata document, and the
|
|
21
|
+
* keys from `jwks_uri` that sign client assertions, Session assertions and browser assertions.
|
|
22
|
+
*/
|
|
23
|
+
export declare class AgentIdentity {
|
|
24
|
+
readonly baseUrl: string;
|
|
25
|
+
readonly clientName: string;
|
|
26
|
+
readonly logoUri: string;
|
|
27
|
+
readonly keys: StoredKey[];
|
|
28
|
+
readonly extensions?: Record<string, {
|
|
29
|
+
version: string;
|
|
30
|
+
}> | undefined;
|
|
31
|
+
constructor(cfg: IdentityConfig, sec?: SecurityOptions);
|
|
32
|
+
/** `client_id` is the URL the metadata document is fetched from (4.1). */
|
|
33
|
+
get clientId(): string;
|
|
34
|
+
get jwksUri(): string;
|
|
35
|
+
/** Same origin as `client_id`, as 4.1 requires for `redirect_uris`. */
|
|
36
|
+
get redirectUri(): string;
|
|
37
|
+
metadata(): ClientMetadata;
|
|
38
|
+
/** The public key set. Never contains private members. */
|
|
39
|
+
jwks(): {
|
|
40
|
+
keys: Record<string, unknown>[];
|
|
41
|
+
};
|
|
42
|
+
private sign;
|
|
43
|
+
/**
|
|
44
|
+
* `private_key_jwt` client assertion (RFC 7523 section 2.2): `iss` = `sub` = `client_id`,
|
|
45
|
+
* `aud` = the authorization server (its token endpoint by default), fresh `jti`.
|
|
46
|
+
*/
|
|
47
|
+
clientAssertion(audience: string): Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* The JWT bearer grant assertion that starts or renews a Session (4.2): names the agent in
|
|
50
|
+
* `iss` and the User ID in `sub`; `aud` is the token endpoint as a single string.
|
|
51
|
+
*/
|
|
52
|
+
sessionAssertion(userId: string, tokenEndpoint: string): Promise<string>;
|
|
53
|
+
/** Browser assertion (section 5), header `typ: poppy-browser+jwt`, `exp` <= `iat` + 60. */
|
|
54
|
+
browserAssertion(input: {
|
|
55
|
+
userId: string;
|
|
56
|
+
endpoint: string;
|
|
57
|
+
sessionId: string;
|
|
58
|
+
returnTo: string;
|
|
59
|
+
}): Promise<string>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/poppy-client/identity.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEzF,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,yEAAyE;IACzE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;CAC9D;AAED,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;;GAGG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAEtE,YAAY,GAAG,EAAE,cAAc,EAAE,GAAG,GAAE,eAAoB,EASzD;IAED,0EAA0E;IAC1E,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,uEAAuE;IACvE,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,QAAQ,IAAI,cAAc,CAazB;IAED,0DAA0D;IAC1D,IAAI,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAE1C;YAEa,IAAI;IAQlB;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjD;IAED;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUvE;IAED,2FAA2F;IAC3F,gBAAgB,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAelB;CACF"}
|