openstategraph 0.3.0rc18__tar.gz

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 (1059) hide show
  1. openstategraph-0.3.0rc18/.env.example +11 -0
  2. openstategraph-0.3.0rc18/.gitignore +80 -0
  3. openstategraph-0.3.0rc18/LICENSE +21 -0
  4. openstategraph-0.3.0rc18/PKG-INFO +179 -0
  5. openstategraph-0.3.0rc18/README.md +93 -0
  6. openstategraph-0.3.0rc18/hatch_build.py +269 -0
  7. openstategraph-0.3.0rc18/openstategraph/__init__.py +116 -0
  8. openstategraph-0.3.0rc18/openstategraph/_extras.py +176 -0
  9. openstategraph-0.3.0rc18/openstategraph/abc/__init__.py +146 -0
  10. openstategraph-0.3.0rc18/openstategraph/abc/agent.py +571 -0
  11. openstategraph-0.3.0rc18/openstategraph/abc/async_doors.py +186 -0
  12. openstategraph-0.3.0rc18/openstategraph/abc/async_task_middleware.py +574 -0
  13. openstategraph-0.3.0rc18/openstategraph/abc/criteria_check.py +59 -0
  14. openstategraph-0.3.0rc18/openstategraph/abc/deep_tier_offload.py +809 -0
  15. openstategraph-0.3.0rc18/openstategraph/abc/grader.py +425 -0
  16. openstategraph-0.3.0rc18/openstategraph/abc/guardrail.py +416 -0
  17. openstategraph-0.3.0rc18/openstategraph/abc/kanban_store.py +635 -0
  18. openstategraph-0.3.0rc18/openstategraph/abc/middleware.py +111 -0
  19. openstategraph-0.3.0rc18/openstategraph/abc/narration.py +640 -0
  20. openstategraph-0.3.0rc18/openstategraph/abc/node_family.py +251 -0
  21. openstategraph-0.3.0rc18/openstategraph/abc/orchestrator.py +852 -0
  22. openstategraph-0.3.0rc18/openstategraph/abc/prompt.py +316 -0
  23. openstategraph-0.3.0rc18/openstategraph/abc/router.py +501 -0
  24. openstategraph-0.3.0rc18/openstategraph/abc/run_context_prompt.py +133 -0
  25. openstategraph-0.3.0rc18/openstategraph/abc/tool.py +656 -0
  26. openstategraph-0.3.0rc18/openstategraph/abc/tool_findings.py +766 -0
  27. openstategraph-0.3.0rc18/openstategraph/abc/tool_notes.py +891 -0
  28. openstategraph-0.3.0rc18/openstategraph/abc/tool_sentences.py +325 -0
  29. openstategraph-0.3.0rc18/openstategraph/agent_brief.md +158 -0
  30. openstategraph-0.3.0rc18/openstategraph/agent_brief.py +123 -0
  31. openstategraph-0.3.0rc18/openstategraph/agent_config.py +436 -0
  32. openstategraph-0.3.0rc18/openstategraph/agent_skills/kanban-patrol/SKILL.md +100 -0
  33. openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/SKILL.md +250 -0
  34. openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/build-loop.md +189 -0
  35. openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/environments.md +117 -0
  36. openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/interview.md +138 -0
  37. openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/shapes.md +278 -0
  38. openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/subagents.md +80 -0
  39. openstategraph-0.3.0rc18/openstategraph/agent_skills/ticket-forge/SKILL.md +62 -0
  40. openstategraph-0.3.0rc18/openstategraph/api/__init__.py +26 -0
  41. openstategraph-0.3.0rc18/openstategraph/api/ambient_tools.py +65 -0
  42. openstategraph-0.3.0rc18/openstategraph/api/audience.py +608 -0
  43. openstategraph-0.3.0rc18/openstategraph/api/auth.py +397 -0
  44. openstategraph-0.3.0rc18/openstategraph/api/broadcast.py +257 -0
  45. openstategraph-0.3.0rc18/openstategraph/api/burst_recorder.py +175 -0
  46. openstategraph-0.3.0rc18/openstategraph/api/capability_discovery.py +751 -0
  47. openstategraph-0.3.0rc18/openstategraph/api/catalogue_events.py +148 -0
  48. openstategraph-0.3.0rc18/openstategraph/api/chat_page.py +20 -0
  49. openstategraph-0.3.0rc18/openstategraph/api/customer_graph.py +220 -0
  50. openstategraph-0.3.0rc18/openstategraph/api/deps.py +103 -0
  51. openstategraph-0.3.0rc18/openstategraph/api/diagram.py +102 -0
  52. openstategraph-0.3.0rc18/openstategraph/api/editor_assets.py +352 -0
  53. openstategraph-0.3.0rc18/openstategraph/api/embed.py +125 -0
  54. openstategraph-0.3.0rc18/openstategraph/api/frame_clock.py +137 -0
  55. openstategraph-0.3.0rc18/openstategraph/api/kanban_events.py +244 -0
  56. openstategraph-0.3.0rc18/openstategraph/api/knowledge_build.py +162 -0
  57. openstategraph-0.3.0rc18/openstategraph/api/knowledge_curation.py +176 -0
  58. openstategraph-0.3.0rc18/openstategraph/api/listening.py +104 -0
  59. openstategraph-0.3.0rc18/openstategraph/api/live_stream.py +150 -0
  60. openstategraph-0.3.0rc18/openstategraph/api/main.py +366 -0
  61. openstategraph-0.3.0rc18/openstategraph/api/model_resolution.py +319 -0
  62. openstategraph-0.3.0rc18/openstategraph/api/mount_resolution.py +232 -0
  63. openstategraph-0.3.0rc18/openstategraph/api/openapi_document.py +91 -0
  64. openstategraph-0.3.0rc18/openstategraph/api/patrol_events.py +170 -0
  65. openstategraph-0.3.0rc18/openstategraph/api/patrol_registry.py +136 -0
  66. openstategraph-0.3.0rc18/openstategraph/api/plugin_capabilities.py +341 -0
  67. openstategraph-0.3.0rc18/openstategraph/api/registries.py +454 -0
  68. openstategraph-0.3.0rc18/openstategraph/api/routes/__init__.py +15 -0
  69. openstategraph-0.3.0rc18/openstategraph/api/routes/chat_ui.py +57 -0
  70. openstategraph-0.3.0rc18/openstategraph/api/routes/demo.py +68 -0
  71. openstategraph-0.3.0rc18/openstategraph/api/routes/examples.py +92 -0
  72. openstategraph-0.3.0rc18/openstategraph/api/routes/kanban.py +469 -0
  73. openstategraph-0.3.0rc18/openstategraph/api/routes/mcp.py +324 -0
  74. openstategraph-0.3.0rc18/openstategraph/api/routes/providers.py +130 -0
  75. openstategraph-0.3.0rc18/openstategraph/api/routes/recordings.py +288 -0
  76. openstategraph-0.3.0rc18/openstategraph/api/routes/runs.py +725 -0
  77. openstategraph-0.3.0rc18/openstategraph/api/routes/site.py +80 -0
  78. openstategraph-0.3.0rc18/openstategraph/api/routes/system.py +316 -0
  79. openstategraph-0.3.0rc18/openstategraph/api/routes/threads.py +103 -0
  80. openstategraph-0.3.0rc18/openstategraph/api/routes/workflows.py +1092 -0
  81. openstategraph-0.3.0rc18/openstategraph/api/schemas.py +1765 -0
  82. openstategraph-0.3.0rc18/openstategraph/api/services.py +447 -0
  83. openstategraph-0.3.0rc18/openstategraph/api/site_pages.py +120 -0
  84. openstategraph-0.3.0rc18/openstategraph/api/sse_contract.py +139 -0
  85. openstategraph-0.3.0rc18/openstategraph/api/static/chat.html +2292 -0
  86. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/__vite-browser-external-DvHC826_.js +2 -0
  87. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/abnfDiagram-N423BO3Z-BSwYC7ml.js +2 -0
  88. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/arc-DDMrFQ_b.js +2 -0
  89. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/architecture-TIHT7OUA-JHDAwbjN.js +1 -0
  90. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/architectureDiagram-T3A2C74G-BP7p2NAG.js +37 -0
  91. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/archivo-latin-ext-wght-normal-C4zznr8T.woff2 +0 -0
  92. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/archivo-latin-wght-normal-E0tuGl4L.woff2 +0 -0
  93. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/array-BifhSqXX.js +2 -0
  94. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/blockDiagram-VBNYF7ZC-0h_dkxD-.js +133 -0
  95. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/c4Diagram-5PPSVZJV-DwLWEqq_.js +11 -0
  96. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/channel-Db-O9VqS.js +2 -0
  97. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-2GRJ4B5K-DXBJ0RsQ.js +2 -0
  98. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-2Q5K7J3B-C1jixKkw.js +2 -0
  99. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-4I5QYGJK-CsFwS4Lg.js +2 -0
  100. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-5RXB4S5H-BSEGk_ut.js +232 -0
  101. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-5VM5RSS4-ZNzvKenW.js +16 -0
  102. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-6Q2QTUOP-BHAoBLWf.js +89 -0
  103. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-7BUUIJ7U-Bb538aSH.js +2 -0
  104. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-7Z6QIM7H-B5bFtaqu.js +11 -0
  105. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-GF5L2VYU-DG5c0NFA.js +207 -0
  106. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-I66GZJ75-DmCheD4s.js +128 -0
  107. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-JQJVKLGR-8idHhP4j.js +157 -0
  108. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-JWPE2WC7-DVXcaiue.js +2 -0
  109. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-KBJHAD2P-BT9F3jrA.js +2 -0
  110. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-KEIR6QF5-DEvma7oi.js +162 -0
  111. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-NSK5VX7P-Dgz6OU53.js +3 -0
  112. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-QR6OTTB3-fys2tz_Z.js +63 -0
  113. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-RYQCIY6F-CRj7pW-i.js +2 -0
  114. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-UBXNYLIW-BK_OvCxP.js +2 -0
  115. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-W5SLKNZC-DCbgXbJu.js +2 -0
  116. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-WRU74C26-Dnm_SPAR.js +71 -0
  117. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-XXDRQBXY-CRqRy7wC.js +2 -0
  118. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +2 -0
  119. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/classDiagram-JCYQIIEL-Depm8ksq.js +2 -0
  120. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/classDiagram-v2-OCEON4UE-Depm8ksq.js +2 -0
  121. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cose-bilkent-JH36ORCC-D5TK9rNS.js +2 -0
  122. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cynefin-VYW2F7L2-D4Q9WVaa.js +1 -0
  123. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cynefinDiagram-MW4NZA55-CoHRISXQ.js +63 -0
  124. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cytoscape.esm-C3UvhD5t.js +322 -0
  125. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/dagre-Buvkdvvj.js +2 -0
  126. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/dagre-VZM6K2ZE-D21mJWEs.js +5 -0
  127. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/defaultLocale-BFoDCU3G.js +2 -0
  128. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-7IWD3JNH-DH8djcKe.js +31 -0
  129. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-B4RE2ZJO-TCo5p7fm.js +4 -0
  130. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-LBJQPF4R-CgbTOT1t.js +25 -0
  131. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-Q27KOJAE-C66hKgaF.js +25 -0
  132. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-UB23O5K3-DfQdI_zj.js +42 -0
  133. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/dist-Cf7dFMHT.js +2 -0
  134. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ebnfDiagram-BXEA7PRR-zmsTHIxX.js +2 -0
  135. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/erDiagram-JOGREHBK-CghTrytX.js +86 -0
  136. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/eventmodeling-45OFAUF4-CMwSn-Ho.js +1 -0
  137. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/flowDiagram-UKHOOZJN-C-_w-s1Q.js +1 -0
  138. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ganttDiagram-PKOTCBZU-97e9PAPc.js +293 -0
  139. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/gitGraph-TEB2WS4Q-DRKzZwY3.js +1 -0
  140. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/gitGraphDiagram-DS77QQ5N-CW0XXeRI.js +107 -0
  141. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/graphlib-DS17s2tU.js +2 -0
  142. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  143. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  144. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-sans-latin-ext-wght-normal-CIII54If.woff2 +0 -0
  145. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-sans-latin-wght-normal-IvpUvPa2.woff2 +0 -0
  146. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/index-C82F-VOn.js +97 -0
  147. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/index-aFbfZIkT.css +1 -0
  148. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/info-DKCQHKI2-SysKRxO_.js +1 -0
  149. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/infoDiagram-6WML65LV-DZbcdVbQ.js +3 -0
  150. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/init-C-OQMol4.js +2 -0
  151. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ishikawaDiagram-WSZJBQD7-db9uBmh5.js +71 -0
  152. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/journeyDiagram-NVQOT4AX-BRA0mH1X.js +140 -0
  153. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/kanban-definition-27J2QSJJ-BC9rn5e4.js +90 -0
  154. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/katex-DolUETbr.js +258 -0
  155. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/line-B7qqN3Ir.js +2 -0
  156. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/linear-5J5m_kC5.js +2 -0
  157. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/map-BaFkSB1l.js +2 -0
  158. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/mermaid-parser.core-BGnhWAUE.js +8 -0
  159. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/mermaid.core-16iQohrd.js +43 -0
  160. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/mindmap-definition-FAOFIHXS-D5CjGmqV.js +97 -0
  161. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/node.browser-NgqoTrLm.js +2 -0
  162. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/openai-CkyQtVOo.js +19 -0
  163. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ordinal-BDEzSJ7C.js +2 -0
  164. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/packet-7NZHBO7P-sQm5Oec1.js +1 -0
  165. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/path-COt_16Va.js +2 -0
  166. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/pegDiagram-VL7TDLO6-uYvU6KEE.js +2 -0
  167. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/pie-RZYD4A2V-BTbfwsIW.js +1 -0
  168. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/pieDiagram-7S7Q4E2Y-D_PiFPb_.js +40 -0
  169. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/quadrantDiagram-CIZ2JOQS-C8DSaWmz.js +8 -0
  170. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/radar-I7S5WNFK-CkFE88Ku.js +1 -0
  171. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-3IZDKUUU-Dts1ojtZ.js +1 -0
  172. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-abnf-AHOZXSZD-D-c7lnP-.js +1 -0
  173. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-ebnf-EBAXGLYW-C6_n505H.js +1 -0
  174. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-peg-LSFZ7HO6-CG9QfFVy.js +1 -0
  175. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroadDiagram-AXF67PYL-nuUZ0qwl.js +2 -0
  176. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/requirementDiagram-LRYGKXZP-DxBF5NhC.js +85 -0
  177. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/rough.esm-By172zw-.js +2 -0
  178. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sankeyDiagram-W5VNT64P-CntNPYqA.js +41 -0
  179. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sdk-Cp3Re1Le.js +38 -0
  180. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sequenceDiagram-SI44F4Z6-HZo4SLa8.js +163 -0
  181. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +2 -0
  182. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/src-DqrQFfgz.js +2 -0
  183. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/stateDiagram-OKZ733FA-CLS4pIgN.js +2 -0
  184. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/stateDiagram-v2-UEYNNEHI-COwAZwMg.js +2 -0
  185. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/swimlanes-SLNWSIFB-D29zxlMr.js +3 -0
  186. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/swimlanesDiagram-ULZ7WXOC-BDcjn2xv.js +9 -0
  187. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/timeline-definition-Z64GVDOM-CelnRNqa.js +121 -0
  188. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/treeView-QDETBFTQ-DFJeT3QC.js +1 -0
  189. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/treemap-6X3UGDF4-BEjfDtSh.js +1 -0
  190. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/vennDiagram-T6HMQDX7-CDZD7jBy.js +35 -0
  191. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/wardley-OPB4EBWU-CnK4FjgH.js +1 -0
  192. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/wardleyDiagram-T6FBY63Y-CAtiCqwR.js +79 -0
  193. openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/xychartDiagram-ELKLHX3M-sU7T-aSM.js +8 -0
  194. openstategraph-0.3.0rc18/openstategraph/api/static/editor/favicon.svg +41 -0
  195. openstategraph-0.3.0rc18/openstategraph/api/static/editor/index.html +71 -0
  196. openstategraph-0.3.0rc18/openstategraph/api/static/editor_missing.html +104 -0
  197. openstategraph-0.3.0rc18/openstategraph/api/static/site/behind-the-scenes.html +1165 -0
  198. openstategraph-0.3.0rc18/openstategraph/api/static/site/gallery.html +1979 -0
  199. openstategraph-0.3.0rc18/openstategraph/api/static/site/index.html +1507 -0
  200. openstategraph-0.3.0rc18/openstategraph/api/static/vendor/mermaid.min.js +3587 -0
  201. openstategraph-0.3.0rc18/openstategraph/api/streaming.py +2909 -0
  202. openstategraph-0.3.0rc18/openstategraph/api/team_board.py +133 -0
  203. openstategraph-0.3.0rc18/openstategraph/api/threads.py +892 -0
  204. openstategraph-0.3.0rc18/openstategraph/api/workflow_events.py +305 -0
  205. openstategraph-0.3.0rc18/openstategraph/api/workflow_store.py +779 -0
  206. openstategraph-0.3.0rc18/openstategraph/async_tasks.py +624 -0
  207. openstategraph-0.3.0rc18/openstategraph/bundled_skills.py +152 -0
  208. openstategraph-0.3.0rc18/openstategraph/catalogue.py +273 -0
  209. openstategraph-0.3.0rc18/openstategraph/chat_model.py +414 -0
  210. openstategraph-0.3.0rc18/openstategraph/cli.py +3461 -0
  211. openstategraph-0.3.0rc18/openstategraph/compile/__init__.py +0 -0
  212. openstategraph-0.3.0rc18/openstategraph/compile/checked_nodes.py +117 -0
  213. openstategraph-0.3.0rc18/openstategraph/compile/composition.py +196 -0
  214. openstategraph-0.3.0rc18/openstategraph/compile/context.py +476 -0
  215. openstategraph-0.3.0rc18/openstategraph/compile/deep_tier.py +81 -0
  216. openstategraph-0.3.0rc18/openstategraph/compile/diagnostics.py +772 -0
  217. openstategraph-0.3.0rc18/openstategraph/compile/fields.py +121 -0
  218. openstategraph-0.3.0rc18/openstategraph/compile/graph_names.py +80 -0
  219. openstategraph-0.3.0rc18/openstategraph/compile/grounding.py +116 -0
  220. openstategraph-0.3.0rc18/openstategraph/compile/mount_overrides.py +207 -0
  221. openstategraph-0.3.0rc18/openstategraph/compile/mount_persistence.py +119 -0
  222. openstategraph-0.3.0rc18/openstategraph/compile/node_catalogue.py +368 -0
  223. openstategraph-0.3.0rc18/openstategraph/compile/node_doors.py +231 -0
  224. openstategraph-0.3.0rc18/openstategraph/compile/node_families.py +125 -0
  225. openstategraph-0.3.0rc18/openstategraph/compile/node_runtime.py +1516 -0
  226. openstategraph-0.3.0rc18/openstategraph/compile/node_types.py +132 -0
  227. openstategraph-0.3.0rc18/openstategraph/compile/nodes/__init__.py +94 -0
  228. openstategraph-0.3.0rc18/openstategraph/compile/nodes/agent.py +785 -0
  229. openstategraph-0.3.0rc18/openstategraph/compile/nodes/approval.py +91 -0
  230. openstategraph-0.3.0rc18/openstategraph/compile/nodes/functions.py +166 -0
  231. openstategraph-0.3.0rc18/openstategraph/compile/nodes/grader.py +467 -0
  232. openstategraph-0.3.0rc18/openstategraph/compile/nodes/guard.py +440 -0
  233. openstategraph-0.3.0rc18/openstategraph/compile/nodes/io.py +438 -0
  234. openstategraph-0.3.0rc18/openstategraph/compile/nodes/memory.py +108 -0
  235. openstategraph-0.3.0rc18/openstategraph/compile/nodes/mount.py +795 -0
  236. openstategraph-0.3.0rc18/openstategraph/compile/nodes/named_check.py +66 -0
  237. openstategraph-0.3.0rc18/openstategraph/compile/nodes/orchestration.py +493 -0
  238. openstategraph-0.3.0rc18/openstategraph/compile/nodes/resolvers.py +200 -0
  239. openstategraph-0.3.0rc18/openstategraph/compile/nodes/route_check.py +162 -0
  240. openstategraph-0.3.0rc18/openstategraph/compile/nodes/router.py +225 -0
  241. openstategraph-0.3.0rc18/openstategraph/compile/paused_mount.py +100 -0
  242. openstategraph-0.3.0rc18/openstategraph/compile/port_specs.json +3871 -0
  243. openstategraph-0.3.0rc18/openstategraph/compile/reducers.py +165 -0
  244. openstategraph-0.3.0rc18/openstategraph/compile/reporting.py +458 -0
  245. openstategraph-0.3.0rc18/openstategraph/compile/run_context.py +899 -0
  246. openstategraph-0.3.0rc18/openstategraph/compile/runtime_services.py +187 -0
  247. openstategraph-0.3.0rc18/openstategraph/compile/side_effects.py +143 -0
  248. openstategraph-0.3.0rc18/openstategraph/compile/silent_turn.py +97 -0
  249. openstategraph-0.3.0rc18/openstategraph/compile/state.py +839 -0
  250. openstategraph-0.3.0rc18/openstategraph/compile/static_source.py +180 -0
  251. openstategraph-0.3.0rc18/openstategraph/compile/subagents.py +272 -0
  252. openstategraph-0.3.0rc18/openstategraph/compile/token_stream.py +138 -0
  253. openstategraph-0.3.0rc18/openstategraph/compile/upstream.py +38 -0
  254. openstategraph-0.3.0rc18/openstategraph/compile/workflow_compiler.py +2907 -0
  255. openstategraph-0.3.0rc18/openstategraph/concurrent_producers.py +265 -0
  256. openstategraph-0.3.0rc18/openstategraph/config_edit.py +340 -0
  257. openstategraph-0.3.0rc18/openstategraph/config_file.py +939 -0
  258. openstategraph-0.3.0rc18/openstategraph/counted_rows.py +475 -0
  259. openstategraph-0.3.0rc18/openstategraph/delegations.py +158 -0
  260. openstategraph-0.3.0rc18/openstategraph/deployment.py +248 -0
  261. openstategraph-0.3.0rc18/openstategraph/developer_channel.py +351 -0
  262. openstategraph-0.3.0rc18/openstategraph/document_checks.py +926 -0
  263. openstategraph-0.3.0rc18/openstategraph/dotenv.py +270 -0
  264. openstategraph-0.3.0rc18/openstategraph/editor_freshness.py +89 -0
  265. openstategraph-0.3.0rc18/openstategraph/engineering_rules.md +165 -0
  266. openstategraph-0.3.0rc18/openstategraph/engineering_rules.py +30 -0
  267. openstategraph-0.3.0rc18/openstategraph/errors.py +457 -0
  268. openstategraph-0.3.0rc18/openstategraph/evaluation/__init__.py +83 -0
  269. openstategraph-0.3.0rc18/openstategraph/evaluation/dataset.py +225 -0
  270. openstategraph-0.3.0rc18/openstategraph/evaluation/denotation.py +345 -0
  271. openstategraph-0.3.0rc18/openstategraph/evaluation/recovery.py +78 -0
  272. openstategraph-0.3.0rc18/openstategraph/evaluation/runner.py +578 -0
  273. openstategraph-0.3.0rc18/openstategraph/evaluation/scoring.py +337 -0
  274. openstategraph-0.3.0rc18/openstategraph/examples/__init__.py +302 -0
  275. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/AGENTS.md +88 -0
  276. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/escalation-paths.md +30 -0
  277. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/incident-response.md +32 -0
  278. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/oncall-rotation.md +30 -0
  279. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/release-train.md +30 -0
  280. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/support-tiers.md +25 -0
  281. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/tests/test_agentic_rag_rewrite_document.py +135 -0
  282. openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/workflow.json +91 -0
  283. openstategraph-0.3.0rc18/openstategraph/examples/approval-in-the-loop/AGENTS.md +122 -0
  284. openstategraph-0.3.0rc18/openstategraph/examples/approval-in-the-loop/tests/test_approval_in_the_loop_document.py +84 -0
  285. openstategraph-0.3.0rc18/openstategraph/examples/approval-in-the-loop/workflow.json +65 -0
  286. openstategraph-0.3.0rc18/openstategraph/examples/archetype-orchestrator-report/AGENTS.md +128 -0
  287. openstategraph-0.3.0rc18/openstategraph/examples/archetype-orchestrator-report/tests/test_archetype_orchestrator_report_document.py +133 -0
  288. openstategraph-0.3.0rc18/openstategraph/examples/archetype-orchestrator-report/workflow.json +147 -0
  289. openstategraph-0.3.0rc18/openstategraph/examples/budget-exhaustion/AGENTS.md +97 -0
  290. openstategraph-0.3.0rc18/openstategraph/examples/budget-exhaustion/tests/test_budget_exhaustion_document.py +73 -0
  291. openstategraph-0.3.0rc18/openstategraph/examples/budget-exhaustion/workflow.json +67 -0
  292. openstategraph-0.3.0rc18/openstategraph/examples/chained-summarizer/AGENTS.md +80 -0
  293. openstategraph-0.3.0rc18/openstategraph/examples/chained-summarizer/tests/test_chained_summarizer_document.py +68 -0
  294. openstategraph-0.3.0rc18/openstategraph/examples/chained-summarizer/workflow.json +61 -0
  295. openstategraph-0.3.0rc18/openstategraph/examples/classifier-router-qa/AGENTS.md +60 -0
  296. openstategraph-0.3.0rc18/openstategraph/examples/classifier-router-qa/tests/test_classifier_router_qa_document.py +75 -0
  297. openstategraph-0.3.0rc18/openstategraph/examples/classifier-router-qa/workflow.json +115 -0
  298. openstategraph-0.3.0rc18/openstategraph/examples/delegate-by-mount/AGENTS.md +87 -0
  299. openstategraph-0.3.0rc18/openstategraph/examples/delegate-by-mount/tests/test_delegate_by_mount_document.py +122 -0
  300. openstategraph-0.3.0rc18/openstategraph/examples/delegate-by-mount/workflow.json +145 -0
  301. openstategraph-0.3.0rc18/openstategraph/examples/evaluator-optimizer/AGENTS.md +70 -0
  302. openstategraph-0.3.0rc18/openstategraph/examples/evaluator-optimizer/tests/test_evaluator_optimizer_document.py +65 -0
  303. openstategraph-0.3.0rc18/openstategraph/examples/evaluator-optimizer/workflow.json +67 -0
  304. openstategraph-0.3.0rc18/openstategraph/examples/fanout-in-a-loop/AGENTS.md +113 -0
  305. openstategraph-0.3.0rc18/openstategraph/examples/fanout-in-a-loop/tests/test_fanout_in_a_loop_document.py +93 -0
  306. openstategraph-0.3.0rc18/openstategraph/examples/fanout-in-a-loop/workflow.json +93 -0
  307. openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/AGENTS.md +122 -0
  308. openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/tests/test_guarded_lookup_document.py +96 -0
  309. openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/tools/directory.py +102 -0
  310. openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/workflow.json +114 -0
  311. openstategraph-0.3.0rc18/openstategraph/examples/index.json +194 -0
  312. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/AGENTS.md +96 -0
  313. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/accessions.md +29 -0
  314. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/duplication.md +30 -0
  315. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/storage-tiers.md +30 -0
  316. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/viability-testing.md +36 -0
  317. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/withdrawals.md +29 -0
  318. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/tests/test_knowledge_lookup_qa_document.py +119 -0
  319. openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/workflow.json +59 -0
  320. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/AGENTS.md +138 -0
  321. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/gallery.md +29 -0
  322. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/on-call.md +35 -0
  323. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/release-checklist.md +31 -0
  324. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/support-desks.md +30 -0
  325. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/tests/test_morning_brief_document.py +197 -0
  326. openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/workflow.json +164 -0
  327. openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts/AGENTS.md +120 -0
  328. openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts/tests/test_nested_mounts_document.py +129 -0
  329. openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts/workflow.json +48 -0
  330. openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts-mid/AGENTS.md +35 -0
  331. openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts-mid/workflow.json +48 -0
  332. openstategraph-0.3.0rc18/openstategraph/examples/parallel-workers-join/AGENTS.md +95 -0
  333. openstategraph-0.3.0rc18/openstategraph/examples/parallel-workers-join/tests/test_parallel_workers_join_document.py +81 -0
  334. openstategraph-0.3.0rc18/openstategraph/examples/parallel-workers-join/workflow.json +74 -0
  335. openstategraph-0.3.0rc18/openstategraph/examples/remembers-across-runs/AGENTS.md +111 -0
  336. openstategraph-0.3.0rc18/openstategraph/examples/remembers-across-runs/tests/test_remembers_across_runs_document.py +101 -0
  337. openstategraph-0.3.0rc18/openstategraph/examples/remembers-across-runs/workflow.json +92 -0
  338. openstategraph-0.3.0rc18/openstategraph/examples/same-package-twice/AGENTS.md +87 -0
  339. openstategraph-0.3.0rc18/openstategraph/examples/same-package-twice/tests/test_same_package_twice_document.py +148 -0
  340. openstategraph-0.3.0rc18/openstategraph/examples/same-package-twice/workflow.json +71 -0
  341. openstategraph-0.3.0rc18/openstategraph/examples/skill-driven-rubric/AGENTS.md +98 -0
  342. openstategraph-0.3.0rc18/openstategraph/examples/skill-driven-rubric/tests/test_skill_driven_rubric_document.py +117 -0
  343. openstategraph-0.3.0rc18/openstategraph/examples/skill-driven-rubric/workflow.json +87 -0
  344. openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/AGENTS.md +130 -0
  345. openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/data/Chinook_Sqlite.sqlite +0 -0
  346. openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/evals/sql-qa.eval.json +119 -0
  347. openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/tests/test_sql_qa_document.py +237 -0
  348. openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/workflow.json +88 -0
  349. openstategraph-0.3.0rc18/openstategraph/examples/support-triage/AGENTS.md +204 -0
  350. openstategraph-0.3.0rc18/openstategraph/examples/support-triage/tests/test_support_triage_document.py +171 -0
  351. openstategraph-0.3.0rc18/openstategraph/examples/support-triage/workflow.json +157 -0
  352. openstategraph-0.3.0rc18/openstategraph/examples/two-stage-double-loop/AGENTS.md +88 -0
  353. openstategraph-0.3.0rc18/openstategraph/examples/two-stage-double-loop/tests/test_two_stage_double_loop_document.py +88 -0
  354. openstategraph-0.3.0rc18/openstategraph/examples/two-stage-double-loop/workflow.json +99 -0
  355. openstategraph-0.3.0rc18/openstategraph/examples/web-research-digest/AGENTS.md +139 -0
  356. openstategraph-0.3.0rc18/openstategraph/examples/web-research-digest/tests/test_web_research_digest_document.py +131 -0
  357. openstategraph-0.3.0rc18/openstategraph/examples/web-research-digest/workflow.json +89 -0
  358. openstategraph-0.3.0rc18/openstategraph/examples/youtube-trend-digest/AGENTS.md +257 -0
  359. openstategraph-0.3.0rc18/openstategraph/examples/youtube-trend-digest/tests/test_youtube_trend_digest_document.py +150 -0
  360. openstategraph-0.3.0rc18/openstategraph/examples/youtube-trend-digest/workflow.json +118 -0
  361. openstategraph-0.3.0rc18/openstategraph/executed_statements.py +157 -0
  362. openstategraph-0.3.0rc18/openstategraph/extensions.py +554 -0
  363. openstategraph-0.3.0rc18/openstategraph/function_contracts.py +149 -0
  364. openstategraph-0.3.0rc18/openstategraph/gap_report.py +741 -0
  365. openstategraph-0.3.0rc18/openstategraph/gap_report_client.py +201 -0
  366. openstategraph-0.3.0rc18/openstategraph/gap_report_door.py +408 -0
  367. openstategraph-0.3.0rc18/openstategraph/generated_module_contract.py +453 -0
  368. openstategraph-0.3.0rc18/openstategraph/github_issue_bridge.py +375 -0
  369. openstategraph-0.3.0rc18/openstategraph/grounded_numbers.py +226 -0
  370. openstategraph-0.3.0rc18/openstategraph/injection.py +177 -0
  371. openstategraph-0.3.0rc18/openstategraph/install_hint.py +225 -0
  372. openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0001_kanban_cards.sql +140 -0
  373. openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0002_kanban_cards_rls.sql +95 -0
  374. openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0003_gap_report_door.sql +195 -0
  375. openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0004_ledger_rls.sql +69 -0
  376. openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0005_card_gap_evidence.sql +33 -0
  377. openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0006_gap_cards_land_on_the_team_board.sql +128 -0
  378. openstategraph-0.3.0rc18/openstategraph/kanban_postgres.py +446 -0
  379. openstategraph-0.3.0rc18/openstategraph/kanban_sqlite.py +396 -0
  380. openstategraph-0.3.0rc18/openstategraph/kanban_store.py +893 -0
  381. openstategraph-0.3.0rc18/openstategraph/knowledge.py +199 -0
  382. openstategraph-0.3.0rc18/openstategraph/knowledge_builders.py +736 -0
  383. openstategraph-0.3.0rc18/openstategraph/knowledge_engines.py +354 -0
  384. openstategraph-0.3.0rc18/openstategraph/knowledge_explorer.py +777 -0
  385. openstategraph-0.3.0rc18/openstategraph/live.py +504 -0
  386. openstategraph-0.3.0rc18/openstategraph/loader.py +1042 -0
  387. openstategraph-0.3.0rc18/openstategraph/mcp_server.py +1879 -0
  388. openstategraph-0.3.0rc18/openstategraph/mcp_sessions.py +416 -0
  389. openstategraph-0.3.0rc18/openstategraph/memory.py +1240 -0
  390. openstategraph-0.3.0rc18/openstategraph/memory_segment.py +348 -0
  391. openstategraph-0.3.0rc18/openstategraph/messages.py +237 -0
  392. openstategraph-0.3.0rc18/openstategraph/model_readiness.py +120 -0
  393. openstategraph-0.3.0rc18/openstategraph/mssql_connection.py +276 -0
  394. openstategraph-0.3.0rc18/openstategraph/node_report.py +209 -0
  395. openstategraph-0.3.0rc18/openstategraph/opening.py +221 -0
  396. openstategraph-0.3.0rc18/openstategraph/package_testing.py +180 -0
  397. openstategraph-0.3.0rc18/openstategraph/patrol.py +557 -0
  398. openstategraph-0.3.0rc18/openstategraph/plugin_interop.py +714 -0
  399. openstategraph-0.3.0rc18/openstategraph/postgres.py +212 -0
  400. openstategraph-0.3.0rc18/openstategraph/prebuilt_architect.py +179 -0
  401. openstategraph-0.3.0rc18/openstategraph/prebuilt_databricks.py +184 -0
  402. openstategraph-0.3.0rc18/openstategraph/prebuilt_email.py +143 -0
  403. openstategraph-0.3.0rc18/openstategraph/prebuilt_knowledge.py +165 -0
  404. openstategraph-0.3.0rc18/openstategraph/prebuilt_mcp.py +1720 -0
  405. openstategraph-0.3.0rc18/openstategraph/prebuilt_mssql.py +206 -0
  406. openstategraph-0.3.0rc18/openstategraph/prebuilt_platform.py +340 -0
  407. openstategraph-0.3.0rc18/openstategraph/prebuilt_session.py +81 -0
  408. openstategraph-0.3.0rc18/openstategraph/prebuilt_sql.py +246 -0
  409. openstategraph-0.3.0rc18/openstategraph/prebuilt_warehouse.py +504 -0
  410. openstategraph-0.3.0rc18/openstategraph/prebuilt_web.py +289 -0
  411. openstategraph-0.3.0rc18/openstategraph/prebuilt_youtube.py +403 -0
  412. openstategraph-0.3.0rc18/openstategraph/principal.py +193 -0
  413. openstategraph-0.3.0rc18/openstategraph/progress.py +203 -0
  414. openstategraph-0.3.0rc18/openstategraph/project_id_carriers.py +238 -0
  415. openstategraph-0.3.0rc18/openstategraph/project_identity.py +188 -0
  416. openstategraph-0.3.0rc18/openstategraph/providers.py +1323 -0
  417. openstategraph-0.3.0rc18/openstategraph/py.typed +0 -0
  418. openstategraph-0.3.0rc18/openstategraph/readable_tree.py +58 -0
  419. openstategraph-0.3.0rc18/openstategraph/readonly_sqlite.py +148 -0
  420. openstategraph-0.3.0rc18/openstategraph/reasoning.py +379 -0
  421. openstategraph-0.3.0rc18/openstategraph/results.py +350 -0
  422. openstategraph-0.3.0rc18/openstategraph/run_doors.py +305 -0
  423. openstategraph-0.3.0rc18/openstategraph/run_findings.py +695 -0
  424. openstategraph-0.3.0rc18/openstategraph/run_identity.py +81 -0
  425. openstategraph-0.3.0rc18/openstategraph/run_journal.py +450 -0
  426. openstategraph-0.3.0rc18/openstategraph/run_sinks.py +2046 -0
  427. openstategraph-0.3.0rc18/openstategraph/run_stream.py +579 -0
  428. openstategraph-0.3.0rc18/openstategraph/run_summary.py +291 -0
  429. openstategraph-0.3.0rc18/openstategraph/scaffold.py +969 -0
  430. openstategraph-0.3.0rc18/openstategraph/schema.py +269 -0
  431. openstategraph-0.3.0rc18/openstategraph/search_backends.py +332 -0
  432. openstategraph-0.3.0rc18/openstategraph/skills.py +218 -0
  433. openstategraph-0.3.0rc18/openstategraph/sources.py +442 -0
  434. openstategraph-0.3.0rc18/openstategraph/sql_reach.py +119 -0
  435. openstategraph-0.3.0rc18/openstategraph/state_dir.py +173 -0
  436. openstategraph-0.3.0rc18/openstategraph/step_budget.py +335 -0
  437. openstategraph-0.3.0rc18/openstategraph/stream_parts.py +71 -0
  438. openstategraph-0.3.0rc18/openstategraph/table_coverage.py +632 -0
  439. openstategraph-0.3.0rc18/openstategraph/templates/__init__.py +162 -0
  440. openstategraph-0.3.0rc18/openstategraph/templates/index.json +44 -0
  441. openstategraph-0.3.0rc18/openstategraph/templates/loop/AGENTS.md +77 -0
  442. openstategraph-0.3.0rc18/openstategraph/templates/loop/tests/test_shape.py +31 -0
  443. openstategraph-0.3.0rc18/openstategraph/templates/loop/workflow.json +47 -0
  444. openstategraph-0.3.0rc18/openstategraph/templates/minimal/AGENTS.md +51 -0
  445. openstategraph-0.3.0rc18/openstategraph/templates/minimal/tests/test_shape.py +30 -0
  446. openstategraph-0.3.0rc18/openstategraph/templates/minimal/workflow.json +20 -0
  447. openstategraph-0.3.0rc18/openstategraph/templates/routed-qa/AGENTS.md +71 -0
  448. openstategraph-0.3.0rc18/openstategraph/templates/routed-qa/tests/test_shape.py +37 -0
  449. openstategraph-0.3.0rc18/openstategraph/templates/routed-qa/workflow.json +85 -0
  450. openstategraph-0.3.0rc18/openstategraph/templates/team/AGENTS.md +50 -0
  451. openstategraph-0.3.0rc18/openstategraph/templates/team/tests/test_shape.py +33 -0
  452. openstategraph-0.3.0rc18/openstategraph/templates/team/workflow.json +64 -0
  453. openstategraph-0.3.0rc18/openstategraph/units.py +201 -0
  454. openstategraph-0.3.0rc18/openstategraph/validation.py +418 -0
  455. openstategraph-0.3.0rc18/openstategraph/vocabulary.py +573 -0
  456. openstategraph-0.3.0rc18/openstategraph/web_transport.py +131 -0
  457. openstategraph-0.3.0rc18/openstategraph/workflows_root.py +200 -0
  458. openstategraph-0.3.0rc18/pyproject.toml +394 -0
  459. openstategraph-0.3.0rc18/tests/conftest.py +558 -0
  460. openstategraph-0.3.0rc18/tests/data/recorded_chinook_assistant_run.json +1229 -0
  461. openstategraph-0.3.0rc18/tests/data/recorded_chinook_followup_thread.json +160 -0
  462. openstategraph-0.3.0rc18/tests/data/recorded_concierge_customer_run.json +1192 -0
  463. openstategraph-0.3.0rc18/tests/data/schema_v2_team_mount.json +39 -0
  464. openstategraph-0.3.0rc18/tests/data/sse_wire_format_golden.json +24 -0
  465. openstategraph-0.3.0rc18/tests/fixtures/recorded_gap_report.json +19 -0
  466. openstategraph-0.3.0rc18/tests/fixtures/workflows/warehouse-analyst/workflow.json +752 -0
  467. openstategraph-0.3.0rc18/tests/kanban_by_path.py +108 -0
  468. openstategraph-0.3.0rc18/tests/kanban_fake.py +171 -0
  469. openstategraph-0.3.0rc18/tests/public_api.txt +123 -0
  470. openstategraph-0.3.0rc18/tests/test_a_binding_reads_only_its_own_pins.py +117 -0
  471. openstategraph-0.3.0rc18/tests/test_a_blank_line_inside_a_table_does_not_end_it.py +86 -0
  472. openstategraph-0.3.0rc18/tests/test_a_board_that_is_absent_says_where_it_looked.py +202 -0
  473. openstategraph-0.3.0rc18/tests/test_a_branch_carries_one_edge.py +171 -0
  474. openstategraph-0.3.0rc18/tests/test_a_branch_that_goes_nowhere_is_reported.py +323 -0
  475. openstategraph-0.3.0rc18/tests/test_a_budget_overrun_speaks_our_words.py +354 -0
  476. openstategraph-0.3.0rc18/tests/test_a_burst_says_whose_work_it_was.py +109 -0
  477. openstategraph-0.3.0rc18/tests/test_a_cached_shell_cannot_outlive_its_assets.py +131 -0
  478. openstategraph-0.3.0rc18/tests/test_a_card_names_the_directory_it_writes_to.py +86 -0
  479. openstategraph-0.3.0rc18/tests/test_a_card_with_no_backend_says_so.py +185 -0
  480. openstategraph-0.3.0rc18/tests/test_a_chain_is_counted_to_its_end.py +215 -0
  481. openstategraph-0.3.0rc18/tests/test_a_child_run_outlives_the_turn.py +155 -0
  482. openstategraph-0.3.0rc18/tests/test_a_cited_query_that_never_ran.py +346 -0
  483. openstategraph-0.3.0rc18/tests/test_a_compile_only_command_writes_nothing.py +156 -0
  484. openstategraph-0.3.0rc18/tests/test_a_compositions_total_spend_is_bounded_by_its_drawing.py +333 -0
  485. openstategraph-0.3.0rc18/tests/test_a_conditional_source_reaches_the_join.py +128 -0
  486. openstategraph-0.3.0rc18/tests/test_a_connection_failure_is_not_a_bad_select.py +223 -0
  487. openstategraph-0.3.0rc18/tests/test_a_credential_refusal_names_a_next_step.py +158 -0
  488. openstategraph-0.3.0rc18/tests/test_a_day_of_failed_logins_files_one_card.py +453 -0
  489. openstategraph-0.3.0rc18/tests/test_a_dead_stream_names_the_node.py +57 -0
  490. openstategraph-0.3.0rc18/tests/test_a_declared_unit_is_not_the_models_to_choose.py +314 -0
  491. openstategraph-0.3.0rc18/tests/test_a_deep_agent_delegates.py +328 -0
  492. openstategraph-0.3.0rc18/tests/test_a_delegation_names_its_worker.py +155 -0
  493. openstategraph-0.3.0rc18/tests/test_a_deleted_package_stays_deleted.py +161 -0
  494. openstategraph-0.3.0rc18/tests/test_a_detector_is_checked_before_it_runs.py +163 -0
  495. openstategraph-0.3.0rc18/tests/test_a_disclosure_is_about_an_answer_that_exists.py +311 -0
  496. openstategraph-0.3.0rc18/tests/test_a_discovered_node_type_publishes_its_ports.py +132 -0
  497. openstategraph-0.3.0rc18/tests/test_a_dispatch_table_does_not_hold_its_targets.py +370 -0
  498. openstategraph-0.3.0rc18/tests/test_a_documented_verb_is_one_the_parser_accepts.py +157 -0
  499. openstategraph-0.3.0rc18/tests/test_a_failed_run_is_not_a_silent_success.py +84 -0
  500. openstategraph-0.3.0rc18/tests/test_a_failure_is_not_called_a_warning.py +111 -0
  501. openstategraph-0.3.0rc18/tests/test_a_family_sees_a_facade_not_the_runtime.py +173 -0
  502. openstategraph-0.3.0rc18/tests/test_a_fan_out_answers_the_blocking_door.py +206 -0
  503. openstategraph-0.3.0rc18/tests/test_a_fan_out_is_not_an_edge_that_is_always_taken.py +181 -0
  504. openstategraph-0.3.0rc18/tests/test_a_fetched_page_keeps_its_links.py +90 -0
  505. openstategraph-0.3.0rc18/tests/test_a_finding_reaches_the_customer_seam.py +434 -0
  506. openstategraph-0.3.0rc18/tests/test_a_finished_reason_lands_on_the_card.py +214 -0
  507. openstategraph-0.3.0rc18/tests/test_a_flattened_ref_still_calls_the_tool.py +341 -0
  508. openstategraph-0.3.0rc18/tests/test_a_forced_pass_is_reported.py +62 -0
  509. openstategraph-0.3.0rc18/tests/test_a_frame_says_when_it_happened.py +255 -0
  510. openstategraph-0.3.0rc18/tests/test_a_full_port_is_reported_before_the_run.py +195 -0
  511. openstategraph-0.3.0rc18/tests/test_a_function_can_be_shared_between_packages.py +125 -0
  512. openstategraph-0.3.0rc18/tests/test_a_function_is_refused_before_it_is_called.py +151 -0
  513. openstategraph-0.3.0rc18/tests/test_a_function_node_does_not_make_the_gate_unreachable.py +162 -0
  514. openstategraph-0.3.0rc18/tests/test_a_gap_can_be_reported_without_a_browser.py +743 -0
  515. openstategraph-0.3.0rc18/tests/test_a_gap_report_carries_the_allowlist_and_nothing_else.py +361 -0
  516. openstategraph-0.3.0rc18/tests/test_a_gap_with_no_tool_offers_to_build_one.py +75 -0
  517. openstategraph-0.3.0rc18/tests/test_a_generated_module_is_checkable.py +305 -0
  518. openstategraph-0.3.0rc18/tests/test_a_generated_wiki_page_says_when_it_was_generated.py +182 -0
  519. openstategraph-0.3.0rc18/tests/test_a_gracefully_stopped_mount_says_its_number_was_overruled.py +276 -0
  520. openstategraph-0.3.0rc18/tests/test_a_grader_budget_is_its_own.py +176 -0
  521. openstategraph-0.3.0rc18/tests/test_a_grader_sees_the_disclosure_it_would_duplicate.py +212 -0
  522. openstategraph-0.3.0rc18/tests/test_a_grader_told_the_customer.py +161 -0
  523. openstategraph-0.3.0rc18/tests/test_a_growing_store_is_seeked_not_scanned.py +375 -0
  524. openstategraph-0.3.0rc18/tests/test_a_guard_can_check_a_figure_against_the_rows.py +259 -0
  525. openstategraph-0.3.0rc18/tests/test_a_half_migrated_graph_still_runs.py +253 -0
  526. openstategraph-0.3.0rc18/tests/test_a_host_app_can_mount_the_whole_product.py +223 -0
  527. openstategraph-0.3.0rc18/tests/test_a_lane_called_1.py +107 -0
  528. openstategraph-0.3.0rc18/tests/test_a_library_default_is_never_literalised.py +234 -0
  529. openstategraph-0.3.0rc18/tests/test_a_long_pass_tail_still_publishes.py +331 -0
  530. openstategraph-0.3.0rc18/tests/test_a_loop_that_stops_says_it_worked_first.py +248 -0
  531. openstategraph-0.3.0rc18/tests/test_a_migrated_node_still_answers_the_sync_door.py +210 -0
  532. openstategraph-0.3.0rc18/tests/test_a_missing_board_driver_does_not_kill_the_stream.py +301 -0
  533. openstategraph-0.3.0rc18/tests/test_a_model_can_actually_call_the_async_tools.py +205 -0
  534. openstategraph-0.3.0rc18/tests/test_a_mount_awaits_its_child.py +213 -0
  535. openstategraph-0.3.0rc18/tests/test_a_mount_can_remember_what_it_concluded.py +296 -0
  536. openstategraph-0.3.0rc18/tests/test_a_mount_does_not_reset_the_parents_answer.py +112 -0
  537. openstategraph-0.3.0rc18/tests/test_a_mount_is_sized_against_its_own_drawing.py +318 -0
  538. openstategraph-0.3.0rc18/tests/test_a_mount_says_at_compile_time_what_it_cannot_supply.py +287 -0
  539. openstategraph-0.3.0rc18/tests/test_a_mounted_child_reads_its_own_run_context.py +341 -0
  540. openstategraph-0.3.0rc18/tests/test_a_mounted_child_that_ran_out_of_steps_says_so.py +278 -0
  541. openstategraph-0.3.0rc18/tests/test_a_mounted_node_reports_its_output.py +145 -0
  542. openstategraph-0.3.0rc18/tests/test_a_mounted_run_records_its_statements.py +199 -0
  543. openstategraph-0.3.0rc18/tests/test_a_mounted_step_is_visible_on_both_doors.py +129 -0
  544. openstategraph-0.3.0rc18/tests/test_a_node_reads_the_run_context.py +326 -0
  545. openstategraph-0.3.0rc18/tests/test_a_node_that_failed_is_a_finding.py +167 -0
  546. openstategraph-0.3.0rc18/tests/test_a_node_that_runs_twice_forgets_what_it_did_the_first_time.py +231 -0
  547. openstategraph-0.3.0rc18/tests/test_a_package_function_is_not_slug_qualified.py +355 -0
  548. openstategraph-0.3.0rc18/tests/test_a_package_is_compiled_once_per_mount.py +284 -0
  549. openstategraph-0.3.0rc18/tests/test_a_package_tool_reaches_the_project.py +314 -0
  550. openstategraph-0.3.0rc18/tests/test_a_parallel_router_reports_every_branch.py +314 -0
  551. openstategraph-0.3.0rc18/tests/test_a_passing_graders_reason_is_the_models.py +116 -0
  552. openstategraph-0.3.0rc18/tests/test_a_paused_mounts_child_is_named.py +352 -0
  553. openstategraph-0.3.0rc18/tests/test_a_plugin_node_type_says_which_one_ran.py +373 -0
  554. openstategraph-0.3.0rc18/tests/test_a_plugin_tool_that_cannot_bind_costs_one_tool.py +327 -0
  555. openstategraph-0.3.0rc18/tests/test_a_promise_on_a_card_is_not_a_lost_capability.py +266 -0
  556. openstategraph-0.3.0rc18/tests/test_a_published_answer_carries_no_invisible_characters.py +156 -0
  557. openstategraph-0.3.0rc18/tests/test_a_read_only_database_opens_no_second_file.py +205 -0
  558. openstategraph-0.3.0rc18/tests/test_a_recording_door_asks_whose_recording_it_is.py +99 -0
  559. openstategraph-0.3.0rc18/tests/test_a_recovered_retry_is_reported.py +148 -0
  560. openstategraph-0.3.0rc18/tests/test_a_refusal_from_an_unequipped_agent_is_not_an_answer.py +367 -0
  561. openstategraph-0.3.0rc18/tests/test_a_rejected_mcp_call_reaches_the_model.py +410 -0
  562. openstategraph-0.3.0rc18/tests/test_a_rejected_query_never_left_the_building.py +337 -0
  563. openstategraph-0.3.0rc18/tests/test_a_rejected_tool_name_offers_the_library_tool.py +76 -0
  564. openstategraph-0.3.0rc18/tests/test_a_rejection_without_a_note.py +43 -0
  565. openstategraph-0.3.0rc18/tests/test_a_replayed_step_says_how_long_and_how_much.py +270 -0
  566. openstategraph-0.3.0rc18/tests/test_a_replayed_step_says_which_graph_it_is.py +266 -0
  567. openstategraph-0.3.0rc18/tests/test_a_request_cannot_repoint_the_server.py +120 -0
  568. openstategraph-0.3.0rc18/tests/test_a_required_argument_has_somewhere_to_come_from.py +359 -0
  569. openstategraph-0.3.0rc18/tests/test_a_resolver_that_covers_nothing_says_so.py +415 -0
  570. openstategraph-0.3.0rc18/tests/test_a_resumed_runs_done_frame_carries_the_whole_run.py +205 -0
  571. openstategraph-0.3.0rc18/tests/test_a_retry_reads_its_own_findings.py +176 -0
  572. openstategraph-0.3.0rc18/tests/test_a_reused_tool_result_keeps_its_own_call_id.py +239 -0
  573. openstategraph-0.3.0rc18/tests/test_a_revise_lap_names_the_right_author.py +351 -0
  574. openstategraph-0.3.0rc18/tests/test_a_revise_pass_sees_what_it_must_revise.py +139 -0
  575. openstategraph-0.3.0rc18/tests/test_a_router_can_match_more_than_one_branch.py +120 -0
  576. openstategraph-0.3.0rc18/tests/test_a_router_dispatches_to_every_match.py +67 -0
  577. openstategraph-0.3.0rc18/tests/test_a_router_re_dispatches_a_revision.py +213 -0
  578. openstategraph-0.3.0rc18/tests/test_a_row_count_is_not_a_vessel_count.py +443 -0
  579. openstategraph-0.3.0rc18/tests/test_a_run_can_say_what_it_executed.py +399 -0
  580. openstategraph-0.3.0rc18/tests/test_a_run_cannot_read_the_previous_runs_findings.py +220 -0
  581. openstategraph-0.3.0rc18/tests/test_a_run_names_the_source_it_used.py +484 -0
  582. openstategraph-0.3.0rc18/tests/test_a_run_reports_what_it_cost.py +292 -0
  583. openstategraph-0.3.0rc18/tests/test_a_run_request_cannot_name_a_file.py +333 -0
  584. openstategraph-0.3.0rc18/tests/test_a_run_says_what_it_cost.py +212 -0
  585. openstategraph-0.3.0rc18/tests/test_a_run_says_when_it_starts.py +297 -0
  586. openstategraph-0.3.0rc18/tests/test_a_run_streams_to_any_framework.py +309 -0
  587. openstategraph-0.3.0rc18/tests/test_a_run_supplies_context.py +661 -0
  588. openstategraph-0.3.0rc18/tests/test_a_run_with_no_model_refuses_at_the_door.py +192 -0
  589. openstategraph-0.3.0rc18/tests/test_a_runaway_loop_degrades_instead_of_crashing.py +235 -0
  590. openstategraph-0.3.0rc18/tests/test_a_runs_diagram_opens_its_mounts.py +271 -0
  591. openstategraph-0.3.0rc18/tests/test_a_save_refuses_a_document_that_moved_on_disk.py +191 -0
  592. openstategraph-0.3.0rc18/tests/test_a_schema_arrives_before_it_is_offloaded.py +267 -0
  593. openstategraph-0.3.0rc18/tests/test_a_second_ask_answers_too.py +278 -0
  594. openstategraph-0.3.0rc18/tests/test_a_send_that_can_happen_twice.py +472 -0
  595. openstategraph-0.3.0rc18/tests/test_a_shipped_package_binds_its_own_tool_types.py +168 -0
  596. openstategraph-0.3.0rc18/tests/test_a_silent_member_says_what_it_did.py +222 -0
  597. openstategraph-0.3.0rc18/tests/test_a_silent_node_is_reported.py +76 -0
  598. openstategraph-0.3.0rc18/tests/test_a_silent_turn_is_asked_again.py +166 -0
  599. openstategraph-0.3.0rc18/tests/test_a_single_choice_router_publishes_one_answer.py +220 -0
  600. openstategraph-0.3.0rc18/tests/test_a_sitting_is_named_by_the_browser.py +243 -0
  601. openstategraph-0.3.0rc18/tests/test_a_skill_has_one_source.py +311 -0
  602. openstategraph-0.3.0rc18/tests/test_a_slug_refusal_names_its_correction_once.py +142 -0
  603. openstategraph-0.3.0rc18/tests/test_a_spawn_is_closed.py +427 -0
  604. openstategraph-0.3.0rc18/tests/test_a_stale_tool_denial_is_reported.py +288 -0
  605. openstategraph-0.3.0rc18/tests/test_a_stateless_mount_redoes_its_work.py +235 -0
  606. openstategraph-0.3.0rc18/tests/test_a_static_cycle_cannot_terminate.py +229 -0
  607. openstategraph-0.3.0rc18/tests/test_a_static_output_prints_its_own_sentence.py +158 -0
  608. openstategraph-0.3.0rc18/tests/test_a_stop_says_what_it_stopped.py +374 -0
  609. openstategraph-0.3.0rc18/tests/test_a_store_one_column_behind_keeps_its_runs.py +305 -0
  610. openstategraph-0.3.0rc18/tests/test_a_stored_run_answers_to_an_audience.py +371 -0
  611. openstategraph-0.3.0rc18/tests/test_a_stream_says_how_it_ends.py +109 -0
  612. openstategraph-0.3.0rc18/tests/test_a_task_boundary_on_a_mount_was_priced.py +306 -0
  613. openstategraph-0.3.0rc18/tests/test_a_test_does_not_pin_this_checkouts_history.py +167 -0
  614. openstategraph-0.3.0rc18/tests/test_a_thread_is_read_once_and_says_when_it_is_cut.py +279 -0
  615. openstategraph-0.3.0rc18/tests/test_a_tier_may_supply_a_word_never_a_number.py +412 -0
  616. openstategraph-0.3.0rc18/tests/test_a_tool_call_is_announced.py +235 -0
  617. openstategraph-0.3.0rc18/tests/test_a_tool_failure_is_not_a_node_failure.py +112 -0
  618. openstategraph-0.3.0rc18/tests/test_a_tool_reads_the_run_context.py +414 -0
  619. openstategraph-0.3.0rc18/tests/test_a_tool_result_is_never_the_answer.py +85 -0
  620. openstategraph-0.3.0rc18/tests/test_a_tool_says_what_it_did.py +272 -0
  621. openstategraph-0.3.0rc18/tests/test_a_tool_stays_substitutable_for_its_base.py +85 -0
  622. openstategraph-0.3.0rc18/tests/test_a_tool_without_args_is_named.py +207 -0
  623. openstategraph-0.3.0rc18/tests/test_a_tracked_binary_carries_its_argument.py +218 -0
  624. openstategraph-0.3.0rc18/tests/test_a_turn_closes_where_it_was_not_opened.py +206 -0
  625. openstategraph-0.3.0rc18/tests/test_a_wired_tool_is_never_called_missing.py +215 -0
  626. openstategraph-0.3.0rc18/tests/test_a_worker_can_say_what_it_is_missing.py +93 -0
  627. openstategraph-0.3.0rc18/tests/test_a_worker_that_produced_nothing_is_visible.py +140 -0
  628. openstategraph-0.3.0rc18/tests/test_a_zero_is_not_a_measurement.py +701 -0
  629. openstategraph-0.3.0rc18/tests/test_active_node.py +308 -0
  630. openstategraph-0.3.0rc18/tests/test_adoption_interface.py +290 -0
  631. openstategraph-0.3.0rc18/tests/test_advisor_context.py +114 -0
  632. openstategraph-0.3.0rc18/tests/test_agent_answer_extraction.py +232 -0
  633. openstategraph-0.3.0rc18/tests/test_agent_conditional_feed.py +91 -0
  634. openstategraph-0.3.0rc18/tests/test_agent_config.py +281 -0
  635. openstategraph-0.3.0rc18/tests/test_agent_family.py +343 -0
  636. openstategraph-0.3.0rc18/tests/test_agent_node_wiring.py +315 -0
  637. openstategraph-0.3.0rc18/tests/test_agreement_without_a_denotation_engine.py +128 -0
  638. openstategraph-0.3.0rc18/tests/test_ambient_tools_are_published.py +68 -0
  639. openstategraph-0.3.0rc18/tests/test_an_agent_outlives_its_run_context.py +230 -0
  640. openstategraph-0.3.0rc18/tests/test_an_answer_says_what_it_substituted.py +136 -0
  641. openstategraph-0.3.0rc18/tests/test_an_answer_that_is_only_code_is_reported.py +121 -0
  642. openstategraph-0.3.0rc18/tests/test_an_archetype_label_survives_its_own_roster_format.py +100 -0
  643. openstategraph-0.3.0rc18/tests/test_an_async_subagent_is_isolated.py +151 -0
  644. openstategraph-0.3.0rc18/tests/test_an_async_worker_is_opted_into.py +141 -0
  645. openstategraph-0.3.0rc18/tests/test_an_authoring_warning_is_not_a_failed_run.py +334 -0
  646. openstategraph-0.3.0rc18/tests/test_an_edit_reaches_a_held_workflow.py +385 -0
  647. openstategraph-0.3.0rc18/tests/test_an_exhausted_grader_is_not_a_pass.py +166 -0
  648. openstategraph-0.3.0rc18/tests/test_an_exhausted_guard_says_it_was_not_satisfied.py +220 -0
  649. openstategraph-0.3.0rc18/tests/test_an_exhausted_loop_delivers_an_honest_answer.py +175 -0
  650. openstategraph-0.3.0rc18/tests/test_an_install_with_no_gh_has_a_door.py +523 -0
  651. openstategraph-0.3.0rc18/tests/test_an_invented_tool_name_is_a_missing_capability.py +142 -0
  652. openstategraph-0.3.0rc18/tests/test_an_invented_tool_name_is_not_a_use.py +246 -0
  653. openstategraph-0.3.0rc18/tests/test_an_issue_a_user_files_reaches_the_board.py +354 -0
  654. openstategraph-0.3.0rc18/tests/test_an_mcp_tool_can_say_what_it_did.py +549 -0
  655. openstategraph-0.3.0rc18/tests/test_an_unfenced_suggestion_still_leaves_the_answer.py +97 -0
  656. openstategraph-0.3.0rc18/tests/test_an_unmapped_verdict_does_not_compile.py +130 -0
  657. openstategraph-0.3.0rc18/tests/test_an_unsettled_answer_is_not_a_settled_one.py +266 -0
  658. openstategraph-0.3.0rc18/tests/test_an_unwired_revise_is_reported.py +278 -0
  659. openstategraph-0.3.0rc18/tests/test_answer_channel_concurrency.py +101 -0
  660. openstategraph-0.3.0rc18/tests/test_api.py +1309 -0
  661. openstategraph-0.3.0rc18/tests/test_api_auth.py +343 -0
  662. openstategraph-0.3.0rc18/tests/test_api_guide.py +325 -0
  663. openstategraph-0.3.0rc18/tests/test_architect.py +158 -0
  664. openstategraph-0.3.0rc18/tests/test_architecture_audit_2026_08.py +204 -0
  665. openstategraph-0.3.0rc18/tests/test_atom_forge_is_watertight.py +120 -0
  666. openstategraph-0.3.0rc18/tests/test_attempts_channel_concurrency.py +93 -0
  667. openstategraph-0.3.0rc18/tests/test_audience_boundary.py +567 -0
  668. openstategraph-0.3.0rc18/tests/test_behind_the_scenes.py +230 -0
  669. openstategraph-0.3.0rc18/tests/test_both_doors_share_one_health_report.py +64 -0
  670. openstategraph-0.3.0rc18/tests/test_branch_context.py +187 -0
  671. openstategraph-0.3.0rc18/tests/test_bundled_skill_tree.py +119 -0
  672. openstategraph-0.3.0rc18/tests/test_bundled_skills.py +148 -0
  673. openstategraph-0.3.0rc18/tests/test_capability_discovery.py +241 -0
  674. openstategraph-0.3.0rc18/tests/test_catalogue_events.py +553 -0
  675. openstategraph-0.3.0rc18/tests/test_chat_answer_containment.py +119 -0
  676. openstategraph-0.3.0rc18/tests/test_chat_customer_surface_hides_internal_ids.py +82 -0
  677. openstategraph-0.3.0rc18/tests/test_chat_enter_sends.py +80 -0
  678. openstategraph-0.3.0rc18/tests/test_chat_model.py +190 -0
  679. openstategraph-0.3.0rc18/tests/test_chat_picker_disambiguates.py +60 -0
  680. openstategraph-0.3.0rc18/tests/test_chat_trace_credits_the_right_node.py +63 -0
  681. openstategraph-0.3.0rc18/tests/test_chinook_demo_file.py +168 -0
  682. openstategraph-0.3.0rc18/tests/test_cli.py +844 -0
  683. openstategraph-0.3.0rc18/tests/test_cli_export_plugin.py +219 -0
  684. openstategraph-0.3.0rc18/tests/test_cli_kanban.py +603 -0
  685. openstategraph-0.3.0rc18/tests/test_cli_nodes.py +199 -0
  686. openstategraph-0.3.0rc18/tests/test_cli_resume.py +377 -0
  687. openstategraph-0.3.0rc18/tests/test_collection_policy.py +87 -0
  688. openstategraph-0.3.0rc18/tests/test_compile_diagnostics.py +132 -0
  689. openstategraph-0.3.0rc18/tests/test_compiled_graph_preview_opens_mounts.py +134 -0
  690. openstategraph-0.3.0rc18/tests/test_compiler_mints_context_schema.py +241 -0
  691. openstategraph-0.3.0rc18/tests/test_config_file.py +922 -0
  692. openstategraph-0.3.0rc18/tests/test_context_reaches_a_prompt.py +324 -0
  693. openstategraph-0.3.0rc18/tests/test_cors_origins.py +82 -0
  694. openstategraph-0.3.0rc18/tests/test_credential_failure_ux.py +416 -0
  695. openstategraph-0.3.0rc18/tests/test_customer_graph.py +220 -0
  696. openstategraph-0.3.0rc18/tests/test_customer_token_stream.py +377 -0
  697. openstategraph-0.3.0rc18/tests/test_data_key_contract.py +444 -0
  698. openstategraph-0.3.0rc18/tests/test_data_key_validity.py +178 -0
  699. openstategraph-0.3.0rc18/tests/test_deep_agent_slot_facts.py +373 -0
  700. openstategraph-0.3.0rc18/tests/test_deep_tier_offload.py +311 -0
  701. openstategraph-0.3.0rc18/tests/test_degraded_capability_is_said_out_loud.py +396 -0
  702. openstategraph-0.3.0rc18/tests/test_dev_loop_reload_guard.py +99 -0
  703. openstategraph-0.3.0rc18/tests/test_diagram_gate_reads_the_graph_not_the_pixels.py +168 -0
  704. openstategraph-0.3.0rc18/tests/test_disclosure_follows_the_tool_surface.py +472 -0
  705. openstategraph-0.3.0rc18/tests/test_discovery_is_honest.py +523 -0
  706. openstategraph-0.3.0rc18/tests/test_distribution_metadata.py +348 -0
  707. openstategraph-0.3.0rc18/tests/test_docker_requirements.py +45 -0
  708. openstategraph-0.3.0rc18/tests/test_documented_cli_surface.py +325 -0
  709. openstategraph-0.3.0rc18/tests/test_documented_fallback_is_a_port.py +124 -0
  710. openstategraph-0.3.0rc18/tests/test_documented_install.py +313 -0
  711. openstategraph-0.3.0rc18/tests/test_documented_mcp_tool_surface.py +119 -0
  712. openstategraph-0.3.0rc18/tests/test_documented_memory_promises.py +81 -0
  713. openstategraph-0.3.0rc18/tests/test_documented_modules_match_the_vocabulary.py +159 -0
  714. openstategraph-0.3.0rc18/tests/test_documented_patrol_board_surface.py +169 -0
  715. openstategraph-0.3.0rc18/tests/test_documented_skill_surface.py +1124 -0
  716. openstategraph-0.3.0rc18/tests/test_documented_spend_bar_surface.py +126 -0
  717. openstategraph-0.3.0rc18/tests/test_documented_starter_surface.py +103 -0
  718. openstategraph-0.3.0rc18/tests/test_documented_stream_surface.py +96 -0
  719. openstategraph-0.3.0rc18/tests/test_dotenv.py +349 -0
  720. openstategraph-0.3.0rc18/tests/test_editor_assets.py +356 -0
  721. openstategraph-0.3.0rc18/tests/test_editor_freshness.py +115 -0
  722. openstategraph-0.3.0rc18/tests/test_editor_validate_sees_a_mount_cycle.py +117 -0
  723. openstategraph-0.3.0rc18/tests/test_engineering_rules_match_claude_md.py +125 -0
  724. openstategraph-0.3.0rc18/tests/test_eval_cli.py +296 -0
  725. openstategraph-0.3.0rc18/tests/test_eval_dataset.py +97 -0
  726. openstategraph-0.3.0rc18/tests/test_evaluation.py +459 -0
  727. openstategraph-0.3.0rc18/tests/test_every_bindable_tool_is_drawable.py +62 -0
  728. openstategraph-0.3.0rc18/tests/test_every_builtin_tool_is_drawable.py +68 -0
  729. openstategraph-0.3.0rc18/tests/test_every_error_we_define_can_be_a_refusal.py +157 -0
  730. openstategraph-0.3.0rc18/tests/test_every_run_door_carries_identity.py +308 -0
  731. openstategraph-0.3.0rc18/tests/test_every_run_door_writes_itself_down.py +370 -0
  732. openstategraph-0.3.0rc18/tests/test_every_spin_up_path_says_whose_it_is.py +162 -0
  733. openstategraph-0.3.0rc18/tests/test_every_table_the_board_creates_has_row_security.py +206 -0
  734. openstategraph-0.3.0rc18/tests/test_example_warnings_are_declared.py +120 -0
  735. openstategraph-0.3.0rc18/tests/test_examples.py +318 -0
  736. openstategraph-0.3.0rc18/tests/test_export_readme_names_its_dependencies.py +212 -0
  737. openstategraph-0.3.0rc18/tests/test_extensions.py +512 -0
  738. openstategraph-0.3.0rc18/tests/test_feedback_channel_concurrency.py +95 -0
  739. openstategraph-0.3.0rc18/tests/test_first_ten_minutes.py +104 -0
  740. openstategraph-0.3.0rc18/tests/test_follow_up_conversation.py +211 -0
  741. openstategraph-0.3.0rc18/tests/test_function_and_subgraph_nodes.py +168 -0
  742. openstategraph-0.3.0rc18/tests/test_gallery_draws_each_graph_once.py +139 -0
  743. openstategraph-0.3.0rc18/tests/test_grader.py +231 -0
  744. openstategraph-0.3.0rc18/tests/test_grader_criteria_is_satisfiable.py +135 -0
  745. openstategraph-0.3.0rc18/tests/test_grader_exhaustion.py +132 -0
  746. openstategraph-0.3.0rc18/tests/test_grandchild_machinery_names.py +162 -0
  747. openstategraph-0.3.0rc18/tests/test_graph_names.py +125 -0
  748. openstategraph-0.3.0rc18/tests/test_guard_check.py +196 -0
  749. openstategraph-0.3.0rc18/tests/test_guardrail.py +219 -0
  750. openstategraph-0.3.0rc18/tests/test_guardrail_field_contract.py +77 -0
  751. openstategraph-0.3.0rc18/tests/test_guardrail_node.py +331 -0
  752. openstategraph-0.3.0rc18/tests/test_harness_findings_against_the_real_harness.py +155 -0
  753. openstategraph-0.3.0rc18/tests/test_help_text_names_no_ticket.py +139 -0
  754. openstategraph-0.3.0rc18/tests/test_human_approval.py +164 -0
  755. openstategraph-0.3.0rc18/tests/test_init_project.py +680 -0
  756. openstategraph-0.3.0rc18/tests/test_init_reviews_a_workflows_root_it_did_not_write.py +158 -0
  757. openstategraph-0.3.0rc18/tests/test_init_writes_a_command_the_agent_can_run.py +178 -0
  758. openstategraph-0.3.0rc18/tests/test_injection_screening.py +218 -0
  759. openstategraph-0.3.0rc18/tests/test_intent_routed_workflow.py +211 -0
  760. openstategraph-0.3.0rc18/tests/test_kanban_idea_cards.py +279 -0
  761. openstategraph-0.3.0rc18/tests/test_kanban_routes.py +503 -0
  762. openstategraph-0.3.0rc18/tests/test_kanban_store.py +979 -0
  763. openstategraph-0.3.0rc18/tests/test_kanban_store_contract.py +320 -0
  764. openstategraph-0.3.0rc18/tests/test_kanban_triage.py +193 -0
  765. openstategraph-0.3.0rc18/tests/test_knowledge.py +310 -0
  766. openstategraph-0.3.0rc18/tests/test_knowledge_build.py +820 -0
  767. openstategraph-0.3.0rc18/tests/test_knowledge_codebase.py +181 -0
  768. openstategraph-0.3.0rc18/tests/test_knowledge_curation.py +216 -0
  769. openstategraph-0.3.0rc18/tests/test_knowledge_explorer.py +730 -0
  770. openstategraph-0.3.0rc18/tests/test_load_workflow.py +275 -0
  771. openstategraph-0.3.0rc18/tests/test_loop_gate_ci_coverage.py +83 -0
  772. openstategraph-0.3.0rc18/tests/test_mcp_config_edit.py +245 -0
  773. openstategraph-0.3.0rc18/tests/test_mcp_field_contract.py +233 -0
  774. openstategraph-0.3.0rc18/tests/test_mcp_kanban.py +1039 -0
  775. openstategraph-0.3.0rc18/tests/test_mcp_routes.py +402 -0
  776. openstategraph-0.3.0rc18/tests/test_mcp_server.py +917 -0
  777. openstategraph-0.3.0rc18/tests/test_mcp_sessions_are_reused.py +417 -0
  778. openstategraph-0.3.0rc18/tests/test_mcp_skill_tools.py +83 -0
  779. openstategraph-0.3.0rc18/tests/test_memory.py +934 -0
  780. openstategraph-0.3.0rc18/tests/test_memory_reaches_every_transport.py +245 -0
  781. openstategraph-0.3.0rc18/tests/test_memory_segment.py +314 -0
  782. openstategraph-0.3.0rc18/tests/test_memory_taxonomy_words.py +93 -0
  783. openstategraph-0.3.0rc18/tests/test_message_content_is_read_the_same_way.py +156 -0
  784. openstategraph-0.3.0rc18/tests/test_model_field_contract.py +68 -0
  785. openstategraph-0.3.0rc18/tests/test_module_size_ceiling.py +1487 -0
  786. openstategraph-0.3.0rc18/tests/test_mount_adversarial.py +632 -0
  787. openstategraph-0.3.0rc18/tests/test_mount_composition_preview.py +252 -0
  788. openstategraph-0.3.0rc18/tests/test_mount_effective_document.py +318 -0
  789. openstategraph-0.3.0rc18/tests/test_mount_endpoint.py +180 -0
  790. openstategraph-0.3.0rc18/tests/test_mount_findings_reach_the_run.py +181 -0
  791. openstategraph-0.3.0rc18/tests/test_mount_overrides.py +117 -0
  792. openstategraph-0.3.0rc18/tests/test_mount_usage_endpoint.py +111 -0
  793. openstategraph-0.3.0rc18/tests/test_mounted_subgraph_namespace.py +179 -0
  794. openstategraph-0.3.0rc18/tests/test_mssql_connection.py +278 -0
  795. openstategraph-0.3.0rc18/tests/test_narration_middleware.py +705 -0
  796. openstategraph-0.3.0rc18/tests/test_never_an_empty_answer.py +114 -0
  797. openstategraph-0.3.0rc18/tests/test_new_writes_where_serve_reads.py +167 -0
  798. openstategraph-0.3.0rc18/tests/test_newest_first_is_the_latest_instant.py +263 -0
  799. openstategraph-0.3.0rc18/tests/test_nine_provider_cases.py +76 -0
  800. openstategraph-0.3.0rc18/tests/test_no_document_repeats_a_retracted_claim.py +346 -0
  801. openstategraph-0.3.0rc18/tests/test_no_provider_run_is_legible.py +192 -0
  802. openstategraph-0.3.0rc18/tests/test_no_repeated_work.py +150 -0
  803. openstategraph-0.3.0rc18/tests/test_no_shipped_package_ships_a_diagnostic.py +199 -0
  804. openstategraph-0.3.0rc18/tests/test_no_tracked_file_names_a_machine.py +169 -0
  805. openstategraph-0.3.0rc18/tests/test_node_cache_policy.py +171 -0
  806. openstategraph-0.3.0rc18/tests/test_node_catalogue.py +185 -0
  807. openstategraph-0.3.0rc18/tests/test_node_contracts_publish_every_locked_layer.py +102 -0
  808. openstategraph-0.3.0rc18/tests/test_node_families.py +299 -0
  809. openstategraph-0.3.0rc18/tests/test_node_overrides.py +184 -0
  810. openstategraph-0.3.0rc18/tests/test_node_runtime.py +831 -0
  811. openstategraph-0.3.0rc18/tests/test_node_type_registry.py +154 -0
  812. openstategraph-0.3.0rc18/tests/test_nostream_machinery.py +297 -0
  813. openstategraph-0.3.0rc18/tests/test_one_accessor_reads_run_identity.py +383 -0
  814. openstategraph-0.3.0rc18/tests/test_one_graders_sentence.py +68 -0
  815. openstategraph-0.3.0rc18/tests/test_one_product_one_version.py +66 -0
  816. openstategraph-0.3.0rc18/tests/test_one_store_and_a_pluggable_sink.py +817 -0
  817. openstategraph-0.3.0rc18/tests/test_one_stream_per_tab.py +370 -0
  818. openstategraph-0.3.0rc18/tests/test_one_verb_opens_the_project_it_names.py +323 -0
  819. openstategraph-0.3.0rc18/tests/test_openapi_contract.py +143 -0
  820. openstategraph-0.3.0rc18/tests/test_openapi_toolchain.py +150 -0
  821. openstategraph-0.3.0rc18/tests/test_openwiki_links_resolve.py +62 -0
  822. openstategraph-0.3.0rc18/tests/test_orchestrator.py +323 -0
  823. openstategraph-0.3.0rc18/tests/test_orchestrator_graph.py +634 -0
  824. openstategraph-0.3.0rc18/tests/test_override_target_is_named.py +168 -0
  825. openstategraph-0.3.0rc18/tests/test_package_testing.py +200 -0
  826. openstategraph-0.3.0rc18/tests/test_patrol.py +533 -0
  827. openstategraph-0.3.0rc18/tests/test_patrol_events.py +408 -0
  828. openstategraph-0.3.0rc18/tests/test_patrol_registry.py +85 -0
  829. openstategraph-0.3.0rc18/tests/test_persisted_checkpointer.py +307 -0
  830. openstategraph-0.3.0rc18/tests/test_persisted_memory_store.py +221 -0
  831. openstategraph-0.3.0rc18/tests/test_pip_retry.py +186 -0
  832. openstategraph-0.3.0rc18/tests/test_plugin_capabilities.py +301 -0
  833. openstategraph-0.3.0rc18/tests/test_plugin_interop.py +310 -0
  834. openstategraph-0.3.0rc18/tests/test_postgres_backend.py +280 -0
  835. openstategraph-0.3.0rc18/tests/test_prebuilt_databricks.py +306 -0
  836. openstategraph-0.3.0rc18/tests/test_prebuilt_email.py +52 -0
  837. openstategraph-0.3.0rc18/tests/test_prebuilt_mcp.py +1011 -0
  838. openstategraph-0.3.0rc18/tests/test_prebuilt_mssql.py +337 -0
  839. openstategraph-0.3.0rc18/tests/test_prebuilt_platform.py +152 -0
  840. openstategraph-0.3.0rc18/tests/test_prebuilt_sql.py +72 -0
  841. openstategraph-0.3.0rc18/tests/test_prebuilt_warehouse.py +473 -0
  842. openstategraph-0.3.0rc18/tests/test_prebuilt_web.py +140 -0
  843. openstategraph-0.3.0rc18/tests/test_prebuilt_youtube.py +444 -0
  844. openstategraph-0.3.0rc18/tests/test_principal.py +157 -0
  845. openstategraph-0.3.0rc18/tests/test_production_audit_2026_08_15.py +190 -0
  846. openstategraph-0.3.0rc18/tests/test_progress_frames.py +238 -0
  847. openstategraph-0.3.0rc18/tests/test_project_identity.py +442 -0
  848. openstategraph-0.3.0rc18/tests/test_prompt_chaining.py +88 -0
  849. openstategraph-0.3.0rc18/tests/test_prompt_mirror_contract.py +198 -0
  850. openstategraph-0.3.0rc18/tests/test_prompt_sections_are_delimited.py +131 -0
  851. openstategraph-0.3.0rc18/tests/test_provider_gap.py +213 -0
  852. openstategraph-0.3.0rc18/tests/test_provider_registry.py +596 -0
  853. openstategraph-0.3.0rc18/tests/test_provider_status_endpoint.py +308 -0
  854. openstategraph-0.3.0rc18/tests/test_provider_status_names_the_extra.py +91 -0
  855. openstategraph-0.3.0rc18/tests/test_providers_does_not_promise_a_run.py +329 -0
  856. openstategraph-0.3.0rc18/tests/test_public_api.py +329 -0
  857. openstategraph-0.3.0rc18/tests/test_public_surface_ceiling.py +1017 -0
  858. openstategraph-0.3.0rc18/tests/test_python_support.py +161 -0
  859. openstategraph-0.3.0rc18/tests/test_readme_names_the_wheels_builder_gap.py +72 -0
  860. openstategraph-0.3.0rc18/tests/test_reasoning_effort.py +447 -0
  861. openstategraph-0.3.0rc18/tests/test_reducers_are_named.py +232 -0
  862. openstategraph-0.3.0rc18/tests/test_request_credentials.py +94 -0
  863. openstategraph-0.3.0rc18/tests/test_resource_lifecycle.py +423 -0
  864. openstategraph-0.3.0rc18/tests/test_resume_accepts_the_field_the_pause_published.py +62 -0
  865. openstategraph-0.3.0rc18/tests/test_retention_grammar_contract.py +80 -0
  866. openstategraph-0.3.0rc18/tests/test_reverse_proxy.py +288 -0
  867. openstategraph-0.3.0rc18/tests/test_route_check.py +226 -0
  868. openstategraph-0.3.0rc18/tests/test_route_modules.py +206 -0
  869. openstategraph-0.3.0rc18/tests/test_router.py +173 -0
  870. openstategraph-0.3.0rc18/tests/test_router_branches.py +167 -0
  871. openstategraph-0.3.0rc18/tests/test_run_context_declaration.py +310 -0
  872. openstategraph-0.3.0rc18/tests/test_run_path_projection.py +231 -0
  873. openstategraph-0.3.0rc18/tests/test_run_readiness_is_one_sentence.py +137 -0
  874. openstategraph-0.3.0rc18/tests/test_run_request_seams.py +136 -0
  875. openstategraph-0.3.0rc18/tests/test_run_result.py +108 -0
  876. openstategraph-0.3.0rc18/tests/test_runs_thread.py +232 -0
  877. openstategraph-0.3.0rc18/tests/test_runtime_context_facts.py +367 -0
  878. openstategraph-0.3.0rc18/tests/test_scaffold_writes_agent_files.py +184 -0
  879. openstategraph-0.3.0rc18/tests/test_schema_v3_team_collapse.py +202 -0
  880. openstategraph-0.3.0rc18/tests/test_schema_versioning.py +226 -0
  881. openstategraph-0.3.0rc18/tests/test_sdk_injection.py +337 -0
  882. openstategraph-0.3.0rc18/tests/test_search_backends.py +233 -0
  883. openstategraph-0.3.0rc18/tests/test_search_memory_admits_it_cannot_rank.py +106 -0
  884. openstategraph-0.3.0rc18/tests/test_send_it_back_once_is_a_number_the_hint_names.py +171 -0
  885. openstategraph-0.3.0rc18/tests/test_serve_listener.py +142 -0
  886. openstategraph-0.3.0rc18/tests/test_session_identity.py +114 -0
  887. openstategraph-0.3.0rc18/tests/test_shipped_examples_match_dev_relay_wiring.py +82 -0
  888. openstategraph-0.3.0rc18/tests/test_shipped_skills_measured_disclosure.py +136 -0
  889. openstategraph-0.3.0rc18/tests/test_shipped_tools_report_progress.py +330 -0
  890. openstategraph-0.3.0rc18/tests/test_site_pages.py +508 -0
  891. openstategraph-0.3.0rc18/tests/test_skill_layer.py +421 -0
  892. openstategraph-0.3.0rc18/tests/test_skill_layer_contract.py +98 -0
  893. openstategraph-0.3.0rc18/tests/test_spawn_events.py +224 -0
  894. openstategraph-0.3.0rc18/tests/test_spend_route.py +232 -0
  895. openstategraph-0.3.0rc18/tests/test_spend_summary.py +528 -0
  896. openstategraph-0.3.0rc18/tests/test_spend_summary_cost.py +184 -0
  897. openstategraph-0.3.0rc18/tests/test_sql_explorer_field_contract.py +133 -0
  898. openstategraph-0.3.0rc18/tests/test_sql_reach.py +135 -0
  899. openstategraph-0.3.0rc18/tests/test_stability_contract.py +123 -0
  900. openstategraph-0.3.0rc18/tests/test_state_dir.py +238 -0
  901. openstategraph-0.3.0rc18/tests/test_static_text_is_not_the_entry.py +89 -0
  902. openstategraph-0.3.0rc18/tests/test_stream_cancellation.py +220 -0
  903. openstategraph-0.3.0rc18/tests/test_stream_version_v2.py +177 -0
  904. openstategraph-0.3.0rc18/tests/test_stress_workload_fixtures.py +279 -0
  905. openstategraph-0.3.0rc18/tests/test_supervisor_archetypes.py +374 -0
  906. openstategraph-0.3.0rc18/tests/test_support_triage_gates_before_it_sends.py +131 -0
  907. openstategraph-0.3.0rc18/tests/test_team_node.py +215 -0
  908. openstategraph-0.3.0rc18/tests/test_team_outcome_is_unenforced.py +163 -0
  909. openstategraph-0.3.0rc18/tests/test_templates.py +399 -0
  910. openstategraph-0.3.0rc18/tests/test_terminal_frame.py +513 -0
  911. openstategraph-0.3.0rc18/tests/test_terminal_frame_nesting.py +179 -0
  912. openstategraph-0.3.0rc18/tests/test_the_advisor_can_say_nothing_here_fits.py +90 -0
  913. openstategraph-0.3.0rc18/tests/test_the_agent_ladder_needs_no_async_door.py +116 -0
  914. openstategraph-0.3.0rc18/tests/test_the_agent_node_awaits_its_model.py +105 -0
  915. openstategraph-0.3.0rc18/tests/test_the_agent_offers_what_nothing_can_build.py +200 -0
  916. openstategraph-0.3.0rc18/tests/test_the_api_takes_back_what_it_hands_you.py +98 -0
  917. openstategraph-0.3.0rc18/tests/test_the_async_run_path_can_use_the_servers_saver.py +208 -0
  918. openstategraph-0.3.0rc18/tests/test_the_board_learns_a_card_moved.py +300 -0
  919. openstategraph-0.3.0rc18/tests/test_the_budget_floor_walk_is_linear.py +169 -0
  920. openstategraph-0.3.0rc18/tests/test_the_build_door_opens_on_a_turn_that_called_six_tools.py +381 -0
  921. openstategraph-0.3.0rc18/tests/test_the_canvas_page_names_every_way_out_of_a_loop.py +123 -0
  922. openstategraph-0.3.0rc18/tests/test_the_canvas_page_says_what_replay_costs.py +186 -0
  923. openstategraph-0.3.0rc18/tests/test_the_card_store_has_a_seam.py +263 -0
  924. openstategraph-0.3.0rc18/tests/test_the_chat_page_names_its_wait.py +131 -0
  925. openstategraph-0.3.0rc18/tests/test_the_chat_page_says_what_it_does.py +69 -0
  926. openstategraph-0.3.0rc18/tests/test_the_chunks_are_kept.py +470 -0
  927. openstategraph-0.3.0rc18/tests/test_the_code_owner_is_a_person.py +86 -0
  928. openstategraph-0.3.0rc18/tests/test_the_demo_route_is_not_published.py +160 -0
  929. openstategraph-0.3.0rc18/tests/test_the_docs_index_is_reachable_and_complete.py +104 -0
  930. openstategraph-0.3.0rc18/tests/test_the_documented_collection_gap_is_the_real_one.py +134 -0
  931. openstategraph-0.3.0rc18/tests/test_the_documented_ritual_is_one_the_board_accepts.py +164 -0
  932. openstategraph-0.3.0rc18/tests/test_the_door_opens_on_the_shape_of_the_run.py +269 -0
  933. openstategraph-0.3.0rc18/tests/test_the_editor_makes_a_whole_package.py +94 -0
  934. openstategraph-0.3.0rc18/tests/test_the_emittable_prelude.py +300 -0
  935. openstategraph-0.3.0rc18/tests/test_the_empty_picker_names_the_fix.py +47 -0
  936. openstategraph-0.3.0rc18/tests/test_the_end_node_shows_the_answer.py +69 -0
  937. openstategraph-0.3.0rc18/tests/test_the_escape_hatch_says_which_door.py +227 -0
  938. openstategraph-0.3.0rc18/tests/test_the_first_browser_does_not_buy_everyones_runs.py +206 -0
  939. openstategraph-0.3.0rc18/tests/test_the_first_command_a_stranger_copies.py +262 -0
  940. openstategraph-0.3.0rc18/tests/test_the_frame_clock_survives_the_transport.py +153 -0
  941. openstategraph-0.3.0rc18/tests/test_the_frame_fields_are_published.py +139 -0
  942. openstategraph-0.3.0rc18/tests/test_the_front_door_says_there_is_a_stream.py +168 -0
  943. openstategraph-0.3.0rc18/tests/test_the_front_door_sets_a_credential_before_it_says_run.py +106 -0
  944. openstategraph-0.3.0rc18/tests/test_the_front_door_stays_short.py +198 -0
  945. openstategraph-0.3.0rc18/tests/test_the_gallery_names_nodes_as_their_authors_did.py +119 -0
  946. openstategraph-0.3.0rc18/tests/test_the_gallery_sweep_covers_the_gallery.py +74 -0
  947. openstategraph-0.3.0rc18/tests/test_the_gap_register_can_count_itself.py +88 -0
  948. openstategraph-0.3.0rc18/tests/test_the_gate_says_a_check_rejected_it.py +128 -0
  949. openstategraph-0.3.0rc18/tests/test_the_gate_says_what_the_grader_thought.py +296 -0
  950. openstategraph-0.3.0rc18/tests/test_the_grader_ladder_grows_an_async_door.py +251 -0
  951. openstategraph-0.3.0rc18/tests/test_the_grader_node_awaits_its_judgement.py +495 -0
  952. openstategraph-0.3.0rc18/tests/test_the_guard_holds_an_unfenced_object.py +97 -0
  953. openstategraph-0.3.0rc18/tests/test_the_harness_contract_is_in_the_preamble.py +194 -0
  954. openstategraph-0.3.0rc18/tests/test_the_install_hint_can_be_carried_out.py +297 -0
  955. openstategraph-0.3.0rc18/tests/test_the_join_gathers_branch_results_too.py +83 -0
  956. openstategraph-0.3.0rc18/tests/test_the_keyless_door_files_onto_a_board_a_tab_reads.py +158 -0
  957. openstategraph-0.3.0rc18/tests/test_the_launch_config_reads_env.py +96 -0
  958. openstategraph-0.3.0rc18/tests/test_the_library_door_reads_the_whole_health_report.py +198 -0
  959. openstategraph-0.3.0rc18/tests/test_the_lint_gate_actually_runs.py +93 -0
  960. openstategraph-0.3.0rc18/tests/test_the_live_flow_follows_a_run_into_a_mount.py +146 -0
  961. openstategraph-0.3.0rc18/tests/test_the_mcp_run_door_answers_to_an_audience.py +311 -0
  962. openstategraph-0.3.0rc18/tests/test_the_mcp_tool_is_already_awaitable.py +191 -0
  963. openstategraph-0.3.0rc18/tests/test_the_mount_type_set_is_declared_once.py +116 -0
  964. openstategraph-0.3.0rc18/tests/test_the_offer_is_made_from_the_rejection.py +49 -0
  965. openstategraph-0.3.0rc18/tests/test_the_one_example.py +413 -0
  966. openstategraph-0.3.0rc18/tests/test_the_open_ticket_census.py +99 -0
  967. openstategraph-0.3.0rc18/tests/test_the_orchestrator_ladder_grows_async_doors.py +404 -0
  968. openstategraph-0.3.0rc18/tests/test_the_orchestrator_node_awaits_its_planner.py +452 -0
  969. openstategraph-0.3.0rc18/tests/test_the_platform_list_does_not_over_claim.py +82 -0
  970. openstategraph-0.3.0rc18/tests/test_the_ports_page_matches_the_catalogue.py +131 -0
  971. openstategraph-0.3.0rc18/tests/test_the_prebuilt_tools_page_configures_what_exists.py +159 -0
  972. openstategraph-0.3.0rc18/tests/test_the_progress_rail_names_only_this_conversations_workers.py +289 -0
  973. openstategraph-0.3.0rc18/tests/test_the_public_settings_checklist_names_every_secret.py +93 -0
  974. openstategraph-0.3.0rc18/tests/test_the_purpose_is_shown_beside_the_shape.py +64 -0
  975. openstategraph-0.3.0rc18/tests/test_the_readme_a_stranger_lands_on.py +248 -0
  976. openstategraph-0.3.0rc18/tests/test_the_recordings_have_a_door.py +196 -0
  977. openstategraph-0.3.0rc18/tests/test_the_release_train_names_what_has_not_run.py +98 -0
  978. openstategraph-0.3.0rc18/tests/test_the_replay_door_shows_no_machinery.py +112 -0
  979. openstategraph-0.3.0rc18/tests/test_the_router_ladder_grows_an_async_door.py +265 -0
  980. openstategraph-0.3.0rc18/tests/test_the_router_node_awaits_its_classifier.py +414 -0
  981. openstategraph-0.3.0rc18/tests/test_the_run_surface_names_no_framework.py +337 -0
  982. openstategraph-0.3.0rc18/tests/test_the_same_call_twice_is_two_findings.py +1094 -0
  983. openstategraph-0.3.0rc18/tests/test_the_same_question_twice.py +364 -0
  984. openstategraph-0.3.0rc18/tests/test_the_scratchpad_is_not_the_answer.py +108 -0
  985. openstategraph-0.3.0rc18/tests/test_the_second_consumer_is_pinned.py +153 -0
  986. openstategraph-0.3.0rc18/tests/test_the_setup_path_stays_cheap.py +117 -0
  987. openstategraph-0.3.0rc18/tests/test_the_shared_board_applies_its_own_migrations.py +302 -0
  988. openstategraph-0.3.0rc18/tests/test_the_shared_board_has_a_reviewable_schema.py +276 -0
  989. openstategraph-0.3.0rc18/tests/test_the_skills_and_the_server_ship_as_one_bundle.py +184 -0
  990. openstategraph-0.3.0rc18/tests/test_the_sse_wire_format_is_unchanged.py +338 -0
  991. openstategraph-0.3.0rc18/tests/test_the_step_budget_reaches_the_graph.py +303 -0
  992. openstategraph-0.3.0rc18/tests/test_the_store_takes_a_new_column.py +185 -0
  993. openstategraph-0.3.0rc18/tests/test_the_stream_says_where_a_background_worker_stands.py +181 -0
  994. openstategraph-0.3.0rc18/tests/test_the_streaming_door_reports_a_recovered_retry.py +250 -0
  995. openstategraph-0.3.0rc18/tests/test_the_tasks_stream_mode_is_a_start_event.py +313 -0
  996. openstategraph-0.3.0rc18/tests/test_the_team_tab_has_something_to_show.py +259 -0
  997. openstategraph-0.3.0rc18/tests/test_the_testpypi_command_names_both_indexes.py +130 -0
  998. openstategraph-0.3.0rc18/tests/test_the_tool_ladder_grows_an_async_door.py +520 -0
  999. openstategraph-0.3.0rc18/tests/test_the_tool_result_channel_is_unframed_on_purpose.py +244 -0
  1000. openstategraph-0.3.0rc18/tests/test_the_trace_shows_a_skipped_grader.py +161 -0
  1001. openstategraph-0.3.0rc18/tests/test_the_tree_is_publishable.py +732 -0
  1002. openstategraph-0.3.0rc18/tests/test_the_turn_measurement_adds_up.py +158 -0
  1003. openstategraph-0.3.0rc18/tests/test_the_type_gate_actually_runs.py +115 -0
  1004. openstategraph-0.3.0rc18/tests/test_the_type_gate_survives_a_newer_stub.py +263 -0
  1005. openstategraph-0.3.0rc18/tests/test_the_wheel_argument_is_regenerable.py +143 -0
  1006. openstategraph-0.3.0rc18/tests/test_the_wheel_ships_a_current_editor.py +220 -0
  1007. openstategraph-0.3.0rc18/tests/test_the_wheel_teaches_what_it_ships.py +211 -0
  1008. openstategraph-0.3.0rc18/tests/test_the_worker_node_awaits_its_model.py +152 -0
  1009. openstategraph-0.3.0rc18/tests/test_the_worker_records_what_it_was_refused.py +163 -0
  1010. openstategraph-0.3.0rc18/tests/test_threads.py +308 -0
  1011. openstategraph-0.3.0rc18/tests/test_threads_show_the_resume_line.py +150 -0
  1012. openstategraph-0.3.0rc18/tests/test_three_failed_tool_calls_and_the_judges_never_heard.py +340 -0
  1013. openstategraph-0.3.0rc18/tests/test_three_tabs_on_one_workflow.py +369 -0
  1014. openstategraph-0.3.0rc18/tests/test_ticket_ledger.py +467 -0
  1015. openstategraph-0.3.0rc18/tests/test_token_block_kind.py +273 -0
  1016. openstategraph-0.3.0rc18/tests/test_tool_findings.py +689 -0
  1017. openstategraph-0.3.0rc18/tests/test_tool_resolution.py +121 -0
  1018. openstategraph-0.3.0rc18/tests/test_tool_result_frames.py +148 -0
  1019. openstategraph-0.3.0rc18/tests/test_tool_sentences.py +301 -0
  1020. openstategraph-0.3.0rc18/tests/test_transcript_is_not_a_channel.py +209 -0
  1021. openstategraph-0.3.0rc18/tests/test_turn_reset.py +58 -0
  1022. openstategraph-0.3.0rc18/tests/test_two_capability_gaps_share_one_name.py +60 -0
  1023. openstategraph-0.3.0rc18/tests/test_two_exits_both_reach_the_reader.py +339 -0
  1024. openstategraph-0.3.0rc18/tests/test_two_scaffolded_packages_collect_in_one_run.py +146 -0
  1025. openstategraph-0.3.0rc18/tests/test_two_workers_of_one_node_are_two_channels.py +107 -0
  1026. openstategraph-0.3.0rc18/tests/test_unknown_node_type_is_loud.py +204 -0
  1027. openstategraph-0.3.0rc18/tests/test_unreachable_provider_endpoint.py +240 -0
  1028. openstategraph-0.3.0rc18/tests/test_untrusted_input_is_data_in_the_locked_preamble.py +213 -0
  1029. openstategraph-0.3.0rc18/tests/test_validate_accepts_the_document_it_is_handed.py +63 -0
  1030. openstategraph-0.3.0rc18/tests/test_validate_checks_mount_targets.py +250 -0
  1031. openstategraph-0.3.0rc18/tests/test_validate_checks_tool_bindings.py +207 -0
  1032. openstategraph-0.3.0rc18/tests/test_validate_endpoint.py +137 -0
  1033. openstategraph-0.3.0rc18/tests/test_validate_names_a_node_that_never_runs.py +133 -0
  1034. openstategraph-0.3.0rc18/tests/test_validate_prints_the_compilers_findings.py +190 -0
  1035. openstategraph-0.3.0rc18/tests/test_validate_reads_the_field_schema.py +170 -0
  1036. openstategraph-0.3.0rc18/tests/test_validate_sees_a_mount_cycle.py +186 -0
  1037. openstategraph-0.3.0rc18/tests/test_what_a_redaction_leaves_behind.py +160 -0
  1038. openstategraph-0.3.0rc18/tests/test_which_model_a_run_uses.py +569 -0
  1039. openstategraph-0.3.0rc18/tests/test_wiring_page_streams.py +247 -0
  1040. openstategraph-0.3.0rc18/tests/test_worker_ceiling.py +261 -0
  1041. openstategraph-0.3.0rc18/tests/test_workflow_compiler.py +535 -0
  1042. openstategraph-0.3.0rc18/tests/test_workflow_store.py +653 -0
  1043. openstategraph-0.3.0rc18/tests/test_workflows_catalogue.py +354 -0
  1044. openstategraph-0.3.0rc18/tests/test_workflows_root.py +154 -0
  1045. openstategraph-0.3.0rc18/tests/workflows/stress/stress-async-probe/tools/slow.py +33 -0
  1046. openstategraph-0.3.0rc18/tests/workflows/stress/stress-async-probe/workflow.json +22 -0
  1047. openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-fallback/workflow.json +146 -0
  1048. openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-ghost-mount/workflow.json +168 -0
  1049. openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-static-cycle/workflow.json +23 -0
  1050. openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-two-producers/workflow.json +136 -0
  1051. openstategraph-0.3.0rc18/tests/workflows/stress/stress-deep/tools/service_registry.py +85 -0
  1052. openstategraph-0.3.0rc18/tests/workflows/stress/stress-deep/workflow.json +108 -0
  1053. openstategraph-0.3.0rc18/tests/workflows/stress/stress-parallel-drop/workflow.json +38 -0
  1054. openstategraph-0.3.0rc18/tests/workflows/stress/stress-review/tools/service_registry.py +85 -0
  1055. openstategraph-0.3.0rc18/tests/workflows/stress/stress-review/workflow.json +117 -0
  1056. openstategraph-0.3.0rc18/tests/workflows/stress/stress-review-audit/workflow.json +38 -0
  1057. openstategraph-0.3.0rc18/tests/workflows/stress/stress-review-lint/tools/change_policy.py +48 -0
  1058. openstategraph-0.3.0rc18/tests/workflows/stress/stress-review-lint/workflow.json +32 -0
  1059. openstategraph-0.3.0rc18/uv.lock +2447 -0
