procesio-cli 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- procesio_cli/__init__.py +18 -0
- procesio_cli/_cli.py +71 -0
- procesio_cli/agents/__init__.py +0 -0
- procesio_cli/agents/_lib/__init__.py +0 -0
- procesio_cli/agents/_lib/actiondef.py +24 -0
- procesio_cli/agents/_lib/errors.py +40 -0
- procesio_cli/agents/_lib/reversibility.py +236 -0
- procesio_cli/agents/_lib/toolrunner.py +141 -0
- procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PLAYBOOK.md +62 -0
- procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PROCESIO-INTEROP.md +76 -0
- procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-TROUBLESHOOTING.md +60 -0
- procesio_cli/agents/connector-builder/README.md +51 -0
- procesio_cli/agents/connector-builder/agent.yaml +61 -0
- procesio_cli/agents/connector-builder/context.py +19 -0
- procesio_cli/agents/connector-builder/handlers/__init__.py +1 -0
- procesio_cli/agents/connector-builder/handlers/checklist.py +71 -0
- procesio_cli/agents/connector-builder/handlers/guidance.py +37 -0
- procesio_cli/agents/connector-builder/handlers/nextstep.py +221 -0
- procesio_cli/agents/connector-builder/handlers/status.py +35 -0
- procesio_cli/agents/connector-builder/knowledge.py +47 -0
- procesio_cli/agents/connector-builder/main.py +93 -0
- procesio_cli/agents/connector-builder/tests/conftest.py +95 -0
- procesio_cli/agents/connector-builder/tests/test_cba_agent.py +148 -0
- procesio_cli/agents/orchestrator/__init__.py +0 -0
- procesio_cli/agents/orchestrator/bootstraplib.py +166 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/00-INDEX.md +60 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/01-PROCESSES.md +230 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/02-FORMS.md +287 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/03-INTEGRATIONS.md +384 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/04-DATABASE.md +293 -0
- procesio_cli/agents/procesio/PROCESIO-API-RELIABILITY-DOCTRINE.md +113 -0
- procesio_cli/agents/procesio/PROCESIO-BEST-PRACTICES.md +316 -0
- procesio_cli/agents/procesio/PROCESIO-BUILD-AND-TEST-PLAYBOOK.md +217 -0
- procesio_cli/agents/procesio/PROCESIO-DATASTORE.md +72 -0
- procesio_cli/agents/procesio/PROCESIO-ENVIRONMENTS.md +62 -0
- procesio_cli/agents/procesio/PROCESIO-SCHEDULING.md +47 -0
- procesio_cli/agents/procesio/PROCESIO-VISUAL-ORGANIZATION.md +175 -0
- procesio_cli/agents/procesio/README.md +97 -0
- procesio_cli/agents/procesio/__init__.py +0 -0
- procesio_cli/agents/procesio/agent.yaml +73 -0
- procesio_cli/agents/procesio/audit.py +226 -0
- procesio_cli/agents/procesio/checklist.py +135 -0
- procesio_cli/agents/procesio/context.py +19 -0
- procesio_cli/agents/procesio/handlers/__init__.py +0 -0
- procesio_cli/agents/procesio/handlers/audit.py +39 -0
- procesio_cli/agents/procesio/handlers/checklist.py +34 -0
- procesio_cli/agents/procesio/handlers/guidance.py +36 -0
- procesio_cli/agents/procesio/handlers/status.py +33 -0
- procesio_cli/agents/procesio/handlers/verify.py +39 -0
- procesio_cli/agents/procesio/knowledge.py +115 -0
- procesio_cli/agents/procesio/main.py +89 -0
- procesio_cli/agents/procesio/tests/__init__.py +0 -0
- procesio_cli/agents/procesio/tests/conftest.py +62 -0
- procesio_cli/agents/procesio/tests/test_audit.py +91 -0
- procesio_cli/agents/procesio/tests/test_checklist.py +28 -0
- procesio_cli/agents/procesio/tests/test_guidance.py +78 -0
- procesio_cli/agents/procesio/tests/test_manifest_sync.py +48 -0
- procesio_cli/agents/procesio/tests/test_verify.py +134 -0
- procesio_cli/agents/procesio/tests/test_workspace_scope.py +97 -0
- procesio_cli/agents/procesio/verifylib.py +222 -0
- procesio_cli/dashboard/README.md +117 -0
- procesio_cli/dashboard/__init__.py +18 -0
- procesio_cli/dashboard/serve.py +98 -0
- procesio_cli/dashboard/server/__init__.py +1 -0
- procesio_cli/dashboard/server/config_schemas.py +92 -0
- procesio_cli/dashboard/server/google.py +103 -0
- procesio_cli/dashboard/server/handler.py +160 -0
- procesio_cli/dashboard/server/inventory.py +213 -0
- procesio_cli/dashboard/server/jobs.py +118 -0
- procesio_cli/dashboard/server/llmtest.py +181 -0
- procesio_cli/dashboard/server/procesio_env.py +94 -0
- procesio_cli/dashboard/server/routes.py +74 -0
- procesio_cli/dashboard/server/runner.py +150 -0
- procesio_cli/dashboard/server/security.py +29 -0
- procesio_cli/dashboard/server/setup.py +211 -0
- procesio_cli/dashboard/server/validate.py +152 -0
- procesio_cli/dashboard/tests/conftest.py +16 -0
- procesio_cli/dashboard/tests/test_dashboard.py +225 -0
- procesio_cli/dashboard/tests/test_procesio_env.py +159 -0
- procesio_cli/dashboard/web/actions.js +274 -0
- procesio_cli/dashboard/web/api.js +79 -0
- procesio_cli/dashboard/web/app.js +385 -0
- procesio_cli/dashboard/web/copilot.js +72 -0
- procesio_cli/dashboard/web/google.js +121 -0
- procesio_cli/dashboard/web/index.html +67 -0
- procesio_cli/dashboard/web/procesio_env.js +187 -0
- procesio_cli/dashboard/web/styles.css +207 -0
- procesio_cli/registry.py +370 -0
- procesio_cli/scripts/build-router.py +249 -0
- procesio_cli/scripts/build-tool-skill.py +202 -0
- procesio_cli/scripts/check-requirements.py +131 -0
- procesio_cli/scripts/check-skill-governance.py +174 -0
- procesio_cli/scripts/evaluate-skill-routing.py +217 -0
- procesio_cli/scripts/evaluate-skills.py +316 -0
- procesio_cli/scripts/get-skill.py +122 -0
- procesio_cli/scripts/list-skills.py +68 -0
- procesio_cli/scripts/list-tools.py +73 -0
- procesio_cli/scripts/run-agent.py +59 -0
- procesio_cli/scripts/run-tool.py +123 -0
- procesio_cli/scripts/secret_scan.py +584 -0
- procesio_cli/scripts/set-credential.py +126 -0
- procesio_cli/scripts/validate-skills.py +530 -0
- procesio_cli/skills/PORTFOLIO.md +134 -0
- procesio_cli/skills/__init__.py +6 -0
- procesio_cli/skills/agent-skill-engineer/SKILL.md +226 -0
- procesio_cli/skills/agent-skill-engineer/evals/evals.json +422 -0
- procesio_cli/skills/agent-skill-engineer/references/authoring-standard.md +178 -0
- procesio_cli/skills/agent-skill-engineer/references/decision-framework.md +107 -0
- procesio_cli/skills/agent-skill-engineer/references/domain-evidence-protocol.md +248 -0
- procesio_cli/skills/agent-skill-engineer/references/evaluation-standard.md +191 -0
- procesio_cli/skills/agent-skill-engineer/references/expert-lenses.md +167 -0
- procesio_cli/skills/agent-skill-engineer/references/field-gate-standard.md +231 -0
- procesio_cli/skills/agent-skill-engineer/references/optimization-protocol.md +233 -0
- procesio_cli/skills/agent-skill-engineer/references/optimizer-contract.md +268 -0
- procesio_cli/skills/agent-skill-engineer/references/portability-standard.md +99 -0
- procesio_cli/skills/agent-skill-engineer/references/research-basis.md +128 -0
- procesio_cli/skills/agent-skill-engineer/references/review-standard.md +143 -0
- procesio_cli/skills/agent-skill-engineer/scripts/audit_skill.py +959 -0
- procesio_cli/skills/agent-skill-engineer/scripts/optimize_skill.py +891 -0
- procesio_cli/skills/agent-skill-engineer/scripts/scaffold_skill.py +397 -0
- procesio_cli/skills/evals/baseline-catalog.json +14 -0
- procesio_cli/skills/evals/baseline-routing-v2.json +38 -0
- procesio_cli/skills/evals/baseline.json +37 -0
- procesio_cli/skills/evals/behavioral.json +367 -0
- procesio_cli/skills/evals/field-boundary-development-v1.json +126 -0
- procesio_cli/skills/evals/field-closeout-correction-development-v1.json +23 -0
- procesio_cli/skills/evals/field-closeout-development-v1.json +89 -0
- procesio_cli/skills/evals/portfolio-pressure-training-v1.json +83 -0
- procesio_cli/skills/evals/routing.json +363 -0
- procesio_cli/skills/evals/validation-baseline.json +4 -0
- procesio_cli/skills/procesio-cli/SKILL.md +134 -0
- procesio_cli/skills/procesio-cli/evals/evals.json +111 -0
- procesio_cli/skills/procesio-cli/evals/workflows.json +16 -0
- procesio_cli/skills/procesio-cli/references/connector-lifecycle.md +47 -0
- procesio_cli/skills/procesio-cli/references/credentials-admin.md +113 -0
- procesio_cli/skills/procesio-cli/references/data-verification.md +71 -0
- procesio_cli/skills/procesio-cli/references/documents-files.md +44 -0
- procesio_cli/skills/procesio-cli/references/form-e2e.md +57 -0
- procesio_cli/skills/procesio-cli/references/operation-contract.md +138 -0
- procesio_cli/skills/procesio-cli/references/process-debugging.md +65 -0
- procesio_cli/skills/procesio-cli/references/process-lifecycle.md +88 -0
- procesio_cli/skills/procesio-cli/references/schedules-webhooks.md +58 -0
- procesio_cli/skills/procesio-cli/references/transport-environments.md +53 -0
- procesio_cli/skills/procesio-cli-maintainer/SKILL.md +84 -0
- procesio_cli/skills/procesio-cli-maintainer/evals/evals.json +116 -0
- procesio_cli/skills/procesio-cli-maintainer/references/change-contract.md +34 -0
- procesio_cli/skills/procesio-cli-maintainer/references/mcp-compatibility.md +13 -0
- procesio_cli/skills/procesio-cli-maintainer/references/skill-authoring.md +51 -0
- procesio_cli/skills/procesio-platform-advisor/SKILL.md +82 -0
- procesio_cli/skills/procesio-platform-advisor/evals/evals.json +116 -0
- procesio_cli/skills/procesio-platform-advisor/references/capability-map.md +22 -0
- procesio_cli/skills/procesio-platform-advisor/references/fit-framework.md +35 -0
- procesio_cli/skills/procesio-platform-advisor/references/freshness-policy.md +25 -0
- procesio_cli/skills/procesio-platform-advisor/references/sizing-method.md +70 -0
- procesio_cli/skills/procesio-platform-advisor/scripts/estimate_capacity.py +99 -0
- procesio_cli/skills/procesio-setup/SKILL.md +180 -0
- procesio_cli/skills/sql-server-optimizer/SKILL.md +86 -0
- procesio_cli/skills/sql-server-optimizer/evals/evals.json +116 -0
- procesio_cli/skills/sql-server-optimizer/references/db-context.md +44 -0
- procesio_cli/skills/sql-server-optimizer/references/generic-mode.md +32 -0
- procesio_cli/skills/sql-server-optimizer/references/procesio-mode.md +40 -0
- procesio_cli/skills/sql-server-optimizer/references/sql-rules.md +43 -0
- procesio_cli/skills/sql-server-optimizer/scripts/export-indexes.sql +178 -0
- procesio_cli/skills/sql-server-optimizer/scripts/export-procs-and-functions.sql +118 -0
- procesio_cli/skills/sql-server-optimizer/scripts/export-tables.sql +367 -0
- procesio_cli/skills/tests/__init__.py +0 -0
- procesio_cli/skills/tests/test_agent_skill_engineer.py +240 -0
- procesio_cli/skills/tests/test_auth_failure_stop.py +25 -0
- procesio_cli/skills/tests/test_capacity_estimator.py +85 -0
- procesio_cli/skills/tests/test_field_boundary_learning.py +100 -0
- procesio_cli/skills/tests/test_field_closeout_learning.py +123 -0
- procesio_cli/skills/tests/test_field_gate_standard.py +76 -0
- procesio_cli/skills/tests/test_operational_playbooks.py +51 -0
- procesio_cli/skills/tests/test_portfolio_pressure_training.py +35 -0
- procesio_cli/skills/tests/test_process_lifecycle_single_run.py +25 -0
- procesio_cli/skills/tests/test_skill_evaluator.py +67 -0
- procesio_cli/skills/tests/test_skill_optimizer.py +473 -0
- procesio_cli/skills/tests/test_skill_portfolio_review.py +70 -0
- procesio_cli/skills/tests/test_skill_release_binding.py +204 -0
- procesio_cli/skills/tests/test_skill_routing.py +74 -0
- procesio_cli/skills/tests/test_skill_scaffold_v2.py +116 -0
- procesio_cli/skills/tests/test_validate_skills.py +115 -0
- procesio_cli/tools/__init__.py +0 -0
- procesio_cli/tools/_lib/README.md +119 -0
- procesio_cli/tools/_lib/__init__.py +0 -0
- procesio_cli/tools/_lib/accounting.py +120 -0
- procesio_cli/tools/_lib/contacts.py +544 -0
- procesio_cli/tools/_lib/creds.py +83 -0
- procesio_cli/tools/_lib/creds_backends.py +578 -0
- procesio_cli/tools/_lib/dbprofiles.py +147 -0
- procesio_cli/tools/_lib/dbquery.py +286 -0
- procesio_cli/tools/_lib/dbschema.py +225 -0
- procesio_cli/tools/_lib/io.py +54 -0
- procesio_cli/tools/_lib/manifest.py +297 -0
- procesio_cli/tools/_lib/skill_release.py +127 -0
- procesio_cli/tools/_lib/skill_resources.py +118 -0
- procesio_cli/tools/_lib/userdata.py +228 -0
- procesio_cli/tools/_lib/webserialize/__init__.py +16 -0
- procesio_cli/tools/_lib/webserialize/admin.py +61 -0
- procesio_cli/tools/_lib/webserialize/client.py +264 -0
- procesio_cli/tools/_lib/webserialize/config.py +96 -0
- procesio_cli/tools/_lib/webserialize/errors.py +27 -0
- procesio_cli/tools/_lib/webserialize/framing.py +45 -0
- procesio_cli/tools/_lib/webserialize/registry.py +47 -0
- procesio_cli/tools/_lib/webserialize/runtime.py +61 -0
- procesio_cli/tools/_lib/webserialize/server.py +510 -0
- procesio_cli/tools/_lib/websession.py +194 -0
- procesio_cli/tools/connector-builder/CONNECTOR-BUILDER-API-NOTES.md +91 -0
- procesio_cli/tools/connector-builder/README.md +101 -0
- procesio_cli/tools/connector-builder/SKILL.md +248 -0
- procesio_cli/tools/connector-builder/__init__.py +7 -0
- procesio_cli/tools/connector-builder/actiondef.py +24 -0
- procesio_cli/tools/connector-builder/client.py +251 -0
- procesio_cli/tools/connector-builder/errors.py +44 -0
- procesio_cli/tools/connector-builder/gen_manifest.py +142 -0
- procesio_cli/tools/connector-builder/handlers/__init__.py +1 -0
- procesio_cli/tools/connector-builder/handlers/admin.py +182 -0
- procesio_cli/tools/connector-builder/handlers/auth.py +74 -0
- procesio_cli/tools/connector-builder/handlers/builds.py +396 -0
- procesio_cli/tools/connector-builder/handlers/common.py +104 -0
- procesio_cli/tools/connector-builder/handlers/files.py +111 -0
- procesio_cli/tools/connector-builder/handlers/raw.py +38 -0
- procesio_cli/tools/connector-builder/handlers/telemetry.py +39 -0
- procesio_cli/tools/connector-builder/main.py +94 -0
- procesio_cli/tools/connector-builder/tests/conftest.py +146 -0
- procesio_cli/tools/connector-builder/tests/test_cb_client.py +86 -0
- procesio_cli/tools/connector-builder/tests/test_cb_dispatch.py +105 -0
- procesio_cli/tools/connector-builder/tests/test_cb_manifest_sync.py +76 -0
- procesio_cli/tools/connector-builder/tests/test_cb_wait.py +123 -0
- procesio_cli/tools/connector-builder/tool.yaml +671 -0
- procesio_cli/tools/framework-map/.gitattributes +2 -0
- procesio_cli/tools/framework-map/README.md +98 -0
- procesio_cli/tools/framework-map/SKILL.md +30 -0
- procesio_cli/tools/framework-map/app.js +188 -0
- procesio_cli/tools/framework-map/fm_builder.py +476 -0
- procesio_cli/tools/framework-map/fm_catalog.py +19 -0
- procesio_cli/tools/framework-map/fm_ro_catalog.py +94 -0
- procesio_cli/tools/framework-map/fm_strings.py +101 -0
- procesio_cli/tools/framework-map/main.py +95 -0
- procesio_cli/tools/framework-map/styles.css +214 -0
- procesio_cli/tools/framework-map/tests/conftest.py +33 -0
- procesio_cli/tools/framework-map/tests/test_fm_build.py +126 -0
- procesio_cli/tools/framework-map/tests/test_fm_manifest_sync.py +63 -0
- procesio_cli/tools/framework-map/tests/test_fm_store_tree.py +75 -0
- procesio_cli/tools/framework-map/tool.yaml +61 -0
- procesio_cli/tools/mysql/MOVED-TO-CENTRAL.md +29 -0
- procesio_cli/tools/mysql/README.md +196 -0
- procesio_cli/tools/mysql/SKILL.md +37 -0
- procesio_cli/tools/mysql/__init__.py +0 -0
- procesio_cli/tools/mysql/connection.py +191 -0
- procesio_cli/tools/mysql/main.py +487 -0
- procesio_cli/tools/mysql/profiles.template.json +1 -0
- procesio_cli/tools/mysql/schema.py +434 -0
- procesio_cli/tools/mysql/tests/__init__.py +0 -0
- procesio_cli/tools/mysql/tests/conftest.py +21 -0
- procesio_cli/tools/mysql/tests/test_manifest_sync.py +68 -0
- procesio_cli/tools/mysql/tests/test_mysql.py +201 -0
- procesio_cli/tools/mysql/tests/test_mysql_schema.py +337 -0
- procesio_cli/tools/mysql/tool.yaml +112 -0
- procesio_cli/tools/procesio/DTO-SUBTOOLS-NOTE.md +360 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/00-INDEX.md +67 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/01-ANATOMY.md +209 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md +309 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/03-DOM-CONTRACT.md +370 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/04-INTERACTION-RECIPES.md +600 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/05-STEPPER-AND-MOTION.md +426 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/06-PROCESS-INTEGRATION.md +347 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/07-DEPLOY-WORKFLOW.md +294 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/08-PITFALLS.md +569 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/09-NAVIGATION-AND-HOSTING.md +308 -0
- procesio_cli/tools/procesio/PHASE4-E2E-NOTES.md +594 -0
- procesio_cli/tools/procesio/PROCESIO-API-CORRECTIONS.md +295 -0
- procesio_cli/tools/procesio/PROCESIO-API-NOTES.md +6976 -0
- procesio_cli/tools/procesio/PROCESIO-AUTH-NOTES.md +226 -0
- procesio_cli/tools/procesio/PROCESIO-CARD-BUILD-NOTES.md +183 -0
- procesio_cli/tools/procesio/PROCESIO-CONNECTORS-NOTES.md +141 -0
- procesio_cli/tools/procesio/PROCESIO-CUSTOM-ACTION-NOTES.md +179 -0
- procesio_cli/tools/procesio/PROCESIO-DOCS-FIX-REPORT.md +123 -0
- procesio_cli/tools/procesio/PROCESIO-ENVIRONMENTS-NOTES.md +94 -0
- procesio_cli/tools/procesio/PROCESIO-FE-VALIDATION-NOTES.md +107 -0
- procesio_cli/tools/procesio/PROCESIO-FOREACH-NOTES.md +199 -0
- procesio_cli/tools/procesio/PROCESIO-FORM-API-HANG-NOTE.md +101 -0
- procesio_cli/tools/procesio/PROCESIO-FORM-SUBMISSION-NOTES.md +172 -0
- procesio_cli/tools/procesio/PROCESIO-HTML-TO-DOCX-NOTES.md +110 -0
- procesio_cli/tools/procesio/PROCESIO-INSTANCE-HISTORY-NOTES.md +242 -0
- procesio_cli/tools/procesio/PROCESIO-METERING-NOTES.md +201 -0
- procesio_cli/tools/procesio/PROCESIO-NODE-CODE-NOTES.md +279 -0
- procesio_cli/tools/procesio/PROCESIO-NODE-MODULE-WHITELIST.md +113 -0
- procesio_cli/tools/procesio/PROCESIO-PYTHON-ACTION-NOTES.md +165 -0
- procesio_cli/tools/procesio/PROCESIO-QUERY-STORE-NOTES.md +826 -0
- procesio_cli/tools/procesio/PROCESIO-RECONCILIATION-PATTERNS.md +104 -0
- procesio_cli/tools/procesio/PROCESIO-RESOURCE-MODEL-NOTES.md +1100 -0
- procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-CRED-OPTIONALITY.md +45 -0
- procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-NOTES.md +252 -0
- procesio_cli/tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md +284 -0
- procesio_cli/tools/procesio/PROCESIO-USAGE-GUIDE.md +219 -0
- procesio_cli/tools/procesio/README.md +341 -0
- procesio_cli/tools/procesio/SCHEDULE-INPUT-SECURITY-NOTES.md +63 -0
- procesio_cli/tools/procesio/SKILL.md +694 -0
- procesio_cli/tools/procesio/__init__.py +1 -0
- procesio_cli/tools/procesio/actiondef.py +27 -0
- procesio_cli/tools/procesio/assets/html2docx/html2docx.js +2155 -0
- procesio_cli/tools/procesio/auth.py +354 -0
- procesio_cli/tools/procesio/autogen.py +121 -0
- procesio_cli/tools/procesio/client.py +355 -0
- procesio_cli/tools/procesio/config.py +96 -0
- procesio_cli/tools/procesio/data/endpoints.json +2901 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/01-authentication.md +180 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/02-conventions.md +116 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/ANONYMOUS-SURFACE.md +51 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/README.md +104 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/SYMBOL-INDEX.md +444 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/03-auth-users-workspaces.md +731 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/04-processes.md +913 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/05-actions.md +605 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/06-files.md +237 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/07-forms-documents.md +985 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/08-credentials.md +532 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/09-datastore-datatypes.md +830 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/10-custom-urls.md +319 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/11-subscriptions-resources-analytics.md +455 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/12-webhooks-notifications-misc.md +519 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/13-realtime-signalr.md +153 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/99-internal-and-other-services.md +52 -0
- procesio_cli/tools/procesio/docs_info/FormBuilder mock.ts +5725 -0
- procesio_cli/tools/procesio/docs_info/Procesio Platform Actions.json +30219 -0
- procesio_cli/tools/procesio/docs_info/form-config-enums.ts +92 -0
- procesio_cli/tools/procesio/docs_info/form-theme.ts +1603 -0
- procesio_cli/tools/procesio/docs_info/process-validation-reference-1.md +2739 -0
- procesio_cli/tools/procesio/dto/__init__.py +13 -0
- procesio_cli/tools/procesio/dto/credential/builder.py +179 -0
- procesio_cli/tools/procesio/dto/credential/config.schema.json +19 -0
- procesio_cli/tools/procesio/dto/credential/description.md +193 -0
- procesio_cli/tools/procesio/dto/credential/fixtures/rest.config.json +11 -0
- procesio_cli/tools/procesio/dto/credential/fixtures/rest.dto.json +28 -0
- procesio_cli/tools/procesio/dto/credential/fixtures/rest.template.json +44 -0
- procesio_cli/tools/procesio/dto/credential/template.dto.json +16 -0
- procesio_cli/tools/procesio/dto/data/_refresh.py +147 -0
- procesio_cli/tools/procesio/dto/data/action_catalog.json +30825 -0
- procesio_cli/tools/procesio/dto/data/action_families.json +55 -0
- procesio_cli/tools/procesio/dto/data/platform_types.json +182 -0
- procesio_cli/tools/procesio/dto/datatype/builder.py +223 -0
- procesio_cli/tools/procesio/dto/datatype/config.schema.json +47 -0
- procesio_cli/tools/procesio/dto/datatype/description.md +85 -0
- procesio_cli/tools/procesio/dto/datatype/fixtures/customer.config.json +41 -0
- procesio_cli/tools/procesio/dto/datatype/fixtures/customer.dto.json +164 -0
- procesio_cli/tools/procesio/dto/datatype/template.dto.json +37 -0
- procesio_cli/tools/procesio/dto/document/builder.py +193 -0
- procesio_cli/tools/procesio/dto/document/config.schema.json +33 -0
- procesio_cli/tools/procesio/dto/document/description.md +124 -0
- procesio_cli/tools/procesio/dto/document/fixtures/invoice.config.json +16 -0
- procesio_cli/tools/procesio/dto/document/fixtures/invoice.dto.json +32 -0
- procesio_cli/tools/procesio/dto/document/template.dto.json +14 -0
- procesio_cli/tools/procesio/dto/form/FORM-STYLING-NOTES.md +142 -0
- procesio_cli/tools/procesio/dto/form/GOLDEN-DRIFT-NOTES.md +72 -0
- procesio_cli/tools/procesio/dto/form/RUN-PROCESS-RESULT-NOTES.md +80 -0
- procesio_cli/tools/procesio/dto/form/addelement.py +277 -0
- procesio_cli/tools/procesio/dto/form/builder.py +1009 -0
- procesio_cli/tools/procesio/dto/form/capture_goldens.py +106 -0
- procesio_cli/tools/procesio/dto/form/code_cipher.py +67 -0
- procesio_cli/tools/procesio/dto/form/config.schema.json +76 -0
- procesio_cli/tools/procesio/dto/form/data_shell.json +1 -0
- procesio_cli/tools/procesio/dto/form/description.md +346 -0
- procesio_cli/tools/procesio/dto/form/elements/approval.json +259 -0
- procesio_cli/tools/procesio/dto/form/elements/assignee.json +137 -0
- procesio_cli/tools/procesio/dto/form/elements/button.json +125 -0
- procesio_cli/tools/procesio/dto/form/elements/chart.json +341 -0
- procesio_cli/tools/procesio/dto/form/elements/chat.json +199 -0
- procesio_cli/tools/procesio/dto/form/elements/checkbox.json +153 -0
- procesio_cli/tools/procesio/dto/form/elements/column.json +77 -0
- procesio_cli/tools/procesio/dto/form/elements/columns.json +78 -0
- procesio_cli/tools/procesio/dto/form/elements/datetime-input.json +304 -0
- procesio_cli/tools/procesio/dto/form/elements/divider.json +54 -0
- procesio_cli/tools/procesio/dto/form/elements/dropdown.json +130 -0
- procesio_cli/tools/procesio/dto/form/elements/dynamic-table-row.json +253 -0
- procesio_cli/tools/procesio/dto/form/elements/file-upload.json +196 -0
- procesio_cli/tools/procesio/dto/form/elements/file-viewer.json +169 -0
- procesio_cli/tools/procesio/dto/form/elements/heading.json +79 -0
- procesio_cli/tools/procesio/dto/form/elements/icon.json +107 -0
- procesio_cli/tools/procesio/dto/form/elements/image.json +174 -0
- procesio_cli/tools/procesio/dto/form/elements/input.json +206 -0
- procesio_cli/tools/procesio/dto/form/elements/list.json +202 -0
- procesio_cli/tools/procesio/dto/form/elements/number-input.json +202 -0
- procesio_cli/tools/procesio/dto/form/elements/paragraph.json +79 -0
- procesio_cli/tools/procesio/dto/form/elements/radiobox.json +174 -0
- procesio_cli/tools/procesio/dto/form/elements/section.json +114 -0
- procesio_cli/tools/procesio/dto/form/elements/select.json +217 -0
- procesio_cli/tools/procesio/dto/form/elements/side-panel.json +146 -0
- procesio_cli/tools/procesio/dto/form/elements/signature-pad.json +141 -0
- procesio_cli/tools/procesio/dto/form/elements/static-table-row.json +84 -0
- procesio_cli/tools/procesio/dto/form/elements/step.json +105 -0
- procesio_cli/tools/procesio/dto/form/elements/stepper.json +126 -0
- procesio_cli/tools/procesio/dto/form/elements/tab.json +77 -0
- procesio_cli/tools/procesio/dto/form/elements/table.json +279 -0
- procesio_cli/tools/procesio/dto/form/elements/tabs.json +114 -0
- procesio_cli/tools/procesio/dto/form/elements/textarea.json +213 -0
- procesio_cli/tools/procesio/dto/form/enum_map.json +68 -0
- procesio_cli/tools/procesio/dto/form/fieldpath.py +284 -0
- procesio_cli/tools/procesio/dto/form/fixtures/reg.config.json +32 -0
- procesio_cli/tools/procesio/dto/form/fixtures/reg.elements.json +638 -0
- procesio_cli/tools/procesio/dto/form/sync_from_mock.py +386 -0
- procesio_cli/tools/procesio/dto/framework.py +125 -0
- procesio_cli/tools/procesio/dto/process/builder.py +1991 -0
- procesio_cli/tools/procesio/dto/process/config.schema.json +159 -0
- procesio_cli/tools/procesio/dto/process/description.md +218 -0
- procesio_cli/tools/procesio/dto/process/fixtures/greet.config.json +32 -0
- procesio_cli/tools/procesio/dto/process/fixtures/greet.dto.json +317 -0
- procesio_cli/tools/procesio/dto/process/naming.py +305 -0
- procesio_cli/tools/procesio/dto/process/normalize.py +74 -0
- procesio_cli/tools/procesio/dto/process/template.dto.json +32 -0
- procesio_cli/tools/procesio/dto/refdata.py +87 -0
- procesio_cli/tools/procesio/dto/registry.py +27 -0
- procesio_cli/tools/procesio/dto/webhook/builder.py +142 -0
- procesio_cli/tools/procesio/dto/webhook/config.schema.json +25 -0
- procesio_cli/tools/procesio/dto/webhook/description.md +92 -0
- procesio_cli/tools/procesio/dto/webhook/fixtures/order.config.json +10 -0
- procesio_cli/tools/procesio/dto/webhook/fixtures/order.dto.json +25 -0
- procesio_cli/tools/procesio/dto/webhook/template.dto.json +14 -0
- procesio_cli/tools/procesio/environments.py +264 -0
- procesio_cli/tools/procesio/errors.py +166 -0
- procesio_cli/tools/procesio/flowmodel/README.md +37 -0
- procesio_cli/tools/procesio/flowmodel/__init__.py +14 -0
- procesio_cli/tools/procesio/flowmodel/digest.py +223 -0
- procesio_cli/tools/procesio/flowmodel/families.py +34 -0
- procesio_cli/tools/procesio/flowmodel/fevalidation.py +1098 -0
- procesio_cli/tools/procesio/flowmodel/formdigest.py +232 -0
- procesio_cli/tools/procesio/flowmodel/inspect.py +78 -0
- procesio_cli/tools/procesio/flowmodel/model.py +82 -0
- procesio_cli/tools/procesio/flowmodel/nodeparam.py +871 -0
- procesio_cli/tools/procesio/flowmodel/reader.py +191 -0
- procesio_cli/tools/procesio/flowmodel/sqlparam.py +410 -0
- procesio_cli/tools/procesio/form_code_keys.py +50 -0
- procesio_cli/tools/procesio/formlint.py +292 -0
- procesio_cli/tools/procesio/gen_manifest.py +118 -0
- procesio_cli/tools/procesio/handlers/__init__.py +1 -0
- procesio_cli/tools/procesio/handlers/auth_actions.py +103 -0
- procesio_cli/tools/procesio/handlers/catalog.py +147 -0
- procesio_cli/tools/procesio/handlers/common.py +90 -0
- procesio_cli/tools/procesio/handlers/customaction_ops.py +146 -0
- procesio_cli/tools/procesio/handlers/datastore_ops.py +482 -0
- procesio_cli/tools/procesio/handlers/datatype_ops.py +275 -0
- procesio_cli/tools/procesio/handlers/dto_actions.py +258 -0
- procesio_cli/tools/procesio/handlers/environment_admin.py +146 -0
- procesio_cli/tools/procesio/handlers/fevalidate.py +236 -0
- procesio_cli/tools/procesio/handlers/files.py +141 -0
- procesio_cli/tools/procesio/handlers/flowgraph.py +229 -0
- procesio_cli/tools/procesio/handlers/flowlint.py +269 -0
- procesio_cli/tools/procesio/handlers/form_chains.py +336 -0
- procesio_cli/tools/procesio/handlers/form_code.py +277 -0
- procesio_cli/tools/procesio/handlers/form_element.py +199 -0
- procesio_cli/tools/procesio/handlers/form_events.py +441 -0
- procesio_cli/tools/procesio/handlers/form_update.py +270 -0
- procesio_cli/tools/procesio/handlers/formprocess.py +211 -0
- procesio_cli/tools/procesio/handlers/generic.py +135 -0
- procesio_cli/tools/procesio/handlers/layout.py +137 -0
- procesio_cli/tools/procesio/handlers/nodeparams.py +1018 -0
- procesio_cli/tools/procesio/handlers/process_layout.py +189 -0
- procesio_cli/tools/procesio/handlers/process_naming.py +213 -0
- procesio_cli/tools/procesio/handlers/processes.py +416 -0
- procesio_cli/tools/procesio/handlers/profile_admin.py +184 -0
- procesio_cli/tools/procesio/handlers/resource_ops.py +447 -0
- procesio_cli/tools/procesio/handlers/schedules.py +320 -0
- procesio_cli/tools/procesio/handlers/sqlactions.py +232 -0
- procesio_cli/tools/procesio/handlers/transport.py +463 -0
- procesio_cli/tools/procesio/handlers/usageguide.py +222 -0
- procesio_cli/tools/procesio/layout/README.md +196 -0
- procesio_cli/tools/procesio/layout/__init__.py +11 -0
- procesio_cli/tools/procesio/layout/adapter.py +736 -0
- procesio_cli/tools/procesio/layout/cycles.py +186 -0
- procesio_cli/tools/procesio/layout/dispatch.py +39 -0
- procesio_cli/tools/procesio/layout/elk/elk_runner.mjs +50 -0
- procesio_cli/tools/procesio/layout/elk/package-lock.json +21 -0
- procesio_cli/tools/procesio/layout/elk/package.json +11 -0
- procesio_cli/tools/procesio/layout/elk_engine.py +568 -0
- procesio_cli/tools/procesio/layout/engine.py +1311 -0
- procesio_cli/tools/procesio/layout/report.py +187 -0
- procesio_cli/tools/procesio/main.py +179 -0
- procesio_cli/tools/procesio/profiles.py +193 -0
- procesio_cli/tools/procesio/reliability.py +193 -0
- procesio_cli/tools/procesio/sqlformat.py +167 -0
- procesio_cli/tools/procesio/swagger.py +51 -0
- procesio_cli/tools/procesio/tests/__init__.py +0 -0
- procesio_cli/tools/procesio/tests/conftest.py +129 -0
- procesio_cli/tools/procesio/tests/test_auth.py +200 -0
- procesio_cli/tools/procesio/tests/test_autogen.py +78 -0
- procesio_cli/tools/procesio/tests/test_builder_attrpath_sqlbind.py +180 -0
- procesio_cli/tools/procesio/tests/test_builder_custom_action_catalog.py +72 -0
- procesio_cli/tools/procesio/tests/test_client.py +114 -0
- procesio_cli/tools/procesio/tests/test_client_reliability.py +139 -0
- procesio_cli/tools/procesio/tests/test_customaction.py +103 -0
- procesio_cli/tools/procesio/tests/test_customaction_test.py +80 -0
- procesio_cli/tools/procesio/tests/test_cycles.py +69 -0
- procesio_cli/tools/procesio/tests/test_datastore.py +378 -0
- procesio_cli/tools/procesio/tests/test_datastore_node.py +94 -0
- procesio_cli/tools/procesio/tests/test_dispatch.py +170 -0
- procesio_cli/tools/procesio/tests/test_document_page_size.py +19 -0
- procesio_cli/tools/procesio/tests/test_dto.py +734 -0
- procesio_cli/tools/procesio/tests/test_edit_dryrun_preview.py +96 -0
- procesio_cli/tools/procesio/tests/test_elk_layout.py +221 -0
- procesio_cli/tools/procesio/tests/test_environments.py +214 -0
- procesio_cli/tools/procesio/tests/test_fevalidate_gate.py +104 -0
- procesio_cli/tools/procesio/tests/test_fevalidation.py +317 -0
- procesio_cli/tools/procesio/tests/test_fieldpath_variables.py +87 -0
- procesio_cli/tools/procesio/tests/test_files.py +72 -0
- procesio_cli/tools/procesio/tests/test_flow_digest.py +202 -0
- procesio_cli/tools/procesio/tests/test_flowlint.py +114 -0
- procesio_cli/tools/procesio/tests/test_flowmodel.py +158 -0
- procesio_cli/tools/procesio/tests/test_form_add_element.py +256 -0
- procesio_cli/tools/procesio/tests/test_form_approval_gaps.py +319 -0
- procesio_cli/tools/procesio/tests/test_form_auto_names.py +60 -0
- procesio_cli/tools/procesio/tests/test_form_chains.py +217 -0
- procesio_cli/tools/procesio/tests/test_form_code_actions.py +188 -0
- procesio_cli/tools/procesio/tests/test_form_code_keys.py +92 -0
- procesio_cli/tools/procesio/tests/test_form_code_style.py +178 -0
- procesio_cli/tools/procesio/tests/test_form_delete_element.py +99 -0
- procesio_cli/tools/procesio/tests/test_form_element_config.py +141 -0
- procesio_cli/tools/procesio/tests/test_form_event_maps.py +135 -0
- procesio_cli/tools/procesio/tests/test_form_event_ops.py +376 -0
- procesio_cli/tools/procesio/tests/test_form_event_replace.py +86 -0
- procesio_cli/tools/procesio/tests/test_form_events.py +92 -0
- procesio_cli/tools/procesio/tests/test_form_parity.py +171 -0
- procesio_cli/tools/procesio/tests/test_form_select_source.py +74 -0
- procesio_cli/tools/procesio/tests/test_form_sync.py +35 -0
- procesio_cli/tools/procesio/tests/test_form_update.py +133 -0
- procesio_cli/tools/procesio/tests/test_formlint.py +155 -0
- procesio_cli/tools/procesio/tests/test_formlint_css_scope.py +38 -0
- procesio_cli/tools/procesio/tests/test_formlint_field_names.py +83 -0
- procesio_cli/tools/procesio/tests/test_guards.py +110 -0
- procesio_cli/tools/procesio/tests/test_hidden_setting_types.py +39 -0
- procesio_cli/tools/procesio/tests/test_html2docx_asset.py +132 -0
- procesio_cli/tools/procesio/tests/test_key_handle_terminology.py +45 -0
- procesio_cli/tools/procesio/tests/test_layout.py +574 -0
- procesio_cli/tools/procesio/tests/test_layout_report.py +88 -0
- procesio_cli/tools/procesio/tests/test_manifest_sync.py +68 -0
- procesio_cli/tools/procesio/tests/test_nodedelete.py +151 -0
- procesio_cli/tools/procesio/tests/test_nodeparam.py +826 -0
- procesio_cli/tools/procesio/tests/test_normalize.py +70 -0
- procesio_cli/tools/procesio/tests/test_payload_docs.py +86 -0
- procesio_cli/tools/procesio/tests/test_process_action_naming.py +170 -0
- procesio_cli/tools/procesio/tests/test_process_call_api_seed.py +46 -0
- procesio_cli/tools/procesio/tests/test_process_ext.py +373 -0
- procesio_cli/tools/procesio/tests/test_process_invariants.py +183 -0
- procesio_cli/tools/procesio/tests/test_process_layout.py +117 -0
- procesio_cli/tools/procesio/tests/test_process_naming.py +188 -0
- procesio_cli/tools/procesio/tests/test_process_query_store.py +172 -0
- procesio_cli/tools/procesio/tests/test_processinfo_variable.py +56 -0
- procesio_cli/tools/procesio/tests/test_profiles.py +127 -0
- procesio_cli/tools/procesio/tests/test_put_projects.py +41 -0
- procesio_cli/tools/procesio/tests/test_reliability.py +107 -0
- procesio_cli/tools/procesio/tests/test_removal_gate.py +95 -0
- procesio_cli/tools/procesio/tests/test_resource_ops.py +173 -0
- procesio_cli/tools/procesio/tests/test_save_validity.py +207 -0
- procesio_cli/tools/procesio/tests/test_schedule_cron_shape.py +111 -0
- procesio_cli/tools/procesio/tests/test_schedules.py +309 -0
- procesio_cli/tools/procesio/tests/test_sqlconvert.py +234 -0
- procesio_cli/tools/procesio/tests/test_sqlformat.py +83 -0
- procesio_cli/tools/procesio/tests/test_sqlparam.py +187 -0
- procesio_cli/tools/procesio/tests/test_superseded_actions.py +54 -0
- procesio_cli/tools/procesio/tests/test_surgical_concurrency.py +156 -0
- procesio_cli/tools/procesio/tests/test_tier4.py +123 -0
- procesio_cli/tools/procesio/tests/test_transport.py +147 -0
- procesio_cli/tools/procesio/tests/test_transport_data_stores.py +168 -0
- procesio_cli/tools/procesio/tests/test_transport_mapper_repair.py +150 -0
- procesio_cli/tools/procesio/tests/test_transport_webhook_strip.py +253 -0
- procesio_cli/tools/procesio/tests/test_usage_guide.py +96 -0
- procesio_cli/tools/procesio/tool.yaml +12486 -0
- procesio_cli/tools/sqlserver/MOVED-TO-CENTRAL.md +29 -0
- procesio_cli/tools/sqlserver/README.md +192 -0
- procesio_cli/tools/sqlserver/SKILL.md +37 -0
- procesio_cli/tools/sqlserver/SQLSERVER-SCHEMA-NOTES.md +284 -0
- procesio_cli/tools/sqlserver/__init__.py +0 -0
- procesio_cli/tools/sqlserver/connection.py +242 -0
- procesio_cli/tools/sqlserver/main.py +521 -0
- procesio_cli/tools/sqlserver/profiles.template.json +1 -0
- procesio_cli/tools/sqlserver/schema.py +600 -0
- procesio_cli/tools/sqlserver/tests/__init__.py +0 -0
- procesio_cli/tools/sqlserver/tests/conftest.py +21 -0
- procesio_cli/tools/sqlserver/tests/test_connection.py +75 -0
- procesio_cli/tools/sqlserver/tests/test_dbprofiles.py +92 -0
- procesio_cli/tools/sqlserver/tests/test_dbquery.py +220 -0
- procesio_cli/tools/sqlserver/tests/test_manifest_sync.py +68 -0
- procesio_cli/tools/sqlserver/tests/test_sqlserver.py +326 -0
- procesio_cli/tools/sqlserver/tests/test_sqlserver_schema.py +488 -0
- procesio_cli/tools/sqlserver/tool.yaml +123 -0
- procesio_cli/tools/web/README.md +381 -0
- procesio_cli/tools/web/SKILL.md +37 -0
- procesio_cli/tools/web/WEB-AUTOMATION-NOTES.md +277 -0
- procesio_cli/tools/web/__init__.py +21 -0
- procesio_cli/tools/web/actiondef.py +24 -0
- procesio_cli/tools/web/api.py +444 -0
- procesio_cli/tools/web/brokered.py +107 -0
- procesio_cli/tools/web/driver.py +839 -0
- procesio_cli/tools/web/drivercontract.py +44 -0
- procesio_cli/tools/web/errors.py +54 -0
- procesio_cli/tools/web/handlers/__init__.py +1 -0
- procesio_cli/tools/web/handlers/archive.py +367 -0
- procesio_cli/tools/web/handlers/browse.py +182 -0
- procesio_cli/tools/web/handlers/contacts.py +74 -0
- procesio_cli/tools/web/handlers/sessmgmt.py +120 -0
- procesio_cli/tools/web/main.py +128 -0
- procesio_cli/tools/web/sessions.py +253 -0
- procesio_cli/tools/web/steps.py +162 -0
- procesio_cli/tools/web/tests/__init__.py +0 -0
- procesio_cli/tools/web/tests/conftest.py +197 -0
- procesio_cli/tools/web/tests/test_api.py +330 -0
- procesio_cli/tools/web/tests/test_archive.py +190 -0
- procesio_cli/tools/web/tests/test_brokered.py +138 -0
- procesio_cli/tools/web/tests/test_dispatch.py +132 -0
- procesio_cli/tools/web/tests/test_errors.py +60 -0
- procesio_cli/tools/web/tests/test_manifest_sync.py +76 -0
- procesio_cli/tools/web/tests/test_page_contacts.py +68 -0
- procesio_cli/tools/web/tests/test_sessions.py +145 -0
- procesio_cli/tools/web/tests/test_steps.py +210 -0
- procesio_cli/tools/web/tool.yaml +184 -0
- procesio_cli/tools/xlsx/README.md +34 -0
- procesio_cli/tools/xlsx/SKILL.md +28 -0
- procesio_cli/tools/xlsx/__init__.py +0 -0
- procesio_cli/tools/xlsx/main.py +129 -0
- procesio_cli/tools/xlsx/reader.py +91 -0
- procesio_cli/tools/xlsx/tests/__init__.py +0 -0
- procesio_cli/tools/xlsx/tests/conftest.py +39 -0
- procesio_cli/tools/xlsx/tests/test_xlsx.py +103 -0
- procesio_cli/tools/xlsx/tool.yaml +30 -0
- procesio_cli/webplatform/aat_mcp/AAT-MCP-NOTES.md +244 -0
- procesio_cli/webplatform/aat_mcp/README.md +78 -0
- procesio_cli/webplatform/aat_mcp/bridge.py +705 -0
- procesio_cli/webplatform/aat_mcp/chat_server.py +194 -0
- procesio_cli/webplatform/aat_mcp/chat_surface.snapshot.json +668 -0
- procesio_cli/webplatform/aat_mcp/chat_surface.yaml +372 -0
- procesio_cli/webplatform/aat_mcp/gate.py +68 -0
- procesio_cli/webplatform/aat_mcp/http_server.py +139 -0
- procesio_cli/webplatform/aat_mcp/protocol.py +175 -0
- procesio_cli/webplatform/aat_mcp/server.py +306 -0
- procesio_cli/webplatform/aat_mcp/tests/conftest.py +8 -0
- procesio_cli/webplatform/aat_mcp/tests/test_aat_mcp.py +255 -0
- procesio_cli/webplatform/aat_mcp/tests/test_chat_surface.py +247 -0
- procesio_cli/webplatform/aat_mcp/tests/test_discovery.py +489 -0
- procesio_cli/webplatform/aat_mcp/tests/test_multiuser.py +86 -0
- procesio_cli/webplatform/aat_mcp/tests/test_progressive_discovery.py +89 -0
- procesio_cli/webplatform/aat_mcp/tests/test_protocol.py +180 -0
- procesio_cli/webplatform/aat_mcp/tests/test_skill_discovery.py +23 -0
- procesio_cli-0.1.1.dist-info/METADATA +467 -0
- procesio_cli-0.1.1.dist-info/RECORD +647 -0
- procesio_cli-0.1.1.dist-info/WHEEL +4 -0
- procesio_cli-0.1.1.dist-info/entry_points.txt +7 -0
- procesio_cli-0.1.1.dist-info/licenses/LICENSE +201 -0
- procesio_cli-0.1.1.dist-info/licenses/NOTICE +5 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""PROCESIO polish: --workspace-id override, list-subworkspaces filter, export."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from tools.procesio import errors, main
|
|
9
|
+
from tools.procesio.client import ProcesioClient
|
|
10
|
+
from tools.procesio.tests.conftest import FakeResp, FakeSession
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _builder(profile, session):
|
|
14
|
+
return lambda prof: ProcesioClient(profile=profile, name="t", session=session)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
APIKEY = {"type": "apikey", "key": "N", "value": "V"}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# -- --workspace-id override -------------------------------------------------
|
|
21
|
+
|
|
22
|
+
def test_workspace_id_override_sets_header():
|
|
23
|
+
sess = FakeSession(queue=[FakeResp(200, [])])
|
|
24
|
+
main.dispatch("list-workspaces", ["--workspace-id", "WS-123"],
|
|
25
|
+
client_builder=_builder(APIKEY, sess))
|
|
26
|
+
assert sess.calls[0]["headers"]["workspaceid"] == "WS-123"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_workspace_id_overrides_profile_workspace():
|
|
30
|
+
sess = FakeSession(queue=[FakeResp(200, [])])
|
|
31
|
+
prof = {"type": "apikey", "key": "N", "value": "V", "workspace_id": "PROFILE-WS"}
|
|
32
|
+
main.dispatch("list-workspaces", ["--workspace-id", "CALL-WS"],
|
|
33
|
+
client_builder=_builder(prof, sess))
|
|
34
|
+
assert sess.calls[0]["headers"]["workspaceid"] == "CALL-WS" # call wins
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# -- list-subworkspaces active-only filter -----------------------------------
|
|
38
|
+
|
|
39
|
+
_MIXED = {"pageItems": [
|
|
40
|
+
{"workspace": "Active A", "id": "a", "workspaceState": "active"},
|
|
41
|
+
{"workspace": "Removed B", "id": "b", "workspaceState": "removed"},
|
|
42
|
+
{"workspace": "Active C", "id": "c", "workspaceState": "active"},
|
|
43
|
+
]}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_list_subworkspaces_hides_removed_by_default():
|
|
47
|
+
sess = FakeSession(queue=[FakeResp(200, _MIXED)])
|
|
48
|
+
out = main.dispatch("list-subworkspaces", ["--parent-id", "RING"],
|
|
49
|
+
client_builder=_builder(APIKEY, sess))
|
|
50
|
+
assert out["count"] == 2
|
|
51
|
+
assert {w["id"] for w in out["workspaces"]} == {"a", "c"}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_list_subworkspaces_include_removed():
|
|
55
|
+
sess = FakeSession(queue=[FakeResp(200, _MIXED)])
|
|
56
|
+
out = main.dispatch("list-subworkspaces", ["--parent-id", "RING", "--include-removed"],
|
|
57
|
+
client_builder=_builder(APIKEY, sess))
|
|
58
|
+
assert out["count"] == 3
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# -- export ------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
def _export_responder(export_bytes=None):
|
|
64
|
+
"""Serves list endpoints for name resolution + the export POST."""
|
|
65
|
+
lists = {
|
|
66
|
+
"/api/DataTypes": [{"name": "lazarusDM", "id": "DM1"}],
|
|
67
|
+
"/api/Projects": [{"title": "Lazarus Data process", "id": "P1"},
|
|
68
|
+
{"title": "Import excel products to pdf", "id": "P2"}],
|
|
69
|
+
"/api/DocumentTemplate": [{"name": "products from Excel", "id": "DOC1"}],
|
|
70
|
+
"/api/Webhooks": [], "/api/FormTemplate": [], "/api/Credentials": [],
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
def responder(method, url, kw):
|
|
74
|
+
if url.endswith("/api/Transport/export-entities"):
|
|
75
|
+
return FakeResp(200, content=export_bytes or b"{}")
|
|
76
|
+
for path, rows in lists.items():
|
|
77
|
+
if url.endswith(path):
|
|
78
|
+
return FakeResp(200, {"pageItems": rows})
|
|
79
|
+
return FakeResp(200, {"pageItems": []})
|
|
80
|
+
return responder
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_export_dry_run_resolves_names_excludes_credentials():
|
|
84
|
+
sess = FakeSession(responder=_export_responder())
|
|
85
|
+
out = main.dispatch(
|
|
86
|
+
"export",
|
|
87
|
+
["--workspace-id", "WS", "--data-models", "lazarusDM",
|
|
88
|
+
"--processes", "Lazarus Data process,Import excel products to pdf",
|
|
89
|
+
"--documents", "all", "--dry-run"],
|
|
90
|
+
client_builder=_builder(APIKEY, sess),
|
|
91
|
+
)
|
|
92
|
+
assert out["dry_run"] is True
|
|
93
|
+
b = out["body"]
|
|
94
|
+
assert b["dataModelIds"] == ["DM1"]
|
|
95
|
+
assert b["flowIds"] == ["P1", "P2"]
|
|
96
|
+
assert b["documentIds"] == ["DOC1"]
|
|
97
|
+
assert b["credentialIds"] == [] # excluded by default
|
|
98
|
+
assert b["exportSensitiveData"] is False
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_export_requires_workspace_scope():
|
|
102
|
+
sess = FakeSession(responder=_export_responder())
|
|
103
|
+
with pytest.raises(errors.UsageError):
|
|
104
|
+
main.dispatch("export", ["--data-models", "lazarusDM"],
|
|
105
|
+
client_builder=_builder(APIKEY, sess))
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_export_nothing_selected_errors():
|
|
109
|
+
sess = FakeSession(responder=_export_responder())
|
|
110
|
+
with pytest.raises(errors.UsageError):
|
|
111
|
+
main.dispatch("export", ["--workspace-id", "WS"],
|
|
112
|
+
client_builder=_builder(APIKEY, sess))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_export_unresolvable_name_errors():
|
|
116
|
+
sess = FakeSession(responder=_export_responder())
|
|
117
|
+
with pytest.raises(errors.UsageError):
|
|
118
|
+
main.dispatch("export", ["--workspace-id", "WS", "--processes", "Nope"],
|
|
119
|
+
client_builder=_builder(APIKEY, sess))
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_export_saves_file(tmp_path):
|
|
123
|
+
bundle = json.dumps({"DataTypes": [{}], "Flows": [{}, {}], "DocumentTemplates": [{}],
|
|
124
|
+
"Credentials": [], "Webhooks": [], "Forms": []}).encode()
|
|
125
|
+
sess = FakeSession(responder=_export_responder(export_bytes=bundle))
|
|
126
|
+
out_path = str(tmp_path / "exp.procesio")
|
|
127
|
+
out = main.dispatch(
|
|
128
|
+
"export",
|
|
129
|
+
["--workspace-id", "WS", "--data-models", "lazarusDM",
|
|
130
|
+
"--processes", "Lazarus Data process", "--documents", "all", "--output", out_path],
|
|
131
|
+
client_builder=_builder(APIKEY, sess),
|
|
132
|
+
)
|
|
133
|
+
assert out["saved"] == out_path
|
|
134
|
+
assert out["bytes"] == len(bundle)
|
|
135
|
+
# DataStores joined the summary when data stores became selectable. It is
|
|
136
|
+
# counted even at zero: a caller cannot otherwise tell a pack that carries
|
|
137
|
+
# no store from one where the store was never requested, and reading the
|
|
138
|
+
# second as the first is exactly the mistake that made this change
|
|
139
|
+
# necessary.
|
|
140
|
+
assert out["sections"] == {"DataTypes": 1, "Flows": 2, "DocumentTemplates": 1,
|
|
141
|
+
"Credentials": 0, "Webhooks": 0, "Forms": 0,
|
|
142
|
+
"DataStores": 0}
|
|
143
|
+
with open(out_path, "rb") as f:
|
|
144
|
+
assert f.read() == bundle
|
|
145
|
+
# the export POST carried the built selection body
|
|
146
|
+
post = [c for c in sess.calls if c["url"].endswith("/Transport/export-entities")][0]
|
|
147
|
+
assert post["json"]["flowIds"] == ["P1"]
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Transport: data stores must be requestable on export, and import must send
|
|
3
|
+
the part name and headers the endpoint actually requires.
|
|
4
|
+
|
|
5
|
+
⚠ WHY THESE TESTS EXIST. `export` used to build its selection from a map that
|
|
6
|
+
had no data-store entry, so the request never carried `dataStoreIds` and a pack
|
|
7
|
+
silently arrived without the store. A referencing process travelled anyway,
|
|
8
|
+
carrying a store id the receiving workspace does not have. The empty
|
|
9
|
+
`DataStores` section was then read as evidence that the platform drops
|
|
10
|
+
referenced stores - a conclusion about the server drawn from a request that
|
|
11
|
+
could not name the thing.
|
|
12
|
+
|
|
13
|
+
⚠ AND `import` posted its file part as `file` where the endpoint expects
|
|
14
|
+
`importedData`, with none of the seven required boolean headers. That endpoint
|
|
15
|
+
answers `403 Forbidden` with the body `MIGRATE` on ANY error, so a malformed
|
|
16
|
+
request is indistinguishable from a permission failure - which is exactly how it
|
|
17
|
+
was misread once.
|
|
18
|
+
|
|
19
|
+
Each test asserts on the REQUEST that would be sent, because that is the thing
|
|
20
|
+
that was wrong, and it is invisible in any response.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import argparse
|
|
25
|
+
|
|
26
|
+
import pytest
|
|
27
|
+
|
|
28
|
+
from tools.procesio.errors import UsageError
|
|
29
|
+
from tools.procesio.handlers import resource_ops, transport
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class FakeClient:
|
|
33
|
+
"""Captures what the handler would send."""
|
|
34
|
+
|
|
35
|
+
def __init__(self, listings=None):
|
|
36
|
+
self.workspace_id = "ws-1"
|
|
37
|
+
self.profile = {"workspace_id": "ws-1"}
|
|
38
|
+
self.listings = listings or {}
|
|
39
|
+
self.multipart = None
|
|
40
|
+
self.exported = None
|
|
41
|
+
|
|
42
|
+
def get(self, path, query=None):
|
|
43
|
+
return self.listings.get(path, [])
|
|
44
|
+
|
|
45
|
+
def request_bytes(self, method, path, body=None):
|
|
46
|
+
self.exported = {"method": method, "path": path, "body": body}
|
|
47
|
+
return 200, b'{"Flows":[1],"DataStores":[{"id":"ds-1"}]}', {}
|
|
48
|
+
|
|
49
|
+
def request_multipart(self, path, *, files, query=None, headers=None):
|
|
50
|
+
self.multipart = {"path": path, "files": files, "headers": headers}
|
|
51
|
+
return {"ok": True}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _export_args(**kw):
|
|
55
|
+
ns = argparse.Namespace(
|
|
56
|
+
data_models=None, processes=None, documents=None, webhooks=None,
|
|
57
|
+
forms=None, credentials=None, data_stores=None,
|
|
58
|
+
export_sensitive_data=False, output=None, dry_run=True)
|
|
59
|
+
for k, v in kw.items():
|
|
60
|
+
setattr(ns, k, v)
|
|
61
|
+
return ns
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_export_body_has_a_data_store_key():
|
|
65
|
+
"""⚠ The body must carry `dataStoreIds` even when nothing selects one."""
|
|
66
|
+
c = FakeClient({"/api/Projects": [{"id": "f-1", "title": "p"}]})
|
|
67
|
+
out = transport.export(c, _export_args(processes="p"))
|
|
68
|
+
assert "dataStoreIds" in out["body"], (
|
|
69
|
+
"the export body must always carry a dataStoreIds key, so a store can "
|
|
70
|
+
"be requested at all")
|
|
71
|
+
assert out["body"]["dataStoreIds"] == []
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_export_resolves_a_data_store_by_name():
|
|
75
|
+
c = FakeClient({"/api/DataStore": [{"id": "ds-1", "name": "tokens"}]})
|
|
76
|
+
out = transport.export(c, _export_args(data_stores="tokens"))
|
|
77
|
+
assert out["body"]["dataStoreIds"] == ["ds-1"]
|
|
78
|
+
assert out["resolved"]["data_stores"]["ids"] == ["ds-1"]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_a_data_store_alone_is_a_valid_selection():
|
|
82
|
+
"""Selecting only a store must not trip the nothing-selected guard."""
|
|
83
|
+
c = FakeClient({"/api/DataStore": [{"id": "ds-1", "name": "tokens"}]})
|
|
84
|
+
out = transport.export(c, _export_args(data_stores="tokens"))
|
|
85
|
+
assert out["body"]["dataStoreIds"] == ["ds-1"]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_export_still_refuses_an_empty_selection():
|
|
89
|
+
c = FakeClient()
|
|
90
|
+
with pytest.raises(UsageError):
|
|
91
|
+
transport.export(c, _export_args())
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_export_reports_the_DataStores_section(tmp_path):
|
|
95
|
+
# output= must be given: this is the one export test that actually writes, and with output=None
|
|
96
|
+
# the handler falls back to ./procesio-export.procesio, littering whatever directory pytest
|
|
97
|
+
# happens to run in (it left one in the repo root).
|
|
98
|
+
c = FakeClient({"/api/DataStore": [{"id": "ds-1", "name": "tokens"}]})
|
|
99
|
+
out = transport.export(c, _export_args(data_stores="tokens", dry_run=False,
|
|
100
|
+
output=str(tmp_path / "pack.procesio")))
|
|
101
|
+
assert "DataStores" in out["sections"], (
|
|
102
|
+
"a caller cannot tell whether the store travelled unless the summary "
|
|
103
|
+
"counts that section")
|
|
104
|
+
assert out["sections"]["DataStores"] == 1
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _import_args(**kw):
|
|
108
|
+
ns = argparse.Namespace(file=None)
|
|
109
|
+
for dest in resource_ops._IMPORT_FLAGS:
|
|
110
|
+
setattr(ns, "no_" + dest, False)
|
|
111
|
+
for k, v in kw.items():
|
|
112
|
+
setattr(ns, k, v)
|
|
113
|
+
return ns
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_import_uses_the_documented_part_name(tmp_path):
|
|
117
|
+
"""⚠ `importedData`, not `file`. A wrongly named part is not reported."""
|
|
118
|
+
f = tmp_path / "p.procesio"
|
|
119
|
+
f.write_bytes(b"{}")
|
|
120
|
+
c = FakeClient()
|
|
121
|
+
resource_ops.import_bundle(c, _import_args(file=str(f)))
|
|
122
|
+
assert list(c.multipart["files"]) == ["importedData"]
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_import_sends_all_seven_required_headers(tmp_path):
|
|
126
|
+
f = tmp_path / "p.procesio"
|
|
127
|
+
f.write_bytes(b"{}")
|
|
128
|
+
c = FakeClient()
|
|
129
|
+
out = resource_ops.import_bundle(c, _import_args(file=str(f)))
|
|
130
|
+
sent = c.multipart["headers"]
|
|
131
|
+
assert set(sent) == {"overrideData", "importDataTypes", "importFlows",
|
|
132
|
+
"importCredentials", "importDocuments",
|
|
133
|
+
"importForms", "importDataStores"}
|
|
134
|
+
assert all(v == "true" for v in sent.values()), (
|
|
135
|
+
"a pack is normally imported whole; a silently skipped category is "
|
|
136
|
+
"what this endpoint reports worst")
|
|
137
|
+
assert out["headers_sent"] == sent, (
|
|
138
|
+
"the result must echo the headers: a 403 from this endpoint cannot be "
|
|
139
|
+
"read without knowing what was asked")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def test_import_flags_can_switch_a_category_off(tmp_path):
|
|
143
|
+
f = tmp_path / "p.procesio"
|
|
144
|
+
f.write_bytes(b"{}")
|
|
145
|
+
c = FakeClient()
|
|
146
|
+
resource_ops.import_bundle(c, _import_args(file=str(f),
|
|
147
|
+
no_credentials=True))
|
|
148
|
+
assert c.multipart["headers"]["importCredentials"] == "false"
|
|
149
|
+
assert c.multipart["headers"]["importDataStores"] == "true"
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# ⚠ PROVED ABLE TO FAIL. Each assertion above passes trivially if the handler
|
|
153
|
+
# does the right thing; these two show the tests would have CAUGHT the original
|
|
154
|
+
# defects rather than merely agreeing with the fix.
|
|
155
|
+
|
|
156
|
+
def test_the_old_export_shape_would_fail_these_tests():
|
|
157
|
+
old_keys = {"dataModelIds", "flowIds", "documentIds", "webhookIds",
|
|
158
|
+
"formIds", "credentialIds"}
|
|
159
|
+
assert "dataStoreIds" not in old_keys
|
|
160
|
+
assert "dataStoreIds" in set(transport._BODY_KEYS), (
|
|
161
|
+
"the fix is precisely that dataStoreIds joined the body keys")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_the_old_import_shape_would_fail_these_tests():
|
|
165
|
+
assert "file" != "importedData"
|
|
166
|
+
assert len(resource_ops._IMPORT_FLAGS) == 7, (
|
|
167
|
+
"seven headers are required; a handler sending none was accepted by "
|
|
168
|
+
"nothing and reported by nothing")
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Transport: a Data Store mapper must be repaired before a pack is shipped.
|
|
3
|
+
|
|
4
|
+
WHY THIS EXISTS. The platform's EXPORT re-spells every Data Store mapper row
|
|
5
|
+
from the shape the back end accepts into the Call SubProcess wire shape, and
|
|
6
|
+
the import does not translate it back:
|
|
7
|
+
|
|
8
|
+
accepted {"id": i, "source": {"value": "<%i%>",
|
|
9
|
+
"variable": [{"id": i, "variableId": g,
|
|
10
|
+
"attribute": None}]},
|
|
11
|
+
"column": "<NAME>"}
|
|
12
|
+
in a pack {"id": i, "process": "<flowId>.<variableId>",
|
|
13
|
+
"document": "<NAME>"}
|
|
14
|
+
|
|
15
|
+
Nothing is lost - the column name and the variable GUID both survive under
|
|
16
|
+
different keys - so every structural check passes on a process that cannot
|
|
17
|
+
run. It fails only when executed, with "A Data Store Decisional column
|
|
18
|
+
reference cannot be null or empty".
|
|
19
|
+
|
|
20
|
+
These tests assert on the TRANSFORMED PACK, because that is the artefact
|
|
21
|
+
shipped and the defect is invisible in any response.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
|
|
27
|
+
import pytest
|
|
28
|
+
|
|
29
|
+
from tools.procesio.handlers import transport
|
|
30
|
+
|
|
31
|
+
FLOW_ID = "8463a145-78a8-490b-a1da-a2e6615c231c"
|
|
32
|
+
VAR_0 = "b3bf9af2-52ea-4192-94b0-b95afef7fa4a"
|
|
33
|
+
VAR_1 = "b55f6ad7-3499-4820-b2f5-e9d62d9c773b"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _pack(rows):
|
|
37
|
+
return {"DataTypes": [], "Credentials": [], "Webhooks": [],
|
|
38
|
+
"DocumentTemplates": [], "Forms": [], "DataStores": [],
|
|
39
|
+
"TimeStamp": "2026-08-24T00:00:00Z",
|
|
40
|
+
"Flows": [{"Title": "w", "Id": FLOW_ID, "Variables": [],
|
|
41
|
+
"Actions": [{"Parameters": [
|
|
42
|
+
{"TabPropertyId": "x", "Value": rows,
|
|
43
|
+
"Variable": []}]}]}]}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _exported_rows():
|
|
47
|
+
return [{"id": 0, "process": "%s.%s" % (FLOW_ID, VAR_0),
|
|
48
|
+
"document": "row_key"},
|
|
49
|
+
{"id": 1, "process": "%s.%s" % (FLOW_ID, VAR_1),
|
|
50
|
+
"document": "tenant_id"}]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _repair(pack):
|
|
54
|
+
return transport.repair_datastore_mapper_pack(pack)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_exported_rows_are_rewritten_into_the_accepted_shape():
|
|
58
|
+
out, changed = _repair(_pack(_exported_rows()))
|
|
59
|
+
rows = out["Flows"][0]["Actions"][0]["Parameters"][0]["Value"]
|
|
60
|
+
assert changed == 2
|
|
61
|
+
assert sorted(rows[0]) == ["column", "id", "source"]
|
|
62
|
+
assert rows[0]["column"] == "row_key"
|
|
63
|
+
assert rows[0]["source"]["value"] == "<%0%>"
|
|
64
|
+
assert rows[0]["source"]["variable"] == [
|
|
65
|
+
{"id": 0, "variableId": VAR_0, "attribute": None}]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_the_placeholder_index_tracks_the_row_id():
|
|
69
|
+
"""The <%i%> placeholder must match the id INSIDE its own inline array."""
|
|
70
|
+
out, _ = _repair(_pack(_exported_rows()))
|
|
71
|
+
for row in out["Flows"][0]["Actions"][0]["Parameters"][0]["Value"]:
|
|
72
|
+
i = row["id"]
|
|
73
|
+
assert row["source"]["value"] == "<%%%d%%>" % i
|
|
74
|
+
assert row["source"]["variable"][0]["id"] == i
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def test_the_variable_guid_is_taken_from_the_composite_not_invented():
|
|
78
|
+
out, _ = _repair(_pack(_exported_rows()))
|
|
79
|
+
rows = out["Flows"][0]["Actions"][0]["Parameters"][0]["Value"]
|
|
80
|
+
assert [r["source"]["variable"][0]["variableId"] for r in rows] == \
|
|
81
|
+
[VAR_0, VAR_1]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_no_document_or_process_key_survives():
|
|
85
|
+
out, _ = _repair(_pack(_exported_rows()))
|
|
86
|
+
blob = json.dumps(out)
|
|
87
|
+
assert '"document"' not in blob
|
|
88
|
+
assert '"process"' not in blob
|
|
89
|
+
assert blob.count('"column"') == 2
|
|
90
|
+
assert blob.count('"source"') == 2
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_it_is_IDEMPOTENT_so_a_fixed_export_is_never_corrupted():
|
|
94
|
+
"""If PROCESIO fixes the export, this must become a no-op.
|
|
95
|
+
|
|
96
|
+
A repair that mangles an already-correct pack is worse than no repair,
|
|
97
|
+
because it would break the very case it is waiting for.
|
|
98
|
+
"""
|
|
99
|
+
once, first = _repair(_pack(_exported_rows()))
|
|
100
|
+
twice, second = _repair(once)
|
|
101
|
+
assert second == 0, "a second pass must change nothing"
|
|
102
|
+
assert twice == once
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def test_an_already_accepted_row_is_passed_through_untouched():
|
|
106
|
+
good = [{"id": 0,
|
|
107
|
+
"source": {"value": "<%0%>",
|
|
108
|
+
"variable": [{"id": 0, "variableId": VAR_0,
|
|
109
|
+
"attribute": None}]},
|
|
110
|
+
"column": "row_key"}]
|
|
111
|
+
out, changed = _repair(_pack(good))
|
|
112
|
+
assert changed == 0
|
|
113
|
+
assert out["Flows"][0]["Actions"][0]["Parameters"][0]["Value"] == good
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_the_parameter_variable_list_stays_empty():
|
|
117
|
+
"""The variable array belongs INSIDE the source operand, not on the
|
|
118
|
+
parameter. Populating both is what fourteen earlier shapes got wrong."""
|
|
119
|
+
out, _ = _repair(_pack(_exported_rows()))
|
|
120
|
+
assert out["Flows"][0]["Actions"][0]["Parameters"][0]["Variable"] == []
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_a_pack_with_no_mapper_is_left_alone():
|
|
124
|
+
pack = _pack([{"id": 0, "somethingElse": 1}])
|
|
125
|
+
out, changed = _repair(pack)
|
|
126
|
+
assert changed == 0
|
|
127
|
+
assert out == pack
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_the_input_pack_is_not_mutated_in_place():
|
|
131
|
+
src = _pack(_exported_rows())
|
|
132
|
+
before = json.dumps(src)
|
|
133
|
+
_repair(src)
|
|
134
|
+
assert json.dumps(src) == before, "the caller's pack must be untouched"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def test_the_action_is_registered_and_offline():
|
|
138
|
+
a = transport.ACTIONS["repair-datastore-mapper"]
|
|
139
|
+
assert a.needs_client is False, "this is an offline pack transform"
|
|
140
|
+
assert a.description
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@pytest.mark.parametrize("bad", [None, 12, "text", [], [1, 2]])
|
|
144
|
+
def test_a_non_mapper_parameter_value_is_ignored(bad):
|
|
145
|
+
pack = _pack(_exported_rows())
|
|
146
|
+
pack["Flows"][0]["Actions"][0]["Parameters"].append(
|
|
147
|
+
{"TabPropertyId": "y", "Value": bad, "Variable": []})
|
|
148
|
+
out, changed = _repair(pack)
|
|
149
|
+
assert changed == 2
|
|
150
|
+
assert out["Flows"][0]["Actions"][0]["Parameters"][1]["Value"] == bad
|