@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.
Files changed (287) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/providers/agent_provider.d.ts.map +1 -1
  3. package/dist/providers/agent_provider.js +9 -0
  4. package/dist/providers/agent_provider.js.map +1 -1
  5. package/dist/providers/mcp_provider.d.ts.map +1 -1
  6. package/dist/providers/mcp_provider.js +46 -10
  7. package/dist/providers/mcp_provider.js.map +1 -1
  8. package/dist/providers/poppy_connections_provider.d.ts +17 -0
  9. package/dist/providers/poppy_connections_provider.d.ts.map +1 -0
  10. package/dist/providers/poppy_connections_provider.js +186 -0
  11. package/dist/providers/poppy_connections_provider.js.map +1 -0
  12. package/dist/providers/poppy_provider.d.ts +12 -0
  13. package/dist/providers/poppy_provider.d.ts.map +1 -0
  14. package/dist/providers/poppy_provider.js +159 -0
  15. package/dist/providers/poppy_provider.js.map +1 -0
  16. package/dist/src/a2a/handler.d.ts.map +1 -1
  17. package/dist/src/a2a/handler.js +4 -2
  18. package/dist/src/a2a/handler.js.map +1 -1
  19. package/dist/src/a2a/turn.d.ts +27 -4
  20. package/dist/src/a2a/turn.d.ts.map +1 -1
  21. package/dist/src/a2a/turn.js +66 -12
  22. package/dist/src/a2a/turn.js.map +1 -1
  23. package/dist/src/action-proposal-approval.d.ts.map +1 -1
  24. package/dist/src/action-proposal-approval.js +3 -3
  25. package/dist/src/action-proposal-approval.js.map +1 -1
  26. package/dist/src/action-proposal-listeners.d.ts +12 -0
  27. package/dist/src/action-proposal-listeners.d.ts.map +1 -0
  28. package/dist/src/action-proposal-listeners.js +27 -0
  29. package/dist/src/action-proposal-listeners.js.map +1 -0
  30. package/dist/src/action-proposal-receipt.d.ts +4 -0
  31. package/dist/src/action-proposal-receipt.d.ts.map +1 -1
  32. package/dist/src/action-proposal-receipt.js +3 -1
  33. package/dist/src/action-proposal-receipt.js.map +1 -1
  34. package/dist/src/action-proposal-worker.d.ts +6 -1
  35. package/dist/src/action-proposal-worker.d.ts.map +1 -1
  36. package/dist/src/action-proposal-worker.js +10 -1
  37. package/dist/src/action-proposal-worker.js.map +1 -1
  38. package/dist/src/agent-loop.d.ts.map +1 -1
  39. package/dist/src/agent-loop.js +8 -5
  40. package/dist/src/agent-loop.js.map +1 -1
  41. package/dist/src/channels/handler.d.ts +10 -0
  42. package/dist/src/channels/handler.d.ts.map +1 -1
  43. package/dist/src/channels/handler.js +44 -1
  44. package/dist/src/channels/handler.js.map +1 -1
  45. package/dist/src/channels/texts.d.ts +9 -0
  46. package/dist/src/channels/texts.d.ts.map +1 -1
  47. package/dist/src/channels/texts.js +4 -0
  48. package/dist/src/channels/texts.js.map +1 -1
  49. package/dist/src/client/sse.d.ts.map +1 -1
  50. package/dist/src/client/sse.js +3 -0
  51. package/dist/src/client/sse.js.map +1 -1
  52. package/dist/src/define_config.d.ts +3 -0
  53. package/dist/src/define_config.d.ts.map +1 -1
  54. package/dist/src/define_config.js.map +1 -1
  55. package/dist/src/genui/kit/styles.d.ts.map +1 -1
  56. package/dist/src/genui/kit/styles.js +11 -2
  57. package/dist/src/genui/kit/styles.js.map +1 -1
  58. package/dist/src/genui/sandbox-styles.js +1 -1
  59. package/dist/src/genui/sandbox-styles.js.map +1 -1
  60. package/dist/src/genui/sandbox-theme.d.ts +6 -1
  61. package/dist/src/genui/sandbox-theme.d.ts.map +1 -1
  62. package/dist/src/genui/sandbox-theme.js +9 -5
  63. package/dist/src/genui/sandbox-theme.js.map +1 -1
  64. package/dist/src/genui/sandbox.d.ts.map +1 -1
  65. package/dist/src/genui/sandbox.js +1 -0
  66. package/dist/src/genui/sandbox.js.map +1 -1
  67. package/dist/src/index.d.ts +2 -1
  68. package/dist/src/index.d.ts.map +1 -1
  69. package/dist/src/index.js +2 -1
  70. package/dist/src/index.js.map +1 -1
  71. package/dist/src/mcp/auth.d.ts +17 -0
  72. package/dist/src/mcp/auth.d.ts.map +1 -1
  73. package/dist/src/mcp/auth.js +56 -1
  74. package/dist/src/mcp/auth.js.map +1 -1
  75. package/dist/src/mcp/discovery.d.ts +13 -2
  76. package/dist/src/mcp/discovery.d.ts.map +1 -1
  77. package/dist/src/mcp/discovery.js +17 -2
  78. package/dist/src/mcp/discovery.js.map +1 -1
  79. package/dist/src/mcp/index.d.ts +1 -1
  80. package/dist/src/mcp/index.d.ts.map +1 -1
  81. package/dist/src/mcp/index.js.map +1 -1
  82. package/dist/src/mcp/scope.d.ts +13 -0
  83. package/dist/src/mcp/scope.d.ts.map +1 -0
  84. package/dist/src/mcp/scope.js +24 -0
  85. package/dist/src/mcp/scope.js.map +1 -0
  86. package/dist/src/mcp/server.d.ts +6 -1
  87. package/dist/src/mcp/server.d.ts.map +1 -1
  88. package/dist/src/mcp/server.js +1 -1
  89. package/dist/src/mcp/server.js.map +1 -1
  90. package/dist/src/poppy/auth.d.ts +77 -0
  91. package/dist/src/poppy/auth.d.ts.map +1 -0
  92. package/dist/src/poppy/auth.js +16 -0
  93. package/dist/src/poppy/auth.js.map +1 -0
  94. package/dist/src/poppy/conversations.d.ts +249 -0
  95. package/dist/src/poppy/conversations.d.ts.map +1 -0
  96. package/dist/src/poppy/conversations.js +1017 -0
  97. package/dist/src/poppy/conversations.js.map +1 -0
  98. package/dist/src/poppy/define_config.d.ts +98 -0
  99. package/dist/src/poppy/define_config.d.ts.map +1 -0
  100. package/dist/src/poppy/define_config.js +11 -0
  101. package/dist/src/poppy/define_config.js.map +1 -0
  102. package/dist/src/poppy/endpoints.d.ts +25 -0
  103. package/dist/src/poppy/endpoints.d.ts.map +1 -0
  104. package/dist/src/poppy/endpoints.js +31 -0
  105. package/dist/src/poppy/endpoints.js.map +1 -0
  106. package/dist/src/poppy/handler.d.ts +80 -0
  107. package/dist/src/poppy/handler.d.ts.map +1 -0
  108. package/dist/src/poppy/handler.js +362 -0
  109. package/dist/src/poppy/handler.js.map +1 -0
  110. package/dist/src/poppy/index.d.ts +17 -0
  111. package/dist/src/poppy/index.d.ts.map +1 -0
  112. package/dist/src/poppy/index.js +9 -0
  113. package/dist/src/poppy/index.js.map +1 -0
  114. package/dist/src/poppy/protocol.d.ts +132 -0
  115. package/dist/src/poppy/protocol.d.ts.map +1 -0
  116. package/dist/src/poppy/protocol.js +178 -0
  117. package/dist/src/poppy/protocol.js.map +1 -0
  118. package/dist/src/poppy/redis-store.d.ts +27 -0
  119. package/dist/src/poppy/redis-store.d.ts.map +1 -0
  120. package/dist/src/poppy/redis-store.js +148 -0
  121. package/dist/src/poppy/redis-store.js.map +1 -0
  122. package/dist/src/poppy/runtime.d.ts +6 -0
  123. package/dist/src/poppy/runtime.d.ts.map +1 -0
  124. package/dist/src/poppy/runtime.js +12 -0
  125. package/dist/src/poppy/runtime.js.map +1 -0
  126. package/dist/src/poppy/server_middleware.d.ts +11 -0
  127. package/dist/src/poppy/server_middleware.d.ts.map +1 -0
  128. package/dist/src/poppy/server_middleware.js +16 -0
  129. package/dist/src/poppy/server_middleware.js.map +1 -0
  130. package/dist/src/poppy/store.d.ts +207 -0
  131. package/dist/src/poppy/store.d.ts.map +1 -0
  132. package/dist/src/poppy/store.js +444 -0
  133. package/dist/src/poppy/store.js.map +1 -0
  134. package/dist/src/poppy-client/api.d.ts +36 -0
  135. package/dist/src/poppy-client/api.d.ts.map +1 -0
  136. package/dist/src/poppy-client/api.js +77 -0
  137. package/dist/src/poppy-client/api.js.map +1 -0
  138. package/dist/src/poppy-client/bin/poppy-agent.d.ts +3 -0
  139. package/dist/src/poppy-client/bin/poppy-agent.d.ts.map +1 -0
  140. package/dist/src/poppy-client/bin/poppy-agent.js +9 -0
  141. package/dist/src/poppy-client/bin/poppy-agent.js.map +1 -0
  142. package/dist/src/poppy-client/browser.d.ts +24 -0
  143. package/dist/src/poppy-client/browser.d.ts.map +1 -0
  144. package/dist/src/poppy-client/browser.js +83 -0
  145. package/dist/src/poppy-client/browser.js.map +1 -0
  146. package/dist/src/poppy-client/cli/main.d.ts +2 -0
  147. package/dist/src/poppy-client/cli/main.d.ts.map +1 -0
  148. package/dist/src/poppy-client/cli/main.js +776 -0
  149. package/dist/src/poppy-client/cli/main.js.map +1 -0
  150. package/dist/src/poppy-client/cli/prompt.d.ts +13 -0
  151. package/dist/src/poppy-client/cli/prompt.d.ts.map +1 -0
  152. package/dist/src/poppy-client/cli/prompt.js +50 -0
  153. package/dist/src/poppy-client/cli/prompt.js.map +1 -0
  154. package/dist/src/poppy-client/company.d.ts +87 -0
  155. package/dist/src/poppy-client/company.d.ts.map +1 -0
  156. package/dist/src/poppy-client/company.js +336 -0
  157. package/dist/src/poppy-client/company.js.map +1 -0
  158. package/dist/src/poppy-client/conversations.d.ts +89 -0
  159. package/dist/src/poppy-client/conversations.d.ts.map +1 -0
  160. package/dist/src/poppy-client/conversations.js +332 -0
  161. package/dist/src/poppy-client/conversations.js.map +1 -0
  162. package/dist/src/poppy-client/discovery.d.ts +41 -0
  163. package/dist/src/poppy-client/discovery.d.ts.map +1 -0
  164. package/dist/src/poppy-client/discovery.js +217 -0
  165. package/dist/src/poppy-client/discovery.js.map +1 -0
  166. package/dist/src/poppy-client/dpop.d.ts +19 -0
  167. package/dist/src/poppy-client/dpop.d.ts.map +1 -0
  168. package/dist/src/poppy-client/dpop.js +43 -0
  169. package/dist/src/poppy-client/dpop.js.map +1 -0
  170. package/dist/src/poppy-client/errors.d.ts +50 -0
  171. package/dist/src/poppy-client/errors.d.ts.map +1 -0
  172. package/dist/src/poppy-client/errors.js +55 -0
  173. package/dist/src/poppy-client/errors.js.map +1 -0
  174. package/dist/src/poppy-client/http.d.ts +40 -0
  175. package/dist/src/poppy-client/http.d.ts.map +1 -0
  176. package/dist/src/poppy-client/http.js +95 -0
  177. package/dist/src/poppy-client/http.js.map +1 -0
  178. package/dist/src/poppy-client/identity.d.ts +61 -0
  179. package/dist/src/poppy-client/identity.d.ts.map +1 -0
  180. package/dist/src/poppy-client/identity.js +111 -0
  181. package/dist/src/poppy-client/identity.js.map +1 -0
  182. package/dist/src/poppy-client/identity_server.d.ts +29 -0
  183. package/dist/src/poppy-client/identity_server.d.ts.map +1 -0
  184. package/dist/src/poppy-client/identity_server.js +84 -0
  185. package/dist/src/poppy-client/identity_server.js.map +1 -0
  186. package/dist/src/poppy-client/index.d.ts +19 -0
  187. package/dist/src/poppy-client/index.d.ts.map +1 -0
  188. package/dist/src/poppy-client/index.js +18 -0
  189. package/dist/src/poppy-client/index.js.map +1 -0
  190. package/dist/src/poppy-client/keys.d.ts +13 -0
  191. package/dist/src/poppy-client/keys.d.ts.map +1 -0
  192. package/dist/src/poppy-client/keys.js +31 -0
  193. package/dist/src/poppy-client/keys.js.map +1 -0
  194. package/dist/src/poppy-client/llm.d.ts +31 -0
  195. package/dist/src/poppy-client/llm.d.ts.map +1 -0
  196. package/dist/src/poppy-client/llm.js +230 -0
  197. package/dist/src/poppy-client/llm.js.map +1 -0
  198. package/dist/src/poppy-client/mcp.d.ts +16 -0
  199. package/dist/src/poppy-client/mcp.d.ts.map +1 -0
  200. package/dist/src/poppy-client/mcp.js +57 -0
  201. package/dist/src/poppy-client/mcp.js.map +1 -0
  202. package/dist/src/poppy-client/open_url.d.ts +3 -0
  203. package/dist/src/poppy-client/open_url.d.ts.map +1 -0
  204. package/dist/src/poppy-client/open_url.js +13 -0
  205. package/dist/src/poppy-client/open_url.js.map +1 -0
  206. package/dist/src/poppy-client/signin.d.ts +59 -0
  207. package/dist/src/poppy-client/signin.d.ts.map +1 -0
  208. package/dist/src/poppy-client/signin.js +210 -0
  209. package/dist/src/poppy-client/signin.js.map +1 -0
  210. package/dist/src/poppy-client/sse.d.ts +15 -0
  211. package/dist/src/poppy-client/sse.d.ts.map +1 -0
  212. package/dist/src/poppy-client/sse.js +74 -0
  213. package/dist/src/poppy-client/sse.js.map +1 -0
  214. package/dist/src/poppy-client/store.d.ts +89 -0
  215. package/dist/src/poppy-client/store.d.ts.map +1 -0
  216. package/dist/src/poppy-client/store.js +79 -0
  217. package/dist/src/poppy-client/store.js.map +1 -0
  218. package/dist/src/poppy-client/token_client.d.ts +69 -0
  219. package/dist/src/poppy-client/token_client.d.ts.map +1 -0
  220. package/dist/src/poppy-client/token_client.js +154 -0
  221. package/dist/src/poppy-client/token_client.js.map +1 -0
  222. package/dist/src/poppy-client/types.d.ts +184 -0
  223. package/dist/src/poppy-client/types.d.ts.map +1 -0
  224. package/dist/src/poppy-client/types.js +8 -0
  225. package/dist/src/poppy-client/types.js.map +1 -0
  226. package/dist/src/poppy-client/util.d.ts +42 -0
  227. package/dist/src/poppy-client/util.d.ts.map +1 -0
  228. package/dist/src/poppy-client/util.js +122 -0
  229. package/dist/src/poppy-client/util.js.map +1 -0
  230. package/dist/src/poppy-connections/config.d.ts +134 -0
  231. package/dist/src/poppy-connections/config.d.ts.map +1 -0
  232. package/dist/src/poppy-connections/config.js +44 -0
  233. package/dist/src/poppy-connections/config.js.map +1 -0
  234. package/dist/src/poppy-connections/crypto.d.ts +12 -0
  235. package/dist/src/poppy-connections/crypto.d.ts.map +1 -0
  236. package/dist/src/poppy-connections/crypto.js +36 -0
  237. package/dist/src/poppy-connections/crypto.js.map +1 -0
  238. package/dist/src/poppy-connections/http.d.ts +63 -0
  239. package/dist/src/poppy-connections/http.d.ts.map +1 -0
  240. package/dist/src/poppy-connections/http.js +217 -0
  241. package/dist/src/poppy-connections/http.js.map +1 -0
  242. package/dist/src/poppy-connections/index.d.ts +14 -0
  243. package/dist/src/poppy-connections/index.d.ts.map +1 -0
  244. package/dist/src/poppy-connections/index.js +17 -0
  245. package/dist/src/poppy-connections/index.js.map +1 -0
  246. package/dist/src/poppy-connections/resume.d.ts +46 -0
  247. package/dist/src/poppy-connections/resume.d.ts.map +1 -0
  248. package/dist/src/poppy-connections/resume.js +109 -0
  249. package/dist/src/poppy-connections/resume.js.map +1 -0
  250. package/dist/src/poppy-connections/runtime.d.ts +4 -0
  251. package/dist/src/poppy-connections/runtime.d.ts.map +1 -0
  252. package/dist/src/poppy-connections/runtime.js +9 -0
  253. package/dist/src/poppy-connections/runtime.js.map +1 -0
  254. package/dist/src/poppy-connections/server_middleware.d.ts +10 -0
  255. package/dist/src/poppy-connections/server_middleware.d.ts.map +1 -0
  256. package/dist/src/poppy-connections/server_middleware.js +14 -0
  257. package/dist/src/poppy-connections/server_middleware.js.map +1 -0
  258. package/dist/src/poppy-connections/service.d.ts +179 -0
  259. package/dist/src/poppy-connections/service.d.ts.map +1 -0
  260. package/dist/src/poppy-connections/service.js +648 -0
  261. package/dist/src/poppy-connections/service.js.map +1 -0
  262. package/dist/src/poppy-connections/store.d.ts +139 -0
  263. package/dist/src/poppy-connections/store.d.ts.map +1 -0
  264. package/dist/src/poppy-connections/store.js +260 -0
  265. package/dist/src/poppy-connections/store.js.map +1 -0
  266. package/dist/src/poppy-connections/tools.d.ts +65 -0
  267. package/dist/src/poppy-connections/tools.d.ts.map +1 -0
  268. package/dist/src/poppy-connections/tools.js +574 -0
  269. package/dist/src/poppy-connections/tools.js.map +1 -0
  270. package/dist/src/react/core/approvals/use-action-proposals.d.ts +6 -1
  271. package/dist/src/react/core/approvals/use-action-proposals.d.ts.map +1 -1
  272. package/dist/src/react/core/approvals/use-action-proposals.js +18 -3
  273. package/dist/src/react/core/approvals/use-action-proposals.js.map +1 -1
  274. package/dist/src/react/core/use-agent-chat.d.ts +6 -0
  275. package/dist/src/react/core/use-agent-chat.d.ts.map +1 -1
  276. package/dist/src/react/core/use-agent-chat.js +47 -1
  277. package/dist/src/react/core/use-agent-chat.js.map +1 -1
  278. package/dist/src/tool-presentation.d.ts +6 -0
  279. package/dist/src/tool-presentation.d.ts.map +1 -1
  280. package/dist/src/tool-presentation.js +1 -0
  281. package/dist/src/tool-presentation.js.map +1 -1
  282. package/dist/src/types.d.ts +6 -0
  283. package/dist/src/types.d.ts.map +1 -1
  284. package/package.json +41 -2
  285. package/skills/agent-governance/SKILL.md +13 -2
  286. package/skills/agent-personas-agents/SKILL.md +1 -1
  287. package/skills/agent-tools/SKILL.md +20 -3