@@ -0,0 +1,11 @@
1
+
2
+ # --- Deployment ---------------------------------------------------------
3
+ # Shared bearer token for the HTTP API and the MCP layer. Unset means NO
4
+ # auth: anyone who reaches the port can run workflows, read every workflow
5
+ # file and spend your model budget. See docs/deploying.md.
6
+ OPENSTATEGRAPH_API_TOKEN=
7
+
8
+ # Where durable state (approval checkpoints, the serve lock) is written.
9
+ # Defaults to the platform state dir when installed, or the checkout's
10
+ # .openstategraph/ in a repo. Never inside someone else's workflows folder.
11
+ OPENSTATEGRAPH_STATE_DIR=
@@ -0,0 +1,80 @@
1
+ # Dependencies
2
+ node_modules/
3
+
4
+ # Build output
5
+ dist/
6
+ *.tsbuildinfo
7
+
8
+ # Code graph — derived, rebuild with `graphify update .`
9
+ graphify-out/
10
+
11
+ # Editor / OS
12
+ .DS_Store
13
+ *.swp
14
+ .idea/
15
+ .vscode/*
16
+ !.vscode/extensions.json
17
+
18
+ # Local env and secrets
19
+ .env
20
+ .env.*
21
+ !.env.example
22
+ *.local
23
+
24
+ # Python (backend, not yet created)
25
+ __pycache__/
26
+ *.py[cod]
27
+ .venv/
28
+ venv/
29
+ .pytest_cache/
30
+ .ruff_cache/
31
+ .mypy_cache/
32
+
33
+ # Test output. `.coverage` is the sqlite database a coverage run writes: a
34
+ # build artifact with no reader, carrying the absolute paths of whichever
35
+ # machine produced it. It was tracked until `publishable/04`, which is what an
36
+ # artifact with no ignore rule does — an untracked file comes back on the next
37
+ # careless `git add`.
38
+ coverage/
39
+ .coverage
40
+ .coverage.*
41
+ .gstack/
42
+
43
+ # No PDF belongs at the repository root. A third party's article was committed
44
+ # there and went unnoticed for weeks (`publishable/04`); republishing somebody
45
+ # else's copyrighted work is the reason that mattered, and a careless `git add`
46
+ # at the root is how it arrived. Anchored, so a PDF that a document genuinely
47
+ # needs can still live beside that document. `git add -f` is the hatch.
48
+ /*.pdf
49
+
50
+ # Code Workshop workflow — runtime jail and PR dry-run output, never sources
51
+ harness-loop-graph.pdf
52
+ .claude/settings.local.json
53
+ .dev/
54
+
55
+ # Runtime state, not content: thread checkpoints (ticket 05) live beside the
56
+ # workflow packages they are state about. The -wal/-shm siblings are sqlite's.
57
+ .openstategraph/
58
+ workflows/.openstategraph/
59
+ test-results/
60
+ playwright-report/
61
+
62
+ # Internal planning substrate — local only, never published
63
+ .scratch/
64
+ HANDOVER.md
65
+
66
+ # The refused-term table for `backend/tests/test_the_tree_is_publishable.py`.
67
+ # The gate is the one place a client engagement is named, and `publishable/06`
68
+ # measured what that cost: tracked, the gate would have published the list it
69
+ # exists to keep out, in the commit and in the sdist both. So the words live
70
+ # here, untracked, and the gate loads them — skipping loudly when the file is
71
+ # absent rather than reporting a green it did not earn. At the repository root
72
+ # on purpose: the sdist is built from `backend/`, so a table up here cannot
73
+ # reach a distribution even if this rule were deleted.
74
+ /.engagement-terms.json
75
+
76
+ # The migration CLI's own scratch directory. It caches a version string and a
77
+ # link state for whichever project a maintainer is pointed at — a working note
78
+ # of one machine, not a fact about this repository, and the one file it holds
79
+ # today is the CLI's latest version number (team-board-and-gap-reports/09).
80
+ supabase/.temp/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Zulfeekar Cheriyam Purath
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,179 @@
1
+ Metadata-Version: 2.5
2
+ Name: openstategraph
3
+ Version: 0.3.0rc18
4
+ Summary: A compiler from a vendor-neutral workflow.json to a LangGraph StateGraph.
5
+ Project-URL: Homepage, https://github.com/zulfeekar/openstategraph
6
+ Project-URL: Repository, https://github.com/zulfeekar/openstategraph
7
+ Project-URL: Source, https://github.com/zulfeekar/openstategraph
8
+ Project-URL: Changelog, https://github.com/zulfeekar/openstategraph/blob/main/CHANGELOG.md
9
+ Project-URL: Documentation, https://github.com/zulfeekar/openstategraph/blob/main/docs/adoption.md
10
+ Author: Zulfeekar Cheriyam Purath
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: agents,compiler,langchain,langgraph,state-machine,workflow
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
+ Classifier: Topic :: Software Development :: Compilers
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.11
25
+ Requires-Dist: langchain-core<2,>=1.0
26
+ Requires-Dist: langchain<2,>=1.0
27
+ Requires-Dist: langgraph<2,>=1.0
28
+ Requires-Dist: pydantic<3,>=2.9
29
+ Provides-Extra: all
30
+ Requires-Dist: databricks-sql-connector<5,>=3.4; extra == 'all'
31
+ Requires-Dist: deepagents<1,>=0.7; extra == 'all'
32
+ Requires-Dist: fastapi<0.142,>=0.115; extra == 'all'
33
+ Requires-Dist: langchain-anthropic<2,>=1.0; extra == 'all'
34
+ Requires-Dist: langchain-mcp-adapters<0.4,>=0.3.0; extra == 'all'
35
+ Requires-Dist: langchain-ollama<2,>=1.0; extra == 'all'
36
+ Requires-Dist: langchain-openai<2,>=1.0; extra == 'all'
37
+ Requires-Dist: langgraph-checkpoint-postgres<4,>=3.1; extra == 'all'
38
+ Requires-Dist: langgraph-checkpoint-sqlite>=3.1; extra == 'all'
39
+ Requires-Dist: mcp<2,>=1.25; extra == 'all'
40
+ Requires-Dist: msal<2,>=1.28; extra == 'all'
41
+ Requires-Dist: psycopg-pool>=3.2; extra == 'all'
42
+ Requires-Dist: psycopg[binary]>=3.2; extra == 'all'
43
+ Requires-Dist: pyodbc<6,>=5.0; extra == 'all'
44
+ Requires-Dist: python-multipart>=0.0.9; extra == 'all'
45
+ Requires-Dist: uvicorn>=0.30; extra == 'all'
46
+ Provides-Extra: anthropic
47
+ Requires-Dist: langchain-anthropic<2,>=1.0; extra == 'anthropic'
48
+ Provides-Extra: bastion
49
+ Requires-Dist: bastion-prompt-protection<2,>=1.3; extra == 'bastion'
50
+ Provides-Extra: databricks
51
+ Requires-Dist: databricks-sql-connector<5,>=3.4; extra == 'databricks'
52
+ Provides-Extra: deep
53
+ Requires-Dist: deepagents<1,>=0.7; extra == 'deep'
54
+ Provides-Extra: dev
55
+ Requires-Dist: fastapi==0.141.1; extra == 'dev'
56
+ Requires-Dist: mypy==1.19.1; extra == 'dev'
57
+ Requires-Dist: pytest-asyncio<2,>=1.4; extra == 'dev'
58
+ Requires-Dist: pytest-cov>=5; extra == 'dev'
59
+ Requires-Dist: pytest>=8; extra == 'dev'
60
+ Requires-Dist: ruff==0.14.10; extra == 'dev'
61
+ Requires-Dist: types-pyyaml; extra == 'dev'
62
+ Provides-Extra: mcp
63
+ Requires-Dist: langchain-mcp-adapters<0.4,>=0.3.0; extra == 'mcp'
64
+ Requires-Dist: mcp<2,>=1.25; extra == 'mcp'
65
+ Provides-Extra: mssql
66
+ Requires-Dist: msal<2,>=1.28; extra == 'mssql'
67
+ Requires-Dist: pyodbc<6,>=5.0; extra == 'mssql'
68
+ Provides-Extra: ollama
69
+ Requires-Dist: langchain-ollama<2,>=1.0; extra == 'ollama'
70
+ Provides-Extra: openai
71
+ Requires-Dist: langchain-openai<2,>=1.0; extra == 'openai'
72
+ Provides-Extra: postgres
73
+ Requires-Dist: langgraph-checkpoint-postgres<4,>=3.1; extra == 'postgres'
74
+ Requires-Dist: psycopg-pool>=3.2; extra == 'postgres'
75
+ Requires-Dist: psycopg[binary]>=3.2; extra == 'postgres'
76
+ Provides-Extra: server
77
+ Requires-Dist: fastapi<0.142,>=0.115; extra == 'server'
78
+ Requires-Dist: langchain-mcp-adapters<0.4,>=0.3.0; extra == 'server'
79
+ Requires-Dist: langgraph-checkpoint-sqlite>=3.1; extra == 'server'
80
+ Requires-Dist: mcp<2,>=1.25; extra == 'server'
81
+ Requires-Dist: python-multipart>=0.0.9; extra == 'server'
82
+ Requires-Dist: uvicorn>=0.30; extra == 'server'
83
+ Provides-Extra: sqlite
84
+ Requires-Dist: langgraph-checkpoint-sqlite>=3.1; extra == 'sqlite'
85
+ Description-Content-Type: text/markdown
86
+
87
+ # OpenStateGraph
88
+
89
+ > **Who this page is for:** you are adding OpenStateGraph to a project you already have,
90
+ > from a package index. This is the distribution's own page; there is no
91
+ > checkout in it.
92
+
93
+ **A compiler from a vendor-neutral `workflow.json` to a LangGraph
94
+ `StateGraph`.** Not an execution engine — the thing it produces is a plain
95
+ compiled LangGraph object that runs, streams, checkpoints and deploys
96
+ anywhere Python runs, with or without this package's editor.
97
+
98
+ ```bash
99
+ pip install "openstategraph[ollama]==0.3.0rc18"
100
+ ```
101
+
102
+ That is the line that works today, and it names no index because it needs
103
+ none: **this is on PyPI**. The `--index-url` / `--extra-index-url` pair this
104
+ block carried until `0.3.0rc18` was the cost of a TestPyPI-only distribution,
105
+ and that is over.
106
+
107
+ The `==` is the one thing left to explain, and it is there because the version
108
+ above is a **pre-release**. pip excludes pre-releases from an unpinned
109
+ requirement — the same trap
110
+ [`../docs/building-an-atom.md`](../docs/building-an-atom.md) records for a
111
+ plugin's `>=` specifier — so `pip install "openstategraph[ollama]"` with no
112
+ `==` resolves nothing, and pip reports that as a package it cannot find rather
113
+ than as a candidate it skipped. The pin goes away with the first final release;
114
+ [`../docs/releasing.md`](../docs/releasing.md) is the page that says how a
115
+ version gets here, and holds the TestPyPI rehearsal form for maintainers.
116
+
117
+ The day a **final** release lands, the pin goes too and this collapses to the
118
+ one line it should always have been:
119
+
120
+ ```bash
121
+ pip install "openstategraph[ollama]" # once a final release is published
122
+ ```
123
+
124
+ Either way you can install the identical artifact from a checkout —
125
+ `pip install -e "backend[ollama]"` from the repository root, or build the
126
+ wheel with `python3 -m build backend` — which is what CI's `clean-install`
127
+ job does, into an empty virtualenv outside the repository.
128
+
129
+ ```python
130
+ from openstategraph import load_workflow
131
+
132
+ workflow = load_workflow("path/to/my-workflow")
133
+ print(workflow.ask("How many invoices are there?"))
134
+ ```
135
+
136
+ `load_workflow` takes the one thing an adopter actually has — the package
137
+ folder holding `workflow.json` — and wires the package's own `tools/`,
138
+ `functions/`, `middlewares/`, `skills/` and `knowledge/` before compiling.
139
+ Anything it could not resolve lands on `.warnings` and logs a WARNING, because
140
+ the alternative failure mode is a workflow that answers confidently without
141
+ the tools it was drawn with.
142
+
143
+ `workflow.graph` is the escape hatch: the compiled LangGraph object, with
144
+ nothing of ours in the way.
145
+
146
+ ## Install footprint
147
+
148
+ The core is four dependencies — `langgraph`, `langchain`, `langchain-core`,
149
+ `pydantic`. Never "four packages": **package** is a settled word here for
150
+ `workflows/<slug>/` (CLAUDE.md's lexicon), and `backend/pyproject.toml` names
151
+ this line as the place the other sense kept being copied to. Everything else is an extra, because a consumer of `load_workflow`
152
+ should not install a web server or three provider SDKs to run a graph in
153
+ their own process.
154
+
155
+ | Extra | Install it for |
156
+ | --- | --- |
157
+ | `[anthropic]` / `[openai]` / `[ollama]` | a `model` string starting `anthropic:` / `openai:` / `ollama:` |
158
+ | `[deep]` | a document containing an `agent.deep` node |
159
+ | `[sqlite]` | `settings.checkpointer: "sqlite"`, or `OPENSTATEGRAPH_MEMORY_PATH` |
160
+ | `[server]` | the editor's HTTP API (`openstategraph.api.main`) — the **web layer only**, so pair it with a provider extra (`[server,ollama]`) or the editor opens onto workflows it cannot run. Includes `[mcp]`, so `openstategraph mcp` works after this extra alone |
161
+ | `[mcp]` | the MCP transport (`openstategraph.mcp_server`) on its own, with no web server |
162
+ | `[all]` | everything above — what a checkout of this repo wants |
163
+ | `[dev]` | contributors (pytest, ruff) |
164
+
165
+ Each of those is imported lazily at its one call site, and a missing one
166
+ raises an `ImportError` naming the exact `pip install` line rather than
167
+ degrading quietly.
168
+
169
+ ## Public surface and stability
170
+
171
+ `openstategraph.__all__` and `openstategraph.abc.__all__` are the semver-public
172
+ surface, plus `openstategraph.errors` and the `workflow.json` schema itself.
173
+ Everything under `openstategraph.api.*` and `openstategraph.mcp_server` is
174
+ internal and carries no stability guarantee. See
175
+ [`docs/stability.md`](../docs/stability.md) for the deprecation policy — the
176
+ short version is that pre-1.0, a breaking change bumps the **minor**, never the
177
+ patch.
178
+
179
+ MIT licensed. Full documentation lives in the repository's `docs/`.
@@ -0,0 +1,93 @@
1
+ # OpenStateGraph
2
+
3
+ > **Who this page is for:** you are adding OpenStateGraph to a project you already have,
4
+ > from a package index. This is the distribution's own page; there is no
5
+ > checkout in it.
6
+
7
+ **A compiler from a vendor-neutral `workflow.json` to a LangGraph
8
+ `StateGraph`.** Not an execution engine — the thing it produces is a plain
9
+ compiled LangGraph object that runs, streams, checkpoints and deploys
10
+ anywhere Python runs, with or without this package's editor.
11
+
12
+ ```bash
13
+ pip install "openstategraph[ollama]==0.3.0rc18"
14
+ ```
15
+
16
+ That is the line that works today, and it names no index because it needs
17
+ none: **this is on PyPI**. The `--index-url` / `--extra-index-url` pair this
18
+ block carried until `0.3.0rc18` was the cost of a TestPyPI-only distribution,
19
+ and that is over.
20
+
21
+ The `==` is the one thing left to explain, and it is there because the version
22
+ above is a **pre-release**. pip excludes pre-releases from an unpinned
23
+ requirement — the same trap
24
+ [`../docs/building-an-atom.md`](../docs/building-an-atom.md) records for a
25
+ plugin's `>=` specifier — so `pip install "openstategraph[ollama]"` with no
26
+ `==` resolves nothing, and pip reports that as a package it cannot find rather
27
+ than as a candidate it skipped. The pin goes away with the first final release;
28
+ [`../docs/releasing.md`](../docs/releasing.md) is the page that says how a
29
+ version gets here, and holds the TestPyPI rehearsal form for maintainers.
30
+
31
+ The day a **final** release lands, the pin goes too and this collapses to the
32
+ one line it should always have been:
33
+
34
+ ```bash
35
+ pip install "openstategraph[ollama]" # once a final release is published
36
+ ```
37
+
38
+ Either way you can install the identical artifact from a checkout —
39
+ `pip install -e "backend[ollama]"` from the repository root, or build the
40
+ wheel with `python3 -m build backend` — which is what CI's `clean-install`
41
+ job does, into an empty virtualenv outside the repository.
42
+
43
+ ```python
44
+ from openstategraph import load_workflow
45
+
46
+ workflow = load_workflow("path/to/my-workflow")
47
+ print(workflow.ask("How many invoices are there?"))
48
+ ```
49
+
50
+ `load_workflow` takes the one thing an adopter actually has — the package
51
+ folder holding `workflow.json` — and wires the package's own `tools/`,
52
+ `functions/`, `middlewares/`, `skills/` and `knowledge/` before compiling.
53
+ Anything it could not resolve lands on `.warnings` and logs a WARNING, because
54
+ the alternative failure mode is a workflow that answers confidently without
55
+ the tools it was drawn with.
56
+
57
+ `workflow.graph` is the escape hatch: the compiled LangGraph object, with
58
+ nothing of ours in the way.
59
+
60
+ ## Install footprint
61
+
62
+ The core is four dependencies — `langgraph`, `langchain`, `langchain-core`,
63
+ `pydantic`. Never "four packages": **package** is a settled word here for
64
+ `workflows/<slug>/` (CLAUDE.md's lexicon), and `backend/pyproject.toml` names
65
+ this line as the place the other sense kept being copied to. Everything else is an extra, because a consumer of `load_workflow`
66
+ should not install a web server or three provider SDKs to run a graph in
67
+ their own process.
68
+
69
+ | Extra | Install it for |
70
+ | --- | --- |
71
+ | `[anthropic]` / `[openai]` / `[ollama]` | a `model` string starting `anthropic:` / `openai:` / `ollama:` |
72
+ | `[deep]` | a document containing an `agent.deep` node |
73
+ | `[sqlite]` | `settings.checkpointer: "sqlite"`, or `OPENSTATEGRAPH_MEMORY_PATH` |
74
+ | `[server]` | the editor's HTTP API (`openstategraph.api.main`) — the **web layer only**, so pair it with a provider extra (`[server,ollama]`) or the editor opens onto workflows it cannot run. Includes `[mcp]`, so `openstategraph mcp` works after this extra alone |
75
+ | `[mcp]` | the MCP transport (`openstategraph.mcp_server`) on its own, with no web server |
76
+ | `[all]` | everything above — what a checkout of this repo wants |
77
+ | `[dev]` | contributors (pytest, ruff) |
78
+
79
+ Each of those is imported lazily at its one call site, and a missing one
80
+ raises an `ImportError` naming the exact `pip install` line rather than
81
+ degrading quietly.
82
+
83
+ ## Public surface and stability
84
+
85
+ `openstategraph.__all__` and `openstategraph.abc.__all__` are the semver-public
86
+ surface, plus `openstategraph.errors` and the `workflow.json` schema itself.
87
+ Everything under `openstategraph.api.*` and `openstategraph.mcp_server` is
88
+ internal and carries no stability guarantee. See
89
+ [`docs/stability.md`](../docs/stability.md) for the deprecation policy — the
90
+ short version is that pre-1.0, a breaking change bumps the **minor**, never the
91
+ patch.
92
+
93
+ MIT licensed. Full documentation lives in the repository's `docs/`.
@@ -0,0 +1,269 @@
1
+ """The wheel carries the canvas — scale-and-adopt ticket 01.
2
+
3
+ `pip install openstategraph` used to deliver a *visual* workflow builder with
4
+ no visuals: 215 KB of Python, and a canvas that existed only inside a git clone
5
+ or the Docker image. This hook is what puts the built editor in the
6
+ distribution, so `pip install "openstategraph[server]" && openstategraph serve`
7
+ opens the real product on a machine that has never seen the repository.
8
+
9
+ **Where the assets come from**, in order:
10
+
11
+ 1. `OPENSTATEGRAPH_EDITOR_DIST` — an explicit directory, for a release job that
12
+ builds the front end somewhere else.
13
+ 2. `<repo>/dist` — what `npm run build` writes in a checkout.
14
+ 3. `openstategraph/api/static/editor` — already in place, which is the case
15
+ when a wheel is being built *from our sdist*. Nothing to copy; hatchling
16
+ ships it as ordinary package data.
17
+
18
+ **Sourcemaps are excluded.** They are 18 MB against the bundle's 5, they are a
19
+ debugging aid for people working on this repository, and nobody debugging their
20
+ own workflow needs to step through our minified React.
21
+
22
+ **A standard build with no editor anywhere FAILS, loudly.** That is the whole
23
+ point of the ticket: a wheel that silently ships without the canvas is exactly
24
+ the artifact we are replacing. Editable installs (`pip install -e backend`) are
25
+ exempt, because that is the contributor path — CI installs the backend that way
26
+ with no Node.js in the job, and a source checkout is expected to run the dev
27
+ stack or `npm run build` when it wants the editor.
28
+
29
+ The decision lives in `editor_force_include`, a free function over paths, so
30
+ `backend/tests/test_distribution_metadata.py` can exercise the failure without
31
+ running a build. The class below is the hatchling adapter and nothing else.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import os
37
+ import re
38
+ from functools import lru_cache
39
+ from pathlib import Path
40
+ from typing import Any
41
+
42
+ try:
43
+ from hatchling.builders.hooks.plugin.interface import BuildHookInterface
44
+ except ModuleNotFoundError: # pragma: no cover — outside a build environment
45
+ # hatchling is a build-time dependency and is not installed in the dev
46
+ # venv. The adapter is unusable without it; the logic below is not, and
47
+ # that is the half worth testing.
48
+ BuildHookInterface = object # type: ignore[assignment,misc]
49
+
50
+ #: Inside the package, so it is ordinary package data once written and every
51
+ #: consumer (`api/editor_assets.py`) has one place to look.
52
+ EDITOR_DEST = "openstategraph/api/static/editor"
53
+
54
+ #: The /chat live-flow view's Mermaid, served by `api/main.py:chat_mermaid_asset`
55
+ #: with no CDN. Kept out of `editor/` so that directory stays a faithful copy of
56
+ #: `dist/`.
57
+ VENDOR_DEST = "openstategraph/api/static/vendor"
58
+
59
+ MERMAID_SOURCE = "node_modules/mermaid/dist/mermaid.min.js"
60
+
61
+ #: The hand-written story pages — landing, gallery, and the five-artifact
62
+ #: walk-through — served by `api/routes/site.py`. Production-ready ticket 28:
63
+ #: their only route to a reader was GitHub Pages, which has never once
64
+ #: published them, so the wheel carries them and `serve` hands them out.
65
+ SITE_DEST = "openstategraph/api/static/site"
66
+
67
+ #: Debugging aids for this repository, not for an adopter. 18 MB of the 23 MB
68
+ #: `dist/` weighs.
69
+ EXCLUDED_SUFFIXES = (".map",)
70
+
71
+ NOT_BUILT = (
72
+ "no built editor found — the wheel would ship a visual workflow builder "
73
+ "with no visuals.\n"
74
+ "Build it first:\n"
75
+ " npm ci && npm run build\n"
76
+ "or point the build at an existing one:\n"
77
+ " OPENSTATEGRAPH_EDITOR_DIST=/path/to/dist python -m build backend"
78
+ )
79
+
80
+
81
+ STALE = (
82
+ "the built editor is stale — `dist/` is older than `src/`, so the wheel "
83
+ "would ship an editor built before the code it is packaged with.\n"
84
+ "Rebuild it:\n"
85
+ " npm run build\n"
86
+ "or point the build at a current one:\n"
87
+ " OPENSTATEGRAPH_EDITOR_DIST=/path/to/dist python -m build backend"
88
+ )
89
+
90
+ #: Suffixes worth comparing. Everything the editor is actually built from;
91
+ #: a stray `.md` beside a component should not force a rebuild.
92
+ _SOURCE_SUFFIXES = (".ts", ".tsx", ".css", ".html")
93
+
94
+
95
+ #: What makes a glob a *test* glob rather than any other glob in those configs.
96
+ #:
97
+ #: The discriminator is the safety property, not a convenience. `vite.config.ts`
98
+ #: also carries `coverage.include` (`src/core/**`, `src/controller/**`) — real
99
+ #: bundle inputs, in the same file, one array away. Taking one of those for an
100
+ #: exclusion would hide the entire core from the staleness walk: a false
101
+ #: negative, which is the side `editor_is_stale` says is unacceptable to pay.
102
+ #: A glob naming `*.test.*`, `*.spec.*` or `*.stories.*` cannot be a bundle
103
+ #: input, whichever array it was found in.
104
+ _TEST_FILE_MARKERS = (".test.", ".spec.", ".stories.")
105
+
106
+
107
+ def bundle_excluded_globs(repo_root: Path) -> tuple[str, ...]:
108
+ """The globs naming files `vite build` cannot put in the bundle.
109
+
110
+ Read out of the vitest configs (`vite*.config.ts`) rather than kept here as
111
+ a second list of suffixes. The JavaScript side already declares what a test
112
+ file is — `include: ['src/**/*.test.ts']` and the generator's
113
+ `['src/nodes/portSpecs.emit.spec.ts']` — and two lists of the same fact
114
+ drift the first time either side adds a convention.
115
+
116
+ Empty when there is no config to read, which excludes nothing: not knowing
117
+ is a reason to compare more files, never fewer.
118
+ """
119
+ globs: list[str] = []
120
+ for config in sorted(repo_root.glob("vite*.config.ts")):
121
+ try:
122
+ source = config.read_text(encoding="utf-8")
123
+ except OSError: # pragma: no cover — unreadable config, compare everything
124
+ continue
125
+ for quoted in re.findall(r"""['"]([^'"\n]+)['"]""", source):
126
+ leaf = quoted.rsplit("/", 1)[-1]
127
+ if any(marker in leaf for marker in _TEST_FILE_MARKERS) and quoted not in globs:
128
+ globs.append(quoted)
129
+ return tuple(globs)
130
+
131
+
132
+ @lru_cache(maxsize=None)
133
+ def _glob_pattern(glob: str) -> re.Pattern[str]:
134
+ escaped = re.escape(glob)
135
+ body = escaped.replace(r"\*\*/", "(?:[^/]+/)*").replace(r"\*\*", ".*").replace(r"\*", "[^/]*")
136
+ return re.compile(f"{body}$")
137
+
138
+
139
+ def _is_excluded(relative: str, globs: tuple[str, ...]) -> bool:
140
+ return any(_glob_pattern(glob).match(relative) for glob in globs)
141
+
142
+
143
+ def editor_is_stale(dist: Path, src: Path, repo_root: Path | None = None) -> bool:
144
+ """Whether `dist/` predates the sources it was supposed to be built from.
145
+
146
+ Modification times, not hashes: the question is "did somebody edit the
147
+ editor and forget to rebuild", and an mtime answers it in milliseconds
148
+ without a content index. False negatives are possible (a touched file with
149
+ no change) and cost one needless rebuild; a false *positive* would ship the
150
+ defect this exists to catch, which is the asymmetry that decides the
151
+ method.
152
+
153
+ `False` when there is no source tree at all — a wheel built from our own
154
+ sdist has package data and no `src/`, and refusing there would break every
155
+ downstream repackager over a check that cannot apply.
156
+
157
+ **Only files the bundle can contain are compared.** Test files are `.ts`,
158
+ `vitest` collects them and Vite never bundles them, so touching one cannot
159
+ change a byte of what the wheel ships — yet it used to demand
160
+ `npm run build`, and did, at `HEAD`, over
161
+ `src/nodes/guard/GuardrailNode.test.ts`. That is the harmless direction of
162
+ the asymmetry above, and it is still the expensive one: a gate that is red
163
+ for a reason nobody believes is a gate people clear with a reflex rebuild,
164
+ and then it is checking nothing. `bundle_excluded_globs` narrows the input;
165
+ the rule is unchanged.
166
+ """
167
+ index = dist / "index.html"
168
+ if not index.is_file() or not src.is_dir():
169
+ return False
170
+
171
+ root = repo_root if repo_root is not None else src.parent
172
+ excluded = bundle_excluded_globs(root)
173
+
174
+ built = index.stat().st_mtime
175
+ for path in src.rglob("*"):
176
+ if path.suffix in _SOURCE_SUFFIXES and path.is_file():
177
+ if path.stat().st_mtime <= built:
178
+ continue
179
+ try:
180
+ relative = path.relative_to(root).as_posix()
181
+ except ValueError: # pragma: no cover — src outside the repo root
182
+ return True
183
+ if not _is_excluded(relative, excluded):
184
+ return True
185
+ return False
186
+
187
+
188
+ def _editor_source(root: Path) -> Path | None:
189
+ explicit = os.environ.get("OPENSTATEGRAPH_EDITOR_DIST", "").strip()
190
+ candidate = Path(explicit) if explicit else root.parent / "dist"
191
+ return candidate if (candidate / "index.html").is_file() else None
192
+
193
+
194
+ def _mermaid_source(root: Path) -> Path | None:
195
+ """Optional, and only because it is optional at runtime too: without it
196
+ `/chat` still works and its flow panel says so."""
197
+ explicit = os.environ.get("OPENSTATEGRAPH_MERMAID_ASSET", "").strip()
198
+ candidate = Path(explicit) if explicit else root.parent / MERMAID_SOURCE
199
+ return candidate if candidate.is_file() else None
200
+
201
+
202
+ def editor_force_include(root: Path, version: str) -> dict[str, str]:
203
+ """Source path → path inside the distribution, for every asset to ship."""
204
+ if (root / EDITOR_DEST / "index.html").is_file():
205
+ # Building from our own sdist: the assets are already package data.
206
+ return {}
207
+
208
+ source = _editor_source(root)
209
+ if source is None:
210
+ if version == "editable":
211
+ return {}
212
+ raise RuntimeError(NOT_BUILT)
213
+
214
+ # A missing editor already fails loudly; an *old* one used to ship in
215
+ # silence. The wheel carried an editor three days behind the backend it was
216
+ # packaged with — including a schema version, which the two sides must
217
+ # agree on or the editor refuses documents the backend writes.
218
+ if version != "editable" and editor_is_stale(source, root.parent / "src"):
219
+ raise RuntimeError(STALE)
220
+
221
+ include = {
222
+ str(path): f"{EDITOR_DEST}/{path.relative_to(source).as_posix()}"
223
+ for path in sorted(source.rglob("*"))
224
+ if path.is_file() and path.suffix not in EXCLUDED_SUFFIXES
225
+ }
226
+
227
+ mermaid = _mermaid_source(root)
228
+ if mermaid is not None:
229
+ include[str(mermaid)] = f"{VENDOR_DEST}/mermaid.min.js"
230
+ return include
231
+
232
+
233
+ def site_force_include(root: Path) -> dict[str, str]:
234
+ """The `site/*.html` pages, source path → path inside the distribution.
235
+
236
+ Its own function rather than a few more lines inside `editor_force_include`,
237
+ because that one returns early in two cases that have nothing to do with
238
+ these files — an sdist rebuild, and an editable install with no `dist/` —
239
+ and folding the pages in there would make shipping them depend on whether
240
+ somebody had run `npm run build`.
241
+
242
+ Optional, like the mermaid asset and unlike the editor: absence is a 404
243
+ with a sentence rather than a broken product, so it is not worth failing a
244
+ build over. `test_site_pages.py` asserts *this* repository ships all three,
245
+ which is the case that would otherwise regress in silence.
246
+ """
247
+ if (root / SITE_DEST / "gallery.html").is_file():
248
+ # Building from our own sdist: already package data.
249
+ return {}
250
+
251
+ source = root.parent / "site"
252
+ if not (source / "gallery.html").is_file():
253
+ return {}
254
+
255
+ return {
256
+ str(path): f"{SITE_DEST}/{path.name}"
257
+ for path in sorted(source.glob("*.html"))
258
+ }
259
+
260
+
261
+ class EditorAssetsBuildHook(BuildHookInterface): # type: ignore[misc,valid-type]
262
+ PLUGIN_NAME = "custom"
263
+
264
+ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
265
+ if self.target_name not in ("wheel", "sdist"):
266
+ return
267
+ include = build_data.setdefault("force_include", {})
268
+ include.update(editor_force_include(Path(self.root), version))
269
+ include.update(site_force_include(Path(self.root)))