agent-log-server 0.2.122__py3-none-android_24_arm64_v8a.whl

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 (256) hide show
  1. agent_log_server-0.2.122.dist-info/METADATA +186 -0
  2. agent_log_server-0.2.122.dist-info/RECORD +256 -0
  3. agent_log_server-0.2.122.dist-info/WHEEL +5 -0
  4. agent_log_server-0.2.122.dist-info/entry_points.txt +4 -0
  5. agent_log_server-0.2.122.dist-info/licenses/LICENSE +649 -0
  6. agent_log_server-0.2.122.dist-info/top_level.txt +6 -0
  7. agent_log_server_rs/DEVELOPER_MESSAGE_TEMPLATE.md +517 -0
  8. agent_log_server_rs/__init__.py +1 -0
  9. agent_log_server_rs/adapter_protocol.py +548 -0
  10. agent_log_server_rs/adapters/__init__.py +1 -0
  11. agent_log_server_rs/adapters/embedded_adapter.py +157 -0
  12. agent_log_server_rs/adapters/extension_adapter.py +1925 -0
  13. agent_log_server_rs/adapters/rpc_common.py +137 -0
  14. agent_log_server_rs/bin/als-server +0 -0
  15. agent_log_server_rs/bin/als-server.manifest.json +10 -0
  16. agent_log_server_rs/bootstrap.py +706 -0
  17. agent_log_server_rs/codec.py +85 -0
  18. agent_log_server_rs/extension_cli.py +520 -0
  19. agent_log_server_rs/rust/crates/als-server/src/static/app.js +151 -0
  20. agent_log_server_rs/rust/crates/als-server/src/static/appserver.css +240 -0
  21. agent_log_server_rs/rust/crates/als-server/src/static/appserver.js +208 -0
  22. agent_log_server_rs/rust/crates/als-server/src/static/codex_agent.css +4024 -0
  23. agent_log_server_rs/rust/crates/als-server/src/static/codex_agent.ts +2610 -0
  24. agent_log_server_rs/rust/crates/als-server/src/static/codexas-icon.svg +5 -0
  25. agent_log_server_rs/rust/crates/als-server/src/static/dist/codex_agent.js +26 -0
  26. agent_log_server_rs/rust/crates/als-server/src/static/dist/codex_agent.js.map +7 -0
  27. agent_log_server_rs/rust/crates/als-server/src/static/images/green-right-arrow.png +0 -0
  28. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/approvals/ui.ts +949 -0
  29. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/assistant_stream.ts +165 -0
  30. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/boot/init_flow.ts +341 -0
  31. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/boot/input_flow.ts +592 -0
  32. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/client_identity.ts +10 -0
  33. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/composer/runtime.ts +1065 -0
  34. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/conversation/runtime.ts +345 -0
  35. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/conversation_drawer/actions.ts +523 -0
  36. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/conversation_drawer/index.ts +100 -0
  37. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/conversation_drawer/list.ts +966 -0
  38. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/conversation_drawer.ts +1 -0
  39. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/conversation_modal.ts +147 -0
  40. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/diff/rendering.ts +857 -0
  41. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/events/router.ts +779 -0
  42. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/events/socket.ts +140 -0
  43. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/host/runtime.ts +357 -0
  44. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/layout/viewport.ts +95 -0
  45. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/layout/widescreen.ts +168 -0
  46. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/markdown.ts +576 -0
  47. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/orchestrator/rpc_flow.ts +73 -0
  48. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/orchestrator/session_flow.ts +191 -0
  49. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/path_label.ts +76 -0
  50. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/plan/runtime.ts +446 -0
  51. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/plan_modal.ts +102 -0
  52. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/plan_overlay.ts +235 -0
  53. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/project_modal.ts +1398 -0
  54. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/render/utils.ts +456 -0
  55. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/request_cards/runtime.ts +236 -0
  56. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/conversations/client.ts +1021 -0
  57. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/conversations/contract.ts +406 -0
  58. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/namespaces.ts +18 -0
  59. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/registry.ts +113 -0
  60. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/settings/client.ts +662 -0
  61. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/settings/contract.ts +49 -0
  62. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/transport.ts +463 -0
  63. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/ui/client.ts +588 -0
  64. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/rpc/ui/contract.ts +50 -0
  65. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/runtime_footer.ts +373 -0
  66. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/settings/runtime_helpers.ts +20 -0
  67. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/settings/save_flow.ts +332 -0
  68. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/settings/ui_flow.ts +1148 -0
  69. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/shared_types.ts +61 -0
  70. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/shell_render.ts +377 -0
  71. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/shell_semantic.ts +606 -0
  72. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/subagents/collapsible.ts +224 -0
  73. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/terminal_ansi.ts +134 -0
  74. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/timeline/live_items.ts +594 -0
  75. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/timeline/replay.ts +820 -0
  76. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/timeline/rows.ts +290 -0
  77. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/timeline/virtualizer.ts +1123 -0
  78. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/timeline_sticky_headers.ts +492 -0
  79. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/tool_render.ts +789 -0
  80. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_card_metadata.ts +228 -0
  81. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_cards.ts +780 -0
  82. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_config.ts +10 -0
  83. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_loader.ts +511 -0
  84. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_metrics.ts +28 -0
  85. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_stream.ts +561 -0
  86. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/transcript_stream_url.ts +7 -0
  87. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/vendor_modules.d.ts +5 -0
  88. agent_log_server_rs/rust/crates/als-server/src/static/js/codex_agent/vendor_runtime.ts +106 -0
  89. agent_log_server_rs/rust/crates/als-server/src/static/js/console_bridge.js +229 -0
  90. agent_log_server_rs/rust/crates/als-server/src/static/js/socketio_runtime.js +27 -0
  91. agent_log_server_rs/rust/crates/als-server/src/static/modals/rollout_picker.ts +46 -0
  92. agent_log_server_rs/rust/crates/als-server/src/static/modals/settings_modal.ts +63 -0
  93. agent_log_server_rs/rust/crates/als-server/src/static/modals/settings_schema.ts +3666 -0
  94. agent_log_server_rs/rust/crates/als-server/src/static/modals/warning_modal.ts +65 -0
  95. agent_log_server_rs/rust/crates/als-server/src/static/style.css +194 -0
  96. agent_log_server_rs/rust/crates/als-server/src/static/ui/extension_settings.ts +493 -0
  97. agent_log_server_rs/rust/crates/als-server/src/static/ui/splash_settings.ts +41 -0
  98. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-400-italic.woff2 +0 -0
  99. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-400-normal.woff2 +0 -0
  100. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-500-italic.woff2 +0 -0
  101. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-500-normal.woff2 +0 -0
  102. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-600-italic.woff2 +0 -0
  103. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-600-normal.woff2 +0 -0
  104. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-700-italic.woff2 +0 -0
  105. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-700-normal.woff2 +0 -0
  106. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-400-italic.woff2 +0 -0
  107. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-400-normal.woff2 +0 -0
  108. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-500-italic.woff2 +0 -0
  109. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-500-normal.woff2 +0 -0
  110. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-600-italic.woff2 +0 -0
  111. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-600-normal.woff2 +0 -0
  112. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-700-italic.woff2 +0 -0
  113. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext-700-normal.woff2 +0 -0
  114. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-400-italic.woff2 +0 -0
  115. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-400-normal.woff2 +0 -0
  116. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-500-italic.woff2 +0 -0
  117. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-500-normal.woff2 +0 -0
  118. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-600-italic.woff2 +0 -0
  119. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-600-normal.woff2 +0 -0
  120. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-700-italic.woff2 +0 -0
  121. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-greek-700-normal.woff2 +0 -0
  122. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-400-italic.woff2 +0 -0
  123. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-400-normal.woff2 +0 -0
  124. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-500-italic.woff2 +0 -0
  125. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-500-normal.woff2 +0 -0
  126. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-600-italic.woff2 +0 -0
  127. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-600-normal.woff2 +0 -0
  128. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-700-italic.woff2 +0 -0
  129. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-700-normal.woff2 +0 -0
  130. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-400-italic.woff2 +0 -0
  131. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-400-normal.woff2 +0 -0
  132. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-500-italic.woff2 +0 -0
  133. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-500-normal.woff2 +0 -0
  134. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-600-italic.woff2 +0 -0
  135. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-600-normal.woff2 +0 -0
  136. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-700-italic.woff2 +0 -0
  137. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-latin-ext-700-normal.woff2 +0 -0
  138. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-400-italic.woff2 +0 -0
  139. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-400-normal.woff2 +0 -0
  140. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-500-italic.woff2 +0 -0
  141. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-500-normal.woff2 +0 -0
  142. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-600-italic.woff2 +0 -0
  143. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-600-normal.woff2 +0 -0
  144. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-700-italic.woff2 +0 -0
  145. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono/jetbrains-mono-vietnamese-700-normal.woff2 +0 -0
  146. agent_log_server_rs/rust/crates/als-server/src/static/vendor/fonts/jetbrains-mono.css +481 -0
  147. agent_log_server_rs/rust/crates/als-server/src/static/vendor/socket.io/socket.io.min.js +7 -0
  148. agent_log_server_rs/rust/crates/als-server/src/static/vendor/socket.io-msgpack-parser/socket.io-msgpack-parser.js +2 -0
  149. agent_log_server_rs/rust/crates/als-server/src/static/vendor/socket.io-msgpack-parser/socket.io-msgpack-parser.js.map +7 -0
  150. agent_log_server_rs/rust/crates/als-server/src/static/vendor/tree-sitter-bash/highlights.scm +56 -0
  151. agent_log_server_rs/rust/crates/als-server/src/static/vendor/tree-sitter-bash/tree-sitter-bash.wasm +0 -0
  152. agent_log_server_rs/rust/crates/als-server/src/static/vendor/web-tree-sitter/tree-sitter.js +3278 -0
  153. agent_log_server_rs/rust/crates/als-server/src/static/vendor/web-tree-sitter/tree-sitter.wasm +0 -0
  154. agent_log_server_rs/rust/crates/als-server/src/static/vendor/web-tree-sitter/web-tree-sitter.js +4007 -0
  155. agent_log_server_rs/rust/crates/als-server/src/static/vendor/web-tree-sitter/web-tree-sitter.wasm +0 -0
  156. agent_log_server_rs/shellspec/extension_adapter.yaml +15 -0
  157. agent_log_server_rs/tests/test_bootstrap.py +435 -0
  158. agent_log_server_rs/tests/test_codec.py +97 -0
  159. agent_log_server_rs/tests/test_codex_ext_client_resume.py +37 -0
  160. agent_log_server_rs/tests/test_codex_ext_router_atomic_diff.py +221 -0
  161. agent_log_server_rs/tests/test_codex_ext_runtime_protocol.py +109 -0
  162. agent_log_server_rs/tests/test_codex_ext_transport_resume.py +190 -0
  163. agent_log_server_rs/tests/test_extension_adapter_dispatch.py +170 -0
  164. agent_log_server_rs/tests/test_kb_and_codex_search.py +415 -0
  165. agent_log_server_rs/tests/test_mcp_socketio_serializer.py +53 -0
  166. agent_log_server_rs/tests/test_release_binary_wheel.py +119 -0
  167. als_deprecated/__init__.py +2 -0
  168. als_deprecated/__main__.py +5 -0
  169. als_deprecated/agent_log_subsystem.py +276 -0
  170. als_deprecated/agent_pty_http_shim_lifecycle.py +171 -0
  171. als_deprecated/appserver_routes.py +1930 -0
  172. als_deprecated/appserver_socketio.py +1223 -0
  173. als_deprecated/ask_user_interactions.py +415 -0
  174. als_deprecated/conversation_store.py +279 -0
  175. als_deprecated/conversation_todos.py +271 -0
  176. als_deprecated/conversations_rpc_contract.py +849 -0
  177. als_deprecated/extension_api.py +1041 -0
  178. als_deprecated/extension_cli.py +347 -0
  179. als_deprecated/host_routes.py +493 -0
  180. als_deprecated/index.py +30 -0
  181. als_deprecated/ipc_auth.py +36 -0
  182. als_deprecated/markdown_sections.py +141 -0
  183. als_deprecated/mcp_agent_pty_http_shim.py +30 -0
  184. als_deprecated/page_routes.py +71 -0
  185. als_deprecated/pending_context.py +671 -0
  186. als_deprecated/prompt_context.py +165 -0
  187. als_deprecated/repo_memory_delta.py +126 -0
  188. als_deprecated/rpc_stdio_mirror.py +134 -0
  189. als_deprecated/server.py +2004 -0
  190. als_deprecated/settings_ui_rpc_contract.py +311 -0
  191. als_deprecated/shellspec/agent_log.yaml +13 -0
  192. als_deprecated/shellspec/mcp_agent_pty.yaml +54 -0
  193. als_deprecated/socketio_config.py +53 -0
  194. als_deprecated/te2_assets/console_bridge.js +208 -0
  195. als_deprecated/te2_assets/framework_shells_README.md +448 -0
  196. als_deprecated/te2_assets/proxy_shell_wrapper_README.md +18 -0
  197. als_deprecated/te2_mcp_config.py +83 -0
  198. als_deprecated/te2_runtime.py +35 -0
  199. als_deprecated/te2_sync.py +78 -0
  200. als_deprecated/templates/template.html +46 -0
  201. als_deprecated/transcript_card_metadata.py +211 -0
  202. als_deprecated/typing_helpers.py +26 -0
  203. als_deprecated/web_pages.py +770 -0
  204. extensions/__init__.py +3107 -0
  205. extensions/codex_ext/__init__.py +1 -0
  206. extensions/codex_ext/client.py +1843 -0
  207. extensions/codex_ext/dependencies.py +143 -0
  208. extensions/codex_ext/devins_contract.py +25 -0
  209. extensions/codex_ext/manifest.json +138 -0
  210. extensions/codex_ext/mcp_contract.py +183 -0
  211. extensions/codex_ext/plan_utils.py +74 -0
  212. extensions/codex_ext/rollout_import.py +204 -0
  213. extensions/codex_ext/router.py +3772 -0
  214. extensions/codex_ext/runtime_protocol.py +1699 -0
  215. extensions/codex_ext/settings_schema.json +172 -0
  216. extensions/codex_ext/shellspec/app_server.yaml +19 -0
  217. extensions/codex_ext/transport.py +1412 -0
  218. extensions/codex_ext/ui/request_cards/codex_ext_request_card.js +882 -0
  219. extensions/copilot_sdk/VENDORED_SDK.md +17 -0
  220. extensions/copilot_sdk/__init__.py +2 -0
  221. extensions/copilot_sdk/_vendor/__init__.py +1 -0
  222. extensions/copilot_sdk/_vendor/copilot/__init__.py +80 -0
  223. extensions/copilot_sdk/_vendor/copilot/_diagnostics.py +29 -0
  224. extensions/copilot_sdk/_vendor/copilot/_jsonrpc.py +442 -0
  225. extensions/copilot_sdk/_vendor/copilot/_sdk_protocol_version.py +19 -0
  226. extensions/copilot_sdk/_vendor/copilot/_telemetry.py +48 -0
  227. extensions/copilot_sdk/_vendor/copilot/client.py +3157 -0
  228. extensions/copilot_sdk/_vendor/copilot/generated/__init__.py +0 -0
  229. extensions/copilot_sdk/_vendor/copilot/generated/rpc.py +7149 -0
  230. extensions/copilot_sdk/_vendor/copilot/generated/session_events.py +5009 -0
  231. extensions/copilot_sdk/_vendor/copilot/py.typed +1 -0
  232. extensions/copilot_sdk/_vendor/copilot/session.py +2415 -0
  233. extensions/copilot_sdk/_vendor/copilot/session_fs_provider.py +223 -0
  234. extensions/copilot_sdk/_vendor/copilot/tools.py +327 -0
  235. extensions/copilot_sdk/client.py +3871 -0
  236. extensions/copilot_sdk/dependencies.py +108 -0
  237. extensions/copilot_sdk/devins_contract.py +25 -0
  238. extensions/copilot_sdk/file_change_preview.py +80 -0
  239. extensions/copilot_sdk/fws_pipe_process.py +382 -0
  240. extensions/copilot_sdk/manifest.json +135 -0
  241. extensions/copilot_sdk/mcp_contract.py +63 -0
  242. extensions/copilot_sdk/plan_utils.py +56 -0
  243. extensions/copilot_sdk/protocol_adapter.py +342 -0
  244. extensions/copilot_sdk/protocol_registry.py +149 -0
  245. extensions/copilot_sdk/router.py +1789 -0
  246. extensions/copilot_sdk/schemas/api.schema.json +1063 -0
  247. extensions/copilot_sdk/schemas/session-events.schema.json +6369 -0
  248. extensions/copilot_sdk/settings_schema.json +165 -0
  249. extensions/copilot_sdk/shellspec/copilot_cli.yaml +20 -0
  250. extensions/copilot_sdk/te2_runtime.py +78 -0
  251. extensions/copilot_sdk/ui/request_cards/copilot_request_card.js +449 -0
  252. extensions/extensions.json +19 -0
  253. extensions/message_card_contracts.py +213 -0
  254. extensions/tool_card_contracts.py +102 -0
  255. mcp_agent_pty_http_shim.py +321 -0
  256. mcp_agent_pty_server.py +2931 -0
