gatewaysdk 0.3.2__py3-none-any.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 (376) hide show
  1. gatewaysdk/__init__.py +540 -0
  2. gatewaysdk/adapter/__init__.py +15 -0
  3. gatewaysdk/adapter/base.py +94 -0
  4. gatewaysdk/adapter/messages.py +270 -0
  5. gatewaysdk/adapter/triplet.py +1026 -0
  6. gatewaysdk/algorithm/__init__.py +39 -0
  7. gatewaysdk/algorithm/apo/__init__.py +5 -0
  8. gatewaysdk/algorithm/apo/apo.py +898 -0
  9. gatewaysdk/algorithm/apo/prompts/apply_edit_variant01.poml +22 -0
  10. gatewaysdk/algorithm/apo/prompts/apply_edit_variant02.poml +18 -0
  11. gatewaysdk/algorithm/apo/prompts/text_gradient_variant01.poml +18 -0
  12. gatewaysdk/algorithm/apo/prompts/text_gradient_variant02.poml +16 -0
  13. gatewaysdk/algorithm/apo/prompts/text_gradient_variant03.poml +107 -0
  14. gatewaysdk/algorithm/base.py +262 -0
  15. gatewaysdk/algorithm/decorator.py +264 -0
  16. gatewaysdk/algorithm/evals/__init__.py +7 -0
  17. gatewaysdk/algorithm/evals/evals.py +217 -0
  18. gatewaysdk/algorithm/fast.py +250 -0
  19. gatewaysdk/algorithm/gepa/__init__.py +61 -0
  20. gatewaysdk/algorithm/gepa/adapter.py +495 -0
  21. gatewaysdk/algorithm/gepa/gepa.py +570 -0
  22. gatewaysdk/algorithm/gepa/lib/__init__.py +18 -0
  23. gatewaysdk/algorithm/gepa/lib/adapters/README.md +12 -0
  24. gatewaysdk/algorithm/gepa/lib/adapters/__init__.py +0 -0
  25. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/README.md +341 -0
  26. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/__init__.py +1 -0
  27. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/anymaths_adapter.py +174 -0
  28. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/requirements.txt +1 -0
  29. gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/README.md +0 -0
  30. gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/__init__.py +0 -0
  31. gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/default_adapter.py +209 -0
  32. gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/README.md +7 -0
  33. gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/__init__.py +0 -0
  34. gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/dspy_adapter.py +307 -0
  35. gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/README.md +99 -0
  36. gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/dspy_program_proposal_signature.py +137 -0
  37. gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/full_program_adapter.py +268 -0
  38. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/GEPA_RAG.md +621 -0
  39. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/__init__.py +56 -0
  40. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/evaluation_metrics.py +226 -0
  41. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/generic_rag_adapter.py +496 -0
  42. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/rag_pipeline.py +238 -0
  43. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_store_interface.py +212 -0
  44. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/__init__.py +2 -0
  45. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/chroma_store.py +196 -0
  46. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/lancedb_store.py +422 -0
  47. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/milvus_store.py +409 -0
  48. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/qdrant_store.py +368 -0
  49. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/weaviate_store.py +418 -0
  50. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/README.md +552 -0
  51. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/__init__.py +37 -0
  52. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_adapter.py +699 -0
  53. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_client.py +364 -0
  54. gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/README.md +9 -0
  55. gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/__init__.py +0 -0
  56. gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/terminal_bench_adapter.py +217 -0
  57. gatewaysdk/algorithm/gepa/lib/api.py +382 -0
  58. gatewaysdk/algorithm/gepa/lib/core/__init__.py +0 -0
  59. gatewaysdk/algorithm/gepa/lib/core/adapter.py +180 -0
  60. gatewaysdk/algorithm/gepa/lib/core/data_loader.py +74 -0
  61. gatewaysdk/algorithm/gepa/lib/core/engine.py +379 -0
  62. gatewaysdk/algorithm/gepa/lib/core/result.py +233 -0
  63. gatewaysdk/algorithm/gepa/lib/core/state.py +636 -0
  64. gatewaysdk/algorithm/gepa/lib/examples/__init__.py +0 -0
  65. gatewaysdk/algorithm/gepa/lib/examples/aime.py +24 -0
  66. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/eval_default.py +111 -0
  67. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/instruction_prompt.txt +9 -0
  68. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/optimal_prompt.txt +24 -0
  69. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/train_anymaths.py +177 -0
  70. gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/arc_agi.ipynb +25705 -0
  71. gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/example.ipynb +348 -0
  72. gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/__init__.py +4 -0
  73. gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/mcp_optimization_example.py +456 -0
  74. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/RAG_GUIDE.md +613 -0
  75. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/__init__.py +9 -0
  76. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/rag_optimization.py +820 -0
  77. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/requirements-rag.txt +29 -0
  78. gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/instruction_prompt.txt +16 -0
  79. gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/terminus.txt +9 -0
  80. gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/train_terminus.py +161 -0
  81. gatewaysdk/algorithm/gepa/lib/gepa_utils.py +117 -0
  82. gatewaysdk/algorithm/gepa/lib/logging/__init__.py +0 -0
  83. gatewaysdk/algorithm/gepa/lib/logging/experiment_tracker.py +187 -0
  84. gatewaysdk/algorithm/gepa/lib/logging/logger.py +75 -0
  85. gatewaysdk/algorithm/gepa/lib/logging/utils.py +103 -0
  86. gatewaysdk/algorithm/gepa/lib/proposer/__init__.py +0 -0
  87. gatewaysdk/algorithm/gepa/lib/proposer/base.py +31 -0
  88. gatewaysdk/algorithm/gepa/lib/proposer/merge.py +357 -0
  89. gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/__init__.py +0 -0
  90. gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/base.py +49 -0
  91. gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/reflective_mutation.py +176 -0
  92. gatewaysdk/algorithm/gepa/lib/py.typed +0 -0
  93. gatewaysdk/algorithm/gepa/lib/strategies/__init__.py +0 -0
  94. gatewaysdk/algorithm/gepa/lib/strategies/batch_sampler.py +77 -0
  95. gatewaysdk/algorithm/gepa/lib/strategies/candidate_selector.py +50 -0
  96. gatewaysdk/algorithm/gepa/lib/strategies/component_selector.py +36 -0
  97. gatewaysdk/algorithm/gepa/lib/strategies/eval_policy.py +64 -0
  98. gatewaysdk/algorithm/gepa/lib/strategies/instruction_proposal.py +126 -0
  99. gatewaysdk/algorithm/gepa/lib/utils/__init__.py +10 -0
  100. gatewaysdk/algorithm/gepa/lib/utils/stop_condition.py +196 -0
  101. gatewaysdk/algorithm/gepa/tracing.py +105 -0
  102. gatewaysdk/algorithm/utils.py +177 -0
  103. gatewaysdk/algorithm/verl/__init__.py +5 -0
  104. gatewaysdk/algorithm/verl/interface.py +202 -0
  105. gatewaysdk/automations.py +111 -0
  106. gatewaysdk/benchmark_hub/README.md +88 -0
  107. gatewaysdk/benchmark_hub/__init__.py +119 -0
  108. gatewaysdk/benchmark_hub/_archive.py +189 -0
  109. gatewaysdk/benchmark_hub/_tar.py +6 -0
  110. gatewaysdk/benchmark_hub/client.py +992 -0
  111. gatewaysdk/benchmark_hub/dispatch_shard.py +34 -0
  112. gatewaysdk/benchmark_hub/eval_config.py +20 -0
  113. gatewaysdk/benchmark_hub/evals.py +351 -0
  114. gatewaysdk/benchmark_hub/harbor_adapter.py +673 -0
  115. gatewaysdk/benchmark_hub/path_utils.py +81 -0
  116. gatewaysdk/benchmark_hub/save_utils.py +101 -0
  117. gatewaysdk/benchmark_hub/verifiers_adapter.py +327 -0
  118. gatewaysdk/benchmark_hub/versioning.py +72 -0
  119. gatewaysdk/build.py +515 -0
  120. gatewaysdk/cli/__init__.py +58 -0
  121. gatewaysdk/cli/agent_runner.py +132 -0
  122. gatewaysdk/cli/http_client.py +115 -0
  123. gatewaysdk/cli/platform.py +4086 -0
  124. gatewaysdk/cli/prometheus.py +115 -0
  125. gatewaysdk/cli/release_gate.py +215 -0
  126. gatewaysdk/cli/store.py +131 -0
  127. gatewaysdk/cli/vllm.py +29 -0
  128. gatewaysdk/client.py +406 -0
  129. gatewaysdk/config.py +348 -0
  130. gatewaysdk/connectors/__init__.py +25 -0
  131. gatewaysdk/connectors/client.py +203 -0
  132. gatewaysdk/connectors/skill.py +25 -0
  133. gatewaysdk/connectors/template.py +106 -0
  134. gatewaysdk/context.py +606 -0
  135. gatewaysdk/emitter/__init__.py +43 -0
  136. gatewaysdk/emitter/annotation.py +370 -0
  137. gatewaysdk/emitter/exception.py +54 -0
  138. gatewaysdk/emitter/message.py +61 -0
  139. gatewaysdk/emitter/object.py +117 -0
  140. gatewaysdk/emitter/reward.py +320 -0
  141. gatewaysdk/env_var.py +156 -0
  142. gatewaysdk/environment/__init__.py +108 -0
  143. gatewaysdk/environment/_bundle.py +281 -0
  144. gatewaysdk/environment/_harbor.py +276 -0
  145. gatewaysdk/environment/_materialize.py +97 -0
  146. gatewaysdk/environment/_tar.py +33 -0
  147. gatewaysdk/environment/_world.py +346 -0
  148. gatewaysdk/environment/core.py +527 -0
  149. gatewaysdk/environment/errors.py +58 -0
  150. gatewaysdk/environment/runtime.py +150 -0
  151. gatewaysdk/environment/schema/__init__.py +35 -0
  152. gatewaysdk/environment/schema/__main__.py +225 -0
  153. gatewaysdk/environment/schema/_slack_fidelity.py +116 -0
  154. gatewaysdk/environment/schema/_slack_scenario.py +183 -0
  155. gatewaysdk/environment/schema/api.py +1628 -0
  156. gatewaysdk/environment/schema/batch.py +755 -0
  157. gatewaysdk/environment/schema/compiler.py +615 -0
  158. gatewaysdk/environment/schema/conform.py +428 -0
  159. gatewaysdk/environment/schema/connector.py +777 -0
  160. gatewaysdk/environment/schema/connectors/apple-business-manager/handlers.py +17 -0
  161. gatewaysdk/environment/schema/connectors/apple-business-manager/parity.json +28 -0
  162. gatewaysdk/environment/schema/connectors/apple-business-manager/provenance.json +233 -0
  163. gatewaysdk/environment/schema/connectors/apple-business-manager/scope.toml +112 -0
  164. gatewaysdk/environment/schema/connectors/apple-business-manager/world.json +1380 -0
  165. gatewaysdk/environment/schema/connectors/base.json +28 -0
  166. gatewaysdk/environment/schema/connectors/custom/handlers.py +18 -0
  167. gatewaysdk/environment/schema/connectors/custom/world.json +123 -0
  168. gatewaysdk/environment/schema/connectors/github/handlers.py +81 -0
  169. gatewaysdk/environment/schema/connectors/github/parity.json +37 -0
  170. gatewaysdk/environment/schema/connectors/github/provenance.json +134 -0
  171. gatewaysdk/environment/schema/connectors/github/scope.toml +158 -0
  172. gatewaysdk/environment/schema/connectors/github/world.json +5869 -0
  173. gatewaysdk/environment/schema/connectors/google-calendar/handlers.py +23 -0
  174. gatewaysdk/environment/schema/connectors/google-calendar/world.json +209 -0
  175. gatewaysdk/environment/schema/connectors/google-drive/handlers.py +18 -0
  176. gatewaysdk/environment/schema/connectors/google-drive/world.json +286 -0
  177. gatewaysdk/environment/schema/connectors/jamf/handlers.py +34 -0
  178. gatewaysdk/environment/schema/connectors/jamf/parity.json +49 -0
  179. gatewaysdk/environment/schema/connectors/jamf/provenance.json +181 -0
  180. gatewaysdk/environment/schema/connectors/jamf/scope.toml +128 -0
  181. gatewaysdk/environment/schema/connectors/jamf/world.json +2218 -0
  182. gatewaysdk/environment/schema/connectors/jira/handlers.py +28 -0
  183. gatewaysdk/environment/schema/connectors/jira/world.json +389 -0
  184. gatewaysdk/environment/schema/connectors/kandji/handlers.py +38 -0
  185. gatewaysdk/environment/schema/connectors/kandji/parity.json +29 -0
  186. gatewaysdk/environment/schema/connectors/kandji/provenance.json +152 -0
  187. gatewaysdk/environment/schema/connectors/kandji/scope.toml +120 -0
  188. gatewaysdk/environment/schema/connectors/kandji/world.json +765 -0
  189. gatewaysdk/environment/schema/connectors/linear/handlers.py +20 -0
  190. gatewaysdk/environment/schema/connectors/linear/world.json +363 -0
  191. gatewaysdk/environment/schema/connectors/microsoft-teams/fidelity.json +45 -0
  192. gatewaysdk/environment/schema/connectors/microsoft-teams/handlers.py +1 -0
  193. gatewaysdk/environment/schema/connectors/microsoft-teams/provenance.json +851 -0
  194. gatewaysdk/environment/schema/connectors/microsoft-teams/scope.md +231 -0
  195. gatewaysdk/environment/schema/connectors/microsoft-teams/teams-types.json +1710 -0
  196. gatewaysdk/environment/schema/connectors/microsoft-teams/world.json +858 -0
  197. gatewaysdk/environment/schema/connectors/netsuite/handlers.py +32 -0
  198. gatewaysdk/environment/schema/connectors/netsuite/parity.json +50 -0
  199. gatewaysdk/environment/schema/connectors/netsuite/provenance.json +137 -0
  200. gatewaysdk/environment/schema/connectors/netsuite/scope.toml +78 -0
  201. gatewaysdk/environment/schema/connectors/netsuite/world.json +16243 -0
  202. gatewaysdk/environment/schema/connectors/salesforce/handlers.py +806 -0
  203. gatewaysdk/environment/schema/connectors/salesforce/parity.json +46 -0
  204. gatewaysdk/environment/schema/connectors/salesforce/provenance.json +143 -0
  205. gatewaysdk/environment/schema/connectors/salesforce/scope.toml +174 -0
  206. gatewaysdk/environment/schema/connectors/salesforce/world.json +4695 -0
  207. gatewaysdk/environment/schema/connectors/slack/MODEL.md +236 -0
  208. gatewaysdk/environment/schema/connectors/slack/capabilities.json +1039 -0
  209. gatewaysdk/environment/schema/connectors/slack/handlers.py +762 -0
  210. gatewaysdk/environment/schema/connectors/slack/parity.json +65 -0
  211. gatewaysdk/environment/schema/connectors/slack/provenance.json +294 -0
  212. gatewaysdk/environment/schema/connectors/slack/scope.toml +44 -0
  213. gatewaysdk/environment/schema/connectors/slack/world.json +4993 -0
  214. gatewaysdk/environment/schema/connectors/workday/handlers.py +75 -0
  215. gatewaysdk/environment/schema/connectors/workday/parity.json +36 -0
  216. gatewaysdk/environment/schema/connectors/workday/provenance.json +179 -0
  217. gatewaysdk/environment/schema/connectors/workday/scope.toml +180 -0
  218. gatewaysdk/environment/schema/connectors/workday/world.json +806 -0
  219. gatewaysdk/environment/schema/data.py +593 -0
  220. gatewaysdk/environment/schema/extract.py +263 -0
  221. gatewaysdk/environment/schema/host.py +2437 -0
  222. gatewaysdk/environment/schema/host_surfaces.py +275 -0
  223. gatewaysdk/environment/schema/platform.py +1272 -0
  224. gatewaysdk/environment/schema/scaffold.py +250 -0
  225. gatewaysdk/environment/schema/skill.py +118 -0
  226. gatewaysdk/environment/schema/skills/agents/connector-template-author.md +202 -0
  227. gatewaysdk/environment/schema/skills/connector-schema-authoring/CONNECTORS.md +331 -0
  228. gatewaysdk/environment/schema/skills/connector-schema-authoring/CONVENTIONS.md +100 -0
  229. gatewaysdk/environment/schema/skills/connector-schema-authoring/SKILL.md +313 -0
  230. gatewaysdk/environment/schema/skills/world-data-ingestion/ROWS.md +223 -0
  231. gatewaysdk/environment/schema/skills/world-data-ingestion/SKILL.md +293 -0
  232. gatewaysdk/environment/schema/skills/worlds-getting-started/SKILL.md +390 -0
  233. gatewaysdk/environment/schema/slack.py +757 -0
  234. gatewaysdk/environment/schema/snapshot.py +479 -0
  235. gatewaysdk/environment/schema/store.py +904 -0
  236. gatewaysdk/environment/schema/tasks.py +525 -0
  237. gatewaysdk/environment/schema/tools_world.py +322 -0
  238. gatewaysdk/environment/schema/validation.py +577 -0
  239. gatewaysdk/environment/schema/worker.py +78 -0
  240. gatewaysdk/environment/schema/workers.py +500 -0
  241. gatewaysdk/environment/schema/world_tests.py +336 -0
  242. gatewaysdk/environments/__init__.py +24 -0
  243. gatewaysdk/environments/client.py +486 -0
  244. gatewaysdk/environments/types.py +318 -0
  245. gatewaysdk/execution/__init__.py +15 -0
  246. gatewaysdk/execution/base.py +64 -0
  247. gatewaysdk/execution/client_server.py +443 -0
  248. gatewaysdk/execution/events.py +69 -0
  249. gatewaysdk/execution/inter_process.py +16 -0
  250. gatewaysdk/execution/shared_memory.py +282 -0
  251. gatewaysdk/experiments/__init__.py +90 -0
  252. gatewaysdk/experiments/assignment.py +177 -0
  253. gatewaysdk/experiments/client.py +877 -0
  254. gatewaysdk/experiments/exposure.py +222 -0
  255. gatewaysdk/experiments/types.py +81 -0
  256. gatewaysdk/importers/__init__.py +49 -0
  257. gatewaysdk/importers/_normalize.py +91 -0
  258. gatewaysdk/importers/builder.py +173 -0
  259. gatewaysdk/importers/client.py +95 -0
  260. gatewaysdk/importers/langsmith.py +196 -0
  261. gatewaysdk/importers/recipes.py +249 -0
  262. gatewaysdk/instrumentation/__init__.py +300 -0
  263. gatewaysdk/instrumentation/agentops.py +314 -0
  264. gatewaysdk/instrumentation/agentops_langchain.py +45 -0
  265. gatewaysdk/instrumentation/base.py +119 -0
  266. gatewaysdk/instrumentation/litellm.py +83 -0
  267. gatewaysdk/instrumentation/registry.py +273 -0
  268. gatewaysdk/instrumentation/vllm.py +81 -0
  269. gatewaysdk/instrumentation/weave.py +500 -0
  270. gatewaysdk/integrations/__init__.py +15 -0
  271. gatewaysdk/integrations/gateway/__init__.py +11 -0
  272. gatewaysdk/integrations/gateway/client.py +171 -0
  273. gatewaysdk/integrations/tool_access.py +549 -0
  274. gatewaysdk/litagent/__init__.py +11 -0
  275. gatewaysdk/litagent/decorator.py +536 -0
  276. gatewaysdk/litagent/litagent.py +252 -0
  277. gatewaysdk/llm_proxy.py +1742 -0
  278. gatewaysdk/logging.py +370 -0
  279. gatewaysdk/memory.py +278 -0
  280. gatewaysdk/personas.py +186 -0
  281. gatewaysdk/platform/__init__.py +17 -0
  282. gatewaysdk/platform/builder.py +221 -0
  283. gatewaysdk/platform/compatibility.py +67 -0
  284. gatewaysdk/platform/manifest.py +185 -0
  285. gatewaysdk/platform/orchestrator.py +901 -0
  286. gatewaysdk/platform/registry.py +122 -0
  287. gatewaysdk/platform/worker.py +864 -0
  288. gatewaysdk/replay/__init__.py +1032 -0
  289. gatewaysdk/replay/pytest.py +56 -0
  290. gatewaysdk/reward.py +7 -0
  291. gatewaysdk/run.py +1781 -0
  292. gatewaysdk/runner/__init__.py +11 -0
  293. gatewaysdk/runner/agent.py +878 -0
  294. gatewaysdk/runner/base.py +182 -0
  295. gatewaysdk/runner/legacy.py +309 -0
  296. gatewaysdk/security.py +700 -0
  297. gatewaysdk/semconv.py +170 -0
  298. gatewaysdk/server.py +399 -0
  299. gatewaysdk/sessions.py +282 -0
  300. gatewaysdk/store/__init__.py +45 -0
  301. gatewaysdk/store/base.py +908 -0
  302. gatewaysdk/store/client_server.py +2093 -0
  303. gatewaysdk/store/collection/__init__.py +30 -0
  304. gatewaysdk/store/collection/base.py +587 -0
  305. gatewaysdk/store/collection/memory.py +970 -0
  306. gatewaysdk/store/collection/mongo.py +1412 -0
  307. gatewaysdk/store/collection_based.py +1823 -0
  308. gatewaysdk/store/gateway.py +983 -0
  309. gatewaysdk/store/gateway_listener.py +465 -0
  310. gatewaysdk/store/listener.py +58 -0
  311. gatewaysdk/store/memory.py +396 -0
  312. gatewaysdk/store/mongo.py +165 -0
  313. gatewaysdk/store/redis_stream.py +517 -0
  314. gatewaysdk/store/sqlite.py +3 -0
  315. gatewaysdk/store/threading.py +370 -0
  316. gatewaysdk/store/utils.py +142 -0
  317. gatewaysdk/tracer/__init__.py +14 -0
  318. gatewaysdk/tracer/base.py +286 -0
  319. gatewaysdk/tracer/dummy.py +106 -0
  320. gatewaysdk/tracer/otel.py +559 -0
  321. gatewaysdk/tracing/__init__.py +110 -0
  322. gatewaysdk/tracing/api.py +808 -0
  323. gatewaysdk/tracing/attributes.py +9 -0
  324. gatewaysdk/tracing/context.py +272 -0
  325. gatewaysdk/tracing/exporters/__init__.py +10 -0
  326. gatewaysdk/tracing/exporters/gateway.py +228 -0
  327. gatewaysdk/tracing/identity.py +288 -0
  328. gatewaysdk/tracing/init.py +620 -0
  329. gatewaysdk/tracing/instrumentors/__init__.py +15 -0
  330. gatewaysdk/tracing/instrumentors/claude_agent_sdk.py +766 -0
  331. gatewaysdk/tracing/instrumentors/instrumentation_principles.md +294 -0
  332. gatewaysdk/tracing/instrumentors/registry.py +352 -0
  333. gatewaysdk/tracing/mapping.py +729 -0
  334. gatewaysdk/tracing/processors.py +393 -0
  335. gatewaysdk/tracing/push.py +617 -0
  336. gatewaysdk/tracing/push_models.py +247 -0
  337. gatewaysdk/tracing/semconv.py +294 -0
  338. gatewaysdk/tracing/span_builder.py +356 -0
  339. gatewaysdk/trainer/__init__.py +6 -0
  340. gatewaysdk/trainer/init_utils.py +263 -0
  341. gatewaysdk/trainer/legacy.py +359 -0
  342. gatewaysdk/trainer/registry.py +12 -0
  343. gatewaysdk/trainer/trainer.py +638 -0
  344. gatewaysdk/types/__init__.py +63 -0
  345. gatewaysdk/types/core.py +556 -0
  346. gatewaysdk/types/resources.py +204 -0
  347. gatewaysdk/types/tracer.py +515 -0
  348. gatewaysdk/types/tracing.py +162 -0
  349. gatewaysdk/users.py +251 -0
  350. gatewaysdk/utils/__init__.py +1 -0
  351. gatewaysdk/utils/id.py +18 -0
  352. gatewaysdk/utils/metrics.py +1025 -0
  353. gatewaysdk/utils/otel.py +550 -0
  354. gatewaysdk/utils/otlp.py +556 -0
  355. gatewaysdk/utils/redact.py +22 -0
  356. gatewaysdk/utils/server_launcher.py +1045 -0
  357. gatewaysdk/utils/system_snapshot.py +90 -0
  358. gatewaysdk/verl/__init__.py +8 -0
  359. gatewaysdk/verl/__main__.py +6 -0
  360. gatewaysdk/verl/async_server.py +46 -0
  361. gatewaysdk/verl/config.yaml +27 -0
  362. gatewaysdk/verl/daemon.py +1154 -0
  363. gatewaysdk/verl/dataset.py +44 -0
  364. gatewaysdk/verl/entrypoint.py +248 -0
  365. gatewaysdk/verl/trainer.py +549 -0
  366. gatewaysdk/world_browser.py +748 -0
  367. gatewaysdk/world_data.py +453 -0
  368. gatewaysdk/world_sessions.py +978 -0
  369. gatewaysdk/world_tasks.py +285 -0
  370. gatewaysdk/world_tools.py +115 -0
  371. gatewaysdk/worlds.py +639 -0
  372. gatewaysdk-0.3.2.dist-info/METADATA +236 -0
  373. gatewaysdk-0.3.2.dist-info/RECORD +376 -0
  374. gatewaysdk-0.3.2.dist-info/WHEEL +4 -0
  375. gatewaysdk-0.3.2.dist-info/entry_points.txt +5 -0
  376. gatewaysdk-0.3.2.dist-info/licenses/LICENSE +19 -0
