@adonis-agora/agent 0.76.3 → 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 +16 -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/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,122 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
/** A random URL-safe ID. 16 bytes = 128 random bits, the floor the spec sets for `jti` (4.2). */
|
|
3
|
+
export function randomId(prefix = '', bytes = 16) {
|
|
4
|
+
return prefix + randomBytes(bytes).toString('base64url');
|
|
5
|
+
}
|
|
6
|
+
export function sha256b64url(input) {
|
|
7
|
+
return createHash('sha256').update(input).digest('base64url');
|
|
8
|
+
}
|
|
9
|
+
export function nowSeconds() {
|
|
10
|
+
return Math.floor(Date.now() / 1000);
|
|
11
|
+
}
|
|
12
|
+
export function sleep(ms, signal) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
if (signal?.aborted)
|
|
15
|
+
return reject(signal.reason ?? new Error('aborted'));
|
|
16
|
+
const t = setTimeout(() => {
|
|
17
|
+
signal?.removeEventListener('abort', onAbort);
|
|
18
|
+
resolve();
|
|
19
|
+
}, ms);
|
|
20
|
+
const onAbort = () => {
|
|
21
|
+
clearTimeout(t);
|
|
22
|
+
reject(signal?.reason ?? new Error('aborted'));
|
|
23
|
+
};
|
|
24
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Hosts we treat as "local development" for messages and defaults. */
|
|
28
|
+
export function isLoopbackHost(hostname) {
|
|
29
|
+
const h = hostname.replace(/^\[|\]$/g, '').toLowerCase();
|
|
30
|
+
return (h === 'localhost' || h.endsWith('.localhost') || h === '::1' || /^127(\.\d{1,3}){3}$/.test(h));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parses `value` as an absolute URL and enforces the spec's HTTPS requirement. With
|
|
34
|
+
* `insecureDev`, plain `http:` is tolerated too.
|
|
35
|
+
*/
|
|
36
|
+
export function requireSecureUrl(value, what, sec) {
|
|
37
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
38
|
+
throw new TypeError(`${what} must be a URL string`);
|
|
39
|
+
}
|
|
40
|
+
let url;
|
|
41
|
+
try {
|
|
42
|
+
url = new URL(value);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new TypeError(`${what} is not a valid URL: ${value}`);
|
|
46
|
+
}
|
|
47
|
+
if (url.protocol === 'https:')
|
|
48
|
+
return url;
|
|
49
|
+
if (url.protocol === 'http:' && sec.insecureDev)
|
|
50
|
+
return url;
|
|
51
|
+
throw new TypeError(`${what} must be an https:// URL (got ${url.protocol}//${url.host})${url.protocol === 'http:' ? '. Pass --insecure-dev to allow http:// for local testing.' : ''}`);
|
|
52
|
+
}
|
|
53
|
+
/** Strip a single leading `www.` and lowercase, as the spec compares domains (3.1). */
|
|
54
|
+
export function normalizeDomain(domain) {
|
|
55
|
+
return domain.toLowerCase().replace(/^www\./, '');
|
|
56
|
+
}
|
|
57
|
+
/** `Retry-After` as seconds: either delta-seconds or an HTTP-date. */
|
|
58
|
+
export function parseRetryAfter(value) {
|
|
59
|
+
if (!value)
|
|
60
|
+
return undefined;
|
|
61
|
+
const n = Number(value);
|
|
62
|
+
if (Number.isFinite(n) && n >= 0)
|
|
63
|
+
return n;
|
|
64
|
+
const date = Date.parse(value);
|
|
65
|
+
if (!Number.isNaN(date))
|
|
66
|
+
return Math.max(0, Math.ceil((date - Date.now()) / 1000));
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Minimal `WWW-Authenticate` parser: enough for `DPoP error="...", scope="..."` and
|
|
71
|
+
* `Bearer error="..."` (RFC 6750 / RFC 9449). Handles several challenges in one header.
|
|
72
|
+
*/
|
|
73
|
+
export function parseWwwAuthenticate(header) {
|
|
74
|
+
if (!header)
|
|
75
|
+
return [];
|
|
76
|
+
const out = [];
|
|
77
|
+
let i = 0;
|
|
78
|
+
let current;
|
|
79
|
+
while (i < header.length) {
|
|
80
|
+
while (header[i] === ' ' || header[i] === ',')
|
|
81
|
+
i++;
|
|
82
|
+
if (i >= header.length)
|
|
83
|
+
break;
|
|
84
|
+
// Try param first (token "=" ...), then scheme.
|
|
85
|
+
const paramRe = /([A-Za-z0-9_-]+)\s*=\s*("((?:[^"\\]|\\.)*)"|[^,\s]+)/y;
|
|
86
|
+
paramRe.lastIndex = i;
|
|
87
|
+
const pm = paramRe.exec(header);
|
|
88
|
+
if (pm && current) {
|
|
89
|
+
current.params[(pm[1] ?? '').toLowerCase()] =
|
|
90
|
+
pm[3] !== undefined ? pm[3].replace(/\\(.)/g, '$1') : (pm[2] ?? '');
|
|
91
|
+
i = paramRe.lastIndex;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const schemeRe = /([A-Za-z][A-Za-z0-9!#$%&'*+.^_`|~-]*)/y;
|
|
95
|
+
schemeRe.lastIndex = i;
|
|
96
|
+
const sm = schemeRe.exec(header);
|
|
97
|
+
if (!sm)
|
|
98
|
+
break;
|
|
99
|
+
current = { scheme: sm[1] ?? '', params: {} };
|
|
100
|
+
out.push(current);
|
|
101
|
+
i = schemeRe.lastIndex;
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
/** The first `error` found in any challenge of a `WWW-Authenticate` header. */
|
|
106
|
+
export function wwwAuthError(header) {
|
|
107
|
+
for (const c of parseWwwAuthenticate(header)) {
|
|
108
|
+
if (c.params.error) {
|
|
109
|
+
return {
|
|
110
|
+
error: c.params.error,
|
|
111
|
+
scope: c.params.scope,
|
|
112
|
+
description: c.params.error_description,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {};
|
|
117
|
+
}
|
|
118
|
+
/** A space-separated scope string as a set (OAuth scope syntax, RFC 6749 3.3). */
|
|
119
|
+
export function scopeSet(scope) {
|
|
120
|
+
return new Set((scope ?? '').split(' ').filter(Boolean));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/poppy-client/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { Actor } from '../types.js';
|
|
2
|
+
import type { PoppyConnectionStore } from './store.js';
|
|
3
|
+
/** What this app's agent may do at one Company. */
|
|
4
|
+
export interface PoppyCompanyPolicy {
|
|
5
|
+
/** A name for the model and the pages. Default: the Company's own `organization.name`. */
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Scopes the connect step asks for. Default: every scope the sign-in offers. */
|
|
8
|
+
scopes?: string[];
|
|
9
|
+
/**
|
|
10
|
+
* Scopes that only READ — what `ask` narrows its token to, so a plain question can never make the
|
|
11
|
+
* Company act (an action takes `request`, which the person confirms). Default `['poppy:read']`.
|
|
12
|
+
*/
|
|
13
|
+
readScopes?: string[];
|
|
14
|
+
}
|
|
15
|
+
/** A signing key of this app's agent identity: a private EC P-256 JWK (`kid` optional). */
|
|
16
|
+
export type PoppyAgentKey = Record<string, unknown>;
|
|
17
|
+
export interface PoppyConnectionsTexts {
|
|
18
|
+
pageTitle: string;
|
|
19
|
+
connectTitle: string;
|
|
20
|
+
connectBody: string;
|
|
21
|
+
direct: string;
|
|
22
|
+
device: string;
|
|
23
|
+
deviceBody: string;
|
|
24
|
+
deviceCheck: string;
|
|
25
|
+
mediatedTitle: string;
|
|
26
|
+
mediatedSubmit: string;
|
|
27
|
+
codeTitle: string;
|
|
28
|
+
codeLabel: string;
|
|
29
|
+
codeSubmit: string;
|
|
30
|
+
connectedTitle: string;
|
|
31
|
+
connectedBody: string;
|
|
32
|
+
failedTitle: string;
|
|
33
|
+
failedBody: string;
|
|
34
|
+
expiredTitle: string;
|
|
35
|
+
expiredBody: string;
|
|
36
|
+
pendingBody: string;
|
|
37
|
+
confirmConnectTitle: string;
|
|
38
|
+
confirmConnectVerb: string;
|
|
39
|
+
confirmConnectDetail: string;
|
|
40
|
+
/**
|
|
41
|
+
* What the conversation is continued with once the person connected (independent approvals:
|
|
42
|
+
* a new turn on the thread, in the person's voice). `{company}`.
|
|
43
|
+
*/
|
|
44
|
+
continueAfterConnect: string;
|
|
45
|
+
confirmWriteTitle: string;
|
|
46
|
+
confirmRequestTitle: string;
|
|
47
|
+
confirmDisconnectTitle: string;
|
|
48
|
+
confirmVerb: string;
|
|
49
|
+
}
|
|
50
|
+
/** `{name}` placeholders: `{company}`, `{link}`, `{code}`, `{tool}`. */
|
|
51
|
+
export declare const DEFAULT_POPPY_CONNECTIONS_TEXTS: PoppyConnectionsTexts;
|
|
52
|
+
/**
|
|
53
|
+
* `config/poppy_connections.ts` — this app's agent acting on OTHER Poppy Companies for its users.
|
|
54
|
+
*
|
|
55
|
+
* @experimental Tracks Personal Agent Protocol Draft 0.1 (https://personalagentprotocol.org/docs/spec):
|
|
56
|
+
* this API WILL change as the spec evolves — possibly in breaking ways, outside semver majors.
|
|
57
|
+
*/
|
|
58
|
+
export interface PoppyConnectionsConfig {
|
|
59
|
+
/** This app's public origin (HTTPS). The identity lives at `{baseUrl}/{path}/agent.json`. */
|
|
60
|
+
baseUrl: string;
|
|
61
|
+
/** Where the identity, the connect pages and the callback are served. Default `'poppy-agent'`. */
|
|
62
|
+
path?: string;
|
|
63
|
+
identity: {
|
|
64
|
+
/** `client_name` — what the Company shows its users on its consent screen. */
|
|
65
|
+
name: string;
|
|
66
|
+
logoUri?: string;
|
|
67
|
+
/** Private EC P-256 JWKs (a JSON string works: an env var). The first signs; all are published. */
|
|
68
|
+
keys: PoppyAgentKey[] | string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The Companies this agent may talk to (`domain` or `domain:port`, as discovered). **Default:
|
|
72
|
+
* none.** A list, a map to per-Company policy, or a predicate.
|
|
73
|
+
*/
|
|
74
|
+
companies?: string[] | Record<string, PoppyCompanyPolicy> | ((domain: string) => boolean);
|
|
75
|
+
/** Whose connection a turn uses. Default: `actor.tenantRef ?? actor.id`. */
|
|
76
|
+
owner?: (actor: Actor) => string;
|
|
77
|
+
/** `'lucid'` (default), `'memory'`, or a store. */
|
|
78
|
+
store?: 'lucid' | 'memory' | PoppyConnectionStore;
|
|
79
|
+
connection?: string;
|
|
80
|
+
autoCreateTables?: boolean;
|
|
81
|
+
/** Seals tokens and keys at rest. Default: the app key. */
|
|
82
|
+
secret?: string;
|
|
83
|
+
/**
|
|
84
|
+
* DEVELOPMENT ONLY, not spec-compliant: accept `http://` Companies and serve the identity over
|
|
85
|
+
* http (a local app). Refused when `NODE_ENV=production`.
|
|
86
|
+
*/
|
|
87
|
+
insecureDev?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Tool names' prefix (default `'poppy_'`), the roles they require, how `connect` works
|
|
90
|
+
* (`'action'` card that resumes, or `'link'`), and whether the write tools are registered.
|
|
91
|
+
* `register: false` registers none (an app with its own per-turn registry calls
|
|
92
|
+
* `registerPoppyConnectionTools` itself).
|
|
93
|
+
*/
|
|
94
|
+
tools?: {
|
|
95
|
+
prefix?: string;
|
|
96
|
+
roles?: string[];
|
|
97
|
+
ability?: string;
|
|
98
|
+
connect?: 'action' | 'link';
|
|
99
|
+
writes?: boolean;
|
|
100
|
+
register?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Company tools that confirm in two steps (called first without `confirm` they only answer a
|
|
103
|
+
* preview and a `confirmToken`): the write tool shows that preview on its card and, once the
|
|
104
|
+
* person confirms, commits with the token. Detected by the tool's input schema having both
|
|
105
|
+
* fields. `false` turns it off. Default `{ confirm: 'confirm', token: 'confirmToken' }`.
|
|
106
|
+
*/
|
|
107
|
+
twoStep?: TwoStepConvention | false;
|
|
108
|
+
};
|
|
109
|
+
/** How long a connect link works, in seconds. Default 900. */
|
|
110
|
+
connectTtlSeconds?: number;
|
|
111
|
+
/** How long `ask`/`request` wait for the Company's reply. Default 90 000 ms. */
|
|
112
|
+
replyTimeoutMs?: number;
|
|
113
|
+
texts?: Partial<PoppyConnectionsTexts>;
|
|
114
|
+
/**
|
|
115
|
+
* Routes for the app's own UI: `GET {path}/api/connections`, `DELETE {path}/api/connections/:domain`,
|
|
116
|
+
* behind the app's session. `actor` says who is asking (null → 401).
|
|
117
|
+
*/
|
|
118
|
+
api?: {
|
|
119
|
+
actor: (ctx: import('@adonisjs/core/http').HttpContext) => Actor | null | Promise<Actor | null>;
|
|
120
|
+
};
|
|
121
|
+
/** `fetch` for every request to Companies (tests). */
|
|
122
|
+
fetch?: typeof fetch;
|
|
123
|
+
}
|
|
124
|
+
/** Field names of a Company's two-step confirmation convention (see `tools.twoStep`). */
|
|
125
|
+
export interface TwoStepConvention {
|
|
126
|
+
confirm: string;
|
|
127
|
+
token: string;
|
|
128
|
+
/** Preview fields read for the card, first found wins. Default `['summary', 'resumo', 'message']`. */
|
|
129
|
+
summary?: string[];
|
|
130
|
+
}
|
|
131
|
+
export declare function definePoppyConnectionsConfig(config: PoppyConnectionsConfig): PoppyConnectionsConfig;
|
|
132
|
+
/** `https://Acme.com/` → `acme.com`; `localhost:3333` stays. */
|
|
133
|
+
export declare function normalizeDomain(value: string): string;
|
|
134
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** `{name}` placeholders: `{company}`, `{link}`, `{code}`, `{tool}`. */
|
|
2
|
+
export const DEFAULT_POPPY_CONNECTIONS_TEXTS = {
|
|
3
|
+
pageTitle: 'Connect your account',
|
|
4
|
+
connectTitle: 'Connect your {company} account',
|
|
5
|
+
connectBody: 'Your assistant asked to act on your {company} account. Sign in there to allow it.',
|
|
6
|
+
direct: 'Sign in to {company}',
|
|
7
|
+
device: 'Approve with a code instead',
|
|
8
|
+
deviceBody: 'Open {link} and enter the code {code}. Then come back here.',
|
|
9
|
+
deviceCheck: 'I approved it',
|
|
10
|
+
mediatedTitle: 'Or sign in here',
|
|
11
|
+
mediatedSubmit: 'Continue',
|
|
12
|
+
codeTitle: 'Enter the code',
|
|
13
|
+
codeLabel: 'Code sent to {sentTo}',
|
|
14
|
+
codeSubmit: 'Confirm',
|
|
15
|
+
connectedTitle: 'Connected to {company}',
|
|
16
|
+
connectedBody: 'You can go back to the conversation.',
|
|
17
|
+
failedTitle: 'Could not connect',
|
|
18
|
+
failedBody: 'The sign-in did not go through. Go back to the conversation and try again.',
|
|
19
|
+
expiredTitle: 'This link expired',
|
|
20
|
+
expiredBody: 'Ask your assistant for a new one.',
|
|
21
|
+
pendingBody: 'Not approved yet. Approve it and try again.',
|
|
22
|
+
confirmConnectTitle: 'Connect your {company} account',
|
|
23
|
+
confirmConnectVerb: 'I connected',
|
|
24
|
+
confirmConnectDetail: 'Open this link and sign in to {company}: {link}',
|
|
25
|
+
continueAfterConnect: 'I connected my account at {company}. Please go on with what I asked.',
|
|
26
|
+
confirmWriteTitle: '{company}: {tool}',
|
|
27
|
+
confirmRequestTitle: 'Ask {company} to act',
|
|
28
|
+
confirmDisconnectTitle: 'Disconnect your {company} account',
|
|
29
|
+
confirmVerb: 'Confirm',
|
|
30
|
+
};
|
|
31
|
+
export function definePoppyConnectionsConfig(config) {
|
|
32
|
+
return config;
|
|
33
|
+
}
|
|
34
|
+
/** `https://Acme.com/` → `acme.com`; `localhost:3333` stays. */
|
|
35
|
+
export function normalizeDomain(value) {
|
|
36
|
+
const trimmed = value.trim().toLowerCase().replace(/\/+$/, '');
|
|
37
|
+
try {
|
|
38
|
+
if (/^[a-z]+:\/\//.test(trimmed))
|
|
39
|
+
return new URL(trimmed).host;
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
return trimmed.replace(/^www\./, '');
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/poppy-connections/config.ts"],"names":[],"mappings":"AAqDA,wEAAwE;AACxE,MAAM,CAAC,MAAM,+BAA+B,GAA0B;IACpE,SAAS,EAAE,sBAAsB;IACjC,YAAY,EAAE,gCAAgC;IAC9C,WAAW,EAAE,mFAAmF;IAChG,MAAM,EAAE,sBAAsB;IAC9B,MAAM,EAAE,6BAA6B;IACrC,UAAU,EAAE,6DAA6D;IACzE,WAAW,EAAE,eAAe;IAC5B,aAAa,EAAE,iBAAiB;IAChC,cAAc,EAAE,UAAU;IAC1B,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,uBAAuB;IAClC,UAAU,EAAE,SAAS;IACrB,cAAc,EAAE,wBAAwB;IACxC,aAAa,EAAE,sCAAsC;IACrD,WAAW,EAAE,mBAAmB;IAChC,UAAU,EAAE,4EAA4E;IACxF,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,mCAAmC;IAChD,WAAW,EAAE,6CAA6C;IAC1D,mBAAmB,EAAE,gCAAgC;IACrD,kBAAkB,EAAE,aAAa;IACjC,oBAAoB,EAAE,iDAAiD;IACvE,oBAAoB,EAAE,sEAAsE;IAC5F,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,sBAAsB;IAC3C,sBAAsB,EAAE,mCAAmC;IAC3D,WAAW,EAAE,SAAS;CACvB,CAAC;AAmFF,MAAM,UAAU,4BAA4B,CAC1C,MAA8B;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seals what a connection keeps at rest — the Account Token (a long-lived refresh token), the DPoP
|
|
3
|
+
* private key and the Session Tokens — with AES-256-GCM under a key derived from the app's secret
|
|
4
|
+
* (its `APP_KEY`). A database dump alone does not hand out anybody's access to another company.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Sealer {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(secret: string);
|
|
9
|
+
seal(value: unknown): string;
|
|
10
|
+
open<T>(sealed: string): T;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/crypto.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,MAAM;;IAGjB,YAAY,MAAM,EAAE,MAAM,EAOzB;IAED,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO3B;IAED,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAWzB;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Seals what a connection keeps at rest — the Account Token (a long-lived refresh token), the DPoP
|
|
4
|
+
* private key and the Session Tokens — with AES-256-GCM under a key derived from the app's secret
|
|
5
|
+
* (its `APP_KEY`). A database dump alone does not hand out anybody's access to another company.
|
|
6
|
+
*/
|
|
7
|
+
export class Sealer {
|
|
8
|
+
#key;
|
|
9
|
+
constructor(secret) {
|
|
10
|
+
if (typeof secret !== 'string' || secret.length < 16) {
|
|
11
|
+
throw new Error('[@adonis-agora/agent] poppy-connections: the sealing secret must be ≥ 16 chars');
|
|
12
|
+
}
|
|
13
|
+
this.#key = createHash('sha256').update(`poppy-connections:v1:${secret}`).digest();
|
|
14
|
+
}
|
|
15
|
+
seal(value) {
|
|
16
|
+
const iv = randomBytes(12);
|
|
17
|
+
const cipher = createCipheriv('aes-256-gcm', this.#key, iv);
|
|
18
|
+
const body = Buffer.concat([cipher.update(JSON.stringify(value), 'utf8'), cipher.final()]);
|
|
19
|
+
return ['v1', iv, cipher.getAuthTag(), body]
|
|
20
|
+
.map((p) => (typeof p === 'string' ? p : p.toString('base64url')))
|
|
21
|
+
.join('.');
|
|
22
|
+
}
|
|
23
|
+
open(sealed) {
|
|
24
|
+
const [version, iv, tag, body] = sealed.split('.');
|
|
25
|
+
if (version !== 'v1' || !iv || !tag || body === undefined)
|
|
26
|
+
throw new Error('poppy-connections: unknown sealed format');
|
|
27
|
+
const decipher = createDecipheriv('aes-256-gcm', this.#key, Buffer.from(iv, 'base64url'));
|
|
28
|
+
decipher.setAuthTag(Buffer.from(tag, 'base64url'));
|
|
29
|
+
const plain = Buffer.concat([
|
|
30
|
+
decipher.update(Buffer.from(body, 'base64url')),
|
|
31
|
+
decipher.final(),
|
|
32
|
+
]);
|
|
33
|
+
return JSON.parse(plain.toString('utf8'));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/poppy-connections/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExF;;;;GAIG;AACH,MAAM,OAAO,MAAM;IACR,IAAI,CAAS;IAEtB,YAAY,MAAc;QACxB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACrF,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;aACjE,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAI,MAAc;QACpB,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,SAAS;YACvD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1F,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/C,QAAQ,CAAC,KAAK,EAAE;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAM,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { PoppyConnectionsTexts } from './config.js';
|
|
2
|
+
import type { PoppyConnections } from './service.js';
|
|
3
|
+
/** The slice of a request/response the routes need — Adonis or a bare `node:http` server. */
|
|
4
|
+
export interface PoppyConnectionsExchange {
|
|
5
|
+
method: string;
|
|
6
|
+
/** Path without the query string. */
|
|
7
|
+
path: string;
|
|
8
|
+
query: URLSearchParams;
|
|
9
|
+
readBody(limit: number): Promise<string>;
|
|
10
|
+
send(status: number, headers: Record<string, string>, body: string): void;
|
|
11
|
+
}
|
|
12
|
+
/** What a connect page shows, for an app that renders its own (`render`). */
|
|
13
|
+
export type PoppyConnectView = {
|
|
14
|
+
view: 'expired';
|
|
15
|
+
} | {
|
|
16
|
+
view: 'connected';
|
|
17
|
+
organization: string;
|
|
18
|
+
} | {
|
|
19
|
+
view: 'failed';
|
|
20
|
+
organization: string | null;
|
|
21
|
+
retryUrl: string | null;
|
|
22
|
+
} | {
|
|
23
|
+
view: 'choose';
|
|
24
|
+
organization: string;
|
|
25
|
+
directUrl: string | null;
|
|
26
|
+
deviceUrl: string | null;
|
|
27
|
+
mediated: {
|
|
28
|
+
action: string;
|
|
29
|
+
fields: {
|
|
30
|
+
name: string;
|
|
31
|
+
label: string;
|
|
32
|
+
secret: boolean;
|
|
33
|
+
}[];
|
|
34
|
+
} | null;
|
|
35
|
+
} | {
|
|
36
|
+
view: 'code';
|
|
37
|
+
organization: string;
|
|
38
|
+
action: string;
|
|
39
|
+
sentTo: string;
|
|
40
|
+
} | {
|
|
41
|
+
view: 'device';
|
|
42
|
+
organization: string;
|
|
43
|
+
userCode: string;
|
|
44
|
+
verificationUri: string;
|
|
45
|
+
checkUrl: string;
|
|
46
|
+
pending: boolean;
|
|
47
|
+
};
|
|
48
|
+
export type PoppyConnectRenderer = (view: PoppyConnectView, texts: PoppyConnectionsTexts) => string;
|
|
49
|
+
/** The built-in pages: plain, accessible HTML; an app gives its own look with `render`. */
|
|
50
|
+
export declare const defaultConnectRenderer: PoppyConnectRenderer;
|
|
51
|
+
/** The default identity logo: the name's initial on a rounded square. */
|
|
52
|
+
export declare function defaultLogoSvg(name: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* The routes under `/{path}`: the agent identity (`agent.json`, `jwks.json`), the connect pages and
|
|
55
|
+
* the Direct Sign-In callback. Returns `false` for anything else. Mounted ahead of the router: no
|
|
56
|
+
* session, no CSRF token — the connect id in the URL is the capability (128 bits, single-purpose,
|
|
57
|
+
* expiring), and the forms only ever post back to the same id.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createPoppyConnectionsHandler(connections: PoppyConnections, options?: {
|
|
60
|
+
render?: PoppyConnectRenderer;
|
|
61
|
+
onError?: (error: unknown) => void;
|
|
62
|
+
}): (ex: PoppyConnectionsExchange) => Promise<boolean>;
|
|
63
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3E;AAED,6EAA6E;AAC7E,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACxE;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;KAC5D,GAAG,IAAI,CAAC;CACV,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtE;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,KAAK,MAAM,CAAC;AAcpG,2FAA2F;AAC3F,eAAO,MAAM,sBAAsB,EAAE,oBA8CpC,CAAC;AAWF,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,GAClF,CAAC,EAAE,EAAE,wBAAwB,KAAK,OAAO,CAAC,OAAO,CAAC,CA4JpD"}
|