@@ -0,0 +1,548 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass, field
4
+ from enum import StrEnum
5
+ from pathlib import Path
6
+ from typing import TypeAlias
7
+
8
+ JsonMap: TypeAlias = dict[str, object]
9
+
10
+ ADAPTER_PROTOCOL_VERSION = "0.1.0"
11
+
12
+
13
+ def _put_optional(payload: JsonMap, key: str, value: object | None) -> None:
14
+ if value is not None:
15
+ payload[key] = value
16
+
17
+
18
+ class AdapterMethod(StrEnum):
19
+ EXTENSION_INITIALIZE = "extension.initialize"
20
+ EXTENSION_SHUTDOWN = "extension.shutdown"
21
+ EXTENSION_RELOAD = "extension.reload"
22
+ EXTENSION_INSTALL_DEPENDENCIES = "extension.install_dependencies"
23
+ EXTENSION_PACKAGE_VALIDATE = "extension.package.validate"
24
+ EXTENSION_PACKAGE_INSTALL = "extension.package.install"
25
+ EXTENSION_PACKAGE_UPDATE = "extension.package.update"
26
+ EXTENSION_PACKAGE_REMOVE = "extension.package.remove"
27
+ EXTENSION_DEBUG_PROBE = "extension.debug_probe"
28
+ EXTENSION_WARM_UP = "extension.warm_up"
29
+ EXTENSION_GET_SPLASH_SCHEMA = "extension.get_splash_schema"
30
+ EXTENSION_GET_RUNTIME_OPTIONS = "extension.get_runtime_options"
31
+ EXTENSION_GET_PROVIDER_INFO = "extension.get_provider_info"
32
+ EXTENSION_GET_PLAN = "extension.get_plan"
33
+ EXTENSION_SCHEMA_INTERACTION_RUN = "extension.schema_interaction.run"
34
+ EXTENSION_LIST_MODELS = "extension.list_models"
35
+ EXTENSION_LIST_SESSIONS = "extension.list_sessions"
36
+ EXTENSION_SESSION_STATE_GET = "extension.session.state.get"
37
+ EXTENSION_SESSION_UNLOAD = "extension.session.unload"
38
+ CONVERSATION_START = "conversation.start"
39
+ CONVERSATION_RESUME = "conversation.resume"
40
+ CONVERSATION_FORK = "conversation.fork"
41
+ CONVERSATION_SEND = "conversation.send"
42
+ CONVERSATION_INTERRUPT = "conversation.interrupt"
43
+ CONVERSATION_COMPACT = "conversation.compact"
44
+ APPROVAL_RESPOND = "approval.respond"
45
+
46
+
47
+ class AdapterEventMethod(StrEnum):
48
+ LIVE_EVENT = "event.live"
49
+ TRANSCRIPT_RECORD = "event.transcript_record"
50
+ IMPORT_STARTED = "event.import_started"
51
+ IMPORT_PROGRESS = "event.import_progress"
52
+ IMPORT_TRANSCRIPT_BATCH = "event.import_transcript_batch"
53
+ IMPORT_COMPLETED = "event.import_completed"
54
+ IMPORT_FAILED = "event.import_failed"
55
+ STATUS = "event.status"
56
+ USER_MESSAGE = "event.user_message"
57
+ ASSISTANT_DELTA = "event.assistant_delta"
58
+ ASSISTANT_FINALIZE = "event.assistant_finalize"
59
+ REASONING_DELTA = "event.reasoning_delta"
60
+ REASONING_FINALIZE = "event.reasoning_finalize"
61
+ TOOL_BEGIN = "event.tool_begin"
62
+ TOOL_DELTA = "event.tool_delta"
63
+ TOOL_END = "event.tool_end"
64
+ SHELL_BEGIN = "event.shell_begin"
65
+ SHELL_DELTA = "event.shell_delta"
66
+ SHELL_END = "event.shell_end"
67
+ APPROVAL_REQUEST = "event.approval_request"
68
+ TOKEN_USAGE = "event.token_usage"
69
+ ERROR = "event.error"
70
+ WARNING = "event.warning"
71
+
72
+
73
+ class AdapterLiveEventType(StrEnum):
74
+ MESSAGE = "message"
75
+ ASSISTANT_DELTA = "assistant_delta"
76
+ ASSISTANT_FINALIZE = "assistant_finalize"
77
+ REASONING_DELTA = "reasoning_delta"
78
+ REASONING_FINALIZE = "reasoning_finalize"
79
+ THOUGHT = "thought"
80
+ TOOL_INTERACTION = "tool_interaction"
81
+ TOOL_BEGIN = "tool_begin"
82
+ TOOL_DELTA = "tool_delta"
83
+ TOOL_END = "tool_end"
84
+ SHELL_BEGIN = "shell_begin"
85
+ SHELL_DELTA = "shell_delta"
86
+ SHELL_END = "shell_end"
87
+ COMMAND_RESULT = "command_result"
88
+ DIFF = "diff"
89
+ ERROR = "error"
90
+ WARNING = "warning"
91
+ STATUS = "status"
92
+ TOKEN_COUNT = "token_count"
93
+ APPROVAL = "approval"
94
+ APPROVAL_HANDOFF = "approval_handoff"
95
+ PLAN = "plan"
96
+ PLAN_STATE = "plan_state"
97
+ PLAN_UPDATE = "plan_update"
98
+ SUBAGENT_START = "subagent_start"
99
+ SUBAGENT_END = "subagent_end"
100
+ SEARCH = "search"
101
+ VIEW = "view"
102
+ ACTIVITY = "activity"
103
+
104
+
105
+ class AdapterTranscriptRole(StrEnum):
106
+ USER = "user"
107
+ ASSISTANT = "assistant"
108
+ REASONING = "reasoning"
109
+ COMMAND = "command"
110
+ VIEW = "view"
111
+ SEARCH = "search"
112
+ DIFF = "diff"
113
+ ERROR = "error"
114
+ TOKEN_USAGE = "token_usage"
115
+ CONTEXT_COMPACTED = "context_compacted"
116
+ TOOL = "tool"
117
+ MCP_TOOL = "mcp_tool"
118
+ WEB_SEARCH = "web_search"
119
+ DEBUG_RAW = "debug_raw"
120
+
121
+
122
+ @dataclass(frozen=True)
123
+ class AdapterCapabilities:
124
+ conversations: bool = False
125
+ models: bool = False
126
+ sessions: bool = False
127
+ approvals: bool = False
128
+ compaction: bool = False
129
+ interruption: bool = False
130
+ conversation_fork: bool = False
131
+ live_events: bool = False
132
+ transcript_records: bool = False
133
+ extra: JsonMap = field(default_factory=dict)
134
+
135
+ def to_json(self) -> JsonMap:
136
+ payload: JsonMap = {
137
+ "conversations": self.conversations,
138
+ "models": self.models,
139
+ "sessions": self.sessions,
140
+ "approvals": self.approvals,
141
+ "compaction": self.compaction,
142
+ "interruption": self.interruption,
143
+ "conversation_fork": self.conversation_fork,
144
+ "live_events": self.live_events,
145
+ "transcript_records": self.transcript_records,
146
+ }
147
+ if self.extra:
148
+ payload["extra"] = dict(self.extra)
149
+ return payload
150
+
151
+
152
+ @dataclass(frozen=True)
153
+ class ExtensionInitializeParams:
154
+ extension_id: str
155
+ cwd: Path
156
+ data_dir: Path
157
+ cache_dir: Path
158
+ config_dir: Path
159
+ extensions_dir: Path | None = None
160
+ extensions_dirs: list[Path] = field(default_factory=list)
161
+ settings: JsonMap = field(default_factory=dict)
162
+
163
+ def to_json(self) -> JsonMap:
164
+ payload: JsonMap = {
165
+ "extension_id": self.extension_id,
166
+ "cwd": str(self.cwd),
167
+ "data_dir": str(self.data_dir),
168
+ "cache_dir": str(self.cache_dir),
169
+ "config_dir": str(self.config_dir),
170
+ }
171
+ if self.extensions_dir:
172
+ payload["extensions_dir"] = str(self.extensions_dir)
173
+ if self.extensions_dirs:
174
+ payload["extensions_dirs"] = [str(path) for path in self.extensions_dirs]
175
+ if self.settings:
176
+ payload["settings"] = dict(self.settings)
177
+ return payload
178
+
179
+
180
+ @dataclass(frozen=True)
181
+ class ExtensionInitializeResult:
182
+ extension_id: str
183
+ capabilities: AdapterCapabilities
184
+ provider: str | None = None
185
+ protocol_version: str = ADAPTER_PROTOCOL_VERSION
186
+
187
+ def to_json(self) -> JsonMap:
188
+ payload: JsonMap = {
189
+ "extension_id": self.extension_id,
190
+ "protocol_version": self.protocol_version,
191
+ "capabilities": self.capabilities.to_json(),
192
+ }
193
+ if self.provider:
194
+ payload["provider"] = self.provider
195
+ return payload
196
+
197
+
198
+ @dataclass(frozen=True)
199
+ class AdapterModelInfo:
200
+ id: str
201
+ name: str | None = None
202
+ context_window: int | None = None
203
+ supported_reasoning_efforts: list[str] = field(default_factory=list)
204
+ capabilities: JsonMap = field(default_factory=dict)
205
+ raw: object | None = None
206
+
207
+ def to_json(self) -> JsonMap:
208
+ payload: JsonMap = {"id": self.id}
209
+ if self.name:
210
+ payload["name"] = self.name
211
+ if self.context_window is not None:
212
+ payload["context_window"] = self.context_window
213
+ if self.supported_reasoning_efforts:
214
+ payload["supported_reasoning_efforts"] = list(self.supported_reasoning_efforts)
215
+ if self.capabilities:
216
+ payload["capabilities"] = dict(self.capabilities)
217
+ if self.raw is not None:
218
+ payload["raw"] = self.raw
219
+ return payload
220
+
221
+
222
+ @dataclass(frozen=True)
223
+ class AdapterSessionInfo:
224
+ id: str
225
+ label: str | None = None
226
+ cwd: Path | None = None
227
+ created_at: str | None = None
228
+ updated_at: str | None = None
229
+ metadata: JsonMap = field(default_factory=dict)
230
+
231
+ def to_json(self) -> JsonMap:
232
+ payload: JsonMap = {"id": self.id}
233
+ if self.label:
234
+ payload["label"] = self.label
235
+ if self.cwd is not None:
236
+ payload["cwd"] = str(self.cwd)
237
+ if self.created_at:
238
+ payload["created_at"] = self.created_at
239
+ if self.updated_at:
240
+ payload["updated_at"] = self.updated_at
241
+ if self.metadata:
242
+ payload["metadata"] = dict(self.metadata)
243
+ return payload
244
+
245
+
246
+ @dataclass(frozen=True)
247
+ class McpContext:
248
+ conversation_id: str
249
+ cwd: Path | None = None
250
+ requested_servers: JsonMap = field(default_factory=dict)
251
+ defaults: JsonMap = field(default_factory=dict)
252
+
253
+ def to_json(self) -> JsonMap:
254
+ payload: JsonMap = {"conversation_id": self.conversation_id}
255
+ if self.cwd is not None:
256
+ payload["cwd"] = str(self.cwd)
257
+ if self.requested_servers:
258
+ payload["requested_servers"] = dict(self.requested_servers)
259
+ if self.defaults:
260
+ payload["defaults"] = dict(self.defaults)
261
+ return payload
262
+
263
+
264
+ @dataclass(frozen=True)
265
+ class DeveloperInstructionsContext:
266
+ effective: str | None = None
267
+ user: str | None = None
268
+ te2_enabled: bool = False
269
+ cwd: Path | None = None
270
+ template_path: Path | None = None
271
+ repo_root: Path | None = None
272
+ repo_memory_path: Path | None = None
273
+ repo_memory_exists: bool = False
274
+ repo_memory_truncated: bool = False
275
+
276
+ def to_json(self) -> JsonMap:
277
+ payload: JsonMap = {"te2_enabled": self.te2_enabled}
278
+ _put_optional(payload, "effective", self.effective)
279
+ _put_optional(payload, "user", self.user)
280
+ if self.cwd is not None:
281
+ payload["cwd"] = str(self.cwd)
282
+ if self.template_path is not None:
283
+ payload["template_path"] = str(self.template_path)
284
+ if self.repo_root is not None:
285
+ payload["repo_root"] = str(self.repo_root)
286
+ if self.repo_memory_path is not None:
287
+ payload["repo_memory_path"] = str(self.repo_memory_path)
288
+ payload["repo_memory_exists"] = self.repo_memory_exists
289
+ payload["repo_memory_truncated"] = self.repo_memory_truncated
290
+ return payload
291
+
292
+
293
+ @dataclass(frozen=True)
294
+ class ConversationStartParams:
295
+ extension_id: str
296
+ conversation_id: str
297
+ cwd: Path | None = None
298
+ settings: JsonMap = field(default_factory=dict)
299
+ mcp_context: McpContext | None = None
300
+ devins_context: DeveloperInstructionsContext | None = None
301
+
302
+ def to_json(self) -> JsonMap:
303
+ payload: JsonMap = {
304
+ "extension_id": self.extension_id,
305
+ "conversation_id": self.conversation_id,
306
+ }
307
+ if self.cwd is not None:
308
+ payload["cwd"] = str(self.cwd)
309
+ if self.settings:
310
+ payload["settings"] = dict(self.settings)
311
+ if self.mcp_context is not None:
312
+ payload["mcp_context"] = self.mcp_context.to_json()
313
+ if self.devins_context is not None:
314
+ payload["devins_context"] = self.devins_context.to_json()
315
+ return payload
316
+
317
+
318
+ @dataclass(frozen=True)
319
+ class ConversationResumeParams:
320
+ extension_id: str
321
+ conversation_id: str
322
+ provider_session_id: str
323
+ hydrate_transcript: bool = False
324
+ cwd: Path | None = None
325
+ settings: JsonMap = field(default_factory=dict)
326
+ mcp_context: McpContext | None = None
327
+ devins_context: DeveloperInstructionsContext | None = None
328
+
329
+ def to_json(self) -> JsonMap:
330
+ payload: JsonMap = {
331
+ "extension_id": self.extension_id,
332
+ "conversation_id": self.conversation_id,
333
+ "provider_session_id": self.provider_session_id,
334
+ "hydrate_transcript": self.hydrate_transcript,
335
+ }
336
+ if self.cwd is not None:
337
+ payload["cwd"] = str(self.cwd)
338
+ if self.settings:
339
+ payload["settings"] = dict(self.settings)
340
+ if self.mcp_context is not None:
341
+ payload["mcp_context"] = self.mcp_context.to_json()
342
+ if self.devins_context is not None:
343
+ payload["devins_context"] = self.devins_context.to_json()
344
+ return payload
345
+
346
+
347
+ @dataclass(frozen=True)
348
+ class ConversationForkParams:
349
+ extension_id: str
350
+ source_conversation_id: str
351
+ conversation_id: str
352
+ provider_session_id: str
353
+ cwd: Path | None = None
354
+ settings: JsonMap = field(default_factory=dict)
355
+ mcp_context: McpContext | None = None
356
+ devins_context: DeveloperInstructionsContext | None = None
357
+ metadata: JsonMap = field(default_factory=dict)
358
+
359
+ def to_json(self) -> JsonMap:
360
+ payload: JsonMap = {
361
+ "extension_id": self.extension_id,
362
+ "source_conversation_id": self.source_conversation_id,
363
+ "conversation_id": self.conversation_id,
364
+ "provider_session_id": self.provider_session_id,
365
+ }
366
+ if self.cwd is not None:
367
+ payload["cwd"] = str(self.cwd)
368
+ if self.settings:
369
+ payload["settings"] = dict(self.settings)
370
+ if self.mcp_context is not None:
371
+ payload["mcp_context"] = self.mcp_context.to_json()
372
+ if self.devins_context is not None:
373
+ payload["devins_context"] = self.devins_context.to_json()
374
+ if self.metadata:
375
+ payload["metadata"] = dict(self.metadata)
376
+ return payload
377
+
378
+
379
+ @dataclass(frozen=True)
380
+ class ConversationSendParams:
381
+ extension_id: str
382
+ conversation_id: str
383
+ text: str
384
+ thread_id: str | None = None
385
+ provider_session_id: str | None = None
386
+ turn_id: str | None = None
387
+ cwd: Path | None = None
388
+ attachments: list[JsonMap] = field(default_factory=list)
389
+ settings: JsonMap = field(default_factory=dict)
390
+ mcp_context: McpContext | None = None
391
+ devins_context: DeveloperInstructionsContext | None = None
392
+
393
+ def to_json(self) -> JsonMap:
394
+ payload: JsonMap = {
395
+ "extension_id": self.extension_id,
396
+ "conversation_id": self.conversation_id,
397
+ "text": self.text,
398
+ }
399
+ if self.thread_id:
400
+ payload["thread_id"] = self.thread_id
401
+ if self.provider_session_id:
402
+ payload["provider_session_id"] = self.provider_session_id
403
+ if self.turn_id:
404
+ payload["turn_id"] = self.turn_id
405
+ if self.cwd:
406
+ payload["cwd"] = str(self.cwd)
407
+ if self.attachments:
408
+ payload["attachments"] = [dict(item) for item in self.attachments]
409
+ if self.settings:
410
+ payload["settings"] = dict(self.settings)
411
+ if self.mcp_context is not None:
412
+ payload["mcp_context"] = self.mcp_context.to_json()
413
+ if self.devins_context is not None:
414
+ payload["devins_context"] = self.devins_context.to_json()
415
+ return payload
416
+
417
+
418
+ @dataclass(frozen=True)
419
+ class ConversationAckResult:
420
+ conversation_id: str
421
+ accepted: bool
422
+ provider_session_id: str | None = None
423
+ provider_call_id: str | None = None
424
+ turn_id: str | None = None
425
+ restore_draft: bool = False
426
+ metadata: JsonMap = field(default_factory=dict)
427
+
428
+ def to_json(self) -> JsonMap:
429
+ payload: JsonMap = {
430
+ "conversation_id": self.conversation_id,
431
+ "ok": self.accepted,
432
+ "accepted": self.accepted,
433
+ "restore_draft": self.restore_draft,
434
+ }
435
+ if self.provider_session_id:
436
+ payload["provider_session_id"] = self.provider_session_id
437
+ if self.provider_call_id:
438
+ payload["provider_call_id"] = self.provider_call_id
439
+ if self.turn_id:
440
+ payload["turn_id"] = self.turn_id
441
+ if self.metadata:
442
+ payload["metadata"] = dict(self.metadata)
443
+ return payload
444
+
445
+
446
+ @dataclass(frozen=True)
447
+ class ConversationControlParams:
448
+ extension_id: str
449
+ conversation_id: str
450
+
451
+ def to_json(self) -> JsonMap:
452
+ return {
453
+ "extension_id": self.extension_id,
454
+ "conversation_id": self.conversation_id,
455
+ }
456
+
457
+
458
+ @dataclass(frozen=True)
459
+ class ConversationControlResult:
460
+ extension_id: str
461
+ conversation_id: str
462
+ ok: bool
463
+ error: str | None = None
464
+ metadata: JsonMap = field(default_factory=dict)
465
+
466
+ def to_json(self) -> JsonMap:
467
+ payload: JsonMap = {
468
+ "extension_id": self.extension_id,
469
+ "conversation_id": self.conversation_id,
470
+ "ok": self.ok,
471
+ }
472
+ if self.error:
473
+ payload["error"] = self.error
474
+ if self.metadata:
475
+ payload["metadata"] = dict(self.metadata)
476
+ return payload
477
+
478
+
479
+ @dataclass(frozen=True)
480
+ class AdapterLiveEvent:
481
+ type: AdapterLiveEventType
482
+ conversation_id: str | None = None
483
+ id: str | None = None
484
+ turn_id: str | None = None
485
+ subagent_id: str | None = None
486
+ role: str | None = None
487
+ text: str | None = None
488
+ delta: str | None = None
489
+ message: str | None = None
490
+ path: Path | None = None
491
+ line: int | None = None
492
+ column: int | None = None
493
+ timestamp: str | None = None
494
+ extra: JsonMap = field(default_factory=dict)
495
+
496
+ def to_json(self) -> JsonMap:
497
+ payload: JsonMap = {"type": self.type.value}
498
+ _put_optional(payload, "conversation_id", self.conversation_id)
499
+ _put_optional(payload, "id", self.id)
500
+ _put_optional(payload, "turn_id", self.turn_id)
501
+ _put_optional(payload, "subagent_id", self.subagent_id)
502
+ _put_optional(payload, "role", self.role)
503
+ _put_optional(payload, "text", self.text)
504
+ _put_optional(payload, "delta", self.delta)
505
+ _put_optional(payload, "message", self.message)
506
+ _put_optional(payload, "line", self.line)
507
+ _put_optional(payload, "column", self.column)
508
+ _put_optional(payload, "timestamp", self.timestamp)
509
+ if self.path is not None:
510
+ payload["path"] = str(self.path)
511
+ payload.update(self.extra)
512
+ return payload
513
+
514
+
515
+ @dataclass(frozen=True)
516
+ class AdapterTranscriptRecord:
517
+ role: AdapterTranscriptRole
518
+ id: str | None = None
519
+ item_id: str | None = None
520
+ conversation_id: str | None = None
521
+ turn_id: str | None = None
522
+ subagent_id: str | None = None
523
+ text: str | None = None
524
+ message: str | None = None
525
+ timestamp: str | None = None
526
+ path: Path | None = None
527
+ line: int | None = None
528
+ column: int | None = None
529
+ internal: bool | None = None
530
+ extra: JsonMap = field(default_factory=dict)
531
+
532
+ def to_json(self) -> JsonMap:
533
+ payload: JsonMap = {"role": self.role.value}
534
+ _put_optional(payload, "id", self.id)
535
+ _put_optional(payload, "item_id", self.item_id)
536
+ _put_optional(payload, "conversation_id", self.conversation_id)
537
+ _put_optional(payload, "turn_id", self.turn_id)
538
+ _put_optional(payload, "subagent_id", self.subagent_id)
539
+ _put_optional(payload, "text", self.text)
540
+ _put_optional(payload, "message", self.message)
541
+ _put_optional(payload, "timestamp", self.timestamp)
542
+ _put_optional(payload, "line", self.line)
543
+ _put_optional(payload, "column", self.column)
544
+ _put_optional(payload, "internal", self.internal)
545
+ if self.path is not None:
546
+ payload["path"] = str(self.path)
547
+ payload.update(self.extra)
548
+ return payload
@@ -0,0 +1 @@
1
+ """ALS-RS Python extension adapters."""
@@ -0,0 +1,157 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import json
5
+ import queue
6
+ import threading
7
+ from typing import TypeAlias, cast
8
+
9
+ from agent_log_server_rs.adapter_protocol import JsonMap
10
+ from agent_log_server_rs.adapters.extension_adapter import (
11
+ INTERNAL_ERROR,
12
+ INVALID_REQUEST,
13
+ JSONRPC_VERSION,
14
+ ExtensionJsonRpcAdapter,
15
+ close_framework_shell_peer,
16
+ )
17
+
18
+
19
+ class EmbeddedExtensionAdapter:
20
+ """Thread-owned Python adapter facade for in-process Rust/PyO3 callers."""
21
+
22
+ def __init__(self) -> None:
23
+ self._loop = asyncio.new_event_loop()
24
+ self._ready = threading.Event()
25
+ self._closed = threading.Event()
26
+ self._notifications: queue.Queue[JsonMap] = queue.Queue()
27
+ self._adapter: ExtensionJsonRpcAdapter | None = None
28
+ self._thread = threading.Thread(
29
+ target=self._run_loop,
30
+ name="als-rs-embedded-extension-adapter",
31
+ daemon=True,
32
+ )
33
+ self._thread.start()
34
+ if not self._ready.wait(timeout=10):
35
+ raise RuntimeError("embedded extension adapter event loop did not start")
36
+
37
+ def request_json(self, payload: str) -> str:
38
+ if self._closed.is_set():
39
+ return _json_dumps(
40
+ _error_response(None, INTERNAL_ERROR, "embedded extension adapter is closed")
41
+ )
42
+ result_queue: queue.Queue[_RequestResult] = queue.Queue(maxsize=1)
43
+
44
+ def schedule() -> None:
45
+ self._loop.create_task(self._request_json_to_queue(payload, result_queue))
46
+
47
+ self._loop.call_soon_threadsafe(schedule)
48
+ ok, result = result_queue.get()
49
+ if ok:
50
+ return result
51
+ raise RuntimeError(result)
52
+
53
+ def drain_notifications_json(self) -> str:
54
+ notifications: list[JsonMap] = []
55
+ while True:
56
+ try:
57
+ notifications.append(self._notifications.get_nowait())
58
+ except queue.Empty:
59
+ break
60
+ return _json_dumps(notifications)
61
+
62
+ def shutdown(self) -> None:
63
+ if self._closed.is_set():
64
+ return
65
+ self._closed.set()
66
+ result_queue: queue.Queue[_RequestResult] = queue.Queue(maxsize=1)
67
+
68
+ def schedule() -> None:
69
+ self._loop.create_task(self._shutdown_to_queue(result_queue))
70
+
71
+ self._loop.call_soon_threadsafe(schedule)
72
+ ok, result = result_queue.get(timeout=10)
73
+ if not ok:
74
+ raise RuntimeError(result)
75
+ self._thread.join(timeout=5)
76
+
77
+ def _run_loop(self) -> None:
78
+ asyncio.set_event_loop(self._loop)
79
+ self._adapter = ExtensionJsonRpcAdapter(notification_callback=self._capture_notification)
80
+ self._ready.set()
81
+ self._loop.run_forever()
82
+ pending = asyncio.all_tasks(self._loop)
83
+ for task in pending:
84
+ task.cancel()
85
+ if pending:
86
+ self._loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
87
+ self._loop.close()
88
+
89
+ async def _request_json(self, payload: str) -> str:
90
+ try:
91
+ raw = cast(object, json.loads(payload))
92
+ except json.JSONDecodeError as exc:
93
+ return _json_dumps(_error_response(None, -32700, "Parse error", str(exc)))
94
+ if not isinstance(raw, dict):
95
+ return _json_dumps(_error_response(None, INVALID_REQUEST, "Invalid request"))
96
+ adapter = self._require_adapter()
97
+ response = await adapter.dispatch_jsonrpc(cast(JsonMap, raw))
98
+ if response is None:
99
+ response = {"jsonrpc": JSONRPC_VERSION, "result": None}
100
+ return _json_dumps(response)
101
+
102
+ async def _request_json_to_queue(
103
+ self,
104
+ payload: str,
105
+ result_queue: queue.Queue[_RequestResult],
106
+ ) -> None:
107
+ try:
108
+ result_queue.put((True, await self._request_json(payload)))
109
+ except Exception as exc:
110
+ result_queue.put((False, f"{type(exc).__name__}: {exc}"))
111
+
112
+ async def _capture_notification(self, method: str, params: object) -> None:
113
+ self._notifications.put(
114
+ {
115
+ "jsonrpc": JSONRPC_VERSION,
116
+ "method": method,
117
+ "params": params,
118
+ }
119
+ )
120
+
121
+ async def _shutdown_to_queue(self, result_queue: queue.Queue[_RequestResult]) -> None:
122
+ try:
123
+ await self._shutdown()
124
+ result_queue.put((True, ""))
125
+ except Exception as exc:
126
+ result_queue.put((False, f"{type(exc).__name__}: {exc}"))
127
+ finally:
128
+ self._loop.stop()
129
+
130
+ async def _shutdown(self) -> None:
131
+ if self._adapter is not None:
132
+ await self._adapter.stop_supported_handlers()
133
+ await close_framework_shell_peer()
134
+
135
+ def _require_adapter(self) -> ExtensionJsonRpcAdapter:
136
+ if self._adapter is None:
137
+ raise RuntimeError("embedded extension adapter is not initialized")
138
+ return self._adapter
139
+
140
+
141
+ _RequestResult: TypeAlias = tuple[bool, str]
142
+
143
+
144
+ def _error_response(
145
+ request_id: str | int | None,
146
+ code: int,
147
+ message: str,
148
+ data: object | None = None,
149
+ ) -> JsonMap:
150
+ error: JsonMap = {"code": code, "message": message}
151
+ if data is not None:
152
+ error["data"] = data
153
+ return {"jsonrpc": JSONRPC_VERSION, "id": request_id, "error": error}
154
+
155
+
156
+ def _json_dumps(value: object) -> str:
157
+ return json.dumps(value, ensure_ascii=False, separators=(",", ":"))