streamlit-coco 0.2.2__tar.gz → 0.3.0__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.
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/.gitignore +6 -0
- streamlit_coco-0.3.0/.gitleaks.toml +14 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/AGENTS.md +3 -2
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/CHANGELOG.md +35 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/Makefile +40 -5
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/PKG-INFO +101 -37
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/README.md +97 -33
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/api.md +84 -7
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/deployment/README.md +2 -2
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/deployment/local.md +1 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/deployment/publish.md +3 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/ask-coco.md +40 -4
- streamlit_coco-0.3.0/doc/features/ask-coco/test-checklist.md +50 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/prd.md +14 -12
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/CHECKLIST.md +9 -8
- streamlit_coco-0.3.0/doc/releases/0.3.0/CHECKLIST.md +86 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/NOTES.md +38 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/README.md +17 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/screenshots/01-first-screen.png +0 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/screenshots/02-attach.png +0 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/screenshots/03-audit.png +0 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/screenshots/04-shop-library.png +0 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/screenshots/README.md +35 -0
- streamlit_coco-0.3.0/doc/releases/0.3.0/screenshots/hero.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/README.md +1 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/roadmap.md +50 -22
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/security/threat-model.md +69 -8
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/testing.md +7 -6
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/pyproject.toml +4 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/README.md +1 -1
- streamlit_coco-0.3.0/examples/e2e_managed_harness.py +87 -0
- streamlit_coco-0.3.0/examples/managed_chat.py +105 -0
- streamlit_coco-0.3.0/examples/skills_hub/README.md +56 -0
- streamlit_coco-0.3.0/examples/skills_hub/app.py +255 -0
- streamlit_coco-0.3.0/examples/skills_hub/publish.py +15 -0
- streamlit_coco-0.3.0/examples/skills_hub/samples/csv-profile/SKILL.md +18 -0
- streamlit_coco-0.3.0/examples/skills_hub/samples/csv-profile/scripts/profile.py +33 -0
- streamlit_coco-0.3.0/examples/skills_hub/samples/release-notes-writer/SKILL.md +22 -0
- streamlit_coco-0.3.0/examples/skills_hub/samples/sql-style-review/SKILL.md +20 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/__init__.py +0 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/bootstrap.py +48 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/cli.py +87 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/demo.py +19 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/native.py +85 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/probe.py +87 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/service.py +106 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/skill.py +208 -0
- streamlit_coco-0.3.0/examples/skills_hub/shop/stores.py +245 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/COCO_PROMPT.md +116 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/DEPLOY.md +48 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/containers/Dockerfile +27 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/containers/build_and_push.sh +41 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/containers/requirements.txt +2 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/containers/service_spec.yaml +27 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/manifest.yml +26 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/readme.md +7 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/scripts/grant_privileges.sql +8 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/scripts/setup_script.sql +100 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/snowflake.local.yml.example +18 -0
- streamlit_coco-0.3.0/examples/skills_hub_native/snowflake.yml +23 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/pyproject.toml +14 -7
- streamlit_coco-0.3.0/release_notes.txt +34 -0
- streamlit_coco-0.3.0/scripts/audit_locks.py +99 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/scripts/capture_release_screens.py +80 -7
- streamlit_coco-0.3.0/scripts/release_check.py +298 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/__init__.py +15 -1
- streamlit_coco-0.3.0/streamlit_coco/audit.py +142 -0
- streamlit_coco-0.3.0/streamlit_coco/backend.py +72 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/bootstrap.py +1 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/conversation.py +58 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/cortex.py +6 -2
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/diagnostics.py +22 -11
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/errors.py +4 -3
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/extras.py +31 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/gate.py +34 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/labels.py +3 -0
- streamlit_coco-0.3.0/streamlit_coco/managed.py +561 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/messages.py +2 -2
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/options.py +1 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/permissions.py +1 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/policy.py +4 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/query.py +1 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/session.py +1 -1
- streamlit_coco-0.3.0/streamlit_coco/testing/managed_fake.py +111 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/waits.py +3 -1
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/window.py +10 -2
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/api_snapshot.py +7 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e/conftest.py +21 -3
- streamlit_coco-0.3.0/tests/e2e/test_managed_window.py +99 -0
- streamlit_coco-0.3.0/tests/fixtures/api_0.2.2.json +8497 -0
- streamlit_coco-0.3.0/tests/fixtures/api_0.3.0.json +9237 -0
- streamlit_coco-0.3.0/tests/test_audit.py +274 -0
- streamlit_coco-0.3.0/tests/test_compat_022.py +56 -0
- streamlit_coco-0.3.0/tests/test_compat_030.py +36 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_cortex.py +4 -4
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_errors.py +1 -1
- streamlit_coco-0.3.0/tests/test_managed.py +436 -0
- streamlit_coco-0.3.0/tests/test_managed_files.py +201 -0
- streamlit_coco-0.3.0/tests/test_release_check.py +66 -0
- streamlit_coco-0.3.0/tests/test_skills_hub.py +629 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_waits.py +8 -0
- streamlit_coco-0.2.2/doc/features/ask-coco/test-checklist.md +0 -30
- streamlit_coco-0.2.2/release_notes.txt +0 -25
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/.python-version +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/CONTRIBUTING.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/ID.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/LICENSE +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/app-builder/UX.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/app-builder/app-builder.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/app-builder/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/app-viewer/app-viewer.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/app-viewer/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/approvals/approvals.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/approvals/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/.gitattributes +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/CoCo22.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/CoCo22Data.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/CoCo22OnPage.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/CoCo22OnPage1366.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/CoCo22Waiting.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/canvas.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/cockpit.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/cockpit22.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/canvas/project/coco22.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/index.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/preview/CoCo22.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/preview/CoCo22Data.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/preview/CoCo22OnPage.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/preview/CoCo22OnPage1366.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/ask-coco/design/preview/CoCo22Waiting.dc.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/chat-ccv2/chat-ccv2.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/chat-ccv2/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/copilot-rail/copilot-rail.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/copilot-rail/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/file-upload/file-upload.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/file-upload/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/headless/headless.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/headless/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/panel/panel.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/panel/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/structured-output/structured-output.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/structured-output/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/text-renderer/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/text-renderer/text-renderer.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/tools-display/SPEC.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/tools-display/test-checklist.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/features/tools-display/tools-display.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/marketing/demo.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/marketing/one-pager.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/methodology/delivery_plan.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/methodology/workshops/w01-setup-architecture-first-app.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/methodology/workshops.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/screenshots/01-upload.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/screenshots/03-approval.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.5/screenshots/hero.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/screenshots/01-copilot-rail.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/screenshots/02-tableau-generate.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/screenshots/03-preview.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/screenshots/04-estate-map.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.6/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/screenshots/fix_with_coco_feature.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/screenshots/powerbi_load.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/screenshots/powerbi_streamlit_app.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/screenshots/streamlit_app_generation.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.7/screenshots/toolbar.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8.1/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8.1/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8.1/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.8.1/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.9/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.9/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.9/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.1.9/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/screenshots/01-minimize.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/screenshots/02-simple-chat.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.0/screenshots/hero.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.1/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.1/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/screenshots/01-full-page.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/screenshots/02-hint.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/0.2.2/screenshots/hero.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/_template/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/_template/NOTES.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/_template/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/releases/_template/screenshots/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/security/findings-report.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/coco_rail.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/html_frame.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/i18n.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/pack.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/quiz.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/app/streamlit_app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/advanced.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/advanced.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/advanced.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/advanced.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/advanced.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/advanced.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/enablement.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/enablement.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/enablement.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/enablement.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/enablement.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/enablement.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/expert.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/expert.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/expert.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/expert.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/expert.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/expert.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/user.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/user.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/user.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/user.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/user.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/certifications/user.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/deck.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/deck.pdf +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/demo-guide.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/demo-guide.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/demo-guide.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/demo-guide.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/demo-guide.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/demo-guide.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/dsp_logo.png +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/guided-tour.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/guided-tour.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/guided-tour.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/guided-tour.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/guided-tour.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/guided-tour.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/hands-on.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/hands-on.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/hands-on.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/hands-on.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/hands-on.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/hands-on.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/intro.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/intro.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/intro.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/intro.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/intro.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/intro.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/setup.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/setup.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/setup.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/setup.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/setup.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/enablement/setup.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/help.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/help.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/help.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/help.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/help.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/help.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/index.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/index.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/index.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/index.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/index.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/index.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/architecture.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/architecture.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/architecture.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/architecture.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/architecture.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/architecture.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/configuration.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/configuration.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/configuration.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/configuration.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/configuration.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/configuration.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/data-and-contracts.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/data-and-contracts.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/data-and-contracts.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/data-and-contracts.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/data-and-contracts.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/data-and-contracts.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/extending.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/extending.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/extending.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/extending.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/extending.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/extending.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/install.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/install.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/install.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/install.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/install.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/install.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/limits.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/limits.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/limits.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/limits.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/limits.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/limits.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/operations.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/operations.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/operations.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/operations.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/operations.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/operations.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/security.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/security.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/security.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/security.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/security.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/security.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/testing-and-ci.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/testing-and-ci.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/testing-and-ci.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/testing-and-ci.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/testing-and-ci.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/testing-and-ci.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/upgrade-and-release.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/upgrade-and-release.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/upgrade-and-release.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/upgrade-and-release.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/upgrade-and-release.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/technical-guide/sections/upgrade-and-release.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/01-simple.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/01-simple.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/01-simple.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/01-simple.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/01-simple.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/01-simple.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/02-intermediate.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/02-intermediate.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/02-intermediate.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/02-intermediate.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/02-intermediate.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/02-intermediate.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/03-advanced.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/03-advanced.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/03-advanced.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/03-advanced.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/03-advanced.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training/03-advanced.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/training.yml +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/index.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/index.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/index.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/index.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/index.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/index.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/concepts.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/concepts.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/concepts.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/concepts.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/concepts.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/concepts.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/faq.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/faq.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/faq.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/faq.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/faq.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/faq.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/getting-started.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/getting-started.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/getting-started.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/getting-started.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/getting-started.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/getting-started.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/outputs.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/outputs.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/outputs.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/outputs.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/outputs.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/outputs.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-api.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-api.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-api.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-api.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-api.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-api.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-commands.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-commands.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-commands.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-commands.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-commands.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-commands.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-examples.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-examples.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-examples.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-examples.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-examples.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/reference-examples.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-add-file-uploads.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-add-file-uploads.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-add-file-uploads.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-add-file-uploads.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-add-file-uploads.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-add-file-uploads.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-build-a-minimal-app.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-build-a-minimal-app.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-build-a-minimal-app.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-build-a-minimal-app.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-build-a-minimal-app.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-build-a-minimal-app.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-configure-tool-approvals.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-configure-tool-approvals.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-configure-tool-approvals.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-configure-tool-approvals.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-configure-tool-approvals.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-configure-tool-approvals.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-headless.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-headless.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-headless.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-headless.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-headless.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-headless.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-the-example-apps.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-the-example-apps.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-the-example-apps.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-the-example-apps.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-the-example-apps.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-run-the-example-apps.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-use-structured-output.es.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-use-structured-output.es.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-use-structured-output.fr.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-use-structured-output.fr.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-use-structured-output.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/doc/training/user-guide/sections/task-use-structured-output.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/.streamlit/config.toml +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/actions.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/brief.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/brief_form.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/catalog.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/coco_window.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/generate.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/jobs.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/paths.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/preview_panel.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/profile.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/scaffold.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/skills.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/engine/state.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/fixtures/local_sales.csv +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/fixtures/prompt_pack.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/fixtures/quality_orders.csv +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/fixtures/sales_sv.csv +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/fixtures/sample_call.txt +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/fixtures/standup_notes.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/screens/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/screens/admin.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/screens/brief.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/screens/library.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/screens/studio.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/screens/welcome.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/call-transcription/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/call-transcription/type.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/csv-explorer/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/csv-explorer/type.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/data-quality/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/data-quality/type.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/meeting-recap/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/meeting-recap/type.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/prompt-library/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/prompt-library/type.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/semantic-kpis/CHECKLIST.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/semantic-kpis/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/semantic-kpis/reference/streamlit_app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/semantic-kpis/type.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/app_builder/types/shared/SKILL.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/approval_gate.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/.streamlit/config.toml +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/app_pages/board.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/app_pages/epic.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/app_pages/release.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/app_pages/ticket.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/epics/E-01.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/epics/E-02.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/epics/E-03.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/policies/dod.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/releases/0.1.0.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/releases/0.2.0.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-040.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-041.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-042.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-043.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-044.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-045.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-046.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-047.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-048.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/data/tickets/T-049.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/streamlit_app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/backlog.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/copilot_panel.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/paths.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/skill_desk.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/skills.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/snowflake_connections.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/backlog_desk/utils/ui.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/powerbi/Corporate Spend.pbix +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/powerbi/Customer Profitability Sample (auto).pbix +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/powerbi/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/powerbi/fetch.sh +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/extract_schema.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/gen_snowflake.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/schema.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/sql/verify.sql +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/sql/workgroup_ddl.sql +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/sql/workgroup_seed.sql +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/workbooks/ts_content.twb +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/workbooks/ts_events.twb +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/workbooks/ts_users.twb +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_samples/tableau/workbooks/ts_web_requests.twb +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/BRIEF-powerbi-fixtures.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/PRD.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/contracts/access_rules.schema.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/contracts/estate_map.schema.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/contracts/kpi_inventory.schema.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/access_parse.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/bi_sources.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/coco_jobs.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/coco_window.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/dashboard_parse.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/estate_parse.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/extract.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/generate.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/kpi_parse.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/paths.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/persist.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/powerbi_parse.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/preview_panel.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/preview_server.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/state.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/streamlit_app_gen.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/engine/ui_common.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/pyproject.toml +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/access_rules.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/arbitration.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/estate_map.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/generate.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/kpi_inventory.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/load.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/bi_to_semantic/screens/welcome.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/chat_app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/cwd_upload_chat.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/e2e_ux_harness.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/headless_pipeline.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/modern_chat/.streamlit/config.toml +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/modern_chat/app.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/structured_output.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/testdata/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/examples/testdata/prompts.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/scripts/collect_adoption_stats.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/scripts/render_adoption_chart.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/scripts/render_svg.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/app_preview.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/ask_user.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/assets.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/bridge.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/clipboard.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/component.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/cortex_tools.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/debug.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/display.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/features.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/frontend/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/frontend/index.html +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/frontend/main.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/frontend/style.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/mini.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/rail.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/rich_text.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/sql_tool.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/coco-logo-round.svg +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/coco-logo.svg +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/coco.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/coco.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/data.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/data.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/files.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/files.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/page.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/page.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/plans.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/plans.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/questions.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/questions.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/session.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/session.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/standing.css +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/coco/parts/standing.js +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/fonts/Montserrat-400.ttf +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/fonts/Montserrat-500.ttf +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/fonts/Montserrat-600.ttf +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/static/fonts/OFL.txt +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/testing/__init__.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/testing/domdiff.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/testing/fixtures.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/testing/harness.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/testing/scripted.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/text_renderer.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/tool_cards.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/tool_extract.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/tool_names.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/ui.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/upload.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/uploader.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/streamlit_coco/viewer.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/coco_fixture.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e/test_window_features.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e/test_window_layout.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e/test_window_walk.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e_classic/conftest.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e_classic/harness.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e_classic/test_ux_copy_highlight.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e_classic/test_ux_max_messages.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/e2e_classic/test_ux_upload.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/api_0.1.9.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/README.md +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/assistant_text.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/assistant_tool_glob.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/assistant_tool_result.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/manifest.json +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/result_structured.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/result_success.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/stream_delta.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/system_init.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/turn_glob.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/fixtures/ndjson/user_tool_result.ndjson +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_app_builder_catalog.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_app_builder_profile.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_app_viewer.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_backlog_desk.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_bi_to_semantic_parse.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_classic_core.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_classic_smoke.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_compat_019.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_conversation.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_copilot_rail.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_core.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_display.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_extras.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_gate.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_headless_example.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_mini.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_ndjson_fixtures.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_part_data.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_policy.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_rich_text.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_scripted.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_smoke.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_snowflake_toml.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_streamlit_floor.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_upload.py +0 -0
- {streamlit_coco-0.2.2 → streamlit_coco-0.3.0}/tests/test_window.py +0 -0
|
@@ -34,3 +34,9 @@ examples/app_builder/out/
|
|
|
34
34
|
# Optional Power BI samples (~17 MB) — fetch with examples/bi_samples/powerbi/fetch.sh
|
|
35
35
|
examples/bi_samples/powerbi/Human Resources Sample PBIX.pbix
|
|
36
36
|
examples/bi_samples/powerbi/Employee Hiring and History.pbix
|
|
37
|
+
|
|
38
|
+
# Skills shop Native App: per-user overrides
|
|
39
|
+
examples/skills_hub_native/snowflake.local.yml
|
|
40
|
+
|
|
41
|
+
# snow app run output
|
|
42
|
+
examples/skills_hub_native/output/
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Gitleaks: the default rules, and one allowlist for the tests that use fake credentials on purpose
|
|
2
|
+
# (tests/test_audit.py checks that the audit log redacts them, tests/test_skills_hub.py that a skill
|
|
3
|
+
# folder holding one is refused). No real secret is in either file.
|
|
4
|
+
title = "streamlit-coco"
|
|
5
|
+
|
|
6
|
+
[extend]
|
|
7
|
+
useDefault = true
|
|
8
|
+
|
|
9
|
+
[allowlist]
|
|
10
|
+
description = "Fake credentials used as test data"
|
|
11
|
+
paths = [
|
|
12
|
+
'''tests/test_audit\.py''',
|
|
13
|
+
'''tests/test_skills_hub\.py''',
|
|
14
|
+
]
|
|
@@ -33,7 +33,8 @@ Canonical SDK docs: https://docs.snowflake.com/en/user-guide/cortex-code-agent-s
|
|
|
33
33
|
make install # uv sync --extra dev
|
|
34
34
|
make check # ruff and the unit tests (not the browser tests)
|
|
35
35
|
make e2e # Playwright, the window on the scripted agent (Edge if Chromium is missing)
|
|
36
|
-
make audit # pip-audit
|
|
36
|
+
make audit # pip-audit: the root lock and every examples/*/uv.lock
|
|
37
|
+
make release-check # before sync-release and the tag: version, public CHANGELOG, audits, Dependabot alerts, sync dry run
|
|
37
38
|
make test-all # check, e2e, audit
|
|
38
39
|
make simple-chat # panel, a test-prompt picker, rights as pills (`make chat` still runs it)
|
|
39
40
|
make modern-chat # Copilot rail, floating window, or both
|
|
@@ -68,6 +69,6 @@ Full test process: [`doc/testing.md`](doc/testing.md).
|
|
|
68
69
|
|
|
69
70
|
- Unit tests: `tests/` (`make check`).
|
|
70
71
|
- Browser tests: `tests/e2e/` (the window) and `tests/e2e_classic/` (the 0.1.9 chat helpers) (`make e2e-install` once, then `make e2e`).
|
|
71
|
-
-
|
|
72
|
+
- Compatibility with released versions: `tests/test_compat_019.py` holds the package to `tests/fixtures/api_0.1.9.json` `tests/test_compat_022.py` to `tests/fixtures/api_0.2.2.json` (what 0.2.0 to 0.2.2 added: `ask_coco`, `Features`, `get_window`, ...) and `tests/test_compat_030.py` to `tests/fixtures/api_0.3.0.json` (the managed agent, `AuditLog`). A public name, parameter or default of a released version does not change; add new parameters last, keyword-only, with a default. When a release is cut, add `tests/fixtures/api_X.Y.Z.json` and its `test_compat_*` (recipe in `tests/api_snapshot.py`; take the snapshot from the tag's source with the SDK that release used installed, else the SDK's own classes show as stubs). Do not delete the 0.1.9 tests (`test_copilot_rail.py`, `test_rich_text.py`, `test_classic_*.py`, `tests/e2e_classic/`).
|
|
72
73
|
- Manual, live Cortex Code: [`doc/features/ask-coco/test-checklist.md`](doc/features/ask-coco/test-checklist.md) before a release.
|
|
73
74
|
- Process: [`doc/testing.md`](doc/testing.md).
|
|
@@ -12,6 +12,41 @@ Living plan (what’s next): [`doc/roadmap.md`](doc/roadmap.md).
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.3.0] — 2026-10-26
|
|
16
|
+
|
|
17
|
+
Snowflake's managed coding agent runs in the same window, with no `cortex` program, and every decision can be written to an audit log. The SDK is now `snowflake-cortex-agent-sdk` for both. Upgrading from 0.2.x: nothing to change for an application that uses the Cortex Code program (`pip install streamlit-coco[sdk]` installs the new package; replace a pinned `cortex-code-agent-sdk` in your own requirements). Everything new is opt-in, and every new parameter is keyword-only with a default that keeps today's behaviour. The managed agent and the Native App example are experimental (the SDK is a public preview, `0.0.x`).
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- **Approval audit log:** `AuditLog(path, who=...)` and `ask_coco(audit=)` write one JSON line per call that asked the user, was covered by a standing permission or was refused: who, when, the agent, the tool, the decision (`allowed`, `declined`, `expired`, `refused`, `standing`, `revoked`) and the exact command, SQL or path the user was shown. Works with every agent. Off by default; the file is readable by its owner only; a failing write is logged and never stops CoCo (SEC-01 of the threat model). Credentials in what the user was shown are redacted before the write (`redact_secrets`, overridable with `AuditLog(redact=)`, `None` to write as shown; what it does not protect is documented), and an allowed call gets a second `outcome` line (`succeeded`, `failed`, `not_run`, `no_result`) joined by `tool_id`.
|
|
22
|
+
- **Files attached in the managed window:** `ManagedOptions(upload_stage="DB.SCHEMA.STAGE", connection=...)` puts each attached file in a folder of this conversation on a stage mounted at `/uploads` in the sandbox; the agent is told the sandbox path (never the local one), no copy stays in the working folder, and the folder is removed from the stage when the conversation ends. Files go in **before the first message**: the sandbox reads the stage once (checked live), so a later one is refused with a sentence that says to start a new conversation. Without `upload_stage` an attached file is refused and the window says why. An agent opts in with an optional `carry(paths)` (`backend.py`).
|
|
23
|
+
- `check_environment(managed=True)` and `require_environment(managed=True)`: the managed agent runs in Snowflake, so the `cortex` program is not looked for and `ready` needs only the SDK. `CocoEnvironment.managed`.
|
|
24
|
+
- `FolderPolicy(where=)` and `SANDBOX_WHERE`: the request's "Where" line names the Snowflake sandbox, not a local folder the managed agent does not have. An agent can bring its own window words (`labels`); the managed agent's first screen says it works in a sandbox and no longer says it reads project files.
|
|
25
|
+
- Least-privilege role documentation (SEC-02, `doc/security/threat-model.md` section 8) and the threat model for the managed agent and the Native App.
|
|
26
|
+
- Tests: `tests/test_audit.py`, `tests/test_managed_files.py`, the probe tests, and `tests/e2e/test_managed_window.py` on `examples/e2e_managed_harness.py` (the window on the managed agent over a scripted stream of Snowflake's client: first screen, a command that asks in the sandbox, Allow, Decline, the audit lines, an attached file).
|
|
27
|
+
- **Managed agent (experimental):** `ManagedOptions` and `managed_agent` run Snowflake's managed coding agent (Cortex Agent SDK) in the same window, with no `cortex` program: `ask_coco(".", agent=st_coco.managed_agent(ManagedOptions(account=..., token=...)))`. Every approval still goes through the policy and the gate; the run is always created with `permission_policy="always_ask"` and only the user's Allow is sent, as the server's one-call "Allow this command" (never its "Allow all ... for this session"). The server asks only about calls it rates risky; the policy sees those. `options_from_connection(profile, role=...)` builds the options from a `~/.snowflake` profile (session token, least-privilege role) and `SANDBOX_WORDS` tells the request that a command runs in the Snowflake sandbox; `make managed` runs `examples/managed_chat.py`. `streamlit_coco.backend.AgentBackend` names the surface an agent keeps (the Cortex Code agent, the managed agent and the scripted agent). Tested on a scripted stream (`testing/managed_fake.py`) and run live on a Snowflake account (a read-free answer, a declined and an allowed write, with a session token and the `PUBLIC` role).
|
|
28
|
+
|
|
29
|
+
- **Skills shop example (experimental):** `make skills-hub` runs `examples/skills_hub/`: skills (a `SKILL.md` folder) kept on a Snowflake stage, a shop to browse them and a chat with one chosen skill on the managed agent (`stage_skills`); `make publish-skill` validates and publishes a skill folder (versions never change). Before a chat the app checks that the folder on the stage is the one that was published, an added file included. Run live on a scratch stage. See [`examples/skills_hub/README.md`](examples/skills_hub/README.md).
|
|
30
|
+
|
|
31
|
+
- **Skills shop as a Native App (experimental):** `examples/skills_hub_native/` packages the shop and the one-skill chat as a Snowflake Native App that runs as a Snowpark Container Services service (`make native-shop-image`, `make native-shop-deploy`, see its `DEPLOY.md`). The service logs in with its own token, publishes the skills baked into the image to the application's stage when it starts (a version already there is never replaced; the stage is in a schema that is not versioned, so skills survive upgrades) and the managed agent runs as the application. Needs two grants to the application for Cortex, in `scripts/grant_privileges.sql`, that you run yourself. Run live on a Snowflake account: the Agent API answered a skill from inside the service. `examples/skills_hub_native/COCO_PROMPT.md` is a prompt for Cortex Code that asks a new user for the parameters (profile, role, warehouse, image repository), checks the account and builds, installs and starts the application, asking before every step that creates, costs credits or grants a right.
|
|
32
|
+
|
|
33
|
+
- `make release-check` (`scripts/release_check.py`): before a release, the version is free on PyPI and the public tags, the public CHANGELOG has no release this one lacks, every lock is audited, open Dependabot alerts are listed by manifest, and the sync dry run is summarised (deletions, generated `out/` files, dev-only leaks). `make audit` now also audits every `examples/*/uv.lock` (`scripts/audit_locks.py`), which the root audit could not see.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- There is no `mode="api"` on `CocoOptions`: the Cortex Agent SDK has one local interface (`mode` is `cli` only) and the managed agent is a separate backend (`managed_agent`, `AgentBackend`), so one library covers both with the same window, policy and gate. The development lock holds `snowflake-cortex-agent-sdk` 0.0.3 (a public preview: pin and re-check before a release).
|
|
38
|
+
- The managed agent no longer reuses the Cortex Code prompt: it has its own instructions (it runs in Snowflake's sandbox, with no question or plan tool) and is told nothing of this computer. Found live: it had answered with the developer's local working folder.
|
|
39
|
+
- The `sdk` and `dev` extras now install `snowflake-cortex-agent-sdk>=0.0.3,<0.1` (a public preview, so capped below `0.1`; the Cortex Agent SDK, `cortex_agent_sdk.cortexcode`) in place of `cortex-code-agent-sdk`. It drives the same local `cortex` program with the same options, messages, `can_use_tool` and hooks; nothing changes for an application (`pip install streamlit-coco[sdk]` stays). The window, the approval gate and `query()` were run against a live Cortex Code 1.2.18. The environment probe and the "SDK missing" messages name the new package. Replace a pinned `cortex-code-agent-sdk` in your own requirements.
|
|
40
|
+
|
|
41
|
+
### Security
|
|
42
|
+
|
|
43
|
+
- The development locks (`uv.lock`, `examples/app_builder/uv.lock`) cover Python 3.11 and later (`[tool.uv] environments`). A Python 3.10 branch kept `pillow` 12.3.0 in them (Pillow 13, which fixes its advisories, needs 3.11), and Dependabot reports every version in a lock. The package still declares `requires-python >=3.10` and does not pin Pillow; only `uv sync` and `uv lock` in this repository need Python 3.11. CI and the release workflow already run on 3.11.
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
|
|
47
|
+
- The line that says what a standing permission covers ("CoCo no longer asks before it ...") ended with two full stops.
|
|
48
|
+
- The public CI failed on a fresh `uv sync` (the public tree has no `uv.lock`): with `[tool.uv] environments`, uv 0.13 also resolves for Pyodide (emscripten), where `playwright` has no wheel. The environments now leave emscripten out (both `pyproject.toml` files; locks relocked, no package version changed). Gitleaks flagged the fake credentials the audit and skills-shop tests use on purpose: `.gitleaks.toml` allowlists those two test files and keeps the default rules.
|
|
49
|
+
|
|
15
50
|
## [0.2.2] — 2026-10-25
|
|
16
51
|
|
|
17
52
|
Ask CoCo can leave the corner: attached to an edge on the full height of the page, or on the whole page. The page can be told where the window is, and take the rest of the screen. Upgrading from 0.2.0 or 0.2.1: nothing to change; every new parameter is keyword-only with a default that keeps today's behaviour.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# streamlit-coco — local development
|
|
2
2
|
UV ?= uv
|
|
3
|
-
# Always include [dev] so cortex-
|
|
3
|
+
# Always include [dev] so snowflake-cortex-agent-sdk is available for demos/tests.
|
|
4
4
|
PYTHON ?= $(UV) run --extra dev
|
|
5
5
|
E2E_PYTHON ?= $(UV) run --extra e2e
|
|
6
6
|
STREAMLIT = $(PYTHON) python -m streamlit run
|
|
@@ -8,9 +8,9 @@ EXAMPLE ?= examples/chat_app.py
|
|
|
8
8
|
|
|
9
9
|
.DEFAULT_GOAL := help
|
|
10
10
|
|
|
11
|
-
.PHONY: help install sync test lint format check audit e2e-install e2e test-all \
|
|
12
|
-
run chat simple-chat modern-chat approval structured headless backlog cwd-upload e2e-harness \
|
|
13
|
-
bi-semantic tableau-semantic app-builder \
|
|
11
|
+
.PHONY: help install sync test lint format check audit release-check e2e-install e2e test-all \
|
|
12
|
+
run chat simple-chat modern-chat approval managed structured headless backlog cwd-upload e2e-harness \
|
|
13
|
+
skills-hub publish-skill native-shop-image native-shop-deploy native-shop-restart native-shop-status native-shop-logs native-shop-teardown bi-semantic tableau-semantic app-builder \
|
|
14
14
|
build publish sync-release clean adoption-stats adoption-chart \
|
|
15
15
|
training training-html training-pdf training-check
|
|
16
16
|
|
|
@@ -42,8 +42,12 @@ format: ## Format with ruff
|
|
|
42
42
|
$(PYTHON) ruff format .
|
|
43
43
|
$(PYTHON) ruff check --fix .
|
|
44
44
|
|
|
45
|
-
audit: ## Dependency vulnerability scan (pip-audit)
|
|
45
|
+
audit: ## Dependency vulnerability scan (pip-audit) of the root lock and every examples/*/uv.lock
|
|
46
46
|
$(PYTHON) pip-audit --skip-editable
|
|
47
|
+
$(PYTHON) python scripts/audit_locks.py
|
|
48
|
+
|
|
49
|
+
release-check: ## Before sync-release and the tag: version free on PyPI/tags, public changelog, audits, alerts, sync dry run
|
|
50
|
+
$(PYTHON) python scripts/release_check.py
|
|
47
51
|
|
|
48
52
|
check: lint test ## Lint then unit tests
|
|
49
53
|
|
|
@@ -71,6 +75,37 @@ modern-chat: ## Copilot rail or Ask CoCo window (examples/modern_chat)
|
|
|
71
75
|
approval: ## Run examples/approval_gate.py
|
|
72
76
|
$(STREAMLIT) examples/approval_gate.py
|
|
73
77
|
|
|
78
|
+
managed: ## Run examples/managed_chat.py (Snowflake's managed coding agent, no cortex program)
|
|
79
|
+
$(STREAMLIT) examples/managed_chat.py
|
|
80
|
+
|
|
81
|
+
skills-hub: ## Run the skills shop (browse stage skills, chat with one; sample skills need no Snowflake)
|
|
82
|
+
$(STREAMLIT) examples/skills_hub/app.py
|
|
83
|
+
|
|
84
|
+
publish-skill: ## Validate and publish a skill folder: make publish-skill SKILL=examples/skills_hub/samples/csv-profile ARGS="--stage DB.SCHEMA.STAGE --profile P --role R"
|
|
85
|
+
$(PYTHON) python examples/skills_hub/publish.py $(SKILL) $(ARGS)
|
|
86
|
+
|
|
87
|
+
SNOW_CONNECTION ?= snowflake
|
|
88
|
+
NATIVE_SHOP = examples/skills_hub_native
|
|
89
|
+
|
|
90
|
+
native-shop-image: ## Build and push the Skills shop image (Docker running)
|
|
91
|
+
$(NATIVE_SHOP)/containers/build_and_push.sh $(SNOW_CONNECTION)
|
|
92
|
+
|
|
93
|
+
native-shop-deploy: ## Package and install/upgrade the Skills shop Native App (snow app run)
|
|
94
|
+
cd $(NATIVE_SHOP) && snow app run --connection $(SNOW_CONNECTION)
|
|
95
|
+
|
|
96
|
+
native-shop-restart: ## Restart the Skills shop service (suspend, resume)
|
|
97
|
+
snow sql -q "CALL coco_skills_shop.app_schema.suspend_service()" --connection $(SNOW_CONNECTION)
|
|
98
|
+
snow sql -q "CALL coco_skills_shop.app_schema.resume_service()" --connection $(SNOW_CONNECTION)
|
|
99
|
+
|
|
100
|
+
native-shop-status: ## Status of the Skills shop service
|
|
101
|
+
snow sql -q "CALL coco_skills_shop.app_schema.get_service_status()" --connection $(SNOW_CONNECTION)
|
|
102
|
+
|
|
103
|
+
native-shop-logs: ## Logs of the Skills shop container
|
|
104
|
+
snow sql -q "CALL coco_skills_shop.app_schema.get_service_logs('0', 'streamlit')" --connection $(SNOW_CONNECTION)
|
|
105
|
+
|
|
106
|
+
native-shop-teardown: ## Drop the Skills shop application, its service, pool and package
|
|
107
|
+
cd $(NATIVE_SHOP) && snow app teardown --connection $(SNOW_CONNECTION) --force --cascade
|
|
108
|
+
|
|
74
109
|
structured: ## Run examples/structured_output.py
|
|
75
110
|
$(STREAMLIT) examples/structured_output.py
|
|
76
111
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: streamlit-coco
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Streamlit component and Python library for Snowflake CoCo (Cortex Code)
|
|
5
5
|
Project-URL: Homepage, https://github.com/lletourmy/streamlit-coco
|
|
6
6
|
Project-URL: Documentation, https://github.com/lletourmy/streamlit-coco#readme
|
|
@@ -22,53 +22,65 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Requires-Dist: streamlit>=1.55
|
|
24
24
|
Provides-Extra: dev
|
|
25
|
-
Requires-Dist: cortex-code-agent-sdk>=1.0.7; extra == 'dev'
|
|
26
25
|
Requires-Dist: pbixray>=0.15.4; extra == 'dev'
|
|
27
26
|
Requires-Dist: pip-audit>=2.7; extra == 'dev'
|
|
28
27
|
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
29
28
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
30
29
|
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
30
|
+
Requires-Dist: snowflake-cortex-agent-sdk<0.1,>=0.0.3; extra == 'dev'
|
|
31
31
|
Provides-Extra: e2e
|
|
32
|
-
Requires-Dist: cortex-code-agent-sdk>=1.0.7; extra == 'e2e'
|
|
33
32
|
Requires-Dist: pbixray>=0.15.4; extra == 'e2e'
|
|
34
33
|
Requires-Dist: pip-audit>=2.7; extra == 'e2e'
|
|
35
34
|
Requires-Dist: pytest-asyncio>=0.24; extra == 'e2e'
|
|
36
35
|
Requires-Dist: pytest-playwright>=0.6; extra == 'e2e'
|
|
37
36
|
Requires-Dist: pytest>=8.0; extra == 'e2e'
|
|
38
37
|
Requires-Dist: ruff>=0.8; extra == 'e2e'
|
|
38
|
+
Requires-Dist: snowflake-cortex-agent-sdk<0.1,>=0.0.3; extra == 'e2e'
|
|
39
39
|
Provides-Extra: sdk
|
|
40
|
-
Requires-Dist: cortex-
|
|
40
|
+
Requires-Dist: snowflake-cortex-agent-sdk<0.1,>=0.0.3; extra == 'sdk'
|
|
41
41
|
Description-Content-Type: text/markdown
|
|
42
42
|
|
|
43
43
|
# streamlit-coco
|
|
44
44
|
|
|
45
|
-
**Built by Devoteam Snowflake Partner.** Ask CoCo for Streamlit: a floating chat window, in front of a
|
|
45
|
+
**Built by Devoteam Snowflake Partner.** Ask CoCo for Streamlit: a floating chat window, in front of a Snowflake coding agent, that you add to your own application with one call. You say what the agent may do alone and what it must ask first. The window shows each request in plain words, with the exact command, file text or SQL statement one click away, and every decision can be written to an audit log.
|
|
46
46
|
|
|
47
47
|
[](https://github.com/lletourmy/streamlit-coco/actions/workflows/ci.yml)
|
|
48
48
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
49
49
|
|
|
50
|
-
> `0.
|
|
50
|
+
> `0.3.0` (alpha, the API may still move). The default interface is still the 0.1.9 chat family (`chat`, `panel`, `copilot_rail`); the floating window is opt-in (`mini=True` on those calls, or `ask_coco(cwd)`). **New and experimental:** Snowflake's managed coding agent runs in the same window with no `cortex` program, files attached in the window go to the sandbox, and `AuditLog` records who allowed what. The managed agent rests on a public-preview SDK (`snowflake-cortex-agent-sdk` 0.0.x). Details: [`doc/features/ask-coco/ask-coco.md`](doc/features/ask-coco/ask-coco.md).
|
|
51
51
|
|
|
52
52
|
**Repo:** [github.com/lletourmy/streamlit-coco](https://github.com/lletourmy/streamlit-coco) *(temporary PyPI source)* · **Dev:** [streamlit-coco-dev](https://github.com/DevoteamSP/streamlit-coco-dev)
|
|
53
|
-
**SDK docs:** [Cortex Code Agent SDK](https://docs.snowflake.com/en/user-guide/cortex-code-agent-sdk/cortex-code-agent-sdk)
|
|
53
|
+
**SDK docs:** [Cortex Agent SDK](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agent-sdk/cortex-agent-sdk) · [Cortex Code Agent SDK](https://docs.snowflake.com/en/user-guide/cortex-code-agent-sdk/cortex-code-agent-sdk)
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
57
57
|
## What you get
|
|
58
58
|
|
|
59
59
|
- A launcher at the bottom right of the page, and a window that opens from it. The window is the whole interface: connect, ask, watch the steps, answer requests.
|
|
60
|
-
- Rights written as code
|
|
60
|
+
- **Rights written as code**, in one object (a `Policy`). The default is the safest: reading inside the working folder is free, everything else asks, each time.
|
|
61
61
|
- Every request names what it is about and shows the exact text of what would run.
|
|
62
|
+
- **Two real agents behind the same window**, the same policy and the same Allow and Decline: the Cortex Code program on the server, or Snowflake's managed coding agent in a Snowflake sandbox (experimental).
|
|
63
|
+
- An **audit log**: one JSON line per decision, with who, when and the exact command shown.
|
|
62
64
|
- Buttons of your own page can ask CoCo something in the user's name, and read the answer back.
|
|
63
65
|
- A scripted agent (`STREAMLIT_COCO_AGENT=mock`) so you can build and test with no Snowflake login.
|
|
64
66
|
- Headless `query()` and `CocoSession` for scripts and CI.
|
|
65
67
|
|
|
68
|
+
## Which agent
|
|
69
|
+
|
|
70
|
+
| | Cortex Code program | Managed agent (experimental) | Scripted |
|
|
71
|
+
| --- | --- | --- | --- |
|
|
72
|
+
| Runs | on the Streamlit server, in your working folder | in a Snowflake sandbox | in the page's process |
|
|
73
|
+
| Needs | the `cortex` program on the `PATH`, a Snowflake profile | a Snowflake profile and a role (or a token), outbound HTTPS to the account | nothing |
|
|
74
|
+
| Files it sees | the working folder | what you mount (workspace, stage) and what the user attaches, before the first message | none |
|
|
75
|
+
| Rights | the policy judges every call | the policy judges every call the server asks about; the role of the session is the limit | the policy shows and asks, nothing runs |
|
|
76
|
+
| Use | `ask_coco(".")` | `ask_coco(".", agent=managed_agent(options))` | `STREAMLIT_COCO_AGENT=mock` |
|
|
77
|
+
|
|
66
78
|
## When not to use
|
|
67
79
|
|
|
68
80
|
- **You want CoCo Desktop, the CLI, or an IDE extension.** This is an embed in your Streamlit application. It has no file tree and no editor.
|
|
69
|
-
- **The Streamlit host
|
|
70
|
-
- **You are not building in Python and Streamlit.** There is no TypeScript package. Use the [Cortex
|
|
71
|
-
- **You would not type the SQL yourself on this role.** The agent uses the Snowflake role of the connection. Do not wire `ACCOUNTADMIN` into a web page.
|
|
81
|
+
- **The Streamlit host can run neither agent.** The Cortex Code program needs a host that can run it; the managed agent needs outbound HTTPS to your Snowflake account and a login. Streamlit Community Cloud without one of those will not work. (Streamlit in Snowflake is planned, not shipped.)
|
|
82
|
+
- **You are not building in Python and Streamlit.** There is no TypeScript package. Use the [Cortex Agent SDK](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agent-sdk/cortex-agent-sdk) directly.
|
|
83
|
+
- **You would not type the SQL yourself on this role.** The agent uses the Snowflake role of the connection. Do not wire `ACCOUNTADMIN` into a web page: give it the least role that works ([threat model, section 8](doc/security/threat-model.md)).
|
|
72
84
|
|
|
73
85
|
---
|
|
74
86
|
|
|
@@ -84,8 +96,9 @@ From a clone (editable, with the tests): `make install`.
|
|
|
84
96
|
Needs:
|
|
85
97
|
|
|
86
98
|
1. Python 3.10 or later, Streamlit 1.55 or later.
|
|
87
|
-
2. For
|
|
88
|
-
3. For
|
|
99
|
+
2. For the Cortex Code agent: the Cortex Code program on the `PATH` (`cortex --version`), a Snowflake connection (`~/.snowflake/connections.toml` or `config.toml`), and `snowflake-cortex-agent-sdk` (the `sdk` extra, pinned `>=0.0.3,<0.1`). The window says what is missing and how to fix it.
|
|
100
|
+
3. For the managed agent: no `cortex` program; a profile and a role to log in with, and the same `sdk` extra. See [The managed agent](#the-managed-agent-experimental).
|
|
101
|
+
4. For a scripted agent: nothing more. See below.
|
|
89
102
|
|
|
90
103
|
Full local setup: [`doc/deployment/local.md`](doc/deployment/local.md). Every public name: [`doc/api.md`](doc/api.md).
|
|
91
104
|
|
|
@@ -167,24 +180,65 @@ Connect, then type these words. The scripted agent picks its script from a keywo
|
|
|
167
180
|
| `edit` | A request to change a file: **Allow CoCo to change a file?** It says `README.md`, one line. **Show change** opens the text. |
|
|
168
181
|
| `snowflake drop` | A request to run a statement that can change Snowflake. It says `DROP`. **Show statement** opens `drop table DEMO.PUBLIC.OLD_CALLS`. |
|
|
169
182
|
|
|
170
|
-
If you type while a request waits, the message is queued behind it ("Queued", with **Take back**) and is sent after Allow or Decline.
|
|
183
|
+
If you type while a request waits, the message is queued behind it ("Queued", with **Take back**) and is sent after Allow or Decline. Nothing runs until the user presses **Allow**; **Decline** ends the call. The scripted agent never runs the command or reaches Snowflake: it only shows and asks. With a real agent the same policy decides, and **Allow** runs the call.
|
|
171
184
|
|
|
172
|
-
|
|
185
|
+
What each argument did:
|
|
173
186
|
|
|
174
|
-
|
|
187
|
+
- `commands=[status]`: a call whose command is exactly this line is a read, named "Look at what has changed". Any other command asks as a change, with its whole line.
|
|
188
|
+
- `changes="*.md"`: a change to a Markdown file is ordinary. A change to any other file asks too, and says it is unusual. Try `changes="docs/*.md"` and the `edit` request is flagged: "outside what it usually changes", with the full path.
|
|
189
|
+
- `sql=True`: a SQL call shows its exact statement. A statement that surely only reads is a query. Anything else is a statement that can change Snowflake.
|
|
175
190
|
|
|
176
|
-
|
|
177
|
-
- `edit` changes the first Markdown file of the folder, and `write` creates `coco_note.md`. A rule about other file types shows only as "not ordinary", on those two files.
|
|
191
|
+
The scripted agent makes only its own fixed calls (`git status --short`, an edit of the first Markdown file, `coco_note.md`), so it cannot try every rule you write. More switches (`standing`, `lookups`, `also_read`, `git_readonly`) are in [`doc/api.md`](doc/api.md). A runnable version with a standing permission is `examples/approval_gate.py`.
|
|
178
192
|
|
|
179
|
-
|
|
193
|
+
---
|
|
180
194
|
|
|
181
|
-
|
|
195
|
+
## The managed agent (experimental)
|
|
182
196
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
197
|
+
Snowflake's managed coding agent, through the Cortex Agent SDK. It runs in a Snowflake sandbox: no `cortex` program, no working folder. It takes the same window, the same policy and the same Allow and Decline.
|
|
198
|
+
|
|
199
|
+
```python
|
|
200
|
+
import streamlit as st
|
|
186
201
|
|
|
187
|
-
|
|
202
|
+
import streamlit_coco as st_coco
|
|
203
|
+
from streamlit_coco.policy import FolderPolicy
|
|
204
|
+
|
|
205
|
+
# Logs in with the connector: do it once per session, never on every rerun.
|
|
206
|
+
if "managed" not in st.session_state:
|
|
207
|
+
st.session_state.managed = st_coco.options_from_connection(
|
|
208
|
+
"my_profile", # a profile of ~/.snowflake
|
|
209
|
+
role="PUBLIC", # the agent works with this role's rights: the least that works
|
|
210
|
+
)
|
|
211
|
+
options = st.session_state.managed
|
|
212
|
+
|
|
213
|
+
st_coco.ask_coco(
|
|
214
|
+
".",
|
|
215
|
+
agent=st_coco.managed_agent(options),
|
|
216
|
+
connection=options.label,
|
|
217
|
+
policy=FolderPolicy(".", words=st_coco.SANDBOX_WORDS, where=st_coco.SANDBOX_WHERE),
|
|
218
|
+
)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
`make managed` runs a complete example (profile and role form, then the window).
|
|
222
|
+
|
|
223
|
+
- **Always asks.** The run is created with `permission_policy="always_ask"`; it is not an option. Only the user's Allow becomes the server's one-call "Allow this command". The server's own "Allow all bash for this session" is never chosen.
|
|
224
|
+
- **The server decides what it asks about.** A command it rates risky pauses the run and reaches your policy; one it rates harmless (`echo hello`) runs unasked. The role of the session, not the window, is the real limit: give it the least rights that work.
|
|
225
|
+
- **No local folder.** `cwd` is only the policy's and is never sent. The agent works on what you mount (`workspace_mounts`, `stage_mounts`, `stage_skills`) and on what the user attaches.
|
|
226
|
+
- **Attach a file.** `Features(attachments=st_coco.Attachments())` with `options_from_connection(..., upload_stage="DB.SCHEMA.STAGE")`: each file goes to a folder of this conversation on that stage, mounted at `/uploads`, and is removed with the conversation. Files go in **before the first message** (the sandbox reads the stage once); a later one is refused with a sentence that says so.
|
|
227
|
+
- **Probe without the program:** `check_environment(managed=True)`.
|
|
228
|
+
- **Not available:** the agent's own questions and plans (Cortex Code's tools), planning only.
|
|
229
|
+
|
|
230
|
+
Skills on a stage and a chat with one chosen skill: `make skills-hub`, and the same as a Snowflake Native App on Snowpark Container Services: [`examples/skills_hub_native/`](examples/skills_hub_native/DEPLOY.md), which also holds a prompt for Cortex Code that asks for your parameters and deploys it ([`COCO_PROMPT.md`](examples/skills_hub_native/COCO_PROMPT.md)).
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Who allowed what: the audit log
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
audit = st_coco.AuditLog("logs/coco-audit.jsonl", who=lambda: st.user.get("email"))
|
|
238
|
+
st_coco.ask_coco(".", audit=audit)
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
One line per call that asked the user, was covered by a standing permission, or was refused: `time`, `who`, `agent`, `tool`, `decision` (`allowed`, `declined`, `expired`, `refused`, `standing`, `revoked`) and the exact command, SQL or path the user was shown, with what looks like a credential replaced by `[redacted]` (`AuditLog(redact=...)` to change it, `None` to turn it off; a secret that looks like nothing, such as a plain `-p hunter2`, is **not** caught). A second line, `decision: "outcome"`, says whether an allowed call `succeeded`, `failed`, was `not_run` or got `no_result`. Reads inside the working folder that run without a question are not logged. The file is readable by its owner only; it is not tamper-proof (ship it to storage the app cannot rewrite if that matters). The library cannot know who answers: give `who`. See [`doc/api.md`](doc/api.md#the-audit-log).
|
|
188
242
|
|
|
189
243
|
---
|
|
190
244
|
|
|
@@ -216,7 +270,7 @@ if done:
|
|
|
216
270
|
| `coco.open()`, `coco.new()`, `coco.disconnect()` | Open the window, end the conversation, end the session. |
|
|
217
271
|
| `coco.latest_answer` | The text of the latest answer, for a page that shows it elsewhere. |
|
|
218
272
|
|
|
219
|
-
Other arguments of `ask_coco`: `features` (what the window offers), `context` (what your page knows when a message is sent), `labels` (every sentence, to translate), `theme` (colours, font), `options` (model, connection, structured output), `on_files_changed
|
|
273
|
+
Other arguments of `ask_coco`: `features` (what the window offers: attachments, display switches, window places), `context` (what your page knows when a message is sent), `labels` (every sentence, to translate), `theme` (colours, font), `options` (model, connection, structured output), `agent`, `audit`, `on_files_changed`, `on_layout` and `split` (the page makes room when the window is attached to an edge). All of them are in [`doc/api.md`](doc/api.md).
|
|
220
274
|
|
|
221
275
|
---
|
|
222
276
|
|
|
@@ -229,6 +283,8 @@ make approval # a listed command, a file rule, SQL, a standing permission
|
|
|
229
283
|
make structured # a result handed to the page as data
|
|
230
284
|
make cwd-upload # files attached in chat, and an uploader on the page
|
|
231
285
|
make headless # asyncio query() and a Conversation answered in code
|
|
286
|
+
make managed # the managed agent: profile and role, then the window (experimental)
|
|
287
|
+
make skills-hub # skills on a stage, a chat with one chosen skill (experimental)
|
|
232
288
|
make backlog # Product Backlog Desk: a multipage application
|
|
233
289
|
make bi-semantic # Tableau / Power BI to semantic view
|
|
234
290
|
make app-builder # App Builder: type library, brief, Preview
|
|
@@ -236,30 +292,33 @@ make app-builder # App Builder: type library, brief, Preview
|
|
|
236
292
|
|
|
237
293
|
Each Streamlit demo has an **Ask CoCo** control (Off / On) in the sidebar. Off keeps that page's chat, panel, or Copilot rail. On leaves Ask CoCo minimized until **Minimize** on that CoCo, which hides it and opens the window. **Restore** in the window closes it and brings the rail or chat back.
|
|
238
294
|
|
|
239
|
-
To run
|
|
295
|
+
To run them with no login: `STREAMLIT_COCO_AGENT=mock make simple-chat` (PowerShell: set `$env:STREAMLIT_COCO_AGENT` first); `make skills-hub` shows its sample skills on a scripted chat. `make chat` still launches the simple demo.
|
|
240
296
|
|
|
241
297
|
Exploratory prompts: [`examples/testdata/prompts.json`](examples/testdata/prompts.json).
|
|
242
|
-
Backlog Desk: [`examples/backlog_desk/README.md`](examples/backlog_desk/README.md) · BI to Semantic: [`examples/bi_to_semantic/README.md`](examples/bi_to_semantic/README.md) · App Builder: [`examples/app_builder/README.md`](examples/app_builder/README.md).
|
|
298
|
+
Backlog Desk: [`examples/backlog_desk/README.md`](examples/backlog_desk/README.md) · BI to Semantic: [`examples/bi_to_semantic/README.md`](examples/bi_to_semantic/README.md) · App Builder: [`examples/app_builder/README.md`](examples/app_builder/README.md) · Skills shop: [`examples/skills_hub/README.md`](examples/skills_hub/README.md) · Skills shop as a Native App: [`examples/skills_hub_native/DEPLOY.md`](examples/skills_hub_native/DEPLOY.md).
|
|
243
299
|
|
|
244
300
|
---
|
|
245
301
|
|
|
246
302
|
## Architecture
|
|
247
303
|
|
|
248
|
-
The agent is
|
|
304
|
+
The agent is not in the browser. The browser sees one Streamlit component.
|
|
249
305
|
|
|
250
306
|
```text
|
|
251
307
|
Browser ──► Ask CoCo window (one component, in a fragment)
|
|
252
308
|
│ one action at a time; the page does not rerun
|
|
253
309
|
▼
|
|
254
310
|
Conversation (thread, steps, requests, queue: plain data)
|
|
255
|
-
│ every
|
|
311
|
+
│ every call the agent asks about reaches the Gate
|
|
256
312
|
▼
|
|
257
|
-
Gate + Policy (free, asks, or refused; waits for Allow / Decline)
|
|
313
|
+
Gate + Policy (free, asks, or refused; waits for Allow / Decline; writes the audit log)
|
|
258
314
|
▼
|
|
259
|
-
|
|
315
|
+
an agent (backend.py: one surface, three agents)
|
|
316
|
+
├── Cortex adapter ──► Cortex Agent SDK (cortexcode) ──► Cortex Code program ──► Snowflake
|
|
317
|
+
├── Managed agent ──► Cortex Agent SDK ──► Snowflake's coding agent (sandbox)
|
|
318
|
+
└── Scripted agent (tests, demos, no login)
|
|
260
319
|
```
|
|
261
320
|
|
|
262
|
-
|
|
321
|
+
All three go through the same Conversation, Policy and Gate. Only the model and the programs are replaced.
|
|
263
322
|
|
|
264
323
|
```text
|
|
265
324
|
streamlit_coco/
|
|
@@ -267,10 +326,13 @@ streamlit_coco/
|
|
|
267
326
|
├── conversation.py # the contract between the window and the agent (read its docstring)
|
|
268
327
|
├── policy.py # Policy, FolderPolicy, Command, git_readonly, request, inside
|
|
269
328
|
├── gate.py # the decision that waits for Allow / Decline
|
|
329
|
+
├── audit.py # AuditLog
|
|
330
|
+
├── backend.py # AgentBackend: what an agent is
|
|
331
|
+
├── cortex.py # the Cortex Code adapter
|
|
332
|
+
├── managed.py # the managed agent: ManagedOptions, managed_agent, options_from_connection
|
|
270
333
|
├── features.py # Features, Attachments
|
|
271
334
|
├── labels.py # every sentence of the window, by key
|
|
272
|
-
├──
|
|
273
|
-
├── testing/ # scripted agent, fixtures, harness
|
|
335
|
+
├── testing/ # scripted agent, scripted client of the managed agent, fixtures, harness
|
|
274
336
|
├── static/ # the window's script, styles and font
|
|
275
337
|
├── session.py # CocoSession (headless)
|
|
276
338
|
├── query.py # query() (headless)
|
|
@@ -298,6 +360,8 @@ async def run():
|
|
|
298
360
|
asyncio.run(run())
|
|
299
361
|
```
|
|
300
362
|
|
|
363
|
+
`query()` and `CocoSession` use the Cortex Code program.
|
|
364
|
+
|
|
301
365
|
---
|
|
302
366
|
|
|
303
367
|
## Development
|
|
@@ -306,18 +370,18 @@ asyncio.run(run())
|
|
|
306
370
|
make install # uv sync --extra dev
|
|
307
371
|
make check # ruff and the unit tests (not the browser tests)
|
|
308
372
|
make e2e-install # Playwright and Chromium, once
|
|
309
|
-
make e2e # browser tests of the window, on the scripted agent
|
|
373
|
+
make e2e # browser tests of the window, on the scripted agent and a scripted managed client
|
|
310
374
|
make test-all # check, e2e and the dependency audit
|
|
311
375
|
make format # ruff format and fix
|
|
312
376
|
make build # sdist and wheel
|
|
313
377
|
make help # every target
|
|
314
378
|
```
|
|
315
379
|
|
|
316
|
-
`make e2e` uses the installed Edge when Playwright's Chromium is not installed. No test calls a live agent. Process: [`doc/testing.md`](doc/testing.md). Live checks before a release: [`doc/features/ask-coco/test-checklist.md`](doc/features/ask-coco/test-checklist.md).
|
|
380
|
+
`make e2e` uses the installed Edge when Playwright's Chromium is not installed. No automated test calls a live agent. Process: [`doc/testing.md`](doc/testing.md). Live checks before a release (Cortex Code and the managed agent): [`doc/features/ask-coco/test-checklist.md`](doc/features/ask-coco/test-checklist.md).
|
|
317
381
|
|
|
318
382
|
Releases: develop here, sync and tag on [`lletourmy/streamlit-coco`](https://github.com/lletourmy/streamlit-coco) for PyPI ([guide](doc/deployment/publish.md)).
|
|
319
383
|
|
|
320
|
-
**Docs:** [API](doc/api.md) · [Ask CoCo feature file](doc/features/ask-coco/ask-coco.md) · [PRD](doc/prd.md) · [Roadmap](doc/roadmap.md) · [Deployment](doc/deployment/) · [Changelog](CHANGELOG.md) · [AGENTS.md](AGENTS.md)
|
|
384
|
+
**Docs:** [API](doc/api.md) · [Ask CoCo feature file](doc/features/ask-coco/ask-coco.md) · [PRD](doc/prd.md) · [Roadmap](doc/roadmap.md) · [Threat model](doc/security/threat-model.md) · [Deployment](doc/deployment/) · [Changelog](CHANGELOG.md) · [AGENTS.md](AGENTS.md)
|
|
321
385
|
|
|
322
386
|
---
|
|
323
387
|
|