@@ -0,0 +1,178 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ /**
3
+ * The wire format of Personal Agent Protocol ("Poppy", Draft 0.1, §7) conversations: messages,
4
+ * events, statuses and the error codes of §7.13. Hand-rolled like the A2A surface — the rules are
5
+ * few and exact, and unknown fields are ignored everywhere (§3.1, §3.3).
6
+ *
7
+ * @experimental Tracks Personal Agent Protocol Draft 0.1 (https://personalagentprotocol.org/docs/spec),
8
+ * a spec still in development: this API WILL change as the spec evolves — possibly in breaking
9
+ * ways, outside semver majors while it is a draft.
10
+ */
11
+ /** The `protocol_version` this surface implements. */
12
+ export const POPPY_PROTOCOL_VERSION = '0.1';
13
+ /** The `type` of this surface's entry in `poppy.json` `agent.protocols` (§7.1). */
14
+ export const POPPY_PROTOCOL_TYPE = 'poppy';
15
+ /** The account scopes the protocol defines (§4.4). Companies may add their own. */
16
+ export const POPPY_READ_SCOPE = 'poppy:read';
17
+ export const POPPY_WRITE_SCOPE = 'poppy:write';
18
+ /** The conversation errors of §7.13, plus the request errors this surface answers. */
19
+ const ERRORS = {
20
+ conversation_not_found: 404,
21
+ conversation_closed: 409,
22
+ direct_conversation_open: 409,
23
+ message_id_conflict: 409,
24
+ invalid_cursor: 400,
25
+ cursor_expired: 410,
26
+ invalid_request: 400,
27
+ /** §3.3 — a request handled only with an extension the Personal Agent does not list. */
28
+ extension_required: 403,
29
+ sign_in_required: 403,
30
+ not_found: 404,
31
+ method_not_allowed: 405,
32
+ request_too_large: 413,
33
+ not_implemented: 501,
34
+ server_error: 500,
35
+ };
36
+ /**
37
+ * A Poppy error, answered as `{ "error": code, … }` like an OAuth error response (§7.13). `extra`
38
+ * carries what a code adds — `conversation_id` for `direct_conversation_open`, `extension` for
39
+ * `extension_required`. An app hook may throw one to refuse a request.
40
+ */
41
+ export class PoppyError extends Error {
42
+ code;
43
+ extra;
44
+ constructor(code, description, extra = {}) {
45
+ super(description ?? code);
46
+ this.code = code;
47
+ this.extra = extra;
48
+ this.name = 'PoppyError';
49
+ }
50
+ get status() {
51
+ return ERRORS[this.code];
52
+ }
53
+ toJSON() {
54
+ return {
55
+ error: this.code,
56
+ ...(this.message !== this.code ? { error_description: this.message } : {}),
57
+ ...this.extra,
58
+ };
59
+ }
60
+ }
61
+ /** IDs are 1–256 characters of the URL-safe base64 alphabet (§7.2). */
62
+ const ID_PATTERN = /^[A-Za-z0-9_-]{1,256}$/;
63
+ export function isPoppyId(value) {
64
+ return typeof value === 'string' && ID_PATTERN.test(value);
65
+ }
66
+ /** A new id of `kind` — `cnv_…`, `msg_…`, `evt_…`. */
67
+ export function newPoppyId(prefix) {
68
+ return `${prefix}_${randomBytes(12).toString('base64url')}`;
69
+ }
70
+ /** A stable id derived from `seed` — what lets a re-read turn produce the same company message. */
71
+ export function derivedPoppyId(prefix, seed) {
72
+ return `${prefix}_${createHash('sha256').update(seed).digest('base64url').slice(0, 22)}`;
73
+ }
74
+ function isRecord(value) {
75
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
76
+ }
77
+ /**
78
+ * Parse a message request (§7.3, §7.4). Unknown fields — on the body, the message or its context —
79
+ * are ignored, never refused (§3.3). Only the fields the protocol defines are kept.
80
+ */
81
+ export function parseSendBody(raw, opts) {
82
+ let body;
83
+ try {
84
+ body = raw.trim() === '' ? undefined : JSON.parse(raw);
85
+ }
86
+ catch {
87
+ throw new PoppyError('invalid_request', 'The request body is not valid JSON');
88
+ }
89
+ if (!isRecord(body) || !isRecord(body.message)) {
90
+ throw new PoppyError('invalid_request', 'message is required');
91
+ }
92
+ const message = body.message;
93
+ if (!isPoppyId(message.id)) {
94
+ throw new PoppyError('invalid_request', 'message.id must be 1-256 URL-safe base64 characters');
95
+ }
96
+ if (message.sender !== 'agent' && message.sender !== 'human') {
97
+ throw new PoppyError('invalid_request', 'message.sender must be "agent" or "human"');
98
+ }
99
+ if (message.text !== undefined && typeof message.text !== 'string') {
100
+ throw new PoppyError('invalid_request', 'message.text must be a string');
101
+ }
102
+ if (message.data !== undefined && !isRecord(message.data)) {
103
+ throw new PoppyError('invalid_request', 'message.data must be a JSON object');
104
+ }
105
+ if (message.context !== undefined && !isRecord(message.context)) {
106
+ throw new PoppyError('invalid_request', 'message.context must be a JSON object');
107
+ }
108
+ if (message.text === undefined && message.data === undefined && message.context === undefined) {
109
+ throw new PoppyError('invalid_request', 'A message needs text, data or context');
110
+ }
111
+ const context = message.context;
112
+ if (context !== undefined) {
113
+ if (context.locale !== undefined && typeof context.locale !== 'string') {
114
+ throw new PoppyError('invalid_request', 'context.locale must be a string');
115
+ }
116
+ if (context.time_zone !== undefined && typeof context.time_zone !== 'string') {
117
+ throw new PoppyError('invalid_request', 'context.time_zone must be a string');
118
+ }
119
+ if (context.user_available !== undefined && typeof context.user_available !== 'boolean') {
120
+ throw new PoppyError('invalid_request', 'context.user_available must be a boolean');
121
+ }
122
+ }
123
+ let parentConversationId;
124
+ if (opts.allowParent && body.parent_conversation_id !== undefined) {
125
+ if (!isPoppyId(body.parent_conversation_id)) {
126
+ throw new PoppyError('conversation_not_found', 'Unknown parent_conversation_id');
127
+ }
128
+ parentConversationId = body.parent_conversation_id;
129
+ }
130
+ return {
131
+ message: {
132
+ id: message.id,
133
+ sender: message.sender,
134
+ ...(message.text !== undefined ? { text: message.text } : {}),
135
+ ...(message.data !== undefined ? { data: message.data } : {}),
136
+ ...(context !== undefined ? { context: { ...context } } : {}),
137
+ },
138
+ ...(parentConversationId !== undefined ? { parentConversationId } : {}),
139
+ };
140
+ }
141
+ /** Stable JSON: object keys sorted, so equal content hashes equally whatever its key order. */
142
+ function canonical(value) {
143
+ if (Array.isArray(value))
144
+ return `[${value.map(canonical).join(',')}]`;
145
+ if (isRecord(value)) {
146
+ return `{${Object.keys(value)
147
+ .sort()
148
+ .filter((key) => value[key] !== undefined)
149
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
150
+ .join(',')}}`;
151
+ }
152
+ return JSON.stringify(value) ?? 'null';
153
+ }
154
+ /**
155
+ * The fingerprint a retry is compared by (§7.3): the message's content and, for a first message,
156
+ * the conversation it was addressed to. Unknown fields were dropped by the parser, so a retry that
157
+ * adds one is still the same message.
158
+ */
159
+ export function messageFingerprint(target, body) {
160
+ return createHash('sha256')
161
+ .update(canonical({ target, parent: body.parentConversationId ?? null, ...body.message }))
162
+ .digest('base64url');
163
+ }
164
+ /**
165
+ * A request body that must be an empty JSON object (handoff, close) — anything else is tolerated:
166
+ * extensions may add fields (§3.3). Only malformed JSON is refused.
167
+ */
168
+ export function parseEmptyBody(raw) {
169
+ if (raw.trim() === '')
170
+ return;
171
+ try {
172
+ JSON.parse(raw);
173
+ }
174
+ catch {
175
+ throw new PoppyError('invalid_request', 'The request body is not valid JSON');
176
+ }
177
+ }
178
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/poppy/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type PoppyStore } from './store.js';
2
+ /**
3
+ * The slice of a Redis client {@link redisPoppyStore} uses — an `@adonisjs/redis` connection
4
+ * (ioredis) has it: `redisPoppyStore(redis.connection('main'))`.
5
+ */
6
+ export interface PoppyRedisClient {
7
+ get(key: string): Promise<string | null>;
8
+ mget(...keys: string[]): Promise<(string | null)[]>;
9
+ set(key: string, value: string, ...args: (string | number)[]): Promise<unknown>;
10
+ del(...keys: string[]): Promise<unknown>;
11
+ incr(key: string): Promise<number>;
12
+ }
13
+ export interface RedisPoppyStoreOptions {
14
+ /** Key prefix. Default `'agent:poppy:'`. */
15
+ prefix?: string;
16
+ }
17
+ /**
18
+ * A {@link PoppyStore} shared by every replica, over Redis. Positions come from `INCR`, so two
19
+ * appends never share one; a message claim, an event key and the reader lease are `SET … NX`.
20
+ * Conversations are JSON values; events one key each (`…:evt:<conversation>:<seq>`).
21
+ *
22
+ * @experimental Tracks Personal Agent Protocol Draft 0.1 (https://personalagentprotocol.org/docs/spec),
23
+ * a spec still in development: this API WILL change as the spec evolves — possibly in breaking
24
+ * ways, outside semver majors while it is a draft.
25
+ */
26
+ export declare function redisPoppyStore(redis: PoppyRedisClient, options?: RedisPoppyStoreOptions): PoppyStore;
27
+ //# sourceMappingURL=redis-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-store.d.ts","sourceRoot":"","sources":["../../../src/poppy/redis-store.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,sBAA2B,GACnC,UAAU,CA8IZ"}
@@ -0,0 +1,148 @@
1
+ import { newEventId, } from './store.js';
2
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
3
+ /**
4
+ * A {@link PoppyStore} shared by every replica, over Redis. Positions come from `INCR`, so two
5
+ * appends never share one; a message claim, an event key and the reader lease are `SET … NX`.
6
+ * Conversations are JSON values; events one key each (`…:evt:<conversation>:<seq>`).
7
+ *
8
+ * @experimental Tracks Personal Agent Protocol Draft 0.1 (https://personalagentprotocol.org/docs/spec),
9
+ * a spec still in development: this API WILL change as the spec evolves — possibly in breaking
10
+ * ways, outside semver majors while it is a draft.
11
+ */
12
+ export function redisPoppyStore(redis, options = {}) {
13
+ const p = options.prefix ?? 'agent:poppy:';
14
+ const k = {
15
+ conversation: (id) => `${p}cnv:${id}`,
16
+ seq: (id) => `${p}seq:${id}`,
17
+ event: (id, seq) => `${p}evt:${id}:${seq}`,
18
+ eventId: (id, eventId) => `${p}evtid:${id}:${eventId}`,
19
+ eventKey: (id, key) => `${p}evtkey:${id}:${key}`,
20
+ message: (owner, messageId) => `${p}msg:${owner}:${messageId}`,
21
+ lease: (id) => `${p}lease:${id}`,
22
+ };
23
+ const getConversation = async (id) => {
24
+ const raw = await redis.get(k.conversation(id));
25
+ return raw === null ? null : JSON.parse(raw);
26
+ };
27
+ const lastSeq = async (id) => Number.parseInt((await redis.get(k.seq(id))) ?? '0', 10) || 0;
28
+ return {
29
+ async createConversation(record) {
30
+ await redis.set(k.conversation(record.id), JSON.stringify(record));
31
+ },
32
+ getConversation,
33
+ async updateConversation(id, patch) {
34
+ const current = await getConversation(id);
35
+ if (!current)
36
+ return;
37
+ await redis.set(k.conversation(id), JSON.stringify({ ...current, ...patch, updatedAt: Date.now() }));
38
+ },
39
+ async appendEvent(conversationId, body, opts = {}) {
40
+ if (opts.key !== undefined) {
41
+ const keyKey = k.eventKey(conversationId, opts.key);
42
+ if ((await redis.set(keyKey, 'pending', 'NX')) === null) {
43
+ // Taken: answer the event it points at (once its writer has numbered it).
44
+ for (let i = 0; i < 100; i++) {
45
+ const seq = Number.parseInt((await redis.get(keyKey)) ?? '', 10);
46
+ if (Number.isSafeInteger(seq)) {
47
+ const raw = await redis.get(k.event(conversationId, seq));
48
+ if (raw !== null) {
49
+ return { event: { seq, event: JSON.parse(raw) }, created: false };
50
+ }
51
+ }
52
+ await sleep(10);
53
+ }
54
+ throw new Error(`poppy: event key ${opts.key} never resolved`);
55
+ }
56
+ }
57
+ const seq = await redis.incr(k.seq(conversationId));
58
+ const now = Date.now();
59
+ const stored = {
60
+ seq,
61
+ event: { id: newEventId(seq), created_at: new Date(now).toISOString(), ...body },
62
+ };
63
+ await redis.set(k.event(conversationId, seq), JSON.stringify(stored.event));
64
+ await redis.set(k.eventId(conversationId, stored.event.id), String(seq));
65
+ if (opts.key !== undefined) {
66
+ await redis.set(k.eventKey(conversationId, opts.key), String(seq));
67
+ }
68
+ return { event: stored, created: true };
69
+ },
70
+ async listEvents(conversationId, afterSeq, limit) {
71
+ const last = await lastSeq(conversationId);
72
+ const pruned = (await getConversation(conversationId))?.prunedSeq ?? 0;
73
+ const seqs = [];
74
+ for (let seq = Math.max(afterSeq, pruned) + 1; seq <= last && seqs.length < limit; seq++)
75
+ seqs.push(seq);
76
+ if (seqs.length === 0)
77
+ return [];
78
+ const raws = await redis.mget(...seqs.map((seq) => k.event(conversationId, seq)));
79
+ const out = [];
80
+ raws.forEach((raw, index) => {
81
+ // A position whose write is still in flight ends the page: nothing is skipped over.
82
+ if (raw === null)
83
+ return;
84
+ out.push({ seq: seqs[index], event: JSON.parse(raw) });
85
+ });
86
+ const firstGap = raws.indexOf(null);
87
+ return firstGap === -1 ? out : out.filter((entry) => entry.seq < (seqs[firstGap] ?? 0));
88
+ },
89
+ async findEventSeq(conversationId, eventId) {
90
+ const raw = await redis.get(k.eventId(conversationId, eventId));
91
+ if (raw === null)
92
+ return null;
93
+ const seq = Number.parseInt(raw, 10);
94
+ return (await redis.get(k.event(conversationId, seq))) === null ? null : seq;
95
+ },
96
+ async pruneEvents(conversationId, before) {
97
+ const conversation = await getConversation(conversationId);
98
+ const last = await lastSeq(conversationId);
99
+ const from = conversation?.prunedSeq ?? 0;
100
+ let upTo = from;
101
+ const doomed = [];
102
+ for (let seq = from + 1; seq < last; seq++) {
103
+ const raw = await redis.get(k.event(conversationId, seq));
104
+ if (raw !== null) {
105
+ const event = JSON.parse(raw);
106
+ if (Date.parse(event.created_at) >= before)
107
+ break;
108
+ doomed.push(k.event(conversationId, seq), k.eventId(conversationId, event.id));
109
+ }
110
+ upTo = seq;
111
+ }
112
+ if (!conversation || upTo === from)
113
+ return;
114
+ // Readers learn the new floor before the events go, so none mistakes the gap for a write.
115
+ await redis.set(k.conversation(conversationId), JSON.stringify({ ...conversation, prunedSeq: upTo }));
116
+ if (doomed.length > 0)
117
+ await redis.del(...doomed);
118
+ },
119
+ async claimMessage(owner, messageId, receipt) {
120
+ const key = k.message(owner, messageId);
121
+ if ((await redis.set(key, JSON.stringify(receipt), 'NX')) !== null) {
122
+ return { status: 'claimed' };
123
+ }
124
+ const raw = await redis.get(key);
125
+ if (raw === null)
126
+ return this.claimMessage(owner, messageId, receipt);
127
+ return { status: 'existing', ...JSON.parse(raw) };
128
+ },
129
+ async releaseMessage(owner, messageId) {
130
+ await redis.del(k.message(owner, messageId));
131
+ },
132
+ async leaseReader(conversationId, holder, ttlMs) {
133
+ const key = k.lease(conversationId);
134
+ if ((await redis.set(key, holder, 'PX', ttlMs, 'NX')) !== null)
135
+ return true;
136
+ if ((await redis.get(key)) !== holder)
137
+ return false;
138
+ await redis.set(key, holder, 'PX', ttlMs);
139
+ return true;
140
+ },
141
+ async releaseReader(conversationId, holder) {
142
+ const key = k.lease(conversationId);
143
+ if ((await redis.get(key)) === holder)
144
+ await redis.del(key);
145
+ },
146
+ };
147
+ }
148
+ //# sourceMappingURL=redis-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-store.js","sourceRoot":"","sources":["../../../src/poppy/redis-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ /** The request handler the Poppy server middleware delegates to; `false` = not a Poppy request. */
3
+ export type PoppyRequestHandler = (ctx: HttpContext) => Promise<boolean>;
4
+ export declare function setPoppyHandler(handler: PoppyRequestHandler | null): void;
5
+ export declare function getPoppyHandler(): PoppyRequestHandler | null;
6
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/poppy/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,mGAAmG;AACnG,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAQzE,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAEzE;AAED,wBAAgB,eAAe,IAAI,mBAAmB,GAAG,IAAI,CAE5D"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Set by the Poppy provider at boot, read by the server middleware per request — a module
3
+ * singleton for the reason the A2A one is (the framework builds the middleware from a lazy import).
4
+ */
5
+ let current = null;
6
+ export function setPoppyHandler(handler) {
7
+ current = handler;
8
+ }
9
+ export function getPoppyHandler() {
10
+ return current;
11
+ }
12
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/poppy/runtime.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,IAAI,OAAO,GAA+B,IAAI,CAAC;AAE/C,MAAM,UAAU,eAAe,CAAC,OAAmC;IACjE,OAAO,GAAG,OAAO,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ import type { NextFn } from '@adonisjs/core/types/http';
3
+ /**
4
+ * Server middleware that answers Poppy requests before the router runs — before the bodyparser,
5
+ * the session and CSRF, like the A2A surface: a Poppy request is authenticated by its Session
6
+ * Token (DPoP), BEFORE its body is read. Everything outside the endpoint passes straight through.
7
+ */
8
+ export default class PoppyServerMiddleware {
9
+ handle(ctx: HttpContext, next: NextFn): Promise<any>;
10
+ }
11
+ //# sourceMappingURL=server_middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_middleware.d.ts","sourceRoot":"","sources":["../../../src/poppy/server_middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGxD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAClC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAM1C;CACF"}
@@ -0,0 +1,16 @@
1
+ import { getPoppyHandler } from './runtime.js';
2
+ /**
3
+ * Server middleware that answers Poppy requests before the router runs — before the bodyparser,
4
+ * the session and CSRF, like the A2A surface: a Poppy request is authenticated by its Session
5
+ * Token (DPoP), BEFORE its body is read. Everything outside the endpoint passes straight through.
6
+ */
7
+ export default class PoppyServerMiddleware {
8
+ async handle(ctx, next) {
9
+ const handler = getPoppyHandler();
10
+ if (handler !== null && (await handler(ctx))) {
11
+ return;
12
+ }
13
+ return next();
14
+ }
15
+ }
16
+ //# sourceMappingURL=server_middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_middleware.js","sourceRoot":"","sources":["../../../src/poppy/server_middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,KAAK,CAAC,MAAM,CAAC,GAAgB,EAAE,IAAY;QACzC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;QAClC,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;CACF"}