@adonis-agora/agent 0.76.3 → 0.77.1
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 +22 -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 +47 -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/channels.d.ts +5 -0
- package/dist/src/genui/channels.d.ts.map +1 -1
- package/dist/src/genui/channels.js +11 -0
- package/dist/src/genui/channels.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
|
+
const escapeHtml = (value) => value.replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]);
|
|
2
|
+
function fill(template, values) {
|
|
3
|
+
return escapeHtml(template).replace(/\{(\w+)\}/g, (_, k) => values[k] !== undefined ? escapeHtml(values[k]) : `{${k}}`);
|
|
4
|
+
}
|
|
5
|
+
/** The built-in pages: plain, accessible HTML; an app gives its own look with `render`. */
|
|
6
|
+
export const defaultConnectRenderer = (view, t) => {
|
|
7
|
+
const org = 'organization' in view && view.organization ? view.organization : '';
|
|
8
|
+
const button = (label) => `<button type="submit" style="width:100%;padding:.75rem;border:0;border-radius:.75rem;background:#111;color:#fff;font-weight:600;font-size:1rem">${label}</button>`;
|
|
9
|
+
let body = '';
|
|
10
|
+
switch (view.view) {
|
|
11
|
+
case 'expired':
|
|
12
|
+
body = `<h1>${fill(t.expiredTitle, {})}</h1><p>${fill(t.expiredBody, {})}</p>`;
|
|
13
|
+
break;
|
|
14
|
+
case 'connected':
|
|
15
|
+
body = `<h1>${fill(t.connectedTitle, { company: org })}</h1><p>${fill(t.connectedBody, {})}</p>`;
|
|
16
|
+
break;
|
|
17
|
+
case 'failed':
|
|
18
|
+
body = `<h1>${fill(t.failedTitle, {})}</h1><p>${fill(t.failedBody, {})}</p>${view.retryUrl
|
|
19
|
+
? `<p><a href="${escapeHtml(view.retryUrl)}">${fill(t.connectTitle, { company: org })}</a></p>`
|
|
20
|
+
: ''}`;
|
|
21
|
+
break;
|
|
22
|
+
case 'choose': {
|
|
23
|
+
body = `<h1>${fill(t.connectTitle, { company: org })}</h1><p>${fill(t.connectBody, { company: org })}</p>`;
|
|
24
|
+
if (view.directUrl) {
|
|
25
|
+
body += `<form method="POST" action="${escapeHtml(view.directUrl)}">${button(fill(t.direct, { company: org }))}</form>`;
|
|
26
|
+
}
|
|
27
|
+
if (view.mediated) {
|
|
28
|
+
body += `<h2>${fill(t.mediatedTitle, {})}</h2><form method="POST" action="${escapeHtml(view.mediated.action)}">`;
|
|
29
|
+
for (const f of view.mediated.fields) {
|
|
30
|
+
body += `<label style="display:block;margin:.5rem 0">${escapeHtml(f.label)}<input name="${escapeHtml(f.name)}" type="${f.secret ? 'password' : 'text'}" autocomplete="${f.secret ? 'current-password' : 'off'}" required style="display:block;width:100%;padding:.6rem;margin-top:.25rem;border:1px solid #ccc;border-radius:.5rem"></label>`;
|
|
31
|
+
}
|
|
32
|
+
body += `${button(fill(t.mediatedSubmit, {}))}</form>`;
|
|
33
|
+
}
|
|
34
|
+
if (view.deviceUrl) {
|
|
35
|
+
body += `<form method="POST" action="${escapeHtml(view.deviceUrl)}" style="margin-top:1rem"><button type="submit" style="background:none;border:0;text-decoration:underline;cursor:pointer">${fill(t.device, {})}</button></form>`;
|
|
36
|
+
}
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case 'code':
|
|
40
|
+
body = `<h1>${fill(t.codeTitle, {})}</h1><form method="POST" action="${escapeHtml(view.action)}"><label style="display:block;margin:.5rem 0">${fill(t.codeLabel, { sentTo: view.sentTo })}<input name="code" inputmode="numeric" autocomplete="one-time-code" required style="display:block;width:100%;padding:.6rem;margin-top:.25rem;border:1px solid #ccc;border-radius:.5rem"></label>${button(fill(t.codeSubmit, {}))}</form>`;
|
|
41
|
+
break;
|
|
42
|
+
case 'device':
|
|
43
|
+
body = `<h1>${fill(t.connectTitle, { company: org })}</h1><p>${fill(t.deviceBody, { link: view.verificationUri, code: view.userCode })}</p><p><a href="${escapeHtml(view.verificationUri)}">${escapeHtml(view.verificationUri)}</a></p>${view.pending ? `<p>${fill(t.pendingBody, {})}</p>` : ''}<form method="POST" action="${escapeHtml(view.checkUrl)}">${button(fill(t.deviceCheck, {}))}</form>`;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
return `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="referrer" content="no-referrer"><title>${fill(t.pageTitle, {})}</title></head><body style="font-family:system-ui,sans-serif;max-width:28rem;margin:3rem auto;padding:0 1rem;line-height:1.5">${body}</body></html>`;
|
|
47
|
+
};
|
|
48
|
+
const SECURITY_HEADERS = {
|
|
49
|
+
'content-type': 'text/html; charset=utf-8',
|
|
50
|
+
'cache-control': 'no-store',
|
|
51
|
+
'x-frame-options': 'DENY',
|
|
52
|
+
'content-security-policy': "default-src 'none'; style-src 'unsafe-inline'; img-src * data:; form-action *; frame-ancestors 'none'",
|
|
53
|
+
'referrer-policy': 'no-referrer',
|
|
54
|
+
};
|
|
55
|
+
/** The default identity logo: the name's initial on a rounded square. */
|
|
56
|
+
export function defaultLogoSvg(name) {
|
|
57
|
+
const initial = escapeHtml(([...name.trim()][0] ?? 'A').toUpperCase());
|
|
58
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#334155"/><text x="32" y="42" font-family="sans-serif" font-size="30" text-anchor="middle" fill="#fff">${initial}</text></svg>`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The routes under `/{path}`: the agent identity (`agent.json`, `jwks.json`), the connect pages and
|
|
62
|
+
* the Direct Sign-In callback. Returns `false` for anything else. Mounted ahead of the router: no
|
|
63
|
+
* session, no CSRF token — the connect id in the URL is the capability (128 bits, single-purpose,
|
|
64
|
+
* expiring), and the forms only ever post back to the same id.
|
|
65
|
+
*/
|
|
66
|
+
export function createPoppyConnectionsHandler(connections, options = {}) {
|
|
67
|
+
const render = options.render ?? defaultConnectRenderer;
|
|
68
|
+
const base = `/${connections.path}`;
|
|
69
|
+
const page = (ex, status, view) => ex.send(status, SECURITY_HEADERS, render(view, connections.texts));
|
|
70
|
+
const url = (suffix) => `${connections.baseUrl}${base}${suffix}`;
|
|
71
|
+
const choose = async (ex, id) => {
|
|
72
|
+
const data = await connections.page(id);
|
|
73
|
+
if (data.kind === 'expired')
|
|
74
|
+
return page(ex, 410, { view: 'expired' });
|
|
75
|
+
if (data.kind === 'connected')
|
|
76
|
+
return page(ex, 200, { view: 'connected', organization: data.organization });
|
|
77
|
+
return page(ex, 200, {
|
|
78
|
+
view: 'choose',
|
|
79
|
+
organization: data.organization,
|
|
80
|
+
directUrl: data.direct ? url(`/connect/${id}/direct`) : null,
|
|
81
|
+
deviceUrl: data.device ? url(`/connect/${id}/device`) : null,
|
|
82
|
+
mediated: data.mediated
|
|
83
|
+
? { action: url(`/connect/${id}/mediated`), fields: data.mediated }
|
|
84
|
+
: null,
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
return async (ex) => {
|
|
88
|
+
if (ex.path !== base && !ex.path.startsWith(`${base}/`))
|
|
89
|
+
return false;
|
|
90
|
+
const rest = ex.path.slice(base.length);
|
|
91
|
+
try {
|
|
92
|
+
if (ex.method === 'GET' && rest === '/agent.json') {
|
|
93
|
+
const identity = await connections.identity();
|
|
94
|
+
ex.send(200, { 'content-type': 'application/json', 'cache-control': 'public, max-age=300' }, JSON.stringify(identity.metadata()));
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (ex.method === 'GET' && rest === '/logo.svg') {
|
|
98
|
+
// The default `logo_uri` (when `identity.logoUri` is not set) — a Company's consent screen
|
|
99
|
+
// shows it, so it must not 404: a mark with the name's initial.
|
|
100
|
+
ex.send(200, { 'content-type': 'image/svg+xml', 'cache-control': 'public, max-age=86400' }, defaultLogoSvg(connections.identityName));
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
if (ex.method === 'GET' && rest === '/jwks.json') {
|
|
104
|
+
const identity = await connections.identity();
|
|
105
|
+
ex.send(200, { 'content-type': 'application/json', 'cache-control': 'public, max-age=300' }, JSON.stringify(identity.jwks()));
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
if (ex.method === 'GET' && rest === '/oauth/callback') {
|
|
109
|
+
const result = await connections.directCallback(ex.query);
|
|
110
|
+
if (result.ok)
|
|
111
|
+
page(ex, 200, { view: 'connected', organization: result.organization ?? '' });
|
|
112
|
+
else {
|
|
113
|
+
const id = (ex.query.get('state') ?? '').split('.')[0] ?? '';
|
|
114
|
+
page(ex, 400, {
|
|
115
|
+
view: 'failed',
|
|
116
|
+
organization: result.organization,
|
|
117
|
+
retryUrl: id ? url(`/connect/${id}`) : null,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
const match = /^\/connect\/([A-Za-z0-9_-]{16,64})(\/[a-z/]+)?$/.exec(rest);
|
|
123
|
+
if (!match)
|
|
124
|
+
return false;
|
|
125
|
+
const id = match[1];
|
|
126
|
+
const action = match[2] ?? '';
|
|
127
|
+
if (ex.method === 'GET' && action === '') {
|
|
128
|
+
await choose(ex, id);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
if (ex.method !== 'POST') {
|
|
132
|
+
ex.send(405, { allow: 'GET, POST' }, '');
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
const form = new URLSearchParams(await ex.readBody(16 * 1024));
|
|
136
|
+
if (action === '/direct') {
|
|
137
|
+
const to = await connections.directUrl(id);
|
|
138
|
+
if (to === null)
|
|
139
|
+
page(ex, 410, { view: 'expired' });
|
|
140
|
+
else
|
|
141
|
+
ex.send(303, { location: to, 'cache-control': 'no-store' }, '');
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
if (action === '/mediated' || action === '/code') {
|
|
145
|
+
const outcome = action === '/mediated'
|
|
146
|
+
? await connections.mediated(id, Object.fromEntries(form))
|
|
147
|
+
: await connections.mediatedCode(id, form.get('code') ?? '');
|
|
148
|
+
const data = await connections.page(id);
|
|
149
|
+
const organization = data.kind === 'open' || data.kind === 'connected' ? data.organization : '';
|
|
150
|
+
if (outcome.status === 'connected')
|
|
151
|
+
page(ex, 200, { view: 'connected', organization });
|
|
152
|
+
else if (outcome.status === 'code_required') {
|
|
153
|
+
page(ex, 200, {
|
|
154
|
+
view: 'code',
|
|
155
|
+
organization,
|
|
156
|
+
action: url(`/connect/${id}/code`),
|
|
157
|
+
sentTo: outcome.sentTo ?? '',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else if (outcome.status === 'expired')
|
|
161
|
+
page(ex, 410, { view: 'expired' });
|
|
162
|
+
else
|
|
163
|
+
page(ex, 400, { view: 'failed', organization, retryUrl: url(`/connect/${id}`) });
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (action === '/device' || action === '/device/check') {
|
|
167
|
+
const data = await connections.page(id);
|
|
168
|
+
if (data.kind === 'expired') {
|
|
169
|
+
page(ex, 410, { view: 'expired' });
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
const organization = data.organization;
|
|
173
|
+
if (action === '/device') {
|
|
174
|
+
const started = await connections.deviceStart(id);
|
|
175
|
+
if (started === null)
|
|
176
|
+
page(ex, 410, { view: 'expired' });
|
|
177
|
+
else
|
|
178
|
+
page(ex, 200, {
|
|
179
|
+
view: 'device',
|
|
180
|
+
organization,
|
|
181
|
+
...started,
|
|
182
|
+
checkUrl: url(`/connect/${id}/device/check`),
|
|
183
|
+
pending: false,
|
|
184
|
+
});
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
const status = await connections.deviceCheck(id);
|
|
188
|
+
if (status === 'connected')
|
|
189
|
+
page(ex, 200, { view: 'connected', organization });
|
|
190
|
+
else if (status === 'pending') {
|
|
191
|
+
const again = await connections.deviceInfo(id);
|
|
192
|
+
page(ex, 200, again === null
|
|
193
|
+
? { view: 'expired' }
|
|
194
|
+
: {
|
|
195
|
+
view: 'device',
|
|
196
|
+
organization,
|
|
197
|
+
...again,
|
|
198
|
+
checkUrl: url(`/connect/${id}/device/check`),
|
|
199
|
+
pending: true,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else if (status === 'expired')
|
|
203
|
+
page(ex, 410, { view: 'expired' });
|
|
204
|
+
else
|
|
205
|
+
page(ex, 400, { view: 'failed', organization, retryUrl: url(`/connect/${id}`) });
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
options.onError?.(error);
|
|
212
|
+
page(ex, 500, { view: 'failed', organization: null, retryUrl: null });
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/poppy-connections/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @experimental Personal Agent Protocol ("Poppy") Draft 0.1 — this app's agent acting on OTHER
|
|
3
|
+
* Poppy Companies for its users. Tracks the spec; WILL change, possibly in breaking ways.
|
|
4
|
+
*/
|
|
5
|
+
export { DEFAULT_POPPY_CONNECTIONS_TEXTS, definePoppyConnectionsConfig, normalizeDomain, type PoppyAgentKey, type PoppyCompanyPolicy, type PoppyConnectionsConfig, type PoppyConnectionsTexts, type TwoStepConvention, } from './config.js';
|
|
6
|
+
export { Sealer } from './crypto.js';
|
|
7
|
+
export { createPoppyConnectionsHandler, defaultConnectRenderer, type PoppyConnectionsExchange, type PoppyConnectRenderer, type PoppyConnectView, } from './http.js';
|
|
8
|
+
export { continueAfterConnect, resumeAfterConnect } from './resume.js';
|
|
9
|
+
export { normalizeKeys, PoppyCompanyNotAllowedError, type PoppyCompanyReply, PoppyConnections, type PoppyConnectionsOptions, type PoppyConnectionView, type PoppyConnectPageData, } from './service.js';
|
|
10
|
+
export { ensurePoppyConnectionTables, InMemoryPoppyConnectionStore, LucidPoppyConnectionStore, POPPY_CONNECTION_TABLES, type PoppyConnectionRecord, type PoppyConnectionRedisClient, type PoppyConnectionStore, type PoppyPendingConnect, poppyConnectionTableStatements, redisPoppyConnectionStore, } from './store.js';
|
|
11
|
+
export { type CallCompanyToolOptions, callCompanyTool, previewCompanyWrite, registerPoppyConnectionTools, talkToCompany, } from './tools.js';
|
|
12
|
+
/** A fresh signing key for `identity.keys` (store the JSON in an env var). */
|
|
13
|
+
export declare function generatePoppyAgentKey(): Promise<Record<string, unknown>>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,sBAAsB,EAC3B,eAAe,EACf,mBAAmB,EACnB,4BAA4B,EAC5B,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,8EAA8E;AAC9E,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAG9E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @experimental Personal Agent Protocol ("Poppy") Draft 0.1 — this app's agent acting on OTHER
|
|
3
|
+
* Poppy Companies for its users. Tracks the spec; WILL change, possibly in breaking ways.
|
|
4
|
+
*/
|
|
5
|
+
export { DEFAULT_POPPY_CONNECTIONS_TEXTS, definePoppyConnectionsConfig, normalizeDomain, } from './config.js';
|
|
6
|
+
export { Sealer } from './crypto.js';
|
|
7
|
+
export { createPoppyConnectionsHandler, defaultConnectRenderer, } from './http.js';
|
|
8
|
+
export { continueAfterConnect, resumeAfterConnect } from './resume.js';
|
|
9
|
+
export { normalizeKeys, PoppyCompanyNotAllowedError, PoppyConnections, } from './service.js';
|
|
10
|
+
export { ensurePoppyConnectionTables, InMemoryPoppyConnectionStore, LucidPoppyConnectionStore, POPPY_CONNECTION_TABLES, poppyConnectionTableStatements, redisPoppyConnectionStore, } from './store.js';
|
|
11
|
+
export { callCompanyTool, previewCompanyWrite, registerPoppyConnectionTools, talkToCompany, } from './tools.js';
|
|
12
|
+
/** A fresh signing key for `identity.keys` (store the JSON in an env var). */
|
|
13
|
+
export async function generatePoppyAgentKey() {
|
|
14
|
+
const { generateEs256Key } = await import('../poppy-client/keys.js');
|
|
15
|
+
return (await generateEs256Key()).privateJwk;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/poppy-connections/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,eAAe,GAMhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,GAIvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,aAAa,EACb,2BAA2B,EAE3B,gBAAgB,GAIjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EAKvB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,eAAe,EACf,mBAAmB,EACnB,4BAA4B,EAC5B,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,UAAqC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AgentService } from '../agent-service.js';
|
|
2
|
+
import type { ActionProposalOutcome } from '../spi/action-proposal-outcome-store.js';
|
|
3
|
+
import type { Actor } from '../types.js';
|
|
4
|
+
import type { PoppyConnections } from './service.js';
|
|
5
|
+
import type { PoppyPendingConnect } from './store.js';
|
|
6
|
+
/**
|
|
7
|
+
* A connect finished: decide the `connect` call the turn parked on, so the conversation resumes
|
|
8
|
+
* with the account connected — a scoped proposal decision under `actionApprovalMode: 'independent'`,
|
|
9
|
+
* an approval of the parked call otherwise. A call already decided (the person tapped first) is left.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resumeAfterConnect(service: Pick<AgentService, 'actionApprovalMode' | 'listActionProposals' | 'decideActionProposal' | 'approve' | 'toolCallApproval'> & Partial<Pick<AgentService, 'send'>>, pending: PoppyPendingConnect,
|
|
12
|
+
/**
|
|
13
|
+
* For a sign-in that finished after its card expired: the connection is stored all the same, and
|
|
14
|
+
* the conversation is continued with a new turn ({@link PoppyConnectionsTexts.continueAfterConnect})
|
|
15
|
+
* instead of nothing happening. Without it, an expired card is left alone.
|
|
16
|
+
*/
|
|
17
|
+
late?: {
|
|
18
|
+
connections: Pick<PoppyConnections, 'texts'>;
|
|
19
|
+
follow?: (address: unknown, run: {
|
|
20
|
+
runId: string;
|
|
21
|
+
threadId: string;
|
|
22
|
+
actor: Actor;
|
|
23
|
+
}) => Promise<unknown>;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Independent approvals: deciding the `connect` proposal runs it, and its outcome is written to the
|
|
27
|
+
* thread — but nothing asks the model to go on. Once that outcome is admitted (the
|
|
28
|
+
* action-proposal worker's `onAdmitted`), this starts the next turn on the thread, in the person's
|
|
29
|
+
* voice ({@link PoppyConnectionsTexts.continueAfterConnect}), so the model proceeds with what was
|
|
30
|
+
* asked before the sign-in. A text channel's conversation gets that turn too (`follow`).
|
|
31
|
+
*
|
|
32
|
+
* Only for a connect this app's connect page completed (its pending connect is `connected`), and
|
|
33
|
+
* only once: the outcome is admitted once.
|
|
34
|
+
*/
|
|
35
|
+
export declare function continueAfterConnect(service: Pick<AgentService, 'listActionProposals' | 'send'>, connections: Pick<PoppyConnections, 'pendingFor' | 'texts'>, outcome: ActionProposalOutcome, options?: {
|
|
36
|
+
prefix?: string;
|
|
37
|
+
/** Deliver the new run to a text channel (`channels.follow`). */
|
|
38
|
+
follow?: (address: unknown, run: {
|
|
39
|
+
runId: string;
|
|
40
|
+
threadId: string;
|
|
41
|
+
actor: Actor;
|
|
42
|
+
}) => Promise<unknown>;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
runId: string;
|
|
45
|
+
} | null>;
|
|
46
|
+
//# sourceMappingURL=resume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,IAAI,CACX,YAAY,EACV,oBAAoB,GACpB,qBAAqB,GACrB,sBAAsB,GACtB,SAAS,GACT,kBAAkB,CACrB,GACC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,EACrC,OAAO,EAAE,mBAAmB;AAC5B;;;;GAIG;AACH,IAAI,CAAC,EAAE;IACL,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KACnD,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB,GACA,OAAO,CAAC,IAAI,CAAC,CAsCf;AAiCD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,qBAAqB,GAAG,MAAM,CAAC,EAC3D,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,EAC3D,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KACnD,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoCnC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A connect finished: decide the `connect` call the turn parked on, so the conversation resumes
|
|
3
|
+
* with the account connected — a scoped proposal decision under `actionApprovalMode: 'independent'`,
|
|
4
|
+
* an approval of the parked call otherwise. A call already decided (the person tapped first) is left.
|
|
5
|
+
*/
|
|
6
|
+
export async function resumeAfterConnect(service, pending,
|
|
7
|
+
/**
|
|
8
|
+
* For a sign-in that finished after its card expired: the connection is stored all the same, and
|
|
9
|
+
* the conversation is continued with a new turn ({@link PoppyConnectionsTexts.continueAfterConnect})
|
|
10
|
+
* instead of nothing happening. Without it, an expired card is left alone.
|
|
11
|
+
*/
|
|
12
|
+
late) {
|
|
13
|
+
if (!pending.actor || !pending.threadId || !pending.toolCallId)
|
|
14
|
+
return;
|
|
15
|
+
const actor = pending.actor;
|
|
16
|
+
const threadId = pending.threadId;
|
|
17
|
+
if (service.actionApprovalMode() === 'independent') {
|
|
18
|
+
const proposals = (await service.listActionProposals(actor, threadId));
|
|
19
|
+
const mine = proposals.filter((p) => p.originToolCallId === pending.toolCallId);
|
|
20
|
+
const open = mine.find((p) => p.decision === 'pending');
|
|
21
|
+
if (open) {
|
|
22
|
+
const decided = await service
|
|
23
|
+
.decideActionProposal(actor, threadId, open.id, 'approved', {}, 'poppy-connect')
|
|
24
|
+
.then((r) => r.status !== 'expired', () => false);
|
|
25
|
+
if (decided)
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Approved already (the person tapped first) or turned down: nothing to add.
|
|
29
|
+
if (mine.some((p) => p.decision === 'approved' || p.decision === 'rejected'))
|
|
30
|
+
return;
|
|
31
|
+
// Expired (or gone) before the sign-in finished: the account is connected anyway — go on.
|
|
32
|
+
await continueLate(service, late, actor, threadId, pending, mine[0]?.executionContext);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!pending.runId)
|
|
36
|
+
return;
|
|
37
|
+
const state = await service.toolCallApproval(pending.toolCallId);
|
|
38
|
+
if (state === null || state.status === 'pending_approval') {
|
|
39
|
+
await service.approve(pending.runId, pending.toolCallId, {
|
|
40
|
+
executedByRef: actor.id,
|
|
41
|
+
via: 'poppy-connect',
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (state.status === 'expired')
|
|
46
|
+
await continueLate(service, late, actor, threadId, pending);
|
|
47
|
+
}
|
|
48
|
+
async function continueLate(service, late, actor, threadId, pending, context) {
|
|
49
|
+
if (!late || !service.send)
|
|
50
|
+
return;
|
|
51
|
+
const sent = await service.send({
|
|
52
|
+
actor,
|
|
53
|
+
threadId,
|
|
54
|
+
message: late.connections.texts.continueAfterConnect.replace(/\{company\}/g, pending.organization),
|
|
55
|
+
...(context?.agentName !== undefined ? { agentName: context.agentName } : {}),
|
|
56
|
+
...(context?.pageContext !== undefined
|
|
57
|
+
? { pageContext: context.pageContext }
|
|
58
|
+
: {}),
|
|
59
|
+
}, { textDecisions: false });
|
|
60
|
+
const runId = sent.runId;
|
|
61
|
+
const address = context?.pageContext?.channel;
|
|
62
|
+
if (runId !== undefined && late.follow && address !== null && typeof address === 'object') {
|
|
63
|
+
await late.follow(address, { runId, threadId, actor });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Independent approvals: deciding the `connect` proposal runs it, and its outcome is written to the
|
|
68
|
+
* thread — but nothing asks the model to go on. Once that outcome is admitted (the
|
|
69
|
+
* action-proposal worker's `onAdmitted`), this starts the next turn on the thread, in the person's
|
|
70
|
+
* voice ({@link PoppyConnectionsTexts.continueAfterConnect}), so the model proceeds with what was
|
|
71
|
+
* asked before the sign-in. A text channel's conversation gets that turn too (`follow`).
|
|
72
|
+
*
|
|
73
|
+
* Only for a connect this app's connect page completed (its pending connect is `connected`), and
|
|
74
|
+
* only once: the outcome is admitted once.
|
|
75
|
+
*/
|
|
76
|
+
export async function continueAfterConnect(service, connections, outcome, options = {}) {
|
|
77
|
+
if (outcome.toolName !== `${options.prefix ?? 'poppy_'}connect`)
|
|
78
|
+
return null;
|
|
79
|
+
if (outcome.executionStatus !== 'succeeded' || outcome.decision !== 'approved')
|
|
80
|
+
return null;
|
|
81
|
+
const result = outcome.result;
|
|
82
|
+
if (result?.connected !== true)
|
|
83
|
+
return null;
|
|
84
|
+
const pending = await connections.pendingFor(outcome.originRunId, outcome.originToolCallId);
|
|
85
|
+
if (pending === null || pending.status !== 'connected' || pending.actor === null)
|
|
86
|
+
return null;
|
|
87
|
+
const actor = pending.actor;
|
|
88
|
+
const proposal = (await service.listActionProposals(actor, outcome.threadId)).find((p) => p.id === outcome.proposalId);
|
|
89
|
+
const context = proposal?.executionContext;
|
|
90
|
+
const company = typeof result.organization === 'string' ? result.organization : pending.organization;
|
|
91
|
+
const sent = await service.send({
|
|
92
|
+
actor,
|
|
93
|
+
threadId: outcome.threadId,
|
|
94
|
+
message: connections.texts.continueAfterConnect.replace(/\{company\}/g, company),
|
|
95
|
+
...(context?.agentName !== undefined ? { agentName: context.agentName } : {}),
|
|
96
|
+
...(context?.pageContext !== undefined
|
|
97
|
+
? { pageContext: context.pageContext }
|
|
98
|
+
: {}),
|
|
99
|
+
}, { textDecisions: false });
|
|
100
|
+
const runId = sent.runId;
|
|
101
|
+
if (runId === undefined)
|
|
102
|
+
return null;
|
|
103
|
+
const address = context?.pageContext?.channel;
|
|
104
|
+
if (options.follow && address !== null && typeof address === 'object') {
|
|
105
|
+
await options.follow(address, { runId, threadId: outcome.threadId, actor });
|
|
106
|
+
}
|
|
107
|
+
return { runId };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/poppy-connections/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
|
+
export declare function setPoppyConnectionsHandler(handler: ((ctx: HttpContext) => Promise<boolean>) | null): void;
|
|
3
|
+
export declare function getPoppyConnectionsHandler(): ((ctx: HttpContext) => Promise<boolean>) | null;
|
|
4
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,QAGzD;AAED,wBAAgB,0BAA0B,WARtB,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,SAUnD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Set by the provider at boot; read by the server middleware per request (`false` = not ours). */
|
|
2
|
+
let current = null;
|
|
3
|
+
export function setPoppyConnectionsHandler(handler) {
|
|
4
|
+
current = handler;
|
|
5
|
+
}
|
|
6
|
+
export function getPoppyConnectionsHandler() {
|
|
7
|
+
return current;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/poppy-connections/runtime.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,IAAI,OAAO,GAAoD,IAAI,CAAC;AAEpE,MAAM,UAAU,0BAA0B,CACxC,OAAwD;IAExD,OAAO,GAAG,OAAO,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
|
+
import type { NextFn } from '@adonisjs/core/types/http';
|
|
3
|
+
/**
|
|
4
|
+
* Serves the agent identity, the connect pages and the sign-in callback ahead of the router — no
|
|
5
|
+
* session, CSRF or bodyparser: the connect id in the URL is the capability.
|
|
6
|
+
*/
|
|
7
|
+
export default class PoppyConnectionsServerMiddleware {
|
|
8
|
+
handle(ctx: HttpContext, next: NextFn): Promise<any>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=server_middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server_middleware.d.ts","sourceRoot":"","sources":["../../../src/poppy-connections/server_middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGxD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,gCAAgC;IAC7C,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAI1C;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getPoppyConnectionsHandler } from './runtime.js';
|
|
2
|
+
/**
|
|
3
|
+
* Serves the agent identity, the connect pages and the sign-in callback ahead of the router — no
|
|
4
|
+
* session, CSRF or bodyparser: the connect id in the URL is the capability.
|
|
5
|
+
*/
|
|
6
|
+
export default class PoppyConnectionsServerMiddleware {
|
|
7
|
+
async handle(ctx, next) {
|
|
8
|
+
const handler = getPoppyConnectionsHandler();
|
|
9
|
+
if (handler !== null && (await handler(ctx)))
|
|
10
|
+
return;
|
|
11
|
+
return next();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=server_middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server_middleware.js","sourceRoot":"","sources":["../../../src/poppy-connections/server_middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,gCAAgC;IACnD,KAAK,CAAC,MAAM,CAAC,GAAgB,EAAE,IAAY;QACzC,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO;QACrD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;CACF"}
|