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,376 @@
|
|
|
1
|
+
"""form-set-element-event: wire one element's trigger without touching the rest.
|
|
2
|
+
|
|
3
|
+
Two invariants matter. First, the one form_code also guards — rewiring must never
|
|
4
|
+
rewrite the element tree. Second, the documented RUN_PROCESS trap: the PROCESS
|
|
5
|
+
VARIABLE GUID belongs on the LEFT of inputMap/outputMap. A name there is accepted
|
|
6
|
+
by the API, but the designer then renders raw guids and the launch 400s, so names
|
|
7
|
+
must resolve before the write and an unknown one must fail before anything is sent.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from tools.procesio import main
|
|
16
|
+
from tools.procesio.dto.form import fieldpath
|
|
17
|
+
from tools.procesio.client import ProcesioClient
|
|
18
|
+
from tools.procesio.errors import UsageError
|
|
19
|
+
from tools.procesio.tests.conftest import FakeResp, FakeSession
|
|
20
|
+
|
|
21
|
+
APIKEY = {"type": "apikey", "key": "N", "value": "V"}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _call(action, argv, session):
|
|
25
|
+
return main.dispatch(
|
|
26
|
+
action, argv,
|
|
27
|
+
client_builder=lambda prof: ProcesioClient(profile=APIKEY, name="t", session=session))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
NS = fieldpath.FIELDS_NS
|
|
31
|
+
|
|
32
|
+
# A realistic live form: every value-bearing control carries the `value` config whose id is
|
|
33
|
+
# the fourth segment of that field's path. The earlier fixture omitted them and mapped to
|
|
34
|
+
# invented strings like "root.upload.val", which passed only because nothing checked — the
|
|
35
|
+
# same permissiveness that let five autonomous builds write a path the platform accepts and
|
|
36
|
+
# the runtime ignores.
|
|
37
|
+
def _form(event_value=None):
|
|
38
|
+
return {
|
|
39
|
+
"id": "F1", "name": "Some form", "isPrivate": False, "type": 1, "status": 1,
|
|
40
|
+
"state": True, "assignees": [], "customUrl": None,
|
|
41
|
+
"data": {
|
|
42
|
+
"code": "", "theme": [{"label": "Colors"}], "dataModel": {"id": "dm"},
|
|
43
|
+
"elements": [
|
|
44
|
+
{"id": "E1", "type": "file-upload", "configs": [
|
|
45
|
+
{"key": "name", "value": "doccipf"},
|
|
46
|
+
{"key": "value", "id": "vc-E1"},
|
|
47
|
+
{"key": "onInputEvents", "value": event_value},
|
|
48
|
+
]},
|
|
49
|
+
{"id": "E2", "type": "input", "configs": [
|
|
50
|
+
{"key": "name", "value": "nume"},
|
|
51
|
+
{"key": "value", "id": "vc-E2"},
|
|
52
|
+
]},
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _live(form):
|
|
59
|
+
return fieldpath.LiveForm(form)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
PATH_E1 = f"dm.{NS}.E1.vc-E1"
|
|
63
|
+
PATH_E2 = f"dm.{NS}.E2.vc-E2"
|
|
64
|
+
|
|
65
|
+
_PROCESS = {"flow": {"id": "P1", "variables": [
|
|
66
|
+
{"id": "v-file", "name": "fisier"}, {"id": "v-nume", "name": "nume_extras"}]}}
|
|
67
|
+
|
|
68
|
+
# Mapped by field NAME — the calling convention the action now resolves for you.
|
|
69
|
+
_CFG = {"processId": "P1",
|
|
70
|
+
"inputMap": [{"left": "fisier", "right": "doccipf"}],
|
|
71
|
+
"outputMap": [{"left": "nume_extras", "right": "nume"}]}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_variable_names_resolve_to_guids_and_only_that_element_changes():
|
|
75
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
|
|
76
|
+
out = _call("form-set-element-event",
|
|
77
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
78
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
|
|
79
|
+
|
|
80
|
+
put = s.calls[-1]
|
|
81
|
+
assert put["method"] == "PUT" and put["url"].endswith("/api/FormTemplate")
|
|
82
|
+
els = put["json"]["Data"]["elements"]
|
|
83
|
+
assert els[1] == _form()["data"]["elements"][1] # sibling untouched
|
|
84
|
+
ev = [c for c in els[0]["configs"] if c["key"] == "onInputEvents"][0]["value"]["events"][0]
|
|
85
|
+
assert ev["action"] == "RUN_PROCESS" and ev["type"] == "INPUT"
|
|
86
|
+
# Each side is the designer's OBJECT shape, not a bare string; the process
|
|
87
|
+
# side carries path {} and the form side path null.
|
|
88
|
+
assert ev["config"]["inputMap"][0]["left"] == {
|
|
89
|
+
"value": "v-file", "isList": False, "path": {}} # NAME -> GUID
|
|
90
|
+
assert ev["config"]["outputMap"][0]["left"] == {
|
|
91
|
+
"value": "v-nume", "isList": False, "path": {}}
|
|
92
|
+
# The form side is resolved too: a field NAME becomes its four-segment value path.
|
|
93
|
+
assert ev["config"]["inputMap"][0]["right"] == {
|
|
94
|
+
"value": PATH_E1, "isList": False, "path": None}
|
|
95
|
+
assert ev["config"]["outputMap"][0]["right"] == {
|
|
96
|
+
"value": PATH_E2, "isList": False, "path": None}
|
|
97
|
+
assert ev["config"]["syncRun"] is True
|
|
98
|
+
# the canonical RUN_PROCESS keys the designer needs are backfilled from a minimal config
|
|
99
|
+
assert ev["config"]["areConditionsConfigured"] is True
|
|
100
|
+
assert ev["config"]["conditions"] == [] and ev["config"]["mapLatestTriggerOnly"] is False
|
|
101
|
+
assert out["updated"] is True and out["previous_events"] == []
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_unknown_variable_name_fails_before_any_write():
|
|
105
|
+
bad = {"processId": "P1", "inputMap": [{"left": "nu_exista", "right": "doccipf"}],
|
|
106
|
+
"outputMap": []}
|
|
107
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
108
|
+
with pytest.raises(UsageError, match="neither a variable id nor a variable name"):
|
|
109
|
+
_call("form-set-element-event",
|
|
110
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
111
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(bad)], s)
|
|
112
|
+
assert all(c["method"] == "GET" for c in s.calls)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_a_null_event_slot_means_no_handler_not_an_error():
|
|
116
|
+
"""A fresh element carries the trigger key with a null value — seen on a real
|
|
117
|
+
file-upload control, which is exactly what this action is meant to wire."""
|
|
118
|
+
s = FakeSession(queue=[FakeResp(200, _form(None)), FakeResp(200, _PROCESS),
|
|
119
|
+
FakeResp(200, {})])
|
|
120
|
+
out = _call("form-set-element-event",
|
|
121
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
122
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
|
|
123
|
+
assert out["updated"] is True and out["event_count"] == 1
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def test_append_versus_replace_and_previous_is_returned():
|
|
127
|
+
existing = {"debounce": 0, "events": [{"id": "old", "type": "INPUT",
|
|
128
|
+
"action": "RUN_JAVASCRIPT", "config": {"code": "x"}}]}
|
|
129
|
+
for flags, expected in ((["--replace"], 1), ([], 2)):
|
|
130
|
+
s = FakeSession(queue=[FakeResp(200, _form(existing)), FakeResp(200, _PROCESS),
|
|
131
|
+
FakeResp(200, {})])
|
|
132
|
+
out = _call("form-set-element-event",
|
|
133
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
134
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(_CFG)] + flags, s)
|
|
135
|
+
assert out["event_count"] == expected
|
|
136
|
+
assert out["previous_events"][0]["id"] == "old" # recoverable either way
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_dry_run_writes_nothing():
|
|
140
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
141
|
+
out = _call("form-set-element-event",
|
|
142
|
+
["--id", "F1", "--element", "doccipf", "--on", "input", "--action",
|
|
143
|
+
"RUN_PROCESS", "--config", json.dumps(_CFG), "--dry-run"], s)
|
|
144
|
+
assert out["dry_run"] is True
|
|
145
|
+
assert all(c["method"] == "GET" for c in s.calls)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def test_lookup_by_id_and_a_helpful_miss():
|
|
149
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
|
|
150
|
+
out = _call("form-set-element-event",
|
|
151
|
+
["--id", "F1", "--element", "E1", "--on", "input",
|
|
152
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
|
|
153
|
+
assert out["elementId"] == "E1"
|
|
154
|
+
|
|
155
|
+
s = FakeSession(queue=[FakeResp(200, _form())])
|
|
156
|
+
with pytest.raises(UsageError, match="no element with id or name"):
|
|
157
|
+
_call("form-set-element-event",
|
|
158
|
+
["--id", "F1", "--element", "nope", "--on", "input",
|
|
159
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def test_trigger_the_element_cannot_raise_is_rejected():
|
|
163
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
164
|
+
with pytest.raises(UsageError, match="cannot raise that trigger"):
|
|
165
|
+
_call("form-set-element-event",
|
|
166
|
+
["--id", "F1", "--element", "doccipf", "--on", "click",
|
|
167
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def test_trigger_names_come_from_the_builders_verified_maps():
|
|
171
|
+
"""Re-deriving the trigger->type map here would let it drift from the builder's,
|
|
172
|
+
and a wrong event type is silently accepted by the API."""
|
|
173
|
+
from tools.procesio.dto.form import builder
|
|
174
|
+
from tools.procesio.handlers import form_events
|
|
175
|
+
for friendly in ("input", "click", "stepchange", "paginated"):
|
|
176
|
+
assert form_events._resolve_trigger(friendly) == (
|
|
177
|
+
builder._EVENT_KEY[friendly], builder._EVENT_TYPE[friendly])
|
|
178
|
+
with pytest.raises(UsageError, match="unknown trigger"):
|
|
179
|
+
form_events._resolve_trigger("not-a-trigger")
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def test_get_element_events_reports_by_trigger():
|
|
183
|
+
existing = {"debounce": 0, "events": [{"id": "e", "action": "RUN_JAVASCRIPT"}]}
|
|
184
|
+
s = FakeSession(queue=[FakeResp(200, _form(existing))])
|
|
185
|
+
out = _call("form-get-element-events", ["--id", "F1", "--element", "doccipf"], s)
|
|
186
|
+
assert out["type"] == "file-upload"
|
|
187
|
+
assert out["events"]["onInputEvents"][0]["id"] == "e"
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def test_map_rows_use_the_designers_object_shape_and_survive_a_round_trip():
|
|
191
|
+
"""Bare strings are accepted by the API but the designer cannot render the row —
|
|
192
|
+
found by reading a mapping the designer itself had written."""
|
|
193
|
+
already = {"processId": "P1",
|
|
194
|
+
"inputMap": [{"id": 0,
|
|
195
|
+
"left": {"value": "v-file", "isList": False, "path": {}},
|
|
196
|
+
"right": {"value": PATH_E1, "isList": False, "path": None}}],
|
|
197
|
+
"outputMap": []}
|
|
198
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
|
|
199
|
+
_call("form-set-element-event",
|
|
200
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
201
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(already)], s)
|
|
202
|
+
row = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
|
|
203
|
+
if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]["inputMap"][0]
|
|
204
|
+
assert row["left"] == {"value": "v-file", "isList": False, "path": {}}
|
|
205
|
+
assert row["right"] == {"value": PATH_E1, "isList": False, "path": None}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# -- RUN_DATA_STORE_OPERATION (DataStore form trigger) ----------------------
|
|
209
|
+
|
|
210
|
+
def test_datastore_trigger_writes_event_and_leaves_tree():
|
|
211
|
+
# No process fetch and no concurrency refetch (form has no updatedOn) -> GET, PUT.
|
|
212
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
|
|
213
|
+
out = _call("form-set-element-event",
|
|
214
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
215
|
+
"--action", "RUN_DATA_STORE_OPERATION",
|
|
216
|
+
"--data-store-id", "DS9", "--operation", "read"], s)
|
|
217
|
+
put = s.calls[-1]
|
|
218
|
+
assert put["method"] == "PUT" and put["url"].endswith("/api/FormTemplate")
|
|
219
|
+
els = put["json"]["Data"]["elements"]
|
|
220
|
+
assert els[1] == _form()["data"]["elements"][1] # sibling untouched
|
|
221
|
+
ev = [c for c in els[0]["configs"] if c["key"] == "onInputEvents"][0]["value"]["events"][0]
|
|
222
|
+
assert ev["action"] == "RUN_DATA_STORE_OPERATION" and ev["type"] == "INPUT"
|
|
223
|
+
cfg = ev["config"]
|
|
224
|
+
assert cfg["dataStoreId"] == "DS9" and cfg["operation"] == "READ" # name upper-cased
|
|
225
|
+
assert cfg["inputMap"] == [] and cfg["outputMap"] == []
|
|
226
|
+
assert cfg["filters"] == [] and cfg["areFiltersConfigured"] is False
|
|
227
|
+
assert out["updated"] is True
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def test_datastore_trigger_requires_datastore_id():
|
|
231
|
+
s = FakeSession(queue=[FakeResp(200, _form())])
|
|
232
|
+
with pytest.raises(UsageError, match="dataStoreId"):
|
|
233
|
+
_call("form-set-element-event",
|
|
234
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
235
|
+
"--action", "RUN_DATA_STORE_OPERATION", "--operation", "READ"], s)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def test_datastore_trigger_add_operation_omits_filters():
|
|
239
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
|
|
240
|
+
_call("form-set-element-event",
|
|
241
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
242
|
+
"--action", "RUN_DATA_STORE_OPERATION",
|
|
243
|
+
"--data-store-id", "DS9", "--operation", "ADD"], s)
|
|
244
|
+
cfg = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
|
|
245
|
+
if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]
|
|
246
|
+
assert "filters" not in cfg # ADD does not support filters
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def test_builder_trigger_datastore_branch():
|
|
250
|
+
from tools.procesio.dto.form.builder import _trigger
|
|
251
|
+
got = _trigger({"do": "datastore", "dataStoreId": "D1", "operation": "READ",
|
|
252
|
+
"inputs": [{"left": "page", "right": "root.p.val"}],
|
|
253
|
+
"filters": [{"displayName": "S", "operator": 1}]}, {})
|
|
254
|
+
assert got["action"] == "RUN_DATA_STORE_OPERATION"
|
|
255
|
+
assert got["config"]["dataStoreId"] == "D1"
|
|
256
|
+
assert got["config"]["inputMap"] == [{"id": 0, "left": "page", "right": "root.p.val"}]
|
|
257
|
+
assert got["config"]["areFiltersConfigured"] is True
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
# -- the form side of a map row: resolved, or refused -----------------------
|
|
261
|
+
#
|
|
262
|
+
# A wrong value path is the one mistake nothing downstream reports: the API answers
|
|
263
|
+
# `updated: true`, the designer renders the mapping, and clicking the control launches
|
|
264
|
+
# nothing. Measured across five autonomous builds, every one wrote
|
|
265
|
+
# `root.fields.<elementId>.value` — the NAMES from the guide's tree diagram substituted for
|
|
266
|
+
# the ids printed beside them. Since the platform will not object, the write is the last
|
|
267
|
+
# place the mistake can be caught.
|
|
268
|
+
|
|
269
|
+
def test_an_invented_value_path_is_refused_before_any_write():
|
|
270
|
+
bad = {"processId": "P1",
|
|
271
|
+
"inputMap": [{"left": "fisier", "right": "root.fields.E1.value"}],
|
|
272
|
+
"outputMap": []}
|
|
273
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
274
|
+
with pytest.raises(UsageError) as e:
|
|
275
|
+
_call("form-set-element-event",
|
|
276
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
277
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(bad)], s)
|
|
278
|
+
assert all(c["method"] == "GET" for c in s.calls), "nothing may be written"
|
|
279
|
+
msg = str(e.value)
|
|
280
|
+
assert "segment 1 'root'" in msg and "segment 2 'fields'" in msg
|
|
281
|
+
assert PATH_E1 in msg, "the message must carry the correct path"
|
|
282
|
+
assert "doccipf" in msg, "…and the field name that would have worked"
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def test_a_correct_value_path_passes_through_untouched():
|
|
286
|
+
"""Back-compat for a caller that builds the path itself — but on validity, not on
|
|
287
|
+
the presence of dots."""
|
|
288
|
+
ok = {"processId": "P1",
|
|
289
|
+
"inputMap": [{"left": "fisier", "right": PATH_E1}], "outputMap": []}
|
|
290
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
|
|
291
|
+
_call("form-set-element-event",
|
|
292
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
293
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(ok)], s)
|
|
294
|
+
row = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
|
|
295
|
+
if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]["inputMap"][0]
|
|
296
|
+
assert row["right"]["value"] == PATH_E1
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def test_a_value_config_id_borrowed_from_another_element_is_refused():
|
|
300
|
+
"""The subtle one: four id-shaped segments, correct root and namespace, but the value
|
|
301
|
+
id belongs to a DIFFERENT element. Nothing downstream notices."""
|
|
302
|
+
crossed = {"processId": "P1",
|
|
303
|
+
"inputMap": [{"left": "fisier", "right": f"dm.{NS}.E1.vc-E2"}],
|
|
304
|
+
"outputMap": []}
|
|
305
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
306
|
+
with pytest.raises(UsageError, match="must be that element's own"):
|
|
307
|
+
_call("form-set-element-event",
|
|
308
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
309
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(crossed)], s)
|
|
310
|
+
assert all(c["method"] == "GET" for c in s.calls)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def test_a_path_pointing_at_no_element_of_this_form_is_refused():
|
|
314
|
+
stray = {"processId": "P1",
|
|
315
|
+
"inputMap": [{"left": "fisier", "right": f"dm.{NS}.E9.vc-E9"}], "outputMap": []}
|
|
316
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
317
|
+
with pytest.raises(UsageError, match="is not an element on this form"):
|
|
318
|
+
_call("form-set-element-event",
|
|
319
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
320
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(stray)], s)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def test_neither_a_field_name_nor_a_path_lists_the_fields():
|
|
324
|
+
junk = {"processId": "P1",
|
|
325
|
+
"inputMap": [{"left": "fisier", "right": "campul-meu"}], "outputMap": []}
|
|
326
|
+
s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
|
|
327
|
+
with pytest.raises(UsageError) as e:
|
|
328
|
+
_call("form-set-element-event",
|
|
329
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
330
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(junk)], s)
|
|
331
|
+
assert "doccipf" in str(e.value) and "nume" in str(e.value)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def test_a_control_that_holds_no_value_cannot_be_mapped():
|
|
335
|
+
form = _form()
|
|
336
|
+
form["data"]["elements"].append(
|
|
337
|
+
{"id": "E3", "type": "heading", "configs": [{"key": "name", "value": "titlu"}]})
|
|
338
|
+
cfg = {"processId": "P1",
|
|
339
|
+
"inputMap": [{"left": "fisier", "right": "titlu"}], "outputMap": []}
|
|
340
|
+
s = FakeSession(queue=[FakeResp(200, form), FakeResp(200, _PROCESS)])
|
|
341
|
+
with pytest.raises(UsageError) as e:
|
|
342
|
+
_call("form-set-element-event",
|
|
343
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
344
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(cfg)], s)
|
|
345
|
+
# The name IS on the form, so the refusal says why that control cannot hold a value —
|
|
346
|
+
# more use than a generic "not a field" would be.
|
|
347
|
+
assert "has no 'value' config" in str(e.value) and "heading" in str(e.value)
|
|
348
|
+
# …and it is not offered as a destination anywhere.
|
|
349
|
+
assert "titlu" not in _live(form).field_names()
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def test_a_file_viewer_maps_through_its_src_config():
|
|
353
|
+
"""The one control whose value config is not named `value` — kept in the shared rule so
|
|
354
|
+
the builder and this action cannot disagree about it."""
|
|
355
|
+
form = _form()
|
|
356
|
+
form["data"]["elements"].append(
|
|
357
|
+
{"id": "E4", "type": "file-viewer", "configs": [
|
|
358
|
+
{"key": "name", "value": "previzualizare"}, {"key": "src", "id": "vc-E4"}]})
|
|
359
|
+
cfg = {"processId": "P1", "inputMap": [],
|
|
360
|
+
"outputMap": [{"left": "nume_extras", "right": "previzualizare"}]}
|
|
361
|
+
s = FakeSession(queue=[FakeResp(200, form), FakeResp(200, _PROCESS), FakeResp(200, {})])
|
|
362
|
+
_call("form-set-element-event",
|
|
363
|
+
["--id", "F1", "--element", "doccipf", "--on", "input",
|
|
364
|
+
"--action", "RUN_PROCESS", "--config", json.dumps(cfg)], s)
|
|
365
|
+
row = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
|
|
366
|
+
if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]["outputMap"][0]
|
|
367
|
+
assert row["right"]["value"] == f"dm.{NS}.E4.vc-E4"
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def test_the_builder_and_the_event_editor_share_one_path_rule():
|
|
371
|
+
"""Two places produce these paths. A second copy of the rule would be a rule nothing
|
|
372
|
+
enforces, and the platform accepts a wrong path without any error."""
|
|
373
|
+
from tools.procesio.dto.form import builder
|
|
374
|
+
assert builder._FIELDS_NS is fieldpath.FIELDS_NS
|
|
375
|
+
assert builder._value_key is fieldpath.value_key
|
|
376
|
+
assert builder._VALUE_CONFIG_KEY is fieldpath.VALUE_CONFIG_KEY
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""form-set-element-event: safe replace (O8).
|
|
2
|
+
|
|
3
|
+
An element commonly carries [RUN_PROCESS, RUN_JAVASCRIPT] on one click trigger.
|
|
4
|
+
--replace-action replaces only one action's events and keeps the rest in order;
|
|
5
|
+
bare --replace wipes everything and must warn."""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from tools.procesio import main
|
|
9
|
+
from tools.procesio.client import ProcesioClient
|
|
10
|
+
from tools.procesio.tests.conftest import FakeResp, FakeSession
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _builder(session):
|
|
14
|
+
return lambda prof: ProcesioClient(
|
|
15
|
+
profile={"type": "apikey", "key": "N", "value": "V"}, name="t", session=session)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _form():
|
|
19
|
+
"""A button whose click trigger already carries two events (a process run and a
|
|
20
|
+
JS handler), in that order."""
|
|
21
|
+
return {
|
|
22
|
+
"id": "F1", "name": "F", "type": 0, "status": 1, "state": True,
|
|
23
|
+
"data": {"elements": [
|
|
24
|
+
{"id": "btn", "type": "button", "configs": [
|
|
25
|
+
{"key": "name", "value": "btn"},
|
|
26
|
+
{"key": "onClickEvents", "value": {"debounce": 0, "events": [
|
|
27
|
+
{"id": "ev-proc", "type": "onClick", "action": "RUN_PROCESS",
|
|
28
|
+
"config": {"processId": "p"}},
|
|
29
|
+
{"id": "ev-js", "type": "onClick", "action": "RUN_JAVASCRIPT",
|
|
30
|
+
"config": {"code": "old"}},
|
|
31
|
+
]}},
|
|
32
|
+
]},
|
|
33
|
+
]},
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _events_in_put(sess):
|
|
38
|
+
put = sess.calls[-1]
|
|
39
|
+
assert put["method"] == "PUT"
|
|
40
|
+
assert put["url"].endswith("/api/FormTemplate")
|
|
41
|
+
els = put["json"]["Data"]["elements"]
|
|
42
|
+
cfg = next(c for c in els[0]["configs"] if c["key"] == "onClickEvents")
|
|
43
|
+
return cfg["value"]["events"]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_replace_action_preserves_other_events_and_order():
|
|
47
|
+
# GET (fetch) then PUT; no concurrency token on the form -> no extra refetch.
|
|
48
|
+
sess = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
|
|
49
|
+
main.dispatch(
|
|
50
|
+
"form-set-element-event",
|
|
51
|
+
["--id", "F1", "--element", "btn", "--on", "click",
|
|
52
|
+
"--action", "RUN_JAVASCRIPT", "--config", '{"code": "new"}',
|
|
53
|
+
"--replace-action", "RUN_JAVASCRIPT"],
|
|
54
|
+
client_builder=_builder(sess))
|
|
55
|
+
events = _events_in_put(sess)
|
|
56
|
+
assert [e["action"] for e in events] == ["RUN_PROCESS", "RUN_JAVASCRIPT"]
|
|
57
|
+
assert events[0]["id"] == "ev-proc" # the process event survived, in place
|
|
58
|
+
assert events[1]["id"] != "ev-js" # the JS event was replaced
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_bare_replace_warns_when_discarding_multiple():
|
|
62
|
+
sess = FakeSession(queue=[FakeResp(200, _form())])
|
|
63
|
+
out = main.dispatch(
|
|
64
|
+
"form-set-element-event",
|
|
65
|
+
["--id", "F1", "--element", "btn", "--on", "click",
|
|
66
|
+
"--action", "RUN_JAVASCRIPT", "--config", '{"code": "new"}',
|
|
67
|
+
"--replace", "--dry-run"],
|
|
68
|
+
client_builder=_builder(sess))
|
|
69
|
+
assert out["event_count"] == 1 # everything replaced
|
|
70
|
+
assert "warning" in out
|
|
71
|
+
assert "RUN_PROCESS" in out["warning"] and "--replace-action" in out["warning"]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_replace_and_replace_action_are_mutually_exclusive():
|
|
75
|
+
from tools.procesio import errors
|
|
76
|
+
sess = FakeSession(queue=[FakeResp(200, _form())])
|
|
77
|
+
try:
|
|
78
|
+
main.dispatch(
|
|
79
|
+
"form-set-element-event",
|
|
80
|
+
["--id", "F1", "--element", "btn", "--on", "click",
|
|
81
|
+
"--action", "RUN_JAVASCRIPT", "--config", '{"code": "x"}',
|
|
82
|
+
"--replace", "--replace-action", "RUN_JAVASCRIPT"],
|
|
83
|
+
client_builder=_builder(sess))
|
|
84
|
+
assert False, "expected UsageError"
|
|
85
|
+
except errors.UsageError as e:
|
|
86
|
+
assert "not both" in str(e)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Control events -> element event configs. Event type/key/action values VERIFIED
|
|
2
|
+
2026-06-25 against ui-builder source (trigger.ts, FieldEvents.component.vue, EventType /
|
|
3
|
+
EventAction enums in model/config/events). Guards the bugs fixed there (open/close=
|
|
4
|
+
SIDE_PANEL_*, step*=STEPPER_*, message*=CHAT_*, form=TRIGGER_FORM not RUN_FORM)."""
|
|
5
|
+
import uuid
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from tools.procesio.dto.form import builder
|
|
10
|
+
from tools.procesio.errors import UsageError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _build(el):
|
|
14
|
+
dto = builder.build({"name": "E", "elements": [el]},
|
|
15
|
+
{"new_id": lambda: str(uuid.uuid4())})
|
|
16
|
+
return dto["Data"]["elements"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _event(els, el_type, cfg_key):
|
|
20
|
+
el = next(e for e in els if e["type"] == el_type)
|
|
21
|
+
return next(c for c in el["configs"] if c["key"] == cfg_key)["value"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_click_js_event():
|
|
25
|
+
els = _build({"type": "button", "label": "B",
|
|
26
|
+
"events": [{"on": "click", "do": "js", "code": "x()"}]})
|
|
27
|
+
ev = _event(els, "button", "onClickEvents")
|
|
28
|
+
assert ev["events"][0]["type"] == "CLICK"
|
|
29
|
+
assert ev["events"][0]["action"] == "RUN_JAVASCRIPT"
|
|
30
|
+
assert ev["events"][0]["config"] == {"code": "x()"}
|
|
31
|
+
assert ev["debounce"] == 0
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_side_panel_open_close_types():
|
|
35
|
+
els = _build({"type": "side-panel", "label": "SP", "events": [
|
|
36
|
+
{"on": "open", "do": "js", "code": "o()"},
|
|
37
|
+
{"on": "close", "do": "js", "code": "c()"}]})
|
|
38
|
+
assert _event(els, "side-panel", "onOpenEvents")["events"][0]["type"] == "SIDE_PANEL_OPEN"
|
|
39
|
+
assert _event(els, "side-panel", "onCloseEvents")["events"][0]["type"] == "SIDE_PANEL_CLOSE"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_stepper_step_event_type():
|
|
43
|
+
els = _build({"type": "stepper", "label": "S",
|
|
44
|
+
"events": [{"on": "stepchange", "do": "js", "code": "s()"}]})
|
|
45
|
+
assert _event(els, "stepper", "onStepChangeEvents")["events"][0]["type"] == "STEPPER_STEP_CHANGE"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_process_event_shape():
|
|
49
|
+
els = _build({"type": "input", "label": "I", "events": [
|
|
50
|
+
{"on": "input", "do": "process", "processId": "p1", "syncRun": True}]})
|
|
51
|
+
ev = _event(els, "input", "onInputEvents")["events"][0]
|
|
52
|
+
assert ev["type"] == "INPUT" and ev["action"] == "RUN_PROCESS"
|
|
53
|
+
assert ev["config"]["processId"] == "p1" and ev["config"]["syncRun"] is True
|
|
54
|
+
assert "inputMap" in ev["config"] and "outputMap" in ev["config"]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_trigger_form_action():
|
|
58
|
+
els = _build({"type": "button", "label": "B",
|
|
59
|
+
"events": [{"on": "click", "do": "form", "formId": "f1"}]})
|
|
60
|
+
ev = _event(els, "button", "onClickEvents")["events"][0]
|
|
61
|
+
assert ev["action"] == "TRIGGER_FORM" # not RUN_FORM
|
|
62
|
+
assert ev["config"]["formId"] == "f1" and "mapping" in ev["config"]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_unknown_event_fails_loud():
|
|
66
|
+
with pytest.raises(UsageError):
|
|
67
|
+
_build({"type": "input", "label": "I", "events": [{"on": "nope", "do": "js"}]})
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _value_cfg(els, el_type):
|
|
71
|
+
el = next(e for e in els if e["type"] == el_type)
|
|
72
|
+
return next(c for c in el["configs"] if c["key"] == "value")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def test_multiple_file_upload_value_is_array():
|
|
76
|
+
# a multiple file-upload is array-valued: its value config must default to [] + isList=True
|
|
77
|
+
# (else the form sends a single object and a List<File> process input fails at launch).
|
|
78
|
+
els = _build({"type": "file-upload", "name": "docs", "multiple": True})
|
|
79
|
+
v = _value_cfg(els, "file-upload")
|
|
80
|
+
assert v["value"] == [] and v["isList"] is True
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_single_file_upload_value_not_array():
|
|
84
|
+
els = _build({"type": "file-upload", "name": "doc"}) # multiple defaults false
|
|
85
|
+
v = _value_cfg(els, "file-upload")
|
|
86
|
+
assert v["value"] != [] and not v.get("isList")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_list_control_value_is_array():
|
|
90
|
+
els = _build({"type": "list", "name": "rows"})
|
|
91
|
+
v = _value_cfg(els, "list")
|
|
92
|
+
assert v["value"] == [] and v["isList"] is True
|