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,199 @@
|
|
|
1
|
+
# PROCESIO `For Each` — construction quirks and the loop-timeout trap
|
|
2
|
+
|
|
3
|
+
The `For Each` action is template id **`dbef0804-66a9-4f8f-872c-ece1b89b8fdb`**.
|
|
4
|
+
Body membership is by **`ParentId`** (a child action's `parentId` == the loop's
|
|
5
|
+
id), never by an enclosing edge, and only `TemplateId` identifies the action —
|
|
6
|
+
`ActionTemplateName` is `null` on ~half of the corpus's For Each nodes and
|
|
7
|
+
`ActionName` is free text.
|
|
8
|
+
|
|
9
|
+
## ⚠⚠ A programmatically-built For Each is missing two parameters a designer-built one has
|
|
10
|
+
|
|
11
|
+
> ✅ **FIXED IN THE BUILDER (E-160, 28/08/2026).** `dto/process/builder.py` now
|
|
12
|
+
> materialises the two template-default output params at build time, so a `For Each`
|
|
13
|
+
> built through `process-create` / the compact config **iterates out of the box** — no
|
|
14
|
+
> post-create splice. See `_template_default_params` and the "the fix" section below.
|
|
15
|
+
> The description that follows is the diagnosis that led there; the workaround at the
|
|
16
|
+
> bottom is retained only as history and is **no longer needed**.
|
|
17
|
+
|
|
18
|
+
Read from live flows, the same `For Each` template carries a **different
|
|
19
|
+
parameter set** depending on how it was created:
|
|
20
|
+
|
|
21
|
+
| built how | `tabPropertyId` suffixes present | Action timeout |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| **designer (GUI)** | `…55f8c7` (For Each Item), `…adae8b` (In List), `…df9db1` (Action timeout), **`…61724e` = `"-1"`**, **`…808b0d` = `"2010-01-01T00:00:00.0000000Z"`** | commonly 600 |
|
|
24
|
+
| **programmatic** (compact config → `process-create`, or hand-built flow JSON) | `…55f8c7`, `…adae8b`, `…df9db1` only | whatever you set |
|
|
25
|
+
|
|
26
|
+
The programmatic build path **omits `…61724e` and `…808b0d`**, and they are **not
|
|
27
|
+
defaulted in on save/validate** — the flow validates and creates cleanly with
|
|
28
|
+
three parameters.
|
|
29
|
+
|
|
30
|
+
## ⚠⚠ The failure mode: the loop times out without iterating a populated list
|
|
31
|
+
|
|
32
|
+
A For Each carrying only the three parameters has been observed to **fail to
|
|
33
|
+
iterate a list that is demonstrably populated and correctly bound**, returning:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
status 40
|
|
37
|
+
{"errorMessage": "Foreach timeout exceeded!", "actionName": "...", "actionType": "For Each"}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
after the loop's `Action timeout` seconds, **writing nothing** — no body child
|
|
41
|
+
executes even once. This was isolated hard:
|
|
42
|
+
|
|
43
|
+
- The `In List` parameter **is** bound (its `variable[0].variableId` points at the
|
|
44
|
+
list variable) — verified by reading the created flow back; it is not a
|
|
45
|
+
null/unbound-list problem.
|
|
46
|
+
- The list variable **is** populated at runtime — the same run that times out
|
|
47
|
+
returns the list (e.g. 3 elements) in its output variables.
|
|
48
|
+
- A **no-loop** flow proves the pieces are healthy: the list-producer Node yields
|
|
49
|
+
the elements, a Node reads them, and a Data Store `InsertRows` writes a row —
|
|
50
|
+
all at **status 50**. Only inside the For Each does it hang.
|
|
51
|
+
- Reproduced in a **minimal** For Each (one Node → the loop → one Data Store
|
|
52
|
+
`InsertRows` body child), independent of the body's contents and of whether the
|
|
53
|
+
body's `InsertRows` binds the loop item directly or a pick-Node-derived scalar.
|
|
54
|
+
|
|
55
|
+
## ⚠⚠ CONFIRMED (causal test done): the two parameters ARE the cause, and the timeout is NOT
|
|
56
|
+
|
|
57
|
+
The leaf-diff causal test is now performed. Splice **EXACTLY** `…61724e` = `"-1"`
|
|
58
|
+
and `…808b0d` = `"2010-01-01T00:00:00Z"` onto a live 3-parameter loop via
|
|
59
|
+
`put-projects`, **change nothing else**, re-run, and judge on rows landed:
|
|
60
|
+
|
|
61
|
+
| the same loop, only these two parameters differ | body executions | status |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| 3-parameter (as `process-create` builds it), populated list | **0** | 40 `Foreach timeout exceeded!` |
|
|
64
|
+
| **+ `…61724e` + `…808b0d`** (Action timeout left **unchanged**) | **3** (full) | 50 |
|
|
65
|
+
|
|
66
|
+
Measured twice, independently: **0 → 3 on a minimal loop**, and **entry 3 / body 3 /
|
|
67
|
+
real inserts 3 of 3** on a two-loop diff flow.
|
|
68
|
+
|
|
69
|
+
- ⚠⚠ **The Action timeout does NOT matter.** The designer loop's `…df9db1` is 600
|
|
70
|
+
and the programmatic one's is 120; the splice **held it at 120** and the body ran.
|
|
71
|
+
The two output parameters alone are sufficient — do **not** raise the timeout as
|
|
72
|
+
part of the "fix" (that would be two changes at once and mis-attribute the cause).
|
|
73
|
+
- ⚠⚠ **Both are OUTPUT parameters** (`direction 2`, type `ignore`): `…61724e`
|
|
74
|
+
"Zero based list index" (the current-iteration counter) and `…808b0d` "Action
|
|
75
|
+
start time". A loop with no index slot has nowhere to advance the iteration index,
|
|
76
|
+
consistent with never entering the body — mechanism plausible, the *measurement*
|
|
77
|
+
is that adding exactly these two flips 0 → N.
|
|
78
|
+
- ⚠⚠ **The omission is in OUR builder, not the platform (E-158 refinement — A-42
|
|
79
|
+
WITHDRAWN as a platform defect).** The two output parameters are the `For Each`
|
|
80
|
+
template's **own default-valued settings**: the live action catalog shows template
|
|
81
|
+
`dbef0804` declaring `61724e` "Zero based list index" with default `value` `"-1"`
|
|
82
|
+
and `808b0d` "Action start time" with default the `2010-…Z` sentinel — both
|
|
83
|
+
`direction 2`, `type ignore`, **`isRequired false`**. The DESIGNER materialises every
|
|
84
|
+
template setting into the flow; the compact-config builder
|
|
85
|
+
(`dto/process/builder.py::_action_parameters`) is **binding-driven** — it emits one
|
|
86
|
+
parameter per config *binding* and never walks the template's settings — so a param no
|
|
87
|
+
one binds (a runtime-written output with a default) is never emitted. Neither API path
|
|
88
|
+
defaults it in on save. **So the fix belongs in the builder: materialise the template's
|
|
89
|
+
default-valued output settings** (at minimum emit these two for `For Each`; generally,
|
|
90
|
+
any `direction:2/type:ignore` setting carrying a template `value`). Because the
|
|
91
|
+
validator keys on `isRequired`, a 3-param loop validates + creates clean and only fails
|
|
92
|
+
at runtime with the generic timeout — a genuinely platform-side rough edge, but a minor
|
|
93
|
+
quality/parity note, not the "build path is broken" claim.
|
|
94
|
+
- ✅ **DONE (E-160). The builder now materialises them.** `dto/process/builder.py`
|
|
95
|
+
gained `_is_template_default_output` (predicate: `direction:2` or `type:ignore` with a
|
|
96
|
+
non-empty scalar `value`) and `_template_default_params` (walks the template, emits
|
|
97
|
+
`{TabPropertyId, Value:<default>, Variable:[]}` for each such setting not already
|
|
98
|
+
produced by a binding, deduped by `TabPropertyId`), called in `build()` after the
|
|
99
|
+
binding-driven / doc-mapper / decisional / subprocess params. It is **template-driven,
|
|
100
|
+
not a For-Each special-case**: `For Each` gains `61724e`/`808b0d`, and `Call
|
|
101
|
+
Subprocess`'s `a03fe2` started-flow slot (the only other member of the class in the live
|
|
102
|
+
233-action catalog) is subsumed — already emitted by `_build_subprocess`, so the dedupe
|
|
103
|
+
makes it a no-op there. Proven a TRANSFORM (a process with no such setting builds
|
|
104
|
+
byte-identical; `For Each` differs by exactly the two params appended) and proven LIVE
|
|
105
|
+
(a loop built by `process-create` iterates 3, no splice; both loops of a two-loop flow
|
|
106
|
+
iterate → status 50, where the E-150 single-loop splice left status 40). ⚠ A separate,
|
|
107
|
+
larger class is NOT fixed: 40 actions carry INPUT-side (`direction:1`) template defaults
|
|
108
|
+
the builder also drops when unbound — untested whether it matters; see
|
|
109
|
+
`todo/procesio-builder-input-default-materialisation.md`.
|
|
110
|
+
- ⚠ **`put-projects` cannot create — it is PUT/edit only.** A create DTO (fresh
|
|
111
|
+
client-supplied Id) PUT to `put-projects` returns HTTP 400 / statusCode 502 "missing or
|
|
112
|
+
incorrect resource parameters" and persists nothing; creation is **POST /api/Projects**
|
|
113
|
+
(what `process-create` wraps). As a save path `put-projects` stores the parameter set
|
|
114
|
+
literally — it does NOT materialise template defaults either. So there is no alternative
|
|
115
|
+
API build path that carries the two params for you; a loop built + saved via
|
|
116
|
+
`put-projects` iterates iff they are present (measured 0→3 on the same object).
|
|
117
|
+
- ✅ **Workaround (HISTORY — no longer needed since E-160):** before the builder fix,
|
|
118
|
+
the way to iterate was, after `process-create`, to read the flow back, append the two
|
|
119
|
+
parameter objects to the loop action's `parameters`, and `put-projects` (verify by
|
|
120
|
+
reading the loop's `parameters` back — 5 present, originals unchanged — before running).
|
|
121
|
+
The builder now emits the two at create, so this post-create splice is retired. ⚠ One
|
|
122
|
+
fact from it that still applies to any read-back diff: **on save the platform
|
|
123
|
+
normalises `…808b0d` from `"…00.0000000Z"` to `"…00:00:00Z"`** — the same parameter;
|
|
124
|
+
tolerate the trailing-precision reformat when you diff a stored loop.
|
|
125
|
+
|
|
126
|
+
The parameter objects to append (authoritative `parameters`-array form):
|
|
127
|
+
`{"tabPropertyId":"99e8766d-d6be-4948-8f57-1f141f61724e","value":"-1","variable":[]}`
|
|
128
|
+
and `{"tabPropertyId":"9d2d3483-f04b-48ac-9dea-2ef7ae808b0d","value":"2010-01-01T00:00:00.0000000Z","variable":[]}`.
|
|
129
|
+
|
|
130
|
+
## Diagnosing a For Each that "does nothing"
|
|
131
|
+
|
|
132
|
+
- **Prove the loop's INPUT is populated before you read its zero — a wrong-shaped
|
|
133
|
+
run payload reads identically to a dead loop.** If the flow's input variable is
|
|
134
|
+
supplied in the wrong shape (e.g. a bare list where the process declares
|
|
135
|
+
`{source, tenant}`), the input variable is left empty, any pre-loop JavaScript
|
|
136
|
+
node that substitutes it via `<%N%>` dies with **`"Unexpected token ';'"`** (an
|
|
137
|
+
empty token becomes `var x = ;`), the list the loop iterates comes back **null**,
|
|
138
|
+
and the loop iterates nothing — indistinguishable from the parameter-omission
|
|
139
|
+
hang unless you check the pre-loop nodes' error variables and the list length.
|
|
140
|
+
Gate on: the pre-loop nodes ran clean AND the In-List variable is the expected
|
|
141
|
+
length, THEN read the loop's body count.
|
|
142
|
+
- **A body node that never ran reports no error.** Clean per-node error variables
|
|
143
|
+
are NOT evidence the body executed. Get positive evidence out-of-band: a Data
|
|
144
|
+
Store `InsertRows` in the body writing to a disposable store, read from OUTSIDE
|
|
145
|
+
the flow — a timeout can suppress every *returned* output variable (observed:
|
|
146
|
+
`vars: {}` on a timed-out run), so never rely on a value returned into a flow
|
|
147
|
+
variable to prove the body ran. Prove that marker can write with a **no-loop**
|
|
148
|
+
run first, or its zero is uninterpretable.
|
|
149
|
+
- **Judge a loop on rows landed, not status.**
|
|
150
|
+
- **`For Each` takes ONE input port.** Two loops in sequence, or a body-exit and
|
|
151
|
+
the loop-continuation both reaching the same downstream node, need a `Join`
|
|
152
|
+
between them, or the back end refuses `statusCode 383 "Action has too many
|
|
153
|
+
input ports."` on save.
|
|
154
|
+
- A **list**-returning Node binds its result via the **`List Result`** parameter
|
|
155
|
+
(`…60237e88`); a scalar via **`Single Result`** (`…51b9fcdc`). Wrong one → the
|
|
156
|
+
list variable is never assigned and the loop iterates null (also a timeout).
|
|
157
|
+
|
|
158
|
+
## Related Data Store facts used above
|
|
159
|
+
|
|
160
|
+
- A Data Store **must have a primary key** — `datastore-from-json` without
|
|
161
|
+
`primaryKeyAttributeNames` is refused `502 "At least one column must be marked
|
|
162
|
+
as a primary key."` So you cannot append identical rows as a pure log; a
|
|
163
|
+
per-row distinct key is required to count iterations by row.
|
|
164
|
+
- Inside a For Each, per-iteration **single** `InsertRows` calls write N distinct
|
|
165
|
+
rows correctly (this is the working idiom); the **collapse-to-one** failure is a
|
|
166
|
+
*batch* insert of a parallel-list mapper in a single call, a different path.
|
|
167
|
+
|
|
168
|
+
## Landing N rows: the working shape, its body-port wiring, and the re-run NOOP
|
|
169
|
+
|
|
170
|
+
Confirmed end to end (a multi-row landing card, 2026-09-02): to write **N rows to a
|
|
171
|
+
store from one run**, loop a **model-typed list** and do **one `InsertRows` per
|
|
172
|
+
iteration** binding the loop ITEM's data-model attributes. Concretely:
|
|
173
|
+
|
|
174
|
+
- **The list and the item are both typed as the store's data model.** A Node emits the
|
|
175
|
+
list bound via **`List Result`** (not `Single Result`); the For Each's **`For Each
|
|
176
|
+
Item`** output is bound to a NON-list variable of the same model type; the body
|
|
177
|
+
`InsertRows` Set-Values mapper binds `item.<attr>` exactly as the single-row splice
|
|
178
|
+
does (b017 pattern), only the bound variable is the loop item, not a standalone one.
|
|
179
|
+
- **Body-port wiring (edges, not just `parent`).** The `parent` key on the body action
|
|
180
|
+
sets ParentId (visual containment) but gives it **no ports** — ports come from edges.
|
|
181
|
+
Read from a designer export, a For Each with one body child carries **two out-ports on
|
|
182
|
+
the loop** (loop → continuation, e.g. the Join; and loop → body child) **plus one
|
|
183
|
+
out-port on the body child back to the loop** (body → loop). So the compact-config
|
|
184
|
+
edges are: `[loop, <next>]`, `[loop, <body>]`, `[<body>, loop]`. Omit the last two and
|
|
185
|
+
the build validates but the body node fails with **statusCode 390/391 "Action has too
|
|
186
|
+
few input/output ports."** The platform infers body-vs-continuation from the child's
|
|
187
|
+
ParentId, so edge order does not matter; supply all three edges.
|
|
188
|
+
- **Idempotency comes free from the store PK — do NOT write dedupe logic.** Give each row
|
|
189
|
+
a **deterministic natural key** (stable per input, unique within the batch, e.g.
|
|
190
|
+
`<tool>:<table>:r<zero-padded-index>`). A fresh batch lands all N at **status 50**; a
|
|
191
|
+
re-run of the same input replays the same keys and the store PK rejects the duplicates,
|
|
192
|
+
so the instance **halts at status 40 with nothing written twice** — a clean NOOP, the
|
|
193
|
+
same dup-PK guard a single-row card shows (a re-run "must be a NOOP, not a double-load"
|
|
194
|
+
is satisfied by this alone). Validate the WHOLE input up front (count, shape, any
|
|
195
|
+
ceiling) and emit rows only on the clean branch, so a bad input never starts a partial
|
|
196
|
+
loop; then the only mid-loop halt is a dup key, which is the desired NOOP.
|
|
197
|
+
- **Cost scales with N.** One native `InsertRows` per row is billed per row: measured
|
|
198
|
+
`timeConsumed ≈ fixed + ~14 ms × N` (vs a single-insert card that bills flat). Size the
|
|
199
|
+
loop to the real table; a very large table is a v2 concern (bulk import), not this shape.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
> ## ⚠ SUPERSEDED (re-probed 2026-09-03): `form-get` does NOT hang
|
|
2
|
+
>
|
|
3
|
+
> `GET /api/FormTemplate/{id}` returned a 342 KB DTO in seconds, repeatedly, and every
|
|
4
|
+
> read-modify-write action built on it (`form-get-element-events`, `form-set-element-event`,
|
|
5
|
+
> `form-add-element`, `form-set-element-config`) worked. Whatever caused the original hang is
|
|
6
|
+
> not reproducible on this installation.
|
|
7
|
+
>
|
|
8
|
+
> **Why this matters more than a stale row:** the note below steers the reader away from the
|
|
9
|
+
> surgical read-modify-write path and toward full rebuilds, which is the riskier route on a
|
|
10
|
+
> live form. Treat the table as history. Re-probe before believing any "this call hangs"
|
|
11
|
+
> claim — an intermittent or since-fixed hang reads identically to a permanent one.
|
|
12
|
+
|
|
13
|
+
# PROCESIO forms over the API — what works, and the one call that hangs
|
|
14
|
+
|
|
15
|
+
Live-probed while shipping a form for a marketplace template. The folklore is "form
|
|
16
|
+
creation hangs over the API". That is **wrong, and the imprecision costs a build**: creation
|
|
17
|
+
is fine. The call that hangs is the **read**.
|
|
18
|
+
|
|
19
|
+
| Call | Endpoint | Result |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `form-create` | `POST /api/FormTemplate` | ✅ **works** — returns the new form id; the form renders with all its controls |
|
|
22
|
+
| `form-list` | `GET /api/FormTemplate/all/basic` | ✅ works (fast) |
|
|
23
|
+
| `get-customurl-formtemplate-by-id` | `GET /api/CustomUrl/FormTemplate/{id}` | ✅ returns (empty until a CustomUrl is minted) |
|
|
24
|
+
| **`form-get`** | **`GET /api/FormTemplate/{id}`** | ❌ **HANGS** — no response, no error; killed at 90s |
|
|
25
|
+
|
|
26
|
+
## The consequence: nothing that must READ a form first can run
|
|
27
|
+
|
|
28
|
+
Every surgical/read-modify-write form action reads the form before writing, so they all
|
|
29
|
+
inherit the hang: `form-set-element-event` (wiring a control to `RUN_PROCESS`),
|
|
30
|
+
`form-set-element-config`, `form-get-element`, `form-get-element-events`, `form-set-code`,
|
|
31
|
+
`form-update`, `form-edit`. A wiring dry-run never even reaches its write.
|
|
32
|
+
|
|
33
|
+
**Practical rule:** everything a form needs must be expressed in the **single `form-create`
|
|
34
|
+
call**, because you may not get a second bite at it over the API. Build the complete element
|
|
35
|
+
tree, theme, and (where the builder supports it) events in that one create. If a form must
|
|
36
|
+
be adjusted afterwards, expect to do it in the designer UI.
|
|
37
|
+
|
|
38
|
+
**Do not** try to work around the hang by re-creating the form on every change: each
|
|
39
|
+
`form-create` mints a NEW form id (and any URL you minted points at the old one). Prefer one
|
|
40
|
+
correct create, then the UI.
|
|
41
|
+
|
|
42
|
+
## Wiring a form's submit to a process, in the UI (the fallback recipe)
|
|
43
|
+
|
|
44
|
+
1. Open the form in the designer, select the submit button, add an event on **click**:
|
|
45
|
+
**Run process** → pick the process.
|
|
46
|
+
2. Turn **syncRun ON** ("wait for the process to finish"). With it off, the form fires and
|
|
47
|
+
forgets and no output can ever populate.
|
|
48
|
+
3. Map **inputs**: each form field → the matching process input variable (file upload →
|
|
49
|
+
the `FileDataModel` input; a file control already holds a *list*, which is what a
|
|
50
|
+
file-typed process input expects).
|
|
51
|
+
4. Map **outputs** the same way if results are shown back on the form. Design rule: one
|
|
52
|
+
output variable per field, all primitives — mapping one structured object
|
|
53
|
+
attribute-by-attribute is what produces `[object Object]` in every field.
|
|
54
|
+
5. Publish, then mint the public URL (CustomUrl) if the form should be reachable
|
|
55
|
+
without a login.
|
|
56
|
+
|
|
57
|
+
## Wire the process INSIDE the create — it works, and it is the only way here
|
|
58
|
+
|
|
59
|
+
Because `form-set-element-event` cannot run (it reads first), declare the trigger in the
|
|
60
|
+
`form-create` config itself. The builder resolves names on both sides, so the config stays
|
|
61
|
+
readable and no GUIDs are hand-written:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{"type":"button","name":"btn_run","label":"Run","submit":true,
|
|
65
|
+
"events":[{"on":"click","do":"process","processId":"<pid>","syncRun":true,
|
|
66
|
+
"inputs": [{"to":"<process input var>", "from":"<form field name>"}],
|
|
67
|
+
"outputs": [{"to":"<form field name>", "from":"<process output var>"}]}]}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Verify the built DTO before trusting it: every map row's form side must be a 4-segment
|
|
71
|
+
value path (`formId.FIELDS_NS.elementId.valueConfigId`). A row still holding the raw field
|
|
72
|
+
**name** is silently broken - the API accepts it, the designer renders it blank, and the
|
|
73
|
+
field never populates.
|
|
74
|
+
|
|
75
|
+
### Two builder defects this exposed (both fixed in `dto/form/builder.py`)
|
|
76
|
+
|
|
77
|
+
1. **Field paths resolved in declaration order.** `ctx['field_paths']` is filled as
|
|
78
|
+
elements are built, so a trigger declared *above* its target fields could not resolve
|
|
79
|
+
them. That is the normal layout for any form that shows results (the submit button sits
|
|
80
|
+
above the results panel), so every output map silently kept raw names. Fixed with a
|
|
81
|
+
second pass (`_resolve_late_field_refs`) that re-resolves event map rows once every path
|
|
82
|
+
is known; declaration order no longer changes the wiring.
|
|
83
|
+
2. **Controls whose value config is not called `value` never registered a path.** A
|
|
84
|
+
`file-viewer` holds its file in **`src`** (its own empty state reads "Field source not
|
|
85
|
+
set"), while `_VALUE_TYPE` already types it as File. So it received a data-model
|
|
86
|
+
attribute but no field path, and could not be targeted by an output map. Fixed with
|
|
87
|
+
`_VALUE_CONFIG_KEY` / `_value_key()`, used for both path registration and the
|
|
88
|
+
data-model attribute typing, so `src` is typed File rather than String.
|
|
89
|
+
|
|
90
|
+
**Design rule that still applies:** one output variable per field, all primitives. Add a
|
|
91
|
+
small splitter action per display field that returns a plain string, rather than mapping
|
|
92
|
+
one structured object attribute by attribute (which writes `[object Object]` everywhere).
|
|
93
|
+
|
|
94
|
+
## Building the form in one create — shape that worked
|
|
95
|
+
|
|
96
|
+
`form-create --config-file` with a flat `elements` list; each control is
|
|
97
|
+
`{type,label,name,required,...}` and the submit is `{"type":"button","submit":true}`.
|
|
98
|
+
Types used successfully: `heading`, `paragraph`, `file-upload`, `datetime-input`, `input`,
|
|
99
|
+
`number-input`, `button`. `isPrivate:false` + `publish:true` makes it public and published.
|
|
100
|
+
A control's `name` is also the **URL query-param key** for pre-filling, so pick stable,
|
|
101
|
+
URL-safe names.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Submitting a PROCESIO form programmatically, and why you must
|
|
2
|
+
|
|
3
|
+
How to run a process **through its form** rather than through the process API, using the
|
|
4
|
+
public `FormProcess` endpoints, and the class of defect that only this catches.
|
|
5
|
+
|
|
6
|
+
## Why the process API is not enough
|
|
7
|
+
|
|
8
|
+
A form and the process behind it are assembled separately, and **nothing in the platform
|
|
9
|
+
asserts that the two agree**. Two failure modes follow, both of which pass every
|
|
10
|
+
process-side assertion ever written:
|
|
11
|
+
|
|
12
|
+
1. **A submit button wired to nothing.** The form validates, publishes, renders, collects
|
|
13
|
+
every field, and discards all of it. Process-side tests never touch the form, so they
|
|
14
|
+
stay green.
|
|
15
|
+
2. **An input that is collected, mapped, and never consumed.** The variable exists, the
|
|
16
|
+
form sends it, the engine receives it, and no action reads it. The feature it appears to
|
|
17
|
+
offer silently does nothing, and the value shown to the user is whatever the code
|
|
18
|
+
hardcoded.
|
|
19
|
+
|
|
20
|
+
Both are invisible to an API-only test suite and to a green run. Treat a form-surface
|
|
21
|
+
submission as part of acceptance, not as an extra.
|
|
22
|
+
|
|
23
|
+
## The call sequence (mirrors the process side, different routes and headers)
|
|
24
|
+
|
|
25
|
+
Every `FormProcess` route is **anonymous** and scoped entirely by the
|
|
26
|
+
`formTemplateWorkspaceId` **header**. Omit it and the API answers
|
|
27
|
+
`Invalid request due to missing or incorrect resource parameters. target: form template`.
|
|
28
|
+
|
|
29
|
+
| Step | Call | Notes |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| 1 publish | `POST /api/FormProcess/{formTemplateId}/{processTemplateId}/publish` | body = the input payload keyed by **process variable name**; files are staged as **metadata only** `{path:"",size,mimeType,name,id:<client uuid>,hash:""}` |
|
|
32
|
+
| 2 upload | `POST /api/FormProcess/{formTemplateId}/{flowInstanceId}/upload` | `multipart/form-data`, field name **`package`**, headers `flowTemplateId`, `variableName`, `fileId`, `formTemplateWorkspaceId` |
|
|
33
|
+
| 3 launch | `POST /api/FormProcess/{formTemplateId}/{instanceId}/launch?runSynchronous=true&secondsTimeOut=N` | body `{connectionId, flowTemplateId}` |
|
|
34
|
+
| 4 read | `GET /api/FormProcess/{formTemplateId}/{processTemplateId}/{processInstanceId}/variables` | |
|
|
35
|
+
|
|
36
|
+
**The launch route's second path segment is the INSTANCE, not the process template**, even
|
|
37
|
+
though the API reference names it `processTemplateId`. The give-away is that the body
|
|
38
|
+
already carries `flowTemplateId`, which would be redundant otherwise; the process-side
|
|
39
|
+
equivalent (`/api/Projects/instances/{instanceId}/launch`) has the same shape. Verified
|
|
40
|
+
live: launching with the instance in that slot succeeds.
|
|
41
|
+
|
|
42
|
+
**The variables response carries runtime values in `defaultValue`, not `value`.** The
|
|
43
|
+
endpoint returns variable *definitions*. Reading `value` yields `None` for every output and
|
|
44
|
+
looks exactly like "the form produced nothing", which is the same false negative this
|
|
45
|
+
whole exercise exists to prevent. Flatten to `{name: defaultValue}` before asserting.
|
|
46
|
+
|
|
47
|
+
Implemented as the curated action `run-form-with-files` (the generated `<method>-<path>`
|
|
48
|
+
actions cannot reach it: they send JSON only, with no custom headers and no multipart).
|
|
49
|
+
|
|
50
|
+
## The contract check, as a standard
|
|
51
|
+
|
|
52
|
+
Run this for every card that ships a form. It is three layers, and the third is the one
|
|
53
|
+
that cannot be faked:
|
|
54
|
+
|
|
55
|
+
1. **Every form input reaches the engine.** Each `inputMap` row's process side resolves to a
|
|
56
|
+
real input variable, and its form side resolves to a **4-segment value path**. A row left
|
|
57
|
+
holding a raw field *name* is accepted by the API, renders blank in the designer, and
|
|
58
|
+
never carries a value.
|
|
59
|
+
2. **Every engine output reaches a pane.** Any output with no `outputMap` row is either a
|
|
60
|
+
missing pane or a machine-only channel. See the exemption rule below.
|
|
61
|
+
3. **Every input is consumed by the logic.** Cross-reference each input variable against every
|
|
62
|
+
action's parameter bindings. An input bound by nothing is a **defect, not a spare**. Then
|
|
63
|
+
prove it end to end: submit through the form surface and assert that a value entered on the
|
|
64
|
+
form is visible in the rendered output. A tolerance, a threshold or a label is ideal,
|
|
65
|
+
because a wrong one is invisible in a green run.
|
|
66
|
+
|
|
67
|
+
Layers 1 and 2 read the live DTOs and cost nothing. Layer 3 needs one real submission.
|
|
68
|
+
|
|
69
|
+
## The named machine channel: how to have an exception without losing the rule
|
|
70
|
+
|
|
71
|
+
A strict rule with no exit becomes a rule people switch off. A rule with a silent exit stops
|
|
72
|
+
being a rule. The way to keep both is a **declared exemption**: a machine-only output is
|
|
73
|
+
listed by name in the checker, so it passes and the pass is visible.
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
# Outputs that exist for assertions and API callers, not for a pane.
|
|
77
|
+
# Named explicitly so the exemption shows up rather than being assumed.
|
|
78
|
+
MACHINE_ONLY = {"recon"}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The check then reports `output 'recon' is a declared machine channel, no pane expected`
|
|
82
|
+
instead of either failing a legitimate design or silently skipping it. Three properties make
|
|
83
|
+
this honest, and they generalise to any strict gate:
|
|
84
|
+
|
|
85
|
+
- **It is enumerated, not inferred.** No pattern match on names, no "outputs starting with an
|
|
86
|
+
underscore are internal". Someone had to type the name.
|
|
87
|
+
- **It appears in the output.** The exemption is a line in the report, so a reviewer sees the
|
|
88
|
+
exception was taken and can challenge it.
|
|
89
|
+
- **It is per-artefact and small.** A growing allowlist is itself the signal that the design
|
|
90
|
+
drifted, which a blanket `--skip-outputs` flag would hide.
|
|
91
|
+
|
|
92
|
+
Never widen this to a category ("all Json outputs are machine channels"). The moment the
|
|
93
|
+
exemption is a class rather than a list, a genuinely missing pane joins it unnoticed, and the
|
|
94
|
+
gate goes back to passing the defect it was built to catch.
|
|
95
|
+
|
|
96
|
+
## A RUN_PROCESS event that never reads its result
|
|
97
|
+
|
|
98
|
+
Two separate settings decide whether a form learns anything from the process it launched, and a
|
|
99
|
+
form can be missing both while looking completely wired in the designer:
|
|
100
|
+
|
|
101
|
+
- **`syncRun: false`** — the event fires and the form moves on. Nothing downstream can see a result.
|
|
102
|
+
- **`outputMap: []`** — even a synchronous run maps nothing back, so the process's output variables
|
|
103
|
+
stay inside the process.
|
|
104
|
+
|
|
105
|
+
With both, the form falls through to its generic `SUBMIT_SUCCESS` message whatever happened, so a
|
|
106
|
+
refusal ("that slot is taken", "invalid email", a rate-limit) is indistinguishable from a booking
|
|
107
|
+
that was written. This is the form-side twin of the `Execute Command` result-set defect
|
|
108
|
+
(PROCESIO-SQL-ACTIONS-NOTES.md): at every layer the failure mode is *the outcome is discarded and
|
|
109
|
+
success is assumed*, and at every layer it is invisible to validation and to a green run.
|
|
110
|
+
|
|
111
|
+
**The shape that works** — three events on one button, in this order:
|
|
112
|
+
1. `RUN_JAVASCRIPT` — validate, then write the process inputs into `ProcesioForm.variables`.
|
|
113
|
+
2. `RUN_PROCESS` — `syncRun: true`, `inputMap` from those variables, `outputMap` from the
|
|
114
|
+
process's output variable into a FORM variable.
|
|
115
|
+
3. `RUN_JAVASCRIPT` — read that form variable and render the real outcome.
|
|
116
|
+
|
|
117
|
+
`form-set-element-event --replace-action RUN_PROCESS` swaps step 2 in place, preserving the other
|
|
118
|
+
events and their order; a plain call appends, which is how step 3 lands last.
|
|
119
|
+
|
|
120
|
+
**A result-set output arrives as a LIST even when it is one row**, so step 3 must take `[0]` (and
|
|
121
|
+
tolerate a non-array). Guard the success test on both `true` and `1` — the same field comes back
|
|
122
|
+
as a SQL bit and as a JSON boolean depending on the path.
|
|
123
|
+
|
|
124
|
+
**Do not hand-escape values in the form's JavaScript.** A `.replace(/'/g, "''")` in a submit
|
|
125
|
+
handler is a sign the process is string-interpolating SQL rather than binding parameters. Fix the
|
|
126
|
+
process (`sql-parameterize`), then delete the escaping: it is not a control (the process endpoint
|
|
127
|
+
is callable directly, without the form) and it corrupts legitimate input.
|
|
128
|
+
|
|
129
|
+
### Map rows: `isList` is not cosmetic
|
|
130
|
+
Each side of an `inputMap` / `outputMap` row is an object, `{value, isList, path}`. Binding a
|
|
131
|
+
list-valued variable with `isList: false` puts the whole result set into a scalar slot: the form
|
|
132
|
+
receives nothing, and both the API and the designer accept the row without complaint. `path` is
|
|
133
|
+
`{}` on the process side; on the form side it is `{}` for a form VARIABLE and `null` for a form
|
|
134
|
+
FIELD target.
|
|
135
|
+
|
|
136
|
+
## A `paragraph` renders its `label`. Writing `.value` paints nothing.
|
|
137
|
+
|
|
138
|
+
The single highest-yield form gotcha found so far, because it fails in the direction that looks
|
|
139
|
+
fine: `ProcesioForm.data.fields.SomeParagraph.value = '…'` is accepted, throws nothing, logs
|
|
140
|
+
nothing — and the page keeps its original placeholder text. A handler written that way reports
|
|
141
|
+
nothing at all to the visitor, whatever happened underneath.
|
|
142
|
+
|
|
143
|
+
```js
|
|
144
|
+
function say(text) { // set BOTH: a field control does read .value
|
|
145
|
+
const m = ProcesioForm.data.fields.BookingMessage;
|
|
146
|
+
m.label = text; m.value = text; m.visible = true;
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Verified live both ways on a published form: with only `.value` the DOM text was unchanged after a
|
|
151
|
+
successful run; with `.label` the new text appeared. Assume the same for any control whose text is
|
|
152
|
+
authored as a label (heading, paragraph) rather than typed into by the user.
|
|
153
|
+
|
|
154
|
+
**Test it by reading the DOM, not the handler.** The handler running is not evidence the reader saw
|
|
155
|
+
anything — `document.body.innerText` before and after the click is.
|
|
156
|
+
|
|
157
|
+
## Driving a published form headlessly, without a compositing browser pane
|
|
158
|
+
|
|
159
|
+
Two facts make a real end-to-end click-through possible even when no pane is displayed and trusted
|
|
160
|
+
mouse events are unavailable:
|
|
161
|
+
|
|
162
|
+
1. **`element.click()` works on a PROCESIO form button.** The whole event chain fires — the JS
|
|
163
|
+
handlers, the RUN_PROCESS, the result handler. Confirmed by the process instance appearing in
|
|
164
|
+
`list-instances` attributed to the form, and by the row changing in the database.
|
|
165
|
+
2. **Every control pre-fills from a URL query parameter named after the control** — including
|
|
166
|
+
`visible: false` controls, whose values reach the process even though they are not in the DOM at
|
|
167
|
+
all. That is what makes a hidden-token page (a cancel link) work, and it also lets a test skip
|
|
168
|
+
custom pickers (dropdown, date, slot list) that need trusted events: pass their values on the
|
|
169
|
+
query string instead.
|
|
170
|
+
|
|
171
|
+
So: navigate with the fields on the query string, `.click()` the button, then read
|
|
172
|
+
`document.body.innerText`. That is a genuine test of the deployed form, not a stub.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# PROCESIO — HTML to Word (.docx) inside a process
|
|
2
|
+
|
|
3
|
+
How to produce a real Word document from the same HTML that `Generate Document` turns into a
|
|
4
|
+
PDF, and the platform facts that decide the design. The converter is
|
|
5
|
+
[`assets/html2docx/html2docx.js`](assets/html2docx/html2docx.js), guarded by
|
|
6
|
+
`tests/test_html2docx_asset.py`.
|
|
7
|
+
|
|
8
|
+
## Why the obvious routes fail
|
|
9
|
+
|
|
10
|
+
- **`Generate Document` has no Word output.** Its `Save document as` select offers exactly
|
|
11
|
+
`PDF` (value `1`) and `HTML` (value `2`). There is no DOCX option to switch to.
|
|
12
|
+
- **Saving the HTML bytes as `.doc`/`.docx` does not work.** `String To Base64` -> `Base64 To
|
|
13
|
+
File` with a `.docx` name gives Word a file it either refuses (a `.docx` must be a zip) or
|
|
14
|
+
imports through its HTML importer (`.doc`). That importer ignores most class-based CSS from a
|
|
15
|
+
`<style>` block, so a document styled the way generated HTML usually is (classes, `colgroup`
|
|
16
|
+
widths in %, wrapper padding) comes out with wrong fonts, margins, table widths and spacing,
|
|
17
|
+
while the PDF of the same HTML looks right.
|
|
18
|
+
- The PDF side is not a neutral reference either: the PDF renderer receives the HTML after a
|
|
19
|
+
sanitizer that drops the DOCTYPE (so it renders in **quirks mode**: tables reset their font),
|
|
20
|
+
uses **screen** CSS, ignores `@page`, and shrinks the page to fit. Match its layout rules, not
|
|
21
|
+
its pixels.
|
|
22
|
+
|
|
23
|
+
## The working shape (verified live)
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
html (String) -> String To Base64 --\
|
|
27
|
+
>-- Join -> Node (converter) -> Base64 To File -> docx (File)
|
|
28
|
+
htmlFile (File) -> File To Base64 --/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- Inject the HTML into the Node as **base64 inside double quotes** (`var HTML_B64 = "<%0%>";`).
|
|
32
|
+
Base64 has no quote, backslash, backtick or `${`, so it is the one string form that cannot
|
|
33
|
+
break or inject into the script. The converter decodes it.
|
|
34
|
+
- **`String To Base64` encodes UTF-8.** A Romanian contract with diacritics converted through
|
|
35
|
+
the live process produced a `word/document.xml` byte-identical to a local run on the same
|
|
36
|
+
file.
|
|
37
|
+
- Options travel as one **Json** input injected as `[<%1%>][0]`, which is `undefined` when the
|
|
38
|
+
caller sends nothing (a bare null injection is a syntax error, see
|
|
39
|
+
PROCESIO-NODE-CODE-NOTES.md).
|
|
40
|
+
- The Node **returns the .docx as one base64 string** in `Single Result` (500 KB+ works) and
|
|
41
|
+
writes a JSON report with `console.log`, which lands in the Node's **`Stdout`** output
|
|
42
|
+
property (a string, with a trailing newline). A Node has no other second output.
|
|
43
|
+
- A **rule `Decisional` with `IS_NOT_EMPTY` on a File variable** routes correctly: a file
|
|
44
|
+
goes to the first case, an unset file falls through to the next case.
|
|
45
|
+
- **`Stop` accepts one input.** Wiring several branches (success, two `Throw`s) straight into it
|
|
46
|
+
fails backend validation with statusCode `383` "Action has too many input ports.". Converge
|
|
47
|
+
them on a `Join` first.
|
|
48
|
+
- A 200-270 KB contract converts in about 0.2 s inside the Node; set `Timeout` well above that
|
|
49
|
+
anyway (180) for documents with many images.
|
|
50
|
+
|
|
51
|
+
## What the converter does (so a change keeps the same rules)
|
|
52
|
+
|
|
53
|
+
- Parses HTML, applies a browser default sheet, presentational attributes (`align`, `bgcolor`,
|
|
54
|
+
`border`, `cellpadding`, `width`, `<font>`), every `<style>` block and inline styles with
|
|
55
|
+
normal CSS precedence (specificity, order, `!important`). Media queries are evaluated as
|
|
56
|
+
**screen** at A4 width, like the PDF renderer; `@page` is still read from `@media print`
|
|
57
|
+
blocks, because that is where authors put page setup.
|
|
58
|
+
- **Page margins** = `@page` margins (default 1 cm, the PDF renderer's) **plus** the horizontal
|
|
59
|
+
margin/padding of `body` and of a single wrapper element under it. Folding the wrapper into the
|
|
60
|
+
margins gives an editable Word document instead of every paragraph carrying a left indent.
|
|
61
|
+
- **Line spacing:** a unitless CSS `line-height` L becomes Word "multiple" `L / f`, where `f` is
|
|
62
|
+
the font's normal line height (Arial and Times 1.149, Calibri 1.2207, ...). CSS 1.241 on Arial
|
|
63
|
+
is Word's 1.08, which is what HTML generated from a Word original carries.
|
|
64
|
+
- **Tables:** fixed layout on a twips grid; widths from `<col>`, then cells, then a content
|
|
65
|
+
estimate; `%` widths and margins resolve against the containing content width; negative
|
|
66
|
+
`margin-left` becomes a negative table indent; `rowspan`/`colspan` become `vMerge`/`gridSpan`;
|
|
67
|
+
`thead` rows repeat as header rows; cell padding becomes per-cell margins.
|
|
68
|
+
- Paragraph margins collapse the CSS way (max of adjacent margins), because Word adds spacing
|
|
69
|
+
after and before instead of collapsing them.
|
|
70
|
+
- `page-break-before/after: always` -> `pageBreakBefore` (a 1 pt paragraph carries it in front
|
|
71
|
+
of a table); `page-break-inside: avoid` -> keep-with-next on every paragraph but the last and
|
|
72
|
+
`cantSplit` rows. An empty block with a height becomes an exact-height spacer.
|
|
73
|
+
- Inline backgrounds that match a Word highlight colour (`#FFFF00` ...) become highlights, so
|
|
74
|
+
placeholders stay one click to clear; other colours become run shading.
|
|
75
|
+
- Images: base64 data URIs (PNG, JPEG, GIF, BMP) are embedded with their CSS size. `https`
|
|
76
|
+
images are fetched only when the caller opts in with `fetchImages: true` AND the sandbox
|
|
77
|
+
allows `require('https')`; by default (and always inside the platform sandbox, which blocks
|
|
78
|
+
`require`) a remote image is left as its `alt` text and the report lists a warning. Opt-in is
|
|
79
|
+
the safe default on purpose: the fetch retrieves whatever URL the HTML names, so enabling it
|
|
80
|
+
on untrusted HTML where `require` resolves is a server-side-request-forgery vector.
|
|
81
|
+
|
|
82
|
+
## Known limits
|
|
83
|
+
|
|
84
|
+
Flex and grid lay out as stacked blocks, floats and absolute positioning stay in flow, inline
|
|
85
|
+
SVG is not drawn, `::before`/`::after` content is ignored, and side-by-side `inline-block` boxes
|
|
86
|
+
stack vertically. Write HTML meant for both PDF and Word with tables for side-by-side layout.
|
|
87
|
+
The converter flags flex, grid, float and inline SVG in the report `warnings`, so the author
|
|
88
|
+
sees why a layout stacked instead of guessing.
|
|
89
|
+
|
|
90
|
+
## Updating the converter in a live process
|
|
91
|
+
|
|
92
|
+
The Node `Code` is the asset file between a first-line `//` comment and this wrapper:
|
|
93
|
+
|
|
94
|
+
```js
|
|
95
|
+
var HTML_B64 = "<%0%>"; // bound to the html_b64 variable
|
|
96
|
+
var OPTIONS = [<%1%>][0]; // bound to the options (Json) input
|
|
97
|
+
var res = H2D.convert(HTML_B64, OPTIONS, true);
|
|
98
|
+
function done(r) { try { console.log(JSON.stringify(r.report)); } catch (e) {} return r.base64; }
|
|
99
|
+
return (res && typeof res.then === 'function') ? res.then(done) : done(res);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Rebuild the process with `process-edit` (the builder writes both the runtime and the designer
|
|
103
|
+
copy of the code). Never write a `<%` sequence anywhere in the asset, comments included: the
|
|
104
|
+
platform substitutes it textually. The test enforces this.
|
|
105
|
+
|
|
106
|
+
## Verifying a result
|
|
107
|
+
|
|
108
|
+
Open the generated file in real Word and export it to PDF, then compare page by page with a
|
|
109
|
+
browser print of the same HTML (headless Chrome `--print-to-pdf`). A `.docx` that only passes a
|
|
110
|
+
zip/XML check can still be one Word refuses or repairs.
|