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,45 @@
|
|
|
1
|
+
# PROCESIO `Send Email` — credential optionality (why a "permanently optional email branch" can't ship credential-less)
|
|
2
|
+
|
|
3
|
+
Live-probed on the `Send Email` action (`c7673492-…`) while building a **zero-credential**
|
|
4
|
+
marketplace template (must import and run with no credentials configured). The question: can
|
|
5
|
+
an email branch be built that runs when an SMTP credential + recipient are present and is
|
|
6
|
+
skipped cleanly when they are not — inside a template that ships with **no** SMTP credential?
|
|
7
|
+
Answer: **no, not via the API.** `Send Email` requires a real, bound SMTP credential just to
|
|
8
|
+
**save**. Evidence (each from `process-create --dry-run`, which runs FE then BE validation):
|
|
9
|
+
|
|
10
|
+
| Attempt | Result |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `Send Email` with **no** credential bound | **FE blocks**: `REQUIRED` — *"Please make sure that the action is defined/configured properly."* on badge **"Send Email - Select SMTP credentials"**. (BE was empty.) |
|
|
13
|
+
| Credential field bound to a **variable** (`{var:...}`) instead of a literal | FE passes, but **BE blocks**: *"Nullable object must have a value."* |
|
|
14
|
+
| Bind a **mock/dummy** credential GUID | Rejected by policy — a credential that doesn't resolve is a support ticket on import; never do this. |
|
|
15
|
+
| Keep a gated `Decisional` **without** a `Send Email` (both branches → one `Join`) | **BE blocks**: *"Duplicate connection port! SourceId … DestinationId …"* — two ports from one source to the same destination are illegal. |
|
|
16
|
+
|
|
17
|
+
## Consequences (rules)
|
|
18
|
+
|
|
19
|
+
- **`Send Email` is only saveable with a real, bound SMTP credential GUID** (a literal
|
|
20
|
+
credential instance id). Neither empty nor variable-bound satisfies validation.
|
|
21
|
+
- Therefore, in a template that must run with **zero credentials**, the email node **cannot
|
|
22
|
+
be part of the shipped flow** — and neither can a "placeholder" gated `Decisional`, because
|
|
23
|
+
a Decisional's two branches must go to **two distinct targets**; with no `Send Email` to be
|
|
24
|
+
the second target, both would collapse onto the `Join` → "Duplicate connection port".
|
|
25
|
+
- **Ship the flow linear** (no `Send Email`, no decorative `Decisional`/`Join`). Keep the
|
|
26
|
+
optional recipient **input variable** so the future email step has its trigger. The
|
|
27
|
+
zero-config run reaches `Stop` and produces its file outputs with no credential in play —
|
|
28
|
+
outputs never depend on a credential, which is the template standard.
|
|
29
|
+
- This is a genuine **template-standard** finding, not a one-card quirk: any credential-less
|
|
30
|
+
marketplace template that wants an *optional* notification must add it **post-import**, not
|
|
31
|
+
ship it dormant.
|
|
32
|
+
|
|
33
|
+
## Add the gated email branch AFTER import (manual UI recipe, once an SMTP credential exists)
|
|
34
|
+
|
|
35
|
+
The gated branch *is* valid once there is a credential to bind (case and default then have
|
|
36
|
+
two distinct targets):
|
|
37
|
+
|
|
38
|
+
1. Create/adopt an **SMTP credential** in the workspace (Credentials → new SMTP).
|
|
39
|
+
2. On the canvas, after the file-producing step, add a **Decisional** "Has Recipient?" with a
|
|
40
|
+
single case `SubmitterEmail IS_NOT_EMPTY`.
|
|
41
|
+
3. In the **true** branch add **Send Email**: bind the SMTP credential; `To = SubmitterEmail`;
|
|
42
|
+
set Subject/Body; **Map attachment = [ExcelFile, PdfFile] as a `list<File>`** (a single
|
|
43
|
+
`File` silently drops the attachment though the run still returns status 50).
|
|
44
|
+
4. Wire **Send Email → Join**; wire the Decisional **default → Join**; **Join → Stop**. Two
|
|
45
|
+
distinct targets (Send Email vs Join) — no duplicate-port error.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# PROCESIO "Send Email" action — attachment + dynamic recipient
|
|
2
|
+
|
|
3
|
+
How a PROCESIO **Send Email** action node sends an email with a **file
|
|
4
|
+
attachment** and a **dynamic (variable) recipient**. Verified against both the
|
|
5
|
+
offline `.procesio` export and the live `GET /api/Actions?getFullAction=true`
|
|
6
|
+
catalog for workspace `3fd85e9d-121e-415b-877f-f488cd685ce3`.
|
|
7
|
+
|
|
8
|
+
**Reference flow (real, working):**
|
|
9
|
+
`tools/procesio/docs_info/Exports/export_POSF_PROCESIO.procesio` ->
|
|
10
|
+
Flow **"Notification/Process Event with FILE"** -> action
|
|
11
|
+
`ActionName="notify"`, `ActionTemplateName="Send Email"`,
|
|
12
|
+
`TemplateId = c7673492-2912-4975-8cab-747fb9f4085d`, `Category = "cat1"`.
|
|
13
|
+
|
|
14
|
+
This is a node-building note (how to author the action's `Parameters[]` in a
|
|
15
|
+
flow DTO), complementing the API/auth notes — see
|
|
16
|
+
[PROCESIO-API-NOTES.md](PROCESIO-API-NOTES.md).
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. "Send Email" is the only send action (SMTP, NOT SendGrid)
|
|
21
|
+
|
|
22
|
+
The action catalog has four email-related actions:
|
|
23
|
+
|
|
24
|
+
| Action | Purpose |
|
|
25
|
+
|---|---|
|
|
26
|
+
| **Send Email** | **The ONLY email-send action.** SMTP-based. |
|
|
27
|
+
| Read Mailbox | Read incoming mail |
|
|
28
|
+
| Read Mailbox V2 | Read incoming mail (newer) |
|
|
29
|
+
| Word Mail Merge | Mail-merge a Word template |
|
|
30
|
+
|
|
31
|
+
There is **no SendGrid action** in PROCESIO — "Send Email" goes out over SMTP.
|
|
32
|
+
Its **first** configuration field is `type="credentials"`, label
|
|
33
|
+
**"Select SMTP credentials"**, with
|
|
34
|
+
`credentialsTemplateId = 20202020-0001-0000-0000-aaaaaaaaaaaa`. The bound
|
|
35
|
+
value is the GUID of a stored SMTP credential (in the example below,
|
|
36
|
+
`2aacf4f1-310c-469f-80ef-394d6ab9582f`).
|
|
37
|
+
|
|
38
|
+
## 2. Variable-binding pattern (applies to every field)
|
|
39
|
+
|
|
40
|
+
Every configurable field is one entry in the action's `Parameters[]` array:
|
|
41
|
+
|
|
42
|
+
```jsonc
|
|
43
|
+
{
|
|
44
|
+
"TabPropertyId": "<field GUID>", // which field (see map in section 3)
|
|
45
|
+
"Variable": [ // [] when the field is empty/literal
|
|
46
|
+
{ "id": 0, "variableId": "<flow var GUID>", "attribute": null }
|
|
47
|
+
],
|
|
48
|
+
"Value": "<%0%>" // PROCESIO placeholder(s) + literal text
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- **`Value`** holds PROCESIO placeholders of the form **`<%N%>`**, where `N` is
|
|
53
|
+
the `id` of the matching entry in `Variable[]`. Placeholders are **mixable
|
|
54
|
+
with literal text** — e.g. a Subject of `"Notificare mesaj: <%1%>"` injects
|
|
55
|
+
flow variable `id:1` after the literal prefix.
|
|
56
|
+
- Each `<%N%>` in `Value` must have a `Variable[]` entry whose `id == N`; that
|
|
57
|
+
entry's `variableId` is the flow variable's GUID. `attribute` is `null` for a
|
|
58
|
+
whole-variable bind (set it to bind a sub-property of a complex variable).
|
|
59
|
+
- A field that is **empty or purely literal** has **`Variable: []`** and either a
|
|
60
|
+
literal string `Value` (e.g. From display name `"POSF Notification"`) or
|
|
61
|
+
`""`/`null`.
|
|
62
|
+
|
|
63
|
+
## 3. TabPropertyId map — Send Email fields
|
|
64
|
+
|
|
65
|
+
| TabPropertyId | Field | Type / notes |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `f9d5da64-bbc0-4d53-a0ad-6f948cc3ff05` | **Select SMTP credentials** | `credentials` (credentialsTemplateId `20202020-0001-0000-0000-aaaaaaaaaaaa`) |
|
|
68
|
+
| `90d1ec9f-803c-42bc-bd8b-ca11e4ef116c` | **From (Display Name)** | string |
|
|
69
|
+
| `90d1ec9f-803c-42bc-bd8b-ca11e4ef11c6` | **From (Entity)** | string — WARNING: differs from Display Name only in the last 4 chars (`...11c6` vs `...116c`); easy to transpose |
|
|
70
|
+
| `1def19eb-ec69-4a21-a756-4abec8ae3171` | **To** | string (dynamic recipient — see section 5) |
|
|
71
|
+
| `30ba958f-0d83-4259-97b9-d64ce7282d83` | **Cc** | string |
|
|
72
|
+
| `1b6fbfac-183a-481b-9e0d-d4e7cf5543fe` | **Bcc** | string |
|
|
73
|
+
| `9eeaf788-c023-4848-afe7-2454840bd321` | **Subject** | string |
|
|
74
|
+
| `235aa4cf-d20f-4dbb-ad1d-d03e5ff5f13e` | **Body** | code-editor (HTML or plain text) |
|
|
75
|
+
| `5330da65-bd38-4419-88c7-93136bdb6dd9` | **Map attachment** | `file`, `isList=true`, dataTypeId `10c6ac59-3929-49e6-99dc-121212121219` (see section 4) |
|
|
76
|
+
| `3fdba8f7-75b5-4350-9d85-b542f8e5a73d` | **Body is Html** | check-box (`Value: null`/false = plain text; true = HTML) |
|
|
77
|
+
|
|
78
|
+
## 4. Attachment — bind a File-typed variable
|
|
79
|
+
|
|
80
|
+
Bind TabPropertyId **`5330da65-bd38-4419-88c7-93136bdb6dd9`** (Map attachment)
|
|
81
|
+
to a **File** flow variable.
|
|
82
|
+
|
|
83
|
+
- File DataType id = **`10c6ac59-3929-49e6-99dc-121212121219`**.
|
|
84
|
+
- The field is a **list** (`isList=true`), so a **`List<File>`** fits naturally;
|
|
85
|
+
a **single `File`** variable also works.
|
|
86
|
+
- In the reference flow it is bound to variable **`mailList`** (a `List<File>`,
|
|
87
|
+
`IsList=True`, DataType `10c6ac59-...121219`).
|
|
88
|
+
- **No inline / base64 content.** Files travel as **PROCESIO File variable
|
|
89
|
+
references** — you build/obtain a File (e.g. via *Object To File*, *Export To
|
|
90
|
+
CSV*, a download action) earlier in the flow and pass that variable here. The
|
|
91
|
+
binding is `Variable:[{id:N, variableId:<file var>, attribute:null}]`,
|
|
92
|
+
`Value:"<%N%>"`.
|
|
93
|
+
|
|
94
|
+
## 5. Dynamic recipient — bind a String variable
|
|
95
|
+
|
|
96
|
+
Bind TabPropertyId **`1def19eb-ec69-4a21-a756-4abec8ae3171`** (To) to a
|
|
97
|
+
**String** flow variable (DataType `0317bfee-b2f5-4bde-bfe8-121212121214`).
|
|
98
|
+
|
|
99
|
+
- **One recipient:** point the String variable at a single address.
|
|
100
|
+
- **Multiple recipients:** use **one String variable holding comma-joined
|
|
101
|
+
addresses** (NOT a List). In the reference flow the To field binds variable
|
|
102
|
+
**`emailsConcatenated`**, which is built upstream by a **For-Each** over the
|
|
103
|
+
recipient list feeding a **Concatenate** action (`concatEmails` +
|
|
104
|
+
`concatCrtEmail` in the same flow).
|
|
105
|
+
|
|
106
|
+
- **Separator: use `;` for a LITERAL list, not `,` (verified live 2026-09-30).** A literal
|
|
107
|
+
To value `a@example.com,b@example.com` fails AT RUN with `Invalid emails a@example.com,b@example.com` (instance
|
|
108
|
+
status 40); the same value with `;` sends to both. Validation (FE + BE) passes either way, so
|
|
109
|
+
only a run catches it. Prefer `;` for variable-built lists too.
|
|
110
|
+
- **SendGrid-backed SMTP credential: From (Entity) must be a verified sender.** Leaving it empty
|
|
111
|
+
(or using an unverified address) fails at run with `The from address does not match a verified
|
|
112
|
+
Sender Identity`. Find a working sender by reading an existing Send Email node that uses the
|
|
113
|
+
same credential (field `90d1ec9f-...11c6`) and reuse its From (Entity).
|
|
114
|
+
|
|
115
|
+
## 6. Built-in dataTypeIds (for typing flow variables)
|
|
116
|
+
|
|
117
|
+
| Type | dataTypeId |
|
|
118
|
+
|---|---|
|
|
119
|
+
| String | `0317bfee-b2f5-4bde-bfe8-121212121214` |
|
|
120
|
+
| Text (rich) | `0317bfee-b2f5-4bde-bfe8-121212121221` |
|
|
121
|
+
| Boolean | `0317bfee-b2f5-4bde-bfe8-121212121210` |
|
|
122
|
+
| Integer / Guid | `0317bfee-b2f5-4bde-bfe8-121212121211` |
|
|
123
|
+
| File | `10c6ac59-3929-49e6-99dc-121212121219` |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Reference — verbatim `Parameters[]` from the `notify` action
|
|
128
|
+
|
|
129
|
+
Taken as-is from the reference flow. Note the byte between `Notificare mesaj:`
|
|
130
|
+
and `<%1%>` in the Subject is **U+00A0 (non-breaking space)**, not a normal
|
|
131
|
+
space — preserved verbatim below.
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
[
|
|
135
|
+
{
|
|
136
|
+
"TabPropertyId": "f9d5da64-bbc0-4d53-a0ad-6f948cc3ff05",
|
|
137
|
+
"Variable": [],
|
|
138
|
+
"Value": "2aacf4f1-310c-469f-80ef-394d6ab9582f"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"TabPropertyId": "90d1ec9f-803c-42bc-bd8b-ca11e4ef116c",
|
|
142
|
+
"Variable": [],
|
|
143
|
+
"Value": "POSF Notification"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"TabPropertyId": "1def19eb-ec69-4a21-a756-4abec8ae3171",
|
|
147
|
+
"Variable": [
|
|
148
|
+
{
|
|
149
|
+
"id": 0,
|
|
150
|
+
"variableId": "82957998-8f7f-46d6-819e-e370d9bc913d",
|
|
151
|
+
"attribute": null
|
|
152
|
+
}
|
|
153
|
+
],
|
|
154
|
+
"Value": "<%0%>"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"TabPropertyId": "30ba958f-0d83-4259-97b9-d64ce7282d83",
|
|
158
|
+
"Variable": [],
|
|
159
|
+
"Value": ""
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"TabPropertyId": "1b6fbfac-183a-481b-9e0d-d4e7cf5543fe",
|
|
163
|
+
"Variable": [],
|
|
164
|
+
"Value": ""
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"TabPropertyId": "9eeaf788-c023-4848-afe7-2454840bd321",
|
|
168
|
+
"Variable": [
|
|
169
|
+
{
|
|
170
|
+
"id": 1,
|
|
171
|
+
"variableId": "50f8dbbe-ccc6-477b-9492-1544bb011d2d",
|
|
172
|
+
"attribute": null
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"Value": "Notificare mesaj: <%1%>"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"TabPropertyId": "235aa4cf-d20f-4dbb-ad1d-d03e5ff5f13e",
|
|
179
|
+
"Variable": [],
|
|
180
|
+
"Value": "Hello,
|
|
181
|
+
|
|
182
|
+
The message body goes here. Line breaks in a plain-text body are literal \r\n sequences inside the JSON string, not real newlines.
|
|
183
|
+
|
|
184
|
+
Regards,
|
|
185
|
+
The team"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"TabPropertyId": "5330da65-bd38-4419-88c7-93136bdb6dd9",
|
|
189
|
+
"Variable": [
|
|
190
|
+
{
|
|
191
|
+
"id": 2,
|
|
192
|
+
"variableId": "3b45476e-b634-4e05-9fb5-c7ac521615ed",
|
|
193
|
+
"attribute": null
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
"Value": "<%2%>"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"TabPropertyId": "3fdba8f7-75b5-4350-9d85-b542f8e5a73d",
|
|
200
|
+
"Variable": [],
|
|
201
|
+
"Value": null
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
How the example binds each field (resolved against the flow's `Variables[]`):
|
|
207
|
+
|
|
208
|
+
| TabPropertyId | Field | Binding |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| `f9d5da64-...ff05` | SMTP credentials | literal credential GUID `2aacf4f1-310c-469f-80ef-394d6ab9582f` |
|
|
211
|
+
| `90d1ec9f-...116c` | From (Display Name) | literal `"POSF Notification"` |
|
|
212
|
+
| `1def19eb-...3171` | **To** | `<%0%>` -> var `emailsConcatenated` (String, comma-joined) |
|
|
213
|
+
| `30ba958f-...2d83` | Cc | empty |
|
|
214
|
+
| `1b6fbfac-...543fe` | Bcc | empty |
|
|
215
|
+
| `9eeaf788-...d321` | Subject | `"Notificare mesaj: <%1%>"` -> var `messageType` (String) |
|
|
216
|
+
| `235aa4cf-...5f13e` | Body | literal multi-line plain-text body |
|
|
217
|
+
| `5330da65-...6dd9` | **Map attachment** | `<%2%>` -> var `mailList` (List<File>) |
|
|
218
|
+
| `3fdba8f7-...a73d` | Body is Html | `null` (unchecked -> plain-text body) |
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Corroborating flows (also use Send Email + Map attachment)
|
|
223
|
+
|
|
224
|
+
Same pattern verified across other production exports under
|
|
225
|
+
`tools/procesio/docs_info/Exports/`:
|
|
226
|
+
|
|
227
|
+
- **RINGHEL_RINGHEL 1** -> `HR_UC/Add CtrAndAnnex`
|
|
228
|
+
- **RINGHEL_RINGHEL 1** -> `PRC/Generate Contract`
|
|
229
|
+
- **OMS_v2_dev** -> `notification/lateDeliveryNote`
|
|
230
|
+
- **OMS_v2_dev** -> `utilitary/extractFile`
|
|
231
|
+
- **RINGHEL_Demo** -> `Party Invite/Send email to all attendees`
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Map attachment requires `list<File>` (verified live 2026-06-25)
|
|
236
|
+
|
|
237
|
+
The **"Map attachment"** field (`TabPropertyId 5330da65-bd38-4419-88c7-93136bdb6dd9`,
|
|
238
|
+
`type="file"`) is a **LIST of files** at runtime. Binding a **single** `File` variable
|
|
239
|
+
(model `10c6ac59-3929-49e6-99dc-121212121219`, `isList:false`) makes the designer show
|
|
240
|
+
**"Error: data type mismatch"** on the Send Email node and the email sends with **NO
|
|
241
|
+
attachment** — and the run STILL returns **status 50** (the mismatch does not fail the run,
|
|
242
|
+
so a green run is NOT proof the file attached). The designer's "+ Add Variable" tooltip on
|
|
243
|
+
that field literally reads **"Add Variable type=list <File>"**.
|
|
244
|
+
|
|
245
|
+
**Fix:** the bound variable must be **`isList:true`** (a `list<File>`). So:
|
|
246
|
+
- Declare the process input as `{model: "10c6ac59-…", isList: true}`.
|
|
247
|
+
- When running directly, pass the file DTO **inside a list**: `"briefFile": [ <fileDTO> ]`.
|
|
248
|
+
- A form file-upload control already holds a list, so a form→process attachment binds cleanly.
|
|
249
|
+
|
|
250
|
+
A **dynamic recipient** is a normal variable bind: `To` Value `<%0%>` + `Variable:[{id:0,
|
|
251
|
+
variableId: <recipientEmail var>}]` — verified delivering live to the entered address, with
|
|
252
|
+
the `list<File>` PDF attached (form → Process 2 brief → Process 3 email, AAT_ use case).
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# PROCESIO SQL Server actions — PARAMETERIZED (safe) vs INLINE `<%N%>` (WRONG)
|
|
2
|
+
|
|
3
|
+
**Discovered 2026-07-03** during a review of a chat flow's contact-resolution
|
|
4
|
+
nodes: the reviewer suffixed the existing nodes `[old]`, disabled them, and added
|
|
5
|
+
`[new]` nodes "properly configured using parameters". The whole 2026-07 Networky build authored
|
|
6
|
+
SQL nodes by **string-interpolating flow-variable values into the SQL text** as `N'<%N%>'`. That is
|
|
7
|
+
(a) SQL-injection-prone and (b) the wrong action configuration.
|
|
8
|
+
|
|
9
|
+
## THE RULE
|
|
10
|
+
Never interpolate a flow-variable value into SQL as `N'<%N%>'`. Use the **`Execute Query`** action
|
|
11
|
+
(NOT `Execute Query V2`) — or **`Execute Command`** for non-query writes — with its **parameter
|
|
12
|
+
binding**: named `@params` in the SQL + a **`Parameters config tab`** (`map-parameters`) collection
|
|
13
|
+
mapping each `@param` to a flow variable. The DB driver passes values as **typed SQL parameters**
|
|
14
|
+
(escaped), so `O'Brien`, quotes, or malicious input can never break or inject the query.
|
|
15
|
+
Literals (`@TopN = 5`) may stay inline. Variable values must be bound, never inlined.
|
|
16
|
+
|
|
17
|
+
## WRONG (injectable — do NOT author, and convert existing)
|
|
18
|
+
- Template **`Execute Query V2`** (inline-only; substitutes `<%N%>` as raw string into the SQL text).
|
|
19
|
+
- Any `Execute Query` / `Execute Command` node whose SQL contains `N'<%N%>'` / `'<%N%>'` for a value.
|
|
20
|
+
```sql
|
|
21
|
+
-- INJECTABLE: a name like O'Brien or '; DROP ... breaks/injects it
|
|
22
|
+
EXEC sp_FindContact @ConversationId = N'<%0%>', @Query = N'<%1%>', @TopN = 5
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## CORRECT — `Execute Query` template, parameter binding
|
|
26
|
+
```sql
|
|
27
|
+
EXEC sp_FindContact @ConversationId = @conversationId, @Query = @resolveHint, @TopN = 5
|
|
28
|
+
```
|
|
29
|
+
plus a binding: `@conversationId <- flowVar(conversation)`, `@resolveHint <- flowVar(resolveHint)`.
|
|
30
|
+
|
|
31
|
+
### Exact node DTO (the `Execute Query` template — property ids are stable, reuse them)
|
|
32
|
+
`customData.configuration[0].settings`:
|
|
33
|
+
- `Select Database Server` (type `credentials`) = credential gid (e.g. `45a1dd18-…` = Database).
|
|
34
|
+
- `Execute Query` (type `side-pannel`) = a list of sub-settings:
|
|
35
|
+
- `{id: 11350a1d-4139-d942-adcb-a2c2c52e5e22, label: "Query", type: "code-editor", language: "sql", value: <SQL with @params>}`
|
|
36
|
+
- `{id: 73416282-bcfe-4934-9e40-a39f2bb33d2d, label: "Parameters config tab", type: "map-parameters", value: [{id, destination: "<paramName>", source: "<variableId>"}]}`
|
|
37
|
+
- `{id: 9ce93b2d-5226-4228-a64d-3693c8d3e0e3, label: "Time Out", type: "number", value: "100"}`
|
|
38
|
+
- `{id: 8aa02e91-1a1e-a44a-b09b-6965d67da04d, label: "Output", type: "any", value: "<output-var-gid>"}`
|
|
39
|
+
|
|
40
|
+
`parameters[]` (the RUNTIME form the engine executes — must be kept in sync with the settings;
|
|
41
|
+
tabPropertyId == the setting/sub-setting id):
|
|
42
|
+
- `{tabPropertyId: f96ff811-572f-084a-8cac-a74a2c2e365f, value: "<credential-gid>"}` (Select Database Server)
|
|
43
|
+
- `{tabPropertyId: 11350a1d-…, value: "<SQL text with @params>"}` (Query)
|
|
44
|
+
- `{tabPropertyId: 73416282-…, value: [ {id:0, source:{value:"<%0%>", variable:[{id:0, variableId:"<gid>", attribute:null}]}, destination:{value:"<paramName>", variable:[]}}, … ] }` (binding)
|
|
45
|
+
- `{tabPropertyId: 9ce93b2d-…, value: "100"}` (Time Out)
|
|
46
|
+
- `{tabPropertyId: 8aa02e91-…, value: "<%K%>"}` (Output binding; setting holds the output-var gid)
|
|
47
|
+
|
|
48
|
+
Binding semantics: `destination.value` = the SQL parameter NAME (as it appears after `@` in the SQL —
|
|
49
|
+
the action substitutes it with a typed parameter); `source.value` = a positional `<%N%>` whose
|
|
50
|
+
`variable[0].variableId` is the flow variable GUID. So: SQL `@conversationId` ⇄ binding
|
|
51
|
+
`destination:"conversationId"` ⇄ `source:<%0%>` ⇄ variable `conversation`.
|
|
52
|
+
|
|
53
|
+
Reference DTO captured at `scratchpad/eq_reference.json` (the live `Execute Query [new]` from Resolve Contact).
|
|
54
|
+
|
|
55
|
+
## `Execute Command` (SQL Server Command — INSERT/UPDATE/DELETE, no result set)
|
|
56
|
+
Same defect when inlined — e.g. `Chat Flow/Extract Info Image` `Execute Command` node:
|
|
57
|
+
`UPDATE messages SET ocr_text = COALESCE(ocr_text,' ') + N'<%0%>' …` (inline, injectable if the value
|
|
58
|
+
is OCR/user text). Fix identically: named `@param` in the SQL + the `Parameters config tab` binding.
|
|
59
|
+
(The Command template exposes the same `Query`/`Parameters config tab`/`Time Out` sub-settings; confirm
|
|
60
|
+
its property ids from a live corrected node before authoring — do not assume they equal the Query ids.)
|
|
61
|
+
|
|
62
|
+
## Converter / tooling — the `procesio` tool (NOT a Networky script)
|
|
63
|
+
- **`procesio sql-scan --id <process-id>`** — lists every SQL node (Execute Query / Execute Command) with inline-vs-parameterized status. Read-only.
|
|
64
|
+
- **`procesio sql-parameterize --id <process-id> {--node <label|id> | --all} [--dry-run]`** — converts inline `N'<%K%>'` → `@pK`, builds the `Parameters config tab` binding from the node's `<%N%>`→variable map (migrating a deprecated `Execute Query V2` node to `Execute Query`), then PROCESIO-validates and PUTs. NEVER PUTs an invalid flow; `--dry-run` previews.
|
|
65
|
+
- Implementation: `tools/procesio/flowmodel/sqlparam.py` (pure) + `tools/procesio/handlers/sqlactions.py` + `tools/procesio/tests/test_sqlparam.py`.
|
|
66
|
+
- **flowpatch note:** `setscript`/`syncparams` `_to_runtime_form` (GUID→`<%N%>`) is for **CODE (JS) nodes**,
|
|
67
|
+
NOT SQL. Never use it to (re)author a SQL node's `<%N%>` — that reproduces the injectable inline form.
|
|
68
|
+
|
|
69
|
+
## Scope in the live build (to convert; audit ongoing)
|
|
70
|
+
- `Execute Query V2` nodes (inline): `Get Last 10 msg` (sp_GetLastMesseges) in Start + clone (GUID inlined — low risk, still convert).
|
|
71
|
+
- `Execute Command` inline: Extract Info Image OCR `UPDATE messages` (OCR text inlined — **user-text, HIGH risk**).
|
|
72
|
+
- `Execute Query` template but inline SQL (my Leak-A edits): `Get info from SalesOMMO` Persist node
|
|
73
|
+
(`f2503397`, RecordSearchClaim/UpdateSessionContext) + Callback resolver (`11f25dbf`, sp_ClaimSearchResult).
|
|
74
|
+
- **HIGH injection risk = wherever USER TEXT is inlined**: `@Query`/name (sp_FindContact), message_text
|
|
75
|
+
(sp_MessageAdd/AddMessage), OCR text — prioritize these. GUID/int-only inlines are lower risk.
|
|
76
|
+
- The reviewer already fixed the two contact-resolution nodes (`Execute Query [new]`, `Pending Write [new]`); my
|
|
77
|
+
`[old]` disabled copies can be deleted.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## CRITICAL — the action TYPE is the templateId, NOT the label (learned the hard way, 2026-07-04)
|
|
81
|
+
The designer renders ACTION TYPE from **templateId**, not actionTemplateName. The 2026-07 build put MOST
|
|
82
|
+
SQL nodes on the deprecated **V2 template `a9f851c2-e0ba-4fee-9a06-5445ba000001`** while LABELLING many
|
|
83
|
+
of them "Execute Query". The map-parameters binding (73416282) is a property of the LATEST template
|
|
84
|
+
`76470756-...` ONLY — it does NOT exist on V2. So adding the binding + @params to an a9f851c2 node leaves
|
|
85
|
+
the @params UNBOUND at runtime -> the query errors (a real message creates no user/rows).
|
|
86
|
+
- `procesio sql-parameterize` migrates by **templateId**: any node whose templateId contains `a9f851c2`
|
|
87
|
+
is swapped to `76470756` (role-based id remap) BEFORE the binding is added. Changing templateId on PUT
|
|
88
|
+
DOES persist. Keying on the "V2" LABEL alone misses the mislabelled nodes — that bug broke prod once.
|
|
89
|
+
- **PROCESIO `validate` does NOT catch unbound @params** (structure only, not runtime binding). A
|
|
90
|
+
parameterized SQL change can pass validate and still fail at runtime. ALWAYS runtime-verify (below).
|
|
91
|
+
|
|
92
|
+
## Runtime verification — the webhook E2E harness (no WhatsApp Web needed)
|
|
93
|
+
Inject a synthetic WhatsApp-Business inbound at Start's webhook, then read the DB:
|
|
94
|
+
`procesio webhook-launch --id db92281a-17b5-451f-b9f4-2a7f6a70f1fc --payload '{"PhoneNumber":"<digits>","FinalMessage":"<text>","MessageId":"wamid.TEST","ImageBase64":"","AudioBase64":""}'`
|
|
95
|
+
The body is the flat WTB DataModel (PhoneNumber / FinalMessage / MessageId / ImageBase64 / AudioBase64),
|
|
96
|
+
passed DIRECTLY (not wrapped in {WTB:...}). Use a fake phone (e.g. 4070000001X) so the Business-API reply
|
|
97
|
+
fails harmlessly. Verify in chatbotAI: a users row + an in message + an out reply = the flow (incl. its SQL
|
|
98
|
+
nodes) works. A REAL launch runs the live LLM + DB + Business-API send and creates real rows (delete test
|
|
99
|
+
rows after). WhatsApp Web itself needs the linked phone ONLINE (else chats stay "Loading…", #main never
|
|
100
|
+
opens; also dismiss the "What'''s new" modal).
|
|
101
|
+
|
|
102
|
+
## MySQL + Redis engines (PRC-3696, 2026-08)
|
|
103
|
+
|
|
104
|
+
The DB credential (catalog type "SQL") became multi-engine: `DbClientType` gained
|
|
105
|
+
`MYSQL = 2` (alongside `MSSQL = 1`). A **MySQL** connection is the same DB credential with
|
|
106
|
+
its **server-type** option set to MySQL; the existing `Execute Query` / `Execute Command`
|
|
107
|
+
actions run against it unchanged (they resolve the client by the credential's DbClientType).
|
|
108
|
+
`CustomMySQLClient` was added in BOTH the Web-Api credential-test stack and the
|
|
109
|
+
Process-Execution runtime stack. **Redis** is a STANDALONE credential type
|
|
110
|
+
(`CredentialsType.REDIS = 9`, NOT a `DbClientType`/SQL sub-type) with its own **"Redis
|
|
111
|
+
Connector"** action (19 typed ops; no raw-command execution) — Web-Api #1452 / Action-Core
|
|
112
|
+
#130 / Process-Execution #250. Redis properties: Host/Port(6379)/Username/Password/
|
|
113
|
+
Database(0)/UseTls/ValidateCertificate/ConnectTimeoutSeconds/CommandTimeoutSeconds.
|
|
114
|
+
It shipped but is **not yet activated** (template not seeded in DataBase-Update), so `Redis`
|
|
115
|
+
is not in `/api/Credentials/types` yet; the contract is stable. Security: outbound DB hosts
|
|
116
|
+
are validated by `DbHostBlacklistChecker` (CIDR blacklist) — a private/blacklisted host is
|
|
117
|
+
rejected at connect time. Tool impact: none — credential types are live-resolved from
|
|
118
|
+
`/api/Credentials/types`, so a MySQL/Redis credential is created by setting the template +
|
|
119
|
+
properties (incl. the server-type option). Confirm the exact server-type option name/GUID
|
|
120
|
+
with `procesio list-connection-types` post-launch.
|
|
121
|
+
|
|
122
|
+
## `Execute Command` is a SECOND family with its own property ids
|
|
123
|
+
|
|
124
|
+
`sql-parameterize` originally knew only the `Execute Query` family. Command nodes need their own
|
|
125
|
+
ids, and getting this wrong is silent:
|
|
126
|
+
|
|
127
|
+
| role | Execute Query (`76470756`) | Execute Command (`a1625da6`) |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| credentials | `f96ff811-572f-084a-8cac-a74a2c2e365f` | `5f75a4fd-d0f5-4ac1-8257-467e50e7292e` |
|
|
130
|
+
| side-pannel | `8add0f17-b2b1-4d5f-962b-c5d400a4e2d4` | `975f25dc-1044-4488-b635-10a2039f8d89` |
|
|
131
|
+
| sql | `11350a1d-4139-d942-adcb-a2c2c52e5e22` (Query) | `824575f6-7652-4bc2-8186-63b32c92cc22` (Command) |
|
|
132
|
+
| **Parameters config tab** | `73416282-bcfe-4934-9e40-a39f2bb33d2d` | `0acb249e-8b21-4bfd-946c-1e65e26baa68` |
|
|
133
|
+
| Time Out | `9ce93b2d-5226-4228-a64d-3693c8d3e0e3` | `2be309c6-9144-4b27-a722-fbc9c89735c2` |
|
|
134
|
+
| Output | `8aa02e91-1a1e-a44a-b09b-6965d67da04d` (any) | `e6ffaa2d-2c32-412d-a9d4-b1038ece9d38` (number) |
|
|
135
|
+
|
|
136
|
+
**Write the Query bind id onto a Command node and every `@param` is unbound at runtime**, with no
|
|
137
|
+
validation error to show for it: the SQL still executes, the parameter simply arrives NULL, and a
|
|
138
|
+
procedure that reads `OPENJSON(NULL)` inserts nothing and reports success. `sqlparam` now keys the
|
|
139
|
+
family off `templateId` (`family_of` / `bind_pid`) so the right id is always used.
|
|
140
|
+
|
|
141
|
+
### Deprecated templates, and why the label cannot be trusted
|
|
142
|
+
|
|
143
|
+
Three templates are inline-only (no map-parameters), so a node on one MUST be migrated before it can
|
|
144
|
+
bind anything: `Execute Query V2` (`a9f851c2-…ba000001`), `Execute Query V1`
|
|
145
|
+
(`574a2ab1-…`), `Execute Command V1` (`c2760ff2-…`). `_migrate_to_current` does a role-based id
|
|
146
|
+
remap from a table of each legacy template's ids, in both the runtime and designer layers, and
|
|
147
|
+
refreshes each remapped setting's label to the current template's wording.
|
|
148
|
+
|
|
149
|
+
**Always key on `templateId`, never on `actionTemplateName`.** In one live workspace all four
|
|
150
|
+
collectors sat on `Execute Command V1` while two of them were *labelled* "Execute Command". The
|
|
151
|
+
label is cosmetic and drifts; the templateId is what the designer and the engine resolve.
|
|
152
|
+
|
|
153
|
+
### Migrating raises the Output type bar
|
|
154
|
+
|
|
155
|
+
`Execute Command V1`'s Output was permissive; the current template types it **number** (rows
|
|
156
|
+
affected, `isRequired`). A legacy node that bound an `Object`/`Json` variable there validates fine on
|
|
157
|
+
V1 and fails migration with `statusCode 142 Data type mismatch … at parameter Output`. Retype that
|
|
158
|
+
variable to number first (`variable-set-type`, safe when it is an internal type-20 variable that
|
|
159
|
+
nothing else reads). The current template also makes **Time Out required** (60..1800) where the
|
|
160
|
+
legacy one had none, so the migration seeds a default rather than leaving a required field empty.
|
|
161
|
+
|
|
162
|
+
### Proving a parameter is actually bound
|
|
163
|
+
|
|
164
|
+
A NULL-bound parameter is indistinguishable from "nothing to do" in the logs, so prove the binding
|
|
165
|
+
instead of assuming it. Temporarily prefix the statement with a guard that fails loudly, keeping the
|
|
166
|
+
real statement after it, and run the process:
|
|
167
|
+
|
|
168
|
+
```sql
|
|
169
|
+
IF @p0 IS NULL OR LEN(@p0) < 1000 RAISERROR('PROBE-PARAM-NOT-BOUND', 16, 1);
|
|
170
|
+
EXEC <the real procedure> @Body = @p0;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
A successful run proves the value arrived with real length; the RAISERROR surfaces as a failed
|
|
174
|
+
instance carrying the message. **Run the negative control too**: set the threshold absurdly high and
|
|
175
|
+
confirm the run DOES fail, otherwise a guard that never fires proves nothing. Restore the plain
|
|
176
|
+
statement afterwards. At every point the process is either correct or fails safe, so this is
|
|
177
|
+
usable on a live process when no fresh source data is available to observe an insert.
|
|
178
|
+
|
|
179
|
+
## `Execute Command` DISCARDS a result set — `sql-convert` moves the node to `Execute Query`
|
|
180
|
+
|
|
181
|
+
Discovered 2026-08-27. The two SQL families differ in more than their property ids: **`Execute
|
|
182
|
+
Query` carries a RESULT SET into a flow variable; `Execute Command` carries ROWS AFFECTED** (its
|
|
183
|
+
Output property is literally typed `number`). So a stored procedure that ends in `SELECT` — the
|
|
184
|
+
normal way a procedure reports `Success` / `ErrorMessage` / a new id / a token back to its caller
|
|
185
|
+
— returns all of that into a Command node's Output and it is thrown away. There is no error to
|
|
186
|
+
find: the flow is valid, the run finishes green, `flow-lint` is clean, and the output variable
|
|
187
|
+
just holds a count. Everything downstream then treats a refusal and a success identically.
|
|
188
|
+
|
|
189
|
+
**The tell:** an `Execute Command` node whose SQL is `EXEC <proc>` where the proc's last statement
|
|
190
|
+
is a `SELECT`. Also: an output variable declared `list<Object>` but bound to a Command node — the
|
|
191
|
+
declared shape and the family disagree, and the family wins.
|
|
192
|
+
|
|
193
|
+
**The fix:** `procesio sql-convert --id <process> --node <label|id> --to query
|
|
194
|
+
[--output-variable <name|id>]`. It is a role-based property-id remap (the same machinery as the
|
|
195
|
+
legacy-template migration) across BOTH the runtime `parameters[]` and the designer `customData`,
|
|
196
|
+
plus three things the remap does not reach and a reader WILL trust: the Output setting's designer
|
|
197
|
+
`type` (`number` -> `any`), the configuration container's label, and `customData.description`.
|
|
198
|
+
The SQL text, credential, timeout and `@param` binding are carried across untouched. `--to command`
|
|
199
|
+
is the exact inverse. A node on a deprecated template is refused rather than half-converted — run
|
|
200
|
+
`sql-parameterize` first, which migrates it onto its family's current template.
|
|
201
|
+
|
|
202
|
+
**Order matters when both are needed:** parameterize FIRST (it can migrate a legacy template), then
|
|
203
|
+
convert the family. Converting first leaves `sql-parameterize`'s inline detector looking at the new
|
|
204
|
+
family's property id, which is fine, but a legacy node would already have been refused.
|
|
205
|
+
|
|
206
|
+
### The output variable's data type is a separate axis from the family
|
|
207
|
+
`flow-lint`'s `EXECQUERY_OUTPUT_TYPE` wants an Execute Query Output to be `list<Object>`
|
|
208
|
+
(`...121221`, `isList: true`). `...121220` (Json) also works at RUNTIME — a whole workspace ran on
|
|
209
|
+
it — but the designer renders a "data type mismatch" on every such node. Fix it with
|
|
210
|
+
`variable-set-type --data-type ...121221 --is-list true`; an output/input variable needs
|
|
211
|
+
`--allow-contract-change` because it is the process's public shape.
|
|
212
|
+
|
|
213
|
+
## Verifying a SQL change: run BOTH paths, and run one through the FORM
|
|
214
|
+
|
|
215
|
+
`run-process --synchronous` returns `{status, variable, error}` directly, which makes the
|
|
216
|
+
success path easy. The path that actually regresses is the REFUSAL path, because a discarded
|
|
217
|
+
result set looks exactly like a successful one — so assert on a call the procedure must reject
|
|
218
|
+
(a slot outside the offered list, a malformed email) and read the `ErrorMessage` back.
|
|
219
|
+
|
|
220
|
+
And prove the injection fix while you are there: submit a value containing an apostrophe and a
|
|
221
|
+
statement terminator (`O'Brien Test; DROP TABLE x--`). Under the old inline `N'<%N%>'` form that
|
|
222
|
+
breaks or injects; under parameter binding it is stored verbatim as data. Reading the row back
|
|
223
|
+
afterwards is the assertion.
|
|
224
|
+
|
|
225
|
+
Finally run one submission through `run-form-with-files`, not just `run-process`: the form and the
|
|
226
|
+
process are assembled separately and nothing asserts they agree. See
|
|
227
|
+
PROCESIO-FORM-SUBMISSION-NOTES.md.
|
|
228
|
+
|
|
229
|
+
## MySQL is GA - same credential template, `ServerType` discriminator (PRC-3696, 2026-07)
|
|
230
|
+
|
|
231
|
+
MySQL is a first-class SQL engine now, not a separate credential type. The mechanics an
|
|
232
|
+
API client must know:
|
|
233
|
+
|
|
234
|
+
- **`DbClientType`**: `MSSQL = 1`, `MYSQL = 2`. This lives on the credential, not the
|
|
235
|
+
action. The Execute Query / Execute Command action templates are unchanged - the same
|
|
236
|
+
template runs against either engine and picks the driver from the bound credential.
|
|
237
|
+
- **No separate MySQL credential template.** The existing SQL Server template was
|
|
238
|
+
UPDATEd in place: renamed to **"SQL"** and given a **`ServerType`** select
|
|
239
|
+
(`MSSQL` default / `MYSQL`). Choose MySQL by setting that property, not by choosing a
|
|
240
|
+
different template. `ProtocolType` is now **conditional on `ServerType=MSSQL`**; for
|
|
241
|
+
MySQL send `ServerType, ServerName, Username, Password` (required) + optional
|
|
242
|
+
`PortNumber` (default 3306), `DatabaseName`, `Encrypt`, `Pooling`,
|
|
243
|
+
`TrustServerCertificate`. On MySQL the `Encrypt`/`TrustServerCertificate` flags map to
|
|
244
|
+
MySqlConnector `SslMode`. Because the tool resolves credential templates live by name,
|
|
245
|
+
this needs no tool change - you build a "SQL" credential and set `ServerType`.
|
|
246
|
+
- **Parameter binding** is named `@param` (Dapper) via `MapParameters {id, source,
|
|
247
|
+
destination}` → a dict keyed by `destination.value`, value `source.value`; a duplicate
|
|
248
|
+
destination errors. MySQL relies on `AllowUserVariables=true` (set server-side). Only
|
|
249
|
+
the V2 action variants carry a `Parameters` (Map_Parameters) tab; the base
|
|
250
|
+
Execute Query/Command bind no parameters. Keep using parameters, never inline
|
|
251
|
+
`<%N%>` for SQL (see the parameterization section above).
|
|
252
|
+
- **DB host blacklist (silent).** Process-Execution enforces a `DbHostBlacklist` (host,
|
|
253
|
+
`host:port`, IP, or **CIDR**) BEFORE opening a connection; the committed default blocks
|
|
254
|
+
the private/non-routable ranges (172.16/12, 192.168/16, 127/8, 169.254/16, 100.64/10,
|
|
255
|
+
0.0.0.0/8 and IPv6 loopback/ULA/link-local), real prod ranges injected per-env. A block
|
|
256
|
+
is disguised as an ordinary **connect-timeout** - so a SQL/MySQL node that "times out"
|
|
257
|
+
connecting to an internal host may actually be blacklisted, not slow.
|
|
258
|
+
- **Execute Command injection guard (PRC-5613):** stacked statements in Execute Command
|
|
259
|
+
are guarded server-side. Author one statement per action; rely on parameters.
|
|
260
|
+
- **Data stores are MySQL-backed, per-workspace users (PRC-5442):** creating/altering a
|
|
261
|
+
data store provisions a physical MySQL table (why `datastore-create`/`-modify-column`
|
|
262
|
+
carry a long timeout). Not something the client sends, but explains the latency.
|
|
263
|
+
|
|
264
|
+
Note reconciliation: an older line in `dto/credential/description.md` called
|
|
265
|
+
"Execute Query V3 / Execute Command V2" the current versions; the live catalog and
|
|
266
|
+
`flowmodel/sqlparam.py` treat the unversioned `Execute Query` / `Execute Command`
|
|
267
|
+
(GUIDs `76470756-…` / `a1625da6-…`) as current, with V2 variants adding Timeout +
|
|
268
|
+
Parameters. Trust the live catalog.
|
|
269
|
+
|
|
270
|
+
## The `Execute Query` output is `list<Object>`, and `sql-parameterize` saves a failing flow as invalid (measured 2026-10-22)
|
|
271
|
+
|
|
272
|
+
Declare the variable bound to an `Execute Query` **Output** as `{"type": "object", "isList": true}`
|
|
273
|
+
(`0317bfee-…-121212121221`). A `json` list (`…1220`) is what many older flows use and it runs, and
|
|
274
|
+
`process-create` accepts it, but the designer layer flags it (`flow-lint` EXECQUERY_OUTPUT_TYPE). The
|
|
275
|
+
first `sql-parameterize` on such a flow then runs the designer gate, still PUTs the converted SQL,
|
|
276
|
+
and stamps the flow `isValid: false`. The platform stores that stamp as is, so every launch answers
|
|
277
|
+
`HTTP 400 statusCode 373 "Process needs to be valid in order to be launched."` even though
|
|
278
|
+
`POST /api/Projects/validate` reports it valid. Read `isValid` in the `sql-parameterize` result (and
|
|
279
|
+
run `flow-lint`) before you call the process ready. Fix: retype the variable in the config,
|
|
280
|
+
`process-edit` (desired state, variable ids are kept by name), then `sql-parameterize --all` again.
|
|
281
|
+
|
|
282
|
+
When parameterizing, keep each `<%N%>` alone on the right of a `DECLARE`
|
|
283
|
+
(`DECLARE @key_in nvarchar(100) = N'<%0%>';`) and do the `COALESCE`/`LEFT`/`NULLIF` work on that SQL
|
|
284
|
+
variable afterwards: the converter turns `N'<%N%>'` into `@pN` wherever it sits.
|