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.
- openstategraph-0.3.0rc18/.env.example +11 -0
- openstategraph-0.3.0rc18/.gitignore +80 -0
- openstategraph-0.3.0rc18/LICENSE +21 -0
- openstategraph-0.3.0rc18/PKG-INFO +179 -0
- openstategraph-0.3.0rc18/README.md +93 -0
- openstategraph-0.3.0rc18/hatch_build.py +269 -0
- openstategraph-0.3.0rc18/openstategraph/__init__.py +116 -0
- openstategraph-0.3.0rc18/openstategraph/_extras.py +176 -0
- openstategraph-0.3.0rc18/openstategraph/abc/__init__.py +146 -0
- openstategraph-0.3.0rc18/openstategraph/abc/agent.py +571 -0
- openstategraph-0.3.0rc18/openstategraph/abc/async_doors.py +186 -0
- openstategraph-0.3.0rc18/openstategraph/abc/async_task_middleware.py +574 -0
- openstategraph-0.3.0rc18/openstategraph/abc/criteria_check.py +59 -0
- openstategraph-0.3.0rc18/openstategraph/abc/deep_tier_offload.py +809 -0
- openstategraph-0.3.0rc18/openstategraph/abc/grader.py +425 -0
- openstategraph-0.3.0rc18/openstategraph/abc/guardrail.py +416 -0
- openstategraph-0.3.0rc18/openstategraph/abc/kanban_store.py +635 -0
- openstategraph-0.3.0rc18/openstategraph/abc/middleware.py +111 -0
- openstategraph-0.3.0rc18/openstategraph/abc/narration.py +640 -0
- openstategraph-0.3.0rc18/openstategraph/abc/node_family.py +251 -0
- openstategraph-0.3.0rc18/openstategraph/abc/orchestrator.py +852 -0
- openstategraph-0.3.0rc18/openstategraph/abc/prompt.py +316 -0
- openstategraph-0.3.0rc18/openstategraph/abc/router.py +501 -0
- openstategraph-0.3.0rc18/openstategraph/abc/run_context_prompt.py +133 -0
- openstategraph-0.3.0rc18/openstategraph/abc/tool.py +656 -0
- openstategraph-0.3.0rc18/openstategraph/abc/tool_findings.py +766 -0
- openstategraph-0.3.0rc18/openstategraph/abc/tool_notes.py +891 -0
- openstategraph-0.3.0rc18/openstategraph/abc/tool_sentences.py +325 -0
- openstategraph-0.3.0rc18/openstategraph/agent_brief.md +158 -0
- openstategraph-0.3.0rc18/openstategraph/agent_brief.py +123 -0
- openstategraph-0.3.0rc18/openstategraph/agent_config.py +436 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/kanban-patrol/SKILL.md +100 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/SKILL.md +250 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/build-loop.md +189 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/environments.md +117 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/interview.md +138 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/shapes.md +278 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/openstategraph/references/subagents.md +80 -0
- openstategraph-0.3.0rc18/openstategraph/agent_skills/ticket-forge/SKILL.md +62 -0
- openstategraph-0.3.0rc18/openstategraph/api/__init__.py +26 -0
- openstategraph-0.3.0rc18/openstategraph/api/ambient_tools.py +65 -0
- openstategraph-0.3.0rc18/openstategraph/api/audience.py +608 -0
- openstategraph-0.3.0rc18/openstategraph/api/auth.py +397 -0
- openstategraph-0.3.0rc18/openstategraph/api/broadcast.py +257 -0
- openstategraph-0.3.0rc18/openstategraph/api/burst_recorder.py +175 -0
- openstategraph-0.3.0rc18/openstategraph/api/capability_discovery.py +751 -0
- openstategraph-0.3.0rc18/openstategraph/api/catalogue_events.py +148 -0
- openstategraph-0.3.0rc18/openstategraph/api/chat_page.py +20 -0
- openstategraph-0.3.0rc18/openstategraph/api/customer_graph.py +220 -0
- openstategraph-0.3.0rc18/openstategraph/api/deps.py +103 -0
- openstategraph-0.3.0rc18/openstategraph/api/diagram.py +102 -0
- openstategraph-0.3.0rc18/openstategraph/api/editor_assets.py +352 -0
- openstategraph-0.3.0rc18/openstategraph/api/embed.py +125 -0
- openstategraph-0.3.0rc18/openstategraph/api/frame_clock.py +137 -0
- openstategraph-0.3.0rc18/openstategraph/api/kanban_events.py +244 -0
- openstategraph-0.3.0rc18/openstategraph/api/knowledge_build.py +162 -0
- openstategraph-0.3.0rc18/openstategraph/api/knowledge_curation.py +176 -0
- openstategraph-0.3.0rc18/openstategraph/api/listening.py +104 -0
- openstategraph-0.3.0rc18/openstategraph/api/live_stream.py +150 -0
- openstategraph-0.3.0rc18/openstategraph/api/main.py +366 -0
- openstategraph-0.3.0rc18/openstategraph/api/model_resolution.py +319 -0
- openstategraph-0.3.0rc18/openstategraph/api/mount_resolution.py +232 -0
- openstategraph-0.3.0rc18/openstategraph/api/openapi_document.py +91 -0
- openstategraph-0.3.0rc18/openstategraph/api/patrol_events.py +170 -0
- openstategraph-0.3.0rc18/openstategraph/api/patrol_registry.py +136 -0
- openstategraph-0.3.0rc18/openstategraph/api/plugin_capabilities.py +341 -0
- openstategraph-0.3.0rc18/openstategraph/api/registries.py +454 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/__init__.py +15 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/chat_ui.py +57 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/demo.py +68 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/examples.py +92 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/kanban.py +469 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/mcp.py +324 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/providers.py +130 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/recordings.py +288 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/runs.py +725 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/site.py +80 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/system.py +316 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/threads.py +103 -0
- openstategraph-0.3.0rc18/openstategraph/api/routes/workflows.py +1092 -0
- openstategraph-0.3.0rc18/openstategraph/api/schemas.py +1765 -0
- openstategraph-0.3.0rc18/openstategraph/api/services.py +447 -0
- openstategraph-0.3.0rc18/openstategraph/api/site_pages.py +120 -0
- openstategraph-0.3.0rc18/openstategraph/api/sse_contract.py +139 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/chat.html +2292 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/__vite-browser-external-DvHC826_.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/abnfDiagram-N423BO3Z-BSwYC7ml.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/arc-DDMrFQ_b.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/architecture-TIHT7OUA-JHDAwbjN.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/architectureDiagram-T3A2C74G-BP7p2NAG.js +37 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/archivo-latin-ext-wght-normal-C4zznr8T.woff2 +0 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/archivo-latin-wght-normal-E0tuGl4L.woff2 +0 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/array-BifhSqXX.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/blockDiagram-VBNYF7ZC-0h_dkxD-.js +133 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/c4Diagram-5PPSVZJV-DwLWEqq_.js +11 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/channel-Db-O9VqS.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-2GRJ4B5K-DXBJ0RsQ.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-2Q5K7J3B-C1jixKkw.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-4I5QYGJK-CsFwS4Lg.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-5RXB4S5H-BSEGk_ut.js +232 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-5VM5RSS4-ZNzvKenW.js +16 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-6Q2QTUOP-BHAoBLWf.js +89 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-7BUUIJ7U-Bb538aSH.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-7Z6QIM7H-B5bFtaqu.js +11 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-GF5L2VYU-DG5c0NFA.js +207 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-I66GZJ75-DmCheD4s.js +128 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-JQJVKLGR-8idHhP4j.js +157 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-JWPE2WC7-DVXcaiue.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-KBJHAD2P-BT9F3jrA.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-KEIR6QF5-DEvma7oi.js +162 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-NSK5VX7P-Dgz6OU53.js +3 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-QR6OTTB3-fys2tz_Z.js +63 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-RYQCIY6F-CRj7pW-i.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-UBXNYLIW-BK_OvCxP.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-W5SLKNZC-DCbgXbJu.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-WRU74C26-Dnm_SPAR.js +71 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-XXDRQBXY-CRqRy7wC.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/classDiagram-JCYQIIEL-Depm8ksq.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/classDiagram-v2-OCEON4UE-Depm8ksq.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cose-bilkent-JH36ORCC-D5TK9rNS.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cynefin-VYW2F7L2-D4Q9WVaa.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cynefinDiagram-MW4NZA55-CoHRISXQ.js +63 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/cytoscape.esm-C3UvhD5t.js +322 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/dagre-Buvkdvvj.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/dagre-VZM6K2ZE-D21mJWEs.js +5 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/defaultLocale-BFoDCU3G.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-7IWD3JNH-DH8djcKe.js +31 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-B4RE2ZJO-TCo5p7fm.js +4 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-LBJQPF4R-CgbTOT1t.js +25 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-Q27KOJAE-C66hKgaF.js +25 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/diagram-UB23O5K3-DfQdI_zj.js +42 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/dist-Cf7dFMHT.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ebnfDiagram-BXEA7PRR-zmsTHIxX.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/erDiagram-JOGREHBK-CghTrytX.js +86 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/eventmodeling-45OFAUF4-CMwSn-Ho.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/flowDiagram-UKHOOZJN-C-_w-s1Q.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ganttDiagram-PKOTCBZU-97e9PAPc.js +293 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/gitGraph-TEB2WS4Q-DRKzZwY3.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/gitGraphDiagram-DS77QQ5N-CW0XXeRI.js +107 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/graphlib-DS17s2tU.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-sans-latin-ext-wght-normal-CIII54If.woff2 +0 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ibm-plex-sans-latin-wght-normal-IvpUvPa2.woff2 +0 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/index-C82F-VOn.js +97 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/index-aFbfZIkT.css +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/info-DKCQHKI2-SysKRxO_.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/infoDiagram-6WML65LV-DZbcdVbQ.js +3 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/init-C-OQMol4.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ishikawaDiagram-WSZJBQD7-db9uBmh5.js +71 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/journeyDiagram-NVQOT4AX-BRA0mH1X.js +140 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/kanban-definition-27J2QSJJ-BC9rn5e4.js +90 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/katex-DolUETbr.js +258 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/line-B7qqN3Ir.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/linear-5J5m_kC5.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/map-BaFkSB1l.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/mermaid-parser.core-BGnhWAUE.js +8 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/mermaid.core-16iQohrd.js +43 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/mindmap-definition-FAOFIHXS-D5CjGmqV.js +97 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/node.browser-NgqoTrLm.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/openai-CkyQtVOo.js +19 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/ordinal-BDEzSJ7C.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/packet-7NZHBO7P-sQm5Oec1.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/path-COt_16Va.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/pegDiagram-VL7TDLO6-uYvU6KEE.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/pie-RZYD4A2V-BTbfwsIW.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/pieDiagram-7S7Q4E2Y-D_PiFPb_.js +40 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/quadrantDiagram-CIZ2JOQS-C8DSaWmz.js +8 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/radar-I7S5WNFK-CkFE88Ku.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-3IZDKUUU-Dts1ojtZ.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-abnf-AHOZXSZD-D-c7lnP-.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-ebnf-EBAXGLYW-C6_n505H.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroad-peg-LSFZ7HO6-CG9QfFVy.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/railroadDiagram-AXF67PYL-nuUZ0qwl.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/requirementDiagram-LRYGKXZP-DxBF5NhC.js +85 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/rough.esm-By172zw-.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sankeyDiagram-W5VNT64P-CntNPYqA.js +41 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sdk-Cp3Re1Le.js +38 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sequenceDiagram-SI44F4Z6-HZo4SLa8.js +163 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/src-DqrQFfgz.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/stateDiagram-OKZ733FA-CLS4pIgN.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/stateDiagram-v2-UEYNNEHI-COwAZwMg.js +2 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/swimlanes-SLNWSIFB-D29zxlMr.js +3 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/swimlanesDiagram-ULZ7WXOC-BDcjn2xv.js +9 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/timeline-definition-Z64GVDOM-CelnRNqa.js +121 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/treeView-QDETBFTQ-DFJeT3QC.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/treemap-6X3UGDF4-BEjfDtSh.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/vennDiagram-T6HMQDX7-CDZD7jBy.js +35 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/wardley-OPB4EBWU-CnK4FjgH.js +1 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/wardleyDiagram-T6FBY63Y-CAtiCqwR.js +79 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/assets/xychartDiagram-ELKLHX3M-sU7T-aSM.js +8 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/favicon.svg +41 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor/index.html +71 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/editor_missing.html +104 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/site/behind-the-scenes.html +1165 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/site/gallery.html +1979 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/site/index.html +1507 -0
- openstategraph-0.3.0rc18/openstategraph/api/static/vendor/mermaid.min.js +3587 -0
- openstategraph-0.3.0rc18/openstategraph/api/streaming.py +2909 -0
- openstategraph-0.3.0rc18/openstategraph/api/team_board.py +133 -0
- openstategraph-0.3.0rc18/openstategraph/api/threads.py +892 -0
- openstategraph-0.3.0rc18/openstategraph/api/workflow_events.py +305 -0
- openstategraph-0.3.0rc18/openstategraph/api/workflow_store.py +779 -0
- openstategraph-0.3.0rc18/openstategraph/async_tasks.py +624 -0
- openstategraph-0.3.0rc18/openstategraph/bundled_skills.py +152 -0
- openstategraph-0.3.0rc18/openstategraph/catalogue.py +273 -0
- openstategraph-0.3.0rc18/openstategraph/chat_model.py +414 -0
- openstategraph-0.3.0rc18/openstategraph/cli.py +3461 -0
- openstategraph-0.3.0rc18/openstategraph/compile/__init__.py +0 -0
- openstategraph-0.3.0rc18/openstategraph/compile/checked_nodes.py +117 -0
- openstategraph-0.3.0rc18/openstategraph/compile/composition.py +196 -0
- openstategraph-0.3.0rc18/openstategraph/compile/context.py +476 -0
- openstategraph-0.3.0rc18/openstategraph/compile/deep_tier.py +81 -0
- openstategraph-0.3.0rc18/openstategraph/compile/diagnostics.py +772 -0
- openstategraph-0.3.0rc18/openstategraph/compile/fields.py +121 -0
- openstategraph-0.3.0rc18/openstategraph/compile/graph_names.py +80 -0
- openstategraph-0.3.0rc18/openstategraph/compile/grounding.py +116 -0
- openstategraph-0.3.0rc18/openstategraph/compile/mount_overrides.py +207 -0
- openstategraph-0.3.0rc18/openstategraph/compile/mount_persistence.py +119 -0
- openstategraph-0.3.0rc18/openstategraph/compile/node_catalogue.py +368 -0
- openstategraph-0.3.0rc18/openstategraph/compile/node_doors.py +231 -0
- openstategraph-0.3.0rc18/openstategraph/compile/node_families.py +125 -0
- openstategraph-0.3.0rc18/openstategraph/compile/node_runtime.py +1516 -0
- openstategraph-0.3.0rc18/openstategraph/compile/node_types.py +132 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/__init__.py +94 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/agent.py +785 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/approval.py +91 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/functions.py +166 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/grader.py +467 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/guard.py +440 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/io.py +438 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/memory.py +108 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/mount.py +795 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/named_check.py +66 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/orchestration.py +493 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/resolvers.py +200 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/route_check.py +162 -0
- openstategraph-0.3.0rc18/openstategraph/compile/nodes/router.py +225 -0
- openstategraph-0.3.0rc18/openstategraph/compile/paused_mount.py +100 -0
- openstategraph-0.3.0rc18/openstategraph/compile/port_specs.json +3871 -0
- openstategraph-0.3.0rc18/openstategraph/compile/reducers.py +165 -0
- openstategraph-0.3.0rc18/openstategraph/compile/reporting.py +458 -0
- openstategraph-0.3.0rc18/openstategraph/compile/run_context.py +899 -0
- openstategraph-0.3.0rc18/openstategraph/compile/runtime_services.py +187 -0
- openstategraph-0.3.0rc18/openstategraph/compile/side_effects.py +143 -0
- openstategraph-0.3.0rc18/openstategraph/compile/silent_turn.py +97 -0
- openstategraph-0.3.0rc18/openstategraph/compile/state.py +839 -0
- openstategraph-0.3.0rc18/openstategraph/compile/static_source.py +180 -0
- openstategraph-0.3.0rc18/openstategraph/compile/subagents.py +272 -0
- openstategraph-0.3.0rc18/openstategraph/compile/token_stream.py +138 -0
- openstategraph-0.3.0rc18/openstategraph/compile/upstream.py +38 -0
- openstategraph-0.3.0rc18/openstategraph/compile/workflow_compiler.py +2907 -0
- openstategraph-0.3.0rc18/openstategraph/concurrent_producers.py +265 -0
- openstategraph-0.3.0rc18/openstategraph/config_edit.py +340 -0
- openstategraph-0.3.0rc18/openstategraph/config_file.py +939 -0
- openstategraph-0.3.0rc18/openstategraph/counted_rows.py +475 -0
- openstategraph-0.3.0rc18/openstategraph/delegations.py +158 -0
- openstategraph-0.3.0rc18/openstategraph/deployment.py +248 -0
- openstategraph-0.3.0rc18/openstategraph/developer_channel.py +351 -0
- openstategraph-0.3.0rc18/openstategraph/document_checks.py +926 -0
- openstategraph-0.3.0rc18/openstategraph/dotenv.py +270 -0
- openstategraph-0.3.0rc18/openstategraph/editor_freshness.py +89 -0
- openstategraph-0.3.0rc18/openstategraph/engineering_rules.md +165 -0
- openstategraph-0.3.0rc18/openstategraph/engineering_rules.py +30 -0
- openstategraph-0.3.0rc18/openstategraph/errors.py +457 -0
- openstategraph-0.3.0rc18/openstategraph/evaluation/__init__.py +83 -0
- openstategraph-0.3.0rc18/openstategraph/evaluation/dataset.py +225 -0
- openstategraph-0.3.0rc18/openstategraph/evaluation/denotation.py +345 -0
- openstategraph-0.3.0rc18/openstategraph/evaluation/recovery.py +78 -0
- openstategraph-0.3.0rc18/openstategraph/evaluation/runner.py +578 -0
- openstategraph-0.3.0rc18/openstategraph/evaluation/scoring.py +337 -0
- openstategraph-0.3.0rc18/openstategraph/examples/__init__.py +302 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/AGENTS.md +88 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/escalation-paths.md +30 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/incident-response.md +32 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/oncall-rotation.md +30 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/release-train.md +30 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/knowledge/support-tiers.md +25 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/tests/test_agentic_rag_rewrite_document.py +135 -0
- openstategraph-0.3.0rc18/openstategraph/examples/agentic-rag-rewrite/workflow.json +91 -0
- openstategraph-0.3.0rc18/openstategraph/examples/approval-in-the-loop/AGENTS.md +122 -0
- openstategraph-0.3.0rc18/openstategraph/examples/approval-in-the-loop/tests/test_approval_in_the_loop_document.py +84 -0
- openstategraph-0.3.0rc18/openstategraph/examples/approval-in-the-loop/workflow.json +65 -0
- openstategraph-0.3.0rc18/openstategraph/examples/archetype-orchestrator-report/AGENTS.md +128 -0
- openstategraph-0.3.0rc18/openstategraph/examples/archetype-orchestrator-report/tests/test_archetype_orchestrator_report_document.py +133 -0
- openstategraph-0.3.0rc18/openstategraph/examples/archetype-orchestrator-report/workflow.json +147 -0
- openstategraph-0.3.0rc18/openstategraph/examples/budget-exhaustion/AGENTS.md +97 -0
- openstategraph-0.3.0rc18/openstategraph/examples/budget-exhaustion/tests/test_budget_exhaustion_document.py +73 -0
- openstategraph-0.3.0rc18/openstategraph/examples/budget-exhaustion/workflow.json +67 -0
- openstategraph-0.3.0rc18/openstategraph/examples/chained-summarizer/AGENTS.md +80 -0
- openstategraph-0.3.0rc18/openstategraph/examples/chained-summarizer/tests/test_chained_summarizer_document.py +68 -0
- openstategraph-0.3.0rc18/openstategraph/examples/chained-summarizer/workflow.json +61 -0
- openstategraph-0.3.0rc18/openstategraph/examples/classifier-router-qa/AGENTS.md +60 -0
- openstategraph-0.3.0rc18/openstategraph/examples/classifier-router-qa/tests/test_classifier_router_qa_document.py +75 -0
- openstategraph-0.3.0rc18/openstategraph/examples/classifier-router-qa/workflow.json +115 -0
- openstategraph-0.3.0rc18/openstategraph/examples/delegate-by-mount/AGENTS.md +87 -0
- openstategraph-0.3.0rc18/openstategraph/examples/delegate-by-mount/tests/test_delegate_by_mount_document.py +122 -0
- openstategraph-0.3.0rc18/openstategraph/examples/delegate-by-mount/workflow.json +145 -0
- openstategraph-0.3.0rc18/openstategraph/examples/evaluator-optimizer/AGENTS.md +70 -0
- openstategraph-0.3.0rc18/openstategraph/examples/evaluator-optimizer/tests/test_evaluator_optimizer_document.py +65 -0
- openstategraph-0.3.0rc18/openstategraph/examples/evaluator-optimizer/workflow.json +67 -0
- openstategraph-0.3.0rc18/openstategraph/examples/fanout-in-a-loop/AGENTS.md +113 -0
- openstategraph-0.3.0rc18/openstategraph/examples/fanout-in-a-loop/tests/test_fanout_in_a_loop_document.py +93 -0
- openstategraph-0.3.0rc18/openstategraph/examples/fanout-in-a-loop/workflow.json +93 -0
- openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/AGENTS.md +122 -0
- openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/tests/test_guarded_lookup_document.py +96 -0
- openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/tools/directory.py +102 -0
- openstategraph-0.3.0rc18/openstategraph/examples/guarded-lookup/workflow.json +114 -0
- openstategraph-0.3.0rc18/openstategraph/examples/index.json +194 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/AGENTS.md +96 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/accessions.md +29 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/duplication.md +30 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/storage-tiers.md +30 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/viability-testing.md +36 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/knowledge/withdrawals.md +29 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/tests/test_knowledge_lookup_qa_document.py +119 -0
- openstategraph-0.3.0rc18/openstategraph/examples/knowledge-lookup-qa/workflow.json +59 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/AGENTS.md +138 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/gallery.md +29 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/on-call.md +35 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/release-checklist.md +31 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/knowledge/support-desks.md +30 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/tests/test_morning_brief_document.py +197 -0
- openstategraph-0.3.0rc18/openstategraph/examples/morning-brief/workflow.json +164 -0
- openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts/AGENTS.md +120 -0
- openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts/tests/test_nested_mounts_document.py +129 -0
- openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts/workflow.json +48 -0
- openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts-mid/AGENTS.md +35 -0
- openstategraph-0.3.0rc18/openstategraph/examples/nested-mounts-mid/workflow.json +48 -0
- openstategraph-0.3.0rc18/openstategraph/examples/parallel-workers-join/AGENTS.md +95 -0
- openstategraph-0.3.0rc18/openstategraph/examples/parallel-workers-join/tests/test_parallel_workers_join_document.py +81 -0
- openstategraph-0.3.0rc18/openstategraph/examples/parallel-workers-join/workflow.json +74 -0
- openstategraph-0.3.0rc18/openstategraph/examples/remembers-across-runs/AGENTS.md +111 -0
- openstategraph-0.3.0rc18/openstategraph/examples/remembers-across-runs/tests/test_remembers_across_runs_document.py +101 -0
- openstategraph-0.3.0rc18/openstategraph/examples/remembers-across-runs/workflow.json +92 -0
- openstategraph-0.3.0rc18/openstategraph/examples/same-package-twice/AGENTS.md +87 -0
- openstategraph-0.3.0rc18/openstategraph/examples/same-package-twice/tests/test_same_package_twice_document.py +148 -0
- openstategraph-0.3.0rc18/openstategraph/examples/same-package-twice/workflow.json +71 -0
- openstategraph-0.3.0rc18/openstategraph/examples/skill-driven-rubric/AGENTS.md +98 -0
- openstategraph-0.3.0rc18/openstategraph/examples/skill-driven-rubric/tests/test_skill_driven_rubric_document.py +117 -0
- openstategraph-0.3.0rc18/openstategraph/examples/skill-driven-rubric/workflow.json +87 -0
- openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/AGENTS.md +130 -0
- openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/data/Chinook_Sqlite.sqlite +0 -0
- openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/evals/sql-qa.eval.json +119 -0
- openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/tests/test_sql_qa_document.py +237 -0
- openstategraph-0.3.0rc18/openstategraph/examples/sql-qa/workflow.json +88 -0
- openstategraph-0.3.0rc18/openstategraph/examples/support-triage/AGENTS.md +204 -0
- openstategraph-0.3.0rc18/openstategraph/examples/support-triage/tests/test_support_triage_document.py +171 -0
- openstategraph-0.3.0rc18/openstategraph/examples/support-triage/workflow.json +157 -0
- openstategraph-0.3.0rc18/openstategraph/examples/two-stage-double-loop/AGENTS.md +88 -0
- openstategraph-0.3.0rc18/openstategraph/examples/two-stage-double-loop/tests/test_two_stage_double_loop_document.py +88 -0
- openstategraph-0.3.0rc18/openstategraph/examples/two-stage-double-loop/workflow.json +99 -0
- openstategraph-0.3.0rc18/openstategraph/examples/web-research-digest/AGENTS.md +139 -0
- openstategraph-0.3.0rc18/openstategraph/examples/web-research-digest/tests/test_web_research_digest_document.py +131 -0
- openstategraph-0.3.0rc18/openstategraph/examples/web-research-digest/workflow.json +89 -0
- openstategraph-0.3.0rc18/openstategraph/examples/youtube-trend-digest/AGENTS.md +257 -0
- openstategraph-0.3.0rc18/openstategraph/examples/youtube-trend-digest/tests/test_youtube_trend_digest_document.py +150 -0
- openstategraph-0.3.0rc18/openstategraph/examples/youtube-trend-digest/workflow.json +118 -0
- openstategraph-0.3.0rc18/openstategraph/executed_statements.py +157 -0
- openstategraph-0.3.0rc18/openstategraph/extensions.py +554 -0
- openstategraph-0.3.0rc18/openstategraph/function_contracts.py +149 -0
- openstategraph-0.3.0rc18/openstategraph/gap_report.py +741 -0
- openstategraph-0.3.0rc18/openstategraph/gap_report_client.py +201 -0
- openstategraph-0.3.0rc18/openstategraph/gap_report_door.py +408 -0
- openstategraph-0.3.0rc18/openstategraph/generated_module_contract.py +453 -0
- openstategraph-0.3.0rc18/openstategraph/github_issue_bridge.py +375 -0
- openstategraph-0.3.0rc18/openstategraph/grounded_numbers.py +226 -0
- openstategraph-0.3.0rc18/openstategraph/injection.py +177 -0
- openstategraph-0.3.0rc18/openstategraph/install_hint.py +225 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0001_kanban_cards.sql +140 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0002_kanban_cards_rls.sql +95 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0003_gap_report_door.sql +195 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0004_ledger_rls.sql +69 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0005_card_gap_evidence.sql +33 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_migrations/0006_gap_cards_land_on_the_team_board.sql +128 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_postgres.py +446 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_sqlite.py +396 -0
- openstategraph-0.3.0rc18/openstategraph/kanban_store.py +893 -0
- openstategraph-0.3.0rc18/openstategraph/knowledge.py +199 -0
- openstategraph-0.3.0rc18/openstategraph/knowledge_builders.py +736 -0
- openstategraph-0.3.0rc18/openstategraph/knowledge_engines.py +354 -0
- openstategraph-0.3.0rc18/openstategraph/knowledge_explorer.py +777 -0
- openstategraph-0.3.0rc18/openstategraph/live.py +504 -0
- openstategraph-0.3.0rc18/openstategraph/loader.py +1042 -0
- openstategraph-0.3.0rc18/openstategraph/mcp_server.py +1879 -0
- openstategraph-0.3.0rc18/openstategraph/mcp_sessions.py +416 -0
- openstategraph-0.3.0rc18/openstategraph/memory.py +1240 -0
- openstategraph-0.3.0rc18/openstategraph/memory_segment.py +348 -0
- openstategraph-0.3.0rc18/openstategraph/messages.py +237 -0
- openstategraph-0.3.0rc18/openstategraph/model_readiness.py +120 -0
- openstategraph-0.3.0rc18/openstategraph/mssql_connection.py +276 -0
- openstategraph-0.3.0rc18/openstategraph/node_report.py +209 -0
- openstategraph-0.3.0rc18/openstategraph/opening.py +221 -0
- openstategraph-0.3.0rc18/openstategraph/package_testing.py +180 -0
- openstategraph-0.3.0rc18/openstategraph/patrol.py +557 -0
- openstategraph-0.3.0rc18/openstategraph/plugin_interop.py +714 -0
- openstategraph-0.3.0rc18/openstategraph/postgres.py +212 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_architect.py +179 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_databricks.py +184 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_email.py +143 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_knowledge.py +165 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_mcp.py +1720 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_mssql.py +206 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_platform.py +340 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_session.py +81 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_sql.py +246 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_warehouse.py +504 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_web.py +289 -0
- openstategraph-0.3.0rc18/openstategraph/prebuilt_youtube.py +403 -0
- openstategraph-0.3.0rc18/openstategraph/principal.py +193 -0
- openstategraph-0.3.0rc18/openstategraph/progress.py +203 -0
- openstategraph-0.3.0rc18/openstategraph/project_id_carriers.py +238 -0
- openstategraph-0.3.0rc18/openstategraph/project_identity.py +188 -0
- openstategraph-0.3.0rc18/openstategraph/providers.py +1323 -0
- openstategraph-0.3.0rc18/openstategraph/py.typed +0 -0
- openstategraph-0.3.0rc18/openstategraph/readable_tree.py +58 -0
- openstategraph-0.3.0rc18/openstategraph/readonly_sqlite.py +148 -0
- openstategraph-0.3.0rc18/openstategraph/reasoning.py +379 -0
- openstategraph-0.3.0rc18/openstategraph/results.py +350 -0
- openstategraph-0.3.0rc18/openstategraph/run_doors.py +305 -0
- openstategraph-0.3.0rc18/openstategraph/run_findings.py +695 -0
- openstategraph-0.3.0rc18/openstategraph/run_identity.py +81 -0
- openstategraph-0.3.0rc18/openstategraph/run_journal.py +450 -0
- openstategraph-0.3.0rc18/openstategraph/run_sinks.py +2046 -0
- openstategraph-0.3.0rc18/openstategraph/run_stream.py +579 -0
- openstategraph-0.3.0rc18/openstategraph/run_summary.py +291 -0
- openstategraph-0.3.0rc18/openstategraph/scaffold.py +969 -0
- openstategraph-0.3.0rc18/openstategraph/schema.py +269 -0
- openstategraph-0.3.0rc18/openstategraph/search_backends.py +332 -0
- openstategraph-0.3.0rc18/openstategraph/skills.py +218 -0
- openstategraph-0.3.0rc18/openstategraph/sources.py +442 -0
- openstategraph-0.3.0rc18/openstategraph/sql_reach.py +119 -0
- openstategraph-0.3.0rc18/openstategraph/state_dir.py +173 -0
- openstategraph-0.3.0rc18/openstategraph/step_budget.py +335 -0
- openstategraph-0.3.0rc18/openstategraph/stream_parts.py +71 -0
- openstategraph-0.3.0rc18/openstategraph/table_coverage.py +632 -0
- openstategraph-0.3.0rc18/openstategraph/templates/__init__.py +162 -0
- openstategraph-0.3.0rc18/openstategraph/templates/index.json +44 -0
- openstategraph-0.3.0rc18/openstategraph/templates/loop/AGENTS.md +77 -0
- openstategraph-0.3.0rc18/openstategraph/templates/loop/tests/test_shape.py +31 -0
- openstategraph-0.3.0rc18/openstategraph/templates/loop/workflow.json +47 -0
- openstategraph-0.3.0rc18/openstategraph/templates/minimal/AGENTS.md +51 -0
- openstategraph-0.3.0rc18/openstategraph/templates/minimal/tests/test_shape.py +30 -0
- openstategraph-0.3.0rc18/openstategraph/templates/minimal/workflow.json +20 -0
- openstategraph-0.3.0rc18/openstategraph/templates/routed-qa/AGENTS.md +71 -0
- openstategraph-0.3.0rc18/openstategraph/templates/routed-qa/tests/test_shape.py +37 -0
- openstategraph-0.3.0rc18/openstategraph/templates/routed-qa/workflow.json +85 -0
- openstategraph-0.3.0rc18/openstategraph/templates/team/AGENTS.md +50 -0
- openstategraph-0.3.0rc18/openstategraph/templates/team/tests/test_shape.py +33 -0
- openstategraph-0.3.0rc18/openstategraph/templates/team/workflow.json +64 -0
- openstategraph-0.3.0rc18/openstategraph/units.py +201 -0
- openstategraph-0.3.0rc18/openstategraph/validation.py +418 -0
- openstategraph-0.3.0rc18/openstategraph/vocabulary.py +573 -0
- openstategraph-0.3.0rc18/openstategraph/web_transport.py +131 -0
- openstategraph-0.3.0rc18/openstategraph/workflows_root.py +200 -0
- openstategraph-0.3.0rc18/pyproject.toml +394 -0
- openstategraph-0.3.0rc18/tests/conftest.py +558 -0
- openstategraph-0.3.0rc18/tests/data/recorded_chinook_assistant_run.json +1229 -0
- openstategraph-0.3.0rc18/tests/data/recorded_chinook_followup_thread.json +160 -0
- openstategraph-0.3.0rc18/tests/data/recorded_concierge_customer_run.json +1192 -0
- openstategraph-0.3.0rc18/tests/data/schema_v2_team_mount.json +39 -0
- openstategraph-0.3.0rc18/tests/data/sse_wire_format_golden.json +24 -0
- openstategraph-0.3.0rc18/tests/fixtures/recorded_gap_report.json +19 -0
- openstategraph-0.3.0rc18/tests/fixtures/workflows/warehouse-analyst/workflow.json +752 -0
- openstategraph-0.3.0rc18/tests/kanban_by_path.py +108 -0
- openstategraph-0.3.0rc18/tests/kanban_fake.py +171 -0
- openstategraph-0.3.0rc18/tests/public_api.txt +123 -0
- openstategraph-0.3.0rc18/tests/test_a_binding_reads_only_its_own_pins.py +117 -0
- openstategraph-0.3.0rc18/tests/test_a_blank_line_inside_a_table_does_not_end_it.py +86 -0
- openstategraph-0.3.0rc18/tests/test_a_board_that_is_absent_says_where_it_looked.py +202 -0
- openstategraph-0.3.0rc18/tests/test_a_branch_carries_one_edge.py +171 -0
- openstategraph-0.3.0rc18/tests/test_a_branch_that_goes_nowhere_is_reported.py +323 -0
- openstategraph-0.3.0rc18/tests/test_a_budget_overrun_speaks_our_words.py +354 -0
- openstategraph-0.3.0rc18/tests/test_a_burst_says_whose_work_it_was.py +109 -0
- openstategraph-0.3.0rc18/tests/test_a_cached_shell_cannot_outlive_its_assets.py +131 -0
- openstategraph-0.3.0rc18/tests/test_a_card_names_the_directory_it_writes_to.py +86 -0
- openstategraph-0.3.0rc18/tests/test_a_card_with_no_backend_says_so.py +185 -0
- openstategraph-0.3.0rc18/tests/test_a_chain_is_counted_to_its_end.py +215 -0
- openstategraph-0.3.0rc18/tests/test_a_child_run_outlives_the_turn.py +155 -0
- openstategraph-0.3.0rc18/tests/test_a_cited_query_that_never_ran.py +346 -0
- openstategraph-0.3.0rc18/tests/test_a_compile_only_command_writes_nothing.py +156 -0
- openstategraph-0.3.0rc18/tests/test_a_compositions_total_spend_is_bounded_by_its_drawing.py +333 -0
- openstategraph-0.3.0rc18/tests/test_a_conditional_source_reaches_the_join.py +128 -0
- openstategraph-0.3.0rc18/tests/test_a_connection_failure_is_not_a_bad_select.py +223 -0
- openstategraph-0.3.0rc18/tests/test_a_credential_refusal_names_a_next_step.py +158 -0
- openstategraph-0.3.0rc18/tests/test_a_day_of_failed_logins_files_one_card.py +453 -0
- openstategraph-0.3.0rc18/tests/test_a_dead_stream_names_the_node.py +57 -0
- openstategraph-0.3.0rc18/tests/test_a_declared_unit_is_not_the_models_to_choose.py +314 -0
- openstategraph-0.3.0rc18/tests/test_a_deep_agent_delegates.py +328 -0
- openstategraph-0.3.0rc18/tests/test_a_delegation_names_its_worker.py +155 -0
- openstategraph-0.3.0rc18/tests/test_a_deleted_package_stays_deleted.py +161 -0
- openstategraph-0.3.0rc18/tests/test_a_detector_is_checked_before_it_runs.py +163 -0
- openstategraph-0.3.0rc18/tests/test_a_disclosure_is_about_an_answer_that_exists.py +311 -0
- openstategraph-0.3.0rc18/tests/test_a_discovered_node_type_publishes_its_ports.py +132 -0
- openstategraph-0.3.0rc18/tests/test_a_dispatch_table_does_not_hold_its_targets.py +370 -0
- openstategraph-0.3.0rc18/tests/test_a_documented_verb_is_one_the_parser_accepts.py +157 -0
- openstategraph-0.3.0rc18/tests/test_a_failed_run_is_not_a_silent_success.py +84 -0
- openstategraph-0.3.0rc18/tests/test_a_failure_is_not_called_a_warning.py +111 -0
- openstategraph-0.3.0rc18/tests/test_a_family_sees_a_facade_not_the_runtime.py +173 -0
- openstategraph-0.3.0rc18/tests/test_a_fan_out_answers_the_blocking_door.py +206 -0
- openstategraph-0.3.0rc18/tests/test_a_fan_out_is_not_an_edge_that_is_always_taken.py +181 -0
- openstategraph-0.3.0rc18/tests/test_a_fetched_page_keeps_its_links.py +90 -0
- openstategraph-0.3.0rc18/tests/test_a_finding_reaches_the_customer_seam.py +434 -0
- openstategraph-0.3.0rc18/tests/test_a_finished_reason_lands_on_the_card.py +214 -0
- openstategraph-0.3.0rc18/tests/test_a_flattened_ref_still_calls_the_tool.py +341 -0
- openstategraph-0.3.0rc18/tests/test_a_forced_pass_is_reported.py +62 -0
- openstategraph-0.3.0rc18/tests/test_a_frame_says_when_it_happened.py +255 -0
- openstategraph-0.3.0rc18/tests/test_a_full_port_is_reported_before_the_run.py +195 -0
- openstategraph-0.3.0rc18/tests/test_a_function_can_be_shared_between_packages.py +125 -0
- openstategraph-0.3.0rc18/tests/test_a_function_is_refused_before_it_is_called.py +151 -0
- openstategraph-0.3.0rc18/tests/test_a_function_node_does_not_make_the_gate_unreachable.py +162 -0
- openstategraph-0.3.0rc18/tests/test_a_gap_can_be_reported_without_a_browser.py +743 -0
- openstategraph-0.3.0rc18/tests/test_a_gap_report_carries_the_allowlist_and_nothing_else.py +361 -0
- openstategraph-0.3.0rc18/tests/test_a_gap_with_no_tool_offers_to_build_one.py +75 -0
- openstategraph-0.3.0rc18/tests/test_a_generated_module_is_checkable.py +305 -0
- openstategraph-0.3.0rc18/tests/test_a_generated_wiki_page_says_when_it_was_generated.py +182 -0
- openstategraph-0.3.0rc18/tests/test_a_gracefully_stopped_mount_says_its_number_was_overruled.py +276 -0
- openstategraph-0.3.0rc18/tests/test_a_grader_budget_is_its_own.py +176 -0
- openstategraph-0.3.0rc18/tests/test_a_grader_sees_the_disclosure_it_would_duplicate.py +212 -0
- openstategraph-0.3.0rc18/tests/test_a_grader_told_the_customer.py +161 -0
- openstategraph-0.3.0rc18/tests/test_a_growing_store_is_seeked_not_scanned.py +375 -0
- openstategraph-0.3.0rc18/tests/test_a_guard_can_check_a_figure_against_the_rows.py +259 -0
- openstategraph-0.3.0rc18/tests/test_a_half_migrated_graph_still_runs.py +253 -0
- openstategraph-0.3.0rc18/tests/test_a_host_app_can_mount_the_whole_product.py +223 -0
- openstategraph-0.3.0rc18/tests/test_a_lane_called_1.py +107 -0
- openstategraph-0.3.0rc18/tests/test_a_library_default_is_never_literalised.py +234 -0
- openstategraph-0.3.0rc18/tests/test_a_long_pass_tail_still_publishes.py +331 -0
- openstategraph-0.3.0rc18/tests/test_a_loop_that_stops_says_it_worked_first.py +248 -0
- openstategraph-0.3.0rc18/tests/test_a_migrated_node_still_answers_the_sync_door.py +210 -0
- openstategraph-0.3.0rc18/tests/test_a_missing_board_driver_does_not_kill_the_stream.py +301 -0
- openstategraph-0.3.0rc18/tests/test_a_model_can_actually_call_the_async_tools.py +205 -0
- openstategraph-0.3.0rc18/tests/test_a_mount_awaits_its_child.py +213 -0
- openstategraph-0.3.0rc18/tests/test_a_mount_can_remember_what_it_concluded.py +296 -0
- openstategraph-0.3.0rc18/tests/test_a_mount_does_not_reset_the_parents_answer.py +112 -0
- openstategraph-0.3.0rc18/tests/test_a_mount_is_sized_against_its_own_drawing.py +318 -0
- openstategraph-0.3.0rc18/tests/test_a_mount_says_at_compile_time_what_it_cannot_supply.py +287 -0
- openstategraph-0.3.0rc18/tests/test_a_mounted_child_reads_its_own_run_context.py +341 -0
- openstategraph-0.3.0rc18/tests/test_a_mounted_child_that_ran_out_of_steps_says_so.py +278 -0
- openstategraph-0.3.0rc18/tests/test_a_mounted_node_reports_its_output.py +145 -0
- openstategraph-0.3.0rc18/tests/test_a_mounted_run_records_its_statements.py +199 -0
- openstategraph-0.3.0rc18/tests/test_a_mounted_step_is_visible_on_both_doors.py +129 -0
- openstategraph-0.3.0rc18/tests/test_a_node_reads_the_run_context.py +326 -0
- openstategraph-0.3.0rc18/tests/test_a_node_that_failed_is_a_finding.py +167 -0
- openstategraph-0.3.0rc18/tests/test_a_node_that_runs_twice_forgets_what_it_did_the_first_time.py +231 -0
- openstategraph-0.3.0rc18/tests/test_a_package_function_is_not_slug_qualified.py +355 -0
- openstategraph-0.3.0rc18/tests/test_a_package_is_compiled_once_per_mount.py +284 -0
- openstategraph-0.3.0rc18/tests/test_a_package_tool_reaches_the_project.py +314 -0
- openstategraph-0.3.0rc18/tests/test_a_parallel_router_reports_every_branch.py +314 -0
- openstategraph-0.3.0rc18/tests/test_a_passing_graders_reason_is_the_models.py +116 -0
- openstategraph-0.3.0rc18/tests/test_a_paused_mounts_child_is_named.py +352 -0
- openstategraph-0.3.0rc18/tests/test_a_plugin_node_type_says_which_one_ran.py +373 -0
- openstategraph-0.3.0rc18/tests/test_a_plugin_tool_that_cannot_bind_costs_one_tool.py +327 -0
- openstategraph-0.3.0rc18/tests/test_a_promise_on_a_card_is_not_a_lost_capability.py +266 -0
- openstategraph-0.3.0rc18/tests/test_a_published_answer_carries_no_invisible_characters.py +156 -0
- openstategraph-0.3.0rc18/tests/test_a_read_only_database_opens_no_second_file.py +205 -0
- openstategraph-0.3.0rc18/tests/test_a_recording_door_asks_whose_recording_it_is.py +99 -0
- openstategraph-0.3.0rc18/tests/test_a_recovered_retry_is_reported.py +148 -0
- openstategraph-0.3.0rc18/tests/test_a_refusal_from_an_unequipped_agent_is_not_an_answer.py +367 -0
- openstategraph-0.3.0rc18/tests/test_a_rejected_mcp_call_reaches_the_model.py +410 -0
- openstategraph-0.3.0rc18/tests/test_a_rejected_query_never_left_the_building.py +337 -0
- openstategraph-0.3.0rc18/tests/test_a_rejected_tool_name_offers_the_library_tool.py +76 -0
- openstategraph-0.3.0rc18/tests/test_a_rejection_without_a_note.py +43 -0
- openstategraph-0.3.0rc18/tests/test_a_replayed_step_says_how_long_and_how_much.py +270 -0
- openstategraph-0.3.0rc18/tests/test_a_replayed_step_says_which_graph_it_is.py +266 -0
- openstategraph-0.3.0rc18/tests/test_a_request_cannot_repoint_the_server.py +120 -0
- openstategraph-0.3.0rc18/tests/test_a_required_argument_has_somewhere_to_come_from.py +359 -0
- openstategraph-0.3.0rc18/tests/test_a_resolver_that_covers_nothing_says_so.py +415 -0
- openstategraph-0.3.0rc18/tests/test_a_resumed_runs_done_frame_carries_the_whole_run.py +205 -0
- openstategraph-0.3.0rc18/tests/test_a_retry_reads_its_own_findings.py +176 -0
- openstategraph-0.3.0rc18/tests/test_a_reused_tool_result_keeps_its_own_call_id.py +239 -0
- openstategraph-0.3.0rc18/tests/test_a_revise_lap_names_the_right_author.py +351 -0
- openstategraph-0.3.0rc18/tests/test_a_revise_pass_sees_what_it_must_revise.py +139 -0
- openstategraph-0.3.0rc18/tests/test_a_router_can_match_more_than_one_branch.py +120 -0
- openstategraph-0.3.0rc18/tests/test_a_router_dispatches_to_every_match.py +67 -0
- openstategraph-0.3.0rc18/tests/test_a_router_re_dispatches_a_revision.py +213 -0
- openstategraph-0.3.0rc18/tests/test_a_row_count_is_not_a_vessel_count.py +443 -0
- openstategraph-0.3.0rc18/tests/test_a_run_can_say_what_it_executed.py +399 -0
- openstategraph-0.3.0rc18/tests/test_a_run_cannot_read_the_previous_runs_findings.py +220 -0
- openstategraph-0.3.0rc18/tests/test_a_run_names_the_source_it_used.py +484 -0
- openstategraph-0.3.0rc18/tests/test_a_run_reports_what_it_cost.py +292 -0
- openstategraph-0.3.0rc18/tests/test_a_run_request_cannot_name_a_file.py +333 -0
- openstategraph-0.3.0rc18/tests/test_a_run_says_what_it_cost.py +212 -0
- openstategraph-0.3.0rc18/tests/test_a_run_says_when_it_starts.py +297 -0
- openstategraph-0.3.0rc18/tests/test_a_run_streams_to_any_framework.py +309 -0
- openstategraph-0.3.0rc18/tests/test_a_run_supplies_context.py +661 -0
- openstategraph-0.3.0rc18/tests/test_a_run_with_no_model_refuses_at_the_door.py +192 -0
- openstategraph-0.3.0rc18/tests/test_a_runaway_loop_degrades_instead_of_crashing.py +235 -0
- openstategraph-0.3.0rc18/tests/test_a_runs_diagram_opens_its_mounts.py +271 -0
- openstategraph-0.3.0rc18/tests/test_a_save_refuses_a_document_that_moved_on_disk.py +191 -0
- openstategraph-0.3.0rc18/tests/test_a_schema_arrives_before_it_is_offloaded.py +267 -0
- openstategraph-0.3.0rc18/tests/test_a_second_ask_answers_too.py +278 -0
- openstategraph-0.3.0rc18/tests/test_a_send_that_can_happen_twice.py +472 -0
- openstategraph-0.3.0rc18/tests/test_a_shipped_package_binds_its_own_tool_types.py +168 -0
- openstategraph-0.3.0rc18/tests/test_a_silent_member_says_what_it_did.py +222 -0
- openstategraph-0.3.0rc18/tests/test_a_silent_node_is_reported.py +76 -0
- openstategraph-0.3.0rc18/tests/test_a_silent_turn_is_asked_again.py +166 -0
- openstategraph-0.3.0rc18/tests/test_a_single_choice_router_publishes_one_answer.py +220 -0
- openstategraph-0.3.0rc18/tests/test_a_sitting_is_named_by_the_browser.py +243 -0
- openstategraph-0.3.0rc18/tests/test_a_skill_has_one_source.py +311 -0
- openstategraph-0.3.0rc18/tests/test_a_slug_refusal_names_its_correction_once.py +142 -0
- openstategraph-0.3.0rc18/tests/test_a_spawn_is_closed.py +427 -0
- openstategraph-0.3.0rc18/tests/test_a_stale_tool_denial_is_reported.py +288 -0
- openstategraph-0.3.0rc18/tests/test_a_stateless_mount_redoes_its_work.py +235 -0
- openstategraph-0.3.0rc18/tests/test_a_static_cycle_cannot_terminate.py +229 -0
- openstategraph-0.3.0rc18/tests/test_a_static_output_prints_its_own_sentence.py +158 -0
- openstategraph-0.3.0rc18/tests/test_a_stop_says_what_it_stopped.py +374 -0
- openstategraph-0.3.0rc18/tests/test_a_store_one_column_behind_keeps_its_runs.py +305 -0
- openstategraph-0.3.0rc18/tests/test_a_stored_run_answers_to_an_audience.py +371 -0
- openstategraph-0.3.0rc18/tests/test_a_stream_says_how_it_ends.py +109 -0
- openstategraph-0.3.0rc18/tests/test_a_task_boundary_on_a_mount_was_priced.py +306 -0
- openstategraph-0.3.0rc18/tests/test_a_test_does_not_pin_this_checkouts_history.py +167 -0
- openstategraph-0.3.0rc18/tests/test_a_thread_is_read_once_and_says_when_it_is_cut.py +279 -0
- openstategraph-0.3.0rc18/tests/test_a_tier_may_supply_a_word_never_a_number.py +412 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_call_is_announced.py +235 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_failure_is_not_a_node_failure.py +112 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_reads_the_run_context.py +414 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_result_is_never_the_answer.py +85 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_says_what_it_did.py +272 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_stays_substitutable_for_its_base.py +85 -0
- openstategraph-0.3.0rc18/tests/test_a_tool_without_args_is_named.py +207 -0
- openstategraph-0.3.0rc18/tests/test_a_tracked_binary_carries_its_argument.py +218 -0
- openstategraph-0.3.0rc18/tests/test_a_turn_closes_where_it_was_not_opened.py +206 -0
- openstategraph-0.3.0rc18/tests/test_a_wired_tool_is_never_called_missing.py +215 -0
- openstategraph-0.3.0rc18/tests/test_a_worker_can_say_what_it_is_missing.py +93 -0
- openstategraph-0.3.0rc18/tests/test_a_worker_that_produced_nothing_is_visible.py +140 -0
- openstategraph-0.3.0rc18/tests/test_a_zero_is_not_a_measurement.py +701 -0
- openstategraph-0.3.0rc18/tests/test_active_node.py +308 -0
- openstategraph-0.3.0rc18/tests/test_adoption_interface.py +290 -0
- openstategraph-0.3.0rc18/tests/test_advisor_context.py +114 -0
- openstategraph-0.3.0rc18/tests/test_agent_answer_extraction.py +232 -0
- openstategraph-0.3.0rc18/tests/test_agent_conditional_feed.py +91 -0
- openstategraph-0.3.0rc18/tests/test_agent_config.py +281 -0
- openstategraph-0.3.0rc18/tests/test_agent_family.py +343 -0
- openstategraph-0.3.0rc18/tests/test_agent_node_wiring.py +315 -0
- openstategraph-0.3.0rc18/tests/test_agreement_without_a_denotation_engine.py +128 -0
- openstategraph-0.3.0rc18/tests/test_ambient_tools_are_published.py +68 -0
- openstategraph-0.3.0rc18/tests/test_an_agent_outlives_its_run_context.py +230 -0
- openstategraph-0.3.0rc18/tests/test_an_answer_says_what_it_substituted.py +136 -0
- openstategraph-0.3.0rc18/tests/test_an_answer_that_is_only_code_is_reported.py +121 -0
- openstategraph-0.3.0rc18/tests/test_an_archetype_label_survives_its_own_roster_format.py +100 -0
- openstategraph-0.3.0rc18/tests/test_an_async_subagent_is_isolated.py +151 -0
- openstategraph-0.3.0rc18/tests/test_an_async_worker_is_opted_into.py +141 -0
- openstategraph-0.3.0rc18/tests/test_an_authoring_warning_is_not_a_failed_run.py +334 -0
- openstategraph-0.3.0rc18/tests/test_an_edit_reaches_a_held_workflow.py +385 -0
- openstategraph-0.3.0rc18/tests/test_an_exhausted_grader_is_not_a_pass.py +166 -0
- openstategraph-0.3.0rc18/tests/test_an_exhausted_guard_says_it_was_not_satisfied.py +220 -0
- openstategraph-0.3.0rc18/tests/test_an_exhausted_loop_delivers_an_honest_answer.py +175 -0
- openstategraph-0.3.0rc18/tests/test_an_install_with_no_gh_has_a_door.py +523 -0
- openstategraph-0.3.0rc18/tests/test_an_invented_tool_name_is_a_missing_capability.py +142 -0
- openstategraph-0.3.0rc18/tests/test_an_invented_tool_name_is_not_a_use.py +246 -0
- openstategraph-0.3.0rc18/tests/test_an_issue_a_user_files_reaches_the_board.py +354 -0
- openstategraph-0.3.0rc18/tests/test_an_mcp_tool_can_say_what_it_did.py +549 -0
- openstategraph-0.3.0rc18/tests/test_an_unfenced_suggestion_still_leaves_the_answer.py +97 -0
- openstategraph-0.3.0rc18/tests/test_an_unmapped_verdict_does_not_compile.py +130 -0
- openstategraph-0.3.0rc18/tests/test_an_unsettled_answer_is_not_a_settled_one.py +266 -0
- openstategraph-0.3.0rc18/tests/test_an_unwired_revise_is_reported.py +278 -0
- openstategraph-0.3.0rc18/tests/test_answer_channel_concurrency.py +101 -0
- openstategraph-0.3.0rc18/tests/test_api.py +1309 -0
- openstategraph-0.3.0rc18/tests/test_api_auth.py +343 -0
- openstategraph-0.3.0rc18/tests/test_api_guide.py +325 -0
- openstategraph-0.3.0rc18/tests/test_architect.py +158 -0
- openstategraph-0.3.0rc18/tests/test_architecture_audit_2026_08.py +204 -0
- openstategraph-0.3.0rc18/tests/test_atom_forge_is_watertight.py +120 -0
- openstategraph-0.3.0rc18/tests/test_attempts_channel_concurrency.py +93 -0
- openstategraph-0.3.0rc18/tests/test_audience_boundary.py +567 -0
- openstategraph-0.3.0rc18/tests/test_behind_the_scenes.py +230 -0
- openstategraph-0.3.0rc18/tests/test_both_doors_share_one_health_report.py +64 -0
- openstategraph-0.3.0rc18/tests/test_branch_context.py +187 -0
- openstategraph-0.3.0rc18/tests/test_bundled_skill_tree.py +119 -0
- openstategraph-0.3.0rc18/tests/test_bundled_skills.py +148 -0
- openstategraph-0.3.0rc18/tests/test_capability_discovery.py +241 -0
- openstategraph-0.3.0rc18/tests/test_catalogue_events.py +553 -0
- openstategraph-0.3.0rc18/tests/test_chat_answer_containment.py +119 -0
- openstategraph-0.3.0rc18/tests/test_chat_customer_surface_hides_internal_ids.py +82 -0
- openstategraph-0.3.0rc18/tests/test_chat_enter_sends.py +80 -0
- openstategraph-0.3.0rc18/tests/test_chat_model.py +190 -0
- openstategraph-0.3.0rc18/tests/test_chat_picker_disambiguates.py +60 -0
- openstategraph-0.3.0rc18/tests/test_chat_trace_credits_the_right_node.py +63 -0
- openstategraph-0.3.0rc18/tests/test_chinook_demo_file.py +168 -0
- openstategraph-0.3.0rc18/tests/test_cli.py +844 -0
- openstategraph-0.3.0rc18/tests/test_cli_export_plugin.py +219 -0
- openstategraph-0.3.0rc18/tests/test_cli_kanban.py +603 -0
- openstategraph-0.3.0rc18/tests/test_cli_nodes.py +199 -0
- openstategraph-0.3.0rc18/tests/test_cli_resume.py +377 -0
- openstategraph-0.3.0rc18/tests/test_collection_policy.py +87 -0
- openstategraph-0.3.0rc18/tests/test_compile_diagnostics.py +132 -0
- openstategraph-0.3.0rc18/tests/test_compiled_graph_preview_opens_mounts.py +134 -0
- openstategraph-0.3.0rc18/tests/test_compiler_mints_context_schema.py +241 -0
- openstategraph-0.3.0rc18/tests/test_config_file.py +922 -0
- openstategraph-0.3.0rc18/tests/test_context_reaches_a_prompt.py +324 -0
- openstategraph-0.3.0rc18/tests/test_cors_origins.py +82 -0
- openstategraph-0.3.0rc18/tests/test_credential_failure_ux.py +416 -0
- openstategraph-0.3.0rc18/tests/test_customer_graph.py +220 -0
- openstategraph-0.3.0rc18/tests/test_customer_token_stream.py +377 -0
- openstategraph-0.3.0rc18/tests/test_data_key_contract.py +444 -0
- openstategraph-0.3.0rc18/tests/test_data_key_validity.py +178 -0
- openstategraph-0.3.0rc18/tests/test_deep_agent_slot_facts.py +373 -0
- openstategraph-0.3.0rc18/tests/test_deep_tier_offload.py +311 -0
- openstategraph-0.3.0rc18/tests/test_degraded_capability_is_said_out_loud.py +396 -0
- openstategraph-0.3.0rc18/tests/test_dev_loop_reload_guard.py +99 -0
- openstategraph-0.3.0rc18/tests/test_diagram_gate_reads_the_graph_not_the_pixels.py +168 -0
- openstategraph-0.3.0rc18/tests/test_disclosure_follows_the_tool_surface.py +472 -0
- openstategraph-0.3.0rc18/tests/test_discovery_is_honest.py +523 -0
- openstategraph-0.3.0rc18/tests/test_distribution_metadata.py +348 -0
- openstategraph-0.3.0rc18/tests/test_docker_requirements.py +45 -0
- openstategraph-0.3.0rc18/tests/test_documented_cli_surface.py +325 -0
- openstategraph-0.3.0rc18/tests/test_documented_fallback_is_a_port.py +124 -0
- openstategraph-0.3.0rc18/tests/test_documented_install.py +313 -0
- openstategraph-0.3.0rc18/tests/test_documented_mcp_tool_surface.py +119 -0
- openstategraph-0.3.0rc18/tests/test_documented_memory_promises.py +81 -0
- openstategraph-0.3.0rc18/tests/test_documented_modules_match_the_vocabulary.py +159 -0
- openstategraph-0.3.0rc18/tests/test_documented_patrol_board_surface.py +169 -0
- openstategraph-0.3.0rc18/tests/test_documented_skill_surface.py +1124 -0
- openstategraph-0.3.0rc18/tests/test_documented_spend_bar_surface.py +126 -0
- openstategraph-0.3.0rc18/tests/test_documented_starter_surface.py +103 -0
- openstategraph-0.3.0rc18/tests/test_documented_stream_surface.py +96 -0
- openstategraph-0.3.0rc18/tests/test_dotenv.py +349 -0
- openstategraph-0.3.0rc18/tests/test_editor_assets.py +356 -0
- openstategraph-0.3.0rc18/tests/test_editor_freshness.py +115 -0
- openstategraph-0.3.0rc18/tests/test_editor_validate_sees_a_mount_cycle.py +117 -0
- openstategraph-0.3.0rc18/tests/test_engineering_rules_match_claude_md.py +125 -0
- openstategraph-0.3.0rc18/tests/test_eval_cli.py +296 -0
- openstategraph-0.3.0rc18/tests/test_eval_dataset.py +97 -0
- openstategraph-0.3.0rc18/tests/test_evaluation.py +459 -0
- openstategraph-0.3.0rc18/tests/test_every_bindable_tool_is_drawable.py +62 -0
- openstategraph-0.3.0rc18/tests/test_every_builtin_tool_is_drawable.py +68 -0
- openstategraph-0.3.0rc18/tests/test_every_error_we_define_can_be_a_refusal.py +157 -0
- openstategraph-0.3.0rc18/tests/test_every_run_door_carries_identity.py +308 -0
- openstategraph-0.3.0rc18/tests/test_every_run_door_writes_itself_down.py +370 -0
- openstategraph-0.3.0rc18/tests/test_every_spin_up_path_says_whose_it_is.py +162 -0
- openstategraph-0.3.0rc18/tests/test_every_table_the_board_creates_has_row_security.py +206 -0
- openstategraph-0.3.0rc18/tests/test_example_warnings_are_declared.py +120 -0
- openstategraph-0.3.0rc18/tests/test_examples.py +318 -0
- openstategraph-0.3.0rc18/tests/test_export_readme_names_its_dependencies.py +212 -0
- openstategraph-0.3.0rc18/tests/test_extensions.py +512 -0
- openstategraph-0.3.0rc18/tests/test_feedback_channel_concurrency.py +95 -0
- openstategraph-0.3.0rc18/tests/test_first_ten_minutes.py +104 -0
- openstategraph-0.3.0rc18/tests/test_follow_up_conversation.py +211 -0
- openstategraph-0.3.0rc18/tests/test_function_and_subgraph_nodes.py +168 -0
- openstategraph-0.3.0rc18/tests/test_gallery_draws_each_graph_once.py +139 -0
- openstategraph-0.3.0rc18/tests/test_grader.py +231 -0
- openstategraph-0.3.0rc18/tests/test_grader_criteria_is_satisfiable.py +135 -0
- openstategraph-0.3.0rc18/tests/test_grader_exhaustion.py +132 -0
- openstategraph-0.3.0rc18/tests/test_grandchild_machinery_names.py +162 -0
- openstategraph-0.3.0rc18/tests/test_graph_names.py +125 -0
- openstategraph-0.3.0rc18/tests/test_guard_check.py +196 -0
- openstategraph-0.3.0rc18/tests/test_guardrail.py +219 -0
- openstategraph-0.3.0rc18/tests/test_guardrail_field_contract.py +77 -0
- openstategraph-0.3.0rc18/tests/test_guardrail_node.py +331 -0
- openstategraph-0.3.0rc18/tests/test_harness_findings_against_the_real_harness.py +155 -0
- openstategraph-0.3.0rc18/tests/test_help_text_names_no_ticket.py +139 -0
- openstategraph-0.3.0rc18/tests/test_human_approval.py +164 -0
- openstategraph-0.3.0rc18/tests/test_init_project.py +680 -0
- openstategraph-0.3.0rc18/tests/test_init_reviews_a_workflows_root_it_did_not_write.py +158 -0
- openstategraph-0.3.0rc18/tests/test_init_writes_a_command_the_agent_can_run.py +178 -0
- openstategraph-0.3.0rc18/tests/test_injection_screening.py +218 -0
- openstategraph-0.3.0rc18/tests/test_intent_routed_workflow.py +211 -0
- openstategraph-0.3.0rc18/tests/test_kanban_idea_cards.py +279 -0
- openstategraph-0.3.0rc18/tests/test_kanban_routes.py +503 -0
- openstategraph-0.3.0rc18/tests/test_kanban_store.py +979 -0
- openstategraph-0.3.0rc18/tests/test_kanban_store_contract.py +320 -0
- openstategraph-0.3.0rc18/tests/test_kanban_triage.py +193 -0
- openstategraph-0.3.0rc18/tests/test_knowledge.py +310 -0
- openstategraph-0.3.0rc18/tests/test_knowledge_build.py +820 -0
- openstategraph-0.3.0rc18/tests/test_knowledge_codebase.py +181 -0
- openstategraph-0.3.0rc18/tests/test_knowledge_curation.py +216 -0
- openstategraph-0.3.0rc18/tests/test_knowledge_explorer.py +730 -0
- openstategraph-0.3.0rc18/tests/test_load_workflow.py +275 -0
- openstategraph-0.3.0rc18/tests/test_loop_gate_ci_coverage.py +83 -0
- openstategraph-0.3.0rc18/tests/test_mcp_config_edit.py +245 -0
- openstategraph-0.3.0rc18/tests/test_mcp_field_contract.py +233 -0
- openstategraph-0.3.0rc18/tests/test_mcp_kanban.py +1039 -0
- openstategraph-0.3.0rc18/tests/test_mcp_routes.py +402 -0
- openstategraph-0.3.0rc18/tests/test_mcp_server.py +917 -0
- openstategraph-0.3.0rc18/tests/test_mcp_sessions_are_reused.py +417 -0
- openstategraph-0.3.0rc18/tests/test_mcp_skill_tools.py +83 -0
- openstategraph-0.3.0rc18/tests/test_memory.py +934 -0
- openstategraph-0.3.0rc18/tests/test_memory_reaches_every_transport.py +245 -0
- openstategraph-0.3.0rc18/tests/test_memory_segment.py +314 -0
- openstategraph-0.3.0rc18/tests/test_memory_taxonomy_words.py +93 -0
- openstategraph-0.3.0rc18/tests/test_message_content_is_read_the_same_way.py +156 -0
- openstategraph-0.3.0rc18/tests/test_model_field_contract.py +68 -0
- openstategraph-0.3.0rc18/tests/test_module_size_ceiling.py +1487 -0
- openstategraph-0.3.0rc18/tests/test_mount_adversarial.py +632 -0
- openstategraph-0.3.0rc18/tests/test_mount_composition_preview.py +252 -0
- openstategraph-0.3.0rc18/tests/test_mount_effective_document.py +318 -0
- openstategraph-0.3.0rc18/tests/test_mount_endpoint.py +180 -0
- openstategraph-0.3.0rc18/tests/test_mount_findings_reach_the_run.py +181 -0
- openstategraph-0.3.0rc18/tests/test_mount_overrides.py +117 -0
- openstategraph-0.3.0rc18/tests/test_mount_usage_endpoint.py +111 -0
- openstategraph-0.3.0rc18/tests/test_mounted_subgraph_namespace.py +179 -0
- openstategraph-0.3.0rc18/tests/test_mssql_connection.py +278 -0
- openstategraph-0.3.0rc18/tests/test_narration_middleware.py +705 -0
- openstategraph-0.3.0rc18/tests/test_never_an_empty_answer.py +114 -0
- openstategraph-0.3.0rc18/tests/test_new_writes_where_serve_reads.py +167 -0
- openstategraph-0.3.0rc18/tests/test_newest_first_is_the_latest_instant.py +263 -0
- openstategraph-0.3.0rc18/tests/test_nine_provider_cases.py +76 -0
- openstategraph-0.3.0rc18/tests/test_no_document_repeats_a_retracted_claim.py +346 -0
- openstategraph-0.3.0rc18/tests/test_no_provider_run_is_legible.py +192 -0
- openstategraph-0.3.0rc18/tests/test_no_repeated_work.py +150 -0
- openstategraph-0.3.0rc18/tests/test_no_shipped_package_ships_a_diagnostic.py +199 -0
- openstategraph-0.3.0rc18/tests/test_no_tracked_file_names_a_machine.py +169 -0
- openstategraph-0.3.0rc18/tests/test_node_cache_policy.py +171 -0
- openstategraph-0.3.0rc18/tests/test_node_catalogue.py +185 -0
- openstategraph-0.3.0rc18/tests/test_node_contracts_publish_every_locked_layer.py +102 -0
- openstategraph-0.3.0rc18/tests/test_node_families.py +299 -0
- openstategraph-0.3.0rc18/tests/test_node_overrides.py +184 -0
- openstategraph-0.3.0rc18/tests/test_node_runtime.py +831 -0
- openstategraph-0.3.0rc18/tests/test_node_type_registry.py +154 -0
- openstategraph-0.3.0rc18/tests/test_nostream_machinery.py +297 -0
- openstategraph-0.3.0rc18/tests/test_one_accessor_reads_run_identity.py +383 -0
- openstategraph-0.3.0rc18/tests/test_one_graders_sentence.py +68 -0
- openstategraph-0.3.0rc18/tests/test_one_product_one_version.py +66 -0
- openstategraph-0.3.0rc18/tests/test_one_store_and_a_pluggable_sink.py +817 -0
- openstategraph-0.3.0rc18/tests/test_one_stream_per_tab.py +370 -0
- openstategraph-0.3.0rc18/tests/test_one_verb_opens_the_project_it_names.py +323 -0
- openstategraph-0.3.0rc18/tests/test_openapi_contract.py +143 -0
- openstategraph-0.3.0rc18/tests/test_openapi_toolchain.py +150 -0
- openstategraph-0.3.0rc18/tests/test_openwiki_links_resolve.py +62 -0
- openstategraph-0.3.0rc18/tests/test_orchestrator.py +323 -0
- openstategraph-0.3.0rc18/tests/test_orchestrator_graph.py +634 -0
- openstategraph-0.3.0rc18/tests/test_override_target_is_named.py +168 -0
- openstategraph-0.3.0rc18/tests/test_package_testing.py +200 -0
- openstategraph-0.3.0rc18/tests/test_patrol.py +533 -0
- openstategraph-0.3.0rc18/tests/test_patrol_events.py +408 -0
- openstategraph-0.3.0rc18/tests/test_patrol_registry.py +85 -0
- openstategraph-0.3.0rc18/tests/test_persisted_checkpointer.py +307 -0
- openstategraph-0.3.0rc18/tests/test_persisted_memory_store.py +221 -0
- openstategraph-0.3.0rc18/tests/test_pip_retry.py +186 -0
- openstategraph-0.3.0rc18/tests/test_plugin_capabilities.py +301 -0
- openstategraph-0.3.0rc18/tests/test_plugin_interop.py +310 -0
- openstategraph-0.3.0rc18/tests/test_postgres_backend.py +280 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_databricks.py +306 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_email.py +52 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_mcp.py +1011 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_mssql.py +337 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_platform.py +152 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_sql.py +72 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_warehouse.py +473 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_web.py +140 -0
- openstategraph-0.3.0rc18/tests/test_prebuilt_youtube.py +444 -0
- openstategraph-0.3.0rc18/tests/test_principal.py +157 -0
- openstategraph-0.3.0rc18/tests/test_production_audit_2026_08_15.py +190 -0
- openstategraph-0.3.0rc18/tests/test_progress_frames.py +238 -0
- openstategraph-0.3.0rc18/tests/test_project_identity.py +442 -0
- openstategraph-0.3.0rc18/tests/test_prompt_chaining.py +88 -0
- openstategraph-0.3.0rc18/tests/test_prompt_mirror_contract.py +198 -0
- openstategraph-0.3.0rc18/tests/test_prompt_sections_are_delimited.py +131 -0
- openstategraph-0.3.0rc18/tests/test_provider_gap.py +213 -0
- openstategraph-0.3.0rc18/tests/test_provider_registry.py +596 -0
- openstategraph-0.3.0rc18/tests/test_provider_status_endpoint.py +308 -0
- openstategraph-0.3.0rc18/tests/test_provider_status_names_the_extra.py +91 -0
- openstategraph-0.3.0rc18/tests/test_providers_does_not_promise_a_run.py +329 -0
- openstategraph-0.3.0rc18/tests/test_public_api.py +329 -0
- openstategraph-0.3.0rc18/tests/test_public_surface_ceiling.py +1017 -0
- openstategraph-0.3.0rc18/tests/test_python_support.py +161 -0
- openstategraph-0.3.0rc18/tests/test_readme_names_the_wheels_builder_gap.py +72 -0
- openstategraph-0.3.0rc18/tests/test_reasoning_effort.py +447 -0
- openstategraph-0.3.0rc18/tests/test_reducers_are_named.py +232 -0
- openstategraph-0.3.0rc18/tests/test_request_credentials.py +94 -0
- openstategraph-0.3.0rc18/tests/test_resource_lifecycle.py +423 -0
- openstategraph-0.3.0rc18/tests/test_resume_accepts_the_field_the_pause_published.py +62 -0
- openstategraph-0.3.0rc18/tests/test_retention_grammar_contract.py +80 -0
- openstategraph-0.3.0rc18/tests/test_reverse_proxy.py +288 -0
- openstategraph-0.3.0rc18/tests/test_route_check.py +226 -0
- openstategraph-0.3.0rc18/tests/test_route_modules.py +206 -0
- openstategraph-0.3.0rc18/tests/test_router.py +173 -0
- openstategraph-0.3.0rc18/tests/test_router_branches.py +167 -0
- openstategraph-0.3.0rc18/tests/test_run_context_declaration.py +310 -0
- openstategraph-0.3.0rc18/tests/test_run_path_projection.py +231 -0
- openstategraph-0.3.0rc18/tests/test_run_readiness_is_one_sentence.py +137 -0
- openstategraph-0.3.0rc18/tests/test_run_request_seams.py +136 -0
- openstategraph-0.3.0rc18/tests/test_run_result.py +108 -0
- openstategraph-0.3.0rc18/tests/test_runs_thread.py +232 -0
- openstategraph-0.3.0rc18/tests/test_runtime_context_facts.py +367 -0
- openstategraph-0.3.0rc18/tests/test_scaffold_writes_agent_files.py +184 -0
- openstategraph-0.3.0rc18/tests/test_schema_v3_team_collapse.py +202 -0
- openstategraph-0.3.0rc18/tests/test_schema_versioning.py +226 -0
- openstategraph-0.3.0rc18/tests/test_sdk_injection.py +337 -0
- openstategraph-0.3.0rc18/tests/test_search_backends.py +233 -0
- openstategraph-0.3.0rc18/tests/test_search_memory_admits_it_cannot_rank.py +106 -0
- openstategraph-0.3.0rc18/tests/test_send_it_back_once_is_a_number_the_hint_names.py +171 -0
- openstategraph-0.3.0rc18/tests/test_serve_listener.py +142 -0
- openstategraph-0.3.0rc18/tests/test_session_identity.py +114 -0
- openstategraph-0.3.0rc18/tests/test_shipped_examples_match_dev_relay_wiring.py +82 -0
- openstategraph-0.3.0rc18/tests/test_shipped_skills_measured_disclosure.py +136 -0
- openstategraph-0.3.0rc18/tests/test_shipped_tools_report_progress.py +330 -0
- openstategraph-0.3.0rc18/tests/test_site_pages.py +508 -0
- openstategraph-0.3.0rc18/tests/test_skill_layer.py +421 -0
- openstategraph-0.3.0rc18/tests/test_skill_layer_contract.py +98 -0
- openstategraph-0.3.0rc18/tests/test_spawn_events.py +224 -0
- openstategraph-0.3.0rc18/tests/test_spend_route.py +232 -0
- openstategraph-0.3.0rc18/tests/test_spend_summary.py +528 -0
- openstategraph-0.3.0rc18/tests/test_spend_summary_cost.py +184 -0
- openstategraph-0.3.0rc18/tests/test_sql_explorer_field_contract.py +133 -0
- openstategraph-0.3.0rc18/tests/test_sql_reach.py +135 -0
- openstategraph-0.3.0rc18/tests/test_stability_contract.py +123 -0
- openstategraph-0.3.0rc18/tests/test_state_dir.py +238 -0
- openstategraph-0.3.0rc18/tests/test_static_text_is_not_the_entry.py +89 -0
- openstategraph-0.3.0rc18/tests/test_stream_cancellation.py +220 -0
- openstategraph-0.3.0rc18/tests/test_stream_version_v2.py +177 -0
- openstategraph-0.3.0rc18/tests/test_stress_workload_fixtures.py +279 -0
- openstategraph-0.3.0rc18/tests/test_supervisor_archetypes.py +374 -0
- openstategraph-0.3.0rc18/tests/test_support_triage_gates_before_it_sends.py +131 -0
- openstategraph-0.3.0rc18/tests/test_team_node.py +215 -0
- openstategraph-0.3.0rc18/tests/test_team_outcome_is_unenforced.py +163 -0
- openstategraph-0.3.0rc18/tests/test_templates.py +399 -0
- openstategraph-0.3.0rc18/tests/test_terminal_frame.py +513 -0
- openstategraph-0.3.0rc18/tests/test_terminal_frame_nesting.py +179 -0
- openstategraph-0.3.0rc18/tests/test_the_advisor_can_say_nothing_here_fits.py +90 -0
- openstategraph-0.3.0rc18/tests/test_the_agent_ladder_needs_no_async_door.py +116 -0
- openstategraph-0.3.0rc18/tests/test_the_agent_node_awaits_its_model.py +105 -0
- openstategraph-0.3.0rc18/tests/test_the_agent_offers_what_nothing_can_build.py +200 -0
- openstategraph-0.3.0rc18/tests/test_the_api_takes_back_what_it_hands_you.py +98 -0
- openstategraph-0.3.0rc18/tests/test_the_async_run_path_can_use_the_servers_saver.py +208 -0
- openstategraph-0.3.0rc18/tests/test_the_board_learns_a_card_moved.py +300 -0
- openstategraph-0.3.0rc18/tests/test_the_budget_floor_walk_is_linear.py +169 -0
- openstategraph-0.3.0rc18/tests/test_the_build_door_opens_on_a_turn_that_called_six_tools.py +381 -0
- openstategraph-0.3.0rc18/tests/test_the_canvas_page_names_every_way_out_of_a_loop.py +123 -0
- openstategraph-0.3.0rc18/tests/test_the_canvas_page_says_what_replay_costs.py +186 -0
- openstategraph-0.3.0rc18/tests/test_the_card_store_has_a_seam.py +263 -0
- openstategraph-0.3.0rc18/tests/test_the_chat_page_names_its_wait.py +131 -0
- openstategraph-0.3.0rc18/tests/test_the_chat_page_says_what_it_does.py +69 -0
- openstategraph-0.3.0rc18/tests/test_the_chunks_are_kept.py +470 -0
- openstategraph-0.3.0rc18/tests/test_the_code_owner_is_a_person.py +86 -0
- openstategraph-0.3.0rc18/tests/test_the_demo_route_is_not_published.py +160 -0
- openstategraph-0.3.0rc18/tests/test_the_docs_index_is_reachable_and_complete.py +104 -0
- openstategraph-0.3.0rc18/tests/test_the_documented_collection_gap_is_the_real_one.py +134 -0
- openstategraph-0.3.0rc18/tests/test_the_documented_ritual_is_one_the_board_accepts.py +164 -0
- openstategraph-0.3.0rc18/tests/test_the_door_opens_on_the_shape_of_the_run.py +269 -0
- openstategraph-0.3.0rc18/tests/test_the_editor_makes_a_whole_package.py +94 -0
- openstategraph-0.3.0rc18/tests/test_the_emittable_prelude.py +300 -0
- openstategraph-0.3.0rc18/tests/test_the_empty_picker_names_the_fix.py +47 -0
- openstategraph-0.3.0rc18/tests/test_the_end_node_shows_the_answer.py +69 -0
- openstategraph-0.3.0rc18/tests/test_the_escape_hatch_says_which_door.py +227 -0
- openstategraph-0.3.0rc18/tests/test_the_first_browser_does_not_buy_everyones_runs.py +206 -0
- openstategraph-0.3.0rc18/tests/test_the_first_command_a_stranger_copies.py +262 -0
- openstategraph-0.3.0rc18/tests/test_the_frame_clock_survives_the_transport.py +153 -0
- openstategraph-0.3.0rc18/tests/test_the_frame_fields_are_published.py +139 -0
- openstategraph-0.3.0rc18/tests/test_the_front_door_says_there_is_a_stream.py +168 -0
- openstategraph-0.3.0rc18/tests/test_the_front_door_sets_a_credential_before_it_says_run.py +106 -0
- openstategraph-0.3.0rc18/tests/test_the_front_door_stays_short.py +198 -0
- openstategraph-0.3.0rc18/tests/test_the_gallery_names_nodes_as_their_authors_did.py +119 -0
- openstategraph-0.3.0rc18/tests/test_the_gallery_sweep_covers_the_gallery.py +74 -0
- openstategraph-0.3.0rc18/tests/test_the_gap_register_can_count_itself.py +88 -0
- openstategraph-0.3.0rc18/tests/test_the_gate_says_a_check_rejected_it.py +128 -0
- openstategraph-0.3.0rc18/tests/test_the_gate_says_what_the_grader_thought.py +296 -0
- openstategraph-0.3.0rc18/tests/test_the_grader_ladder_grows_an_async_door.py +251 -0
- openstategraph-0.3.0rc18/tests/test_the_grader_node_awaits_its_judgement.py +495 -0
- openstategraph-0.3.0rc18/tests/test_the_guard_holds_an_unfenced_object.py +97 -0
- openstategraph-0.3.0rc18/tests/test_the_harness_contract_is_in_the_preamble.py +194 -0
- openstategraph-0.3.0rc18/tests/test_the_install_hint_can_be_carried_out.py +297 -0
- openstategraph-0.3.0rc18/tests/test_the_join_gathers_branch_results_too.py +83 -0
- openstategraph-0.3.0rc18/tests/test_the_keyless_door_files_onto_a_board_a_tab_reads.py +158 -0
- openstategraph-0.3.0rc18/tests/test_the_launch_config_reads_env.py +96 -0
- openstategraph-0.3.0rc18/tests/test_the_library_door_reads_the_whole_health_report.py +198 -0
- openstategraph-0.3.0rc18/tests/test_the_lint_gate_actually_runs.py +93 -0
- openstategraph-0.3.0rc18/tests/test_the_live_flow_follows_a_run_into_a_mount.py +146 -0
- openstategraph-0.3.0rc18/tests/test_the_mcp_run_door_answers_to_an_audience.py +311 -0
- openstategraph-0.3.0rc18/tests/test_the_mcp_tool_is_already_awaitable.py +191 -0
- openstategraph-0.3.0rc18/tests/test_the_mount_type_set_is_declared_once.py +116 -0
- openstategraph-0.3.0rc18/tests/test_the_offer_is_made_from_the_rejection.py +49 -0
- openstategraph-0.3.0rc18/tests/test_the_one_example.py +413 -0
- openstategraph-0.3.0rc18/tests/test_the_open_ticket_census.py +99 -0
- openstategraph-0.3.0rc18/tests/test_the_orchestrator_ladder_grows_async_doors.py +404 -0
- openstategraph-0.3.0rc18/tests/test_the_orchestrator_node_awaits_its_planner.py +452 -0
- openstategraph-0.3.0rc18/tests/test_the_platform_list_does_not_over_claim.py +82 -0
- openstategraph-0.3.0rc18/tests/test_the_ports_page_matches_the_catalogue.py +131 -0
- openstategraph-0.3.0rc18/tests/test_the_prebuilt_tools_page_configures_what_exists.py +159 -0
- openstategraph-0.3.0rc18/tests/test_the_progress_rail_names_only_this_conversations_workers.py +289 -0
- openstategraph-0.3.0rc18/tests/test_the_public_settings_checklist_names_every_secret.py +93 -0
- openstategraph-0.3.0rc18/tests/test_the_purpose_is_shown_beside_the_shape.py +64 -0
- openstategraph-0.3.0rc18/tests/test_the_readme_a_stranger_lands_on.py +248 -0
- openstategraph-0.3.0rc18/tests/test_the_recordings_have_a_door.py +196 -0
- openstategraph-0.3.0rc18/tests/test_the_release_train_names_what_has_not_run.py +98 -0
- openstategraph-0.3.0rc18/tests/test_the_replay_door_shows_no_machinery.py +112 -0
- openstategraph-0.3.0rc18/tests/test_the_router_ladder_grows_an_async_door.py +265 -0
- openstategraph-0.3.0rc18/tests/test_the_router_node_awaits_its_classifier.py +414 -0
- openstategraph-0.3.0rc18/tests/test_the_run_surface_names_no_framework.py +337 -0
- openstategraph-0.3.0rc18/tests/test_the_same_call_twice_is_two_findings.py +1094 -0
- openstategraph-0.3.0rc18/tests/test_the_same_question_twice.py +364 -0
- openstategraph-0.3.0rc18/tests/test_the_scratchpad_is_not_the_answer.py +108 -0
- openstategraph-0.3.0rc18/tests/test_the_second_consumer_is_pinned.py +153 -0
- openstategraph-0.3.0rc18/tests/test_the_setup_path_stays_cheap.py +117 -0
- openstategraph-0.3.0rc18/tests/test_the_shared_board_applies_its_own_migrations.py +302 -0
- openstategraph-0.3.0rc18/tests/test_the_shared_board_has_a_reviewable_schema.py +276 -0
- openstategraph-0.3.0rc18/tests/test_the_skills_and_the_server_ship_as_one_bundle.py +184 -0
- openstategraph-0.3.0rc18/tests/test_the_sse_wire_format_is_unchanged.py +338 -0
- openstategraph-0.3.0rc18/tests/test_the_step_budget_reaches_the_graph.py +303 -0
- openstategraph-0.3.0rc18/tests/test_the_store_takes_a_new_column.py +185 -0
- openstategraph-0.3.0rc18/tests/test_the_stream_says_where_a_background_worker_stands.py +181 -0
- openstategraph-0.3.0rc18/tests/test_the_streaming_door_reports_a_recovered_retry.py +250 -0
- openstategraph-0.3.0rc18/tests/test_the_tasks_stream_mode_is_a_start_event.py +313 -0
- openstategraph-0.3.0rc18/tests/test_the_team_tab_has_something_to_show.py +259 -0
- openstategraph-0.3.0rc18/tests/test_the_testpypi_command_names_both_indexes.py +130 -0
- openstategraph-0.3.0rc18/tests/test_the_tool_ladder_grows_an_async_door.py +520 -0
- openstategraph-0.3.0rc18/tests/test_the_tool_result_channel_is_unframed_on_purpose.py +244 -0
- openstategraph-0.3.0rc18/tests/test_the_trace_shows_a_skipped_grader.py +161 -0
- openstategraph-0.3.0rc18/tests/test_the_tree_is_publishable.py +732 -0
- openstategraph-0.3.0rc18/tests/test_the_turn_measurement_adds_up.py +158 -0
- openstategraph-0.3.0rc18/tests/test_the_type_gate_actually_runs.py +115 -0
- openstategraph-0.3.0rc18/tests/test_the_type_gate_survives_a_newer_stub.py +263 -0
- openstategraph-0.3.0rc18/tests/test_the_wheel_argument_is_regenerable.py +143 -0
- openstategraph-0.3.0rc18/tests/test_the_wheel_ships_a_current_editor.py +220 -0
- openstategraph-0.3.0rc18/tests/test_the_wheel_teaches_what_it_ships.py +211 -0
- openstategraph-0.3.0rc18/tests/test_the_worker_node_awaits_its_model.py +152 -0
- openstategraph-0.3.0rc18/tests/test_the_worker_records_what_it_was_refused.py +163 -0
- openstategraph-0.3.0rc18/tests/test_threads.py +308 -0
- openstategraph-0.3.0rc18/tests/test_threads_show_the_resume_line.py +150 -0
- openstategraph-0.3.0rc18/tests/test_three_failed_tool_calls_and_the_judges_never_heard.py +340 -0
- openstategraph-0.3.0rc18/tests/test_three_tabs_on_one_workflow.py +369 -0
- openstategraph-0.3.0rc18/tests/test_ticket_ledger.py +467 -0
- openstategraph-0.3.0rc18/tests/test_token_block_kind.py +273 -0
- openstategraph-0.3.0rc18/tests/test_tool_findings.py +689 -0
- openstategraph-0.3.0rc18/tests/test_tool_resolution.py +121 -0
- openstategraph-0.3.0rc18/tests/test_tool_result_frames.py +148 -0
- openstategraph-0.3.0rc18/tests/test_tool_sentences.py +301 -0
- openstategraph-0.3.0rc18/tests/test_transcript_is_not_a_channel.py +209 -0
- openstategraph-0.3.0rc18/tests/test_turn_reset.py +58 -0
- openstategraph-0.3.0rc18/tests/test_two_capability_gaps_share_one_name.py +60 -0
- openstategraph-0.3.0rc18/tests/test_two_exits_both_reach_the_reader.py +339 -0
- openstategraph-0.3.0rc18/tests/test_two_scaffolded_packages_collect_in_one_run.py +146 -0
- openstategraph-0.3.0rc18/tests/test_two_workers_of_one_node_are_two_channels.py +107 -0
- openstategraph-0.3.0rc18/tests/test_unknown_node_type_is_loud.py +204 -0
- openstategraph-0.3.0rc18/tests/test_unreachable_provider_endpoint.py +240 -0
- openstategraph-0.3.0rc18/tests/test_untrusted_input_is_data_in_the_locked_preamble.py +213 -0
- openstategraph-0.3.0rc18/tests/test_validate_accepts_the_document_it_is_handed.py +63 -0
- openstategraph-0.3.0rc18/tests/test_validate_checks_mount_targets.py +250 -0
- openstategraph-0.3.0rc18/tests/test_validate_checks_tool_bindings.py +207 -0
- openstategraph-0.3.0rc18/tests/test_validate_endpoint.py +137 -0
- openstategraph-0.3.0rc18/tests/test_validate_names_a_node_that_never_runs.py +133 -0
- openstategraph-0.3.0rc18/tests/test_validate_prints_the_compilers_findings.py +190 -0
- openstategraph-0.3.0rc18/tests/test_validate_reads_the_field_schema.py +170 -0
- openstategraph-0.3.0rc18/tests/test_validate_sees_a_mount_cycle.py +186 -0
- openstategraph-0.3.0rc18/tests/test_what_a_redaction_leaves_behind.py +160 -0
- openstategraph-0.3.0rc18/tests/test_which_model_a_run_uses.py +569 -0
- openstategraph-0.3.0rc18/tests/test_wiring_page_streams.py +247 -0
- openstategraph-0.3.0rc18/tests/test_worker_ceiling.py +261 -0
- openstategraph-0.3.0rc18/tests/test_workflow_compiler.py +535 -0
- openstategraph-0.3.0rc18/tests/test_workflow_store.py +653 -0
- openstategraph-0.3.0rc18/tests/test_workflows_catalogue.py +354 -0
- openstategraph-0.3.0rc18/tests/test_workflows_root.py +154 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-async-probe/tools/slow.py +33 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-async-probe/workflow.json +22 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-fallback/workflow.json +146 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-ghost-mount/workflow.json +168 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-static-cycle/workflow.json +23 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-bad-two-producers/workflow.json +136 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-deep/tools/service_registry.py +85 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-deep/workflow.json +108 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-parallel-drop/workflow.json +38 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-review/tools/service_registry.py +85 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-review/workflow.json +117 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-review-audit/workflow.json +38 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-review-lint/tools/change_policy.py +48 -0
- openstategraph-0.3.0rc18/tests/workflows/stress/stress-review-lint/workflow.json +32 -0
- 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)))
|