@@ -0,0 +1,806 @@
1
+ """Salesforce world tools; every mutation goes through the schema store.
2
+
3
+ Errors are raised in the vendor's shape: a JSON array of
4
+ ``{"message", "errorCode", "fields"}`` objects, as documented under
5
+ "Status Codes and Error Responses" in the REST API Developer Guide. The
6
+ error codes are the ones the SOAP API's StatusCode enumeration defines;
7
+ provenance.json lists which handler raises which.
8
+ """
9
+
10
+ import json
11
+ import re
12
+
13
+ from gateway_env import store, tool
14
+
15
+ #: The API version the pinned documentation describes (Winter '27).
16
+ API_VERSION = "v68.0"
17
+
18
+ #: SOQL object name -> entity. Standard objects only; a bound org's custom
19
+ #: objects arrive through describe-on-bind and extend this map with the world.
20
+ OBJECTS = {
21
+ "Account": "sf_accounts",
22
+ "Case": "sf_cases",
23
+ "Contact": "sf_contacts",
24
+ "Lead": "sf_leads",
25
+ "Opportunity": "sf_opportunities",
26
+ "Task": "sf_tasks",
27
+ "User": "sf_users",
28
+ }
29
+
30
+ #: Field names per entity, in world.json order, so SELECT resolves a column
31
+ #: name against an empty table. Keep in step with the entity schemas.
32
+ FIELDS = {
33
+ "sf_users": (
34
+ "Id",
35
+ "AboutMe",
36
+ "AccountId",
37
+ "Address",
38
+ "Alias",
39
+ "BadgeText",
40
+ "BannerPhotoUrl",
41
+ "CallCenterId",
42
+ "City",
43
+ "CommunityNickname",
44
+ "CompanyName",
45
+ "ContactId",
46
+ "Country",
47
+ "CountryCode",
48
+ "CurrentStatus",
49
+ "DefaultCurrencyIsoCode",
50
+ "DefaultDivision",
51
+ "DefaultGroupNotificationFrequency",
52
+ "DelegatedApproverId",
53
+ "Department",
54
+ "DigestFrequency",
55
+ "Division",
56
+ "Email",
57
+ "EmailEncodingKey",
58
+ "EmailPreferencesAutoBcc",
59
+ "EmployeeNumber",
60
+ "EndDay",
61
+ "Extension",
62
+ "Fax",
63
+ "FederationIdentifier",
64
+ "FirstName",
65
+ "ForecastEnabled",
66
+ "FullPhotoUrl",
67
+ "GeocodeAccuracy",
68
+ "HasUserVerifiedEmail",
69
+ "HasUserVerifiedPhone",
70
+ "IndividualId",
71
+ "IsActive",
72
+ "IsPartner",
73
+ "IsPortalEnabled",
74
+ "IsPortalSelfRegistered",
75
+ "IsPrmSuperUser",
76
+ "IsProfilePhotoActive",
77
+ "JigsawImportLimitOverride",
78
+ "LanguageLocaleKey",
79
+ "LastLoginDate",
80
+ "LastName",
81
+ "LastReferencedDate",
82
+ "LastViewedDate",
83
+ "Latitude",
84
+ "LocaleSidKey",
85
+ "Longitude",
86
+ "Manager",
87
+ "ManagerId",
88
+ "MediumBannerPhotoUrl",
89
+ "MiddleName",
90
+ "MobilePhone",
91
+ "Name",
92
+ "NumberOfFailedLogins",
93
+ "OfflineTrialExpirationDate",
94
+ "PasswordExpirationDate",
95
+ "Phone",
96
+ "PortalRole",
97
+ "PostalCode",
98
+ "ProfileId",
99
+ "ReceivesAdminInfoEmails",
100
+ "ReceivesInfoEmails",
101
+ "SenderEmail",
102
+ "SenderName",
103
+ "Signature",
104
+ "SmallBannerPhotoUrl",
105
+ "SmallPhotoUrl",
106
+ "StartDay",
107
+ "State",
108
+ "StateCode",
109
+ "Street",
110
+ "SuAccessExpirationDate",
111
+ "Suffix",
112
+ "TimeZoneSidKey",
113
+ "Title",
114
+ "Username",
115
+ "UserPermissionsCallCenterAutoLogin",
116
+ "UserPermissionsChatterAnswersUser",
117
+ "UserPermissionsInteractionUser",
118
+ "UserPermissionsJigsawProspectingUser",
119
+ "UserPermissionsKnowledgeUser",
120
+ "UserPermissionsLiveAgentUser",
121
+ "UserPermissionsMarketingUser",
122
+ "UserPermissionsOfflineUser",
123
+ "UserPermissionsSFContentUser",
124
+ "UserPermissionsSiteforceContributorUser",
125
+ "UserPermissionsSiteforcePublisherUser",
126
+ "UserPermissionsSupportUser",
127
+ "UserPermissionsWirelessUser",
128
+ "UserPermissionsWorkDotComUserFeature",
129
+ "UserPreferencesActivityRemindersPopup",
130
+ "UserPreferencesAgentGdprConsent",
131
+ "UserPreferencesAllowConversationReminders",
132
+ "UserPreferencesApexPagesDeveloperMode",
133
+ "UserPreferencesAutoForwardCall",
134
+ "UserPreferencesContentEmailAsAndWhen",
135
+ "UserPreferencesContentNoEmail",
136
+ "UserPreferencesEnableAutoSubForFeeds",
137
+ "UserPreferencesDisableAllFeedsEmail",
138
+ "UserPreferencesDisableAutoSubForFeeds",
139
+ "UserPreferencesDisableBookmarkEmail",
140
+ "UserPreferencesDisableChangeCommentEmail",
141
+ "UserPreferencesDisableEndorsementEmail",
142
+ "UserPreferencesDisableFileShareNotificationsForApi",
143
+ "UserPreferencesDisableFollowersEmail",
144
+ "UserPreferencesDisableLaterCommentEmail",
145
+ "UserPreferencesDisableLikeEmail",
146
+ "UserPreferencesDisableMentionsPostEmail",
147
+ "UserPreferencesDisableProfilePostEmail",
148
+ "UserPreferencesDisableSharePostEmail",
149
+ "UserPreferencesDisableFeedbackEmail",
150
+ "UserPreferencesDisCommentAfterLikeEmail",
151
+ "UserPreferencesDisMentionsCommentEmail",
152
+ "UserPreferencesDisableMessageEmail",
153
+ "UserPreferencesDisableRewardEmail",
154
+ "UserPreferencesDisableWorkEmail",
155
+ "UserPreferencesDisProfPostCommentEmail",
156
+ "UserPreferencesEnableVoiceCallRecording",
157
+ "UserPreferencesEnableVoiceLocalPresence",
158
+ "UserPreferencesEventRemindersCheckboxDefault",
159
+ "UserPreferencesHideBiggerPhotoCallout",
160
+ "UserPreferencesHideChatterOnboardingSplash",
161
+ "UserPreferencesHideCSNDesktopTask",
162
+ "UserPreferencesHideCSNGetChatterMobileTask",
163
+ "UserPreferencesHideEndUserOnboardingAssistantModal",
164
+ "UserPreferencesHideLightningMigrationModal",
165
+ "UserPreferencesHideSecondChatterOnboardingSplash",
166
+ "UserPreferencesHideS1BrowserUI",
167
+ "UserPreferencesHideSfxWelcomeMat",
168
+ "UserPreferencesJigsawListUser",
169
+ "UserPreferencesLightningExperiencePreferred",
170
+ "UserPreferencesLiveAgentMiawSetupDeflection",
171
+ "UserPreferencesNativeEmailClient",
172
+ "UserPreferencesOptOutOfTouch",
173
+ "UserPreferencesOutboundBridge",
174
+ "UserPreferencesPathAssistantCollapsed",
175
+ "UserPreferencesProcessAssistantCollapsed",
176
+ "UserPreferencesReceiveNoNotificationsAsApprover",
177
+ "UserPreferencesReceiveNotificationsAsDelegatedApprover",
178
+ "UserPreferencesReminderSoundOff",
179
+ "UserPreferencesShowCityToExternalUsers",
180
+ "UserPreferencesShowCityToGuestUsers",
181
+ "UserPreferencesShowCountryToExternalUsers",
182
+ "UserPreferencesShowCountryToGuestUsers",
183
+ "UserPreferencesShowEmailToExternalUsers",
184
+ "UserPreferencesShowEmailToGuestUsers",
185
+ "UserPreferencesShowFaxToExternalUsers",
186
+ "UserPreferencesShowFaxToGuestUsers",
187
+ "UserPreferencesShowManagerToExternalUsers",
188
+ "UserPreferencesShowManagerToGuestUsers",
189
+ "UserPreferencesShowMobilePhoneToExternalUsers",
190
+ "UserPreferencesShowMobilePhoneToGuestUsers",
191
+ "UserPreferencesShowPostalCodeToExternalUsers",
192
+ "UserPreferencesShowPostalCodeToGuestUsers",
193
+ "UserPreferencesShowProfilePicToGuestUsers",
194
+ "UserPreferencesShowStateToExternalUsers",
195
+ "UserPreferencesShowStateToGuestUsers",
196
+ "UserPreferencesShowStreetAddressToExternalUsers",
197
+ "UserPreferencesShowStreetAddressToGuestUsers",
198
+ "UserPreferencesShowTitleToExternalUsers",
199
+ "UserPreferencesShowTitleToGuestUsers",
200
+ "UserPreferencesShowWorkPhoneToExternalUsers",
201
+ "UserPreferencesShowWorkPhoneToGuestUsers",
202
+ "UserPreferencesSortFeedByComment",
203
+ "UserPreferencesSuppressEventSFXReminders",
204
+ "UserPreferencesSuppressTaskSFXReminders",
205
+ "UserPreferencesTaskRemindersCheckboxDefault",
206
+ "UserPreferencesUserDebugModePref",
207
+ "UserRoleId",
208
+ "UserType",
209
+ "WirelessEmail",
210
+ ),
211
+ "sf_accounts": (
212
+ "Id",
213
+ "AccountNumber",
214
+ "AccountSource",
215
+ "ActivityMetricId",
216
+ "ActivityMetricRollupId",
217
+ "AnnualRevenue",
218
+ "BillingAddress",
219
+ "BillingCity",
220
+ "BillingCountry",
221
+ "BillingCountryCode",
222
+ "BillingGeocodeAccuracy",
223
+ "BillingLatitude",
224
+ "BillingLongitude",
225
+ "BillingPostalCode",
226
+ "BillingState",
227
+ "BillingStateCode",
228
+ "BillingStreet",
229
+ "ChannelProgramLevelName",
230
+ "ChannelProgramName",
231
+ "CleanStatus",
232
+ "CommerceCustomerReference",
233
+ "CommerceGroupReference",
234
+ "CommerceOrganizationReference",
235
+ "ConnectionReceivedId",
236
+ "ConnectionSentId",
237
+ "Description",
238
+ "DunsNumber",
239
+ "Fax",
240
+ "Industry",
241
+ "IsBuyer",
242
+ "IsCustomerPortal",
243
+ "IsPartner",
244
+ "IsPersonAccount",
245
+ "IsPriorityRecord",
246
+ "Jigsaw",
247
+ "JigsawCompanyId",
248
+ "LastActivityDate",
249
+ "LastReferencedDate",
250
+ "LastViewedDate",
251
+ "MasterRecordId",
252
+ "NaicsCode",
253
+ "NaicsDesc",
254
+ "Name",
255
+ "NumberOfEmployees",
256
+ "OperatingHoursId",
257
+ "OwnerId",
258
+ "Ownership",
259
+ "ParentId",
260
+ "PersonActionCadenceAssigneeId",
261
+ "PersonActionCadenceId",
262
+ "PersonActionCadenceState",
263
+ "PersonIndividualId",
264
+ "PersonScheduledResumeDateTime",
265
+ "Phone",
266
+ "PhotoUrl",
267
+ "Rating",
268
+ "RecordTypeId",
269
+ "Salutation",
270
+ "ShippingAddress",
271
+ "ShippingCity",
272
+ "ShippingCountry",
273
+ "ShippingCountryCode",
274
+ "ShippingGeocodeAccuracy",
275
+ "ShippingLatitude",
276
+ "ShippingLongitude",
277
+ "ShippingPostalCode",
278
+ "ShippingState",
279
+ "ShippingStateCode",
280
+ "ShippingStreet",
281
+ "Sic",
282
+ "SicDesc",
283
+ "Site",
284
+ "TickerSymbol",
285
+ "Tradestyle",
286
+ "Type",
287
+ "Website",
288
+ "YearStarted",
289
+ "FirstName",
290
+ "LastName",
291
+ "MiddleName",
292
+ "PersonAssistantName",
293
+ "PersonAssistantPhone",
294
+ "PersonBirthDate",
295
+ "PersonContactId",
296
+ "PersonDepartment",
297
+ "PersonEmail",
298
+ "PersonEmailBouncedDate",
299
+ "PersonEmailBouncedReason",
300
+ "PersonGenderIdentity",
301
+ "PersonHasOptedOutOfEmail",
302
+ "PersonHomePhone",
303
+ "PersonLeadSource",
304
+ "PersonMailingAddress",
305
+ "PersonMailingCity",
306
+ "PersonMailingCountry",
307
+ "PersonMailingPostalCode",
308
+ "PersonMailingState",
309
+ "PersonMailingCountryCode",
310
+ "PersonMailingStateCode",
311
+ "PersonMailingGeocodeAccuracy",
312
+ "PersonMailingLatitude",
313
+ "PersonMailingLongitude",
314
+ "PersonMailingStreet",
315
+ "PersonMobilePhone",
316
+ "PersonOtherCity",
317
+ "PersonOtherCountry",
318
+ "PersonOtherPostalCode",
319
+ "PersonOtherState",
320
+ "PersonOtherCountryCode",
321
+ "PersonOtherStateCode",
322
+ "PersonOtherLatitude",
323
+ "PersonOtherLongitude",
324
+ "PersonOtherPhone",
325
+ "PersonOtherStreet",
326
+ "PersonPronouns",
327
+ "PersonReportsToId",
328
+ "PersonTitle",
329
+ "Suffix",
330
+ ),
331
+ "sf_contacts": (
332
+ "Id",
333
+ "AccountId",
334
+ "ActionCadenceAssigneeId",
335
+ "ActionCadenceId",
336
+ "ActionCadenceState",
337
+ "ActiveTrackerCount",
338
+ "ActivityMetricId",
339
+ "ActivityMetricRollupId",
340
+ "AssistantName",
341
+ "AssistantPhone",
342
+ "Birthdate",
343
+ "BuyerAttributes",
344
+ "CanAllowPortalSelfReg",
345
+ "CleanStatus",
346
+ "CommerceCustomerReference",
347
+ "CommerceGroupReference",
348
+ "CommerceOrganizationReference",
349
+ "ConnectionReceivedId",
350
+ "ConnectionSentId",
351
+ "ContactSource",
352
+ "Department",
353
+ "DepartmentGroup",
354
+ "Description",
355
+ "DoNotCall",
356
+ "Email",
357
+ "EmailBouncedDate",
358
+ "EmailBouncedReason",
359
+ "Fax",
360
+ "FirstCallDateTime",
361
+ "FirstEmailDateTime",
362
+ "FirstName",
363
+ "GenderIdentity",
364
+ "HasOptedOutOfEmail",
365
+ "HasOptedOutOfFax",
366
+ "HomePhone",
367
+ "IndividualId",
368
+ "IsDeleted",
369
+ "IsEmailBounced",
370
+ "IsPersonAccount",
371
+ "IsPriorityRecord",
372
+ "Jigsaw",
373
+ "JigsawContactId",
374
+ "LastActivityDate",
375
+ "LastName",
376
+ "LastReferencedDate",
377
+ "LastViewedDate",
378
+ "LeadSource",
379
+ "MailingAddress",
380
+ "MailingCity",
381
+ "MailingCountry",
382
+ "MailingCountryCode",
383
+ "MailingGeocodeAccuracy",
384
+ "MailingLatitude",
385
+ "MailingLongitude",
386
+ "MailingPostalCode",
387
+ "MailingState",
388
+ "MailingStateCode",
389
+ "MailingStreet",
390
+ "MasterRecordId",
391
+ "MiddleName",
392
+ "MobilePhone",
393
+ "Name",
394
+ "OtherAddress",
395
+ "OtherCity",
396
+ "OtherCountry",
397
+ "OtherCountryCode",
398
+ "OtherGeocodeAccuracy",
399
+ "OtherLatitude",
400
+ "OtherLongitude",
401
+ "OtherPhone",
402
+ "OtherPostalCode",
403
+ "OtherState",
404
+ "OtherStateCode",
405
+ "OtherStreet",
406
+ "OwnerId",
407
+ "Phone",
408
+ "PhotoUrl",
409
+ "Pronouns",
410
+ "RecordTypeId",
411
+ "ReportsToId",
412
+ "Salutation",
413
+ "ScheduledResumeDateTime",
414
+ "Suffix",
415
+ "Title",
416
+ "TitleType",
417
+ ),
418
+ "sf_leads": (
419
+ "Id",
420
+ "ActionCadenceAssigneeId",
421
+ "ActionCadenceId",
422
+ "ActionCadenceState",
423
+ "ActiveTrackerCount",
424
+ "ActivityMetricId",
425
+ "ActivityMetricRollupId",
426
+ "Address",
427
+ "AnnualRevenue",
428
+ "City",
429
+ "CleanStatus",
430
+ "Company",
431
+ "CompanyDunsNumber",
432
+ "ConvertedAccountId",
433
+ "ConvertedContactId",
434
+ "ConvertedDate",
435
+ "ConvertedOpportunityId",
436
+ "ConnectionReceivedId",
437
+ "ConnectionSentId",
438
+ "Country",
439
+ "CountryCode",
440
+ "CurrencyIsoCode",
441
+ "DandBCompanyId",
442
+ "Description",
443
+ "Division",
444
+ "Email",
445
+ "EmailBouncedDate",
446
+ "EmailBouncedReason",
447
+ "ExportStatus",
448
+ "Fax",
449
+ "FirstCallDateTime",
450
+ "FirstEmailDateTime",
451
+ "FirstName",
452
+ "GeocodeAccuracy",
453
+ "GenderIdentity",
454
+ "HasOptedOutOfEmail",
455
+ "HasOptedOutOfFax",
456
+ "IndividualId",
457
+ "Industry",
458
+ "IsConverted",
459
+ "IsDeleted",
460
+ "IsPriorityRecord",
461
+ "IsUnreadByOwner",
462
+ "Jigsaw",
463
+ "JigsawContactId",
464
+ "LastActivityDate",
465
+ "LastName",
466
+ "LastReferencedDate",
467
+ "LastViewedDate",
468
+ "Latitude",
469
+ "LeadSource",
470
+ "Longitude",
471
+ "MasterRecordId",
472
+ "MiddleName",
473
+ "MobilePhone",
474
+ "Name",
475
+ "NumberOfEmployees",
476
+ "OwnerId",
477
+ "PartnerAccountId",
478
+ "Phone",
479
+ "PhotoUrl",
480
+ "PostalCode",
481
+ "Pronouns",
482
+ "Rating",
483
+ "RecordTypeId",
484
+ "Salutation",
485
+ "ScheduledResumeDateTime",
486
+ "ScoreIntelligenceId",
487
+ "State",
488
+ "StateCode",
489
+ "Status",
490
+ "Street",
491
+ "Suffix",
492
+ "Title",
493
+ "Website",
494
+ ),
495
+ "sf_opportunities": (
496
+ "Id",
497
+ "AccountId",
498
+ "ActivityMetricId",
499
+ "ActivityMetricRollupId",
500
+ "AgeInDays",
501
+ "Amount",
502
+ "CampaignId",
503
+ "CloseDate",
504
+ "ConnectionReceivedId",
505
+ "ConnectionSentId",
506
+ "ContactId",
507
+ "ContractId",
508
+ "CurrencyIsoCode",
509
+ "Description",
510
+ "ExpectedRevenue",
511
+ "ExportStatus",
512
+ "Fiscal",
513
+ "FiscalQuarter",
514
+ "FiscalYear",
515
+ "ForecastCategory",
516
+ "ForecastCategoryName",
517
+ "HasOpenActivity",
518
+ "HasOpportunityLineItem",
519
+ "HasOverdueTask",
520
+ "IqScore",
521
+ "IsClosed",
522
+ "IsDeleted",
523
+ "IsExcludedFromTerritory2Filter",
524
+ "IsPriorityRecord",
525
+ "IsPrivate",
526
+ "IsSplit",
527
+ "IsWon",
528
+ "LastActivityDate",
529
+ "LastActivityInDays",
530
+ "LastAmountChangedHistoryId",
531
+ "LastCloseDateChangedHistoryId",
532
+ "LastReferencedDate",
533
+ "LastStageChangeDate",
534
+ "LastStageChangeInDays",
535
+ "LastViewedDate",
536
+ "LeadSource",
537
+ "Name",
538
+ "NextStep",
539
+ "OwnerId",
540
+ "PartnerAccountId",
541
+ "Pricebook2Id",
542
+ "PricebookId",
543
+ "Probability",
544
+ "PushCount",
545
+ "RecordTypeId",
546
+ "StageName",
547
+ "SyncedQuoteID",
548
+ "Territory2Id",
549
+ "TotalOpportunityQuantity",
550
+ "Type",
551
+ ),
552
+ "sf_cases": (
553
+ "Id",
554
+ "AccountId",
555
+ "AssetWarrantyID",
556
+ "BusinessHoursId",
557
+ "Comments",
558
+ "CaseNumber",
559
+ "ClosedDate",
560
+ "CommunityId",
561
+ "ConnectionReceivedId",
562
+ "ConnectionSentId",
563
+ "ContactEmail",
564
+ "ContactFax",
565
+ "ContactId",
566
+ "ContactMobile",
567
+ "ContactPhone",
568
+ "CreatorFullPhotoUrl",
569
+ "CreatorName",
570
+ "CreatorSmallPhotoUrl",
571
+ "Description",
572
+ "FeedItemId",
573
+ "HasCommentsUnreadByOwner",
574
+ "HasSelfServiceComments",
575
+ "IsClosed",
576
+ "IsClosedOnCreate",
577
+ "IsDeleted",
578
+ "IsEscalated",
579
+ "IsSelfServiceClosed",
580
+ "IsStopped",
581
+ "IsVisibleInSelfService",
582
+ "Language",
583
+ "LastReferencedDate",
584
+ "LastViewedDate",
585
+ "MasterRecordId",
586
+ "Origin",
587
+ "OwnerId",
588
+ "ParentId",
589
+ "Priority",
590
+ "QuestionId",
591
+ "Reason",
592
+ "RecordTypeId",
593
+ "ServiceContractId",
594
+ "SlaStartDate",
595
+ "SourceId",
596
+ "Status",
597
+ "StopStartDate",
598
+ "Subject",
599
+ "SuppliedCompany",
600
+ "SuppliedEmail",
601
+ "SuppliedName",
602
+ "SuppliedPhone",
603
+ "Type",
604
+ ),
605
+ "sf_tasks": (
606
+ "Id",
607
+ "AccountId",
608
+ "ActivityDate",
609
+ "CallDisposition",
610
+ "CallDurationInSeconds",
611
+ "CallObject",
612
+ "CallType",
613
+ "CompletedDateTime",
614
+ "ConnectionReceivedId",
615
+ "ConnectionSentId",
616
+ "Description",
617
+ "IsArchived",
618
+ "IsClosed",
619
+ "IsHighPriority",
620
+ "IsRecurrence",
621
+ "IsReminderSet",
622
+ "IsVisibleInSelfService",
623
+ "OwnerId",
624
+ "Priority",
625
+ "RecurrenceActivityId",
626
+ "RecurrenceDayOfMonth",
627
+ "RecurrenceDayOfWeekMask",
628
+ "RecurrenceEndDateOnly",
629
+ "RecurrenceInstance",
630
+ "RecurrenceInterval",
631
+ "RecurrenceMonthOfYear",
632
+ "RecurrenceRegeneratedType",
633
+ "RecurrenceStartDateOnly",
634
+ "RecurrenceTimeZoneSidKey",
635
+ "RecurrenceType",
636
+ "ReminderDateTime",
637
+ "Status",
638
+ "Subject",
639
+ "TaskSubtype",
640
+ "TaskWhoIds",
641
+ "Type",
642
+ "WhatCount",
643
+ "WhatId",
644
+ "WhoCount",
645
+ "WhoId",
646
+ ),
647
+ }
648
+
649
+ #: StageName drives IsWon and IsClosed; neither is directly settable.
650
+ WON = "Closed Won"
651
+ LOST = "Closed Lost"
652
+
653
+ QUERY = re.compile(
654
+ r"""\s*SELECT\s+(?P<fields>[^;]+?)
655
+ \s+FROM\s+(?P<object>[A-Za-z][A-Za-z0-9_]*)
656
+ (?:\s+WHERE\s+(?P<where>.+?))?
657
+ (?:\s+ORDER\s+BY\s+(?P<order>[A-Za-z][A-Za-z0-9_]*)(?:\s+(?P<direction>ASC|DESC))?)?
658
+ (?:\s+LIMIT\s+(?P<limit>\d+))?
659
+ \s*$""",
660
+ re.IGNORECASE | re.VERBOSE | re.DOTALL,
661
+ )
662
+ CONDITION = re.compile(r"^(?P<field>[A-Za-z][A-Za-z0-9_]*)\s*(?P<operator>!=|<=|>=|=|<|>)\s*(?P<literal>.+)$")
663
+ COMPARISONS = {
664
+ "=": lambda a, b: a == b,
665
+ "!=": lambda a, b: a != b,
666
+ "<": lambda a, b: _ordered(a, b) < 0,
667
+ "<=": lambda a, b: _ordered(a, b) <= 0,
668
+ ">": lambda a, b: _ordered(a, b) > 0,
669
+ ">=": lambda a, b: _ordered(a, b) >= 0,
670
+ }
671
+
672
+
673
+ def error(code, message, fields=()):
674
+ """The vendor's error body, verbatim in shape."""
675
+ return ValueError(json.dumps([{"message": message, "errorCode": code, "fields": list(fields)}]))
676
+
677
+
678
+ def _rank(value):
679
+ """Order NULL first, then booleans, numbers and text, as SOQL sorts."""
680
+ if value is None:
681
+ return (0, 0, "")
682
+ if isinstance(value, bool):
683
+ return (1, int(value), "")
684
+ if isinstance(value, (int, float)):
685
+ return (2, value, "")
686
+ return (3, 0, str(value))
687
+
688
+
689
+ def _ordered(left, right):
690
+ a, b = _rank(left), _rank(right)
691
+ return (a > b) - (a < b)
692
+
693
+
694
+ def _derive(stage):
695
+ return {"IsClosed": stage in (WON, LOST), "IsWon": stage == WON}
696
+
697
+
698
+ def _reference(entity, value, field):
699
+ if value is not None and store.get(entity, {"Id": value}) is None:
700
+ raise error(
701
+ "INVALID_CROSS_REFERENCE_KEY",
702
+ f"invalid cross reference id: {value}",
703
+ [field],
704
+ )
705
+
706
+
707
+ @tool(name="list_opportunities")
708
+ def list_opportunities(AccountId):
709
+ return [o for o in store.list("sf_opportunities") if o.get("AccountId") == AccountId]
710
+
711
+
712
+ @tool(name="create_opportunity")
713
+ def create_opportunity(opportunity):
714
+ _reference("sf_accounts", opportunity.get("AccountId"), "AccountId")
715
+ _reference("sf_users", opportunity.get("OwnerId"), "OwnerId")
716
+ record = {**opportunity, **_derive(opportunity["StageName"])}
717
+ return store.insert("sf_opportunities", record, source={"record": "tool.create_opportunity"})
718
+
719
+
720
+ @tool(name="update_stage")
721
+ def update_stage(Id, StageName):
722
+ if store.get("sf_opportunities", {"Id": Id}) is None:
723
+ raise error("NOT_FOUND", "The requested resource does not exist", ["Id"])
724
+ return store.update(
725
+ "sf_opportunities",
726
+ {"Id": Id},
727
+ {"StageName": StageName, **_derive(StageName)},
728
+ source={"record": "tool.update_stage"},
729
+ )
730
+
731
+
732
+ @tool(name="query_records")
733
+ def query_records(soql):
734
+ """SELECT fields FROM object [WHERE ...] [ORDER BY field [ASC|DESC]] [LIMIT n]."""
735
+ parsed = QUERY.match(soql)
736
+ if parsed is None:
737
+ raise error("MALFORMED_QUERY", "An invalid query string was specified")
738
+ name = _object(parsed.group("object"))
739
+ known = {field.lower(): field for field in FIELDS[OBJECTS[name]]}
740
+ fields = [_field(known, f) for f in parsed.group("fields").split(",")]
741
+ rows = store.list(OBJECTS[name])
742
+ for condition in _conditions(parsed.group("where")):
743
+ rows = [row for row in rows if _matches(known, row, condition)]
744
+ if parsed.group("order"):
745
+ rows.sort(
746
+ key=lambda row: _rank(row.get(_field(known, parsed.group("order")))),
747
+ reverse=(parsed.group("direction") or "ASC").upper() == "DESC",
748
+ )
749
+ if parsed.group("limit"):
750
+ rows = rows[: int(parsed.group("limit"))]
751
+ records = [
752
+ {
753
+ "attributes": {
754
+ "type": name,
755
+ "url": f"/services/data/{API_VERSION}/sobjects/{name}/{row['Id']}",
756
+ },
757
+ **{field: row.get(field) for field in fields},
758
+ }
759
+ for row in rows
760
+ ]
761
+ return {"totalSize": len(records), "done": True, "records": records}
762
+
763
+
764
+ def _object(name):
765
+ for candidate in OBJECTS:
766
+ if candidate.lower() == name.lower():
767
+ return candidate
768
+ raise error("INVALID_TYPE", f"sObject type '{name}' is not supported")
769
+
770
+
771
+ def _field(known, name):
772
+ field = known.get(name.strip().lower())
773
+ if field is None:
774
+ raise error("INVALID_FIELD", f"No such column '{name.strip()}'", [name.strip()])
775
+ return field
776
+
777
+
778
+ def _conditions(where):
779
+ if not where:
780
+ return []
781
+ parsed = []
782
+ for clause in re.split(r"\s+AND\s+", where.strip(), flags=re.IGNORECASE):
783
+ match = CONDITION.match(clause.strip())
784
+ if match is None:
785
+ raise error("MALFORMED_QUERY", "An invalid query string was specified")
786
+ parsed.append((match.group("field"), match.group("operator"), _literal(match.group("literal"))))
787
+ return parsed
788
+
789
+
790
+ def _literal(text):
791
+ text = text.strip()
792
+ if len(text) >= 2 and text[0] == "'" and text[-1] == "'":
793
+ return text[1:-1]
794
+ if text.upper() == "NULL":
795
+ return None
796
+ if text.upper() in ("TRUE", "FALSE"):
797
+ return text.upper() == "TRUE"
798
+ try:
799
+ return int(text) if re.fullmatch(r"-?\d+", text) else float(text)
800
+ except ValueError:
801
+ raise error("MALFORMED_QUERY", "An invalid query string was specified") from None
802
+
803
+
804
+ def _matches(known, row, condition):
805
+ field, operator, literal = condition
806
+ return COMPARISONS[operator](row.get(_field(known, field)), literal)