@openma/common 0.0.0-stage → 0.9.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.
Files changed (328) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +391 -2
  3. package/dist/acp-artifacts/binary.d.ts +35 -0
  4. package/dist/acp-artifacts/binary.d.ts.map +1 -0
  5. package/dist/acp-artifacts/binary.js +120 -0
  6. package/dist/acp-artifacts/binary.js.map +1 -0
  7. package/dist/acp-artifacts/index.d.ts +7 -0
  8. package/dist/acp-artifacts/index.d.ts.map +1 -0
  9. package/dist/acp-artifacts/index.js +7 -0
  10. package/dist/acp-artifacts/index.js.map +1 -0
  11. package/dist/acp-artifacts/node-abi.d.ts +3 -0
  12. package/dist/acp-artifacts/node-abi.d.ts.map +1 -0
  13. package/dist/acp-artifacts/node-abi.js +17 -0
  14. package/dist/acp-artifacts/node-abi.js.map +1 -0
  15. package/dist/acp-artifacts/npm-cli.d.ts +3 -0
  16. package/dist/acp-artifacts/npm-cli.d.ts.map +1 -0
  17. package/dist/acp-artifacts/npm-cli.js +9 -0
  18. package/dist/acp-artifacts/npm-cli.js.map +1 -0
  19. package/dist/acp-artifacts/npm.d.ts +37 -0
  20. package/dist/acp-artifacts/npm.d.ts.map +1 -0
  21. package/dist/acp-artifacts/npm.js +167 -0
  22. package/dist/acp-artifacts/npm.js.map +1 -0
  23. package/dist/acp-artifacts/registry.d.ts +45 -0
  24. package/dist/acp-artifacts/registry.d.ts.map +1 -0
  25. package/dist/acp-artifacts/registry.js +206 -0
  26. package/dist/acp-artifacts/registry.js.map +1 -0
  27. package/dist/acp-artifacts/shared.d.ts +45 -0
  28. package/dist/acp-artifacts/shared.d.ts.map +1 -0
  29. package/dist/acp-artifacts/shared.js +157 -0
  30. package/dist/acp-artifacts/shared.js.map +1 -0
  31. package/dist/acp-artifacts/uvx.d.ts +32 -0
  32. package/dist/acp-artifacts/uvx.d.ts.map +1 -0
  33. package/dist/acp-artifacts/uvx.js +95 -0
  34. package/dist/acp-artifacts/uvx.js.map +1 -0
  35. package/dist/acp-fork/index.d.ts +51 -0
  36. package/dist/acp-fork/index.d.ts.map +1 -0
  37. package/dist/acp-fork/index.js +116 -0
  38. package/dist/acp-fork/index.js.map +1 -0
  39. package/dist/acp-harnesses/agent-setup.d.ts +118 -0
  40. package/dist/acp-harnesses/agent-setup.d.ts.map +1 -0
  41. package/dist/acp-harnesses/agent-setup.js +717 -0
  42. package/dist/acp-harnesses/agent-setup.js.map +1 -0
  43. package/dist/acp-harnesses/custom-agents.d.ts +81 -0
  44. package/dist/acp-harnesses/custom-agents.d.ts.map +1 -0
  45. package/dist/acp-harnesses/custom-agents.js +361 -0
  46. package/dist/acp-harnesses/custom-agents.js.map +1 -0
  47. package/dist/acp-harnesses/headless-launch.d.ts +34 -0
  48. package/dist/acp-harnesses/headless-launch.d.ts.map +1 -0
  49. package/dist/acp-harnesses/headless-launch.js +67 -0
  50. package/dist/acp-harnesses/headless-launch.js.map +1 -0
  51. package/dist/acp-harnesses/index.d.ts +18 -0
  52. package/dist/acp-harnesses/index.d.ts.map +1 -0
  53. package/dist/acp-harnesses/index.js +58 -0
  54. package/dist/acp-harnesses/index.js.map +1 -0
  55. package/dist/acp-harnesses/install-state.d.ts +86 -0
  56. package/dist/acp-harnesses/install-state.d.ts.map +1 -0
  57. package/dist/acp-harnesses/install-state.js +322 -0
  58. package/dist/acp-harnesses/install-state.js.map +1 -0
  59. package/dist/acp-harnesses/installer.d.ts +145 -0
  60. package/dist/acp-harnesses/installer.d.ts.map +1 -0
  61. package/dist/acp-harnesses/installer.js +716 -0
  62. package/dist/acp-harnesses/installer.js.map +1 -0
  63. package/dist/acp-harnesses/known-agents.d.ts +154 -0
  64. package/dist/acp-harnesses/known-agents.d.ts.map +1 -0
  65. package/dist/acp-harnesses/known-agents.js +240 -0
  66. package/dist/acp-harnesses/known-agents.js.map +1 -0
  67. package/dist/acp-harnesses/launcher.d.ts +27 -0
  68. package/dist/acp-harnesses/launcher.d.ts.map +1 -0
  69. package/dist/acp-harnesses/launcher.js +64 -0
  70. package/dist/acp-harnesses/launcher.js.map +1 -0
  71. package/dist/acp-harnesses/registry-fetch.d.ts +42 -0
  72. package/dist/acp-harnesses/registry-fetch.d.ts.map +1 -0
  73. package/dist/acp-harnesses/registry-fetch.js +132 -0
  74. package/dist/acp-harnesses/registry-fetch.js.map +1 -0
  75. package/dist/acp-harnesses/registry.d.ts +36 -0
  76. package/dist/acp-harnesses/registry.d.ts.map +1 -0
  77. package/dist/acp-harnesses/registry.js +307 -0
  78. package/dist/acp-harnesses/registry.js.map +1 -0
  79. package/dist/acp-runtime/errors.d.ts +7 -0
  80. package/dist/acp-runtime/errors.d.ts.map +1 -0
  81. package/dist/acp-runtime/errors.js +17 -0
  82. package/dist/acp-runtime/errors.js.map +1 -0
  83. package/dist/acp-runtime/fork-support.d.ts +8 -0
  84. package/dist/acp-runtime/fork-support.d.ts.map +1 -0
  85. package/dist/acp-runtime/fork-support.js +20 -0
  86. package/dist/acp-runtime/fork-support.js.map +1 -0
  87. package/dist/acp-runtime/index.d.ts +11 -0
  88. package/dist/acp-runtime/index.d.ts.map +1 -0
  89. package/dist/acp-runtime/index.js +6 -0
  90. package/dist/acp-runtime/index.js.map +1 -0
  91. package/dist/acp-runtime/probe.d.ts +103 -0
  92. package/dist/acp-runtime/probe.d.ts.map +1 -0
  93. package/dist/acp-runtime/probe.js +881 -0
  94. package/dist/acp-runtime/probe.js.map +1 -0
  95. package/dist/acp-runtime/runtime.d.ts +7 -0
  96. package/dist/acp-runtime/runtime.d.ts.map +1 -0
  97. package/dist/acp-runtime/runtime.js +26 -0
  98. package/dist/acp-runtime/runtime.js.map +1 -0
  99. package/dist/acp-runtime/session.d.ts +87 -0
  100. package/dist/acp-runtime/session.d.ts.map +1 -0
  101. package/dist/acp-runtime/session.js +1071 -0
  102. package/dist/acp-runtime/session.js.map +1 -0
  103. package/dist/acp-runtime/spawners/node.d.ts +5 -0
  104. package/dist/acp-runtime/spawners/node.d.ts.map +1 -0
  105. package/dist/acp-runtime/spawners/node.js +244 -0
  106. package/dist/acp-runtime/spawners/node.js.map +1 -0
  107. package/dist/acp-runtime/types.d.ts +180 -0
  108. package/dist/acp-runtime/types.d.ts.map +1 -0
  109. package/dist/acp-runtime/types.js +2 -0
  110. package/dist/acp-runtime/types.js.map +1 -0
  111. package/dist/agent-contract/acp.d.ts +4 -0
  112. package/dist/agent-contract/acp.d.ts.map +1 -0
  113. package/dist/agent-contract/acp.js +273 -0
  114. package/dist/agent-contract/acp.js.map +1 -0
  115. package/dist/agent-contract/index.d.ts +125 -0
  116. package/dist/agent-contract/index.d.ts.map +1 -0
  117. package/dist/agent-contract/index.js +102 -0
  118. package/dist/agent-contract/index.js.map +1 -0
  119. package/dist/agent-contract/managed.d.ts +5 -0
  120. package/dist/agent-contract/managed.d.ts.map +1 -0
  121. package/dist/agent-contract/managed.js +242 -0
  122. package/dist/agent-contract/managed.js.map +1 -0
  123. package/dist/agent-ui/index.d.ts +170 -0
  124. package/dist/agent-ui/index.d.ts.map +1 -0
  125. package/dist/agent-ui/index.js +853 -0
  126. package/dist/agent-ui/index.js.map +1 -0
  127. package/dist/agent-ui/presentation.d.ts +30 -0
  128. package/dist/agent-ui/presentation.d.ts.map +1 -0
  129. package/dist/agent-ui/presentation.js +79 -0
  130. package/dist/agent-ui/presentation.js.map +1 -0
  131. package/dist/agent-ui/react.d.ts +50 -0
  132. package/dist/agent-ui/react.d.ts.map +1 -0
  133. package/dist/agent-ui/react.js +334 -0
  134. package/dist/agent-ui/react.js.map +1 -0
  135. package/dist/brand/index.d.ts +17 -0
  136. package/dist/brand/index.d.ts.map +1 -0
  137. package/dist/brand/index.js +119 -0
  138. package/dist/brand/index.js.map +1 -0
  139. package/dist/brand/openma-logo-mark.svg +7 -0
  140. package/dist/brand/tokens.css +77 -0
  141. package/dist/brand/website.css +67 -0
  142. package/dist/chat-ui/acp.d.ts +26 -0
  143. package/dist/chat-ui/acp.d.ts.map +1 -0
  144. package/dist/chat-ui/acp.js +166 -0
  145. package/dist/chat-ui/acp.js.map +1 -0
  146. package/dist/chat-ui/components.d.ts +230 -0
  147. package/dist/chat-ui/components.d.ts.map +1 -0
  148. package/dist/chat-ui/components.js +561 -0
  149. package/dist/chat-ui/components.js.map +1 -0
  150. package/dist/chat-ui/composer-drafts.d.ts +21 -0
  151. package/dist/chat-ui/composer-drafts.d.ts.map +1 -0
  152. package/dist/chat-ui/composer-drafts.js +58 -0
  153. package/dist/chat-ui/composer-drafts.js.map +1 -0
  154. package/dist/chat-ui/controller.d.ts +61 -0
  155. package/dist/chat-ui/controller.d.ts.map +1 -0
  156. package/dist/chat-ui/controller.js +218 -0
  157. package/dist/chat-ui/controller.js.map +1 -0
  158. package/dist/chat-ui/index.d.ts +8 -0
  159. package/dist/chat-ui/index.d.ts.map +1 -0
  160. package/dist/chat-ui/index.js +8 -0
  161. package/dist/chat-ui/index.js.map +1 -0
  162. package/dist/chat-ui/markdown.d.ts +37 -0
  163. package/dist/chat-ui/markdown.d.ts.map +1 -0
  164. package/dist/chat-ui/markdown.js +33 -0
  165. package/dist/chat-ui/markdown.js.map +1 -0
  166. package/dist/chat-ui/presentation.d.ts +34 -0
  167. package/dist/chat-ui/presentation.d.ts.map +1 -0
  168. package/dist/chat-ui/presentation.js +191 -0
  169. package/dist/chat-ui/presentation.js.map +1 -0
  170. package/dist/chat-ui/styles.css +815 -0
  171. package/dist/chat-ui/utils.d.ts +14 -0
  172. package/dist/chat-ui/utils.d.ts.map +1 -0
  173. package/dist/chat-ui/utils.js +71 -0
  174. package/dist/chat-ui/utils.js.map +1 -0
  175. package/dist/local-runtime/checkpoint.d.ts +28 -0
  176. package/dist/local-runtime/checkpoint.d.ts.map +1 -0
  177. package/dist/local-runtime/checkpoint.js +2 -0
  178. package/dist/local-runtime/checkpoint.js.map +1 -0
  179. package/dist/local-runtime/daemon-connection.d.ts +27 -0
  180. package/dist/local-runtime/daemon-connection.d.ts.map +1 -0
  181. package/dist/local-runtime/daemon-connection.js +161 -0
  182. package/dist/local-runtime/daemon-connection.js.map +1 -0
  183. package/dist/local-runtime/daemon-host.d.ts +39 -0
  184. package/dist/local-runtime/daemon-host.d.ts.map +1 -0
  185. package/dist/local-runtime/daemon-host.js +88 -0
  186. package/dist/local-runtime/daemon-host.js.map +1 -0
  187. package/dist/local-runtime/index.d.ts +6 -0
  188. package/dist/local-runtime/index.d.ts.map +1 -0
  189. package/dist/local-runtime/index.js +5 -0
  190. package/dist/local-runtime/index.js.map +1 -0
  191. package/dist/local-runtime/runtime.d.ts +36 -0
  192. package/dist/local-runtime/runtime.d.ts.map +1 -0
  193. package/dist/local-runtime/runtime.js +82 -0
  194. package/dist/local-runtime/runtime.js.map +1 -0
  195. package/dist/local-runtime/session-host.d.ts +62 -0
  196. package/dist/local-runtime/session-host.d.ts.map +1 -0
  197. package/dist/local-runtime/session-host.js +477 -0
  198. package/dist/local-runtime/session-host.js.map +1 -0
  199. package/dist/managed-runtime/acp-subagents.d.ts +14 -0
  200. package/dist/managed-runtime/acp-subagents.d.ts.map +1 -0
  201. package/dist/managed-runtime/acp-subagents.js +67 -0
  202. package/dist/managed-runtime/acp-subagents.js.map +1 -0
  203. package/dist/managed-runtime/claimed-environment-work.d.ts +61 -0
  204. package/dist/managed-runtime/claimed-environment-work.d.ts.map +1 -0
  205. package/dist/managed-runtime/claimed-environment-work.js +170 -0
  206. package/dist/managed-runtime/claimed-environment-work.js.map +1 -0
  207. package/dist/managed-runtime/contracts.d.ts +31 -0
  208. package/dist/managed-runtime/contracts.d.ts.map +1 -0
  209. package/dist/managed-runtime/contracts.js +2 -0
  210. package/dist/managed-runtime/contracts.js.map +1 -0
  211. package/dist/managed-runtime/http-control.d.ts +67 -0
  212. package/dist/managed-runtime/http-control.d.ts.map +1 -0
  213. package/dist/managed-runtime/http-control.js +465 -0
  214. package/dist/managed-runtime/http-control.js.map +1 -0
  215. package/dist/managed-runtime/index.d.ts +89 -0
  216. package/dist/managed-runtime/index.d.ts.map +1 -0
  217. package/dist/managed-runtime/index.js +215 -0
  218. package/dist/managed-runtime/index.js.map +1 -0
  219. package/dist/managed-runtime/input-identity.d.ts +2 -0
  220. package/dist/managed-runtime/input-identity.d.ts.map +1 -0
  221. package/dist/managed-runtime/input-identity.js +2 -0
  222. package/dist/managed-runtime/input-identity.js.map +1 -0
  223. package/dist/managed-runtime/managed-event-projector.d.ts +24 -0
  224. package/dist/managed-runtime/managed-event-projector.d.ts.map +1 -0
  225. package/dist/managed-runtime/managed-event-projector.js +333 -0
  226. package/dist/managed-runtime/managed-event-projector.js.map +1 -0
  227. package/dist/managed-runtime/semantic-recovery.d.ts +61 -0
  228. package/dist/managed-runtime/semantic-recovery.d.ts.map +1 -0
  229. package/dist/managed-runtime/semantic-recovery.js +167 -0
  230. package/dist/managed-runtime/semantic-recovery.js.map +1 -0
  231. package/dist/project-ui/CreateProjectDialog.d.ts +15 -0
  232. package/dist/project-ui/CreateProjectDialog.d.ts.map +1 -0
  233. package/dist/project-ui/CreateProjectDialog.js +87 -0
  234. package/dist/project-ui/CreateProjectDialog.js.map +1 -0
  235. package/dist/project-ui/ProjectComposer.d.ts +13 -0
  236. package/dist/project-ui/ProjectComposer.d.ts.map +1 -0
  237. package/dist/project-ui/ProjectComposer.js +70 -0
  238. package/dist/project-ui/ProjectComposer.js.map +1 -0
  239. package/dist/project-ui/ProjectConversation.d.ts +10 -0
  240. package/dist/project-ui/ProjectConversation.d.ts.map +1 -0
  241. package/dist/project-ui/ProjectConversation.js +28 -0
  242. package/dist/project-ui/ProjectConversation.js.map +1 -0
  243. package/dist/project-ui/ProjectMessageAttachments.d.ts +4 -0
  244. package/dist/project-ui/ProjectMessageAttachments.d.ts.map +1 -0
  245. package/dist/project-ui/ProjectMessageAttachments.js +28 -0
  246. package/dist/project-ui/ProjectMessageAttachments.js.map +1 -0
  247. package/dist/project-ui/ProjectSettings.d.ts +8 -0
  248. package/dist/project-ui/ProjectSettings.d.ts.map +1 -0
  249. package/dist/project-ui/ProjectSettings.js +65 -0
  250. package/dist/project-ui/ProjectSettings.js.map +1 -0
  251. package/dist/project-ui/Projects.d.ts +18 -0
  252. package/dist/project-ui/Projects.d.ts.map +1 -0
  253. package/dist/project-ui/Projects.js +377 -0
  254. package/dist/project-ui/Projects.js.map +1 -0
  255. package/dist/project-ui/client.d.ts +234 -0
  256. package/dist/project-ui/client.d.ts.map +1 -0
  257. package/dist/project-ui/client.js +42 -0
  258. package/dist/project-ui/client.js.map +1 -0
  259. package/dist/project-ui/controls.d.ts +15 -0
  260. package/dist/project-ui/controls.d.ts.map +1 -0
  261. package/dist/project-ui/controls.js +17 -0
  262. package/dist/project-ui/controls.js.map +1 -0
  263. package/dist/project-ui/index.d.ts +20 -0
  264. package/dist/project-ui/index.d.ts.map +1 -0
  265. package/dist/project-ui/index.js +17 -0
  266. package/dist/project-ui/index.js.map +1 -0
  267. package/dist/project-ui/project-coordinator.d.ts +3 -0
  268. package/dist/project-ui/project-coordinator.d.ts.map +1 -0
  269. package/dist/project-ui/project-coordinator.js +12 -0
  270. package/dist/project-ui/project-coordinator.js.map +1 -0
  271. package/dist/project-ui/project-goals.d.ts +48 -0
  272. package/dist/project-ui/project-goals.d.ts.map +1 -0
  273. package/dist/project-ui/project-goals.js +169 -0
  274. package/dist/project-ui/project-goals.js.map +1 -0
  275. package/dist/project-ui/projects-query.d.ts +19 -0
  276. package/dist/project-ui/projects-query.d.ts.map +1 -0
  277. package/dist/project-ui/projects-query.js +132 -0
  278. package/dist/project-ui/projects-query.js.map +1 -0
  279. package/dist/project-ui/styles.css +847 -0
  280. package/dist/protocol/acp/index.d.ts +52 -0
  281. package/dist/protocol/acp/index.d.ts.map +1 -0
  282. package/dist/protocol/acp/index.js +1056 -0
  283. package/dist/protocol/acp/index.js.map +1 -0
  284. package/dist/protocol/cursor-cloud/index.d.ts +74 -0
  285. package/dist/protocol/cursor-cloud/index.d.ts.map +1 -0
  286. package/dist/protocol/cursor-cloud/index.js +249 -0
  287. package/dist/protocol/cursor-cloud/index.js.map +1 -0
  288. package/dist/protocol/managed/index.d.ts +32 -0
  289. package/dist/protocol/managed/index.d.ts.map +1 -0
  290. package/dist/protocol/managed/index.js +646 -0
  291. package/dist/protocol/managed/index.js.map +1 -0
  292. package/dist/protocol/managed/input-identity.d.ts +3 -0
  293. package/dist/protocol/managed/input-identity.d.ts.map +1 -0
  294. package/dist/protocol/managed/input-identity.js +6 -0
  295. package/dist/protocol/managed/input-identity.js.map +1 -0
  296. package/dist/protocol/openai-agents/index.d.ts +102 -0
  297. package/dist/protocol/openai-agents/index.d.ts.map +1 -0
  298. package/dist/protocol/openai-agents/index.js +142 -0
  299. package/dist/protocol/openai-agents/index.js.map +1 -0
  300. package/dist/session-events/acp-system-notices.d.ts +10 -0
  301. package/dist/session-events/acp-system-notices.d.ts.map +1 -0
  302. package/dist/session-events/acp-system-notices.js +46 -0
  303. package/dist/session-events/acp-system-notices.js.map +1 -0
  304. package/dist/session-events/acp.d.ts +214 -0
  305. package/dist/session-events/acp.d.ts.map +1 -0
  306. package/dist/session-events/acp.js +956 -0
  307. package/dist/session-events/acp.js.map +1 -0
  308. package/dist/session-events/managed.d.ts +141 -0
  309. package/dist/session-events/managed.d.ts.map +1 -0
  310. package/dist/session-events/managed.js +324 -0
  311. package/dist/session-events/managed.js.map +1 -0
  312. package/dist/session-events/openma.d.ts +304 -0
  313. package/dist/session-events/openma.d.ts.map +1 -0
  314. package/dist/session-events/openma.js +438 -0
  315. package/dist/session-events/openma.js.map +1 -0
  316. package/dist/session-kernel/index.d.ts +118 -0
  317. package/dist/session-kernel/index.d.ts.map +1 -0
  318. package/dist/session-kernel/index.js +215 -0
  319. package/dist/session-kernel/index.js.map +1 -0
  320. package/dist/session-orchestrator/index.d.ts +71 -0
  321. package/dist/session-orchestrator/index.d.ts.map +1 -0
  322. package/dist/session-orchestrator/index.js +177 -0
  323. package/dist/session-orchestrator/index.js.map +1 -0
  324. package/dist/session-ui/index.d.ts +96 -0
  325. package/dist/session-ui/index.d.ts.map +1 -0
  326. package/dist/session-ui/index.js +277 -0
  327. package/dist/session-ui/index.js.map +1 -0
  328. package/package.json +222 -4
