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,28 @@
1
+ """Jira world tools; every mutation goes through the schema store."""
2
+
3
+ from gateway_env import store, tool
4
+
5
+
6
+ @tool(name="search_issues")
7
+ def search_issues(project_key, status=None):
8
+ issues = [i for i in store.list("jira_issues") if i["project_key"] == project_key]
9
+ return [i for i in issues if status is None or i["status"] == status]
10
+
11
+
12
+ @tool(name="transition_issue")
13
+ def transition_issue(transition):
14
+ issue = store.get("jira_issues", {"key": transition["issue_key"]})
15
+ if issue is None or issue["status"] != transition["from_status"]:
16
+ raise ValueError("invalid_transition: the issue is not in from_status")
17
+ store.insert("jira_transitions", transition, source={"record": "tool.transition_issue"})
18
+ return store.update(
19
+ "jira_issues",
20
+ {"key": transition["issue_key"]},
21
+ {"status": transition["to_status"]},
22
+ source={"record": "tool.transition_issue"},
23
+ )
24
+
25
+
26
+ @tool(name="add_comment")
27
+ def add_comment(comment):
28
+ return store.insert("jira_comments", comment, source={"record": "tool.add_comment"})
@@ -0,0 +1,389 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:gateway:connector:jira",
4
+ "$defs": {
5
+ "Project": {
6
+ "type": "object",
7
+ "properties": {
8
+ "key": {
9
+ "$ref": "base.json#/$defs/Label"
10
+ },
11
+ "name": {
12
+ "$ref": "base.json#/$defs/Label"
13
+ },
14
+ "lead_id": {
15
+ "$ref": "base.json#/$defs/Id"
16
+ }
17
+ },
18
+ "required": [
19
+ "key",
20
+ "name",
21
+ "lead_id"
22
+ ],
23
+ "additionalProperties": false
24
+ },
25
+ "User": {
26
+ "type": "object",
27
+ "properties": {
28
+ "account_id": {
29
+ "$ref": "base.json#/$defs/Id"
30
+ },
31
+ "display_name": {
32
+ "$ref": "base.json#/$defs/Label"
33
+ },
34
+ "email": {
35
+ "anyOf": [
36
+ {
37
+ "$ref": "base.json#/$defs/Email"
38
+ },
39
+ {
40
+ "type": "null"
41
+ }
42
+ ]
43
+ }
44
+ },
45
+ "required": [
46
+ "account_id",
47
+ "display_name"
48
+ ],
49
+ "additionalProperties": false
50
+ },
51
+ "Issue": {
52
+ "type": "object",
53
+ "properties": {
54
+ "key": {
55
+ "$ref": "base.json#/$defs/Label"
56
+ },
57
+ "project_key": {
58
+ "$ref": "base.json#/$defs/Label"
59
+ },
60
+ "summary": {
61
+ "$ref": "base.json#/$defs/Label"
62
+ },
63
+ "description": {
64
+ "anyOf": [
65
+ {
66
+ "$ref": "base.json#/$defs/Text"
67
+ },
68
+ {
69
+ "type": "null"
70
+ }
71
+ ]
72
+ },
73
+ "issue_type": {
74
+ "type": "string",
75
+ "enum": [
76
+ "Task",
77
+ "Bug",
78
+ "Story",
79
+ "Epic"
80
+ ]
81
+ },
82
+ "status": {
83
+ "type": "string",
84
+ "enum": [
85
+ "To Do",
86
+ "In Progress",
87
+ "In Review",
88
+ "Done"
89
+ ]
90
+ },
91
+ "priority": {
92
+ "type": "string",
93
+ "enum": [
94
+ "Lowest",
95
+ "Low",
96
+ "Medium",
97
+ "High",
98
+ "Highest"
99
+ ]
100
+ },
101
+ "assignee_id": {
102
+ "type": [
103
+ "string",
104
+ "null"
105
+ ],
106
+ "minLength": 1,
107
+ "maxLength": 128
108
+ },
109
+ "reporter_id": {
110
+ "$ref": "base.json#/$defs/Id"
111
+ },
112
+ "created_at": {
113
+ "$ref": "base.json#/$defs/Timestamp"
114
+ }
115
+ },
116
+ "required": [
117
+ "key",
118
+ "project_key",
119
+ "summary",
120
+ "issue_type",
121
+ "status",
122
+ "priority",
123
+ "reporter_id",
124
+ "created_at"
125
+ ],
126
+ "additionalProperties": false
127
+ },
128
+ "Comment": {
129
+ "type": "object",
130
+ "properties": {
131
+ "id": {
132
+ "$ref": "base.json#/$defs/Id"
133
+ },
134
+ "issue_key": {
135
+ "$ref": "base.json#/$defs/Label"
136
+ },
137
+ "author_id": {
138
+ "$ref": "base.json#/$defs/Id"
139
+ },
140
+ "body": {
141
+ "$ref": "base.json#/$defs/Text"
142
+ },
143
+ "created_at": {
144
+ "$ref": "base.json#/$defs/Timestamp"
145
+ }
146
+ },
147
+ "required": [
148
+ "id",
149
+ "issue_key",
150
+ "author_id",
151
+ "body",
152
+ "created_at"
153
+ ],
154
+ "additionalProperties": false
155
+ },
156
+ "Transition": {
157
+ "type": "object",
158
+ "properties": {
159
+ "id": {
160
+ "$ref": "base.json#/$defs/Id"
161
+ },
162
+ "issue_key": {
163
+ "$ref": "base.json#/$defs/Label"
164
+ },
165
+ "actor_id": {
166
+ "$ref": "base.json#/$defs/Id"
167
+ },
168
+ "from_status": {
169
+ "type": "string",
170
+ "enum": [
171
+ "To Do",
172
+ "In Progress",
173
+ "In Review",
174
+ "Done"
175
+ ]
176
+ },
177
+ "to_status": {
178
+ "type": "string",
179
+ "enum": [
180
+ "To Do",
181
+ "In Progress",
182
+ "In Review",
183
+ "Done"
184
+ ]
185
+ },
186
+ "at": {
187
+ "$ref": "base.json#/$defs/Timestamp"
188
+ }
189
+ },
190
+ "required": [
191
+ "id",
192
+ "issue_key",
193
+ "actor_id",
194
+ "from_status",
195
+ "to_status",
196
+ "at"
197
+ ],
198
+ "additionalProperties": false
199
+ }
200
+ },
201
+ "x-gateway": {
202
+ "version": 1,
203
+ "domain_version": "1.0.0",
204
+ "package": {
205
+ "id": "gateway-connector-jira",
206
+ "version": "1.0.0"
207
+ },
208
+ "entities": {
209
+ "jira_projects": {
210
+ "schema": {
211
+ "$ref": "#/$defs/Project"
212
+ },
213
+ "primary_key": [
214
+ "key"
215
+ ],
216
+ "unique": [],
217
+ "relationships": [
218
+ {
219
+ "fields": [
220
+ "lead_id"
221
+ ],
222
+ "target": "jira_users",
223
+ "on_delete": "restrict"
224
+ }
225
+ ]
226
+ },
227
+ "jira_users": {
228
+ "schema": {
229
+ "$ref": "#/$defs/User"
230
+ },
231
+ "primary_key": [
232
+ "account_id"
233
+ ],
234
+ "unique": [],
235
+ "relationships": []
236
+ },
237
+ "jira_issues": {
238
+ "schema": {
239
+ "$ref": "#/$defs/Issue"
240
+ },
241
+ "primary_key": [
242
+ "key"
243
+ ],
244
+ "unique": [],
245
+ "relationships": [
246
+ {
247
+ "fields": [
248
+ "project_key"
249
+ ],
250
+ "target": "jira_projects",
251
+ "on_delete": "restrict"
252
+ },
253
+ {
254
+ "fields": [
255
+ "assignee_id"
256
+ ],
257
+ "target": "jira_users",
258
+ "on_delete": "restrict"
259
+ },
260
+ {
261
+ "fields": [
262
+ "reporter_id"
263
+ ],
264
+ "target": "jira_users",
265
+ "on_delete": "restrict"
266
+ }
267
+ ]
268
+ },
269
+ "jira_comments": {
270
+ "schema": {
271
+ "$ref": "#/$defs/Comment"
272
+ },
273
+ "primary_key": [
274
+ "id"
275
+ ],
276
+ "unique": [],
277
+ "relationships": [
278
+ {
279
+ "fields": [
280
+ "issue_key"
281
+ ],
282
+ "target": "jira_issues",
283
+ "on_delete": "restrict"
284
+ },
285
+ {
286
+ "fields": [
287
+ "author_id"
288
+ ],
289
+ "target": "jira_users",
290
+ "on_delete": "restrict"
291
+ }
292
+ ]
293
+ },
294
+ "jira_transitions": {
295
+ "schema": {
296
+ "$ref": "#/$defs/Transition"
297
+ },
298
+ "primary_key": [
299
+ "id"
300
+ ],
301
+ "unique": [],
302
+ "relationships": [
303
+ {
304
+ "fields": [
305
+ "issue_key"
306
+ ],
307
+ "target": "jira_issues",
308
+ "on_delete": "restrict"
309
+ },
310
+ {
311
+ "fields": [
312
+ "actor_id"
313
+ ],
314
+ "target": "jira_users",
315
+ "on_delete": "restrict"
316
+ }
317
+ ]
318
+ }
319
+ },
320
+ "tools": {
321
+ "search_issues": {
322
+ "input": {
323
+ "type": "object",
324
+ "properties": {
325
+ "project_key": {
326
+ "$ref": "base.json#/$defs/Label"
327
+ },
328
+ "status": {
329
+ "type": "string",
330
+ "enum": [
331
+ "To Do",
332
+ "In Progress",
333
+ "In Review",
334
+ "Done"
335
+ ]
336
+ }
337
+ },
338
+ "required": [
339
+ "project_key"
340
+ ],
341
+ "additionalProperties": false
342
+ },
343
+ "output": {
344
+ "type": "array",
345
+ "items": {
346
+ "$ref": "#/$defs/Issue"
347
+ }
348
+ },
349
+ "description": "Issues in a project, optionally by status."
350
+ },
351
+ "transition_issue": {
352
+ "input": {
353
+ "type": "object",
354
+ "properties": {
355
+ "transition": {
356
+ "$ref": "#/$defs/Transition"
357
+ }
358
+ },
359
+ "required": [
360
+ "transition"
361
+ ],
362
+ "additionalProperties": false
363
+ },
364
+ "output": {
365
+ "$ref": "#/$defs/Issue"
366
+ },
367
+ "description": "Record a transition and move the issue to its target status."
368
+ },
369
+ "add_comment": {
370
+ "input": {
371
+ "type": "object",
372
+ "properties": {
373
+ "comment": {
374
+ "$ref": "#/$defs/Comment"
375
+ }
376
+ },
377
+ "required": [
378
+ "comment"
379
+ ],
380
+ "additionalProperties": false
381
+ },
382
+ "output": {
383
+ "$ref": "#/$defs/Comment"
384
+ },
385
+ "description": "Comment on an existing issue."
386
+ }
387
+ }
388
+ }
389
+ }
@@ -0,0 +1,38 @@
1
+ """Kandji (Iru) world tools; every mutation goes through the schema store.
2
+
3
+ Error strings are the vendor's own. The Iru Endpoint Management API documents a
4
+ single 404 body for a resource that is not in the tenant, and the device PATCH
5
+ endpoint (the operation ``assign_blueprint`` mirrors) declares no narrower code.
6
+ """
7
+
8
+ from gateway_env import store, tool
9
+
10
+ NOT_FOUND = "Unable to locate the resource in the Iru tenant."
11
+
12
+
13
+ @tool(name="list_devices")
14
+ def list_devices(blueprint_id=None):
15
+ devices = store.list("kandji_devices")
16
+ if blueprint_id is None:
17
+ return devices
18
+ return [d for d in devices if d["blueprint_id"] == blueprint_id]
19
+
20
+
21
+ @tool(name="get_device")
22
+ def get_device(device_id):
23
+ return store.get("kandji_devices", {"device_id": device_id})
24
+
25
+
26
+ @tool(name="assign_blueprint")
27
+ def assign_blueprint(device_id, blueprint_id):
28
+ if store.get("kandji_devices", {"device_id": device_id}) is None:
29
+ raise ValueError(NOT_FOUND)
30
+ blueprint = store.get("kandji_blueprints", {"id": blueprint_id})
31
+ if blueprint is None:
32
+ raise ValueError(NOT_FOUND)
33
+ return store.update(
34
+ "kandji_devices",
35
+ {"device_id": device_id},
36
+ {"blueprint_id": blueprint_id, "blueprint_name": blueprint["name"]},
37
+ source={"record": "tool.assign_blueprint"},
38
+ )
@@ -0,0 +1,29 @@
1
+ {
2
+ "version": 1,
3
+ "connector": "kandji",
4
+ "status": "subset",
5
+ "world_tools": ["assign_blueprint", "get_device", "list_devices"],
6
+ "registration": {
7
+ "mode": "remote_mcp",
8
+ "provider": "user_configured",
9
+ "managed_tool_allowlist": []
10
+ },
11
+ "surfaces": [
12
+ {
13
+ "name": "Iru MCP",
14
+ "kind": "official_remote_mcp",
15
+ "auth": "X-API-Key and X-MCP-Profile request headers",
16
+ "manifest_validation": "credential_required",
17
+ "supported_world_tools": [
18
+ "assign_blueprint",
19
+ "get_device",
20
+ "list_devices"
21
+ ],
22
+ "limitations": [
23
+ "The endpoint and tools/list manifest are tenant-specific.",
24
+ "Exact input and output parity requires a credentialed tenant bind."
25
+ ],
26
+ "evidence": ["https://support.kandji.io/kb/iru-mcp-server"]
27
+ }
28
+ ]
29
+ }
@@ -0,0 +1,152 @@
1
+ {
2
+ "slug": "kandji",
3
+ "shape": "base",
4
+ "label": "subset",
5
+ "authored_by": "connector-template-author (hand-transcribed; the `docs` importer does not exist yet)",
6
+ "generated_at": "2026-09-06T22:27:40Z",
7
+ "scope_hash": "sha256:eb8c426ef2725a17cb521cc2cd43b76888c28e592a3be65d1138a6488a077640",
8
+ "world_sha256": "sha256:6f54db6b55824c487385349e3d49fd07f4cb11e09bbbe008e4d002cbea85f435",
9
+ "source": [
10
+ {
11
+ "kind": "docs",
12
+ "url": "https://api-docs.kandji.io/",
13
+ "version": "fetched 2026-09-06; redirects to https://api-docs.iru.com/ (Kandji is now Iru)",
14
+ "sha256": "178c0db4d02acc3801f8f40960effa6aa68811e9b8b533b87b223dc4b23aa523",
15
+ "note": "Documentation shell pinned as fetched bytes. The entity evidence is the vendor Postman collection rendered by this shell."
16
+ },
17
+ {
18
+ "kind": "postman",
19
+ "url": "https://api-docs.iru.com/api/collections/15284493/TzCTZkBe?segregateAuth=true&versionTag=latest",
20
+ "version": "fetched 2026-09-06; collection _postman_id 336d6648-e062-4cbd-a70a-2a0c276cd4ad; the response declares no updatedAt or immutable version",
21
+ "sha256": "cc323f7dd4052a6a6fa7882d8a45596b0144f5b31a8d890c7c77c3e1a9882119",
22
+ "note": "Primary vendor evidence. Fields, returned nesting, empty-string sentinels, blueprint type values, and library-item status values are transcribed from its endpoint descriptions and example responses."
23
+ },
24
+ {
25
+ "kind": "openapi",
26
+ "url": "https://raw.githubusercontent.com/MScottBlake/kandji-openapi/46fa742a831ee84405b3c03a8911ad0510a9310a/openapi.json",
27
+ "version": "community conversion at commit 46fa742a831ee84405b3c03a8911ad0510a9310a (main verified at that commit on 2026-09-06)",
28
+ "sha256": "dde0e566da4fe526396b78e7364497b7c6660e9af52a0054f7a0851950b3b8c1",
29
+ "note": "Cross-check only. This is not a vendor OpenAPI declaration and contributed no fields."
30
+ }
31
+ ],
32
+ "source_verification": {
33
+ "performed_at": "2026-09-06T21:24:58Z",
34
+ "commands": [
35
+ "curl -fsSL \"https://api-docs.kandji.io/\" | sha256sum",
36
+ "curl -fsSL \"https://api-docs.iru.com/api/collections/15284493/TzCTZkBe?segregateAuth=true&versionTag=latest\" | sha256sum",
37
+ "curl -fsSL \"https://raw.githubusercontent.com/MScottBlake/kandji-openapi/46fa742a831ee84405b3c03a8911ad0510a9310a/openapi.json\" | sha256sum",
38
+ "git ls-remote \"https://github.com/MScottBlake/kandji-openapi\" refs/heads/main"
39
+ ],
40
+ "result": "All three fetched byte streams matched the hashes recorded above; refs/heads/main resolved to 46fa742a831ee84405b3c03a8911ad0510a9310a."
41
+ },
42
+ "entity_sources": {
43
+ "kandji_devices": "GET /api/v1/devices and GET /api/v1/devices/{device_id}; the common high-level response fields are retained, including nested user and tags",
44
+ "kandji_blueprints": "GET /api/v1/blueprints and GET /api/v1/blueprints/{blueprint_id}",
45
+ "kandji_library_items": "GET /api/v1/blueprints/{blueprint_id}/list-library-items for id/name plus GET /api/v1/devices/{device_id}/library-items for optional type/status/audit fields",
46
+ "kandji_blueprint_items": "GET /api/v1/blueprints/{blueprint_id}/list-library-items and POST /api/v1/blueprints/{blueprint_id}/assign-library-item",
47
+ "kandji_users": "GET /api/v1/users and GET /api/v1/users/{user_id}",
48
+ "kandji_tags": "GET /api/v1/tags and POST /api/v1/tags",
49
+ "kandji_device_tags": "GET /api/v1/devices (tags array) and PATCH /api/v1/devices/{device_id} (tags request body)",
50
+ "kandji_device_apps": "GET /api/v1/devices/{device_id}/apps, Mac and iPad example responses"
51
+ },
52
+ "enums": {
53
+ "kandji_devices.platform": {
54
+ "values": ["Mac", "iPhone", "iPad", "AppleTV", "Windows", "Android"],
55
+ "evidence": "Each literal is a vendor example-response platform value. The vendor calls the endpoint polymorphic but does not publish a closed allowed-values block.",
56
+ "confidence": "example-derived; completeness unverified"
57
+ },
58
+ "kandji_blueprints.type": {
59
+ "values": ["classic", "map"],
60
+ "evidence": "GET Blueprint annotates `type` with `values - classic or map`; Create Blueprint repeats `type: map` for an Assignment Map.",
61
+ "confidence": "vendor-declared values"
62
+ },
63
+ "kandji_library_items.status": {
64
+ "values": ["AVAILABLE", "CACHED", "CHANGE_PENDING", "DOWNLOADING", "ERROR", "EXCLUDED", "INCOMPATIBLE", "INSTALLING", "PASS", "PENDING", "failed", "pending", "success"],
65
+ "evidence": "The vendor's Get Device Library Items description has a dedicated `Possible library item status values` table. Values and casing are preserved in table order.",
66
+ "confidence": "vendor-declared value block"
67
+ },
68
+ "kandji_library_items.type": {
69
+ "values": null,
70
+ "evidence": "The vendor publishes examples but no closed type list, so this field remains an open string rather than an invented enum."
71
+ }
72
+ },
73
+ "errors": {
74
+ "format": "The vendor documents a response-code table and endpoint-specific bodies. Examples are JSON strings or arrays of strings; there is no fixed detail/error object envelope.",
75
+ "codes": {
76
+ "400": "Bad Request, including command-state and JSON parse examples",
77
+ "401": "Unauthorized",
78
+ "403": "Forbidden",
79
+ "404": "Unable to locate the resource in the Iru tenant.",
80
+ "415": "Unsupported Media Type",
81
+ "500": "Internal server error",
82
+ "503": "Service unavailable"
83
+ },
84
+ "modelled": {
85
+ "assign_blueprint": "Raises the vendor's documented 404 text for an unknown device_id or blueprint_id."
86
+ },
87
+ "not_modelled": [
88
+ "The library-item assignment 400 bodies are documented but no assignment tool is shipped."
89
+ ]
90
+ },
91
+ "modelling_notes": [
92
+ "Device.user preserves the vendor's nested {email, name, id, is_archived} object and its documented empty-string unassigned sentinel. /user/id relates assigned devices to kandji_users without flattening; the sentinel is treated as absent.",
93
+ "Device.last_check_in preserves the vendor's empty-string never-checked-in sentinel instead of accepting undocumented JSON null.",
94
+ "Device lost_mode_status is optional because List Devices returns it while the documented Get Mac and Get iPad examples omit it; fields common to those read forms remain required.",
95
+ "Blueprint.enrollment_code is one optionality unit at the endpoint level: when the required section is returned, both code and is_active are required within it.",
96
+ "LibraryItem uses union properties across the definition and per-device status reads. Only id and name are required because they are the definition form; type/status/audit fields are optional. The status read's item_id maps to the definition id.",
97
+ "DeviceApp carries every field in the vendor's Apple-family nested app section. device_id comes from the response envelope; the app object itself remains otherwise unflattened.",
98
+ "first_enrollment and last_enrollment remain plain strings because the vendor examples use a space separator and are not RFC 3339 date-time values.",
99
+ "Blueprint name uniqueness is vendor-declared by Create Blueprint. Device serial, user email, and tag name uniqueness were removed because the vendor does not declare those constraints."
100
+ ],
101
+ "compiler_limitations": [
102
+ "The /user/id relationship resolves through the object branch while the documented empty-string branch remains an unassigned sentinel.",
103
+ "Entity roots and primary keys cannot vary by response branch. Windows and Android app objects use product_code/name and package_name instead of bundle_id, so this eight-entity base subset models only the complete Apple-family app form.",
104
+ "A faithful per-device library-item status relation would require a separate ninth entity. The fixed base subset retains the scalar status/audit fields as optional library-item properties and omits nested computer, blueprint, and edr_status sections."
105
+ ],
106
+ "unverified": [
107
+ {
108
+ "item": "kandji_devices.platform completeness",
109
+ "why": "Six values are evidenced by vendor examples, but no closed vendor value block exists."
110
+ },
111
+ {
112
+ "item": "Live-tenant requiredness and distributions",
113
+ "why": "No authorized Kandji/Iru sandbox or tenant was available. Requiredness is the intersection of the documented read examples plus the vendor statement that visible polymorphic fields are present."
114
+ },
115
+ {
116
+ "item": "Round trip and goldens",
117
+ "why": "Skipped because no authorized tenant was available; no customer data was used or committed."
118
+ }
119
+ ],
120
+ "coverage": {
121
+ "entities": 8,
122
+ "recursive_fields": 85,
123
+ "field_count_method": "For each x-gateway entity schema, count every object property recursively after resolving local/base $ref and descending object properties, array items, and allOf/anyOf/oneOf branches.",
124
+ "field_counts": {
125
+ "kandji_devices": 26,
126
+ "kandji_blueprints": 11,
127
+ "kandji_library_items": 11,
128
+ "kandji_blueprint_items": 3,
129
+ "kandji_users": 16,
130
+ "kandji_tags": 2,
131
+ "kandji_device_tags": 2,
132
+ "kandji_device_apps": 14
133
+ },
134
+ "vendor_sections_in_scope": ["Device Information summary", "Blueprints", "Library-item definition/status subset", "Users", "Tags", "Apple-family installed apps"],
135
+ "vendor_sections_excluded": ["Windows/Android app forms", "platform-specific device summary additions", "Device Actions", "Device Secrets", "Automated Device Enrollment integrations", "Prism", "Threats", "Vulnerabilities", "Audit Log", "Settings"],
136
+ "reasons": "See scope.toml [exclusions] and [compiler_limitations]."
137
+ },
138
+ "sandbox": {
139
+ "availability": "Account-team provisioned; none available for this work",
140
+ "devices_seedable": false,
141
+ "round_trip": "skipped",
142
+ "goldens": "none"
143
+ },
144
+ "fixtures": {
145
+ "records": null,
146
+ "note": "No fixture was added. The connector template layout does not copy connector-local data files, and no customer data was available or used."
147
+ },
148
+ "surface": {
149
+ "mcp": null,
150
+ "note": "No MCP surface is declared, so parity does not apply."
151
+ }
152
+ }