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,316 @@
|
|
|
1
|
+
# PROCESIO implementation best practices (distilled)
|
|
2
|
+
|
|
3
|
+
Agent-scoped guidance: the standards a build must meet, not tool mechanics. The
|
|
4
|
+
agent applies these when designing and reviewing any process, form, or use case.
|
|
5
|
+
|
|
6
|
+
**Source:** Google Doc "Best practices for implementing with PROCESIO"
|
|
7
|
+
(`docId 1t0nqrVKEJwkuubhiIDpRcXd3OubClmfmmbfav953dZo`, captured 2026-06-25).
|
|
8
|
+
Captured here per Hard rule 6 so the standard survives chat compaction. Re-pull the
|
|
9
|
+
doc if it changes; this is a distillation, the doc is the source of truth.
|
|
10
|
+
Platform tricks: https://docs.procesio.com/platform-tricks
|
|
11
|
+
|
|
12
|
+
The source doc has 6 image-only examples (bad vs good parameter handling; the
|
|
13
|
+
5-Decisional ~2s vs single-Decisional <200ms speed comparison; the JSON-to-Data-Model
|
|
14
|
+
extraction diagram) that carry no alt text and are not reproduced here - open the doc
|
|
15
|
+
for the visuals. The principles they illustrate are captured in sections 2, 9 and 10.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. Frame the work
|
|
20
|
+
|
|
21
|
+
- One measurable KPI per process (e.g. "reduce onboarding cycle time by 30%").
|
|
22
|
+
- Map as-is -> to-be: triggers, systems, data contracts, SLAs, exceptions.
|
|
23
|
+
- Define RACI early: business owner, builder(s), reviewer/QA, approver, operator.
|
|
24
|
+
Use the `bpof-expert` skill for process mapping and RACI.
|
|
25
|
+
|
|
26
|
+
## 2. Solution design
|
|
27
|
+
|
|
28
|
+
- **Modularize:** one main process + small reusable subprocesses (auth, paging,
|
|
29
|
+
validation, notifications). Trade-off both ways: too many subprocesses = harder
|
|
30
|
+
debugging + extra execution time; none = a monolith that re-runs steps it should
|
|
31
|
+
not. Choose deliberately.
|
|
32
|
+
- **Stable contracts:** standardize inputs/outputs as DTO-style variables. Do not
|
|
33
|
+
pass raw API payloads between steps.
|
|
34
|
+
- **Idempotency:** a retry or a double-trigger must not create duplicates. Use
|
|
35
|
+
external IDs and dedupe/once-only keys. Triggering twice must not change records.
|
|
36
|
+
- **Error ports:** wire them for error capture and error-handling logic.
|
|
37
|
+
- **Stateless core:** anything that must survive across runs (checkpoints, last-sync
|
|
38
|
+
time, job status, idempotency keys, approvals) lives in a durable system of record
|
|
39
|
+
(CRM/ERP/ticketing or a DB you own). PROCESIO variables are ephemeral - use them
|
|
40
|
+
only within a single execution (pass data between steps, hold tokens, page
|
|
41
|
+
cursors, correlation IDs).
|
|
42
|
+
- **Perceived speed is non-negotiable.** Users must feel the UI helps them, not that
|
|
43
|
+
they wait on PROCESIO. A slow form reads to the client as "PROCESIO is slow". Do
|
|
44
|
+
not let this happen. See sections 9 and 10.
|
|
45
|
+
- **Secrets:** never in processes. Credential Manager only.
|
|
46
|
+
- **Centralize parameters:** a value used in many processes (and that will change)
|
|
47
|
+
is set in ONE place and shared, so one change propagates. Never hardcode it in
|
|
48
|
+
many places. Hardcoding + scattering always creates future effort.
|
|
49
|
+
|
|
50
|
+
## 3. Integrations (target 1-2 days for the first system)
|
|
51
|
+
|
|
52
|
+
- Wrap each external API in reusable subprocesses: `auth-get-token`,
|
|
53
|
+
`<system>-get-by-id`, `<system>-search`, `<system>-upsert`, plus a pagination
|
|
54
|
+
helper and a rate-limit handler.
|
|
55
|
+
- Exponential backoff with jitter. Example attempt -> wait: 1 -> ~5s, 2 -> ~10s,
|
|
56
|
+
3 -> ~30s, 4 -> ~1min.
|
|
57
|
+
- Idempotency keys so the same logical action runs once even on retry/double-trigger.
|
|
58
|
+
- Standard error object across integrations.
|
|
59
|
+
|
|
60
|
+
## 4. Data contracts
|
|
61
|
+
|
|
62
|
+
- Define DTO variables (Customer, OrderLine, Address).
|
|
63
|
+
- Reuse data-model children of the same data model where appropriate.
|
|
64
|
+
|
|
65
|
+
## 5. Robustness
|
|
66
|
+
|
|
67
|
+
Global try/catch via Error Port + Decisional action. Classify and handle:
|
|
68
|
+
- **Retryable:** retry(max=3, backoff=2^n).
|
|
69
|
+
- **Business:** send to queue + notify owner.
|
|
70
|
+
- **Hard fail:** alert, capture context, stop.
|
|
71
|
+
|
|
72
|
+
## 6. Observability
|
|
73
|
+
|
|
74
|
+
- Generate a correlation ID at start; pass it to all logs/requests.
|
|
75
|
+
- Store the main process instance ID; set an explicit status (success/fail/custom).
|
|
76
|
+
- Alert on thresholds when something fails repeatedly.
|
|
77
|
+
|
|
78
|
+
## 7. Document & handover
|
|
79
|
+
|
|
80
|
+
- Document each process. Map the order processes trigger in (visual map if needed).
|
|
81
|
+
- Write SOPs so someone without prior context can debug or follow the logic.
|
|
82
|
+
|
|
83
|
+
## 8. DB actions (SQL Server / MySQL) + Data Store
|
|
84
|
+
|
|
85
|
+
The DB credential (catalog type **`SQL`**) is now multi-engine: it carries a **server
|
|
86
|
+
type** (`DbClientType` — `MSSQL=1`, `MYSQL=2`), so the same `Execute Query` / `Execute
|
|
87
|
+
Command` actions run against **MySQL** by binding a MySQL-typed DB credential (PRC-3696).
|
|
88
|
+
**Redis** shipped as its own credential type + connector. No new action families — pick
|
|
89
|
+
the engine on the credential. Outbound DB hosts are SSRF-guarded by a host blacklist, so
|
|
90
|
+
a private/blacklisted host is rejected at connect time. Bind values as **parameters**,
|
|
91
|
+
never inline — the injection-safe `@param` map is engine-agnostic. **Data Store** (the
|
|
92
|
+
tenant table feature) is separate — see the `datastore` guidance topic; scheduling a
|
|
93
|
+
process on a cron is the `scheduling` topic.
|
|
94
|
+
|
|
95
|
+
Use the `sql-server-optimizer` skill for any SQL in a SQL action. Core rules:
|
|
96
|
+
- Inject data via action parameters; centralize all params at the top of the
|
|
97
|
+
statement for visibility.
|
|
98
|
+
- Parameters go on the RIGHT-hand side of an operation only. `WHERE I.Id =
|
|
99
|
+
@Param_Id` good; `SELECT *, @Param_Id` or `SET @Parameter = @SQLVariable` errors.
|
|
100
|
+
- Param names may match internal SQL variable names (the compiler resolves safely);
|
|
101
|
+
use each parameter once. After injection, clean the SQL variables holding param
|
|
102
|
+
data before the rest of the statement runs.
|
|
103
|
+
- FROM/JOIN: smallest record set first, largest last.
|
|
104
|
+
- Join conditions: most restrictive first. INNER joins before LEFT joins.
|
|
105
|
+
- Max 5-6 joins. Beyond that the engine cannot compute an optimal plan (5!=120,
|
|
106
|
+
6!=720, 7!=5040) and falls back to running it as written.
|
|
107
|
+
- WHERE: most restrictive condition first.
|
|
108
|
+
- Pre-calculate values; do not call functions per row (no `ISNULL(...)`/`CASE` in a
|
|
109
|
+
per-row WHERE/SELECT when it can be computed once into a variable).
|
|
110
|
+
- Filters activate only when set: `(@p IS NULL OR (<col> LIKE '%'+@p+'%'))`, not a
|
|
111
|
+
`CASE` that always evaluates.
|
|
112
|
+
|
|
113
|
+
## 9. Forms & Tasks - UX timing (outcome rules)
|
|
114
|
+
|
|
115
|
+
- **>=90% of clicks under 1s.** Limit calls to processes (Forms have features that
|
|
116
|
+
avoid most calls). When you must call a process, keep it to a minimum number of
|
|
117
|
+
actions (1 ideal, 3 still ok, 5 bad, >5 really bad) and optimize it for speed
|
|
118
|
+
(section 10). Use scoped loading visuals for the affected section, not a full
|
|
119
|
+
screen. Paginate and filter tables that can grow large.
|
|
120
|
+
- **<=10% of clicks in the 1-3s band.** Break a long task into steps each under 3s,
|
|
121
|
+
updating the UI as each finishes, so the UI feels faster.
|
|
122
|
+
- **No click ever over 3s.** Use an async mechanism: let the user continue and
|
|
123
|
+
notify them when done.
|
|
124
|
+
|
|
125
|
+
## 10. Optimize for speed
|
|
126
|
+
|
|
127
|
+
- Every action costs ~10ms. Some are natively slower (Decisional), some faster
|
|
128
|
+
(numeric Add). An action gets slower when it parses/injects large data, or talks
|
|
129
|
+
to an external system (Call API, SQL, FTP).
|
|
130
|
+
- Levers: reduce action count at all costs; use scripting actions effectively
|
|
131
|
+
(do more per action); optimize the external systems (SQL statement + DB; use
|
|
132
|
+
Call API/FTP only where needed when form-call latency matters).
|
|
133
|
+
- Example: 5 Decisional actions ~2s -> a single Decisional <200ms -> best, a single
|
|
134
|
+
scripting action that does the whole thing.
|
|
135
|
+
- Do not extract from JSON with chains of actions. Model the JSON into a Data Model
|
|
136
|
+
and use the variable as `<DataModel>`; then read attributes directly, often with
|
|
137
|
+
no action at all.
|
|
138
|
+
- A Node that builds an LLM prompt should put the static rules FIRST and the per-run
|
|
139
|
+
data (history, records, a language hint) LAST. Provider prompt caches key on a
|
|
140
|
+
byte-identical prefix (OpenAI: >= 1024 tokens), so per-run data at the top makes
|
|
141
|
+
every call a cache miss. Order only, wording unchanged; diff the line multiset
|
|
142
|
+
before the PUT.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Name every Call/Trigger Subprocess node suggestively (never leave the generic label)
|
|
147
|
+
|
|
148
|
+
When a flow contains a `Call Subprocess` / `Trigger Subprocess`, set the node's **`name`**
|
|
149
|
+
(the builder accepts `name` on any action) to describe **what that call does in this flow**,
|
|
150
|
+
or the **called process's name** — whichever reads clearer for the context. Never ship the
|
|
151
|
+
generic "Call Subprocess" label: on a canvas with several subprocess calls they become
|
|
152
|
+
indistinguishable and the flow is unreadable. Examples: `"Citește Contacte proprietari
|
|
153
|
+
(read-range)"`, `"Adaugă rândul în Colectare acte (append-row)"`, `"Creează folder Ap.<nr>
|
|
154
|
+
(create-folder)"`. The right name varies by context — pick the one that makes the canvas
|
|
155
|
+
self-explanatory.
|
|
156
|
+
|
|
157
|
+
## Form: pre-fill controls from URL query params (validated live 2026-07-22)
|
|
158
|
+
|
|
159
|
+
A published PROCESIO form pre-fills a control from a URL query parameter **whose key
|
|
160
|
+
equals the control's binding `name`**. Open `https://forms.procesio.app/{tinyUrl}?<name>=<value>`
|
|
161
|
+
and the control renders with `<value>`. The match is on the config `name` (field/binding
|
|
162
|
+
name), NOT the DOM `id`/`name` (empty on the rendered input). Unmatched params are ignored.
|
|
163
|
+
Undocumented by PROCESIO, but confirmed live (form with `cod`+`apartament` controls opened
|
|
164
|
+
at `?cod=TEST123&apartament=27` → both pre-filled).
|
|
165
|
+
|
|
166
|
+
Use it to **seed a form from a per-record link**: give each record a stable, URL-safe token,
|
|
167
|
+
name a control after the query key, distribute `…?token=<value>`. Then a form event (e.g.
|
|
168
|
+
`on: open → do: process`) can read that seed control and fetch the rest. This is the mechanism
|
|
169
|
+
behind the Uranus 100 „colectare acte" access model (unique link per apartment, `?cod=`).
|
|
170
|
+
To make a form public + get the link: `isPrivate:false` + publish, then
|
|
171
|
+
`POST /api/CustomUrl/FormTemplate {Type:3,EntityType:1,EntityId:<formTemplateId>,Url:<slug>}`
|
|
172
|
+
→ `tinyUrl` → `forms.procesio.app/{tinyUrl}`.
|
|
173
|
+
|
|
174
|
+
## Recipe: a dynamic, TYPED PROCESIO document (AAT_ Company Brief — live)
|
|
175
|
+
A branded PDF whose repeating table + scalars are filled from a live API call:
|
|
176
|
+
1. **Table rows <- `Call API` -> a typed `list<item>` model.** Point the Call API Response
|
|
177
|
+
Body at e.g. `AAT_GoogleResponse {items: list<AAT_SearchHit>}`; PROCESIO deserializes by
|
|
178
|
+
`jsonProperty`. docMap the doc's `hits` list `<- {var: googleResponse, path:[items_attr]}`.
|
|
179
|
+
(The Javascript action canNOT build a typed list — see tool PROCESIO-API-NOTES.)
|
|
180
|
+
2. **Scalars** — use the **Node** scripting action (raw output) and map straight onto the doc
|
|
181
|
+
vars; OR with the **Javascript** action route through an envelope model
|
|
182
|
+
`{result:{searchTerm, generatedOn, resultCount, heroImageUrl}}` + docMap `path:[result,
|
|
183
|
+
field]`. Build the envelope model via the attribute-endpoint create flow so it COMPILES.
|
|
184
|
+
3. **Never** feed a Javascript-action output downstream as a query/filename — the `{result}`
|
|
185
|
+
wrapper leaks. Drive the Call API query + file name from the ORIGINAL form inputs.
|
|
186
|
+
4. Build every data model via the attribute-endpoint create flow (empty model -> POST each
|
|
187
|
+
attribute) so it's COMPILED — else the document renders "Unknown".
|
|
188
|
+
|
|
189
|
+
## Email a generated file (Send Email)
|
|
190
|
+
- **Map attachment is `list<File>`** — declare the file input `isList:true`; a single File
|
|
191
|
+
-> designer "data type mismatch" + NO attachment (run still status 50, so green != attached).
|
|
192
|
+
Pass `[fileDTO]`. Form file-upload controls already hold a list.
|
|
193
|
+
- **To** can be a variable for a dynamic recipient (`<%0%>` + Variable[recipientEmail]).
|
|
194
|
+
- The Body can come from a document template via Generate Document's "HTML string" output,
|
|
195
|
+
or a templated HTML string.
|
|
196
|
+
|
|
197
|
+
## Form: an "Email me" button enabled only once the file exists
|
|
198
|
+
Conflict: btnSearch must run with no file yet; btnEmail only once the file is present.
|
|
199
|
+
Resolve via FIELD VALIDITY, not JS `.disabled` toggling:
|
|
200
|
+
- `briefFile` (file-upload) **`required:true`** -> the form is invalid until the PDF lands.
|
|
201
|
+
- `btnEmail` **`disabledIfFormIsInvalid:true`** -> enabled only when ALL required (company +
|
|
202
|
+
valid email + file) are present.
|
|
203
|
+
- `btnSearch` **`disabledIfFormIsInvalid:false`** -> always clickable (it GENERATES the file).
|
|
204
|
+
- email field: `required:true` + `regex` = email pattern; file-upload `readonly:true` for a
|
|
205
|
+
download-only control.
|
|
206
|
+
|
|
207
|
+
## Type-matching across resources + Required inputs (LOAD-BEARING)
|
|
208
|
+
|
|
209
|
+
**Variable TYPES must match EXACTLY for anything that passes between Process / Document /
|
|
210
|
+
Form.** An input's type, an output's type, and a binding's type must be identical, or the
|
|
211
|
+
consumer rejects it. Real failure (AAT_ v2): Send Email "Map attachment" is `List<File>`, so
|
|
212
|
+
Process 3's input was made `List<File>` — but the FORM sends a single `File`, so the form
|
|
213
|
+
**could not START the process** (a silent type mismatch between the form output and the
|
|
214
|
+
process input). Always check the chain: Form control type → process INPUT type → action
|
|
215
|
+
PARAMETER type → next resource. One mismatch anywhere breaks the hand-off.
|
|
216
|
+
|
|
217
|
+
**Bridge a single `T` → `List<T>` INSIDE the process** (do NOT change the upstream resource):
|
|
218
|
+
1. Keep the process INPUT as the single `T` (so it matches what the form/webhook sends).
|
|
219
|
+
2. Add a **Node** action: `return [<%0%>];` (Node returns RAW — no wrapper) bound to its
|
|
220
|
+
**List Result** output → a `List<T>` process var. **Node REQUIRES `Timeout` > 0** (it
|
|
221
|
+
defaults to `00:00:00`, which errors `value must be greater than 00:00:00`); set `Timeout: 60`.
|
|
222
|
+
3. Feed that `List<T>` var to the action (e.g. Send Email Map attachment ← briefFileList).
|
|
223
|
+
(Use **Single Result** instead when the script returns a non-list value.)
|
|
224
|
+
|
|
225
|
+
**Required inputs block the start.** A process input marked `Required` that the trigger does
|
|
226
|
+
NOT supply prevents the process from starting at all. Ensure every Required input is provided
|
|
227
|
+
by the caller — the form button's inputMap, the webhook payload, or the run payload — or do
|
|
228
|
+
not mark it Required. Audit the form↔process input map against the process's Required vars.
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
## Creating nodes/actions in a flow via API (WORKS - userpass; verified 2026-07-05)
|
|
232
|
+
|
|
233
|
+
Adding a NEW node to a flow via `PUT /api/Projects` works with the default userpass `account` profile.
|
|
234
|
+
No designer UI needed. The one trap: do NOT copy an existing node to make a new one - a copied node
|
|
235
|
+
carries the source flow's stale variable bindings in `customData.configuration`, and the validator then
|
|
236
|
+
throws a diagnostic-free `HTTP 500 "Object reference not set to an instance of an object"`. Instead:
|
|
237
|
+
|
|
238
|
+
1. Fetch the CLEAN action template: `GET /api/Actions?getFullAction=true`, find by `actionId`/`name`.
|
|
239
|
+
`copy.deepcopy(template.configuration)` and fill only your setting values. A clean config makes the
|
|
240
|
+
validator return REAL errors (141/142) instead of the 500.
|
|
241
|
+
2. A JS "Node" (templateId e0fc20c3): settings are Code (1e6a5523) = JS + input `<%N%>` bound in the
|
|
242
|
+
Code param's `variable` list; **Single Result** (51b9fcdc) = the JS `return` output (NOT Error
|
|
243
|
+
9e0110c9); List Result (60237e88); Error (9e0110c9) = error port; Timeout (d3e52aab).
|
|
244
|
+
3. New variables use key **`dataType`** (a type id) + `type` (10 input / 20 process / 30 output / 40 sys).
|
|
245
|
+
Missing type -> `statusCode 141 "type cannot be empty"`. Param/var type must MATCH the setting's
|
|
246
|
+
expected `dataTypeId` -> else `statusCode 142 data type mismatch`. Primitive ids: `...1211` number,
|
|
247
|
+
`...1214` string, `...1221` any/object; file `10c6ac59-...-121212121219` = FileDataModel
|
|
248
|
+
`{name,mimeType,path,size,id,hash}` (blob reference, NOT inline content).
|
|
249
|
+
4. Files from text: a Node cannot return a FileModel (no inline content). Use **`Base64 To File`**
|
|
250
|
+
(actionId 6fad5599; settings Base64 String, File Name -> File output) to turn a base64 string into a
|
|
251
|
+
stored FileModel; then Call API `/media` upload (FORM_DATA `file`=FILE type, `type`=mime).
|
|
252
|
+
5. Validate via `POST /api/Projects/validate` (empty body = valid) before PUT.
|
|
253
|
+
|
|
254
|
+
Best path: `tools/procesio/dto/process/builder.py` already builds correct DTOs data-driven from the live
|
|
255
|
+
catalog (`_action_node` = clean template config + values; `_edit` rebuilds a whole flow and PUTs). Prefer
|
|
256
|
+
it for full-flow builds; replicate `_action_node`'s recipe for a surgical single-node insert into a
|
|
257
|
+
fetched (lowercase-keyed) flow. Worked example: added Build VCF (Node) + Base64 To File to Chat Flow/Send
|
|
258
|
+
Export to produce a `.vcf` bulk export (scratchpad build_vcf_flow3.py pattern).
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
## Field learnings 2026-07-05 (designer review + real-corpus E2E) — AUTHORITATIVE
|
|
262
|
+
|
|
263
|
+
1. **Decisional icon**: when creating a Decisional via API set `customData.icon = "call_split"` (the
|
|
264
|
+
designer standard). `icon-decisional` or anything else renders NO icon in the run view. Same rule
|
|
265
|
+
class: give decisional CASES meaningful `name`s — the designer shows them as chips on the canvas.
|
|
266
|
+
2. **Scripting (Node) actions FAIL SILENTLY**: a JS code error does NOT raise / does NOT take the
|
|
267
|
+
type-1 error port. The action reports SUCCESS and writes the error text to its **Error output**
|
|
268
|
+
setting (9e0110c9). ALWAYS: (a) bind Error output to a string var on every Node; (b) on hot paths,
|
|
269
|
+
follow the Node with a Decisional `errVar IS_NOT_EMPTY -> error join`; (c) compose the user-facing
|
|
270
|
+
error message from the error vars in one downstream Node (values from the FAILED action are unset —
|
|
271
|
+
never map them into the notice directly). Proven: 6 silently-dying turns became 6 successes.
|
|
272
|
+
3. **Huge values (base64 media) are NOT an engine limit** (corrected 2026-09-21). A controlled probe through
|
|
273
|
+
`/run` carried a 4 MB string intact through a Node `<%N%>` injection, a Decisional `IS_NOT_EMPTY`, the native
|
|
274
|
+
**Length** action (template 057d754a: Input String, Result), Map Data, subprocess maps and SQL parameters, on a
|
|
275
|
+
plain variable and on a data-model attribute alike. The earlier note that 100 KB+ values "materialize as EMPTY"
|
|
276
|
+
in a Node or Decisional was an artefact of the middleware that fed the flow (it capped its own payload), not of
|
|
277
|
+
PROCESIO. Length is still the cheapest way to test a big value's presence; it is not a workaround.
|
|
278
|
+
4. **For Each via API** (template dbef0804-66a9-4f8f-872c-ece1b89b8fdb, shape `area`): params =
|
|
279
|
+
For Each Item (57b5b1eb…, the per-iteration var) + In List (2d5f230f…) + timeout + 2 ignore
|
|
280
|
+
literals. The FE node has TWO type-0 ports: first -> loop-body entry child, second -> the after-loop
|
|
281
|
+
node. Children carry `parentId` = FE id; the LAST child ports BACK to the FE (loop-back edge).
|
|
282
|
+
5. **Workspace header is mandatory on run/launch**: `ProcesioClient(workspace_id=…)`. Without it,
|
|
283
|
+
`/api/Webhooks/launch` and `run-process` bind LARGE attribute values as EMPTY (looks like an engine
|
|
284
|
+
bug, is actually your missing header), and admin flows 400/502.
|
|
285
|
+
6. **WhatsApp bulk contact export**: document sends get the MIME's extension APPENDED by WhatsApp
|
|
286
|
+
(filename `Contacts.vcf` + text/plain ⇒ phone receives `Contacts.vcf.txt`, unimportable). No allowed
|
|
287
|
+
/media MIME maps to .vcf. Correct approach: native `type:"contacts"` messages (array, chunk ~15 per
|
|
288
|
+
message, For Each over chunks) — renders as a tappable contact stack ("X and N other contacts").
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
### Validation: trust the designer's Process Errors (2026-07-06, corrected)
|
|
292
|
+
**A 2026-07-05 note wrongly dismissed the designer's Process Errors as stale phantoms. They are REAL
|
|
293
|
+
and block SAVE. Trust them.** There are two layers:
|
|
294
|
+
- **Runtime** — `POST /api/Projects/validate` (the only server validate endpoint): checks
|
|
295
|
+
`parameters[]`, returns EMPTY when valid. Does NOT catch designer-layer problems — a flow can pass
|
|
296
|
+
it yet be unsavable.
|
|
297
|
+
- **Designer** — the client-side "Process Errors" panel blocks SAVE; it validates `customData`
|
|
298
|
+
(designer maps + code chips). No server endpoint exists for it.
|
|
299
|
+
- **Replicate the designer check offline with `procesio flow-lint --id <flow> --workspace-id <ws>`**
|
|
300
|
+
(a Node binding an error-scope/undeclared variable in code; a required subprocess input left
|
|
301
|
+
unmapped or with a dead source in the `customData` process-inputs map). Never call a flow "done"
|
|
302
|
+
on `/validate` alone — always run flow-lint too, and if you can, confirm SAVE in the designer.
|
|
303
|
+
- **The recurring cause:** cloning a subprocess-call node copies its `customData` process-inputs, so
|
|
304
|
+
the clone keeps the SOURCE's subprocess-input ids and the real required input reads as "missing"
|
|
305
|
+
(the panel shows the stale ids as raw GUIDs). Fix: regenerate `customData` process-inputs from the
|
|
306
|
+
correct runtime map. Never bind an `isError` variable (an action's error-port output) into Node code.
|
|
307
|
+
|
|
308
|
+
### How to actually find a designer validation error (2026-07-06)
|
|
309
|
+
When the designer's "Process Errors" flags a node but the data "looks correct", DON'T reverse-engineer
|
|
310
|
+
the rule from that one node (I guessed wrong twice). Instead COMPARE THREE THINGS: the FLAGGED node,
|
|
311
|
+
a HEALTHY node of the SAME actionTemplateName that the designer accepts, and the CLEAN template from
|
|
312
|
+
`GET /api/Actions?getFullAction=true`. The one field that differs between flagged and healthy is the
|
|
313
|
+
cause. That method found it in one shot: flagged subprocess nodes had a stale side-pannel setting id
|
|
314
|
+
(`1da555da`) vs the template's `5456caf0`; the designer couldn't find the mapping. Then encode the rule
|
|
315
|
+
into `procesio flow-lint` so it's caught mechanically next time — never call a flow done on
|
|
316
|
+
`/Projects/validate` alone.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# PROCESIO build-and-test playbook (agent operating procedure)
|
|
2
|
+
|
|
3
|
+
How the PROCESIO agent works when it creates or edits any resource or use case. The
|
|
4
|
+
rule: a build is not done when it is created. It is done when it has been run,
|
|
5
|
+
validated, and verified against real behavior, the learnings captured, and the
|
|
6
|
+
defects fixed. Building without testing is not allowed.
|
|
7
|
+
|
|
8
|
+
This is agent behavior. Tool mechanics live in `tools/procesio/` - this playbook
|
|
9
|
+
points at them, it does not duplicate them.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## The loop (run on every build/edit)
|
|
14
|
+
|
|
15
|
+
1. **Frame** - state the outcome and KPI in one sentence, the scope, the
|
|
16
|
+
constraints, the RACI. (best practices section 1)
|
|
17
|
+
2. **Design** - pick the approach; where it matters, weigh 2-3 with trade-offs.
|
|
18
|
+
Apply best practices up front: modular, DTO contracts, idempotent, stateless,
|
|
19
|
+
secrets in Credential Manager, centralized parameters.
|
|
20
|
+
3. **Build programmatically** - via the `procesio` tool DTO sub-tools. Create data
|
|
21
|
+
models complete with all attributes up front (the runtime compiled-model cache
|
|
22
|
+
will not see attributes added by a later edit - PHASE4-E2E learning 12).
|
|
23
|
+
4. **Self-test rigorously** - the checklist below. Non-negotiable.
|
|
24
|
+
5. **Capture learnings** - write every discovery to the right durable note (routing
|
|
25
|
+
below). Compounding, not chat-only.
|
|
26
|
+
6. **Fix** - bugs, inefficiencies, UX gaps, and any suggestion surfaced. Structural
|
|
27
|
+
defects get fixed in the builder/tool code, not just patched on the live
|
|
28
|
+
resource, so a fresh session builds it correctly.
|
|
29
|
+
7. **Re-verify** - re-run the relevant checklist items on what changed.
|
|
30
|
+
8. **Document & handover** - SOP, trigger order, resource ids. (best practices 7)
|
|
31
|
+
|
|
32
|
+
## Definition of Done (outranks your own judgement)
|
|
33
|
+
|
|
34
|
+
Measured failure (a GPT-driven session, 2026-09-05): the agent said "verified / works
|
|
35
|
+
/ done" over and over on FALSE evidence - a PDF existed, a DTO field existed, a call
|
|
36
|
+
returned `ok:true` - while the cache never cached, the button never fired, and the
|
|
37
|
+
report was empty. Nine hours, thirty user turns, because the human was the only oracle.
|
|
38
|
+
Do not repeat it.
|
|
39
|
+
|
|
40
|
+
- **A build is done only when `verify --process-id <id> --run` returns a passing
|
|
41
|
+
verdict** - not when you inspected it, not when a file was produced, not when the API
|
|
42
|
+
accepted the write. `ok:true` proves *acceptance*, never *effect*. If `verify` cannot
|
|
43
|
+
cover a step (forms/browser/E2E), it lists it in `manual_checks`; run those, do not
|
|
44
|
+
wave them through.
|
|
45
|
+
- **Clarify before you build.** In the Frame step, ask the questions that pin scope and
|
|
46
|
+
the load-bearing decisions first - the data source, and especially the **cache
|
|
47
|
+
mechanism** (native Data Store vs SQL; a cache MUST be a real Data Store / SQL action,
|
|
48
|
+
never a Call API dressed with a cache icon - `audit` now hard-fails that masquerade).
|
|
49
|
+
A task you *could* finish without asking finishes better, with fewer wrong-path loops,
|
|
50
|
+
when the spec is pinned up front.
|
|
51
|
+
- **A process is called from a form ONLY through a native `RUN_PROCESS` event**, never
|
|
52
|
+
by injected JS. Verify the event is actually bound (`form-get-element-events`), not
|
|
53
|
+
just that JS "should" trigger it.
|
|
54
|
+
- **Author processes through `process-create` / `process-edit`, never a raw
|
|
55
|
+
`PUT /api/Projects`.** The builder sets validity and the designer-config correctly; a
|
|
56
|
+
hand-authored flow JSON pushed via `request PUT /api/Projects` lands `isValid:false`
|
|
57
|
+
and the process will not launch (and hand-setting `isValid:true` only lies about it -
|
|
58
|
+
`verify --run` still fails because the flow itself is invalid). Build the flow through the
|
|
59
|
+
builder's structured config, never by hand-authoring node/edge DTOs: Data Store read/write
|
|
60
|
+
nodes via `dsWhere`/`dsMap`, and Decisional routing via the `branches` config - the builder
|
|
61
|
+
emits the correct `Ports[].Config` (the default branch is the string `"default"`, not a
|
|
62
|
+
boolean `isDefault`, which the BE rejects with `unexpected character 't'`). Guessing a
|
|
63
|
+
port/edge DTO is the same trap as guessing a node DTO.
|
|
64
|
+
- **Fix the cause in the generic tool, never patch the use case in the repo.** If a
|
|
65
|
+
capability is missing (e.g. the builder could not author a Data Store node), EXTEND
|
|
66
|
+
the builder with tests - the way `process-create` gained native Data Store authoring -
|
|
67
|
+
never drop a `patch_<usecase>.py` into `scripts/`. Use-case artefacts live in a
|
|
68
|
+
scratch dir; the guard `tests/test_no_usecase_scripts.py` fails the build otherwise
|
|
69
|
+
(CLAUDE.md Hard rules 5 + 10).
|
|
70
|
+
|
|
71
|
+
## Self-test checklist - what "tested" actually means
|
|
72
|
+
|
|
73
|
+
Each item names the tool and the verified mechanic. Do not skip a layer because the
|
|
74
|
+
one above passed.
|
|
75
|
+
|
|
76
|
+
**The agent enforces the automatable layers.** Run them instead of doing them by hand:
|
|
77
|
+
- `python scripts/run-agent.py procesio verify --process-id <id> [--run]` - validates
|
|
78
|
+
the process (real PROCESIO validator), audits designer-vs-runtime parity, and with
|
|
79
|
+
`--run` executes it and reads the real instance status. Returns a `verdict`
|
|
80
|
+
(pass/warn/fail) and a `manual_checks` list of the steps it cannot run.
|
|
81
|
+
- `python scripts/run-agent.py procesio audit --process-id <id>` - static
|
|
82
|
+
best-practice + correctness smells (action count, slow actions, error handling,
|
|
83
|
+
inline secrets, parity).
|
|
84
|
+
- `python scripts/run-agent.py procesio checklist` - the full structured checklist.
|
|
85
|
+
|
|
86
|
+
`verify` cannot drive a real browser, so the forms/webhook/E2E steps below stay
|
|
87
|
+
manual - it names them in `manual_checks` precisely so they are not forgotten.
|
|
88
|
+
|
|
89
|
+
### A. Static validation (before running anything)
|
|
90
|
+
- Validate the process: `procesio` -> `POST /api/Projects/validate`.
|
|
91
|
+
- Test credentials: `POST /api/Credentials/test` (returns a real upstream body when
|
|
92
|
+
the placement is right - PHASE4-E2E learnings 3-4).
|
|
93
|
+
- Test actions: `POST /api/Actions/test`.
|
|
94
|
+
- Designer-vs-runtime parity: every action's runtime `Parameters[]` must be mirrored
|
|
95
|
+
into the designer `CustomData.configuration` or the designer shows "not
|
|
96
|
+
configured" and Validate fails even when the process runs. The builder enforces
|
|
97
|
+
this with a build audit; if you hand-edit a DTO, re-check it. Bespoke shapes
|
|
98
|
+
(document-mapper, decisional-case) differ between runtime and designer - PHASE4-E2E
|
|
99
|
+
"CRITICAL process-builder fix" + rounds 3 and 5.
|
|
100
|
+
|
|
101
|
+
### B. Run + instance verification
|
|
102
|
+
- Run synchronously: `run-process --synchronous`; read output vars under
|
|
103
|
+
`result.variable`.
|
|
104
|
+
- Read the instance status, do not assume success: 50 = finished, 40 = ran with
|
|
105
|
+
errors. Check per-action `errorMessage` via
|
|
106
|
+
`GET /api/Projects/instances/{iid}/status?flowTemplateId={pid}` (PHASE4-E2E 6, 15).
|
|
107
|
+
- Webhook-launched runs are async (launch returns an empty 200) - then poll
|
|
108
|
+
`GET /api/Projects/{id}/instances`.
|
|
109
|
+
- Download and open any generated file: `GET /api/File/download` with headers
|
|
110
|
+
`uploadFilePath`, `variableId`, `instanceId`, `flowTemplateId`.
|
|
111
|
+
|
|
112
|
+
### C. Forms - render AND behavior, with diagnostics (MANDATORY before "done")
|
|
113
|
+
A form is NOT done until EVERY tab, EVERY control, and EVERY event/action has been
|
|
114
|
+
exercised live and the runtime diagnostics are clean. Screenshots alone are not enough
|
|
115
|
+
(they hide JS errors, failed launches, flicker). Steps:
|
|
116
|
+
|
|
117
|
+
1. **Publish + URL:** publish, create a CustomUrl (`POST /api/CustomUrl/FormTemplate`),
|
|
118
|
+
open `https://forms.procesio.app/{tinyUrl}`. SPA needs ~15-20s to render; `wait`.
|
|
119
|
+
2. **Drive every control/action with the `web` tool** (`run` steps: click tabs, `fill`
|
|
120
|
+
inputs, click buttons, open selects/dropdowns/side-panels, click menu items). The
|
|
121
|
+
CURRENT ui-builder forms (forms.procesio.app, pds/BootstrapVue design system) WORK
|
|
122
|
+
HEADLESS - verified 2026-06-29: `fill` updates the value, `RUN_JAVASCRIPT` form JS
|
|
123
|
+
fires, `RUN_PROCESS` triggers flow end-to-end (output mapped back into the field).
|
|
124
|
+
(The old "headless can't test forms / Angular model" caveat applied to the legacy
|
|
125
|
+
engine; it is superseded for these forms.)
|
|
126
|
+
3. **Read `diagnostics` from the web-tool result** (added 2026-06-29). It returns
|
|
127
|
+
`{console, page_errors, failed_requests, bad_responses}`. **A build with any
|
|
128
|
+
page_error, any console error, or any 4xx/5xx on the form's OWN calls is NOT done** -
|
|
129
|
+
that is how a real failure shows (e.g. the RUN_PROCESS launch 400, a JS exception,
|
|
130
|
+
the icon-font break). Fix, re-run, confirm clean.
|
|
131
|
+
4. **Assert the expected EFFECT per capability**, not just "it rendered": typed value
|
|
132
|
+
reflected, computed/JS output appears, dropdown opens un-clipped, process result
|
|
133
|
+
fills the target field, side-panel content shows, no flicker/scroll-trap.
|
|
134
|
+
5. **Test the NEGATIVE / dismiss path of every stateful interaction**, not just the happy
|
|
135
|
+
click: open a dropdown/menu then **click OUTSIDE** it → only the menu should close,
|
|
136
|
+
nothing else should fire (a form-level click handler that substring-matches a menu label
|
|
137
|
+
up the ancestor chain will clear/trigger on outside-click — match exactly ONE label; see
|
|
138
|
+
form `description.md`). For a **chat reply via a process**, send a message and confirm a
|
|
139
|
+
bot reply renders (wire `messagesent`, NOT `messagesfetch`; produce the array with a
|
|
140
|
+
**Node** action `return …`→`List Result`, not JS `setOutput` which wraps `{result}`).
|
|
141
|
+
- **Process triggers:** RUN_PROCESS in/out maps must put the PROCESS variable GUID on
|
|
142
|
+
the LEFT (resolved from name->id) and the form value-path on the RIGHT, in BOTH maps;
|
|
143
|
+
a name or a form-path on the left = the designer can't render it / launch 400s
|
|
144
|
+
(2026-06-29). The builder resolves this (prepare_ctx); guarded by `test_form_parity.py`.
|
|
145
|
+
- Form data model: the field-value path is `root.<fields-const>.<elementId>.
|
|
146
|
+
<valueConfigId>`, attr ids must equal the element config ids, and the dataModel
|
|
147
|
+
root id must equal the form handle variable id - else the designer shows "Unknown"
|
|
148
|
+
and values do not flow. The builder handles this; verify after any manual change.
|
|
149
|
+
- **Structural parity is auto-tested:** `pytest tools/procesio/tests/test_form_parity.py`
|
|
150
|
+
(+ `test_form_sync`) assert the builder's DTO matches real exports. Run before shipping.
|
|
151
|
+
- **CSS/JS gotcha:** form CSS/JS lives in encrypted `Data.code`; never force a font on
|
|
152
|
+
`#app *` (breaks Material-Icons glyphs); the form JS runs in `iframe.trigger-sandbox`
|
|
153
|
+
(use `window.parent.document`). See `tools/procesio/dto/form/FORM-STYLING-NOTES.md`.
|
|
154
|
+
- **Theme + alignment (new):** if the form uses dark mode, toggle it and confirm the
|
|
155
|
+
16-var palette applies; if it uses element alignment, confirm the `--fd/--jc/--ai`
|
|
156
|
+
vars lay the container out — both only in a REAL browser (`form-theme-render`).
|
|
157
|
+
- **Data Store trigger (new):** a `RUN_DATA_STORE_OPERATION` control must run its
|
|
158
|
+
READ/ADD/UPDATE/DELETE against the store and map the result back
|
|
159
|
+
(`form-datastore-trigger`). See the `datastore` guidance topic.
|
|
160
|
+
|
|
161
|
+
### C2. Data Store (standalone)
|
|
162
|
+
- Round-trip a store: add → filtered read → update-by-PK → delete, asserting
|
|
163
|
+
`affectedRows` and that the filtered read returns exactly the expected rows
|
|
164
|
+
(`datastore-roundtrip`). Rows are keyed by column DISPLAY name; reads go through
|
|
165
|
+
`POST …/rows/filter`. Full guidance: the `datastore` topic.
|
|
166
|
+
|
|
167
|
+
### C3. Scheduling
|
|
168
|
+
- Preview any crontab with `validate-crontab` before creating the schedule, then
|
|
169
|
+
`get-schedule` to confirm the stored recurrence (`schedule-cron`). See the
|
|
170
|
+
`scheduling` topic.
|
|
171
|
+
|
|
172
|
+
### D. Webhooks
|
|
173
|
+
- Trigger the webhook with a real payload; confirm an async instance launches and
|
|
174
|
+
reaches status 50. The webhook body binds as a WHOLE to a model-typed variable
|
|
175
|
+
(not per-field) - bind it to a primitive and you get raw JSON (PHASE4-E2E 1).
|
|
176
|
+
|
|
177
|
+
### E. End-to-end
|
|
178
|
+
- Exercise the use case as a user would: form -> process(es) -> document/email/SQL ->
|
|
179
|
+
external system. Verify the real artifact: open the file, confirm the email
|
|
180
|
+
delivered, confirm the record in the system of record.
|
|
181
|
+
- Idempotency: trigger twice, confirm no duplicate side effects (best practices 2).
|
|
182
|
+
- Timing: check against the forms UX rules (best practices 9) and the
|
|
183
|
+
optimize-for-speed rules (best practices 10 - action count, ~10ms each).
|
|
184
|
+
|
|
185
|
+
## Implement the learnings (this is where it compounds)
|
|
186
|
+
|
|
187
|
+
Testing that does not change the build is wasted. After each test pass:
|
|
188
|
+
|
|
189
|
+
- **Fix every defect found.** Bugs; inefficiencies (too many actions, slow SQL,
|
|
190
|
+
unscoped loading screens, an avoidable process call from a form); UX gaps; and any
|
|
191
|
+
improvement you spotted. Address it, do not just note it.
|
|
192
|
+
- **Structural/tool defects go into the builder code + a regression test**, not only
|
|
193
|
+
the live resource. PHASE4-E2E is the proof of this discipline: every fix landed in
|
|
194
|
+
the builder so a fresh session's create/edit is already correct, backed by tests.
|
|
195
|
+
- **Platform limits you cannot fix** get documented so the next build avoids them
|
|
196
|
+
(e.g. JS output is always `{result:v}` and will not fill a typed model - use the
|
|
197
|
+
HTML-string shell pattern; PHASE4-E2E rounds 4 and 8-10).
|
|
198
|
+
- **Route the learning:**
|
|
199
|
+
- tool / platform API / DTO quirk / builder behavior -> `tools/procesio/*-NOTES.md`
|
|
200
|
+
(or the relevant tool folder).
|
|
201
|
+
- methodology / how to build well -> this folder (`agents/procesio/`).
|
|
202
|
+
- cross-cutting standing preference -> user memory.
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
## Tools the agent drives
|
|
206
|
+
|
|
207
|
+
The registry is the source of truth - `python scripts/list-tools.py`, never a
|
|
208
|
+
hardcoded list. Core for building in PROCESIO:
|
|
209
|
+
- `procesio` - create/edit resources, validate, run, read instances.
|
|
210
|
+
- `web` - real-browser form render + behavior testing, screenshots, UX timing.
|
|
211
|
+
|
|
212
|
+
## Read these (do not duplicate)
|
|
213
|
+
|
|
214
|
+
- Tool mechanics + verified gotchas: `tools/procesio/PHASE4-E2E-NOTES.md`,
|
|
215
|
+
`PROCESIO-API-NOTES.md`, `PROCESIO-AUTH-NOTES.md`, `DTO-SUBTOOLS-NOTE.md`,
|
|
216
|
+
`PROCESIO-SEND-EMAIL-NOTES.md`.
|
|
217
|
+
- Standards the build must meet: `PROCESIO-BEST-PRACTICES.md` (this folder).
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# PROCESIO Data Store — build & use
|
|
2
|
+
|
|
3
|
+
**Data Store** is PROCESIO's user-defined dynamic-table feature: a tenant defines a
|
|
4
|
+
typed table (columns backed by a data model) and reads/writes its rows. It is
|
|
5
|
+
API-first, it surfaces as a **Process Designer action**, and it can be triggered from a
|
|
6
|
+
**form** — the same operation reachable three ways over one service.
|
|
7
|
+
|
|
8
|
+
## The model (know this before building)
|
|
9
|
+
|
|
10
|
+
- A data store = **metadata** (name + typed columns) + **rows**. Rows are JSON objects
|
|
11
|
+
keyed by **column display name**, never the internal alias. Values are arbitrary JSON.
|
|
12
|
+
- **Primary-key columns** identify a row for update/delete. Four system columns are
|
|
13
|
+
read-only and managed by the platform (`CREATED_ON`, `UPDATED_ON`, and the created/
|
|
14
|
+
updated user ids).
|
|
15
|
+
- Two **permission entities** gate it: `DataStoreSchema` (create/alter/drop the table)
|
|
16
|
+
and `DataStoreRows` (read/write rows + CSV). A user may hold one without the other.
|
|
17
|
+
|
|
18
|
+
**When to use it.** Reach for a Data Store when a process needs a small, tenant-owned,
|
|
19
|
+
queryable table it can also read/write from a form (a lookup list, a queue, a
|
|
20
|
+
submissions log). Prefer a **data model** (data type) for the *shape* of a variable, and
|
|
21
|
+
an **external DB action** (Execute Query/Command over a DB credential) when the data
|
|
22
|
+
already lives in a real database you own.
|
|
23
|
+
|
|
24
|
+
## Tool actions (`procesio datastore-*`)
|
|
25
|
+
|
|
26
|
+
Metadata: `datastore-create` / `-update` / `-modify-column` / `-delete` / `-get` /
|
|
27
|
+
`-list` / `-list-restricted` / `-from-data-model` / `-from-json` / `-get-data-model`.
|
|
28
|
+
Rows: `datastore-get-rows` (paged read with filters/sort), `-add-rows`, `-update-row`,
|
|
29
|
+
`-delete-rows`. CSV jobs: `datastore-export-start` / `-export-download` /
|
|
30
|
+
`-import-start` / `-import-failures`.
|
|
31
|
+
|
|
32
|
+
- **Reads: `POST …/rows/filter`** — **pagination on the query string**
|
|
33
|
+
(`?pageNumber=&pageItemCount=`), body a RECURSIVE filter tree + sort:
|
|
34
|
+
`{filter:{id,logic(0/1/2),items:[{id,type(1 condition|2 group),logic,condition:{id,column,
|
|
35
|
+
operator,value,auxValue?}}]}, sort:[{column,direction(1 asc|2 desc)}]}` (no body = read
|
|
36
|
+
all). `datastore-get-rows` builds this from `--filters '[{column,operator,value}]'`
|
|
37
|
+
(+`--logic and|or`) or takes a raw `--filter`/`--body`. Operators are `QueryOperators`
|
|
38
|
+
(0–20); pass a name (`Equals`,`Contains`,`Between`,`In`,`IsNull`,…) or number.
|
|
39
|
+
- **Update = `{values:{…}, filter:<tree>}`; delete = `{filter:<tree>}`** — a **non-empty
|
|
40
|
+
filter is mandatory** on both (there is no key-array form). `datastore-update-row`
|
|
41
|
+
takes `--values` + `--filter/--filters`; `datastore-delete-rows` takes `--filter/--filters`.
|
|
42
|
+
- Row dicts are keyed by **display name** everywhere (add/update/delete).
|
|
43
|
+
|
|
44
|
+
## Process Designer — the "Data Store" action
|
|
45
|
+
|
|
46
|
+
A native **`Data Store`** node runs one operation against a store. Operation is
|
|
47
|
+
`DataStoreOperationType` shown as **SELECT / INSERT / UPDATE / DELETE**
|
|
48
|
+
(SelectRows=1 / InsertRows=2 / UpdateRows=3 / DeleteRows=4). Its inputs use a dedicated
|
|
49
|
+
FE mapper component (`Data_Store_Mapper`) to bind the store id, the operation, and the
|
|
50
|
+
Set-Values / Match-Where maps. It is a platform (native) action dispatched by
|
|
51
|
+
`IsProcesio`, so there is **no code-visible action GUID** — resolve it by name from the
|
|
52
|
+
live action catalog (`procesio list-actions-catalog`) when authoring a flow, and refresh
|
|
53
|
+
the tool's bundled catalog from `/api/Actions` after a platform release.
|
|
54
|
+
|
|
55
|
+
## Forms — the Data Store trigger
|
|
56
|
+
|
|
57
|
+
A form element can trigger a Data Store operation the same way it triggers a process
|
|
58
|
+
(RUN_PROCESS). The event action is **`RUN_DATA_STORE_OPERATION`**; wire it surgically
|
|
59
|
+
with `procesio form-set-element-event --action RUN_DATA_STORE_OPERATION --data-store-id
|
|
60
|
+
<id> --operation READ|ADD|UPDATE|DELETE` (or in a full form rebuild via a control event
|
|
61
|
+
`do: datastore`). Config shape: `{dataStoreId, operation, inputMap, outputMap, filters?,
|
|
62
|
+
areFiltersConfigured?}`. **Filters apply to every operation except ADD.** The form
|
|
63
|
+
runtime calls the anonymous `api/Form/dataStore/{id}/rows(/filter)` endpoints with the
|
|
64
|
+
form context in headers — the form does not need the tenant's DataStore permissions.
|
|
65
|
+
|
|
66
|
+
## Verify (never call it done on compile)
|
|
67
|
+
|
|
68
|
+
Round-trip a store end to end: create (from-json is quickest), add rows, read them back
|
|
69
|
+
with a filter, update one by its PK, delete it — asserting `affectedRows` each step and
|
|
70
|
+
that the filtered read returns exactly the rows you expect. Then build a process with a
|
|
71
|
+
Data Store SELECT node and run it, and (if a form is in scope) render the form and fire
|
|
72
|
+
the trigger. See the build-and-test playbook, forms section.
|