@@ -0,0 +1,1056 @@
1
+ import { createOpenMAEvent, createRawEvent, createVendorEvent, } from "../../session-events/openma.js";
2
+ import { parseAcpEvent as parseCommonAcpEvent, sessionUpdateInner, sessionUpdateType, } from "../../session-events/acp.js";
3
+ import { splitAcpSystemNoticeText } from "../../session-events/acp-system-notices.js";
4
+ const source = {
5
+ kind: "harness",
6
+ harness: "acp",
7
+ adapter: "acp-events",
8
+ };
9
+ function sourceFor(context) {
10
+ return context.harness ? { ...source, harness: context.harness } : source;
11
+ }
12
+ function adapterMeta(value) {
13
+ return isRecord(value._meta) ? { ...value._meta } : undefined;
14
+ }
15
+ function messagePhase(value) {
16
+ if (!isRecord(value._meta) || !isRecord(value._meta.codex))
17
+ return undefined;
18
+ const phase = value._meta.codex.phase;
19
+ return phase === "commentary" || phase === "final_answer" ? phase : undefined;
20
+ }
21
+ function textFromContent(content) {
22
+ return content.type === "text" ? content.text : undefined;
23
+ }
24
+ function isAcpContentBlock(value) {
25
+ if (!value || typeof value !== "object")
26
+ return false;
27
+ const block = value;
28
+ if (block.type === "text")
29
+ return typeof block.text === "string";
30
+ if (block.type === "image" || block.type === "audio") {
31
+ return typeof block.data === "string" && typeof block.mimeType === "string";
32
+ }
33
+ if (block.type === "resource_link") {
34
+ return typeof block.name === "string" && typeof block.uri === "string";
35
+ }
36
+ if (block.type === "resource") {
37
+ return !!block.resource && typeof block.resource === "object";
38
+ }
39
+ return false;
40
+ }
41
+ function callbackCategory(method) {
42
+ if (method === "session/request_permission")
43
+ return "permission";
44
+ if (method.startsWith("fs/"))
45
+ return "filesystem";
46
+ if (method.startsWith("terminal/"))
47
+ return "terminal";
48
+ if (method.startsWith("elicitation/"))
49
+ return "elicitation";
50
+ if (method.startsWith("mcp/"))
51
+ return "mcp";
52
+ return "extension";
53
+ }
54
+ function isRecord(value) {
55
+ return !!value && typeof value === "object" && !Array.isArray(value);
56
+ }
57
+ function directAdapterMeta(input) {
58
+ const inner = sessionUpdateInner(input);
59
+ return isRecord(inner._meta) ? inner._meta : undefined;
60
+ }
61
+ function parsedAcpEvent(sessionId, input, context) {
62
+ const parsed = parseCommonAcpEvent(input);
63
+ const inner = sessionUpdateInner(input);
64
+ const wireType = sessionUpdateType(input)
65
+ ?? (typeof inner.type === "string" ? inner.type : undefined);
66
+ const metadata = directAdapterMeta(input);
67
+ const base = {
68
+ event_id: context.eventId,
69
+ session_id: sessionId,
70
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
71
+ source: sourceFor(context),
72
+ occurred_at: context.occurredAt,
73
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
74
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
75
+ };
76
+ const exact = (event) => ({
77
+ fidelity: "exact",
78
+ diagnostics: [],
79
+ event,
80
+ });
81
+ const contentRecord = isRecord(inner.content) ? inner.content : undefined;
82
+ const rawMessageText = typeof contentRecord?.text === "string"
83
+ ? contentRecord.text
84
+ : typeof inner.content === "string"
85
+ ? inner.content
86
+ : typeof inner.text === "string"
87
+ ? inner.text
88
+ : undefined;
89
+ if ((wireType === "agent_message_chunk" || wireType === "agent.message_chunk")
90
+ && rawMessageText) {
91
+ const split = splitAcpSystemNoticeText(rawMessageText);
92
+ if (split.notice && split.transcript) {
93
+ return exact(createOpenMAEvent({
94
+ ...base,
95
+ type: "agent.message_chunk",
96
+ data: {
97
+ text: split.transcript,
98
+ ...(typeof inner.messageId === "string"
99
+ ? { message_id: inner.messageId }
100
+ : typeof inner.message_id === "string"
101
+ ? { message_id: inner.message_id }
102
+ : {}),
103
+ ...(messagePhase(inner) ? { phase: messagePhase(inner) } : {}),
104
+ ...(metadata ? { adapter_meta: metadata } : {}),
105
+ },
106
+ }));
107
+ }
108
+ }
109
+ if (parsed.kind === "text") {
110
+ const split = splitAcpSystemNoticeText(parsed.text);
111
+ if (split.notice && !split.transcript) {
112
+ return exact(createOpenMAEvent({
113
+ ...base,
114
+ type: "system.notice",
115
+ data: {
116
+ text: split.notice,
117
+ tone: "warning",
118
+ ...(metadata ? { adapter_meta: metadata } : {}),
119
+ },
120
+ }));
121
+ }
122
+ const text = split.transcript;
123
+ if (!text)
124
+ return undefined;
125
+ const complete = wireType === "agent_message" || wireType === "agent.message";
126
+ return exact(createOpenMAEvent({
127
+ ...base,
128
+ ...(parsed.parentToolUseId ? { parent_id: parsed.parentToolUseId } : {}),
129
+ type: complete ? "agent.message" : "agent.message_chunk",
130
+ data: {
131
+ text,
132
+ ...(parsed.messageId ? { message_id: parsed.messageId } : {}),
133
+ ...(parsed.phase ? { phase: parsed.phase } : {}),
134
+ ...(inner.content !== undefined ? { content: inner.content } : {}),
135
+ ...(metadata ? { adapter_meta: metadata } : {}),
136
+ },
137
+ }));
138
+ }
139
+ if (parsed.kind === "thought") {
140
+ return exact(createOpenMAEvent({
141
+ ...base,
142
+ ...(parsed.parentToolUseId ? { parent_id: parsed.parentToolUseId } : {}),
143
+ type: "agent.thinking",
144
+ data: {
145
+ text: parsed.text,
146
+ ...(parsed.messageId ? { message_id: parsed.messageId } : {}),
147
+ ...(inner.content !== undefined ? { content: inner.content } : {}),
148
+ ...(metadata ? { adapter_meta: metadata } : {}),
149
+ },
150
+ }));
151
+ }
152
+ if (parsed.kind === "notice") {
153
+ return exact(createOpenMAEvent({
154
+ ...base,
155
+ type: "system.notice",
156
+ data: {
157
+ text: parsed.notice,
158
+ tone: "warning",
159
+ ...(metadata ? { adapter_meta: metadata } : {}),
160
+ },
161
+ }));
162
+ }
163
+ if (parsed.kind === "tool_call") {
164
+ const status = parsed.tool.status?.toLowerCase();
165
+ const type = status === "completed" || status === "complete"
166
+ ? "tool.completed"
167
+ : status === "failed" || status === "error"
168
+ ? "tool.failed"
169
+ : status === "cancelled" || status === "canceled"
170
+ ? "tool.cancelled"
171
+ : wireType === "tool_call_update"
172
+ ? "tool.progress"
173
+ : "tool.started";
174
+ return exact(createOpenMAEvent({
175
+ ...base,
176
+ work_item_id: parsed.tool.toolCallId,
177
+ ...(parsed.tool.parentToolUseId
178
+ ? { parent_id: parsed.tool.parentToolUseId }
179
+ : {}),
180
+ type,
181
+ data: {
182
+ tool_call_id: parsed.tool.toolCallId,
183
+ ...(parsed.tool.title ? { title: parsed.tool.title } : {}),
184
+ ...(parsed.tool.kind ? { kind: parsed.tool.kind } : {}),
185
+ ...(parsed.tool.status ? { status: parsed.tool.status } : {}),
186
+ ...(parsed.tool.toolName ? { tool_name: parsed.tool.toolName } : {}),
187
+ ...(parsed.tool.rawInput !== undefined
188
+ ? { raw_input: parsed.tool.rawInput }
189
+ : {}),
190
+ ...(parsed.tool.rawOutput !== undefined
191
+ ? { raw_output: parsed.tool.rawOutput }
192
+ : {}),
193
+ ...(parsed.tool.content ? { content: parsed.tool.content } : {}),
194
+ ...(parsed.tool.locations ? { locations: parsed.tool.locations } : {}),
195
+ ...(parsed.tool.meta ? { adapter_meta: parsed.tool.meta } : {}),
196
+ ...(parsed.tool.outputDelta
197
+ ? {
198
+ output: {
199
+ kind: "text",
200
+ data: parsed.tool.outputDelta.data,
201
+ append: true,
202
+ separator: parsed.tool.outputDelta.separator,
203
+ },
204
+ }
205
+ : {}),
206
+ },
207
+ }));
208
+ }
209
+ if (parsed.kind === "commands") {
210
+ return exact(createOpenMAEvent({
211
+ ...base,
212
+ type: "command_catalog.updated",
213
+ data: {
214
+ commands: parsed.commands,
215
+ ...(metadata ? { adapter_meta: metadata } : {}),
216
+ },
217
+ }));
218
+ }
219
+ if (parsed.kind === "plan") {
220
+ return exact(createOpenMAEvent({
221
+ ...base,
222
+ type: "plan.updated",
223
+ data: {
224
+ representation: parsed.document?.markdown
225
+ ? "markdown"
226
+ : parsed.document?.uri
227
+ ? "file"
228
+ : "items",
229
+ ...(parsed.planId ? { plan_id: parsed.planId } : {}),
230
+ update_mode: parsed.updateMode ?? "replace",
231
+ entries: parsed.plan.map((entry) => ({
232
+ ...(entry.id !== undefined ? { id: entry.id } : {}),
233
+ content: entry.content,
234
+ ...(entry.priority !== undefined ? { priority: entry.priority } : {}),
235
+ ...(entry.status !== undefined ? { status: entry.status } : {}),
236
+ })),
237
+ ...(parsed.document
238
+ ? {
239
+ document: {
240
+ ...(parsed.document.id ? { id: parsed.document.id } : {}),
241
+ ...(parsed.document.title ? { title: parsed.document.title } : {}),
242
+ ...(parsed.document.markdown
243
+ ? { markdown: parsed.document.markdown }
244
+ : {}),
245
+ ...(parsed.document.uri ? { uri: parsed.document.uri } : {}),
246
+ },
247
+ }
248
+ : {}),
249
+ ...(metadata ? { adapter_meta: metadata } : {}),
250
+ },
251
+ }));
252
+ }
253
+ if (parsed.kind === "plan_document" && parsed.document) {
254
+ return exact(createOpenMAEvent({
255
+ ...base,
256
+ type: "plan.updated",
257
+ data: {
258
+ representation: parsed.document.uri ? "file" : "markdown",
259
+ ...(parsed.document.id ? { plan_id: parsed.document.id } : {}),
260
+ update_mode: "replace",
261
+ document: {
262
+ ...(parsed.document.id ? { id: parsed.document.id } : {}),
263
+ ...(parsed.document.title ? { title: parsed.document.title } : {}),
264
+ ...(parsed.document.markdown
265
+ ? { markdown: parsed.document.markdown }
266
+ : {}),
267
+ ...(parsed.document.uri ? { uri: parsed.document.uri } : {}),
268
+ },
269
+ ...(metadata ? { adapter_meta: metadata } : {}),
270
+ },
271
+ }));
272
+ }
273
+ if (parsed.kind === "plan_removed") {
274
+ return exact(createOpenMAEvent({
275
+ ...base,
276
+ type: "plan.removed",
277
+ data: {
278
+ ...(parsed.planId ? { plan_id: parsed.planId } : {}),
279
+ ...(metadata ? { adapter_meta: metadata } : {}),
280
+ },
281
+ }));
282
+ }
283
+ if (parsed.kind === "note") {
284
+ return exact(createOpenMAEvent({
285
+ ...base,
286
+ type: "system.message",
287
+ data: { text: parsed.note },
288
+ }));
289
+ }
290
+ return undefined;
291
+ }
292
+ function isOpenMAEvent(value) {
293
+ if (!isRecord(value))
294
+ return false;
295
+ return value.schema_version === "oma.event.v1"
296
+ && typeof value.event_id === "string"
297
+ && typeof value.type === "string"
298
+ && typeof value.session_id === "string"
299
+ && isRecord(value.source)
300
+ && typeof value.source.kind === "string"
301
+ && typeof value.occurred_at === "string"
302
+ && Object.prototype.hasOwnProperty.call(value, "data");
303
+ }
304
+ function isPermissionRequest(value) {
305
+ if (!isRecord(value) || typeof value.sessionId !== "string")
306
+ return false;
307
+ if (!isRecord(value.toolCall) || typeof value.toolCall.toolCallId !== "string") {
308
+ return false;
309
+ }
310
+ return Array.isArray(value.options);
311
+ }
312
+ export function decodeAcpAgentRequest(request, context) {
313
+ if (request.method === "session/request_permission"
314
+ && !isPermissionRequest(request.params)) {
315
+ return {
316
+ fidelity: "unsupported",
317
+ diagnostics: [{
318
+ code: "acp_callback_malformed",
319
+ message: "Malformed ACP callback request: session/request_permission",
320
+ }],
321
+ event: createRawEvent({
322
+ event_id: context.eventId,
323
+ session_id: context.sessionId,
324
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
325
+ source,
326
+ occurred_at: context.occurredAt,
327
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
328
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
329
+ source_kind: "acp",
330
+ method: request.method,
331
+ payload: request,
332
+ received_at: context.ingestedAt ?? context.occurredAt,
333
+ reason: "malformed",
334
+ }),
335
+ };
336
+ }
337
+ const permission = request.method === "session/request_permission"
338
+ ? request.params
339
+ : undefined;
340
+ return {
341
+ fidelity: "exact",
342
+ diagnostics: [],
343
+ event: createOpenMAEvent({
344
+ event_id: context.eventId,
345
+ type: "callback.requested",
346
+ session_id: context.sessionId,
347
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
348
+ ...(permission?.toolCall.toolCallId
349
+ ? { work_item_id: permission.toolCall.toolCallId }
350
+ : {}),
351
+ source,
352
+ occurred_at: context.occurredAt,
353
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
354
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
355
+ data: {
356
+ callback_id: request.id,
357
+ method: request.method,
358
+ category: callbackCategory(request.method),
359
+ ...(request.params !== undefined ? { params: request.params } : {}),
360
+ },
361
+ }),
362
+ };
363
+ }
364
+ export function decodeAcpAgentNotification(notification, context) {
365
+ if (notification.method === "session/update") {
366
+ const params = notification.params;
367
+ if (!isRecord(params)
368
+ || typeof params.sessionId !== "string"
369
+ || !isRecord(params.update)
370
+ || typeof params.update.sessionUpdate !== "string"
371
+ || params.sessionId !== context.sessionId) {
372
+ return {
373
+ fidelity: "unsupported",
374
+ diagnostics: [{
375
+ code: "acp_session_notification_malformed",
376
+ message: "Malformed or cross-session ACP session/update notification",
377
+ }],
378
+ event: createRawEvent({
379
+ event_id: context.eventId,
380
+ session_id: context.sessionId,
381
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
382
+ source,
383
+ occurred_at: context.occurredAt,
384
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
385
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
386
+ source_kind: "acp",
387
+ method: notification.method,
388
+ payload: notification,
389
+ received_at: context.ingestedAt ?? context.occurredAt,
390
+ reason: "malformed",
391
+ }),
392
+ };
393
+ }
394
+ return decodeAcpSessionNotification(params, context);
395
+ }
396
+ return {
397
+ fidelity: "exact",
398
+ diagnostics: [],
399
+ event: createOpenMAEvent({
400
+ event_id: context.eventId,
401
+ type: "callback.notification",
402
+ session_id: context.sessionId,
403
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
404
+ source,
405
+ occurred_at: context.occurredAt,
406
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
407
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
408
+ data: {
409
+ method: notification.method,
410
+ category: callbackCategory(notification.method),
411
+ ...(notification.params !== undefined
412
+ ? { params: notification.params }
413
+ : {}),
414
+ },
415
+ }),
416
+ };
417
+ }
418
+ export function decodeAcpClientResponse(response, context) {
419
+ const failed = "error" in response;
420
+ return {
421
+ fidelity: "exact",
422
+ diagnostics: [],
423
+ event: createOpenMAEvent({
424
+ event_id: context.eventId,
425
+ type: failed ? "callback.failed" : "callback.completed",
426
+ session_id: context.sessionId,
427
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
428
+ source,
429
+ occurred_at: context.occurredAt,
430
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
431
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
432
+ data: {
433
+ callback_id: response.id,
434
+ method: context.method,
435
+ category: callbackCategory(context.method),
436
+ ...(failed ? { error: response.error } : { result: response.result }),
437
+ },
438
+ }),
439
+ };
440
+ }
441
+ export function decodeAcpAgentResponse(response, context) {
442
+ if (context.method !== "session/prompt") {
443
+ return {
444
+ fidelity: "exact",
445
+ diagnostics: [],
446
+ event: createVendorEvent({
447
+ event_id: context.eventId,
448
+ session_id: context.sessionId,
449
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
450
+ source,
451
+ occurred_at: context.occurredAt,
452
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
453
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
454
+ harness: "acp",
455
+ namespace: "response",
456
+ name: context.method,
457
+ data: response,
458
+ }),
459
+ };
460
+ }
461
+ if (!context.turnId) {
462
+ return {
463
+ fidelity: "unsupported",
464
+ diagnostics: [{
465
+ code: "acp_turn_id_required",
466
+ message: "ACP session/prompt response requires its adapter-assigned turn id",
467
+ }],
468
+ event: createRawEvent({
469
+ event_id: context.eventId,
470
+ session_id: context.sessionId,
471
+ source,
472
+ occurred_at: context.occurredAt,
473
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
474
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
475
+ source_kind: "acp",
476
+ method: context.method,
477
+ payload: response,
478
+ received_at: context.ingestedAt ?? context.occurredAt,
479
+ reason: "malformed",
480
+ }),
481
+ };
482
+ }
483
+ if ("error" in response) {
484
+ return {
485
+ fidelity: "exact",
486
+ diagnostics: [],
487
+ event: createOpenMAEvent({
488
+ event_id: context.eventId,
489
+ type: "turn.failed",
490
+ session_id: context.sessionId,
491
+ turn_id: context.turnId,
492
+ source,
493
+ occurred_at: context.occurredAt,
494
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
495
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
496
+ data: { request_id: response.id, error: response.error },
497
+ }),
498
+ };
499
+ }
500
+ const result = response.result;
501
+ const type = result.stopReason === "cancelled"
502
+ ? "turn.cancelled"
503
+ : "turn.completed";
504
+ return {
505
+ fidelity: "exact",
506
+ diagnostics: [],
507
+ event: createOpenMAEvent({
508
+ event_id: context.eventId,
509
+ type,
510
+ session_id: context.sessionId,
511
+ turn_id: context.turnId,
512
+ source,
513
+ occurred_at: context.occurredAt,
514
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
515
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
516
+ data: {
517
+ request_id: response.id,
518
+ stop_reason: result.stopReason,
519
+ ...(result.usage ? { usage: result.usage } : {}),
520
+ ...(result._meta ? { adapter_meta: result._meta } : {}),
521
+ },
522
+ }),
523
+ };
524
+ }
525
+ export function encodeAcpInput(event, context = {}) {
526
+ if (event.type === "user.interrupt") {
527
+ return {
528
+ fidelity: "exact",
529
+ diagnostics: [],
530
+ message: {
531
+ method: "session/cancel",
532
+ params: { sessionId: event.session_id },
533
+ },
534
+ };
535
+ }
536
+ if (event.type === "user.permission_response") {
537
+ const data = event.data;
538
+ if (data.callback_id === undefined) {
539
+ return {
540
+ fidelity: "unsupported",
541
+ diagnostics: [{
542
+ code: "acp_callback_id_required",
543
+ message: "ACP permission response requires the original JSON-RPC callback id",
544
+ }],
545
+ };
546
+ }
547
+ if (data.decision === "cancel" || data.decision === "cancelled") {
548
+ return {
549
+ fidelity: "exact",
550
+ diagnostics: [],
551
+ message: {
552
+ id: data.callback_id,
553
+ result: { outcome: { outcome: "cancelled" } },
554
+ },
555
+ };
556
+ }
557
+ if (typeof data.option_id !== "string" || data.option_id.length === 0) {
558
+ return {
559
+ fidelity: "unsupported",
560
+ diagnostics: [{
561
+ code: "acp_permission_option_required",
562
+ message: "ACP selected permission response requires an exact option_id",
563
+ }],
564
+ };
565
+ }
566
+ return {
567
+ fidelity: "exact",
568
+ diagnostics: [],
569
+ message: {
570
+ id: data.callback_id,
571
+ result: {
572
+ outcome: {
573
+ outcome: "selected",
574
+ optionId: data.option_id,
575
+ },
576
+ },
577
+ },
578
+ };
579
+ }
580
+ if (event.type !== "user.message") {
581
+ return {
582
+ fidelity: "unsupported",
583
+ diagnostics: [{
584
+ code: "acp_input_unsupported",
585
+ message: `OpenMA event cannot be sent to ACP: ${event.type}`,
586
+ }],
587
+ };
588
+ }
589
+ if (context.requestId === undefined) {
590
+ return {
591
+ fidelity: "unsupported",
592
+ diagnostics: [{
593
+ code: "acp_request_id_required",
594
+ message: "ACP session/prompt requires an explicit JSON-RPC request id",
595
+ }],
596
+ };
597
+ }
598
+ const data = event.data;
599
+ const content = Array.isArray(data.content)
600
+ && data.content.every(isAcpContentBlock)
601
+ ? data.content
602
+ : undefined;
603
+ if (content) {
604
+ return {
605
+ fidelity: "exact",
606
+ diagnostics: [],
607
+ message: {
608
+ id: context.requestId,
609
+ method: "session/prompt",
610
+ params: {
611
+ sessionId: event.session_id,
612
+ prompt: content,
613
+ },
614
+ },
615
+ };
616
+ }
617
+ if (typeof data.text === "string") {
618
+ return {
619
+ fidelity: data.content === undefined ? "exact" : "lossy",
620
+ diagnostics: data.content === undefined
621
+ ? []
622
+ : [{
623
+ code: "acp_message_content_lossy",
624
+ message: "Non-ACP content was reduced to its text projection",
625
+ }],
626
+ message: {
627
+ id: context.requestId,
628
+ method: "session/prompt",
629
+ params: {
630
+ sessionId: event.session_id,
631
+ prompt: [{ type: "text", text: data.text }],
632
+ },
633
+ },
634
+ };
635
+ }
636
+ return {
637
+ fidelity: "unsupported",
638
+ diagnostics: [{
639
+ code: "acp_message_content_unsupported",
640
+ message: "OpenMA user.message has no ACP-compatible prompt content",
641
+ }],
642
+ };
643
+ }
644
+ export function decodeAcpSessionNotification(notification, context) {
645
+ const { update } = notification;
646
+ const envelope = {
647
+ event_id: context.eventId,
648
+ session_id: notification.sessionId,
649
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
650
+ source: sourceFor(context),
651
+ occurred_at: context.occurredAt,
652
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
653
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
654
+ };
655
+ if (update.sessionUpdate === "agent_message_chunk") {
656
+ const phase = messagePhase(update);
657
+ const metadata = adapterMeta(update);
658
+ return {
659
+ fidelity: "exact",
660
+ diagnostics: [],
661
+ event: createOpenMAEvent({
662
+ ...envelope,
663
+ type: "agent.message_chunk",
664
+ data: {
665
+ ...(update.messageId ? { message_id: update.messageId } : {}),
666
+ ...(textFromContent(update.content) !== undefined
667
+ ? { text: textFromContent(update.content) }
668
+ : {}),
669
+ content: update.content,
670
+ ...(phase ? { phase } : {}),
671
+ ...(metadata ? { adapter_meta: metadata } : {}),
672
+ },
673
+ }),
674
+ };
675
+ }
676
+ if (update.sessionUpdate === "user_message_chunk") {
677
+ const metadata = adapterMeta(update);
678
+ return {
679
+ fidelity: "exact",
680
+ diagnostics: [],
681
+ event: createOpenMAEvent({
682
+ ...envelope,
683
+ source: { ...source, kind: "user" },
684
+ type: "user.message_chunk",
685
+ data: {
686
+ ...(update.messageId ? { message_id: update.messageId } : {}),
687
+ ...(textFromContent(update.content) !== undefined
688
+ ? { text: textFromContent(update.content) }
689
+ : {}),
690
+ content: update.content,
691
+ ...(metadata ? { adapter_meta: metadata } : {}),
692
+ },
693
+ }),
694
+ };
695
+ }
696
+ if (update.sessionUpdate === "agent_thought_chunk") {
697
+ const metadata = adapterMeta(update);
698
+ return {
699
+ fidelity: "exact",
700
+ diagnostics: [],
701
+ event: createOpenMAEvent({
702
+ ...envelope,
703
+ type: "agent.thinking",
704
+ data: {
705
+ ...(update.messageId ? { message_id: update.messageId } : {}),
706
+ ...(textFromContent(update.content) !== undefined
707
+ ? { text: textFromContent(update.content) }
708
+ : {}),
709
+ content: update.content,
710
+ ...(metadata ? { adapter_meta: metadata } : {}),
711
+ },
712
+ }),
713
+ };
714
+ }
715
+ if (update.sessionUpdate === "tool_call") {
716
+ const eventType = update.status === "completed"
717
+ ? "tool.completed"
718
+ : update.status === "failed"
719
+ ? "tool.failed"
720
+ : "tool.started";
721
+ return {
722
+ fidelity: "exact",
723
+ diagnostics: [],
724
+ event: createOpenMAEvent({
725
+ ...envelope,
726
+ type: eventType,
727
+ work_item_id: update.toolCallId,
728
+ data: {
729
+ tool_call_id: update.toolCallId,
730
+ title: update.title,
731
+ ...(update.name ? { tool_name: update.name } : {}),
732
+ ...(update.kind ? { kind: update.kind } : {}),
733
+ ...(update.status ? { status: update.status } : {}),
734
+ ...(update.rawInput !== undefined ? { raw_input: update.rawInput } : {}),
735
+ ...(update.rawOutput !== undefined ? { raw_output: update.rawOutput } : {}),
736
+ ...(update.content ? { content: update.content } : {}),
737
+ ...(update.locations
738
+ ? {
739
+ locations: update.locations.map((location) => ({
740
+ path: location.path,
741
+ ...(location.line !== undefined && location.line !== null
742
+ ? { line: location.line }
743
+ : {}),
744
+ })),
745
+ }
746
+ : {}),
747
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
748
+ },
749
+ }),
750
+ };
751
+ }
752
+ if (update.sessionUpdate === "tool_call_update") {
753
+ const eventType = update.status === "completed"
754
+ ? "tool.completed"
755
+ : update.status === "failed"
756
+ ? "tool.failed"
757
+ : "tool.progress";
758
+ return {
759
+ fidelity: "exact",
760
+ diagnostics: [],
761
+ event: createOpenMAEvent({
762
+ ...envelope,
763
+ type: eventType,
764
+ work_item_id: update.toolCallId,
765
+ data: {
766
+ tool_call_id: update.toolCallId,
767
+ ...(update.title ? { title: update.title } : {}),
768
+ ...(update.name ? { tool_name: update.name } : {}),
769
+ ...(update.kind ? { kind: update.kind } : {}),
770
+ ...(update.status ? { status: update.status } : {}),
771
+ ...(update.rawInput !== undefined ? { raw_input: update.rawInput } : {}),
772
+ ...(update.rawOutput !== undefined ? { raw_output: update.rawOutput } : {}),
773
+ ...(update.content ? { content: update.content } : {}),
774
+ ...(update.locations
775
+ ? {
776
+ locations: update.locations.map((location) => ({
777
+ path: location.path,
778
+ ...(location.line !== undefined && location.line !== null
779
+ ? { line: location.line }
780
+ : {}),
781
+ })),
782
+ }
783
+ : {}),
784
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
785
+ },
786
+ }),
787
+ };
788
+ }
789
+ if (update.sessionUpdate === "plan") {
790
+ return {
791
+ fidelity: "exact",
792
+ diagnostics: [],
793
+ event: createOpenMAEvent({
794
+ ...envelope,
795
+ type: "plan.updated",
796
+ data: {
797
+ representation: "items",
798
+ update_mode: "replace",
799
+ entries: update.entries.map((entry) => ({
800
+ content: entry.content,
801
+ priority: entry.priority,
802
+ status: entry.status,
803
+ ...(entry._meta ? { adapter_meta: entry._meta } : {}),
804
+ })),
805
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
806
+ },
807
+ }),
808
+ };
809
+ }
810
+ if (update.sessionUpdate === "plan_update") {
811
+ const { plan } = update;
812
+ const data = plan.type === "items"
813
+ ? {
814
+ representation: "items",
815
+ plan_id: plan.planId,
816
+ update_mode: "replace",
817
+ entries: plan.entries.map((entry) => ({
818
+ content: entry.content,
819
+ priority: entry.priority,
820
+ status: entry.status,
821
+ ...(entry._meta ? { adapter_meta: entry._meta } : {}),
822
+ })),
823
+ }
824
+ : plan.type === "markdown"
825
+ ? {
826
+ representation: "markdown",
827
+ plan_id: plan.planId,
828
+ update_mode: "replace",
829
+ document: { id: plan.planId, markdown: plan.content },
830
+ }
831
+ : {
832
+ representation: "file",
833
+ plan_id: plan.planId,
834
+ update_mode: "replace",
835
+ document: { id: plan.planId, uri: plan.uri },
836
+ };
837
+ return {
838
+ fidelity: "exact",
839
+ diagnostics: [],
840
+ event: createOpenMAEvent({
841
+ ...envelope,
842
+ type: "plan.updated",
843
+ data: {
844
+ ...data,
845
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
846
+ },
847
+ }),
848
+ };
849
+ }
850
+ if (update.sessionUpdate === "plan_removed") {
851
+ return {
852
+ fidelity: "exact",
853
+ diagnostics: [],
854
+ event: createOpenMAEvent({
855
+ ...envelope,
856
+ type: "plan.removed",
857
+ data: {
858
+ plan_id: update.planId,
859
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
860
+ },
861
+ }),
862
+ };
863
+ }
864
+ if (update.sessionUpdate === "available_commands_update") {
865
+ return {
866
+ fidelity: "exact",
867
+ diagnostics: [],
868
+ event: createOpenMAEvent({
869
+ ...envelope,
870
+ type: "command_catalog.updated",
871
+ data: {
872
+ commands: update.availableCommands,
873
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
874
+ },
875
+ }),
876
+ };
877
+ }
878
+ if (update.sessionUpdate === "usage_update") {
879
+ return {
880
+ fidelity: "exact",
881
+ diagnostics: [],
882
+ event: createOpenMAEvent({
883
+ ...envelope,
884
+ type: "usage.updated",
885
+ data: {
886
+ usage: {
887
+ used: update.used,
888
+ size: update.size,
889
+ ...(update.cost ? { cost: update.cost } : {}),
890
+ },
891
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
892
+ },
893
+ }),
894
+ };
895
+ }
896
+ if (update.sessionUpdate === "current_mode_update") {
897
+ return {
898
+ fidelity: "exact",
899
+ diagnostics: [],
900
+ event: createOpenMAEvent({
901
+ ...envelope,
902
+ type: "capability.updated",
903
+ data: {
904
+ capability: "session.mode",
905
+ value: { current_mode_id: update.currentModeId },
906
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
907
+ },
908
+ }),
909
+ };
910
+ }
911
+ if (update.sessionUpdate === "config_option_update") {
912
+ return {
913
+ fidelity: "exact",
914
+ diagnostics: [],
915
+ event: createOpenMAEvent({
916
+ ...envelope,
917
+ type: "capability.updated",
918
+ data: {
919
+ capability: "session.config_options",
920
+ value: update.configOptions,
921
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
922
+ },
923
+ }),
924
+ };
925
+ }
926
+ if (update.sessionUpdate === "session_info_update") {
927
+ return {
928
+ fidelity: "exact",
929
+ diagnostics: [],
930
+ event: createOpenMAEvent({
931
+ ...envelope,
932
+ type: "session.updated",
933
+ data: {
934
+ ...("title" in update ? { title: update.title } : {}),
935
+ ...("updatedAt" in update ? { updated_at: update.updatedAt } : {}),
936
+ ...(update._meta ? { adapter_meta: update._meta } : {}),
937
+ },
938
+ }),
939
+ };
940
+ }
941
+ const futureUpdate = update;
942
+ const eventType = futureUpdate.sessionUpdate ?? "unknown";
943
+ return {
944
+ fidelity: "unsupported",
945
+ diagnostics: [{
946
+ code: "acp_session_update_unsupported",
947
+ message: `Unsupported ACP session update: ${eventType}`,
948
+ }],
949
+ event: createRawEvent({
950
+ ...envelope,
951
+ source_kind: "acp",
952
+ method: "session/update",
953
+ event_type: eventType,
954
+ payload: notification,
955
+ received_at: context.ingestedAt ?? context.occurredAt,
956
+ reason: "unsupported",
957
+ }),
958
+ };
959
+ }
960
+ /**
961
+ * ACP runtimes commonly expose the official SessionUpdate directly while the
962
+ * SDK codec receives a SessionNotification envelope. This is the one boundary
963
+ * adapter products use for both live transport and replay; canonical OpenMA
964
+ * events pass through untouched.
965
+ */
966
+ export function decodeAcpSessionUpdate(sessionId, input, context) {
967
+ if (isOpenMAEvent(input)) {
968
+ if (input.session_id === sessionId) {
969
+ return { fidelity: "exact", event: input, diagnostics: [] };
970
+ }
971
+ return {
972
+ fidelity: "unsupported",
973
+ diagnostics: [{
974
+ code: "openma_session_mismatch",
975
+ message: "Canonical event belongs to a different session",
976
+ }],
977
+ event: createRawEvent({
978
+ event_id: context.eventId,
979
+ session_id: sessionId,
980
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
981
+ source: sourceFor(context),
982
+ occurred_at: context.occurredAt,
983
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
984
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
985
+ source_kind: "acp",
986
+ method: "session/update",
987
+ payload: input,
988
+ received_at: context.ingestedAt ?? context.occurredAt,
989
+ reason: "malformed",
990
+ }),
991
+ };
992
+ }
993
+ const outer = isRecord(input) && isRecord(input.update) ? input.update : input;
994
+ if (!isRecord(outer)) {
995
+ return {
996
+ fidelity: "unsupported",
997
+ diagnostics: [{
998
+ code: "acp_session_update_malformed",
999
+ message: "Malformed ACP session update",
1000
+ }],
1001
+ event: createRawEvent({
1002
+ event_id: context.eventId,
1003
+ session_id: sessionId,
1004
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
1005
+ source: sourceFor(context),
1006
+ occurred_at: context.occurredAt,
1007
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
1008
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
1009
+ source_kind: "acp",
1010
+ method: "session/update",
1011
+ payload: input,
1012
+ received_at: context.ingestedAt ?? context.occurredAt,
1013
+ reason: "malformed",
1014
+ }),
1015
+ };
1016
+ }
1017
+ const parsed = parsedAcpEvent(sessionId, input, context);
1018
+ if (parsed)
1019
+ return parsed;
1020
+ const sessionUpdate = typeof outer.sessionUpdate === "string"
1021
+ ? outer.sessionUpdate
1022
+ : typeof outer.type === "string"
1023
+ ? outer.type
1024
+ : undefined;
1025
+ if (!sessionUpdate) {
1026
+ return {
1027
+ fidelity: "unsupported",
1028
+ diagnostics: [{
1029
+ code: "acp_session_update_malformed",
1030
+ message: "ACP session update has no discriminant",
1031
+ }],
1032
+ event: createRawEvent({
1033
+ event_id: context.eventId,
1034
+ session_id: sessionId,
1035
+ ...(context.turnId ? { turn_id: context.turnId } : {}),
1036
+ source: sourceFor(context),
1037
+ occurred_at: context.occurredAt,
1038
+ ...(context.ingestedAt ? { ingested_at: context.ingestedAt } : {}),
1039
+ ...(context.seq !== undefined ? { seq: context.seq } : {}),
1040
+ source_kind: "acp",
1041
+ method: "session/update",
1042
+ payload: input,
1043
+ received_at: context.ingestedAt ?? context.occurredAt,
1044
+ reason: "malformed",
1045
+ }),
1046
+ };
1047
+ }
1048
+ return decodeAcpSessionNotification({
1049
+ sessionId,
1050
+ update: {
1051
+ ...outer,
1052
+ sessionUpdate,
1053
+ },
1054
+ }, context);
1055
+ }
1056
+ //# sourceMappingURL=index.js.map